#include <amxmodx>
#include <hamsandwich>
#include <zombieplague>
#include <dhudmessage>
#include <fakemeta>
#include <cstrike>
#include <engine>
#include <fun>
enum _:Sprites
{
SPRITE_FROST,
SPRITE_FROST2,
SPRITE_FLAKE
}
new g_iSprites[Sprites]
#define CLASSNAME_ICE "ent_frozen"
#define write_coord_fl(%1) engfunc(EngFunc_WriteCoord, %1)
#define message_begin_fl(%1,%2,%3,%4) engfunc(EngFunc_MessageBegin, %1, %2, %3, %4)
#define BREAK_GLASS 0x01
new M4A1_V_MODEL[64] = "models/v_forst_m4a1.mdl"
new M4A1_P_MODEL[64] = "models/p_forst_m4a1.mdl"
new const ice_model[] = "models/icecube_frozen.mdl"
new const MODEL_GLASSGIBS[] = "models/glassgibs.mdl"
new const SOUND_UNFROZEN[] = "debris/glass3.wav"
new gc_itemID
new bool:g_ForstM4A1[33]
new g_FrozeN[33]
new M4A1ForstSpr
new g_msgScreenFade
new g_iMaxPlayers
new g_HudSync
new FrostTime
new BackSpeed
new m_spriteLaser
new g_iDmg[33]
new FreezeDamage
new glassGibs
const UNIT_SECOND = (1<<12)
public plugin_init()
{
register_plugin("[ZP] Extra Item: Frost M4A1", "1.3", "Raheem")
// Cvars
FrostTime = register_cvar("zp_frost_m4a1_time", "3.0") // Freeze Time
BackSpeed = register_cvar("zp_forst_m4a1_back_speed", "250.0") // Zombie Speed
FreezeDamage = register_cvar("reload_damage", "800") // Damage Requried So Zombie got Frozen
// Message IDS
g_HudSync = CreateHudSyncObj()
g_iMaxPlayers = get_maxplayers()
g_msgScreenFade = get_user_msgid("ScreenFade")
// ITEM NAME & COST
gc_itemID = zp_register_extra_item("Forst M4A1", 40, ZP_TEAM_HUMAN)
// Events
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
register_event("WeapPickup","checkModel","b","1=19")
register_event("CurWeapon","checkWeapon","be","1=1")
register_event("DeathMsg", "EventDeathMsg", "a")
// Forwards
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
// Hams
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
RegisterHam(Ham_TraceAttack, "player", "TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "worldspawn", "TraceAttack", 1)
}
public plugin_precache()
{
// Models
precache_model(M4A1_V_MODEL)
precache_model(M4A1_P_MODEL)
precache_model(ice_model)
glassGibs = precache_model(MODEL_GLASSGIBS)
// Sounds
precache_sound("warcraft3/impalehit.wav")
precache_sound(SOUND_UNFROZEN)
// Sprites
M4A1ForstSpr = precache_model("sprites/shockwave.spr")
m_spriteLaser = precache_model( "sprites/Newlightning.spr")
g_iSprites[SPRITE_FROST] = precache_model("sprites/frostexp_1.spr");
g_iSprites[SPRITE_FROST2] = precache_model("sprites/frostexp_2.spr");
g_iSprites[SPRITE_FLAKE] = precache_model("sprites/snowflake_1.spr");
}
public client_putinserver(id)
{
g_ForstM4A1[id] = false
g_FrozeN[id] = false
}
public client_disconnect(id)
{
g_ForstM4A1[id] = false
g_FrozeN[id] = false
RemoveEntity(id)
}
public zp_extra_item_selected(player, itemid)
{
if (itemid == gc_itemID)
{
ColorPrint(player, "^1[^4ZP^1] ^3You Purchased Forst M4A1^1!")
g_ForstM4A1[player] = true
ham_strip_weapon(player, "weapon_m4a1")
give_item(player, "weapon_m4a1")
cs_set_user_bpammo(player, CSW_M4A1, 90)
new gcName[32]
get_user_name(player, gcName, charsmax(gcName))
set_hudmessage(34, 138, 255, -1.0, 0.17, 1, 0.0, 5.0, 1.0, 1.0, -1)
ShowSyncHudMsg(0, g_HudSync, "%s Purchased Forst M4A1!", gcName)
}
}
public TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
{
if(!is_user_alive(iAttacker))
{
return
}
new iWeapon = get_user_weapon(iAttacker)
if(iWeapon != CSW_M4A1 || !g_ForstM4A1[iAttacker])
return
set_hudmessage(34, 138, 255, -1.0, 0.17, 1, 0.0, 2.0, 1.0, 1.0, -1)
ShowSyncHudMsg(iAttacker, g_HudSync, "Freeze Damage^n%d/%d", g_iDmg[iAttacker], get_pcvar_num(FreezeDamage))
new vec1[3], vec2[3]
get_user_origin(iAttacker, vec1, 1)
get_user_origin(iAttacker, vec2, 4)
make_beam(vec1, vec2, m_spriteLaser, 0, 50, 200, 200)
}
public zp_user_infected_post(infected, infector)
{
if (g_ForstM4A1[infected])
{
g_ForstM4A1[infected] = false
}
}
public zp_user_humanized_post(id)
{
g_ForstM4A1[id] = false
RemoveEntity(id)
}
public event_round_start()
{
for (new i = 1; i <= g_iMaxPlayers; i++)
{
if (g_ForstM4A1[i])
{
g_ForstM4A1[i] = false
}
if(g_FrozeN[i])
{
g_FrozeN[i] = false
}
}
}
public EventDeathMsg()
{
new victim = read_data(2)
RemoveEntity(victim)
g_FrozeN[victim] = false
}
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
if(!is_user_connected(attacker) || !is_user_connected(victim) || zp_get_user_nemesis(victim) || attacker == victim || !attacker)
return HAM_IGNORED
// For Frost Effect Ring
static Float:originF[3]
pev(victim, pev_origin, originF)
// For Frost Effect Sound
static originF2[3]
get_user_origin(victim, originF2)
if((get_user_weapon(attacker) == CSW_M4A1) && g_ForstM4A1[attacker])
{
g_iDmg[attacker] += floatround(damage)
}
if((g_iDmg[attacker] >= get_pcvar_num(FreezeDamage)) && (get_user_weapon(attacker) == CSW_M4A1) && g_ForstM4A1[attacker])
{
new szName[32]
get_user_name(victim, szName, charsmax(szName))
FrostEffect(victim)
FrostEffectRing(originF)
FrostEffectSound(originF2)
g_iDmg[attacker] = 0
set_dhudmessage(34, 138, 255, -1.0, 0.25, 2, 6.0, 3.0, 0.1, 1.5)
show_dhudmessage(attacker, "Zombie (%s) Freezed!", szName)
}
return PLUGIN_HANDLED;
}
public checkModel(id)
{
if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
return PLUGIN_HANDLED
new szWeapID = read_data(2)
if (szWeapID == CSW_M4A1 && g_ForstM4A1[id] == true)
{
set_pev(id, pev_viewmodel2, M4A1_V_MODEL)
set_pev(id, pev_weaponmodel2, M4A1_P_MODEL)
}
else
{
ClearSyncHud(id, g_HudSync)
}
return PLUGIN_HANDLED
}
public checkWeapon(id)
{
new plrClip, plrAmmo, plrWeapId
plrWeapId = get_user_weapon(id, plrClip , plrAmmo)
if (plrWeapId == CSW_M4A1 && g_ForstM4A1[id])
{
checkModel(id)
}
else
{
return PLUGIN_CONTINUE
}
return PLUGIN_HANDLED
}
public FrostEffect(id)
{
// Only effect alive unfrozen zombies
if (!is_user_alive(id) || !zp_get_user_zombie(id) || g_FrozeN[id])
return;
message_begin(MSG_ONE_UNRELIABLE, g_msgScreenFade, _, id)
write_short(UNIT_SECOND*1) // duration
write_short(UNIT_SECOND*1) // hold time
write_short(0x0000) // fade type
write_byte(0) // red
write_byte(50) // green
write_byte(200) // blue
write_byte(100) // alpha
message_end()
new ent = create_entity("info_target")
UTIL_Explosion(id, g_iSprites[SPRITE_FROST], 40, 30, 4)
UTIL_Explosion(id, g_iSprites[SPRITE_FROST2], 20, 30, 4)
UTIL_SpriteTrail(id, g_iSprites[SPRITE_FLAKE], 30, 3, 2, 30, 0);
new Float:iOrigin[3]
entity_get_vector(id, EV_VEC_origin, iOrigin)
set_pev(ent, pev_body, 1)
entity_set_model(ent, ice_model)
iOrigin[2] -= 35
entity_set_origin(ent, iOrigin)
set_pev(ent, pev_owner, id);
set_rendering(ent, kRenderFxNone, 255, 255, 255, kRenderTransAdd, 255)
entity_set_string(ent, EV_SZ_classname, CLASSNAME_ICE)
entity_set_int(ent, EV_INT_solid, 2)
new Float: iOriginNew[3]
entity_get_vector(id, EV_VEC_origin, iOriginNew)
set_user_rendering(id, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25)
g_FrozeN[id] = true
set_task(get_pcvar_float(FrostTime), "RemoveFrost", id) // Time to Remove Frost Effect
}
public fw_PlayerPreThink(id)
{
// Not alive
if (!is_user_alive(id))
return;
// Set Player MaxSpeed
if (g_FrozeN[id])
{
set_pev(id, pev_velocity, Float:{0.0,0.0,0.0}) // stop motion
set_pev(id, pev_maxspeed, 1.0) // prevent from moving
}
else
{
set_pev(id, pev_maxspeed, get_pcvar_float(BackSpeed)) // Change this in Cvar if you Want
}
}
// Frost Effect Sound
public FrostEffectSound(iOrigin[3])
{
new Entity = create_entity("info_target")
new Float:flOrigin[3]
IVecFVec(iOrigin, flOrigin)
entity_set_origin(Entity, flOrigin)
emit_sound(Entity, CHAN_WEAPON, "warcraft3/impalehit.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
remove_entity(Entity)
}
UTIL_Explosion(iEnt, iSprite, iScale, iFramerate, Flags)
{
new Float:vOrigin[3];
pev(iEnt, pev_origin, vOrigin);
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_EXPLOSION);
engfunc(EngFunc_WriteCoord, vOrigin[0]);
engfunc(EngFunc_WriteCoord, vOrigin[1]);
engfunc(EngFunc_WriteCoord, vOrigin[2]);
write_short(iSprite);
write_byte(iScale);
write_byte(iFramerate);
write_byte(Flags);
message_end();
}
UTIL_SpriteTrail(iEnt, iSprite, iCount, iLife, iScale, iVelocity, iVary)
{
new Float:vOrigin[3];
pev(iEnt, pev_origin, vOrigin);
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_SPRITETRAIL);
engfunc(EngFunc_WriteCoord, vOrigin[0]);
engfunc(EngFunc_WriteCoord, vOrigin[1]);
engfunc(EngFunc_WriteCoord, vOrigin[2] + 100);
engfunc(EngFunc_WriteCoord, vOrigin[0] + random_float( -200.0, 200.0 ));
engfunc(EngFunc_WriteCoord, vOrigin[1] + random_float( -200.0, 200.0 ));
engfunc(EngFunc_WriteCoord, vOrigin[2]);
write_short(iSprite);
write_byte(iCount);
write_byte(iLife);
write_byte(iScale);
write_byte(iVelocity);
write_byte(iVary);
message_end();
}
// Frost Effect Ring
FrostEffectRing(const Float:originF3[3])
{
// Largest ring
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF3, 0)
write_byte(TE_BEAMCYLINDER) // TE id
engfunc(EngFunc_WriteCoord, originF3[0]) // x
engfunc(EngFunc_WriteCoord, originF3[1]) // y
engfunc(EngFunc_WriteCoord, originF3[2]) // z
engfunc(EngFunc_WriteCoord, originF3[0]) // x axis
engfunc(EngFunc_WriteCoord, originF3[1]) // y axis
engfunc(EngFunc_WriteCoord, originF3[2]+100.0) // z axis
write_short(M4A1ForstSpr) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(41) // red
write_byte(138) // green
write_byte(255) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
}
// Remove Frost Effect
public RemoveFrost(id)
{
// Not alive or not frozen anymore
if (!is_user_alive(id) || !g_FrozeN[id])
return;
// Unfreeze
g_FrozeN[id] = false;
set_task(0.1, "remove_jibs", id)
set_user_rendering(id, kRenderFxNone, 255, 255, 255, kRenderNormal, 16)
}
public remove_jibs(id)
{
RemoveEntity(id)
new Float:origin[3];
pev(id,pev_origin,origin)
message_begin_fl(MSG_PVS,SVC_TEMPENTITY,origin,0);
write_byte(TE_IMPLOSION);
write_coord_fl(origin[0]); // x
write_coord_fl(origin[1]); // y
write_coord_fl(origin[2] + 8.0); // z
write_byte(64); // radius
write_byte(10); // count
write_byte(3); // duration
message_end();
message_begin_fl(MSG_PVS,SVC_TEMPENTITY,origin,0);
write_byte(TE_SPARKS);
write_coord_fl(origin[0]); // x
write_coord_fl(origin[1]); // y
write_coord_fl(origin[2]); // z
message_end();
message_begin_fl(MSG_PAS,SVC_TEMPENTITY,origin,0);
write_byte(TE_BREAKMODEL);
write_coord_fl(origin[0]); // x
write_coord_fl(origin[1]); // y
write_coord_fl(origin[2] + 24.0); // z
write_coord_fl(16.0); // size x
write_coord_fl(16.0); // size y
write_coord_fl(16.0); // size z
write_coord(random_num(-50,50)); // velocity x
write_coord(random_num(-50,50)); // velocity y
write_coord_fl(25.0); // velocity z
write_byte(10); // random velocity
write_short(glassGibs); // model
write_byte(10); // count
write_byte(25); // life
write_byte(BREAK_GLASS); // flags
message_end();
emit_sound(0,CHAN_ITEM,SOUND_UNFROZEN,VOL_NORM,ATTN_NORM,0,PITCH_LOW)
}
stock ColorPrint( const id, const input[], any: ... )
{
new count = 1, players[32];
static msg[191];
vformat( msg, 190, input, 3 );
replace_all( msg, 190, "!g", "^4" );
replace_all( msg, 190, "!y", "^1" );
replace_all( msg, 190, "!t", "^3" );
replace_all( msg, 190, "!t2", "^0" );
if ( id ) players[0] = id;else get_players( players, count, "ch" );
{
for ( new i = 0; i < count; i++ )
{
if ( is_user_connected( players[i] ) )
{
message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, players[i] );
write_byte( players[i] );
write_string( msg );
message_end();
}
}
}
}
stock ham_strip_weapon(id,weapon[])
{
if(!equal(weapon,"weapon_",7)) return 0;
new wId = get_weaponid(weapon);
if(!wId) return 0;
new wEnt;
while((wEnt = engfunc(EngFunc_FindEntityByString,wEnt,"classname",weapon)) && pev(wEnt,pev_owner) != id) {}
if(!wEnt) return 0;
if(get_user_weapon(id) == wId) ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt);
if(!ExecuteHamB(Ham_RemovePlayerItem,id,wEnt)) return 0;
ExecuteHamB(Ham_Item_Kill,wEnt);
set_pev(id,pev_weapons,pev(id,pev_weapons) & ~(1<<wId));
return 1;
}
make_beam(const origin2[3], const origin[3], sprite, red, green, blue, alpha)
{
//BEAMENTPOINTS
message_begin( MSG_BROADCAST,SVC_TEMPENTITY)
write_byte (0) //TE_BEAMENTPOINTS 0
write_coord(origin2[0])
write_coord(origin2[1])
write_coord(origin2[2])
write_coord(origin[0])
write_coord(origin[1])
write_coord(origin[2])
write_short(sprite) // sprite
write_byte(1) // framestart
write_byte(5) // framerate
write_byte(2) // life
write_byte(20) // width
write_byte(0) // noise
write_byte(red) // r, g, b
write_byte(green) // r, g, b
write_byte(blue) // r, g, b
write_byte(alpha) // brightness
write_byte(150) // speed
message_end()
}
public RemoveEntity(id)
{
if(!is_user_connected(id))
return
new iEnt = find_ent_by_owner(0, CLASSNAME_ICE, id);
if(pev_valid(iEnt))
remove_entity(iEnt)
}