#ifdef REGISTER_WEAPON
REGISTER_WEAPON(LASER, w_laser, 0, 1, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, 0, "laser", "laser", "Laser");
#else
+#ifdef SVQC
void(float imp) W_SwitchWeapon;
void W_Laser_Touch (void)
}
}
-void W_Laser_Attack2 (void) // gauntlet
+.vector hook_start, hook_end;
+float gauntletbeam_send(entity to, float sf)
{
- W_SetupShot (self, TRUE, 0, "weapons/gauntlet_fire.wav", cvar("g_balance_laser_primary_damage"));
+ WriteByte(MSG_ENTITY, ENT_CLIENT_GAUNTLET);
+ sf = sf & 0x7F;
+ if(sound_allowed(MSG_BROADCAST, self.owner))
+ sf |= 0x80;
+ WriteByte(MSG_ENTITY, sf);
+ if(sf & 1)
+ {
+ WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+ }
+ 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 gauntletbeam;
+.float prevgauntletfire;
+void gauntletbeam_think()
+{
+ vector endpos;
+ float damage, myforce, myradius;
+ if(self.cnt)
+ {
+ damage = cvar("g_balance_laser_secondary_damage");
+ myforce = cvar("g_balance_laser_secondary_force");
+ myradius = cvar("g_balance_laser_secondary_radius");
+ }
+ else
+ {
+ damage = cvar("g_balance_laser_primary_damage");
+ myforce = cvar("g_balance_laser_primary_force");
+ myradius = cvar("g_balance_laser_primary_radius");
+ }
+
+ self.owner.prevgauntletfire = time;
+ if (self.owner.weaponentity.state != WS_INUSE || self != self.owner.gauntletbeam || self.owner.deadflag != DEAD_NO || (!self.owner.BUTTON_ATCK2 && self.cnt) || (!self.owner.BUTTON_ATCK && !self.cnt))
+ {
+ remove(self);
+ return;
+ }
+
+ self.nextthink = time;
+
+ makevectors(self.owner.v_angle);
+ vector angle;
+ angle = v_forward;
+ // get effect origin
+ vector vecs, org;
+ if(self.owner.weaponentity.movedir_x > 0)
+ vecs = self.owner.weaponentity.movedir;
+ else
+ vecs = '0 0 0';
+ if(debug_shotorg != '0 0 0')
+ vecs = debug_shotorg;
+ org = self.owner.origin + self.owner.view_ofs + v_forward * vecs_x + v_right * -vecs_y + v_up * vecs_z;
+
+ WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * myradius, FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+ endpos = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
+ WarpZone_traceline_antilag(self.owner, org, endpos, FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+
+ // apply the damage
+ if(trace_fraction < 1)
+ {
+ vector force;
+ force = angle * myforce;
+ Damage (trace_ent, self.owner, self.owner, damage * frametime, WEP_ELECTRO, trace_endpos, force * frametime);
+ }
+
+ // draw effect
+ if(org != self.hook_start)
+ {
+ self.SendFlags |= 2;
+ self.hook_start = org;
+ }
+ if(endpos != self.hook_end)
+ {
+ self.SendFlags |= 4;
+ self.hook_end = endpos;
+ }
+}
+
+// experimental gauntlet
+void W_Laser_Attack2 (float issecondary)
+{
+ // only play fire sound if 0.5 sec has passed since player let go the fire button
+ if(time - self.prevgauntletfire > 0.5)
+ {
+ sound (self, CHAN_WEAPON, "weapons/gauntlet_fire.wav", VOL_BASE, ATTN_NORM);
+ }
- WarpZone_traceline_antilag(self, w_shotorg, w_shotorg + w_shotdir * cvar("g_balance_laser_primary_radius"), FALSE, self, ANTILAG_LATENCY(self));
+ entity beam, oldself;
- pointparticles(particleeffectnum("laser_gauntlet"), w_shotorg + w_shotdir * cvar("g_balance_laser_primary_radius"), '0 0 0', 1);
+ self.gauntletbeam = beam = spawn();
+ beam.solid = SOLID_NOT;
+ beam.think = gauntletbeam_think;
+ beam.owner = self;
+ beam.movetype = MOVETYPE_NONE;
+ beam.shot_spread = 0;
+ beam.bot_dodge = TRUE;
+ beam.bot_dodgerating = cvar("g_balance_laser_primary_damage");
+ beam.cnt = issecondary;
+ Net_LinkEntity(beam, FALSE, 0, gauntletbeam_send);
- if (trace_fraction < 1)
- Damage(trace_ent, self, self, cvar("g_balance_laser_primary_damage"), WEP_LASER | HITTYPE_SECONDARY, trace_endpos, cvar("g_balance_laser_primary_force") * w_shotdir);
+ oldself = self;
+ self = beam;
+ self.think();
+ self = oldself;
+}
+
+void LaserInit()
+{
+ weapon_action(WEP_LASER, WR_PRECACHE);
+ gauntlet_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LASER), FALSE, FALSE, 1);
+ gauntlet_shotorigin[1] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LASER), FALSE, FALSE, 2);
+ gauntlet_shotorigin[2] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LASER), FALSE, FALSE, 3);
+ gauntlet_shotorigin[3] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LASER), FALSE, FALSE, 4);
}
void spawnfunc_weapon_laser (void)
if (self.BUTTON_ATCK)
if (weapon_prepareattack(0, cvar("g_balance_laser_primary_refire")))
{
- if(cvar("g_balance_laser_gauntlet"))
- W_Laser_Attack2();
+ if(cvar("g_balance_laser_primary_gauntlet"))
+ W_Laser_Attack2(0);
else
W_Laser_Attack(0);
weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_laser_primary_animtime"), w_ready);
{
if (weapon_prepareattack(0, cvar("g_balance_laser_secondary_refire")))
{
- W_Laser_Attack(1);
+ if(cvar("g_balance_laser_secondary_gauntlet"))
+ W_Laser_Attack2(1);
+ else
+ W_Laser_Attack(1);
weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_laser_secondary_animtime"), w_ready);
}
}
return TRUE;
else if (req == WR_CHECKAMMO2)
return TRUE;
+ return TRUE;
+};
+#endif
+#ifdef CSQC
+float w_laser(float req)
+{
+ if(req == WR_IMPACTEFFECT)
+ {
+ vector org2;
+ org2 = w_org + w_backoff * 6;
+ pointparticles(particleeffectnum("laser_impact"), org2, w_backoff * 1000, 1);
+ if(!w_issilent)
+ sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+ }
+ else if(req == WR_PRECACHE)
+ {
+ precache_sound("weapons/laserimpact.wav");
+ }
else if (req == WR_SUICIDEMESSAGE)
w_deathtypestring = "lasered themself to hell";
else if (req == WR_KILLMESSAGE)
w_deathtypestring = "was lasered to death by"; // unchecked: SPLASH
}
return TRUE;
-};
+}
+#endif
#endif