Fix netsave issues

This commit is contained in:
Lactozilla 2023-06-27 13:18:13 -03:00
parent e486556f4b
commit 685adefaa4
5 changed files with 60 additions and 76 deletions

View file

@ -1540,7 +1540,7 @@ static boolean SV_SendServerConfig(INT32 node)
} }
#ifndef NONET #ifndef NONET
#define SAVEGAMESIZE (2048*1024) //(768*1024) #define SAVEGAMESIZE (8192*1024) // was (768*1024)
static boolean SV_ResendingSavegameToAnyone(void) static boolean SV_ResendingSavegameToAnyone(void)
{ {

View file

@ -134,7 +134,6 @@ static void P_NetArchivePlayers(void)
{ {
INT32 i, j; INT32 i, j;
UINT16 flags; UINT16 flags;
// size_t q;
WRITEUINT32(save_p, ARCHIVEBLOCK_PLAYERS); WRITEUINT32(save_p, ARCHIVEBLOCK_PLAYERS);
@ -3061,7 +3060,7 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
mobj->mobjnum = READUINT32(save_p); mobj->mobjnum = READUINT32(save_p);
// Lactozilla: Unarchive world number // Unarchive world number
mobj->worldnum = READUINT32(save_p); mobj->worldnum = READUINT32(save_p);
if (mobj->worldnum == 0xFFFFFFFF) if (mobj->worldnum == 0xFFFFFFFF)
I_Error("Unknown world"); I_Error("Unknown world");
@ -3723,7 +3722,10 @@ static void P_NetUnArchiveThinkers(void)
// clear sector thinker pointers so they don't point to non-existant thinkers for all of eternity // clear sector thinker pointers so they don't point to non-existant thinkers for all of eternity
for (i = 0; i < numsectors; i++) for (i = 0; i < numsectors; i++)
{ {
sectors[i].floordata = sectors[i].ceilingdata = sectors[i].lightingdata = sectors[i].fadecolormapdata = NULL; unarchiveworld->sectors[i].floordata = NULL;
unarchiveworld->sectors[i].ceilingdata = NULL;
unarchiveworld->sectors[i].lightingdata = NULL;
unarchiveworld->sectors[i].fadecolormapdata = NULL;
} }
// read in saved thinkers // read in saved thinkers
@ -4374,6 +4376,9 @@ static inline boolean P_NetUnArchiveMisc(boolean reloading)
if(!mapheaderinfo[gamemap-1]) if(!mapheaderinfo[gamemap-1])
P_AllocMapHeader(gamemap-1); P_AllocMapHeader(gamemap-1);
curmapheader = nextmapheader = mapheaderinfo[gamemap-1];
worldmapheader = curmapheader;
// tell the sound code to reset the music since we're skipping what // tell the sound code to reset the music since we're skipping what
// normally sets this flag // normally sets this flag
mapmusflags |= MUSIC_RELOADRESET; mapmusflags |= MUSIC_RELOADRESET;
@ -4758,8 +4763,6 @@ static void P_NetArchiveWorlds(void)
void P_SaveNetGame(boolean resending) void P_SaveNetGame(boolean resending)
{ {
thinker_t *th;
mobj_t *mobj;
INT32 i; INT32 i;
CV_SaveNetVars(&save_p); CV_SaveNetVars(&save_p);
@ -4772,12 +4775,12 @@ void P_SaveNetGame(boolean resending)
world_t *w = worldlist[i]; world_t *w = worldlist[i];
INT32 mobjnum = 1; // don't start from 0, it'd be confused with a blank pointer otherwise INT32 mobjnum = 1; // don't start from 0, it'd be confused with a blank pointer otherwise
for (th = w->thlist[THINK_MOBJ].next; th != &w->thlist[THINK_MOBJ]; th = th->next) for (thinker_t *th = w->thlist[THINK_MOBJ].next; th != &w->thlist[THINK_MOBJ]; th = th->next)
{ {
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
continue; continue;
mobj = (mobj_t *)th; mobj_t *mobj = (mobj_t *)th;
if (mobj->type == MT_HOOP || mobj->type == MT_HOOPCOLLIDE || mobj->type == MT_HOOPCENTER) if (mobj->type == MT_HOOP || mobj->type == MT_HOOPCOLLIDE || mobj->type == MT_HOOPCENTER)
continue; continue;
mobj->mobjnum = mobjnum++; mobj->mobjnum = mobjnum++;
@ -4785,19 +4788,16 @@ void P_SaveNetGame(boolean resending)
} }
} }
// Lactozilla: Assign world numbers to players // Assign world numbers to players
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
player_t *player;
INT32 w;
if (!playeringame[i]) if (!playeringame[i])
continue; continue;
player = &players[i]; player_t *player = &players[i];
player->worldnum = -1; player->worldnum = -1;
for (w = 0; w < numworlds; w++) for (INT32 w = 0; w < numworlds; w++)
{ {
if (P_GetPlayerWorld(player) == worldlist[w]) if (P_GetPlayerWorld(player) == worldlist[w])
{ {
@ -4902,39 +4902,42 @@ static void RelinkWorldsToEntities(void)
static void SetUnArchiveWorld(world_t *w) static void SetUnArchiveWorld(world_t *w)
{ {
unarchiveworld = world = baseworld = localworld = w; P_SetWorld(w);
unarchiveworld = baseworld = localworld = world;
} }
static void P_NetUnArchiveWorlds(boolean reloading) static void P_NetUnArchiveWorlds(boolean reloading)
{ {
player_t *player = &players[consoleplayer]; player_t *player = &players[consoleplayer];
INT32 worldcount, i;
if (READUINT32(save_p) != ARCHIVEBLOCK_WORLD) if (READUINT32(save_p) != ARCHIVEBLOCK_WORLD)
I_Error("Bad $$$.sav at archive block World"); I_Error("Bad $$$.sav at archive block World");
worldcount = READINT32(save_p); INT32 worldcount = READINT32(save_p);
// initialize colormap vars because paranoia // initialize colormap vars because paranoia
ClearNetColormaps(); ClearNetColormaps();
// Unarchive the first world // Unarchive each world
gamemap = READINT16(save_p); for (INT32 i = 0; i < worldcount; i++)
SetUnArchiveWorld(worldlist[0]);
UnArchiveWorld();
for (i = 1; i < worldcount; i++)
{ {
gamemap = READINT16(save_p); gamemap = READINT16(save_p);
if (!P_LoadLevel(player, true, true, reloading))
I_Error("P_NetUnArchiveWorlds: failed loading world"); // Don't load the first world (because it already is loaded at this point)
if (i != 0)
{
if (!P_LoadLevel(player, true, true, reloading))
I_Error("P_NetUnArchiveWorlds: failed loading world");
}
SetUnArchiveWorld(worldlist[i]); SetUnArchiveWorld(worldlist[i]);
UnArchiveWorld(); UnArchiveWorld();
} }
gamemap = worldlist[0]->gamemap; P_SetWorld(worldlist[0]);
curmapheader = nextmapheader = mapheaderinfo[gamemap-1]; baseworld = localworld = worldlist[0];
worldmapheader = curmapheader; curmapheader = nextmapheader = worldmapheader;
P_NetUnArchiveColormaps(); P_NetUnArchiveColormaps();
RelinkWorldsToEntities(); RelinkWorldsToEntities();

View file

@ -6879,7 +6879,7 @@ static boolean P_LoadMapFromFile(void)
// LEVEL INITIALIZATION FUNCTIONS // LEVEL INITIALIZATION FUNCTIONS
// //
static void P_InitLevelSky(INT32 skynum, player_t *player) static void P_InitLevelSky(INT32 skynum)
{ {
P_SetupSkyTexture(skynum); P_SetupSkyTexture(skynum);
P_SetupWorldSky(skynum, world); P_SetupWorldSky(skynum, world);
@ -7012,20 +7012,12 @@ static void P_InitLevelSettings(mapheader_t *mapheader, player_t *player, boolea
if (!addworld) if (!addworld)
countdown = countdown2 = exitfadestarted = 0; countdown = countdown2 = exitfadestarted = 0;
if (!addworld || fromnetsave) if (!addworld)
{ {
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ P_InitPlayerSettings(i, canresetlives);
if (fromnetsave)
{
players[i].followmobj = NULL;
players[i].mo = NULL;
}
else
P_InitPlayerSettings(i, canresetlives);
}
} }
else if (player) else if (player && !fromnetsave)
{ {
P_DetachPlayerWorld(player); P_DetachPlayerWorld(player);
P_InitPlayerSettings((INT32)(player - players), canresetlives); P_InitPlayerSettings((INT32)(player - players), canresetlives);
@ -7739,7 +7731,7 @@ boolean P_LoadLevel(player_t *player, boolean addworld, boolean fromnetsave, boo
S_ChangeMusicEx(mapmusname, mapmusflags, true, mapmusposition, 0, 0); S_ChangeMusicEx(mapmusname, mapmusflags, true, mapmusposition, 0, 0);
} }
if (player && (!titlemapinaction)) if (player && !titlemapinaction && !fromnetsave)
P_UnloadWorldPlayer(player); P_UnloadWorldPlayer(player);
// Initialize the world // Initialize the world
@ -7804,7 +7796,7 @@ boolean P_LoadLevel(player_t *player, boolean addworld, boolean fromnetsave, boo
CON_SetupBackColormap(); CON_SetupBackColormap();
// SRB2 determines the sky texture to be used depending on the map header. // SRB2 determines the sky texture to be used depending on the map header.
P_InitLevelSky(worldmapheader->skynum, player); P_InitLevelSky(worldmapheader->skynum);
P_ResetSpawnpoints(); P_ResetSpawnpoints();

View file

@ -209,13 +209,13 @@ static void P_AddThinkerIntoWorld(world_t *w, const thinklistnum_t n, thinker_t
thinker->next = &w->thlist[n]; thinker->next = &w->thlist[n];
thinker->prev = w->thlist[n].prev; thinker->prev = w->thlist[n].prev;
w->thlist[n].prev = thinker; w->thlist[n].prev = thinker;
thinker->references = 0; // killough 11/98: init reference counter to 0
} }
void P_AddThinker(const thinklistnum_t n, thinker_t *thinker) void P_AddThinker(const thinklistnum_t n, thinker_t *thinker)
{ {
P_AddThinkerIntoWorld(world, n, thinker); P_AddThinkerIntoWorld(world, n, thinker);
thinker->references = 0; // killough 11/98: init reference counter to 0
} }
// //
@ -293,6 +293,7 @@ void P_MoveThinkerToWorld(world_t *w, const thinklistnum_t n, thinker_t *thinker
I_Assert(n < NUM_THINKERLISTS); I_Assert(n < NUM_THINKERLISTS);
#endif #endif
// Remove this thinker from its thinkerlist
next = thinker->next; next = thinker->next;
(next->prev = currentthinker = thinker->prev)->next = next; (next->prev = currentthinker = thinker->prev)->next = next;
@ -315,7 +316,7 @@ mobj_t *P_SetTarget(mobj_t **mop, mobj_t *targ)
{ {
if (*mop) // If there was a target already, decrease its refcount if (*mop) // If there was a target already, decrease its refcount
(*mop)->thinker.references--; (*mop)->thinker.references--;
if ((*mop = targ) != NULL) // Set new target and if non-NULL, increase its counter if ((*mop = targ) != NULL) // Set new target and if non-NULL, increase its counter
targ->thinker.references++; targ->thinker.references++;
return targ; return targ;
} }

View file

@ -71,11 +71,10 @@ world_t *P_InitWorld(void)
// //
world_t *P_InitNewWorld(void) world_t *P_InitNewWorld(void)
{ {
world_t *w;
worldlist = Z_Realloc(worldlist, (numworlds + 1) * sizeof(void *), PU_STATIC, NULL); worldlist = Z_Realloc(worldlist, (numworlds + 1) * sizeof(void *), PU_STATIC, NULL);
worldlist[numworlds] = P_InitWorld(); worldlist[numworlds] = P_InitWorld();
w = worldlist[numworlds];
world_t *w = worldlist[numworlds];
if (!numworlds) if (!numworlds)
baseworld = w; baseworld = w;
@ -380,14 +379,19 @@ void P_UnloadWorld(world_t *w)
LUA_InvalidateLevel(w); LUA_InvalidateLevel(w);
P_UnloadSectorAttachments(w->sectors, w->numsectors); P_UnloadSectorAttachments(w->sectors, w->numsectors);
if (world->extrasubsectors) if (w->extrasubsectors)
{ {
HWR_FreeExtraSubsectors(world->extrasubsectors); HWR_FreeExtraSubsectors(w->extrasubsectors);
world->extrasubsectors = NULL; w->extrasubsectors = NULL;
} }
if (world->sky_dome) if (w->sky_dome)
HWR_FreeSkyDome(world->sky_dome); HWR_FreeSkyDome(w->sky_dome);
Z_Free(w->thlist);
Z_Free(w);
// TODO: Actually free world data here!
} }
// //
@ -397,17 +401,6 @@ void P_UnloadWorldList(void)
{ {
INT32 i; INT32 i;
if (numworlds > 1)
P_UnloadSectorAttachments(sectors, numsectors);
else
{
for (i = 0; i < numworlds; i++)
{
if (worldlist[i])
P_UnloadWorld(worldlist[i]);
}
}
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
if (playeringame[i]) if (playeringame[i])
@ -421,22 +414,17 @@ void P_UnloadWorldList(void)
} }
} }
if (numworlds > 1) for (i = 0; i < numworlds; i++)
{ {
for (i = 0; i < numworlds; i++) world_t *w = worldlist[i];
{ if (w == NULL)
world_t *w = worldlist[i]; continue;
if (w == NULL) P_UnloadWorld(w);
continue;
Z_Free(w->thlist);
Z_Free(w);
}
Z_Free(worldlist);
} }
Z_Free(worldlist);
worldlist = NULL; worldlist = NULL;
numworlds = 0; numworlds = 0;