[Заявка] Как мога да си направя тези неща

Въпроси и проблеми свързани с AMXModX.
Аватар
a4tech1999
Извън линия
Потребител
Потребител
Мнения: 20
Регистриран на: 21 Яну 2017, 02:25
Обратна връзка:

[Заявка] Как мога да си направя тези неща

Мнение от a4tech1999 » 17 Фев 2017, 17:13

Как мога да вмъкна друг Item, На Снайпериста да има друго оражие примерно да сложа лък ?

Добавено преди 8 минути 9 секунди:
Този предмет да вмъкна за Снайпериста

Добавено преди 52 секунди:
Картинката

Добавено преди 4 минути 42 секунди:
А при Оцеляващия също да е друг предмета

Добавено преди 1 минута 24 секунди:
Картинка
Прикачени файлове
1328875911_3hvwsl281uwn4ygc8chnq.jpg
1328875911_3hvwsl281uwn4ygc8chnq.jpg (16.55 KiB) Преглеждано 4187 пъти
1328875911_3hvwsl281uwn4ygc8chnq.jpg
1328875911_3hvwsl281uwn4ygc8chnq.jpg (16.55 KiB) Преглеждано 4187 пъти
M134ex.rar
(1.25 MiB) Свалено 148 пъти
M134ex.rar
(1.25 MiB) Свалено 148 пъти
57af08946333a.jpg
57af08946333a.jpg (74.75 KiB) Преглеждано 4192 пъти
57af08946333a.jpg
57af08946333a.jpg (74.75 KiB) Преглеждано 4192 пъти
compound_bow.rar
(832.27 KiB) Свалено 142 пъти
compound_bow.rar
(832.27 KiB) Свалено 142 пъти
Последно промяна от a4tech1999 на 17 Фев 2017, 22:37, променено общо 1 път.

Аватар
TryAgain
Извън линия
Потребител
Потребител
Мнения: 182
Регистриран на: 25 Яну 2017, 16:59
Се отблагодари: 1 път
Получена благодарност: 26 пъти

Re: [Заявка] как се прави ?

Мнение от TryAgain » 17 Фев 2017, 17:44

Искаш при закупуването на M134ex да е със оригиналния модел на M134ex,а на на survivor да е със модула на арбалета така ли ?
Последно промяна от TryAgain на 17 Фев 2017, 17:45, променено общо 1 път.

Аватар
a4tech1999
Извън линия
Потребител
Потребител
Мнения: 20
Регистриран на: 21 Яну 2017, 02:25
Обратна връзка:

Re: [Заявка] как се прави ?

Мнение от a4tech1999 » 17 Фев 2017, 17:45

Да

Аватар
TryAgain
Извън линия
Потребител
Потребител
Мнения: 182
Регистриран на: 25 Яну 2017, 16:59
Се отблагодари: 1 път
Получена благодарност: 26 пъти

Re: [Заявка] как се прави ?

Мнение от TryAgain » 17 Фев 2017, 18:03

Пробвай така

zp_weapon_m134e.sma

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#include <xs>
#include <cstrike>
#include <zombieplague>

#define ENG_NULLENT			-1
#define EV_INT_WEAPONKEY	EV_INT_impulse
#define m134ex_WEAPONKEY 	8567
#define MAX_PLAYERS  		32
#define IsValidUser(%1) (1 <= %1 <= g_MaxPlayers)

const USE_STOPPED = 0
const OFFSET_ACTIVE_ITEM = 373
const OFFSET_WEAPONOWNER = 41
const OFFSET_LINUX = 5
const OFFSET_LINUX_WEAPONS = 4

#define WEAP_LINUX_XTRA_OFF		4
#define m_fKnown					44
#define m_flNextPrimaryAttack 		46
#define m_flTimeWeaponIdle			48
#define m_iClip					51
#define m_fInReload				54
#define PLAYER_LINUX_XTRA_OFF	5
#define m_flNextAttack				83

#define m134ex_RELOAD_TIME	5.0
#define m134ex_DRAW_TIME 	1.1
#define m134ex_SHOOT1		1
#define m134ex_SHOOT2		2
#define m134ex_RELOAD		3
#define m134ex_DRAW			4
#define m134ex_FIRE_READY	5
#define m134ex_FIRE_AFTER	6

#define write_coord_f(%1)	engfunc(EngFunc_WriteCoord,%1)

new const Fire_Sounds[][] = { "weapons/m134ex-1.wav" }
new const g_shellent [] = "m134ex_shell"

new m134ex_s_V_MODEL[64] = "models/DoNoR/v_m134ex_s.mdl"
new m134ex_V_MODEL[64] = "models/DoNoR/v_m134ex.mdl"
new m134ex_P_MODEL[64] = "models/DoNoR/p_m134ex.mdl"
new m134ex_W_MODEL[64] = "models/DoNoR/w_m134ex.mdl"

new const GUNSHOT_DECALS[] = { 41, 42, 43, 44, 45 }

new cvar_dmg_m134ex, cvar_dmg_m134ex_survivor, cvar_recoil_m134ex, g_itemid_m134ex, cvar_clip_m134ex, cvar_spd_m134ex, cvar_m134ex_ammo, cvar_surv_m134ex, cvar_speedrun_m134ex, cvar_speedrunfire_m134ex 
new g_MaxPlayers, g_orig_event_m134ex, g_IsInPrimaryAttack
new Float:cl_pushangle[MAX_PLAYERS + 1][3], m_iBlood[2]
new g_has_m134ex[33], g_clip_ammo[33], g_m134ex_TmpClip[33], oldweap[33], g_can[33], g_afterreload[33]
new cvar_shells_m134ex, cvar_shellshealth_m134ex
new gmsgWeaponList, shell_mode, shell_mode2

const PRIMARY_WEAPONS_BIT_SUM = 
(1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<
CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
"weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
"weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
"weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
"weapon_ak47", "weapon_knife", "weapon_p90" }

public plugin_init()
{
register_plugin("[ZP] Extra: m134ex", "1.0", "LARS-DAY[BR]EAKER")
register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
register_event("CurWeapon","CurrentWeapon","be","1=1")
RegisterHam(Ham_Item_AddToPlayer, "weapon_m249", "fw_m134ex_AddToPlayer")
RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m249", "fw_m134ex_PrimaryAttack")
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m249", "fw_m134ex_PrimaryAttack_Post", 1)
RegisterHam(Ham_Item_PostFrame, "weapon_m249", "m134ex_ItemPostFrame")
RegisterHam(Ham_Weapon_Reload, "weapon_m249", "m134ex_Reload")
RegisterHam(Ham_Weapon_Reload, "weapon_m249", "m134ex_Reload_Post", 1)
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
register_forward(FM_SetModel, "fw_SetModel")
register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
register_forward(FM_PlaybackEvent, "fwPlaybackEvent")
register_forward(FM_CmdStart, "fw_CmdStart")
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
register_think(g_shellent,"think_shell")

RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_wall", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_door", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_door_rotating", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_plat", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_rotating", "fw_TraceAttack", 1)

gmsgWeaponList = get_user_msgid("WeaponList")

cvar_dmg_m134ex = register_cvar("zp_m134ex_dmg", "2.56")
cvar_dmg_m134ex_survivor = register_cvar("zp_m134ex_dmg_survivor", "4.25")
cvar_recoil_m134ex = register_cvar("zp_m134ex_recoil", "2.5")
cvar_clip_m134ex = register_cvar("zp_m134ex_clip", "200")
cvar_spd_m134ex = register_cvar("zp_m134ex_spd", "0.75")
cvar_m134ex_ammo = register_cvar("zp_m134ex_ammo", "200")
cvar_surv_m134ex = register_cvar("zp_m134ex_givesurvivor", "0")
cvar_speedrunfire_m134ex = register_cvar("zp_m134ex_speedrunfire", "150.0")
cvar_speedrun_m134ex = register_cvar("zp_m134ex_speedrun", "200.0")
cvar_shells_m134ex = register_cvar("zp_m134ex_shells", "1")
cvar_shellshealth_m134ex = register_cvar("zp_m134ex_shellslife", "5000.0")

g_itemid_m134ex = zp_register_extra_item("M134ex", 61, ZP_TEAM_HUMAN)
g_MaxPlayers = get_maxplayers()
}

public plugin_precache()
{
precache_model(m134ex_s_V_MODEL)
precache_model(m134ex_V_MODEL)
precache_model(m134ex_P_MODEL)
precache_model(m134ex_W_MODEL)
for(new i = 0; i < sizeof Fire_Sounds; i++)
precache_sound(Fire_Sounds[i])	
precache_sound("weapons/m134ex_clipoff.wav")
precache_sound("weapons/m134ex_clipon.wav")
precache_sound("weapons/m134ex_pinpull.wav")
precache_sound("weapons/m134ex_spindown.wav") 
precache_sound("weapons/m134ex_spinup.wav") 
shell_mode = precache_model("models/DoNoR/shell.mdl")
shell_mode2 = precache_model("models/DoNoR/shell2.mdl")
precache_generic("sprites/weapon_m134ex.txt")
precache_generic("sprites/640hud7.spr")
precache_generic("sprites/640hud62.spr")
precache_generic("sprites/640hud63.spr")
m_iBlood[0] = precache_model("sprites/blood.spr")
m_iBlood[1] = precache_model("sprites/bloodspray.spr")
register_clcmd("weapon_m134ex", "weapon_hook")
register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
}

public weapon_hook(id) engclient_cmd(id, "weapon_m249")

public fw_TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
{
if(!is_user_alive(iAttacker))
return

new g_currentweapon = get_user_weapon(iAttacker)

if(g_currentweapon != CSW_M249) return

if(!g_has_m134ex[iAttacker]) return

static Float:flEnd[3]
get_tr2(ptr, TR_vecEndPos, flEnd)

if(iEnt)
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_DECAL)
write_coord_f(flEnd[0])
write_coord_f(flEnd[1])
write_coord_f(flEnd[2])
write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
write_short(iEnt)
message_end()
}
else
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_WORLDDECAL)
write_coord_f(flEnd[0])
write_coord_f(flEnd[1])
write_coord_f(flEnd[2])
write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
message_end()
}
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_GUNSHOTDECAL)
write_coord_f(flEnd[0])
write_coord_f(flEnd[1])
write_coord_f(flEnd[2])
write_short(iAttacker)
write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
message_end()
}

public zp_user_humanized_post(id, surv)
{
g_has_m134ex[id] = false
if(surv && get_pcvar_num(cvar_surv_m134ex))
give_m134ex(id)
}

public plugin_natives ()
{
register_native("give_weapon_m134ex", "native_give_weapon_add", 1)
}
public native_give_weapon_add(id)
{
give_m134ex(id)
}

public fwPrecacheEvent_Post(type, const name[])
{
if (equal("events/m249.sc", name))
{
g_orig_event_m134ex = get_orig_retval()
return FMRES_HANDLED
}
return FMRES_IGNORED
}

public client_connect(id)
{
g_has_m134ex[id] = false
}

public client_disconnect(id)
{
g_has_m134ex[id] = false
}

public zp_user_infected_post(id)
{
if (zp_get_user_zombie(id))
{
g_has_m134ex[id] = false
}
}

public user_can(id) 
{
g_can[id] = 2
}

public user_can2(id) 
{
g_can[id] = 0
}

public fw_SetModel(entity, model[])
{
if(!is_valid_ent(entity))
return FMRES_IGNORED

static szClassName[33]
entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))

if(!equal(szClassName, "weaponbox"))
return FMRES_IGNORED

static iOwner

iOwner = entity_get_edict(entity, EV_ENT_owner)

if(equal(model, "models/w_m249.mdl"))
{
static iStoredAugID

iStoredAugID = find_ent_by_owner(ENG_NULLENT, "weapon_m249", entity)

if(!is_valid_ent(iStoredAugID))
return FMRES_IGNORED

if(g_has_m134ex[iOwner])
{
entity_set_int(iStoredAugID, EV_INT_WEAPONKEY, m134ex_WEAPONKEY)

g_has_m134ex[iOwner] = false

entity_set_model(entity, m134ex_W_MODEL)

return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED
}

public give_m134ex(id)
{
drop_weapons(id, 1)
new iWep2 = give_item(id,"weapon_m249")
if( iWep2 > 0 )
{
cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_m134ex))
cs_set_user_bpammo (id, CSW_M249, get_pcvar_num(cvar_m134ex_ammo))	
UTIL_PlayWeaponAnimation(id, m134ex_DRAW)
set_pdata_float(id, m_flNextAttack, m134ex_DRAW_TIME, PLAYER_LINUX_XTRA_OFF)
}
g_has_m134ex[id] = true
message_begin(MSG_ONE, gmsgWeaponList, _, id)
{
write_string("weapon_m134ex")
write_byte(3)
write_byte(200)
write_byte(-1)
write_byte(-1)
write_byte(0)
write_byte(4)
write_byte(CSW_M249)
}
message_end()
}

public zp_extra_item_selected(id, itemid)
{
if(itemid != g_itemid_m134ex)
return

give_m134ex(id)
}

public fw_m134ex_AddToPlayer(m134ex, id)
{
if(!is_valid_ent(m134ex) || !is_user_connected(id))
return HAM_IGNORED

if(entity_get_int(m134ex, EV_INT_WEAPONKEY) == m134ex_WEAPONKEY)
{
g_has_m134ex[id] = true

entity_set_int(m134ex, EV_INT_WEAPONKEY, 0)

return HAM_HANDLED
}
return HAM_IGNORED
}

public fw_UseStationary_Post(entity, caller, activator, use_type)
{
if (use_type == USE_STOPPED && is_user_connected(caller))
replace_weapon_models(caller, get_user_weapon(caller))
}

public fw_Item_Deploy_Post(weapon_ent)
{
static owner
owner = fm_cs_get_weapon_ent_owner(weapon_ent)

static weaponid
weaponid = cs_get_weapon_id(weapon_ent)

replace_weapon_models(owner, weaponid)
}

public CurrentWeapon(id)
{
replace_weapon_models(id, read_data(2))

if(read_data(2) != CSW_M249 || !g_has_m134ex[id])
return

static Float:iSpeed
if(g_has_m134ex[id])
iSpeed = get_pcvar_float(cvar_spd_m134ex)

static weapon[32],Ent
get_weaponname(read_data(2),weapon,31)
Ent = find_ent_by_owner(-1,weapon,id)
if(Ent)
{
static Float:Delay
Delay = get_pdata_float( Ent, 46, 4) * iSpeed
if (Delay > 0.0)
{
set_pdata_float(Ent, 46, Delay, 4)
}
}
}

replace_weapon_models(id, weaponid)
{
switch (weaponid)
{
case CSW_M249:
{
if (zp_get_user_zombie(id))
return

if(g_has_m134ex[id])
{
if(zp_get_user_survivor(id)) 
set_pev(id, pev_viewmodel2, m134ex_s_V_MODEL)
else
set_pev(id, pev_viewmodel2, m134ex_V_MODEL)

set_pev(id, pev_weaponmodel2, m134ex_P_MODEL)

message_begin(MSG_ONE, get_user_msgid("CurWeapon"), {0,0,0}, id) 
write_byte(1) 
write_byte(CSW_KNIFE) 
write_byte(0) 
message_end()

if(oldweap[id] != CSW_M249) 
{
UTIL_PlayWeaponAnimation(id, m134ex_DRAW)
set_pdata_float(id, m_flNextAttack, m134ex_DRAW_TIME, PLAYER_LINUX_XTRA_OFF)
message_begin(MSG_ONE, gmsgWeaponList, _, id)
{
write_string("weapon_m134ex")
write_byte(3)
write_byte(200)
write_byte(-1)
write_byte(-1)
write_byte(0)
write_byte(4)
write_byte(CSW_M249)
}
message_end()

}
}
}
}
if(weaponid != CSW_M249)
{
remove_task(id)
g_can[id] = 0
g_afterreload[id] = 0
if(oldweap[id] == CSW_M249 && g_has_m134ex[id]) 
{
message_begin(MSG_ONE, get_user_msgid("CurWeapon"), {0,0,0}, id) 
write_byte(1) 
write_byte(CSW_KNIFE) 
write_byte(0) 
message_end()
}
}
oldweap[id] = weaponid
}

public fw_UpdateClientData_Post(Player, SendWeapons, CD_Handle)
{
if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_M249 || !g_has_m134ex[Player]))
return FMRES_IGNORED

