X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fw_electro.qc;h=247437bc06853735ca1f14bef431d984420e0d95;hb=1ceb14cc5cb497f1161f72cb5a416b4eaa811382;hp=e46f749c79fdf0526f8031f2dc9c12360317ecbc;hpb=81e0e6d9c8fa5f317f86e11781201b40a3015d33;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/w_electro.qc b/qcsrc/server/w_electro.qc index e46f749c7..247437bc0 100644 --- a/qcsrc/server/w_electro.qc +++ b/qcsrc/server/w_electro.qc @@ -1,10 +1,62 @@ #ifdef REGISTER_WEAPON -REGISTER_WEAPON(ELECTRO, w_electro, IT_CELLS, 5, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "electro", "electro", "Electro"); +REGISTER_WEAPON(ELECTRO, w_electro, IT_CELLS, 5, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "electro", "electro", _("Electro")); #else #ifdef SVQC .float electro_count; .float electro_secondarytime; +void W_Electro_SetAmmoCounter() +{ + // set clip_load to the weapon we have switched to, if the gun uses reloading + if(!autocvar_g_balance_electro_reload_ammo) + self.clip_load = 0; // also keeps crosshair ammo from displaying + else + { + self.clip_load = self.electro_load; + self.clip_size = autocvar_g_balance_electro_reload_ammo; // for the crosshair ammo display + } +} + +void W_Electro_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_electro_reload_ammo && self.ammo_cells) // make sure we don't add more ammo than we have + { + self.clip_load += 1; + self.ammo_cells -= 1; + } + self.electro_load = self.clip_load; + + t = ATTACK_FINISHED(self) - autocvar_g_balance_electro_reload_time - 1; + ATTACK_FINISHED(self) = t; + w_ready(); +} + +void W_Electro_Reload() +{ + // return if reloading is disabled for this weapon + if(!autocvar_g_balance_electro_reload_ammo) + return; + + if(!W_ReloadCheck(self.ammo_cells, min(autocvar_g_balance_electro_primary_ammo, autocvar_g_balance_electro_secondary_ammo))) + return; + + float t; + + sound (self, CHAN_WEAPON2, "weapons/reload.wav", VOL_BASE, ATTN_NORM); + + t = max(time, ATTACK_FINISHED(self)) + autocvar_g_balance_electro_reload_time + 1; + ATTACK_FINISHED(self) = t; + + weapon_thinkf(WFRAME_RELOAD, autocvar_g_balance_electro_reload_time, W_Electro_ReloadedAndReady); + + self.old_clip_load = self.clip_load; + self.clip_load = -1; +} + void W_Plasma_Explode_Combo (void); void W_Plasma_TriggerCombo(vector org, float rad, entity own) @@ -110,6 +162,18 @@ void W_Electro_Attack() { local entity proj; + // 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_electro_reload_ammo) + { + self.clip_load -= autocvar_g_balance_electro_primary_ammo; + self.electro_load = self.clip_load; + } + else + self.ammo_cells -= autocvar_g_balance_electro_primary_ammo; + } + W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire.wav", CHAN_WEAPON, autocvar_g_balance_electro_primary_damage); pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); @@ -126,8 +190,6 @@ void W_Electro_Attack() proj.projectiledeathtype = WEP_ELECTRO; setorigin(proj, w_shotorg); - if not(self.items & IT_UNLIMITED_WEAPON_AMMO) - self.ammo_cells = self.ammo_cells - autocvar_g_balance_electro_primary_ammo; proj.movetype = MOVETYPE_FLY; W_SETUPPROJECTILEVELOCITY(proj, g_balance_electro_primary); proj.angles = vectoangles(proj.velocity); @@ -147,6 +209,18 @@ void W_Electro_Attack2() { local entity proj; + // 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_electro_reload_ammo) + { + self.clip_load -= autocvar_g_balance_electro_secondary_ammo; + self.electro_load = self.clip_load; + } + else + self.ammo_cells -= autocvar_g_balance_electro_secondary_ammo; + } + W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", CHAN_WEAPON, autocvar_g_balance_electro_secondary_damage); w_shotdir = v_forward; // no TrueAim for grenades please @@ -165,8 +239,6 @@ void W_Electro_Attack2() proj.projectiledeathtype = WEP_ELECTRO | HITTYPE_SECONDARY; setorigin(proj, w_shotorg); - if not(self.items & IT_UNLIMITED_WEAPON_AMMO) - self.ammo_cells = self.ammo_cells - autocvar_g_balance_electro_secondary_ammo; //proj.glow_size = 50; //proj.glow_color = 45; proj.movetype = MOVETYPE_BOUNCE; @@ -193,7 +265,7 @@ void W_Electro_Attack2() CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO, FALSE); // no culling, it has sound other = proj; MUTATOR_CALLHOOK(EditProjectile); - } +} .vector hook_start, hook_end; float lgbeam_send(entity to, float sf) @@ -224,6 +296,16 @@ float lgbeam_send(entity to, float sf) } .entity lgbeam; .float prevlgfire; +float lgbeam_checkammo() +{ + if(self.owner.items & IT_UNLIMITED_WEAPON_AMMO) + return TRUE; + else if(autocvar_g_balance_electro_reload_ammo) + return self.owner.clip_load > 0; + else + return self.owner.ammo_cells > 0; +} + void lgbeam_think() { self.owner.prevlgfire = time; @@ -232,7 +314,8 @@ void lgbeam_think() remove(self); return; } - if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK || self.owner.freezetag_frozen) + + if (self.owner.weaponentity.state != WS_INUSE || !lgbeam_checkammo() || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK || self.owner.freezetag_frozen) { if(self == self.owner.lgbeam) self.owner.lgbeam = world; @@ -246,12 +329,22 @@ void lgbeam_think() float dt, f; dt = frametime; + // if this weapon is reloadable, decrease its load. Else decrease the player's ammo if not(self.owner.items & IT_UNLIMITED_WEAPON_AMMO) { if(autocvar_g_balance_electro_primary_ammo) { - dt = min(dt, self.owner.ammo_cells / autocvar_g_balance_electro_primary_ammo); - self.owner.ammo_cells = max(0, self.owner.ammo_cells - autocvar_g_balance_electro_primary_ammo * frametime); + if(autocvar_g_balance_electro_reload_ammo) + { + dt = min(dt, self.owner.clip_load / autocvar_g_balance_electro_primary_ammo); + self.owner.clip_load = max(0, self.owner.clip_load - autocvar_g_balance_electro_primary_ammo * frametime); + self.owner.electro_load = self.owner.clip_load; + } + else + { + dt = min(dt, self.owner.ammo_cells / autocvar_g_balance_electro_primary_ammo); + self.owner.ammo_cells = max(0, self.owner.ammo_cells - autocvar_g_balance_electro_primary_ammo * frametime); + } } } @@ -376,7 +469,9 @@ float w_electro(float req) } else if (req == WR_THINK) { - if (self.BUTTON_ATCK) + if(autocvar_g_balance_electro_reload_ammo && self.clip_load < min(autocvar_g_balance_electro_primary_ammo, autocvar_g_balance_electro_secondary_ammo)) // forced reload + W_Electro_Reload(); + else if (self.BUTTON_ATCK) { if(autocvar_g_balance_electro_lightning) if(self.BUTTON_ATCK_prev) @@ -417,16 +512,18 @@ float w_electro(float req) } self.BUTTON_ATCK_prev = 0; } - } - if (self.BUTTON_ATCK2) - if (time >= self.electro_secondarytime) - if (weapon_prepareattack(1, autocvar_g_balance_electro_secondary_refire)) - { - W_Electro_Attack2(); - self.electro_count = autocvar_g_balance_electro_secondary_count; - weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_electro_secondary_animtime, w_electro_checkattack); - self.electro_secondarytime = time + autocvar_g_balance_electro_secondary_refire2 * W_WeaponRateFactor(); + if (self.BUTTON_ATCK2) + { + if (time >= self.electro_secondarytime) + if (weapon_prepareattack(1, autocvar_g_balance_electro_secondary_refire)) + { + W_Electro_Attack2(); + self.electro_count = autocvar_g_balance_electro_secondary_count; + weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_electro_secondary_animtime, w_electro_checkattack); + self.electro_secondarytime = time + autocvar_g_balance_electro_secondary_refire2 * W_WeaponRateFactor(); + } + } } } else if (req == WR_PRECACHE) @@ -439,26 +536,58 @@ float w_electro(float req) precache_sound ("weapons/electro_fire2.wav"); precache_sound ("weapons/electro_impact.wav"); precache_sound ("weapons/electro_impact_combo.wav"); + precache_sound ("weapons/reload.wav"); if(autocvar_g_balance_electro_lightning) { precache_sound ("weapons/lgbeam_fire.wav"); } } else if (req == WR_SETUP) + { weapon_setup(WEP_ELECTRO); + W_Electro_SetAmmoCounter(); + } else if (req == WR_CHECKAMMO1) { - if(autocvar_g_balance_electro_lightning) - return !autocvar_g_balance_electro_primary_ammo || (self.ammo_cells > 0); + if(autocvar_g_balance_electro_reload_ammo) + { + if(autocvar_g_balance_electro_lightning) + return !autocvar_g_balance_electro_primary_ammo || (self.electro_load > 0); + else + return self.electro_load >= autocvar_g_balance_electro_primary_ammo; + } else - return self.ammo_cells >= autocvar_g_balance_electro_primary_ammo; + { + if(autocvar_g_balance_electro_lightning) + return !autocvar_g_balance_electro_primary_ammo || (self.ammo_cells > 0); + else + return self.ammo_cells >= autocvar_g_balance_electro_primary_ammo; + } } else if (req == WR_CHECKAMMO2) - return self.ammo_cells >= autocvar_g_balance_electro_secondary_ammo; + { + if(autocvar_g_balance_electro_reload_ammo) + return self.electro_load >= autocvar_g_balance_electro_secondary_ammo; + else + return self.ammo_cells >= autocvar_g_balance_electro_secondary_ammo; + } else if (req == WR_RESETPLAYER) { self.electro_secondarytime = time; } + else if (req == WR_RELOAD) + { + W_Shotgun_Reload(); + } + else if (req == WR_SWITCHABLE) + { + // checks if this weapon can be switched to, when reloading is enabled + // returns true if there's either enough load in the weapon to use it, + // or we have enough ammo to reload the weapon to a usable point + float ammo_amount; + ammo_amount = min(autocvar_g_balance_electro_primary_ammo, autocvar_g_balance_electro_secondary_ammo); + return (autocvar_g_balance_electro_reload_ammo && self.electro_load >= ammo_amount) || self.ammo_cells >= ammo_amount; + } return TRUE; }; #endif