From 8c907d604979f04d83b0402588b5c1f79d58fce4 Mon Sep 17 00:00:00 2001 From: Steam Deck User Date: Mon, 13 Mar 2023 11:37:55 -0400 Subject: [PATCH] SERVER: Move buy_weapon and weapon_wall to their own file, reorganize --- progs/fte-server.src | 1 + progs/standard.src | 1 + source/server/entities/map_entities.qc | 351 ------------------ source/server/entities/triggers.qc | 74 ---- source/server/entities/wall_weapon.qc | 485 +++++++++++++++++++++++++ 5 files changed, 487 insertions(+), 425 deletions(-) create mode 100644 source/server/entities/wall_weapon.qc diff --git a/progs/fte-server.src b/progs/fte-server.src index 0bd242e..baed883 100644 --- a/progs/fte-server.src +++ b/progs/fte-server.src @@ -28,6 +28,7 @@ ../source/server/entities/doors.qc ../source/server/entities/window.qc ../source/server/entities/machines.qc +../source/server/entities/wall_weapon.qc ../source/server/weapons/frames_core.qc ../source/server/weapons/rocket_launcher.qc diff --git a/progs/standard.src b/progs/standard.src index 7784fc0..67ee4e8 100644 --- a/progs/standard.src +++ b/progs/standard.src @@ -32,6 +32,7 @@ ../source/server/entities/doors.qc ../source/server/entities/window.qc ../source/server/entities/machines.qc +../source/server/entities/wall_weapon.qc ../source/server/weapons/frames_core.qc ../source/server/weapons/rocket_launcher.qc diff --git a/source/server/entities/map_entities.qc b/source/server/entities/map_entities.qc index ee7e75e..157ae33 100644 --- a/source/server/entities/map_entities.qc +++ b/source/server/entities/map_entities.qc @@ -60,357 +60,6 @@ void() place_fire = self.nextthink = time + random()+0.1; }; -void () buy_weapon_touch = -{ - entity oldent; - float tempf, tempf1, tempf2, tempf3; - float startframe,endframe; - string modelname; - - float wcost; - - if (other.classname != "player" || other.downed || other.isBuying) { - return; - } - - if (self.weapon != 99) { - -#ifndef FTE - - other.Weapon_Name_Touch = GetWeaponName(self.weapon); - -#endif // FTE - - float slot; - - // Player has this weapon in any of their slots, PaP'd or not. - if ((slot = Util_PlayerHasWeapon(other, self.weapon, true)) != 0) { - float is_pap = true; - - - // But the utility function returns the same value if we are NOT PaP'd - if (Util_PlayerHasWeapon(other, self.weapon, false) == slot) - is_pap = false; - - // Set the cost and weapon value (for useprint). - wcost = (is_pap) ? 4500 : self.cost2; - float wep = (is_pap) ? EqualPapWeapon(self.weapon) : self.weapon; - - useprint(other, 3, wcost, wep); - - if (!other.button7 || other.semiuse || other.isBuying) { - return; - } - - // Store current Ammo value. - float ammo = Util_GetPlayerAmmoInSlot(other, slot); - - // Max carrying capacity of the wall weapon - float wall_ammo = (is_pap) ? getWeaponAmmo(EqualPapWeapon(self.weapon)) : getWeaponAmmo(self.weapon); - - // Weapon is already full. Abort. - if (ammo >= wall_ammo) - return; - - other.semiuse = true; - - // Player doesn't have enough points. Abort. - if (other.points < wcost) { - centerprint(other, STR_NOTENOUGHPOINTS); - return; - } - - other.ach_tracker_coll++; - - // Set the weapon's ammo to the max capacity. - Util_SetPlayerAmmoInSlot(other, slot, wall_ammo); - - sound(other, 0, "sounds/misc/ching.wav", 1, 1); - other.reload_delay = 0; - - // Subtract the cost from player points. - addmoney(other, wcost*-1, 0); - - if (self.enemy) { - oldent = self; - self = self.enemy; - self.use(); - self = oldent; - } - } - } else - // Universal Ammo buy - { - -#ifndef FTE - - other.Weapon_Name_Touch = GetWeaponName(other.weapon); - -#endif // FTE - - if (other.currentammo < getWeaponAmmo(other.weapon)) { - - // Set the cost and weapon value (for useprint). - wcost = (IsPapWeapon(other.weapon)) ? 4500 : self.cost2; - - useprint(other, 3, wcost, other.weapon); - - if (!other.button7 || other.semiuse || other.isBuying) { - return; - } - - // Player doesn't have enough points. Abort. - if (other.points < wcost) { - centerprint(other, STR_NOTENOUGHPOINTS); - return; - } - - other.currentammo = getWeaponAmmo(other.weapon); - - sound(other, 0, "sounds/misc/ching.wav", 1, 1); - other.reload_delay = 0; - - // Subtract the cost from player points. - addmoney(other, wcost*-1, 0); - - if (self.enemy) { - oldent = self; - self = self.enemy; - self.use(); - self = oldent; - } - } - } - if (self.weapon == W_BETTY) - { - if (other.secondary_grenades < 2) - useprint (other, 3, self.cost2, self.weapon); - else - return; - if (!other.button7 || other.semiuse) - return; - if (other.points < self.cost2) - { - centerprint(other, STR_NOTENOUGHPOINTS); - sound(other, 0, "sounds/misc/denybuy.wav", 1, 1); - return; - } - else - { - other.ach_tracker_coll++; - other.reload_delay = 0; - sound(other, 0, "sounds/misc/ching.wav", 1, 1); - //other.boughtweapon = true; - addmoney(other, 0 - self.cost2, FALSE); - other.grenades = other.grenades | 2; - other.secondary_grenades = 2; - if (self.enemy) - { - oldent = self; - self = self.enemy; - self.use(); - self = oldent; - } - } - other.semiuse = true; - return; - } - else if (self.weapon == W_GRENADE) - { - if (other.primary_grenades < 4) - useprint (other, 3, self.cost2, self.weapon); - else - return; - if (!other.button7 || other.semiuse) - return; - if (other.points < self.cost) - { - centerprint(other, STR_NOTENOUGHPOINTS); - sound(other, 0, "sounds/misc/denybuy.wav", 1, 1); - - return; - } - else - { - other.ach_tracker_coll++; - other.reload_delay = 0; - sound(other, 0, "sounds/misc/ching.wav", 1, 1); - //other.boughtweapon = true; - addmoney(other, 0 - self.cost, FALSE); - other.primary_grenades = 4; - if (self.enemy) - { - oldent = self; - self = self.enemy; - self.use(); - self = oldent; - } - } - other.semiuse = true; - return; - } - else if (self.weapon == W_BOWIE) - { - if (!other.bowie) { - useprint(other, 3, self.cost2, self.weapon); - if (other.button7) - { - if (other.points < self.cost2) { - centerprint(other, STR_NOTENOUGHPOINTS); - return; - } else { - addmoney(other, -self.cost2, FALSE); - other.ach_tracker_coll++; - entity tempz; - tempz = self; - self = other; - Set_W_Frame(15, 30, 0, 0, 0, ReturnWeaponModel, "models/weapons/knife/v_bowie.mdl", false, S_BOTH); - self.bowie = 1; - } - } - } - } - else if (self.weapon != 99) - { - entity tempe; - - //centerprint(other, self.message); - useprint (other, 4, self.cost, self.weapon); - - if (!other.button7 || other.semiuse) { - return; - } - - other.semiuse = 1; - if (other.points < self.cost) { - centerprint (other, STR_NOTENOUGHPOINTS); - return; - } - - other.semiuse = true; - other.ach_tracker_coll++; - - if (other.weapon && !other.secondaryweapon) { - tempf = other.currentammo; - other.currentammo = other.secondaryammo; - other.secondaryammo = tempf; - - tempf1 = other.currentmag; - other.currentmag = other.secondarymag; - other.secondarymag = tempf1; - - tempf2 = other.weapon; - other.weapon = other.secondaryweapon; - other.secondaryweapon = tempf2; - - tempf3 = other.currentmag2; - other.currentmag2 = other.secondarymag2; - other.secondarymag2 = tempf3; - } else if (other.weapon && other.secondaryweapon) { - if ((other.perks & P_MULE) && !other.thirdweapon) { - // store secondary weapon - tempf = other.secondaryweapon; - tempf1 = other.secondarymag; - tempf2 = other.secondaryammo; - tempf3 = other.secondarymag2; - // move primary to secondary - other.secondaryweapon = other.weapon; - other.secondarymag = other.currentmag; - other.secondarymag2 = other.currentmag2; - other.secondaryammo = other.currentammo; - // move secondary to tertiary - other.thirdweapon = tempf; - other.thirdmag = tempf1; - other.thirdammo = tempf2; - other.thirdmag2 = tempf3; - } - - // free current slot - other.currentammo = 0; - other.currentmag = 0; - other.weapon = 0; - } - - sound(other, 0, "sounds/misc/ching.wav", 1, 1); - other.reload_delay = 0; - addmoney(other, -1*self.cost, 0); - if (self.enemy) { - oldent = self; - self = self.enemy; - self.use(); - self = oldent; - } - other.weapon = self.weapon; - - other.currentammo = getWeaponAmmo(self.weapon); - other.currentmag = getWeaponMag(self.weapon); - tempe = self; - self = other; - startframe = GetFrame(self.weapon,TAKE_OUT_START); - endframe = GetFrame(self.weapon,TAKE_OUT_END); - modelname = GetWeaponModel(self.weapon, 0); - - if (self.weapon != W_KAR_SCOPE && self.weapon != W_HEADCRACKER && !IsDualWeapon(self.weapon)) { - self.weapon2model = ""; - } - - SwitchWeapon(self.weapon); - Set_W_Frame (startframe, endframe, 0, 0, 0, SUB_Null, modelname, false, S_BOTH);//FIXME - -#ifndef FTE - - self.Flash_Offset = GetWeaponFlash_Offset(self.weapon); - self.Flash_Size = GetWeaponFlash_Size(self.weapon); - self.Weapon_Name = GetWeaponName(self.weapon); - -#endif // FTE - - self = tempe; - } - - if (other.ach_tracker_coll == ach_tracker_col2) { - GiveAchievement(12, other); - } -}; - -void() buy_weapon_link_target = -{ - entity ent; - - ent = find (world, targetname, self.target); - - if (ent.classname == "weapon_wall") - self.enemy = ent; -} - -void() buy_weapon = -{ - string weaponname; - InitTrigger (); - - weaponname = GetWeaponModel (self.weapon, 0); - if (weaponname != "") - precache_model (weaponname); - - // Use the grenade bag instead for nades - if (self.weapon == W_GRENADE) - weaponname = "models/props/grenade_bag.mdl"; - else - weaponname = GetWeaponModel(self.weapon, 1); - if (weaponname != "") - precache_model (weaponname); - - precache_extra (self.weapon); - self.touch = buy_weapon_touch; - - self.think = buy_weapon_link_target; - self.nextthink = time + 0.2; - - ach_tracker_col2++; - - precache_sound("sounds/misc/ching.wav"); -}; - .float radioState; .float length; .string tune; diff --git a/source/server/entities/triggers.qc b/source/server/entities/triggers.qc index 681b326..0e86db0 100644 --- a/source/server/entities/triggers.qc +++ b/source/server/entities/triggers.qc @@ -240,80 +240,6 @@ void() trigger_activator = self.touch = trigger_activator_touch; } -void() prop_reset_velocity = -{ - self.velocity = 0; -} - -void() use_wall_weapon = -{ - // Already animated the Prop - if (self.enemy.boxstatus != 0) - return; - - // Play a sound for it "spawning" - sound(self, 1, "sounds/misc/buy.wav", 1, 1); - - // MP5K and Waffe were added in late in the mix-up.. needs special case. Also grenade bag. - switch(self.sequence + 1) { - case 26: // Grenade bag - setmodel(self.enemy, "models/props/grenade_bag.mdl"); - break; - case 29: // MP5K - setmodel(self.enemy, GetWeaponModel(W_MP5K, 1)); - break; - case 28: // Waffe - setmodel(self.enemy, GetWeaponModel(W_TESLA, 1)); - break; - case 30: // Springfield - setmodel(self.enemy, GetWeaponModel(W_SPRING, 1)); - break; - default: - setmodel(self.enemy, GetWeaponModel(self.sequence + 1, 1)); - break; - } - - // Send it forward a bit - makevectors(self.angles); - self.enemy.velocity = v_right * 6; - self.enemy.think = prop_reset_velocity; - self.enemy.nextthink = time + 0.8; - - // Make sure we don't repeat this! - self.enemy.boxstatus = 1; -} - -void() weapon_wall = -{ - // Needed for the Prop - precache_sound("sounds/misc/buy.wav"); - - // We are, indeed, Wall Chalk. - Precache_Set("models/misc/chalk.mdl"); - setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX); - - // Set-Up Weapon Prop. - entity weapon_prop = spawn(); - self.enemy = weapon_prop; - self.enemy.angles = self.angles; - self.enemy.movetype = MOVETYPE_NOCLIP; - self.enemy.solid = SOLID_NOT; - self.enemy.owner = self; - self.enemy.classname = "weapon_wall_prop"; - setsize(self.enemy, VEC_HULL2_MIN, VEC_HULL2_MAX); - - // We want the Prop to be slightly behind the Chalk. - makevectors(self.angles); - setorigin(self.enemy, self.origin + v_right*-4); - - // Prep it for usage. - self.skin = 0; - self.frame = self.sequence; - self.use = use_wall_weapon; - self.classname = "weapon_wall"; - self.effects = EF_FULLBRIGHT; -} - /* =================== Custom Teddy Triggers ===================*/ diff --git a/source/server/entities/wall_weapon.qc b/source/server/entities/wall_weapon.qc new file mode 100644 index 0000000..0e4495e --- /dev/null +++ b/source/server/entities/wall_weapon.qc @@ -0,0 +1,485 @@ +/* + server/entities/wall_weapon.qc + + Contains both weapon_wall (Chalk Prop) and buy_weapon (Buy Trigger) + functionality for purchasing Weapons off the Wall. + + Copyright (C) 2021-2023 NZ:P Team + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to: + + Free Software Foundation, Inc. + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA + +*/ + +// ================================= +// Wall Chalk Functionality +// ================================= + +// +// WallWeapon_PropResetVelocity() +// Halts the velocity for the moving Prop. +// +void() WallWeapon_PropResetVelocity = +{ + self.velocity = 0; +} + +// +// WallWeapon_Use() +// Starts the Animation Sequence for the Wall Chalk's Prop. +// +void() WallWeapon_Use = +{ + // Already animated the Prop + if (self.enemy.boxstatus != 0) + return; + + // Play a sound for it "spawning" + sound(self, 1, "sounds/misc/buy.wav", 1, 1); + + // MP5K and Waffe were added in late in the mix-up.. needs special case. Also grenade bag. + switch(self.sequence + 1) { + case 26: // Grenade bag + setmodel(self.enemy, "models/props/grenade_bag.mdl"); + break; + case 29: // MP5K + setmodel(self.enemy, GetWeaponModel(W_MP5K, 1)); + break; + case 28: // Waffe + setmodel(self.enemy, GetWeaponModel(W_TESLA, 1)); + break; + case 30: // Springfield + setmodel(self.enemy, GetWeaponModel(W_SPRING, 1)); + break; + default: + setmodel(self.enemy, GetWeaponModel(self.sequence + 1, 1)); + break; + } + + // Send it forward a bit + makevectors(self.angles); + self.enemy.velocity = v_right * 6; + self.enemy.think = WallWeapon_PropResetVelocity; + self.enemy.nextthink = time + 0.8; + + // Make sure we don't repeat this! + self.enemy.boxstatus = 1; +} + +// +// weapon_wall() +// Quake Spawn Function for Wall Chalk. +// +void() weapon_wall = +{ + // Needed for the Prop + precache_sound("sounds/misc/buy.wav"); + + // We are, indeed, Wall Chalk. + Precache_Set("models/misc/chalk.mdl"); + setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX); + + // Set-Up Weapon Prop. + entity weapon_prop = spawn(); + self.enemy = weapon_prop; + self.enemy.angles = self.angles; + self.enemy.movetype = MOVETYPE_NOCLIP; + self.enemy.solid = SOLID_NOT; + self.enemy.owner = self; + self.enemy.classname = "weapon_wall_prop"; + setsize(self.enemy, VEC_HULL2_MIN, VEC_HULL2_MAX); + + // We want the Prop to be slightly behind the Chalk. + makevectors(self.angles); + setorigin(self.enemy, self.origin + v_right*-4); + + // Prep it for usage. + self.skin = 0; + self.frame = self.sequence; + self.use = WallWeapon_Use; + self.classname = "weapon_wall"; + self.effects = EF_FULLBRIGHT; +} + +// ================================= +// Weapon Buy Trigger Functionality +// ================================= + +// +// WallWeapon_TouchTrigger() +// Rough and bloaty logic for the process of purchasing +// a weapon from the Weapon Trigger. +// +void () WallWeapon_TouchTrigger = +{ + entity oldent; + float tempf, tempf1, tempf2, tempf3; + float startframe,endframe; + string modelname; + + float wcost; + + if (other.classname != "player" || other.downed || other.isBuying) { + return; + } + + if (self.weapon != 99) { + +#ifndef FTE + + other.Weapon_Name_Touch = GetWeaponName(self.weapon); + +#endif // FTE + + float slot; + + // Player has this weapon in any of their slots, PaP'd or not. + if ((slot = Util_PlayerHasWeapon(other, self.weapon, true)) != 0) { + float is_pap = true; + + + // But the utility function returns the same value if we are NOT PaP'd + if (Util_PlayerHasWeapon(other, self.weapon, false) == slot) + is_pap = false; + + // Set the cost and weapon value (for useprint). + wcost = (is_pap) ? 4500 : self.cost2; + float wep = (is_pap) ? EqualPapWeapon(self.weapon) : self.weapon; + + useprint(other, 3, wcost, wep); + + if (!other.button7 || other.semiuse || other.isBuying) { + return; + } + + // Store current Ammo value. + float ammo = Util_GetPlayerAmmoInSlot(other, slot); + + // Max carrying capacity of the wall weapon + float wall_ammo = (is_pap) ? getWeaponAmmo(EqualPapWeapon(self.weapon)) : getWeaponAmmo(self.weapon); + + // Weapon is already full. Abort. + if (ammo >= wall_ammo) + return; + + other.semiuse = true; + + // Player doesn't have enough points. Abort. + if (other.points < wcost) { + centerprint(other, STR_NOTENOUGHPOINTS); + return; + } + + other.ach_tracker_coll++; + + // Set the weapon's ammo to the max capacity. + Util_SetPlayerAmmoInSlot(other, slot, wall_ammo); + + sound(other, 0, "sounds/misc/ching.wav", 1, 1); + other.reload_delay = 0; + + // Subtract the cost from player points. + addmoney(other, wcost*-1, 0); + + if (self.enemy) { + oldent = self; + self = self.enemy; + self.use(); + self = oldent; + } + } + } else + // Universal Ammo buy + { + +#ifndef FTE + + other.Weapon_Name_Touch = GetWeaponName(other.weapon); + +#endif // FTE + + if (other.currentammo < getWeaponAmmo(other.weapon)) { + + // Set the cost and weapon value (for useprint). + wcost = (IsPapWeapon(other.weapon)) ? 4500 : self.cost2; + + useprint(other, 3, wcost, other.weapon); + + if (!other.button7 || other.semiuse || other.isBuying) { + return; + } + + // Player doesn't have enough points. Abort. + if (other.points < wcost) { + centerprint(other, STR_NOTENOUGHPOINTS); + return; + } + + other.currentammo = getWeaponAmmo(other.weapon); + + sound(other, 0, "sounds/misc/ching.wav", 1, 1); + other.reload_delay = 0; + + // Subtract the cost from player points. + addmoney(other, wcost*-1, 0); + + if (self.enemy) { + oldent = self; + self = self.enemy; + self.use(); + self = oldent; + } + } + } + if (self.weapon == W_BETTY) + { + if (other.secondary_grenades < 2) + useprint (other, 3, self.cost2, self.weapon); + else + return; + if (!other.button7 || other.semiuse) + return; + if (other.points < self.cost2) + { + centerprint(other, STR_NOTENOUGHPOINTS); + sound(other, 0, "sounds/misc/denybuy.wav", 1, 1); + return; + } + else + { + other.ach_tracker_coll++; + other.reload_delay = 0; + sound(other, 0, "sounds/misc/ching.wav", 1, 1); + //other.boughtweapon = true; + addmoney(other, 0 - self.cost2, FALSE); + other.grenades = other.grenades | 2; + other.secondary_grenades = 2; + if (self.enemy) + { + oldent = self; + self = self.enemy; + self.use(); + self = oldent; + } + } + other.semiuse = true; + return; + } + else if (self.weapon == W_GRENADE) + { + if (other.primary_grenades < 4) + useprint (other, 3, self.cost2, self.weapon); + else + return; + if (!other.button7 || other.semiuse) + return; + if (other.points < self.cost) + { + centerprint(other, STR_NOTENOUGHPOINTS); + sound(other, 0, "sounds/misc/denybuy.wav", 1, 1); + + return; + } + else + { + other.ach_tracker_coll++; + other.reload_delay = 0; + sound(other, 0, "sounds/misc/ching.wav", 1, 1); + //other.boughtweapon = true; + addmoney(other, 0 - self.cost, FALSE); + other.primary_grenades = 4; + if (self.enemy) + { + oldent = self; + self = self.enemy; + self.use(); + self = oldent; + } + } + other.semiuse = true; + return; + } + else if (self.weapon == W_BOWIE) + { + if (!other.bowie) { + useprint(other, 3, self.cost2, self.weapon); + if (other.button7) + { + if (other.points < self.cost2) { + centerprint(other, STR_NOTENOUGHPOINTS); + return; + } else { + addmoney(other, -self.cost2, FALSE); + other.ach_tracker_coll++; + entity tempz; + tempz = self; + self = other; + Set_W_Frame(15, 30, 0, 0, 0, ReturnWeaponModel, "models/weapons/knife/v_bowie.mdl", false, S_BOTH); + self.bowie = 1; + } + } + } + } + else if (self.weapon != 99) + { + entity tempe; + + //centerprint(other, self.message); + useprint (other, 4, self.cost, self.weapon); + + if (!other.button7 || other.semiuse) { + return; + } + + other.semiuse = 1; + if (other.points < self.cost) { + centerprint (other, STR_NOTENOUGHPOINTS); + return; + } + + other.semiuse = true; + other.ach_tracker_coll++; + + if (other.weapon && !other.secondaryweapon) { + tempf = other.currentammo; + other.currentammo = other.secondaryammo; + other.secondaryammo = tempf; + + tempf1 = other.currentmag; + other.currentmag = other.secondarymag; + other.secondarymag = tempf1; + + tempf2 = other.weapon; + other.weapon = other.secondaryweapon; + other.secondaryweapon = tempf2; + + tempf3 = other.currentmag2; + other.currentmag2 = other.secondarymag2; + other.secondarymag2 = tempf3; + } else if (other.weapon && other.secondaryweapon) { + if ((other.perks & P_MULE) && !other.thirdweapon) { + // store secondary weapon + tempf = other.secondaryweapon; + tempf1 = other.secondarymag; + tempf2 = other.secondaryammo; + tempf3 = other.secondarymag2; + // move primary to secondary + other.secondaryweapon = other.weapon; + other.secondarymag = other.currentmag; + other.secondarymag2 = other.currentmag2; + other.secondaryammo = other.currentammo; + // move secondary to tertiary + other.thirdweapon = tempf; + other.thirdmag = tempf1; + other.thirdammo = tempf2; + other.thirdmag2 = tempf3; + } + + // free current slot + other.currentammo = 0; + other.currentmag = 0; + other.weapon = 0; + } + + sound(other, 0, "sounds/misc/ching.wav", 1, 1); + other.reload_delay = 0; + addmoney(other, -1*self.cost, 0); + if (self.enemy) { + oldent = self; + self = self.enemy; + self.use(); + self = oldent; + } + other.weapon = self.weapon; + + other.currentammo = getWeaponAmmo(self.weapon); + other.currentmag = getWeaponMag(self.weapon); + tempe = self; + self = other; + startframe = GetFrame(self.weapon,TAKE_OUT_START); + endframe = GetFrame(self.weapon,TAKE_OUT_END); + modelname = GetWeaponModel(self.weapon, 0); + + if (self.weapon != W_KAR_SCOPE && self.weapon != W_HEADCRACKER && !IsDualWeapon(self.weapon)) { + self.weapon2model = ""; + } + + SwitchWeapon(self.weapon); + Set_W_Frame (startframe, endframe, 0, 0, 0, SUB_Null, modelname, false, S_BOTH);//FIXME + +#ifndef FTE + + self.Flash_Offset = GetWeaponFlash_Offset(self.weapon); + self.Flash_Size = GetWeaponFlash_Size(self.weapon); + self.Weapon_Name = GetWeaponName(self.weapon); + +#endif // FTE + + self = tempe; + } + + if (other.ach_tracker_coll == ach_tracker_col2) { + GiveAchievement(12, other); + } +}; + +// +// WallWeapon_LinkChalk() +// Creates a proper entity link between the Trigger +// and the Chalk the mapper targeted it towards. +// +void() WallWeapon_LinkChalk = +{ + entity ent; + + ent = find (world, targetname, self.target); + + if (ent.classname == "weapon_wall") + self.enemy = ent; +} + +// +// buy_weapon() +// Quake Spawn Function for Weapon Trigger. +// +void() buy_weapon = +{ + InitTrigger (); + + string weaponname = GetWeaponModel (self.weapon, 0); + if (weaponname != "") + precache_model(weaponname); + + // Use the grenade bag instead for nades + if (self.weapon == W_GRENADE) + weaponname = "models/props/grenade_bag.mdl"; + else + weaponname = GetWeaponModel(self.weapon, 1); + if (weaponname != "") + precache_model (weaponname); + + precache_extra (self.weapon); + self.touch = WallWeapon_TouchTrigger; + + self.think = WallWeapon_LinkChalk; + self.nextthink = time + 0.2; + + ach_tracker_col2++; + + precache_sound("sounds/misc/ching.wav"); +}; \ No newline at end of file