set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.001)
return FMRES_HANDLED
}

public fw_CmdStart(id, uc_handle, seed)
{
if(!is_user_alive(id) || zp_get_user_zombie(id) || get_user_weapon(id) != CSW_M249 || !g_has_m134ex[id]) 
return PLUGIN_HANDLED

new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

if(flNextAttack > 0.0)
return PLUGIN_HANDLED

new szClip, szAmmo
get_user_weapon(id, szClip, szAmmo)

if(szClip <= 0)
return PLUGIN_HANDLED

if(!(pev(id, pev_oldbuttons) & IN_ATTACK))
{
remove_task(id)
set_pdata_float(id, m_flNextAttack, 0.0, PLAYER_LINUX_XTRA_OFF)
g_can[id] = 0
}
if((pev(id, pev_oldbuttons) & IN_ATTACK) && !(get_uc(uc_handle, UC_Buttons) & IN_ATTACK))
{
remove_task(id)
set_task(1.0,"user_can2",id)
g_can[id] = 3
set_pdata_float(id, m_flNextAttack, m134ex_DRAW_TIME, PLAYER_LINUX_XTRA_OFF)
UTIL_PlayWeaponAnimation(id,m134ex_FIRE_AFTER)
g_can[id] = 0
}
return PLUGIN_HANDLED
}

public fw_m134ex_PrimaryAttack(Weapon)
{
new Player = get_pdata_cbase(Weapon, 41, 4)

if (!g_has_m134ex[Player])
return HAM_IGNORED

g_IsInPrimaryAttack = 1

if(g_afterreload[Player])
{
g_afterreload[Player] = 0
return HAM_SUPERCEDE
}
new Float:flNextAttack = get_pdata_float(Player, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

if(flNextAttack > 0.0)
return HAM_IGNORED

new szClip, szAmmo
get_user_weapon(Player, szClip, szAmmo)

if(!g_can[Player] || g_can[Player] == 3)
{
if(szClip <= 0)
{
UTIL_PlayWeaponAnimation(Player,m134ex_FIRE_AFTER)
set_pdata_float(Player, m_flNextAttack, m134ex_DRAW_TIME, PLAYER_LINUX_XTRA_OFF)
return HAM_SUPERCEDE
}
set_task(1.0,"user_can",Player)
g_can[Player] = 1
set_pdata_float(Player, m_flNextAttack, 1.1, PLAYER_LINUX_XTRA_OFF)
UTIL_PlayWeaponAnimation(Player,m134ex_FIRE_READY)
return HAM_SUPERCEDE
}
pev(Player,pev_punchangle,cl_pushangle[Player])

g_clip_ammo[Player] = cs_get_weapon_ammo(Weapon)

return HAM_IGNORED
}

public fwPlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
if ((eventid != g_orig_event_m134ex) || !g_IsInPrimaryAttack)
return FMRES_IGNORED
if (!(1 <= invoker <= g_MaxPlayers))
return FMRES_IGNORED

playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
return FMRES_SUPERCEDE
}

public fw_m134ex_PrimaryAttack_Post(Weapon)
{
g_IsInPrimaryAttack = 0
new Player = get_pdata_cbase(Weapon, 41, 4)

if(!is_user_alive(Player))
return

new szClip, szAmmo
get_user_weapon(Player, szClip, szAmmo)

if(g_has_m134ex[Player])
{
if(g_can[Player] != 2)
return

if(szClip <= 0)
{
UTIL_PlayWeaponAnimation(Player,m134ex_FIRE_AFTER)
set_pdata_float(Player, m_flNextAttack, m134ex_DRAW_TIME, PLAYER_LINUX_XTRA_OFF)
}

if (!g_clip_ammo[Player])
return

static Float:g_punchangle[3]
g_punchangle[0] = -1 * get_pcvar_float(cvar_recoil_m134ex)
set_pev(Player, pev_punchangle, g_punchangle); 

emit_sound(Player, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
UTIL_PlayWeaponAnimation(Player, random_num(m134ex_SHOOT1,m134ex_SHOOT2))
if(get_pcvar_num(cvar_shells_m134ex)) make_shell(Player)
}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if (victim != attacker && is_user_connected(attacker))
{
if(get_user_weapon(attacker) == CSW_M249)
{
if(g_has_m134ex[attacker])
{
if(zp_get_user_survivor(attacker))
{
SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_m134ex_survivor))
}else {
SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_m134ex))
}
}
}
}
}

public message_DeathMsg(msg_id, msg_dest, id)
{
static szTruncatedWeapon[33], iAttacker, iVictim

get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))

iAttacker = get_msg_arg_int(1)
iVictim = get_msg_arg_int(2)

if(!is_user_connected(iAttacker) || iAttacker == iVictim)
return PLUGIN_CONTINUE

if(equal(szTruncatedWeapon, "m249") && get_user_weapon(iAttacker) == CSW_M249)
{
if(g_has_m134ex[iAttacker])
set_msg_arg_string(4, "m249")
}
return PLUGIN_CONTINUE
}

stock fm_cs_get_current_weapon_ent(id)
{
return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX)
}

stock fm_cs_get_weapon_ent_owner(ent)
{
return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
}

stock UTIL_PlayWeaponAnimation(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()
}

public m134ex_ItemPostFrame(weapon_entity) 
{
new id = pev(weapon_entity, pev_owner)
if (!is_user_connected(id))
return HAM_IGNORED

if (!g_has_m134ex[id])
return HAM_IGNORED

new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

new iBpAmmo = cs_get_user_bpammo(id, CSW_M249)
new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

new fInReload = get_pdata_int(weapon_entity, m_fInReload, WEAP_LINUX_XTRA_OFF) 

if( fInReload && flNextAttack <= 0.0 )
{
new j = min(get_pcvar_num(cvar_clip_m134ex) - iClip, iBpAmmo)

set_pdata_int(weapon_entity, m_iClip, iClip + j, WEAP_LINUX_XTRA_OFF)
cs_set_user_bpammo(id, CSW_M249, iBpAmmo-j)

set_pdata_int(weapon_entity, m_fInReload, 0, WEAP_LINUX_XTRA_OFF)
fInReload = 0
g_can[id] = 0
}
return HAM_IGNORED
}

public m134ex_Reload(weapon_entity) 
{
new id = pev(weapon_entity, pev_owner)
if (!is_user_connected(id))
return HAM_IGNORED

if (!g_has_m134ex[id])
return HAM_IGNORED

g_m134ex_TmpClip[id] = -1

new iBpAmmo = cs_get_user_bpammo(id, CSW_M249)
new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

if (iBpAmmo <= 0)
return HAM_SUPERCEDE

if (iClip >= get_pcvar_num(cvar_clip_m134ex))
return HAM_SUPERCEDE

g_m134ex_TmpClip[id] = iClip

return HAM_IGNORED
}

public m134ex_Reload_Post(weapon_entity) 
{
new id = pev(weapon_entity, pev_owner)
if (!is_user_connected(id))
return HAM_IGNORED

if (!g_has_m134ex[id])
return HAM_IGNORED

if(zp_get_user_survivor(id) && get_pcvar_num(cvar_surv_m134ex))
return HAM_SUPERCEDE

new szClip, szAmmo
get_user_weapon(id, szClip, szAmmo)

if (szClip == get_pcvar_num(cvar_clip_m134ex))
return HAM_IGNORED

if (szAmmo <= 0)
return HAM_IGNORED

if (g_m134ex_TmpClip[id] == -1)
return HAM_IGNORED

set_pdata_int(weapon_entity, m_iClip, g_m134ex_TmpClip[id], WEAP_LINUX_XTRA_OFF)

set_pdata_float(weapon_entity, m_flTimeWeaponIdle, m134ex_RELOAD_TIME, WEAP_LINUX_XTRA_OFF)

set_pdata_float(id, m_flNextAttack, m134ex_RELOAD_TIME, PLAYER_LINUX_XTRA_OFF)

set_pdata_int(weapon_entity, m_fInReload, 1, WEAP_LINUX_XTRA_OFF)

UTIL_PlayWeaponAnimation(id, m134ex_RELOAD)

remove_task(id)
g_can[id] = 0
g_afterreload[id] = 1

return HAM_IGNORED
}

public make_shell(id)
{
static Float:origin[3], Float:origin2[3],  Float:vSrc[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]
static Float:OriginX[3]
pev(id, pev_v_angle, angles)
pev(id, pev_origin, OriginX)
engfunc(EngFunc_MakeVectors, angles)

static Float:v_forward2[3], Float:v_right2[3], Float:v_up2[3], Float:vSrc2[3]

global_get(glb_v_forward, v_forward)
global_get(glb_v_right, v_right)
global_get(glb_v_up, v_up)

global_get(glb_v_forward, v_forward2)
global_get(glb_v_right, v_right2)
global_get(glb_v_up, v_up2)

//m_pPlayer->GetGunPosition( ) = pev->origin + pev->view_ofs
pev(id, pev_origin, player_origin)
pev(id, pev_view_ofs, player_view_offset)
xs_vec_add(player_origin, player_view_offset, gun_position)

xs_vec_mul_scalar(v_forward, 10.0, v_forward)
xs_vec_mul_scalar(v_right, 3.0, v_right)
xs_vec_mul_scalar(v_up, -8.0, v_up)

xs_vec_mul_scalar(v_forward2, random_float(0.01, 10.0), v_forward2)
xs_vec_mul_scalar(v_right2, random_float(0.0, -2.5), v_right2)
xs_vec_mul_scalar(v_up2,-30.0, v_up2)

xs_vec_add(gun_position, v_forward, origin)
xs_vec_add(origin, v_right, origin)
xs_vec_add(origin, v_up, origin)

xs_vec_add(gun_position, v_forward2, origin2)
xs_vec_add(origin2, v_right2, origin2)
xs_vec_add(origin2, v_up2, origin2)

vSrc[0] = origin[0]
vSrc[1] = origin[1]
vSrc[2] = origin[2]

vSrc2[0] = origin2[0]
vSrc2[1] = origin2[1]
vSrc2[2] = origin2[2]

new ent = create_entity("info_target")
set_pev(ent, pev_classname, g_shellent)

engfunc(EngFunc_SetModel,ent, "models/DoNoR/shell.mdl")

set_pev(ent,pev_mins,Float:{-1.0,-1.0,0.0})
set_pev(ent,pev_maxs,Float:{1.0,1.0,1.0})
set_pev(ent,pev_size,Float:{-1.0,-1.0,0.0,1.0,1.0,1.0})
engfunc(EngFunc_SetSize,ent,Float:{-1.0,-1.0,0.0},Float:{1.0,1.0,1.0})

//set_pev(ent,pev_solid,SOLID_BBOX)
//set_pev(ent,pev_movetype,MOVETYPE_TOSS)

set_pev(ent, pev_origin, vSrc)

static Float:newangles[3]
pev(id,pev_angles,newangles)
set_pev(ent,pev_angles, newangles)

static Float:flVelocity [ 3 ]
get_speed_vector ( vSrc2, vSrc, random_float(100.0,150.0), flVelocity )
set_pev(ent,pev_velocity,flVelocity)

entity_set_float(ent, EV_FL_health, get_pcvar_float(cvar_shellshealth_m134ex))

entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.01) 

new angle = random_num(0,360)

message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY,_,id)
write_byte(TE_MODEL)
write_coord_f(OriginX[0])
write_coord_f(OriginX[1])
write_coord_f(OriginX[2])
write_coord_f(flVelocity[0])
write_coord_f(flVelocity[1])
write_coord_f(flVelocity[2])
write_angle(angle)
write_short(shell_mode)
write_byte(1)
write_byte(get_pcvar_num(cvar_shellshealth_m134ex) * 10)
message_end()

make_shell2(id)
}

public make_shell2(id)
{
static Float:origin[3], Float:origin2[3],  Float:vSrc[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]
static Float:OriginX[3]
pev(id, pev_v_angle, angles)
pev(id, pev_origin, OriginX)
engfunc(EngFunc_MakeVectors, angles)

static Float:v_forward2[3] , Float:v_right2[3],  Float:v_up2[3] , Float:vSrc2[3]

global_get(glb_v_forward, v_forward)
global_get(glb_v_right, v_right)
global_get(glb_v_up, v_up)

global_get(glb_v_forward, v_forward2)
global_get(glb_v_right, v_right2)
global_get(glb_v_up, v_up2)

//m_pPlayer->GetGunPosition( ) = pev->origin + pev->view_ofs
pev(id, pev_origin, player_origin)
pev(id, pev_view_ofs, player_view_offset)
xs_vec_add(player_origin, player_view_offset, gun_position)

xs_vec_mul_scalar(v_forward, 13.0, v_forward);
xs_vec_mul_scalar(v_right, random_float(-4.5,-6.0), v_right);
xs_vec_mul_scalar(v_up, -5.0, v_up); // -3.0

xs_vec_mul_scalar(v_forward2, 0.0, v_forward2);
xs_vec_mul_scalar(v_right2, 0.0, v_right2);
xs_vec_mul_scalar(v_up2, 0.0, v_up2);

xs_vec_add(gun_position, v_forward, origin)
xs_vec_add(origin, v_right, origin)
xs_vec_add(origin, v_up, origin)

xs_vec_add(gun_position, v_forward2, origin2)
xs_vec_add(origin2, v_right2, origin2)
xs_vec_add(origin2, v_up2, origin2)

vSrc[0] = origin[0]
vSrc[1] = origin[1]
vSrc[2] = origin[2]

vSrc2[0] = origin2[0]
vSrc2[1] = origin2[1]
vSrc2[2] = origin2[2]

new ent = create_entity("info_target")
set_pev(ent, pev_classname, g_shellent)

engfunc(EngFunc_SetModel,ent, "models/DoNoR/shell2.mdl")

set_pev(ent,pev_mins,Float:{-1.0,-1.0,0.0})
set_pev(ent,pev_maxs,Float:{1.0,1.0,1.0})
set_pev(ent,pev_size,Float:{-1.0,-1.0,0.0,1.0,1.0,1.0})
engfunc(EngFunc_SetSize,ent,Float:{-1.0,-1.0,0.0},Float:{1.0,1.0,1.0})

//set_pev(ent,pev_solid, SOLID_TRIGGER)
//set_pev(ent,pev_movetype, MOVETYPE_TOSS)

new angle = random_num(0,360)

set_pev(ent, pev_origin, vSrc)

static Float:newangles[3]
pev(id,pev_angles,newangles)
set_pev(ent,pev_angles, newangles)

static Float:flVelocity [ 3 ]
get_speed_vector ( vSrc2, vSrc, random_float(100.0, 200.0), flVelocity )
set_pev(ent,pev_velocity,flVelocity)

message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY,_,id)
write_byte(TE_MODEL)
write_coord_f(OriginX[0])
write_coord_f(OriginX[1])
write_coord_f(OriginX[2])
write_coord_f(flVelocity[0])
write_coord_f(flVelocity[1])
write_coord_f(flVelocity[2])
write_angle(angle)
write_short(shell_mode2)
write_byte(1)
write_byte(get_pcvar_num(cvar_shellshealth_m134ex) * 10)
message_end()

entity_set_float(ent, EV_FL_health, get_pcvar_float(cvar_shellshealth_m134ex))

entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.01) 
}

public think_shell(ent) 
{
if(!pev_valid(ent))
return

if(!(pev(ent,pev_flags) & FL_ONGROUND))
{
new Float:oldangles[3],Float:angles[3]
pev(ent,pev_angles,oldangles)
angles[0] = oldangles[0] + random_float(10.0,20.0)
angles[1] = oldangles[1] + random_float(10.0,20.0)
angles[2] = oldangles[2] + random_float(10.0,20.0)
set_pev(ent,pev_angles,angles)
}
entity_set_float(ent, EV_FL_health, entity_get_float(ent,EV_FL_health) - 10.0) 
entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.01) 
if(entity_get_float(ent,EV_FL_health) <= 0) remove_entity(ent)
}

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
} 

public client_PreThink(id)
{
if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_has_m134ex[id] || get_user_weapon(id) != CSW_M249)
return

new szClip, szAmmo
get_user_weapon(id, szClip, szAmmo)

if(szClip <= 0 && szAmmo <= 0)
g_can[id] = 0

set_hudmessage(200, 80, 0, 1.0, 0.98, 0, 0.1, 0.1,0.0,0.0)
show_hudmessage(id, "Ammo: %d / %d",szClip,szAmmo)
}

