From 371cc18bf68dc194a2f74b18f4c26e9a9165962f Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 12 Apr 2020 21:04:07 -0400 Subject: [PATCH] Update ALL finish line distances & positions, separately, before player thinkers happen, ensuring it's never inaccurate --- src/k_kart.c | 9 ++------- src/k_kart.h | 1 + src/p_tick.c | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 7ad459ad1..dab36aaf9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6287,10 +6287,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) void K_KartPlayerAfterThink(player_t *player) { - // Moved to afterthink, as at this point the players have had their distances to the finish line updated - // and this will correctly account for all players - K_KartUpdatePosition(player); - if (player->kartstuff[k_curshield] || player->kartstuff[k_invincibilitytimer] || (player->kartstuff[k_growshrinktimer] != 0 && player->kartstuff[k_growshrinktimer] % 5 == 4)) // 4 instead of 0 because this is afterthink! @@ -6607,7 +6603,7 @@ static boolean K_PlayerCloserToNextWaypoints(waypoint_t *const waypoint, player_ } /*-------------------------------------------------- - static void K_UpdateDistanceFromFinishLine(player_t *const player) + void K_UpdateDistanceFromFinishLine(player_t *const player) Updates the distance a player has to the finish line. @@ -6617,7 +6613,7 @@ static boolean K_PlayerCloserToNextWaypoints(waypoint_t *const waypoint, player_ Return:- None --------------------------------------------------*/ -static void K_UpdateDistanceFromFinishLine(player_t *const player) +void K_UpdateDistanceFromFinishLine(player_t *const player) { if ((player != NULL) && (player->mo != NULL)) { @@ -7167,7 +7163,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) boolean HOLDING_ITEM = (player->kartstuff[k_itemheld] || player->kartstuff[k_eggmanheld]); boolean NO_HYUDORO = (player->kartstuff[k_stolentimer] == 0 && player->kartstuff[k_stealingtimer] == 0); - K_UpdateDistanceFromFinishLine(player); player->pflags &= ~PF_HITFINISHLINE; if (!player->exiting) diff --git a/src/k_kart.h b/src/k_kart.h index 8dc5604b8..8f47b9780 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -59,6 +59,7 @@ void K_UpdateHnextList(player_t *player, boolean clean); void K_DropHnextList(player_t *player); void K_RepairOrbitChain(mobj_t *orbit); player_t *K_FindJawzTarget(mobj_t *actor, player_t *source); +void K_UpdateDistanceFromFinishLine(player_t *const player); boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y); INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue); INT32 K_GetKartDriftSparkValue(player_t *player); diff --git a/src/p_tick.c b/src/p_tick.c index d7359b307..43ca98416 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -616,6 +616,17 @@ void P_Ticker(boolean run) G_ReadDemoTiccmd(&players[i].cmd, i); } + // First loop: Ensure all players' distance to the finish line are all accurate + for (i = 0; i < MAXPLAYERS; i++) + if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) + K_UpdateDistanceFromFinishLine(&players[i]); + + // Second loop: Ensure all player positions reflect everyone's distances + for (i = 0; i < MAXPLAYERS; i++) + if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) + K_KartUpdatePosition(&players[i]); + + // OK! Now that we got all of that sorted, players can think! for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) P_PlayerThink(&players[i]); @@ -778,6 +789,17 @@ void P_PreTicker(INT32 frames) { P_MapStart(); + // First loop: Ensure all players' distance to the finish line are all accurate + for (i = 0; i < MAXPLAYERS; i++) + if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) + K_UpdateDistanceFromFinishLine(&players[i]); + + // Second loop: Ensure all player positions reflect everyone's distances + for (i = 0; i < MAXPLAYERS; i++) + if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) + K_KartUpdatePosition(&players[i]); + + // OK! Now that we got all of that sorted, players can think! for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) {