]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/weapons/selection.qc
Merge branch 'master' into Mario/weapons_new
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / weapons / selection.qc
index 482b3180a0078222670860bf9fcb2eec018b509a..12ffbb9b49bd17d2f5f664bd824dc99f97352767 100644 (file)
@@ -78,14 +78,14 @@ float client_hasweapon(entity cl, float wpn, float andammo, float complain)
 
                                for(e = world; (e = findfloat(e, weapon, wpn)); )
                                {
-                                       if(e.classname == "droppedweapon")
+                                       if(e.classname == "droppedweapon" && autocvar_g_showweaponspawns < 2)
                                                continue;
                                        if(!(e.flags & FL_ITEM))
                                                continue;
                                        WaypointSprite_Spawn(
                                                (get_weaponinfo(wpn)).wpmodel,
                                                1, 0,
-                                               world, e.origin,
+                                               world, e.origin + ('0 0 1' * e.maxs_z) * 1.2,
                                                self, 0,
                                                world, enemy,
                                                0,
@@ -110,6 +110,7 @@ float W_GetCycleWeapon(entity pl, string weaponorder, float dir, float imp, floa
        // function. Thus we must use car/cdr.
        float weaponwant, first_valid, prev_valid, switchtonext, switchtolast, c;
        string rest;
+       WepSet wepset = '0 0 0';
        switchtonext = switchtolast = 0;
        first_valid = prev_valid = 0;
        float weaponcur;
@@ -130,15 +131,25 @@ float W_GetCycleWeapon(entity pl, string weaponorder, float dir, float imp, floa
        {
                weaponwant = stof(car(rest)); rest = cdr(rest);
                wep = get_weaponinfo(weaponwant);
+               wepset = WepSet_FromWeapon(weaponwant);
                if(imp >= 0)
-                       if(wep.impulse != imp)
-                               continue;
+               if(wep.impulse != imp)
+                       continue;
+
+               float i, have_other = FALSE;
+               for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+               {
+                       if(i != weaponwant)
+                       if((get_weaponinfo(i)).impulse == imp || imp < 0)
+                       if((pl.weapons & WepSet_FromWeapon(i)) || (weaponsInMap & WepSet_FromWeapon(i)))
+                               have_other = TRUE;
+               }
 
                // skip weapons we don't own that aren't normal and aren't in the map
-               if(!(pl.weapons & WepSet_FromWeapon(weaponwant)))
-                       if(!((get_weaponinfo(weaponwant)).spawnflags & WEP_FLAG_NORMAL))
-                               if(!(weaponsInMap & WepSet_FromWeapon(weaponwant)))
-                                       continue;
+               if(!(pl.weapons & wepset))
+               if(!(weaponsInMap & wepset))
+               if((wep.spawnflags & WEP_FLAG_MUTATORBLOCKED) || have_other)
+                       continue;
 
                ++c;
 
@@ -177,15 +188,25 @@ float W_GetCycleWeapon(entity pl, string weaponorder, float dir, float imp, floa
                {
                        weaponwant = stof(car(rest)); rest = cdr(rest);
                        wep = get_weaponinfo(weaponwant);
+                       wepset = WepSet_FromWeapon(weaponwant);
                        if(imp >= 0)
                                if(wep.impulse != imp)
                                        continue;
 
+                       float i, have_other = FALSE;
+                       for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+                       {
+                               if(i != weaponwant)
+                               if((get_weaponinfo(i)).impulse == imp || imp < 0)
+                               if((pl.weapons & WepSet_FromWeapon(i)) || (weaponsInMap & WepSet_FromWeapon(i)))
+                                       have_other = TRUE;
+                       }
+
                        // skip weapons we don't own that aren't normal and aren't in the map
-                       if(!(pl.weapons & WepSet_FromWeapon(weaponwant)))
-                               if(!((get_weaponinfo(weaponwant)).spawnflags & WEP_FLAG_NORMAL))
-                                       if(!(weaponsInMap & WepSet_FromWeapon(weaponwant)))
-                                               continue;
+                       if(!(pl.weapons & wepset))
+                       if(!(weaponsInMap & wepset))
+                       if((wep.spawnflags & WEP_FLAG_MUTATORBLOCKED) || have_other)
+                               continue;
 
                        --c;
                        if(c == 0)
@@ -232,7 +253,7 @@ void W_SwitchWeapon(float imp)
                else
                        self.selectweapon = imp; // update selectweapon ANYWAY
        }
-       else { WEP_ACTION(self.weapon, WR_RELOAD); }
+       else if(!forbidWeaponUse()) { WEP_ACTION(self.weapon, WR_RELOAD); }
 }
 
 void W_CycleWeapon(string weaponorder, float dir)