]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/weapons/all.qc
Merge branch 'master' into Lyberta/URS3
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / weapons / all.qc
index 862697eb8e5ef5455de4628f673c3ad7224c4721..e430ec2e78c252dea99cfc5c8fdfcc1a874bce8a 100644 (file)
@@ -1,58 +1,58 @@
+#include "all.qh"
 #ifndef WEAPONS_ALL_C
 #define WEAPONS_ALL_C
 
-#include "all.qh"
-
 #if defined(CSQC)
-       #include "../../client/defs.qh"
+       #include <client/defs.qh>
        #include "../constants.qh"
        #include "../stats.qh"
-       #include "../../lib/warpzone/anglestransform.qh"
-       #include "../../lib/warpzone/common.qh"
-       #include "../../lib/warpzone/client.qh"
+       #include <lib/warpzone/anglestransform.qh>
+       #include <lib/warpzone/common.qh>
+       #include <lib/warpzone/client.qh>
        #include "../util.qh"
-       #include "../../client/autocvars.qh"
+       #include <client/autocvars.qh>
        #include "../deathtypes/all.qh"
-       #include "../../lib/csqcmodel/interpolate.qh"
-       #include "../movetypes/movetypes.qh"
-       #include "../../client/main.qh"
-       #include "../../lib/csqcmodel/cl_model.qh"
+       #include <lib/csqcmodel/interpolate.qh>
+       #include "../physics/movetypes/movetypes.qh"
+       #include <client/main.qh>
+       #include <lib/csqcmodel/cl_model.qh>
 #elif defined(MENUQC)
 #elif defined(SVQC)
-    #include "../../lib/warpzone/anglestransform.qh"
-    #include "../../lib/warpzone/common.qh"
-    #include "../../lib/warpzone/util_server.qh"
-    #include "../../lib/warpzone/server.qh"
+       #include <common/items/_mod.qh>
+    #include <lib/warpzone/anglestransform.qh>
+    #include <lib/warpzone/common.qh>
+    #include <lib/warpzone/util_server.qh>
+    #include <lib/warpzone/server.qh>
     #include "../constants.qh"
     #include "../stats.qh"
     #include "../teams.qh"
-    #include "../util.qh"
-    #include "../monsters/all.qh"
+    #include <common/util.qh>
+    #include "../monsters/_mod.qh"
     #include "config.qh"
-    #include "../../server/weapons/csqcprojectile.qh"
-    #include "../../server/weapons/tracing.qh"
-    #include "../../server/t_items.qh"
-    #include "../../server/autocvars.qh"
-    #include "../../server/constants.qh"
-    #include "../../server/defs.qh"
-    #include "../notifications.qh"
+    #include <server/weapons/csqcprojectile.qh>
+    #include <server/weapons/tracing.qh>
+    #include "../t_items.qh"
+    #include <server/autocvars.qh>
+    #include <server/constants.qh>
+    #include <server/defs.qh>
+    #include "../notifications/all.qh"
     #include "../deathtypes/all.qh"
-    #include "../../server/mutators/all.qh"
+    #include <server/mutators/_mod.qh>
     #include "../mapinfo.qh"
-    #include "../../server/command/common.qh"
-    #include "../../lib/csqcmodel/sv_model.qh"
-    #include "../../server/portals.qh"
-    #include "../../server/g_hook.qh"
+    #include <server/command/_mod.qh>
+    #include <lib/csqcmodel/sv_model.qh>
+    #include <server/portals.qh>
+    #include <server/g_hook.qh>
 #endif
-#ifndef MENUQC
+#ifdef GAMEQC
        #include "calculations.qc"
 #endif
 #ifdef SVQC
        #include "config.qc"
 #endif
-#define IMPLEMENTATION
-#include "all.inc"
-#undef IMPLEMENTATION
+
+#include "weapon/_mod.inc"
+
 
 // WEAPON PLUGIN SYSTEM
 
@@ -67,11 +67,11 @@ WepSet _WepSet_FromWeapon(int a)
                                if (a >= 24)
                                {
                                        a -= 24;
-                                       return '0 0 1' * power2of(a);
+                                       return '0 0 1' * (2 ** a);
                                }
-                       return '0 1 0' * power2of(a);
+                       return '0 1 0' * (2 ** a);
                }
-       return '1 0 0' * power2of(a);
+       return '1 0 0' * (2 ** a);
 }
 #ifdef SVQC
        void WriteWepSet(float dst, WepSet w)
@@ -134,7 +134,7 @@ string W_NumberWeaponOrder_MapFunc(string s)
 {
        if (s == "0" || stof(s)) return s;
        s = W_UndeprecateName(s);
-       FOREACH(Weapons, it != WEP_Null && it.netname == s, LAMBDA(return ftos(i)));
+       FOREACH(Weapons, it != WEP_Null && it.netname == s, return ftos(i));
        return s;
 }
 string W_NumberWeaponOrder(string order)
@@ -173,7 +173,7 @@ string W_FixWeaponOrder_BuildImpulseList(string o)
        for (i = WEP_FIRST; i <= WEP_LAST; ++i)
                W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST] = i;
        heapsort(WEP_LAST - WEP_FIRST + 1, W_FixWeaponOrder_BuildImpulseList_swap, W_FixWeaponOrder_BuildImpulseList_cmp,
-               world);
+               NULL);
        o = "";
        for (i = WEP_FIRST; i <= WEP_LAST; ++i)
                o = strcat(o, " ", ftos(W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST]));
@@ -181,7 +181,7 @@ string W_FixWeaponOrder_BuildImpulseList(string o)
        return substring(o, 1, -1);
 }
 
-string W_FixWeaponOrder_AllowIncomplete(string order)
+string W_FixWeaponOrder_AllowIncomplete(entity this, string order)
 {
        return W_FixWeaponOrder(order, 0);
 }
@@ -192,88 +192,83 @@ string W_FixWeaponOrder_ForceComplete(string order)
        return W_FixWeaponOrder(order, 1);
 }
 
-void W_RandomWeapons(entity e, float n)
+void W_RandomWeapons(entity e, int n)
 {
-       int i, j;
-       WepSet remaining;
-       WepSet result;
-       remaining = e.weapons;
-       result = '0 0 0';
-       for (i = 0; i < n; ++i)
+       WepSet remaining = e.weapons;
+       WepSet result = '0 0 0';
+       for (int j = 0; j < n; ++j)
        {
                RandomSelection_Init();
-               for (j = WEP_FIRST; j <= WEP_LAST; ++j)
-                       if (remaining & WepSet_FromWeapon(Weapons_from(j))) RandomSelection_Add(NULL, j, string_null, 1, 1);
-               Weapon w = Weapons_from(RandomSelection_chosen_float);
+               FOREACH(Weapons, it != WEP_Null, {
+                       if (remaining & (it.m_wepset))
+                               RandomSelection_AddEnt(it, 1, 1);
+               });
+               Weapon w = RandomSelection_chosen_ent;
                result |= WepSet_FromWeapon(w);
                remaining &= ~WepSet_FromWeapon(w);
        }
        e.weapons = result;
 }
 
-string GetAmmoPicture(.int ammotype)
+string GetAmmoPicture(int ammotype)
 {
        switch (ammotype)
        {
-               case ammo_shells:  return ITEM_Shells.m_icon;
-               case ammo_nails:   return ITEM_Bullets.m_icon;
-               case ammo_rockets: return ITEM_Rockets.m_icon;
-               case ammo_cells:   return ITEM_Cells.m_icon;
-               case ammo_plasma:  return ITEM_Plasma.m_icon;
-               case ammo_fuel:    return ITEM_JetpackFuel.m_icon;
+               case RESOURCE_SHELLS:  return ITEM_Shells.m_icon;
+               case RESOURCE_BULLETS: return ITEM_Bullets.m_icon;
+               case RESOURCE_ROCKETS: return ITEM_Rockets.m_icon;
+               case RESOURCE_CELLS:   return ITEM_Cells.m_icon;
+               case RESOURCE_PLASMA:  return ITEM_Plasma.m_icon;
+               case RESOURCE_FUEL:    return ITEM_JetpackFuel.m_icon;
                default: return "";  // wtf, no ammo type?
        }
 }
 
 #ifdef CSQC
-       .int GetAmmoFieldFromNum(int i)
+int GetAmmoTypeFromNum(int i)
+{
+       switch (i)
        {
-               switch (i)
-               {
-                       case 0: return ammo_shells;
-                       case 1: return ammo_nails;
-                       case 2: return ammo_rockets;
-                       case 3: return ammo_cells;
-                       case 4: return ammo_plasma;
-                       case 5: return ammo_fuel;
-                       default: return ammo_none;
-               }
+               case 0: return RESOURCE_SHELLS;
+               case 1: return RESOURCE_BULLETS;
+               case 2: return RESOURCE_ROCKETS;
+               case 3: return RESOURCE_CELLS;
+               case 4: return RESOURCE_PLASMA;
+               case 5: return RESOURCE_FUEL;
+               default: return RESOURCE_NONE;
        }
+}
 