public fw_PlayerPreThink(id)
{
if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_has_m134ex[id] || get_user_weapon(id) != CSW_M249)
return

new szClip
get_user_weapon(id, szClip)

if(g_can[id]) set_pev(id, pev_maxspeed, get_pcvar_float(cvar_speedrunfire_m134ex))
if(!g_can[id] || szClip <= 0) set_pev(id, pev_maxspeed, get_pcvar_float(cvar_speedrun_m134ex))
}

stock drop_weapons(id, dropwhat)
{
static weapons[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) & PRIMARY_WEAPONS_BIT_SUM))
{
static wname[32]
get_weaponname(weaponid, wname, sizeof wname - 1)
engclient_cmd(id, "drop", wname)
}
}
}
zp_extra_compound_bow.sma

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <zombieplague>

#define PLUGIN "Compound Bow"
#define VERSION "1.0"
#define AUTHOR "Dias Pendragon"

#define V_MODEL "models/v_bow.mdl"
#define P_MODEL "models/p_bow.mdl"
#define P_MODEL_EMPTY "models/p_bow_empty.mdl"
#define W_MODEL "models/w_bow.mdl"

#define ARROW_MODEl "models/arrow.mdl"

new const WeaponSounds[7][] =
{
"weapons/bow_shoot1.wav",
"weapons/bow_charge_shoot1_empty.wav",
"weapons/bow_charge_shoot2.wav",
"weapons/bow_draw.wav",
"weapons/bow_charge_start1.wav",
"weapons/bow_charge_start2.wav",
"weapons/bow_charge_finish1.wav"
}

new const WeaponResources[3][] =
{
"sprites/weapon_bow.txt",
"sprites/640hud12_2.spr",
"sprites/640hud98_2.spr"
}

enum
{
BOW_ANIM_IDLE = 0,
BOW_ANIM_IDLE_EMPTY,
BOW_ANIM_SHOOT1, // 0.45
BOW_ANIM_SHOOT1_EMPTY,
BOW_ANIM_DRAW,
BOW_ANIM_DRAW_EMPTY,
BOW_ANIM_CHARGE_START, // 0.5
BOW_ANIM_CHARGE_FINISH, // 0.35
BOW_ANIM_CHARGE_IDLE1, // 0.35
BOW_ANIM_CHARGE_IDLE2, // 0.35
BOW_ANIM_CHARGE_SHOOT1, // 1.3
BOW_ANIM_CHARGE_SHOOT1_EMPTY, // 0.6
BOW_ANIM_CHARGE_SHOOT2, // 1.3
BOW_ANIM_CHARGE_SHOOT2_EMPTY // 0.6
}

#define CSW_BOW CSW_M4A1
#define weapon_bow "weapon_m4a1"
#define BOW_AMMOID 4

#define ARROW_DEFAULT 60
#define ARROW_CLASSNAME "arrow"
#define ARROW_SPEED 2000.0

#define TIME_DRAW 0.75
#define TIME_RELOADA 0.45
#define TIME_RELOADB 1.25
#define TIME_CHARGE 0.5

#define DAMAGE_A 70
#define DAMAGE_B 140

#define WEAPON_SECRETCODE 3102013 // Create Date
#define WEAPON_ANIMEXT "carbine"
#define WEAPON_OLDWMODEL "models/w_m4a1.mdl"

#define WL_NAME "weapon_bow"
#define WL_PRIAMMOID 4
#define WL_PRIAMMOMAX 60 // 30
#define WL_SECAMMOID -1
#define WL_SECAMMOIDMAX -1
#define WL_SLOTID 0
#define WL_NUMINSLOT 6
#define WL_FLAG 0

// MACROS
#define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
#define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
#define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))

enum
{
TEAM_T = 1,
TEAM_CT
}

enum
{
WEAPON_NONE = 0,
WEAPON_STARTCHARGING,
WEAPON_WAITCHARGING,
WEAPON_CHARGING,
WEAPON_FINISHCHARGING
}

new g_Had_CompoundBow, g_InTempingAttack, g_BowArrow[33], g_WeaponState[33], Float:g_TimeCharge[33]
new g_MsgCurWeapon, g_MsgAmmoX, g_MsgWeaponList
new g_SprId_LaserBeam, g_Extra_Compound_Bow

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)

register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")

register_think(ARROW_CLASSNAME, "fw_Think_Arrow")
register_touch(ARROW_CLASSNAME, "*", "fw_Touch_Arrow")

register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
register_forward(FM_CmdStart, "fw_CmdStart")
register_forward(FM_SetModel, "fw_SetModel")    
register_forward(FM_EmitSound, "fw_EmitSound")
register_forward(FM_TraceLine, "fw_TraceLine")
register_forward(FM_TraceHull, "fw_TraceHull")        

RegisterHam(Ham_Item_AddToPlayer, weapon_bow, "fw_Item_AddToPlayer_Post", 1)
RegisterHam(Ham_Item_Deploy, weapon_bow, "fw_Item_Deploy_Post", 1)
RegisterHam(Ham_Weapon_WeaponIdle, weapon_bow, "fw_Weapon_WeaponIdle_Post", 1)

g_MsgCurWeapon = get_user_msgid("CurWeapon")
g_MsgAmmoX = get_user_msgid("AmmoX")
g_MsgWeaponList = get_user_msgid("WeaponList")

g_Extra_Compound_Bow = zp_register_extra_item("Compound Bow", 0, ZP_TEAM_HUMAN)

register_clcmd(WL_NAME, "WeaponList_Hook")
}

public plugin_precache()
{
engfunc(EngFunc_PrecacheModel, V_MODEL)
engfunc(EngFunc_PrecacheModel, P_MODEL)
engfunc(EngFunc_PrecacheModel, P_MODEL_EMPTY)
engfunc(EngFunc_PrecacheModel, W_MODEL)
engfunc(EngFunc_PrecacheModel, ARROW_MODEl)

new i
for(i = 0; i < sizeof(WeaponSounds); i++)
engfunc(EngFunc_PrecacheSound, WeaponSounds[i])
for(i = 0; i < sizeof(WeaponResources); i++)
{
if(i == 0) engfunc(EngFunc_PrecacheGeneric, WeaponResources[i])
else engfunc(EngFunc_PrecacheModel, WeaponResources[i])
}

g_SprId_LaserBeam = engfunc(EngFunc_PrecacheModel, "sprites/laserbeam.spr")
}

public zp_extra_item_selected(id, item)
{
if(item == g_Extra_Compound_Bow)
{
Get_CompoundBow(id)
}
}

public zp_user_humanized_post(id, surv)
{
Get_CompoundBow(id)
}

public zp_user_infected_post(id)
{
UnSet_BitVar(g_Had_CompoundBow, id)
g_BowArrow[id] = 0
}

public Get_CompoundBow(id)
{
if(!is_user_alive(id))
return

Set_BitVar(g_Had_CompoundBow, id)
g_BowArrow[id] = ARROW_DEFAULT
g_WeaponState[id] = WEAPON_NONE

fm_give_item(id, weapon_bow)
UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])
}

public Remove_CompoundBow(id)
{
UnSet_BitVar(g_Had_CompoundBow, id)
g_BowArrow[id] = 0
}

public WeaponList_Hook(id)
{
engclient_cmd(id, weapon_bow)
return PLUGIN_HANDLED
}

public UpdateAmmo(id, CSWID, AmmoID, Ammo, BpAmmo)
{
message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
write_byte(1)
write_byte(CSWID)
write_byte(Ammo)
message_end()

message_begin(MSG_ONE_UNRELIABLE, g_MsgAmmoX, _, id)
write_byte(AmmoID)
write_byte(BpAmmo)
message_end()

cs_set_user_bpammo(id, CSWID, BpAmmo)
}

public Event_CurWeapon(id)
{
static CSWID; CSWID = read_data(2)
if(CSWID != CSW_BOW) return
if(!Get_BitVar(g_Had_CompoundBow, id)) return

UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])
}

public fw_Think_Arrow(Ent)
{
if(!pev_valid(Ent))
return
if(pev(Ent, pev_iuser4))
{
engfunc(EngFunc_RemoveEntity, Ent)
return
}
static Id; Id = pev(Ent, pev_iuser1)
if(!is_user_connected(Id))    
return

if(!pev(Ent, pev_iuser3))
{
if(entity_range(Ent, Id) < 250.0)
{
set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
return
}

message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(Ent)
write_short(g_SprId_LaserBeam)
write_byte(10)
write_byte(2)
write_byte(255)
write_byte(127)
write_byte(127)
write_byte(127)
message_end()

message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(Ent)
write_short(g_SprId_LaserBeam)
write_byte(10)
write_byte(2)
write_byte(255)
write_byte(255)
write_byte(255)
write_byte(127)
message_end()

set_pev(Ent, pev_iuser3, 1)
}

set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
}

public fw_Touch_Arrow(Ent, Id)
{
if(!pev_valid(Ent))
return
if(pev(Ent, pev_movetype) == MOVETYPE_NONE)
return

// Remove Ent
set_pev(Ent, pev_movetype, MOVETYPE_NONE)
set_pev(Ent, pev_solid, SOLID_NOT)

if(!is_user_alive(Id)) // Wall
{
set_pev(Ent, pev_iuser4, 1)
set_pev(Ent, pev_nextthink, get_gametime() + 3.0)

static Float:Origin[3]; pev(Ent, pev_origin, Origin)
MakeBulletDecal(Origin)
} else { // Player
static Attacker; Attacker = pev(Ent, pev_iuser1)
if(!is_user_connected(Attacker) || Attacker == Id)
{
engfunc(EngFunc_RemoveEntity, Ent)
return
}

do_attack(Attacker, Id, 0, float(DAMAGE_A) * 1.5)
engfunc(EngFunc_RemoveEntity, Ent)
}
}

public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
if(get_user_weapon(id) != CSW_BOW || !Get_BitVar(g_Had_CompoundBow, id))
return FMRES_IGNORED

set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001) 

return FMRES_HANDLED
}

public fw_CmdStart(id, uc_handle, seed)
{
if(get_user_weapon(id) != CSW_BOW || !Get_BitVar(g_Had_CompoundBow, id))
return

static CurButton; CurButton = get_uc(uc_handle, UC_Buttons)
if(CurButton & IN_ATTACK)
{
CurButton &= ~IN_ATTACK
set_uc(uc_handle, UC_Buttons, CurButton)

Bow_NormalAttackHandle(id, 0)
}

static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BOW)
if(!pev_valid(Ent)) return

if(CurButton & IN_ATTACK2) 
{
CurButton &= ~IN_ATTACK2
set_uc(uc_handle, UC_Buttons, CurButton)

if(get_pdata_float(Ent, 46, 4) > 0.0 || get_pdata_float(Ent, 47, 4) > 0.0) 
return
if(!g_BowArrow[id])
return

switch(g_WeaponState[id])
{
case WEAPON_NONE: 
{
Set_Weapon_Anim(id, BOW_ANIM_CHARGE_START)
Set_Weapon_TimeIdle(id, CSW_BOW, 0.5)
Set_Player_NextAttack(id, 0.5)

g_WeaponState[id] = WEAPON_STARTCHARGING
}
case WEAPON_STARTCHARGING:
{
Set_Weapon_Anim(id, BOW_ANIM_CHARGE_IDLE1)
Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
Set_Player_NextAttack(id, 0.35)

g_TimeCharge[id] = get_gametime()
g_WeaponState[id] = WEAPON_WAITCHARGING
}
case WEAPON_WAITCHARGING:
{
Set_Weapon_Anim(id, BOW_ANIM_CHARGE_IDLE1)
Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
Set_Player_NextAttack(id, 0.35)

g_WeaponState[id] = WEAPON_WAITCHARGING

if(get_gametime() >= (g_TimeCharge[id] + TIME_CHARGE))
{
Set_Weapon_Anim(id, BOW_ANIM_CHARGE_FINISH)
Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
Set_Player_NextAttack(id, 0.35)

g_WeaponState[id] = WEAPON_FINISHCHARGING
}
}
case WEAPON_FINISHCHARGING:
{
Set_Weapon_Anim(id, BOW_ANIM_CHARGE_IDLE2)
Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
Set_Player_NextAttack(id, 0.35)

g_WeaponState[id] = WEAPON_FINISHCHARGING
}
}
} else {
static OldButton; OldButton = pev(id, pev_oldbuttons)
if(OldButton & IN_ATTACK2)
{
if(g_WeaponState[id] == WEAPON_WAITCHARGING)
{
set_pdata_float(id, 83, 0.0, 5)
Bow_NormalAttackHandle(id, 1)
} else if(g_WeaponState[id] == WEAPON_FINISHCHARGING) {
Bow_ChargeAttackHandle(id)
}
} else {
if(get_pdata_float(Ent, 46, 4) > 0.0 || get_pdata_float(Ent, 47, 4) > 0.0) 
return

if(g_WeaponState[id] == WEAPON_STARTCHARGING)
{
set_pdata_float(id, 83, 0.0, 5)
Bow_NormalAttackHandle(id, 1)
}

g_WeaponState[id] = WEAPON_NONE
}
}

return 
}

public fw_SetModel(entity, model[])
{
if(!pev_valid(entity))
return FMRES_IGNORED

static szClassName[33]
pev(entity, pev_classname, szClassName, charsmax(szClassName))

if(!equal(szClassName, "weaponbox"))
return FMRES_IGNORED

static id; id = pev(entity, pev_owner)

if(equal(model, WEAPON_OLDWMODEL))
{
static weapon
weapon = fm_find_ent_by_owner(-1, weapon_bow, entity)

if(!pev_valid(weapon))
return FMRES_IGNORED

if(Get_BitVar(g_Had_CompoundBow, id))
{
set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
set_pev(weapon, pev_iuser1, g_BowArrow[id])

engfunc(EngFunc_SetModel, entity, W_MODEL)
Remove_CompoundBow(id)

return FMRES_SUPERCEDE
}
}

return FMRES_IGNORED
}


public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
{
if(!is_user_connected(id))
return FMRES_IGNORED
if(!Get_BitVar(g_InTempingAttack, id))
return FMRES_IGNORED

if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
{
if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
return FMRES_SUPERCEDE
if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
{
if (sample[17] == 'w')  return FMRES_SUPERCEDE
else  return FMRES_SUPERCEDE
}
if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
return FMRES_SUPERCEDE;
}

return FMRES_IGNORED
}

public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
{
if(!is_user_alive(id))
return FMRES_IGNORED    
if(!Get_BitVar(g_InTempingAttack, id))
return FMRES_IGNORED

static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]

pev(id, pev_origin, fOrigin)
pev(id, pev_view_ofs, view_ofs)
xs_vec_add(fOrigin, view_ofs, vecStart)
pev(id, pev_v_angle, v_angle)

engfunc(EngFunc_MakeVectors, v_angle)
get_global_vector(GL_v_forward, v_forward)

xs_vec_mul_scalar(v_forward, 0.0, v_forward)
xs_vec_add(vecStart, v_forward, vecEnd)

engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)

return FMRES_SUPERCEDE
}

public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
{
if(!is_user_alive(id))
return FMRES_IGNORED    
if(!Get_BitVar(g_InTempingAttack, id))
return FMRES_IGNORED

static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]

pev(id, pev_origin, fOrigin)
pev(id, pev_view_ofs, view_ofs)
xs_vec_add(fOrigin, view_ofs, vecStart)
pev(id, pev_v_angle, v_angle)

engfunc(EngFunc_MakeVectors, v_angle)
get_global_vector(GL_v_forward, v_forward)

xs_vec_mul_scalar(v_forward, 0.0, v_forward)
xs_vec_add(vecStart, v_forward, vecEnd)

engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)

return FMRES_SUPERCEDE
}

public Bow_NormalAttackHandle(id, UnCharge)
{
if(get_pdata_float(id, 83, 5) > 0.0)
return
if(!g_BowArrow[id])
{
set_pdata_float(id, 83, 1.0, 5)
Set_Weapon_Anim(id, BOW_ANIM_IDLE_EMPTY)

return
}

g_BowArrow[id]--
UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])

Create_FakeAttack(id)

