PHP Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <zombieplague>
/*================================================================================
[Customizations]
=================================================================================*/
// Zombie Attributes
new const zclass_name51[] = "Swarm Zombie" // name
new const zclass_info51[] = "You can only Kill/Hurt" // description
new const zclass_model51[] = "zombie_source" // model
new const zclass_clawmodel51[] = "v_knife_zombie.mdl" // claw model
const zclass_health51 = 1800 // health
const zclass_speed51 = 190 // speed
const Float:zclass_gravity51 = 1.0 // gravity
const Float:zclass_knockback51 = 1.0 // knockback
/*================================================================================
Customization ends here! Yes, that's it. Editing anything beyond
here is not officially supported. Proceed at your own risk...
=================================================================================*/
// Variables
new g_iZSwarmID, g_iMaxPlayers
// Cvar pointers
new cvar_dmgmult, cvar_surv_dmgmult, cvar_blockinfbomb_infect
// Cached cvars
new bool:g_bCvar_Infbomb_Infect, Float:g_flCvar_DmgMult, Float:g_flCvar_SurvDmgMult
// Bools
new bool:g_bIsConnected[33]
// Offsets
const m_pPlayer = 41
new Aura[ 33 ], MaxPlayers
// Plug info.
#define PLUG_VERSION "0.6"
#define PLUG_AUTH "meTaLiCroSS"
// Macros
#define is_user_valid_connected(%1) (1 <= %1 <= g_iMaxPlayers && g_bIsConnected[%1])
/*================================================================================
[Init and Precache]
=================================================================================*/
public plugin_init()
{
// Plugin Register
register_plugin("[ZP] Zombie Class: Swarm Zombie", PLUG_VERSION, PLUG_AUTH)
// Main events
register_event("HLTV", "event_RoundStart", "a", "1=0", "2=0")
// Hamsandwich Forwards
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "fw_KnifeAttack")
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "fw_KnifeAttack")
// Cvars
cvar_dmgmult = register_cvar("zp_zclass_swarm_damage_mult", "1.0")
cvar_surv_dmgmult = register_cvar("zp_zclass_swarm_surv_damage_mult", "2.0")
cvar_blockinfbomb_infect = register_cvar("zp_zclass_swarm_infbomb_infect", "1")
static szCvar[30]
formatex(szCvar, charsmax(szCvar), "v%s by %s", PLUG_VERSION, PLUG_AUTH)
register_cvar("zp_zclass_swarm", szCvar, FCVAR_SERVER|FCVAR_SPONLY)
// Vars
register_forward( FM_PlayerPreThink, "fw_PlayerPreThink" )
register_event( "DeathMsg", "Die", "a" )
MaxPlayers = get_maxplayers( )
g_iMaxPlayers = get_maxplayers()
}
public plugin_precache()
{
// Hamsandwich Forwards
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
// Register the new class and store ID for reference
g_iZSwarmID = zp_register_zombie_class(zclass_name51, zclass_info51, zclass_model51, zclass_clawmodel51, zclass_health51, zclass_speed51, zclass_gravity51, zclass_knockback51)
}
public zp_user_infected_post( id, infector )
{
if ( zp_get_user_zombie_class( id ) == g_iZSwarmID )
{
Aura[ id ] = 1
}
}
/*================================================================================
[Main Events]
=================================================================================*/
public event_RoundStart()
{
g_bCvar_Infbomb_Infect = bool:get_pcvar_num(cvar_blockinfbomb_infect)
g_flCvar_DmgMult = get_pcvar_float(cvar_dmgmult)
g_flCvar_SurvDmgMult = get_pcvar_float(cvar_surv_dmgmult)
}
/*================================================================================
[Main Forwards]
=================================================================================*/
public client_putinserver(id)
{
// Updating bool
g_bIsConnected[id] = true
}
public client_disconnect(id)
{
// Updating bool
g_bIsConnected[id] = false
}
public zp_user_humanized_post( id )
{
if ( Aura[ id ] )
{
Aura[ id ] = 0
}
}
public Die( )
{
for( new id; id <= g_maxplayers; id++ ) --- this is line 170
if ( Aura[ id ] )
Aura[ id ] = 0
}
public fw_PlayerPreThink( id )
{
if ( !Aura[ id ] || !is_user_alive( id ) )
return
if ( zp_get_user_zombie_class( id ) == g_iZSwarmID )
{
static Float:originF[3]
pev(id, pev_origin, originF)
// Colored Aura
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
write_byte(TE_DLIGHT) // TE id
engfunc(EngFunc_WriteCoord, originF[0]) // x
engfunc(EngFunc_WriteCoord, originF[1]) // y
engfunc(EngFunc_WriteCoord, originF[2]) // z
write_byte(10) // radius
write_byte(0) // r
write_byte(0) // g
write_byte(255) // b
write_byte(2) // life
write_byte(0) // decay rate
message_end()
}
}
public fw_KnifeAttack(knife)
{
// We need to block the Knife attack, because
// when has throwed an Infection bomb it can Kill/Infect
// with Knife, and will be a bug
// ----
// Get knife owner (player)
static iPlayer
iPlayer = get_pdata_cbase(knife, m_pPlayer, 4)
// Non-player entity
if(!is_user_valid_connected(iPlayer))
return HAM_IGNORED
// Swarm zombie class, not a nemesis and has throwed a infection nade
if(zp_get_user_zombie_class(iPlayer) == g_iZSwarmID && !zp_get_user_nemesis(iPlayer) && zp_get_user_infection_nade(iPlayer))
return HAM_SUPERCEDE
return HAM_IGNORED
}
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype)
{
// In the Main ZP plugin, the TakeDamage forward is Superceded, so
// we need to register this in Precache to get it working again
// ----
// Non-player attacker, self kill, killed by world, or isn't make damage by himself
if(!is_user_valid_connected(attacker) || victim == attacker || !attacker || attacker != inflictor)
return HAM_IGNORED
// Swarm zombie class
if(zp_get_user_zombie(attacker) && zp_get_user_zombie_class(attacker) == g_iZSwarmID && !zp_get_user_nemesis(attacker))
{
// Get damage result (with survivor and human damage multiplier)
static Float:flDamageResult
flDamageResult = zp_get_user_survivor(victim) ? damage * g_flCvar_SurvDmgMult : damage * g_flCvar_DmgMult
// Making damage again...
ExecuteHam(Ham_TakeDamage, victim, inflictor, attacker, flDamageResult, damagetype)
return HAM_SUPERCEDE;
}
return HAM_IGNORED
}
/*================================================================================
[Zombie Plague Forwards]
=================================================================================*/
public zp_user_infect_attempt(victim, infector, nemesis)
{
// Non-player infection or turned into a nemesis
if(!infector || nemesis)
return PLUGIN_CONTINUE
// Check Swarm Zombie class and block infection.
// I'm detecting if is Zombie and isn't Nemesis because
// can be an infection by zp_infect_user native
if(zp_get_user_zombie_class(infector) == g_iZSwarmID && zp_get_user_zombie(infector) && !zp_get_user_nemesis(infector))
{
// With infection grenade then must kill or infect, defined by cvar.
if(zp_get_user_infection_nade(infector))
{
switch(g_bCvar_Infbomb_Infect)
{
case true: return PLUGIN_CONTINUE // Infect
case false: ExecuteHamB(Ham_Killed, victim, infector, 0) // Kill
}
}
return ZP_PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
/*================================================================================
[Stocks]
=================================================================================*/
stock zp_get_user_infection_nade(id)
{
static iNade
iNade = get_grenade(id)
if(iNade && entity_get_int(iNade, EV_INT_flTimeStepSound) == 1111)
return iNade;
return 0;
}