]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Do the Grenade Launcher and Mine Layer
authorMircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Fri, 21 Jan 2011 21:18:34 +0000 (23:18 +0200)
committerMircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Fri, 21 Jan 2011 21:18:34 +0000 (23:18 +0200)
balanceXonotic.cfg
qcsrc/server/autocvars.qh
qcsrc/server/cl_client.qc
qcsrc/server/w_grenadelauncher.qc
qcsrc/server/w_minelayer.qc

index 01836ee7916027ee004afb2c09167dbc17b34782..e500fd624de666df3c562b2daab9c5d23c9424aa 100644 (file)
@@ -339,6 +339,9 @@ set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 
 set g_balance_grenadelauncher_bouncefactor 0.5
 set g_balance_grenadelauncher_bouncestop 0.12
+
+set g_balance_grenadelauncher_reload_ammo 15
+set g_balance_grenadelauncher_reload_time 2
 // }}}
 // {{{ minelayer
 set g_balance_minelayer_damage 42
@@ -361,6 +364,8 @@ set g_balance_minelayer_remote_damage 45
 set g_balance_minelayer_remote_edgedamage 40
 set g_balance_minelayer_remote_radius 200
 set g_balance_minelayer_remote_force 300
+set g_balance_minelayer_reload_ammo 10
+set g_balance_minelayer_reload_time 2
 // }}}
 // {{{ electro
 set g_balance_electro_lightning 1
index 684a81be9c4b81899df298848a1280ccbad2d673..55cab56c43c71a0ad53b45c5935c217cabf97b18 100644 (file)
@@ -299,6 +299,8 @@ float autocvar_g_balance_grenadelauncher_secondary_refire;
 float autocvar_g_balance_grenadelauncher_secondary_speed;
 float autocvar_g_balance_grenadelauncher_secondary_speed_up;
 float autocvar_g_balance_grenadelauncher_secondary_type;
+float autocvar_g_balance_grenadelauncher_reload_ammo;
+float autocvar_g_balance_grenadelauncher_reload_time;
 float autocvar_g_balance_hagar_primary_ammo;
 float autocvar_g_balance_hagar_primary_damage;
 float autocvar_g_balance_hagar_primary_edgedamage;
@@ -430,6 +432,8 @@ float autocvar_g_balance_minelayer_remote_force;
 float autocvar_g_balance_minelayer_remote_radius;
 float autocvar_g_balance_minelayer_speed;
 float autocvar_g_balance_minelayer_time;
+float autocvar_g_balance_minelayer_reload_ammo;
+float autocvar_g_balance_minelayer_reload_time;
 float autocvar_g_balance_minstanex_ammo;
 float autocvar_g_balance_minstanex_animtime;
 float autocvar_g_balance_minstanex_refire;
index a1133cd2a1b79bcd2a9bc8ca02780ad34810e70d..a0d54f96dfd07ea01a8a18abcfa783f559da2049 100644 (file)
@@ -893,6 +893,8 @@ void PutClientInServer (void)
                self.shotgun_load = autocvar_g_balance_shotgun_reload_ammo;
                self.sniperrifle_load = autocvar_g_balance_sniperrifle_reload_ammo;
                self.uzi_load = autocvar_g_balance_uzi_reload_ammo;
+               self.grenadelauncher_load = autocvar_g_balance_grenadelauncher_reload_ammo;
+               self.minelayer_load = autocvar_g_balance_minelayer_reload_ammo;
 
                if(inWarmupStage)
                {
index 73e2d13bf11028307884a7ccdb910d2f6116f322..26746a1e7618e2cfb30b54fa24cdaa30d6e7544b 100644 (file)
@@ -5,6 +5,60 @@ REGISTER_WEAPON(GRENADE_LAUNCHER, w_glauncher, IT_ROCKETS, 4, WEP_FLAG_NORMAL |
 .float gl_detonate_later;
 .float gl_bouncecnt;
 
+.float grenadelauncher_load;
+
+void W_GrenadeLauncher_SetAmmoCounter()
+{
+       // set clip_load to the weapon we have switched to, if the gun uses reloading
+       if(!autocvar_g_balance_grenadelauncher_reload_ammo)
+               self.clip_load = 0; // also keeps crosshair ammo from displaying
+       else
+       {
+               self.clip_load = self.grenadelauncher_load;
+               self.clip_size = autocvar_g_balance_grenadelauncher_reload_ammo; // for the crosshair ammo display
+       }
+}
+
+void W_GrenadeLauncher_ReloadedAndReady()
+{
+       float t;
+
+       // now 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
+       while(self.clip_load < autocvar_g_balance_grenadelauncher_reload_ammo && self.ammo_rockets) // make sure we don't add more ammo than we have
+       {
+               self.clip_load += 1;
+               self.ammo_rockets -= 1;
+       }
+       self.grenadelauncher_load = self.clip_load;
+
+       t = ATTACK_FINISHED(self) - autocvar_g_balance_grenadelauncher_reload_time - 1;
+       ATTACK_FINISHED(self) = t;
+       w_ready();
+}
+
+void W_GrenadeLauncher_Reload()
+{
+       // return if reloading is disabled for this weapon
+       if(!autocvar_g_balance_grenadelauncher_reload_ammo)
+               return;
+
+       if(!W_ReloadCheck(self.ammo_rockets))
+               return;
+
+       float t;
+
+       sound (self, CHAN_WEAPON2, "weapons/reload.wav", VOL_BASE, ATTN_NORM);
+
+       t = max(time, ATTACK_FINISHED(self)) + autocvar_g_balance_grenadelauncher_reload_time + 1;
+       ATTACK_FINISHED(self) = t;
+
+       weapon_thinkf(WFRAME_RELOAD, autocvar_g_balance_grenadelauncher_reload_time, W_GrenadeLauncher_ReloadedAndReady);
+
+       self.old_clip_load = self.clip_load;
+       self.clip_load = -1;
+}
+
 void W_Grenade_Explode (void)
 {
        if(other.takedamage == DAMAGE_AIM)
@@ -159,10 +213,11 @@ void W_Grenade_Touch2 (void)
 
 void W_Grenade_Attack (void)
 {
+       if(autocvar_g_balance_grenadelauncher_reload_ammo && self.clip_load <= 0)
+               return; // reloading, so we are done
+
        local entity gren;
 
-       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-               self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_grenadelauncher_primary_ammo;
        W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CHAN_WEAPON, autocvar_g_balance_grenadelauncher_primary_damage);
        w_shotdir = v_forward; // no TrueAim for grenades please
 
@@ -202,14 +257,24 @@ void W_Grenade_Attack (void)
                CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE_BOUNCING, TRUE);
 
        other = gren; MUTATOR_CALLHOOK(EditProjectile);
+
+       // if this weapon is reloadable, decrease its load. Else decrease the player's ammo
+       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+       {
+               if(autocvar_g_balance_grenadelauncher_reload_ammo)
+               {
+                       self.clip_load -= autocvar_g_balance_grenadelauncher_primary_ammo;
+                       self.grenadelauncher_load = self.clip_load;
+               }
+               else
+                       self.ammo_rockets -= autocvar_g_balance_grenadelauncher_primary_ammo;
+       }
 }
 
 void W_Grenade_Attack2 (void)
 {
        local entity gren;
 
-       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-               self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_grenadelauncher_secondary_ammo;
        W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CHAN_WEAPON, autocvar_g_balance_grenadelauncher_secondary_damage);
        w_shotdir = v_forward; // no TrueAim for grenades please
 
@@ -248,6 +313,18 @@ void W_Grenade_Attack2 (void)
                CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE_BOUNCING, TRUE);
 
        other = gren; MUTATOR_CALLHOOK(EditProjectile);
+
+       // if this weapon is reloadable, decrease its load. Else decrease the player's ammo
+       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+       {
+               if(autocvar_g_balance_grenadelauncher_reload_ammo)
+               {
+                       self.clip_load -= autocvar_g_balance_grenadelauncher_secondary_ammo;
+                       self.grenadelauncher_load = self.clip_load;
+               }
+               else
+                       self.ammo_rockets -= autocvar_g_balance_grenadelauncher_secondary_ammo;
+       }
 }
 
 void spawnfunc_weapon_grenadelauncher (void)
