mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-05-10 19:01:50 +00:00
Merge branch 'fix-mobj-reference-counting' into 'master'
Fix negative mobj reference counts all over the place See merge request KartKrew/Kart!926
This commit is contained in:
commit
c4b008e17e
3 changed files with 24 additions and 24 deletions
|
|
@ -9532,7 +9532,7 @@ void K_KartEbrakeVisuals(player_t *p)
|
||||||
P_RemoveMobj(p->mo->hprev);
|
P_RemoveMobj(p->mo->hprev);
|
||||||
}
|
}
|
||||||
|
|
||||||
p->mo->hprev = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_HOLDBUBBLE);
|
P_SetTarget(&p->mo->hprev, P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_HOLDBUBBLE));
|
||||||
p->mo->hprev->renderflags |= (RF_DONTDRAW & ~K_GetPlayerDontDrawFlag(p));
|
p->mo->hprev->renderflags |= (RF_DONTDRAW & ~K_GetPlayerDontDrawFlag(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9620,7 +9620,7 @@ void K_KartEbrakeVisuals(player_t *p)
|
||||||
if (p->mo->hprev && !P_MobjWasRemoved(p->mo->hprev) && (p->mo->hprev->frame & FF_FRAMEMASK) != 5)
|
if (p->mo->hprev && !P_MobjWasRemoved(p->mo->hprev) && (p->mo->hprev->frame & FF_FRAMEMASK) != 5)
|
||||||
{
|
{
|
||||||
P_RemoveMobj(p->mo->hprev);
|
P_RemoveMobj(p->mo->hprev);
|
||||||
p->mo->hprev = NULL;
|
P_SetTarget(&p->mo->hprev, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
p->ebrakefor = 0;
|
p->ebrakefor = 0;
|
||||||
|
|
|
||||||
18
src/p_map.c
18
src/p_map.c
|
|
@ -49,20 +49,10 @@ tm_t tm = {0};
|
||||||
void P_RestoreTMStruct(tm_t tmrestore)
|
void P_RestoreTMStruct(tm_t tmrestore)
|
||||||
{
|
{
|
||||||
// Reference count management
|
// Reference count management
|
||||||
if (tm.thing != tmrestore.thing)
|
// These are effectively a no-op if mobj remains the same
|
||||||
{
|
P_SetTarget(&tm.thing, tmrestore.thing);
|
||||||
P_SetTarget(&tm.thing, NULL);
|
P_SetTarget(&tm.floorthing, tmrestore.floorthing);
|
||||||
}
|
P_SetTarget(&tm.hitthing, tmrestore.hitthing);
|
||||||
|
|
||||||
if (tm.floorthing != tmrestore.floorthing)
|
|
||||||
{
|
|
||||||
P_SetTarget(&tm.floorthing, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tm.hitthing != tmrestore.hitthing)
|
|
||||||
{
|
|
||||||
P_SetTarget(&tm.hitthing, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore state
|
// Restore state
|
||||||
tm = tmrestore;
|
tm = tmrestore;
|
||||||
|
|
|
||||||
26
src/p_mobj.c
26
src/p_mobj.c
|
|
@ -5280,13 +5280,13 @@ void P_AddKartItem(mobj_t *thing)
|
||||||
// Keeps the hnext list from corrupting.
|
// Keeps the hnext list from corrupting.
|
||||||
static void P_RemoveKartItem(mobj_t *thing)
|
static void P_RemoveKartItem(mobj_t *thing)
|
||||||
{
|
{
|
||||||
mobj_t *mo;
|
mobj_t *mo, **p;
|
||||||
for (mo = kitemcap; mo; mo = mo->itnext)
|
for (mo = *(p = &kitemcap); mo; mo = *(p = &mo->itnext))
|
||||||
{
|
{
|
||||||
if (mo->itnext != thing)
|
if (mo != thing)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
P_SetTarget(&mo->itnext, thing->itnext);
|
P_SetTarget(p, thing->itnext);
|
||||||
P_SetTarget(&thing->itnext, NULL);
|
P_SetTarget(&thing->itnext, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -5433,13 +5433,13 @@ static void P_AddOverlay(mobj_t *thing)
|
||||||
// Keeps the hnext list from corrupting.
|
// Keeps the hnext list from corrupting.
|
||||||
static void P_RemoveOverlay(mobj_t *thing)
|
static void P_RemoveOverlay(mobj_t *thing)
|
||||||
{
|
{
|
||||||
mobj_t *mo;
|
mobj_t *mo, **p;
|
||||||
for (mo = overlaycap; mo; mo = mo->hnext)
|
for (mo = *(p = &overlaycap); mo; mo = *(p = &mo->hnext))
|
||||||
{
|
{
|
||||||
if (mo->hnext != thing)
|
if (mo != thing)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
P_SetTarget(&mo->hnext, thing->hnext);
|
P_SetTarget(p, thing->hnext);
|
||||||
P_SetTarget(&thing->hnext, NULL);
|
P_SetTarget(&thing->hnext, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -6469,6 +6469,9 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
||||||
break;
|
break;
|
||||||
case MT_ITEMCAPSULE_PART:
|
case MT_ITEMCAPSULE_PART:
|
||||||
P_ItemCapsulePartThinker(mobj);
|
P_ItemCapsulePartThinker(mobj);
|
||||||
|
|
||||||
|
if (P_MobjWasRemoved(mobj))
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case MT_BATTLECAPSULE_PIECE:
|
case MT_BATTLECAPSULE_PIECE:
|
||||||
if (mobj->extravalue2)
|
if (mobj->extravalue2)
|
||||||
|
|
@ -9850,9 +9853,16 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
P_CheckMobjTrigger(mobj, false);
|
P_CheckMobjTrigger(mobj, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
I_Assert(!P_MobjWasRemoved(mobj));
|
||||||
|
|
||||||
if (mobj->scale != mobj->destscale)
|
if (mobj->scale != mobj->destscale)
|
||||||
|
{
|
||||||
P_MobjScaleThink(mobj); // Slowly scale up/down to reach your destscale.
|
P_MobjScaleThink(mobj); // Slowly scale up/down to reach your destscale.
|
||||||
|
|
||||||
|
if (P_MobjWasRemoved(mobj))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (mobj->type == MT_GHOST && mobj->fuse > 0) // Not guaranteed to be MF_SCENERY or not MF_SCENERY!
|
if (mobj->type == MT_GHOST && mobj->fuse > 0) // Not guaranteed to be MF_SCENERY or not MF_SCENERY!
|
||||||
{
|
{
|
||||||
if (mobj->extravalue1 > 0) // Sonic Advance 2 mode
|
if (mobj->extravalue1 > 0) // Sonic Advance 2 mode
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue