X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fw_laser.qc;h=abf1a39ef962d966bcd1b56482f14db7f38bbcbe;hb=7cda9265daa069578813e89281d4309afabb3460;hp=4d749d0ba1c36bdcdc792883cee07b0d1652cc0e;hpb=b98a829c6cc020f9e6e001222122b5cbe7418da0;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/w_laser.qc b/qcsrc/server/w_laser.qc index 4d749d0ba..abf1a39ef 100644 --- a/qcsrc/server/w_laser.qc +++ b/qcsrc/server/w_laser.qc @@ -1,6 +1,7 @@ #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) @@ -100,16 +101,133 @@ void W_Laser_Attack (float issecondary) } } -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) @@ -140,8 +258,8 @@ float w_laser(float req) 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); @@ -152,7 +270,10 @@ float w_laser(float req) { 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); } } @@ -177,6 +298,24 @@ float w_laser(float req) 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) @@ -184,5 +323,6 @@ float w_laser(float req) w_deathtypestring = "was lasered to death by"; // unchecked: SPLASH } return TRUE; -}; +} +#endif #endif