diff --git a/src/d_clisrv.c b/src/d_clisrv.c index f53d1f35a..860f14b04 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2608,15 +2608,6 @@ void CL_RemovePlayer(INT32 playernum, kickreason_t reason) LUA_HookPlayerQuit(&players[playernum], reason); // Lua hook for player quitting - // don't look through someone's view who isn't there - if (playernum == displayplayers[0] && !demo.playback) - { - // Call ViewpointSwitch hooks here. - // The viewpoint was forcibly changed. - LUA_HookViewpointSwitch(&players[consoleplayer], &players[consoleplayer], true); - displayplayers[0] = consoleplayer; - } - G_RemovePartyMember(playernum); // Reset player data @@ -2636,6 +2627,9 @@ void CL_RemovePlayer(INT32 playernum, kickreason_t reason) LUA_InvalidatePlayer(&players[playernum]); + // don't look through someone's view who isn't there + G_ResetViews(); + K_CheckBumpers(); P_CheckRacers(); } diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 53fe94b64..e0491a74c 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1589,21 +1589,8 @@ static void FinalisePlaystateChange(INT32 playernum) K_StripItems(&players[playernum]); } - // Reset away view (some code referenced from P_SpectatorJoinGame) - { - UINT8 i = 0; - INT32 *localplayertable = (splitscreen_partied[consoleplayer] ? splitscreen_party[consoleplayer] : g_localplayers); - - for (i = 0; i <= r_splitscreen; i++) - { - if (localplayertable[i] == playernum) - { - LUA_HookViewpointSwitch(players+playernum, players+playernum, true); - displayplayers[i] = playernum; - break; - } - } - } + // Reset away view + G_ResetViews(); K_CheckBumpers(); // SRB2Kart P_CheckRacers(); // also SRB2Kart diff --git a/src/g_game.c b/src/g_game.c index d1689421e..136ca8a1d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1919,7 +1919,7 @@ boolean G_CanView(INT32 playernum, UINT8 viewnum, boolean onlyactive) INT32 G_FindView(INT32 startview, UINT8 viewnum, boolean onlyactive, boolean reverse) { INT32 i, dir = reverse ? -1 : 1; - startview = min(max(startview, 0), MAXPLAYERS); + startview = min(max(startview, -1), MAXPLAYERS); for (i = startview; i < MAXPLAYERS && i >= 0; i += dir) { if (G_CanView(i, viewnum, onlyactive)) @@ -1990,7 +1990,14 @@ void G_ResetView(UINT8 viewnum, INT32 playernum, boolean onlyactive) /* Check if anyone is available to view. */ if (( playernum = G_FindView(playernum, viewnum, onlyactive, playernum < olddisplayplayer) ) == -1) - return; + { + /* Fall back on true self */ + playernum = g_localplayers[viewnum-1]; + } + + // Call ViewpointSwitch hooks here. + // The viewpoint was forcibly changed. + LUA_HookViewpointSwitch(&players[g_localplayers[viewnum - 1]], &players[playernum], true); /* Focus our target view first so that we don't take its player. */ (*displayplayerp) = playernum; @@ -1998,6 +2005,10 @@ void G_ResetView(UINT8 viewnum, INT32 playernum, boolean onlyactive) { camerap = &camera[viewnum-1]; P_ResetCamera(&players[(*displayplayerp)], camerap); + + // Why does it need to be done twice? + R_ResetViewInterpolation(viewnum); + R_ResetViewInterpolation(viewnum); } if (viewnum > splits) @@ -2052,8 +2063,8 @@ void G_ResetViews(void) /* Demote splits */ if (playersviewable < splits) { - splits = playersviewable; - r_splitscreen = max(splits-1, 0); + splits = max(playersviewable, splitscreen + 1); // don't delete local players + r_splitscreen = splits - 1; R_ExecuteSetViewSize(); } diff --git a/src/k_director.c b/src/k_director.c index a35c3da84..4f5737b4b 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -238,6 +238,13 @@ void K_UpdateDirector(void) return; } + // if there's only one player left in the list, just switch to that player + if (directorinfo.sortedplayers[0] != -1 && directorinfo.sortedplayers[1] == -1) + { + K_DirectorSwitch(directorinfo.sortedplayers[0], false); + return; + } + // aaight, time to walk through the standings to find the first interesting pair // NB: targetposition/sortedplayers is 0-indexed, aiming at the "back half" of a given pair by default. // we adjust for this when comparing to player->position or when looking at the leading player, Don't Freak Out @@ -291,4 +298,4 @@ void K_UpdateDirector(void) break; } -} \ No newline at end of file +}