Set_Weapon_Anim(id, UnCharge ? BOW_ANIM_CHARGE_SHOOT1 : BOW_ANIM_SHOOT1)
emit_sound(id, CHAN_WEAPON, WeaponSounds[UnCharge ? 1 : 0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

Create_ArrowA(id)
Make_Push(id)

Set_Player_NextAttack(id, UnCharge ? TIME_RELOADB : TIME_RELOADA)
Set_Weapon_TimeIdle(id, CSW_BOW, UnCharge ? TIME_RELOADB : TIME_RELOADA)

g_WeaponState[id] = WEAPON_NONE
}

public Bow_ChargeAttackHandle(id)
{
if(!g_BowArrow[id])
{
set_pdata_float(id, 83, 1.0, 5)
Set_Weapon_Anim(id, BOW_ANIM_IDLE_EMPTY)

return
}

g_BowArrow[id]--
UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])

Create_FakeAttack(id)

Set_Weapon_Anim(id, BOW_ANIM_CHARGE_SHOOT2)
emit_sound(id, CHAN_WEAPON, WeaponSounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

ChargedShoot(id)
Make_Push(id)

Set_Player_NextAttack(id, TIME_RELOADB)
Set_Weapon_TimeIdle(id, CSW_BOW, TIME_RELOADB)    

g_WeaponState[id] = WEAPON_NONE
}

public ChargedShoot(id)
{
static Float:StartOrigin[3], Float:EndOrigin[3], Float:EndOrigin2[3]

Get_Position(id, 40.0, 0.0, 0.0, StartOrigin)
Get_Position(id, 4096.0, 0.0, 0.0, EndOrigin)

static TrResult; TrResult = create_tr2()
engfunc(EngFunc_TraceLine, StartOrigin, EndOrigin, IGNORE_MONSTERS, id, TrResult) 
get_tr2(TrResult, TR_vecEndPos, EndOrigin2)
free_tr2(TrResult)

message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
write_byte(TE_BEAMPOINTS)
engfunc(EngFunc_WriteCoord, StartOrigin[0])
engfunc(EngFunc_WriteCoord, StartOrigin[1])
engfunc(EngFunc_WriteCoord, StartOrigin[2])
engfunc(EngFunc_WriteCoord, EndOrigin2[0])
engfunc(EngFunc_WriteCoord, EndOrigin2[1])
engfunc(EngFunc_WriteCoord, EndOrigin2[2])
write_short(g_SprId_LaserBeam)    // sprite index
write_byte(0)    // starting frame
write_byte(0)    // frame rate in 0.1's
write_byte(20)    // life in 0.1's
write_byte(10)    // line width in 0.1's
write_byte(0)    // noise amplitude in 0.01's
write_byte(255)    // Red
write_byte(127)    // Green
write_byte(127)    // Blue
write_byte(127)    // brightness
write_byte(0)    // scroll speed in 0.1's
message_end()

message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
write_byte(TE_BEAMPOINTS)
engfunc(EngFunc_WriteCoord, StartOrigin[0])
engfunc(EngFunc_WriteCoord, StartOrigin[1])
engfunc(EngFunc_WriteCoord, StartOrigin[2])
engfunc(EngFunc_WriteCoord, EndOrigin2[0])
engfunc(EngFunc_WriteCoord, EndOrigin2[1])
engfunc(EngFunc_WriteCoord, EndOrigin2[2])
write_short(g_SprId_LaserBeam)    // sprite index
write_byte(0)    // starting frame
write_byte(0)    // frame rate in 0.1's
write_byte(20)    // life in 0.1's
write_byte(10)    // line width in 0.1's
write_byte(0)    // noise amplitude in 0.01's
write_byte(255)    // Red
write_byte(255)    // Green
write_byte(255)    // Blue
write_byte(127)    // brightness
write_byte(0)    // scroll speed in 0.1's
message_end()

ChargedDamage(id, StartOrigin, EndOrigin2)
}

public ChargedDamage(id, Float:Start[3], Float:End[3])
{
static TrResult; TrResult = create_tr2()

// Trace First Time
engfunc(EngFunc_TraceLine, Start, End, DONT_IGNORE_MONSTERS, id, TrResult) 
static pHit1; pHit1 = get_tr2(TrResult, TR_pHit)
static Float:End1[3]; get_tr2(TrResult, TR_vecEndPos, End1)

if(is_user_alive(pHit1)) 
{
do_attack(id, pHit1, 0, float(DAMAGE_B) * 1.5)
engfunc(EngFunc_TraceLine, End1, End, DONT_IGNORE_MONSTERS, pHit1, TrResult) 
} else engfunc(EngFunc_TraceLine, End1, End, DONT_IGNORE_MONSTERS, -1, TrResult) 

// Trace Second Time
static pHit2; pHit2 = get_tr2(TrResult, TR_pHit)
static Float:End2[3]; get_tr2(TrResult, TR_vecEndPos, End2)

if(is_user_alive(pHit2)) 
{
do_attack(id, pHit2, 0, float(DAMAGE_B) * 1.5)
engfunc(EngFunc_TraceLine, End2, End, DONT_IGNORE_MONSTERS, pHit2, TrResult) 
} else engfunc(EngFunc_TraceLine, End2, End, DONT_IGNORE_MONSTERS, -1, TrResult) 

// Trace Third Time
static pHit3; pHit3 = get_tr2(TrResult, TR_pHit)
static Float:End3[3]; get_tr2(TrResult, TR_vecEndPos, End3)

if(is_user_alive(pHit3)) 
{
do_attack(id, pHit3, 0, float(DAMAGE_B) * 1.5)
engfunc(EngFunc_TraceLine, End3, End, DONT_IGNORE_MONSTERS, pHit3, TrResult) 
} else engfunc(EngFunc_TraceLine, End3, End, DONT_IGNORE_MONSTERS, -1, TrResult) 

// Trace Fourth Time
static pHit4; pHit4 = get_tr2(TrResult, TR_pHit)
if(is_user_alive(pHit4)) do_attack(id, pHit4, 0, float(DAMAGE_B) * 1.5)

free_tr2(TrResult)
}

public Create_ArrowA(id)
{
static Float:StartOrigin[3], Float:EndOrigin[3], Float:Angles[3]

Get_Position(id, 40.0, 0.0, 0.0, StartOrigin)
Get_Position(id, 4096.0, 0.0, 0.0, EndOrigin)
pev(id, pev_v_angle, Angles)

Angles[0] *= -1

static Arrow; Arrow = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"))
if(!pev_valid(Arrow)) return

set_pev(Arrow, pev_movetype, MOVETYPE_FLY)
set_pev(Arrow, pev_iuser1, id) // Better than pev_owner
set_pev(Arrow, pev_iuser2, Get_SpecialTeam(id, cs_get_user_team(id)))
set_pev(Arrow, pev_iuser3, 0)
set_pev(Arrow, pev_iuser4, 0)

entity_set_string(Arrow, EV_SZ_classname, ARROW_CLASSNAME)
engfunc(EngFunc_SetModel, Arrow, ARROW_MODEl)
set_pev(Arrow, pev_mins, Float:{-1.0, -1.0, -1.0})
set_pev(Arrow, pev_maxs, Float:{1.0, 1.0, 1.0})
set_pev(Arrow, pev_origin, StartOrigin)
set_pev(Arrow, pev_angles, Angles)
set_pev(Arrow, pev_gravity, 0.01)
set_pev(Arrow, pev_solid, SOLID_BBOX)

set_pev(Arrow, pev_nextthink, get_gametime() + 0.1)

static Float:Velocity[3]
get_speed_vector(StartOrigin, EndOrigin, ARROW_SPEED, Velocity)
set_pev(Arrow, pev_velocity, Velocity)
}

public Create_FakeAttack(id)
{
static Ent; Ent = fm_get_user_weapon_entity(id, CSW_KNIFE)
if(!pev_valid(Ent)) return

Set_BitVar(g_InTempingAttack, id)
ExecuteHamB(Ham_Weapon_PrimaryAttack, Ent)

// Set Real Attack Anim
static iAnimDesired,  szAnimation[64]

formatex(szAnimation, charsmax(szAnimation), (pev(id, pev_flags) & FL_DUCKING) ? "crouch_shoot_%s" : "ref_shoot_%s", WEAPON_ANIMEXT)
if((iAnimDesired = lookup_sequence(id, szAnimation)) == -1)
iAnimDesired = 0

set_pev(id, pev_sequence, iAnimDesired)
UnSet_BitVar(g_InTempingAttack, id)
}

public Make_Push(id)
{
static Float:VirtualVec[3]
VirtualVec[0] = random_float(-1.0, -2.0)
VirtualVec[1] = random_float(1.0, -1.0)
VirtualVec[2] = 0.0    

set_pev(id, pev_punchangle, VirtualVec)        
}

public fw_Item_AddToPlayer_Post(Ent, Id)
{
if(pev(Ent, pev_impulse) == WEAPON_SECRETCODE)
{
Set_BitVar(g_Had_CompoundBow, Id)

g_BowArrow[Id] = pev(Ent, pev_iuser1)
UpdateAmmo(Id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[Id])

set_pev(Ent, pev_impulse, 0)
}            

g_WeaponState[Id] = WEAPON_NONE

message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, _, Id)
write_string((Get_BitVar(g_Had_CompoundBow, Id) ? WL_NAME : weapon_bow))
write_byte(WL_PRIAMMOID)
write_byte(WL_PRIAMMOMAX)
write_byte(WL_SECAMMOID)
write_byte(WL_SECAMMOIDMAX)
write_byte(WL_SLOTID)
write_byte(WL_NUMINSLOT)
write_byte(CSW_BOW)
write_byte(WL_FLAG)
message_end()
}

public fw_Item_Deploy_Post(Ent)
{
if(!pev_valid(Ent))
return

static Id; Id = get_pdata_cbase(Ent, 41, 4)
if(!Get_BitVar(g_Had_CompoundBow, Id))
return

set_pev(Id, pev_viewmodel2, V_MODEL)
set_pev(Id, pev_weaponmodel2, g_BowArrow[Id] ? P_MODEL : P_MODEL_EMPTY)

set_pdata_string(Id, (492) * 4, WEAPON_ANIMEXT, -1 , 20)

Set_Weapon_TimeIdle(Id, CSW_BOW, TIME_DRAW)
Set_Player_NextAttack(Id, TIME_DRAW)

Set_Weapon_Anim(Id, g_BowArrow[Id] ? BOW_ANIM_DRAW : BOW_ANIM_DRAW_EMPTY)
}

public fw_Weapon_WeaponIdle_Post(Ent)
{
if(!pev_valid(Ent))
return

static Id; Id = get_pdata_cbase(Ent, 41, 4)
if(!Get_BitVar(g_Had_CompoundBow, Id))
return

if(get_pdata_float(Ent, 48, 4) <= 0.1) 
{
Set_Weapon_Anim(Id, g_BowArrow[Id] ? BOW_ANIM_IDLE : BOW_ANIM_IDLE_EMPTY)
set_pdata_float(Ent, 48, 20.0, 4)
}

return
}

public Get_SpecialTeam(Ent, CsTeams:Team)
{
if(Team == CS_TEAM_T) return TEAM_T
else if(Team == CS_TEAM_CT) return TEAM_CT

return 0
}

public CsTeams:Get_ArrowTeam(Ent)
{
if(pev(Ent, pev_iuser2) == TEAM_T) return CS_TEAM_T
else if(pev(Ent, pev_iuser2) == TEAM_CT) return CS_TEAM_CT

return CS_TEAM_UNASSIGNED
}

stock MakeBulletDecal(Float:Origin[3])
{
// Find target
static decal; decal = random_num(41, 45)

// Put decal on "world" (a wall)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_WORLDDECAL)
engfunc(EngFunc_WriteCoord, Origin[0])
engfunc(EngFunc_WriteCoord, Origin[1])
engfunc(EngFunc_WriteCoord, Origin[2])
write_byte(decal)
message_end()
}

stock Set_Weapon_Anim(id, WeaponAnim)
{
set_pev(id, pev_weaponanim, WeaponAnim)

message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
write_byte(WeaponAnim)
write_byte(pev(id, pev_body))
message_end()
}

stock Set_Weapon_TimeIdle(id, WeaponId ,Float:TimeIdle)
{
static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
if(!pev_valid(entwpn)) 
return

set_pdata_float(entwpn, 46, TimeIdle, 4)
set_pdata_float(entwpn, 47, TimeIdle, 4)
set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
}

stock Set_Player_NextAttack(id, Float:nexttime)
{
set_pdata_float(id, 83, nexttime, 5)
}

stock Get_Position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]

pev(id, pev_origin, vOrigin)
pev(id, pev_view_ofs,vUp) //for player
xs_vec_add(vOrigin,vUp,vOrigin)
pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles

angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
angle_vector(vAngle,ANGLEVECTOR_UP,vUp)

vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}

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]
static Float:num; 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;
}

do_attack(Attacker, Victim, Inflictor, Float:fDamage)
{
fake_player_trace_attack(Attacker, Victim, fDamage)
fake_take_damage(Attacker, Victim, fDamage, Inflictor)
}

fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
{
// get fDirection
static Float:fAngles[3], Float:fDirection[3]
pev(iAttacker, pev_angles, fAngles)
angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)

// get fStart
static Float:fStart[3], Float:fViewOfs[3]
pev(iAttacker, pev_origin, fStart)
pev(iAttacker, pev_view_ofs, fViewOfs)
xs_vec_add(fViewOfs, fStart, fStart)

// get aimOrigin
static iAimOrigin[3], Float:fAimOrigin[3]
get_user_origin(iAttacker, iAimOrigin, 3)
IVecFVec(iAimOrigin, fAimOrigin)

// TraceLine from fStart to AimOrigin
static pentru; pentru = create_tr2() 
engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, pentru)
static pHit; pHit = get_tr2(pentru, TR_pHit)
static iHitgroup; iHitgroup = get_tr2(pentru, TR_iHitgroup)
static Float:fEndPos[3]
get_tr2(pentru, TR_vecEndPos, fEndPos)

// get target & body at aiming
static iTarget, iBody
get_user_aiming(iAttacker, iTarget, iBody)

// if aiming find target is iVictim then update iHitgroup
if (iTarget == iVictim)
{
iHitgroup = iBody
}

// if pentru find target not is iVictim
else if (pHit != iVictim)
{
// get AimOrigin in iVictim
static Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
pev(iVictim, pev_origin, fVicOrigin)
pev(iVictim, pev_view_ofs, fVicViewOfs) 
xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
fAimInVictim[2] = fStart[2]
fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )

// check aim in size of iVictim
static iAngleToVictim; iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
iAngleToVictim = abs(iAngleToVictim)
static Float:fDis; fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
static Float:fVicSize[3]
pev(iVictim, pev_size , fVicSize)
if ( fDis <= fVicSize[0] * 0.5 )
{
// TraceLine from fStart to aimOrigin in iVictim
static ptr2; ptr2 = create_tr2() 
engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
static pHit2; pHit2 = get_tr2(ptr2, TR_pHit)
static iHitgroup2; iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)

// if ptr2 find target is iVictim
if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
{
pHit = iVictim
iHitgroup = iHitgroup2
get_tr2(ptr2, TR_vecEndPos, fEndPos)
}

free_tr2(ptr2)
}

// if pHit still not is iVictim then set default HitGroup
if (pHit != iVictim)
{
// set default iHitgroup
iHitgroup = HIT_GENERIC

static ptr3; ptr3 = create_tr2() 
engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
get_tr2(ptr3, TR_vecEndPos, fEndPos)

// free ptr3
free_tr2(ptr3)
}
}

// set new Hit & Hitgroup & EndPos
set_tr2(pentru, TR_pHit, iVictim)
set_tr2(pentru, TR_iHitgroup, iHitgroup)
set_tr2(pentru, TR_vecEndPos, fEndPos)

// ExecuteHam
fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, pentru)

// free pentru
free_tr2(pentru)
}

stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
}

stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
}

stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
{
static Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
pev(id, pev_origin, fOrigin)
get_user_origin(id, iAimOrigin, 3) // end position from eyes
IVecFVec(iAimOrigin, fAimOrigin)
xs_vec_sub(fAimOrigin, fOrigin, fV1)

static Float:fV2[3]
xs_vec_sub(fTarget, fOrigin, fV2)

static iResult; iResult = get_angle_between_vectors(fV1, fV2)

if (TargetSize > 0.0)
{
static Float:fTan; fTan = TargetSize / get_distance_f(fOrigin, fTarget)
static fAngleToTargetSize; fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
}

return iResult
}

stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
{
static Float:fA1[3], Float:fA2[3]
engfunc(EngFunc_VecToAngles, fV1, fA1)
engfunc(EngFunc_VecToAngles, fV2, fA2)

static iResult; iResult = floatround(fA1[1] - fA2[1])
iResult = iResult % 360
iResult = (iResult > 180) ? (iResult - 360) : iResult

return iResult
}

Аватар
a4tech1999
Извън линия
Потребител
Потребител
Мнения: 20
Регистриран на: 21 Яну 2017, 02:25
Обратна връзка:

Re: [Заявка] как се прави ?

Мнение от a4tech1999 » 17 Фев 2017, 18:27

За ЗПА МИ ТРЯБВАТ

Добавено преди 6 минути 16 секунди:
Снайпера да е със лъка , а оцеляващия да е със
минигъна

Аватар
TryAgain
Извън линия
Потребител
Потребител
Мнения: 182
Регистриран на: 25 Яну 2017, 16:59
Се отблагодари: 1 път
Получена благодарност: 26 пъти

Re: [Заявка] как се прави ?

Мнение от TryAgain » 17 Фев 2017, 18:29

#include <zombieplague> -- > #include <zombie_plague_advance>

zpa_weapon_m134e.sma

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#include <xs>
#include <cstrike>
#include <zombie_plague_advance>

#define ENG_NULLENT         -1
#define EV_INT_WEAPONKEY   EV_INT_impulse
#define m134ex_WEAPONKEY    8567
#define MAX_PLAYERS        32
#define IsValidUser(%1) (1 <= %1 <= g_MaxPlayers)

const USE_STOPPED = 0
const OFFSET_ACTIVE_ITEM = 373
const OFFSET_WEAPONOWNER = 41
const OFFSET_LINUX = 5
const OFFSET_LINUX_WEAPONS = 4

#define WEAP_LINUX_XTRA_OFF      4
#define m_fKnown               44
#define m_flNextPrimaryAttack       46
#define m_flTimeWeaponIdle         48
#define m_iClip               51
#define m_fInReload            54
#define PLAYER_LINUX_XTRA_OFF   5
#define m_flNextAttack            83

#define m134ex_RELOAD_TIME   5.0
#define m134ex_DRAW_TIME    1.1
#define m134ex_SHOOT1      1
#define m134ex_SHOOT2      2
#define m134ex_RELOAD      3
#define m134ex_DRAW         4
#define m134ex_FIRE_READY   5
#define m134ex_FIRE_AFTER   6

#define write_coord_f(%1)   engfunc(EngFunc_WriteCoord,%1)

new const Fire_Sounds[][] = { "weapons/m134ex-1.wav" }
new const g_shellent [] = "m134ex_shell"

new m134ex_s_V_MODEL[64] = "models/DoNoR/v_m134ex_s.mdl"
new m134ex_V_MODEL[64] = "models/DoNoR/v_m134ex.mdl"
new m134ex_P_MODEL[64] = "models/DoNoR/p_m134ex.mdl"
new m134ex_W_MODEL[64] = "models/DoNoR/w_m134ex.mdl"

new const GUNSHOT_DECALS[] = { 41, 42, 43, 44, 45 }

new cvar_dmg_m134ex, cvar_dmg_m134ex_survivor, cvar_recoil_m134ex, g_itemid_m134ex, cvar_clip_m134ex, cvar_spd_m134ex, cvar_m134ex_ammo, cvar_surv_m134ex, cvar_speedrun_m134ex, cvar_speedrunfire_m134ex 
new g_MaxPlayers, g_orig_event_m134ex, g_IsInPrimaryAttack
new Float:cl_pushangle[MAX_PLAYERS + 1][3], m_iBlood[2]
new g_has_m134ex[33], g_clip_ammo[33], g_m134ex_TmpClip[33], oldweap[33], g_can[33], g_afterreload[33]
new cvar_shells_m134ex, cvar_shellshealth_m134ex
new gmsgWeaponList, shell_mode, shell_mode2

const PRIMARY_WEAPONS_BIT_SUM = 
(1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<
CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
"weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
"weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
"weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
"weapon_ak47", "weapon_knife", "weapon_p90" }

public plugin_init()
{
register_plugin("[ZP] Extra: m134ex", "1.0", "LARS-DAY[BR]EAKER")
register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
register_event("CurWeapon","CurrentWeapon","be","1=1")
RegisterHam(Ham_Item_AddToPlayer, "weapon_m249", "fw_m134ex_AddToPlayer")
RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m249", "fw_m134ex_PrimaryAttack")
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m249", "fw_m134ex_PrimaryAttack_Post", 1)
RegisterHam(Ham_Item_PostFrame, "weapon_m249", "m134ex_ItemPostFrame")
RegisterHam(Ham_Weapon_Reload, "weapon_m249", "m134ex_Reload")
RegisterHam(Ham_Weapon_Reload, "weapon_m249", "m134ex_Reload_Post", 1)
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
register_forward(FM_SetModel, "fw_SetModel")
register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
register_forward(FM_PlaybackEvent, "fwPlaybackEvent")
register_forward(FM_CmdStart, "fw_CmdStart")
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
register_think(g_shellent,"think_shell")

RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_wall", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_door", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_door_rotating", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_plat", "fw_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_rotating", "fw_TraceAttack", 1)

gmsgWeaponList = get_user_msgid("WeaponList")

cvar_dmg_m134ex = register_cvar("zp_m134ex_dmg", "2.56")
cvar_dmg_m134ex_survivor = register_cvar("zp_m134ex_dmg_survivor", "4.25")
cvar_recoil_m134ex = register_cvar("zp_m134ex_recoil", "2.5")
cvar_clip_m134ex = register_cvar("zp_m134ex_clip", "200")
cvar_spd_m134ex = register_cvar("zp_m134ex_spd", "0.75")
cvar_m134ex_ammo = register_cvar("zp_m134ex_ammo", "200")
cvar_surv_m134ex = register_cvar("zp_m134ex_givesurvivor", "0")
cvar_speedrunfire_m134ex = register_cvar("zp_m134ex_speedrunfire", "150.0")
cvar_speedrun_m134ex = register_cvar("zp_m134ex_speedrun", "200.0")
cvar_shells_m134ex = register_cvar("zp_m134ex_shells", "1")
cvar_shellshealth_m134ex = register_cvar("zp_m134ex_shellslife", "5000.0")

g_itemid_m134ex = zp_register_extra_item("M134ex", 61, ZP_TEAM_HUMAN)
g_MaxPlayers = get_maxplayers()
}

public plugin_precache()
{
precache_model(m134ex_s_V_MODEL)
precache_model(m134ex_V_MODEL)
precache_model(m134ex_P_MODEL)
precache_model(m134ex_W_MODEL)
for(new i = 0; i < sizeof Fire_Sounds; i++)
precache_sound(Fire_Sounds[i])   
precache_sound("weapons/m134ex_clipoff.wav")
precache_sound("weapons/m134ex_clipon.wav")
precache_sound("weapons/m134ex_pinpull.wav")
precache_sound("weapons/m134ex_spindown.wav") 
precache_sound("weapons/m134ex_spinup.wav") 
shell_mode = precache_model("models/DoNoR/shell.mdl")
shell_mode2 = precache_model("models/DoNoR/shell2.mdl")
precache_generic("sprites/weapon_m134ex.txt")
precache_generic("sprites/640hud7.spr")
precache_generic("sprites/640hud62.spr")
precache_generic("sprites/640hud63.spr")
m_iBlood[0] = precache_model("sprites/blood.spr")
m_iBlood[1] = precache_model("sprites/bloodspray.spr")
register_clcmd("weapon_m134ex", "weapon_hook")
register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
}

public weapon_hook(id) engclient_cmd(id, "weapon_m249")

public fw_TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
{
if(!is_user_alive(iAttacker))
return

new g_currentweapon = get_user_weapon(iAttacker)

if(g_currentweapon != CSW_M249) return

if(!g_has_m134ex[iAttacker]) return

static Float:flEnd[3]
get_tr2(ptr, TR_vecEndPos, flEnd)

if(iEnt)
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_DECAL)
write_coord_f(flEnd[0])
write_coord_f(flEnd[1])
write_coord_f(flEnd[2])
write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
write_short(iEnt)
message_end()
}
else
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_WORLDDECAL)
write_coord_f(flEnd[0])
write_coord_f(flEnd[1])
write_coord_f(flEnd[2])
write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
message_end()
}
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_GUNSHOTDECAL)
write_coord_f(flEnd[0])
write_coord_f(flEnd[1])
write_coord_f(flEnd[2])
write_short(iAttacker)
write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
message_end()
}

public zp_user_humanized_post(id, surv)
{
g_has_m134ex[id] = false
if(surv && get_pcvar_num(cvar_surv_m134ex))
give_m134ex(id)
}

public plugin_natives ()
{
register_native("give_weapon_m134ex", "native_give_weapon_add", 1)
}
public native_give_weapon_add(id)
{
give_m134ex(id)
}

public fwPrecacheEvent_Post(type, const name[])
{
if (equal("events/m249.sc", name))
{
g_orig_event_m134ex = get_orig_retval()
return FMRES_HANDLED
}
return FMRES_IGNORED
}

public client_connect(id)
{
g_has_m134ex[id] = false
}

public client_disconnect(id)
{
g_has_m134ex[id] = false
}

public zp_user_infected_post(id)
{
if (zp_get_user_zombie(id))
{
g_has_m134ex[id] = false
}
}

public user_can(id) 
{
g_can[id] = 2
}

public user_can2(id) 
{
g_can[id] = 0
}

public fw_SetModel(entity, model[])
{
if(!is_valid_ent(entity))
return FMRES_IGNORED

static szClassName[33]
entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))

if(!equal(szClassName, "weaponbox"))
return FMRES_IGNORED

static iOwner

iOwner = entity_get_edict(entity, EV_ENT_owner)

if(equal(model, "models/w_m249.mdl"))
{
static iStoredAugID

iStoredAugID = find_ent_by_owner(ENG_NULLENT, "weapon_m249", entity)

if(!is_valid_ent(iStoredAugID))
return FMRES_IGNORED

if(g_has_m134ex[iOwner])
{
entity_set_int(iStoredAugID, EV_INT_WEAPONKEY, m134ex_WEAPONKEY)

g_has_m134ex[iOwner] = false

entity_set_model(entity, m134ex_W_MODEL)

return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED
}

public give_m134ex(id)
{
drop_weapons(id, 1)
new iWep2 = give_item(id,"weapon_m249")
if( iWep2 > 0 )
{
cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_m134ex))
cs_set_user_bpammo (id, CSW_M249, get_pcvar_num(cvar_m134ex_ammo))   
UTIL_PlayWeaponAnimation(id, m134ex_DRAW)
set_pdata_float(id, m_flNextAttack, m134ex_DRAW_TIME, PLAYER_LINUX_XTRA_OFF)
}
g_has_m134ex[id] = true
message_begin(MSG_ONE, gmsgWeaponList, _, id)
{
write_string("weapon_m134ex")
write_byte(3)
write_byte(200)
write_byte(-1)
write_byte(-1)
write_byte(0)
write_byte(4)
write_byte(CSW_M249)
}
message_end()
}

public zp_extra_item_selected(id, itemid)
{
if(itemid != g_itemid_m134ex)
return

give_m134ex(id)
}

public fw_m134ex_AddToPlayer(m134ex, id)
{
if(!is_valid_ent(m134ex) || !is_user_connected(id))
return HAM_IGNORED

if(entity_get_int(m134ex, EV_INT_WEAPONKEY) == m134ex_WEAPONKEY)
{
g_has_m134ex[id] = true

entity_set_int(m134ex, EV_INT_WEAPONKEY, 0)

return HAM_HANDLED
}
return HAM_IGNORED
}

public fw_UseStationary_Post(entity, caller, activator, use_type)
{
if (use_type == USE_STOPPED && is_user_connected(caller))
replace_weapon_models(caller, get_user_weapon(caller))
}

public fw_Item_Deploy_Post(weapon_ent)
{
static owner
owner = fm_cs_get_weapon_ent_owner(weapon_ent)

static weaponid
weaponid = cs_get_weapon_id(weapon_ent)

replace_weapon_models(owner, weaponid)
}

public CurrentWeapon(id)
{
replace_weapon_models(id, read_data(2))

if(read_data(2) != CSW_M249 || !g_has_m134ex[id])
return

static Float:iSpeed
if(g_has_m134ex[id])
iSpeed = get_pcvar_float(cvar_spd_m134ex)

static weapon[32],Ent
get_weaponname(read_data(2),weapon,31)
Ent = find_ent_by_owner(-1,weapon,id)
if(Ent)
{
static Float:Delay
Delay = get_pdata_float( Ent, 46, 4) * iSpeed
if (Delay > 0.0)
{
set_pdata_float(Ent, 46, Delay, 4)
}
}
}

replace_weapon_models(id, weaponid)
{
switch (weaponid)
{
case CSW_M249:
{
if (zp_get_user_zombie(id))
return

if(g_has_m134ex[id])
{
if(zp_get_user_survivor(id)) 
set_pev(id, pev_viewmodel2, m134ex_s_V_MODEL)
else
set_pev(id, pev_viewmodel2, m134ex_V_MODEL)

set_pev(id, pev_weaponmodel2, m134ex_P_MODEL)

message_begin(MSG_ONE, get_user_msgid("CurWeapon"), {0,0,0}, id) 
write_byte(1) 
write_byte(CSW_KNIFE) 
write_byte(0) 
message_end()

if(oldweap[id] != CSW_M249) 
{
UTIL_PlayWeaponAnimation(id, m134ex_DRAW)
set_pdata_float(id, m_flNextAttack, m134ex_DRAW_TIME, PLAYER_LINUX_XTRA_OFF)
message_begin(MSG_ONE, gmsgWeaponList, _, id)
{
write_string("weapon_m134ex")
write_byte(3)
write_byte(200)
write_byte(-1)
write_byte(-1)
write_byte(0)
write_byte(4)
write_byte(CSW_M249)
}
message_end()

}
}
}
}
if(weaponid != CSW_M249)
{
remove_task(id)
g_can[id] = 0
g_afterreload[id] = 0
if(oldweap[id] == CSW_M249 && g_has_m134ex[id]) 
{
message_begin(MSG_ONE, get_user_msgid("CurWeapon"), {0,0,0}, id) 
write_byte(1) 
write_byte(CSW_KNIFE) 
write_byte(0) 
message_end()
}
}
oldweap[id] = weaponid
}

public fw_UpdateClientData_Post(Player, SendWeapons, CD_Handle)
{
if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_M249 || !g_has_m134ex[Player]))
return FMRES_IGNORED

set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.001)
return FMRES_HANDLED
}

public fw_CmdStart(id, uc_handle, seed)
{
if(!is_user_alive(id) || zp_get_user_zombie(id) || get_user_weapon(id) != CSW_M249 || !g_has_m134ex[id]) 
return PLUGIN_HANDLED

new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

if(flNextAttack > 0.0)
return PLUGIN_HANDLED

new szClip, szAmmo
get_user_weapon(id, szClip, szAmmo)

if(szClip <= 0)
return PLUGIN_HANDLED

if(!(pev(id, pev_oldbuttons) & IN_ATTACK))
{
remove_task(id)
set_pdata_float(id, m_flNextAttack, 0.0, PLAYER_LINUX_XTRA_OFF)
g_can[id] = 0
}
if((pev(id, pev_oldbuttons) & IN_ATTACK) && !(get_uc(uc_handle, UC_Buttons) & IN_ATTACK))
{
remove_task(id)
set_task(1.0,"user_can2",id)
g_can[id] = 3
set_pdata_float(id, m_flNextAttack, m134ex_DRAW_TIME, PLAYER_LINUX_XTRA_OFF)
UTIL_PlayWeaponAnimation(id,m134ex_FIRE_AFTER)
g_can[id] = 0
}
return PLUGIN_HANDLED
}

