]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/weapons/weaponsystem.qc
Merge branch 'terencehill/obsolete_cvars_removal' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / weapons / weaponsystem.qc
index dbe97dbe38560fb6064346175d50cbeb2ad320b5..076a172c8da323eb8e46e16bfddfbdddbfc87443 100644 (file)
 
 float W_WeaponRateFactor()
 {
-       float t;
-       t = 1.0 / g_weaponratefactor;
+       float t = 1.0 / g_weaponratefactor;
 
-       weapon_rate = t;
-       MUTATOR_CALLHOOK(WeaponRateFactor);
+       MUTATOR_CALLHOOK(WeaponRateFactor, t);
        t = weapon_rate;
 
        return t;
 }
 
+float W_WeaponSpeedFactor()
+{
+       float t = 1.0 * g_weaponspeedfactor;
+
+       MUTATOR_CALLHOOK(WeaponSpeedFactor, t);
+       t = ret_float;
+
+       return t;
+}
+
 
 void(float fr, float t, void() func) weapon_thinkf;
 
 float CL_Weaponentity_CustomizeEntityForClient()
-{
+{SELFPARAM();
        self.viewmodelforclient = self.owner;
        if(IS_SPEC(other))
                if(other.enemy == self.owner)
@@ -102,19 +110,19 @@ float CL_Weaponentity_CustomizeEntityForClient()
 //   call again with ""
 //   remove the ent
 void CL_WeaponEntity_SetModel(string name)
-{
+{SELFPARAM();
        float v_shot_idx;
        if (name != "")
        {
                // if there is a child entity, hide it until we're sure we use it
                if (self.weaponentity)
                        self.weaponentity.model = "";
-               setmodel(self, strcat("models/weapons/v_", name, ".md3")); // precision set below
+               _setmodel(self, W_Model(strcat("v_", name, ".md3")));
                v_shot_idx = gettagindex(self, "shot"); // used later
                if(!v_shot_idx)
                        v_shot_idx = gettagindex(self, "tag_shot");
 
-               setmodel(self, strcat("models/weapons/h_", name, ".iqm")); // precision set below
+               _setmodel(self, W_Model(strcat("h_", name, ".iqm")));
                // preset some defaults that work great for renamed zym files (which don't need an animinfo)
                self.anim_fire1  = animfixfps(self, '0 1 0.01', '0 0 0');
                self.anim_fire2  = animfixfps(self, '1 1 0.01', '0 0 0');
@@ -127,14 +135,14 @@ void CL_WeaponEntity_SetModel(string name)
                {
                        if (!self.weaponentity)
                                self.weaponentity = spawn();
-                       setmodel(self.weaponentity, strcat("models/weapons/v_", name, ".md3")); // precision does not matter
+                       _setmodel(self.weaponentity, W_Model(strcat("v_", name, ".md3")));
                        setattachment(self.weaponentity, self, "weapon");
                }
                else if(gettagindex(self, "tag_weapon"))
                {
                        if (!self.weaponentity)
                                self.weaponentity = spawn();
-                       setmodel(self.weaponentity, strcat("models/weapons/v_", name, ".md3")); // precision does not matter
+                       _setmodel(self.weaponentity, W_Model(strcat("v_", name, ".md3")));
                        setattachment(self.weaponentity, self, "tag_weapon");
                }
                else
@@ -164,7 +172,7 @@ void CL_WeaponEntity_SetModel(string name)
                                self.movedir = gettaginfo(self, idx);
                        else
                        {
-                               print("WARNING: weapon model ", self.model, " does not support the 'shot' tag, will display shots TOTALLY wrong\n");
+                               LOG_INFO("WARNING: weapon model ", self.model, " does not support the 'shot' tag, will display shots TOTALLY wrong\n");
                                self.movedir = '0 0 0';
                        }
                }
@@ -188,7 +196,7 @@ void CL_WeaponEntity_SetModel(string name)
                                self.spawnorigin = gettaginfo(self, idx);
                        else
                        {
-                               print("WARNING: weapon model ", self.model, " does not support the 'shell' tag, will display casings wrong\n");
+                               LOG_INFO("WARNING: weapon model ", self.model, " does not support the 'shell' tag, will display casings wrong\n");
                                self.spawnorigin = self.movedir;
                        }
                }
@@ -217,7 +225,7 @@ void CL_WeaponEntity_SetModel(string name)
                        }
                        else
                        {
-                               print("WARNING: weapon model ", self.model, " does not support the 'handle' tag and neither does the v_ model support the 'shot' tag, will display muzzle flashes TOTALLY wrong\n");
+                               LOG_INFO("WARNING: weapon model ", self.model, " does not support the 'handle' tag and neither does the v_ model support the 'shot' tag, will display muzzle flashes TOTALLY wrong\n");
                                self.oldorigin = '0 0 0'; // there is no way to recover from this
                        }
                }
@@ -261,22 +269,19 @@ void CL_WeaponEntity_SetModel(string name)
 }
 
 vector CL_Weapon_GetShotOrg(float wpn)
