X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fw_electro.qc;h=033890148567f3fd00545e62baa486ef37e19d16;hb=bb38e0642682c89b32d671fc4d417986943463d8;hp=bfd9ebec8885a3165e520dbd495e4b5e52c025a2;hpb=22ca27364dafcf350cc2ae0f0c27fe83f3b7d1bc;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/w_electro.qc b/qcsrc/common/weapons/w_electro.qc index bfd9ebec8..033890148 100644 --- a/qcsrc/common/weapons/w_electro.qc +++ b/qcsrc/common/weapons/w_electro.qc @@ -1,17 +1,23 @@ #ifdef REGISTER_WEAPON REGISTER_WEAPON( -/* WEP_##id */ ELECTRO, -/* function */ w_electro, -/* ammotype */ IT_CELLS, -/* impulse */ 5, -/* flags */ WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH, -/* rating */ BOT_PICKUP_RATING_MID, -/* model */ "electro", -/* shortname */ "electro", -/* fullname */ _("Electro") +/* WEP_##id */ ELECTRO, +/* function */ w_electro, +/* ammotype */ IT_CELLS, +/* impulse */ 5, +/* flags */ WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH, +/* rating */ BOT_PICKUP_RATING_MID, +/* model */ "electro", +/* netname */ "electro", +/* fullname */ _("Electro") ); + +#ifdef SVQC +var float autocvar_g_balance_electro_combo_comboradius_thruwall = 200; +#endif #else #ifdef SVQC +void spawnfunc_weapon_electro() { weapon_defaultspawnfunc(WEP_ELECTRO); } + .float electro_count; .float electro_secondarytime; @@ -20,17 +26,22 @@ void W_Plasma_Explode_Combo (void); void W_Plasma_TriggerCombo(vector org, float rad, entity own) { entity e; - e = WarpZone_FindRadius(org, rad, TRUE); + e = WarpZone_FindRadius(org, rad, !autocvar_g_balance_electro_combo_comboradius_thruwall); while (e) { if (e.classname == "plasma") { // change owner to whoever caused the combo explosion - e.realowner = own; - e.takedamage = DAMAGE_NO; - e.classname = "plasma_chain"; - e.think = W_Plasma_Explode_Combo; - e.nextthink = time + vlen(e.WarpZone_findradius_dist) / autocvar_g_balance_electro_combo_speed; // delay combo chains, looks cooler + WarpZone_TraceLine(org, e.origin, MOVE_NOMONSTERS, e); + + if((trace_fraction == 1) || (autocvar_g_balance_electro_combo_comboradius_thruwall >= vlen(e.WarpZone_findradius_dist))) + { + e.realowner = own; + e.takedamage = DAMAGE_NO; + e.classname = "plasma_chain"; + e.think = W_Plasma_Explode_Combo; + e.nextthink = time + vlen(e.WarpZone_findradius_dist) / autocvar_g_balance_electro_combo_speed; // delay combo chains, looks cooler + } } e = e.chain; } @@ -40,7 +51,7 @@ void W_Plasma_Explode (void) { if(other.takedamage == DAMAGE_AIM) if(IS_PLAYER(other)) - if(IsDifferentTeam(self.realowner, other)) + if(DIFF_TEAM(self.realowner, other)) if(other.deadflag == DEAD_NO) if(IsFlying(other)) Send_Notification(NOTIF_ONE, self.realowner, MSG_ANNCE, ANNCE_ACHIEVEMENT_ELECTROBITCH); @@ -49,7 +60,7 @@ void W_Plasma_Explode (void) self.takedamage = DAMAGE_NO; if (self.movetype == MOVETYPE_BOUNCE) { - RadiusDamage (self, self.realowner, autocvar_g_balance_electro_secondary_damage, autocvar_g_balance_electro_secondary_edgedamage, autocvar_g_balance_electro_secondary_radius, world, world, autocvar_g_balance_electro_secondary_force, self.projectiledeathtype, other); + RadiusDamage(self, self.realowner, autocvar_g_balance_electro_secondary_damage, autocvar_g_balance_electro_secondary_edgedamage, autocvar_g_balance_electro_secondary_radius, world, world, autocvar_g_balance_electro_secondary_force, self.projectiledeathtype, other); } else { @@ -79,7 +90,7 @@ void W_Plasma_Touch (void) W_Plasma_Explode (); } else { //UpdateCSQCProjectile(self); - spamsound (self, CH_SHOTS, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM); + spamsound (self, CH_SHOTS, "weapons/electro_bounce.wav", VOL_BASE, ATTEN_NORM); self.projectiledeathtype |= HITTYPE_BOUNCE; } } @@ -97,10 +108,10 @@ void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float dea // note: combos are usually triggered by W_Plasma_TriggerCombo, not damage float is_combo = (inflictor.classname == "plasma_chain" || inflictor.classname == "plasma_prim"); - + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, (is_combo ? 1 : -1))) - return; // g_projectiles_damage says to halt - + return; // g_projectiles_damage says to halt + self.health = self.health - damage; if (self.health <= 0) { @@ -212,167 +223,6 @@ void W_Electro_Attack2() other = proj; MUTATOR_CALLHOOK(EditProjectile); } -.vector hook_start, hook_end; -float lgbeam_send(entity to, float sf) -{ - WriteByte(MSG_ENTITY, ENT_CLIENT_ELECTRO_BEAM); - sf = sf & 0x7F; - if(sound_allowed(MSG_BROADCAST, self.realowner)) - sf |= 0x80; - WriteByte(MSG_ENTITY, sf); - if(sf & 1) - { - WriteByte(MSG_ENTITY, num_for_edict(self.realowner)); - WriteCoord(MSG_ENTITY, autocvar_g_balance_electro_primary_range); - } - if(sf & 2) - { - WriteCoord(MSG_ENTITY, self.hook_start_x); - WriteCoord(MSG_ENTITY, self.hook_start_y); - WriteCoord(MSG_ENTITY, self.hook_start_z); - } - if(sf & 4) - { - WriteCoord(MSG_ENTITY, self.hook_end_x); - WriteCoord(MSG_ENTITY, self.hook_end_y); - WriteCoord(MSG_ENTITY, self.hook_end_z); - } - return TRUE; -} -.entity lgbeam; -.float prevlgfire; -float lgbeam_checkammo() -{ - if(self.realowner.items & IT_UNLIMITED_WEAPON_AMMO) - return TRUE; - else if(autocvar_g_balance_electro_reload_ammo) - return self.realowner.clip_load > 0; - else - return self.realowner.ammo_cells > 0; -} - -entity lgbeam_owner_ent; -void lgbeam_think() -{ - entity owner_player; - owner_player = self.realowner; - - owner_player.prevlgfire = time; - if (self != owner_player.lgbeam) - { - remove(self); - return; - } - - if (owner_player.weaponentity.state != WS_INUSE || !lgbeam_checkammo() || owner_player.deadflag != DEAD_NO || !owner_player.BUTTON_ATCK || owner_player.freezetag_frozen) - { - if(self == owner_player.lgbeam) - owner_player.lgbeam = world; - remove(self); - return; - } - - self.nextthink = time; - - makevectors(owner_player.v_angle); - - float dt, f; - dt = frametime; - - // if this weapon is reloadable, decrease its load. Else decrease the player's ammo - if not(owner_player.items & IT_UNLIMITED_WEAPON_AMMO) - { - if(autocvar_g_balance_electro_primary_ammo) - { - if(autocvar_g_balance_electro_reload_ammo) - { - 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, 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(owner_player, TRUE, 0, "", 0, autocvar_g_balance_electro_primary_damage * dt, autocvar_g_balance_electro_primary_range); - if(!lgbeam_owner_ent) - { - lgbeam_owner_ent = spawn(); - lgbeam_owner_ent.classname = "lgbeam_owner_ent"; - } - WarpZone_traceline_antilag(lgbeam_owner_ent, w_shotorg, w_shotend, MOVE_NORMAL, lgbeam_owner_ent, ANTILAG_LATENCY(owner_player)); - - // apply the damage - if(trace_ent) - { - vector force; - force = w_shotdir * autocvar_g_balance_electro_primary_force + '0 0 1' * autocvar_g_balance_electro_primary_force_up; - - 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(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, owner_player); - - // draw effect - if(w_shotorg != self.hook_start) - { - self.SendFlags |= 2; - self.hook_start = w_shotorg; - } - if(w_shotend != self.hook_end) - { - self.SendFlags |= 4; - self.hook_end = w_shotend; - } -} - -// experimental lightning gun -void W_Electro_Attack3 (void) -{ - // only play fire sound if 0.5 sec has passed since player let go the fire button - if(time - self.prevlgfire > 0.5) - sound (self, CH_WEAPON_A, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM); - - entity beam, oldself; - - self.lgbeam = beam = spawn(); - beam.classname = "lgbeam"; - beam.solid = SOLID_NOT; - beam.think = lgbeam_think; - beam.owner = beam.realowner = self; - beam.movetype = MOVETYPE_NONE; - beam.shot_spread = 0; - beam.bot_dodge = TRUE; - beam.bot_dodgerating = autocvar_g_balance_electro_primary_damage; - Net_LinkEntity(beam, FALSE, 0, lgbeam_send); - - oldself = self; - self = beam; - self.think(); - self = oldself; -} - -void ElectroInit() -{ - weapon_action(WEP_ELECTRO, WR_PRECACHE); - electro_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_ELECTRO), FALSE, FALSE, 1); - electro_shotorigin[1] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_ELECTRO), FALSE, FALSE, 2); - electro_shotorigin[2] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_ELECTRO), FALSE, FALSE, 3); - electro_shotorigin[3] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_ELECTRO), FALSE, FALSE, 4); -} - -void spawnfunc_weapon_electro (void) -{ - weapon_defaultspawnfunc(WEP_ELECTRO); -} - void w_electro_checkattack() { if(self.electro_count > 1) @@ -389,99 +239,70 @@ void w_electro_checkattack() } .float bot_secondary_electromooth; -.float BUTTON_ATCK_prev; float w_electro(float req) { float ammo_amount; - if (req == WR_AIM) + switch(req) { - self.BUTTON_ATCK=FALSE; - self.BUTTON_ATCK2=FALSE; - if(vlen(self.origin-self.enemy.origin) > 1000) - self.bot_secondary_electromooth = 0; - if(self.bot_secondary_electromooth == 0) + case WR_AIM: { - float shoot; + self.BUTTON_ATCK=FALSE; + self.BUTTON_ATCK2=FALSE; + if(vlen(self.origin-self.enemy.origin) > 1000) + self.bot_secondary_electromooth = 0; + if(self.bot_secondary_electromooth == 0) + { + float shoot; - if(autocvar_g_balance_electro_primary_speed) - shoot = bot_aim(autocvar_g_balance_electro_primary_speed, 0, autocvar_g_balance_electro_primary_lifetime, FALSE); - else - shoot = bot_aim(1000000, 0, 0.001, FALSE); + if(autocvar_g_balance_electro_primary_speed) + shoot = bot_aim(autocvar_g_balance_electro_primary_speed, 0, autocvar_g_balance_electro_primary_lifetime, FALSE); + else + shoot = bot_aim(1000000, 0, 0.001, FALSE); - if(shoot) - { - self.BUTTON_ATCK = TRUE; - if(random() < 0.01) self.bot_secondary_electromooth = 1; + if(shoot) + { + self.BUTTON_ATCK = TRUE; + if(random() < 0.01) self.bot_secondary_electromooth = 1; + } } - } - else - { - if(bot_aim(autocvar_g_balance_electro_secondary_speed, autocvar_g_balance_grenadelauncher_secondary_speed_up, autocvar_g_balance_electro_secondary_lifetime, TRUE)) + else { - self.BUTTON_ATCK2 = TRUE; - if(random() < 0.03) self.bot_secondary_electromooth = 0; + if(bot_aim(autocvar_g_balance_electro_secondary_speed, autocvar_g_balance_mortar_secondary_speed_up, autocvar_g_balance_electro_secondary_lifetime, TRUE)) // WHAT THE ACTUAL FUUUUUUUUUCK?!?!? WEAPONTODO + { + self.BUTTON_ATCK2 = TRUE; + if(random() < 0.03) self.bot_secondary_electromooth = 0; + } } + + return TRUE; } - } - else if (req == WR_THINK) - { - if(autocvar_g_balance_electro_reload_ammo) // forced reload + case WR_THINK: { - ammo_amount = 0; - if(autocvar_g_balance_electro_lightning) + if(autocvar_g_balance_electro_reload_ammo) // forced reload { - if(self.clip_load > 0) + ammo_amount = 0; + if(self.clip_load >= autocvar_g_balance_electro_primary_ammo) 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(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) - weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_electro_primary_animtime, w_ready); - - if (weapon_prepareattack(0, (autocvar_g_balance_electro_lightning ? 0 : autocvar_g_balance_electro_primary_refire))) - { - if(autocvar_g_balance_electro_lightning) - { - if ((!self.lgbeam) || wasfreed(self.lgbeam)) - { - W_Electro_Attack3(); - } - if(!self.BUTTON_ATCK_prev) - { - weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_electro_primary_animtime, w_ready); - self.BUTTON_ATCK_prev = 1; - } - } - else + if(!ammo_amount) { - W_Electro_Attack(); - weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_electro_primary_animtime, w_ready); + WEP_ACTION(self.weapon, WR_RELOAD); + return FALSE; } + + return TRUE; } - } else { - if(autocvar_g_balance_electro_lightning) + if (self.BUTTON_ATCK) { - if (self.BUTTON_ATCK_prev != 0) + if(weapon_prepareattack(0, autocvar_g_balance_electro_primary_refire)) { - weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_electro_primary_animtime, w_ready); - ATTACK_FINISHED(self) = time + autocvar_g_balance_electro_primary_refire * W_WeaponRateFactor(); + W_Electro_Attack(); + weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_electro_primary_animtime, w_ready); } - self.BUTTON_ATCK_prev = 0; } - - if (self.BUTTON_ATCK2) + else if(self.BUTTON_ATCK2) { if (time >= self.electro_secondarytime) if (weapon_prepareattack(1, autocvar_g_balance_electro_secondary_refire)) @@ -492,87 +313,76 @@ float w_electro(float req) self.electro_secondarytime = time + autocvar_g_balance_electro_secondary_refire2 * W_WeaponRateFactor(); } } + + return TRUE; } - } - else if (req == WR_PRECACHE) - { - precache_model ("models/weapons/g_electro.md3"); - precache_model ("models/weapons/v_electro.md3"); - precache_model ("models/weapons/h_electro.iqm"); - precache_sound ("weapons/electro_bounce.wav"); - precache_sound ("weapons/electro_fire.wav"); - 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) + case WR_INIT: { - precache_sound ("weapons/lgbeam_fire.wav"); + precache_model ("models/weapons/g_electro.md3"); + precache_model ("models/weapons/v_electro.md3"); + precache_model ("models/weapons/h_electro.iqm"); + precache_sound ("weapons/electro_bounce.wav"); + precache_sound ("weapons/electro_fire.wav"); + precache_sound ("weapons/electro_fire2.wav"); + precache_sound ("weapons/electro_impact.wav"); + precache_sound ("weapons/electro_impact_combo.wav"); + return TRUE; } - } - else if (req == WR_SETUP) - { - weapon_setup(WEP_ELECTRO); - self.current_ammo = ammo_cells; - } - else if (req == WR_CHECKAMMO1) - { - if(autocvar_g_balance_electro_lightning) + case WR_SETUP: { - if(!autocvar_g_balance_electro_primary_ammo) - ammo_amount = 1; - else - ammo_amount = self.ammo_cells > 0; - ammo_amount += self.(weapon_load[WEP_ELECTRO]) > 0; + self.current_ammo = ammo_cells; + return TRUE; } - else + case WR_CHECKAMMO1: { 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; } - return ammo_amount; - } - else if (req == WR_CHECKAMMO2) - { - if(autocvar_g_balance_electro_combo_safeammocheck) // true if you can fire at least one secondary blob AND one primary shot after it, otherwise false. + case WR_CHECKAMMO2: { - ammo_amount = self.ammo_cells >= autocvar_g_balance_electro_secondary_ammo + autocvar_g_balance_electro_primary_ammo; - ammo_amount += self.(weapon_load[WEP_ELECTRO]) >= autocvar_g_balance_electro_secondary_ammo + autocvar_g_balance_electro_primary_ammo; + if(autocvar_g_balance_electro_combo_safeammocheck) // true if you can fire at least one secondary blob AND one primary shot after it, otherwise false. + { + ammo_amount = self.ammo_cells >= autocvar_g_balance_electro_secondary_ammo + autocvar_g_balance_electro_primary_ammo; + ammo_amount += self.(weapon_load[WEP_ELECTRO]) >= autocvar_g_balance_electro_secondary_ammo + autocvar_g_balance_electro_primary_ammo; + } + else + { + 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 + case WR_RESETPLAYER: { - ammo_amount = self.ammo_cells >= autocvar_g_balance_electro_secondary_ammo; - ammo_amount += self.(weapon_load[WEP_ELECTRO]) >= autocvar_g_balance_electro_secondary_ammo; + self.electro_secondarytime = time; + return TRUE; } - return ammo_amount; - } - else if (req == WR_RESETPLAYER) - { - self.electro_secondarytime = time; - } - else if (req == WR_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"); - } - else if (req == WR_SUICIDEMESSAGE) - { - if(w_deathtype & HITTYPE_SECONDARY) - return WEAPON_ELECTRO_SUICIDE_ORBS; - else - return WEAPON_ELECTRO_SUICIDE_BOLT; - } - else if (req == WR_KILLMESSAGE) - { - if(w_deathtype & HITTYPE_SECONDARY) + case WR_RELOAD: { - return WEAPON_ELECTRO_MURDER_ORBS; + W_Reload(min(autocvar_g_balance_electro_primary_ammo, autocvar_g_balance_electro_secondary_ammo), "weapons/reload.wav"); + return TRUE; } - else + case WR_SUICIDEMESSAGE: { - if(w_deathtype & HITTYPE_BOUNCE) - return WEAPON_ELECTRO_MURDER_COMBO; + if(w_deathtype & HITTYPE_SECONDARY) + return WEAPON_ELECTRO_SUICIDE_ORBS; else - return WEAPON_ELECTRO_MURDER_BOLT; + return WEAPON_ELECTRO_SUICIDE_BOLT; + } + case WR_KILLMESSAGE: + { + if(w_deathtype & HITTYPE_SECONDARY) + { + return WEAPON_ELECTRO_MURDER_ORBS; + } + else + { + if(w_deathtype & HITTYPE_BOUNCE) + return WEAPON_ELECTRO_MURDER_COMBO; + else + return WEAPON_ELECTRO_MURDER_BOLT; + } } } return TRUE; @@ -581,37 +391,43 @@ float w_electro(float req) #ifdef CSQC float w_electro(float req) { - if(req == WR_IMPACTEFFECT) + switch(req) { - vector org2; - org2 = w_org + w_backoff * 6; - if(w_deathtype & HITTYPE_SECONDARY) + case WR_IMPACTEFFECT: { - pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1); - if(!w_issilent) - sound(self, CH_SHOTS, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); - } - else - { - if(w_deathtype & HITTYPE_BOUNCE) + vector org2; + org2 = w_org + w_backoff * 6; + if(w_deathtype & HITTYPE_SECONDARY) { - // this is sent as "primary (w_deathtype & HITTYPE_BOUNCE)" to distinguish it from (w_deathtype & HITTYPE_SECONDARY) bounced balls - pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1); + pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1); if(!w_issilent) - sound(self, CH_SHOTS, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM); + sound(self, CH_SHOTS, "weapons/electro_impact.wav", VOL_BASE, ATTEN_NORM); } else { - pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1); - if(!w_issilent) - sound(self, CH_SHOTS, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); + if(w_deathtype & HITTYPE_BOUNCE) + { + // this is sent as "primary (w_deathtype & HITTYPE_BOUNCE)" to distinguish it from (w_deathtype & HITTYPE_SECONDARY) bounced balls + pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CH_SHOTS, "weapons/electro_impact_combo.wav", VOL_BASE, ATTEN_NORM); + } + else + { + pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1); + if(!w_issilent) + sound(self, CH_SHOTS, "weapons/electro_impact.wav", VOL_BASE, ATTEN_NORM); + } } + + return TRUE; + } + case WR_INIT: + { + precache_sound("weapons/electro_impact.wav"); + precache_sound("weapons/electro_impact_combo.wav"); + return TRUE; } - } - else if(req == WR_PRECACHE) - { - precache_sound("weapons/electro_impact.wav"); - precache_sound("weapons/electro_impact_combo.wav"); } return TRUE; }