From 92d0043a81705cb4fa6d1a78552ba50f16b7e207 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 25 Sep 2016 09:23:44 +0200 Subject: [PATCH] - undid part of the last commit and hopefully corrected it for good now. We have to be extremely careful with the player data, because there's just too much code littered around that has certain expectations about what needs to be present and what not. Obviously, when travelling in a hub, the player_t should be retained from the previous level. But we still have to set player_t::mo to the PlayerPawn from the savegame so that G_UnsnapshotLevel doesn't prematurely delete it and all associated voodoo dolls, because it checks player_t::mo to decide whether a player is valid or not. The actual deletion of this redundant PlayerPawn should only be done in G_FinishTravel, after the actual player has been fully set up --- src/p_saveg.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 2382d3ede5..9bb9f82e8e 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -537,7 +537,7 @@ void P_SerializeSounds(FSerializer &arc) //========================================================================== void CopyPlayer(player_t *dst, player_t *src, const char *name); -static void ReadOnePlayer(FSerializer &arc); +static void ReadOnePlayer(FSerializer &arc, bool skipload); static void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayersNow, bool skipload); static void SpawnExtraPlayers(); @@ -594,7 +594,7 @@ void P_SerializePlayers(FSerializer &arc, bool skipload) // first player present, no matter what their name. if (numPlayers == 1) { - ReadOnePlayer(arc); + ReadOnePlayer(arc, skipload); } else { @@ -617,7 +617,7 @@ void P_SerializePlayers(FSerializer &arc, bool skipload) // //========================================================================== -static void ReadOnePlayer(FSerializer &arc) +static void ReadOnePlayer(FSerializer &arc, bool skipload) { int i; const char *name = NULL; @@ -636,7 +636,15 @@ static void ReadOnePlayer(FSerializer &arc) didIt = true; player_t playerTemp; playerTemp.Serialize(arc); - CopyPlayer(&players[i], &playerTemp, name); + if (!skipload) + { + CopyPlayer(&players[i], &playerTemp, name); + } + else + { + // we need the player actor, so that G_FinishTravel can destroy it later. + players[i].mo = playerTemp.mo; + } } else { @@ -750,6 +758,13 @@ static void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayers } } } + else + { + for (i = 0; i < MAXPLAYERS; ++i) + { + players[i].mo = playertemp[i].mo; + } + } delete[] tempPlayerUsed; delete[] playertemp;