diff --git a/src/p_tick.c b/src/p_tick.c index c2f2b0579f39e7e73a69514a8b61f8f81e80d238..e244de1c64d3d747ed5c1ce3a0e5b5b94b0edbae 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -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); } diff --git a/src/r_fps.c b/src/r_fps.c index d2a31a6e645bd24d0601e8effea1ca65191574ca..559520c5df574643aaf1baccddcd602d85a5c642 100644 --- a/src/r_fps.c +++ b/src/r_fps.c @@ -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; + } + } +} diff --git a/src/r_fps.h b/src/r_fps.h index af9baa96207657926415b7d170dc5f501010dd8a..0e10cf5e66e8ff628375bebb8b2a0c350e6a348b 100644 --- a/src/r_fps.h +++ b/src/r_fps.h @@ -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