From c0400d31c35f91b00056b90441a39969fff23397 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Wed, 26 Nov 2025 01:38:30 +0100 Subject: [PATCH] crash fix --- interfaces/Crafter.Event.cppm | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/interfaces/Crafter.Event.cppm b/interfaces/Crafter.Event.cppm index b1f8a43..4151dad 100644 --- a/interfaces/Crafter.Event.cppm +++ b/interfaces/Crafter.Event.cppm @@ -70,7 +70,9 @@ namespace Crafter { EventBase(EventBase&& other) : listeners(std::move(other.listeners)) { for (const auto& listenerSlice : listeners) { for (const auto& listener : listenerSlice.second) { - listener->eventToListenTo = this; + if(listener) { + listener->eventToListenTo = this; + } } } } @@ -79,7 +81,9 @@ namespace Crafter { virtual ~EventBase() { for (const auto& listenerSlice : listeners) { for (const auto& listener : listenerSlice.second) { - listener->eventToListenTo = nullptr; + if(listener) { + listener->eventToListenTo = nullptr; + } } } } @@ -94,12 +98,8 @@ namespace Crafter { } void RemoveListener(EventListener* listener) { - listeners[listener->priority].erase( - std::remove(listeners[listener->priority].begin(), - listeners[listener->priority].end(), - listener), - listeners[listener->priority].end() - ); + auto pos = listeners.find(listener->priority); + std::replace(pos->second.begin(), pos->second.end(), listener, static_cast*>(nullptr)); } #ifdef CRAFTER_TIMING @@ -159,8 +159,8 @@ namespace Crafter { // Clear previous timing data this->listenerTimes.clear(); - auto listenersCopy = this->listeners; - for (const auto& listenerSlice : listenersCopy) { + this->listeners.erase(std::remove(this->listeners.begin(), this->listeners.end(), nullptr), this->listeners.end()); + for (const auto& listenerSlice : this->listeners) { for (const auto& listener : listenerSlice.second) { auto start = std::chrono::high_resolution_clock::now(); listener->function(); @@ -191,8 +191,8 @@ namespace Crafter { // Clear previous timing data this->listenerTimes.clear(); - auto listenersCopy = this->listeners; - for (const auto& listenerSlice : listenersCopy) { + this->listeners.erase(std::remove(this->listeners.begin(), this->listeners.end(), nullptr), this->listeners.end()); + for (const auto& listenerSlice : this->listeners) { for (const auto& listener : listenerSlice.second) { auto start = std::chrono::high_resolution_clock::now(); listener->function(data);