From cb74acac1b95e3e34e2d34c2636cb6cfdfc4eef2 Mon Sep 17 00:00:00 2001 From: div0 Date: Wed, 2 Aug 2006 11:36:39 +0000 Subject: [PATCH] simplified weapon throw code by removing redundant code; added conversion functios between item codes etc. git-svn-id: svn://svn.icculus.org/nexuiz/trunk@1796 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/cl_weapons.qc | 251 +++++++-------------------- data/qcsrc/server/cl_weaponsystem.qc | 29 +--- data/qcsrc/server/defs.qh | 12 ++ data/qcsrc/server/g_damage.qc | 2 +- data/qcsrc/server/miscfunctions.qc | 3 - data/qcsrc/server/t_items.qc | 54 ++++++ 6 files changed, 132 insertions(+), 219 deletions(-) diff --git a/data/qcsrc/server/cl_weapons.qc b/data/qcsrc/server/cl_weapons.qc index 796a3d0a2..273f1d07b 100644 --- a/data/qcsrc/server/cl_weapons.qc +++ b/data/qcsrc/server/cl_weapons.qc @@ -24,6 +24,53 @@ float(float wpn, float wrequest) weapon_action = return FALSE; }; +string W_Name(float weaponid) +{ + if(weaponid == WEP_LASER) return "Laser"; + if(weaponid == WEP_UZI) return "Machine Gun"; + if(weaponid == WEP_SHOTGUN) return "Shotgun"; + if(weaponid == WEP_GRENADE_LAUNCHER) return "Mortar"; + if(weaponid == WEP_ELECTRO) return "Electro"; + if(weaponid == WEP_NEX) return "Nex"; + if(weaponid == WEP_HAGAR) return "Hagar"; + if(weaponid == WEP_ROCKET_LAUNCHER) return "Rocket Launcher"; + if(weaponid == WEP_CRYLINK) return "Crylink"; + return "@!#%'n Tuba"; +} + +float W_ItemCode(float wpn) +{ + switch(wpn) + { + case WEP_LASER: return IT_LASER; + case WEP_SHOTGUN: return IT_SHOTGUN; + case WEP_UZI: return IT_UZI; + case WEP_GRENADE_LAUNCHER: return IT_GRENADE_LAUNCHER; + case WEP_ELECTRO: return IT_ELECTRO; + case WEP_CRYLINK: return IT_CRYLINK; + case WEP_NEX: return IT_NEX; + case WEP_HAGAR: return IT_HAGAR; + case WEP_ROCKET_LAUNCHER: return IT_ROCKET_LAUNCHER; + default: return 0; + } +} + +float W_AmmoItemCode(float wpn) +{ + switch(wpn) + { + case WEP_SHOTGUN: return IT_SHELLS; + case WEP_UZI: return IT_NAILS; + case WEP_GRENADE_LAUNCHER: return IT_ROCKETS; + case WEP_ELECTRO: return IT_CELLS; + case WEP_CRYLINK: return IT_CELLS; + case WEP_NEX: return IT_CELLS; + case WEP_HAGAR: return IT_ROCKETS; + case WEP_ROCKET_LAUNCHER: return IT_ROCKETS; + default: return 0; + } +} + // think function for tossed weapons void() thrown_wep_think { @@ -38,6 +85,7 @@ void(vector velo, vector delta, float doreduce) W_ThrowWeapon { local float w, ammo; local entity wep, e; + local .float ammofield; w = self.weapon; if(w == WEP_LASER) @@ -55,186 +103,27 @@ void(vector velo, vector delta, float doreduce) W_ThrowWeapon wep.velocity = velo; // e.velocity * 0.5 + v_forward * 750; SUB_SetFade(wep, time + 20, 1); - if(w == WEP_SHOTGUN) - { - w = IT_SHOTGUN; - if(!(e.items & w)) - { - remove(wep); - self = e; - return; - } - weapon_shotgun(); - if(startitem_failed) - { - self = e; - return; - } - if(doreduce) - { - ammo = min(e.ammo_shells, wep.ammo_shells); - wep.ammo_shells = ammo; - e.ammo_shells -= ammo; - } - } - else if(w == WEP_UZI) - { - w = IT_UZI; - if(!(e.items & w)) - { - remove(wep); - self = e; - return; - } - weapon_uzi(); - if(startitem_failed) - { - self = e; - return; - } - if(doreduce) - { - ammo = min(e.ammo_nails, wep.ammo_nails); - wep.ammo_nails = ammo; - e.ammo_nails -= ammo; - } - } - else if(w == WEP_GRENADE_LAUNCHER) - { - w = IT_GRENADE_LAUNCHER; - if(!(e.items & w)) - { - self = e; - remove(wep); - return; - } - weapon_grenadelauncher(); - if(startitem_failed) - { - self = e; - return; - } - if(doreduce) - { - ammo = min(e.ammo_rockets, wep.ammo_rockets); - wep.ammo_rockets = ammo; - e.ammo_rockets -= ammo; - } - } - else if(w == WEP_ELECTRO) - { - w = IT_ELECTRO; - if(!(e.items & w)) - { - self = e; - remove(wep); - return; - } - weapon_electro(); - if(startitem_failed) - { - self = e; - return; - } - if(doreduce) - { - ammo = min(e.ammo_cells, wep.ammo_cells); - wep.ammo_cells = ammo; - e.ammo_cells -= ammo; - } - } - else if(w == WEP_CRYLINK) + ammofield = Item_CounterField(W_AmmoItemCode(w)); + w = W_ItemCode(w); + if(!(e.items & w)) { - w = IT_CRYLINK; - if(!(e.items & w)) - { - self = e; - remove(wep); - return; - } - weapon_crylink(); - if(startitem_failed) - { - self = e; - return; - } - if(doreduce) - { - ammo = min(e.ammo_cells, wep.ammo_cells); - wep.ammo_cells = ammo; - e.ammo_cells -= ammo; - } - } - else if(w == WEP_NEX) - { - w = IT_NEX; - if(!(e.items & w)) - { - self = e; - remove(wep); - return; - } - weapon_nex(); - if(startitem_failed) - { - self = e; - return; - } - if(doreduce) - { - ammo = min(e.ammo_cells, wep.ammo_cells); - wep.ammo_cells = ammo; - e.ammo_cells -= ammo; - } - } - else if(w == WEP_HAGAR) - { - w = IT_HAGAR; - if(!(e.items & w)) - { - self = e; - remove(wep); - return; - } - weapon_hagar(); - if(startitem_failed) - { - self = e; - return; - } - if(doreduce) - { - ammo = min(e.ammo_rockets, wep.ammo_rockets); - wep.ammo_rockets = ammo; - e.ammo_rockets -= ammo; - } + remove(wep); + goto leave; } - else if(w == WEP_ROCKET_LAUNCHER) + (Item_SpawnFunc(w))(); + if(startitem_failed) + goto leave; + if(doreduce) { - w = IT_ROCKET_LAUNCHER; - if(!(e.items & w)) - { - self = e; - remove(wep); - return; - } - weapon_rocketlauncher(); - if(startitem_failed) - { - self = e; - return; - } - if(doreduce) - { - ammo = min(e.ammo_rockets, wep.ammo_rockets); - wep.ammo_rockets = ammo; - e.ammo_rockets -= ammo; - } + ammo = min(e.ammofield, wep.ammofield); + wep.ammofield = ammo; + e.ammofield -= ammo; } if(e.items & w) if(e.health >= 1) sprint(e, strcat("You dropped the ^2", wep.netname, "\n")); + wep.owner = e; setorigin(wep, wep.origin); wep.nextthink = time + 0.5; @@ -246,6 +135,8 @@ void(vector velo, vector delta, float doreduce) W_ThrowWeapon wep.colormap = e.colormap; if (e.switchweapon != e.weapon) e.cnt = e.weapon; + +:leave self = e; }; @@ -426,20 +317,6 @@ void Nixnex_ChooseNextWeapon() nixnex_nextweapon = id; } -string W_Name(float weaponid) -{ - if(weaponid == WEP_LASER) return "Laser"; - if(weaponid == WEP_UZI) return "Machine Gun"; - if(weaponid == WEP_SHOTGUN) return "Shotgun"; - if(weaponid == WEP_GRENADE_LAUNCHER) return "Mortar"; - if(weaponid == WEP_ELECTRO) return "Electro"; - if(weaponid == WEP_NEX) return "Nex"; - if(weaponid == WEP_HAGAR) return "Hagar"; - if(weaponid == WEP_ROCKET_LAUNCHER) return "Rocket Launcher"; - if(weaponid == WEP_CRYLINK) return "Crylink"; - return "@!#%'n Tuba"; -} - void Nixnex_GiveCurrentWeapon() { float dt; @@ -505,7 +382,7 @@ void Nixnex_GiveCurrentWeapon() self.items = self.items - (self.items & (IT_LASER | IT_SHOTGUN | IT_UZI | IT_GRENADE_LAUNCHER | IT_ELECTRO | IT_CRYLINK | IT_NEX | IT_HAGAR | IT_ROCKET_LAUNCHER)); if(cvar("g_nixnex_with_laser")) self.items = self.items + IT_LASER; - self.items = self.items - (self.items & weapon_translateindextoflag(nixnex_weapon)) + weapon_translateindextoflag(nixnex_weapon); + self.items = self.items | W_ItemCode(nixnex_weapon); if(self.switchweapon != nixnex_weapon) if(!client_hasweapon(self, self.switchweapon, TRUE, FALSE)) diff --git a/data/qcsrc/server/cl_weaponsystem.qc b/data/qcsrc/server/cl_weaponsystem.qc index 5294f9a23..8422d14a8 100644 --- a/data/qcsrc/server/cl_weaponsystem.qc +++ b/data/qcsrc/server/cl_weaponsystem.qc @@ -229,33 +229,6 @@ void() CL_SpawnWeaponentity = self.exteriorweaponentity.nextthink = time; }; -// convertion from index (= impulse) to flag in .items -float(float index) weapon_translateindextoflag = -{ - if (index == WEP_LASER) - return IT_LASER; - else if (index == WEP_SHOTGUN) - return IT_SHOTGUN; - else if (index == WEP_UZI) - return IT_UZI; - else if (index == WEP_GRENADE_LAUNCHER) - return IT_GRENADE_LAUNCHER; - else if (index == WEP_ELECTRO) - return IT_ELECTRO; - else if (index == WEP_CRYLINK) - return IT_CRYLINK; - else if (index == WEP_NEX) - return IT_NEX; - else if (index == WEP_HAGAR) - return IT_HAGAR; - else if (index == WEP_ROCKET_LAUNCHER) - return IT_ROCKET_LAUNCHER; - else if (index == WEP_LASER) - return IT_LASER; - else - return 0; -}; - float(entity cl, float wpn, float andammo, float complain) client_hasweapon = { local float itemcode, f; @@ -267,7 +240,7 @@ float(entity cl, float wpn, float andammo, float complain) client_hasweapon = sprint(self, "Invalid weapon\n"); return FALSE; } - itemcode = weapon_translateindextoflag(wpn); + itemcode = W_ItemCode(wpn); if (cl.items & itemcode) { if (andammo) diff --git a/data/qcsrc/server/defs.qh b/data/qcsrc/server/defs.qh index 561ca7356..4f7acf2fa 100644 --- a/data/qcsrc/server/defs.qh +++ b/data/qcsrc/server/defs.qh @@ -272,3 +272,15 @@ string gamemode_name; float teams_matter; float startitem_failed; + + + +typedef .float floatfield; +typedef void(void) spawnfunc; +floatfield Item_CounterField(float it); +float Item_WeaponCode(float it); +spawnfunc Item_SpawnFunc(float it); + +float W_AmmoItemCode(float wpn); +float W_ItemCode(float wpn); +string W_Name(float weaponid); diff --git a/data/qcsrc/server/g_damage.qc b/data/qcsrc/server/g_damage.qc index ea8c375b0..fd887b8bd 100644 --- a/data/qcsrc/server/g_damage.qc +++ b/data/qcsrc/server/g_damage.qc @@ -51,7 +51,7 @@ string AppendItemcodes(string s, entity player) // w = player.switchweapon; if(w == 0) w = player.cnt; // previous weapon! - s = strcat(s, ftos(weapon_translateindextoflag(w))); + s = strcat(s, ftos(W_ItemCode(w))); if(time < player.strength_finished) s = strcat(s, "S"); if(time < player.invincible_finished) diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index df335d79c..e4f931083 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -1,6 +1,3 @@ -string W_Name(float weaponid); -float(float index) weapon_translateindextoflag; - float logfile_open; float logfile; diff --git a/data/qcsrc/server/t_items.qc b/data/qcsrc/server/t_items.qc index 0e34e990f..00254b3d4 100644 --- a/data/qcsrc/server/t_items.qc +++ b/data/qcsrc/server/t_items.qc @@ -571,3 +571,57 @@ void misc_models (void) } + + + +floatfield Item_CounterField(float it) +{ + switch(it) + { + case IT_SHELLS: return ammo_shells; + case IT_NAILS: return ammo_nails; + case IT_ROCKETS: return ammo_rockets; + case IT_CELLS: return ammo_cells; + case IT_5HP: return health; + case IT_25HP: return health; + case IT_HEALTH: return health; + case IT_ARMOR_SHARD: return armorvalue; + case IT_ARMOR: return armorvalue; + // add more things here (health, armor) + default: error("requested item has no counter field"); + } +} + +float Item_WeaponCode(float it) +{ + switch(it) + { + case IT_LASER: return WEP_LASER; + case IT_SHOTGUN: return WEP_SHOTGUN; + case IT_UZI: return WEP_UZI; + case IT_GRENADE_LAUNCHER: return WEP_GRENADE_LAUNCHER; + case IT_ELECTRO: return WEP_ELECTRO; + case IT_CRYLINK: return WEP_CRYLINK; + case IT_NEX: return WEP_NEX; + case IT_HAGAR: return WEP_HAGAR; + case IT_ROCKET_LAUNCHER: return WEP_ROCKET_LAUNCHER; + default: return 0; + } +} + +spawnfunc Item_SpawnFunc(float it) +{ + switch(it) + { + case IT_SHOTGUN: return weapon_shotgun; + case IT_UZI: return weapon_uzi; + case IT_GRENADE_LAUNCHER: return weapon_grenadelauncher; + case IT_ELECTRO: return weapon_electro; + case IT_CRYLINK: return weapon_crylink; + case IT_NEX: return weapon_nex; + case IT_HAGAR: return weapon_hagar; + case IT_ROCKET_LAUNCHER: return weapon_rocketlauncher; + // add all other item spawn functions here + default: error("requested item can't be spawned"); + } +} -- 2.39.2