From b373babed8402b2f3bc9002feb2e7bb01252447f Mon Sep 17 00:00:00 2001 From: Mircea Kitsune Date: Fri, 21 Jan 2011 03:19:49 +0200 Subject: [PATCH] Per weapon load, part 1. Still buggy and not functioning properly --- balanceXonotic.cfg | 2 ++ qcsrc/server/autocvars.qh | 2 ++ qcsrc/server/cl_weaponsystem.qc | 24 ++-------------- qcsrc/server/w_shotgun.qc | 38 +++++++++++++++++++++++-- qcsrc/server/w_sniperrifle.qc | 50 ++++++++++++++++++++++++++++----- 5 files changed, 84 insertions(+), 32 deletions(-) diff --git a/balanceXonotic.cfg b/balanceXonotic.cfg index 53f98d57b..414222b28 100644 --- a/balanceXonotic.cfg +++ b/balanceXonotic.cfg @@ -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 diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index e791e7144..c52820f9d 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -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; diff --git a/qcsrc/server/cl_weaponsystem.qc b/qcsrc/server/cl_weaponsystem.qc index 2391f8af0..31f3da102 100644 --- a/qcsrc/server/cl_weaponsystem.qc +++ b/qcsrc/server/cl_weaponsystem.qc @@ -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) diff --git a/qcsrc/server/w_shotgun.qc b/qcsrc/server/w_shotgun.qc index 267c75ffb..4af29229d 100644 --- a/qcsrc/server/w_shotgun.qc +++ b/qcsrc/server/w_shotgun.qc @@ -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) diff --git a/qcsrc/server/w_sniperrifle.qc b/qcsrc/server/w_sniperrifle.qc index d2e5f775b..378e0622a 100644 --- a/qcsrc/server/w_sniperrifle.qc +++ b/qcsrc/server/w_sniperrifle.qc @@ -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; }; -- 2.39.2