Day of Defeat Plugins Community
This site is an archive — everything is readable and downloadable, nothing can be posted. Admin

[DOD] Throw knife to weaponbox

by TheVaskov · 2022-11-19 · 62 views · 6 downloads

Read the thread (1 posts)

From the first post

DOD Throw Knife to Weaponbox
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

    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
rnCVAR:
rn
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
rnTo Do
rn

    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
rnNew is version 1.5:
rn

    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

rnNew is version 1.6: july 2022
rn

    rn
  • When knife flyis, we hear roation sound.
    rn

rnNew is version 1.7: november 2022
rn

    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

rnNew is version 1.8: March-April 2022
rn

    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

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
#include rn#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

Files

dod_throwknife_weaponbox_1.7.sma missing Plugin Source 16 KB 3 dl
dod_throwknife_weaponbox_APR2023.sma missing Plugin Source 16 KB 3 dl

The thread

All 1 post on [DOD] Throw knife to weaponbox, kept as they were written.

T TheVaskov
started this thread
Posts: 8
Threads: 3
Joined: Oct 2021
11-19-2022, 09:41 AM #1

DOD Throw Knife to WeaponboxrnVERSION "23 APRIL 2023"rnAUTHOR "[America][TheVaskov]"rnrnrnrnrnrnDescriptionrnPress the +attack2 (right mouse button) to throw a knife or a spade and kill the enemy rnrnChatGPT: 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.rnrn

  • rn
  • Weaponbox retuned to flying knifern
  • Spakles when spadekinife hit the wall in hands or in airrn
  • Bloodpuff when kill playerrn
  • Hud kill info works good and correctlyrn
  • Update frags and kills is scoreboard (TAB)rn
  • Correctly orientation of rotating , blade to frontrn
  • You can set private models for throw knife.rn
  • When knife flyis, we hear roation sound.rn
rnrnCVAR: rnrn
  • rn
  • Stack in wall for 2 seconds yes = 1; no = 0rn
  • additional blood splashes yes = 1; no = 0rn
  • Pitch vector corrector Z-axis ~200 is good. 0 = parallel to ground rn
  • Velocity of throw 500 = 3 metres ; 1800 = 30 metresrn
  • Rotation speed of spade/knife ~800 is goodrn
rnrnTo Dorn
  • rn
  • Need to Make hands empty after throw, cause now it autochanges to primary weaponrn
  • REgister sever config Friendly fire .. and mke FF knife attackrn
  • DONE 1.7: Turn off drop weaponbox when press Grn
  • DONE 1.7: Need to register touch breakable objects to destroy or make sparkle like from wall-tochingrn
rnrnNew is version 1.5: rn
  • 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 cvarsrn
rnNew is version 1.6: july 2022rn
  • rn
  • When knife flyis, we hear roation sound.rn
rnNew is version 1.7: november 2022rn
  • rn
  • Turn off drop weaponbox when press Grn
  • 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
rnNew is version 1.8: March-April 2022rn
  • 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 knifern
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)rnrnFor not registred in forum players: rn
rn#include <amxmodx>rn#include <amxmisc>rn#include <fakemeta>rn#include <hamsandwich>rn#include <fakemeta_util>rn#include <dodx>rn#include <dodfun>rn#include <fun>rn#include <engine>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}rnrn
rnrn Download rnrn Download rnrnrnrn-----------rnI've not intrested in anoter HL mods (CS , TF ..... ) only DOD

DoD Plugins Archive · Repository · Old Forum Threads · Maps · Admin · built 14 Sep 2026 00:34 UTC