From 361274813e363b0ce9a6464f7d5dc6d63e0295fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=90=E6=B2=90=E5=91=80?= <163636894+zimuya4153@users.noreply.github.com> Date: Wed, 14 Oct 2026 18:07:36 +0800 Subject: [PATCH 1/2] adapt: adapt the custom mod loading directory --- src-client/lse/PluginManager.cpp | 11 +++++++---- src-client/lse/PluginManager.h | 2 +- src-server/lse/PluginManager.cpp | 11 +++++++---- src-server/lse/PluginManager.h | 2 +- src/legacy/api/LlAPI.cpp | 6 +++++- src/lse/Entry.cpp | 9 +++++++-- src/lse/PluginMigration.cpp | 4 ++-- src/lse/ScriptPlugin.cpp | 3 ++- src/lse/ScriptPlugin.h | 2 +- src/lse/events/BlockEventsHooks.cpp | 1 + xmake.lua | 8 +++++--- 11 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src-client/lse/PluginManager.cpp b/src-client/lse/PluginManager.cpp index 76db4671..8e294905 100644 --- a/src-client/lse/PluginManager.cpp +++ b/src-client/lse/PluginManager.cpp @@ -56,7 +56,8 @@ bool LLSECallEventsOnUnload(std::shared_ptr const& engine); namespace lse { -PluginManager::PluginManager() : ll::mod::ModManager(PluginManagerName) {} +PluginManager::PluginManager(std::filesystem::path loadDirectory) +: ll::mod::ModManager(PluginManagerName, std::move(loadDirectory)) {} PluginManager::~PluginManager() = default; void PluginManager::enableAllPlugins() { @@ -79,7 +80,7 @@ ll::Expected<> PluginManager::load(ll::mod::Manifest manifest) { return ll::makeStringError("Plugin has already loaded"); } - auto plugin = std::make_shared(manifest); + auto plugin = std::make_shared(manifest, getLoadDirectory()); return plugin->onLoad().transform([&, this] { addMod(manifest.name, plugin); }); } @@ -92,7 +93,8 @@ ll::Expected<> PluginManager::enableScriptPlugin(std::string_view name, bool isH auto manifest = plugin->getManifest(); #ifdef LSE_BACKEND_PYTHON auto& logger = lse::LegacyScriptEngine::getLogger(); - std::filesystem::path dirPath = ll::mod::getModsRoot() / manifest.name; // Plugin path + std::filesystem::path dirPath = LegacyScriptEngine::getInstance().getManager().getLoadDirectory() + / ll::string_utils::str2u8str(manifest.name); // Plugin path std::string entryPath = PythonHelper::findEntryScript(ll::string_utils::u8str2str(dirPath.u8string())); // Plugin entry // if (entryPath.empty()) return false; @@ -127,7 +129,8 @@ ll::Expected<> PluginManager::enableScriptPlugin(std::string_view name, bool isH #endif #ifdef LSE_BACKEND_NODEJS auto& logger = lse::LegacyScriptEngine::getLogger(); - std::filesystem::path dirPath = ll::mod::getModsRoot() / manifest.name; // Plugin path + std::filesystem::path dirPath = LegacyScriptEngine::getInstance().getManager().getLoadDirectory() + / ll::string_utils::str2u8str(manifest.name); // Plugin path // std::string entryPath = NodeJsHelper::findEntryScript(dirPath.string()); // Plugin entry // if (entryPath.empty()) return false; // std::string pluginName = NodeJsHelper::getPluginPackageName(dirPath.string()); // Plugin name diff --git a/src-client/lse/PluginManager.h b/src-client/lse/PluginManager.h index bbe3f6e8..77b9ba91 100644 --- a/src-client/lse/PluginManager.h +++ b/src-client/lse/PluginManager.h @@ -9,7 +9,7 @@ namespace lse { class PluginManager final : public ll::mod::ModManager { public: - PluginManager(); + explicit PluginManager(std::filesystem::path loadDirectory); ~PluginManager() override; void enableAllPlugins(); void disableAllPlugins(); diff --git a/src-server/lse/PluginManager.cpp b/src-server/lse/PluginManager.cpp index 7c3aa06f..5e927e4a 100644 --- a/src-server/lse/PluginManager.cpp +++ b/src-server/lse/PluginManager.cpp @@ -55,13 +55,15 @@ bool LLSECallEventsOnUnload(std::shared_ptr const& engine); namespace lse { -PluginManager::PluginManager() : ll::mod::ModManager(PluginManagerName) {} +PluginManager::PluginManager(std::filesystem::path loadDirectory) +: ll::mod::ModManager(PluginManagerName, std::move(loadDirectory)) {} PluginManager::~PluginManager() = default; ll::Expected<> PluginManager::load(ll::mod::Manifest manifest) { #ifdef LSE_BACKEND_PYTHON auto& logger = lse::LegacyScriptEngine::getLogger(); - std::filesystem::path dirPath = ll::mod::getModsRoot() / manifest.name; // Plugin path + std::filesystem::path dirPath = LegacyScriptEngine::getInstance().getManager().getLoadDirectory() + / ll::string_utils::str2u8str(manifest.name); // Plugin path std::string entryPath = PythonHelper::findEntryScript(ll::string_utils::u8str2str(dirPath.u8string())); // Plugin entry // if (entryPath.empty()) return false; @@ -96,7 +98,8 @@ ll::Expected<> PluginManager::load(ll::mod::Manifest manifest) { #endif #ifdef LSE_BACKEND_NODEJS auto& logger = lse::LegacyScriptEngine::getLogger(); - std::filesystem::path dirPath = ll::mod::getModsRoot() / manifest.name; // Plugin path + std::filesystem::path dirPath = LegacyScriptEngine::getInstance().getManager().getLoadDirectory() + / ll::string_utils::str2u8str(manifest.name); // Plugin path // std::string entryPath = NodeJsHelper::findEntryScript(dirPath.string()); // Plugin entry // if (entryPath.empty()) return false; // std::string pluginName = NodeJsHelper::getPluginPackageName(dirPath.string()); // Plugin name @@ -124,7 +127,7 @@ ll::Expected<> PluginManager::load(ll::mod::Manifest manifest) { } auto scriptEngine = EngineManager::newEngine(manifest.name); - auto plugin = std::make_shared(manifest); + auto plugin = std::make_shared(manifest, getLoadDirectory()); try { EngineScope engineScope(scriptEngine.get()); diff --git a/src-server/lse/PluginManager.h b/src-server/lse/PluginManager.h index 67a0949b..541a64a0 100644 --- a/src-server/lse/PluginManager.h +++ b/src-server/lse/PluginManager.h @@ -9,7 +9,7 @@ namespace lse { class PluginManager final : public ll::mod::ModManager { public: - PluginManager(); + explicit PluginManager(std::filesystem::path loadDirectory); ~PluginManager() override; private: diff --git a/src/legacy/api/LlAPI.cpp b/src/legacy/api/LlAPI.cpp index d7c8f463..28c69129 100644 --- a/src/legacy/api/LlAPI.cpp +++ b/src/legacy/api/LlAPI.cpp @@ -8,9 +8,11 @@ #include "ll/api/mod/ModManagerRegistry.h" #include "ll/api/reflection/Serialization.h" #include "ll/api/utils/SystemUtils.h" +#include "lse/Entry.h" #include + //////////////////// Classes //////////////////// ClassDefine LlClassBuilder = defineClass("ll") @@ -160,7 +162,7 @@ Local LlClass::getVersionStatus() { Local LlClass::getPluginsRoot() { try { - return String::newString(ll::mod::getModsRoot().u8string()); + return String::newString(lse::LegacyScriptEngine::getInstance().getManager().getLoadDirectory().u8string()); } CATCH_AND_THROW } @@ -392,6 +394,8 @@ Local LlClass::getAllPluginInfo(Arguments const&) { pluginObject.set("others", others); } + pluginObject.set("modDir", ll::string_utils::u8str2str(mod.getModDir().u8string())); + // Add plugin object to list plugins.add(pluginObject); } diff --git a/src/lse/Entry.cpp b/src/lse/Entry.cpp index dbab16ba..82a7f876 100644 --- a/src/lse/Entry.cpp +++ b/src/lse/Entry.cpp @@ -49,6 +49,8 @@ constexpr auto BaseLibFileName = "BaseLib.py"; #endif +constexpr auto PluginsRootDir = "./plugins"; + using namespace ll::i18n_literals; // Do not use legacy headers directly, otherwise there will be tons of errors. @@ -105,7 +107,7 @@ bool LegacyScriptEngine::load() { auto result = ll::i18n::getInstance().load(getSelf().getLangDir()); config = Config(); - pluginManager = std::make_shared(); + pluginManager = std::make_shared(PluginsRootDir); loadConfig(getSelf(), config); @@ -163,7 +165,10 @@ void loadDebugEngine(ll::mod::NativeMod const& self) { // Init plugin instance for debug engine to prevent something unexpected. ll::mod::Manifest manifest; manifest.name = "DebugEngine"; - getEngineOwnData()->plugin = std::make_shared(manifest); + getEngineOwnData()->plugin = std::make_shared( + manifest, + LegacyScriptEngine::getInstance().getManager().getLoadDirectory() + ); // Init logger getEngineOwnData()->logger = ll::io::LoggerRegistry::getInstance().getOrCreate("DebugEngine"); diff --git a/src/lse/PluginMigration.cpp b/src/lse/PluginMigration.cpp index 724c6d9d..e82708b7 100644 --- a/src/lse/PluginMigration.cpp +++ b/src/lse/PluginMigration.cpp @@ -57,7 +57,7 @@ auto migratePlugin(PluginManager const& pluginManager, std::filesystem::path con auto const& pluginFileName = path.filename(); auto const& pluginFileBaseName = path.stem(); - auto const& pluginDir = ll::mod::getModsRoot() / pluginFileBaseName; + auto const& pluginDir = LegacyScriptEngine::getInstance().getManager().getLoadDirectory() / pluginFileBaseName; if (std::filesystem::exists(pluginDir / pluginFileName)) { throw std::runtime_error( @@ -126,7 +126,7 @@ auto migratePlugins(PluginManager const& pluginManager) -> void { // Discover plugins. // logger.info("Discovering legacy plugins..."_tr()); - auto const& pluginBaseDir = ll::mod::getModsRoot(); + auto const& pluginBaseDir = LegacyScriptEngine::getInstance().getManager().getLoadDirectory(); for (auto const& entry : std::filesystem::directory_iterator(pluginBaseDir)) { if (!entry.is_regular_file() || entry.path().extension() != PluginExtName) { diff --git a/src/lse/ScriptPlugin.cpp b/src/lse/ScriptPlugin.cpp index 4bce59b2..a058818d 100644 --- a/src/lse/ScriptPlugin.cpp +++ b/src/lse/ScriptPlugin.cpp @@ -7,7 +7,8 @@ namespace lse { -ScriptPlugin::ScriptPlugin(ll::mod::Manifest manifest) : ll::mod::Mod(std::move(manifest)) {} +ScriptPlugin::ScriptPlugin(ll::mod::Manifest manifest, std::filesystem::path loadDirectory) +: ll::mod::Mod(std::move(manifest), std::move(loadDirectory)) {} ScriptPlugin::~ScriptPlugin() { release(); } diff --git a/src/lse/ScriptPlugin.h b/src/lse/ScriptPlugin.h index dc05b514..212406da 100644 --- a/src/lse/ScriptPlugin.h +++ b/src/lse/ScriptPlugin.h @@ -22,7 +22,7 @@ class ScriptPlugin : public ll::mod::Mod { std::unordered_map> registeredCommands; - explicit ScriptPlugin(ll::mod::Manifest manifest); + explicit ScriptPlugin(ll::mod::Manifest manifest, std::filesystem::path loadDirectory); ~ScriptPlugin(); static std::shared_ptr current(); diff --git a/src/lse/events/BlockEventsHooks.cpp b/src/lse/events/BlockEventsHooks.cpp index 69f1e05f..f7053bed 100644 --- a/src/lse/events/BlockEventsHooks.cpp +++ b/src/lse/events/BlockEventsHooks.cpp @@ -7,6 +7,7 @@ #include "legacy/api/PlayerAPI.h" #include "ll/api/memory/Hook.h" #include "lse/api/Thread.h" +#include "mc/scripting/modules/minecraft/events/ScriptBlockBreakingEventListener.h" #include "mc/scripting/modules/minecraft/events/ScriptBlockGlobalEventListener.h" #include "mc/server/commands/CommandOrigin.h" #include "mc/server/commands/CommandOriginType.h" diff --git a/xmake.lua b/xmake.lua index 819d9fd6..ca6b08e3 100644 --- a/xmake.lua +++ b/xmake.lua @@ -2,8 +2,7 @@ add_rules("mode.debug", "mode.release") add_repositories("levimc-repo " .. (get_config("levimc_repo") or "https://github.com/LiteLDev/xmake-repo.git")) -add_requires("levilamina 26.51.*", {configs = {target_type = get_config("target_type")}}) - +add_requires("levilamina feat/custom-mod-directories", {configs = {target_type = get_config("target_type")}}) add_requires("levibuildscript") add_requires("legacyremotecall 0.22.*", {configs = {target_type = get_config("target_type")}}) @@ -65,7 +64,7 @@ option("backend") target("LegacyScriptEngine") add_rules("@levibuildscript/linkrule") if is_plat("windows") then - add_defines("NOMINMAX", "UNICODE", "_AMC64_") + add_defines("NOMINMAX", "UNICODE", "_AMC64_", "_HAS_CXX23=1") set_exceptions("none") -- To avoid conflicts with /EHa. add_cxflags( "/EHa", "/utf-8", "/W4", "/w44265", "/w44289", "/w44296", "/w45263", "/w44738", "/w45204") add_cxflags( @@ -125,6 +124,9 @@ target("LegacyScriptEngine") if has_config("publish") then add_defines("LSE_VERSION_PUBLISH") end + add_sysincludedirs("D:/Github/LiteLDev/LeviLamina/build/packages/l/levilamina/windows/x64/release/include") + add_linkdirs("D:/Github/LiteLDev/LeviLamina/build/packages/l/levilamina/windows/x64/release/lib") + add_links("LeviLamina") on_load(function (target) local tag = os.iorun("git describe --tags --abbrev=0 --always") local major, minor, patch, suffix = tag:match("v(%d+)%.(%d+)%.(%d+)(.*)") From 6e847ec555fa60b8588d3c7f3266ad00488a9671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=90=E6=B2=90=E5=91=80?= <163636894+zimuya4153@users.noreply.github.com> Date: Wed, 14 Oct 2026 18:09:14 +0800 Subject: [PATCH 2/2] adapt: adapt the custom mod loading directory --- xmake.lua | 3 --- 1 file changed, 3 deletions(-) diff --git a/xmake.lua b/xmake.lua index ca6b08e3..de9102da 100644 --- a/xmake.lua +++ b/xmake.lua @@ -124,9 +124,6 @@ target("LegacyScriptEngine") if has_config("publish") then add_defines("LSE_VERSION_PUBLISH") end - add_sysincludedirs("D:/Github/LiteLDev/LeviLamina/build/packages/l/levilamina/windows/x64/release/include") - add_linkdirs("D:/Github/LiteLDev/LeviLamina/build/packages/l/levilamina/windows/x64/release/lib") - add_links("LeviLamina") on_load(function (target) local tag = os.iorun("git describe --tags --abbrev=0 --always") local major, minor, patch, suffix = tag:match("v(%d+)%.(%d+)%.(%d+)(.*)")