]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Per weapon load, part 1. Still buggy and not functioning properly
authorMircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Fri, 21 Jan 2011 01:19:49 +0000 (03:19 +0200)
committerMircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Fri, 21 Jan 2011 01:19:49 +0000 (03:19 +0200)
balanceXonotic.cfg
qcsrc/server/autocvars.qh
qcsrc/server/cl_weaponsystem.qc
qcsrc/server/w_shotgun.qc
qcsrc/server/w_sniperrifle.qc

index 53f98d57b2fa3f717c37e64576c1de379e0d1f1b..414222b286d664a6687262010c9be19b40fda71d 100644 (file)
@@ -263,6 +263,7 @@ set g_balance_shotgun_secondary_damage 110
 set g_balance_shotgun_secondary_force 150
 set g_balance_shotgun_secondary_refire 1.1
 set g_balance_shotgun_secondary_animtime 1
+set g_balance_shotgun_reload_ammo 4
 // }}}
 // {{{ uzi
 set g_balance_uzi_mode 1                               // Activates varible spread for sustained & burst mode secondary
@@ -642,6 +643,7 @@ set g_balance_sniperrifle_secondary_ammo 10
 set g_balance_sniperrifle_secondary_bulletconstant 110 // 15.5qu
 set g_balance_sniperrifle_secondary_burstcost 0
 set g_balance_sniperrifle_secondary_bullethail 0 // empty magazine on shot
+set g_balance_sniperrifle_reload_ammo 8
 // }}}
 // {{{ tuba
 set g_balance_tuba_refire 0.05
index e791e71440ad7e890abb8d57359f7760f1349525..c52820f9dddfa63571a20bf54357f699b69d5db3 100644 (file)
@@ -114,6 +114,7 @@ float autocvar_g_balance_sniperrifle_secondary_refire;
 float autocvar_g_balance_sniperrifle_secondary_speed;
 float autocvar_g_balance_sniperrifle_secondary_spread;
 float autocvar_g_balance_sniperrifle_secondary_tracer;
+float autocvar_g_balance_sniperrifle_reload_ammo;
 float autocvar_g_balance_cloaked_alpha;
 float autocvar_g_balance_crylink_primary_ammo;
 float autocvar_g_balance_crylink_primary_animtime;
@@ -611,6 +612,7 @@ float autocvar_g_balance_shotgun_secondary_melee_range;
 float autocvar_g_balance_shotgun_secondary_melee_swing;
 float autocvar_g_balance_shotgun_secondary_melee_time;
 float autocvar_g_balance_shotgun_secondary_refire;
+float autocvar_g_balance_shotgun_reload_ammo;
 float autocvar_g_balance_teams;
 float autocvar_g_balance_teams_force;
 float autocvar_g_balance_teams_prevent_imbalance;
index 2391f8af09374662a5248877ff414737c799e8a3..31f3da102e35848990a359a2b179adcbac83e7a8 100644 (file)
@@ -1616,27 +1616,10 @@ void W_SetupProjectileVelocity(entity missile, float pSpeed, float spread)
 // weapon reload code
 // ----------------------------------------------------------------
 
