- route checkhitsprite fully through the virtual interface so that the player class can finally be exported.

This commit is contained in:
Christoph Oelckers 2022-12-22 10:50:48 +01:00
parent 60af1b4c62
commit 0a91a9a199
17 changed files with 37 additions and 76 deletions

View file

@ -220,7 +220,7 @@ void hitradius_d(DDukeActor* actor, int r, int hp1, int hp2, int hp3, int h
{ {
if (badguy(act2) && !cansee(act2->spr.pos.plusZ(q), act2->sector(), actor->spr.pos.plusZ(q), actor->sector())) if (badguy(act2) && !cansee(act2->spr.pos.plusZ(q), act2->sector(), actor->spr.pos.plusZ(q), actor->sector()))
continue; continue;
fi.checkhitsprite(act2, actor); checkhitsprite(act2, actor);
} }
} }
else if (act2->spr.extra >= 0 && act2 != actor && ((act2->flags1 & SFLAG_HITRADIUS_FLAG2) || badguy(act2) || (act2->spr.cstat & CSTAT_SPRITE_BLOCK_ALL))) else if (act2->spr.extra >= 0 && act2 != actor && ((act2->flags1 & SFLAG_HITRADIUS_FLAG2) || badguy(act2) || (act2->spr.cstat & CSTAT_SPRITE_BLOCK_ALL)))
@ -267,7 +267,7 @@ void hitradius_d(DDukeActor* actor, int r, int hp1, int hp2, int hp3, int h
} }
if ((act2->flags1 & SFLAG_HITRADIUSCHECK)) if ((act2->flags1 & SFLAG_HITRADIUSCHECK))
fi.checkhitsprite(act2, actor); checkhitsprite(act2, actor);
} }
else if (actor->spr.extra == 0) act2->hitextra = 0; else if (actor->spr.extra == 0) act2->hitextra = 0;

View file

@ -207,7 +207,7 @@ void hitradius_r(DDukeActor* actor, int r, int hp1, int hp2, int hp3, int h
if (badguy(act2) && !cansee(act2->spr.pos.plusZ(q), act2->sector(), actor->spr.pos.plusZ(q), actor->sector())) if (badguy(act2) && !cansee(act2->spr.pos.plusZ(q), act2->sector(), actor->spr.pos.plusZ(q), actor->sector()))
continue; continue;
fi.checkhitsprite(act2, actor); checkhitsprite(act2, actor);
} }
} }
else if (act2->spr.extra >= 0 && act2 != actor && ((act2->flags1 & SFLAG_HITRADIUS_FLAG2) || badguy(act2) || (act2->spr.cstat & CSTAT_SPRITE_BLOCK_ALL))) else if (act2->spr.extra >= 0 && act2 != actor && ((act2->flags1 & SFLAG_HITRADIUS_FLAG2) || badguy(act2) || (act2->spr.cstat & CSTAT_SPRITE_BLOCK_ALL)))
@ -256,7 +256,7 @@ void hitradius_r(DDukeActor* actor, int r, int hp1, int hp2, int hp3, int h
} }
if ((act2->flags1 & SFLAG_HITRADIUSCHECK)) if ((act2->flags1 & SFLAG_HITRADIUSCHECK))
fi.checkhitsprite(act2, actor); checkhitsprite(act2, actor);
if (act2->spr.picnum != RTILE_RADIUSEXPLOSION && if (act2->spr.picnum != RTILE_RADIUSEXPLOSION &&
Owner && Owner->spr.statnum < MAXSTATUS) Owner && Owner->spr.statnum < MAXSTATUS)

View file

@ -39,8 +39,6 @@ bool checkaccessswitch_d(int snum, int pal, DDukeActor *act, walltype* w);
bool checkaccessswitch_r(int snum, int pal, DDukeActor* act, walltype* w); bool checkaccessswitch_r(int snum, int pal, DDukeActor* act, walltype* w);
void activatebysector_d(sectortype* sect, DDukeActor* j); void activatebysector_d(sectortype* sect, DDukeActor* j);
void activatebysector_r(sectortype* sect, DDukeActor* j); void activatebysector_r(sectortype* sect, DDukeActor* j);
void checkhitsprite_d(DDukeActor* i, DDukeActor* sn);
void checkhitsprite_r(DDukeActor* i, DDukeActor* sn);
void checkhitdefault_d(DDukeActor* i, DDukeActor* sn); void checkhitdefault_d(DDukeActor* i, DDukeActor* sn);
void checkhitdefault_r(DDukeActor* i, DDukeActor* sn); void checkhitdefault_r(DDukeActor* i, DDukeActor* sn);
void checksectors_d(int snum); void checksectors_d(int snum);
@ -97,7 +95,6 @@ void SetDispatcher()
initactorflags_d, initactorflags_d,
checkaccessswitch_d, checkaccessswitch_d,
activatebysector_d, activatebysector_d,
checkhitsprite_d,
checkhitdefault_d, checkhitdefault_d,
checksectors_d, checksectors_d,
@ -130,7 +127,6 @@ void SetDispatcher()
initactorflags_r, initactorflags_r,
checkaccessswitch_r, checkaccessswitch_r,
activatebysector_r, activatebysector_r,
checkhitsprite_r,
checkhitdefault_r, checkhitdefault_r,
checksectors_r, checksectors_r,

