]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/weapons/throwing.qc
Merge branch 'terencehill/assault_fix' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / weapons / throwing.qc
index 4b7d45b964157127f682e1de6048aa1bc3c358cd..ae745efd6fdaa90f6ed39b9d8b59e4736a3c26fa 100644 (file)
@@ -1,6 +1,8 @@
 #include "throwing.qh"
 
 #include "weaponsystem.qh"
+#include "../resources.qh"
+#include "../items.qh"
 #include "../mutators/_mod.qh"
 #include <common/t_items.qh>
 #include "../g_damage.qh"
@@ -37,10 +39,10 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
        float thisammo;
        string s;
        Weapon info = Weapons_from(wpn);
-       var .int ammotype = info.ammo_field;
-
-       entity wep = new(droppedweapon);
+       int ammotype = info.ammo_type;
 
+       entity wep = spawn();
+       Item_SetLoot(wep, true);
        setorigin(wep, org);
        wep.velocity = velo;
        wep.owner = wep.enemy = own;
@@ -53,6 +55,7 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
 
        if(WepSet_FromWeapon(Weapons_from(wpn)) & WEPSET_SUPERWEAPONS)
        {
+               Item_SetExpiring(wep, true);
                if(own.items & IT_UNLIMITED_SUPERWEAPONS)
                {
                        wep.superweapons_finished = time + autocvar_g_balance_superweapons_time;
@@ -88,7 +91,7 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
        wep.pickup_anyway = true; // these are ALWAYS pickable
 
        //wa = W_AmmoItemCode(wpn);
-       if(ammotype == ammo_none)
+       if(ammotype == RESOURCE_NONE)
        {
                return "";
        }
@@ -102,11 +105,10 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
                        int i = own.(weaponentity).m_weapon.m_id;
                        if(own.(weaponentity).(weapon_load[i]) > 0)
                        {
-                               own.(ammotype) += own.(weaponentity).(weapon_load[i]);
+                               GiveResource(own, ammotype, own.(weaponentity).(weapon_load[i]));
                                own.(weaponentity).(weapon_load[i]) = -1; // schedule the weapon for reloading
                        }
-
-                       wep.(ammotype) = 0;
+                       SetResourceAmount(wep, ammotype, 0);
                }
                else if(doreduce)
                {
@@ -114,22 +116,23 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
                        int i = own.(weaponentity).m_weapon.m_id;
                        if(own.(weaponentity).(weapon_load[i]) > 0)
                        {
-                               own.(ammotype) += own.(weaponentity).(weapon_load[i]);
+                               GiveResource(own, ammotype, own.(weaponentity).(weapon_load[i]));
                                own.(weaponentity).(weapon_load[i]) = -1; // schedule the weapon for reloading
                        }
 
-                       thisammo = min(own.(ammotype), wep.(ammotype));
-                       wep.(ammotype) = thisammo;
-                       own.(ammotype) -= thisammo;
+                       float ownderammo = GetResourceAmount(own, ammotype);
+                       thisammo = min(ownderammo, GetResourceAmount(wep, ammotype));
+                       SetResourceAmount(wep, ammotype, thisammo);
+                       SetResourceAmount(own, ammotype, ownderammo - thisammo);
 
-                       switch(ammotype)
+                       switch (ammotype)
                        {
-                               case ammo_shells:  s = sprintf("%s and %d shells", s, thisammo);  break;
-                               case ammo_nails:   s = sprintf("%s and %d nails", s, thisammo);   break;
-                               case ammo_rockets: s = sprintf("%s and %d rockets", s, thisammo); break;
-                               case ammo_cells:   s = sprintf("%s and %d cells", s, thisammo);   break;
-                               case ammo_plasma:  s = sprintf("%s and %d plasma", s, thisammo);  break;
-                               case ammo_fuel:    s = sprintf("%s and %d fuel", s, thisammo);    break;
+                               case RESOURCE_SHELLS:  s = sprintf("%s and %d shells", s, thisammo);  break;
+                               case RESOURCE_BULLETS: s = sprintf("%s and %d nails", s, thisammo);   break;
+                               case RESOURCE_ROCKETS: s = sprintf("%s and %d rockets", s, thisammo); break;
+                               case RESOURCE_CELLS:   s = sprintf("%s and %d cells", s, thisammo);   break;
+                               case RESOURCE_PLASMA:  s = sprintf("%s and %d plasma", s, thisammo);  break;
+                               case RESOURCE_FUEL:    s = sprintf("%s and %d fuel", s, thisammo);    break;
                        }
 
                        s = substring(s, 5, -1);
@@ -155,7 +158,7 @@ bool W_IsWeaponThrowable(entity this, int w)
                // start weapons that take no ammo can't be dropped (this prevents dropping the laser, as long as it continues to use no ammo)
                if(start_items & IT_UNLIMITED_WEAPON_AMMO)
                        return false;
-               if((Weapons_from(w)).ammo_field == ammo_none)
+               if((Weapons_from(w)).ammo_type == RESOURCE_NONE)
                        return false;
        }
        return true;