From f431d51c2f74b22aa9e714e90a620ccfc8a3d9da Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Mon, 2 Jan 2023 11:53:10 +1100 Subject: [PATCH] - SW: Add inertia correction to `PlayerWarpUpdatePos()`. * Warping between sectors such as the clouds in $volcano now maintains perfect velocity, etc. --- source/games/sw/src/player.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index 305c4d758..09d0e2ab8 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -166,7 +166,7 @@ void DoPlayerDeathExplode(PLAYER* pp); void DoPlayerDeathFall(PLAYER* pp); void PlayerCheckValidMove(PLAYER* pp); -void PlayerWarpUpdatePos(PLAYER* pp); +void PlayerWarpUpdatePos(PLAYER* pp, const DVector3& oldpos); void DoPlayerBeginDiveNoWarp(PLAYER* pp); int PlayerCanDiveNoWarp(PLAYER* pp); void DoPlayerCurrent(PLAYER* pp); @@ -2140,12 +2140,15 @@ void DoPlayerMove(PLAYER* pp) } // check for warp - probably can remove from CeilingHit + const auto oldpos = actor->spr.pos; if (WarpPlane(actor->spr.pos, &pp->cursector, actor->getOffsetZ())) { - PlayerWarpUpdatePos(pp); + PlayerWarpUpdatePos(pp, oldpos); + } + else + { + DoPlayerZrange(pp); } - - DoPlayerZrange(pp); //PlayerSectorBound(pp, 1); @@ -3405,9 +3408,10 @@ void DoPlayerClimb(PLAYER* pp) LadderUpdate = true; } + const auto oldpos = pp->actor->spr.pos; if (WarpPlane(pp->actor->spr.pos, &pp->cursector, pp->actor->getOffsetZ())) { - PlayerWarpUpdatePos(pp); + PlayerWarpUpdatePos(pp, oldpos); LadderUpdate = true; } @@ -3655,12 +3659,12 @@ void DoPlayerBeginFly(PLAYER* pp) // //--------------------------------------------------------------------------- -void PlayerWarpUpdatePos(PLAYER* pp) +void PlayerWarpUpdatePos(PLAYER* pp, const DVector3& oldpos) { if (Prediction) return; - pp->actor->backuppos(); + pp->actor->opos += pp->actor->spr.pos - oldpos; DoPlayerZrange(pp); UpdatePlayerSprite(pp); }