-       int GetAmmoStat(.int ammotype)
+int GetAmmoStat(int ammotype)
+{
+       switch (ammotype)
        {
-               switch (ammotype)
-               {
-                       case ammo_shells: return STAT_SHELLS;
-                       case ammo_nails: return STAT_NAILS;
-                       case ammo_rockets: return STAT_ROCKETS;
-                       case ammo_cells: return STAT_CELLS;
-                       case ammo_plasma: return STAT_PLASMA.m_id;
-                       case ammo_fuel: return STAT_FUEL.m_id;
-                       default: return -1;
-               }
+               case RESOURCE_SHELLS: return STAT_SHELLS;
+               case RESOURCE_BULLETS: return STAT_NAILS;
+               case RESOURCE_ROCKETS: return STAT_ROCKETS;
+               case RESOURCE_CELLS: return STAT_CELLS;
+               case RESOURCE_PLASMA: return STAT_PLASMA.m_id;
+               case RESOURCE_FUEL: return STAT_FUEL.m_id;
+               default: return -1;
        }
+}
 #endif
 
 string W_Sound(string w_snd)
 {
        string output = strcat("weapons/", w_snd);
-#ifdef SVQC
-               MUTATOR_CALLHOOK(WeaponSound, w_snd, output);
-               return weapon_sound_output;
-#else
-               return output;
-#endif
+       MUTATOR_CALLHOOK(WeaponSound, w_snd, output);
+       return M_ARGV(1, string);
 }
 
 string W_Model(string w_mdl)
 {
        string output = strcat("models/weapons/", w_mdl);
        MUTATOR_CALLHOOK(WeaponModel, w_mdl, output);
-       return weapon_model_output;
+       return M_ARGV(1, string);
 }
 
