diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index c6ef8168be..2fef43b0b7 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -1634,7 +1634,7 @@ void ScriptEngine::RemoveInterval(const std::shared_ptr& plugin, Interva // Only allow owner or REPL (nullptr) to remove intervals if (plugin == nullptr || interval.Owner == plugin) { - _intervals.erase(it); + interval.Deleted = true; } } @@ -1653,21 +1653,37 @@ void ScriptEngine::UpdateIntervals() } _lastIntervalTimestamp = timestamp; - for (auto it = _intervals.begin(), itNext = it; it != _intervals.end(); it = itNext) + // Erase all intervals marked as deleted. + for (auto it = _intervals.begin(); it != _intervals.end();) { - itNext++; - auto& interval = it->second; - if (timestamp >= interval.LastTimestamp + interval.Delay) + if (interval.Deleted) { - ExecutePluginCall(interval.Owner, interval.Callback, {}, false); + it = _intervals.erase(it); + } + else + { + it++; + } + } - interval.LastTimestamp = timestamp; - if (!interval.Repeat) - { - _intervals.erase(it); - } + // Execute all intervals that are due. + for (auto it = _intervals.begin(); it != _intervals.end(); it++) + { + auto& interval = it->second; + + if (timestamp < interval.LastTimestamp + interval.Delay) + { + continue; + } + + ExecutePluginCall(interval.Owner, interval.Callback, {}, false); + + interval.LastTimestamp = timestamp; + if (!interval.Repeat) + { + interval.Deleted = true; } } } diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index 9c9a00b19d..d186007e6b 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -134,6 +134,7 @@ namespace OpenRCT2::Scripting int64_t LastTimestamp{}; DukValue Callback; bool Repeat{}; + bool Deleted{}; }; class ScriptEngine