rnVERSION "23 APRIL 2023"
rnAUTHOR ""
rn
rn
rn

rn
rn
rnDescription
rnPress the +attack2 (right mouse button) to throw a knife or a spade and kill the enemy
rn
rnChatGPT:
rnThis code is a plugin for the Day of Defeat game in amxx 1.8.2 Goldsrc. It is designed to create effects and sounds when using the knife in the game. It also changes the weapon box model to match the knife being used. The code also handles collisions of the knife with players and other objects in the game, including breakable objects.
rn
rn
- Weaponbox retuned to flying knife
rn - Spakles when spadekinife hit the wall in hands or in air
rn - Bloodpuff when kill player
rn - Hud kill info works good and correctly
rn - Update frags and kills is scoreboard (TAB)
rn - Correctly orientation of rotating , blade to front
rn - You can set private models for throw knife.
rn - When knife flyis, we hear roation sound.
rn
rn
rn
rnCVAR:
rn
rn
- Stack in wall for 2 seconds yes = 1; no = 0
rn - additional blood splashes yes = 1; no = 0
rn - Pitch vector corrector Z-axis ~200 is good. 0 = parallel to ground
rn - Velocity of throw 500 = 3 metres ; 1800 = 30 metres
rn - Rotation speed of spade/knife ~800 is good
rn
rn
rn
rnTo Do
rn
- Need to Make hands empty after throw, cause now it autochanges to primary weapon
rn - REgister sever config Friendly fire .. and mke FF knife attack
rn - DONE 1.7: Turn off drop weaponbox when press G
rn - DONE 1.7: Need to register touch breakable objects to destroy or make sparkle like from wall-toching
rn
rn
rn
rnNew is version 1.5:
rn
- Spakles works better in spawn and some maps ( MSG_PVS replaced to MSG_ALL )
rn - Cleared some functions Deleted: pev(flyknifeid, pev_globalname, status,31
rn - Added new cvars
rn
rn
rnNew is version 1.6: july 2022
rn
- When knife flyis, we hear roation sound.
rn
rn
rnNew is version 1.7: november 2022
rn
- Turn off drop weaponbox when press G
rn - Knife destroys windows, woods, but not destroy walls in dod_chrlie.bsp and another maps.
rn - Better perfomance, I did blocked some func calls, for clear "client_prethink"
rn
rn
rnNew is version 1.8: March-April 2022
rn
- Better perfomance: Full turn-off ClientPrethink. Now: Ham_Item_PreFrame. it run only when knife in arms , and we don't need asking system do we have knife now , how it was in previus versions in CurWeapon_P.
rn - Add trail for flying knife
rn
rn
rnNeed fix: It is necessary to continue the definition of breaking objects, now the knife can break the wood of the door, only if they do not have the TARGET parameter. the map is so old that there is no target parameter in the very essence of the glass, so there is nothing to turn to for verification. (Spawn Allies window)
rn
rnFor not registred in forum players:
rn
#includern#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rnrn#define m_knifeItem 272rn//// Fakameta-engine interpriterrn/*rn#define pev(%1, %2, %3, %4) entity_get_string(%1 ,EV_SZ_classname,%3, %4)rn#define set_pev(%1, %2, %3) entity_set_string(%1 ,EV_SZ_classname,%3)rn#define set_pev(%1, pev_movetype, %2) entity_set_int(%1,EV_INT_movetype, %2) // EV_INT_movetypern#define set_pev(%1, pev_solid, %2) entity_set_int(%1,EV_INT_solid, %2) // EV_INT_solidrn#define set_pev(%1, pev_angles, %2) entity_set_vector(%1, EV_VEC_angles, %2)rn*/rnrn/// Register arraty of names and modelsrnnew KNIVES_NAMES[3][] = {"weapon_amerknife","weapon_gerknife","weapon_spade"}rnnew KNIVES_MODELS[3][] = {"models/w_amerk.mdl","models/w_paraknife.mdl","models/w_spade.mdl"}rn/// Register array of soundsrnnew const g_ThrowSound[] = "weapons/knifeswing2.wav"rnnew const g_ThrowFlySound[] = "weapons/knifeswing2.wav"rnnew const g_ThrowHitwallSound[] = "weapons/cbar_hit1.wav"rnnew const g_ThrowHitHumanSound[] = "weapons/hit_grass2.wav"rn// Register player triggerrnrnrn// spade 19/gerknife 2/amerk 1/britk 37rn// Register messages rnnew g_SpriteBloodrnnew g_SpriteBlood2rnnew g_msgBloodPuff // bloodpuff by touching knife to playerrnnew g_MsgDeathMsg // register hud message who kills with knifetypernnew g_FhSetModel // id for register event to setmodel by FAKEMETA in weaponboxspawn rn// CVarsrnnew cv_stackinwall // Stack 1 = 0, no stack in wall = 0rnnew cv_bldsprt // bonus boold splashes 1 on . 0 = off rnnew cv_angpitch // angle-up by throw rnnew cv_spspeed // speed fly spadernnew cv_sprot // rotation speedrnnew cv_trail // trail for knifern//// Function list rn/*rnplugin_precachernplugin_initrnplayer_Spawn_P // block drop knife by G button (drop command)rnDeathMsg_P // block drop knife by G button (drop command)rnCurWeapon_P // parse knife name for drop this is fix for drop only knife without pistol or else.rnclient_connect // block drop knife by G button (drop command)rnclient_PreThink // oldway +attack2 to throwknifernHam_Weapon_P // +attack to throwknifernWeaponBox_Drop_P // accepting for drop knifernWeaponBox_Spawn // register weaponbox with knife to make it throwrnWeaponbox_Retune // set movetype, new classname, set rotation, set velocityrnWeaponBox_Touch // register touchrnParticle_Fx // fx when you stab the wall hands with knife to make sparkle :DrnWeaponBox_Unstuck // Back movetype after stack in wallrnWeaponBox_Sound // Repeats rotation sound whe knife flyesrn*/rn// Playe's Arrayrn// многоуровневый массив с указателемrnenum _:PLAYER_DATArn{rn bool:accept_throw, // if (get_user_weapon(i_player,_,_) == any knife or spade) {accepttofly = true}rn bool:input_b, // bool for mouse2 buttonrn knifetype, // = get_user_weapon(i_player,_,_) ; = knifetype - SET HUD KILL ICON AND W_MODELrn knifename[17], rn teamrn}rnrnnew Float:TumbleVector[3]rnrn// server datarnnew g_maxpl // need for difference touch index numsrnnew g_FriendlyFirern// создаём массив в с указательным массивомrnnew g_arr[33][PLAYER_DATA]rnrnrnpublic plugin_precache()rn{rn precache_model(KNIVES_MODELS[0])rn precache_model(KNIVES_MODELS[1])rn precache_model(KNIVES_MODELS[2])rn precache_sound(g_ThrowSound)rn precache_sound(g_ThrowFlySound)rn precache_sound(g_ThrowHitwallSound)rn precache_sound(g_ThrowHitHumanSound)rn rn g_SpriteBlood = precache_model("sprites/blood-narrow.spr")rn g_SpriteBlood2 = precache_model("sprites/effects/debris_tile1.spr")rn rn}rnrnpublic plugin_init()rn{rn register_plugin("DOD THROW KNIFES", "2023", "America")rn rn cv_stackinwall = register_cvar("stack1_nostack0","0")rn cv_bldsprt = register_cvar("bloodspash1_no0","0")rn rn cv_angpitch = register_cvar("sp_angle_pitch","200")rn cv_spspeed = register_cvar("sp_speed","1600")rn cv_sprot = register_cvar("sp_rotation","800")rn cv_trail = register_cvar("fx_trail","1")rn rn rn g_maxpl = get_maxplayers()rn g_FriendlyFire = get_cvar_num ( "mp_friendlyfire")rnrn // accepty to drop'n flyrn register_event("CurWeapon","CurWeapon_P","be", "1=1");rn RegisterHam(Ham_DOD_Item_CanDrop,KNIVES_NAMES[0],"WeaponBox_Drop_P")rn RegisterHam(Ham_DOD_Item_CanDrop,KNIVES_NAMES[1], "WeaponBox_Drop_P")rn RegisterHam(Ham_DOD_Item_CanDrop,KNIVES_NAMES[2],"WeaponBox_Drop_P")rn RegisterHam(Ham_Spawn, "weaponbox", "WeaponBox_Spawn", 1)rn RegisterHam(Ham_Spawn, "player", "Player_Spawn_P", 1)rn RegisterHam(Ham_Item_PreFrame,KNIVES_NAMES[0],"Ham_Weapon_P")rn RegisterHam(Ham_Item_PreFrame,KNIVES_NAMES[1], "Ham_Weapon_P")rn RegisterHam(Ham_Item_PreFrame,KNIVES_NAMES[2],"Ham_Weapon_P")rn register_touch("fly_knife", "", "WeaponBox_Touch")rn rn // tempentity event - decal applied to world or entity // register event wall spritern register_event("DeathMsg", "DeathMsg_P", "a")rn register_event("23", "Particle_Fx", "a", "1=116", "1=104")rn rn g_msgBloodPuff = get_user_msgid("BloodPuff")rn g_MsgDeathMsg = get_user_msgid("DeathMsg")rn rn}rnrnpublic Player_Spawn_P(id)rn{ rn if(is_user_alive(id))rn {rn g_arr[id][team] = get_user_team(id) rn }rn} rnpublic DeathMsg_P()rn{rn new victim = read_data(2)rn g_arr[victim][accept_throw] = falsern // rn // client_print(0, print_chat, "event deatn")rn}rnrnpublic CurWeapon_P(id)rn{rn new weapon = read_data(2)rnrn rn if(weapon == DODW_AMERKNIFE || weapon == DODW_GERKNIFE || weapon == DODW_SPADE || weapon == DODW_BRITKNIFE)rn {rn // взять гранаты индексrn g_arr[id][accept_throw] = falsern g_arr[id][input_b] = truern g_arr[id][knifetype] = weaponrnrn rn new en = get_pdata_cbase(id, m_knifeItem)rn pev(en,pev_classname,g_arr[id][knifename],16)rn TumbleVector[0] = float (get_pcvar_num(cv_sprot)) // = 1320.0 // Wheelrn // TumbleVector[1] // = random_float(800.0,100.0) // TEArn TumbleVector[2] = random_float(-10.0,10.0) // 400.0 // = random_float(2.0,0.0) // HOURSrnrnrn return PLUGIN_CONTINUErn }rn elsern {rn rn g_arr[id][accept_throw] = falsern return PLUGIN_CONTINUErn }rn return PLUGIN_CONTINUErn}rnpublic client_connect(id)rn{rn g_arr[id][input_b] = truern g_arr[id][accept_throw] = falsern}rnrn/* Item_fram would be better, cause it call only when weapon in armsrnpublic client_PreThink(i_player)rn{rn rn if(g_arr[i_player][accept_throw]==true)rn { rn if(pev(i_player,pev_button)&IN_ATTACK2)rn { rn engclient_cmd(i_player,"drop",g_arr[i_player][knifename])rn g_arr[i_player][input_b] = falsern return PLUGIN_CONTINUErn }rn return PLUGIN_CONTINUErn }rn return PLUGIN_CONTINUErn rn}rn*/rnpublic Ham_Weapon_P(id)rn{ rn new i_player = pev(id, pev_owner)rn if(!is_user_bot(i_player))rn {rn if(pev(i_player,pev_button)&IN_ATTACK2)rn { rn g_arr[i_player][accept_throw] = truern engclient_cmd(i_player,"drop",g_arr[i_player][knifename])rn g_arr[i_player][input_b] = falsern }rn rn }rn rn}rnrnpublic WeaponBox_Drop_P(id)rn{rnrn /// запстить проверк на разрешение выброса ножа методом броскаrn new id_ownerrn id_owner = pev(id,pev_owner)rn if(is_valid_ent(id) && g_arr[id_owner][accept_throw] == true)rn {rn g_arr[id_owner][accept_throw] = falsern SetHamReturnInteger(1)rn return HAM_SUPERCEDErn }rn return HAM_IGNOREDrn}rnrnpublic WeaponBox_Spawn(weaponbox)rn{ rnrn g_FhSetModel = register_forward(FM_SetModel, "WeaponBox_Spawn2")rnrn //client_print(0, print_chat, "[g_FhSetModel] %d for %d " , g_FhSetModel , weaponbox) ;rn return HAM_IGNORED;rnrn}rnrnrnpublic WeaponBox_Spawn2(weaponbox)rn{ rn // 82 = spades // 84 riflesrn new activeitemrn new cls[32]rn pev(weaponbox ,pev_classname, cls, 31 )rn if(equal(cls,"weaponbox"))rn {rn activeitem = get_pdata_cbase(weaponbox, 82, 4);rn if(activeitem > 1)rn {rn pev(activeitem ,pev_classname, cls, 16 )rn unregister_forward(FM_SetModel, g_FhSetModel)rn //client_print(0, print_chat, "[spawn2] weaponbox %d contain %s , item %d ", weaponbox , cls, activeitem)rn set_pev(weaponbox,pev_classname,"fly_knife")rn WeaponBox_Retune(weaponbox)rn return FMRES_HANDLED; rn }rn return FMRES_IGNOREDrn }rn rn // unregister_forward(FM_SetModel, g_FhSetModel)rn return FMRES_IGNOREDrn rn} rnrnpublic WeaponBox_Retune(weaponbox)rn{rn new id_owner rn id_owner = pev(weaponbox,pev_owner)rn if(!is_user_alive(id_owner) || is_user_bot(id_owner))rn {rn return PLUGIN_HANDLEDrn }rn new float:vlc[3], float:ang[3]rn velocity_by_aim(id_owner, get_pcvar_num(cv_spspeed), vlc )rn //velocity_by_aim(id_owner, 1600, vlc )rn //server_print("%f %f %f ", vlc[0],vlc[1],vlc[2]) rn vector_to_angle(vlc, ang) rn rn ang[0] += 45.0rn ang[2] += 80.0rnrn emit_sound(weaponbox,CHAN_AUTO,g_ThrowSound,0.9,ATTN_NORM,0,PITCH_NORM)rn set_pev(weaponbox, pev_angles, ang)rn engfunc(EngFunc_SetSize, weaponbox, Float:{-2.0, -2.0, -2.0}, Float:{2.0, 2.0, 2.0})rn set_pev(weaponbox,pev_movetype,MOVETYPE_TOSS) rn set_pev(weaponbox,pev_solid,SOLID_TRIGGER)rn set_pev(weaponbox,pev_velocity, vlc)rn set_pev(weaponbox,pev_avelocity,TumbleVector) rn //set_pev(weaponbox,pev_gravity, 0.1)rn if(cv_trail)rn {rn message_begin(MSG_BROADCAST, SVC_TEMPENTITY)rn write_byte(TE_BEAMFOLLOW) // Temp entity typern write_short(weaponbox) // entityrn write_short(g_SpriteBlood2) // sprite indexrn write_byte(4) // life time in 0.1'srn write_byte(2) // line width in 0.1'srn write_byte(63) // red (RGB)rn write_byte(63) // green (RGB)rn write_byte(63) // blue (RGB)rn write_byte(20) // brightness 0 invisible, 255 visiblern message_end()rn }rnrn rn set_task(0.13, "WeaponBox_Sound", weaponbox)rn}rnrnpublic WeaponBox_Touch(id_knife,id_target)rn{ rn // Register Universal datarn new Float:f_Ori[3]rn new i_Ori[3]rn entity_get_vector(id_knife,EV_VEC_origin,f_Ori)rn FVecIVec(f_Ori,i_Ori)rn new id_owner = pev(id_knife, pev_owner)rn rn switch(g_arr[id_owner][knifetype])rn {rn case DODW_AMERKNIFE:rn {rn //engfunc(EngFunc_SetModel,id_knife,KNIVES_MODELS[0])rnrn }rn case DODW_GERKNIFE:rn {rn // rn }rn case DODW_SPADE:rn {rn engfunc(EngFunc_SetModel,id_knife,KNIVES_MODELS[2]) // need to replace weaponbox modelrn }rn case DODW_BRITKNIFE:rn {rn // g_arr[id_owner][knifetype] = 1 // need to register hud kill message iconrn }rn }rn if(id_owner==id_target) return PLUGIN_CONTINUE rn // Start Difference touchrn // PLAYERSrn if(id_target >= 1 && id_target <= g_maxpl)rn {rn // hits playersrn // FX rn emit_sound(id_knife,CHAN_AUTO,g_ThrowHitHumanSound,0.4,ATTN_IDLE ,0,PITCH_NORM)rn if(get_pcvar_num(cv_bldsprt) == 1)rn {rn message_begin(MSG_BROADCAST, SVC_TEMPENTITY) rn write_byte(TE_BLOODSPRITE)rn write_coord(i_Ori[0])rn write_coord(i_Ori[1])rn write_coord(i_Ori[2])rn write_short(g_SpriteBlood)rn write_short(g_SpriteBlood)rn write_byte(248)rn write_byte(2)rn message_end()rn }rn elsern {rn message_begin(MSG_BROADCAST,g_msgBloodPuff,{0,0,0},0)rn write_coord(i_Ori[0])rn write_coord(i_Ori[1])rn write_coord(i_Ori[2])rn message_end()rn }rnrn if(g_FriendlyFire == 1 )rn {rn //kill qllrnrn user_silentkill(id_target)rnrn dod_set_user_kills(id_owner, (dod_get_user_kills(id_owner) + 1), 1)rn //dod_set_pl_deaths(id_target,(dod_get_pl_deaths(id_target) + 1), 1)rn //dod_set_user_score(id_target,(dod_get_user_score(id_target)),1)rn rn rn message_begin(MSG_ALL, g_MsgDeathMsg,{0,0,0},0)rn write_byte(id_owner) // killerrn write_byte(id_target) // victimrn write_byte(g_arr[id_owner][knifetype]) // 42 is smashrn message_end()rnrn rn rn set_pev(id_knife, pev_classname, "weaponbox")rn set_pev(id_knife, pev_avelocity,{60.0 , 50.0 , 150.0})rn set_pev(id_knife, pev_velocity,{60.0 , 50.0 , 50.0})rn return PLUGIN_CONTINUErn rn }rn else if(g_arr[id_owner][team] != get_user_team(id_target) && g_FriendlyFire == 0)rn {rn //kill enemy onlyrnrn user_silentkill(id_target)rn rn dod_set_user_kills(id_owner, (dod_get_user_kills(id_owner) + 1),1)rn //dod_set_pl_deaths(id_target,(dod_get_pl_deaths(id_target) + 1),1)rn //dod_set_user_score(id_target,(dod_get_user_score(id_target)),1)rn message_begin(MSG_ALL, g_MsgDeathMsg,{0,0,0},0)rn write_byte(id_owner) // killerrn write_byte(id_target) // victimrn write_byte(g_arr[id_owner][knifetype]) // 42 is smashrn message_end()rnrn rn rn set_pev(id_knife, pev_classname, "weaponbox")rn set_pev(id_knife, pev_avelocity,{60.0 , 50.0 , 150.0})rn set_pev(id_knife, pev_velocity,{60.0 , 50.0 , 50.0})rn return PLUGIN_CONTINUErn }rn else if (g_arr[id_owner][team] == get_user_team(id_target) && g_FriendlyFire == 0)rn { rnrn set_pev(id_knife, pev_classname, "weaponbox")rn set_pev(id_knife, pev_avelocity,{60.0 , 50.0 , 150.0})rn set_pev(id_knife, pev_velocity,{60.0 , 50.0 , 50.0})rn return PLUGIN_CONTINUErn }rnrn }rn else if (id_target==0)rn {rn // hit world or entitiesrnrn // FX rn message_begin(MSG_ALL,SVC_TEMPENTITY)rn write_byte(TE_SPARKS)rn write_coord(i_Ori[0])rn write_coord(i_Ori[1])rn write_coord(i_Ori[2])rn message_end()rn emit_sound(id_knife, CHAN_AUTO, g_ThrowHitwallSound, 0.8, 1.0, 0, PITCH_NORM)rn rn set_pev(id_knife, pev_classname, "weaponbox")rn set_pev(id_knife, pev_avelocity,{60.0 , 50.0 , 150.0})rn set_pev(id_knife, pev_velocity,{60.0 , 50.0 , 50.0})rnrn if(get_pcvar_num(cv_stackinwall) == 1)rn {rn set_pev(id_knife, pev_movetype, MOVETYPE_NONE)rn set_task(2.0, "WeaponBox_Unstuck", id_knife)rn return PLUGIN_CONTINUErn }rn return PLUGIN_CONTINUErn }rn else if (id_target > g_maxpl)rn {rn ///// IF ENTITY OR BREACABLErn new clT[32]rn pev(id_target, pev_classname, clT, 31)rn rn // FX rn message_begin(MSG_ALL,SVC_TEMPENTITY)rn write_byte(TE_SPARKS)rn write_coord(i_Ori[0])rn write_coord(i_Ori[1])rn write_coord(i_Ori[2])rn message_end()rn emit_sound(id_knife, CHAN_AUTO, g_ThrowHitwallSound, 0.8, 1.0, 0, PITCH_NORM)rnrnrn if(equal(clT,"func_breakable")) rn {rn new tgn[32]rn entity_get_string(id_target,EV_SZ_targetname,tgn,31)rnrn // for example in DOD_CHARLIE or CAEN we have some breakeble object which has target name , rn // thats why we shouldn't destriy this.rn if(!tgn[0])rn {rn emit_sound(id_knife, CHAN_AUTO, g_ThrowHitwallSound, 0.3, 1.0, 0, PITCH_NORM)rn // new idAttacker = pev(id_knife, pev_owner)rn ExecuteHam(Ham_TakeDamage,id_target, 1, 1, 30.0, DMG_BULLET) rn }rn //client_print(0, print_chat, "[FUNCBREAK] %s %s ",clT, tgn )rn }rn set_pev(id_knife, pev_classname, "weaponbox")rn set_pev(id_knife, pev_avelocity,{60.0 , 50.0 , 150.0})rn set_pev(id_knife, pev_velocity,{60.0 , 50.0 , 50.0})rn return PLUGIN_CONTINUErn }rn return PLUGIN_CONTINUErn}rnrnpublic WeaponBox_Unstuck(id_knife)rn{rn rn if(pev_valid(id_knife))rn { rn set_pev(id_knife,pev_movetype,MOVETYPE_TOSS)rn set_pev(id_knife,pev_avelocity,{60.0 , 50.0 , 150.0})rn set_pev(id_knife,pev_velocity,{0.0 , 0.0 , 0.0})rn }rn}rnrnpublic WeaponBox_Sound(id_knife)rn{rn new classname[32] // weapon_spade/knife/gerknifern if(pev_valid(id_knife)) rn {rn pev(id_knife, pev_classname, classname,31)rn if(equal(classname,"fly_knife")) rn {rn emit_sound(id_knife,CHAN_AUTO,g_ThrowSound,0.5,ATTN_NORM,0,PITCH_HIGH)rn set_task(0.12, "WeaponBox_Sound", id_knife)rn } rn }rn}rnrnpublic Particle_Fx()rn{rn static Float:origin[3]rn rn switch (read_data(5)) rn {rn case 54..58: rn { // is decal shot1-5?rn read_data(2, origin[0])rn read_data(3, origin[1])rn read_data(4, origin[2])rn message_begin(MSG_BROADCAST,SVC_TEMPENTITY)rn write_byte(TE_SPARKS)rn write_coord(floatround(origin[0]))rn write_coord(floatround(origin[1]))rn write_coord(floatround(origin[2]))rn message_end()rn }rn default: rn {rn returnrn }rn } rn}
rn
rn Download
rn
rn Download
rn
rn
rn
rn-----------
rnI've not intrested in anoter HL mods (CS , TF ..... ) only DOD

