From: Rudolf Polzer Date: Sun, 4 Mar 2012 16:19:17 +0000 (+0100) Subject: less evil in t_items.qc now X-Git-Tag: xonotic-v0.7.0~348^2~1^2~33 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=9c40b673b5a028ee358f6e3daf3e22a2d400b1a7;p=xonotic%2Fxonotic-data.pk3dir.git less evil in t_items.qc now --- diff --git a/qcsrc/common/items.qh b/qcsrc/common/items.qh index ed174c710..89d2419ff 100644 --- a/qcsrc/common/items.qh +++ b/qcsrc/common/items.qh @@ -104,46 +104,46 @@ void register_weapons_done(); # 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_CONTAINS_ANY_EE(e,o) ((e).weapons & (o).weapons) -# define WEPSET_CONTAINS_ALL_EE(e,o) (((e).weapons & (o).weapons) == (e).weapons) +# define WEPSET_CONTAINS_ANY_EE(e,o) !!((e).weapons & (o).weapons) +# define WEPSET_CONTAINS_ALL_EE(e,o) !!(((e).weapons & (o).weapons) == (e).weapons) # define WEPSET_COPY_EA(e,a) ((e).weapons = (_WS_##a)) # define WEPSET_EQ_EA(e,a) ((e).weapons == (_WS_##a)) # define WEPSET_OR_EA(e,a) ((e).weapons |= (_WS_##a)) # define WEPSET_AND_EA(e,a) ((e).weapons &= (_WS_##a)) # define WEPSET_ANDNOT_EA(e,a) ((e).weapons &~= (_WS_##a)) -# define WEPSET_CONTAINS_ANY_EA(e,a) ((e).weapons & (_WS_##a)) -# define WEPSET_CONTAINS_ALL_EA(e,a) (((e).weapons & (_WS_##a)) == (_WS_##a)) +# define WEPSET_CONTAINS_ANY_EA(e,a) !!((e).weapons & (_WS_##a)) +# define WEPSET_CONTAINS_ALL_EA(e,a) !!(((e).weapons & (_WS_##a)) == (_WS_##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)) -# define WEPSET_CONTAINS_EW(e,w) ((e).weapons & power2of((w) - WEP_FIRST)) +# define WEPSET_CONTAINS_EW(e,w) !!((e).weapons & power2of((w) - WEP_FIRST)) # define WEPSET_COPY_AE(a,e) ((_WS_##a) = (e).weapons) # define WEPSET_EQ_AE(a,e) ((_WS_##a) == (e).weapons) # define WEPSET_OR_AE(a,e) ((_WS_##a) |= (e).weapons) # define WEPSET_AND_AE(a,e) ((_WS_##a) &= (e).weapons) # define WEPSET_ANDNOT_AE(a,e) ((_WS_##a) &~= (e).weapons) -# define WEPSET_CONTAINS_ANY_AE(a,e) ((_WS_##a) & (e).weapons) -# define WEPSET_CONTAINS_ALL_AE(a,e) (((_WS_##a) & (e).weapons) == (e)) +# define WEPSET_CONTAINS_ANY_AE(a,e) !!((_WS_##a) & (e).weapons) +# define WEPSET_CONTAINS_ALL_AE(a,e) !!(((_WS_##a) & (e).weapons) == (e)) # define WEPSET_COPY_AA(a,b) ((_WS_##a) = (_WS_##b)) # define WEPSET_EQ_AA(a,b) ((_WS_##a) == (_WS_##b)) # define WEPSET_OR_AA(a,b) ((_WS_##a) |= (_WS_##b)) # define WEPSET_AND_AA(a,b) ((_WS_##a) &= (_WS_##b)) # define WEPSET_ANDNOT_AA(a,b) ((_WS_##a) &~= (_WS_##b)) -# define WEPSET_CONTAINS_ANY_AA(a,b) ((_WS_##a) & (_WS_##b)) -# define WEPSET_CONTAINS_ALL_AA(a,b) (((_WS_##a) & (_WS_##b)) == (_WS_##b)) +# define WEPSET_CONTAINS_ANY_AA(a,b) !!((_WS_##a) & (_WS_##b)) +# define WEPSET_CONTAINS_ALL_AA(a,b) !!(((_WS_##a) & (_WS_##b)) == (_WS_##b)) # define WEPSET_COPY_AW(a,w) ((_WS_##a) = power2of((w) - WEP_FIRST)) # define WEPSET_EQ_AW(a,w) ((_WS_##a) == power2of((w) - WEP_FIRST)) # define WEPSET_OR_AW(a,w) ((_WS_##a) |= power2of((w) - WEP_FIRST)) # define WEPSET_AND_AW(a,w) ((_WS_##a) &= power2of((w) - WEP_FIRST)) # define WEPSET_ANDNOT_AW(a,w) ((_WS_##a) &~= power2of((w) - WEP_FIRST)) -# define WEPSET_CONTAINS_AW(a,w) ((_WS_##a) & power2of((w) - WEP_FIRST)) +# define WEPSET_CONTAINS_AW(a,w) !((_WS_##a) & power2of((w) - WEP_FIRST)) # ifdef CSQC # define WEPSET_COPY_AS(a) ((_WS_##a) = getstatf(STAT_WEAPONS)) diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index 99bacf460..d31cdc0ed 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -83,7 +83,7 @@ float Item_Customize() { if(self.spawnshieldtime) return TRUE; - if(self.weapons != (self.weapons & other.weapons)) + if(!WEPSET_CONTAINS_ALL_EE(other, self)) { self.colormod = '0 0 0'; self.glowmod = self.colormod; @@ -620,10 +620,10 @@ float generic_pickupevalfunc(entity player, entity item) {return item.bot_pickup float weapon_pickupevalfunc(entity player, entity item) { - float c, i, j, position; + float c, j, position; // See if I have it already - if(player.weapons & item.weapons == item.weapons) + if(!WEPSET_CONTAINS_ALL_EE(player, item)) { // If I can pick it up if(!item.spawnshieldtime) @@ -642,34 +642,27 @@ float weapon_pickupevalfunc(entity player, entity item) // If custom weapon priorities for bots is enabled rate most wanted weapons higher if( bot_custom_weapon && c ) { - for(i = WEP_FIRST; i <= WEP_LAST ; ++i) - { - // Find weapon - if( (get_weaponinfo(i)).weapons & item.weapons != item.weapons ) - continue; - - // Find the highest position on any range - position = -1; - for(j = 0; j < WEP_LAST ; ++j){ - if( - bot_weapons_far[j] == i || - bot_weapons_mid[j] == i || - bot_weapons_close[j] == i - ) - { - position = j; - break; - } - } - - // Rate it - if (position >= 0 ) + // Find the highest position on any range + position = -1; + for(j = 0; j < WEP_LAST ; ++j){ + if( + bot_weapons_far[j] == item.weapon || + bot_weapons_mid[j] == item.weapon || + bot_weapons_close[j] == item.weapon + ) { - position = WEP_LAST - position; - // item.bot_pickupbasevalue is overwritten here - return (BOT_PICKUP_RATING_LOW + ( (BOT_PICKUP_RATING_HIGH - BOT_PICKUP_RATING_LOW) * (position / WEP_LAST ))) * c; + position = j; + break; } } + + // Rate it + if (position >= 0 ) + { + position = WEP_LAST - position; + // item.bot_pickupbasevalue is overwritten here + return (BOT_PICKUP_RATING_LOW + ( (BOT_PICKUP_RATING_HIGH - BOT_PICKUP_RATING_LOW) * (position / WEP_LAST ))) * c; + } } return item.bot_pickupbasevalue * c; @@ -686,7 +679,7 @@ float commodity_pickupevalfunc(entity player, entity item) { wi = get_weaponinfo(i); - if not(wi.weapons & player.weapons) + if not(WEPSET_CONTAINS_EW(player, i)) continue; if(wi.items & IT_SHELLS) @@ -741,7 +734,9 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, startitem_failed = FALSE; self.items = itemid; - self.weapons = weaponid; + self.weapon = weaponid; + if(weaponid) + WEPSET_COPY_EW(self, weaponid); self.flags = FL_ITEM | itemflags; // is it a dropped weapon? @@ -758,7 +753,7 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, if(self.strength_finished || self.invincible_finished || self.superweapons_finished) /* if(self.items == 0) - if(self.weapons == (self.weapons & WEPBIT_SUPERWEAPONS)) // only superweapons + if(WEPSET_CONTAINS_ALL_AE(WEPBIT_SUPERWEAPONS, self)) // only superweapons if(self.ammo_nails == 0) if(self.ammo_cells == 0) if(self.ammo_rockets == 0) @@ -876,10 +871,6 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, self.bot_pickupbasevalue = pickupbasevalue; self.mdl = itemmodel; self.item_pickupsound = pickupsound; - if(self.weapons) - self.weapon = WEP_FIRST + log2of(lowestbit(self.weapons)); - else - self.weapon = 0; // let mappers override respawntime if(!self.respawntime) // both set { @@ -1102,7 +1093,7 @@ void weapon_defaultspawnfunc(float wpn) if(self.team) f |= FL_NO_WEAPON_STAY; - StartItem(e.model, "weapons/weaponpickup.wav", self.respawntime, self.respawntimejitter, e.message, 0, e.weapons, f, weapon_pickupevalfunc, e.bot_pickupbasevalue); + StartItem(e.model, "weapons/weaponpickup.wav", self.respawntime, self.respawntimejitter, e.message, 0, e.weapon, f, weapon_pickupevalfunc, e.bot_pickupbasevalue); if (self.modelindex) // don't precache if self was removed weapon_action(e.weapon, WR_PRECACHE); } @@ -1410,7 +1401,7 @@ void spawnfunc_target_items (void) e = get_weaponinfo(j); if(argv(i) == e.netname) { - self.weapons |= e.weapons; + WEPSET_OR_EW(self, j); if(self.spawnflags == 0 || self.spawnflags == 2) weapon_action(e.weapon, WR_PRECACHE); break; @@ -1462,8 +1453,8 @@ void spawnfunc_target_items (void) for(j = WEP_FIRST; j <= WEP_LAST; ++j) { e = get_weaponinfo(j); - if(e.weapons) - self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, !!(self.weapons & e.weapons), e.netname); + if(e.weapon) + self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, WEPSET_CONTAINS_EW(self, j), e.netname); } } self.netname = strzone(self.netname); @@ -1684,8 +1675,8 @@ float GiveItems(entity e, float beginarg, float endarg) for(j = WEP_FIRST; j <= WEP_LAST; ++j) { wi = get_weaponinfo(j); - if(wi.weapons) - got += GiveBit(e, weapons, wi.weapons, op, val); + if(wi.weapon) + got += GiveBit(e, weapons, wi.weapons, op, val); // FIXME } case "allammo": got += GiveValue(e, ammo_cells, op, val); @@ -1746,7 +1737,7 @@ float GiveItems(entity e, float beginarg, float endarg) wi = get_weaponinfo(j); if(cmd == wi.netname) { - got += GiveBit(e, weapons, wi.weapons, op, val); + got += GiveBit(e, weapons, wi.weapons, op, val); // FIXME break; } } @@ -1765,11 +1756,12 @@ float GiveItems(entity e, float beginarg, float endarg) for(j = WEP_FIRST; j <= WEP_LAST; ++j) { wi = get_weaponinfo(j); - if(wi.weapons) + if(wi.weapon) { - POSTGIVE_BIT(e, weapons, wi.weapons, "weapons/weaponpickup.wav", string_null); - if not(save_weapons & wi.weapons) - if(e.weapons & wi.weapons) + POSTGIVE_BIT(e, weapons, wi.weapons, "weapons/weaponpickup.wav", string_null); // FIXME +#define _WS_save_weapons save_weapons + if not(WEPSET_CONTAINS_AW(save_weapons, j)) // FIXME + if(WEPSET_CONTAINS_EW(e, j)) weapon_action(wi.weapon, WR_PRECACHE); } }