public fw_m134ex_PrimaryAttack(Weapon)
{
new Player = get_pdata_cbase(Weapon, 41, 4)

if (!g_has_m134ex[Player])
return HAM_IGNORED

g_IsInPrimaryAttack = 1

if(g_afterreload[Player])
{
g_afterreload[Player] = 0
return HAM_SUPERCEDE
}
new Float:flNextAttack = get_pdata_float(Player, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

if(flNextAttack > 0.0)
return HAM_IGNORED

new szClip, szAmmo
get_user_weapon(Player, szClip, szAmmo)

if(!g_can[Player] || g_can[Player] == 3)
{
if(szClip <= 0)
{
UTIL_PlayWeaponAnimation(Player,m134ex_FIRE_AFTER)
set_pdata_float(Player, m_flNextAttack, m134ex_DRAW_TIME, PLAYER_LINUX_XTRA_OFF)
return HAM_SUPERCEDE
}
set_task(1.0,"user_can",Player)
g_can[Player] = 1
set_pdata_float(Player, m_flNextAttack, 1.1, PLAYER_LINUX_XTRA_OFF)
UTIL_PlayWeaponAnimation(Player,m134ex_FIRE_READY)
return HAM_SUPERCEDE
}
pev(Player,pev_punchangle,cl_pushangle[Player])

g_clip_ammo[Player] = cs_get_weapon_ammo(Weapon)

return HAM_IGNORED
}

public fwPlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
if ((eventid != g_orig_event_m134ex) || !g_IsInPrimaryAttack)
return FMRES_IGNORED
if (!(1 <= invoker <= g_MaxPlayers))
return FMRES_IGNORED

playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
return FMRES_SUPERCEDE
}

public fw_m134ex_PrimaryAttack_Post(Weapon)
{
g_IsInPrimaryAttack = 0
new Player = get_pdata_cbase(Weapon, 41, 4)

if(!is_user_alive(Player))
return

new szClip, szAmmo
get_user_weapon(Player, szClip, szAmmo)

if(g_has_m134ex[Player])
{
if(g_can[Player] != 2)
return

if(szClip <= 0)
{
UTIL_PlayWeaponAnimation(Player,m134ex_FIRE_AFTER)
set_pdata_float(Player, m_flNextAttack, m134ex_DRAW_TIME, PLAYER_LINUX_XTRA_OFF)
}

if (!g_clip_ammo[Player])
return

static Float:g_punchangle[3]
g_punchangle[0] = -1 * get_pcvar_float(cvar_recoil_m134ex)
set_pev(Player, pev_punchangle, g_punchangle); 

emit_sound(Player, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
UTIL_PlayWeaponAnimation(Player, random_num(m134ex_SHOOT1,m134ex_SHOOT2))
if(get_pcvar_num(cvar_shells_m134ex)) make_shell(Player)
}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if (victim != attacker && is_user_connected(attacker))
{
if(get_user_weapon(attacker) == CSW_M249)
{
if(g_has_m134ex[attacker])
{
if(zp_get_user_survivor(attacker))
{
SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_m134ex_survivor))
}else {
SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_m134ex))
}
}
}
}
}

public message_DeathMsg(msg_id, msg_dest, id)
{
static szTruncatedWeapon[33], iAttacker, iVictim

get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))

iAttacker = get_msg_arg_int(1)
iVictim = get_msg_arg_int(2)

if(!is_user_connected(iAttacker) || iAttacker == iVictim)
return PLUGIN_CONTINUE

if(equal(szTruncatedWeapon, "m249") && get_user_weapon(iAttacker) == CSW_M249)
{
if(g_has_m134ex[iAttacker])
set_msg_arg_string(4, "m249")
}
return PLUGIN_CONTINUE
}

stock fm_cs_get_current_weapon_ent(id)
{
return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX)
}

stock fm_cs_get_weapon_ent_owner(ent)
{
return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
}

stock UTIL_PlayWeaponAnimation(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()
}

public m134ex_ItemPostFrame(weapon_entity) 
{
new id = pev(weapon_entity, pev_owner)
if (!is_user_connected(id))
return HAM_IGNORED

if (!g_has_m134ex[id])
return HAM_IGNORED

new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

new iBpAmmo = cs_get_user_bpammo(id, CSW_M249)
new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

new fInReload = get_pdata_int(weapon_entity, m_fInReload, WEAP_LINUX_XTRA_OFF) 

if( fInReload && flNextAttack <= 0.0 )
{
new j = min(get_pcvar_num(cvar_clip_m134ex) - iClip, iBpAmmo)

set_pdata_int(weapon_entity, m_iClip, iClip + j, WEAP_LINUX_XTRA_OFF)
cs_set_user_bpammo(id, CSW_M249, iBpAmmo-j)

set_pdata_int(weapon_entity, m_fInReload, 0, WEAP_LINUX_XTRA_OFF)
fInReload = 0
g_can[id] = 0
}
return HAM_IGNORED
}

public m134ex_Reload(weapon_entity) 
{
new id = pev(weapon_entity, pev_owner)
if (!is_user_connected(id))
return HAM_IGNORED

if (!g_has_m134ex[id])
return HAM_IGNORED

g_m134ex_TmpClip[id] = -1

new iBpAmmo = cs_get_user_bpammo(id, CSW_M249)
new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

if (iBpAmmo <= 0)
return HAM_SUPERCEDE

if (iClip >= get_pcvar_num(cvar_clip_m134ex))
return HAM_SUPERCEDE

g_m134ex_TmpClip[id] = iClip

return HAM_IGNORED
}

public m134ex_Reload_Post(weapon_entity) 
{
new id = pev(weapon_entity, pev_owner)
if (!is_user_connected(id))
return HAM_IGNORED

if (!g_has_m134ex[id])
return HAM_IGNORED

if(zp_get_user_survivor(id) && get_pcvar_num(cvar_surv_m134ex))
return HAM_SUPERCEDE

new szClip, szAmmo
get_user_weapon(id, szClip, szAmmo)

if (szClip == get_pcvar_num(cvar_clip_m134ex))
return HAM_IGNORED

if (szAmmo <= 0)
return HAM_IGNORED

if (g_m134ex_TmpClip[id] == -1)
return HAM_IGNORED

set_pdata_int(weapon_entity, m_iClip, g_m134ex_TmpClip[id], WEAP_LINUX_XTRA_OFF)

set_pdata_float(weapon_entity, m_flTimeWeaponIdle, m134ex_RELOAD_TIME, WEAP_LINUX_XTRA_OFF)

set_pdata_float(id, m_flNextAttack, m134ex_RELOAD_TIME, PLAYER_LINUX_XTRA_OFF)

set_pdata_int(weapon_entity, m_fInReload, 1, WEAP_LINUX_XTRA_OFF)

UTIL_PlayWeaponAnimation(id, m134ex_RELOAD)

remove_task(id)
g_can[id] = 0
g_afterreload[id] = 1

return HAM_IGNORED
}

public make_shell(id)
{
static Float:origin[3], Float:origin2[3],  Float:vSrc[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]
static Float:OriginX[3]
pev(id, pev_v_angle, angles)
pev(id, pev_origin, OriginX)
engfunc(EngFunc_MakeVectors, angles)

static Float:v_forward2[3], Float:v_right2[3], Float:v_up2[3], Float:vSrc2[3]

global_get(glb_v_forward, v_forward)
global_get(glb_v_right, v_right)
global_get(glb_v_up, v_up)

global_get(glb_v_forward, v_forward2)
global_get(glb_v_right, v_right2)
global_get(glb_v_up, v_up2)

//m_pPlayer->GetGunPosition( ) = pev->origin + pev->view_ofs
pev(id, pev_origin, player_origin)
pev(id, pev_view_ofs, player_view_offset)
xs_vec_add(player_origin, player_view_offset, gun_position)

xs_vec_mul_scalar(v_forward, 10.0, v_forward)
xs_vec_mul_scalar(v_right, 3.0, v_right)
xs_vec_mul_scalar(v_up, -8.0, v_up)

xs_vec_mul_scalar(v_forward2, random_float(0.01, 10.0), v_forward2)
xs_vec_mul_scalar(v_right2, random_float(0.0, -2.5), v_right2)
xs_vec_mul_scalar(v_up2,-30.0, v_up2)

xs_vec_add(gun_position, v_forward, origin)
xs_vec_add(origin, v_right, origin)
xs_vec_add(origin, v_up, origin)

xs_vec_add(gun_position, v_forward2, origin2)
xs_vec_add(origin2, v_right2, origin2)
xs_vec_add(origin2, v_up2, origin2)

vSrc[0] = origin[0]
vSrc[1] = origin[1]
vSrc[2] = origin[2]

vSrc2[0] = origin2[0]
vSrc2[1] = origin2[1]
vSrc2[2] = origin2[2]

new ent = create_entity("info_target")
set_pev(ent, pev_classname, g_shellent)

engfunc(EngFunc_SetModel,ent, "models/DoNoR/shell.mdl")

set_pev(ent,pev_mins,Float:{-1.0,-1.0,0.0})
set_pev(ent,pev_maxs,Float:{1.0,1.0,1.0})
set_pev(ent,pev_size,Float:{-1.0,-1.0,0.0,1.0,1.0,1.0})
engfunc(EngFunc_SetSize,ent,Float:{-1.0,-1.0,0.0},Float:{1.0,1.0,1.0})

//set_pev(ent,pev_solid,SOLID_BBOX)
//set_pev(ent,pev_movetype,MOVETYPE_TOSS)

set_pev(ent, pev_origin, vSrc)

static Float:newangles[3]
pev(id,pev_angles,newangles)
set_pev(ent,pev_angles, newangles)

static Float:flVelocity [ 3 ]
get_speed_vector ( vSrc2, vSrc, random_float(100.0,150.0), flVelocity )
set_pev(ent,pev_velocity,flVelocity)

entity_set_float(ent, EV_FL_health, get_pcvar_float(cvar_shellshealth_m134ex))

entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.01) 

new angle = random_num(0,360)

message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY,_,id)
write_byte(TE_MODEL)
write_coord_f(OriginX[0])
write_coord_f(OriginX[1])
write_coord_f(OriginX[2])
write_coord_f(flVelocity[0])
write_coord_f(flVelocity[1])
write_coord_f(flVelocity[2])
write_angle(angle)
write_short(shell_mode)
write_byte(1)
write_byte(get_pcvar_num(cvar_shellshealth_m134ex) * 10)
message_end()

make_shell2(id)
}

public make_shell2(id)
{
static Float:origin[3], Float:origin2[3],  Float:vSrc[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]
static Float:OriginX[3]
pev(id, pev_v_angle, angles)
pev(id, pev_origin, OriginX)
engfunc(EngFunc_MakeVectors, angles)

static Float:v_forward2[3] , Float:v_right2[3],  Float:v_up2[3] , Float:vSrc2[3]

global_get(glb_v_forward, v_forward)
global_get(glb_v_right, v_right)
global_get(glb_v_up, v_up)

global_get(glb_v_forward, v_forward2)
global_get(glb_v_right, v_right2)
global_get(glb_v_up, v_up2)

//m_pPlayer->GetGunPosition( ) = pev->origin + pev->view_ofs
pev(id, pev_origin, player_origin)
pev(id, pev_view_ofs, player_view_offset)
xs_vec_add(player_origin, player_view_offset, gun_position)

xs_vec_mul_scalar(v_forward, 13.0, v_forward);
xs_vec_mul_scalar(v_right, random_float(-4.5,-6.0), v_right);
xs_vec_mul_scalar(v_up, -5.0, v_up); // -3.0

xs_vec_mul_scalar(v_forward2, 0.0, v_forward2);
xs_vec_mul_scalar(v_right2, 0.0, v_right2);
xs_vec_mul_scalar(v_up2, 0.0, v_up2);

xs_vec_add(gun_position, v_forward, origin)
xs_vec_add(origin, v_right, origin)
xs_vec_add(origin, v_up, origin)

xs_vec_add(gun_position, v_forward2, origin2)
xs_vec_add(origin2, v_right2, origin2)
xs_vec_add(origin2, v_up2, origin2)

vSrc[0] = origin[0]
vSrc[1] = origin[1]
vSrc[2] = origin[2]

vSrc2[0] = origin2[0]
vSrc2[1] = origin2[1]
vSrc2[2] = origin2[2]

new ent = create_entity("info_target")
set_pev(ent, pev_classname, g_shellent)

engfunc(EngFunc_SetModel,ent, "models/DoNoR/shell2.mdl")

set_pev(ent,pev_mins,Float:{-1.0,-1.0,0.0})
set_pev(ent,pev_maxs,Float:{1.0,1.0,1.0})
set_pev(ent,pev_size,Float:{-1.0,-1.0,0.0,1.0,1.0,1.0})
engfunc(EngFunc_SetSize,ent,Float:{-1.0,-1.0,0.0},Float:{1.0,1.0,1.0})

//set_pev(ent,pev_solid, SOLID_TRIGGER)
//set_pev(ent,pev_movetype, MOVETYPE_TOSS)

new angle = random_num(0,360)

set_pev(ent, pev_origin, vSrc)

static Float:newangles[3]
pev(id,pev_angles,newangles)
set_pev(ent,pev_angles, newangles)

static Float:flVelocity [ 3 ]
get_speed_vector ( vSrc2, vSrc, random_float(100.0, 200.0), flVelocity )
set_pev(ent,pev_velocity,flVelocity)

message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY,_,id)
write_byte(TE_MODEL)
write_coord_f(OriginX[0])
write_coord_f(OriginX[1])
write_coord_f(OriginX[2])
write_coord_f(flVelocity[0])
write_coord_f(flVelocity[1])
write_coord_f(flVelocity[2])
write_angle(angle)
write_short(shell_mode2)
write_byte(1)
write_byte(get_pcvar_num(cvar_shellshealth_m134ex) * 10)
message_end()

entity_set_float(ent, EV_FL_health, get_pcvar_float(cvar_shellshealth_m134ex))

entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.01) 
}

public think_shell(ent) 
{
if(!pev_valid(ent))
return

if(!(pev(ent,pev_flags) & FL_ONGROUND))
{
new Float:oldangles[3],Float:angles[3]
pev(ent,pev_angles,oldangles)
angles[0] = oldangles[0] + random_float(10.0,20.0)
angles[1] = oldangles[1] + random_float(10.0,20.0)
angles[2] = oldangles[2] + random_float(10.0,20.0)
set_pev(ent,pev_angles,angles)
}
entity_set_float(ent, EV_FL_health, entity_get_float(ent,EV_FL_health) - 10.0) 
entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.01) 
if(entity_get_float(ent,EV_FL_health) <= 0) remove_entity(ent)
}

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
} 

public client_PreThink(id)
{
if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_has_m134ex[id] || get_user_weapon(id) != CSW_M249)
return

new szClip, szAmmo
get_user_weapon(id, szClip, szAmmo)

if(szClip <= 0 && szAmmo <= 0)
g_can[id] = 0

set_hudmessage(200, 80, 0, 1.0, 0.98, 0, 0.1, 0.1,0.0,0.0)
show_hudmessage(id, "Ammo: %d / %d",szClip,szAmmo)
}

public fw_PlayerPreThink(id)
{
if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_has_m134ex[id] || get_user_weapon(id) != CSW_M249)
return

new szClip
get_user_weapon(id, szClip)

if(g_can[id]) set_pev(id, pev_maxspeed, get_pcvar_float(cvar_speedrunfire_m134ex))
if(!g_can[id] || szClip <= 0) set_pev(id, pev_maxspeed, get_pcvar_float(cvar_speedrun_m134ex))
}

stock drop_weapons(id, dropwhat)
{
static weapons[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) & PRIMARY_WEAPONS_BIT_SUM))
{
static wname[32]
get_weaponname(weaponid, wname, sizeof wname - 1)
engclient_cmd(id, "drop", wname)
}
}
}
zpa_extra_compound_bow.sma

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <zombie_plague_advance>

#define PLUGIN "Compound Bow"
#define VERSION "1.0"
#define AUTHOR "Dias Pendragon"

#define V_MODEL "models/v_bow.mdl"
#define P_MODEL "models/p_bow.mdl"
#define P_MODEL_EMPTY "models/p_bow_empty.mdl"
#define W_MODEL "models/w_bow.mdl"

#define ARROW_MODEl "models/arrow.mdl"

new const WeaponSounds[7][] =
{
"weapons/bow_shoot1.wav",
"weapons/bow_charge_shoot1_empty.wav",
"weapons/bow_charge_shoot2.wav",
"weapons/bow_draw.wav",
"weapons/bow_charge_start1.wav",
"weapons/bow_charge_start2.wav",
"weapons/bow_charge_finish1.wav"
}

new const WeaponResources[3][] =
{
"sprites/weapon_bow.txt",
"sprites/640hud12_2.spr",
"sprites/640hud98_2.spr"
}

