CROW-9 CSO is one of the weapons. My problem is this: I went into the damage mode in the second mode of the bomb. But whatever it is, it does not damage it and there are some bugs. And the animations do not fix somehow, problems occur in the second mode.
PHP Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <xs>
#define NAME "CROW-9"
#define VERSION "1.0"
#define AUTHOR "Zombie-Mod.ru/YunusReyiz"
#define BUY_KNIFE "say crow9"
#define DAMAGE_SLASH 10.0
#define DAMAGE_STAB 30.0
#define RANGE_SLASH 50.0
#define RANGE_STAB 70.0
#define NEXTATTACK_SLASH 0.3
#define NEXTATTACK_STAB 1.0
#define KNIFE_KNOCK 5
#define BLOOD 3
#define Reload_Time 1.0
#define CROW_Time 1.5
#define Normal_Time 1.8
#define NEXTATTACK_SLASH 0.3
#define NEXTATTACK_STAB_CROW 2.5
#define NEXTATTACK_STAB_NORMAL 3.1
static const v_knife[] = "models/v_crow9.mdl"
static const p_knife[] = "models/p_crow9.mdl"
static const SoundList[6][] =
{
"weapons/nata_draw.wav",
"weapons/nata_wall.wav",
"weapons/nata_slash.wav",
"weapons/nata_stab.wav",
"weapons/crow9_slasha_1.wav",
"weapons/crow9_slasha_1.wav"
}
static const Blood[][] =
{
"sprites/blood.spr",
"sprites/bloodspray.spr"
}
static g_Blood[sizeof Blood]
static bool:Knife[33]
new g_MaxPlayers, attack[33]
new mode[33]
enum
{
normal = 0,
crow,
notattacked
}
public plugin_init()
{
register_plugin(NAME, VERSION, AUTHOR)
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
RegisterHam(Ham_TakeDamage, "player", "TakeDamage_Pre", 0)
RegisterHam(Ham_TakeDamage, "player", "TakeDamage_Post", 1)
RegisterHam(Ham_Item_Deploy, "weapon_knife", "ChangeModel", 1)
//RegisterHam(Ham_Player_PreThink, "player", "PreThink")
register_forward(FM_EmitSound, "KnifeSound")
register_forward(FM_TraceLine, "fw_TraceLine")
register_forward(FM_TraceHull, "fw_TraceHull")
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "fw_nata_primaryattack_post", 1)
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "fw_nata_secondaryattack_post", 1)
register_clcmd(BUY_KNIFE, "BuyKnife")
g_MaxPlayers = get_maxplayers()
}
public BuyKnife(id)
{
Knife[id] = true
change(id)
engclient_cmd(id, "weapon_knife")
}
public Event_NewRound()
{
for(new i = 0; i < g_MaxPlayers; i++)
Knife[i] = false
}
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 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 hit, target
get_user_aiming(attacker, target, hit)
new Float:mult_dmg = 1.0
if(pev(attacker, pev_button, IN_ATTACK))
mult_dmg = DAMAGE_SLASH
else
if(mode[attacker] == normal) mult_dmg = DAMAGE_STAB
else if(mode[attacker] == crow) mult_dmg = DAMAGE_STAB + 2.5
SetHamParamFloat(4, damage * mult_dmg)
if(mode[attacker] == crow) set_task(1.0, "crow_damaged", attacker)
return HAM_HANDLED
}
public crow_damaged(id)
{
set_weapons_timeidle(id, NEXTATTACK_STAB_CROW)
set_player_nextattack(id, NEXTATTACK_STAB_CROW)
}
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 fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
{
if (!is_user_alive(id))
return FMRES_IGNORED
if (get_user_weapon(id) != CSW_KNIFE)
return FMRES_IGNORED
if(!Knife[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)
static Float:scalar
static buttons ; buttons = pev(id, pev_button)
if (buttons & IN_ATTACK) scalar = RANGE_SLASH
else if (buttons & IN_ATTACK2)
{
if(mode[id] == normal) scalar = RANGE_STAB
else if(mode[id] == crow) scalar = RANGE_STAB + 100.0
}
xs_vec_mul_scalar(v_forward, scalar, 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_user_weapon(id) != CSW_KNIFE)
return FMRES_IGNORED
if(!Knife[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)
static Float:scalar
static buttons ; buttons = pev(id, pev_button)
if (buttons & IN_ATTACK) scalar = RANGE_SLASH
else if (buttons & IN_ATTACK2) scalar = RANGE_STAB
xs_vec_mul_scalar(v_forward, scalar, v_forward)
xs_vec_add(vecStart, v_forward, vecEnd)
engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
return FMRES_SUPERCEDE
}
/*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
}
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])
}
// Primary Attack Speed
public fw_nata_primaryattack_post(ent)
{
if(pev_valid(ent) != 2)
return HAM_IGNORED
new id
id = get_pdata_cbase(ent, 41 , 4)
if(!Knife[id])
return HAM_IGNORED
switch(attack[id])
{
case 0:
{
set_anim(id, 1)
attack[id] = 1
}
case 1:
{
set_anim(id, 2)
attack[id] = 0
}
}
set_weapons_timeidle(id, NEXTATTACK_SLASH)
set_player_nextattack(id, NEXTATTACK_SLASH)
return HAM_HANDLED
}
// Secondary Attack Speed
public fw_nata_secondaryattack_post(ent)
{
if(pev_valid(ent) != 2)
return HAM_IGNORED
new id
id = get_pdata_cbase(ent, 41 , 4)
if(!Knife[id])
return HAM_IGNORED
set_task(0.0, "reloading_before", id)
if(mode[id] == normal)
{
if(mode[id] == crow)
{
if((pev(id, pev_oldbuttons) & IN_ATTACK2))
{
set_task(Reload_Time, "crow_reload", id)
}
set_weapons_timeidle(id, NEXTATTACK_STAB_CROW)
set_player_nextattack(id, NEXTATTACK_STAB_CROW)
}
else if(mode[id] == notattacked)
{
if(!(pev(id, pev_oldbuttons) & IN_ATTACK2))
{
set_task(Reload_Time, "normal_reload", id)
}
set_weapons_timeidle(id, NEXTATTACK_STAB_NORMAL)
set_player_nextattack(id, NEXTATTACK_STAB_NORMAL)
}
}
return HAM_HANDLED
}
public reloading_before(id)
{
set_anim(id, 4)
//new wpn = pev(id, pev_owner)
mode[id] = normal
set_task(Reload_Time, "crow_reload", id)
set_task(Reload_Time, "normal_reload", id)
}
public crow_reload(id)
{
new wpn = pev(id, pev_owner)
if((pev(id, pev_oldbuttons) & IN_RELOAD) && (pev(id, pev_oldbuttons) & IN_ATTACK2))
{
mode[id] = crow
set_anim(id, 5)
set_pdata_float(wpn, 48, CROW_Time, 4)
set_pdata_float(id, 83, CROW_Time, 5)
}
}
public normal_reload(id)
{
new wpn = pev(id, pev_owner)
if(!(pev(id, pev_oldbuttons) & IN_RELOAD))
{
mode[id] = notattacked
set_anim(id, 6)
set_pdata_float(wpn, 48, Normal_Time, 4)
set_pdata_float(id, 83, Normal_Time, 5)
}
}
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();
}
}
}
}
stock set_weapons_timeidle(id, Float:TimeIdle)
{
if(!is_user_alive(id))
return
new entwpn = fm_get_user_weapon_entity(id, CSW_KNIFE)
if (pev_valid(entwpn))
{
set_pdata_float(entwpn, 46, TimeIdle, 4)
set_pdata_float(entwpn, 47, TimeIdle, 4)
set_pdata_float(entwpn, 48, TimeIdle + 1.0, 4)
}
}
stock set_player_nextattack(id, Float:nexttime)
{
if(!is_user_alive(id))
return
const m_flNextAttack = 83
set_pdata_float(id, m_flNextAttack, nexttime, 5)
}
stock set_anim(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()
}