@@ -284,13 +361,17 @@ float w_glauncher(float req)
        }
        else if (req == WR_THINK)
        {
-               if (self.BUTTON_ATCK)
-               if (weapon_prepareattack(0, autocvar_g_balance_grenadelauncher_primary_refire))
+               if(autocvar_g_balance_grenadelauncher_reload_ammo && self.clip_load <= 0) // forced reload
+                       W_GrenadeLauncher_Reload();
+               else if (self.BUTTON_ATCK)
                {
-                       W_Grenade_Attack();
-                       weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_grenadelauncher_primary_animtime, w_ready);
+                       if (weapon_prepareattack(0, autocvar_g_balance_grenadelauncher_primary_refire))
+                       {
+                               W_Grenade_Attack();
+                               weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_grenadelauncher_primary_animtime, w_ready);
+                       }
                }
-               if (self.BUTTON_ATCK2)
+               else if (self.BUTTON_ATCK2)
                {
                        if (cvar("g_balance_grenadelauncher_secondary_remote_detonateprimary"))
                        {
@@ -312,6 +393,17 @@ float w_glauncher(float req)
                                weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_grenadelauncher_secondary_animtime, w_ready);
                        }
                }
+        if(self.wish_reload)
+        {
+            if(self.switchweapon == self.weapon)
+            {
+                if(self.weaponentity.state == WS_READY)
+                {
+                    self.wish_reload = 0;
+                    W_GrenadeLauncher_Reload();
+                }
+            }
+        }
        }
        else if (req == WR_PRECACHE)
        {
@@ -328,11 +420,24 @@ float w_glauncher(float req)
                precache_sound ("weapons/grenade_fire.wav");
        }
        else if (req == WR_SETUP)
+       {
                weapon_setup(WEP_GRENADE_LAUNCHER);
+               W_GrenadeLauncher_SetAmmoCounter();
+       }
        else if (req == WR_CHECKAMMO1)
-               return self.ammo_rockets >= autocvar_g_balance_grenadelauncher_primary_ammo;
+       {
+               if(autocvar_g_balance_grenadelauncher_reload_ammo)
+                       return self.grenadelauncher_load >= autocvar_g_balance_grenadelauncher_primary_ammo;
+               else
+                       return self.ammo_rockets >= autocvar_g_balance_grenadelauncher_primary_ammo;
+       }
        else if (req == WR_CHECKAMMO2)
-               return self.ammo_rockets >= autocvar_g_balance_grenadelauncher_secondary_ammo;
+       {
+               if(autocvar_g_balance_grenadelauncher_reload_ammo)
+                       return self.grenadelauncher_load >= autocvar_g_balance_grenadelauncher_secondary_ammo;
+               else
+                       return self.ammo_rockets >= autocvar_g_balance_grenadelauncher_secondary_ammo;
+       }
        return TRUE;
 };
 #endif
@@ -368,6 +473,10 @@ float w_glauncher(float req)
                else // unchecked: SECONDARY, BOUNCE
                        w_deathtypestring = "%s ate %s's grenade";
        }
+       else if (req == WR_RELOAD)
+       {
+               W_GrenadeLauncher_Reload();
+       }
        return TRUE;
 }
 #endif
index 73682ad40d6ebbc7d60ad1eba388c4c073837247..75d50d21059ebe294094c35cdc4c4efd558ec5b9 100644 (file)
@@ -6,6 +6,60 @@ void W_Mine_Think (void);
 .float minelayer_detonate, minelayer_mines;
 .float mine_time;
 