View file

@ -77,7 +77,6 @@ struct Dispatcher
void (*initactorflags)(); void (*initactorflags)();
bool (*checkaccessswitch)(int snum, int switchpal, DDukeActor* act, walltype* w); bool (*checkaccessswitch)(int snum, int switchpal, DDukeActor* act, walltype* w);
void (*activatebysector)(sectortype* sect, DDukeActor* j); void (*activatebysector)(sectortype* sect, DDukeActor* j);
void (*checkhitsprite)(DDukeActor* i, DDukeActor* sn);
void (*checkhitdefault)(DDukeActor* i, DDukeActor* sn); void (*checkhitdefault)(DDukeActor* i, DDukeActor* sn);
void (*checksectors)(int low); void (*checksectors)(int low);
@ -112,7 +111,7 @@ void CallInitialize(DDukeActor* actor);
void CallTick(DDukeActor* actor); void CallTick(DDukeActor* actor);
bool CallOperate(DDukeActor* actor, int plnum); bool CallOperate(DDukeActor* actor, int plnum);
void CallAction(DDukeActor* actor); void CallAction(DDukeActor* actor);
void CallOnHit(DDukeActor* actor, DDukeActor* hitter); void checkhitsprite(DDukeActor* actor, DDukeActor* hitter);
void CallOnHurt(DDukeActor* actor, player_struct* hitter); void CallOnHurt(DDukeActor* actor, player_struct* hitter);
void CallOnTouch(DDukeActor* actor, player_struct* hitter); void CallOnTouch(DDukeActor* actor, player_struct* hitter);
bool CallOnUse(DDukeActor* actor, player_struct* user); bool CallOnUse(DDukeActor* actor, player_struct* user);

View file

