]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Refactor code to remove WEP_FLAG_SPECIALATTACK checks if WEP_FLAG_HIDDEN is already... 1373/head
authorterencehill <piuntn@gmail.com>
Sat, 4 Jan 2025 14:04:08 +0000 (15:04 +0100)
committerterencehill <piuntn@gmail.com>
Sat, 4 Jan 2025 14:04:08 +0000 (15:04 +0100)
This refactoring is now possible thanks to the changes of !1344, where all WEP_FLAG_SPECIALATTACK checks have been paired with WEP_FLAG_HIDDEN checks

To make sure WEP_FLAG_HIDDEN is always set on special attacks, weapon initialization code triggers a fatal error if WEP_FLAG_SPECIALATTACK is set but WEP_FLAG_HIDDEN is not.

qcsrc/client/hud/panel/scoreboard.qc
qcsrc/client/hud/panel/weapons.qc
qcsrc/common/weapons/all.qh
qcsrc/common/weapons/weapon.qh
qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc
qcsrc/menu/xonotic/keybinder.qc
qcsrc/server/items/items.qc
qcsrc/server/world.qc

index 810473aaff951110a2a62a8ed8fe27c506144698..c5f1a2987f266a2128d52d8bc14e9e1bf37d46c3 100644 (file)
@@ -1760,7 +1760,7 @@ vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size)
                }
                if (weapon_stats < 0 && !((weapons_stat & set) || (weapons_inmap & set)))
                {
-                       if (it.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK))
+                       if (it.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_MUTATORBLOCKED))
                                ++nHidden;
                        else
                                ++disownedcnt;
index 0ce8c34b0500b8e283d30d33b1bc199c670cd4fd..93330a2c18d167837d725aeb3f40dda5a4acab44 100644 (file)
@@ -101,7 +101,7 @@ int weaponorder_cmp(int i, int j, entity pass)
        int nHidden = 0; \
        FOREACH(Weapons, it != WEP_Null, { \
                if (weapons_stat & WepSet_FromWeapon(it)) continue; \
-               if (it.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK)) nHidden += 1; \
+               if (it.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_MUTATORBLOCKED)) nHidden += 1; \
        }); \
        vector table_size = HUD_GetTableSize_BestItemAR((REGISTRY_COUNT(Weapons) - 1) - nHidden, panel_size, aspect); \
        columns = table_size.x; \
@@ -511,7 +511,7 @@ void Weapons_Draw(
                }
                else
                {
-                       if ((it.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK))
+                       if ((it.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_MUTATORBLOCKED))
                        && !(weapons_stat & WepSet_FromWeapon(it)))
                                continue;
                }
index 8ac7a20c8ec9b6e421ade25240fae2fc0e9aa2a1..d19d54415bb028bb5123fed143ef221a234d60d9 100644 (file)
@@ -27,7 +27,15 @@ WepSet ReadWepSet();
 
 REGISTRY(Weapons, 72) // Increase as needed. Can be up to 72.
 REGISTER_REGISTRY(Weapons)
-STATIC_INIT(WeaponPickup) { FOREACH(Weapons, true, it.m_pickup = NEW(WeaponPickup, it)); }
+STATIC_INIT(WeaponPickup)
+{
+       FOREACH(Weapons, true,
+       {
+               if ((it.spawnflags & WEP_FLAG_SPECIALATTACK) && !(it.spawnflags & WEP_FLAG_HIDDEN))
+                       error(sprintf("Special attack \"%s\" without WEP_FLAG_HIDDEN flag set.", it.m_name));
+               it.m_pickup = NEW(WeaponPickup, it);
+       });
+}
 
 #ifdef SVQC
 #include <server/bot/api.qh>
index 19a81029c3a77cced7ac87c95d2097aa12873374..38902ea7ebbb8cf92ae230150e561e09a2c0e831 100644 (file)
@@ -210,7 +210,7 @@ const int WEP_FLAG_NODUAL         =  BIT(12); // weapon doesn't work well with d
 const int WEP_FLAG_PENETRATEWALLS =  BIT(13); // weapon has high calibur bullets that can penetrate thick walls (WEAPONTODO)
 const int WEP_FLAG_BLEED          =  BIT(14); // weapon pierces and causes bleeding (used for damage effects)
 const int WEP_FLAG_NOTRUEAIM      =  BIT(15); // weapon doesn't aim directly at targets
-const int WEP_FLAG_SPECIALATTACK  =  BIT(16); // marked as a special attack (not a true weapon), hidden from most weapon lists
+const int WEP_FLAG_SPECIALATTACK  =  BIT(16); // special attack (not a true weapon); NOTE: if this flag is set then WEP_FLAG_HIDDEN must be set as well
 
 // variables:
 string weaponorder_byid;
index 20f72863e9924ef62124adb03fdfadd958eeb482..44dd568d62df69251b179ae0868a6fda1559ced9 100644 (file)
@@ -164,7 +164,7 @@ void XonoticMutatorsDialog_fill(entity me)
        for(i = WEP_FIRST, j = 0; i <= WEP_LAST; ++i)
        {
                w = REGISTRY_GET(Weapons, i);
-               if (w.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK))
+               if (w.spawnflags & WEP_FLAG_HIDDEN)
                        continue;
                if ((j % 3) == 0)
                {
index 9188263324a0b6a1b27441adf4c636122bcc95e8..93d245fb924c9fdce9c394aed7400c8cf4daf3fe 100644 (file)
@@ -69,9 +69,9 @@ void KeyBinds_BuildList()
        for(int imp = 1; imp <= 9; ++imp)
        {
                string w_list = "";
-               ADD_TO_W_LIST(!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK | WEP_FLAG_SUPERWEAPON)));
+               ADD_TO_W_LIST(!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SUPERWEAPON)));
                ADD_TO_W_LIST((it.spawnflags & WEP_FLAG_SUPERWEAPON) && !(it.spawnflags & WEP_FLAG_HIDDEN));
-               ADD_TO_W_LIST((it.spawnflags & WEP_FLAG_MUTATORBLOCKED) && !(it.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK)));
+               ADD_TO_W_LIST((it.spawnflags & WEP_FLAG_MUTATORBLOCKED) && !(it.spawnflags & WEP_FLAG_HIDDEN));
                if(w_list)
                        KEYBIND_DEF(strcat("weapon_group_", itos(imp)), substring(w_list, 0, -4));
                if(imp == 0)
index 36f8c1e3b39ede6bdf42f6d1ced8c5bb611c3670..2b28ec466f2b5b3f345c5f4c7d548c27262bd3cf 100644 (file)
@@ -1661,7 +1661,8 @@ float GiveItems(entity e, float beginarg, float endarg)
                                got += GiveResourceValue(e, RES_HEALTH, op, val);
                                got += GiveResourceValue(e, RES_ARMOR, op, val);
                        case "allweapons":
-                               FOREACH(Weapons, it != WEP_Null && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK)), got += GiveWeapon(e, it.m_id, op, val));
+                               FOREACH(Weapons, it != WEP_Null && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN)),
+                                       got += GiveWeapon(e, it.m_id, op, val));
                        //case "allbuffs": // all buffs makes a player god, do not want!
                                //FOREACH(StatusEffect, it.instanceOfBuff, got += GiveBuff(e, it, op, val));
                        case "allammo":
index b2319f0318840f24a310fbcc8ee563e7a48eb213..e0bfbe2289e9792b1bf60a328058d4323acb06c9 100644 (file)
@@ -1836,9 +1836,9 @@ int want_weapon(entity weaponinfo, int allguns)
        allow_mutatorblocked = M_ARGV(3, bool);
 
        if(allguns == 1)
-               d = boolean(!(weaponinfo.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK)));
+               d = boolean(!(weaponinfo.spawnflags & WEP_FLAG_HIDDEN));
        else if(allguns == 2)
-               d = boolean((weaponinfo.spawnflags & WEP_FLAG_NORMAL) && !(weaponinfo.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK)));
+               d = boolean((weaponinfo.spawnflags & WEP_FLAG_NORMAL) && !(weaponinfo.spawnflags & WEP_FLAG_HIDDEN));
        else if(!mutator_returnvalue)
                d = !(!weaponinfo.weaponstart);
 
@@ -1877,7 +1877,7 @@ WepSet weapons_all()
 {
        WepSet ret = '0 0 0';
        FOREACH(Weapons, it != WEP_Null, {
-               if (!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK)))
+               if (!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN)))
                        ret |= it.m_wepset;
        });
        return ret;
@@ -1897,7 +1897,7 @@ WepSet weapons_most()
 {
        WepSet ret = '0 0 0';
        FOREACH(Weapons, it != WEP_Null, {
-               if ((it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK)))
+               if ((it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN)))
                        ret |= it.m_wepset;
        });
        return ret;