diff --git a/src/p_spec.c b/src/p_spec.c index 89733f6fa..41b0f4841 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1956,7 +1956,46 @@ static void K_HandleLapIncrement(player_t *player) player->cheatchecknum = 0; player->laps++; - K_UpdateAllPlayerPositions(); + + // P_DoPlayerExit can edit latestlap, so we do this first + boolean lapisfresh = (player->laps > player->latestlap); + if (lapisfresh) // mcgamer would be proud + { + player->latestlap = player->laps; + } + + // finished race exit setup + if (player->laps > numlaps) + { + pflags_t applyflags = 0; + if (specialstageinfo.valid == true) + { + // Don't permit a win just by sneaking ahead of the UFO/emerald. + if (!(specialstageinfo.ufo == NULL || P_MobjWasRemoved(specialstageinfo.ufo))) + { + applyflags |= PF_NOCONTEST; + + HU_DoTitlecardCEcho(player, "EMPTY\\HANDED?", false); + } + } + + P_DoPlayerExit(player, applyflags); + + if (netgame && lapisfresh) + CON_LogMessage(va(M_GetText("%s has finished the race.\n"), player_names[player-players])); + } + else + { + UINT32 skinflags = (demo.playback) + ? demo.skinlist[demo.currentskinid[(player-players)]].flags + : skins[player->skin].flags; + if (skinflags & SF_IRONMAN) + { + SetRandomFakePlayerSkin(player, true); + } + + K_UpdateAllPlayerPositions(); // P_DoPlayerExit calls this + } if (G_TimeAttackStart() && !linecrossed) { @@ -1979,16 +2018,13 @@ static void K_HandleLapIncrement(player_t *player) rainbowstartavailable = false; } - if (player->laps == 1 && modeattacking & ATTACKING_SPB) + if (player->laps == 1 && (modeattacking & ATTACKING_SPB)) { P_SpawnMobj(player->mo->x - FixedMul(1000*mapobjectscale, FINECOSINE(player->mo->angle >> ANGLETOFINESHIFT)), player->mo->y - FixedMul(1000*mapobjectscale, FINESINE(player->mo->angle >> ANGLETOFINESHIFT)), player->mo->z, MT_SPB); } - if (netgame && player->laps > numlaps) - CON_LogMessage(va(M_GetText("%s has finished the race.\n"), player_names[player-players])); - if (gametyperules & GTR_SPECIALSTART) { if (player->laps > numlaps) @@ -2019,7 +2055,7 @@ static void K_HandleLapIncrement(player_t *player) } } - if (player->laps > player->latestlap) + if (lapisfresh) { if (player->laps > 1) { @@ -2050,8 +2086,6 @@ static void K_HandleLapIncrement(player_t *player) } } - player->latestlap = player->laps; - // Set up lap animation vars if (player->latestlap > 1) { @@ -2074,34 +2108,6 @@ static void K_HandleLapIncrement(player_t *player) } } - // finished race exit setup - if (player->laps > numlaps) - { - pflags_t applyflags = 0; - if (specialstageinfo.valid == true) - { - // Don't permit a win just by sneaking ahead of the UFO/emerald. - if (!(specialstageinfo.ufo == NULL || P_MobjWasRemoved(specialstageinfo.ufo))) - { - applyflags |= PF_NOCONTEST; - - HU_DoTitlecardCEcho(player, "EMPTY\\HANDED?", false); - } - } - - P_DoPlayerExit(player, applyflags); - } - else - { - UINT32 skinflags = (demo.playback) - ? demo.skinlist[demo.currentskinid[(player-players)]].flags - : skins[player->skin].flags; - if (skinflags & SF_IRONMAN) - { - SetRandomFakePlayerSkin(player, true); - } - } - thwompsactive = true; // Lap 2 effects { diff --git a/src/p_user.c b/src/p_user.c index 8b99043a3..984a61adf 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1275,7 +1275,7 @@ void P_DoPlayerExit(player_t *player, pflags_t flags) } } - K_InitPlayerTally(player); + //K_InitPlayerTally(player); -- we defer this to P_PlayerAfterThink if (demo.playback == false) { @@ -4465,6 +4465,12 @@ void P_PlayerAfterThink(player_t *player) } #endif + if (player->exiting && !K_PlayerTallyActive(player)) + { + // We defer P_DoPlayerExit tallies to the end of the tic. + K_InitPlayerTally(player); + } + if (P_IsObjectOnGround(player->mo) == true) { player->outrun = 0;