From cb5f3f5b6917fd57ffd7ebd2661c15476f0437d1 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 22 Sep 2023 19:54:22 -0700 Subject: [PATCH 1/2] When respawning, return to first waypoint with consistent time --- src/d_player.h | 2 ++ src/k_respawn.c | 14 ++++++++++++++ src/p_saveg.c | 4 ++++ 3 files changed, 20 insertions(+) diff --git a/src/d_player.h b/src/d_player.h index 03efa55ec..b325137ea 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -342,6 +342,8 @@ struct respawnvars_t boolean manual; // Respawn coords were manually set, please respawn exactly there boolean fromRingShooter; // Respawn was from Ring Shooter, don't allow E-Brake drop boolean init; + boolean fast; // Deaths after long airtime can leave you far away from your first waypoint, speed over there! + fixed_t returnspeed; // Used for consistent timing for deathpoint-to-first-waypoint travel. }; typedef enum diff --git a/src/k_respawn.c b/src/k_respawn.c index ff6ef657a..dbf40323a 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -287,6 +287,8 @@ void K_DoIngameRespawn(player_t *player) player->respawn.timer = RESPAWN_TIME; player->respawn.state = RESPAWNST_MOVE; player->respawn.init = true; + player->respawn.fast = true; + player->respawn.returnspeed = 0; player->respawn.airtimer = player->airtime; player->respawn.truedeath = !!(player->pflags & PF_FAULT); @@ -338,6 +340,7 @@ static void K_MovePlayerToRespawnPoint(player_t *player) { const int airCompensation = 128; fixed_t realstepamt = (64 * mapobjectscale); + UINT32 returntime = TICRATE; fixed_t stepamt; vector3_t dest, step, laser; @@ -379,6 +382,14 @@ static void K_MovePlayerToRespawnPoint(player_t *player) player->mo->z - dest.z ); + // Traveling from death location to first waypoint? Set speed to get there in a fixed time. + if (player->respawn.fast) + { + if (player->respawn.returnspeed == 0) + player->respawn.returnspeed = dist / returntime; + stepamt = player->respawn.returnspeed; + } + if (dist <= stepamt) { // Reduce by the amount we needed to get to this waypoint @@ -391,6 +402,9 @@ static void K_MovePlayerToRespawnPoint(player_t *player) player->mo->z = dest.z; P_SetThingPosition(player->mo); + // We are no longer traveling from death location to 1st waypoint, so use standard timings + player->respawn.fast = false; + // At the first valid waypoint, permit extra player control options. player->respawn.init = false; diff --git a/src/p_saveg.c b/src/p_saveg.c index 7dafce936..21414f22c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -567,6 +567,8 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT32(save->p, players[i].respawn.dropdash); WRITEUINT8(save->p, players[i].respawn.truedeath); WRITEUINT8(save->p, players[i].respawn.manual); + WRITEUINT8(save->p, players[i].respawn.fast); + WRITEUINT32(save->p, players[i].respawn.returnspeed); // botvars_t WRITEUINT8(save->p, players[i].bot); @@ -1043,6 +1045,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].respawn.dropdash = READUINT32(save->p); players[i].respawn.truedeath = READUINT8(save->p); players[i].respawn.manual = READUINT8(save->p); + players[i].respawn.fast = READUINT8(save->p); + players[i].respawn.returnspeed = READUINT32(save->p); // botvars_t players[i].bot = READUINT8(save->p); From 346f6c4ab02fc952ef7f3b761e44a1aa9eaa609a Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 22 Sep 2023 20:17:28 -0700 Subject: [PATCH 2/2] Don't slow down fast respawns from loss-of-control etc --- src/k_respawn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_respawn.c b/src/k_respawn.c index dbf40323a..cec0f57df 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -387,7 +387,7 @@ static void K_MovePlayerToRespawnPoint(player_t *player) { if (player->respawn.returnspeed == 0) player->respawn.returnspeed = dist / returntime; - stepamt = player->respawn.returnspeed; + stepamt = max(stepamt, player->respawn.returnspeed); } if (dist <= stepamt)