#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <xs>
#define NAME ":: [ExtraItems] Knife Generator ::"
#define VERSION "1.0"
#define AUTHOR "Zombie-Mod.ru"
#define KNIFE_NAME "mastercombat"
#define KNIFE_COST 0
#define BUY_KNIFE "say /mastercombat"
#define CHAT_ALIVE "!g[Knife] !yOnly !gAlive !yuser"
#define CHAT_ALREADY "!g[Knife] !yDo you !galready !yhave an item currently"
#define CHAT_NOMONEY "!g[Knife] !yNot enough !gmoney"
#define KNIFE_GRAVITY 0.1
#define KNIFE_SPEED 900.0
#define SEC_DMG 4.0
#define PRIM_DMG 4.0
#define SEC_HEAD_DMG 2.2
#define PRIM_HEAD_DMG 3.4
#define KNIFE_KNOCK 5
#define BLOOD 3
#define ADMIN "0"
static const v_knife[] = "models/knife/v_mastercombat.mdl"
static const p_knife[] = "models/knife/p_mastercombat.mdl"
static const SoundList[][] =
{
"mastercombat/mastercombat_deploy1.wav", // 0
"mastercombat/mastercombat_hwall.wav", // 1
"mastercombat/mastercombat_slash1.wav", // 2
"mastercombat/mastercombat_stab.wav", // 3
"mastercombat/mastercombat1.wav", // 4
"mastercombat/mastercombat2.wav" // 5
}
static const Blood[][] =
{
"sprites/blood.spr",
"sprites/bloodspray.spr"
}
static g_Blood[sizeof Blood]
static bool:Knife[33]
new primary[33]
public plugin_init()
{
register_plugin(NAME, VERSION, AUTHOR)
RegisterHam(Ham_TakeDamage, "player", "TakeDamage_Pre", 0)
RegisterHam(Ham_TakeDamage, "player", "TakeDamage_Post", 1)
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "fwPrimaryAttack")
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "fwSecondaryAttack")
RegisterHam(Ham_Item_Deploy, "weapon_knife", "ChangeModel", 1)
RegisterHam(Ham_Player_PreThink, "player", "PreThink")
register_forward(FM_EmitSound, "KnifeSound")
register_clcmd(BUY_KNIFE, "BuyKnife")
}
public BuyKnife(id)
{
if(!is_user_alive(id)) { ColorChat(id, CHAT_ALIVE); return; }
if(Knife[id]) { ColorChat(id, CHAT_ALREADY); return; }
if(fm_get_user_money(id) < KNIFE_COST) { ColorChat(id, CHAT_NOMONEY); return; }
fm_set_user_money(id, fm_get_user_money(id) - KNIFE_COST, 0)
Knife[id] = true
change(id)
engclient_cmd(id, "weapon_knife")
}
public ChangeModel(weapon)
{
if(!pev_valid(weapon))
return HAM_IGNORED
static player
player = pev(weapon, pev_owner)
if(!is_user_alive(player))
return HAM_IGNORED
if(!Knife[player])
return HAM_IGNORED
change(player)
return HAM_HANDLED
}
public KnifeSound(id, channel, sample[], Float:volume, Float:attn, flags, pitch)
{
if(!equal(sample, "weapons/knife_", 14) || !Knife[id])
return FMRES_IGNORED
if(equal(sample[8], "knife_hitwall", 13))
PlaySound(id, 1)
else
if(equal(sample[8], "knife_hit", 9))
switch(random(2))
{
case 0:PlaySound(id, 4)
case 1:PlaySound(id, 5)
}
if(equal(sample[8], "knife_slash", 11)) PlaySound(id, 2)
if(equal(sample[8], "knife_stab", 10)) PlaySound(id, 3)
if(equal(sample[8], "knife_deploy", 12)) PlaySound(id, 0)
return FMRES_SUPERCEDE
}
public fwPrimaryAttack(ent)
{
new id = pev(ent, pev_owner)
primary[id] = 1
}
public fwSecondaryAttack(ent)
{
new id = pev(ent, pev_owner)
primary[id] = 0
}
public TakeDamage_Pre(victim, inflictor, attacker, Float:damage, damagetype)
{
if(!is_user_alive(attacker))
return HAM_IGNORED
if(!Knife[attacker] || get_user_weapon(attacker) != CSW_KNIFE)
return HAM_IGNORED
new bool:head = (get_pdata_int(victim, 75) == HIT_HEAD)
new Float:mult_dmg = 1.0
if(primary[attacker])
mult_dmg = head ? PRIM_HEAD_DMG : PRIM_DMG
else
mult_dmg = head ? SEC_HEAD_DMG : SEC_DMG
SetHamParamFloat(4, damage * mult_dmg)
return HAM_HANDLED
}
public TakeDamage_Post(victim, inflictor, attacker, Float:damage, damagetype)
{
if(!is_user_alive(attacker) || !is_user_alive(victim))
return HAM_IGNORED
if(!Knife[attacker] || get_user_weapon(attacker) != CSW_KNIFE)
return HAM_IGNORED
new Float:Origin[3], Float:Origin2[3], Float:Velocity[3]
pev(attacker, pev_origin, Origin)
pev(victim, pev_origin, Origin2)
xs_vec_sub(Origin2, Origin, Velocity)
xs_vec_normalize(Velocity, Velocity)
xs_vec_mul_scalar(Velocity, (KNIFE_KNOCK * 100.0), Velocity)
if(Velocity[2] <= 100.0)
Velocity[2] = random_float(150.0, 250.0)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_BLOODSPRITE);
engfunc(EngFunc_WriteCoord, Origin2[0])
engfunc(EngFunc_WriteCoord, Origin2[1])
engfunc(EngFunc_WriteCoord, Origin2[2])
write_short(g_Blood[0])
write_short(g_Blood[1])
write_byte(77)
write_byte(BLOOD)
message_end()
set_pev(victim, pev_velocity, Velocity)
return HAM_HANDLED
}
public PreThink(id)
{
if(!is_user_alive(id)) return HAM_IGNORED
if(!Knife[id]) return HAM_IGNORED
if(get_user_weapon(id) != CSW_KNIFE)
{
set_pev(id, pev_gravity, 0.8)
set_pev(id, pev_maxspeed, 240.0)
return HAM_IGNORED
}
set_pev(id, pev_gravity, KNIFE_GRAVITY)
set_pev(id, pev_maxspeed, KNIFE_SPEED)
return HAM_HANDLED
}
public plugin_precache()
{
precache_model(v_knife)
precache_model(p_knife)
static i
for(i = 0; i <= charsmax(SoundList); i++)
precache_sound(SoundList[i])
for(i = 0; i <= charsmax(Blood); i++)
g_Blood[i] = precache_model(Blood[i])
}
change(id)
{
set_pev(id, pev_viewmodel2, v_knife)
set_pev(id, pev_weaponmodel2, p_knife)
}
stock PlaySound(Ent, Sound)
engfunc(EngFunc_EmitSound, Ent, CHAN_WEAPON, SoundList[_:Sound], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
stock is_user_admin(id)
{
new __flags=get_user_flags(id);
return (__flags>0 && !(__flags&ADMIN_USER));
}
stock fm_set_user_money(index, money, flash)
{
set_pdata_int(index, 115, money)
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Money"), _, index)
write_long(money)
write_byte(flash ? 1 : 0)
message_end()
}
stock fm_get_user_money(index)
return get_pdata_int(index, 115)
stock ColorChat(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4") // Green Color
replace_all(msg, 190, "!y", "^1") // Default Color
replace_all(msg, 190, "!team", "^3") // Team Color
if (id) players[0] = id; else get_players(players, count, "ch")
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
}