-float ammo_amount;
-
-float W_CheckMaxBullets(float checkammo)
-{
-       float maxbulls;
-       maxbulls = autocvar_g_balance_sniperrifle_magazinecapacity;
-       if(!maxbulls)
-               maxbulls = 8; // match HUD
-       if(checkammo)
-               if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-                       maxbulls = min(maxbulls, floor(ammo_amount / min(autocvar_g_balance_sniperrifle_primary_ammo, autocvar_g_balance_sniperrifle_secondary_ammo)));
-       if(self.ammo_counter > maxbulls || !autocvar_g_balance_sniperrifle_magazinecapacity)
-               self.ammo_counter = maxbulls;
-       return (self.ammo_counter == maxbulls);
-}
-
 void W_ReloadedAndReady()
 {
        float t;
        self.ammo_counter = autocvar_g_balance_sniperrifle_magazinecapacity;
-       W_CheckMaxBullets(TRUE);
        t = ATTACK_FINISHED(self) - autocvar_g_balance_sniperrifle_reloadtime - 1;
        ATTACK_FINISHED(self) = t;
        w_ready();
@@ -1646,10 +1629,7 @@ float W_Reload(float ammo_value)
 {
        float t;
 
-       W_CheckMaxBullets(TRUE);
-
-       ammo_amount = ammo_value; // save ammo to a global float
-       if(ammo_amount < min(autocvar_g_balance_sniperrifle_primary_ammo, autocvar_g_balance_sniperrifle_secondary_ammo)) // when we get here, bulletcounter must be 0 or -1
+       if(ammo_value < min(autocvar_g_balance_sniperrifle_primary_ammo, autocvar_g_balance_sniperrifle_secondary_ammo)) // when we get here, bulletcounter must be 0 or -1
        {
                print("cannot reload... not enough bullets\n");
                self.ammo_counter = -1; // reload later
@@ -1657,7 +1637,7 @@ float W_Reload(float ammo_value)
                return 0;
        }
        
-       if (self.ammo_counter >= autocvar_g_balance_sniperrifle_magazinecapacity)
+       if (self.ammo_counter >= autocvar_g_balance_shotgun_reload_ammo)
                return 0;
 
        if (self.weaponentity)
index 267c75ffb60ea3f3ce7551aa8ed257f9936c9964..4af29229d58f01bb58800389ec129e07725431dd 100644 (file)
@@ -3,11 +3,35 @@ REGISTER_WEAPON(SHOTGUN, w_shotgun, IT_SHELLS, 2, WEP_FLAG_NORMAL | WEP_TYPE_HIT
 #else
 #ifdef SVQC
 
-void W_Shotgun_DoReload()
+.float shotgun_load;
+
+void W_Shotgun_SetAmmoCounter()
+{
+       // set our ammo counter to the weapon we have switched to
+       if(!autocvar_g_balance_shotgun_reload_ammo)
+               self.ammo_counter = 0; // also keeps the crosshair ammo from displaying
+       else
+               self.ammo_counter = self.shotgun_load;
+}
+
+void W_Shotgun_Reload()
 {
+       // reloading is disabled for this weapon
+       if(!autocvar_g_balance_shotgun_reload_ammo)
+               return;
+
        w_ready();
        if(W_Reload(self.ammo_shells))
+       {
+               // now do the actual ammo transfer
+               for(self.shotgun_load; self.shotgun_load < autocvar_g_balance_shotgun_reload_ammo && self.ammo_shells; )
+               {
+                       self.ammo_counter += 1;
+                       self.shotgun_load = self.ammo_counter;
+                       self.ammo_shells -= 1;
+               }
                return;
+       }
 }
 
 void W_Shotgun_Attack (void)
@@ -23,7 +47,7 @@ void W_Shotgun_Attack (void)
        local entity flash;
 
        if(self.ammo_counter <= 0)
-               W_Shotgun_DoReload();
+               W_Shotgun_Reload();
        if(self.ammo_counter < 0)
                return; // reloading, so we are done
 
@@ -40,7 +64,12 @@ void W_Shotgun_Attack (void)
                fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, 0, f, WEP_SHOTGUN, 0, 1, bulletconstant);
        endFireBallisticBullet();
        if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-               self.ammo_shells = self.ammo_shells - ammoamount;
+       {
+               if(!autocvar_g_balance_shotgun_reload_ammo)
+                       self.ammo_shells = self.ammo_shells - ammoamount;
+               else
+                       self.shotgun_load -= ammoamount;
+       }
 
        pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, autocvar_g_balance_shotgun_primary_ammo);
 
@@ -169,7 +198,10 @@ float w_shotgun(float req)
                precache_sound ("weapons/shotgun_melee.wav");
        }
        else if (req == WR_SETUP)
+       {
                weapon_setup(WEP_SHOTGUN);
+               W_Shotgun_SetAmmoCounter();
+       }
        else if (req == WR_CHECKAMMO1)
                return self.ammo_shells >= autocvar_g_balance_shotgun_primary_ammo;
        else if (req == WR_CHECKAMMO2)
