From c46dcd03a3218704b6f6e150c4bb4f1224809726 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Wed, 2 Sep 2020 15:33:30 +0300 Subject: [PATCH] - fixed a few dangling pointers on traveling between levels https://forum.zdoom.org/viewtopic.php?t=69747 --- src/g_level.cpp | 1 - src/p_setup.cpp | 9 +++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index ee82e8c58..b80fbc280 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1428,7 +1428,6 @@ void FLevelLocals::StartTravel () if (Players[i]->health > 0) { pawn->UnlinkFromWorld (nullptr); - pawn->BlockingLine = nullptr; int tid = pawn->tid; // Save TID pawn->SetTID(0); pawn->tid = tid; // Restore TID (but no longer linked into the hash chain) diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 346a2a5cb..3f1520d55 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -279,6 +279,15 @@ void FLevelLocals::ClearPortals() void FLevelLocals::ClearLevelData() { + { + auto it = GetThinkerIterator(NAME_None, STAT_TRAVELLING); + for (AActor *actor = it.Next(); actor != nullptr; actor = it.Next()) + { + actor->BlockingLine = nullptr; + actor->BlockingFloor = actor->BlockingCeiling = actor->Blocking3DFloor = nullptr; + } + } + interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. Thinkers.DestroyAllThinkers(); ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process.