Another fix to something that can fail catastrophically if monsters spontaneously cease to exist in the middle of a DamageMobj call.

Small adjustment to translocator module (hitbox uses master rather than target pointer), for safety.
Removed some leftover sounds.
This commit is contained in:
Marisa the Magician 2019-08-19 20:19:26 +02:00
commit f005fa3c14
4 changed files with 15 additions and 13 deletions

View file

@ -13,34 +13,34 @@ Class ModuleHitbox : Actor
}
override int DamageMobj( Actor inflictor, Actor source, int damage, Name mod, int flags, double angle )
{
if ( target )
if ( master )
{
if ( inflictor ) target.vel += level.Vec3Diff(inflictor.pos,pos).unit()*damage*0.2;
else if ( source ) target.vel += level.Vec3Diff(source.pos,pos).unit()*damage*0.2;
target.vel.z = 5;
if ( inflictor ) master.vel += level.Vec3Diff(inflictor.pos,pos).unit()*damage*0.2;
else if ( source ) master.vel += level.Vec3Diff(source.pos,pos).unit()*damage*0.2;
master.vel.z = 5;
}
if ( !target || (target.target && ((target.target == source) || target.target.isTeammate(source))) ) return 0;
target.bAMBUSH = true;
if ( !master || (master.target && ((master.target == source) || master.target.isTeammate(source))) ) return 0;
master.bAMBUSH = true;
return 0;
}
override void Tick()
{
Super.Tick();
if ( !target )
if ( !master )
{
Destroy();
return;
}
SetOrigin(target.pos,true);
if ( target.bMISSILE ) return;
SetOrigin(master.pos,true);
if ( master.bMISSILE ) return;
let bi = BlockThingsIterator.Create(self,32);
while ( bi.Next() )
{
if ( !bi.Thing || (bi.Thing != target.target) ) continue;
if ( !bi.Thing || (bi.Thing != master.target) ) continue;
if ( (Distance2D(bi.Thing)-bi.Thing.radius <= radius) && ((bi.Thing.pos.z <= pos.z+height) && (bi.Thing.pos.z+bi.Thing.height >= pos.z-height)) )
{
A_PlaySound("misc/i_pkup");
target.Destroy();
master.Destroy();
return;
}
}
@ -149,7 +149,7 @@ Class TranslocatorModule : Actor
return;
}
b = Spawn("ModuleHitbox",pos);
b.target = self;
b.master = self;
A_PlaySound("transloc/hum",CHAN_VOICE,0.5,true,2.0);
}

View file

@ -1974,7 +1974,7 @@ Class ShredCorpseHitbox : Actor
override void Tick()
{
Super.Tick();
if ( (!(target is 'UTPlayer') && !flak_corpsedamage) || !target || (target.Health > 0) || target.InStateSequence(target.CurState,target.FindState("XDeath")) )
if ( (!(target is 'UTPlayer') && !flak_corpsedamage) || !target || (target.Health > 0) || target.InStateSequence(target.CurState,target.FindState("XDeath",true)) )
{
Destroy();
return;
@ -1995,6 +1995,8 @@ Class ShredCorpseHitbox : Actor
}
override int DamageMobj( Actor inflictor, Actor source, int damage, Name mod, int flags, double angle )
{
// somehow target can spontaneously stop existing while this is happening
if ( !target ) return 0;
if ( (target is 'UTPlayer') && (mod == 'Zapped') && (target.sprite == target.GetSpriteIndex('PLD9')) )
{
// keep the zapping action on