enum
{
BOW_ANIM_IDLE = 0,
BOW_ANIM_IDLE_EMPTY,
BOW_ANIM_SHOOT1, // 0.45
BOW_ANIM_SHOOT1_EMPTY,
BOW_ANIM_DRAW,
BOW_ANIM_DRAW_EMPTY,
BOW_ANIM_CHARGE_START, // 0.5
BOW_ANIM_CHARGE_FINISH, // 0.35
BOW_ANIM_CHARGE_IDLE1, // 0.35
BOW_ANIM_CHARGE_IDLE2, // 0.35
BOW_ANIM_CHARGE_SHOOT1, // 1.3
BOW_ANIM_CHARGE_SHOOT1_EMPTY, // 0.6
BOW_ANIM_CHARGE_SHOOT2, // 1.3
BOW_ANIM_CHARGE_SHOOT2_EMPTY // 0.6
}

#define CSW_BOW CSW_M4A1
#define weapon_bow "weapon_m4a1"
#define BOW_AMMOID 4

#define ARROW_DEFAULT 60
#define ARROW_CLASSNAME "arrow"
#define ARROW_SPEED 2000.0

#define TIME_DRAW 0.75
#define TIME_RELOADA 0.45
#define TIME_RELOADB 1.25
#define TIME_CHARGE 0.5

#define DAMAGE_A 70
#define DAMAGE_B 140

#define WEAPON_SECRETCODE 3102013 // Create Date
#define WEAPON_ANIMEXT "carbine"
#define WEAPON_OLDWMODEL "models/w_m4a1.mdl"

#define WL_NAME "weapon_bow"
#define WL_PRIAMMOID 4
#define WL_PRIAMMOMAX 60 // 30
#define WL_SECAMMOID -1
#define WL_SECAMMOIDMAX -1
#define WL_SLOTID 0
#define WL_NUMINSLOT 6
#define WL_FLAG 0

// MACROS
#define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
#define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
#define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))

enum
{
TEAM_T = 1,
TEAM_CT
}

enum
{
WEAPON_NONE = 0,
WEAPON_STARTCHARGING,
WEAPON_WAITCHARGING,
WEAPON_CHARGING,
WEAPON_FINISHCHARGING
}

new g_Had_CompoundBow, g_InTempingAttack, g_BowArrow[33], g_WeaponState[33], Float:g_TimeCharge[33]
new g_MsgCurWeapon, g_MsgAmmoX, g_MsgWeaponList
new g_SprId_LaserBeam, g_Extra_Compound_Bow

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)

register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")

register_think(ARROW_CLASSNAME, "fw_Think_Arrow")
register_touch(ARROW_CLASSNAME, "*", "fw_Touch_Arrow")

register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
register_forward(FM_CmdStart, "fw_CmdStart")
register_forward(FM_SetModel, "fw_SetModel")    
register_forward(FM_EmitSound, "fw_EmitSound")
register_forward(FM_TraceLine, "fw_TraceLine")
register_forward(FM_TraceHull, "fw_TraceHull")        

RegisterHam(Ham_Item_AddToPlayer, weapon_bow, "fw_Item_AddToPlayer_Post", 1)
RegisterHam(Ham_Item_Deploy, weapon_bow, "fw_Item_Deploy_Post", 1)
RegisterHam(Ham_Weapon_WeaponIdle, weapon_bow, "fw_Weapon_WeaponIdle_Post", 1)

g_MsgCurWeapon = get_user_msgid("CurWeapon")
g_MsgAmmoX = get_user_msgid("AmmoX")
g_MsgWeaponList = get_user_msgid("WeaponList")

g_Extra_Compound_Bow = zp_register_extra_item("Compound Bow", 0, ZP_TEAM_HUMAN)

register_clcmd(WL_NAME, "WeaponList_Hook")
}

public plugin_precache()
{
engfunc(EngFunc_PrecacheModel, V_MODEL)
engfunc(EngFunc_PrecacheModel, P_MODEL)
engfunc(EngFunc_PrecacheModel, P_MODEL_EMPTY)
engfunc(EngFunc_PrecacheModel, W_MODEL)
engfunc(EngFunc_PrecacheModel, ARROW_MODEl)

new i
for(i = 0; i < sizeof(WeaponSounds); i++)
engfunc(EngFunc_PrecacheSound, WeaponSounds[i])
for(i = 0; i < sizeof(WeaponResources); i++)
{
if(i == 0) engfunc(EngFunc_PrecacheGeneric, WeaponResources[i])
else engfunc(EngFunc_PrecacheModel, WeaponResources[i])
}

g_SprId_LaserBeam = engfunc(EngFunc_PrecacheModel, "sprites/laserbeam.spr")
}

public zp_extra_item_selected(id, item)
{
if(item == g_Extra_Compound_Bow)
{
Get_CompoundBow(id)
}
}

public zp_user_humanized_post(id, surv)
{
Get_CompoundBow(id)
}

public zp_user_infected_post(id)
{
UnSet_BitVar(g_Had_CompoundBow, id)
g_BowArrow[id] = 0
}

public Get_CompoundBow(id)
{
if(!is_user_alive(id))
return

Set_BitVar(g_Had_CompoundBow, id)
g_BowArrow[id] = ARROW_DEFAULT
g_WeaponState[id] = WEAPON_NONE

fm_give_item(id, weapon_bow)
UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])
}

public Remove_CompoundBow(id)
{
UnSet_BitVar(g_Had_CompoundBow, id)
g_BowArrow[id] = 0
}

public WeaponList_Hook(id)
{
engclient_cmd(id, weapon_bow)
return PLUGIN_HANDLED
}

public UpdateAmmo(id, CSWID, AmmoID, Ammo, BpAmmo)
{
message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
write_byte(1)
write_byte(CSWID)
write_byte(Ammo)
message_end()

message_begin(MSG_ONE_UNRELIABLE, g_MsgAmmoX, _, id)
write_byte(AmmoID)
write_byte(BpAmmo)
message_end()

cs_set_user_bpammo(id, CSWID, BpAmmo)
}

public Event_CurWeapon(id)
{
static CSWID; CSWID = read_data(2)
if(CSWID != CSW_BOW) return
if(!Get_BitVar(g_Had_CompoundBow, id)) return

UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])
}

public fw_Think_Arrow(Ent)
{
if(!pev_valid(Ent))
return
if(pev(Ent, pev_iuser4))
{
engfunc(EngFunc_RemoveEntity, Ent)
return
}
static Id; Id = pev(Ent, pev_iuser1)
if(!is_user_connected(Id))    
return

if(!pev(Ent, pev_iuser3))
{
if(entity_range(Ent, Id) < 250.0)
{
set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
return
}

message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(Ent)
write_short(g_SprId_LaserBeam)
write_byte(10)
write_byte(2)
write_byte(255)
write_byte(127)
write_byte(127)
write_byte(127)
message_end()

message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(Ent)
write_short(g_SprId_LaserBeam)
write_byte(10)
write_byte(2)
write_byte(255)
write_byte(255)
write_byte(255)
write_byte(127)
message_end()

set_pev(Ent, pev_iuser3, 1)
}

set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
}

public fw_Touch_Arrow(Ent, Id)
{
if(!pev_valid(Ent))
return
if(pev(Ent, pev_movetype) == MOVETYPE_NONE)
return

// Remove Ent
set_pev(Ent, pev_movetype, MOVETYPE_NONE)
set_pev(Ent, pev_solid, SOLID_NOT)

if(!is_user_alive(Id)) // Wall
{
set_pev(Ent, pev_iuser4, 1)
set_pev(Ent, pev_nextthink, get_gametime() + 3.0)

static Float:Origin[3]; pev(Ent, pev_origin, Origin)
MakeBulletDecal(Origin)
} else { // Player
static Attacker; Attacker = pev(Ent, pev_iuser1)
if(!is_user_connected(Attacker) || Attacker == Id)
{
engfunc(EngFunc_RemoveEntity, Ent)
return
}

do_attack(Attacker, Id, 0, float(DAMAGE_A) * 1.5)
engfunc(EngFunc_RemoveEntity, Ent)
}
}

public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
if(get_user_weapon(id) != CSW_BOW || !Get_BitVar(g_Had_CompoundBow, id))
return FMRES_IGNORED

set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001) 

return FMRES_HANDLED
}

public fw_CmdStart(id, uc_handle, seed)
{
if(get_user_weapon(id) != CSW_BOW || !Get_BitVar(g_Had_CompoundBow, id))
return

static CurButton; CurButton = get_uc(uc_handle, UC_Buttons)
if(CurButton & IN_ATTACK)
{
CurButton &= ~IN_ATTACK
set_uc(uc_handle, UC_Buttons, CurButton)

Bow_NormalAttackHandle(id, 0)
}

static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BOW)
if(!pev_valid(Ent)) return

if(CurButton & IN_ATTACK2) 
{
CurButton &= ~IN_ATTACK2
set_uc(uc_handle, UC_Buttons, CurButton)

if(get_pdata_float(Ent, 46, 4) > 0.0 || get_pdata_float(Ent, 47, 4) > 0.0) 
return
if(!g_BowArrow[id])
return

switch(g_WeaponState[id])
{
case WEAPON_NONE: 
{
Set_Weapon_Anim(id, BOW_ANIM_CHARGE_START)
Set_Weapon_TimeIdle(id, CSW_BOW, 0.5)
Set_Player_NextAttack(id, 0.5)

g_WeaponState[id] = WEAPON_STARTCHARGING
}
case WEAPON_STARTCHARGING:
{
Set_Weapon_Anim(id, BOW_ANIM_CHARGE_IDLE1)
Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
Set_Player_NextAttack(id, 0.35)

g_TimeCharge[id] = get_gametime()
g_WeaponState[id] = WEAPON_WAITCHARGING
}
case WEAPON_WAITCHARGING:
{
Set_Weapon_Anim(id, BOW_ANIM_CHARGE_IDLE1)
Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
Set_Player_NextAttack(id, 0.35)

g_WeaponState[id] = WEAPON_WAITCHARGING

if(get_gametime() >= (g_TimeCharge[id] + TIME_CHARGE))
{
Set_Weapon_Anim(id, BOW_ANIM_CHARGE_FINISH)
Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
Set_Player_NextAttack(id, 0.35)

g_WeaponState[id] = WEAPON_FINISHCHARGING
}
}
case WEAPON_FINISHCHARGING:
{
Set_Weapon_Anim(id, BOW_ANIM_CHARGE_IDLE2)
Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
Set_Player_NextAttack(id, 0.35)

g_WeaponState[id] = WEAPON_FINISHCHARGING
}
}
} else {
static OldButton; OldButton = pev(id, pev_oldbuttons)
if(OldButton & IN_ATTACK2)
{
if(g_WeaponState[id] == WEAPON_WAITCHARGING)
{
set_pdata_float(id, 83, 0.0, 5)
Bow_NormalAttackHandle(id, 1)
} else if(g_WeaponState[id] == WEAPON_FINISHCHARGING) {
Bow_ChargeAttackHandle(id)
}
} else {
if(get_pdata_float(Ent, 46, 4) > 0.0 || get_pdata_float(Ent, 47, 4) > 0.0) 
return

if(g_WeaponState[id] == WEAPON_STARTCHARGING)
{
set_pdata_float(id, 83, 0.0, 5)
Bow_NormalAttackHandle(id, 1)
}

g_WeaponState[id] = WEAPON_NONE
}
}

return 
}

public fw_SetModel(entity, model[])
{
if(!pev_valid(entity))
return FMRES_IGNORED

static szClassName[33]
pev(entity, pev_classname, szClassName, charsmax(szClassName))

if(!equal(szClassName, "weaponbox"))
return FMRES_IGNORED

static id; id = pev(entity, pev_owner)

if(equal(model, WEAPON_OLDWMODEL))
{
static weapon
weapon = fm_find_ent_by_owner(-1, weapon_bow, entity)

if(!pev_valid(weapon))
return FMRES_IGNORED

if(Get_BitVar(g_Had_CompoundBow, id))
{
set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
set_pev(weapon, pev_iuser1, g_BowArrow[id])

engfunc(EngFunc_SetModel, entity, W_MODEL)
Remove_CompoundBow(id)

return FMRES_SUPERCEDE
}
}

return FMRES_IGNORED
}


public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
{
if(!is_user_connected(id))
return FMRES_IGNORED
if(!Get_BitVar(g_InTempingAttack, id))
return FMRES_IGNORED

if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
{
if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
return FMRES_SUPERCEDE
if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
{
if (sample[17] == 'w')  return FMRES_SUPERCEDE
else  return FMRES_SUPERCEDE
}
if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
return FMRES_SUPERCEDE;
}

return FMRES_IGNORED
}

public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
{
if(!is_user_alive(id))
return FMRES_IGNORED    
if(!Get_BitVar(g_InTempingAttack, id))
return FMRES_IGNORED

static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]

pev(id, pev_origin, fOrigin)
pev(id, pev_view_ofs, view_ofs)
xs_vec_add(fOrigin, view_ofs, vecStart)
pev(id, pev_v_angle, v_angle)

engfunc(EngFunc_MakeVectors, v_angle)
get_global_vector(GL_v_forward, v_forward)

xs_vec_mul_scalar(v_forward, 0.0, v_forward)
xs_vec_add(vecStart, v_forward, vecEnd)

engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)

return FMRES_SUPERCEDE
}

public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
{
if(!is_user_alive(id))
return FMRES_IGNORED    
if(!Get_BitVar(g_InTempingAttack, id))
return FMRES_IGNORED

static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]

pev(id, pev_origin, fOrigin)
pev(id, pev_view_ofs, view_ofs)
xs_vec_add(fOrigin, view_ofs, vecStart)
pev(id, pev_v_angle, v_angle)

engfunc(EngFunc_MakeVectors, v_angle)
get_global_vector(GL_v_forward, v_forward)

xs_vec_mul_scalar(v_forward, 0.0, v_forward)
xs_vec_add(vecStart, v_forward, vecEnd)

engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)

return FMRES_SUPERCEDE
}

public Bow_NormalAttackHandle(id, UnCharge)
{
if(get_pdata_float(id, 83, 5) > 0.0)
return
if(!g_BowArrow[id])
{
set_pdata_float(id, 83, 1.0, 5)
Set_Weapon_Anim(id, BOW_ANIM_IDLE_EMPTY)

return
}

g_BowArrow[id]--
UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])

Create_FakeAttack(id)

Set_Weapon_Anim(id, UnCharge ? BOW_ANIM_CHARGE_SHOOT1 : BOW_ANIM_SHOOT1)
emit_sound(id, CHAN_WEAPON, WeaponSounds[UnCharge ? 1 : 0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

Create_ArrowA(id)
Make_Push(id)

Set_Player_NextAttack(id, UnCharge ? TIME_RELOADB : TIME_RELOADA)
Set_Weapon_TimeIdle(id, CSW_BOW, UnCharge ? TIME_RELOADB : TIME_RELOADA)

g_WeaponState[id] = WEAPON_NONE
}

public Bow_ChargeAttackHandle(id)
{
if(!g_BowArrow[id])
{
set_pdata_float(id, 83, 1.0, 5)
Set_Weapon_Anim(id, BOW_ANIM_IDLE_EMPTY)

return
}

g_BowArrow[id]--
UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])

Create_FakeAttack(id)

Set_Weapon_Anim(id, BOW_ANIM_CHARGE_SHOOT2)
emit_sound(id, CHAN_WEAPON, WeaponSounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

ChargedShoot(id)
Make_Push(id)

Set_Player_NextAttack(id, TIME_RELOADB)
Set_Weapon_TimeIdle(id, CSW_BOW, TIME_RELOADB)    

g_WeaponState[id] = WEAPON_NONE
}

