From ea1f3067adfc2b0a8068013a560c2f762f6f6c4e Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sun, 24 Apr 2022 00:22:27 -0700 Subject: [PATCH] Weapons: Go over the bullet penetration details, I think we got that mostly figured out now. Also fix some other CS specific entities and their touch functions. --- src/server/armoury_entity.qc | 12 ++++++------ src/server/func_bomb_target.qc | 8 ++++---- src/server/func_buyzone.qc | 8 ++++---- src/server/func_hostage_rescue.qc | 17 ++++++++--------- src/server/hostage_entity.qc | 28 +++++++++++++++------------- src/server/item_suit.qc | 10 +++++----- src/shared/w_ak47.qc | 3 ++- src/shared/w_aug.qc | 3 ++- src/shared/w_awp.qc | 3 ++- src/shared/w_deagle.qc | 3 ++- src/shared/w_elites.qc | 3 ++- src/shared/w_fiveseven.qc | 3 ++- src/shared/w_g3sg1.qc | 3 ++- src/shared/w_glock18.qc | 3 ++- src/shared/w_m3.qc | 3 ++- src/shared/w_m4a1.qc | 3 ++- src/shared/w_mac10.qc | 3 ++- src/shared/w_mp5.qc | 3 ++- src/shared/w_p228.qc | 3 ++- src/shared/w_p90.qc | 3 ++- src/shared/w_para.qc | 3 ++- src/shared/w_scout.qc | 3 ++- src/shared/w_sg550.qc | 3 ++- src/shared/w_sg552.qc | 3 ++- src/shared/w_tmp.qc | 3 ++- src/shared/w_ump45.qc | 3 ++- src/shared/w_usp45.qc | 3 ++- src/shared/w_xm1014.qc | 3 ++- 28 files changed, 86 insertions(+), 63 deletions(-) diff --git a/src/server/armoury_entity.qc b/src/server/armoury_entity.qc index 6b1ff8f..77ce907 100644 --- a/src/server/armoury_entity.qc +++ b/src/server/armoury_entity.qc @@ -104,15 +104,15 @@ class armoury_entity:CBaseEntity int m_iItem; void(void) armoury_entity; - virtual void(void) touch; + virtual void(entity) Touch; virtual void(void) Respawn; virtual void(string, string) SpawnKey; }; void -armoury_entity::touch(void) +armoury_entity::Touch(entity eToucher) { - if (other.classname != "player") { + if (eToucher.classname != "player") { return; } @@ -120,12 +120,12 @@ armoury_entity::touch(void) if (m_iItem == 17 || m_iItem == 16) return; - if (Weapons_AddItem((player)other, m_iItem, -1) == FALSE) { + if (Weapons_AddItem((player)eToucher, m_iItem, -1) == FALSE) { return; } - Logging_Pickup(other, this, __NULL__); - sound(other, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_NORM); + Logging_Pickup(eToucher, this, __NULL__); + sound(eToucher, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_NORM); m_iLeft--; if (m_iLeft <= 0) { diff --git a/src/server/func_bomb_target.qc b/src/server/func_bomb_target.qc index 8855f3e..f5003ae 100644 --- a/src/server/func_bomb_target.qc +++ b/src/server/func_bomb_target.qc @@ -32,14 +32,14 @@ class func_bomb_target:NSBrushTrigger void(void) func_bomb_target; virtual void(void) Respawn; - virtual void(void) touch; + virtual void(entity) Touch; }; void -func_bomb_target::touch(void) +func_bomb_target::Touch(entity eToucher) { - player pl = (player)other; - if (!(other.flags & FL_CLIENT)) { + player pl = (player)eToucher; + if (!(eToucher.flags & FL_CLIENT)) { return; } diff --git a/src/server/func_buyzone.qc b/src/server/func_buyzone.qc index 921488b..d764246 100644 --- a/src/server/func_buyzone.qc +++ b/src/server/func_buyzone.qc @@ -44,15 +44,15 @@ class func_buyzone:NSBrushTrigger { void(void) func_buyzone; - virtual void(void) touch; + virtual void(entity) Touch; virtual void(void) Respawn; }; void -func_buyzone::touch(void) +func_buyzone::Touch(entity eToucher) { - player pl = (player)other; - if (!(other.flags & FL_CLIENT)) + player pl = (player)eToucher; + if (!(eToucher.flags & FL_CLIENT)) return; if (team == 0 || team == pl.team) diff --git a/src/server/func_hostage_rescue.qc b/src/server/func_hostage_rescue.qc index 40754e6..12750f7 100644 --- a/src/server/func_hostage_rescue.qc +++ b/src/server/func_hostage_rescue.qc @@ -32,30 +32,30 @@ class func_hostage_rescue:NSBrushTrigger { void(void) func_hostage_rescue; - virtual void(void) touch; + virtual void(entity) Touch; virtual void(void) Respawn; }; void -func_hostage_rescue::touch(void) +func_hostage_rescue::Touch(entity eToucher) { - if (other.flags & FL_CLIENT) { - player pl = (player)other; + if (eToucher.flags & FL_CLIENT) { + player pl = (player)eToucher; pl.gflags |= GF_RESCUEZONE; return; } - if (other.classname != "hostage_entity") { + if (eToucher.classname != "hostage_entity") { return; } - CBaseNPC hosty = (CBaseNPC)other; + hostage_entity hosty = (hostage_entity)eToucher; if (hosty.solid == SOLID_NOT) { return; } - if (!((player)hosty.m_eFollowing)) + if (!(hosty.m_eFollowing)) return; Radio_BroadcastMessage(RADIO_RESCUED); @@ -68,8 +68,7 @@ func_hostage_rescue::touch(void) * bonus for every hostage that was rescued, even if they lose the round. */ Money_QueTeamReward(TEAM_CT, 850); - CBaseEntity targa = (CBaseEntity)other; - targa.Hide(); + hosty.Hide(); } void diff --git a/src/server/hostage_entity.qc b/src/server/hostage_entity.qc index 6f5a1d4..93dc00f 100644 --- a/src/server/hostage_entity.qc +++ b/src/server/hostage_entity.qc @@ -131,6 +131,9 @@ hostage_entity::OnPlayerUse(void) void hostage_entity::Pain(void) { + if (style == MONSTER_DEAD) + return; + switch (g_dmg_iHitBody) { case BODY_HEAD: case BODY_DEFAULT: @@ -176,25 +179,24 @@ hostage_entity::Death(void) SetFrame(HOSA_DIE_SIMPLE + floor(random(0,4))); break; } + + if (g_dmg_eAttacker.classname == "player") { + if (g_dmg_iDamage >= 100) + Money_AddMoney((base_player)g_dmg_eAttacker, -2500); + else + Money_AddMoney((base_player)g_dmg_eAttacker, -500); + + Radio_BroadcastMessage(RADIO_HOSDOWN); + } } /* HACK: don't let them gib */ health = 0; - solid = SOLID_NOT; /* now mark our state as 'dead' */ - CBaseNPC::Death(); - - /* penalties */ - if (g_dmg_eAttacker.classname != "player") - return; - - if (g_dmg_iDamage >= 100) - Money_AddMoney((base_player)g_dmg_eAttacker, -2500); - else - Money_AddMoney((base_player)g_dmg_eAttacker, -500); - - Radio_BroadcastMessage(RADIO_HOSDOWN); + super::Death(); + SetSolid(SOLID_NOT); + health = 0; } void diff --git a/src/server/item_suit.qc b/src/server/item_suit.qc index 5ce259a..dc45e75 100644 --- a/src/server/item_suit.qc +++ b/src/server/item_suit.qc @@ -18,14 +18,14 @@ class item_suit:CBaseTrigger { void(void) item_suit; - virtual void(void) touch; + virtual void(entity) Touch; virtual void(void) Respawn; }; void -item_suit::touch(void) +item_suit::Touch(entity eToucher) { - player pl = (player)other; + player pl = (player)eToucher; if (pl.classname != "player") { return; @@ -35,10 +35,10 @@ item_suit::touch(void) return; } - sound(other, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM); + sound(eToucher, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM); pl.g_items |= ITEM_SUIT; - UseTargets(other, TRIG_TOGGLE, m_flDelay); + UseTargets(eToucher, TRIG_TOGGLE, m_flDelay); if (cvar("sv_playerslots") == 1) { remove(self); diff --git a/src/shared/w_ak47.qc b/src/shared/w_ak47.qc index b871e6a..c561577 100644 --- a/src/shared/w_ak47.qc +++ b/src/shared/w_ak47.qc @@ -177,7 +177,8 @@ w_ak47_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_rifle_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(1); + TraceAttack_SetRangeModifier(0.98); + TraceAttack_SetPenetrationPower(2); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 36, [accuracy,accuracy], WEAPON_AK47); Sound_Play(pl, CHAN_WEAPON, "weapon_ak47.fire"); #endif diff --git a/src/shared/w_aug.qc b/src/shared/w_aug.qc index 469746a..1b7b6f1 100644 --- a/src/shared/w_aug.qc +++ b/src/shared/w_aug.qc @@ -143,7 +143,8 @@ w_aug_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_rifle_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(1); + TraceAttack_SetRangeModifier(0.96); + TraceAttack_SetPenetrationPower(2); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 32, [accuracy,accuracy], WEAPON_AUG); Sound_Play(pl, CHAN_WEAPON, "weapon_aug.fire"); #endif diff --git a/src/shared/w_awp.qc b/src/shared/w_awp.qc index b137845..24e5fed 100644 --- a/src/shared/w_awp.qc +++ b/src/shared/w_awp.qc @@ -234,7 +234,8 @@ w_awp_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_sniper_ejectshell, 0.9f); #else - TraceAttack_SetPenetrationPower(2); + TraceAttack_SetRangeModifier(0.99); + TraceAttack_SetPenetrationPower(3); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 115, [accuracy,accuracy], WEAPON_AWP); Sound_Play(pl, CHAN_WEAPON, "weapon_awp.fire"); diff --git a/src/shared/w_deagle.qc b/src/shared/w_deagle.qc index 0b6287b..105dab6 100644 --- a/src/shared/w_deagle.qc +++ b/src/shared/w_deagle.qc @@ -176,7 +176,8 @@ w_deagle_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_pistol_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(1); + TraceAttack_SetRangeModifier(0.81); + TraceAttack_SetPenetrationPower(2); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 54, [accuracy,accuracy], WEAPON_DEAGLE); Sound_Play(pl, CHAN_WEAPON, "weapon_deagle.fire"); #endif diff --git a/src/shared/w_elites.qc b/src/shared/w_elites.qc index 3bbb12b..1211320 100644 --- a/src/shared/w_elites.qc +++ b/src/shared/w_elites.qc @@ -248,7 +248,8 @@ w_elites_primary(player pl) else View_AddEvent(w_pistol_ejectshell_right, 0.0f); #else - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.75); + TraceAttack_SetPenetrationPower(1); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 45, [accuracy,accuracy], WEAPON_ELITES); Sound_Play(pl, CHAN_WEAPON, "weapon_elites.fire"); #endif diff --git a/src/shared/w_fiveseven.qc b/src/shared/w_fiveseven.qc index a76123e..ec3c5d7 100644 --- a/src/shared/w_fiveseven.qc +++ b/src/shared/w_fiveseven.qc @@ -147,7 +147,8 @@ w_fiveseven_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_pistol_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.885); + TraceAttack_SetPenetrationPower(1); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 25, [accuracy,accuracy], WEAPON_FIVESEVEN); Sound_Play(pl, CHAN_WEAPON, "weapon_fiveseven.fire"); #endif diff --git a/src/shared/w_g3sg1.qc b/src/shared/w_g3sg1.qc index 92775ac..b9cd59e 100644 --- a/src/shared/w_g3sg1.qc +++ b/src/shared/w_g3sg1.qc @@ -138,7 +138,8 @@ w_g3sg1_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_rifle_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(2); + TraceAttack_SetRangeModifier(0.98); + TraceAttack_SetPenetrationPower(3); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 80, [accuracy,accuracy], WEAPON_G3SG1); Sound_Play(pl, CHAN_WEAPON, "weapon_g3sg1.fire"); #endif diff --git a/src/shared/w_glock18.qc b/src/shared/w_glock18.qc index fb43bf3..f9137af 100644 --- a/src/shared/w_glock18.qc +++ b/src/shared/w_glock18.qc @@ -146,7 +146,8 @@ w_glock18_primary(player pl) float accuracy = Cstrike_CalculateAccuracy(pl, (pl.mode_glock18) ? 175 : 200); pl.glock18_mag--; #ifdef SERVER - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.75); + TraceAttack_SetPenetrationPower(1); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 25, [accuracy,accuracy], WEAPON_GLOCK18); #endif } diff --git a/src/shared/w_m3.qc b/src/shared/w_m3.qc index beb3c28..e8b4cc2 100644 --- a/src/shared/w_m3.qc +++ b/src/shared/w_m3.qc @@ -193,7 +193,8 @@ w_m3_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_m3_ejectshell, 0.6f); #else - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.70); + TraceAttack_SetPenetrationPower(1); if (self.flags & FL_CROUCHING) Animation_PlayerTop(pl, ANIM_SHOOT_SHOTGUN, 0.45f); diff --git a/src/shared/w_m4a1.qc b/src/shared/w_m4a1.qc index 74a1a12..23d31fa 100644 --- a/src/shared/w_m4a1.qc +++ b/src/shared/w_m4a1.qc @@ -184,7 +184,8 @@ w_m4a1_primary(player pl) Sound_Play(pl, CHAN_WEAPON, "weapon_m4a1.fire"); } - TraceAttack_SetPenetrationPower(1); + TraceAttack_SetRangeModifier(0.97); + TraceAttack_SetPenetrationPower(2); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 33, [accuracy,accuracy], WEAPON_M4A1); #endif diff --git a/src/shared/w_mac10.qc b/src/shared/w_mac10.qc index aa47d66..78e9cee 100644 --- a/src/shared/w_mac10.qc +++ b/src/shared/w_mac10.qc @@ -142,7 +142,8 @@ w_mac10_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_pistol_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.82); + TraceAttack_SetPenetrationPower(1); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 29, [accuracy,accuracy], WEAPON_MAC10); Sound_Play(pl, CHAN_WEAPON, "weapon_mac10.fire"); #endif diff --git a/src/shared/w_mp5.qc b/src/shared/w_mp5.qc index 16897c3..a1fb9d7 100644 --- a/src/shared/w_mp5.qc +++ b/src/shared/w_mp5.qc @@ -140,7 +140,8 @@ w_mp5_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_pistol_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.84); + TraceAttack_SetPenetrationPower(1); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 26, [accuracy,accuracy], WEAPON_MP5); Sound_Play(pl, CHAN_WEAPON, "weapon_mp5.fire"); #endif diff --git a/src/shared/w_p228.qc b/src/shared/w_p228.qc index 70405c1..c3124d4 100644 --- a/src/shared/w_p228.qc +++ b/src/shared/w_p228.qc @@ -147,7 +147,8 @@ w_p228_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_pistol_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.80); + TraceAttack_SetPenetrationPower(1); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 40, [accuracy,accuracy], WEAPON_P228); Sound_Play(pl, CHAN_WEAPON, "weapon_p228.fire"); #endif diff --git a/src/shared/w_p90.qc b/src/shared/w_p90.qc index 6e83530..6854d44 100644 --- a/src/shared/w_p90.qc +++ b/src/shared/w_p90.qc @@ -140,7 +140,8 @@ w_p90_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_pistol_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.84); + TraceAttack_SetPenetrationPower(1); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 26, [accuracy,accuracy], WEAPON_P90); Sound_Play(pl, CHAN_WEAPON, "weapon_p90.fire"); #endif diff --git a/src/shared/w_para.qc b/src/shared/w_para.qc index ae1b88a..110054e 100644 --- a/src/shared/w_para.qc +++ b/src/shared/w_para.qc @@ -136,7 +136,8 @@ w_para_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_rifle_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(1); + TraceAttack_SetRangeModifier(0.97); + TraceAttack_SetPenetrationPower(2); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 35, [accuracy,accuracy], WEAPON_PARA); Sound_Play(pl, CHAN_WEAPON, "weapon_para.fire"); #endif diff --git a/src/shared/w_scout.qc b/src/shared/w_scout.qc index d144488..bf70582 100644 --- a/src/shared/w_scout.qc +++ b/src/shared/w_scout.qc @@ -197,7 +197,8 @@ w_scout_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_rifle_ejectshell, 0.5f); #else - TraceAttack_SetPenetrationPower(2); + TraceAttack_SetRangeModifier(0.98); + TraceAttack_SetPenetrationPower(3); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 75, [accuracy,accuracy], WEAPON_SCOUT); Sound_Play(pl, CHAN_WEAPON, "weapon_scout.fire"); #endif diff --git a/src/shared/w_sg550.qc b/src/shared/w_sg550.qc index bbb4a17..7d1b3f2 100644 --- a/src/shared/w_sg550.qc +++ b/src/shared/w_sg550.qc @@ -137,7 +137,8 @@ w_sg550_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_rifle_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(1); + TraceAttack_SetRangeModifier(0.98); + TraceAttack_SetPenetrationPower(2); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 70, [accuracy,accuracy], WEAPON_SG550); Sound_Play(pl, CHAN_WEAPON, "weapon_sg550.fire"); #endif diff --git a/src/shared/w_sg552.qc b/src/shared/w_sg552.qc index 338d357..7c98017 100644 --- a/src/shared/w_sg552.qc +++ b/src/shared/w_sg552.qc @@ -140,7 +140,8 @@ w_sg552_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_rifle_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(1); + TraceAttack_SetRangeModifier(0.955); + TraceAttack_SetPenetrationPower(2); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 33, [accuracy,accuracy], WEAPON_SG552); Sound_Play(pl, CHAN_WEAPON, "weapon_sg552.fire"); #endif diff --git a/src/shared/w_tmp.qc b/src/shared/w_tmp.qc index 3727258..594a696 100644 --- a/src/shared/w_tmp.qc +++ b/src/shared/w_tmp.qc @@ -140,7 +140,8 @@ w_tmp_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_pistol_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.84); + TraceAttack_SetPenetrationPower(1); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 26, [accuracy,accuracy], WEAPON_TMP); Sound_Play(pl, CHAN_WEAPON, "weapon_tmp.fire"); #endif diff --git a/src/shared/w_ump45.qc b/src/shared/w_ump45.qc index cd0a038..89bbce1 100644 --- a/src/shared/w_ump45.qc +++ b/src/shared/w_ump45.qc @@ -140,7 +140,8 @@ w_ump45_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_pistol_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.02); + TraceAttack_SetPenetrationPower(1); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 30, [accuracy,accuracy], WEAPON_UMP45); Sound_Play(pl, CHAN_WEAPON, "weapon_ump45.fire"); #endif diff --git a/src/shared/w_usp45.qc b/src/shared/w_usp45.qc index a473c37..1befb3e 100644 --- a/src/shared/w_usp45.qc +++ b/src/shared/w_usp45.qc @@ -196,7 +196,8 @@ w_usp45_primary(player pl) } /* actual firing */ - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.79); + TraceAttack_SetPenetrationPower(1); TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 33, [accuracy,accuracy], WEAPON_USP45); #endif diff --git a/src/shared/w_xm1014.qc b/src/shared/w_xm1014.qc index 895962e..ce21dc6 100644 --- a/src/shared/w_xm1014.qc +++ b/src/shared/w_xm1014.qc @@ -198,7 +198,8 @@ w_xm1014_primary(player pl) View_SetMuzzleflash(MUZZLE_RIFLE); View_AddEvent(w_xm1014_ejectshell, 0.0f); #else - TraceAttack_SetPenetrationPower(0); + TraceAttack_SetRangeModifier(0.70); + TraceAttack_SetPenetrationPower(1); Sound_Play(pl, CHAN_WEAPON, "weapon_xm1014.fire"); #endif