]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/weapons/weaponsystem.qc
Merge branch 'master' into terencehill/music_player
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / weapons / weaponsystem.qc
index 70b916cedbe4bf50eae97b988b2af5335f9e0ee1..25fce59a15f510d878355f0b084f2bf0be54bc03 100644 (file)
@@ -14,6 +14,10 @@ float W_WeaponRateFactor()
        float t;
        t = 1.0 / g_weaponratefactor;
 
+       weapon_rate = t;
+       MUTATOR_CALLHOOK(WeaponRateFactor);
+       t = weapon_rate;
+
        return t;
 }
 
@@ -454,6 +458,10 @@ float weapon_prepareattack_checkammo(float secondary)
                for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
                        return FALSE;
 
+               if(self.weapon == WEP_SHOTGUN)
+               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);
@@ -631,7 +639,9 @@ float forbidWeaponUse()
                return 1;
        if(self.player_blocked)
                return 1;
-       if(self.freezetag_frozen)
+       if(self.frozen)
+               return 1;
+       if(self.weapon_blocked)
                return 1;
        return 0;
 }
@@ -681,7 +691,7 @@ void W_WeaponFrame()
                        self.weapon = self.switchweapon;
                        self.weaponname = newwep.mdl;
                        self.bulletcounter = 0;
-                       //self.ammo_field = newwep.ammo_field;
+                       self.ammo_field = newwep.ammo_field;
                        WEP_ACTION(self.switchweapon, WR_SETUP);
                        self.weaponentity.state = WS_RAISE;
 
@@ -803,6 +813,13 @@ void W_DecreaseAmmo(float ammo_use)
 {
        entity wep = get_weaponinfo(self.weapon);
 
+       if(cvar("g_overkill"))
+       if(self.ok_use_ammocharge)
+       {
+               ok_DecreaseCharge(self, self.weapon);
+               return; // TODO
+       }
+
        if((self.items & IT_UNLIMITED_WEAPON_AMMO) && !wep.reloading_ammo)
                return;
 
@@ -812,7 +829,7 @@ void W_DecreaseAmmo(float ammo_use)
                self.clip_load -= ammo_use;
                self.(weapon_load[self.weapon]) = self.clip_load;
        }
-       else
+       else if(wep.ammo_field != ammo_none)
        {
                self.(wep.ammo_field) -= ammo_use;
                if(self.(wep.ammo_field) < 0)
@@ -847,11 +864,10 @@ void W_ReloadedAndReady()
                self.clip_load = self.reload_ammo_amount;
        else
        {
-               while(self.clip_load < self.reload_ammo_amount && self.(self.ammo_field)) // make sure we don't add more ammo than we have
-               {
-                       self.clip_load += 1;
-                       self.(self.ammo_field) -= 1;
-               }
+               // make sure we don't add more ammo than we have
+               float load = min(self.reload_ammo_amount - self.clip_load, self.(self.ammo_field));
+        self.clip_load += load;
+        self.(self.ammo_field) -= load;
        }
        self.(weapon_load[self.weapon]) = self.clip_load;
 
@@ -870,8 +886,12 @@ void W_Reload(float sent_ammo_min, string sent_sound)
        entity e;
        e = get_weaponinfo(self.weapon);
 
+       if(cvar("g_overkill"))
+       if(self.ok_use_ammocharge)
+               return; // TODO
+
        self.reload_ammo_min = sent_ammo_min;
-       self.reload_ammo_amount = e.reloading_ammo;;
+       self.reload_ammo_amount = e.reloading_ammo;
        self.reload_time = e.reloading_time;
        self.reload_sound = sent_sound;
 
@@ -936,3 +956,13 @@ void W_Reload(float sent_ammo_min, string sent_sound)
        self.old_clip_load = self.clip_load;
        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;
+       self = player;
+       weapon_dropevent_item = weapon_item;
+       WEP_ACTION(weapon_type, event);
+       self = oldself;
+}