mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Cleaner reference handling for the following extern-scope netsynced mobj_t*.
- `skyboxcenterpnts` and `skyboxviewpnts`
- P_InitSkyboxPoint`, which calls `P_SetTarget`
- `waypoint->mobj`
- Make sure NULL before using `P_SetTarget` on
- `tubewaypoints`
- Use `P_SetTarget`
- Use `UINT32_MAX` for the invalid mobjnum, since 0 is a valid one.
- `waypointcap` and `kitemcap`
- NULL before reset
Our international nightmare is over.
This commit is contained in:
parent
2786c2095e
commit
724c9b774e
5 changed files with 39 additions and 24 deletions
|
|
@ -1949,6 +1949,7 @@ static waypoint_t *K_MakeWaypoint(mobj_t *const mobj)
|
||||||
madewaypoint = &waypointheap[numwaypoints];
|
madewaypoint = &waypointheap[numwaypoints];
|
||||||
numwaypoints++;
|
numwaypoints++;
|
||||||
|
|
||||||
|
madewaypoint->mobj = NULL;
|
||||||
P_SetTarget(&madewaypoint->mobj, mobj);
|
P_SetTarget(&madewaypoint->mobj, mobj);
|
||||||
|
|
||||||
// Don't allow a waypoint that has its next ID set to itself to work
|
// Don't allow a waypoint that has its next ID set to itself to work
|
||||||
|
|
|
||||||
27
src/p_mobj.c
27
src/p_mobj.c
|
|
@ -12557,6 +12557,21 @@ static mobj_t *P_MakeSoftwareCorona(mobj_t *mo, INT32 height)
|
||||||
return corona;
|
return corona;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void P_InitSkyboxPoint(mobj_t *mobj, mapthing_t *mthing)
|
||||||
|
{
|
||||||
|
mtag_t tag = Tag_FGet(&mthing->tags);
|
||||||
|
if (tag < 0 || tag > 15)
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_GAMELOGIC, "P_InitSkyboxPoint: Skybox ID %d of mapthing %s is not between 0 and 15!\n", tag, sizeu1((size_t)(mthing - mapthings)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mthing->args[0])
|
||||||
|
P_SetTarget(&skyboxcenterpnts[tag], mobj);
|
||||||
|
else
|
||||||
|
P_SetTarget(&skyboxviewpnts[tag], mobj);
|
||||||
|
}
|
||||||
|
|
||||||
static boolean P_MapAlreadyHasStarPost(mobj_t *mobj)
|
static boolean P_MapAlreadyHasStarPost(mobj_t *mobj)
|
||||||
{
|
{
|
||||||
thinker_t *th;
|
thinker_t *th;
|
||||||
|
|
@ -12602,17 +12617,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
|
||||||
}
|
}
|
||||||
case MT_SKYBOX:
|
case MT_SKYBOX:
|
||||||
{
|
{
|
||||||
mtag_t tag = Tag_FGet(&mthing->tags);
|
P_InitSkyboxPoint(mobj, mthing);
|
||||||
if (tag < 0 || tag > 15)
|
|
||||||
{
|
|
||||||
CONS_Debug(DBG_GAMELOGIC, "P_SetupSpawnedMapThing: Skybox ID %d of mapthing %s is not between 0 and 15!\n", tag, sizeu1((size_t)(mthing - mapthings)));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mthing->args[0])
|
|
||||||
skyboxcenterpnts[tag] = mobj;
|
|
||||||
else
|
|
||||||
skyboxviewpnts[tag] = mobj;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MT_EGGSTATUE:
|
case MT_EGGSTATUE:
|
||||||
|
|
|
||||||
|
|
@ -1070,7 +1070,12 @@ static void P_NetArchiveTubeWaypoints(savebuffer_t *save)
|
||||||
{
|
{
|
||||||
WRITEUINT16(save->p, numtubewaypoints[i]);
|
WRITEUINT16(save->p, numtubewaypoints[i]);
|
||||||
for (j = 0; j < numtubewaypoints[i]; j++)
|
for (j = 0; j < numtubewaypoints[i]; j++)
|
||||||
WRITEUINT32(save->p, tubewaypoints[i][j] ? tubewaypoints[i][j]->mobjnum : 0);
|
{
|
||||||
|
if (tubewaypoints[i][j])
|
||||||
|
WRITEUINT32(save->p, tubewaypoints[i][j]->mobjnum);
|
||||||
|
else
|
||||||
|
WRITEUINT32(save->p, UINT32_MAX);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1085,7 +1090,9 @@ static void P_NetUnArchiveTubeWaypoints(savebuffer_t *save)
|
||||||
for (j = 0; j < numtubewaypoints[i]; j++)
|
for (j = 0; j < numtubewaypoints[i]; j++)
|
||||||
{
|
{
|
||||||
mobjnum = READUINT32(save->p);
|
mobjnum = READUINT32(save->p);
|
||||||
tubewaypoints[i][j] = (mobjnum == 0) ? NULL : P_FindNewPosition(mobjnum);
|
tubewaypoints[i][j] = NULL;
|
||||||
|
if (mobjnum != UINT32_MAX)
|
||||||
|
P_SetTarget(&tubewaypoints[i][j], P_FindNewPosition(mobjnum));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3068,6 +3075,7 @@ static void P_NetUnArchiveWaypoints(savebuffer_t *save)
|
||||||
for (i = 0U; i < numArchiveWaypoints; i++) {
|
for (i = 0U; i < numArchiveWaypoints; i++) {
|
||||||
waypoint = K_GetWaypointFromIndex(i);
|
waypoint = K_GetWaypointFromIndex(i);
|
||||||
temp = READUINT32(save->p);
|
temp = READUINT32(save->p);
|
||||||
|
waypoint->mobj = NULL;
|
||||||
if (!P_SetTarget(&waypoint->mobj, P_FindNewPosition(temp))) {
|
if (!P_SetTarget(&waypoint->mobj, P_FindNewPosition(temp))) {
|
||||||
CONS_Debug(DBG_GAMELOGIC, "waypoint mobj not found for %d\n", i);
|
CONS_Debug(DBG_GAMELOGIC, "waypoint mobj not found for %d\n", i);
|
||||||
}
|
}
|
||||||
|
|
@ -3453,17 +3461,9 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
||||||
mobj->player->viewz = mobj->player->mo->z + mobj->player->viewheight;
|
mobj->player->viewz = mobj->player->mo->z + mobj->player->viewheight;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mobj->type == MT_SKYBOX)
|
if (mobj->type == MT_SKYBOX && mobj->spawnpoint)
|
||||||
{
|
{
|
||||||
mtag_t tag = mobj->movedir;
|
P_InitSkyboxPoint(mobj, mobj->spawnpoint);
|
||||||
if (tag < 0 || tag > 15)
|
|
||||||
{
|
|
||||||
CONS_Debug(DBG_GAMELOGIC, "LoadMobjThinker: Skybox ID %d of netloaded object is not between 0 and 15!\n", tag);
|
|
||||||
}
|
|
||||||
else if (mobj->flags2 & MF2_AMBUSH)
|
|
||||||
skyboxcenterpnts[tag] = mobj;
|
|
||||||
else
|
|
||||||
skyboxviewpnts[tag] = mobj;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diff2 & MD2_WAYPOINTCAP)
|
if (diff2 & MD2_WAYPOINTCAP)
|
||||||
|
|
@ -4105,6 +4105,13 @@ static void P_NetUnArchiveThinkers(savebuffer_t *save)
|
||||||
iquetail = iquehead = 0;
|
iquetail = iquehead = 0;
|
||||||
P_InitThinkers();
|
P_InitThinkers();
|
||||||
|
|
||||||
|
// Oh my god don't blast random memory with our reference counts.
|
||||||
|
waypointcap = kitemcap = NULL;
|
||||||
|
for (i = 0; i <= 15; i++)
|
||||||
|
{
|
||||||
|
skyboxcenterpnts[i] = skyboxviewpnts[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// 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++)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -184,7 +184,7 @@ UINT16 numtubewaypoints[NUMTUBEWAYPOINTSEQUENCES];
|
||||||
|
|
||||||
void P_AddTubeWaypoint(UINT8 sequence, UINT8 id, mobj_t *waypoint)
|
void P_AddTubeWaypoint(UINT8 sequence, UINT8 id, mobj_t *waypoint)
|
||||||
{
|
{
|
||||||
tubewaypoints[sequence][id] = waypoint;
|
P_SetTarget(&tubewaypoints[sequence][id], waypoint);
|
||||||
if (id >= numtubewaypoints[sequence])
|
if (id >= numtubewaypoints[sequence])
|
||||||
numtubewaypoints[sequence] = id + 1;
|
numtubewaypoints[sequence] = id + 1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@ extern "C" {
|
||||||
extern mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs
|
extern mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs
|
||||||
extern mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs
|
extern mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs
|
||||||
|
|
||||||
|
void P_InitSkyboxPoint(mobj_t *mobj, mapthing_t *mthing);
|
||||||
|
|
||||||
// Amount (dx, dy) vector linedef is shifted right to get scroll amount
|
// Amount (dx, dy) vector linedef is shifted right to get scroll amount
|
||||||
#define SCROLL_SHIFT 5
|
#define SCROLL_SHIFT 5
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue