]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/miscfunctions.qc
Fix weaponarena available including hidden weapons, also fix available weapons not...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / miscfunctions.qc
index 9c1596f5d033551167bb5f130a7989e43fb51a16..273b854ce966e96807a01414fc2596fcbf0a90ce 100644 (file)
@@ -499,7 +499,7 @@ float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still ne
        allow_mutatorblocked = M_ARGV(3, bool);
 
        if(allguns)
-               d = boolean(weaponinfo.spawnflags & WEP_FLAG_NORMAL);
+               d = boolean((weaponinfo.spawnflags & WEP_FLAG_NORMAL) && !(weaponinfo.spawnflags & WEP_FLAG_HIDDEN));
        else if(!mutator_returnvalue)
                d = !(!weaponinfo.weaponstart);
 
@@ -522,6 +522,19 @@ float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still ne
        return t;
 }
 
+void weaponarena_available_update(entity this)
+{
+       FOREACH(Weapons, it != WEP_Null, {
+               // if no weapons are available, just fall back to normal weapons (most weapons arena)
+               bool wep_available = ((weaponsInMapAll) ? !!(weaponsInMapAll & WepSet_FromWeapon(it)) : (it.spawnflags & WEP_FLAG_NORMAL));
+               if(wep_available && !(it.spawnflags & WEP_FLAG_MUTATORBLOCKED) && !(it.spawnflags & WEP_FLAG_HIDDEN))
+                       g_weaponarena_weapons |= WepSet_FromWeapon(it);
+       });
+       start_weapons = g_weaponarena_weapons;
+       if(warmup_stage)
+               warmup_start_weapons = start_weapons;
+}
+
 void readplayerstartcvars()
 {
        float i, t;
@@ -583,11 +596,22 @@ void readplayerstartcvars()
                g_weaponarena = 1;
                g_weaponarena_list = "Most Weapons";
                FOREACH(Weapons, it != WEP_Null, {
-                       if(!(it.spawnflags & WEP_FLAG_MUTATORBLOCKED))
-                               if(it.spawnflags & WEP_FLAG_NORMAL)
-                                       g_weaponarena_weapons |= (it.m_wepset);
+                       if(!(it.spawnflags & WEP_FLAG_MUTATORBLOCKED) && (it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & WEP_FLAG_HIDDEN))
+                               g_weaponarena_weapons |= (it.m_wepset);
                });
        }
+       else if (s == "available")
+       {
+               g_weaponarena = 2;
+               g_weaponarena_list = "Most Weapons";
+               // include weapons the player would start with
+               FOREACH(Weapons, it != WEP_Null, {
+                       int w = want_weapon(it, false);
+                       if(w & 1)
+                               g_weaponarena_weapons |= (it.m_wepset);
+               });
+               InitializeEntity(NULL, weaponarena_available_update, INITPRIO_FINDTARGET);
+       }
        else if (s == "none")
        {
                g_weaponarena = 1;
@@ -719,14 +743,6 @@ void readplayerstartcvars()
                warmup_start_ammo_fuel = max(warmup_start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
        }
 
-       WepSet precache_weapons = start_weapons;
-       if (g_warmup_allguns != 1)
-               precache_weapons |= warmup_start_weapons;
-       FOREACH(Weapons, it != WEP_Null, {
-               if(precache_weapons & (it.m_wepset))
-                       it.wr_init(it);
-       });
-
        start_ammo_shells = max(0, start_ammo_shells);
        start_ammo_nails = max(0, start_ammo_nails);
        start_ammo_rockets = max(0, start_ammo_rockets);