Hooked autobuy/rebuy, added fog to visual effects, create effect functions in visualeffects.inc, fixed ambience, hooked mp_restartgame, mother count is rounded to nearest instead of ceiling, recoded cvars.inc and added logging, recoded event.inc, killed respawn timers on round end.
This commit is contained in:
		@@ -23,12 +23,12 @@
 | 
			
		||||
// External api (not done)
 | 
			
		||||
//#include "zr/global"
 | 
			
		||||
 | 
			
		||||
// Cvars (core)
 | 
			
		||||
#include "zr/cvars"
 | 
			
		||||
 | 
			
		||||
// Log (core)
 | 
			
		||||
#include "zr/log"
 | 
			
		||||
 | 
			
		||||
// Cvars (core)
 | 
			
		||||
#include "zr/cvars"
 | 
			
		||||
 | 
			
		||||
// Translations (core)
 | 
			
		||||
#include "zr/translation"
 | 
			
		||||
 | 
			
		||||
@@ -90,6 +90,8 @@
 | 
			
		||||
#include "zr/sayhooks"
 | 
			
		||||
#include "zr/zadmin"
 | 
			
		||||
#include "zr/commands"
 | 
			
		||||
 | 
			
		||||
// Event
 | 
			
		||||
#include "zr/event"
 | 
			
		||||
 | 
			
		||||
public Plugin:myinfo =
 | 
			
		||||
@@ -120,12 +122,13 @@ public OnPluginStart()
 | 
			
		||||
    
 | 
			
		||||
    // ======================================================================
 | 
			
		||||
    
 | 
			
		||||
    // Log
 | 
			
		||||
    LogInit();
 | 
			
		||||
    
 | 
			
		||||
    // Cvars
 | 
			
		||||
    CvarsInit();
 | 
			
		||||
    CvarsHook();
 | 
			
		||||
    
 | 
			
		||||
    // TODO: Be modulized/recoded.
 | 
			
		||||
    HookEvents();
 | 
			
		||||
    HookChatCmds();
 | 
			
		||||
    CreateCommands();
 | 
			
		||||
    HookCommands();
 | 
			
		||||
@@ -138,6 +141,9 @@ public OnPluginStart()
 | 
			
		||||
    // Damage
 | 
			
		||||
    DamageInit();
 | 
			
		||||
    
 | 
			
		||||
    // Event
 | 
			
		||||
    EventInit();
 | 
			
		||||
    
 | 
			
		||||
    // ======================================================================
 | 
			
		||||
    
 | 
			
		||||
    g_bMarket = LibraryExists("market");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										190
									
								
								src/zr/cvars.inc
									
									
									
									
									
								
							
							
						
						
									
										190
									
								
								src/zr/cvars.inc
									
									
									
									
									
								
							@@ -9,14 +9,21 @@
 | 
			
		||||
 * ============================================================================
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @section Locked cvar value defines.
 | 
			
		||||
 */
 | 
			
		||||
#define CVARS_AUTOTEAMBALANCE_LOCKED 0
 | 
			
		||||
#define CVARS_LIMITTEAMS_LOCKED 0
 | 
			
		||||
/**
 | 
			
		||||
 * @endsection
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * List of cvars used by the plugin.
 | 
			
		||||
 */
 | 
			
		||||
enum CvarsList
 | 
			
		||||
{
 | 
			
		||||
    Handle:CVAR_ENABLE,
 | 
			
		||||
    Handle:CVAR_LOG,
 | 
			
		||||
    Handle:CVAR_LOGFLAGS,
 | 
			
		||||
    Handle:CVAR_CLASSES_SPAWN,
 | 
			
		||||
    Handle:CVAR_CLASSES_RANDOM,
 | 
			
		||||
    Handle:CVAR_CLASSES_DEFAULT_ZOMBIE,
 | 
			
		||||
@@ -56,6 +63,14 @@ enum CvarsList
 | 
			
		||||
    Handle:CVAR_VEFFECTS_LIGHTSTYLE_VALUE,
 | 
			
		||||
    Handle:CVAR_VEFFECTS_SKY,
 | 
			
		||||
    Handle:CVAR_VEFFECTS_SKY_PATH,
 | 
			
		||||
    Handle:CVAR_VEFFECTS_FOG,
 | 
			
		||||
    Handle:CVAR_VEFFECTS_FOG_OVERRIDE,
 | 
			
		||||
    Handle:CVAR_VEFFECTS_FOG_PCOLOR,
 | 
			
		||||
    Handle:CVAR_VEFFECTS_FOG_SCOLOR,
 | 
			
		||||
    Handle:CVAR_VEFFECTS_FOG_DENSITY,
 | 
			
		||||
    Handle:CVAR_VEFFECTS_FOG_STARTDIST,
 | 
			
		||||
    Handle:CVAR_VEFFECTS_FOG_ENDDIST,
 | 
			
		||||
    Handle:CVAR_VEFFECTS_FOG_FARZ,
 | 
			
		||||
    Handle:CVAR_SEFFECTS_MOAN,
 | 
			
		||||
    Handle:CVAR_SEFFECTS_GROAN,
 | 
			
		||||
    Handle:CVAR_SEFFECTS_DEATH,
 | 
			
		||||
@@ -96,10 +111,37 @@ enum CvarsList
 | 
			
		||||
 */
 | 
			
		||||
new g_hCvarsList[CvarsList];
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @section Global cvar handles.
 | 
			
		||||
 */
 | 
			
		||||
new Handle:g_hAutoTeamBalance = INVALID_HANDLE;
 | 
			
		||||
new Handle:g_hLimitTeams = INVALID_HANDLE;
 | 
			
		||||
new Handle:g_hRestartGame = INVALID_HANDLE;
 | 
			
		||||
/**
 | 
			
		||||
 * @endsection
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Cvars module init function.
 | 
			
		||||
 */
 | 
			
		||||
CvarsInit()
 | 
			
		||||
{
 | 
			
		||||
    // Retrieve handles of CS:S cvars.
 | 
			
		||||
    g_hAutoTeamBalance = FindConVar("mp_autoteambalance");
 | 
			
		||||
    g_hLimitTeams = FindConVar("mp_limitteams");
 | 
			
		||||
    g_hRestartGame = FindConVar("mp_restartgame");
 | 
			
		||||
    
 | 
			
		||||
    // Create zombiereloaded cvars.
 | 
			
		||||
    CvarsCreate();
 | 
			
		||||
    
 | 
			
		||||
    // Hook cvars.
 | 
			
		||||
    CvarsHook();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create all cvars for plugin.
 | 
			
		||||
 */
 | 
			
		||||
CvarsCreate()
 | 
			
		||||
{
 | 
			
		||||
    // Cvar naming guidelines:
 | 
			
		||||
    // 1. Prefix: "zr_"
 | 
			
		||||
@@ -126,9 +168,7 @@ CvarsInit()
 | 
			
		||||
	// Log (core)
 | 
			
		||||
	// ===========================
 | 
			
		||||
    
 | 
			
		||||
    g_hCvarsList[CVAR_LOG]                   =    CreateConVar("zr_log", "1", "");
 | 
			
		||||
    g_hCvarsList[CVAR_LOGFLAGS]              =    CreateConVar("zr_logflags", "331", "");
 | 
			
		||||
    // Old Desc: Logging flags. Log messages to sourcemod logs, server console or client console. Use zr_log_flags to see a list of flags. (0: Disable)
 | 
			
		||||
    // Cvars created in log.inc, because of compilation problems when creating them here.
 | 
			
		||||
    
 | 
			
		||||
    // ===========================
 | 
			
		||||
	// Translations (core)
 | 
			
		||||
@@ -198,7 +238,7 @@ CvarsInit()
 | 
			
		||||
	
 | 
			
		||||
    g_hCvarsList[CVAR_ROUNDEND_OVERLAY]          =    CreateConVar("zr_roundend_overlay", "1", "");
 | 
			
		||||
    // Old Desc: Shows an overlay to all clients when a team wins. (0: Disable)
 | 
			
		||||
    g_hCvarsList[CVAR_ROUNDEND_OVERLAY_HUMAN]    =    CreateConVar("zr_roundend_overlays_human", "");
 | 
			
		||||
    g_hCvarsList[CVAR_ROUNDEND_OVERLAY_HUMAN]    =    CreateConVar("zr_roundend_overlays_human", "overlays/zr/humans_win");
 | 
			
		||||
    // Old Desc: overlays/zr/humans_win", "Path to \"humans win\" overlay
 | 
			
		||||
    g_hCvarsList[CVAR_ROUNDEND_OVERLAY_ZOMBIE]   =    CreateConVar("zr_roundend_overlays_zombie", "overlays/zr/zombies_win", "");
 | 
			
		||||
    // Old Desc: Path to \"zombies win\" overlay
 | 
			
		||||
@@ -207,8 +247,8 @@ CvarsInit()
 | 
			
		||||
    // Infect (core)
 | 
			
		||||
    // ===========================
 | 
			
		||||
    
 | 
			
		||||
    g_hCvarsList[CVAR_INFECT_MZOMBIE_RATIO]       =    CreateConVar("zr_infect_motherzombie_ratio", "5", "");
 | 
			
		||||
    g_hCvarsList[CVAR_INFECT_MZOMBIE_RESPAWN]     =    CreateConVar("zr_infect_motherzombie_respawn", "0", "");
 | 
			
		||||
    g_hCvarsList[CVAR_INFECT_MZOMBIE_RATIO]       =    CreateConVar("zr_infect_mzombie_ratio", "5", "");
 | 
			
		||||
    g_hCvarsList[CVAR_INFECT_MZOMBIE_RESPAWN]     =    CreateConVar("zr_infect_mzombie_respawn", "0", "");
 | 
			
		||||
    g_hCvarsList[CVAR_INFECT_SPAWNTIME_MIN]            =    CreateConVar("zr_infect_spawntime_min", "30.0", "");
 | 
			
		||||
    g_hCvarsList[CVAR_INFECT_SPAWNTIME_MAX]            =    CreateConVar("zr_infect_spawntime_max", "50.0", "");
 | 
			
		||||
    g_hCvarsList[CVAR_INFECT_CONSECUTIVE_BLOCK]         =    CreateConVar("zr_infect_consecutive_block", "1", "");
 | 
			
		||||
@@ -261,10 +301,28 @@ CvarsInit()
 | 
			
		||||
    // Visual Effects (module)
 | 
			
		||||
    // ===========================
 | 
			
		||||
    
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_LIGHTSTYLE]              =    CreateConVar("zr_veffects_lightstyle", "1", "");
 | 
			
		||||
    // Lightstyle
 | 
			
		||||
    
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_LIGHTSTYLE]              =    CreateConVar("zr_veffects_lightstyle", "0", "");
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_LIGHTSTYLE_VALUE]        =    CreateConVar("zr_veffects_lightstyle_value", "a", "");
 | 
			
		||||
    
 | 
			
		||||
    // Sky
 | 
			
		||||
    
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_SKY]                     =    CreateConVar("zr_veffects_sky", "1", "");
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_SKY_PATH]                =    CreateConVar("zr_veffects_sky_path", "skybox/sky_c17_05bk.vmt", "");
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_SKY_PATH]                =    CreateConVar("zr_veffects_sky_path", "sky_fake_white.vmt", "");
 | 
			
		||||
    
 | 
			
		||||
    // Fog
 | 
			
		||||
    
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_FOG]                     =    CreateConVar("zr_veffects_fog", "0", "");
 | 
			
		||||
    // NOTE DISABLE. SOURCEMOD DOESNT SUPPORT THIS YET.
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_FOG_OVERRIDE]            =    CreateConVar("zr_veffects_fog_override", "0", "");
 | 
			
		||||
    // NOTE DISABLE. SOURCEMOD DOESNT SUPPORT THIS YET.
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_FOG_PCOLOR]              =    CreateConVar("zr_veffects_fog_pcolor", "255 255 255", "");
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_FOG_SCOLOR]              =    CreateConVar("zr_veffects_fog_scolor", "255 255 255", "");
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_FOG_DENSITY]             =    CreateConVar("zr_veffects_fog_density", "0.8", "");
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_FOG_STARTDIST]           =    CreateConVar("zr_veffects_fog_startdist", "0", "");
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_FOG_ENDDIST]             =    CreateConVar("zr_veffects_fog_enddist", "400", "");
 | 
			
		||||
    g_hCvarsList[CVAR_VEFFECTS_FOG_FARZ]                =    CreateConVar("zr_veffects_fog_farz", "2000", "");
 | 
			
		||||
    
 | 
			
		||||
    // ===========================
 | 
			
		||||
	// Sound Effects (module)
 | 
			
		||||