-{
-       entity wi, oldself;
-       vector ret;
-       wi = get_weaponinfo(wpn);
-       oldself = self;
-       self = spawn();
+{SELFPARAM();
+       entity wi = get_weaponinfo(wpn);
+       setself(spawn());
        CL_WeaponEntity_SetModel(wi.mdl);
-       ret = self.movedir;
+       vector ret = self.movedir;
        CL_WeaponEntity_SetModel("");
        remove(self);
-       self = oldself;
+       setself(this);
        return ret;
 }
 
 void CL_Weaponentity_Think()
-{
+{SELFPARAM();
        int tb;
        self.nextthink = time;
        if (intermission_running)
@@ -352,7 +357,7 @@ void CL_Weaponentity_Think()
 }
 
 void CL_ExteriorWeaponentity_Think()
-{
+{SELFPARAM();
        float tag_found;
        self.nextthink = time;
        if (self.owner.exteriorweaponentity != self)
@@ -371,7 +376,7 @@ void CL_ExteriorWeaponentity_Think()
                self.dmg = self.owner.modelindex;
                self.deadflag = self.owner.deadflag;
                if (self.owner.weaponname != "")
-                       setmodel(self, strcat("models/weapons/v_", self.owner.weaponname, ".md3")); // precision set below
+                       _setmodel(self, W_Model(strcat("v_", self.owner.weaponname, ".md3")));
                else
                        self.model = "";
 
@@ -396,46 +401,41 @@ void CL_ExteriorWeaponentity_Think()
        self.glowmod = self.owner.weaponentity_glowmod;
        self.colormap = self.owner.colormap;
 
-       CSQCMODEL_AUTOUPDATE();
+       CSQCMODEL_AUTOUPDATE(self);
 }
 
 // spawning weaponentity for client
-void CL_SpawnWeaponentity()
+void CL_SpawnWeaponentity(entity e)
 {
-       self.weaponentity = spawn();
-       self.weaponentity.classname = "weaponentity";
-       self.weaponentity.solid = SOLID_NOT;
-       self.weaponentity.owner = self;
-       setmodel(self.weaponentity, ""); // precision set when changed
-       setorigin(self.weaponentity, '0 0 0');
-       self.weaponentity.angles = '0 0 0';
-       self.weaponentity.viewmodelforclient = self;
-       self.weaponentity.flags = 0;
-       self.weaponentity.think = CL_Weaponentity_Think;
-       self.weaponentity.customizeentityforclient = CL_Weaponentity_CustomizeEntityForClient;
-       self.weaponentity.nextthink = time;
-
-       self.exteriorweaponentity = spawn();
-       self.exteriorweaponentity.classname = "exteriorweaponentity";
-       self.exteriorweaponentity.solid = SOLID_NOT;
-       self.exteriorweaponentity.exteriorweaponentity = self.exteriorweaponentity;
-       self.exteriorweaponentity.owner = self;
-       setorigin(self.exteriorweaponentity, '0 0 0');
-       self.exteriorweaponentity.angles = '0 0 0';
-       self.exteriorweaponentity.think = CL_ExteriorWeaponentity_Think;
-       self.exteriorweaponentity.nextthink = time;
-
-       {
-               entity oldself = self;
-               self = self.exteriorweaponentity;
-               CSQCMODEL_AUTOINIT();
-               self = oldself;
-       }
+       entity view = e.weaponentity = spawn();
+       view.classname = "weaponentity";
+       view.solid = SOLID_NOT;
+       view.owner = e;
+       setmodel(view, MDL_Null); // precision set when changed
+       setorigin(view, '0 0 0');
+       view.angles = '0 0 0';
+       view.viewmodelforclient = e;
+       view.flags = 0;
+       view.think = CL_Weaponentity_Think;
+       view.customizeentityforclient = CL_Weaponentity_CustomizeEntityForClient;
+       view.nextthink = time;
+
+       entity exterior = e.exteriorweaponentity = spawn();
+       exterior.classname = "exteriorweaponentity";
+       exterior.solid = SOLID_NOT;
+       exterior.exteriorweaponentity = exterior;
+       exterior.owner = e;
+       setorigin(exterior, '0 0 0');
+       exterior.angles = '0 0 0';
+       exterior.think = CL_ExteriorWeaponentity_Think;
+       exterior.nextthink = time;
+
+       CSQCMODEL_AUTOINIT(exterior);
 }
 
 // Weapon subs
 void w_clear()
-{
+{SELFPARAM();
        if (self.weapon != -1)
        {
                self.weapon = 0;
@@ -449,7 +449,7 @@ void w_clear()
 }
 
 void w_ready()
-{
+{SELFPARAM();
        if (self.weaponentity)
                self.weaponentity.state = WS_READY;
        weapon_thinkf(WFRAME_IDLE, 1000000, w_ready);
@@ -458,23 +458,23 @@ void w_ready()
 .float prevdryfire;
 .float prevwarntime;
 float weapon_prepareattack_checkammo(float secondary)
-{
+{SELFPARAM();
        if (!(self.items & IT_UNLIMITED_WEAPON_AMMO))
        if (!WEP_ACTION(self.weapon, WR_CHECKAMMO1 + secondary))
        {
                // always keep the Mine Layer if we placed mines, so that we can detonate them
                entity mine;
-               if(self.weapon == WEP_MINE_LAYER)
+               if(self.weapon == WEP_MINE_LAYER.m_id)
                for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
                        return false;
 
-               if(self.weapon == WEP_SHOTGUN)
+               if(self.weapon == WEP_SHOTGUN.m_id)
                if(!secondary && WEP_CVAR(shotgun, secondary) == 1)
                        return false; // no clicking, just allow
 
                if(self.weapon == self.switchweapon && time - self.prevdryfire > 1) // only play once BEFORE starting to switch weapons
                {
-                       sound (self, CH_WEAPON_A, "weapons/dryfire.wav", VOL_BASE, ATTEN_NORM);
+                       sound (self, CH_WEAPON_A, W_Sound("dryfire"), VOL_BASE, ATTEN_NORM);
                        self.prevdryfire = time;
                }
 
@@ -505,7 +505,7 @@ float weapon_prepareattack_checkammo(float secondary)
 }
 .float race_penalty;
 float weapon_prepareattack_check(float secondary, float attacktime)
-{
+{SELFPARAM();
        if(!weapon_prepareattack_checkammo(secondary))
                return false;
 
@@ -535,7 +535,7 @@ float weapon_prepareattack_check(float secondary, float attacktime)
        return true;
 }
 float weapon_prepareattack_do(float secondary, float attacktime)
-{
+{SELFPARAM();
        self.weaponentity.state = WS_INUSE;
 
        self.spawnshieldtime = min(self.spawnshieldtime, time); // kill spawn shield when you fire
@@ -566,7 +566,7 @@ float weapon_prepareattack(float secondary, float attacktime)
 }
 
 void weapon_thinkf(float fr, float t, void() func)
-{
+{SELFPARAM();
        vector a;
        vector of, or, ou;
        float restartanim;
@@ -629,7 +629,7 @@ void weapon_thinkf(float fr, float t, void() func)
 
        if((fr == WFRAME_FIRE1 || fr == WFRAME_FIRE2) && t)
        {
-               if((self.weapon == WEP_SHOCKWAVE || self.weapon == WEP_SHOTGUN) && fr == WFRAME_FIRE2)
+               if((self.weapon == WEP_SHOCKWAVE.m_id || self.weapon == WEP_SHOTGUN.m_id) && fr == WFRAME_FIRE2)
                        animdecide_setaction(self, ANIMACTION_MELEE, restartanim);
                else
                        animdecide_setaction(self, ANIMACTION_SHOOT, restartanim);
@@ -657,7 +657,7 @@ float forbidWeaponUse(entity player)
 }
 
 void W_WeaponFrame()
-{
+{SELFPARAM();
        vector fo, ri, up;
 
        if (frametime)
@@ -732,7 +732,7 @@ void W_WeaponFrame()
                        if(ATTACK_FINISHED(self) <= time + self.weapon_frametime * 0.5)
                        {
                        #endif
-                               sound(self, CH_WEAPON_SINGLE, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_WEAPON_SINGLE, W_Sound("weapon_switch"), VOL_BASE, ATTN_NORM);
                                self.weaponentity.state = WS_DROP;
                                weapon_thinkf(WFRAME_DONTCHANGE, oldwep.switchdelay_drop, w_clear);
                        #ifndef INDEPENDENT_ATTACK_FINISHED
@@ -788,7 +788,7 @@ void W_WeaponFrame()
 }
 
 void W_AttachToShotorg(entity flash, vector offset)
-{
+{SELFPARAM();
        entity xflash;
        flash.owner = self;
        flash.angles_z = random() * 360;
@@ -820,7 +820,7 @@ void W_AttachToShotorg(entity flash, vector offset)
 }
 
 void W_DecreaseAmmo(float ammo_use)
-{
+{SELFPARAM();
        entity wep = get_weaponinfo(self.weapon);
 
        if(cvar("g_overkill"))
@@ -864,7 +864,7 @@ void W_DecreaseAmmo(float ammo_use)
 .string reload_sound;
 
 void W_ReloadedAndReady()
-{
+{SELFPARAM();
        // finish the reloading process, and do the ammo transfer
 
        self.clip_load = self.old_clip_load; // restore the ammo counter, in case we still had ammo in the weapon before reloading
@@ -891,7 +891,7 @@ void W_ReloadedAndReady()
 }
 
 void W_Reload(float sent_ammo_min, string sent_sound)
-{
+{SELFPARAM();
        // set global values to work with
        entity e;
        e = get_weaponinfo(self.weapon);
@@ -908,7 +908,7 @@ void W_Reload(float sent_ammo_min, string sent_sound)
        // don't reload weapons that don't have the RELOADABLE flag
        if (!(e.spawnflags & WEP_FLAG_RELOADABLE))
        {
-               dprint("Warning: Attempted to reload a weapon that does not have the WEP_FLAG_RELOADABLE flag. Fix your code!\n");
+               LOG_TRACE("Warning: Attempted to reload a weapon that does not have the WEP_FLAG_RELOADABLE flag. Fix your code!\n");
                return;
        }
 
@@ -927,7 +927,7 @@ void W_Reload(float sent_ammo_min, string sent_sound)
        {
                if(IS_REAL_CLIENT(self) && self.reload_complain < time)
                {
-                       play2(self, "weapons/unavailable.wav");
+                       play2(self, W_Sound("unavailable"));
                        sprint(self, strcat("You don't have enough ammo to reload the ^2", WEP_NAME(self.weapon), "\n"));
                        self.reload_complain = time + 1;
                }
@@ -968,10 +968,9 @@ void W_Reload(float sent_ammo_min, string sent_sound)
 }
 
 void W_DropEvent(float event, entity player, float weapon_type, entity weapon_item)
-{
-       entity oldself = self;
-       self = player;
+{SELFPARAM();
+       setself(player);
        weapon_dropevent_item = weapon_item;
        WEP_ACTION(weapon_type, event);
-       self = oldself;
+       setself(this);
 }