From 411e12f1ed2f4ae0f8020a21d21f5b5ced3d23d9 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Sun, 4 Mar 2012 16:08:44 +0100 Subject: [PATCH] more proper use of weapon sets --- qcsrc/common/items.qh | 98 +++++++++++++-------- qcsrc/server/bot/havocbot/havocbot.qc | 8 +- qcsrc/server/bot/havocbot/role_onslaught.qc | 4 +- qcsrc/server/bot/havocbot/roles.qc | 4 +- qcsrc/server/cheats.qc | 6 +- qcsrc/server/cl_client.qc | 26 +++--- 6 files changed, 82 insertions(+), 64 deletions(-) diff --git a/qcsrc/common/items.qh b/qcsrc/common/items.qh index 2256e4d0e..1cae4d133 100644 --- a/qcsrc/common/items.qh +++ b/qcsrc/common/items.qh @@ -90,43 +90,63 @@ void register_weapon(float id, float(float) func, float ammotype, float i, float void register_weapons_done(); #if 1 -# define WEPBITS_CLEAR_E(e) ((e).weapons = 0) -# define WEPBITS_CLEAR_A(a) ((a) = 0) - -# define WEPBITS_COPY_EE(e,e2) ((e).weapons = (e2).weapons) -# define WEPBITS_EQ_EE(e,e2) ((e).weapons == (e2).weapons) -# define WEPBITS_OR_EE(e,e2) ((e).weapons |= (e2).weapons) -# define WEPBITS_AND_EE(e,e2) ((e).weapons &= (e2).weapons) -# define WEPBITS_ANDNOT_EE(e,e2) ((e).weapons &~= (e2).weapons) -# define WEPBITS_TEST_EE(e,e2) ((e).weapons & (e2).weapons) - -# define WEPBITS_COPY_EA(e,a) ((e).weapons = (a)) -# define WEPBITS_EQ_EA(e,a) ((e).weapons == (a)) -# define WEPBITS_OR_EA(e,a) ((e).weapons |= (a)) -# define WEPBITS_AND_EA(e,a) ((e).weapons &= (a)) -# define WEPBITS_ANDNOT_EA(e,a) ((e).weapons &~= (a)) -# define WEPBITS_TEST_EA(e,a) ((e).weapons & (a)) - -# define WEPBITS_COPY_AA(a,a2) ((a) = (a2)) -# define WEPBITS_EQ_AA(a,a2) ((a) == (a2)) -# define WEPBITS_OR_AA(a,a2) ((a) |= (a2)) -# define WEPBITS_AND_AA(a,a2) ((a) &= (a2)) -# define WEPBITS_ANDNOT_AA(a,a2) ((a) &~= (a2)) -# define WEPBITS_TEST_AA(a,a2) ((a) & (a2)) - -# define WEPBITS_COPY_EW(e,w) ((e).weapons = power2of((w) - WEP_FIRST)) -# define WEPBITS_EQ_EW(e,w) ((e).weapons == power2of((w) - WEP_FIRST)) -# define WEPBITS_OR_EW(e,w) ((e).weapons |= power2of((w) - WEP_FIRST)) -# define WEPBITS_AND_EW(e,w) ((e).weapons &= power2of((w) - WEP_FIRST)) -# define WEPBITS_ANDNOT_EW(e,w) ((e).weapons &~= power2of((w) - WEP_FIRST)) -# define WEPBITS_TEST_EW(e,w) ((e).weapons & power2of((w) - WEP_FIRST)) - -# define WEPBITS_COPY_AW(a,w) ((a) = power2of((w) - WEP_FIRST)) -# define WEPBITS_EQ_AW(a,w) ((a) == power2of((w) - WEP_FIRST)) -# define WEPBITS_OR_AW(a,w) ((a) |= power2of((w) - WEP_FIRST)) -# define WEPBITS_AND_AW(a,w) ((a) &= power2of((w) - WEP_FIRST)) -# define WEPBITS_ANDNOT_AW(a,w) ((a) &~= power2of((w) - WEP_FIRST)) -# define WEPBITS_TEST_AW(a,w) ((a) & power2of((w) - WEP_FIRST)) +# define WEPSET_CLEAR_E(e) ((e).weapons = 0) +# define WEPSET_CLEAR_A(a) ((a) = 0) + +# define WEPSET_EMPTY_E(e) ((e).weapons == 0) +# define WEPSET_EMPTY_A(a) ((a) == 0) + +# define WEPSET_COPY_EE(e,o) ((e).weapons = (o).weapons) +# define WEPSET_EQ_EE(e,o) ((e).weapons == (o).weapons) +# define WEPSET_OR_EE(e,o) ((e).weapons |= (o).weapons) +# define WEPSET_AND_EE(e,o) ((e).weapons &= (o).weapons) +# define WEPSET_ANDNOT_EE(e,o) ((e).weapons &~= (o).weapons) +# define WEPSET_TEST_EE(e,o) ((e).weapons & (o).weapons) +# define WEPSET_CONTAINS_EE(e,o) (((e).weapons & (o).weapons) == (e).weapons) + +# define WEPSET_COPY_EA(e,a) ((e).weapons = (a)) +# define WEPSET_EQ_EA(e,a) ((e).weapons == (a)) +# define WEPSET_OR_EA(e,a) ((e).weapons |= (a)) +# define WEPSET_AND_EA(e,a) ((e).weapons &= (a)) +# define WEPSET_ANDNOT_EA(e,a) ((e).weapons &~= (a)) +# define WEPSET_TEST_EA(e,a) ((e).weapons & (a)) +# define WEPSET_CONTAINS_EA(e,a) (((e).weapons & (a)) == (a)) + +# define WEPSET_COPY_EW(e,w) ((e).weapons = power2of((w) - WEP_FIRST)) +# define WEPSET_EQ_EW(e,w) ((e).weapons == power2of((w) - WEP_FIRST)) +# define WEPSET_OR_EW(e,w) ((e).weapons |= power2of((w) - WEP_FIRST)) +# define WEPSET_AND_EW(e,w) ((e).weapons &= power2of((w) - WEP_FIRST)) +# define WEPSET_ANDNOT_EW(e,w) ((e).weapons &~= power2of((w) - WEP_FIRST)) +// no TEST necessary here, CONTAINS does the same +# define WEPSET_TEST_EW(e,w) ((e).weapons & power2of((w) - WEP_FIRST)) + +# define WEPSET_COPY_AE(a,e) ((a) = (e).weapons) +# define WEPSET_EQ_AE(a,e) ((a) == (e).weapons) +# define WEPSET_OR_AE(a,e) ((a) |= (e).weapons) +# define WEPSET_AND_AE(a,e) ((a) &= (e).weapons) +# define WEPSET_ANDNOT_AE(a,e) ((a) &~= (e).weapons) +# define WEPSET_TEST_AE(a,e) ((a) & (e).weapons) +# define WEPSET_CONTAINS_AE(a,e) (((a) & (e).weapons) == (e)) + +# define WEPSET_COPY_AA(a,b) ((a) = (b)) +# define WEPSET_EQ_AA(a,b) ((a) == (b)) +# define WEPSET_OR_AA(a,b) ((a) |= (b)) +# define WEPSET_AND_AA(a,b) ((a) &= (b)) +# define WEPSET_ANDNOT_AA(a,b) ((a) &~= (b)) +# define WEPSET_TEST_AA(a,b) ((a) & (b)) +# define WEPSET_CONTAINS_AA(a,b) (((a) & (b)) == (b)) + +# define WEPSET_COPY_AW(a,w) ((a) = power2of((w) - WEP_FIRST)) +# define WEPSET_EQ_AW(a,w) ((a) == power2of((w) - WEP_FIRST)) +# define WEPSET_OR_AW(a,w) ((a) |= power2of((w) - WEP_FIRST)) +# define WEPSET_AND_AW(a,w) ((a) &= power2of((w) - WEP_FIRST)) +# define WEPSET_ANDNOT_AW(a,w) ((a) &~= power2of((w) - WEP_FIRST)) +// no TEST necessary here, CONTAINS does the same +# define WEPSET_CONTAINS_AW(a,w) ((a) & power2of((w) - WEP_FIRST)) + +# ifdef CSQC +# define WEPSET_COPY_AS(a) ((a) = getstatf(STAT_WEAPONS)) +# endif #endif float WEP_COUNT; @@ -143,9 +163,9 @@ float WEPBIT_SUPERWEAPONS; void RegisterWeapons_##id() \ { \ WEP_LAST = (id = WEP_FIRST + WEP_COUNT); \ - WEPBITS_OR_AW(WEPBIT_ALL, id); \ + WEPSET_OR_AW(WEPBIT_ALL, id); \ if(fabs(weapontype & WEP_FLAG_SUPERWEAPON)) \ - WEPBITS_OR_AW(WEPBIT_SUPERWEAPONS, id); \ + WEPSET_OR_AW(WEPBIT_SUPERWEAPONS, id); \ ++WEP_COUNT; \ register_weapon(id,func,ammotype,i,weapontype,pickupbasevalue,modelname,shortname,wname); \ } \ diff --git a/qcsrc/server/bot/havocbot/havocbot.qc b/qcsrc/server/bot/havocbot/havocbot.qc index 3aefc45a7..42b829ffd 100644 --- a/qcsrc/server/bot/havocbot/havocbot.qc +++ b/qcsrc/server/bot/havocbot/havocbot.qc @@ -94,7 +94,7 @@ void havocbot_ai() self.aistatus |= AI_STATUS_ATTACKING; self.aistatus &~= AI_STATUS_ROAMING; - if(self.weapons) + if(!WEPSET_EMPTY_E(self)) { weapon_action(self.weapon, WR_AIM); if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(self)) @@ -168,7 +168,7 @@ void havocbot_ai() for(i = WEP_FIRST; i <= WEP_LAST; ++i) { e = get_weaponinfo(i); - if ((self.weapons & W_WeaponBit(i)) && (e.spawnflags & WEP_FLAG_RELOADABLE) && (self.weapon_load[i] < cvar(strcat("g_balance_", e.netname, "_reload_ammo")))) + if (WEPSET_TEST_EE(self, e) && (e.spawnflags & WEP_FLAG_RELOADABLE) && (self.weapon_load[i] < cvar(strcat("g_balance_", e.netname, "_reload_ammo")))) self.switchweapon = i; } } @@ -930,7 +930,7 @@ void havocbot_chooseenemy() // I want to do a second scan if no enemy was found or I don't have weapons // TODO: Perform the scan when using the rifle (requires changes on the rifle code) - if(best || self.weapons) // || self.weapon == WEP_RIFLE + if(best || !WEPSET_EMPTY_E(self)) // || self.weapon == WEP_RIFLE break; if(i) break; @@ -979,7 +979,7 @@ void havocbot_chooseweapon() float i; // ;) - if(g_weaponarena == WEPBIT_TUBA) + if(WEPSET_EQ_AW(g_weaponarena, WEP_TUBA)) { self.switchweapon = WEP_TUBA; return; diff --git a/qcsrc/server/bot/havocbot/role_onslaught.qc b/qcsrc/server/bot/havocbot/role_onslaught.qc index 3ae7379be..f37f821f1 100644 --- a/qcsrc/server/bot/havocbot/role_onslaught.qc +++ b/qcsrc/server/bot/havocbot/role_onslaught.qc @@ -38,7 +38,7 @@ void havocbot_goalrating_ons_offenseitems(float ratingscale, vector org, float s for(i = WEP_FIRST; i <= WEP_LAST ; ++i) { // Find weapon - if(power2of(i-1) & self.weapons) + if(WEPSET_TEST_EW(self, i)) if(++c>=4) break; } @@ -58,7 +58,7 @@ void havocbot_goalrating_ons_offenseitems(float ratingscale, vector org, float s { // gather health and armor only if (head.solid) - if ( ((head.health || head.armorvalue) && needarmor) || (head.weapons && needweapons ) ) + if ( ((head.health || head.armorvalue) && needarmor) || (!WEPSET_EMPTY_E(head) && needweapons ) ) if (vlen(head.origin - org) < sradius) { t = head.bot_pickupevalfunc(self, head); diff --git a/qcsrc/server/bot/havocbot/roles.qc b/qcsrc/server/bot/havocbot/roles.qc index 91eb2ec1a..d9cddacbd 100644 --- a/qcsrc/server/bot/havocbot/roles.qc +++ b/qcsrc/server/bot/havocbot/roles.qc @@ -85,8 +85,8 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius) if( head.armorvalue && player.armorvalue > self.armorvalue) continue; - if( head.weapons ) - if( (player.weapons & head.weapons) != head.weapons) + if( !WEPSET_EMPTY_E(head) ) + if( !WEPSET_CONTAINS_EE(player, head) ) continue; if (head.ammo_shells && player.ammo_shells > self.ammo_shells) diff --git a/qcsrc/server/cheats.qc b/qcsrc/server/cheats.qc index 5ba860940..19ee93868 100644 --- a/qcsrc/server/cheats.qc +++ b/qcsrc/server/cheats.qc @@ -145,7 +145,7 @@ float CheatImpulse(float i) self.personal.ammo_fuel = self.ammo_fuel; self.personal.health = self.health; self.personal.armorvalue = self.armorvalue; - self.personal.weapons = self.weapons; + WEPSET_COPY_EE(self.personal, self); self.personal.items = self.items; self.personal.pauserotarmor_finished = self.pauserotarmor_finished; self.personal.pauserothealth_finished = self.pauserothealth_finished; @@ -206,7 +206,7 @@ float CheatImpulse(float i) self.ammo_fuel = 999; self.health = start_health; self.armorvalue = start_armorvalue; - self.weapons |= weaponsInMap; + WEPSET_OR_EA(self.personal, weaponsInMap); self.pauserotarmor_finished = time + autocvar_g_balance_pause_armor_rot_spawn; self.pauserothealth_finished = time + autocvar_g_balance_pause_health_rot_spawn; self.pauserotfuel_finished = time + autocvar_g_balance_pause_fuel_rot_spawn; @@ -223,7 +223,7 @@ float CheatImpulse(float i) self.ammo_fuel = self.personal.ammo_fuel; self.health = self.personal.health; self.armorvalue = self.personal.armorvalue; - self.weapons = self.personal.weapons; + WEPSET_COPY_EE(self, self.personal); self.items = self.personal.items; self.pauserotarmor_finished = time + self.personal.pauserotarmor_finished - self.personal.teleport_time; self.pauserothealth_finished = time + self.personal.pauserothealth_finished - self.personal.teleport_time; diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index c213f7adb..bf4a25950 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -485,7 +485,7 @@ void PutObserverInServer (void) setorigin (self, (spot.origin + PL_VIEW_OFS)); // offset it so that the spectator spawns higher off the ground, looks better this way self.prevorigin = self.origin; self.items = 0; - self.weapons = 0; + WEPSET_CLEAR_E(self); self.model = ""; FixPlayermodel(); setmodel(self, "null"); @@ -735,7 +735,7 @@ void PutClientInServer (void) self.ammo_fuel = warmup_start_ammo_fuel; self.health = warmup_start_health; self.armorvalue = warmup_start_armorvalue; - self.weapons = warmup_start_weapons; + WEPSET_COPY_EA(self, warmup_start_weapons); } else { @@ -746,10 +746,10 @@ void PutClientInServer (void) self.ammo_fuel = start_ammo_fuel; self.health = start_health; self.armorvalue = start_armorvalue; - self.weapons = start_weapons; + WEPSET_COPY_EA(self, start_weapons); } - if(WEPBITS_TEST_EA(self, WEPBIT_SUPERWEAPONS)) // exception for minstagib, as minstanex is a superweapon + if(WEPSET_TEST_EA(self, WEPBIT_SUPERWEAPONS)) // exception for minstagib, as minstanex is a superweapon self.superweapons_finished = time + autocvar_g_balance_superweapons_time; else self.superweapons_finished = 0; @@ -757,10 +757,10 @@ void PutClientInServer (void) if(g_weaponarena_random) { if(g_weaponarena_random_with_laser) - WEPBITS_ANDNOT_EW(self, WEPBIT_LASER); + WEPSET_ANDNOT_EW(self, WEPBIT_LASER); self.weapons = randombits(self.weapons, g_weaponarena_random, FALSE); if(g_weaponarena_random_with_laser) - WEPBITS_OR_EW(self, WEPBIT_LASER); + WEPSET_OR_EW(self, WEPBIT_LASER); } self.items = start_items; @@ -1532,7 +1532,7 @@ void ClientConnect (void) if(clienttype(self) == CLIENTTYPE_REAL) { - if(autocvar_g_bugrigs || g_weaponarena == WEPBIT_TUBA) + if(autocvar_g_bugrigs || WEPSET_EQ_AW(g_weaponarena, WEP_TUBA)) stuffcmd(self, "cl_cmd settemp chase_active 1\n"); } @@ -1895,9 +1895,7 @@ void player_powerups (void) } if (self.items & IT_SUPERWEAPON) { - //if(W_WeaponBit(self.weapon) & WEPBIT_SUPERWEAPONS) - // self.effects = self.effects | EF_RED; - if (!(self.weapons & WEPBIT_SUPERWEAPONS)) + if (!WEPSET_TEST_EA(self, WEPBIT_SUPERWEAPONS)) { self.superweapons_finished = 0; self.items = self.items - (self.items & IT_SUPERWEAPON); @@ -1913,12 +1911,12 @@ void player_powerups (void) if (time > self.superweapons_finished) { self.items = self.items - (self.items & IT_SUPERWEAPON); - self.weapons &~= WEPBIT_SUPERWEAPONS; + WEPSET_ANDNOT_EA(self, WEPBIT_SUPERWEAPONS); sprint(self, "^3Superweapons have broken down\n"); } } } - else if(self.weapons & WEPBIT_SUPERWEAPONS) + else if(WEPSET_TEST_EA(self, WEPBIT_SUPERWEAPONS)) { if (time < self.superweapons_finished || (self.items & IT_UNLIMITED_SUPERWEAPONS)) { @@ -1928,7 +1926,7 @@ void player_powerups (void) else { self.superweapons_finished = 0; - self.weapons &~= WEPBIT_SUPERWEAPONS; // just in case + WEPSET_ANDNOT_EA(self, WEPBIT_SUPERWEAPONS); } } else @@ -2155,7 +2153,7 @@ void SpectateCopy(entity spectatee) { self.strength_finished = spectatee.strength_finished; self.invincible_finished = spectatee.invincible_finished; self.pressedkeys = spectatee.pressedkeys; - self.weapons = spectatee.weapons; + WEPSET_COPY_EE(self, spectatee); self.switchweapon = spectatee.switchweapon; self.switchingweapon = spectatee.switchingweapon; self.weapon = spectatee.weapon; -- 2.39.2