+.float minelayer_load;
+
+void W_MineLayer_SetAmmoCounter()
+{
+       // set clip_load to the weapon we have switched to, if the gun uses reloading
+       if(!autocvar_g_balance_minelayer_reload_ammo)
+               self.clip_load = 0; // also keeps crosshair ammo from displaying
+       else
+       {
+               self.clip_load = self.minelayer_load;
+               self.clip_size = autocvar_g_balance_minelayer_reload_ammo; // for the crosshair ammo display
+       }
+}
+
+void W_MineLayer_ReloadedAndReady()
+{
+       float t;
+
+       // now 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
+       while(self.clip_load < autocvar_g_balance_minelayer_reload_ammo && self.ammo_rockets) // make sure we don't add more ammo than we have
+       {
+               self.clip_load += 1;
+               self.ammo_rockets -= 1;
+       }
+       self.minelayer_load = self.clip_load;
+
+       t = ATTACK_FINISHED(self) - autocvar_g_balance_minelayer_reload_time - 1;
+       ATTACK_FINISHED(self) = t;
+       w_ready();
+}
+
+void W_MineLayer_Reload()
+{
+       // return if reloading is disabled for this weapon
+       if(!autocvar_g_balance_minelayer_reload_ammo)
+               return;
+
+       if(!W_ReloadCheck(self.ammo_rockets))
+               return;
+
+       float t;
+
+       sound (self, CHAN_WEAPON2, "weapons/reload.wav", VOL_BASE, ATTN_NORM);
+
+       t = max(time, ATTACK_FINISHED(self)) + autocvar_g_balance_minelayer_reload_time + 1;
+       ATTACK_FINISHED(self) = t;
+
+       weapon_thinkf(WFRAME_RELOAD, autocvar_g_balance_minelayer_reload_time, W_MineLayer_ReloadedAndReady);
+
+       self.old_clip_load = self.clip_load;
+       self.clip_load = -1;
+}
+
 void spawnfunc_weapon_minelayer (void)
 {
        weapon_defaultspawnfunc(WEP_MINE_LAYER);
@@ -195,6 +249,9 @@ void W_Mine_Damage (entity inflictor, entity attacker, float damage, float death
 
 void W_Mine_Attack (void)
 {
+       if(autocvar_g_balance_minelayer_reload_ammo && self.clip_load <= 0)
+               return; // reloading, so we are done
+
        entity mine;
        entity flash;
 
@@ -214,9 +271,6 @@ void W_Mine_Attack (void)
                }
        }
 
-       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-               self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_minelayer_ammo;
-
        W_SetupShot_ProjectileSize (self, '-4 -4 -4', '4 4 4', FALSE, 5, "weapons/mine_fire.wav", CHAN_WEAPON, autocvar_g_balance_minelayer_damage);
        pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -262,6 +316,18 @@ void W_Mine_Attack (void)
        // common properties
 
        other = mine; MUTATOR_CALLHOOK(EditProjectile);
+
+       // if this weapon is reloadable, decrease its load. Else decrease the player's ammo
+       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+       {
+               if(autocvar_g_balance_minelayer_reload_ammo)
+               {
+                       self.clip_load -= autocvar_g_balance_minelayer_ammo;
+                       self.minelayer_load = self.clip_load;
+               }
+               else
+                       self.ammo_rockets -= autocvar_g_balance_minelayer_ammo;
+       }
 }
 
 void spawnfunc_weapon_minelayer (void); // defined in t_items.qc
@@ -367,7 +433,9 @@ float w_minelayer(float req)
        }
        else if (req == WR_THINK)
        {
-               if (self.BUTTON_ATCK)
+               if(autocvar_g_balance_minelayer_reload_ammo && self.clip_load <= 0) // forced reload
+                       W_MineLayer_Reload();
+               else if (self.BUTTON_ATCK)
                {
                        if(weapon_prepareattack(0, autocvar_g_balance_minelayer_refire))
                        {
@@ -376,7 +444,7 @@ float w_minelayer(float req)
                        }
                }
 
-               if (self.BUTTON_ATCK2)
+               else if (self.BUTTON_ATCK2)
                {
                        minfound = 0;
                        for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
@@ -390,6 +458,18 @@ float w_minelayer(float req)
                        if(minfound)
                                sound (self, CHAN_WEAPON2, "weapons/mine_det.wav", VOL_BASE, ATTN_NORM);
                }
+
+        if(self.wish_reload)
+        {
+            if(self.switchweapon == self.weapon)
+            {
+                if(self.weaponentity.state == WS_READY)
+                {
+                    self.wish_reload = 0;
+                    W_MineLayer_Reload();
+                }
+            }
+        }
        }
        else if (req == WR_PRECACHE)
        {
@@ -406,6 +486,7 @@ float w_minelayer(float req)
        else if (req == WR_SETUP)
        {
                weapon_setup(WEP_MINE_LAYER);
+               W_MineLayer_SetAmmoCounter();
        }
        else if (req == WR_CHECKAMMO1)
        {
@@ -415,7 +496,13 @@ float w_minelayer(float req)
                        return FALSE;
        }
        else if (req == WR_CHECKAMMO2)
+       {
                return FALSE;
+       }
+       else if (req == WR_RELOAD)
+       {
+               W_MineLayer_Reload();
+       }
        return TRUE;
 };
 #endif