From 3866750d98647d773eb79a8d8a4b9a3de3f1aaa6 Mon Sep 17 00:00:00 2001 From: James Huston Date: Mon, 17 Nov 2025 15:34:19 +0000 Subject: [PATCH] Got eluna running and working --- src/server/game/CMakeLists.txt | 2 +- src/server/game/LuaEngine/ElunaConfig.cpp | 17 +++++++++++++++++ src/server/game/LuaEngine/ElunaLoader.cpp | 7 +++++++ src/server/game/LuaEngine/LuaEngine.h | 2 ++ src/server/game/World/World.cpp | 8 ++++++++ src/server/scripts/CMakeLists.txt | 4 ++++ src/server/scripts/Commands/cs_lua.cpp | 14 +++++++++++--- 7 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index a01d02842f..d659e202a8 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -46,7 +46,7 @@ target_include_directories(lualib INTERFACE /usr/include/luajit-2.1 ${CMAKE_SOURCE_DIR}/dep/efsw/include) target_link_libraries(lualib INTERFACE luajit-5.1 efsw) -target_compile_definitions(lualib INTERFACE LUAJIT_VERSION ELUNA_TRINITY ELUNA_EXPANSION=9) +target_compile_definitions(lualib INTERFACE ELUNA LUAJIT_VERSION ELUNA_TRINITY ELUNA_EXPANSION=9) add_library(game ${PRIVATE_SOURCES}) diff --git a/src/server/game/LuaEngine/ElunaConfig.cpp b/src/server/game/LuaEngine/ElunaConfig.cpp index 6dda607553..96dfa4a378 100644 --- a/src/server/game/LuaEngine/ElunaConfig.cpp +++ b/src/server/game/LuaEngine/ElunaConfig.cpp @@ -31,25 +31,42 @@ ElunaConfig::~ElunaConfig() void ElunaConfig::Initialize() { + ELUNA_LOG_INFO("[Eluna]: Initializing Eluna configuration..."); + // Load bools SetConfig(CONFIG_ELUNA_ENABLED, "Eluna.Enabled", true); + ELUNA_LOG_DEBUG("[Eluna]: CONFIG_ELUNA_ENABLED = %s", GetConfig(CONFIG_ELUNA_ENABLED) ? "true" : "false"); + SetConfig(CONFIG_ELUNA_TRACEBACK, "Eluna.TraceBack", false); + ELUNA_LOG_DEBUG("[Eluna]: CONFIG_ELUNA_TRACEBACK = %s", GetConfig(CONFIG_ELUNA_TRACEBACK) ? "true" : "false"); + SetConfig(CONFIG_ELUNA_SCRIPT_RELOADER, "Eluna.ScriptReloader", false); + ELUNA_LOG_DEBUG("[Eluna]: CONFIG_ELUNA_SCRIPT_RELOADER = %s", GetConfig(CONFIG_ELUNA_SCRIPT_RELOADER) ? "true" : "false"); + SetConfig(CONFIG_ELUNA_ENABLE_UNSAFE, "Eluna.UseUnsafeMethods", true); + ELUNA_LOG_DEBUG("[Eluna]: CONFIG_ELUNA_ENABLE_UNSAFE = %s", GetConfig(CONFIG_ELUNA_ENABLE_UNSAFE) ? "true" : "false"); + SetConfig(CONFIG_ELUNA_ENABLE_DEPRECATED, "Eluna.UseDeprecatedMethods", true); + ELUNA_LOG_DEBUG("[Eluna]: CONFIG_ELUNA_ENABLE_DEPRECATED = %s", GetConfig(CONFIG_ELUNA_ENABLE_DEPRECATED) ? "true" : "false"); + SetConfig(CONFIG_ELUNA_ENABLE_RELOAD_COMMAND, "Eluna.ReloadCommand", true); + ELUNA_LOG_DEBUG("[Eluna]: CONFIG_ELUNA_ENABLE_RELOAD_COMMAND = %s", GetConfig(CONFIG_ELUNA_ENABLE_RELOAD_COMMAND) ? "true" : "false"); // Load strings SetConfig(CONFIG_ELUNA_SCRIPT_PATH, "Eluna.ScriptPath", "lua_scripts"); + ELUNA_LOG_DEBUG("[Eluna]: CONFIG_ELUNA_SCRIPT_PATH = %s", GetConfig(CONFIG_ELUNA_SCRIPT_PATH).c_str()); + SetConfig(CONFIG_ELUNA_ONLY_ON_MAPS, "Eluna.OnlyOnMaps", ""); SetConfig(CONFIG_ELUNA_REQUIRE_PATH_EXTRA, "Eluna.RequirePaths", ""); SetConfig(CONFIG_ELUNA_REQUIRE_CPATH_EXTRA, "Eluna.RequireCPaths", ""); // Load ints SetConfig(CONFIG_ELUNA_RELOAD_SECURITY_LEVEL, "Eluna.ReloadSecurityLevel", 3); + ELUNA_LOG_DEBUG("[Eluna]: CONFIG_ELUNA_RELOAD_SECURITY_LEVEL = %u", GetConfig(CONFIG_ELUNA_RELOAD_SECURITY_LEVEL)); // Call extra functions TokenizeAllowedMaps(); + ELUNA_LOG_INFO("[Eluna]: Eluna configuration initialized successfully"); } void ElunaConfig::SetConfig(ElunaConfigBoolValues index, char const* fieldname, bool defvalue) diff --git a/src/server/game/LuaEngine/ElunaLoader.cpp b/src/server/game/LuaEngine/ElunaLoader.cpp index b6f155181c..316e947bb0 100644 --- a/src/server/game/LuaEngine/ElunaLoader.cpp +++ b/src/server/game/LuaEngine/ElunaLoader.cpp @@ -106,12 +106,18 @@ void ElunaLoader::ReloadScriptCache() void ElunaLoader::LoadScripts() { + ELUNA_LOG_INFO("[Eluna]: LoadScripts() called, current cache state: %u", uint32(m_cacheState)); + // only reload the cache if it is either in a reinit state or not loaded at all if (m_cacheState != SCRIPT_CACHE_REINIT && m_cacheState != SCRIPT_CACHE_NONE) + { + ELUNA_LOG_DEBUG("[Eluna]: Script cache is in state %u, skipping load", uint32(m_cacheState)); return; + } // set the cache state to loading m_cacheState = SCRIPT_CACHE_LOADING; + ELUNA_LOG_DEBUG("[Eluna]: Script cache state set to LOADING"); uint32 oldMSTime = ElunaUtil::GetCurrTime(); @@ -162,6 +168,7 @@ void ElunaLoader::LoadScripts() // set the cache state to ready m_cacheState = SCRIPT_CACHE_READY; + ELUNA_LOG_INFO("[Eluna]: Script cache state set to READY"); } int ElunaLoader::LoadBytecodeChunk(lua_State* /*L*/, uint8* bytes, size_t len, BytecodeBuffer* buffer) diff --git a/src/server/game/LuaEngine/LuaEngine.h b/src/server/game/LuaEngine/LuaEngine.h index 17b2764b3a..e616fc5600 100644 --- a/src/server/game/LuaEngine/LuaEngine.h +++ b/src/server/game/LuaEngine/LuaEngine.h @@ -39,6 +39,8 @@ extern "C" { #include "lua.h" +#include "lualib.h" +#include "lauxlib.h" }; class AuctionHouseObject; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 8224997a03..08b032671b 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -23,6 +23,7 @@ #include "LuaEngine/LuaEngine.h" #include "LuaEngine/ElunaMgr.h" #include "LuaEngine/ElunaConfig.h" +#include "LuaEngine/ElunaLoader.h" #include "AccountMgr.h" #include "AchievementMgr.h" #include "AreaTriggerDataStore.h" @@ -1264,6 +1265,13 @@ bool World::SetInitialWorldSettings() ///- Initialize config settings LoadConfigSettings(); + ///- Initialize Eluna configuration and loader + TC_LOG_INFO("server.loading", "Initializing Eluna..."); + sElunaConfig->Initialize(); + TC_LOG_INFO("server.loading", "Loading Eluna scripts..."); + sElunaLoader->LoadScripts(); + TC_LOG_INFO("server.loading", "Eluna initialization complete"); + ///- Initialize Allowed Security Level LoadDBAllowedSecurityLevel(); diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index fb4ba169b4..98e83acf8f 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -211,10 +211,14 @@ add_library(scripts STATIC target_link_libraries(scripts PRIVATE trinity-core-interface + game + lualib PUBLIC game-interface) target_include_directories(scripts + PRIVATE + /usr/include/luajit-2.1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/server/scripts/Commands/cs_lua.cpp b/src/server/scripts/Commands/cs_lua.cpp index f1dbe48b67..dec7016d1e 100644 --- a/src/server/scripts/Commands/cs_lua.cpp +++ b/src/server/scripts/Commands/cs_lua.cpp @@ -31,6 +31,7 @@ EndScriptData */ #ifdef ELUNA #include "LuaEngine.h" #include "ElunaMgr.h" +#include "ElunaConfig.h" #endif using namespace Trinity::ChatCommands; @@ -53,16 +54,23 @@ private: static bool HandleLuaCommand(ChatHandler* handler, char const* args) { #ifdef ELUNA + // Check if Eluna is enabled at runtime + if (!sElunaConfig->IsElunaEnabled()) + { + handler->SendSysMessage("Eluna is not enabled on this server."); + return false; + } + if (!*args) { handler->SendSysMessage("Usage: .lua "); return false; } - // Get the global Eluna instance + // Get the global Eluna instance directly from ElunaMgr + // Note: We don't use ElunaInfo here because its destructor would destroy the instance ElunaInfoKey key = ElunaInfoKey::MakeGlobalKey(0); - ElunaInfo info(key); - Eluna* eluna = info.GetEluna(); + Eluna* eluna = sElunaMgr->Get(key); if (!eluna || !eluna->HasLuaState()) {