From 2f5be2317128e2f8e8af6fc57a1eb40a4ef09d0b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 4 Sep 2021 10:21:19 +0200 Subject: [PATCH] - validate actors before processing them in the event queue. --- source/games/blood/src/callback.cpp | 7 +++---- source/games/blood/src/eventq.cpp | 5 +++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/source/games/blood/src/callback.cpp b/source/games/blood/src/callback.cpp index daea33580..677fcb47c 100644 --- a/source/games/blood/src/callback.cpp +++ b/source/games/blood/src/callback.cpp @@ -61,11 +61,10 @@ void fxFlameLick(DBloodActor* actor, int) // 0 void Remove(DBloodActor* actor, int) // 1 { if (!actor) return; - spritetype *pSprite = &actor->s(); evKillActor(actor, kCallbackFXFlareSpark); - if (pSprite->extra > 0) - seqKill(3, pSprite->extra); - sfxKill3DSound(pSprite, 0, -1); + if (actor->hasX()) + seqKill(actor); + sfxKill3DSound(actor, 0, -1); DeleteSprite(actor); } diff --git a/source/games/blood/src/eventq.cpp b/source/games/blood/src/eventq.cpp index fe3e1b38d..956245f43 100644 --- a/source/games/blood/src/eventq.cpp +++ b/source/games/blood/src/eventq.cpp @@ -630,6 +630,11 @@ void evProcess(unsigned int time) { EVENT event = *queue.begin(); queue.erase(queue.begin()); + if (event.type == SS_SPRITE) + { + // Don't call events on destroyed actors. Seems to happen occasionally. + if (!event.actor || event.actor->s().statnum == kStatFree) continue; + } if (event.cmd == kCmdCallback) {