-#ifndef MENUQC
+#ifdef GAMEQC
 vector shotorg_adjustfromclient(vector vecs, float y_is_right, float algn)
 {
        switch (algn)
@@ -385,12 +380,14 @@ vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn
  *   call again with ""
  *   remove the ent
  */
-void CL_WeaponEntity_SetModel(entity this, string name)
+void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
 {
        if (name == "")
        {
-               this.model = "";
-               if (this.weaponchild) remove(this.weaponchild);
+               vector oldmin = this.mins, oldmax = this.maxs;
+               setmodel(this, MDL_Null);
+               setsize(this, oldmin, oldmax);
+               if (this.weaponchild) delete(this.weaponchild);
                this.weaponchild = NULL;
                this.movedir = '0 0 0';
                this.spawnorigin = '0 0 0';
@@ -423,21 +420,22 @@ void CL_WeaponEntity_SetModel(entity this, string name)
                        if (!this.weaponchild)
                        {
                                this.weaponchild = new(weaponchild);
-                               make_pure(this.weaponchild);
 #ifdef CSQC
                                this.weaponchild.drawmask = MASK_NORMAL;
                                this.weaponchild.renderflags |= RF_VIEWMODEL;
 #endif
                        }
                        _setmodel(this.weaponchild, W_Model(strcat("v_", name, ".md3")));
+                       setsize(this.weaponchild, '0 0 0', '0 0 0');
                        setattachment(this.weaponchild, this, t);
                }
                else
                {
-                       if (this.weaponchild) remove(this.weaponchild);
+                       if (this.weaponchild) delete(this.weaponchild);
                        this.weaponchild = NULL;
                }
 
+               setsize(this, '0 0 0', '0 0 0');
                setorigin(this, '0 0 0');
                this.angles = '0 0 0';
                this.frame = 0;
@@ -459,7 +457,7 @@ void CL_WeaponEntity_SetModel(entity this, string name)
                        }
                        else
                        {
-                               LOG_WARNINGF("weapon model %s does not support the 'shot' tag, will display shots TOTALLY wrong\n",
+                               LOG_WARNF("weapon model %s does not support the 'shot' tag, will display shots TOTALLY wrong",
                                        this.model);
                                this.movedir = '0 0 0';
                        }
@@ -478,7 +476,7 @@ void CL_WeaponEntity_SetModel(entity this, string name)
                        }
                        else
                        {
-                               LOG_WARNINGF("weapon model %s does not support the 'shell' tag, will display casings wrong\n",
+                               LOG_WARNF("weapon model %s does not support the 'shell' tag, will display casings wrong",
                                        this.model);
                                this.spawnorigin = this.movedir;
                        }
@@ -500,7 +498,7 @@ void CL_WeaponEntity_SetModel(entity this, string name)
                        }
                        else
                        {
-                               LOG_WARNINGF(
+                               LOG_WARNF(
                                        "weapon model %s does not support the 'handle' tag "
                                        "and neither does the v_ model support the 'shot' tag, "
                                        "will display muzzle flashes TOTALLY wrong\n",
@@ -520,7 +518,11 @@ void CL_WeaponEntity_SetModel(entity this, string name)
 
        if (this.movedir.x >= 0)
        {
-               int algn = STAT(GUNALIGN, this.owner);
+               //int algn = STAT(GUNALIGN, this.owner);
+               int algn = W_GunAlign(this, STAT(GUNALIGN, this.owner));
+       #ifdef SVQC
+               this.m_gunalign = algn;
+       #endif
                vector v = this.movedir;
                this.movedir = shotorg_adjust(v, false, false, algn);
                this.view_ofs = shotorg_adjust(v, false, true, algn) - v;
@@ -528,7 +530,9 @@ void CL_WeaponEntity_SetModel(entity this, string name)
        int compressed_shotorg = compressShotOrigin(this.movedir);
        // make them match perfectly
 #ifdef SVQC
-       this.movedir = decompressShotOrigin(this.owner.stat_shotorg = compressed_shotorg);
+    // null during init
+    if (this.owner) this.owner.stat_shotorg = compressed_shotorg;
+       this.movedir = decompressShotOrigin(compressed_shotorg);
 #else
        this.movedir = decompressShotOrigin(compressed_shotorg);
 #endif
@@ -537,13 +541,14 @@ void CL_WeaponEntity_SetModel(entity this, string name)
 
        // check if an instant weapon switch occurred
        setorigin(this, this.view_ofs);
+       if (!_anim) return;
        // reset animstate now
        this.wframe = WFRAME_IDLE;
        setanim(this, this.anim_idle, true, false, true);
 }
 #endif
 
-#ifndef MENUQC
+#ifdef GAMEQC
 
 REGISTER_NET_TEMP(wframe)
 #ifdef CSQC
@@ -553,21 +558,25 @@ NET_HANDLE(wframe, bool isNew)
        a.x = ReadCoord();
     a.y = ReadCoord();
     a.z = ReadCoord();
+    int slot = ReadByte();
        bool restartanim = ReadByte();
-       anim_set(viewmodel, a, !restartanim, restartanim, restartanim);
-       viewmodel.state = ReadByte();
-       viewmodel.weapon_nextthink = ReadFloat();
-       viewmodel.alpha = ReadByte() / 255;
-       switch (viewmodel.state)
+       entity wepent = viewmodels[slot];
+       if(a.x == wepent.anim_idle_x) // we don't need to enforce idle animation
+               wepent.animstate_looping = false;
+       else
+               anim_set(wepent, a, !restartanim, restartanim, restartanim);
+       wepent.state = ReadByte();
+       wepent.weapon_nextthink = ReadFloat();
+       switch (wepent.state)
        {
                case WS_RAISE:
-                       viewmodel.weapon_switchdelay = activeweapon.switchdelay_raise;
+                       wepent.weapon_switchdelay = wepent.activeweapon.switchdelay_raise;
                        break;
                case WS_DROP:
-                       viewmodel.weapon_switchdelay = activeweapon.switchdelay_drop;
+                       wepent.weapon_switchdelay = wepent.activeweapon.switchdelay_drop;
                        break;
         default:
-            viewmodel.weapon_switchdelay = 0;
+            wepent.weapon_switchdelay = 0;
             break;
        }
        return true;
@@ -584,10 +593,10 @@ void wframe_send(entity actor, entity weaponentity, vector a, bool restartanim)
        WriteCoord(channel, a.x);
        WriteCoord(channel, a.y);
        WriteCoord(channel, a.z);
+       WriteByte(channel, weaponslot(weaponentity.weaponentity_fld));
        WriteByte(channel, restartanim);
        WriteByte(channel, weaponentity.state);
        WriteFloat(channel, weaponentity.weapon_nextthink);
-       WriteByte(channel, weaponentity.m_alpha * 255);
 }
 #endif
 
@@ -632,12 +641,12 @@ CLIENT_COMMAND(weapon_find, "Show spawn locations of a weapon")
                }
                default:
                {
-                       LOG_INFOF("Incorrect parameters for ^2%s^7\n", "weapon_find");
+                       LOG_INFOF("Incorrect parameters for ^2%s^7", "weapon_find");
                }
                case CMD_REQUEST_USAGE:
                {
-                       LOG_INFO("\nUsage:^3 cl_cmd weapon_find weapon\n");
-                       LOG_INFO("  Where 'weapon' is the lowercase weapon name, 'all' or 'unowned'.\n");
+                       LOG_INFO("Usage:^3 cl_cmd weapon_find weapon");
+                       LOG_INFO("  Where 'weapon' is the lowercase weapon name, 'all' or 'unowned'.");
                        return;
                }
        }