PHP Code:
new g_fireattacker[33][10]
RegisterHam(Ham_Think, "grenade", "fw_ThinkGrenade")
// Ham Grenade Think Forward
public fw_ThinkGrenade(entity)
{
// Invalid entity
if (!pev_valid(entity)) return FMRES_IGNORED;
// Get damage time of grenade
static Float:dmgtime
pev(entity, pev_dmgtime, dmgtime)
// Check if it's time to go off
if (dmgtime > get_gametime())
return HAM_IGNORED;
// Check if it's one of our custom nades
switch (pev(entity, PEV_NADE_TYPE))
{
case NADE_TYPE_NAPALM: fire_explode(entity)
default: return HAM_IGNORED;
}
return HAM_SUPERCEDE;
}
// Fire Grenade Explosion
fire_explode(ent)
{
// Get origin
static Float:originF[3]
pev(ent, pev_origin, originF)
// Make the explosion
create_blast2(originF)
// Fire nade explode sound
engfunc(EngFunc_EmitSound, ent, CHAN_WEAPON, grenade_fire[random_num(0, sizeof grenade_fire - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
// Collisions
static victim
victim = -1
while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, NADE_EXPLOSION_RADIUS)) != 0)
{
// Only effect alive zombies
if (!is_user_alive(victim) || !g_zombie[victim] || g_nogrenade[victim] || g_super_nodamage[victim])
continue;
message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, _, victim)
write_byte(0) // damage save
write_byte(0) // damage take
write_long(DMG_BURN) // damage type
write_coord(0) // x
write_coord(0) // y
write_coord(0) // z
message_end()
// Our task params
static params[1]
if (g_nemesis[victim])
{
params[0] = 120
client_print(0, print_center, "Nemesis is burning !!")
}
else if (g_gmonster[victim])
{
params[0] = 140
client_print(0, print_center, "G-Virus Monster is burning !!")
}
else if (g_amonster[victim])
{
params[0] = 80
client_print(0, print_center, "Aberrancer is Burning !!")
}
else if (g_smonster[victim])
{
params[0] = 40
client_print(0, print_center, "Synthetizer is Burning !!")
}
else if (g_zombieclass[victim] == 1)
params[0] = 160
else
params[0] = 80
static attacker
attacker = pev(ent, pev_owner)
for (new i = 0; i < 10; i++)
{
if (g_fireattacker[victim][i] != 0)
continue
else
{
g_fireattacker[victim][i] = attacker
break
}
}
// Set burning task on victim
set_task(0.1, "burning_flame", victim+TASK_BLOOD, params, sizeof params)
}
// Get rid of the grenade
engfunc(EngFunc_RemoveEntity, ent)
}
// Burning Flames
public burning_flame(args[1], taskid)
{
// Get player origin and flags
static Float:originF[3], flags
pev(ID_BLOOD, pev_origin, originF)
flags = pev(ID_BLOOD, pev_flags)
// Madness mode - in water - burning stopped
if ((flags & FL_INWATER) || FLAME_DURATION < 1)
{
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
write_byte(TE_SMOKE) // TE id
engfunc(EngFunc_WriteCoord, originF[0]) // x
engfunc(EngFunc_WriteCoord, originF[1]) // y
engfunc(EngFunc_WriteCoord, originF[2]-50.0) // z
write_short(g_smokeSpr) // sprite
write_byte(random_num(15, 20)) // scale
write_byte(random_num(10, 20)) // framerate
message_end()
return;
}
// Get health and fire damage setting
static health, corr_damage
health = pev(ID_BLOOD, pev_health)
if (g_nemesis[ID_BLOOD])
corr_damage = health > 5 && (havemonster == 2 || g_newmode) ? 5.0 : 10.0
else if (g_gmonster[ID_BLOOD])
corr_damage = g_gmonster[ID_BLOOD] == 3 ? 10.0 : 5.0
else
corr_damage = 10.0
for (new i = 0; i < 10; i++)
{
if (g_fireattacker[ID_BLOOD][i] > 0)
ExecuteHamB(Ham_TakeDamage, ID_BLOOD, CSW_HEGRENADE, g_fireattacker[ID_BLOOD][i], corr_damage, DMG_BURN)
}
// Flame sprite
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
write_byte(TE_SPRITE) // TE id
engfunc(EngFunc_WriteCoord, originF[0]+random_float(-50.0, 50.0)) // x
engfunc(EngFunc_WriteCoord, originF[1]) // y
engfunc(EngFunc_WriteCoord, originF[2]+random_float(-50.0, 50.0)) // z
write_short(g_flameSpr) // sprite
write_byte(9) // scale
write_byte(255) // brightness
message_end()
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(25) // radius
write_byte(255) // r
write_byte(0) // g
write_byte(0) // b
write_byte(2) // life
write_byte(0) // decay rate
message_end()
// Decrease task cycle counter
FLAME_DURATION -= 1;
// Keep sending flame messaegs
set_task(0.1, "burning_flame", taskid, args, sizeof args)
}