Delete interpolators associated with thinkers

This commit is contained in:
Eidolon 2022-04-12 22:39:40 -05:00
parent 3e5cec7e72
commit 5fda1b297f
3 changed files with 23 additions and 0 deletions

View file

@ -255,6 +255,7 @@ void P_RemoveThinkerDelayed(thinker_t *thinker)
* thinker->prev->next = thinker->next */
(next->prev = currentthinker = thinker->prev)->next = next;
R_DestroyLevelInterpolators(thinker);
Z_Free(thinker);
}

View file

@ -474,3 +474,23 @@ void R_RestoreLevelInterpolators(void)
}
}
}
void R_DestroyLevelInterpolators(thinker_t *thinker)
{
size_t i;
for (i = 0; i < levelinterpolators_len; i++)
{
levelinterpolator_t *interp = levelinterpolators[i];
if (interp->thinker == thinker)
{
// Swap the tail of the level interpolators to this spot
levelinterpolators[i] = levelinterpolators[levelinterpolators_len - 1];
levelinterpolators_len -= 1;
Z_Free(interp);
i -= 1;
}
}
}

View file

@ -119,5 +119,7 @@ void R_ClearLevelInterpolatorState(thinker_t *thinker);
void R_ApplyLevelInterpolators(fixed_t frac);
// Restore level interpolators to the real game state
void R_RestoreLevelInterpolators(void);
// Destroy interpolators associated with a thinker
void R_DestroyLevelInterpolators(thinker_t *thinker);
#endif