]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
EXPERIMENTAL change: make projectiles able to hit yourself when shot through a warpzone
authorRudolf Polzer <divverent@xonotic.org>
Sat, 25 Jun 2011 10:50:10 +0000 (12:50 +0200)
committerRudolf Polzer <divverent@xonotic.org>
Sat, 25 Jun 2011 10:50:10 +0000 (12:50 +0200)
16 files changed:
qcsrc/server/g_hook.qc
qcsrc/server/t_teleporters.qc
qcsrc/server/w_common.qc
qcsrc/server/w_electro.qc
qcsrc/server/w_fireball.qc
qcsrc/server/w_grenadelauncher.qc
qcsrc/server/w_hlac.qc
qcsrc/server/w_hook.qc
qcsrc/server/w_laser.qc
qcsrc/server/w_minelayer.qc
qcsrc/server/w_porto.qc
qcsrc/server/w_rocketlauncher.qc
qcsrc/server/w_seeker.qc
qcsrc/server/w_shotgun.qc
qcsrc/server/w_tuba.qc
qcsrc/server/w_uzi.qc

index b7291dee3f8cedc4c92d82846330bb930593b8de..f03f78473f82dfd8e5cfad64ac38720e90221419 100644 (file)
@@ -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";
 
index fbb803294269e5e07bf1a36a0d2675ea28645f4b..a2836264de0c2d7bc1d90f286b0094773edcbb93 100644 (file)
@@ -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)
index 30cfa7bebfb87b110914fd348b28c0dec173f36b..3816594a97fda0a1ab824941f9947ecc3e6ee72a 100644 (file)
@@ -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;
 
index 711c44c8bf363a39bd8672e5c9908c6b2993f9db..bf81e8c1e368ee1eda8630c604ca092ec42b0783 100644 (file)
@@ -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;
index 4408ccf88f202ec907dc5252f9bb4545a8a5fa35..2cf5981f31b1ac5e84358d802d46b600514c3a15 100644 (file)
@@ -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);
index 02ba362aee0ca7e28a96dcc7d7ff3169374a8b39..537f62a783162468aa8782f2a81b33a76dd3b7be 100644 (file)
@@ -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)
                                        {
index 7b474d6956f04f09ac86e80d45509a60f422b471..5dec80c8691388d203ef15e1a8b327d773937238 100644 (file)
@@ -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;
 
index 80c40b10fd8704cc94f46ec2640d30fafc1f834c..bce4aad8fa11da202542e8e11449e4dafe521334 100644 (file)
@@ -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;
index a7e5c4df7d272f785e3dd2fc7d4e576eed97806e..47e79bcaabee8ba211071a692ec0c07ab03ba76e 100644 (file)
@@ -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)
index b4ecb9b5519620411ac834deb9098cff4c615b45..5362f1758640c390fec719da016ae65bbf88664b 100644 (file)
@@ -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;
index d6e92a53728203ff5f648e797e2304e00a652fc1..d4b61a87848c9c9265616f7334099940a7cd55ea 100644 (file)
@@ -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;
index d65c4bc38ad19203cf63dade61b70c4aa88024e7..0269fd18fc8bff348f1e6e168f595a88270e4673 100644 (file)
@@ -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)
                                        {
index 74ac14550e9bde827e1d10804bb05bb442d818b4..aa07f82881e9648c868edea7f931f57ddb37fd01 100644 (file)
@@ -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;
index 635b1ccf8b959ac753e4f06ef493605e9049b973..449a7978add5896513f7bdad67f7fe7792f99d50 100644 (file)
@@ -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);
index f49f6324b2046119547b21734294afe486f7b80a..46197204026359c0de9a914c109e63da86d15779 100644 (file)
@@ -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;
index 2f5b9bc7833badd1167a4205bc32c940e7550a1c..9cf44aaa09c9e2dddccc6cd77f3162d35fc4e953 100644 (file)
@@ -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)