@ -510,7 +510,7 @@ void CallAction(DDukeActor* actor)
} }
} }
void CallOnHit(DDukeActor* actor, DDukeActor* hitter) void checkhitsprite(DDukeActor* actor, DDukeActor* hitter)
{ {
IFVIRTUALPTR(actor, DDukeActor, onHit) IFVIRTUALPTR(actor, DDukeActor, onHit)
{ {

View file

@ -185,7 +185,7 @@ static void shootknee(DDukeActor* actor, int p, DVector3 pos, DAngle ang)
} }
if (hit.actor() && ! isaccessswitch(hit.actor()->spr.spritetexture())) if (hit.actor() && ! isaccessswitch(hit.actor()->spr.spritetexture()))
{ {
fi.checkhitsprite(hit.actor(), knee); checkhitsprite(hit.actor(), knee);
if (p >= 0) checkhitswitch(p, nullptr, hit.actor()); if (p >= 0) checkhitswitch(p, nullptr, hit.actor());
} }
@ -341,7 +341,7 @@ static void shootweapon(DDukeActor *actor, int p, DVector3 pos, DAngle ang, int
if (hit.actor()) if (hit.actor())
{ {
fi.checkhitsprite(hit.actor(), spark); checkhitsprite(hit.actor(), spark);
if (hit.actor()->isPlayer() && (ud.coop != 1 || ud.ffire == 1)) if (hit.actor()->isPlayer() && (ud.coop != 1 || ud.ffire == 1))
{ {
spark->spr.scale = DVector2(0, 0); spark->spr.scale = DVector2(0, 0);
@ -431,7 +431,7 @@ static void shootweapon(DDukeActor *actor, int p, DVector3 pos, DAngle ang, int
if (hit.actor()) if (hit.actor())
{ {
fi.checkhitsprite(hit.actor(), spark); checkhitsprite(hit.actor(), spark);
if (!hit.actor()->isPlayer()) if (!hit.actor()->isPlayer())
spawn(spark, PClass::FindActor(NAME_DukeSmallSmoke)); spawn(spark, PClass::FindActor(NAME_DukeSmallSmoke));
else spark->spr.scale = DVector2(0, 0); else spark->spr.scale = DVector2(0, 0);
@ -853,7 +853,7 @@ static void shootgrowspark(DDukeActor* actor, int p, DVector3 pos, DAngle ang)
if (zvel < 0 && (hit.hitSector->ceilingstat & CSTAT_SECTOR_SKY) == 0) if (zvel < 0 && (hit.hitSector->ceilingstat & CSTAT_SECTOR_SKY) == 0)
checkhitceiling(hit.hitSector); checkhitceiling(hit.hitSector);
} }
else if (hit.actor() != nullptr) fi.checkhitsprite(hit.actor(), spark); else if (hit.actor() != nullptr) checkhitsprite(hit.actor(), spark);
else if (hit.hitWall != nullptr) else if (hit.hitWall != nullptr)
{ {
if (!isaccessswitch(hit.hitWall->walltexture)) if (!isaccessswitch(hit.hitWall->walltexture))

View file

@ -162,7 +162,7 @@ static void shootmelee(DDukeActor *actor, int p, DVector3 pos, DAngle ang, int a
if (hit.actor() && !isaccessswitch(hit.actor()->spr.spritetexture())) if (hit.actor() && !isaccessswitch(hit.actor()->spr.spritetexture()))
{ {
fi.checkhitsprite(hit.actor(), wpn); checkhitsprite(hit.actor(), wpn);
if (p >= 0) checkhitswitch(p, nullptr, hit.actor()); if (p >= 0) checkhitswitch(p, nullptr, hit.actor());
} }
else if (hit.hitWall) else if (hit.hitWall)
@ -319,7 +319,7 @@ static void shootweapon(DDukeActor* actor, int p, DVector3 pos, DAngle ang, int
{ {
if (hit.actor()->spr.picnum == RTILE_TORNADO) if (hit.actor()->spr.picnum == RTILE_TORNADO)
return; return;
fi.checkhitsprite(hit.actor(), spark); checkhitsprite(hit.actor(), spark);
if (hit.actor()->isPlayer() && (ud.coop != 1 || ud.ffire == 1)) if (hit.actor()->isPlayer() && (ud.coop != 1 || ud.ffire == 1))
{ {
auto jib = spawn(spark, RTILE_JIBS6); auto jib = spawn(spark, RTILE_JIBS6);
@ -408,7 +408,7 @@ static void shootweapon(DDukeActor* actor, int p, DVector3 pos, DAngle ang, int
if (hit.actor()) if (hit.actor())
{ {
fi.checkhitsprite(hit.actor(), spark); checkhitsprite(hit.actor(), spark);
if (!hit.actor()->isPlayer()) if (!hit.actor()->isPlayer())
spawn(spark, PClass::FindActor(NAME_DukeSmallSmoke)); spawn(spark, PClass::FindActor(NAME_DukeSmallSmoke));
else spark->spr.scale = DVector2(0, 0); else spark->spr.scale = DVector2(0, 0);

View file

@ -272,23 +272,6 @@ void checkhitdefault_d(DDukeActor* targ, DDukeActor* proj)
} }
} }
void checkhitsprite_d(DDukeActor* targ, DDukeActor* proj)
{
if (targ->GetClass() != RUNTIME_CLASS(DDukeActor))
{
CallOnHit(targ, proj);
return;
}
if (targ->IsKindOf(NAME_DukePlayerOnWater))
{
targ = targ->GetOwner();
if (!targ) return;
}
checkhitdefault_d(targ, proj);
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// taken out of checksectors to eliminate some gotos. // taken out of checksectors to eliminate some gotos.

View file

@ -242,28 +242,6 @@ void checkhitdefault_r(DDukeActor* targ, DDukeActor* proj)
} }
} }
void checkhitsprite_r(DDukeActor* targ, DDukeActor* proj)
{
if (targ->GetClass() != RUNTIME_CLASS(DDukeActor))
{
CallOnHit(targ, proj);
return;
}
if (isRRRA()) switch (targ->spr.picnum)
{
case RTILE_IRONWHEELSWITCH:
break;
}
if (targ->IsKindOf(NAME_DukePlayerOnWater))
{
targ = targ->GetOwner();
if (!targ) return;
}
checkhitdefault_r(targ, proj);
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// //

View file

@ -137,7 +137,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Duke, GetSoundFlags, duke_GetSoundFlags)
static int Duke_badguypic(int spawnno) static int Duke_badguypic(int spawnno)
{ {
auto clstype = GetSpawnType(spawnno); auto clstype = GetSpawnType(spawnno);
if (clstype->IsDescendantOf(RUNTIME_CLASS(DDukeActor))) if (clstype && clstype->IsDescendantOf(RUNTIME_CLASS(DDukeActor)))
return badguy(static_cast<DDukeActor*>(GetDefaultByType(clstype))); return badguy(static_cast<DDukeActor*>(GetDefaultByType(clstype)));
return false; return false;
} }
@ -596,19 +596,6 @@ DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, isplayer, duke_isplayer)
ACTION_RETURN_INT(duke_isplayer(self)); ACTION_RETURN_INT(duke_isplayer(self));
} }
void DukeActor_checkhitsprite(DDukeActor* act, DDukeActor* hitter)
{
fi.checkhitsprite(act, hitter);
}
DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, checkhitsprite, DukeActor_checkhitsprite)
{
PARAM_SELF_PROLOGUE(DDukeActor);
PARAM_POINTER(h, DDukeActor);
DukeActor_checkhitsprite(self, h);
return 0;
}
int duke_spw(DDukeActor* act) int duke_spw(DDukeActor* act)
{ {
auto tex = TexMan.GetGameTexture(act->spr.spritetexture()); auto tex = TexMan.GetGameTexture(act->spr.spritetexture());

View file

@ -456,5 +456,7 @@ spawnclasses
4427 = DukeHotMeat 4427 = DukeHotMeat
4340 = DukeLavaBubble 4340 = DukeLavaBubble
1405 = DukePlayerPawn, noskill
} }

View file

@ -370,4 +370,6 @@ spawnclasses
2097 = RedneckTesla 2097 = RedneckTesla
1990 = RedneckTikilamp 1990 = RedneckTikilamp
3845 = DukePlayerPawn, noskill
} }

View file

@ -73,7 +73,7 @@ class DukeFlamethrowerFlame : DukeActor
if (coll.type == kHitSprite) if (coll.type == kHitSprite)
{ {
let hitact = DukeActor(coll.hitActor()); let hitact = DukeActor(coll.hitActor());
hitact.checkhitsprite(self); hitact.OnHit(self);
if (hitact.isPlayer()) if (hitact.isPlayer())
hitact.PlayActorSound("PISTOL_BODYHIT"); hitact.PlayActorSound("PISTOL_BODYHIT");
} }

View file

@ -1,3 +1,11 @@
class DukePlayerPawn : DukeActor
{
default
{
pic "APLAYER";
}
}
class DukePlayerOnWater : DukeActor class DukePlayerOnWater : DukeActor
{ {
default default
@ -17,6 +25,14 @@ class DukePlayerOnWater : DukeActor
} }
self.ChangeStat(STAT_DUMMYPLAYER); self.ChangeStat(STAT_DUMMYPLAYER);
} }
override void OnHit(DukeActor proj)
{
// propagate the hit to its owner.
let owner = self.ownerActor;
if (owner && self != owner) owner.OnHit(proj);
}
} }
class DukePlayerLyingDead : DukeActor class DukePlayerLyingDead : DukeActor

View file

@ -72,7 +72,7 @@ class DukeProjectile : DukeActor
virtual bool weaponhitsprite_pre(DukeActor targ) virtual bool weaponhitsprite_pre(DukeActor targ)
{ {
targ.checkhitsprite(self); targ.OnHit(self);
return false; return false;
} }

View file

@ -49,7 +49,7 @@ class DukeQueball : DukeActor
// the logic here was inverted, so to set things right the type check had to be added. // the logic here was inverted, so to set things right the type check had to be added.
let targ = DukeActor(colli.hitactor()); let targ = DukeActor(colli.hitactor());
if (targ is 'DukeQueball') if (targ is 'DukeQueball')
targ.checkhitsprite(self); targ.OnHit(self);
} }
self.vel.X -= 1/16.; self.vel.X -= 1/16.;

View file

@ -199,8 +199,6 @@ class DukeActor : CoreActor native
native void operatesectors(sectortype sec); native void operatesectors(sectortype sec);
native int SpriteWidth(); native int SpriteWidth();
native void checkhitsprite(DukeActor hitter);
virtual native void Tick(); virtual native void Tick();