#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <nst_wpn>
#include <xs>
#define PLUGIN "Knife"
#define AUTHOR "Bui duc duy"
#define VERSION "1.0"
enum
{
anim_idle = 0,
anim_slash_1,
anim_slash_2,
anim_draw,
anim_stab,
anim_stab_miss,
anim_slash1_mid,
anim_slash2_mid
}
new Float:g_knife_attack[33]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
RegisterHam(Ham_Weapon_SendWeaponAnim,"weapon_knife","Fw_Weapon_SendWeaponAnim")
RegisterHam(Ham_Weapon_SecondaryAttack,"weapon_knife","Fw_SecondaryAttack_Post",1)
RegisterHam(Ham_Weapon_PrimaryAttack,"weapon_knife","Fw_PrimAttack_Post",1)
register_forward(FM_CmdStart,"Fw_CmdStart")
register_forward(FM_TraceLine,"Fw_TraceLine")
register_forward(FM_TraceHull,"Fw_TraceHull")
}
public Fw_SecondaryAttack_Post(ent)
{
static id
id = pev(ent,pev_owner)
if(!pev_valid(ent) || !is_user_connected(id))
return HAM_IGNORED
set_pdata_float(ent,47,nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+0.5,4)
return HAM_IGNORED
}
public Fw_PrimAttack_Post(ent)
{
static id
id = pev(ent,pev_owner)
if(!pev_valid(ent) || !is_user_connected(id))
return HAM_IGNORED
set_pdata_float(ent,46, 0.3 ,4)
return HAM_IGNORED
}
// set distance
public Fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
{
if (!is_user_connected(id))
return FMRES_IGNORED;
if (!is_user_alive(id))
return FMRES_IGNORED;
if (get_user_weapon(id) != CSW_KNIFE)
return FMRES_IGNORED;
pev(id, pev_v_angle, vector_end)
angle_vector(vector_end, ANGLEVECTOR_FORWARD, vector_end)
xs_vec_mul_scalar(vector_end, nst_wpn_get_float3(id, NST_WPN_DATA_DISTANCE), vector_end)
xs_vec_add(vector_start, vector_end, vector_end)
engfunc(EngFunc_TraceLine, vector_start, vector_end, 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_connected(id))
return FMRES_IGNORED;
if (!is_user_alive(id))
return FMRES_IGNORED;
if (get_user_weapon(id) != CSW_KNIFE)
return FMRES_IGNORED;
pev(id, pev_v_angle, vector_end)
angle_vector(vector_end, ANGLEVECTOR_FORWARD, vector_end)
xs_vec_mul_scalar(vector_end, nst_wpn_get_float3(id, NST_WPN_DATA_DISTANCE), vector_end)
xs_vec_add(vector_start, vector_end, vector_end)
engfunc(EngFunc_TraceHull, vector_start, vector_end, ignored_monster, hull, id, handle)
return FMRES_SUPERCEDE;
}
//
/* Knife Hook delay */
public Fw_CmdStart(id,handle,seed)
{
static iButton,iEnt
iButton = get_uc(handle,UC_Buttons)
iEnt = find_ent_by_owner(-1, "weapon_knife", id)
if(get_user_weapon(id) ==CSW_KNIFE)
{
if (iButton&IN_ATTACK2)
{
if (get_gametime() - g_knife_attack[id] < nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+1.0) return
g_knife_attack[id] = get_gametime()
client_print(id, print_chat, "Right Mouse")
//set_uc(handle,UC_Buttons,iButton&~IN_ATTACK2)
set_weapon_anim(id, anim_stab_miss)
if (task_exists(id)) remove_task(id)
set_task(nst_wpn_get_float3(id, NST_WPN_DATA_DELAY),"task_knife_attack",id)
set_pdata_float(iEnt, 47, nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+0.5,4)
}
}
}
public task_knife_attack(id)
{
new ent = find_ent_by_owner(-1,"weapon_knife",id)
if(!is_user_alive(id) || get_user_weapon(id) != CSW_KNIFE) return
ExecuteHamB(Ham_Weapon_SecondaryAttack,ent)
client_print(id, print_chat, "damage extract")
}
public Fw_Weapon_SendWeaponAnim(ent,anim)
{
static id
id = pev(ent,pev_owner)
if(!pev_valid(ent) || !is_user_connected(id)) return HAM_IGNORED
if (get_gametime() - g_knife_attack[id] < nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+1.0 && get_user_weapon(id)==CSW_KNIFE || anim == anim_stab)
{
client_print(id, print_chat, "Anim Blocked %i", anim)
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
stock set_weapon_anim(id, anim)
{
set_pev(id, pev_weaponanim, anim)
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
write_byte(anim)
write_byte(pev(id,pev_body))
message_end()
}