Proszę.
#include <amxmodx>
#include <engine>
#include <cstrike>
#include <fakemeta_util>
#include <hamsandwich>
#include <zombieplague>
new const PLUGIN_INFO[] =
{
"[ZP] ZombieBomb",
"2.0",
"Zombie-rus/heka"
}
#pragma tabsize 0
new SayText
const g_item_cost = 3
#define ZOMBIE_BOMB_V "models/cz/v_zombibomb.mdl"
#define ZOMBIE_BOMB_P "models/cz/p_zombibomb.mdl"
#define ZOMBIE_BOMB_W "models/cz/w_zombibomb.mdl"
#define ZOMBIE_BOMB_BUY "items/gunpickup2.wav"
#define ZOMBIE_BOMB_EXP "nst_zombie/zombi_bomb_exp.wav"
#define ZOMBIE_BOMB_EXP_SPR "sprites/knockbackbomb/zombiebomb_exp.spr"
new const frogbomb_sound [ ] = { "nst_zombie/zombi_bomb_pull_1.wav", "nst_zombie/zombi_bomb_deploy.wav" }
new const frogbomb_sound_idle [ ] = { "nst_zombie/zombi_bomb_idle_1.wav", "nst_zombie/zombi_bomb_idle_2.wav", "nst_zombie/zombi_bomb_idle_3.wav", "nst_zombie/zombi_bomb_idle_4.wav" }
#define ZOMBIE_BOMB_EXP_RADIUS 300.0
#define ZOMBIE_BOMB_EXP_POWER 650.0
#define NADE_TYPE_ZOMBIEBOMB 26517
new g_ZombieBomb_ExpSpr
new g_ZombieBombID
new g_ZombieBomb [33]
new g_ZombieBomb_Icon[33][32]
public plugin_init ()
{
register_plugin(PLUGIN_INFO[0],PLUGIN_INFO[1],PLUGIN_INFO[2])
RegisterHam(Ham_Item_Deploy,"weapon_smokegrenade","FwdItemDeployPost",1);
register_event("DeathMsg","EV_DeathMsg","a")
register_event("CurWeapon","grenade_icon","be","1=1")
register_forward(FM_SetModel,"fw_SetModel")
RegisterHam(Ham_Think, "grenade","fw_ThinkGrenade")
SayText = get_user_msgid("SayText")
g_ZombieBombID = zp_register_extra_item ( "ML_KNOCKBACK_BOMB", g_item_cost, ZP_TEAM_ZOMBIE )
register_dictionary("zombie_plague.txt")
}
public plugin_precache ( )
{
precache_model(ZOMBIE_BOMB_P)
precache_model(ZOMBIE_BOMB_V)
precache_model(ZOMBIE_BOMB_W)
precache_sound(ZOMBIE_BOMB_BUY)
precache_sound(ZOMBIE_BOMB_EXP)
precache_sound ( frogbomb_sound )
precache_sound ( frogbomb_sound_idle )
precache_generic("sprites/weapon_knockback_shaxu.txt")
precache_generic("sprites/knockbackbomb/640hud61x.spr")
precache_generic("sprites/knockbackbomb/640hud7x.spr")
g_ZombieBomb_ExpSpr = precache_model (ZOMBIE_BOMB_EXP_SPR)
register_clcmd("weapon_knockback_shaxu","Hook_SelectWeapon")
}
public zp_extra_item_selected(id, itemid)
{
if (itemid != g_ZombieBombID)
return;
if (g_ZombieBomb[id] >= 1 )
{
zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + g_item_cost)
ChatColor(id, "!g[ZP]!y %L", id, "KNOCKBACK_MAX" )
return;
}
fm_give_item (id, "weapon_smokegrenade")
emit_sound (id, CHAN_ITEM, ZOMBIE_BOMB_BUY, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
message_begin(MSG_ONE,get_user_msgid( "AmmoPickup"), _,id)
write_byte (13)
write_byte (1)
message_end ()
WeaponList_Change(id,true)
g_ZombieBomb [id] = 1
}
public zp_user_infected_post(id)
{
if(zp_get_user_nemesis(id) || zp_is_survivor_round() || zp_is_nemesis_round())
return;
fm_give_item(id, "weapon_smokegrenade")
engclient_cmd(id, "weapon_knife")
cs_set_user_bpammo(id, CSW_SMOKEGRENADE, 1)
emit_sound (id,CHAN_ITEM,ZOMBIE_BOMB_BUY,VOL_NORM,ATTN_NORM,0,PITCH_NORM)
message_begin(MSG_ONE,get_user_msgid( "AmmoPickup"), _,id)
write_byte (13)
write_byte (1)
message_end ()
WeaponList_Change(id,true)
g_ZombieBomb [id] = 1
}
public zp_user_humanized_post(id)
{
WeaponList_Change(id,false)
g_ZombieBomb [id] = 0
}
public zp_round_ended(id)
{
for (new i = 1; i <= get_maxplayers(); i++)
{
if (is_user_alive(i) && zp_get_user_zombie(i))
{
ham_strip_weapon(i , "weapon_smokegrenade")
WeaponList_Change(i,false)
g_ZombieBomb[i] = 0
}
}
}
public Hook_SelectWeapon(id) engclient_cmd(id,"weapon_smokegrenade")
public client_connect(id) g_ZombieBomb[id] = 0
public FwdItemDeployPost(entity)
{
static id;
id = get_pdata_cbase(entity, 41, 4);
if(zp_get_user_zombie(id))
{
set_pev(id,pev_viewmodel2,ZOMBIE_BOMB_V)
set_pev(id,pev_weaponmodel2,ZOMBIE_BOMB_P)
}
}
public EV_DeathMsg()
{
new iVictim = read_data (2)
if (!is_user_connected(iVictim))
return;
if(!zp_get_user_zombie(iVictim))
return
remove_grenade_icon(iVictim)
ham_strip_weapon(iVictim,"weapon_smokegrenade")
WeaponList_Change(iVictim,false)
g_ZombieBomb[iVictim] = 0
}
public fw_SetModel(Entity,const Model[])
{
if (Entity < 0)
return FMRES_IGNORED;
if (pev(Entity,pev_dmgtime) == 0.0)
return FMRES_IGNORED;
new iOwner = entity_get_edict ( Entity, EV_ENT_owner )
if ( g_ZombieBomb [ iOwner ] >= 1 && equal ( Model [ 7 ], "w_sm", 4 ) )
{
set_pev(Entity,pev_flTimeStepSound,0)
set_pev(Entity,pev_flTimeStepSound,NADE_TYPE_ZOMBIEBOMB)
g_ZombieBomb[iOwner]--
entity_set_model(Entity, ZOMBIE_BOMB_W)
fm_set_rendering(Entity,kRenderFxHologram,255,165,0,kRenderNormal,16)
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
public fw_ThinkGrenade(Entity)
{
if (!pev_valid(Entity))
return HAM_IGNORED;
static Float:dmg_time
pev (Entity,pev_dmgtime,dmg_time)
if (dmg_time > get_gametime())
return HAM_IGNORED;
if (pev(Entity,pev_flTimeStepSound) == NADE_TYPE_ZOMBIEBOMB)
{
jumping_explode (Entity)
return HAM_SUPERCEDE;
}
return HAM_IGNORED;
}
public jumping_explode (Entity)
{
if(Entity < 0)
return
static Float:flOrigin [3]
pev(Entity,pev_origin,flOrigin)
engfunc(EngFunc_MessageBegin,MSG_PVS,SVC_TEMPENTITY,flOrigin,0)
write_byte(TE_SPRITE)
engfunc(EngFunc_WriteCoord,flOrigin [0])
engfunc(EngFunc_WriteCoord,flOrigin [1])
engfunc(EngFunc_WriteCoord,flOrigin [2] + 45.0)
write_short( g_ZombieBomb_ExpSpr )
write_byte(35)
write_byte(186)
message_end()
emit_sound (Entity,CHAN_WEAPON,ZOMBIE_BOMB_EXP,VOL_NORM,ATTN_NORM,0,PITCH_NORM)
for (new i = 1; i < get_maxplayers (); i++)
{
if (!is_user_alive(i))
continue;
new Float:flVictimOrigin [3]
pev (i,pev_origin,flVictimOrigin)
new Float:flDistance = get_distance_f(flOrigin,flVictimOrigin)
if (flDistance <= ZOMBIE_BOMB_EXP_RADIUS)
{
static Float:flSpeed
flSpeed = ZOMBIE_BOMB_EXP_POWER
static Float:flNewSpeed
flNewSpeed = flSpeed * (1.0 - ( flDistance / ZOMBIE_BOMB_EXP_RADIUS))
static Float:flVelocity [3]
get_speed_vector(flOrigin,flVictimOrigin,flNewSpeed,flVelocity)
set_pev (i,pev_velocity,flVelocity)
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenShake"), _, i)
write_short((1<<12)*4) // amplitude
write_short((1<<12)*10) // duration
write_short((1<<12)*10) // frequency
message_end()
if(zp_get_user_zombie(i))
{
if (pev(i, pev_health) - 20.0 <= 0) ExecuteHamB(Ham_Killed, i, i, 1)
else ExecuteHamB(Ham_TakeDamage, i, 0, i, 0.0, DMG_BLAST)
}
}
}
engfunc(EngFunc_RemoveEntity,Entity)
}
public WeaponList_Change(id,bool:change)
{
if (!is_user_connected(id))
return;
message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0,0,0}, id)
if (bool:change)
write_string("weapon_knockback_shaxu")
else
write_string("weapon_smokegrenade")
write_byte(13)
write_byte(1)
write_byte(-1)
write_byte(-1)
write_byte(3)
write_byte(3)
write_byte(9)
write_byte(24)
message_end()
}
public grenade_icon(id)
{
remove_grenade_icon(id)
if(is_user_bot(id))
return
static igrenade, grenade_sprite[16], grenade_color[3]
igrenade = get_user_weapon(id)
switch(igrenade)
{
case CSW_SMOKEGRENADE:
{
if(!is_user_alive(id) || zp_get_user_zombie(id))
{
grenade_sprite = "dmg_gas"
grenade_color = {255, 165, 0}
}
else
{
grenade_sprite = ""
grenade_color = {0, 0, 0}
}
}
default: return
}
g_ZombieBomb_Icon[id] = grenade_sprite
message_begin(MSG_ONE,get_user_msgid("StatusIcon"),{0,0,0},id)
write_byte(1)
write_string(g_ZombieBomb_Icon[id])
write_byte(grenade_color[0])
write_byte(grenade_color[1])
write_byte(grenade_color[2])
message_end()
return
}
public remove_grenade_icon(id)
{
message_begin(MSG_ONE,get_user_msgid("StatusIcon"),{0,0,0},id)
write_byte(0)
write_string(g_ZombieBomb_Icon[id])
message_end()
}
stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
new_velocity[0] = origin2[0] - origin1[0]
new_velocity[1] = origin2[1] - origin1[1]
new_velocity[2] = origin2[2] - origin1[2]
new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
new_velocity[0] *= num
new_velocity[1] *= num
new_velocity[2] *= num
return 1;
}
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
}
stock ChatColor(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4") // Green Color
replace_all(msg, 190, "!y", "^1") // Default Color
replace_all(msg, 190, "!t", "^3") // Team Color
replace_all(msg, 190, "!t2", "^0") // Team2 Color
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, SayText, _, players[i])
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}