From: Rudolf Polzer Date: Sat, 25 Jun 2011 10:50:10 +0000 (+0200) Subject: EXPERIMENTAL change: make projectiles able to hit yourself when shot through a warpzone X-Git-Tag: xonotic-v0.5.0~173^2~1 X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=43528747368b3c2395edc28dc9298059a5542e40 EXPERIMENTAL change: make projectiles able to hit yourself when shot through a warpzone --- diff --git a/qcsrc/server/g_hook.qc b/qcsrc/server/g_hook.qc index b7291dee3f..f03f78473f 100644 --- a/qcsrc/server/g_hook.qc +++ b/qcsrc/server/g_hook.qc @@ -82,12 +82,12 @@ float GrapplingHookSend(entity to, float sf) { WriteByte(MSG_ENTITY, ENT_CLIENT_HOOK); sf = sf & 0x7F; - if(sound_allowed(MSG_BROADCAST, self.owner)) + if(sound_allowed(MSG_BROADCAST, self.realowner)) sf |= 0x80; WriteByte(MSG_ENTITY, sf); if(sf & 1) { - WriteByte(MSG_ENTITY, num_for_edict(self.owner)); + WriteByte(MSG_ENTITY, num_for_edict(self.realowner)); } if(sf & 2) { @@ -108,14 +108,14 @@ void GrapplingHookThink() { float spd, dist, minlength, pullspeed, ropestretch, ropeairfriction, rubberforce, newlength, rubberforce_overstretch, s; vector dir, org, end, v0, dv, v, myorg, vs; - if(self.owner.health <= 0 || self.owner.hook != self) // how did that happen? + if(self.realowner.health <= 0 || self.realowner.hook != self) // how did that happen? { // well, better fix it anyway remove(self); return; } if(LostMovetypeFollow(self)) { - RemoveGrapplingHook(self.owner); + RemoveGrapplingHook(self.realowner); return; } if(self.aiment) @@ -123,15 +123,15 @@ void GrapplingHookThink() self.nextthink = time; - s = self.owner.cvar_cl_gunalign; + s = self.realowner.cvar_cl_gunalign; if(s != 1 && s != 2 && s != 4) s = 3; // default value --s; vs = hook_shotorigin[s]; - makevectors(self.owner.v_angle); - org = self.owner.origin + self.owner.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z; - myorg = WarpZone_RefSys_TransformOrigin(self.owner, self, org); + makevectors(self.realowner.v_angle); + org = self.realowner.origin + self.realowner.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z; + myorg = WarpZone_RefSys_TransformOrigin(self.realowner, self, org); if(self.hook_length < 0) self.hook_length = vlen(myorg - self.origin); @@ -165,10 +165,10 @@ void GrapplingHookThink() if(autocvar_g_grappling_hook_tarzan) { - v = v0 = WarpZone_RefSys_TransformVelocity(self.owner, self, self.owner.velocity); + v = v0 = WarpZone_RefSys_TransformVelocity(self.realowner, self, self.realowner.velocity); // first pull the rope... - if(self.owner.hook_state & HOOK_PULLING) + if(self.realowner.hook_state & HOOK_PULLING) { newlength = self.hook_length; newlength = max(newlength - pullspeed * frametime, minlength); @@ -183,7 +183,7 @@ void GrapplingHookThink() self.hook_length = newlength; } - if(self.owner.hook_state & HOOK_RELEASING) + if(self.realowner.hook_state & HOOK_RELEASING) { newlength = dist; self.hook_length = newlength; @@ -203,15 +203,15 @@ void GrapplingHookThink() v = v - dv * 0.5; self.aiment.velocity = self.aiment.velocity - dv * 0.5; self.aiment.flags &~= FL_ONGROUND; - self.aiment.pusher = self.owner; + self.aiment.pusher = self.realowner; self.aiment.pushltime = time + autocvar_g_maxpushtime; } } - self.owner.flags &~= FL_ONGROUND; + self.realowner.flags &~= FL_ONGROUND; } - self.owner.velocity = WarpZone_RefSys_TransformVelocity(self, self.owner, v); + self.realowner.velocity = WarpZone_RefSys_TransformVelocity(self, self.realowner, v); } else { @@ -223,15 +223,15 @@ void GrapplingHookThink() spd = pullspeed; if(spd < 50) spd = 0; - self.owner.velocity = dir*spd; - self.owner.movetype = MOVETYPE_FLY; + self.realowner.velocity = dir*spd; + self.realowner.movetype = MOVETYPE_FLY; - self.owner.flags &~= FL_ONGROUND; + self.realowner.flags &~= FL_ONGROUND; } } makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0'); - myorg = WarpZone_RefSys_TransformOrigin(self, self.owner, self.origin); // + v_forward * (-9); + myorg = WarpZone_RefSys_TransformOrigin(self, self.realowner, self.origin); // + v_forward * (-9); if(myorg != self.hook_start) { @@ -251,7 +251,7 @@ void GrapplingHookTouch (void) return; if(SUB_NoImpactCheck()) { - RemoveGrapplingHook(self.owner); + RemoveGrapplingHook(self.realowner); return; } PROJECTILE_TOUCH; @@ -265,7 +265,7 @@ void GrapplingHookTouch (void) WarpZone_RefSys_BeginAddingIncrementally(self, self.aiment); } - //self.owner.disableclientprediction = TRUE; + //self.realowner.disableclientprediction = TRUE; } void GrapplingHook_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) @@ -275,12 +275,12 @@ void GrapplingHook_Damage (entity inflictor, entity attacker, float damage, floa self.health = self.health - damage; if (self.health <= 0) { - if(attacker != self.owner) + if(attacker != self.realowner) { - self.owner.pusher = attacker; - self.owner.pushltime = time + autocvar_g_maxpushtime; + self.realowner.pusher = attacker; + self.realowner.pushltime = time + autocvar_g_maxpushtime; } - RemoveGrapplingHook(self.owner); + RemoveGrapplingHook(self.realowner); } } } @@ -316,7 +316,7 @@ void FireGrapplingHook (void) pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1); missile = WarpZone_RefSys_SpawnSameRefSys(self); - missile.owner = self; + missile.owner = missile.realowner = self; self.hook = missile; missile.classname = "grapplinghook"; diff --git a/qcsrc/server/t_teleporters.qc b/qcsrc/server/t_teleporters.qc index fbb8032942..a2836264de 100644 --- a/qcsrc/server/t_teleporters.qc +++ b/qcsrc/server/t_teleporters.qc @@ -304,6 +304,9 @@ void spawnfunc_trigger_teleport (void) void WarpZone_PostTeleportPlayer_Callback(entity pl) { UpdateCSQCProjectileAfterTeleport(pl); + // "disown" projectiles after teleport + if(pl.owner == pl.realowner) + pl.owner = world; if(pl.classname == "player") { // reset tracking of oldvelocity for impact damage (sudden velocity changes) diff --git a/qcsrc/server/w_common.qc b/qcsrc/server/w_common.qc index 30cfa7bebf..3816594a97 100644 --- a/qcsrc/server/w_common.qc +++ b/qcsrc/server/w_common.qc @@ -30,6 +30,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f local entity ent, endent; local float endq3surfaceflags; float totaldmg; + entity o; float length; vector beampos; @@ -52,12 +53,18 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f // trace multiple times until we hit a wall, each obstacle will be made // non-solid so we can hit the next, while doing this we spawn effects and // note down which entities were hit so we can damage them later + o = self; while (1) { if(self.antilag_debug) - WarpZone_traceline_antilag (self, start, end, FALSE, self, self.antilag_debug); + WarpZone_traceline_antilag (self, start, end, FALSE, o, self.antilag_debug); else - WarpZone_traceline_antilag (self, start, end, FALSE, self, ANTILAG_LATENCY(self)); + WarpZone_traceline_antilag (self, start, end, FALSE, o, ANTILAG_LATENCY(self)); + if(o && WarpZone_trace_firstzone) + { + o = world; + continue; + } // if it is world we can't hurt it so stop now if (trace_ent == world || trace_fraction == 1) @@ -127,7 +134,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f f = ExponentialFalloff(mindist, maxdist, halflifedist, ent.railgundistance); ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, ent.railgundistance); - if(accuracy_isgooddamage(self.owner, ent)) + if(accuracy_isgooddamage(self.realowner, ent)) totaldmg += bdamage * f; // apply the damage @@ -178,8 +185,8 @@ void W_BallisticBullet_Hit (void) damage_headshotbonus = self.dmg_edge * f; railgun_start = self.origin - 2 * frametime * self.velocity; railgun_end = self.origin + 2 * frametime * self.velocity; - g = accuracy_isgooddamage(self.owner, other); - Damage(other, self, self.owner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f); + g = accuracy_isgooddamage(self.realowner, other); + Damage(other, self, self.realowner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f); damage_headshotbonus = 0; if(headshot) @@ -187,9 +194,9 @@ void W_BallisticBullet_Hit (void) if(self.dmg_edge > 0) { if(headshot) - AnnounceTo(self.owner, "headshot"); + AnnounceTo(self.realowner, "headshot"); if(yoda) - AnnounceTo(self.owner, "awesome"); + AnnounceTo(self.realowner, "awesome"); } // calculate hits for ballistic weapons @@ -198,7 +205,7 @@ void W_BallisticBullet_Hit (void) // do not exceed 100% q = min(self.dmg * q, self.dmg_total + f * self.dmg) - self.dmg_total; self.dmg_total += f * self.dmg; - accuracy_add(self.owner, self.owner.weapon, 0, q); + accuracy_add(self.realowner, self.realowner.weapon, 0, q); } } @@ -359,7 +366,7 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f entity proj; proj = spawn(); proj.classname = "bullet"; - proj.owner = self; + proj.owner = proj.realowner = self; PROJECTILE_MAKETRIGGER(proj); if(gravityfactor > 0) { @@ -431,7 +438,16 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f trace_fraction = 0; fireBallisticBullet_trace_callback_ent = self; fireBallisticBullet_trace_callback_eff = eff; - WarpZone_TraceToss_ThroughZone(self, oldself, world, fireBallisticBullet_trace_callback); + // FIXME can we somehow do this with just ONE trace? + WarpZone_TraceToss(self, self.owner); + if(self.owner && WarpZone_trace_firstzone) + { + self.owner = world; + self.velocity = v0; + self.gravity = g0; + continue; + } + WarpZone_TraceToss_ThroughZone(self, self.owner, world, fireBallisticBullet_trace_callback); self.velocity = v0; self.gravity = g0; diff --git a/qcsrc/server/w_electro.qc b/qcsrc/server/w_electro.qc index 711c44c8bf..bf81e8c1e3 100644 --- a/qcsrc/server/w_electro.qc +++ b/qcsrc/server/w_electro.qc @@ -16,7 +16,7 @@ void W_Plasma_TriggerCombo(vector org, float rad, entity own) if (e.classname == "plasma") { // change owner to whoever caused the combo explosion - e.owner = own; + e.realowner = own; e.takedamage = DAMAGE_NO; e.classname = "plasma_chain"; e.think = W_Plasma_Explode_Combo; @@ -30,21 +30,21 @@ void W_Plasma_Explode (void) { if(other.takedamage == DAMAGE_AIM) if(other.classname == "player") - if(IsDifferentTeam(self.owner, other)) + if(IsDifferentTeam(self.realowner, other)) if(other.deadflag == DEAD_NO) if(IsFlying(other)) - AnnounceTo(self.owner, "electrobitch"); + AnnounceTo(self.realowner, "electrobitch"); self.event_damage = SUB_Null; self.takedamage = DAMAGE_NO; if (self.movetype == MOVETYPE_BOUNCE) { - RadiusDamage (self, self.owner, autocvar_g_balance_electro_secondary_damage, autocvar_g_balance_electro_secondary_edgedamage, autocvar_g_balance_electro_secondary_radius, 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, autocvar_g_balance_electro_secondary_force, self.projectiledeathtype, other); } else { - W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_primary_comboradius, self.owner); - RadiusDamage (self, self.owner, autocvar_g_balance_electro_primary_damage, autocvar_g_balance_electro_primary_edgedamage, autocvar_g_balance_electro_primary_radius, world, autocvar_g_balance_electro_primary_force, self.projectiledeathtype, other); + W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_primary_comboradius, self.realowner); + RadiusDamage (self, self.realowner, autocvar_g_balance_electro_primary_damage, autocvar_g_balance_electro_primary_edgedamage, autocvar_g_balance_electro_primary_radius, world, autocvar_g_balance_electro_primary_force, self.projectiledeathtype, other); } remove (self); @@ -52,10 +52,10 @@ void W_Plasma_Explode (void) void W_Plasma_Explode_Combo (void) { - W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_combo_comboradius, self.owner); + W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_combo_comboradius, self.realowner); self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, autocvar_g_balance_electro_combo_damage, autocvar_g_balance_electro_combo_edgedamage, autocvar_g_balance_electro_combo_radius, world, autocvar_g_balance_electro_combo_force, WEP_ELECTRO | HITTYPE_BOUNCE, world); // use THIS type for a combo because primary can't bounce + RadiusDamage (self, self.realowner, autocvar_g_balance_electro_combo_damage, autocvar_g_balance_electro_combo_edgedamage, autocvar_g_balance_electro_combo_radius, world, autocvar_g_balance_electro_combo_force, WEP_ELECTRO | HITTYPE_BOUNCE, world); // use THIS type for a combo because primary can't bounce remove (self); } @@ -92,7 +92,7 @@ void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float dea if (inflictor.classname == "plasma_chain" || inflictor.classname == "plasma_prim") { // change owner to whoever caused the combo explosion - self.owner = inflictor.owner; + self.realowner = inflictor.realowner; self.classname = "plasma_chain"; self.think = W_Plasma_Explode_Combo; self.nextthink = time + min(autocvar_g_balance_electro_combo_radius, vlen(self.origin - inflictor.origin)) / autocvar_g_balance_electro_combo_speed; // delay combo chains, looks cooler @@ -118,7 +118,7 @@ void W_Electro_Attack() proj = spawn (); proj.classname = "plasma_prim"; - proj.owner = self; + proj.owner = proj.realowner = self; proj.bot_dodge = TRUE; proj.bot_dodgerating = autocvar_g_balance_electro_primary_damage; proj.use = W_Plasma_Explode; @@ -157,7 +157,7 @@ void W_Electro_Attack2() proj = spawn (); proj.classname = "plasma"; - proj.owner = self; + proj.owner = proj.realowner = self; proj.use = W_Plasma_Explode; proj.think = adaptor_think2use_hittype_splash; proj.bot_dodge = TRUE; @@ -200,12 +200,12 @@ float lgbeam_send(entity to, float sf) { WriteByte(MSG_ENTITY, ENT_CLIENT_LGBEAM); sf = sf & 0x7F; - if(sound_allowed(MSG_BROADCAST, self.owner)) + if(sound_allowed(MSG_BROADCAST, self.realowner)) sf |= 0x80; WriteByte(MSG_ENTITY, sf); if(sf & 1) { - WriteByte(MSG_ENTITY, num_for_edict(self.owner)); + WriteByte(MSG_ENTITY, num_for_edict(self.realowner)); WriteCoord(MSG_ENTITY, autocvar_g_balance_electro_primary_range); } if(sf & 2) @@ -226,18 +226,19 @@ float lgbeam_send(entity to, float sf) .float prevlgfire; float lgbeam_checkammo() { - if(self.owner.items & IT_UNLIMITED_WEAPON_AMMO) + if(self.realowner.items & IT_UNLIMITED_WEAPON_AMMO) return TRUE; else if(autocvar_g_balance_electro_reload_ammo) - return self.owner.clip_load > 0; + return self.realowner.clip_load > 0; else - return self.owner.ammo_cells > 0; + return self.realowner.ammo_cells > 0; } +entity lgbeam_owner_ent; void lgbeam_think() { entity owner_player; - owner_player = self.owner; + owner_player = self.realowner; owner_player.prevlgfire = time; if (self != owner_player.lgbeam) @@ -281,7 +282,12 @@ void lgbeam_think() } 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)); + 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) @@ -323,7 +329,7 @@ void W_Electro_Attack3 (void) beam.classname = "lgbeam"; beam.solid = SOLID_NOT; beam.think = lgbeam_think; - beam.owner = self; + beam.owner = beam.realowner = self; beam.movetype = MOVETYPE_NONE; beam.shot_spread = 0; beam.bot_dodge = TRUE; diff --git a/qcsrc/server/w_fireball.qc b/qcsrc/server/w_fireball.qc index 4408ccf88f..2cf5981f31 100644 --- a/qcsrc/server/w_fireball.qc +++ b/qcsrc/server/w_fireball.qc @@ -18,7 +18,7 @@ void W_Fireball_Explode (void) self.takedamage = DAMAGE_NO; // 1. dist damage - d = (self.owner.health + self.owner.armorvalue); + d = (self.realowner.health + self.realowner.armorvalue); RadiusDamage (self, self.realowner, autocvar_g_balance_fireball_primary_damage, autocvar_g_balance_fireball_primary_edgedamage, autocvar_g_balance_fireball_primary_radius, world, autocvar_g_balance_fireball_primary_force, self.projectiledeathtype, other); if(self.realowner.health + self.realowner.armorvalue >= d) if(!self.cnt) @@ -28,7 +28,7 @@ void W_Fireball_Explode (void) // 2. bfg effect // NOTE: this cannot be made warpzone aware by design. So, better intentionally ignore warpzones here. for(e = findradius(self.origin, autocvar_g_balance_fireball_primary_bfgradius); e; e = e.chain) - if(e != self.owner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.owner || IsDifferentTeam(e, self)) + if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.realowner || IsDifferentTeam(e, self)) { // can we see fireball? traceline(e.origin + e.view_ofs, self.origin, MOVE_NORMAL, e); @@ -73,7 +73,7 @@ void W_Fireball_LaserPlay(float dt, float dist, float damage, float edgedamage, RandomSelection_Init(); for(e = WarpZone_FindRadius(self.origin, dist, TRUE); e; e = e.chain) - if(e != self.owner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.owner || IsDifferentTeam(e, self)) + if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.realowner || IsDifferentTeam(e, self)) { p = e.origin; p_x += e.mins_x + random() * (e.maxs_x - e.mins_x); diff --git a/qcsrc/server/w_grenadelauncher.qc b/qcsrc/server/w_grenadelauncher.qc index 02ba362aee..537f62a783 100644 --- a/qcsrc/server/w_grenadelauncher.qc +++ b/qcsrc/server/w_grenadelauncher.qc @@ -9,10 +9,10 @@ void W_Grenade_Explode (void) { if(other.takedamage == DAMAGE_AIM) if(other.classname == "player") - if(IsDifferentTeam(self.owner, other)) + if(IsDifferentTeam(self.realowner, other)) if(other.deadflag == DEAD_NO) if(IsFlying(other)) - AnnounceTo(self.owner, "airshot"); + AnnounceTo(self.realowner, "airshot"); self.event_damage = SUB_Null; self.takedamage = DAMAGE_NO; @@ -20,7 +20,7 @@ void W_Grenade_Explode (void) if(self.movetype == MOVETYPE_NONE) self.velocity = self.oldvelocity; - RadiusDamage (self, self.owner, autocvar_g_balance_grenadelauncher_primary_damage, autocvar_g_balance_grenadelauncher_primary_edgedamage, autocvar_g_balance_grenadelauncher_primary_radius, world, autocvar_g_balance_grenadelauncher_primary_force, self.projectiledeathtype, other); + RadiusDamage (self, self.realowner, autocvar_g_balance_grenadelauncher_primary_damage, autocvar_g_balance_grenadelauncher_primary_edgedamage, autocvar_g_balance_grenadelauncher_primary_radius, world, autocvar_g_balance_grenadelauncher_primary_force, self.projectiledeathtype, other); remove (self); } @@ -29,10 +29,10 @@ void W_Grenade_Explode2 (void) { if(other.takedamage == DAMAGE_AIM) if(other.classname == "player") - if(IsDifferentTeam(self.owner, other)) + if(IsDifferentTeam(self.realowner, other)) if(other.deadflag == DEAD_NO) if(IsFlying(other)) - AnnounceTo(self.owner, "airshot"); + AnnounceTo(self.realowner, "airshot"); self.event_damage = SUB_Null; self.takedamage = DAMAGE_NO; @@ -40,7 +40,7 @@ void W_Grenade_Explode2 (void) if(self.movetype == MOVETYPE_NONE) self.velocity = self.oldvelocity; - RadiusDamage (self, self.owner, autocvar_g_balance_grenadelauncher_secondary_damage, autocvar_g_balance_grenadelauncher_secondary_edgedamage, autocvar_g_balance_grenadelauncher_secondary_radius, world, autocvar_g_balance_grenadelauncher_secondary_force, self.projectiledeathtype, other); + RadiusDamage (self, self.realowner, autocvar_g_balance_grenadelauncher_secondary_damage, autocvar_g_balance_grenadelauncher_secondary_edgedamage, autocvar_g_balance_grenadelauncher_secondary_radius, world, autocvar_g_balance_grenadelauncher_secondary_force, self.projectiledeathtype, other); remove (self); } @@ -170,7 +170,7 @@ void W_Grenade_Attack (void) pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); gren = spawn (); - gren.owner = self; + gren.owner = gren.realowner = self; gren.classname = "grenade"; gren.bot_dodge = TRUE; gren.bot_dodgerating = autocvar_g_balance_grenadelauncher_primary_damage; @@ -217,7 +217,7 @@ void W_Grenade_Attack2 (void) pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); gren = spawn (); - gren.owner = self; + gren.owner = gren.realowner = self; gren.classname = "grenade"; gren.bot_dodge = TRUE; gren.bot_dodgerating = autocvar_g_balance_grenadelauncher_secondary_damage; @@ -301,7 +301,7 @@ float w_glauncher(float req) if (cvar("g_balance_grenadelauncher_secondary_remote_detonateprimary")) { nadefound = 0; - for(nade = world; (nade = find(nade, classname, "grenade")); ) if(nade.owner == self) + for(nade = world; (nade = find(nade, classname, "grenade")); ) if(nade.realowner == self) { if(!nade.gl_detonate_later) { diff --git a/qcsrc/server/w_hlac.qc b/qcsrc/server/w_hlac.qc index 7b474d6956..5dec80c869 100644 --- a/qcsrc/server/w_hlac.qc +++ b/qcsrc/server/w_hlac.qc @@ -10,9 +10,9 @@ void W_HLAC_Touch (void) self.event_damage = SUB_Null; if(self.projectiledeathtype & HITTYPE_SECONDARY) - RadiusDamage (self, self.owner, autocvar_g_balance_hlac_secondary_damage, autocvar_g_balance_hlac_secondary_edgedamage, autocvar_g_balance_hlac_secondary_radius, world, autocvar_g_balance_hlac_secondary_force, self.projectiledeathtype, other); + RadiusDamage (self, self.realowner, autocvar_g_balance_hlac_secondary_damage, autocvar_g_balance_hlac_secondary_edgedamage, autocvar_g_balance_hlac_secondary_radius, world, autocvar_g_balance_hlac_secondary_force, self.projectiledeathtype, other); else - RadiusDamage (self, self.owner, autocvar_g_balance_hlac_primary_damage, autocvar_g_balance_hlac_primary_edgedamage, autocvar_g_balance_hlac_primary_radius, world, autocvar_g_balance_hlac_primary_force, self.projectiledeathtype, other); + RadiusDamage (self, self.realowner, autocvar_g_balance_hlac_primary_damage, autocvar_g_balance_hlac_primary_edgedamage, autocvar_g_balance_hlac_primary_radius, world, autocvar_g_balance_hlac_primary_force, self.projectiledeathtype, other); remove (self); } @@ -38,7 +38,7 @@ void W_HLAC_Attack (void) } missile = spawn (); - missile.owner = self; + missile.owner = missile.realowner = self; missile.classname = "hlacbolt"; missile.bot_dodge = TRUE; @@ -81,7 +81,7 @@ void W_HLAC_Attack2f (void) pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); missile = spawn (); - missile.owner = self; + missile.owner = missile.realowner = self; missile.classname = "hlacbolt"; missile.bot_dodge = TRUE; diff --git a/qcsrc/server/w_hook.qc b/qcsrc/server/w_hook.qc index 80c40b10fd..bce4aad8fa 100644 --- a/qcsrc/server/w_hook.qc +++ b/qcsrc/server/w_hook.qc @@ -23,7 +23,7 @@ void W_Hook_ExplodeThink (void) f = self.dmg_last - dmg_remaining_next; self.dmg_last = dmg_remaining_next; - RadiusDamage (self, self.owner, self.dmg * f, self.dmg_edge * f, self.dmg_radius, self.owner, self.dmg_force * f, self.projectiledeathtype, world); + RadiusDamage (self, self.realowner, self.dmg * f, self.dmg_edge * f, self.dmg_radius, self.realowner, self.dmg_force * f, self.projectiledeathtype, world); self.projectiledeathtype |= HITTYPE_BOUNCE; //RadiusDamage (self, world, self.dmg * f, self.dmg_edge * f, self.dmg_radius, world, self.dmg_force * f, self.projectiledeathtype, world); @@ -66,7 +66,7 @@ void W_Hook_Attack2() W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav", CHAN_WEAPON, autocvar_g_balance_hook_secondary_damage); gren = spawn (); - gren.owner = self; + gren.owner = gren.realowner = self; gren.classname = "hookbomb"; gren.bot_dodge = TRUE; gren.bot_dodgerating = autocvar_g_balance_hook_secondary_damage; diff --git a/qcsrc/server/w_laser.qc b/qcsrc/server/w_laser.qc index a7e5c4df7d..47e79bcaab 100644 --- a/qcsrc/server/w_laser.qc +++ b/qcsrc/server/w_laser.qc @@ -10,9 +10,9 @@ void W_Laser_Touch (void) self.event_damage = SUB_Null; if (self.dmg) - RadiusDamage (self, self.owner, autocvar_g_balance_laser_secondary_damage, autocvar_g_balance_laser_secondary_edgedamage, autocvar_g_balance_laser_secondary_radius, world, autocvar_g_balance_laser_secondary_force, self.projectiledeathtype, other); + RadiusDamage (self, self.realowner, autocvar_g_balance_laser_secondary_damage, autocvar_g_balance_laser_secondary_edgedamage, autocvar_g_balance_laser_secondary_radius, world, autocvar_g_balance_laser_secondary_force, self.projectiledeathtype, other); else - RadiusDamage (self, self.owner, autocvar_g_balance_laser_primary_damage, autocvar_g_balance_laser_primary_edgedamage, autocvar_g_balance_laser_primary_radius, world, autocvar_g_balance_laser_primary_force, self.projectiledeathtype, other); + RadiusDamage (self, self.realowner, autocvar_g_balance_laser_primary_damage, autocvar_g_balance_laser_primary_edgedamage, autocvar_g_balance_laser_primary_radius, world, autocvar_g_balance_laser_primary_force, self.projectiledeathtype, other); remove (self); } @@ -52,7 +52,7 @@ void W_Laser_Attack (float issecondary) pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); missile = spawn (); - missile.owner = self; + missile.owner = missile.realowner = self; missile.classname = "laserbolt"; missile.dmg = 0; if(!nodamage) @@ -95,12 +95,12 @@ float gauntletbeam_send(entity to, float sf) { WriteByte(MSG_ENTITY, ENT_CLIENT_GAUNTLET); sf = sf & 0x7F; - if(sound_allowed(MSG_BROADCAST, self.owner)) + if(sound_allowed(MSG_BROADCAST, self.realowner)) sf |= 0x80; WriteByte(MSG_ENTITY, sf); if(sf & 1) { - WriteByte(MSG_ENTITY, num_for_edict(self.owner)); + WriteByte(MSG_ENTITY, num_for_edict(self.realowner)); } if(sf & 2) { @@ -118,6 +118,7 @@ float gauntletbeam_send(entity to, float sf) } .entity gauntletbeam; .float prevgauntletfire; +entity lgbeam_owner_ent; void gauntletbeam_think() { float damage, myforce, myradius; @@ -125,8 +126,8 @@ void gauntletbeam_think() myforce = autocvar_g_balance_laser_secondary_force; myradius = autocvar_g_balance_laser_secondary_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.realowner.prevgauntletfire = time; + if (self.realowner.weaponentity.state != WS_INUSE || self != self.realowner.gauntletbeam || self.realowner.deadflag != DEAD_NO || !self.realowner.BUTTON_ATCK2) { remove(self); return; @@ -134,13 +135,18 @@ void gauntletbeam_think() self.nextthink = time; - makevectors(self.owner.v_angle); + makevectors(self.realowner.v_angle); float dt; dt = frametime; - W_SetupShot_Range(self.owner, TRUE, 0, "", 0, damage * dt, myradius); - WarpZone_traceline_antilag(self.owner, w_shotorg, w_shotend, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner)); + W_SetupShot_Range(self.realowner, TRUE, 0, "", 0, damage * dt, myradius); + 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(self.owner)); // apply the damage if(trace_ent) diff --git a/qcsrc/server/w_minelayer.qc b/qcsrc/server/w_minelayer.qc index b4ecb9b551..5362f17586 100644 --- a/qcsrc/server/w_minelayer.qc +++ b/qcsrc/server/w_minelayer.qc @@ -25,6 +25,7 @@ void W_Mine_Stick (entity to) newmine.bot_dodgerating = self.bot_dodgerating; newmine.owner = self.owner; + newmine.realowner = self.realowner; setsize(newmine, '-4 -4 -4', '4 4 4'); setorigin(newmine, self.origin); setmodel(newmine, "models/mine.md3"); @@ -60,21 +61,21 @@ void W_Mine_Explode () { if(other.takedamage == DAMAGE_AIM) if(other.classname == "player") - if(IsDifferentTeam(self.owner, other)) + if(IsDifferentTeam(self.realowner, other)) if(other.deadflag == DEAD_NO) if(IsFlying(other)) - AnnounceTo(self.owner, "airshot"); + AnnounceTo(self.realowner, "airshot"); self.event_damage = SUB_Null; self.takedamage = DAMAGE_NO; - RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_damage, autocvar_g_balance_minelayer_edgedamage, autocvar_g_balance_minelayer_radius, world, autocvar_g_balance_minelayer_force, self.projectiledeathtype, other); + RadiusDamage (self, self.realowner, autocvar_g_balance_minelayer_damage, autocvar_g_balance_minelayer_edgedamage, autocvar_g_balance_minelayer_radius, world, autocvar_g_balance_minelayer_force, self.projectiledeathtype, other); - if (self.owner.weapon == WEP_MINE_LAYER) + if (self.realowner.weapon == WEP_MINE_LAYER) { entity oldself; oldself = self; - self = self.owner; + self = self.realowner; if (!weapon_action(WEP_MINE_LAYER, WR_CHECKAMMO1)) { self.cnt = WEP_MINE_LAYER; @@ -83,7 +84,7 @@ void W_Mine_Explode () } self = oldself; } - self.owner.minelayer_mines -= 1; + self.realowner.minelayer_mines -= 1; remove (self); } @@ -95,13 +96,13 @@ void W_Mine_DoRemoteExplode () if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW) self.velocity = self.oldvelocity; - RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world); + RadiusDamage (self, self.realowner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world); - if (self.owner.weapon == WEP_MINE_LAYER) + if (self.realowner.weapon == WEP_MINE_LAYER) { entity oldself; oldself = self; - self = self.owner; + self = self.realowner; if (!weapon_action(WEP_MINE_LAYER, WR_CHECKAMMO1)) { self.cnt = WEP_MINE_LAYER; @@ -110,16 +111,16 @@ void W_Mine_DoRemoteExplode () } self = oldself; } - self.owner.minelayer_mines -= 1; + self.realowner.minelayer_mines -= 1; remove (self); } void W_Mine_RemoteExplode () { - if(self.owner.deadflag == DEAD_NO) + if(self.realowner.deadflag == DEAD_NO) if((self.spawnshieldtime >= 0) ? (time >= self.spawnshieldtime) // timer - : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > autocvar_g_balance_minelayer_remote_radius) // safety device + : (vlen(NearestPointOnBox(self.realowner, self.origin) - self.origin) > autocvar_g_balance_minelayer_remote_radius) // safety device ) { W_Mine_DoRemoteExplode(); @@ -135,7 +136,7 @@ void W_Mine_ProximityExplode () head = findradius(self.origin, autocvar_g_balance_minelayer_radius); while(head) { - if(head == self.owner || !IsDifferentTeam(head, self.owner)) + if(head == self.realowner || !IsDifferentTeam(head, self.realowner)) return; head = head.chain; } @@ -149,7 +150,7 @@ float W_Mine_Count(entity e) { float minecount; entity mine; - for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == e) + for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.realowner == e) minecount += 1; return minecount; @@ -182,7 +183,7 @@ void W_Mine_Think (void) // a player's mines shall explode if he disconnects or dies // TODO: Do this on team change too -- Samual: But isn't a player killed when they switch teams? - if(self.owner.classname != "player" || self.owner.deadflag != DEAD_NO) + if(self.realowner.classname != "player" || self.realowner.deadflag != DEAD_NO) { other = world; self.projectiledeathtype |= HITTYPE_BOUNCE; @@ -195,7 +196,7 @@ void W_Mine_Think (void) while(head) { if(head.classname == "player" && head.deadflag == DEAD_NO) - if(head != self.owner && IsDifferentTeam(head, self.owner)) // don't trigger for team mates + if(head != self.realowner && IsDifferentTeam(head, self.realowner)) // don't trigger for team mates if(!self.mine_time) { spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM); @@ -212,8 +213,8 @@ void W_Mine_Think (void) } // remote detonation - if (self.owner.weapon == WEP_MINE_LAYER) - if (self.owner.deadflag == DEAD_NO) + if (self.realowner.weapon == WEP_MINE_LAYER) + if (self.realowner.deadflag == DEAD_NO) if (self.minelayer_detonate) W_Mine_RemoteExplode(); } @@ -270,7 +271,7 @@ void W_Mine_Attack (void) pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); mine = WarpZone_RefSys_SpawnSameRefSys(self); - mine.owner = self; + mine.owner = mine.realowner = self; if(autocvar_g_balance_minelayer_detonatedelay >= 0) mine.spawnshieldtime = time + autocvar_g_balance_minelayer_detonatedelay; else @@ -322,7 +323,7 @@ float W_PlacedMines(float detonate) entity mine; float minfound; - for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self) + for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.realowner == self) { if(detonate) { @@ -364,7 +365,7 @@ float w_minelayer(float req) mine = find(world, classname, "mine"); while (mine) { - if (mine.owner != self) + if (mine.realowner != self) { mine = find(mine, classname, "mine"); continue; @@ -395,7 +396,7 @@ float w_minelayer(float req) mine = find(world, classname, "mine"); while (mine) { - if (mine.owner != self) + if (mine.realowner != self) { mine = find(mine, classname, "mine"); continue; diff --git a/qcsrc/server/w_porto.qc b/qcsrc/server/w_porto.qc index d6e92a5372..d4b61a8784 100644 --- a/qcsrc/server/w_porto.qc +++ b/qcsrc/server/w_porto.qc @@ -9,42 +9,42 @@ REGISTER_WEAPON(PORTO, w_porto, 0, 0, WEP_TYPE_OTHER, 0, "porto" , "porto", _("P void W_Porto_Success (void) { - if(self.owner == world) + if(self.realowner == world) { objerror("Cannot succeed successfully: no owner\n"); return; } - self.owner.porto_current = world; + self.realowner.porto_current = world; remove(self); } string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector velo); void W_Porto_Fail (float failhard) { - if(self.owner == world) + if(self.realowner == world) { objerror("Cannot fail successfully: no owner\n"); return; } // no portals here! - Portal_ClearWithID(self.owner, self.portal_id); - self.owner.porto_current = world; + Portal_ClearWithID(self.realowner, self.portal_id); + self.realowner.porto_current = world; - if(!failhard && self.owner.playerid == self.playerid && self.owner.deadflag == DEAD_NO && !(self.owner.weapons & WEPBIT_PORTO)) + if(!failhard && self.realowner.playerid == self.playerid && self.realowner.deadflag == DEAD_NO && !(self.realowner.weapons & WEPBIT_PORTO)) { setsize (self, '-16 -16 0', '16 16 32'); setorigin(self, self.origin + trace_plane_normal); if(move_out_of_solid(self)) { self.flags = FL_ITEM; - self.velocity = trigger_push_calculatevelocity(self.origin, self.owner, 128); + self.velocity = trigger_push_calculatevelocity(self.origin, self.realowner, 128); tracetoss(self, self); - if(vlen(trace_endpos - self.owner.origin) < 128) + if(vlen(trace_endpos - self.realowner.origin) < 128) { - W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, self.velocity); - centerprint(self.owner, "^1Portal deployment failed.\n\n^2Catch it to try again!"); + W_ThrowNewWeapon(self.realowner, WEP_PORTO, 0, self.origin, self.velocity); + centerprint(self.realowner, "^1Portal deployment failed.\n\n^2Catch it to try again!"); } } } @@ -66,7 +66,7 @@ void W_Porto_Remove (entity p) void W_Porto_Think (void) { trace_plane_normal = '0 0 0'; - if(self.owner.playerid != self.playerid) + if(self.realowner.playerid != self.playerid) remove(self); else W_Porto_Fail(0); @@ -93,7 +93,7 @@ void W_Porto_Touch (void) return; } - if(self.owner.playerid != self.playerid) + if(self.realowner.playerid != self.playerid) { sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM); remove(self); @@ -113,11 +113,11 @@ void W_Porto_Touch (void) else if(self.effects & EF_RED) { self.effects += EF_BLUE - EF_RED; - if(Portal_SpawnInPortalAtTrace(self.owner, self.right_vector, self.portal_id)) + if(Portal_SpawnInPortalAtTrace(self.realowner, self.right_vector, self.portal_id)) { sound(self, CHAN_PROJECTILE, "porto/create.wav", VOL_BASE, ATTN_NORM); trace_plane_normal = norm; - centerprint(self.owner, "^1In^7-portal created."); + centerprint(self.realowner, "^1In^7-portal created."); self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * norm); self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * norm)); CSQCProjectile(self, TRUE, PROJECTILE_PORTO_BLUE, TRUE); // change type @@ -131,13 +131,13 @@ void W_Porto_Touch (void) } else { - if(self.owner.portal_in.portal_id == self.portal_id) + if(self.realowner.portal_in.portal_id == self.portal_id) { - if(Portal_SpawnOutPortalAtTrace(self.owner, self.right_vector, self.portal_id)) + if(Portal_SpawnOutPortalAtTrace(self.realowner, self.right_vector, self.portal_id)) { sound(self, CHAN_PROJECTILE, "porto/create.wav", VOL_BASE, ATTN_NORM); trace_plane_normal = norm; - centerprint(self.owner, "^4Out^7-portal created."); + centerprint(self.realowner, "^4Out^7-portal created."); W_Porto_Success(); } else @@ -168,7 +168,7 @@ void W_Porto_Attack (void) //pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); gren = spawn (); - gren.owner = self; + gren.owner = gren.realowner = self; gren.playerid = self.playerid; gren.classname = "porto"; gren.bot_dodge = TRUE; diff --git a/qcsrc/server/w_rocketlauncher.qc b/qcsrc/server/w_rocketlauncher.qc index d65c4bc38a..0269fd18fc 100644 --- a/qcsrc/server/w_rocketlauncher.qc +++ b/qcsrc/server/w_rocketlauncher.qc @@ -7,10 +7,10 @@ REGISTER_WEAPON(ROCKET_LAUNCHER, w_rlauncher, IT_ROCKETS, 9, WEP_FLAG_NORMAL | W void W_Rocket_Unregister() { - if(self.owner && self.owner.lastrocket == self) + if(self.realowner && self.realowner.lastrocket == self) { - self.owner.lastrocket = world; - // self.owner.rl_release = 1; + self.realowner.lastrocket = world; + // self.realowner.rl_release = 1; } } @@ -20,23 +20,23 @@ void W_Rocket_Explode () if(other.takedamage == DAMAGE_AIM) if(other.classname == "player") - if(IsDifferentTeam(self.owner, other)) + if(IsDifferentTeam(self.realowner, other)) if(other.deadflag == DEAD_NO) if(IsFlying(other)) - AnnounceTo(self.owner, "airshot"); + AnnounceTo(self.realowner, "airshot"); self.event_damage = SUB_Null; self.takedamage = DAMAGE_NO; - RadiusDamage (self, self.owner, autocvar_g_balance_rocketlauncher_damage, autocvar_g_balance_rocketlauncher_edgedamage, autocvar_g_balance_rocketlauncher_radius, world, autocvar_g_balance_rocketlauncher_force, self.projectiledeathtype, other); + RadiusDamage (self, self.realowner, autocvar_g_balance_rocketlauncher_damage, autocvar_g_balance_rocketlauncher_edgedamage, autocvar_g_balance_rocketlauncher_radius, world, autocvar_g_balance_rocketlauncher_force, self.projectiledeathtype, other); - if (self.owner.weapon == WEP_ROCKET_LAUNCHER) + if (self.realowner.weapon == WEP_ROCKET_LAUNCHER) { - if(self.owner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo) + if(self.realowner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo) { - self.owner.cnt = WEP_ROCKET_LAUNCHER; - ATTACK_FINISHED(self.owner) = time; - self.owner.switchweapon = w_getbestweapon(self.owner); + self.realowner.cnt = WEP_ROCKET_LAUNCHER; + ATTACK_FINISHED(self.realowner) = time; + self.realowner.switchweapon = w_getbestweapon(self.realowner); } } remove (self); @@ -49,15 +49,15 @@ void W_Rocket_DoRemoteExplode () self.event_damage = SUB_Null; self.takedamage = DAMAGE_NO; - RadiusDamage (self, self.owner, autocvar_g_balance_rocketlauncher_remote_damage, autocvar_g_balance_rocketlauncher_remote_edgedamage, autocvar_g_balance_rocketlauncher_remote_radius, world, autocvar_g_balance_rocketlauncher_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world); + RadiusDamage (self, self.realowner, autocvar_g_balance_rocketlauncher_remote_damage, autocvar_g_balance_rocketlauncher_remote_edgedamage, autocvar_g_balance_rocketlauncher_remote_radius, world, autocvar_g_balance_rocketlauncher_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world); - if (self.owner.weapon == WEP_ROCKET_LAUNCHER) + if (self.realowner.weapon == WEP_ROCKET_LAUNCHER) { - if(self.owner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo) + if(self.realowner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo) { - self.owner.cnt = WEP_ROCKET_LAUNCHER; - ATTACK_FINISHED(self.owner) = time; - self.owner.switchweapon = w_getbestweapon(self.owner); + self.realowner.cnt = WEP_ROCKET_LAUNCHER; + ATTACK_FINISHED(self.realowner) = time; + self.realowner.switchweapon = w_getbestweapon(self.realowner); } } remove (self); @@ -110,19 +110,19 @@ entity FindLaserTarget(entity e, float dist_variance, float dot_variance) head = find(head, classname, "laser_target"); } - //bprint(selected.owner.netname); + //bprint(selected.realowner.netname); //bprint("\n"); return selected; } void W_Rocket_RemoteExplode() { - if(self.owner.deadflag == DEAD_NO) - if(self.owner.lastrocket) + if(self.realowner.deadflag == DEAD_NO) + if(self.realowner.lastrocket) { if((self.spawnshieldtime >= 0) ? (time >= self.spawnshieldtime) // timer - : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > autocvar_g_balance_rocketlauncher_remote_radius) // safety device + : (vlen(NearestPointOnBox(self.realowner, self.origin) - self.origin) > autocvar_g_balance_rocketlauncher_remote_radius) // safety device ) { W_Rocket_DoRemoteExplode(); @@ -175,14 +175,14 @@ void W_Rocket_Think (void) self.velocity = self.velocity + v_forward * min(autocvar_g_balance_rocketlauncher_speedaccel * g_weaponspeedfactor * frametime, velspeed); // laser guided, or remote detonation - if (self.owner.weapon == WEP_ROCKET_LAUNCHER) + if (self.realowner.weapon == WEP_ROCKET_LAUNCHER) { - if(self == self.owner.lastrocket) - if not(self.owner.rl_release) + if(self == self.realowner.lastrocket) + if not(self.realowner.rl_release) if not(self.BUTTON_ATCK2) if(autocvar_g_balance_rocketlauncher_guiderate) if(time > self.pushltime) - if(self.owner.deadflag == DEAD_NO) + if(self.realowner.deadflag == DEAD_NO) { f = autocvar_g_balance_rocketlauncher_guideratedelay; if(f) @@ -192,9 +192,9 @@ void W_Rocket_Think (void) velspeed = vlen(self.velocity); - makevectors(self.owner.v_angle); - desireddir = WarpZone_RefSys_TransformVelocity(self.owner, self, v_forward); - desiredorigin = WarpZone_RefSys_TransformOrigin(self.owner, self, self.owner.origin + self.owner.view_ofs); + makevectors(self.realowner.v_angle); + desireddir = WarpZone_RefSys_TransformVelocity(self.realowner, self, v_forward); + desiredorigin = WarpZone_RefSys_TransformOrigin(self.realowner, self, self.realowner.origin + self.realowner.view_ofs); olddir = normalize(self.velocity); // now it gets tricky... we want to move like some curve to approximate the target direction @@ -209,7 +209,7 @@ void W_Rocket_Think (void) { pointparticles(particleeffectnum("rocket_guide"), self.origin, self.velocity, 1); // TODO add a better sound here - sound (self.owner, CHAN_WEAPON2, "weapons/rocket_mode.wav", VOL_BASE, ATTN_NORM); + sound (self.realowner, CHAN_WEAPON2, "weapons/rocket_mode.wav", VOL_BASE, ATTN_NORM); self.count = 1; } } @@ -255,7 +255,7 @@ void W_Rocket_Attack (void) pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); missile = WarpZone_RefSys_SpawnSameRefSys(self); - missile.owner = self; + missile.owner = missile.realowner = self; self.lastrocket = missile; if(autocvar_g_balance_rocketlauncher_detonatedelay >= 0) missile.spawnshieldtime = time + autocvar_g_balance_rocketlauncher_detonatedelay; @@ -328,7 +328,7 @@ float w_rlauncher(float req) missile = find(world, classname, "rocket"); while (missile) { - if (missile.owner != self) + if (missile.realowner != self) { missile = find(missile, classname, "rocket"); continue; @@ -359,7 +359,7 @@ float w_rlauncher(float req) missile = find(world, classname, "rocket"); while (missile) { - if (missile.owner != self) + if (missile.realowner != self) { missile = find(missile, classname, "rocket"); continue; @@ -424,7 +424,7 @@ float w_rlauncher(float req) if (self.BUTTON_ATCK2) { rockfound = 0; - for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.owner == self) + for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.realowner == self) { if(!rock.rl_detonate_later) { diff --git a/qcsrc/server/w_seeker.qc b/qcsrc/server/w_seeker.qc index 74ac14550e..aa07f82881 100644 --- a/qcsrc/server/w_seeker.qc +++ b/qcsrc/server/w_seeker.qc @@ -13,7 +13,7 @@ REGISTER_WEAPON(SEEKER, w_seeker, IT_ROCKETS, 8, WEP_FLAG_RELOADABLE | WEP_TYPE_ void Seeker_Missile_Explode () { self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, autocvar_g_balance_seeker_missile_damage, autocvar_g_balance_seeker_missile_edgedamage, autocvar_g_balance_seeker_missile_radius, world, autocvar_g_balance_seeker_missile_force, self.projectiledeathtype, other); + RadiusDamage (self, self.realowner, autocvar_g_balance_seeker_missile_damage, autocvar_g_balance_seeker_missile_edgedamage, autocvar_g_balance_seeker_missile_radius, world, autocvar_g_balance_seeker_missile_force, self.projectiledeathtype, other); remove (self); } @@ -125,7 +125,7 @@ void Seeker_Missile_Damage (entity inflictor, entity attacker, float damage, flo if (self.health <= 0) return; - if (self.owner == attacker) + if (self.realowner == attacker) self.health = self.health - (damage * 0.25); else self.health = self.health - damage; @@ -173,7 +173,7 @@ void Seeker_Fire_Missile(vector f_diff, entity m_target) //self.detornator = FALSE; missile = spawn(); - missile.owner = self; + missile.owner = missile.realowner = self; missile.classname = "seeker_missile"; missile.bot_dodge = TRUE; missile.bot_dodgerating = autocvar_g_balance_seeker_missile_damage; @@ -217,7 +217,7 @@ void Seeker_Flac_Explode () { self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, autocvar_g_balance_seeker_flac_damage, autocvar_g_balance_seeker_flac_edgedamage, autocvar_g_balance_seeker_flac_radius, world, autocvar_g_balance_seeker_flac_force, self.projectiledeathtype, other); + RadiusDamage (self, self.realowner, autocvar_g_balance_seeker_flac_damage, autocvar_g_balance_seeker_flac_edgedamage, autocvar_g_balance_seeker_flac_radius, world, autocvar_g_balance_seeker_flac_force, self.projectiledeathtype, other); remove (self); } @@ -294,7 +294,7 @@ entity Seeker_Tagged_Info(entity isowner, entity istarget) { entity tag; for(tag = world; (tag = find(tag, classname, "tag_tracker")); ) - if ((tag.owner == isowner) && (tag.tag_target == istarget)) + if ((tag.realowner == isowner) && (tag.tag_target == istarget)) return tag; return world; @@ -304,7 +304,7 @@ void Seeker_Attack() { entity tracker, closest_target; - for(tracker = world; (tracker = find(tracker, classname, "tag_tracker")); ) if (tracker.owner == self) + for(tracker = world; (tracker = find(tracker, classname, "tag_tracker")); ) if (tracker.realowner == self) { if (closest_target) { @@ -328,7 +328,7 @@ void Seeker_Vollycontroller_Think() // TODO: Merge this with Seeker_Attack entity oldself,oldenemy; self.cnt = self.cnt - 1; - if((!(self.owner.items & IT_UNLIMITED_AMMO) && self.owner.ammo_rockets < autocvar_g_balance_seeker_missile_ammo) || (self.cnt <= -1) || (self.owner.deadflag != DEAD_NO) || (self.owner.switchweapon != WEP_SEEKER)) + if((!(self.realowner.items & IT_UNLIMITED_AMMO) && self.realowner.ammo_rockets < autocvar_g_balance_seeker_missile_ammo) || (self.cnt <= -1) || (self.realowner.deadflag != DEAD_NO) || (self.realowner.switchweapon != WEP_SEEKER)) { remove(self); return; @@ -337,7 +337,7 @@ void Seeker_Vollycontroller_Think() // TODO: Merge this with Seeker_Attack self.nextthink = time + autocvar_g_balance_seeker_missile_delay; oldself = self; - self = self.owner; + self = self.realowner; oldenemy = self.enemy; self.enemy = oldself.enemy; @@ -367,7 +367,7 @@ void Seeker_Vollycontroller_Think() // TODO: Merge this with Seeker_Attack void Seeker_Tracker_Think() { // commit suicide if: You die OR target dies OR you switch away from the seeker OR commit suicide if lifetime is up - if ((self.owner.deadflag != DEAD_NO) || (self.tag_target.deadflag != DEAD_NO) || (self.owner.switchweapon != WEP_SEEKER) + if ((self.realowner.deadflag != DEAD_NO) || (self.tag_target.deadflag != DEAD_NO) || (self.realowner.switchweapon != WEP_SEEKER) || (time > self.tag_time + autocvar_g_balance_seeker_tag_tracker_lifetime)) { if (self) @@ -387,7 +387,7 @@ void Seeker_Tracker_Think() // ============================ void Seeker_Tag_Explode () { - //if(other==self.owner) + //if(other==self.realowner) // return; Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE, self); @@ -409,7 +409,7 @@ void Seeker_Tag_Touch() vector org2; entity e; - dir = normalize (self.owner.origin - self.origin); + dir = normalize (self.realowner.origin - self.origin); org2 = findbetterlocation (self.origin, 8); te_knightspike(org2); @@ -420,7 +420,7 @@ void Seeker_Tag_Touch() if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO) { // check to see if this person is already tagged by me - entity tag = Seeker_Tagged_Info(self.owner, other); + entity tag = Seeker_Tagged_Info(self.realowner, other); if (tag != world) { @@ -431,11 +431,12 @@ void Seeker_Tag_Touch() } else { - //sprint(self.owner, strcat("You just tagged ^2", other.netname, "^7 with a tracking device!\n")); + //sprint(self.realowner, strcat("You just tagged ^2", other.netname, "^7 with a tracking device!\n")); e = spawn(); e.cnt = autocvar_g_balance_seeker_missile_count; e.classname = "tag_tracker"; e.owner = self.owner; + e.realowner = self.realowner; if (autocvar_g_balance_seeker_type == 1) { @@ -454,7 +455,7 @@ void Seeker_Tag_Touch() if (autocvar_g_balance_seeker_type == 1) { - WaypointSprite_Spawn("tagged-target", autocvar_g_balance_seeker_tag_tracker_lifetime, 0, other, '0 0 64', self.owner, 0, other, wps_tag_tracker, TRUE, RADARICON_TAGGED, '0.5 1 0'); + WaypointSprite_Spawn("tagged-target", autocvar_g_balance_seeker_tag_tracker_lifetime, 0, other, '0 0 64', self.realowner, 0, other, wps_tag_tracker, TRUE, RADARICON_TAGGED, '0.5 1 0'); WaypointSprite_UpdateRule(other.wps_tag_tracker, 0, SPRITERULE_DEFAULT); } } @@ -471,7 +472,7 @@ void Seeker_Fire_Tag() W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/tag_fire.wav", CHAN_WEAPON, autocvar_g_balance_seeker_missile_damage * autocvar_g_balance_seeker_missile_count); missile = spawn(); - missile.owner = self; + missile.owner = missile.realowner = self; missile.classname = "seeker_tag"; missile.bot_dodge = TRUE; missile.bot_dodgerating = 50; @@ -480,7 +481,6 @@ void Seeker_Fire_Tag() missile.nextthink = time + autocvar_g_balance_seeker_tag_lifetime; missile.movetype = MOVETYPE_FLY; missile.solid = SOLID_BBOX; - missile.owner = self; missile.takedamage = DAMAGE_YES; missile.event_damage = Seeker_Tag_Explode; diff --git a/qcsrc/server/w_shotgun.qc b/qcsrc/server/w_shotgun.qc index 635b1ccf8b..449a7978ad 100644 --- a/qcsrc/server/w_shotgun.qc +++ b/qcsrc/server/w_shotgun.qc @@ -46,13 +46,14 @@ void W_Shotgun_Attack (void) W_AttachToShotorg(flash, '5 0 0'); } +entity lgbeam_owner_ent; void shotgun_meleethink (void) { // store time when we started swinging down inside self.cnt if(!self.cnt) self.cnt = time; - makevectors(self.owner.v_angle); + makevectors(self.realowner.v_angle); vector angle; angle = v_forward; @@ -63,21 +64,26 @@ void shotgun_meleethink (void) float f; f = (self.cnt + meleetime - time) / meleetime * 2 - 1; vector targpos; - targpos = self.owner.origin + self.owner.view_ofs + angle * autocvar_g_balance_shotgun_secondary_melee_range + v_right * f * autocvar_g_balance_shotgun_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgun_secondary_melee_swing; + targpos = self.realowner.origin + self.realowner.view_ofs + angle * autocvar_g_balance_shotgun_secondary_melee_range + v_right * f * autocvar_g_balance_shotgun_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgun_secondary_melee_swing; - WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, targpos, FALSE, self.owner, ANTILAG_LATENCY(self.owner)); + if(!lgbeam_owner_ent) + { + lgbeam_owner_ent = spawn(); + lgbeam_owner_ent.classname = "lgbeam_owner_ent"; + } + WarpZone_traceline_antilag(lgbeam_owner_ent, self.realowner.origin + self.realowner.view_ofs, targpos, FALSE, lgbeam_owner_ent, ANTILAG_LATENCY(self.realowner)); // apply the damage, also remove self if(trace_fraction < 1 && trace_ent.takedamage == DAMAGE_AIM && (trace_ent.classname == "player" || trace_ent.classname == "body")) { vector force; force = angle * autocvar_g_balance_shotgun_secondary_force; - if(accuracy_isgooddamage(self.owner, trace_ent)) - accuracy_add(self.owner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1)); - Damage (trace_ent, self.owner, self.owner, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.owner.origin + self.owner.view_ofs, force); + if(accuracy_isgooddamage(self.realowner, trace_ent)) + accuracy_add(self.realowner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1)); + Damage (trace_ent, self.realowner, self.realowner, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.realowner.origin + self.realowner.view_ofs, force); remove(self); } - else if(time >= self.cnt + meleetime || (self.owner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) // missed or owner died, remove ent + else if(time >= self.cnt + meleetime || (self.realowner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) // missed or owner died, remove ent remove(self); else // continue swinging the weapon in hope of hitting someone :) self.nextthink = time; @@ -90,7 +96,7 @@ void W_Shotgun_Attack2 (void) entity meleetemp; meleetemp = spawn(); - meleetemp.owner = self; + meleetemp.owner = meleetemp.realowner = self; meleetemp.think = shotgun_meleethink; meleetemp.nextthink = time + autocvar_g_balance_shotgun_secondary_melee_delay; W_SetupShot_Range(self, TRUE, 0, "", 0, autocvar_g_balance_shotgun_secondary_damage, autocvar_g_balance_shotgun_secondary_melee_range); diff --git a/qcsrc/server/w_tuba.qc b/qcsrc/server/w_tuba.qc index f49f6324b2..4619720402 100644 --- a/qcsrc/server/w_tuba.qc +++ b/qcsrc/server/w_tuba.qc @@ -83,7 +83,7 @@ float W_Tuba_NoteSendEntity(entity to, float sf) WriteCoord(MSG_ENTITY, self.origin_x); WriteCoord(MSG_ENTITY, self.origin_y); WriteCoord(MSG_ENTITY, self.origin_z); - WriteByte(MSG_ENTITY, self.owner != to); + WriteByte(MSG_ENTITY, self.realowner != to); } return TRUE; } @@ -97,30 +97,30 @@ void W_Tuba_NoteThink() entity e; if(time > self.teleport_time) { - self.owner.tuba_note = world; + self.realowner.tuba_note = world; remove(self); return; } self.nextthink = time; dist_mult = autocvar_g_balance_tuba_attenuation / autocvar_snd_soundradius; FOR_EACH_REALCLIENT(e) - if(e != self.owner) + if(e != self.realowner) { v = self.origin - (e.origin + e.view_ofs); vol0 = max(0, 1 - vlen(v) * dist_mult); dir0 = normalize(v); - v = self.owner.origin - (e.origin + e.view_ofs); + v = self.realowner.origin - (e.origin + e.view_ofs); vol1 = max(0, 1 - vlen(v) * dist_mult); dir1 = normalize(v); if(fabs(vol0 - vol1) > 0.005) // 0.5 percent change in volume { - setorigin(self, self.owner.origin); + setorigin(self, self.realowner.origin); self.SendFlags |= 1; break; } if(dir0 * dir1 < 0.9994) // 2 degrees change in angle { - setorigin(self, self.owner.origin); + setorigin(self, self.realowner.origin); self.SendFlags |= 1; break; } @@ -161,7 +161,7 @@ void W_Tuba_Attack(float hittype) if not(self.tuba_note) { self.tuba_note = spawn(); - self.tuba_note.owner = self; + self.tuba_note.owner = self.tuba_note.realowner = self; self.tuba_note.cnt = n; self.tuba_note.think = W_Tuba_NoteThink; self.tuba_note.nextthink = time; diff --git a/qcsrc/server/w_uzi.qc b/qcsrc/server/w_uzi.qc index 2f5b9bc783..9cf44aaa09 100644 --- a/qcsrc/server/w_uzi.qc +++ b/qcsrc/server/w_uzi.qc @@ -15,7 +15,7 @@ void UZI_Flash_Go() { self.think = SUB_Remove; self.nextthink = time; - self.owner.muzzle_flash = world; + self.realowner.muzzle_flash = world; return; } @@ -36,7 +36,7 @@ void UziFlash() self.muzzle_flash.alpha = 0.75; self.muzzle_flash.angles_z = random() * 180; self.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - self.muzzle_flash.owner = self; + self.muzzle_flash.owner = self.muzzle_flash.realowner = self; } void W_UZI_Attack (float deathtype)