X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fw_electro.qc;h=711c44c8bf363a39bd8672e5c9908c6b2993f9db;hb=cd4733447ff43d2aa6141fb9b66f718f61d46fc5;hp=437d3f704b508641ea2a6a292afbc67ae51e4a96;hpb=bf1ac26cc82be1a865a51a2332c2692017fd8e9a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/w_electro.qc b/qcsrc/server/w_electro.qc index 437d3f704..711c44c8b 100644 --- a/qcsrc/server/w_electro.qc +++ b/qcsrc/server/w_electro.qc @@ -1,64 +1,10 @@ #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_FLAG_RELOADABLE | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "electro", "electro", _("Electro")); #else #ifdef SVQC .float electro_count; .float electro_secondarytime; -.float electro_load; - -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)) - 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) @@ -164,6 +110,8 @@ void W_Electro_Attack() { local entity proj; + W_DecreaseAmmo(ammo_cells, autocvar_g_balance_electro_primary_ammo, autocvar_g_balance_electro_reload_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); @@ -193,24 +141,14 @@ void W_Electro_Attack() CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO_BEAM, TRUE); other = proj; 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_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; - } } void W_Electro_Attack2() { local entity proj; + W_DecreaseAmmo(ammo_cells, autocvar_g_balance_electro_secondary_ammo, autocvar_g_balance_electro_reload_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 @@ -255,18 +193,6 @@ void W_Electro_Attack2() CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO, FALSE); // no culling, it has sound other = proj; 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_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; - } } .vector hook_start, hook_end; @@ -298,49 +224,64 @@ 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; - if (self != self.owner.lgbeam) + entity owner_player; + owner_player = self.owner; + + owner_player.prevlgfire = time; + if (self != owner_player.lgbeam) { 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 (owner_player.weaponentity.state != WS_INUSE || !lgbeam_checkammo() || owner_player.deadflag != DEAD_NO || !owner_player.BUTTON_ATCK || owner_player.freezetag_frozen) { - if(self == self.owner.lgbeam) - self.owner.lgbeam = world; + if(self == owner_player.lgbeam) + owner_player.lgbeam = world; remove(self); return; } self.nextthink = time; - makevectors(self.owner.v_angle); + makevectors(owner_player.v_angle); float dt, f; dt = frametime; - if not(self.owner.items & IT_UNLIMITED_WEAPON_AMMO) + + // if this weapon is reloadable, decrease its load. Else decrease the player's ammo + if not(owner_player.items & IT_UNLIMITED_WEAPON_AMMO) { - // if this weapon is reloadable, decrease its load. Else decrease the player's ammo if(autocvar_g_balance_electro_primary_ammo) { 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.electro_load = self.clip_load; + dt = min(dt, owner_player.clip_load / autocvar_g_balance_electro_primary_ammo); + owner_player.clip_load = max(0, owner_player.clip_load - autocvar_g_balance_electro_primary_ammo * frametime); + owner_player.weapon_load[WEP_ELECTRO] = owner_player.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); + dt = min(dt, owner_player.ammo_cells / autocvar_g_balance_electro_primary_ammo); + owner_player.ammo_cells = max(0, owner_player.ammo_cells - autocvar_g_balance_electro_primary_ammo * frametime); } } } - W_SetupShot_Range(self.owner, TRUE, 0, "", 0, autocvar_g_balance_electro_primary_damage * dt, autocvar_g_balance_electro_primary_range); - WarpZone_traceline_antilag(self.owner, w_shotorg, w_shotend, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner)); + W_SetupShot_Range(owner_player, TRUE, 0, "", 0, autocvar_g_balance_electro_primary_damage * dt, autocvar_g_balance_electro_primary_range); + WarpZone_traceline_antilag(owner_player, w_shotorg, w_shotend, MOVE_NORMAL, owner_player, ANTILAG_LATENCY(owner_player)); // apply the damage if(trace_ent) @@ -350,11 +291,11 @@ void lgbeam_think() f = ExponentialFalloff(autocvar_g_balance_electro_primary_falloff_mindist, autocvar_g_balance_electro_primary_falloff_maxdist, autocvar_g_balance_electro_primary_falloff_halflifedist, vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - w_shotorg)); - if(accuracy_isgooddamage(self.owner, trace_ent)) - accuracy_add(self.owner, WEP_ELECTRO, 0, autocvar_g_balance_electro_primary_damage * dt * f); - Damage (trace_ent, self.owner, self.owner, autocvar_g_balance_electro_primary_damage * dt * f, WEP_ELECTRO, trace_endpos, force * dt); + if(accuracy_isgooddamage(owner_player, trace_ent)) + accuracy_add(owner_player, WEP_ELECTRO, 0, autocvar_g_balance_electro_primary_damage * dt * f); + Damage (trace_ent, owner_player, owner_player, autocvar_g_balance_electro_primary_damage * dt * f, WEP_ELECTRO, trace_endpos, force * dt); } - W_Plasma_TriggerCombo(trace_endpos, autocvar_g_balance_electro_primary_comboradius, self.owner); + W_Plasma_TriggerCombo(trace_endpos, autocvar_g_balance_electro_primary_comboradius, owner_player); // draw effect if(w_shotorg != self.hook_start) @@ -428,6 +369,7 @@ void w_electro_checkattack() .float BUTTON_ATCK_prev; float w_electro(float req) { + float ammo_amount; if (req == WR_AIM) { self.BUTTON_ATCK=FALSE; @@ -460,9 +402,25 @@ float w_electro(float req) } else if (req == WR_THINK) { - 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_reload_ammo) // forced reload + { + if(autocvar_g_balance_electro_lightning) + { + if(self.clip_load > 0) + ammo_amount = 1; + } + else if(self.clip_load >= autocvar_g_balance_electro_primary_ammo) + ammo_amount = 1; + if(self.clip_load >= autocvar_g_balance_electro_secondary_ammo) + ammo_amount += 1; + + if(!ammo_amount) + { + weapon_action(self.weapon, WR_RELOAD); + return FALSE; + } + } + if (self.BUTTON_ATCK) { if(autocvar_g_balance_electro_lightning) if(self.BUTTON_ATCK_prev) @@ -516,18 +474,6 @@ float w_electro(float req) } } } - - if(self.wish_reload) - { - if(self.switchweapon == self.weapon) - { - if(self.weaponentity.state == WS_READY) - { - self.wish_reload = 0; - W_Electro_Reload(); - } - } - } } else if (req == WR_PRECACHE) { @@ -539,6 +485,7 @@ 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"); // until weapons have individual reload sounds, precache the reload sound somewhere else if(autocvar_g_balance_electro_lightning) { precache_sound ("weapons/lgbeam_fire.wav"); @@ -547,31 +494,30 @@ float w_electro(float req) else if (req == WR_SETUP) { weapon_setup(WEP_ELECTRO); - W_Electro_SetAmmoCounter(); + self.current_ammo = ammo_cells; } else if (req == WR_CHECKAMMO1) { - if(autocvar_g_balance_electro_reload_ammo) + if(autocvar_g_balance_electro_lightning) { - if(autocvar_g_balance_electro_lightning) - return !autocvar_g_balance_electro_primary_ammo || (self.electro_load > 0); + if(!autocvar_g_balance_electro_primary_ammo) + ammo_amount = 1; else - return self.electro_load >= autocvar_g_balance_electro_primary_ammo; + ammo_amount = self.ammo_cells > 0; + ammo_amount += self.weapon_load[WEP_ELECTRO] > 0; } else { - 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; + ammo_amount = self.ammo_cells >= autocvar_g_balance_electro_primary_ammo; + ammo_amount += self.weapon_load[WEP_ELECTRO] >= autocvar_g_balance_electro_primary_ammo; } + return ammo_amount; } else if (req == WR_CHECKAMMO2) { - 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; + ammo_amount = self.ammo_cells >= autocvar_g_balance_electro_secondary_ammo; + ammo_amount += self.weapon_load[WEP_ELECTRO] >= autocvar_g_balance_electro_secondary_ammo; + return ammo_amount; } else if (req == WR_RESETPLAYER) { @@ -579,7 +525,7 @@ float w_electro(float req) } else if (req == WR_RELOAD) { - W_Shotgun_Reload(); + W_Reload(min(autocvar_g_balance_electro_primary_ammo, autocvar_g_balance_electro_secondary_ammo), autocvar_g_balance_electro_reload_ammo, autocvar_g_balance_electro_reload_time, "weapons/reload.wav"); } return TRUE; }; @@ -622,27 +568,27 @@ float w_electro(float req) else if (req == WR_SUICIDEMESSAGE) { if(w_deathtype & HITTYPE_SECONDARY) - w_deathtypestring = "%s could not remember where they put plasma"; + w_deathtypestring = _("%s could not remember where they put plasma"); else - w_deathtypestring = "%s played with plasma"; + w_deathtypestring = _("%s played with plasma"); } else if (req == WR_KILLMESSAGE) { if(w_deathtype & HITTYPE_SECONDARY) { if(w_deathtype & HITTYPE_SPLASH) // unchecked: BOUNCE - w_deathtypestring = "%s just noticed %s's blue ball"; + w_deathtypestring = _("%s just noticed %s's blue ball"); else // unchecked: BOUNCE - w_deathtypestring = "%s got in touch with %s's blue ball"; + w_deathtypestring = _("%s got in touch with %s's blue ball"); } else { if(w_deathtype & HITTYPE_BOUNCE) // combo - w_deathtypestring = "%s felt the electrifying air of %s's combo"; + w_deathtypestring = _("%s felt the electrifying air of %s's combo"); else if(w_deathtype & HITTYPE_SPLASH) - w_deathtypestring = "%s got too close to %s's blue beam"; + w_deathtypestring = _("%s got too close to %s's blue beam"); else - w_deathtypestring = "%s was blasted by %s's blue beam"; + w_deathtypestring = _("%s was blasted by %s's blue beam"); } } return TRUE;