Kod:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <fun>
#include <csx>
#include <zombieplague>
#define PLUGIN "x-tracker"
#define VERSION "1.0"
#define AUTHOR "Mellowzy"
#define CSW_LOCKGUN CSW_M249
#define weapon_lockgun "weapon_m249"
#define weapon_old "models/w_m249.mdl"
#define old_event "events/m249.sc"
#define TASK_ZOOM 00100201
#define mf_cls "mf_lockongun"
#define RECOILA 0.5
#define RECOILB 0.2
#define WEAPON_CODE 109299913
#define RELOAD_TIME 2.0
#define spr_wpn "weapon_lockongun"
#define DAMAGE_A 75
#define DAMAGE_B 1000
#define CLIP 50
#define BPMAMO 500
#define SPEED 0.07
#define CHARGE_TIME 0.3
#define zp_get_user_team
#define INSTANCE(%0) ((%0 == -1) ? 0 : %0)
#define IsValidPev(%0) (pev_valid(%0) == 2)
#define IsObserver(%0) pev(%0,pev_iuser1)
#define OBS_IN_EYE 4
#define MSGID_WEAPONLIST 78
#define MAXTR 10
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)
const SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE)
// 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))
new g_Had_Thanatos5, g_Thanatos5_Clip[33],g_iMode, iAmmo[33]
new g_MsgCurWeapon, g_MsgWeaponList, g_MaxPlayers,Float:g_Recoil[33][3]
new g_Event_Thanatos5, g_ShellId, g_SmokePuff_SprId, g_HamBot, spr_trail, g_Exp_SprID
new bool:gInZoom[256], bool:gTracked[256], bool:ready[256], bool:recover[256]
new Float:TrackedPos[3],Float:TrackedPos2[MAXTR][3], TrackedVictim[33], maxtracked[MAXTR], g_item
enum
{
HIT_USER_CHEST = 1,
HIT_USER_STOMACH,
HIT_USER_HEAD
}
new const lockgun_model[][] =
{
"models/tracker/lockongun_bullet1.mdl",
"models/tracker/p_lockongun1.mdl", //1
"models/tracker/v_lockongun1.mdl", //2
"models/tracker/v_lockonsight1.mdl", //3
"models/tracker/w_lockongun1.mdl" //4
}
new const lockgun_sound[][] =
{
"weapons/tracker/lockongun_draw.wav",
"weapons/tracker/lockongun_exp.wav", //1
"weapons/tracker/lockongun_lockon_beep.wav",//2
"weapons/tracker/lockongun_reload.wav",
"weapons/tracker/lockongun_scope_on.wav",
"weapons/tracker/lockongun_shootb.wav", //5
"weapons/tracker/lockongun_shootb_on1.wav",
"weapons/tracker/lockongun_shootb_on2.wav",
"weapons/tracker/lockongun_zoom_in.wav",
"weapons/tracker/lockongun_zoom_out.wav",
"weapons/tracker/lockongun-1.wav" //10
}
new const lockgun_sprites[][] =
{
"sprites/tracker/640hud36.spr",
"sprites/tracker/640hud44.spr",
"sprites/tracker/640hud189.spr",
"sprites/tracker/ef_lockongun_explosion01.spr",
"sprites/tracker/muzzleflash102.spr"
}
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
register_forward(FM_SetModel, "fw_SetModel")
register_forward(FM_CmdStart, "fw_CmdStart")
register_forward(FM_UpdateClientData,"fw_UpdateClientData_Post", 1)
register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
register_think("lockon_rocket", "rocket_think")
register_touch("lockon_rocket", "*", "tocket_touch")
RegisterHam(Ham_Item_Deploy, weapon_lockgun, "fw_Item_Deploy_Post", 1)
RegisterHam(Ham_Item_AddToPlayer, weapon_lockgun, "fw_Item_AddToPlayer_Post", 1)
RegisterHam(Ham_Item_PostFrame, weapon_lockgun, "fw_Item_PostFrame")
RegisterHam(Ham_Weapon_Reload, weapon_lockgun, "fw_Weapon_Reload")
RegisterHam(Ham_Weapon_Reload, weapon_lockgun, "fw_Weapon_Reload_Post", 1)
RegisterHam(Ham_Weapon_WeaponIdle, weapon_lockgun, "fw_Weapon_WeaponIdle_Post", 1)
RegisterHam(Ham_Think, "env_sprite", "fw_MF_Think")
RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World")
RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage", 1)
RegisterHam(Ham_Weapon_PrimaryAttack, weapon_lockgun, "fw_Weapon_PrimaryAttack")
RegisterHam(Ham_Weapon_PrimaryAttack, weapon_lockgun, "fw_Weapon_PrimaryAttack_Post", 1)
g_MsgCurWeapon = get_user_msgid("CurWeapon")
g_MsgWeaponList = get_user_msgid("WeaponList")
g_MaxPlayers = get_maxplayers()
g_item = zp_register_extra_item("X-Tracker", 0, ZP_TEAM_HUMAN);
register_clcmd(spr_wpn, "Hook_Weapon")
}
public plugin_precache()
{
new i;
for(i = 0; i <sizeof(lockgun_model); i++)
precache_model(lockgun_model[i])
for(i = 0; i <sizeof(lockgun_sound); i++)
precache_sound(lockgun_sound[i])
for(i = 0; i<sizeof(lockgun_sprites); i++)
precache_model(lockgun_sprites[i])
new Txt[32]
format(Txt, 31, "sprites/%s.txt", spr_wpn)
engfunc(EngFunc_PrecacheGeneric, Txt)
g_Exp_SprID = precache_model("sprites/tracker/ef_lockongun_explosion03.spr")
g_ShellId = precache_model("models/tracker/rshell1.mdl")
g_SmokePuff_SprId = precache_model("sprites/tracker/wall_puff1.spr")
spr_trail = engfunc(EngFunc_PrecacheModel, "sprites/tracker/laserbeam.spr")
register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
server_cmd("mp_consistency 0")
}
public fw_PrecacheEvent_Post(type, const name[])
{
if(equal(old_event, name)) g_Event_Thanatos5 = get_orig_retval()
}
public client_putinserver(id)
{
if(!g_HamBot && is_user_bot(id))
{
g_HamBot = 1
set_task(0.1, "Do_Register_HamBot", id)
}
}
public client_connect(id)Remove_Weapon(id)
public client_disconnected(id) Remove_Weapon(id)
public Event_CurWeapon(id)
{
static CSW; CSW = read_data(2)
if(CSW != CSW_LOCKGUN)
return
if(!Get_BitVar(g_Had_Thanatos5, id))
return
static Ent; Ent = fm_get_user_weapon_entity(id, CSW_LOCKGUN)
if(!pev_valid(Ent)) return
set_pdata_float(Ent, 46, SPEED, 4)
set_pdata_float(Ent, 47, SPEED, 4)
}
public Do_Register_HamBot(id)
{
RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Player")
}
public zp_extra_item_selected(id, ItemID)
{
if(ItemID == g_item) Get_Thanatos5(id)
}
public zbheroex_weapon_remove(id, ItemID)
{
if(ItemID == g_item) Remove_Weapon(id)
}
public Get_Thanatos5(id)
{
drop_weapons(id, 1)
set_zoomid(id, 0)
iAmmo[id] = 10
ready[id] = false
recover[id] = true
Set_BitVar(g_Had_Thanatos5, id)
Set_BitVar(g_iMode, id)
give_item(id, weapon_lockgun)
static Ent; Ent = fm_get_user_weapon_entity(id, CSW_LOCKGUN)
if(pev_valid(Ent)) set_pdata_int(Ent, 51, CLIP, 4)
engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, g_MsgCurWeapon, {0, 0, 0}, id)
write_byte(1)
write_byte(CSW_LOCKGUN)
write_byte(CLIP)
message_end()
set_pev(Ent, pev_fuser2, 0.0)
gInZoom[id] = false
gTracked[id] = false
cs_set_user_bpammo(id, CSW_LOCKGUN, BPMAMO)
}
public Hook_Weapon(id)
{
engclient_cmd(id, weapon_lockgun)
return PLUGIN_HANDLED
}
public Remove_Weapon(id)
{
set_fov(id, 90)
UnSet_BitVar(g_Had_Thanatos5, id)
}
public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
if(!is_user_alive(id))
return FMRES_IGNORED
if(get_user_weapon(id) == CSW_LOCKGUN && Get_BitVar(g_Had_Thanatos5, id))
set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
return FMRES_HANDLED
}
public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
if (!is_user_connected(invoker))
return FMRES_IGNORED
if(get_user_weapon(invoker) != CSW_LOCKGUN || !Get_BitVar(g_Had_Thanatos5, invoker))
return FMRES_IGNORED
if(eventid != g_Event_Thanatos5)
return FMRES_IGNORED
engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
Eject_Shell(invoker, g_ShellId, 0.01)
return FMRES_IGNORED
}
public fw_Weapon_PrimaryAttack(Ent)
{
static id; id = pev(Ent, pev_owner)
if(!is_user_alive(id))
return HAM_IGNORED
if(!Get_BitVar(g_Had_Thanatos5, id))
return HAM_IGNORED
pev(id, pev_punchangle, g_Recoil[id])
return HAM_IGNORED
}
public fw_Weapon_PrimaryAttack_Post(Ent)
{
static id; id = pev(Ent, pev_owner)
new iClip = get_pdata_int(Ent, 51, 4)
if(!is_user_alive(id))
return
if(!Get_BitVar(g_Had_Thanatos5, id))
return
if(!iClip)
return
static Float:Push[3]
pev(id, pev_punchangle, Push)
xs_vec_sub(Push, g_Recoil[id], Push)
xs_vec_mul_scalar(Push, gInZoom[id]?RECOILB : RECOILA, Push)
xs_vec_add(Push, g_Recoil[id], Push)
set_pev(id, pev_punchangle, Push)
if(Get_BitVar(g_iMode, id)) Set_WeaponAnim(id, 3)
else Set_WeaponAnim(id, 2)
emit_sound(id, CHAN_WEAPON, lockgun_sound[10], 1.0, ATTN_NORM, 0, PITCH_NORM)
Make_Muzzle(id)
// Acc
static Accena; Accena = gInZoom[id]? 100 : 15
if(Accena != -1)
{
static Float:Accuracy
Accuracy = (float(100 - Accena) * 1.5) / 100.0
set_pdata_float(Ent, 62, Accuracy, 4);
}
set_pdata_int(Ent, 64, 0, 4)
}
public fw_SetModel(entity, model[])
{
if(!pev_valid(entity))
return FMRES_IGNORED
static Classname[32]
pev(entity, pev_classname, Classname, sizeof(Classname))
if(!equal(Classname, "weaponbox"))
return FMRES_IGNORED
static iOwner
iOwner = pev(entity, pev_owner)
if(equal(model, weapon_old))
{
static weapon; weapon = find_ent_by_owner(-1, weapon_lockgun, entity)
if(!pev_valid(weapon))
return FMRES_IGNORED;
if(Get_BitVar(g_Had_Thanatos5, iOwner))
{
set_pev(weapon, pev_impulse, 3152015)
engfunc(EngFunc_SetModel, entity, lockgun_model[4])
Remove_Weapon(iOwner)
return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED;
}
public fw_Item_Deploy_Post(Ent)
{
if(pev_valid(Ent) != 2)
return
static Id; Id = get_pdata_cbase(Ent, 41, 4)
if(get_pdata_cbase(Id, 373) != Ent)
return
if(!Get_BitVar(g_Had_Thanatos5, Id))
return
set_pev(Id, pev_viewmodel2, lockgun_model[2])
set_pev(Id, pev_weaponmodel2, lockgun_model[1])
set_zoomid(Id, 0)
gInZoom[Id] = false
if(Get_BitVar(g_iMode, Id)) Set_WeaponAnim(Id, 7)
else Set_WeaponAnim(Id, 6)
}
public fw_Item_AddToPlayer_Post(Ent, id)
{
if(!pev_valid(Ent))
return HAM_IGNORED
if(pev(Ent, pev_impulse) == 3152015)
{
Set_BitVar(g_Had_Thanatos5, id)
set_pev(Ent, pev_impulse, 0)
//spriteshud(id)
}
return HAM_HANDLED
}
public spriteshud(id)
{
message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, .player = id)
write_string("weapon_lockongun")
write_byte(3) // PrimaryAmmoID
write_byte(200) // PrimaryAmmoMaxAmount
write_byte(-1) // SecondaryAmmoID
write_byte(-1) // SecondaryAmmoMaxAmount
write_byte(0) // SlotID (0...N)
write_byte(4) // NumberInSlot (1...N)
write_byte(CSW_LOCKGUN) // WeaponID
write_byte(0) // Flags
message_end()
}
public fw_Weapon_WeaponIdle_Post( iEnt )
{
if(pev_valid(iEnt) != 2)
return
static Id; Id = get_pdata_cbase(iEnt, 41, 4)
if(get_pdata_cbase(Id, 373) != iEnt)
return
if(!Get_BitVar(g_Had_Thanatos5, Id))
return
if(get_pdata_float(iEnt, 48, 4) <= 0.25)
{
if(Get_BitVar(g_iMode, Id)) Set_WeaponAnim(Id, 1)
else Set_WeaponAnim(Id, 0)
set_pdata_float(iEnt, 48, 20.0, 4)
}
}
public fw_TraceAttack_World(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
{
if(!is_user_connected(Attacker))
return HAM_IGNORED
if(get_user_weapon(Attacker) != CSW_LOCKGUN || !Get_BitVar(g_Had_Thanatos5, Attacker))
return HAM_IGNORED
static Float:flEnd[3], Float:vecPlane[3]
get_tr2(Ptr, TR_vecEndPos, flEnd)
get_tr2(Ptr, TR_vecPlaneNormal, vecPlane)
Make_BulletHole(Attacker, flEnd, Damage)
Make_BulletSmoke(Attacker, Ptr)
SetHamParamFloat(3, float(DAMAGE_A))
return HAM_IGNORED
}
public fw_TraceAttack_Player(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
{
if(!is_user_connected(Attacker))
return HAM_IGNORED
if(get_user_weapon(Attacker) != CSW_LOCKGUN || !Get_BitVar(g_Had_Thanatos5, Attacker))
return HAM_IGNORED
new tr_info = pev(Attacker, pev_iuser4)
switch(tr_info)
{
case HIT_USER_CHEST:
{
set_tr2(Ptr, TR_iHitgroup, HIT_CHEST)
}
case HIT_USER_STOMACH:
{
set_tr2(Ptr, TR_iHitgroup, HIT_STOMACH)
}
case HIT_USER_HEAD:
{
set_tr2(Ptr, TR_iHitgroup, HIT_HEAD)
}
}
if(gInZoom[Attacker])
{
gTracked[Attacker] = true
maxtracked[Attacker] ++
showinfo_hitgroup(Victim,Attacker)
emit_sound(Attacker, CHAN_VOICE, lockgun_sound[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
if(gTracked[Attacker]) TrackedVictim[Attacker] = Victim
SetHamParamFloat(3, float(DAMAGE_A))
return HAM_IGNORED
}
public fw_TakeDamage(v,i,a,Float:dmg,dmgbits)
{
if(!Get_BitVar(g_Had_Thanatos5, a))
return HAM_IGNORED
if(!is_user_alive(v) || !is_user_alive(a))
return HAM_IGNORED
if(zp_get_user_team(v) == zp_get_user_team(a))
return HAM_IGNORED
if(gInZoom[a])showinfo_hitgroup(v,a)
if(gTracked[a]) TrackedVictim[a] = v
return HAM_IGNORED
}
public showinfo_hitgroup(info_player,id)
{
new info_hitgroup = get_pdata_int(info_player, 75)
switch(info_hitgroup)
{
case HIT_CHEST:
{
client_print(id, print_chat, "CHEST")
set_pev(id, pev_iuser4, HIT_USER_CHEST)
set_pdata_int(id, 75, HIT_CHEST, 5)
}
case HIT_HEAD:
{
client_print(id, print_chat, "HEAD")
set_pev(id, pev_iuser4, HIT_USER_HEAD)
set_pdata_int(id, 75, HIT_HEAD, 5)
}
case HIT_STOMACH:
{
client_print(id, print_chat, "STOMACH")
set_pev(id, pev_iuser4, HIT_USER_STOMACH)
set_pdata_int(id, 75, HIT_STOMACH, 5)
}
}
}
public fw_Item_PostFrame(ent)
{
static id; id = pev(ent, pev_owner)
if(!is_user_alive(id))
return HAM_IGNORED
if(!Get_BitVar(g_Had_Thanatos5, id))
return HAM_IGNORED
static Float:flNextAttack; flNextAttack = get_pdata_float(id, 83, 5)
static bpammo; bpammo = cs_get_user_bpammo(id, CSW_LOCKGUN)
static iClip; iClip = get_pdata_int(ent, 51, 4)
static fInReload; fInReload = get_pdata_int(ent, 54, 4)
if(fInReload && flNextAttack <= 0.0)
{
static temp1
temp1 = min(CLIP - iClip, bpammo)
set_pdata_int(ent, 51, iClip + temp1, 4)
cs_set_user_bpammo(id, CSW_LOCKGUN, bpammo - temp1)
set_pdata_int(ent, 54, 0, 4)
fInReload = 0
}
static Float:flLastEventCheck; pev(ent, pev_fuser2, flLastEventCheck)
if(!ready[id] && iAmmo[id] < 10 && flLastEventCheck < get_gametime())
{
iAmmo[id] ++
recover[id] = false
set_pev(ent, pev_fuser2, get_gametime() + CHARGE_TIME)
}
if(iAmmo[id] >= 10 && flLastEventCheck < get_gametime())
{
ready[id] = true
if(!recover[id])
{
Set_BitVar(g_iMode, id)
gTracked[id] = false
recover[id] = true
Set_WeaponAnim(id, 8)
Set_Player_NextAttack(id, 0.5)
Set_WeaponIdleTime(id, CSW_LOCKGUN, 1.0)
}
else
{
set_pev(ent, pev_fuser2, 0.0)
}
}
Notice(id)
return HAM_IGNORED
}
public Notice(id) client_print(id, print_center, "%d", iAmmo[id])
public fw_CmdStart(id, uc_handle, seed)
{
if(!is_user_alive(id))
return FMRES_IGNORED
if(get_user_weapon(id) != CSW_LOCKGUN || !Get_BitVar(g_Had_Thanatos5, id))
return FMRES_IGNORED
static PressedButton
PressedButton = get_uc(uc_handle, UC_Buttons)
if(get_pdata_float(id, 83, 5) > 0.0)
return FMRES_IGNORED
if(!Get_BitVar(g_iMode, id))
return FMRES_IGNORED
if(PressedButton & IN_ATTACK2)
{
if(!gInZoom[id])
{
set_task(0.1, "zoom_start", id+TASK_ZOOM)
} else {
set_task(0.1, "zoom_end", id+TASK_ZOOM)
}
}
PressedButton &= ~IN_ATTACK2
set_uc(uc_handle, UC_Buttons, PressedButton)
return FMRES_HANDLED
}
public zoom_start(id)
{
id -= TASK_ZOOM
Set_WeaponAnim(id, 9)
Set_BitVar(g_iMode, id)
Set_Player_NextAttack(id, 0.5)
Set_WeaponIdleTime(id, CSW_LOCKGUN, 0.5)
set_task(0.6, "zoom_idle", id+TASK_ZOOM)
}
public zoom_idle(id)
{
id -= TASK_ZOOM
set_zoomid(id, 1)
gInZoom[id] = true
}
public zoom_end(id)
{
id -= TASK_ZOOM
if(gTracked[id]){
set_zoomid(id, 0)
gInZoom[id] = false
set_task(0.5, "sound_rocket", id)
set_task(1.2, "make_rocket", id)
UnSet_BitVar(g_iMode, id)
Set_WeaponAnim(id, 12)
Set_Player_NextAttack(id, 1.0)
Set_WeaponIdleTime(id, CSW_LOCKGUN, 2.5)
remove_task(id+TASK_ZOOM)
}
else
{
set_zoomid(id, 0)
gInZoom[id] = false
Set_WeaponAnim(id, 11)
Set_Player_NextAttack(id, 1.0)
Set_WeaponIdleTime(id, CSW_LOCKGUN, 1.0)
remove_task(id+TASK_ZOOM)
}
}
public make_rocket(id)
{
new Float:StartOrigin[10][3], Float:Angles[3]
pev(id, pev_angles, Angles)
Get_Position(id,120.0,15.0, 20.0, StartOrigin[0])
Get_Position(id,120.0,15.0, 30.0, StartOrigin[1])
Get_Position(id,120.0,15.0, 40.0, StartOrigin[2])
Get_Position(id,120.0,15.0, 50.0, StartOrigin[3])
Get_Position(id,120.0,15.0, 60.0, StartOrigin[4])
Get_Position(id,120.0,-15.0, 20.0, StartOrigin[5])
Get_Position(id,120.0,-15.0, 30.0, StartOrigin[6])
Get_Position(id,120.0,-15.0, 40.0, StartOrigin[7])
Get_Position(id,120.0,-15.0, 50.0, StartOrigin[8])
Get_Position(id,120.0,-15.0, 60.0, StartOrigin[9])
for(new i = 0; i < MAXTR; i++) lockongun_rocket(id, StartOrigin[i], Angles)
}
public sound_rocket(id) emit_sound(id, CHAN_WEAPON, lockgun_sound[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
public fw_Weapon_Reload(ent)
{
static id; id = pev(ent, pev_owner)
if(!is_user_alive(id))
return HAM_IGNORED
if(!Get_BitVar(g_Had_Thanatos5, id))
return HAM_IGNORED
g_Thanatos5_Clip[id] = -1
static BPAmmo; BPAmmo = cs_get_user_bpammo(id, CSW_LOCKGUN)
static iClip; iClip = get_pdata_int(ent, 51, 4)
if(BPAmmo <= 0)
return HAM_SUPERCEDE
if(iClip >= CLIP)
return HAM_SUPERCEDE
g_Thanatos5_Clip[id] = iClip
return HAM_HANDLED
}
public fw_Weapon_Reload_Post(ent)
{
static id; id = pev(ent, pev_owner)
if(!is_user_alive(id))
return HAM_IGNORED
if(!Get_BitVar(g_Had_Thanatos5, id))
return HAM_IGNORED
if((get_pdata_int(ent, 54, 4) == 1))
{ // Reload
if(g_Thanatos5_Clip[id] == -1)
return HAM_IGNORED
set_pdata_int(ent, 51, g_Thanatos5_Clip[id], 4)
set_pdata_float(id, 83, RELOAD_TIME, 5)
set_zoomid(id, 0)
if(gInZoom[id])
{
gInZoom[id] = false
set_task(0.1, "zoom_end", id+TASK_ZOOM)
}
else
{
if(Get_BitVar(g_iMode, id)) Set_WeaponAnim(id, 5)
else Set_WeaponAnim(id, 4)
}
}
return HAM_HANDLED
}
//stock
stock set_zoomid(id, izoom)
{
switch(izoom)
{
case 0:
{
user_fade(id, 0)
set_fov(id, 90)
set_pev(id, pev_viewmodel2, lockgun_model[2])
}
case 1:
{
set_fov(id, 80)
user_fade(id, 1)
set_pev(id, pev_viewmodel2, lockgun_model[3])
}
}
}
stock Make_Muzzle(iStock)
{
new Ent = Stock_CreateEntityBase(iStock, "env_sprite", MOVETYPE_FOLLOW, lockgun_sprites[4], mf_cls, SOLID_NOT, 0.01)
set_pev(Ent, pev_body, 1)
set_pev(Ent, pev_owner, iStock)
set_pev(Ent, pev_rendermode, kRenderTransAdd)
set_pev(Ent, pev_renderamt, 255.0)
set_pev(Ent, pev_aiment, iStock)
set_pev(Ent, pev_scale, 0.065)
set_pev(Ent, pev_frame, 0.0)
dllfunc(DLLFunc_Spawn, Ent)
}
public fw_MF_Think(ent)
{
if(!pev_valid(ent))
return
static Classname[32]
pev(ent, pev_classname, Classname, sizeof(Classname))
static Owner; Owner = pev(ent, pev_owner)
if(!is_user_alive(Owner) || get_user_weapon(Owner) != CSW_LOCKGUN)
{
set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
return
}
if(equal(Classname, mf_cls))
{
static Float:fFrame, Float:fFrameMax
pev(ent, pev_frame, fFrame)
fFrameMax = 8.0
fFrame += 0.5
set_pev(ent, pev_frame, fFrame)
if(fFrame >= fFrameMax)
{
set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
fFrame = 0.0;
}
set_pev(ent, pev_nextthink, get_gametime() + 0.01)
}
}
stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
new_velocity[0] = origin2[0] - origin1[0]
new_velocity[1] = origin2[1] - origin1[1]
new_velocity[2] = origin2[2] - origin1[2]
new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
new_velocity[0] *= num
new_velocity[1] *= num
new_velocity[2] *= num
return 1;
}
stock 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 can_damage(id1, id2)
{
if(id1 <= 0 || id1 >= 33 || id2 <= 0 || id2 >= 33)
return 1
// Check team
return(get_pdata_int(id1, 114) != get_pdata_int(id2, 114))
}
stock lockongun_rocket(id, Float:Origin[3], Float:Angles[3])
{
new ent = create_entity("info_target")
set_pev(ent, pev_classname, "lockon_rocket")
engfunc(EngFunc_SetModel, ent, lockgun_model[0])
set_pev(ent, pev_origin, Origin)
set_pev(ent, pev_angles, Angles)
set_pev(ent, pev_solid, SOLID_TRIGGER)
set_pev(ent, pev_movetype, MOVETYPE_FLY)
set_pev(ent, pev_owner, id)
entity_anim(ent, 0)
set_pev(ent, pev_nextthink, get_gametime() + 0.01)
iAmmo[id] --
ready[id] = false
Notice(id)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(ent)
write_short(spr_trail)
write_byte(4)
write_byte(3)
write_byte(255)
write_byte(255)
write_byte(225)
write_byte(125)
message_end()
}
public rocket_think(ent)
{
if(!pev_valid(ent)) return
if(pev(ent, pev_flags) == FL_KILLME) return
static id;
id = pev(ent, pev_owner)
new Float:Origin[3], Float:Origin2[3], Float:velo[3]
if(!gTracked[id])
{
pev(ent, pev_origin, Origin)
Get_Position(id, 4096.0, 0.0, 0.0, Origin2)
get_speed_vector(Origin,Origin2,2500.0, velo)
set_pev(ent, pev_velocity, velo)
}
else
{
static Float:Ent_origin[3], Float:fSpeed //tracked
pev(ent, pev_origin, Ent_origin)
pev(TrackedVictim[id], pev_origin, TrackedPos)
pev(TrackedVictim[id], pev_origin, TrackedPos2)
if(!is_user_alive(TrackedVictim[id])) gTracked[id] = false
if(cs_get_user_team(pev(ent, pev_owner)) == cs_get_user_team(TrackedVictim[id])) gTracked[id] = false
fSpeed = floatmin(2500.0, vector_distance(Ent_origin, TrackedPos) * 20.0)
Stock_Hook_Ent(ent, TrackedPos, fSpeed, 1)
ent_turntotarget(ent, Ent_origin, TrackedPos)
/*new enemy = FindClosesEnemy(ent) //find closest
if(pev_valid(enemy))
{
new Float:Vic_Origin[3], Float:dist
pev(enemy, pev_origin, Vic_Origin)
dist = get_distance_f(Ent_origin, Vic_Origin)
if(is_user_alive(enemy))
{
if(dist <= 150.0)
{
ent_explode(ent)
}
else
{
static Float:fSpeed
fSpeed = floatmin(2500.0, vector_distance(Ent_origin, Vic_Origin) * 20.0)
Stock_Hook_Ent(ent, Vic_Origin, fSpeed, 1)
ent_turntotarget(ent, Ent_origin, Vic_Origin)
}
}
}*/
}
set_pev(ent, pev_nextthink, get_gametime() + 0.1)
}
public tocket_touch(ent, touched)
{
if(!pev_valid(ent)) return
if(pev(ent, pev_flags) == FL_KILLME) return
static Float:Origin[3]; pev(ent, pev_origin, Origin)
ent_explode(ent,Origin)
set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
}
stock ent_explode(ent, Float:vecOri[3])
{
pev(ent, pev_origin, vecOri)
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOri, 0)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, vecOri[0])
engfunc(EngFunc_WriteCoord, vecOri[1])
engfunc(EngFunc_WriteCoord, vecOri[2])
write_short(g_Exp_SprID)
write_byte(7)//size
write_byte(35)//framerate
write_byte(TE_EXPLFLAG_NOSOUND|TE_EXPLFLAG_NOPARTICLES)
message_end()
emit_sound(0, CHAN_VOICE, lockgun_sound[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
static Float:fDmg, Float:fRng, Float:fKnc
fDmg = float(DAMAGE_B)
fRng = 120.0
fKnc = 15.0
new iOwner = pev(ent, pev_owner)
new pEntity = -1
while((pEntity = engfunc(EngFunc_FindEntityInSphere, pEntity, vecOri, fRng)) != 0)
{
if(pev(pEntity, pev_takedamage) == DAMAGE_NO) continue
if(!zp_get_user_zombie(pEntity)) continue;
if(is_user_connected(pEntity) && pEntity != iOwner)
if(!can_damage(pEntity, iOwner)) continue
if(pEntity == iOwner) continue
if(pev_valid(pEntity))
{
ExecuteHam(Ham_TakeDamage, pEntity, iOwner, iOwner, fDmg, DMG_BULLET)
Stock_Fake_KnockBack(iOwner, pEntity, fKnc)
}
}
set_pev(iOwner, pev_iuser4, 0)
set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
}
stock entity_anim(ent, anim)
{
if(pev_valid(ent))
{
set_pev(ent, pev_sequence, anim)
set_pev(ent, pev_animtime, get_gametime())
set_pev(ent, pev_frame, 0.0)
set_pev(ent, pev_framerate, 1.0)
}
}
public FindClosesEnemy(entid)
{
new Float:Dist
new id = pev(entid, pev_owner)
new Float:maxdistance=4000.0
new indexid=0
for(new i=1;i<=g_MaxPlayers;i++){
if(is_user_alive(i) && pev_valid(i) && can_see_fm(entid, i) && cs_get_user_team(id) != cs_get_user_team(i))
{
Dist = entity_range(entid, i)
if(Dist <= maxdistance)
{
maxdistance=Dist
indexid=i
return indexid
}
}
}
return 0
}
public bool:can_see_fm(entindex1, entindex2)
{
if (!entindex1 || !entindex2)
return false
if (pev_valid(entindex1) && pev_valid(entindex1))
{
new flags = pev(entindex1, pev_flags)
if (flags & EF_NODRAW || flags & FL_NOTARGET)
{
return false
}
new Float:lookerOrig[3]
new Float:targetBaseOrig[3]
new Float:targetOrig[3]
new Float:temp[3]
pev(entindex1, pev_origin, lookerOrig)
pev(entindex1, pev_view_ofs, temp)
lookerOrig[0] += temp[0]
lookerOrig[1] += temp[1]
lookerOrig[2] += temp[2]
pev(entindex2, pev_origin, targetBaseOrig)
pev(entindex2, pev_view_ofs, temp)
targetOrig[0] = targetBaseOrig [0] + temp[0]
targetOrig[1] = targetBaseOrig [1] + temp[1]
targetOrig[2] = targetBaseOrig [2] + temp[2]
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the had of seen player
if (get_tr2(0, TraceResult:TR_InOpen) && get_tr2(0, TraceResult:TR_InWater))
{
return false
}
else
{
new Float:flFraction
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return true
}
else
{
targetOrig[0] = targetBaseOrig [0]
targetOrig[1] = targetBaseOrig [1]
targetOrig[2] = targetBaseOrig [2]
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the body of seen player
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return true
}
else
{
targetOrig[0] = targetBaseOrig [0]
targetOrig[1] = targetBaseOrig [1]
targetOrig[2] = targetBaseOrig [2] - 17.0
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the legs of seen player
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return true
}
}
}
}
}
return false
}
public ent_turntotarget(ent, Float:Ent_Origin[3], Float:Vic_Origin[3])
{
new Float:newAngle[3]
entity_get_vector(ent, EV_VEC_angles, newAngle)
new Float:x = Vic_Origin[0] - Ent_Origin[0]
new Float:z = Vic_Origin[1] - Ent_Origin[1]
new Float:radians = floatatan(z/x, radian)
newAngle[1] = radians * (180 / 3.14)
if (Vic_Origin[0] < Ent_Origin[0])
newAngle[1] -= 180.0
entity_set_vector(ent, EV_VEC_angles, newAngle)
}
stock set_fov(id, num = 90)
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SetFOV"), {0,0,0}, id)
write_byte(num)
message_end()
}
stock Stock_Hook_Ent(ent, Float:TargetOrigin[3], Float:Speed, mode=0)
{
static Float:fl_Velocity[3],Float:EntOrigin[3],Float:distance_f,Float:fl_Time
pev(ent, pev_origin, EntOrigin)
if(!mode)
{
distance_f = get_distance_f(EntOrigin, TargetOrigin)
fl_Time = distance_f / Speed
pev(ent, pev_velocity, fl_Velocity)
fl_Velocity[0] = (TargetOrigin[0] - EntOrigin[0]) / fl_Time
fl_Velocity[1] = (TargetOrigin[1] - EntOrigin[1]) / fl_Time
fl_Velocity[2] = (TargetOrigin[2] - EntOrigin[2]) / fl_Time
if(vector_length(fl_Velocity) > 1.0) set_pev(ent, pev_velocity, fl_Velocity)
else set_pev(ent, pev_velocity, Float:{0.01, 0.01, 0.01})
} else {
static Float:fl_EntVelocity[3], Float:fl_Acc[3]
Stock_Directed_Vector(TargetOrigin, EntOrigin, fl_Velocity)
xs_vec_mul_scalar(fl_Velocity, Speed, fl_Velocity)
for(new i =0; i<3; i++)
{
if(fl_Velocity[i] > fl_EntVelocity[i])
{
fl_Acc[i] = fl_Velocity[i]-fl_EntVelocity[i]
fl_Acc[i] = floatmin(70.0, fl_Acc[i])
fl_EntVelocity[i] += fl_Acc[i]
}
else if(fl_Velocity[i] < fl_EntVelocity[i])
{
fl_Acc[i] = fl_EntVelocity[i]-fl_Velocity[i]
fl_Acc[i] = floatmin(70.0, fl_Acc[i])
fl_EntVelocity[i] -= fl_Acc[i]
}
}
set_pev(ent, pev_velocity, fl_EntVelocity)
}
}
stock Stock_Directed_Vector(Float:start[3],Float:end[3],Float:reOri[3])
{
new Float:v3[3]
v3[0]=start[0]-end[0]
v3[1]=start[1]-end[1]
v3[2]=start[2]-end[2]
new Float:vl = vector_length(v3)
reOri[0] = v3[0] / vl
reOri[1] = v3[1] / vl
reOri[2] = v3[2] / vl
}
// Drop primary/secondary weapons
stock drop_weapons(id, dropwhat)
{
// Get user weapons
static weapons[32], num, i, weaponid
num = 0 // reset passed weapons count (bugfix)
get_user_weapons(id, weapons, num)
// Loop through them and drop primaries or secondaries
for (i = 0; i < num; i++)
{
// Prevent re-indexing the array
weaponid = weapons[i]
if ((dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)) || (dropwhat == 2 && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM)))
{
// Get weapon entity
static wname[32]; get_weaponname(weaponid, wname, charsmax(wname))
engclient_cmd(id, "drop", wname)
}
}
}
stock Stock_CreateEntityBase(id, classtype[], mvtyp, mdl[], class[], solid, Float:fNext)
{
new pEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, classtype))
set_pev(pEntity, pev_movetype, mvtyp);
set_pev(pEntity, pev_owner, id);
engfunc(EngFunc_SetModel, pEntity, mdl);
set_pev(pEntity, pev_classname, class);
set_pev(pEntity, pev_solid, solid);
set_pev(pEntity, pev_nextthink, get_gametime() + fNext)
return pEntity
}
stock Set_WeaponAnim(id, anim)
{
set_pev(id, pev_weaponanim, anim)
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
write_byte(anim)
write_byte(pev(id, pev_body))
message_end()
}
stock Eject_Shell(id, Shell_ModelIndex, Float:Time) // By Dias
{
static Ent; Ent = get_pdata_cbase(id, 373, 5)
if(!pev_valid(Ent))
return
set_pdata_int(Ent, 57, Shell_ModelIndex, 4)
set_pdata_float(id, 111, get_gametime() + Time)
}
stock Make_BulletHole(id, Float:Origin[3], Float:Damage)
{
// Find target
static Decal; Decal = random_num(41, 45)
static LoopTime;
if(Damage > 100.0) LoopTime = 2
else LoopTime = 1
for(new i = 0; i < LoopTime; i++)
{
// 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()
// Show sparcles
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_GUNSHOTDECAL)
engfunc(EngFunc_WriteCoord, Origin[0])
engfunc(EngFunc_WriteCoord, Origin[1])
engfunc(EngFunc_WriteCoord, Origin[2])
write_short(id)
write_byte(Decal)
message_end()
}
}
stock Make_BulletSmoke(id, TrResult)
{
static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG
get_weapon_attachment(id, vecSrc)
global_get(glb_v_forward, vecEnd)
xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
xs_vec_add(vecSrc, vecEnd, vecEnd)
get_tr2(TrResult, TR_vecEndPos, vecSrc)
get_tr2(TrResult, TR_vecPlaneNormal, vecEnd)
xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
xs_vec_add(vecSrc, vecEnd, vecEnd)
TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
TE_FLAG |= TE_EXPLFLAG_NOSOUND
TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, vecEnd[0])
engfunc(EngFunc_WriteCoord, vecEnd[1])
engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
write_short(g_SmokePuff_SprId)
write_byte(2)
write_byte(50)
write_byte(TE_FLAG)
message_end()
}
stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
{
static Float:vfEnd[3], viEnd[3]
get_user_origin(id, viEnd, 3)
IVecFVec(viEnd, vfEnd)
static Float:fOrigin[3], Float:fAngle[3]
pev(id, pev_origin, fOrigin)
pev(id, pev_view_ofs, fAngle)
xs_vec_add(fOrigin, fAngle, fOrigin)
static Float:fAttack[3]
xs_vec_sub(vfEnd, fOrigin, fAttack)
xs_vec_sub(vfEnd, fOrigin, fAttack)
static Float:fRate
fRate = fDis / vector_length(fAttack)
xs_vec_mul_scalar(fAttack, fRate, fAttack)
xs_vec_add(fOrigin, fAttack, output)
}
stock user_fade(id, on)
{
if(!Get_BitVar(g_Had_Thanatos5, id)) return
if(on == 1)
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, id)
write_short((1<<12))//duration
write_short((1<<12) * 1) //Hold
write_short(0x0004) //Type
write_byte(0) //R
write_byte(155) //G
write_byte(255) //B
write_byte(30) //B
message_end()
} else {
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, id)
write_short((1<<12))//duration
write_short((1<<12) * 1) //Hold
write_short(0x0004) //Type
write_byte(200) //R
write_byte(200) //G
write_byte(200) //B
write_byte(0) //B
message_end()
}
}
stock Stock_Fake_KnockBack(id, iVic, Float:iKb)
{
if(iVic > 32) return
new Float:vAttacker[3], Float:vVictim[3], Float:vVelocity[3], flags
pev(id, pev_origin, vAttacker)
pev(iVic, pev_origin, vVictim)
vAttacker[2] = vVictim[2] = 0.0
flags = pev(id, pev_flags)
xs_vec_sub(vVictim, vAttacker, vVictim)
new Float:fDistance
fDistance = xs_vec_len(vVictim)
xs_vec_mul_scalar(vVictim, 1 / fDistance, vVictim)
pev(iVic, pev_velocity, vVelocity)
xs_vec_mul_scalar(vVictim, iKb, vVictim)
xs_vec_mul_scalar(vVictim, 50.0, vVictim)
vVictim[2] = xs_vec_len(vVictim) * 0.15
if(flags &~ FL_ONGROUND)
{
xs_vec_mul_scalar(vVictim, 1.2, vVictim)
vVictim[2] *= 0.4
}
if(xs_vec_len(vVictim) > xs_vec_len(vVelocity)) set_pev(iVic, pev_velocity, vVictim)
}
stock Set_Player_NextAttack(id, Float:NextTime) set_pdata_float(id, 83, NextTime, 5)
stock Set_WeaponIdleTime(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)
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1057\\ f0\\ fs16 \n\\ par }
*/
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1057\\ f0\\ fs16 \n\\ par }
*/