- player warp functions.

This commit is contained in:
Christoph Oelckers 2021-12-25 00:10:20 +01:00
parent 188af0dbb3
commit c7b80b80d8
2 changed files with 35 additions and 43 deletions

View file

@ -4020,7 +4020,7 @@ void DoPlayerWarpToUnderwater(PLAYERp pp)
{ {
USERp u = pp->Actor()->u(); USERp u = pp->Actor()->u();
auto sectu = pp->cursector; auto sectu = pp->cursector;
SPRITEp under_sp = nullptr, over_sp = nullptr; DSWActor* under_act = nullptr, * over_act = nullptr;
bool Found = false; bool Found = false;
if (Prediction) if (Prediction)
@ -4029,13 +4029,11 @@ void DoPlayerWarpToUnderwater(PLAYERp pp)
// search for DIVE_AREA "over" sprite for reference point // search for DIVE_AREA "over" sprite for reference point
SWStatIterator it(STAT_DIVE_AREA); SWStatIterator it(STAT_DIVE_AREA);
while (auto actor = it.Next()) while (over_act = it.Next())
{ {
over_sp = &actor->s(); if (TEST(over_act->spr.sector()->extra, SECTFX_DIVE_AREA) &&
over_act->spr.sector()->hasU() &&
if (TEST(over_sp->sector()->extra, SECTFX_DIVE_AREA) && over_act->spr.sector()->number == sectu->number)
over_sp->sector()->hasU() &&
over_sp->sector()->number == sectu->number)
{ {
Found = true; Found = true;
break; break;
@ -4047,13 +4045,11 @@ void DoPlayerWarpToUnderwater(PLAYERp pp)
// search for UNDERWATER "under" sprite for reference point // search for UNDERWATER "under" sprite for reference point
it.Reset(STAT_UNDERWATER); it.Reset(STAT_UNDERWATER);
while (auto actor = it.Next()) while (under_act = it.Next())
{ {
under_sp = &actor->s(); if (TEST(under_act->spr.sector()->extra, SECTFX_UNDERWATER) &&
under_act->spr.sector()->hasU() &&
if (TEST(under_sp->sector()->extra, SECTFX_UNDERWATER) && under_act->spr.sector()->number == sectu->number)
under_sp->sector()->hasU() &&
under_sp->sector()->number == sectu->number)
{ {
Found = true; Found = true;
break; break;
@ -4063,15 +4059,15 @@ void DoPlayerWarpToUnderwater(PLAYERp pp)
PRODUCTION_ASSERT(Found == true); PRODUCTION_ASSERT(Found == true);
// get the offset from the sprite // get the offset from the sprite
u->sx = over_sp->pos.X - pp->pos.X; u->sx = over_act->spr.pos.X - pp->pos.X;
u->sy = over_sp->pos.Y - pp->pos.Y; u->sy = over_act->spr.pos.Y - pp->pos.Y;
// update to the new x y position // update to the new x y position
pp->pos.X = under_sp->pos.X - u->sx; pp->pos.X = under_act->spr.pos.X - u->sx;
pp->pos.Y = under_sp->pos.Y - u->sy; pp->pos.Y = under_act->spr.pos.Y - u->sy;
auto over = over_sp->sector(); auto over = over_act->spr.sector();
auto under = under_sp->sector(); auto under = under_act->spr.sector();
if (GetOverlapSector(pp->pos.X, pp->pos.Y, &over, &under) == 2) if (GetOverlapSector(pp->pos.X, pp->pos.Y, &over, &under) == 2)
{ {
@ -4080,7 +4076,7 @@ void DoPlayerWarpToUnderwater(PLAYERp pp)
else else
pp->setcursector(over); pp->setcursector(over);
pp->pos.Z = under_sp->sector()->ceilingz + Z(6); pp->pos.Z = under_act->spr.sector()->ceilingz + Z(6);
pp->opos.X = pp->pos.X; pp->opos.X = pp->pos.X;
pp->opos.Y = pp->pos.Y; pp->opos.Y = pp->pos.Y;
@ -4095,7 +4091,7 @@ void DoPlayerWarpToSurface(PLAYERp pp)
USERp u = pp->Actor()->u(); USERp u = pp->Actor()->u();
auto sectu = pp->cursector; auto sectu = pp->cursector;
SPRITEp under_sp = nullptr, over_sp = nullptr; DSWActor* under_act = nullptr, * over_act = nullptr;
bool Found = false; bool Found = false;
if (Prediction) if (Prediction)
@ -4103,13 +4099,11 @@ void DoPlayerWarpToSurface(PLAYERp pp)
// search for UNDERWATER "under" sprite for reference point // search for UNDERWATER "under" sprite for reference point
SWStatIterator it(STAT_UNDERWATER); SWStatIterator it(STAT_UNDERWATER);
while (auto actor = it.Next()) while (under_act = it.Next())
{ {
under_sp = &actor->s(); if (TEST(under_act->spr.sector()->extra, SECTFX_UNDERWATER) &&
under_act->spr.sector()->hasU() &&
if (TEST(under_sp->sector()->extra, SECTFX_UNDERWATER) && under_act->spr.sector()->number == sectu->number)
under_sp->sector()->hasU() &&
under_sp->sector()->number == sectu->number)
{ {
Found = true; Found = true;
break; break;
@ -4121,13 +4115,11 @@ void DoPlayerWarpToSurface(PLAYERp pp)
// search for DIVE_AREA "over" sprite for reference point // search for DIVE_AREA "over" sprite for reference point
it.Reset(STAT_DIVE_AREA); it.Reset(STAT_DIVE_AREA);
while (auto actor = it.Next()) while (over_act = it.Next())
{ {
over_sp = &actor->s(); if (TEST(over_act->spr.sector()->extra, SECTFX_DIVE_AREA) &&
over_act->spr.sector()->hasU() &&
if (TEST(over_sp->sector()->extra, SECTFX_DIVE_AREA) && over_act->spr.sector()->number == sectu->number)
over_sp->sector()->hasU() &&
over_sp->sector()->number == sectu->number)
{ {
Found = true; Found = true;
break; break;
@ -4137,22 +4129,22 @@ void DoPlayerWarpToSurface(PLAYERp pp)
PRODUCTION_ASSERT(Found == true); PRODUCTION_ASSERT(Found == true);
// get the offset from the under sprite // get the offset from the under sprite
u->sx = under_sp->pos.X - pp->pos.X; u->sx = under_act->spr.pos.X - pp->pos.X;
u->sy = under_sp->pos.Y - pp->pos.Y; u->sy = under_act->spr.pos.Y - pp->pos.Y;
// update to the new x y position // update to the new x y position
pp->pos.X = over_sp->pos.X - u->sx; pp->pos.X = over_act->spr.pos.X - u->sx;
pp->pos.Y = over_sp->pos.Y - u->sy; pp->pos.Y = over_act->spr.pos.Y - u->sy;
auto over = over_sp->sector(); auto over = over_act->spr.sector();
auto under = under_sp->sector(); auto under = under_act->spr.sector();
if (GetOverlapSector(pp->pos.X, pp->pos.Y, &over, &under)) if (GetOverlapSector(pp->pos.X, pp->pos.Y, &over, &under))
{ {
pp->setcursector(over); pp->setcursector(over);
} }
pp->pos.Z = over_sp->sector()->floorz - Z(2); pp->pos.Z = over_act->spr.sector()->floorz - Z(2);
// set z range and wade depth so we know how high to set view // set z range and wade depth so we know how high to set view
DoPlayerZrange(pp); DoPlayerZrange(pp);
@ -6305,11 +6297,11 @@ void DoPlayerRun(PLAYERp pp)
else if (TEST(pp->cursector->extra, SECTFX_TRIGGER)) else if (TEST(pp->cursector->extra, SECTFX_TRIGGER))
{ {
auto sActor = FindNearSprite(pp->Actor(), STAT_TRIGGER); auto sActor = FindNearSprite(pp->Actor(), STAT_TRIGGER);
if (sActor && SP_TAG5(&sActor->s()) == TRIGGER_TYPE_REMOTE_SO) if (sActor && SP_TAG5(sActor) == TRIGGER_TYPE_REMOTE_SO)
{ {
pp->remoteActor = sActor; pp->remoteActor = sActor;
pp->KeyPressBits &= ~SB_OPEN; pp->KeyPressBits &= ~SB_OPEN;
DoPlayerBeginRemoteOperate(pp, &SectorObject[SP_TAG7(&sActor->s())]); DoPlayerBeginRemoteOperate(pp, &SectorObject[SP_TAG7(sActor)]);
return; return;
} }
} }

View file

@ -2318,7 +2318,7 @@ void PlayerOperateEnv(PLAYERp pp)
{ {
PlayerTakeSectorDamage(pp); PlayerTakeSectorDamage(pp);
} }
else if ((GetSpriteZOfBottom(&pp->Actor()->s()) >= sectp->floorz) && !TEST(pp->Flags, PF_DIVING)) else if ((ActorZOfBottom(pp->Actor()) >= sectp->floorz) && !TEST(pp->Flags, PF_DIVING))
{ {
PlayerTakeSectorDamage(pp); PlayerTakeSectorDamage(pp);
} }