Код:
#include <amxmodx>
#include <engine>
#include <xs>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#include <cstrike>
#include <zombieplague>
//native zp_cs_get_user_money(index)
//native zp_cs_set_user_money(index, value)
//#define BUYMENU
//#if defined BUYMENU
//#define GET_MONEY zp_cs_get_user_money
//#define SET_MONEY zp_cs_set_user_money
//#else
#define GET_MONEY zp_get_user_ammo_packs
#define SET_MONEY zp_set_user_ammo_packs
//#endif
#define WEAPON_NUMBER 1079
#define TIME_RELOAD 2.7
#define TIME_DRAW 1.0
#define ANIM_DRAW 1
#define ANIM_SHOOT 2
#define ANIM_SHOOT_L 3
#define CLIP 20
#define AMMO_COST 600
#define BUYAMMO_SOUND "items/9mmclip1.wav"
#define EXPLODE_SOUND "weapons/m79_explosion.wav"
#define SHOOT_SOUND "weapons/m79-1.wav"
#define VIEW_MODEL "models/cso_zp/v_m79_new.mdl"
#define PLAYER_MODEL "models/cso_zp/p_m79.mdl"
#define WORLD_MODEL "models/cso_zp/w_m79.mdl"
#define SPECIAL_MODEL "models/cso_zp/s_m79.mdl"
#define EXPLODE_DAMAGE 700.0
new g_itemid, g_has_m79[33], g_clipammo[33]
new g_orig_event_p228, g_p228_variables[10]
new g_index_explosion, g_index_trail, g_index_smoke, g_index_gibs
const SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_GLOCK18)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_DEAGLE)|(1<<CSW_P228)
public plugin_init()
{
register_plugin("[ZP] Extra Item: M79 Saw off", "1.0", "n1ke:D")
register_message(get_user_msgid("WeapPickup"), "message_weappickup")
register_message(get_user_msgid("CurWeapon"), "message_curweapon")
register_message(get_user_msgid("AmmoX"), "message_ammox")
register_forward(FM_SetModel, "fm_setmodel")
register_forward(FM_UpdateClientData, "fm_updateclientdata_post", 1)
register_forward(FM_PlaybackEvent, "fm_playbackevent")
register_touch("m79_grenade", "*", "touch_m79_grenade")
RegisterHam(Ham_Item_AddToPlayer, "weapon_p228", "ham_item_addtoplayer")
RegisterHam(Ham_Item_Deploy, "weapon_p228", "ham_item_deploy_post", 1)
RegisterHam(Ham_Item_Holster, "weapon_p228", "ham_item_holster_post", 1)
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_p228", "ham_weapon_primaryattack")
RegisterHam(Ham_Weapon_Reload, "weapon_p228", "ham_weapon_reload")
RegisterHam(Ham_Spawn, "player", "ham_spawn_post", 1)
g_itemid = zp_register_extra_item("M-79", 0, ZP_TEAM_HUMAN)
//register_dictionary("buy_menu.txt")
}
public plugin_precache()
{
precache_model(VIEW_MODEL)
precache_model(PLAYER_MODEL)
precache_model(WORLD_MODEL)
precache_model(SPECIAL_MODEL)
precache_sound(SHOOT_SOUND)
precache_sound(EXPLODE_SOUND)
g_index_explosion = precache_model("sprites/eexplo.spr")
g_index_trail = precache_model("sprites/zbeam2.spr")
g_index_smoke = precache_model("sprites/black_smoke3.spr")
g_index_gibs = precache_model("models/ceilinggibs.mdl")
precache_sound(BUYAMMO_SOUND)
precache_sound("weapons/m79_clipin.wav")
precache_sound("weapons/m79_clipon.wav")
precache_sound("weapons/m79_clipout.wav")
precache_sound("weapons/m79_draw.wav")
precache_generic("sprites/blackcat_sc/640hud7.spr")
precache_generic("sprites/blackcat_sc/640hud42.spr")
precache_generic("sprites/blackcat_sc/grenade_scope.spr")
precache_generic("sprites/weapon_m79_sc.txt")
register_clcmd("weapon_m79_sc", "clcmd_weapon_m79_sc")
register_message(78, "message_weaponlist")
register_forward(FM_PrecacheEvent, "fm_precacheevent_post", 1)
}
/*public zp_buy_ammo_2(i)
{
if(!g_has_m79[i])
return PLUGIN_CONTINUE
new weapon_entity = find_ent_by_owner (-1, "weapon_p228", i)
if(get_pdata_int(weapon_entity, 51, 4) >= CLIP)
{
client_print(i, print_center, "%L", i, "CAN_NOT_CARRY")
return ZP_PLUGIN_HANDLED
}
if(GET_MONEY(i) < AMMO_COST)
{
client_print(i, print_center, "%L", i, "NOT_ENOUGH_MONEY")
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("BlinkAcct"), _, i)
write_byte(5)
message_end()
return ZP_PLUGIN_HANDLED
}
set_pdata_int(weapon_entity, 51, get_pdata_int(weapon_entity, 51, 4) + 1, 4)
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoPickup"), {0,0,0}, i)
{
write_byte(g_p228_variables[2])
write_byte(1)
}
message_end()
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoX"), {0,0,0}, i)
{
write_byte(g_p228_variables[2])
write_byte(get_pdata_int(weapon_entity, 51, 4))
}
message_end()
SET_MONEY(i, GET_MONEY(i) - AMMO_COST)
emit_sound(i, CHAN_ITEM, "items/9mmclip1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
return ZP_PLUGIN_HANDLED
}*/
public client_disconnect(id)
{
g_has_m79[id] = false
}
public zp_user_infected_post(id)
{
g_has_m79[id] = false
}
public ham_spawn_post(id)
{
if(!is_user_alive(id))
return HAM_IGNORED
if(!return_has_weapon(id, "weapon_p228"))
g_has_m79[id] = false
if(get_user_weapon(id) != CSW_P228 || !g_has_m79[id])
return HAM_IGNORED
new weapon_ent = find_ent_by_owner(-1, "weapon_p228", id)
new iClip = get_pdata_int(weapon_ent, 51, 4)
message_begin(MSG_ONE, get_user_msgid("HideWeapon"), {0,0,0}, id)
{
write_byte(1<<6)
}
message_end()
message_begin(MSG_ONE, get_user_msgid("SetFOV"), {0,0,0}, id)
{
write_byte(89)
}
message_end()
message_begin(MSG_ONE, get_user_msgid("CurWeapon"), {0,0,0}, id)
{
write_byte(true)
write_byte(g_p228_variables[8])
write_byte(iClip)
}
message_end()
return HAM_IGNORED
}
public zp_extra_item_selected(id, itemid)
{
if(itemid != g_itemid)
return
give_m79(id)
}
public give_m79(id)
{
drop_weapons(id, 1)
g_has_m79[id] = true
new weapon = give_item(id, "weapon_p228")
if(weapon > 0)
{
set_pdata_int(weapon, 51, CLIP, 4)
g_clipammo[id] = CLIP
}
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoX"), {0,0,0}, id)
{
write_byte(g_p228_variables[2])
write_byte(get_pdata_int(find_ent_by_owner(-1, "weapon_p228", id), 51, 4))
}
message_end()
ExecuteHam(Ham_Item_Deploy, id)
}
public give_m792(id)
{
drop_weapons(id, 1)
g_has_m79[id] = true
new weapon = give_item(id, "weapon_p228")
if(weapon > 0)
{
set_pdata_int(weapon, 51, CLIP, 4)
g_clipammo[id] = CLIP
}
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoX"), {0,0,0}, id)
{
write_byte(g_p228_variables[2])
write_byte(get_pdata_int(find_ent_by_owner(-1, "weapon_p228", id), 51, 4))
}
message_end()
ExecuteHam(Ham_Item_Deploy, id)
}
public fm_precacheevent_post(type, const name[])
{
if(!equal("events/p228.sc", name))
return FMRES_IGNORED
g_orig_event_p228 = get_orig_retval()
return FMRES_HANDLED
}
public fm_setmodel(entity, model[])
{
if(!is_valid_ent(entity))
return FMRES_IGNORED
static id, Ent
id = entity_get_edict(entity, EV_ENT_owner)
Ent = find_ent_by_owner(-1, "weapon_p228", entity)
if(!equal(model, "models/w_p228.mdl") || !is_valid_ent(Ent) || !g_has_m79[id])
return FMRES_IGNORED
entity_set_int(Ent, EV_INT_impulse, WEAPON_NUMBER)
entity_set_model(entity, WORLD_MODEL)
set_pev(entity, pev_body, 11)
g_has_m79[id] = false
return FMRES_SUPERCEDE
}
public fm_updateclientdata_post(id, SendWeapons, CD_Handle)
{
if(!is_user_alive(id) || get_user_weapon(id) != CSW_P228 || !g_has_m79[id])
return FMRES_IGNORED
set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.001)
return FMRES_HANDLED
}
public fm_playbackevent(flags, id, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
if (eventid != g_orig_event_p228 || !is_user_alive(id))
return FMRES_IGNORED
playback_event(flags | FEV_HOSTONLY, id, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
return FMRES_SUPERCEDE
}
public message_weappickup(msg_id, msg_dest, id)
{
if(!is_user_alive(id) || get_msg_arg_int(1) != CSW_P228 || !g_has_m79[id])
return PLUGIN_CONTINUE
set_weaplist(id, "weapon_m79_sc")
return PLUGIN_CONTINUE
}
public message_ammox(msg_id, msg_dest, id)
{
if(!is_user_connected(id) || !g_has_m79[id] || get_user_weapon(id) != CSW_P228 || get_msg_arg_int(1) != g_p228_variables[2])
return PLUGIN_CONTINUE
set_msg_arg_int(1, ARG_BYTE, g_clipammo[id])
return PLUGIN_CONTINUE
}
public message_curweapon(msg_id, msg_dest, id)
{
if(!is_user_connected(id) || get_msg_arg_int(2) != CSW_P228 || !g_has_m79[id])
return PLUGIN_CONTINUE
set_msg_arg_int(3, ARG_BYTE, -1)
return PLUGIN_CONTINUE
}
public message_weaponlist(msg_id, msg_dest, id)
{
if(get_msg_arg_int(8) != CSW_P228)
return PLUGIN_CONTINUE;
g_p228_variables[2] = get_msg_arg_int(2)
g_p228_variables[3] = get_msg_arg_int(3)
g_p228_variables[4] = get_msg_arg_int(4)
g_p228_variables[5] = get_msg_arg_int(5)
g_p228_variables[6] = get_msg_arg_int(6)
g_p228_variables[7] = get_msg_arg_int(7)
g_p228_variables[8] = get_msg_arg_int(8)
g_p228_variables[9] = get_msg_arg_int(9)
return PLUGIN_CONTINUE;
}
public set_weaplist(index, const string_msg[])
{
message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0,0,0}, index)
{
write_string(string_msg)
write_byte(g_p228_variables[2])
write_byte(g_p228_variables[3])
write_byte(g_p228_variables[4])
write_byte(g_p228_variables[5])
write_byte(g_p228_variables[6])
write_byte(g_p228_variables[7])
write_byte(g_p228_variables[8])
write_byte(g_p228_variables[9])
}
message_end()
}
public clcmd_weapon_m79_sc(id)
{
if(!is_user_alive(id))
return PLUGIN_HANDLED
engclient_cmd(id, "weapon_p228")
return PLUGIN_HANDLED
}
public ham_item_addtoplayer(entity, id)
{
if(!is_user_alive(id))
return HAM_IGNORED
if(entity_get_int(entity, EV_INT_impulse) != WEAPON_NUMBER)
{
set_weaplist(id, "weapon_p228")
return HAM_IGNORED
}
entity_set_int(entity, EV_INT_impulse, 0)
g_has_m79[id] = true
return HAM_HANDLED
}
public ham_item_deploy_post(weapon_ent)
{
static id; id = get_pdata_cbase(weapon_ent, 41, 4)
new iClip = get_pdata_int(weapon_ent, 51, 4)
if(!is_user_alive(id) || !g_has_m79[id])
return HAM_IGNORED
set_pev(id, pev_viewmodel2, VIEW_MODEL)
set_pev(id, pev_weaponmodel2, PLAYER_MODEL)
play_weapon_animation(id, ANIM_DRAW)
set_pdata_float(id, 83, TIME_DRAW, 5)
message_begin(MSG_ONE, get_user_msgid("HideWeapon"), {0,0,0}, id)
{
write_byte(1<<6)
}
message_end()
message_begin(MSG_ONE, get_user_msgid("SetFOV"), {0,0,0}, id)
{
write_byte(89)
}
message_end()
message_begin(MSG_ONE, get_user_msgid("CurWeapon"), {0,0,0}, id)
{
write_byte(true)
write_byte(g_p228_variables[8])
write_byte(iClip)
}
message_end()
return HAM_IGNORED
}
public ham_item_holster_post(weapon_ent)
{
static id; id = get_pdata_cbase(weapon_ent, 41, 4)
if(!is_user_alive(id) || !g_has_m79[id])
return HAM_IGNORED
message_begin(MSG_ONE, get_user_msgid("HideWeapon"), {0,0,0}, id)
{
write_byte(1>>6)
}
message_end()
message_begin(MSG_ONE, get_user_msgid("SetFOV"), {0,0,0}, id)
{
write_byte(90)
}
message_end()
return HAM_IGNORED
}
public ham_weapon_primaryattack(weapon_entity)
{
new id = get_pdata_cbase(weapon_entity, 41, 4)
if (!is_user_alive(id) || !g_has_m79[id])
return HAM_IGNORED
if(get_pdata_int(weapon_entity, 51, 4) <= 0)
return HAM_IGNORED
play_weapon_animation(id, get_pdata_int(weapon_entity, 51, 4) == 1 ? ANIM_SHOOT_L : ANIM_SHOOT)
emit_sound(id, CHAN_WEAPON, SHOOT_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
make_grenade(id)
set_pev(id, pev_punchangle, Float:{0.0, 0.0, 0.0})
set_pdata_float(id, 83, 2.8, 5)
set_pdata_float(weapon_entity, 46, 2.8, 4);
set_pdata_int(weapon_entity, 51, get_pdata_int(weapon_entity, 51, 4) - 1, 4)
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoX"), {0,0,0}, id)
{
write_byte(g_p228_variables[2])
write_byte(get_pdata_int(weapon_entity, 51, 4))
}
message_end()
return HAM_SUPERCEDE
}
public ham_weapon_reload(weapon_entity)
{
new id; id = pev(weapon_entity, pev_owner)
if (!is_user_alive(id) || !g_has_m79[id])
return HAM_IGNORED
return HAM_SUPERCEDE
}
stock play_weapon_animation(const Player, const Sequence)
{
set_pev(Player, pev_weaponanim, Sequence)
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
write_byte(Sequence)
write_byte(pev(Player, pev_body))
message_end()
}
stock drop_weapons(id, dropwhat)
{
static weapons[32], wname[32], num, i, weaponid
num = 0
get_user_weapons(id, weapons, num)
for (i = 0; i < num; i++)
{
weaponid = weapons[i]
if (dropwhat == 1 && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM))
{
get_weaponname(weaponid, wname, sizeof wname - 1)
engclient_cmd(id, "drop", wname)
}
}
}
stock return_has_weapon(id, const findstring[])
{
static weapons[32], wname[32], num, i, weaponid
num = 0
get_user_weapons(id, weapons, num)
for (i = 0; i < num; i++)
{
weaponid = weapons[i]
get_weaponname(weaponid, wname, sizeof wname - 1)
if(equal(wname, findstring))
return 1;
}
return 0;
}
public make_grenade(id)
{
new Float:fAngle[3], Float:fVelocity[3]
pev(id, pev_v_angle, fAngle)
new grenade = create_entity("info_target")
if (!grenade)
return
entity_set_string(grenade, EV_SZ_classname, "m79_grenade")
entity_set_model(grenade, SPECIAL_MODEL)
new Float:vOrigin[3]
pev(id, pev_origin, vOrigin)
static Float:origin[3], Float:angles[3], Float:v_forward[3], Float:v_right[3], Float:v_up[3], Float:gun_position[3], Float:player_origin[3], Float:player_view_offset[3];
pev(id, pev_v_angle, angles);
engfunc(EngFunc_MakeVectors, angles);
global_get(glb_v_forward, v_forward);
global_get(glb_v_right, v_right);
global_get(glb_v_up, v_up);
pev(id, pev_origin, player_origin);
pev(id, pev_view_ofs, player_view_offset);
xs_vec_add(player_origin, player_view_offset, gun_position);
/*
// For Right hand
xs_vec_mul_scalar(v_forward, 18.0, v_forward); //18
xs_vec_mul_scalar(v_up, -3.8, v_up); //-3.8
xs_vec_mul_scalar(v_right, 6.0, v_right); // 6.0
*/
xs_vec_add(gun_position, v_forward, origin);
xs_vec_add(origin, v_right, origin);
xs_vec_add(origin, v_up, origin);
vOrigin[0] = origin[0]
vOrigin[1] = origin[1]
vOrigin[2] = origin[2]
entity_set_origin(grenade, vOrigin)
entity_set_vector(grenade, EV_VEC_angles, fAngle)
entity_set_size(grenade, Float:{0.0, 0.0, 0.0}, Float:{0.0, 0.0, 0.0})
entity_set_int(grenade, EV_INT_solid, SOLID_SLIDEBOX)
entity_set_int(grenade, EV_INT_movetype, MOVETYPE_TOSS)
entity_set_edict(grenade, EV_ENT_owner, id)
VelocityByAim(id, 2000, fVelocity)
entity_set_vector(grenade, EV_VEC_velocity, fVelocity)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(grenade)
write_short(g_index_trail)
write_byte(6)
write_byte(3)
write_byte(255)
write_byte(255)
write_byte(255)
write_byte(75)
message_end()
}
public touch_m79_grenade(ent, id)
{
if (!pev_valid(ent))
return
// Get origin
static Float:originF[3]
pev(ent, pev_origin, originF)
new owner = pev(ent, pev_owner)
new victim
while((victim=engfunc(EngFunc_FindEntityInSphere, victim, originF, 240.0))!=0) {
if(pev(victim, pev_takedamage)!=DAMAGE_NO && pev(victim, pev_solid)!=SOLID_NOT) {
if(is_user_alive(victim)) {
if(zp_get_user_zombie(victim)) {
new victim_origin[3], distance, Float:distance_damage, floated_origin[3]
floated_origin[0] = floatround(originF[0])
floated_origin[1] = floatround(originF[1])
floated_origin[2] = floatround(originF[2])
get_user_origin(victim, victim_origin)
distance = get_distance(victim_origin, floated_origin)
distance_damage = EXPLODE_DAMAGE - floatmul(EXPLODE_DAMAGE, floatdiv(float(distance), 300.0))
ExecuteHamB(Ham_TakeDamage, victim, ent, owner, distance_damage, DMG_GENERIC)
}
}
else
ExecuteHamB(Ham_TakeDamage, victim, ent, owner, EXPLODE_DAMAGE, DMG_GENERIC)
}
}
make_metal_gibs(ent)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_EXPLOSION) // Temporary entity ID
engfunc(EngFunc_WriteCoord, originF[0]) // engfunc because float
engfunc(EngFunc_WriteCoord, originF[1])
engfunc(EngFunc_WriteCoord, originF[2] + 20)
write_short(g_index_explosion) // Sprite index
write_byte(30) // Scale
write_byte(20) // Framerate
write_byte(0) // Flags
message_end()
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_SMOKE) // Temporary entity IF
engfunc(EngFunc_WriteCoord, originF[0]) // Pos X
engfunc(EngFunc_WriteCoord, originF[1]) // Pos Y
engfunc(EngFunc_WriteCoord, originF[2]) // Pos Z
write_short(g_index_smoke) // Sprite index
write_byte(30) // Scale
write_byte(17) // Framerate
message_end()
engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, originF, 0)
write_byte(TE_WORLDDECAL)
engfunc(EngFunc_WriteCoord, originF[0])
engfunc(EngFunc_WriteCoord, originF[1])
engfunc(EngFunc_WriteCoord, originF[2])
write_byte(engfunc(EngFunc_DecalIndex, "{scorch3"))
message_end()
emit_sound(ent, CHAN_WEAPON, EXPLODE_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
// Get rid of the grenade
engfunc(EngFunc_RemoveEntity, ent)
}
public make_metal_gibs(ent)
{
static Float:flOrigin[3]
pev(ent, pev_origin, flOrigin)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_BREAKMODEL)
engfunc(EngFunc_WriteCoord, flOrigin[0])
engfunc(EngFunc_WriteCoord, flOrigin[1])
engfunc(EngFunc_WriteCoord, flOrigin[2])
engfunc(EngFunc_WriteCoord, 150)
engfunc(EngFunc_WriteCoord, 150)
engfunc(EngFunc_WriteCoord, 150)
engfunc(EngFunc_WriteCoord, random_num(-50,50))
engfunc(EngFunc_WriteCoord, random_num(-50,50))
engfunc(EngFunc_WriteCoord, random_num(-50,50))
write_byte(30)
write_short(g_index_gibs)
write_byte(random_num(20, 30))
write_byte(20)
write_byte(0x04) //0x02 - metal
message_end()
}