/* Formatright © 2011, ConnorMcLeod
This plugin 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.
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 plugin; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <fun>
#include <cstrike>
#define VERSION "0.1.2"
#define PLUGIN "Spawn Protection"
const MAX_PLAYERS = 32
const DMG_GRENADE = (1<<24)
#define MaskEnt(%0) ( 1<<(%0 & 31) )
new g_bitProtectedPlayers
#define MarkUserProtected(%0) g_bitProtectedPlayers |= MaskEnt(%0)
#define ClearUserProtected(%0) g_bitProtectedPlayers &= ~MaskEnt(%0)
#define IsUserProtected(%0) ( g_bitProtectedPlayers & MaskEnt(%0) )
new g_iMaxPlayers
#define IsPlayer(%0) ( 1 <= %0 <= g_iMaxPlayers )
new Float:g_flEndOfProtection[MAX_PLAYERS+1]
new g_pCvarProtectTime, g_pCvarDisplayHud
new HamHook:g_iHhTakeDamage, HamHook:g_iHhTraceAttack, HamHook:g_iHhCSoundEntThinkPost,
HamHook:g_iHhTakeDamage_CZBot, HamHook:g_iHhTraceAttack_CZBot
new g_iSyncHud
public plugin_init()
{
register_plugin(PLUGIN, VERSION, "ConnorMcLeod")
g_pCvarProtectTime = register_cvar("amx_spawn_protection", "3.0")
g_pCvarDisplayHud = register_cvar("amx_spawn_protect_display", "1")
g_iSyncHud = CreateHudSyncObj()
RegisterHam(Ham_Spawn, "player", "OnCBasePlayer_Spawn_Post", true)
DisableHamForward( g_iHhTakeDamage = RegisterHam(Ham_TakeDamage, "player", "OnCBasePlayer_TakeDamage", false) )
DisableHamForward( g_iHhTraceAttack = RegisterHam(Ham_TraceAttack, "player", "OnCBasePlayer_TraceAttack", false) )
g_iMaxPlayers = get_maxplayers()
for(new __ent = g_iMaxPlayers+1, __maxEntities = global_get(glb_maxEntities); __ent<__maxEntities; __ent++)
{
if( pev_valid(__ent) && !pev(__ent, pev_classname) )
{
DisableHamForward( g_iHhCSoundEntThinkPost = RegisterHamFromEntity(Ham_Think, __ent, "OnCSoundEnt_Think_Post", true) )
break
}
}
}
public cz_bot_ham_registerable( id )
{
RegisterHamFromEntity(Ham_Spawn, id, "OnCBasePlayer_Spawn_Post", true)
DisableHamForward( g_iHhTakeDamage_CZBot = RegisterHamFromEntity(Ham_TakeDamage, id, "OnCBasePlayer_TakeDamage", false) )
DisableHamForward( g_iHhTraceAttack_CZBot = RegisterHamFromEntity(Ham_TraceAttack, id, "OnCBasePlayer_TraceAttack", false) )
}
public client_disconnect(id)
{
ClearUserProtected(id)
if( !g_bitProtectedPlayers )
{
DisableHamForward( g_iHhTakeDamage )
DisableHamForward( g_iHhTraceAttack )
DisableHamForward( g_iHhCSoundEntThinkPost )
if( g_iHhTakeDamage_CZBot )
{
DisableHamForward( g_iHhTakeDamage_CZBot )
DisableHamForward( g_iHhTraceAttack_CZBot )
}
}
}
public OnCBasePlayer_TraceAttack(id, iAttacker, Float:flDamage, Float:fVecDir[3], ptr, bitsDamageType)
{
if( IsUserProtected(id) || (IsPlayer(iAttacker) && IsUserProtected(iAttacker) ) )
{
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
public OnCBasePlayer_TakeDamage(id, iInflictor, iAttacker, Float:flDamage, bitsDamageType)
{
if( bitsDamageType & DMG_GRENADE && ( IsUserProtected(id) || (IsPlayer(iAttacker) && IsUserProtected(iAttacker) ) ) )
{
SetHamReturnInteger(0)
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
public OnCBasePlayer_Spawn_Post( id )
{
if( is_user_alive(id) )
{
switch( cs_get_user_team(id) )
{
case CS_TEAM_T:
{
set_user_rendering(id, kRenderFxGlowShell, 200, 0, 0, kRenderNormal, 24)
}
case CS_TEAM_CT:
{
set_user_rendering(id, kRenderFxGlowShell, 0, 0, 200, kRenderNormal, 24)
}
default:
{
return
}
}
if( !g_bitProtectedPlayers )
{
EnableHamForward( g_iHhTakeDamage )
EnableHamForward( g_iHhTraceAttack )
EnableHamForward( g_iHhCSoundEntThinkPost )
if( g_iHhTakeDamage_CZBot )
{
EnableHamForward( g_iHhTakeDamage_CZBot )
EnableHamForward( g_iHhTraceAttack_CZBot )
}
}
MarkUserProtected(id)
new Float:flProtectTime = get_pcvar_float( g_pCvarProtectTime )
g_flEndOfProtection[id] = get_gametime() + flProtectTime
if( get_pcvar_num(g_pCvarDisplayHud) )
{
set_hudmessage(0, 100, 200, -1.0, 0.75, 0, 0.01, flProtectTime, 0.01, 0.01, -1)
ShowSyncHudMsg(id, g_iSyncHud, "You are protected and can't shoot during %.1f seconds", flProtectTime)
}
}
}
public OnCSoundEnt_Think_Post( ent )
{
new iPlayers[32], iNum, id, Float:flGameTime = get_gametime()
get_players(iPlayers, iNum, "h")
set_hudmessage(0, 100, 200, -1.0, 0.75, 0, 0.01, 0.5, 0.01, 0.01, -1)
for(--iNum; iNum>=0; iNum--)
{
id = iPlayers[iNum]
if( IsUserProtected(id) && (g_flEndOfProtection[id] <= flGameTime || !is_user_alive(id) ) )
{
set_user_rendering(id, _, 0, 0, 0, _, 0)
ClearUserProtected(id)
ShowSyncHudMsg(id, g_iSyncHud, "You can shoot now.")
}
}
if( !g_bitProtectedPlayers )
{
DisableHamForward( g_iHhTakeDamage )
DisableHamForward( g_iHhTraceAttack )
DisableHamForward( g_iHhCSoundEntThinkPost )
if( g_iHhTakeDamage_CZBot )
{
DisableHamForward( g_iHhTakeDamage_CZBot )
DisableHamForward( g_iHhTraceAttack_CZBot )
}
}
}