diff --git a/src/game_events/handlers.cpp b/src/game_events/handlers.cpp index 64cd92a2bdfb..4673966f43bd 100644 --- a/src/game_events/handlers.cpp +++ b/src/game_events/handlers.cpp @@ -57,11 +57,10 @@ event_handler::event_handler(const config& cfg, bool imi) void event_handler::disable() { - assert(!disabled_); + assert(!disabled_ && "Trying to disable a disabled event. Shouldn't happen!"); disabled_ = true; } - void event_handler::handle_event(const queued_event& event_info, game_lua_kernel& lk) { if(disabled_) { diff --git a/src/game_events/manager_impl.cpp b/src/game_events/manager_impl.cpp index 8e86ba6cd9e2..fc0e4d677b06 100644 --- a/src/game_events/manager_impl.cpp +++ b/src/game_events/manager_impl.cpp @@ -149,14 +149,15 @@ void event_handlers::remove_event_handler(const std::string& id) if(find_it != id_map_.end()) { handler_ptr handler = find_it->second.lock(); - // Remove handler. - if(handler) { + if(handler && !handler->disabled()) { handler->disable(); } // Do this even if the lock failed. - // The index by name will self-adjust later. No need to adjust it now. id_map_.erase(find_it); + + // Remove handler from other lists. + clean_up_expired_handlers(handler->get_config()["name"]); } log_handlers(); @@ -171,10 +172,13 @@ void event_handlers::clean_up_expired_handlers(const std::string& event_name) active_.erase(to_remove, active_.end()); - // Then remove any now-unlockable weak_ptrs from tbe by-name list. - get(event_name).remove_if( - [](weak_handler_ptr ptr) { return ptr.expired(); } - ); + // Then remove any now-unlockable weak_ptrs from the by-name list. + // Might be more than one so we split. + for(const std::string& name : utils::split(event_name)) { + get(name).remove_if( + [](weak_handler_ptr ptr) { return ptr.expired(); } + ); + } // And finally remove any now-unlockable weak_ptrs from the with-variables name list. dynamic_.remove_if(