- 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
This commit is contained in:
Christoph Oelckers 2016-09-25 09:23:44 +02:00
parent 6a6a0e8017
commit 92d0043a81

View file

@ -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;