@@ -371,53 +429,105 @@ CvarsInit()
 | 
			
		||||
    g_hCvarsList[CVAR_ANTICAMP_UPDATE_INTERVAL]  =    CreateConVar("zr_anticamp_update_interval", "1", "");
 | 
			
		||||
    // Old Desc: How often to update player locations (in seconds).
 | 
			
		||||
    
 | 
			
		||||
    // TODO: Recode.
 | 
			
		||||
    //HookConVarChange(g_hCvarsList[CVAR_ENABLE], EnableHook);
 | 
			
		||||
    
 | 
			
		||||
    // Auto-generate config file if it doesn't exist, then execute.
 | 
			
		||||
    AutoExecConfig(true, "zombiereloaded", "sourcemod/zombiereloaded");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CvarsHook()
 | 
			
		||||
/**
 | 
			
		||||
 * Hook cvar changes.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param unhook    If true, cvars will be unhooked, false to hook cvars.
 | 
			
		||||
 */
 | 
			
		||||
CvarsHook(bool:unhook = false)
 | 
			
		||||
{
 | 
			
		||||
    SetConVarBool(FindConVar("mp_autoteambalance"), false);
 | 
			
		||||
    SetConVarInt(FindConVar("mp_limitteams"), 0);
 | 
			
		||||
    // If unhook is true, then continue.
 | 
			
		||||
    if (unhook)
 | 
			
		||||
    {
 | 
			
		||||
        // Unhook all cvars.
 | 
			
		||||
        UnhookConVarChange(g_hAutoTeamBalance, CvarsHookLocked);
 | 
			
		||||
        UnhookConVarChange(g_hLimitTeams, CvarsHookLocked);
 | 
			
		||||
        UnhookConVarChange(g_hRestartGame, CvarsHookRestartGame);
 | 
			
		||||
        
 | 
			
		||||
    HookConVarChange(FindConVar("mp_autoteambalance"), AutoTeamBalanceHook);
 | 
			
		||||
    HookConVarChange(FindConVar("mp_limitteams"), LimitTeamsHook);
 | 
			
		||||
        // Stop after unhooking cvars.
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Set locked cvars to their locked value.
 | 
			
		||||
    SetConVarInt(g_hAutoTeamBalance, CVARS_AUTOTEAMBALANCE_LOCKED);
 | 
			
		||||
    SetConVarInt(g_hLimitTeams, CVARS_LIMITTEAMS_LOCKED);
 | 
			
		||||
    
 | 
			
		||||
    // Hook cvar to prevent it from changing.
 | 
			
		||||
    HookConVarChange(g_hAutoTeamBalance, CvarsHookLocked);
 | 
			
		||||
    //HookConVarChange(hLimitTeams, CvarsHookLocked);
 | 
			
		||||
    HookConVarChange(g_hRestartGame, CvarsHookRestartGame);
 | 
			
		||||
    
 | 
			
		||||
    // Anticamp shtuff. (needs to be moved to anticamp if these hooks are necessary)
 | 
			
		||||
    HookConVarChange(g_hCvarsList[CVAR_ANTICAMP], AnticampHook);
 | 
			
		||||
    HookConVarChange(g_hCvarsList[CVAR_ANTICAMP_UPDATE_INTERVAL], UpdateIntervalHook);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CvarsUnhook()
 | 
			
		||||
/**
 | 
			
		||||
 * Cvar hook callback (mp_autoteambalance, mp_limitteams)
 | 
			
		||||
 * Prevents changes to cvar.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param convar    The cvar handle.
 | 
			
		||||
 * @param oldvalue  The value before the attempted change.
 | 
			
		||||
 * @param newvalue  The new value.
 | 
			
		||||
 */
 | 
			
		||||
public CvarsHookLocked(Handle:cvar, const String:oldvalue[], const String:newvalue[])
 | 
			
		||||
{
 | 
			
		||||
    UnhookConVarChange(FindConVar("mp_autoteambalance"), AutoTeamBalanceHook);
 | 
			
		||||
    UnhookConVarChange(FindConVar("mp_limitteams"), LimitTeamsHook);
 | 
			
		||||
    // If cvar is mp_autoteambalance, then continue.
 | 
			
		||||
    if (cvar == g_hAutoTeamBalance)
 | 
			
		||||
    {
 | 
			
		||||
        // Revert to locked value.
 | 
			
		||||
        SetConVarInt(g_hAutoTeamBalance, CVARS_AUTOTEAMBALANCE_LOCKED);
 | 
			
		||||
        
 | 
			
		||||
        // If log flag check fails, then don't log.
 | 
			
		||||
        if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CORE))
 | 
			
		||||
        {
 | 
			
		||||
            LogMessageFormatted(-1, "Cvars", "Cvar Locked", "Cvar \"mp_autoteambalance\" was reverted back to \"CVARS_AUTOTEAMBALANCE_LOCKED\".", LOG_FORMAT_TYPE_FULL);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // If cvar is mp_limitteams, then continue.
 | 
			
		||||
    else if (cvar == g_hLimitTeams)
 | 
			
		||||
    {
 | 
			
		||||
        // Revert to locked value.
 | 
			
		||||
        SetConVarInt(g_hLimitTeams, CVARS_LIMITTEAMS_LOCKED);
 | 
			
		||||
        
 | 
			
		||||
        // If log flag check fails, then don't log.
 | 
			
		||||
        if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CORE))
 | 
			
		||||
        {
 | 
			
		||||
            LogMessageFormatted(-1, "Cvars", "Cvar Locked", "Cvar \"mp_limitteams\" was reverted back to \"CVARS_LIMITTEAMS_LOCKED\".", LOG_FORMAT_TYPE_FULL);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*public EnableHook(Handle:convar, const String:oldValue[], const String:newValue[])
 | 
			
		||||
/**
 | 
			
		||||
 * Cvar hook callback (mp_restartgame)
 | 
			
		||||
 * Stops restart and just ends the round.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param convar    The cvar handle.
 | 
			
		||||
 * @param oldvalue  The value before the attempted change.
 | 
			
		||||
 * @param newvalue  The new value.
 | 
			
		||||
 */
 | 
			
		||||
public CvarsHookRestartGame(Handle:cvar, const String:oldvalue[], const String:newvalue[])
 | 
			
		||||
{
 | 
			
		||||
    new bool:enable = bool:StringToInt(newValue);
 | 
			
		||||
    // Prevent round restart.
 | 
			
		||||
    SetConVarInt(cvar, 0);
 | 
			
		||||
    
 | 
			
		||||
    if (enable)
 | 
			
		||||
    // If value was invalid or 0, then stop.
 | 
			
		||||
    new Float:delay = StringToFloat(newvalue);
 | 
			
		||||
    if (delay <= 0)
 | 
			
		||||
    {
 | 
			
		||||
        HookEvents();
 | 
			
		||||
        HookCvars();
 | 
			
		||||
        
 | 
			
		||||
        TerminateRound(3.0, Game_Commencing);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        ZREnd();
 | 
			
		||||
    }
 | 
			
		||||
}*/
 | 
			
		||||
 | 
			
		||||
public AutoTeamBalanceHook(Handle:convar, const String:oldValue[], const String:newValue[])
 | 
			
		||||
{
 | 
			
		||||
    SetConVarBool(FindConVar("mp_autoteambalance"), false);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
public LimitTeamsHook(Handle:convar, const String:oldValue[], const String:newValue[])
 | 
			
		||||
    // Terminate the round with restart time as delay.
 | 
			
		||||
    RoundEndRestart(delay);
 | 
			
		||||
    
 | 
			
		||||
    // If log flag check fails, then don't log.
 | 
			
		||||
    if (LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_CORE))
 | 
			
		||||
    {
 | 
			
		||||
    SetConVarInt(FindConVar("mp_limitteams"), 0);
 | 
			
		||||
        LogMessageFormatted(-1, "Cvars", "Restart Game", "\"mp_restartgame\" was caught and blocked, commencing round.", LOG_FORMAT_TYPE_FULL);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										177
									
								
								src/zr/event.inc
									
									
									
									
									
								
							
							
						
						
									
										177
									
								
								src/zr/event.inc
									
									
									
									
									
								
							@@ -1,38 +1,69 @@
 | 
			
		||||
/**
 | 
			
		||||
 * ====================
 | 
			
		||||
/*
 | 
			
		||||
 * ============================================================================
 | 
			
		||||
 *
 | 
			
		||||
 *   Zombie:Reloaded
 | 
			
		||||
 *   File: events.inc
 | 
			
		||||
 *   Author: Greyscale
 | 
			
		||||
 * ==================== 
 | 
			
		||||
 *
 | 
			
		||||
 *   File:        (Core) event.inc
 | 
			
		||||
 *   Description: Event hooking and forwarding.
 | 
			
		||||
 *
 | 
			
		||||
 * ============================================================================
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
HookEvents()
 | 
			
		||||
/**
 | 
			
		||||
 * Init function for event module.
 | 
			
		||||
 */
 | 
			
		||||
EventInit()
 | 
			
		||||
{
 | 
			
		||||
    HookEvent("round_start", RoundStart);
 | 
			
		||||
    HookEvent("round_freeze_end", RoundFreezeEnd);
 | 
			
		||||
    HookEvent("round_end", RoundEnd);
 | 
			
		||||
    HookEvent("player_team", PlayerTeam, EventHookMode_Pre);
 | 
			
		||||
    HookEvent("player_spawn", PlayerSpawn);
 | 
			
		||||
    HookEvent("player_hurt", PlayerHurt);
 | 
			
		||||
    HookEvent("player_death", PlayerDeath);
 | 
			
		||||
    HookEvent("player_jump", PlayerJump);
 | 
			
		||||
    HookEvent("weapon_fire", WeaponFire);
 | 
			
		||||
    // Hook all events used by plugin.
 | 
			
		||||
    EventHook();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
UnhookEvents()
 | 
			
		||||
/**
 | 
			
		||||
 * Hook events used by plugin.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param unhook    If true, then unhook all events, if false, then hook.
 | 
			
		||||
 */ 
 | 
			
		||||
EventHook(bool:unhook = false)
 | 
			
		||||
{
 | 
			
		||||
    UnhookEvent("round_start", RoundStart);
 | 
			
		||||
    UnhookEvent("round_freeze_end", RoundFreezeEnd);
 | 
			
		||||
    UnhookEvent("round_end", RoundEnd);
 | 
			
		||||
    UnhookEvent("player_team", PlayerTeam, EventHookMode_Pre);
 | 
			
		||||
    UnhookEvent("player_spawn", PlayerSpawn);
 | 
			
		||||
    UnhookEvent("player_hurt", PlayerHurt);
 | 
			
		||||
    UnhookEvent("player_death", PlayerDeath);
 | 
			
		||||
    UnhookEvent("player_jump", PlayerJump);
 | 
			
		||||
    UnhookEvent("weapon_fire", WeaponFire);
 | 
			
		||||
    // If unhook is true, then continue.
 | 
			
		||||
    if (unhook)
 | 
			
		||||
    {
 | 
			
		||||
        // Unhook all events.
 | 
			
		||||
        UnhookEvent("round_start", EventRoundStart);
 | 
			
		||||
        UnhookEvent("round_freeze_end", EventRoundFreezeEnd);
 | 
			
		||||
        UnhookEvent("round_end", EventRoundEnd);
 | 
			
		||||
        UnhookEvent("player_team", EventPlayerTeam, EventHookMode_Pre);
 | 
			
		||||
        UnhookEvent("player_spawn", EventPlayerSpawn);
 | 
			
		||||
        UnhookEvent("player_hurt", EventPlayerHurt);
 | 
			
		||||
        UnhookEvent("player_death", EventPlayerDeath);
 | 
			
		||||
        UnhookEvent("player_jump", EventPlayerJump);
 | 
			
		||||
        UnhookEvent("weapon_fire", EventWeaponFire);
 | 
			
		||||
        
 | 
			
		||||
        // Stop after unhooking events.
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
    // Hook all events used by plugin.
 | 
			
		||||
    HookEvent("round_start", EventRoundStart);
 | 
			
		||||
    HookEvent("round_freeze_end", EventRoundFreezeEnd);
 | 
			
		||||
    HookEvent("round_end", EventRoundEnd);
 | 
			
		||||
    HookEvent("player_team", EventPlayerTeam, EventHookMode_Pre);
 | 
			
		||||
    HookEvent("player_spawn", EventPlayerSpawn);
 | 
			
		||||
    HookEvent("player_hurt", EventPlayerHurt);
 | 
			
		||||
    HookEvent("player_death", EventPlayerDeath);
 | 
			
		||||
    HookEvent("player_jump", EventPlayerJump);
 | 
			
		||||
    HookEvent("weapon_fire", EventWeaponFire);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Event callback (round_start)
 | 
			
		||||
 * The round is starting.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param event     The event handle.
 | 
			
		||||
 * @param name      Name of the event.
 | 
			
		||||
 * @dontBroadcast   If true, event is broadcasted to all clients, false if not.
 | 
			
		||||
 */
 | 
			
		||||
public Action:EventRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
{
 | 
			
		||||
    ZR_PrintToChat(0, "Round objective");
 | 
			
		||||
    
 | 
			
		||||
@@ -44,7 +75,15 @@ public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
    AntiStickOnRoundStart();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public Action:RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
/**
 | 
			
		||||
 * Event callback (round_freeze_end)
 | 
			
		||||
 * The freeze time is ending.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param event     The event handle.
 | 
			
		||||
 * @param name      Name of the event.
 | 
			
		||||
 * @dontBroadcast   If true, event is broadcasted to all clients, false if not.
 | 
			
		||||
 */
 | 
			
		||||
public Action:EventRoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
{
 | 
			
		||||
    RemoveObjectives();
 | 
			
		||||
    
 | 
			
		||||
@@ -55,7 +94,15 @@ public Action:RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadca
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public Action:RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
/**
 | 
			
		||||
 * Event callback (round_end)
 | 
			
		||||
 * The round is ending.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param event     The event handle.
 | 
			
		||||
 * @param name      Name of the event.
 | 
			
		||||
 * @dontBroadcast   If true, event is broadcasted to all clients, false if not.
 | 
			
		||||
 */
 | 
			
		||||
public Action:EventRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
{
 | 
			
		||||
    // Get all required event info.
 | 
			
		||||
    new reason = GetEventInt(event, "reason");
 | 
			
		||||
@@ -63,10 +110,19 @@ public Action:RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
    // Forward event to modules.
 | 
			
		||||
    RoundEndOnRoundEnd(reason);
 | 
			
		||||
    InfectOnRoundEnd();
 | 
			
		||||
    RespawnOnRoundEnd();
 | 
			
		||||
    ZTeleReset();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public Action:PlayerTeam(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
/**
 | 
			
		||||
 * Event callback (player_team)
 | 
			
		||||
 * Client is joining a team.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param event     The event handle.
 | 
			
		||||
 * @param name      Name of the event.
 | 
			
		||||
 * @dontBroadcast   If true, event is broadcasted to all clients, false if not.
 | 
			
		||||
 */
 | 
			
		||||
public Action:EventPlayerTeam(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
{
 | 
			
		||||
    // Get all required event info.
 | 
			
		||||
    new index = GetClientOfUserId(GetEventInt(event, "userid"));
 | 
			
		||||
@@ -78,14 +134,19 @@ public Action:PlayerTeam(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
    return Plugin_Handled;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public Action:PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
/**
 | 
			
		||||
 * Event callback (player_spawn)
 | 
			
		||||
 * Client is spawning into the game.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param event     The event handle.
 | 
			
		||||
 * @param name      Name of the event.
 | 
			
		||||
 * @dontBroadcast   If true, event is broadcasted to all clients, false if not.
 | 
			
		||||
 */
 | 
			
		||||
public Action:EventPlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
{
 | 
			
		||||
    // Get all required event info.
 | 
			
		||||
    new index = GetClientOfUserId(GetEventInt(event, "userid"));
 | 
			
		||||
    
 | 
			
		||||
    // Call post player_spawn
 | 
			
		||||
    CreateTimer(0.0, PlayerSpawnPost, index);
 | 
			
		||||
    
 | 
			
		||||
    // Reset FOV and overlay.
 | 
			
		||||
    SetPlayerFOV(index, 90);
 | 
			
		||||
    ClientCommand(index, "r_screenoverlay \"\"");
 | 
			
		||||
@@ -124,13 +185,15 @@ public Action:PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
    ZR_PrintToChat(index, "!zmenu reminder");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public Action:PlayerSpawnPost(Handle:timer, any:client)
 | 
			
		||||
{
 | 
			
		||||
    // Forward event to modules.
 | 
			
		||||
    SEffectsOnClientSpawnPost(client);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public Action:PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
/**
 | 
			
		||||
 * Event callback (player_hurt)
 | 
			
		||||
 * Client is being hurt.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param event     The event handle.
 | 
			
		||||
 * @param name      Name of the event.
 | 
			
		||||
 * @dontBroadcast   If true, event is broadcasted to all clients, false if not.
 | 
			
		||||
 */
 | 
			
		||||
public Action:EventPlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
{
 | 
			
		||||
    // Get all required event info.
 | 
			
		||||
    new index = GetClientOfUserId(GetEventInt(event, "userid"));
 | 
			
		||||
@@ -138,7 +201,7 @@ public Action:PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
    new hitgroup = GetEventInt(event, "hitgroup");
 | 
			
		||||
    new dmg_health = GetEventInt(event, "dmg_health");
 | 
			
		||||
    
 | 
			
		||||
    decl String:weapon[32];
 | 
			
		||||
    decl String:weapon[WEAPONS_MAX_LENGTH];
 | 
			
		||||
    GetEventString(event, "weapon", weapon, sizeof(weapon));
 | 
			
		||||
    
 | 
			
		||||
    // Forward event to modules.
 | 
			
		||||
@@ -150,10 +213,18 @@ public Action:PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
    ZHPOnClientHurt(index);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public Action:PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
/**
 | 
			
		||||
 * Event callback (player_death)
 | 
			
		||||
 * Client has been killed.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param event     The event handle.
 | 
			
		||||
 * @param name      Name of the event.
 | 
			
		||||
 * @dontBroadcast   If true, event is broadcasted to all clients, false if not.
 | 
			
		||||
 */
 | 
			
		||||
public Action:EventPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
{
 | 
			
		||||
    // Get the weapon name.
 | 
			
		||||
    decl String:weapon[32];
 | 
			
		||||
    decl String:weapon[WEAPONS_MAX_LENGTH];
 | 
			
		||||
    GetEventString(event, "weapon", weapon, sizeof(weapon));
 | 
			
		||||
    
 | 
			
		||||
    // If client is being infected, then stop.
 | 
			
		||||
@@ -190,7 +261,15 @@ public Action:PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
    ZHPOnClientDeath(index);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public Action:PlayerJump(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
/**
 | 
			
		||||
 * Event callback (player_jump)
 | 
			
		||||
 * Client is jumping.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param event     The event handle.
 | 
			
		||||
 * @param name      Name of the event.
 | 
			
		||||
 * @dontBroadcast   If true, event is broadcasted to all clients, false if not.
 | 
			
		||||
 */
 | 
			
		||||
public Action:EventPlayerJump(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
{
 | 
			
		||||
    // Get all required event info.
 | 
			
		||||
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
 | 
			
		||||
@@ -201,7 +280,15 @@ public Action:PlayerJump(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
    JumpBoost(client, distance, height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public Action:WeaponFire(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
/**
 | 
			
		||||
 * Event callback (weapon_fire)
 | 
			
		||||
 * Weapon has been fired.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param event     The event handle.
 | 
			
		||||
 * @param name      Name of the event.
 | 
			
		||||
 * @dontBroadcast   If true, event is broadcasted to all clients, false if not.
 | 
			
		||||
 */
 | 
			
		||||
public Action:EventWeaponFire(Handle:event, const String:name[], bool:dontBroadcast)
 | 
			
		||||
{
 | 
			
		||||
    // Get all required event info.
 | 
			
		||||
    decl String:weapon[32];
 | 
			
		||||
 
 | 
			
		||||
@@ -82,7 +82,7 @@ HitgroupsLoad()
 | 
			
		||||
 */ 
 | 
			
		||||
HitgroupsValidateConfig()
 | 
			
		||||
{
 | 
			
		||||
    // If log flag check fails, don't log.
 | 
			
		||||
    // If log flag check fails, then don't log.
 | 
			
		||||
    if (!LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_HITGROUPS))
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
 
 | 
			
		||||
@@ -270,19 +270,6 @@ InfectOnRoundStart()
 | 
			
		||||
        // Reset timer handle.
 | 
			
		||||
        tInfect = INVALID_HANDLE;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // x = client index.
 | 
			
		||||
    for (new x = 1; x <=  MaxClients; x++)
 | 
			
		||||
    {
 | 
			
		||||
        // If client isn't in-game, then stop.
 | 
			
		||||
        if (!IsClientInGame(x))
 | 
			
		||||
        {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // Disable zombie flag on client.
 | 
			
		||||
        bZombie[x] = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -437,7 +424,7 @@ public Action:InfectMotherZombie(Handle:timer)
 | 
			
		||||
        ZRCountValidClients(zombiecount, humancount, _, true);
 | 
			
		||||
        
 | 
			
		||||
        // Calculate mother zombie count.
 | 
			
		||||
        new mothercount = RoundToCeil(float(humancount) / ratio);
 | 
			
		||||
        new mothercount = RoundToNearest(float(humancount) / ratio);
 | 
			
		||||
        
 | 
			
		||||
        // x = current mother zombie count.
 | 
			
		||||
        for (new x = 0; x < mothercount; x++)
 | 
			
		||||
@@ -559,16 +546,10 @@ InfectClient(client, attacker = -1, bool:motherinfect = false)
 | 
			
		||||
    
 | 
			
		||||
    // Forward event to modules.
 | 
			
		||||
    ClassOnClientInfected(client, motherinfect);
 | 
			
		||||
    RoundEndOnClientInfected();
 | 
			
		||||
    SEffectsOnClientInfected(client);
 | 
			
		||||
    ZHPOnClientInfected(client);
 | 
			
		||||
    TeleportOnClientInfected(client);
 | 
			
		||||
    
 | 
			
		||||
    // Terminate the round if the last player was infected.
 | 
			
		||||
    new RoundEndOutcome:outcome;
 | 
			
		||||
    if (RoundEndGetRoundStatus(outcome))
 | 
			
		||||
    {
 | 
			
		||||
        RoundEndTerminateRound(outcome);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -578,7 +559,7 @@ InfectClient(client, attacker = -1, bool:motherinfect = false)
 | 
			
		||||
 */
 | 
			
		||||
InfectFireEffects(client)
 | 
			
		||||
{
 | 
			
		||||
    // Create location and direction arrays.
 | 
			
		||||
    // Initialize vector variables.
 | 
			
		||||
    new Float:clientloc[3];
 | 
			
		||||
    new Float:direction[3] = {0.0, 0.0, 0.0};
 | 
			
		||||
    
 | 
			
		||||
@@ -586,31 +567,25 @@ InfectFireEffects(client)
 | 
			
		||||
    GetClientAbsOrigin(client, clientloc);
 | 
			
		||||
    clientloc[2] += 30;
 | 
			
		||||
    
 | 
			
		||||
    // Get infection sound.
 | 
			
		||||
    // If cvar contains path, then continue.
 | 
			
		||||
    decl String:sound[PLATFORM_MAX_PATH];
 | 
			
		||||
    GetConVarString(g_hCvarsList[CVAR_INFECT_SOUND], sound, sizeof(sound));
 | 
			
		||||
    if (sound[0])
 | 
			
		||||
    {
 | 
			
		||||
        // Emit infect sound from infected client.
 | 
			
		||||
        SEffectsEmitSoundFromClient(client, sound, SNDLEVEL_SCREAMING);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Create an energy splash effect.
 | 
			
		||||
    // If energy splash effect is enabled, then continue.
 | 
			
		||||
    new bool:esplash = GetConVarBool(g_hCvarsList[CVAR_INFECT_ESPLASH]);
 | 
			
		||||
    if (esplash)
 | 
			
		||||
    {
 | 
			
		||||
        TE_SetupEnergySplash(clientloc, direction, true);
 | 
			
		||||
        TE_SendToAll();
 | 
			
		||||
        // Create energy splash effect.
 | 
			
		||||
        VEffectsCreateEnergySplash(clientloc, direction, true);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Create an explosion entity.
 | 
			
		||||
    new explosion = CreateEntityByName("env_explosion");
 | 
			
		||||
    
 | 
			
		||||
    // If explosion entity is valid, then continue.
 | 
			
		||||
    if (explosion != -1)
 | 
			
		||||
    {
 | 
			
		||||
        // Get and set flags on explosion.
 | 
			
		||||
        new flags = GetEntProp(explosion, Prop_Data, "m_spawnflags");
 | 
			
		||||
        flags = flags | EXP_NODAMAGE | EXP_NODECAL;
 | 
			
		||||
    // Initialize explosion flags variable.
 | 
			
		||||
    new flags;
 | 
			
		||||
    
 | 
			
		||||
    // Set "nofireball" flag if fireball is disabled.
 | 
			
		||||
    new bool:fireball = GetConVarBool(g_hCvarsList[CVAR_INFECT_FIREBALL]);
 | 
			
		||||
@@ -633,40 +608,20 @@ InfectFireEffects(client)
 | 
			
		||||
        flags = flags | EXP_NOSPARKS;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
        // Set new flags on entity.
 | 
			
		||||
        SetEntProp(explosion, Prop_Data, "m_spawnflags", flags);
 | 
			
		||||
        
 | 
			
		||||
        // Spawn the entity into the world.
 | 
			
		||||
        DispatchSpawn(explosion);
 | 
			
		||||
        
 | 
			
		||||
        // Precache fireball model.
 | 
			
		||||
        PrecacheModel("materials/sprites/xfireball3.vmt");
 | 
			
		||||
        
 | 
			
		||||
        // Set origin and explosion key values on entity.
 | 
			
		||||
        DispatchKeyValueVector(explosion, "origin", clientloc);
 | 
			
		||||
        DispatchKeyValue(explosion, "fireballsprite", "materials/sprites/xfireball3.vmt");
 | 
			
		||||
        
 | 
			
		||||
        // Tell the entity to explode.
 | 
			
		||||
        AcceptEntityInput(explosion, "Explode");
 | 
			
		||||
    }
 | 
			
		||||
    // Create explosion at client's origin.
 | 
			
		||||
    VEffectsCreateExplosion(clientloc, flags);
 | 
			
		||||
    
 | 
			
		||||
    // If shake effect is enabled, then continue.
 | 
			
		||||
    new bool:shake = GetConVarBool(g_hCvarsList[CVAR_INFECT_SHAKE]);
 | 
			
		||||
    if (shake)
 | 
			
		||||
    {
 | 
			
		||||
        // If shake usermsg isn't invalid, then continue.
 | 
			
		||||
        new Handle:hShake = StartMessageOne("Shake", client);
 | 
			
		||||
        if (hShake != INVALID_HANDLE)
 | 
			
		||||
        {
 | 
			
		||||
            // Write shake information to usermsg handle.
 | 
			
		||||
            BfWriteByte(hShake, 0);
 | 
			
		||||
            BfWriteFloat(hShake, GetConVarFloat(g_hCvarsList[CVAR_INFECT_SHAKE_AMP]));
 | 
			
		||||
            BfWriteFloat(hShake, GetConVarFloat(g_hCvarsList[CVAR_INFECT_SHAKE_FREQUENCY]));
 | 
			
		||||
            BfWriteFloat(hShake, GetConVarFloat(g_hCvarsList[CVAR_INFECT_SHAKE_DURATION]));
 | 
			
		||||
        // Get shake info.
 | 
			
		||||
        new Float:shakeamp = GetConVarFloat(g_hCvarsList[CVAR_INFECT_SHAKE_AMP]);
 | 
			
		||||
        new Float:shakefrequency = GetConVarFloat(g_hCvarsList[CVAR_INFECT_SHAKE_FREQUENCY]);
 | 
			
		||||
        new Float:shakeduration = GetConVarFloat(g_hCvarsList[CVAR_INFECT_SHAKE_DURATION]);
 | 
			
		||||
        
 | 
			
		||||
            // End usermsg and sent to client.
 | 
			
		||||
            EndMessage();
 | 
			
		||||
        }
 | 
			
		||||
        // Shake client's screen.
 | 
			
		||||
        VEffectsShakeClientScreen(client, shakeamp, shakefrequency, shakeduration);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -58,6 +58,23 @@
 | 
			
		||||
 * @endsection
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @section Global handles for modules cvars.
 | 
			
		||||
 */
 | 
			
		||||
new Handle:g_hLog = INVALID_HANDLE;
 | 
			
		||||
new Handle:g_hLogFlags = INVALID_HANDLE;
 | 
			
		||||
/**
 | 
			
		||||
 * @endsection
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
LogInit()
 | 
			
		||||
{
 | 
			
		||||
    // Create modules cvars.
 | 
			
		||||
    g_hLog      =   CreateConVar("zr_log", "1", "");
 | 
			
		||||
    g_hLogFlags =   CreateConVar("zr_logflags", "331", "");
 | 
			
		||||
    // Old Desc: Logging flags. Log messages to sourcemod logs, server console or client console. Use zr_log_flags to see a list of flags. (0: Disable)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Logs a formatted message with module and block info depending, on the type.
 | 
			
		||||
 *
 | 
			
		||||
@@ -75,39 +92,45 @@
 | 
			
		||||
LogMessageFormatted(client, const String:module[], const String:block[], const String:message[], type = LOG_FORMAT_TYPE_FULL, any:...)
 | 
			
		||||
{
 | 
			
		||||
    // If logging is disabled, then stop.
 | 
			
		||||
    new bool:log = GetConVarBool(g_hCvarsList[CVAR_LOG]);
 | 
			
		||||
    new bool:log = GetConVarBool(g_hLog);
 | 
			
		||||
    if (!log)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    decl String:buffer[LOG_MAX_LENGTH_FILE];
 | 
			
		||||
    decl String:text[LOG_MAX_LENGTH_FILE];
 | 
			
		||||
    decl String:logtext[LOG_MAX_LENGTH_FILE];
 | 
			
		||||
    
 | 
			
		||||
    if (client == 0 && LogCheckFlag(LOG_IGNORE_CONSOLE))
 | 
			
		||||
    // Set to true if log to console, false if client.
 | 
			
		||||
    new bool:console = !ZRIsClientValid(client);
 | 
			
		||||
    
 | 
			
		||||
    // If client is invalid (console), and console is ignored, then stop.
 | 
			
		||||
    if (console && LogCheckFlag(LOG_IGNORE_CONSOLE))
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Format log text.
 | 
			
		||||
    VFormat(logtext, sizeof(logtext), message, 6);
 | 
			
		||||
    
 | 
			
		||||
    // Format other parameters onto the log text.
 | 
			
		||||
    switch (type)
 | 
			
		||||
    {
 | 
			
		||||
        // Log type is simple.
 | 
			
		||||
        case LOG_FORMAT_TYPE_SIMPLE:
 | 
			
		||||
        {
 | 
			
		||||
            VFormat(buffer, sizeof(buffer), message, 6);
 | 
			
		||||
            Format(text, sizeof(text), "%s", message);
 | 
			
		||||
            LogMessage(text);
 | 
			
		||||
            LogMessage(logtext);
 | 
			
		||||
        }
 | 
			
		||||
        // Log type is full.
 | 
			
		||||
        case LOG_FORMAT_TYPE_FULL:
 | 
			
		||||
        {
 | 
			
		||||
            VFormat(buffer, sizeof(buffer), message, 6);
 | 
			
		||||
            Format(text, sizeof(text), "\"%s\" : \"%s\" -- %s", module, block, buffer);
 | 
			
		||||
            LogMessage(text);
 | 
			
		||||
            Format(logtext, sizeof(logtext), "\"%s\" : \"%s\" -- %s", module, block, logtext);
 | 
			
		||||
            LogMessage(logtext);
 | 
			
		||||
        }
 | 
			
		||||
        // Log type is error.
 | 
			
		||||
        case LOG_FORMAT_TYPE_ERROR:
 | 
			
		||||
        {
 | 
			
		||||
            VFormat(buffer, sizeof(buffer), message, 6);
 | 
			
		||||
            Format(text, sizeof(text), "\"%s\" : \"%s\" -- %s", module, block, buffer);
 | 
			
		||||
            LogError(text);
 | 
			
		||||
            Format(logtext, sizeof(logtext), "\"%s\" : \"%s\" -- %s", module, block, logtext);
 | 
			
		||||
            LogError(logtext);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
@@ -115,16 +138,17 @@ LogMessageFormatted(client, const String:module[], const String:block[], const S
 | 
			
		||||
    if (LogCheckFlag(LOG_TO_ADMINS))
 | 
			
		||||
    {
 | 
			
		||||
        // Print text to admins.
 | 
			
		||||
        LogToAdmins(text);
 | 
			
		||||
        LogToAdmins(logtext);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if (ZRIsClientValid(client) && LogCheckFlag(LOG_TO_CLIENT))
 | 
			
		||||
    // If client isn't console, and we log to client's then continue.
 | 
			
		||||
    if (!console && LogCheckFlag(LOG_TO_CLIENT))
 | 
			
		||||
    {
 | 
			
		||||
        // Set client as translation target.
 | 
			
		||||
        SetGlobalTransTarget(client);
 | 
			
		||||
        
 | 
			
		||||
        // Print to client.
 | 
			
		||||
        PrintToConsole(client, "%t %s", "ZR", text);
 | 
			
		||||
        PrintToConsole(client, "%t %s", "ZR", logtext);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -164,7 +188,7 @@ LogToAdmins(String:message[])
 | 
			
		||||
bool:LogHasFlag(flag)
 | 
			
		||||
{
 | 
			
		||||
    // Get log flags.
 | 
			
		||||
    new logflags = GetConVarInt(g_hCvarsList[CVAR_LOGFLAGS]);
 | 
			
		||||
    new logflags = GetConVarInt(g_hLogFlags);
 | 
			
		||||
    
 | 
			
		||||
    // Return true if flag is found, false if not.
 | 
			
		||||
    return bool:(logflags & flag);
 | 
			
		||||
@@ -175,7 +199,7 @@ bool:LogHasFlag(flag)
 | 
			
		||||
 * overrides are enabled only logs with it's module flag set will be logged.
 | 
			
		||||
 *
 | 
			
		||||
 * @param logtype           Log type flag.
 | 
			
		||||
 * @param module    Specifies what module the log event belongs to.
 | 
			
		||||
 * @param modulefilter      Specifies what module the log event belongs to.
 | 
			
		||||
 * @return                  True if the event should be logged, false otherwise.
 | 
			
		||||
 */
 | 
			
		||||
bool:LogCheckFlag(logtype, modulefilter = 0)
 | 
			
		||||
@@ -187,3 +211,28 @@ bool:LogCheckFlag(logtype, modulefilter = 0)
 | 
			
		||||
    
 | 
			
		||||
    return LogHasFlag(logtype);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Toggles a log flag.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param flag  The flag to toggle.
 | 
			
		||||
 */
 | 
			
		||||
LogToggleFlag(flag)
 | 
			
		||||
{
 | 
			
		||||
    // Get current flags
 | 
			
		||||
    new logflags = GetConVarInt(g_hLogFlags);
 | 
			
		||||
    
 | 
			
		||||
    // If cvar contains flag, then remove it.
 | 
			
		||||
    if (logflags & flag)
 | 
			
		||||
    {
 | 
			
		||||
        logflags = logflags - flag;
 | 
			
		||||
    }
 | 
			
		||||
    // If cvar doesn't have the flag, then add it.
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        logflags = logflags + flag;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Set new value to logflags cvar.
 | 
			
		||||
    SetConVarInt(g_hLogFlags, logflags);
 | 
			
		||||
}
 | 
			
		||||
@@ -17,7 +17,7 @@ new Handle:tRespawn[MAXPLAYERS + 1];
 | 
			
		||||
/**
 | 
			
		||||
 * Array for flagging zombies who were killed by world.
 | 
			
		||||
 */ 
 | 
			
		||||
new bool:pKilledByWorld[MAXPLAYERS + 1];
 | 
			
		||||
new bool:bKilledByWorld[MAXPLAYERS + 1];
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Client is joining the server.
 | 
			
		||||
@@ -27,8 +27,8 @@ RespawnClientInit(client)
 | 
			
		||||
    // Reset timer handle.
 | 
			
		||||
    tRespawn[client] = INVALID_HANDLE;
 | 
			
		||||
    
 | 
			
		||||
    // Init pKilledByWorld for client.
 | 
			
		||||
    pKilledByWorld[client] = false;
 | 
			
		||||
    // Init bKilledByWorld for client.
 | 
			
		||||
    bKilledByWorld[client] = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -58,8 +58,8 @@ RespawnOnClientDeath(client, attacker, const String:weapon[])
 | 
			
		||||
    // If client is a zombie, check if they were killed by world.
 | 
			
		||||
    if (InfectIsClientInfected(client))
 | 
			
		||||
    {
 | 
			
		||||
        // Set pKilledByWorld to true if attacker is not a valid client.
 | 
			
		||||
        pKilledByWorld[client] = !ZRIsClientValid(attacker);
 | 
			
		||||
        // Set bKilledByWorld to true if attacker is not a valid client.
 | 
			
		||||
        bKilledByWorld[client] = !ZRIsClientValid(attacker);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // If timer is running, kill it.
 | 
			
		||||
@@ -86,6 +86,34 @@ RespawnOnClientDeath(client, attacker, const String:weapon[])
 | 
			
		||||
    tRespawn[client] = CreateTimer(delay, RespawnTimer, client, TIMER_FLAG_NO_MAPCHANGE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The round is ending.
 | 
			
		||||
 */
 | 
			
		||||
RespawnOnRoundEnd()
 | 
			
		||||
{
 | 
			
		||||
    // x = client index.
 | 
			
		||||
    for (new x = 1; x <= MaxClients; x++)
 | 
			
		||||
    {
 | 
			
		||||
        // If client isn't in-game, then stop.
 | 
			
		||||
        if (!IsClientInGame(x))
 | 
			
		||||
        {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // If timer isn't currently running, then stop.
 | 
			
		||||
        if (tRespawn[x] == INVALID_HANDLE)
 | 
			
		||||
        {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // Stop timer.
 | 
			
		||||
        KillTimer(tRespawn[x]);
 | 
			
		||||
        
 | 
			
		||||
        // Reset timer handle.
 | 
			
		||||
        tRespawn[x] = INVALID_HANDLE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns if a player is to be respawned as a zombie, because they were killed by world.
 | 
			
		||||
 * 
 | 
			
		||||
@@ -95,7 +123,7 @@ RespawnOnClientDeath(client, attacker, const String:weapon[])
 | 
			
		||||
RespawnKilledByWorld(client)
 | 
			
		||||
{
 | 
			
		||||
    // Return true if both the cvar is enabled and the player was killed by world.
 | 
			
		||||
    return (GetConVarBool(g_hCvarsList[CVAR_RESPAWN_ZOMBIE_WORLD]) && pKilledByWorld[client]);
 | 
			
		||||
    return (GetConVarBool(g_hCvarsList[CVAR_RESPAWN_ZOMBIE_WORLD]) && bKilledByWorld[client]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -130,10 +158,10 @@ RespawnSpawnClient(client)
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if (GetConVarBool(g_hCvarsList[CVAR_RESPAWN_ZOMBIE_WORLD]) && pKilledByWorld[client])
 | 
			
		||||
    if (GetConVarBool(g_hCvarsList[CVAR_RESPAWN_ZOMBIE_WORLD]) && bKilledByWorld[client])
 | 
			
		||||
    {
 | 
			
		||||
        InfectClient(client);
 | 
			
		||||
        pKilledByWorld[client] = false;
 | 
			
		||||
        bKilledByWorld[client] = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -84,10 +84,21 @@ RoundEndClientInit(client)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Client has been killed.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param client    The client index.
 | 
			
		||||
 */
 | 
			
		||||
RoundEndOnClientDeath()
 | 
			
		||||
{
 | 
			
		||||
    // Terminate the round if the last player was killed.
 | 
			
		||||
    new RoundEndOutcome:outcome;
 | 
			
		||||
    if (RoundEndGetRoundStatus(outcome))
 | 
			
		||||
    {
 | 
			
		||||
        RoundEndTerminateRound(outcome);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Client has been infected.
 | 
			
		||||
 */
 | 
			
		||||
RoundEndOnClientInfected()
 | 
			
		||||
{
 | 
			
		||||
    // Terminate the round if the last player was infected.
 | 
			
		||||
    new RoundEndOutcome:outcome;
 | 
			
		||||
@@ -111,12 +122,6 @@ RoundEndOnRoundStart()
 | 
			
		||||
        // Reset timer handle.
 | 
			
		||||
        tRoundEnd = INVALID_HANDLE;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Tell plugin no zombies have been spawned.
 | 
			
		||||
    g_bZombieSpawned = false;
 | 
			
		||||
    
 | 
			
		||||
    // Balance teams, and respawn all players.
 | 
			
		||||
    RoundEndBalanceTeams(true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -331,12 +336,23 @@ RoundEndTerminateRound(RoundEndOutcome:outcome)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Restarts the game.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param delay     How long to wait between round end and new round.
 | 
			
		||||
 */
 | 
			
		||||
RoundEndRestart(Float:delay)
 | 
			
		||||
{
 | 
			
		||||
    // Terminate the round.
 | 
			
		||||
    TerminateRound(delay, ROUNDEND_GAME_COMMENCING);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Balances teams
 | 
			
		||||
 * 
 | 
			
		||||
 * @param spawn     If true, it will respawn player after switching their team.
 | 
			
		||||
 */
 | 
			
		||||
RoundEndBalanceTeams(bool:spawn = false)
 | 
			
		||||
RoundEndBalanceTeams()
 | 
			
		||||
{
 | 
			
		||||
    // Create eligible player list.
 | 
			
		||||
    new Handle:arrayEligibleClients = INVALID_HANDLE;
 | 
			
		||||
@@ -376,29 +392,6 @@ RoundEndBalanceTeams(bool:spawn = false)
 | 
			
		||||
        CS_SwitchTeam(client, CS_TEAM_CT);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // If spawn is false, then stop.
 | 
			
		||||
    if (!spawn)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // x = array index.
 | 
			
		||||
    // client = client index.
 | 
			
		||||
    for (new x = 0; x < eligibleclients; x++)
 | 
			
		||||
    {
 | 
			
		||||
        // Get client stored in array index.
 | 
			
		||||
        client = GetArrayCell(arrayEligibleClients, x);
 | 
			
		||||
        
 | 
			
		||||
        // If client is dead, then stop.
 | 
			
		||||
        if (!IsPlayerAlive(client))
 | 
			
		||||
        {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // Respawn client.
 | 
			
		||||
        CS_RespawnPlayer(client);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Destroy handle.
 | 
			
		||||
    CloseHandle(arrayEligibleClients);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -122,7 +122,7 @@ AmbientSoundsOnRoundStart()
 | 
			
		||||
 * 
 | 
			
		||||
 * @param client    The client index.
 | 
			
		||||
 */
 | 
			
		||||
AmbientSoundsOnClientSpawnPost(client)
 | 
			
		||||
AmbientSoundsOnClientSpawn(client)
 | 
			
		||||
{
 | 
			
		||||
    // If ambience is disabled, then stop.
 | 
			
		||||
    if (!g_bAmbientSounds)
 | 
			
		||||
 
 | 
			
		||||
@@ -69,20 +69,10 @@ SEffectsOnRoundStart()
 | 
			
		||||
SEffectsOnClientSpawn(client)
 | 
			
		||||
{
 | 
			
		||||
    // Forward event to sub-modules.
 | 
			
		||||
    //AmbientSoundsOnClientSpawn(client);
 | 
			
		||||
    AmbientSoundsOnClientSpawn(client);
 | 
			
		||||
    ZombieSoundsOnClientSpawn(client);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fired one frame after client spawns into the game.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param client    The client index.
 | 
			
		||||
 */
 | 
			
		||||
SEffectsOnClientSpawnPost(client)
 | 
			
		||||
{
 | 
			
		||||
    AmbientSoundsOnClientSpawnPost(client);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Client has been killed.
 | 
			
		||||
 * 
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,19 @@ VEffectsLoad()
 | 
			
		||||
    // Store map's default sky before applying new one.
 | 
			
		||||
    GetConVarString(g_hSkyname, g_VEffectsDefaultSky, sizeof(g_VEffectsDefaultSky));
 | 
			
		||||
    
 | 
			
		||||
    // TODO add sky to downloads table.
 | 
			
		||||
    // If sky path is empty, then stop.
 | 
			
		||||
    if (!g_VEffectsDefaultSky[0])
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    decl String:downloadpath[PLATFORM_MAX_PATH];
 | 
			
		||||
    
 | 
			
		||||
    // Prepend materials/skybox to the path.
 | 
			
		||||
    Format(downloadpath, sizeof(downloadpath), "materials/skybox/%s", g_VEffectsDefaultSky);
 | 
			
		||||
    
 | 
			
		||||
    // Add skybox file to downloads table.
 | 
			
		||||
    AddFileToDownloadsTable(downloadpath);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -55,6 +67,12 @@ VEffectsOnRoundStart()
 | 
			
		||||
    
 | 
			
		||||
    // Apply new sky.
 | 
			
		||||
    VEffectsApplySky(!sky);
 | 
			
		||||
    
 | 
			
		||||
    // If fog is disabled, then disable.
 | 
			
		||||
    new bool:fogoverride = GetConVarBool(g_hCvarsList[CVAR_VEFFECTS_FOG_OVERRIDE]);
 | 
			
		||||
    
 | 
			
		||||
    // Apply fog.
 | 
			
		||||
    VEffectsApplyFog(fogoverride);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VEffectsApplyLightStyle(bool:disable = false)
 | 
			
		||||
@@ -94,3 +112,218 @@ VEffectsApplySky(bool:disable = false)
 | 
			
		||||
    // Set new sky on all clients.
 | 
			
		||||
    SetConVarString(g_hSkyname, skypath, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VEffectsApplyFog(bool:override = false)
 | 
			
		||||
{
 | 
			
		||||
    // Find current fog index
 | 
			
		||||
    new fogindex = FindEntityByClassname(-1, "env_fog_controller");
 | 
			
		||||
    
 | 
			
		||||
    // If override is enabled, then continue.
 | 
			
		||||
    if (override)
 | 
			
		||||
    {
 | 
			
		||||
        // If there is fog, then continue.
 | 
			
		||||
        if (fogindex != -1)
 | 
			
		||||
        {
 | 
			
		||||
            // Delete fog.
 | 
			
		||||
            RemoveEdict(fogindex);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // If fog is disabled, then stop.
 | 
			
		||||
    new bool:fog = GetConVarBool(g_hCvarsList[CVAR_VEFFECTS_FOG]);
 | 
			
		||||
    if (!fog)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // If there is no fog on the map, create new fog.
 | 
			
		||||
    if (fogindex == -1)
 | 
			
		||||
    {
 | 
			
		||||
        // Create and spawn fog.
 | 
			
		||||
        fogindex = CreateEntityByName("env_fog_controller");
 | 
			
		||||
        DispatchSpawn(fogindex);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    decl String:fogcolor[16];
 | 
			
		||||
    
 | 
			
		||||
    // Set primary fog color.
 | 
			
		||||
    GetConVarString(g_hCvarsList[CVAR_VEFFECTS_FOG_PCOLOR], fogcolor, sizeof(fogcolor));
 | 
			
		||||
    VEffectsSetFogColor(fogindex, fogcolor, true);
 | 
			
		||||
    
 | 
			
		||||
    // Set secondary fog color.
 | 
			
		||||
    GetConVarString(g_hCvarsList[CVAR_VEFFECTS_FOG_SCOLOR], fogcolor, sizeof(fogcolor));
 | 
			
		||||
    VEffectsSetFogColor(fogindex, fogcolor, false);
 | 
			
		||||
    
 | 
			
		||||
    // Set fog's density.
 | 
			
		||||
    new Float:fogdensity = GetConVarFloat(g_hCvarsList[CVAR_VEFFECTS_FOG_DENSITY]);
 | 
			
		||||
    VEffectsSetFogDensity(fogindex, fogdensity);
 | 
			
		||||
    
 | 
			
		||||
    // Set fog's start distance.
 | 
			
		||||
    new fogstart = GetConVarInt(g_hCvarsList[CVAR_VEFFECTS_FOG_STARTDIST]);
 | 
			
		||||
    VEffectsSetFogStartDist(fogindex, fogstart);
 | 
			
		||||
    
 | 
			
		||||
    // Set fog's end distance.
 | 
			
		||||
    new fogend = GetConVarInt(g_hCvarsList[CVAR_VEFFECTS_FOG_ENDDIST]);
 | 
			
		||||
    VEffectsSetFogEndDist(fogindex, fogend);
 | 
			
		||||
    
 | 
			
		||||
    // Set fog's far z distance.
 | 
			
		||||
    new fogfarz = GetConVarInt(g_hCvarsList[CVAR_VEFFECTS_FOG_FARZ]);
 | 
			
		||||
    VEffectsSetFogFarZ(fogindex, fogfarz);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set fog's primary or secondary color.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param fogindex  Edict index of the fog to modify.
 | 
			
		||||
 * @param color     The rgb color of the fog. 
 | 
			
		||||
 * @param primary   (Optional) True to set primary, false otherwise.
 | 
			
		||||
 */
 | 
			
		||||
VEffectsSetFogColor(fogindex, const String:color[], bool:primary = true)
 | 
			
		||||
{
 | 
			
		||||
    // Set primary color.
 | 
			
		||||
    if (primary)
 | 
			
		||||
    {
 | 
			
		||||
        // Set new color.
 | 
			
		||||
        SetVariantString(color);
 | 
			
		||||
        AcceptEntityInput(fogindex, "SetColor");
 | 
			
		||||
    }
 | 
			
		||||
    // Set secondary color.
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        // Set new color.
 | 
			
		||||
        SetVariantString(color);
 | 
			
		||||
        AcceptEntityInput(fogindex, "SetColorSecondary");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set fog's density.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param fogindex  Edict index of the fog to modify.
 | 
			
		||||
 * @param density   The density of the fog. 
 | 
			
		||||
 */
 | 
			
		||||
VEffectsSetFogDensity(fogindex, Float:density)
 | 
			
		||||
{
 | 
			
		||||
    // Set density.
 | 
			
		||||
    DispatchKeyValueFloat(fogindex, "fogmaxdensity", density);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set fog's start distance.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param fogindex      Edict index of the fog to modify.
 | 
			
		||||
 * @param startdist     The start distance of the fog. 
 | 
			
		||||
 */
 | 
			
		||||
VEffectsSetFogStartDist(fogindex, startdist)
 | 
			
		||||
{
 | 
			
		||||
    // Set start distance.
 | 
			
		||||
    SetVariantInt(startdist);
 | 
			
		||||
    AcceptEntityInput(fogindex, "SetStartDist");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set fog's end distance.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param fogindex      Edict index of the fog to modify.
 | 
			
		||||
 * @param enddist       The end distance of the fog. 
 | 
			
		||||
 */
 | 
			
		||||
VEffectsSetFogEndDist(fogindex, enddist)
 | 
			
		||||
{
 | 
			
		||||
    // Set end distance.
 | 
			
		||||
    SetVariantInt(enddist);
 | 
			
		||||
    AcceptEntityInput(fogindex, "SetEndDist");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set fog's far z distance.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param fogindex      Edict index of the fog to modify.
 | 
			
		||||
 * @param farz          The far z distance of the fog. 
 | 
			
		||||
 */
 | 
			
		||||
VEffectsSetFogFarZ(fogindex, farz)
 | 
			
		||||
{
 | 
			
		||||
    // Set far z distance.
 | 
			
		||||
    SetVariantInt(farz);
 | 
			
		||||
    AcceptEntityInput(fogindex, "SetFarZ");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create an energy splash effect.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param client        The client index.
 | 
			
		||||
 * @param origin        The origin of the effect.
 | 
			
		||||
 * @param direction     The direction of the effect.
 | 
			
		||||
 */
 | 
			
		||||
VEffectsCreateEnergySplash(const Float:origin[3], const Float:direction[3], bool:explosive)
 | 
			
		||||
{
 | 
			
		||||
    TE_SetupEnergySplash(origin, direction, explosive);
 | 
			
		||||
    TE_SendToAll();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create an explosion effect with strict flags.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param origin    The (x, y, z) coordinate of the explosion.
 | 
			
		||||
 * @param flags     The flags to set on the explosion.
 | 
			
		||||
 */
 | 
			
		||||
VEffectsCreateExplosion(const Float:origin[3], flags)
 | 
			
		||||
{
 | 
			
		||||
    // Create an explosion entity.
 | 
			
		||||
    new explosion = CreateEntityByName("env_explosion");
 | 
			
		||||
    
 | 
			
		||||
    // If explosion entity isn't valid, then stop.
 | 
			
		||||
    if (explosion == -1)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Get and modify flags on explosion.
 | 
			
		||||
    new spawnflags = GetEntProp(explosion, Prop_Data, "m_spawnflags");
 | 
			
		||||
    spawnflags = spawnflags | EXP_NODAMAGE | EXP_NODECAL | flags;
 | 
			
		||||
    
 | 
			
		||||
    // Set modified flags on entity.
 | 
			
		||||
    SetEntProp(explosion, Prop_Data, "m_spawnflags", spawnflags);
 | 
			
		||||
    
 | 
			
		||||
    // Spawn the entity into the world.
 | 
			
		||||
    DispatchSpawn(explosion);
 | 
			
		||||
    
 | 
			
		||||
    // Set the origin of the explosion.
 | 
			
		||||
    DispatchKeyValueVector(explosion, "origin", origin);
 | 
			
		||||
    
 | 
			
		||||
    // Set fireball material.
 | 
			
		||||
    PrecacheModel("materials/sprites/xfireball3.vmt");
 | 
			
		||||
    DispatchKeyValue(explosion, "fireballsprite", "materials/sprites/xfireball3.vmt");
 | 
			
		||||
    
 | 
			
		||||
    // Tell the entity to explode.
 | 
			
		||||
    AcceptEntityInput(explosion, "Explode");
 | 
			
		||||
    
 | 
			
		||||
    // Remove entity from world.
 | 
			
		||||
    RemoveEdict(explosion);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Shake a client's screen with specific parameters.
 | 
			
		||||
 * 
 | 
			
		||||
 * @param client        The client index.
 | 
			
		||||
 * @param amplitude     The amplitude (intensity) of the shaking.
 | 
			
		||||
 * @param frequency     The frequency (speed) of the shaking.
 | 
			
		||||
 * @param duration      The duration (time) of the shaking.
 | 
			
		||||
 */
 | 
			
		||||
VEffectsShakeClientScreen(client, Float:amplitude, Float:frequency, Float:duration)
 | 
			
		||||
{
 | 
			
		||||
    // If shake usermsg isn't invalid, then stop.
 | 
			
		||||
    new Handle:hShake = StartMessageOne("Shake", client);
 | 
			
		||||
    if (hShake == INVALID_HANDLE)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Write shake information to usermsg handle.
 | 
			
		||||
    BfWriteByte(hShake, 0);
 | 
			
		||||
    BfWriteFloat(hShake, amplitude);
 | 
			
		||||
    BfWriteFloat(hShake, frequency);
 | 
			
		||||
    BfWriteFloat(hShake, duration);
 | 
			
		||||
    
 | 
			
		||||
    // End usermsg and send to client.
 | 
			
		||||
    EndMessage();
 | 
			
		||||
}
 | 
			
		||||
@@ -42,7 +42,9 @@ RestrictInit()
 | 
			
		||||
    gRestrictedWeapons = CreateArray(32, 0);
 | 
			
		||||
    
 | 
			
		||||
    // Hook buy command.
 | 
			
		||||
    RegConsoleCmd("buy", RestrictBuyHook);
 | 
			
		||||
    RegConsoleCmd("buy", RestrictBuyCommand);
 | 
			
		||||
    RegConsoleCmd("autobuy", RestrictBuyCommand);
 | 
			
		||||
    RegConsoleCmd("rebuy", RestrictBuyCommand);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -136,7 +138,7 @@ RestrictDefaultRestrictions()
 | 
			
		||||
 */ 
 | 
			
		||||
RestrictValidateWeaponGroups()
 | 
			
		||||
{
 | 
			
		||||
    // If log flag check fails, don't log.
 | 
			
		||||
    // If log flag check fails, then don't log.
 | 
			
		||||
    if (!LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_WEAPONS))
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
@@ -215,17 +217,18 @@ RestrictOnClientDisconnect(client)
 | 
			
		||||
 * @param client    The client index.
 | 
			
		||||
 * @param argc      Argument count.
 | 
			
		||||
 */
 | 
			
		||||
public Action:RestrictBuyHook(client, argc)
 | 
			
		||||
public Action:RestrictBuyCommand(client, argc)
 | 
			
		||||
{
 | 
			
		||||
    // If plugin is disabled then stop.
 | 
			
		||||
    new bool:enabled = GetConVarBool(g_hCvarsList[CVAR_ENABLE]);
 | 
			
		||||
    /*new bool:enabled = GetConVarBool(g_hCvarsList[CVAR_ENABLE]);
 | 
			
		||||
    if (!enabled)
 | 
			
		||||
    {
 | 
			
		||||
        // Allow command.
 | 
			
		||||
        return Plugin_Continue;
 | 
			
		||||
    }
 | 
			
		||||
    }*/
 | 
			
		||||
    // Disabled
 | 
			
		||||
    
 | 
			
		||||
    // If player is a zombie then block command.
 | 
			
		||||
    // If player is a zombie, then block command.
 | 
			
		||||
    if (InfectIsClientInfected(client))
 | 
			
		||||
    {
 | 
			
		||||
        ZR_PrintToChat(client, "Zombie cant use weapon");
 | 
			
		||||
 
 | 
			
		||||
@@ -108,7 +108,7 @@ WeaponsLoad()
 | 
			
		||||
 */
 | 
			
		||||
WeaponsValidateConfig()
 | 
			
		||||
{
 | 
			
		||||
    // If log flag check fails, don't log.
 | 
			
		||||
    // If log flag check fails, then don't log.
 | 
			
		||||
    if (!LogCheckFlag(LOG_CORE_EVENTS, LOG_MODULE_WEAPONS))
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
 
 | 
			
		||||
@@ -583,112 +583,112 @@ public ZRLogFlagsMenuHandle(Handle:menu_log_flags, MenuAction:action, client, sl
 | 
			
		||||
        {
 | 
			
		||||
            case 0:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_CORE_EVENTS);
 | 
			
		||||
                LogToggleFlag(LOG_CORE_EVENTS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 1:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_GAME_EVENTS);
 | 
			
		||||
                LogToggleFlag(LOG_GAME_EVENTS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 2:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_PLAYER_COMMANDS);
 | 
			
		||||
                LogToggleFlag(LOG_PLAYER_COMMANDS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 3:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_DEBUG);
 | 
			
		||||
                LogToggleFlag(LOG_DEBUG);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 4:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_DEBUG_DETAIL);
 | 
			
		||||
                LogToggleFlag(LOG_DEBUG_DETAIL);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 5:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_DEBUG_MAX_DETAIL);
 | 
			
		||||
                LogToggleFlag(LOG_DEBUG_MAX_DETAIL);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 6:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_TO_ADMINS);
 | 
			
		||||
                LogToggleFlag(LOG_TO_ADMINS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 7:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_TO_CLIENT);
 | 
			
		||||
                LogToggleFlag(LOG_TO_CLIENT);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 8:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_IGNORE_CONSOLE);
 | 
			
		||||
                LogToggleFlag(LOG_IGNORE_CONSOLE);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 9:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULES_ENABLED);
 | 
			
		||||
                LogToggleFlag(LOG_MODULES_ENABLED);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 10:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_ZOMBIE);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_ZOMBIE);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 11:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_AMBIENTSOUNDS);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_AMBIENTSOUNDS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 12:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_OVERLAYS);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_OVERLAYS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 13:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_SAYTRIGGERS);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_SAYTRIGGERS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 14:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_TELEPORT);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_TELEPORT);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 15:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_CLASSES);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_CLASSES);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 16:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_WEAPONS);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_WEAPONS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 17:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_HITGROUPS);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_HITGROUPS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 18:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_COMMANDS);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_COMMANDS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 19:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_ANTICAMP);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_ANTICAMP);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 20:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_DAMAGE);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_DAMAGE);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
            case 21:
 | 
			
		||||
            {
 | 
			
		||||
                ToggleLogFlag(LOG_MODULE_OFFSETS);
 | 
			
		||||
                LogToggleFlag(LOG_MODULE_OFFSETS);
 | 
			
		||||
                ZRLogFlagsMenu(client);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -716,20 +716,3 @@ AddToClassKnockback(classindex, Float:value)
 | 
			
		||||
{
 | 
			
		||||
    arrayClasses[classindex][data_knockback] = arrayClasses[classindex][data_knockback] + value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ToggleLogFlag(flag)
 | 
			
		||||
{
 | 
			
		||||
    new log_flags;
 | 
			
		||||
    log_flags = GetConVarInt(g_hCvarsList[CVAR_LOG]);
 | 
			
		||||
    
 | 
			
		||||
    if (log_flags & flag)
 | 
			
		||||
    {
 | 
			
		||||
        log_flags = log_flags - flag;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        log_flags = log_flags + flag;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    SetConVarInt(g_hCvarsList[CVAR_LOG], log_flags);
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user