#include < amxmodx > #include < fun > #include < engine > #include < zombieplague > #include < fakemeta > #include < hamsandwich > #include < xs > #define PLAYER_LINUX_XTRA_OFF 4 #define m_flNextAttack 83 #define ANIM_IDLE 0 #define ANIM_DRAW 1 #define ANIM_STAB 4 #define ANIM_STABHIT 5 #define ANIM_STABMISS 6 #define ANIM_SLASH1 3 #define ANIM_SLASH2 3 new g_knifeid new g_has_knife[33] , g_oldweap[33] ,g_anim[33], g_primaryattack[33] , g_secondaryattack[33] , g_hs[33] , g_block[33] , g_dmg[33] new cvar_dragont_dmg , cvar_dragont_dmg2 , cvar_dragont_dmghs , cvar_dragont_dmghs2 , cvar_dragont_radius , cvar_dragont_radius2 , cvar_dragont_bloodsize new spr_blood1 , spr_blood2,bool:g_skin[33],bool:g_tail[33] new knife_vmodel[64] = "models/v_dragontail.mdl" new knife_pmodel[64] = "models/p_knife.mdl" new const dragon_knife_effect[] = "models/ef_dragontail.mdl" new const oldknife_sounds[][] = { "weapons/knife_deploy1.wav", "weapons/knife_hit1.wav", "weapons/knife_hit2.wav", "weapons/knife_hit3.wav", "weapons/knife_hit4.wav", "weapons/knife_hitwall1.wav", "weapons/knife_slash1.wav", "weapons/knife_slash2.wav", "weapons/knife_stab.wav" } new const knife_sounds[][] = { "weapons/dragontail_draw.wav", "weapons/dragontail_hit1.wav", "weapons/dragontail_slash1.wav", "weapons/dragontail_slash1.wav", "weapons/dragontail_slash1.wav", "weapons/dragontail_wall.wav", "weapons/dragontail_slash1.wav", "weapons/dragontail_slash1.wav", "weapons/dragontail_stab_hit.wav" } public plugin_init( ) { register_plugin("[ZP] barney knife","0.1","Barney/=)/Exolent[jNr]") g_knifeid = zp_register_extra_item( "\rDragon \yTail", 3, ZP_TEAM_HUMAN ); register_forward(FM_EmitSound, "fw_emitsound") register_forward(FM_CmdStart, "fw_cmdstart") register_forward(FM_UpdateClientData, "fw_updateclientdata_post", 1) register_event("CurWeapon","ev_curweapon","be","1=1") register_message(get_user_msgid("DeathMsg"), "message_deathmsg") RegisterHam(Ham_Weapon_WeaponIdle,"weapon_knife","fw_knifeidleanim") RegisterHam(Ham_TraceAttack,"player","fw_knifetraceattack") RegisterHam(Ham_TakeDamage,"player","fw_knifetakedamage") RegisterHam(Ham_Spawn, "player", "fw_spawnpost", 1) cvar_dragont_dmg = register_cvar("zp_dragont_dmg", "200.0") cvar_dragont_dmg2 = register_cvar("zp_dragont_dmg2", "400.0") cvar_dragont_dmghs = register_cvar("zp_dragont_dmghs", "400.0") cvar_dragont_dmghs2 = register_cvar("zp_dragont_dmghs2", "1000.0") cvar_dragont_radius = register_cvar("zp_bdragont_radius", "70.0") cvar_dragont_radius2 = register_cvar("zp_dragont_radius2", "100.0") cvar_dragont_bloodsize = register_cvar("zp_dragont_bloodsize", "8") } public plugin_precache() { precache_model(knife_vmodel) precache_model(knife_pmodel) precache_model(dragon_knife_effect) spr_blood1 = precache_model("sprites/blood.spr") spr_blood2 = precache_model("sprites/bloodspray.spr") for(new i = 0; i < sizeof knife_sounds; i++) precache_sound(knife_sounds[i]) } public zp_extra_item_selected( id, itemid ) { if(itemid == g_knifeid){ g_has_knife[id] = 1 g_primaryattack[id] = g_secondaryattack[id] = 0 remove_task(id) if(get_user_weapon(id) == CSW_KNIFE) { update_model(id) util_playweaponanimation(id, ANIM_DRAW) set_pdata_float(id, m_flNextAttack, 1.5 , PLAYER_LINUX_XTRA_OFF) emit_sound(id, CHAN_WEAPON, knife_sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM) } } } public fw_spawnpost(id) { if(!is_user_alive(id)) return; g_has_knife[id] = 0 g_primaryattack[id] = g_secondaryattack[id] = 0 remove_task(id) g_oldweap[id] = get_user_weapon(id) return; } public fw_knifetraceattack(id, attacker, Float:dmg, Float:dir[3], ptr, dmgtype) { if(!is_user_alive(attacker) || zp_get_user_zombie(attacker) || get_user_weapon(attacker) != CSW_KNIFE || !g_has_knife[attacker]) return HAM_IGNORED; return HAM_SUPERCEDE; } public fw_knifetakedamage(victim, inflictor, attacker, Float:damage, damage_type) { if(!is_user_alive(attacker) || zp_get_user_zombie(attacker) || get_user_weapon(attacker) != CSW_KNIFE || !g_has_knife[attacker]) return HAM_IGNORED; if(g_dmg[victim]) { g_dmg[victim] = 0 return HAM_IGNORED; } return HAM_SUPERCEDE; } public fw_emitsound(id, channel, const sound[]) { if(!is_user_alive(id) || zp_get_user_zombie(id) || get_user_weapon(id) != CSW_KNIFE || !g_has_knife[id]) return FMRES_IGNORED for(new i = 0; i < sizeof oldknife_sounds; i++) { if(equal(sound, oldknife_sounds[i])) { if(i == 0) emit_sound(id, channel, knife_sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM) // DRAW SOUND return FMRES_SUPERCEDE } } return FMRES_IGNORED } public fw_cmdstart(id, uc_handle, seed) { if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_has_knife[id] || get_user_weapon(id) != CSW_KNIFE) return FMRES_IGNORED; new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF) if(g_primaryattack[id] || g_secondaryattack[id]) { if(flNextAttack > 0.1) return FMRES_IGNORED; set_pdata_float(id, m_flNextAttack, 0.1, PLAYER_LINUX_XTRA_OFF) return FMRES_SUPERCEDE; } if((get_uc(uc_handle, UC_Buttons) & IN_ATTACK) && !g_secondaryattack[id]) { if(flNextAttack > 0.1) return FMRES_IGNORED; g_primaryattack[id] = 1 g_secondaryattack[id] = 0 remove_task(id) //set_task(0.2,"knife_effect",id) //set_task(0.7,"knife_effect",id) set_task(0.1,"knife_attack",id) set_task(0.6,"knife_attack",id) g_anim[id] = 2 set_pdata_float(id, m_flNextAttack, 0.1, PLAYER_LINUX_XTRA_OFF) util_playweaponanimation(id, ANIM_SLASH2) return FMRES_IGNORED; } if((get_uc(uc_handle, UC_Buttons) & IN_ATTACK2) && !g_primaryattack[id]) { if(flNextAttack > 0.1) return FMRES_IGNORED; g_primaryattack[id] = 0 g_secondaryattack[id] = 1 util_playweaponanimation(id, ANIM_STAB) remove_task(id) set_task(0.6,"knife_attack",id) set_pdata_float(id, m_flNextAttack, 0.1, PLAYER_LINUX_XTRA_OFF) return FMRES_IGNORED; } return FMRES_IGNORED; } public fw_knifeidleanim(Weapon) { new id = get_pdata_cbase(Weapon, 41, 4) if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_has_knife[id] || get_user_weapon(id) != CSW_KNIFE) return HAM_IGNORED; if(g_primaryattack[id] || g_secondaryattack[id]) return HAM_SUPERCEDE; return HAM_IGNORED; } public knife_effect(id){ if(is_user_alive(id) && is_user_connected(id)){ static ent1; ent1 = -1; while((ent1 = engfunc(EngFunc_FindEntityByString, ent1, "classname", "knife_effect"))) return PLUGIN_HANDLED new ent = create_entity("info_target") static Float:Origin[3],Float:g_angles[3], Float:g_v_angles[3] pev(id, pev_angles, g_angles) pev(id, pev_v_angle, g_v_angles) g_angles[0] += 20.0 entity_set_vector(ent, EV_VEC_angles, g_angles) entity_set_vector(ent, EV_VEC_v_angle, g_v_angles) pev(id, pev_origin, Origin) entity_set_origin(ent, Origin) entity_set_string(ent,EV_SZ_classname, "knife_effect") entity_set_model(ent, dragon_knife_effect) entity_set_int(ent, EV_INT_solid, SOLID_NOT) entity_set_int(ent, EV_INT_movetype, MOVETYPE_NONE) if(!g_skin[id]) set_pev(ent,pev_skin,1) else if(g_skin[id]) set_pev(ent,pev_skin,0) new Float:maxs[3] = {40.0, 40.0, 1.0} new Float:mins[3] = {-40.0, -40.0, -1.0} entity_set_size(ent, mins, maxs) if(g_anim[id] == 2) set_entity_anim(ent,2) else if(g_anim[id] == 1) set_entity_anim(ent,0) g_anim[id]-- g_skin[id] = false g_tail[id] = false set_task(0.1, "remove_knife_effect", ent) } return PLUGIN_HANDLED } public remove_knife_effect(ent) { remove_entity(ent) } public fw_updateclientdata_post(Player, SendWeapons, CD_Handle) { if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_KNIFE) || !g_has_knife[Player]) return FMRES_IGNORED //set_cd(CD_Handle, CD_ID, 0)// - WORK :DD set_cd(CD_Handle, CD_flNextAttack, halflife_time() + 0.001 ); if(get_cd(CD_Handle, CD_WeaponAnim) != ANIM_STAB && g_secondaryattack[Player]) { set_cd(CD_Handle, CD_WeaponAnim, ANIM_STAB); return FMRES_SUPERCEDE; } return FMRES_HANDLED } public ev_curweapon(id) { if(!is_user_alive(id) || zp_get_user_zombie(id)) return PLUGIN_CONTINUE if(read_data(2) != CSW_KNIFE) { remove_task(id) g_primaryattack[id] = g_secondaryattack[id] = 0 g_oldweap[id] = read_data(2) return PLUGIN_CONTINUE } if(!g_has_knife[id]) return PLUGIN_CONTINUE update_model(id) if(g_oldweap[id] != CSW_KNIFE) { util_playweaponanimation(id, ANIM_DRAW) set_pdata_float(id, m_flNextAttack, 1.5 , PLAYER_LINUX_XTRA_OFF) emit_sound(id, CHAN_WEAPON, knife_sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM) } g_oldweap[id] = read_data(2) return PLUGIN_CONTINUE } public message_deathmsg(msg_id, msg_dest, id) { new weapon[33], attacker , victim get_msg_arg_string(4, weapon , 32) attacker = get_msg_arg_int(1) victim = get_msg_arg_int(2) if(!is_user_alive(attacker) || zp_get_user_zombie(attacker) || !(equal(weapon,"knife")) || get_user_weapon(attacker) != CSW_KNIFE || !g_has_knife[attacker] || attacker == victim) return PLUGIN_CONTINUE if(g_block[victim]) { g_block[victim] = 0 message_begin(MSG_BROADCAST, msg_id) write_byte(attacker) write_byte(victim) write_byte(g_hs[victim]) write_string("knife") message_end() return PLUGIN_HANDLED; } g_hs[victim] = 0 return PLUGIN_CONTINUE } public knife_clear(id) { if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_has_knife[id] || get_user_weapon(id) != CSW_KNIFE) return; g_primaryattack[id] = 0 g_secondaryattack[id] = 0 util_playweaponanimation(id, ANIM_IDLE) } public update_model(id) { if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_has_knife[id] || get_user_weapon(id) != CSW_KNIFE) return PLUGIN_CONTINUE; entity_set_string(id, EV_SZ_viewmodel, knife_vmodel) entity_set_string(id, EV_SZ_weaponmodel, knife_pmodel) return PLUGIN_CONTINUE; } public clear_values(id) { g_has_knife[id] = 0 g_dmg[id] = 0 g_primaryattack[id] = 0 g_secondaryattack[id] = 0 g_oldweap[id] = -3 remove_task(id) } public knife_attack(id) { if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_has_knife[id] || get_user_weapon(id) != CSW_KNIFE) return; new knife = find_ent_by_owner ( -1, "weapon_knife", id ) new Float:damage , Float:damagehs , Float:radius if(g_primaryattack[id]) { g_primaryattack[id] = 2 //util_playweaponanimation(id, ANIM_SLASH2) //remove_task(id) set_task(0.7,"knife_clear",id) set_pdata_float(id, m_flNextAttack, 0.5, PLAYER_LINUX_XTRA_OFF) damage = get_pcvar_float(cvar_dragont_dmg) damagehs = get_pcvar_float(cvar_dragont_dmghs) radius = get_pcvar_float(cvar_dragont_radius) } if(g_secondaryattack[id]) { ExecuteHam(Ham_Weapon_SecondaryAttack, knife) g_secondaryattack[id] = 2 remove_task(id) set_task(0.5,"knife_clear",id) util_playweaponanimation(id, ANIM_STABHIT) set_pdata_float(id, m_flNextAttack, 0.7, PLAYER_LINUX_XTRA_OFF) damage = get_pcvar_float(cvar_dragont_dmg2) damagehs = get_pcvar_float(cvar_dragont_dmghs2) radius = get_pcvar_float(cvar_dragont_radius2) } static victim new Float:origin[3],Float:originv[3],count,target,body pev(id, pev_origin,origin) get_user_aiming(id, target, body) while((victim = find_ent_in_sphere(victim, origin, radius)) != 0) { if(!is_user_connected(victim)) { if(is_valid_ent(victim)) { static classname[33] entity_get_string(victim, EV_SZ_classname, classname, 32) if(equal(classname,"func_breakable")) { if(!(player_takedamage(id,victim))) continue; ExecuteHamB(Ham_TakeDamage, victim, id , id , 300.0 , DMG_BULLET | DMG_NEVERGIB) client_print(0,print_chat,"break damage") } } continue; } if(!is_user_alive(victim) || !zp_get_user_zombie(victim) || victim == id) continue; g_hs[victim] = 0 g_block[victim] = 0 g_dmg[victim] = 0 pev(victim, pev_origin,originv) if(!(player_takedamage(id,victim))) continue; if(g_primaryattack[id]){ if(target == victim) { if(body == 1) { if(pev(victim,pev_health) - damagehs <= 0) { g_hs[victim] = 1 g_block[victim] = 1 } g_dmg[victim] = 1 ExecuteHamB(Ham_TakeDamage, victim, id , id , damagehs , DMG_BULLET | DMG_NEVERGIB) g_skin[id] = true g_tail[id]=true knife_effect(id) }else{ if(pev(victim,pev_health) - damage <= 0) g_block[victim] = 1 g_dmg[victim] = 1 ExecuteHamB(Ham_TakeDamage, victim, id , id , damage , DMG_BULLET | DMG_NEVERGIB) g_skin[id] = true g_tail[id]=true knife_effect(id) } }else{ if(pev(victim,pev_health) - damage <= 0) g_block[victim] = 1 g_dmg[victim] = 1 ExecuteHamB(Ham_TakeDamage, victim, id , id , damage , DMG_BULLET | DMG_NEVERGIB) g_skin[id] = true g_tail[id]=true knife_effect(id) } } else if(g_secondaryattack[id]){ if(target == victim) { if(body == 1) { if(pev(victim,pev_health) - damagehs <= 0) { g_hs[victim] = 1 g_block[victim] = 1 } g_dmg[victim] = 1 ExecuteHamB(Ham_TakeDamage, victim, id , id , damagehs , DMG_BULLET | DMG_NEVERGIB) }else{ if(pev(victim,pev_health) - damage <= 0) g_block[victim] = 1 g_dmg[victim] = 1 ExecuteHamB(Ham_TakeDamage, victim, id , id , damage , DMG_BULLET | DMG_NEVERGIB) } }else{ if(pev(victim,pev_health) - damage <= 0) g_block[victim] = 1 g_dmg[victim] = 1 ExecuteHamB(Ham_TakeDamage, victim, id , id , damage , DMG_BULLET | DMG_NEVERGIB) } } message_begin(MSG_BROADCAST,SVC_TEMPENTITY) write_byte(TE_BLOODSPRITE) engfunc(EngFunc_WriteCoord, originv[0]) engfunc(EngFunc_WriteCoord, originv[1]) engfunc(EngFunc_WriteCoord, originv[2]) write_short(spr_blood1) write_short(spr_blood2) write_byte(249) // color index write_byte(get_pcvar_num(cvar_dragont_bloodsize)) // size message_end() count++ } if(count) emit_sound(id, CHAN_WEAPON, knife_sounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM) // HIT SOUND if(!count) { new aim[3],Float:aiming[3] get_user_origin(id, aim, 3) aiming[0] = float(aim[0]) aiming[1] = float(aim[1]) aiming[2] = float(aim[2]) new Float:dist = get_distance_f(aiming, origin); if(dist <= radius ) { emit_sound(id, CHAN_WEAPON, knife_sounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM) // HIT WALL SOUND }else{ if(g_primaryattack[id]){ emit_sound(id, CHAN_WEAPON, knife_sounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)// MISS SOUND knife_effect(id) g_skin[id] = false } if(g_secondaryattack[id]) emit_sound(id, CHAN_WEAPON, knife_sounds[random_num(3,4)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM) // MISS SOUND } } } public player_takedamage(id, victim) { new Float:origin[3], Float:origin2[3],Float:originv[3] , Float:angles[3],Float:v_forward[3],Float:v_forward2[3]; pev(id,pev_angles, angles) pev(id, pev_origin , origin) pev(id, pev_origin , origin2) pev(victim,pev_origin,originv) if(!(get_can_see(origin,originv))) return 0; angles[0] = 0.0 engfunc(EngFunc_MakeVectors, angles); global_get(glb_v_forward, v_forward); global_get(glb_v_forward, v_forward2); if(g_primaryattack[id]) { xs_vec_mul_scalar(v_forward, get_pcvar_float(cvar_dragont_radius), v_forward); xs_vec_mul_scalar(v_forward2, -1 * get_pcvar_float(cvar_dragont_radius), v_forward2); } if(g_secondaryattack[id]) { xs_vec_mul_scalar(v_forward, get_pcvar_float(cvar_dragont_radius2), v_forward); xs_vec_mul_scalar(v_forward2, -1 * get_pcvar_float(cvar_dragont_radius2), v_forward2); } xs_vec_add(origin, v_forward, origin); xs_vec_add(origin2, v_forward2, origin2); new result if(get_distance_f(originv,origin) <= get_distance_f(originv,origin2)) result = 1 if(get_distance_f(originv,origin) > get_distance_f(originv,origin2)) result = 0 return result; } stock get_can_see(Float:ent_origin[3], Float:target_origin[3]) { new Float:hit_origin[3] trace_line(-1, ent_origin, target_origin, hit_origin) if (!vector_distance(hit_origin, target_origin)) return 1; return 0; } 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() } stock set_entity_anim(ent, anim) { entity_set_float(ent, EV_FL_animtime, get_gametime()) entity_set_float(ent, EV_FL_framerate, 1.0) entity_set_int(ent, EV_INT_sequence, anim) } 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_disconnect(id) clear_values(id) public client_connect(id) clear_values(id) public zp_user_infected_post(id) clear_values(id)