]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/weapons/throwing.qc
Merge branch 'master' into Mario/wepent_experimental
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / weapons / throwing.qc
index bd69e33246d6b3dae4593e008493f0b2582d1f63..4114c3c58b199cc9a950c811dcf5269b0fdea807 100644 (file)
@@ -11,6 +11,7 @@
 #include <common/util.qh>
 #include <common/weapons/_all.qh>
 #include <common/state.qh>
+#include <common/wepent.qh>
 
 void thrown_wep_think(entity this)
 {
@@ -31,7 +32,7 @@ void thrown_wep_think(entity this)
 }
 
 // returns amount of ammo used as string, or -1 for failure, or 0 for no ammo count
-string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector velo)
+string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector velo, .entity weaponentity)
 {
        float thisammo;
        string s;
@@ -45,9 +46,9 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
        wep.owner = wep.enemy = own;
        wep.flags |= FL_TOSSED;
        wep.colormap = own.colormap;
-       wep.glowmod = weaponentity_glowmod(info, own, own.clientcolors);
+       wep.glowmod = weaponentity_glowmod(info, own, own.clientcolors, own.(weaponentity));
 
-       W_DropEvent(wr_drop,own,wpn,wep);
+       W_DropEvent(wr_drop,own,wpn,wep,weaponentity);
 
        if(WepSet_FromWeapon(Weapons_from(wpn)) & WEPSET_SUPERWEAPONS)
        {
@@ -97,11 +98,11 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
                if(doreduce && g_weapon_stay == 2)
                {
                        // if our weapon is loaded, give its load back to the player
-                       int i = PS(own).m_weapon.m_id;
-                       if(own.(weapon_load[i]) > 0)
+                       int i = own.(weaponentity).m_weapon.m_id;
+                       if(own.(weaponentity).(weapon_load[i]) > 0)
                        {
-                               own.(ammotype) += own.(weapon_load[i]);
-                               own.(weapon_load[i]) = -1; // schedule the weapon for reloading
+                               own.(ammotype) += own.(weaponentity).(weapon_load[i]);
+                               own.(weaponentity).(weapon_load[i]) = -1; // schedule the weapon for reloading
                        }
 
                        wep.(ammotype) = 0;
@@ -109,11 +110,11 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
                else if(doreduce)
                {
                        // if our weapon is loaded, give its load back to the player
-                       int i = PS(own).m_weapon.m_id;
-                       if(own.(weapon_load[i]) > 0)
+                       int i = own.(weaponentity).m_weapon.m_id;
+                       if(own.(weaponentity).(weapon_load[i]) > 0)
                        {
-                               own.(ammotype) += own.(weapon_load[i]);
-                               own.(weapon_load[i]) = -1; // schedule the weapon for reloading
+                               own.(ammotype) += own.(weaponentity).(weapon_load[i]);
+                               own.(weaponentity).(weapon_load[i]) = -1; // schedule the weapon for reloading
                        }
 
                        thisammo = min(own.(ammotype), wep.(ammotype));
@@ -138,7 +139,7 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
 
 bool W_IsWeaponThrowable(entity this, int w)
 {
-       if (MUTATOR_CALLHOOK(ForbidDropCurrentWeapon, this))
+       if (MUTATOR_CALLHOOK(ForbidDropCurrentWeapon, this, w))
                return false;
        if (!autocvar_g_pickup_items)
                return false;
@@ -167,10 +168,10 @@ bool W_IsWeaponThrowable(entity this, int w)
 // toss current weapon
 void W_ThrowWeapon(entity this, .entity weaponentity, vector velo, vector delta, float doreduce)
 {
-       Weapon w = PS(this).m_weapon;
+       Weapon w = this.(weaponentity).m_weapon;
        if (w == WEP_Null)
                return; // just in case
-       if(MUTATOR_CALLHOOK(ForbidThrowCurrentWeapon, this))
+       if(MUTATOR_CALLHOOK(ForbidThrowCurrentWeapon, this, this.(weaponentity)))
                return;
        if(!autocvar_g_weapon_throwable)
                return;
@@ -183,16 +184,18 @@ void W_ThrowWeapon(entity this, .entity weaponentity, vector velo, vector delta,
        if(!(this.weapons & set)) return;
        this.weapons &= ~set;
 
-       W_SwitchWeapon_Force(this, w_getbestweapon(this));
-       string a = W_ThrowNewWeapon(this, w.m_id, doreduce, this.origin + delta, velo);
+       W_SwitchWeapon_Force(this, w_getbestweapon(this, weaponentity), weaponentity);
+       string a = W_ThrowNewWeapon(this, w.m_id, doreduce, this.origin + delta, velo, weaponentity);
 
        if(!a) return;
        Send_Notification(NOTIF_ONE, this, MSG_MULTI, ITEM_WEAPON_DROP, a, w.m_id);
 }
 
-void SpawnThrownWeapon(entity this, vector org, float w)
+void SpawnThrownWeapon(entity this, vector org, float w, .entity weaponentity)
 {
-       if(this.weapons & WepSet_FromWeapon(PS(this).m_weapon))
-               if(W_IsWeaponThrowable(this, PS(this).m_weapon.m_id))
-                       W_ThrowNewWeapon(this, PS(this).m_weapon.m_id, false, org, randomvec() * 125 + '0 0 200');
+       entity wep = this.(weaponentity).m_weapon;
+
+       if(this.weapons & WepSet_FromWeapon(wep))
+               if(W_IsWeaponThrowable(this, wep.m_id))
+                       W_ThrowNewWeapon(this, wep.m_id, false, org, randomvec() * 125 + '0 0 200', weaponentity);
 }