170 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #include <sourcemod>
 | |
| #include <multicolors>
 | |
| 
 | |
| #pragma semicolon 1
 | |
| #pragma newdecls required
 | |
| 
 | |
| /* CONVARS */
 | |
| Handle g_cvWeapons;
 | |
| ConVar g_cvCrowdSpawnWarningEnabled;
 | |
| ConVar g_cvFailNadeWarningEnabled;
 | |
| ConVar g_cvFailNadeThreshold;
 | |
| 
 | |
| /* STRINGS */
 | |
| char sWeaponsPath[PLATFORM_MAX_PATH] = "configs/zr/weapons.txt";
 | |
| 
 | |
| /* BOOLEAN */
 | |
| bool g_bFailNade;
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public Plugin myinfo =
 | |
| {
 | |
| 	name         = "CrowdSpawn- & FailNade-Warning",
 | |
| 	author       = "Neon",
 | |
| 	description  = "",
 | |
| 	version      = "1.0.0",
 | |
| 	url          = "https://steamcommunity.com/id/n3ontm"
 | |
| };
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnPluginStart()
 | |
| {
 | |
| 	g_cvCrowdSpawnWarningEnabled = CreateConVar("sm_crowdspawn_warning", "1", "", FCVAR_NONE, true, 0.0, true, 1.0);
 | |
| 	g_cvFailNadeWarningEnabled = CreateConVar("sm_failnade_warning", "1", "", FCVAR_NONE, true, 0.0, true, 1.0);
 | |
| 	g_cvFailNadeThreshold = CreateConVar("sm_failnade_threshold", "2", "", FCVAR_NONE, true, 0.0, true, 100.0);
 | |
| 
 | |
| 	RegConsoleCmd("sm_failnade", Command_FailNade, "Check whether FailNades are enabled or not.");
 | |
| 	RegConsoleCmd("sm_failnades", Command_FailNade, "Check whether FailNades are enabled or not.");
 | |
| 
 | |
| 	HookEvent("round_start", OnRoundStart);
 | |
| 
 | |
| 	AutoExecConfig();
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnAllPluginsLoaded()
 | |
| {
 | |
| 	if((g_cvWeapons = FindConVar("zr_config_path_weapons")) == INVALID_HANDLE)
 | |
| 		SetFailState("Failed to find zr_config_path_weapons cvar.");
 | |
| 
 | |
| 	HookConVarChange(g_cvWeapons, OnWeaponsPathChange);
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnRoundStart(Event hEvent, const char[] sEvent, bool bDontBroadcast)
 | |
| {
 | |
| 	CreateTimer(5.0, OnRoundStartPostCrowdSpawn, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE);
 | |
| 	CreateTimer(8.0, OnRoundStartPostFailNade, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE);
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public Action OnRoundStartPostCrowdSpawn(Handle timer)
 | |
| {
 | |
| 	if (!GetConVarBool(FindConVar("zr_infect_mzombie_respawn")) && GetConVarBool(g_cvCrowdSpawnWarningEnabled))
 | |
| 	{
 | |
| 		CPrintToChatAll("{red}[WARNING] {white}Zombies will be spawning {red}inbetween {white}the humans !!!");
 | |
| 		CPrintToChatAll("{red}[WARNING] {white}Zombies will be spawning {red}inbetween {white}the humans !!!");
 | |
| 		CPrintToChatAll("{red}[WARNING] {white}Zombies will be spawning {red}inbetween {white}the humans !!!");
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public Action OnRoundStartPostFailNade(Handle timer)
 | |
| {
 | |
| 	if (g_bFailNade && GetConVarBool(g_cvFailNadeWarningEnabled))
 | |
| 	{
 | |
| 		CPrintToChatAll("{red}[WARNING] {white}FailNades are {red}enabled {white}!!!");
 | |
| 		CPrintToChatAll("{red}[WARNING] {white}FailNades are {red}enabled {white}!!!");
 | |
| 		CPrintToChatAll("{red}[WARNING] {white}FailNades are {red}enabled {white}!!!");
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnWeaponsPathChange(ConVar convar, const char[] oldValue, const char[] newValue)
 | |
| {
 | |
| 	strcopy(sWeaponsPath, sizeof(sWeaponsPath), newValue);
 | |
| 	OnConfigsExecuted();
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| void OnConfigsExecuted()
 | |
| {
 | |
| 	g_bFailNade = false;
 | |
| 
 | |
| 	char sFile[PLATFORM_MAX_PATH];
 | |
| 	BuildPath(Path_SM, sFile, sizeof(sFile), "%s", sWeaponsPath);
 | |
| 
 | |
| 	if(!FileExists(sFile))
 | |
| 	{
 | |
| 		LogMessage("Could not find file: \"%s\"", sFile);
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	KeyValues Weapons = new KeyValues("weapons");
 | |
| 
 | |
| 	if(!Weapons.ImportFromFile(sFile))
 | |
| 	{
 | |
| 		LogMessage("Unable to load file: \"%s\"", sFile);
 | |
| 		delete Weapons;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if(!Weapons.GotoFirstSubKey(true))
 | |
| 	{
 | |
| 		LogMessage("Unable to goto first sub key: \"%s\"", sFile);
 | |
| 		delete Weapons;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	bool bFound = false;
 | |
| 	char sWeapon[64];
 | |
| 	float fKB;
 | |
| 	do
 | |
| 	{
 | |
| 		if(!Weapons.GetSectionName(sWeapon, sizeof(sWeapon)))
 | |
| 		{
 | |
| 			LogMessage("Unable to get section name: \"%s\"", sFile);
 | |
| 			delete Weapons;
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		if (StrEqual(sWeapon, "HEGrenade", false))
 | |
| 		{
 | |
| 			fKB = Weapons.GetFloat("knockback", 0.0);
 | |
| 			bFound = true;
 | |
| 			break;
 | |
| 		}
 | |
| 	} while(Weapons.GotoNextKey(true));
 | |
| 
 | |
| 	if ((bFound) && (fKB >= GetConVarFloat(g_cvFailNadeThreshold)))
 | |
| 		g_bFailNade = true;
 | |
| 
 | |
| 	delete Weapons;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public Action Command_FailNade(int client, int args)
 | |
| {
 | |
| 	if (g_bFailNade)
 | |
| 		CPrintToChat(client, "{GREEN}[ZR] {white}FailNades are currently {red}enabled{white}!");
 | |
| 	else
 | |
| 		CPrintToChat(client, "{GREEN}[ZR] {white}FailNades are currently {green}disabled{white}!");
 | |
| 	return Plugin_Handled;
 | |
| } |