diff --git a/GlobalMethods.h b/GlobalMethods.h index 0978c20..05cb1f8 100644 --- a/GlobalMethods.h +++ b/GlobalMethods.h @@ -421,7 +421,7 @@ namespace LuaGlobalFunctions int ReloadEluna(lua_State* L) { - Eluna::ReloadEluna(); + Eluna::reload = true; return 0; } diff --git a/HookMgr.cpp b/HookMgr.cpp index 942cbaf..08c210c 100644 --- a/HookMgr.cpp +++ b/HookMgr.cpp @@ -304,6 +304,12 @@ void Eluna::OnShutdownCancel() void Eluna::OnWorldUpdate(uint32 diff) { + if (reload) + { + ReloadEluna(); + return; + } + m_EventMgr->Update(diff); EVENT_BEGIN(ServerEventBindings, WORLD_EVENT_ON_UPDATE, return); Push(L, diff); @@ -458,24 +464,27 @@ bool Eluna::OnRemove(Player* pPlayer, Item* item) bool Eluna::OnCommand(Player* player, const char* text) { std::string fullcmd(text); - char* creload = strtok((char*)text, " "); - char* celuna = strtok(NULL, ""); - if (creload && celuna) + if (player->GetSession()->GetSecurity() >= SEC_ADMINISTRATOR) { - std::string reload(creload); - std::string eluna(celuna); - std::transform(reload.begin(), reload.end(), reload.begin(), ::tolower); - if (reload == "reload") + char* creload = strtok((char*)text, " "); + char* celuna = strtok(NULL, ""); + if (creload && celuna) { - std::transform(eluna.begin(), eluna.end(), eluna.begin(), ::tolower); - if (std::string("eluna").find(eluna) == 0) + std::string reload(creload); + std::string eluna(celuna); + std::transform(reload.begin(), reload.end(), reload.begin(), ::tolower); + if (reload == "reload") { - eWorld->SendServerMessage(SERVER_MSG_STRING, "Reloading Eluna..."); - ReloadEluna(); - return false; + std::transform(eluna.begin(), eluna.end(), eluna.begin(), ::tolower); + if (std::string("eluna").find(eluna) == 0) + { + Eluna::reload = true; + return false; + } } } } + bool result = true; EVENT_BEGIN(PlayerEventBindings, PLAYER_EVENT_ON_COMMAND, return result); Push(L, player); diff --git a/LuaEngine.cpp b/LuaEngine.cpp index 70a9d91..8752bec 100644 --- a/LuaEngine.cpp +++ b/LuaEngine.cpp @@ -12,6 +12,7 @@ Eluna::ScriptPaths Eluna::scripts; Eluna* Eluna::GEluna = NULL; +bool Eluna::reload = false; extern void RegisterFunctions(lua_State* L); @@ -45,8 +46,11 @@ void Eluna::Uninitialize() void Eluna::ReloadEluna() { + eWorld->SendServerMessage(SERVER_MSG_STRING, "Reloading Eluna..."); Uninitialize(); Initialize(); + + reload = false; } Eluna::Eluna(): diff --git a/LuaEngine.h b/LuaEngine.h index e63c20d..defe369 100644 --- a/LuaEngine.h +++ b/LuaEngine.h @@ -353,6 +353,7 @@ public: typedef std::set ScriptPaths; static Eluna* GEluna; + static bool reload; lua_State* L; int userdata_table; @@ -380,6 +381,8 @@ public: static ScriptPaths scripts; static void Initialize(); static void Uninitialize(); + // Use Eluna::reload = true; instead. + // This will be called on next update static void ReloadEluna(); void static GetScripts(std::string path, ScriptPaths& scripts); diff --git a/LuaFunctions.cpp b/LuaFunctions.cpp index 541ef41..5bc6fe8 100644 --- a/LuaFunctions.cpp +++ b/LuaFunctions.cpp @@ -77,7 +77,7 @@ void RegisterGlobals(lua_State* L) lua_register(L, "GetMapById", &LuaGlobalFunctions::GetMapById); // GetMapById(mapId, instance) - Returns map object of id specified. UNDOCUMENTED // Other - lua_register(L, "ReloadEluna", &LuaGlobalFunctions::ReloadEluna); // ReloadEluna() - Reload's Eluna engine. + lua_register(L, "ReloadEluna", &LuaGlobalFunctions::ReloadEluna); // ReloadEluna() - Reload's Eluna engine. Warning! Reloading should be used only for testing. lua_register(L, "SendWorldMessage", &LuaGlobalFunctions::SendWorldMessage); // SendWorldMessage(msg) - Sends a broadcast message to everyone lua_register(L, "WorldDBQuery", &LuaGlobalFunctions::WorldDBQuery); // WorldDBQuery(sql) - Executes given SQL query to world database instantly and returns a QueryResult object lua_register(L, "WorldDBExecute", &LuaGlobalFunctions::WorldDBExecute); // WorldDBExecute(sql) - Executes given SQL query to world database (not instant)