+.entity lgbeam, exteriorlgbeam;
+.float nextdamagethink;
+void lgbeam_think()
+{
+ if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self != self.owner.lgbeam || self.owner.BUTTON_ATCK == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ self.nextthink = time;
+
+ makevectors(self.owner.v_angle);
+ vector angle;
+ angle = v_forward;
+
+ vector force;
+ force = angle * cvar("g_balance_electro_primary_force");
+
+ traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * cvar("g_balance_electro_primary_range"), FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+
+ self.scale = vlen(self.owner.origin - trace_endpos) / 256 * (0.75 + 0.75 * random());
+}
+
+// execute each frame to update the beam visuals, but only apply damage at intervals of "refire" to prevent massive hitsound spam
+void exteriorlgbeam_think()
+{
+ if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self != self.owner.exteriorlgbeam || self.owner.BUTTON_ATCK == 0)
+ {
+ sound (self, CHAN_PROJECTILE, "sound/misc/null.wav", VOL_BASE, ATTN_NORM);
+ remove(self);
+ return;
+ }
+
+ if (time - self.shot_spread + random() * 0.2 > 0)
+ {
+ self.shot_spread = time + 2;
+ sound (self, CHAN_PROJECTILE, "turrets/phaser.wav", VOL_BASE, ATTN_NORM);
+ }
+
+ self.nextthink = time;
+
+ makevectors(self.owner.v_angle);
+ vector angle;
+ angle = v_forward;
+
+ traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * cvar("g_balance_electro_primary_range"), FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+
+ if(self.nextdamagethink <= time)
+ {
+ if not(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)
+ self.owner.ammo_cells = max(0, self.owner.ammo_cells - cvar("g_balance_electro_primary_ammo") * cvar("g_balance_electro_primary_refire"));
+
+ // apply the damage
+ if(trace_fraction < 1)
+ {
+ vector force;
+ force = angle * cvar("g_balance_electro_primary_force") + '0 0 1' * cvar("g_balance_electro_primary_force_up");
+ Damage (trace_ent, self.owner, self.owner, cvar("g_balance_electro_primary_damage") * cvar("g_balance_electro_primary_refire"), WEP_ELECTRO, trace_endpos, force * cvar("g_balance_electro_primary_refire"));
+ W_Plasma_TriggerCombo(trace_endpos, cvar("g_balance_electro_primary_comboradius"), self.owner);
+ }
+ self.nextdamagethink = time + cvar("g_balance_electro_primary_refire");
+ }
+
+ self.angles = '0 0 0';
+ self.scale = vlen(gettaginfo(self, 0) - trace_endpos) / 256 * (0.75 + 0.75 * random());
+
+ // v_forward, v_right, v_up now are the ACTUAL directions
+ // express self.angles in terms of them to aim at target!
+ self.angles = vectoangles('1 0 0' * (angle * v_forward) + '0 -1 0' * (angle * v_right) + '0 0 1' * (angle * v_up));
+}
+