diff --git a/src/LuaEngine/LuaEngine.cpp b/src/LuaEngine/LuaEngine.cpp index 27dfa8640b..a99ea466fa 100644 --- a/src/LuaEngine/LuaEngine.cpp +++ b/src/LuaEngine/LuaEngine.cpp @@ -127,6 +127,12 @@ void Eluna::_ReloadEluna() LOCK_ELUNA; ASSERT(IsInitialized()); + if (!sEluna->CanReload()) + { + sEluna->reloadScheduled = true; + return; + } + if (eConfigMgr->GetOption("Eluna.PlayerAnnounceReload", false)) eWorldSessionMgr->SendServerMessage(SERVER_MSG_STRING, "Reloading Eluna..."); else @@ -147,6 +153,7 @@ void Eluna::_ReloadEluna() // Run scripts from laoded paths sEluna->RunScripts(); + sEluna->reloadScheduled = false; reload = false; } diff --git a/src/LuaEngine/LuaEngine.h b/src/LuaEngine/LuaEngine.h index 999fb03f66..c28bf895fa 100644 --- a/src/LuaEngine/LuaEngine.h +++ b/src/LuaEngine/LuaEngine.h @@ -88,6 +88,14 @@ struct LuaScript class ELUNA_GAME_API Eluna { public: + void IncrementCallbacks() { pendingCallbacks++; } + void DecrementCallbacks() + { + pendingCallbacks--; + if (pendingCallbacks == 0 && reloadScheduled) + _ReloadEluna(); + } + bool CanReload() const { return pendingCallbacks == 0; } typedef std::list ScriptList; typedef std::recursive_mutex LockType; @@ -97,6 +105,8 @@ class ELUNA_GAME_API Eluna const std::string& GetRequireCPath() const { return lua_requirecpath; } private: + std::atomic pendingCallbacks{0}; + std::atomic reloadScheduled{false}; static bool reload; static bool initialized; static LockType lock; diff --git a/src/LuaEngine/methods/GlobalMethods.h b/src/LuaEngine/methods/GlobalMethods.h index 21d32c5e69..096ae3f53a 100644 --- a/src/LuaEngine/methods/GlobalMethods.h +++ b/src/LuaEngine/methods/GlobalMethods.h @@ -1318,6 +1318,9 @@ namespace LuaGlobalFunctions luaL_argerror(L, 2, "unable to make a ref to function"); return 0; } + + // Increment pending callbacks counter + Eluna::GEluna->IncrementCallbacks(); Eluna::GEluna->queryProcessor.AddCallback(db.AsyncQuery(query).WithCallback([L, funcRef](QueryResult result) { @@ -1335,6 +1338,9 @@ namespace LuaGlobalFunctions Eluna::GEluna->ExecuteCall(1, 0); luaL_unref(L, LUA_REGISTRYINDEX, funcRef); + + // Decrement pending callbacks counter + Eluna::GEluna->DecrementCallbacks(); })); return 0;