index d2e5f775b6556c7a1f0e631e82dbb4ba78213583..378e0622aa6f28e7d297799d92908d48008e9cf0 100644 (file)
@@ -7,18 +7,55 @@ REGISTER_WEAPON(SNIPERRIFLE, w_sniperrifle, IT_NAILS, 7, WEP_FLAG_NORMAL | WEP_T
 //** In fully automatic mode some of the gas is used to extract and reload the next cartrige, thus there is less power and range.
 
 .float sniperrifle_accumulator;
+.float sniperrifle_load;
 
-void W_SniperRifle_DoReload()
+void W_SniperRifle_SetAmmoCounter()
 {
+       if(!autocvar_g_balance_sniperrifle_reload_ammo)
+               self.ammo_counter = 0; // also keeps the crosshair ammo from displaying
+       else
+               self.ammo_counter = self.sniperrifle_load;
+}
+
+void W_SniperRifle_Reload()
+{
+       // reloading is disabled for this weapon
+       if(!autocvar_g_balance_shotgun_reload_ammo)
+               return;
+
        w_ready();
        if(W_Reload(self.ammo_nails))
+       {
+               // now do the actual ammo transfer
+               for(self.sniperrifle_load; self.sniperrifle_load < autocvar_g_balance_shotgun_reload_ammo && self.ammo_nails; ++self.sniperrifle_load)
+                       self.ammo_nails -= 1;
                return;
+       }
+}
+
+float W_SniperRifle_CheckMaxBullets(float checkammo)
+{
+       float maxbulls;
+       maxbulls = autocvar_g_balance_sniperrifle_magazinecapacity;
+       if(!maxbulls)
+               maxbulls = 8; // match HUD
+       if(checkammo)
+               if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+                       maxbulls = min(maxbulls, floor(self.ammo_nails / min(autocvar_g_balance_sniperrifle_primary_ammo, autocvar_g_balance_sniperrifle_secondary_ammo)));
+       if(self.ammo_counter > maxbulls)
+               self.ammo_counter = maxbulls;
+       return (self.ammo_counter == maxbulls);
 }
 
 void W_SniperRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
 {
        if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-               self.ammo_nails -= pAmmo;
+       {
+               if(!autocvar_g_balance_sniperrifle_reload_ammo)
+                       self.ammo_nails -= pAmmo;
+               else
+                       self.sniperrifle_load -= pAmmo;
+       }
 
        if(deathtype & HITTYPE_SECONDARY)
                W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, "weapons/campingrifle_fire2.wav", CHAN_WEAPON, autocvar_g_balance_sniperrifle_secondary_damage + autocvar_g_balance_sniperrifle_secondary_headshotaddeddamage);
@@ -74,7 +111,7 @@ void W_SniperRifle_BulletHail_Continue()
 {
        float r, sw, af;
        if(self.ammo_counter <= 0)
-               W_SniperRifle_DoReload();
+               W_SniperRifle_Reload();
        if(self.ammo_counter < 0)
                return; // reloading, so we are done
        sw = self.switchweapon; // make it not detect weapon changes as reason to abort firing
@@ -147,10 +184,9 @@ float w_sniperrifle(float req)
        }
        else if (req == WR_THINK)
        {
+               W_SniperRifle_SetAmmoCounter();
                if(self.ammo_counter < 0) // forced reload (e.g. because interrupted)
-               {
             self.wish_reload = 1;
-               }
                else
                {
                        self.sniperrifle_accumulator = bound(time - autocvar_g_balance_sniperrifle_bursttime, self.sniperrifle_accumulator, time);
@@ -206,7 +242,7 @@ float w_sniperrifle(float req)
        {
                weapon_setup(WEP_SNIPERRIFLE);
 
-               full = W_CheckMaxBullets(TRUE);
+               full = W_SniperRifle_CheckMaxBullets(TRUE);
                if(autocvar_g_balance_sniperrifle_auto_reload_on_switch)
                        if(!full)
                                self.ammo_counter = -1;
@@ -223,7 +259,7 @@ float w_sniperrifle(float req)
        {
                self.sniperrifle_accumulator = time - autocvar_g_balance_sniperrifle_bursttime;
                self.ammo_counter = autocvar_g_balance_sniperrifle_magazinecapacity;
-               W_CheckMaxBullets(FALSE);
+               W_SniperRifle_CheckMaxBullets(FALSE);
        }
        return TRUE;
 };