public ChargedShoot(id)
{
static Float:StartOrigin[3], Float:EndOrigin[3], Float:EndOrigin2[3]

Get_Position(id, 40.0, 0.0, 0.0, StartOrigin)
Get_Position(id, 4096.0, 0.0, 0.0, EndOrigin)

static TrResult; TrResult = create_tr2()
engfunc(EngFunc_TraceLine, StartOrigin, EndOrigin, IGNORE_MONSTERS, id, TrResult) 
get_tr2(TrResult, TR_vecEndPos, EndOrigin2)
free_tr2(TrResult)

message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
write_byte(TE_BEAMPOINTS)
engfunc(EngFunc_WriteCoord, StartOrigin[0])
engfunc(EngFunc_WriteCoord, StartOrigin[1])
engfunc(EngFunc_WriteCoord, StartOrigin[2])
engfunc(EngFunc_WriteCoord, EndOrigin2[0])
engfunc(EngFunc_WriteCoord, EndOrigin2[1])
engfunc(EngFunc_WriteCoord, EndOrigin2[2])
write_short(g_SprId_LaserBeam)    // sprite index
write_byte(0)    // starting frame
write_byte(0)    // frame rate in 0.1's
write_byte(20)    // life in 0.1's
write_byte(10)    // line width in 0.1's
write_byte(0)    // noise amplitude in 0.01's
write_byte(255)    // Red
write_byte(127)    // Green
write_byte(127)    // Blue
write_byte(127)    // brightness
write_byte(0)    // scroll speed in 0.1's
message_end()

message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
write_byte(TE_BEAMPOINTS)
engfunc(EngFunc_WriteCoord, StartOrigin[0])
engfunc(EngFunc_WriteCoord, StartOrigin[1])
engfunc(EngFunc_WriteCoord, StartOrigin[2])
engfunc(EngFunc_WriteCoord, EndOrigin2[0])
engfunc(EngFunc_WriteCoord, EndOrigin2[1])
engfunc(EngFunc_WriteCoord, EndOrigin2[2])
write_short(g_SprId_LaserBeam)    // sprite index
write_byte(0)    // starting frame
write_byte(0)    // frame rate in 0.1's
write_byte(20)    // life in 0.1's
write_byte(10)    // line width in 0.1's
write_byte(0)    // noise amplitude in 0.01's
write_byte(255)    // Red
write_byte(255)    // Green
write_byte(255)    // Blue
write_byte(127)    // brightness
write_byte(0)    // scroll speed in 0.1's
message_end()

ChargedDamage(id, StartOrigin, EndOrigin2)
}

public ChargedDamage(id, Float:Start[3], Float:End[3])
{
static TrResult; TrResult = create_tr2()

// Trace First Time
engfunc(EngFunc_TraceLine, Start, End, DONT_IGNORE_MONSTERS, id, TrResult) 
static pHit1; pHit1 = get_tr2(TrResult, TR_pHit)
static Float:End1[3]; get_tr2(TrResult, TR_vecEndPos, End1)

if(is_user_alive(pHit1)) 
{
do_attack(id, pHit1, 0, float(DAMAGE_B) * 1.5)
engfunc(EngFunc_TraceLine, End1, End, DONT_IGNORE_MONSTERS, pHit1, TrResult) 
} else engfunc(EngFunc_TraceLine, End1, End, DONT_IGNORE_MONSTERS, -1, TrResult) 

// Trace Second Time
static pHit2; pHit2 = get_tr2(TrResult, TR_pHit)
static Float:End2[3]; get_tr2(TrResult, TR_vecEndPos, End2)

if(is_user_alive(pHit2)) 
{
do_attack(id, pHit2, 0, float(DAMAGE_B) * 1.5)
engfunc(EngFunc_TraceLine, End2, End, DONT_IGNORE_MONSTERS, pHit2, TrResult) 
} else engfunc(EngFunc_TraceLine, End2, End, DONT_IGNORE_MONSTERS, -1, TrResult) 

// Trace Third Time
static pHit3; pHit3 = get_tr2(TrResult, TR_pHit)
static Float:End3[3]; get_tr2(TrResult, TR_vecEndPos, End3)

if(is_user_alive(pHit3)) 
{
do_attack(id, pHit3, 0, float(DAMAGE_B) * 1.5)
engfunc(EngFunc_TraceLine, End3, End, DONT_IGNORE_MONSTERS, pHit3, TrResult) 
} else engfunc(EngFunc_TraceLine, End3, End, DONT_IGNORE_MONSTERS, -1, TrResult) 

// Trace Fourth Time
static pHit4; pHit4 = get_tr2(TrResult, TR_pHit)
if(is_user_alive(pHit4)) do_attack(id, pHit4, 0, float(DAMAGE_B) * 1.5)

free_tr2(TrResult)
}

public Create_ArrowA(id)
{
static Float:StartOrigin[3], Float:EndOrigin[3], Float:Angles[3]

Get_Position(id, 40.0, 0.0, 0.0, StartOrigin)
Get_Position(id, 4096.0, 0.0, 0.0, EndOrigin)
pev(id, pev_v_angle, Angles)

Angles[0] *= -1

static Arrow; Arrow = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"))
if(!pev_valid(Arrow)) return

set_pev(Arrow, pev_movetype, MOVETYPE_FLY)
set_pev(Arrow, pev_iuser1, id) // Better than pev_owner
set_pev(Arrow, pev_iuser2, Get_SpecialTeam(id, cs_get_user_team(id)))
set_pev(Arrow, pev_iuser3, 0)
set_pev(Arrow, pev_iuser4, 0)

entity_set_string(Arrow, EV_SZ_classname, ARROW_CLASSNAME)
engfunc(EngFunc_SetModel, Arrow, ARROW_MODEl)
set_pev(Arrow, pev_mins, Float:{-1.0, -1.0, -1.0})
set_pev(Arrow, pev_maxs, Float:{1.0, 1.0, 1.0})
set_pev(Arrow, pev_origin, StartOrigin)
set_pev(Arrow, pev_angles, Angles)
set_pev(Arrow, pev_gravity, 0.01)
set_pev(Arrow, pev_solid, SOLID_BBOX)

set_pev(Arrow, pev_nextthink, get_gametime() + 0.1)

static Float:Velocity[3]
get_speed_vector(StartOrigin, EndOrigin, ARROW_SPEED, Velocity)
set_pev(Arrow, pev_velocity, Velocity)
}

public Create_FakeAttack(id)
{
static Ent; Ent = fm_get_user_weapon_entity(id, CSW_KNIFE)
if(!pev_valid(Ent)) return

Set_BitVar(g_InTempingAttack, id)
ExecuteHamB(Ham_Weapon_PrimaryAttack, Ent)

// Set Real Attack Anim
static iAnimDesired,  szAnimation[64]

formatex(szAnimation, charsmax(szAnimation), (pev(id, pev_flags) & FL_DUCKING) ? "crouch_shoot_%s" : "ref_shoot_%s", WEAPON_ANIMEXT)
if((iAnimDesired = lookup_sequence(id, szAnimation)) == -1)
iAnimDesired = 0

set_pev(id, pev_sequence, iAnimDesired)
UnSet_BitVar(g_InTempingAttack, id)
}

public Make_Push(id)
{
static Float:VirtualVec[3]
VirtualVec[0] = random_float(-1.0, -2.0)
VirtualVec[1] = random_float(1.0, -1.0)
VirtualVec[2] = 0.0    

set_pev(id, pev_punchangle, VirtualVec)        
}

public fw_Item_AddToPlayer_Post(Ent, Id)
{
if(pev(Ent, pev_impulse) == WEAPON_SECRETCODE)
{
Set_BitVar(g_Had_CompoundBow, Id)

g_BowArrow[Id] = pev(Ent, pev_iuser1)
UpdateAmmo(Id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[Id])

set_pev(Ent, pev_impulse, 0)
}            

g_WeaponState[Id] = WEAPON_NONE

message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, _, Id)
write_string((Get_BitVar(g_Had_CompoundBow, Id) ? WL_NAME : weapon_bow))
write_byte(WL_PRIAMMOID)
write_byte(WL_PRIAMMOMAX)
write_byte(WL_SECAMMOID)
write_byte(WL_SECAMMOIDMAX)
write_byte(WL_SLOTID)
write_byte(WL_NUMINSLOT)
write_byte(CSW_BOW)
write_byte(WL_FLAG)
message_end()
}

public fw_Item_Deploy_Post(Ent)
{
if(!pev_valid(Ent))
return

static Id; Id = get_pdata_cbase(Ent, 41, 4)
if(!Get_BitVar(g_Had_CompoundBow, Id))
return

set_pev(Id, pev_viewmodel2, V_MODEL)
set_pev(Id, pev_weaponmodel2, g_BowArrow[Id] ? P_MODEL : P_MODEL_EMPTY)

set_pdata_string(Id, (492) * 4, WEAPON_ANIMEXT, -1 , 20)

Set_Weapon_TimeIdle(Id, CSW_BOW, TIME_DRAW)
Set_Player_NextAttack(Id, TIME_DRAW)

Set_Weapon_Anim(Id, g_BowArrow[Id] ? BOW_ANIM_DRAW : BOW_ANIM_DRAW_EMPTY)
}

public fw_Weapon_WeaponIdle_Post(Ent)
{
if(!pev_valid(Ent))
return

static Id; Id = get_pdata_cbase(Ent, 41, 4)
if(!Get_BitVar(g_Had_CompoundBow, Id))
return

if(get_pdata_float(Ent, 48, 4) <= 0.1) 
{
Set_Weapon_Anim(Id, g_BowArrow[Id] ? BOW_ANIM_IDLE : BOW_ANIM_IDLE_EMPTY)
set_pdata_float(Ent, 48, 20.0, 4)
}

return
}

public Get_SpecialTeam(Ent, CsTeams:Team)
{
if(Team == CS_TEAM_T) return TEAM_T
else if(Team == CS_TEAM_CT) return TEAM_CT

return 0
}

public CsTeams:Get_ArrowTeam(Ent)
{
if(pev(Ent, pev_iuser2) == TEAM_T) return CS_TEAM_T
else if(pev(Ent, pev_iuser2) == TEAM_CT) return CS_TEAM_CT

return CS_TEAM_UNASSIGNED
}

stock MakeBulletDecal(Float:Origin[3])
{
// Find target
static decal; decal = random_num(41, 45)

// Put decal on "world" (a wall)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_WORLDDECAL)
engfunc(EngFunc_WriteCoord, Origin[0])
engfunc(EngFunc_WriteCoord, Origin[1])
engfunc(EngFunc_WriteCoord, Origin[2])
write_byte(decal)
message_end()
}

stock Set_Weapon_Anim(id, WeaponAnim)
{
set_pev(id, pev_weaponanim, WeaponAnim)

message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
write_byte(WeaponAnim)
write_byte(pev(id, pev_body))
message_end()
}

stock Set_Weapon_TimeIdle(id, WeaponId ,Float:TimeIdle)
{
static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
if(!pev_valid(entwpn)) 
return

set_pdata_float(entwpn, 46, TimeIdle, 4)
set_pdata_float(entwpn, 47, TimeIdle, 4)
set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
}

stock Set_Player_NextAttack(id, Float:nexttime)
{
set_pdata_float(id, 83, nexttime, 5)
}

stock Get_Position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]

pev(id, pev_origin, vOrigin)
pev(id, pev_view_ofs,vUp) //for player
xs_vec_add(vOrigin,vUp,vOrigin)
pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles

angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
angle_vector(vAngle,ANGLEVECTOR_UP,vUp)

vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}

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]
static Float:num; 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;
}

do_attack(Attacker, Victim, Inflictor, Float:fDamage)
{
fake_player_trace_attack(Attacker, Victim, fDamage)
fake_take_damage(Attacker, Victim, fDamage, Inflictor)
}

fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
{
// get fDirection
static Float:fAngles[3], Float:fDirection[3]
pev(iAttacker, pev_angles, fAngles)
angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)

// get fStart
static Float:fStart[3], Float:fViewOfs[3]
pev(iAttacker, pev_origin, fStart)
pev(iAttacker, pev_view_ofs, fViewOfs)
xs_vec_add(fViewOfs, fStart, fStart)

// get aimOrigin
static iAimOrigin[3], Float:fAimOrigin[3]
get_user_origin(iAttacker, iAimOrigin, 3)
IVecFVec(iAimOrigin, fAimOrigin)

// TraceLine from fStart to AimOrigin
static pentru; pentru = create_tr2() 
engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, pentru)
static pHit; pHit = get_tr2(pentru, TR_pHit)
static iHitgroup; iHitgroup = get_tr2(pentru, TR_iHitgroup)
static Float:fEndPos[3]
get_tr2(pentru, TR_vecEndPos, fEndPos)

// get target & body at aiming
static iTarget, iBody
get_user_aiming(iAttacker, iTarget, iBody)

// if aiming find target is iVictim then update iHitgroup
if (iTarget == iVictim)
{
iHitgroup = iBody
}

// if pentru find target not is iVictim
else if (pHit != iVictim)
{
// get AimOrigin in iVictim
static Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
pev(iVictim, pev_origin, fVicOrigin)
pev(iVictim, pev_view_ofs, fVicViewOfs) 
xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
fAimInVictim[2] = fStart[2]
fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )

// check aim in size of iVictim
static iAngleToVictim; iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
iAngleToVictim = abs(iAngleToVictim)
static Float:fDis; fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
static Float:fVicSize[3]
pev(iVictim, pev_size , fVicSize)
if ( fDis <= fVicSize[0] * 0.5 )
{
// TraceLine from fStart to aimOrigin in iVictim
static ptr2; ptr2 = create_tr2() 
engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
static pHit2; pHit2 = get_tr2(ptr2, TR_pHit)
static iHitgroup2; iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)

// if ptr2 find target is iVictim
if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
{
pHit = iVictim
iHitgroup = iHitgroup2
get_tr2(ptr2, TR_vecEndPos, fEndPos)
}

free_tr2(ptr2)
}

// if pHit still not is iVictim then set default HitGroup
if (pHit != iVictim)
{
// set default iHitgroup
iHitgroup = HIT_GENERIC

static ptr3; ptr3 = create_tr2() 
engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
get_tr2(ptr3, TR_vecEndPos, fEndPos)

// free ptr3
free_tr2(ptr3)
}
}

// set new Hit & Hitgroup & EndPos
set_tr2(pentru, TR_pHit, iVictim)
set_tr2(pentru, TR_iHitgroup, iHitgroup)
set_tr2(pentru, TR_vecEndPos, fEndPos)

// ExecuteHam
fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, pentru)

// free pentru
free_tr2(pentru)
}

stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
}

stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
}

stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
{
static Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
pev(id, pev_origin, fOrigin)
get_user_origin(id, iAimOrigin, 3) // end position from eyes
IVecFVec(iAimOrigin, fAimOrigin)
xs_vec_sub(fAimOrigin, fOrigin, fV1)

static Float:fV2[3]
xs_vec_sub(fTarget, fOrigin, fV2)

static iResult; iResult = get_angle_between_vectors(fV1, fV2)

if (TargetSize > 0.0)
{
static Float:fTan; fTan = TargetSize / get_distance_f(fOrigin, fTarget)
static fAngleToTargetSize; fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
}

return iResult
}

stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
{
static Float:fA1[3], Float:fA2[3]
engfunc(EngFunc_VecToAngles, fV1, fA1)
engfunc(EngFunc_VecToAngles, fV2, fA2)

static iResult; iResult = floatround(fA1[1] - fA2[1])
iResult = iResult % 360
iResult = (iResult > 180) ? (iResult - 360) : iResult

return iResult
}

Аватар
Extreme
Извън линия
Администратор
Администратор
Мнения: 557
Регистриран на: 05 Окт 2016, 20:53
Се отблагодари: 125 пъти
Получена благодарност: 51 пъти
Обратна връзка:

Re: [Заявка] как се прави ?

Мнение от Extreme » 17 Фев 2017, 20:04

С подобно заглавие следващия път темата ти ще бъде заключена.
–Човек вярва на това, което му се иска.
Адолф Хитлер.

-------------------------------------------------------------------------------------------
Правила на форума
Правила при качване на плъгини

Аватар
a4tech1999
Извън линия
Потребител
Потребител
Мнения: 20
Регистриран на: 21 Яну 2017, 02:25
Обратна връзка:

Re: [Заявка] как се прави ?

Мнение от a4tech1999 » 17 Фев 2017, 22:31

Екстремен как мога да ги направя тези неща нека скриптерите да ми помогнат ?

Аватар
Extreme
Извън линия
Администратор
Администратор
Мнения: 557
Регистриран на: 05 Окт 2016, 20:53
Се отблагодари: 125 пъти
Получена благодарност: 51 пъти
Обратна връзка:

Re: [Заявка] Как мога да си направя тези неща

Мнение от Extreme » 17 Фев 2017, 22:45

Правило №5: Заглавието на темата ви трябва да описва възможно най-добре съдържанието ѝ. Същата трябва да е пусната в правилния раздел, като преди това сте проверили, че вече не съществува подобна такава.*
–Човек вярва на това, което му се иска.
Адолф Хитлер.

-------------------------------------------------------------------------------------------
Правила на форума
Правила при качване на плъгини

Заключено
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Поддръжка / Помощ”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта