Hi.
The plugin posted below makes my server lags every second time i change map. I've tested the plugin on/off and my server works fine without. It's like i start. All is fine. Then i changelevel de_dust2 and it start to lag like hell. I changemap again and it runs smooth and so on
Even then, it lags. I was wondering if someone could test it on their server or come with advice etc. The sma and amxx file are posted at the bottom
Code:
#include <amxmodx>
#include <fakemeta>
#include <engine>
#define NORM_SPEED 250.0
#define REACH 250
#define MAX 32
#define x 0
#define y 1
#define z 2
new const bool:dbg = true
enum
{
Flag_Stun = 0,
Flag_Freeze,
Flag_Fear,
Flag_Poision,
Flag_PoisionDagger,
Flag_Invisible,
Flag_Drainlife,
Flag_SpellImmunity,
Flag_Enrage,
Flag_Focus,
Flag_Dazed,
Flag_Renew,
Flag_Max
}
new afflicted[MAX][Flag_Max]
new class_armor[MAX]
new sprite_white = 0
new sprite_fear = 0
new sprite_laser = 0
new sprite_mark = 0
new sprite_stun = 0
new sprite_dazed = 0
//Helpers from Fun Module/Math
public set_user_armor(id,amount) { set_pev(id,pev_armorvalue,amount); }
public set_user_gravity(id,Float:amount) { set_pev(id,pev_gravity,amount); }
public set_user_maxspeed(id,Float:amount) { set_pev(id,pev_maxspeed,amount); }
public set_user_health(id,amount) { set_pev(id,pev_health,amount); }
public Float:Distance2D( Float:X, Float:Y ) {return floatsqroot( (X*X) + (Y*Y) ); }
public Float:Vec2DLength( Float:Vec[2] ) { return floatsqroot(Vec[x]*Vec[x] + Vec[y]*Vec[y] ); }
public plugin_init()
{
register_plugin("Arena", "1.2", "MrDev")
for (new i=0; i < MAX; i++)
{
for (new j=0; j < Flag_Max; j++)
afflicted[i][j] = 0
class_armor[i] = 0
}
/*
//Events
register_logevent("Event_RoundStart", 2, "0=World triggered", "1=Round_Start")
register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
register_clcmd("say", "Event_Say", 0)
register_logevent("Event_RoundEnd", 2, "1=Round_End")
register_event("Damage","Event_Damage","be")
register_event("TextMsg", "Event_RoundEnd", "a", "2=#Game_will_restart_in")
//Forwards
register_forward(FM_Touch,"FW_Touch");
register_forward(FM_UpdateClientData, "FW_UpdateClientData_Post", 1)
register_forward(FM_AddToFullPack, "FW_AddToFullPack")
register_forward(FM_CmdStart,"FW_CmdStart")
//Think
register_think("Effect_Stun","Effect_Stun_Think")
register_think("Effect_Ice_Block","Effect_Ice_Block_Think")
register_think("Freeze_Effect","Freeze_Effect_Think")
register_think("Effect_Fire_Totem","Effect_Fire_Totem_Think")
register_think("Effect_Fear","Effect_Fear_Think")
register_think("Effect_Spirit_Ward","Effect_Spirit_Ward_Think")
register_think("Effect_Poision","Effect_Poision_Think")
register_think("Effect_Invisible","Effect_Invisible_Think")
register_think("Effect_Drainlife","Effect_Drainlife_Think")
register_think("Effect_Spell_Immunity","Effect_Spell_Immunity_Think")
register_think("Effect_Armor_Add","Effect_Armor_Add_Think")
register_think("Effect_Mark","Effect_Mark_Think")
register_think("Effect_Daze","Effect_Daze_Think")
register_think("Effect_Renew","Effect_Renew_Think")
//Buy block
register_menucmd(register_menuid("#Buy", 1 ),511,"Block")
register_menucmd(register_menuid("BuyPistol", 1 ),511,"Block")
register_menucmd(register_menuid("BuyShotgun", 1 ),511,"Block")
register_menucmd(register_menuid("BuySub", 1 ),511,"Block")
register_menucmd(register_menuid("BuyRifle", 1),511,"Block")
register_menucmd(register_menuid("BuyMachine", 1),511,"Block")
register_menucmd(register_menuid("BuyItem", 1),511,"Block")
register_menucmd(-28,511,"Block")
register_menucmd(-29,511,"Block")
register_menucmd(-30,511,"Block")
register_menucmd(-32,511,"Block")
register_menucmd(-31,511,"Block")
register_menucmd(-33,511,"Block")
register_menucmd(-34,511,"Block")
*/
log("Plugin_Init called")
}
public log(const fmt[], {Float,Sql,Result,_}:...)
{
if (dbg)
{
new buffer[512]
vformat(buffer, 511, fmt, 2)
log_amx(buffer)
}
}
public Remove_Ent(ent)
{
if(pev_valid(ent))
engfunc(EngFunc_RemoveEntity, ent)
}
public Spawn_Ent(const classname[])
{
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, classname))
set_pev(ent, pev_origin, {0.0, 0.0, 0.0})
dllfunc(DLLFunc_Spawn, ent)
return ent
}
/*
public plugin_precache()
{
log("precache called")
precache_model("models/totem_fire.mdl")
precache_model("models/hunter_trap.mdl")
precache_model("models/ice_block.mdl")
precache_model("models/rpgrocket.mdl")
precache_model("models/spirit_ward.mdl")
sprite_white = precache_model("sprites/white.spr")
sprite_fear = precache_model("sprites/fear.spr")
sprite_laser = precache_model("sprites/laserbeam.spr")
sprite_mark = precache_model("sprites/mark.spr")
sprite_stun = precache_model("sprites/stun.spr")
sprite_dazed = precache_model("sprites/dazed.spr")
}
*/
/*
public client_connect(id)
{
log("client_connect called")
class_armor[id] = 25
}
public client_disconnect(id)
{
log("client disconnect")
class_armor[id] = 0
ResetFlags(id)
}
*/
//Touch event. Do not pickup weapons
public FW_Touch(ptr, ptd)
{
if (ptd > 0 && ptd <= MAX && is_user_connected(ptd) && ptr > MAX)
{
new model[32]
//entity_get_string(ptr, EV_SZ_model, model, 31)
pev(ptr,pev_model,model,31)
if ((equal(model, "models/w_", 9)))
return FMRES_SUPERCEDE;
else if ((containi(model, "shield") > -1))
return FMRES_SUPERCEDE;
new classname[32]
pev(ptr, pev_classname, classname, 31)
//Hunter trap - Freeze target
if (equal(classname,"Effect_Hunter_Trap"))
{
new owner = pev(ptr,pev_owner)
//If enemy, freeze the scumbag
if (get_user_team(owner) != get_user_team(ptd))
{
Remove_Ent(ptr)
Spawn_Ice_Block(ptd,5)
}
}
}
return FMRES_IGNORED
}
//ClientData event
public FW_UpdateClientData_Post(id, sendweapons, cd_handle)
{
if (!is_user_alive(id))
return FMRES_HANDLED;
if (HasFlag(id,Flag_Stun))
{
set_cd(cd_handle, CD_ID, 0);
}
return FMRES_HANDLED
}
public FW_AddToFullPack(ent_state,e,edict_t_ent,edict_t_host,hostflags,player,pSet)
{
if (!pev_valid(e)|| !pev_valid(edict_t_ent) || !pev_valid(edict_t_host))
return FMRES_HANDLED
new classname[32]
pev(e,pev_classname,classname,31)
new hostclassname[32]
pev(edict_t_host,pev_classname,hostclassname,31)
//If hunters trap, hide to enemies
if (equal(classname,"Effect_Hunter_Trap") && !player && equal(hostclassname,"player"))
{
new owner = pev(e,pev_owner)
//Hide for enemies
if (get_user_team(owner) != get_user_team(edict_t_host))
return FMRES_SUPERCEDE
}
return FMRES_HANDLED
}
//Test for now
public FW_CmdStart(id, uc_handle, seed)
{
if( !is_user_alive(id) )
return PLUGIN_CONTINUE;
if (HasFlag(id,Flag_Stun) || HasFlag(id,Flag_Fear) || HasFlag(id,Flag_Freeze))
{
set_pev( id, pev_button, pev(id,pev_button) & ~IN_ATTACK );
set_pev( id, pev_button, pev(id,pev_button) & ~IN_ATTACK2 );
new buttons = get_uc(uc_handle,UC_Buttons)
buttons &= ~IN_ATTACK
buttons &= ~IN_ATTACK2
set_uc(uc_handle,UC_Buttons,buttons)
}
return FMRES_HANDLED
}
public Block()
{
return PLUGIN_HANDLED
}
public Event_RoundStart()
{
log("Event_RoundStart called")
for (new i=0; i < MAX; i++)
{
//if (is_user_alive(i))
// set_user_armor(i,class_armor[i])
}
}
public Event_RoundEnd()
{
log("Event RoundEnd called")
Remove_All_Effects()
for (new i=0; i < MAX; i++)
if (is_user_connected(i))
ResetFlags(i)
}
public Event_CurWeapon(id)
{
log("Event_Curweapon called")
if (!is_user_alive(id))
return PLUGIN_CONTINUE
new ammo
new clip
if (get_user_weapon(id,ammo,clip) != CSW_KNIFE)
client_cmd(id,"drop")
return PLUGIN_CONTINUE
}
public Event_Say(id)
{
log("Event_Say called")
new message[129]
read_argv(1,message,128)
if ((strlen(message) < 1) || equal(message,"") || equal(message,"["))
return PLUGIN_CONTINUE
if (containi(message, "stun") > -1)
{
Stun_Player(id,5)
}
if (contain(message, "ft") > -1)
{
MakeFireTotem(id,10)
}
if (contain(message, "hunt") > -1)
{
MakeHunterTrap(id)
}
if (contain(message, "iceblock") > -1)
{
Spawn_Ice_Block(id,5)
}
if (contain(message, "fear") > -1)
{
Fear_Player(id,5)
}
if (contain(message, "spirit") > -1)
{
MakeSpiritWard(id,10)
}
if (contain(message, "dagger") > -1)
{
MakePoisionDagger(id)
}
if (contain(message, "drainlife") > -1)
{
new target = Find_Best_Angle(id,1000.0)
if (pev_valid(target))
Player_Drainlife(id,target,10)
}
if (contain(message, "invis") > -1)
{
Invisible_Player(id,5,10)
}
if (contain(message, "armor") > -1)
{
Player_Armoradd(id,15,25)
}
if (contain(message, "enrage") > -1)
{
new target = Find_Best_Angle(id,9999.9,true)
if (pev_valid(target))
Player_Enrage(id,target,7)
}
if (contain(message, "sunder") > -1)
{
new target = Find_Best_Angle(id,REACH+0.0,true)
if (pev_valid(target))
Player_Sunder(id,target,10)
}
if (contain(message, "slam") > -1)
{
Player_Ground_Slam(id,5)
}
if (contain(message, "daze") > -1)
{
Player_Daze(id,5)
}
if (contain(message, "renew") > -1)
{
Player_Renew(id,5)
}
return PLUGIN_CONTINUE
}
public Event_Damage(id)
{
log("Event_Damage called")
new victim = read_data(0);
new attacker = get_user_attacker(victim)
if (!pev_valid(attacker) || !pev_valid(victim) || attacker > MAX)
return PLUGIN_CONTINUE
set_user_armor(id,class_armor[id])
//No self-afflicated damage, atleast for now
if (victim == attacker)
return PLUGIN_CONTINUE
//We attacked with poision dagger
if (HasFlag(attacker,Flag_PoisionDagger))
{
RemoveFlag(attacker,Flag_PoisionDagger)
Player_Poision(victim,10,3)
}
//We got hit with poision dagger
if (HasFlag(victim,Flag_PoisionDagger))
{
RemoveFlag(victim,Flag_PoisionDagger)
Player_Poision(victim,10,3)
}
//We have enrage and attacks someone, see if he has the mark
if (HasFlag(attacker,Flag_Enrage))
{
new ent = find_ent_by_owner(-1,"Effect_Mark",victim)
if (pev_valid(ent))
{
new marker = pev(ent,pev_euser2)
if (marker == attacker)
{
set_pev(ent,pev_ltime,0)
Stun_Player(victim,3)
}
}
}
return PLUGIN_CONTINUE
}
//Remove all effects by setting ltime to 0 so they will be removed at next think
public Remove_All_Effects()
{
log("Remove_All_Effects called")
new maxEntities = global_get(glb_maxEntities);
for (new i = 0; i < maxEntities; i++)
{
if (!pev_valid(i))
continue;
new classname[32];
pev(i, pev_classname, classname, 31);
if (containi(classname, "Effect_") > -1)
{
log_amx("FOUND")
new ltime = pev(i,pev_ltime)
if (ltime == 0)
Remove_Ent(i)
else
{
set_pev(i,pev_ltime,0)
//set_pev(i,pev_nextthink, halflife_time() + 0.1)
}
}
}
}
//Create an entity, set owner to player and make sure that aslong as entity exist, player is stunned
public Stun_Player(id, seconds)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Stun")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
if (pev(id,pev_flags) & FL_ONGROUND)
set_user_gravity(id,9999.9)
AddFlag(id,Flag_Stun)
log("Creating stun entity for player %i", id)
}
public Effect_Stun_Think(ent)
{
new id = pev(ent,pev_owner)
//Entity should be destroyed because livetime is over
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
Remove_Ent(ent)
//Only unstun IF there are no stun entities left
if (!find_ent_by_owner(-1,"Effect_Stun",id))
{
set_user_maxspeed(id,NORM_SPEED)
set_user_gravity(id,1.0)
Display_Icon(id,100,100,100,"dmg_rad",0)
Remove_All_Tents(id)
RemoveFlag(id,Flag_Stun)
}
return PLUGIN_CONTINUE
}
//Apply Effect
Display_Icon(id,100,100,100,"dmg_rad",1)
set_pev(ent,pev_nextthink, halflife_time() + 0.2)
set_user_maxspeed(id,0.1)
Display_Tent(id,sprite_stun,1)
return PLUGIN_CONTINUE
}
public Freeze_Player(id,seconds)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Freeze_Effect")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
if (!HasFlag(id,Flag_Stun) && !HasFlag(id,Flag_Freeze))
set_pev(id, pev_flags, pev(id, pev_flags) | FL_FROZEN)
AddFlag(id,Flag_Freeze)
Display_Fade(id,2500*seconds,2500*seconds,0,0,25,255,130)
log("Creating freeze entity for player %i", id)
}
public Freeze_Effect_Think(ent)
{
new id = pev(ent,pev_owner)
//Entity should be destroyed because livetime is over
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN)
Display_Icon(id,0,0,255,"dmg_cold",0)
RemoveFlag(id,Flag_Freeze)
return PLUGIN_CONTINUE
}
//Apply Effect
Display_Icon(id,0,0,255,"dmg_cold",1)
set_pev(ent,pev_nextthink, halflife_time() + 0.3)
return PLUGIN_CONTINUE
}
public Fear_Player(id,seconds)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Fear")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
AddFlag(id,Flag_Fear)
Display_Tent(id,sprite_fear, seconds)
log("Creating fear entity for player %i", id)
}
public Effect_Fear_Think(ent)
{
new id = pev(ent,pev_owner)
//Entity should be destroyed because livetime is over
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
if (is_user_alive(id))
{
Display_Icon(id,255,0,0,"dmg_gas",0)
client_cmd(id,"-back")
}
RemoveFlag(id,Flag_Fear)
return PLUGIN_CONTINUE
}
//Apply Effect
Display_Icon(id,255,0,0,"dmg_gas",1)
//Force forward
client_cmd(id,"-forward")
client_cmd(id,"+back")
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
return PLUGIN_CONTINUE
}
public Invisible_Player(id,seconds, amount)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Invisible")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
AddFlag(id,Flag_Invisible)
Display_Fade(id,seconds*2500,seconds*2500,0,255,255,255,60)
set_rendering ( ent, kRenderFxNone, 0,0,0, kRenderTransAlpha, amount )
log("Creating invisible entity for player %i", id)
}
public Effect_Invisible_Think(ent)
{
new id = pev(ent,pev_owner)
//Entity should be destroyed because livetime is over
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
if (is_user_alive(id))
set_rendering ( ent, kRenderFxNone, 0,0,0, kRenderFxNone, 0 )
Display_Icon(id,0,255,100,"train_forward1",0)
RemoveFlag(id,Flag_Invisible)
return PLUGIN_CONTINUE
}
Display_Icon(id,0,255,100,"train_forward1",1)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
return PLUGIN_CONTINUE
}
public Display_Icon(id,red,green,blue,name[], enable)
{
if (!pev_valid(id))
{
log("Display_Icon called on bad player")
return PLUGIN_HANDLED
}
message_begin( MSG_ONE, get_user_msgid("StatusIcon"), {0,0,0}, id )
write_byte( enable )
write_string( name )
write_byte( red ) // red
write_byte( green ) // green
write_byte( blue ) // blue
message_end()
return PLUGIN_CONTINUE
}
public Display_Fade(id,duration,holdtime,fadetype,red,green,blue,alpha)
{
message_begin( MSG_ONE,get_user_msgid("ScreenFade"),{0,0,0},id )
write_short( duration ) // Duration of fadeout
write_short( holdtime ) // Hold time of color
write_short( fadetype ) // Fade type
write_byte ( red ) // Red
write_byte ( green ) // Green
write_byte ( blue ) // Blue
write_byte ( alpha ) // Alpha
message_end()
}
public MakeFireTotem(id, seconds)
{
new origin[3]
pev(id,pev_origin,origin)
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Fire_Totem")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_solid,SOLID_TRIGGER)
set_pev(ent,pev_origin,origin)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
engfunc(EngFunc_SetModel, ent, "models/totem_fire.mdl")
set_rendering ( ent, kRenderFxGlowShell, 255,0,0, kRenderFxNone, 255 )
engfunc(EngFunc_DropToFloor,ent)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
}
public MakeSpiritWard(id, seconds)
{
new origin[3]
pev(id,pev_origin,origin)
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Spirit_Ward")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_solid,SOLID_NOT)
set_pev(ent,pev_origin,origin)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
engfunc(EngFunc_SetModel, ent, "models/spirit_ward.mdl")
set_rendering ( ent, kRenderFxGlowShell, 255,255,255, kRenderFxNone, 100 )
engfunc(EngFunc_DropToFloor,ent)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
}
public Effect_Spirit_Ward_Think(ent)
{
new id = pev(ent,pev_owner)
new totem_dist = 300
new damage_amount = 5
//We have emitted beam. Apply effect (this is delayed)
if (pev(ent,pev_euser2) == 1)
{
new Float:forigin[3], origin[3]
pev(ent,pev_origin,forigin)
FVecIVec(forigin,origin)
//Find people near and damage them
new entlist[513]
new numfound = find_sphere_class(0,"player",totem_dist+0.0,entlist,512,forigin)
for (new i=0; i < numfound; i++)
{
new pid = entlist[i]
if (get_user_team(pid) == get_user_team(id))
continue
if (is_user_alive(pid) && get_user_health(pid) - damage_amount > 0)
fakedamage(pid,"player",damage_amount+0.0,DMG_ENERGYBEAM)
}
set_pev(ent,pev_euser2,0)
set_pev(ent,pev_nextthink, halflife_time() + 1.5)
return PLUGIN_CONTINUE
}
//Entity should be destroyed because livetime is over
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
remove_entity(ent)
return PLUGIN_CONTINUE
}
//If this object is almost dead, apply some render to make it fade out
if (pev(ent,pev_ltime)-2.0 < halflife_time())
set_rendering ( ent, kRenderFxNone, 255,255,255, kRenderTransAlpha, 100 )
new Float:forigin[3], origin[3]
pev(ent,pev_origin,forigin)
FVecIVec(forigin,origin)
//Find people near and give them health
message_begin( MSG_BROADCAST, SVC_TEMPENTITY, origin );
write_byte( TE_BEAMCYLINDER );
write_coord( origin[0] );
write_coord( origin[1] );
write_coord( origin[2] );
write_coord( origin[0] );
write_coord( origin[1] + totem_dist );
write_coord( origin[2] + totem_dist );
write_short( sprite_white );
write_byte( 0 ); // startframe
write_byte( 0 ); // framerate
write_byte( 10 ); // life
write_byte( 10 ); // width
write_byte( 255 ); // noise
write_byte( 255 ); // r, g, b
write_byte( 255 ); // r, g, b
write_byte( 255 ); // r, g, b
write_byte( 128 ); // brightness
write_byte( 5 ); // speed
message_end();
//Time till we apply totems effect
set_pev(ent,pev_euser2,1)
set_pev(ent,pev_nextthink, halflife_time() + 0.5)
return PLUGIN_CONTINUE
}
public Effect_Fire_Totem_Think(ent)
{
new id = pev(ent,pev_owner)
new totem_dist = 300
new amount_healed = 5
//We have emitted beam. Apply effect (this is delayed)
if (pev(ent,pev_euser2) == 1)
{
new Float:forigin[3], origin[3]
pev(ent,pev_origin,forigin)
FVecIVec(forigin,origin)
//Find people near and damage them
new entlist[513]
new numfound = find_sphere_class(0,"player",totem_dist+0.0,entlist,512,forigin)
for (new i=0; i < numfound; i++)
{
new pid = entlist[i]
if (get_user_team(pid) != get_user_team(id))
continue
if (is_user_alive(pid) && get_user_health(pid) + amount_healed < 100)
set_user_health(pid,get_user_health(pid)+amount_healed)
else
set_user_health(pid,100)
}
set_pev(ent,pev_euser2,0)
set_pev(ent,pev_nextthink, halflife_time() + 1.5)
return PLUGIN_CONTINUE
}
//Entity should be destroyed because livetime is over
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
remove_entity(ent)
return PLUGIN_CONTINUE
}
//If this object is almost dead, apply some render to make it fade out
if (pev(ent,pev_ltime)-2.0 < halflife_time())
set_rendering ( ent, kRenderFxNone, 255,255,255, kRenderTransAlpha, 100 )
new Float:forigin[3], origin[3]
pev(ent,pev_origin,forigin)
FVecIVec(forigin,origin)
//Find people near and give them health
message_begin( MSG_BROADCAST, SVC_TEMPENTITY, origin );
write_byte( TE_BEAMCYLINDER );
write_coord( origin[0] );
write_coord( origin[1] );
write_coord( origin[2] );
write_coord( origin[0] );
write_coord( origin[1] + totem_dist );
write_coord( origin[2] + totem_dist );
write_short( sprite_white );
write_byte( 0 ); // startframe
write_byte( 0 ); // framerate
write_byte( 10 ); // life
write_byte( 10 ); // width
write_byte( 255 ); // noise
write_byte( 255 ); // r, g, b
write_byte( 100 ); // r, g, b
write_byte( 100 ); // r, g, b
write_byte( 128 ); // brightness
write_byte( 5 ); // speed
message_end();
//Time till we apply totems effect
set_pev(ent,pev_euser2,1)
set_pev(ent,pev_nextthink, halflife_time() + 0.5)
return PLUGIN_CONTINUE
}
public MakePoisionDagger(id)
{
Display_Fade(id,1000,1000,0,0,255,0,150)
AddFlag(id,Flag_PoisionDagger)
}
public MakeHunterTrap(id)
{
new origin[3]
pev(id,pev_origin,origin)
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Hunter_Trap")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, 0)
set_pev(ent,pev_origin,origin)
set_pev(ent,pev_solid,SOLID_TRIGGER)
engfunc(EngFunc_SetModel, ent, "models/hunter_trap.mdl")
engfunc(EngFunc_SetSize,ent,Float:{-1.0,-1.0,-1.0},Float:{1.0,1.0,1.0})
drop_to_floor(ent)
}
//Spawn iceblock ONTO id for n seconds
public Spawn_Ice_Block(id, seconds)
{
new origin[3]
pev(id,pev_origin,origin)
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Ice_Block")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_origin,origin)
set_pev(ent,pev_solid,SOLID_NOT)
engfunc(EngFunc_SetModel, ent, "models/ice_block.mdl")
engfunc(EngFunc_SetSize,ent,Float:{-1.0,-1.0,-1.0},Float:{1.0,1.0,1.0})
set_rendering ( ent, kRenderFxGlowShell, 0,0,0, kRenderTransAlpha, 110 )
drop_to_floor(ent)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
Freeze_Player(id, seconds)
}
public Effect_Ice_Block_Think(ent)
{
new id = pev(ent,pev_owner)
//Entity should be destroyed because livetime is over
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
remove_entity(ent)
else
set_pev(ent,pev_nextthink, halflife_time() + 0.3)
}
//Poision Effect. Dot with damage each round damagetime = 1.5
public Player_Poision(id, seconds, tick)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Poision")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_solid,SOLID_NOT)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
set_pev(ent,pev_euser2, tick)
set_rendering ( id, kRenderFxGlowShell, 0,200,0, kRenderFxNone, 100 )
}
public Effect_Poision_Think(ent)
{
new id = pev(ent,pev_owner)
new tick = pev(ent,pev_euser2)
//Entity should be destroyed because livetime is over
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
if (is_user_alive(id))
{
set_rendering ( id, kRenderFxNone, 0,0,0, kRenderFxNone, 0 )
set_user_maxspeed(id,NORM_SPEED)
}
Display_Icon(id,0,255,0,"dmg_poison",0)
remove_entity(ent)
return PLUGIN_CONTINUE
}
else
set_pev(ent,pev_nextthink, halflife_time() + 1.5)
//Apply poision
if (get_user_health(id) - tick > 0)
fakedamage(id,"player",tick+0.0,DMG_ENERGYBEAM)
Display_Icon(id,0,255,0,"dmg_poison",1)
set_user_maxspeed(id,NORM_SPEED-60)
return PLUGIN_CONTINUE
}
//Drainlife effect
public Player_Drainlife(id, target, seconds)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Drainlife")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_solid,SOLID_NOT)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
set_pev(ent,pev_euser2, target)
AddFlag(id,Flag_Drainlife)
AddFlag(target,Flag_Drainlife)
}
//Spell Immunity
public Player_Spell_Immunity(id, seconds)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Spell_Immunity")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_solid,SOLID_NOT)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
AddFlag(id,Flag_SpellImmunity)
}
public Effect_Spell_Immunity_Think(ent)
{
new id = pev(ent,pev_owner)
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
remove_entity(ent)
return PLUGIN_CONTINUE
}
set_pev(ent,pev_nextthink, halflife_time() + 0.5)
return PLUGIN_CONTINUE
}
//Spell Immunity
public Player_Daze(id,seconds)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Daze")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_solid,SOLID_NOT)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
AddFlag(id,Flag_Dazed)
}
public Effect_Daze_Think(ent)
{
new id = pev(ent,pev_owner)
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
Remove_All_Tents(id)
Display_Icon(id,255,255,0,"dmg_heat",0)
RemoveFlag(id,Flag_Dazed)
set_user_maxspeed(id,NORM_SPEED)
remove_entity(ent)
return PLUGIN_CONTINUE
}
set_pev(ent,pev_nextthink, halflife_time() + 1.0)
set_user_maxspeed(id,NORM_SPEED-150)
Display_Icon(id,255,255,0,"dmg_heat",1)
Display_Tent(id,sprite_dazed,1)
return PLUGIN_CONTINUE
}
public Effect_Drainlife_Think(ent)
{
new id = pev(ent,pev_owner)
new victim = pev(ent,pev_euser2)
//Entity should be destroyed because livetime is over
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id) || !is_user_alive(victim) || !Can_Trace_Line(id,victim) || !In_FOV(id,victim))
{
if (is_user_alive(victim))
{
set_rendering (victim, kRenderFxNone, 0,0,0, kRenderFxNone, 0 )
set_user_maxspeed(victim,NORM_SPEED)
}
if (is_user_alive(id))
{
set_user_maxspeed(id,NORM_SPEED)
}
remove_entity(ent)
return PLUGIN_CONTINUE
}
else
set_pev(ent,pev_nextthink, halflife_time() + 0.3)
//Apply drainlife
if (get_user_health(victim) - 1.0 > 0)
{
fakedamage(victim,"player",1.0,DMG_ENERGYBEAM)
if (get_user_health(id) < 100)
set_user_health(id,get_user_health(id)+1)
}
new origin1[3]
new origin2[3]
get_user_origin(id,origin1)
get_user_origin(victim,origin2)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte (TE_BEAMPOINTS)
write_coord(origin1[0])
write_coord(origin1[1])
write_coord(origin1[2]+8)
write_coord(origin2[0])
write_coord(origin2[1])
write_coord(origin2[2]+8)
write_short(sprite_laser);
write_byte(1) // framestart
write_byte(1) // framerate
write_byte(3) // life
write_byte(5) // width
write_byte(10) // noise
write_byte(0) // r, g, b (red)
write_byte(255) // r, g, b (green)
write_byte(0) // r, g, b (blue)
write_byte(45) // brightness
write_byte(5) // speed
message_end()
set_rendering ( victim, kRenderFxGlowShell, 0,200,0, kRenderFxNone, 0 )
set_user_maxspeed(victim,NORM_SPEED-100)
set_user_maxspeed(id,NORM_SPEED-180)
return PLUGIN_CONTINUE
}
//Bonus Armor, eu2 = amount, eu3 = applied
public Player_Armoradd(id, seconds,amount)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Armor_Add")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_solid,SOLID_NOT)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
set_pev(ent,pev_euser2,amount)
if (class_armor[id]+amount >= 0)
{
set_pev(ent,pev_euser3,1)
class_armor[id]+=amount
}
set_user_armor(id,class_armor[id])
}
public Effect_Armor_Add_Think(ent)
{
new id = pev(ent,pev_owner)
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
new amount = pev(ent,pev_euser2)
if (pev(ent,pev_euser3) == 1)
class_armor[id]-=amount
set_user_armor(id,class_armor[id])
remove_entity(ent)
return PLUGIN_CONTINUE
}
set_pev(ent,pev_nextthink, halflife_time() + 0.5)
return PLUGIN_CONTINUE
}
//Sunder - removes armor
public Player_Sunder(id, target, seconds)
{
new id_origin[3]
new target_origin[3]
get_user_origin(id,id_origin)
get_user_origin(target,target_origin)
if (get_distance(id_origin,target_origin) > REACH)
return PLUGIN_CONTINUE
Player_Armoradd(target,seconds, -50)
for (new i=0; i < 5; i+=2)
{
target_origin[z]+=i
Display_Spark(target_origin)
}
return PLUGIN_CONTINUE
}
public Player_Ground_Slam(id,seconds)
{
message_begin(MSG_ONE , get_user_msgid("ScreenShake") , {0,0,0} ,id)
write_short( 1<<14 );
write_short( 1<<12 );
write_short( 1<<14 );
message_end();
new radius = 500
new entlist[513]
new numfound = find_sphere_class(id,"player",radius+0.0,entlist,512)
for (new i=0; i < numfound; i++)
{
new pid = entlist[i]
if (pid == id || !is_user_alive(pid))
continue
new Float:id_origin[3]
new Float:pid_origin[3]
new Float:delta_vec[3]
pev(id,pev_origin,id_origin)
pev(pid,pev_origin,pid_origin)
delta_vec[x] = (pid_origin[x]-id_origin[x])+10
delta_vec[y] = (pid_origin[y]-id_origin[y])+10
delta_vec[z] = (pid_origin[z]-id_origin[z])+200
set_pev(pid,pev_velocity,delta_vec)
message_begin(MSG_ONE , get_user_msgid("ScreenShake") , {0,0,0} ,pid)
write_short( 1<<14 );
write_short( 1<<12 );
write_short( 1<<14 );
message_end();
Player_Daze(pid,3)
}
}
//Sunder Armor - Will remove all of players armor temporarily
public Player_Enrage(id, target, seconds)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Enrage")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_solid,SOLID_NOT)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
//Add marked effect to player
Player_Marked(id,target,seconds)
Player_Armoradd(id,seconds,25)
Player_Armoradd(id,seconds,25)
AddFlag(id,Flag_Enrage)
Display_Fade(id,seconds*2600,seconds*2600,0,255,0,0,45)
}
public Effect_Enrage_Think(ent)
{
new id = pev(ent,pev_owner)
new target = pev(ent,pev_euser2)
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id) || !is_user_alive(target))
{
set_user_maxspeed(id,NORM_SPEED)
RemoveFlag(id,Flag_Enrage)
remove_entity(ent)
return PLUGIN_CONTINUE
}
set_user_maxspeed(id,NORM_SPEED+135)
set_pev(ent,pev_nextthink, halflife_time() + 0.5)
return PLUGIN_CONTINUE
}
//Renew - Regains healing over time
public Player_Renew(id, seconds)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Renew")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_solid,SOLID_NOT)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
AddFlag(id,Flag_Renew)
Display_Fade(id,2600,2600,0,0,255,50,30)
}
public Effect_Renew_Think(ent)
{
new id = pev(ent,pev_owner)
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
RemoveFlag(id,Flag_Renew)
remove_entity(ent)
return PLUGIN_CONTINUE
}
if (get_user_health(id) + 1 <= 100)
{
set_user_health(id,get_user_health(id)+1)
}
set_pev(ent,pev_nextthink, halflife_time() + 0.5)
return PLUGIN_CONTINUE
}
//Marked. Owner = Marked
public Player_Marked(marker, marked, seconds)
{
new ent = Spawn_Ent("info_target")
set_pev(ent,pev_classname,"Effect_Mark")
set_pev(ent,pev_owner,marked)
set_pev(ent,pev_ltime, halflife_time() + seconds + 0.1)
set_pev(ent,pev_solid,SOLID_NOT)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
set_pev(ent,pev_euser2,marker)
Display_Tent(marked,sprite_mark,seconds)
}
public Effect_Mark_Think(ent)
{
new id = pev(ent,pev_owner)
if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id))
{
set_user_maxspeed(id,NORM_SPEED)
Remove_All_Tents(id)
remove_entity(ent)
return PLUGIN_CONTINUE
}
set_user_maxspeed(id,NORM_SPEED-20)
set_pev(ent,pev_nextthink, halflife_time() + 0.1)
return PLUGIN_CONTINUE
}
public AddFlag(id,flag)
{
afflicted[id][flag] = 1
}
public RemoveFlag(id,flag)
{
afflicted[id][flag] = 0
}
public bool:HasFlag(id,flag)
{
if (afflicted[id][flag])
return true
return false
}
public ResetFlags(id)
{
for (new i=0; i < Flag_Max; i++)
afflicted[id][i] = 0
}
public Display_Spark(Origin[])
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_SPARKS);
write_coord(Origin[x]);
write_coord(Origin[y]);
write_coord(Origin[z]);
message_end();
}
public Display_Tent(id,sprite, seconds)
{
message_begin(MSG_ALL,SVC_TEMPENTITY)
write_byte(TE_PLAYERATTACHMENT)
write_byte(id)
write_coord(35) //Offset
write_short(sprite)
write_short(seconds*10)
message_end()
}
public Remove_All_Tents(id)
{
message_begin(MSG_ALL ,SVC_TEMPENTITY) //message begin
write_byte(TE_KILLPLAYERATTACHMENTS)
write_byte(id) // entity index of player
message_end()
}
public Set_Aiming( CoreID, TargetID )
{
new Float:CoreAngles[3] = { 0.0, 0.0, 0.0 };
new Float:CoreOrigin[3];
pev(CoreID, pev_origin, CoreOrigin );
new Float:TargetOrigin[3];
pev(TargetID, pev_origin, TargetOrigin );
new anglemode:Mode = degrees;
new Float:DeltaOrigin[3];
for ( new i = 0; i < 3; i++ )
DeltaOrigin[i] = CoreOrigin[i] - TargetOrigin[i];
CoreAngles[x] = floatatan( DeltaOrigin[z] / Distance2D( DeltaOrigin[x], DeltaOrigin[y] ), Mode ) ;
CoreAngles[y] = floatatan( DeltaOrigin[y] / DeltaOrigin[x], Mode );
( DeltaOrigin[x] >= 0.0 ) ? ( CoreAngles[y] += 180.0 ): ( CoreAngles[y] += 0.0 )
set_pev(CoreID, pev_angles, CoreAngles,3 );
set_pev(CoreID, pev_fixangle, 1 );
}
stock Find_Best_Angle(id,Float:dist, same_team = false)
{
new Float:bestangle = 0.0
new winner = -1
for (new i=0; i < MAX; i++)
{
if (!is_user_alive(i) || i == id || (get_user_team(i) == get_user_team(id) && !same_team))
continue
new Float:c_angle = Find_Angle(id,i,dist)
if (c_angle > bestangle && Can_Trace_Line(id,i))
{
winner = i
bestangle = c_angle
}
}
return winner
}
public Float:Find_Angle(Core,Target,Float:dist)
{
new Float:vec2LOS[2]
new Float:flDot
new Float:CoreOrigin[3]
new Float:TargetOrigin[3]
new Float:CoreAngles[3]
pev(Core,pev_origin,CoreOrigin)
pev(Target,pev_origin,TargetOrigin)
if (get_distance_f(CoreOrigin,TargetOrigin) > dist)
return 0.0
pev(Core,pev_angles, CoreAngles)
for ( new i = 0; i < 2; i++ )
vec2LOS[i] = TargetOrigin[i] - CoreOrigin[i]
new Float:veclength = Vec2DLength(vec2LOS)
//Normalize V2LOS
if (veclength <= 0.0)
{
vec2LOS[x] = 0.0
vec2LOS[y] = 0.0
}
else
{
new Float:flLen = 1.0 / veclength;
vec2LOS[x] = vec2LOS[x]*flLen
vec2LOS[y] = vec2LOS[y]*flLen
}
//Do a makevector to make v_forward right
engfunc(EngFunc_MakeVectors,CoreAngles)
new Float:v_forward[3]
new Float:v_forward2D[2]
get_global_vector(GL_v_forward, v_forward)
v_forward2D[x] = v_forward[x]
v_forward2D[y] = v_forward[y]
flDot = vec2LOS[x]*v_forward2D[x]+vec2LOS[y]*v_forward2D[y]
if ( flDot > 0.5 )
{
return flDot
}
return 0.0
}
public In_FOV(id,target)
{
if (Find_Angle(id,target,9999.9) > 0.0)
return true
return false
}
//This is an interpolation. We make tree lines with different height as to make sure
public bool:Can_Trace_Line(id, target)
{
for (new i=-35; i < 60; i+=35)
{
new Float:Origin_Id[3]
new Float:Origin_Target[3]
new Float:Origin_Return[3]
pev(id,pev_origin,Origin_Id)
pev(target,pev_origin,Origin_Target)
Origin_Id[z] = Origin_Id[z] + i
Origin_Target[z] = Origin_Target[z] + i
trace_line(-1, Origin_Id, Origin_Target, Origin_Return)
if (get_distance_f(Origin_Return,Origin_Target) < 25.0)
return true
}
return false
}