Merge branch 'master' into Mario/vehicles
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / weapons / weaponsystem.qc
index 25fce59..d3b11cf 100644 (file)
@@ -1,3 +1,20 @@
+#include "weaponsystem.qh"
+#include "../_all.qh"
+
+#include "selection.qh"
+
+#include "../command/common.qh"
+#include "../mutators/mutators_include.qh"
+#include "../round_handler.qh"
+#include "../t_items.qh"
+#include "../../common/animdecide.qh"
+#include "../../common/constants.qh"
+#include "../../common/monsters/all.qh"
+#include "../../common/notifications.qh"
+#include "../../common/util.qh"
+#include "../../common/weapons/all.qh"
+#include "../../csqcmodellib/sv_model.qh"
+
 /*
 ===========================================================================
 
 
 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;
 }
 
-// VorteX: static frame globals
-const float WFRAME_DONTCHANGE = -1;
-const float WFRAME_FIRE1 = 0;
-const float WFRAME_FIRE2 = 1;
-const float WFRAME_IDLE = 2;
-const float WFRAME_RELOAD = 3;
-.float wframe;
+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;
 
@@ -37,7 +55,7 @@ float CL_Weaponentity_CustomizeEntityForClient()
        if(IS_SPEC(other))
                if(other.enemy == self.owner)
                        self.viewmodelforclient = other;
-       return TRUE;
+       return true;
 }
 
 /*
@@ -231,12 +249,12 @@ void CL_WeaponEntity_SetModel(string name)
 
        self.view_ofs = '0 0 0';
 
-       if(self.movedir_x >= 0)
+       if(self.movedir.x >= 0)
        {
                vector v0;
                v0 = self.movedir;
-               self.movedir = shotorg_adjust(v0, FALSE, FALSE);
-               self.view_ofs = shotorg_adjust(v0, FALSE, TRUE) - v0;
+               self.movedir = shotorg_adjust(v0, false, false);
+               self.view_ofs = shotorg_adjust(v0, false, true) - v0;
        }
        self.owner.stat_shotorg = compressShotOrigin(self.movedir);
        self.movedir = decompressShotOrigin(self.owner.stat_shotorg); // make them match perfectly
@@ -247,7 +265,7 @@ void CL_WeaponEntity_SetModel(string name)
        setorigin(self, self.view_ofs);
        // reset animstate now
        self.wframe = WFRAME_IDLE;
-       setanim(self, self.anim_idle, TRUE, FALSE, TRUE);
+       setanim(self, self.anim_idle, true, false, true);
 }
 
 vector CL_Weapon_GetShotOrg(float wpn)
@@ -267,10 +285,10 @@ vector CL_Weapon_GetShotOrg(float wpn)
 
 void CL_Weaponentity_Think()
 {
-       float tb;
+       int tb;
        self.nextthink = time;
        if (intermission_running)
-               self.frame = self.anim_idle_x;
+               self.frame = self.anim_idle.x;
        if (self.owner.weaponentity != self)
        {
                if (self.weaponentity)
@@ -454,13 +472,13 @@ float weapon_prepareattack_checkammo(float 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;
+                       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
+                       return false; // no clicking, just allow
 
                if(self.weapon == self.switchweapon && time - self.prevdryfire > 1) // only play once BEFORE starting to switch weapons
                {
@@ -489,40 +507,40 @@ float weapon_prepareattack_checkammo(float secondary)
                        W_SwitchToOtherWeapon(self);
                }
 
-               return FALSE;
+               return false;
        }
-       return TRUE;
+       return true;
 }
 .float race_penalty;
 float weapon_prepareattack_check(float secondary, float attacktime)
 {
        if(!weapon_prepareattack_checkammo(secondary))
-               return FALSE;
+               return false;
 
        //if sv_ready_restart_after_countdown is set, don't allow the player to shoot
        //if all players readied up and the countdown is running
        if(time < game_starttime || time < self.race_penalty) {
-               return FALSE;
+               return false;
        }
 
        if (timeout_status == TIMEOUT_ACTIVE) //don't allow the player to shoot while game is paused
-               return FALSE;
+               return false;
 
        // do not even think about shooting if switching
        if(self.switchweapon != self.weapon)
-               return FALSE;
+               return false;
 
        if(attacktime >= 0)
        {
                // don't fire if previous attack is not finished
                if (ATTACK_FINISHED(self) > time + self.weapon_frametime * 0.5)
-                       return FALSE;
+                       return false;
                // don't fire while changing weapon
                if (self.weaponentity.state != WS_READY)
-                       return FALSE;
+                       return false;
        }
 
-       return TRUE;
+       return true;
 }
 float weapon_prepareattack_do(float secondary, float attacktime)
 {
@@ -542,17 +560,17 @@ float weapon_prepareattack_do(float secondary, float attacktime)
        }
        self.bulletcounter += 1;
        //dprint("attack finished ", ftos(ATTACK_FINISHED(self)), "\n");
-       return TRUE;
+       return true;
 }
 float weapon_prepareattack(float secondary, float attacktime)
 {
        if(weapon_prepareattack_check(secondary, attacktime))
        {
                weapon_prepareattack_do(secondary, attacktime);
-               return TRUE;
+               return true;
        }
        else
-               return FALSE;
+               return false;
 }
 
 void weapon_thinkf(float fr, float t, void() func)
@@ -564,12 +582,12 @@ void weapon_thinkf(float fr, float t, void() func)
        if(fr == WFRAME_DONTCHANGE)
        {
                fr = self.weaponentity.wframe;
-               restartanim = FALSE;
+               restartanim = false;
        }
        else if (fr == WFRAME_IDLE)
-               restartanim = FALSE;
+               restartanim = false;
        else
-               restartanim = TRUE;
+               restartanim = true;
 
        of = v_forward;
        or = v_right;
@@ -587,8 +605,8 @@ void weapon_thinkf(float fr, float t, void() func)
                        a = self.weaponentity.anim_fire2;
                else // if (fr == WFRAME_RELOAD)
                        a = self.weaponentity.anim_reload;
-               a_z *= g_weaponratefactor;
-               setanim(self.weaponentity, a, restartanim == FALSE, restartanim, restartanim);
+               a.z *= g_weaponratefactor;
+               setanim(self.weaponentity, a, restartanim == false, restartanim, restartanim);
        }
 
        v_forward = of;
@@ -619,7 +637,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);
@@ -631,17 +649,17 @@ void weapon_thinkf(float fr, float t, void() func)
        }
 }
 
-float forbidWeaponUse()
+float forbidWeaponUse(entity player)
 {
        if(time < game_starttime && !autocvar_sv_ready_restart_after_countdown)
                return 1;
        if(round_handler_IsActive() && !round_handler_IsRoundStarted())
                return 1;
-       if(self.player_blocked)
+       if(player.player_blocked)
                return 1;
-       if(self.frozen)
+       if(player.frozen)
                return 1;
-       if(self.weapon_blocked)
+       if(player.weapon_blocked)
                return 1;
        return 0;
 }
@@ -656,7 +674,7 @@ void W_WeaponFrame()
        if (!self.weaponentity || self.health < 1)
                return; // Dead player can't use weapons and injure impulse commands
 
-       if(forbidWeaponUse())
+       if(forbidWeaponUse(self))
        if(self.weaponentity.state != WS_CLEAR)
        {
                w_ready();
@@ -794,7 +812,7 @@ void W_AttachToShotorg(entity flash, vector offset)
 
        flash.viewmodelforclient = self;
 
-       if(self.weaponentity.oldorigin_x > 0)
+       if(self.weaponentity.oldorigin.x > 0)
        {
                setattachment(xflash, self.exteriorweaponentity, "");
                setorigin(xflash, self.weaponentity.oldorigin + offset);
@@ -957,7 +975,6 @@ void W_Reload(float sent_ammo_min, string sent_sound)
        self.clip_load = self.(weapon_load[self.weapon]) = -1;
 }
 
-entity weapon_dropevent_item;
 void W_DropEvent(float event, entity player, float weapon_type, entity weapon_item)
 {
        entity oldself = self;