mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-28 23:21:58 +00:00
Fix netsave issues
This commit is contained in:
parent
e486556f4b
commit
685adefaa4
5 changed files with 60 additions and 76 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue