2009-04-16 03:57:46 +02:00
/*
* ============================================================================
*
2009-07-05 08:49:23 +02:00
* Zombie : Reloaded
2009-04-16 03:57:46 +02:00
*
2009-06-12 05:51:26 +02:00
* File : spawnprotect . inc
* Type : Module
* Description : Protects late - joining players from zombies for x seconds .
*
* Copyright ( C ) 2009 Greyscale , Richard Helgeby
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http :// www . gnu . org / licenses />.
2009-04-16 03:57:46 +02:00
*
* ============================================================================
*/
/**
* Array for storing spawn protect timer handles per client .
*/
new Handle : tSpawnProtect [ MAXPLAYERS + 1 ];
/**
* Array for storing time left for spawn protection per client .
*/
new pSpawnProtectTime [ MAXPLAYERS + 1 ];
/**
* Client is joining the server .
*
* @ param client The client index .
*/
SpawnProtectClientInit ( client )
{
// Reset timer handle.
tSpawnProtect [ client ] = INVALID_HANDLE ;
}
/**
2009-06-27 08:28:46 +02:00
* Client is spawning into the game . * Post
2009-04-16 03:57:46 +02:00
*
* @ param client The client index .
2009-06-27 08:28:46 +02:00
*/
SpawnProtectOnClientSpawnPost ( client )
2009-04-16 03:57:46 +02:00
{
2009-06-27 08:28:46 +02:00
// If client is dead, then they are joining the server, not spawning.
if ( ! IsPlayerAlive ( client ))
{
return ;
}
2009-04-16 03:57:46 +02:00
2009-04-16 05:30:26 +02:00
// If timer is currently running, kill it.
if ( tSpawnProtect [ client ] != INVALID_HANDLE )
{
KillTimer ( tSpawnProtect [ client ]);
}
// Reset timer handle.
tSpawnProtect [ client ] = INVALID_HANDLE ;
2009-06-27 08:28:46 +02:00
2009-06-15 21:43:06 +02:00
// If protect cvar is disabled, then stop.
new bool : protect = GetConVarBool ( g_hCvarsList [ CVAR_SPAWNPROTECT ]);
if ( ! protect )
2009-04-16 05:30:26 +02:00
{
return ;
}
2009-06-27 08:28:46 +02:00
// Disable spawn protection on client.
bInfectImmune [ client ][ INFECT_TYPE_NORMAL ] = false ;
2009-06-15 21:43:06 +02:00
// Start spawn protection.
SpawnProtectStart ( client );
}
/**
* Client has been killed .
*
* @ param client The client index .
*/
SpawnProtectOnClientDeath ( client )
{
// If timer is running, kill it.
if ( tSpawnProtect [ client ] != INVALID_HANDLE )
{
KillTimer ( tSpawnProtect [ client ]);
}
// Reset timer handle.
tSpawnProtect [ client ] = INVALID_HANDLE ;
}
/**
* Start spawn protection on a client .
*
* @ param client The client index .
*/
SpawnProtectStart ( client )
{
// If client is dead, then stop.
if ( ! IsPlayerAlive ( client ))
2009-04-16 03:57:46 +02:00
{
return ;
}
2009-06-15 21:43:06 +02:00
// If zombie hasn't spawned, then stop.
if ( ! g_bZombieSpawned )
2009-04-16 03:57:46 +02:00
{
return ;
}
2009-05-15 07:25:07 +02:00
// If client is a zombie, then stop.
if ( InfectIsClientInfected ( client ))
2009-04-16 03:57:46 +02:00
{
2009-05-15 07:25:07 +02:00
return ;
2009-04-16 03:57:46 +02:00
}
2009-05-15 07:25:07 +02:00
// Get spawn protect attribute cvars.
new Float : speed = GetConVarFloat ( g_hCvarsList [ CVAR_SPAWNPROTECT_SPEED ]);
new alpha = GetConVarInt ( g_hCvarsList [ CVAR_SPAWNPROTECT_ALPHA ]);
2010-07-04 17:58:27 +02:00
// Validate attributes
new Float : min ;
new Float : max ;
switch ( ClassSpeedMethod )
{
case ClassSpeed_LMV :
{
min = ZR_CLASS_SPEED_LMV_MIN ;
max = ZR_CLASS_SPEED_LMV_MAX ;
}
case ClassSpeed_Prop :
{
min = ZR_CLASS_SPEED_PROP_MIN ;
max = ZR_CLASS_SPEED_PROP_MAX ;
}
}
if ( speed < min && speed > max )
{
// Log a warning and abort.
LogEvent ( false , LogType_Error , LOG_CORE_EVENTS , LogModules : LogModule_Config , " Config validation " , " Out of range value in cvar zr_spawnprotect_speed (%f). Aborting spawn protection. " , speed );
return ;
}
if ( alpha < ZR_CLASS_ALPHA_INITIAL_MIN && alpha > ZR_CLASS_ALPHA_INITIAL_MAX )
{
// Log a warning and abort.
LogEvent ( false , LogType_Error , LOG_CORE_EVENTS , LogModules : LogModule_Config , " Config validation " , " Out of range value in cvar zr_spawnprotect_alpha (%d). Aborting spawn protection. " , alpha );
return ;
}
// Set spawn protect flag on client.
bInfectImmune [ client ][ INFECT_TYPE_NORMAL ] = true ;
2009-05-15 07:25:07 +02:00
// Set spawn protect attributes.
2010-07-04 17:58:27 +02:00
ClassApplySpeedEx ( client , speed );
2009-05-15 07:25:07 +02:00
ToolsSetClientAlpha ( client , alpha );
// Set time left to zr_protect_time's value.
new protect_time = GetConVarInt ( g_hCvarsList [ CVAR_SPAWNPROTECT_TIME ]);
pSpawnProtectTime [ client ] = protect_time ;
// Tell client they are being protected.
TranslationPrintToChat ( client , " Spawn protection begin " , protect_time );
// Send time left in a hud message.
2009-07-08 00:53:18 +02:00
TranslationPrintHintText ( client , " Spawn Protect " , pSpawnProtectTime [ client ]);
2009-05-15 07:25:07 +02:00
// Start repeating timer.
tSpawnProtect [ client ] = CreateTimer ( 1.0 , SpawnProtectTimer , client , TIMER_FLAG_NO_MAPCHANGE | TIMER_REPEAT );
2009-04-16 03:57:46 +02:00
}
/**
* Timer callback function , countdown for spawn protection .
*
* @ param timer The timer handle .
* @ param client The client index .
*/
public Action : SpawnProtectTimer ( Handle : timer , any : client )
{
// If client leaves, then stop timer.
if ( ! IsClientInGame ( client ))
{
2009-06-25 08:57:39 +02:00
// Reset timer handle.
tSpawnProtect [ client ] = INVALID_HANDLE ;
2009-04-16 03:57:46 +02:00
return Plugin_Stop ;
}
// If client has become a zombie, then stop timer.
2009-04-24 05:02:19 +02:00
if ( ! InfectIsClientHuman ( client ))
2009-04-16 03:57:46 +02:00
{
2009-06-25 08:57:39 +02:00
// Reset timer handle.
tSpawnProtect [ client ] = INVALID_HANDLE ;
2009-04-16 03:57:46 +02:00
return Plugin_Stop ;
}
// Decrement time left.
pSpawnProtectTime [ client ] -- ;
// Print time left to client.
2009-07-08 00:53:18 +02:00
TranslationPrintHintText ( client , " Spawn Protect " , pSpawnProtectTime [ client ]);
2009-04-16 03:57:46 +02:00
// Time has expired.
if ( pSpawnProtectTime [ client ] <= 0 )
{
// Remove protect flag.
2009-04-22 04:53:19 +02:00
bInfectImmune [ client ][ INFECT_TYPE_NORMAL ] = false ;
2009-04-16 03:57:46 +02:00
// Tell client spawn protection is over.
2009-07-08 00:53:18 +02:00
TranslationPrintHintText ( client , " Spawn protection end " );
2009-04-16 03:57:46 +02:00
// Fix attributes.
2009-04-29 02:50:25 +02:00
ToolsSetClientAlpha ( client , ClassGetAlphaInitial ( client ));
ToolsSetClientLMV ( client , ClassGetSpeed ( client ));
2009-04-16 03:57:46 +02:00
// Clear timer handle.
tSpawnProtect [ client ] = INVALID_HANDLE ;
// Stop timer.
return Plugin_Stop ;
}
// Allow timer to continue repeating.
return Plugin_Continue ;
2009-05-01 11:22:45 +02:00
}