From 0354866bf7546e702c851e9769492ad45091fe14 Mon Sep 17 00:00:00 2001 From: div0 Date: Mon, 25 Jan 2010 17:07:43 +0000 Subject: [PATCH] refactor target_items to use the give command git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8559 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/t_items.qc | 264 ++++++++--------------------------- 1 file changed, 57 insertions(+), 207 deletions(-) diff --git a/data/qcsrc/server/t_items.qc b/data/qcsrc/server/t_items.qc index bea49ad96..4c136cdf2 100644 --- a/data/qcsrc/server/t_items.qc +++ b/data/qcsrc/server/t_items.qc @@ -1325,99 +1325,9 @@ void spawnfunc_item_minst_cells (void) { // compatibility: void spawnfunc_item_quad (void) {self.classname = "item_strength";spawnfunc_item_strength();} -float target_item_func_set(float a, float b) -{ - if(b == 0) - return a; - else if(b < 0) - return 0; - else - return b; -} - -float target_item_func_min(float a, float b) -{ - if(b == 0) - return a; - else if(b < 0) - return 0; - else - return min(a, b); -} - -float target_item_func_max(float a, float b) -{ - return max(a, b); -} - -float target_item_func_bitset(float a, float b) -{ - return b; -} - -float target_item_func_and(float a, float b) -{ - return a & b; -} - -float target_item_func_itembitset(float a, float b) -{ - return (a - (a & (IT_PICKUPMASK | IT_STRENGTH | IT_INVINCIBLE))) | b; -} - -float target_item_func_itemand(float a, float b) -{ - return (a - (a & (IT_PICKUPMASK | IT_STRENGTH | IT_INVINCIBLE))) | (a & b); -} - -float target_item_func_or(float a, float b) -{ - return a | b; -} - -float target_item_func_andnot(float a, float b) -{ - return a - (a & b); -} - -float target_item_changed; -void target_item_change(float binary, .float field, float(float a, float b) func, string sound_increase, string sound_decrease) -{ - float n, d; - n = func(activator.field, self.field); - - if(binary) - { - d = n & activator.field; - if(d != n) // bits added? - d = +1; - else if(d != activator.field) // bits removed? - d = -1; - else - d = 0; - } - else - d = n - activator.field; - - if(d < 0) - { - if(sound_decrease != "") - sound (activator, CHAN_AUTO, sound_decrease, VOL_BASE, ATTN_NORM); - target_item_changed = 1; - } - else if(d > 0) - { - if(sound_increase != "") - sound (activator, CHAN_AUTO, sound_increase, VOL_BASE, ATTN_NORM); - target_item_changed = 1; - } - activator.field = n; -} - +float GiveItems(entity e, float beginarg, float endarg); void target_items_use (void) { - float h0, a0, f0; - if(activator.classname == "droppedweapon") { EXACTTRIGGER_TOUCH; @@ -1436,110 +1346,7 @@ void target_items_use (void) if(e.enemy == activator) remove(e); - float _switchweapon; - _switchweapon = FALSE; - if (activator.autoswitch) - if (activator.switchweapon == w_getbestweapon(activator)) - _switchweapon = TRUE; - - a0 = activator.armorvalue; - h0 = activator.health; - f0 = activator.ammo_fuel; - target_item_changed = 0; - - if(self.spawnflags == 0) // SET - { - target_item_change(0, ammo_shells, target_item_func_set, "misc/itempickup.wav", ""); - target_item_change(0, ammo_nails, target_item_func_set, "misc/itempickup.wav", ""); - target_item_change(0, ammo_rockets, target_item_func_set, "misc/itempickup.wav", ""); - target_item_change(0, ammo_cells, target_item_func_set, "misc/itempickup.wav", ""); - target_item_change(0, ammo_fuel, target_item_func_set, "misc/itempickup.wav", ""); - target_item_change(0, health, target_item_func_set, "misc/megahealth.wav", ""); - target_item_change(0, armorvalue, target_item_func_set, "misc/armor25.wav", ""); - target_item_change(1, items, target_item_func_itembitset, "misc/powerup.wav", "misc/poweroff.wav"); - target_item_change(1, weapons, target_item_func_bitset, "weapons/weaponpickup.wav", ""); - - if((self.items & activator.items) & IT_STRENGTH) - activator.strength_finished = time + self.strength_finished; - if((self.items & activator.items) & IT_INVINCIBLE) - activator.invincible_finished = time + self.invincible_finished; - } - else if(self.spawnflags == 1) // AND/MIN - { - target_item_change(0, ammo_shells, target_item_func_min, "misc/itempickup.wav", ""); - target_item_change(0, ammo_nails, target_item_func_min, "misc/itempickup.wav", ""); - target_item_change(0, ammo_rockets, target_item_func_min, "misc/itempickup.wav", ""); - target_item_change(0, ammo_cells, target_item_func_min, "misc/itempickup.wav", ""); - target_item_change(0, ammo_fuel, target_item_func_min, "misc/itempickup.wav", ""); - target_item_change(0, health, target_item_func_min, "misc/megahealth.wav", ""); - target_item_change(0, armorvalue, target_item_func_min, "misc/armor25.wav", ""); - target_item_change(1, items, target_item_func_itemand, "misc/powerup.wav", "misc/poweroff.wav"); - target_item_change(1, weapons, target_item_func_and, "weapons/weaponpickup.wav", ""); - - if((self.items & activator.items) & IT_STRENGTH) - activator.strength_finished = min(activator.strength_finished, time + self.strength_finished); - if((self.items & activator.items) & IT_INVINCIBLE) - activator.invincible_finished = min(activator.invincible_finished, time + self.invincible_finished); - } - else if(self.spawnflags == 2) // OR/MAX - { - target_item_change(0, ammo_shells, target_item_func_max, "misc/itempickup.wav", ""); - target_item_change(0, ammo_nails, target_item_func_max, "misc/itempickup.wav", ""); - target_item_change(0, ammo_rockets, target_item_func_max, "misc/itempickup.wav", ""); - target_item_change(0, ammo_cells, target_item_func_max, "misc/itempickup.wav", ""); - target_item_change(0, ammo_fuel, target_item_func_max, "misc/itempickup.wav", ""); - target_item_change(0, health, target_item_func_max, "misc/megahealth.wav", ""); - target_item_change(0, armorvalue, target_item_func_max, "misc/armor25.wav", ""); - target_item_change(1, items, target_item_func_or, "misc/powerup.wav", "misc/poweroff.wav"); - target_item_change(1, weapons, target_item_func_or, "weapons/weaponpickup.wav", ""); - - if((self.items & activator.items) & IT_STRENGTH) - activator.strength_finished = max(activator.strength_finished, time + self.strength_finished); - if((self.items & activator.items) & IT_INVINCIBLE) - activator.invincible_finished = max(activator.invincible_finished, time + self.invincible_finished); - } - else if(self.spawnflags == 4) // ANDNOT/MIN - { - target_item_change(0, ammo_shells, target_item_func_min, "misc/itempickup.wav", ""); - target_item_change(0, ammo_nails, target_item_func_min, "misc/itempickup.wav", ""); - target_item_change(0, ammo_rockets, target_item_func_min, "misc/itempickup.wav", ""); - target_item_change(0, ammo_cells, target_item_func_min, "misc/itempickup.wav", ""); - target_item_change(0, ammo_fuel, target_item_func_min, "misc/itempickup.wav", ""); - target_item_change(0, health, target_item_func_min, "misc/megahealth.wav", ""); - target_item_change(0, armorvalue, target_item_func_min, "misc/armor25.wav", ""); - target_item_change(1, items, target_item_func_andnot, "misc/powerup.wav", "misc/poweroff.wav"); - target_item_change(1, weapons, target_item_func_andnot, "weapons/weaponpickup.wav", ""); - - if((self.items & activator.items) & IT_STRENGTH) - activator.strength_finished = min(activator.strength_finished, time + self.strength_finished); - if((self.items & activator.items) & IT_INVINCIBLE) - activator.invincible_finished = min(activator.invincible_finished, time + self.invincible_finished); - } - - if not(activator.items & IT_STRENGTH) - activator.strength_finished = 0; - if not(activator.items & IT_INVINCIBLE) - activator.invincible_finished = 0; - - if(activator.health > h0) - activator.pauserothealth_finished = max(activator.pauserothealth_finished, time + cvar("g_balance_pause_health_rot")); - else if(activator.health < h0) - activator.pauseregen_finished = max(activator.pauseregen_finished, time + cvar("g_balance_pause_health_regen")); - - if(activator.ammo_fuel > f0) - activator.pauserotfuel_finished = max(activator.pauserotfuel_finished, time + cvar("g_balance_pause_fuel_rot")); - else if(activator.ammo_fuel < f0) - activator.pauseregen_finished = max(activator.pauseregen_finished, time + cvar("g_balance_pause_fuel_regen")); - - if(activator.armorvalue > a0) - activator.pauserotarmor_finished = max(activator.pauserothealth_finished, time + cvar("g_balance_pause_health_rot")); - - if not(activator.weapons & W_WeaponBit(activator.switchweapon)) - _switchweapon = TRUE; - if(_switchweapon) - W_SwitchWeapon_Force(activator, w_getbestweapon(activator)); - - if(target_item_changed) + if(GiveItems(activator, 0, tokenize_console(self.netname))) centerprint(activator, self.message); } @@ -1572,17 +1379,22 @@ void spawnfunc_target_items (void) precache_sound("weapons/weaponpickup.wav"); n = tokenize_console(self.netname); - for(i = 0; i < n; ++i) + if(argv(0) == "give") { - if (argv(i) == "unlimited_ammo") self.items |= IT_UNLIMITED_AMMO; - else if(argv(i) == "unlimited_weapon_ammo") self.items |= IT_UNLIMITED_WEAPON_AMMO; - else if(argv(i) == "unlimited_superweapons") self.items |= IT_UNLIMITED_SUPERWEAPONS; - else if(argv(i) == "strength") self.items |= IT_STRENGTH; - else if(argv(i) == "invincible") self.items |= IT_INVINCIBLE; - else if(argv(i) == "jetpack") self.items |= IT_JETPACK; - else if(argv(i) == "fuel_regen") self.items |= IT_FUEL_REGEN; - else + self.netname = substring(self.netname, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)); + } + else + { + for(i = 0; i < n; ++i) { + if (argv(i) == "unlimited_ammo") self.items |= IT_UNLIMITED_AMMO; + else if(argv(i) == "unlimited_weapon_ammo") self.items |= IT_UNLIMITED_WEAPON_AMMO; + else if(argv(i) == "unlimited_superweapons") self.items |= IT_UNLIMITED_SUPERWEAPONS; + else if(argv(i) == "strength") self.items |= IT_STRENGTH; + else if(argv(i) == "invincible") self.items |= IT_INVINCIBLE; + else if(argv(i) == "jetpack") self.items |= IT_JETPACK; + else if(argv(i) == "fuel_regen") self.items |= IT_FUEL_REGEN; + else for(j = WEP_FIRST; j <= WEP_LAST; ++j) { e = get_weaponinfo(j); @@ -1597,7 +1409,45 @@ void spawnfunc_target_items (void) if(j > WEP_LAST) print("target_items: invalid item ", argv(i), "\n"); } - } + + string itemprefix, valueprefix; + if(self.spawnflags == 0) + { + itemprefix = ""; + valueprefix = ""; + } + else if(self.spawnflags == 1) + { + itemprefix = "max "; + valueprefix = "max "; + } + else if(self.spawnflags == 2) + { + itemprefix = "min "; + valueprefix = "min "; + } + else if(self.spawnflags == 4) + { + itemprefix = "minus "; + valueprefix = "max "; + } + + self.netname = ""; + self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, ftos(!!(self.items & IT_UNLIMITED_WEAPON_AMMO)), "unlimited_weapon_ammo"); + self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, ftos(!!(self.items & IT_UNLIMITED_SUPERWEAPONS)), "unlimited_superweapons"); + self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, ftos(!!(self.items & IT_STRENGTH)), "strength"); + self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, ftos(!!(self.items & IT_INVINCIBLE)), "invincible"); + self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, ftos(!!(self.items & IT_JETPACK)), "jetpack"); + self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, ftos(!!(self.items & IT_FUEL_REGEN)), "fuel_regen"); + if(self.ammo_shells != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_shells), "shells"); + if(self.ammo_nails != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_shells), "shells"); + if(self.ammo_rockets != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_rockets), "rockets"); + if(self.ammo_cells != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_shells), "shells"); + if(self.ammo_fuel != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_shells), "shells"); + if(self.health != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.health), "health"); + if(self.armorvalue != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.health), "armor"); + } + self.netname = strzone(self.netname); } void spawnfunc_item_fuel(void) @@ -1699,10 +1549,10 @@ float GiveValue(entity e, .float fld, float op, float val, string snd_incr, stri e.fld = val; break; case OP_MIN: - e.fld = min(e.fld, val); + e.fld = max(e.fld, val); // min 100 cells = at least 100 cells break; case OP_MAX: - e.fld = max(e.fld, val); + e.fld = min(e.fld, val); break; case OP_PLUS: e.fld += val; -- 2.39.2