From 067ab5c9a26c7dbd2be3266a2ddff1b3e8e13c5a Mon Sep 17 00:00:00 2001 From: ShrBox Date: Fri, 3 Jan 2025 23:11:38 +0800 Subject: [PATCH] feat: replace quickjs engine with quickjs-ng feat: update lua engine to 5.4.7 feat: add some test scripts fix: fix a bug in command overload --- docs/apis/ScriptAPI/ScriptHelp.md | 2 +- docs/apis/ScriptAPI/ScriptHelp.zh.md | 2 +- src/legacy/api/CommandAPI.cpp | 38 +++++++++---------- src/legacy/api/CommandAPI.h | 2 +- .../{EventTests => LSETests}/EventTests.js | 32 +++++++--------- src/tests/LSETests/ScriptTests.js | 12 ++++++ src/tests/LSETests/main.js | 29 ++++++++++++++ .../{EventTests => LSETests}/manifest.json | 4 +- 8 files changed, 78 insertions(+), 43 deletions(-) rename src/tests/{EventTests => LSETests}/EventTests.js (70%) create mode 100644 src/tests/LSETests/ScriptTests.js create mode 100644 src/tests/LSETests/main.js rename src/tests/{EventTests => LSETests}/manifest.json (74%) diff --git a/docs/apis/ScriptAPI/ScriptHelp.md b/docs/apis/ScriptAPI/ScriptHelp.md index 0aacff89..a93aed22 100644 --- a/docs/apis/ScriptAPI/ScriptHelp.md +++ b/docs/apis/ScriptAPI/ScriptHelp.md @@ -34,7 +34,7 @@ This is an upgraded version of the above function; it supports color output. #### Show results: -![ColorLogExample](../../../img/ColorLog.png) +![ColorLogExample](/img/ColorLog.png) ### Asynchronous Output diff --git a/docs/apis/ScriptAPI/ScriptHelp.zh.md b/docs/apis/ScriptAPI/ScriptHelp.zh.md index bfd3425b..dd914fd9 100644 --- a/docs/apis/ScriptAPI/ScriptHelp.zh.md +++ b/docs/apis/ScriptAPI/ScriptHelp.zh.md @@ -33,7 +33,7 @@ #### 效果展示: -![ColorLogExample](../../../img/ColorLog.png) +![ColorLogExample](/img/ColorLog.png) ### 异步输出 diff --git a/src/legacy/api/CommandAPI.cpp b/src/legacy/api/CommandAPI.cpp index 9129af7b..5ddf80fc 100644 --- a/src/legacy/api/CommandAPI.cpp +++ b/src/legacy/api/CommandAPI.cpp @@ -410,7 +410,7 @@ Local CommandClass::newParameter(const Arguments& args) { option = (CommandParameterOption)args[index++].asNumber().toInt32(); if (index != args.size()) throw std::runtime_error("Error Argument in newParameter"); - getEngineOwnData()->plugin->registeredCommands[commandName].push_back({name, type, optional, enumName} + getEngineOwnData()->plugin->registeredCommands[commandName].push_back({name, type, optional, enumName, option} ); // Stores the parameter name for onExecute use return Boolean::newBoolean(true); @@ -436,7 +436,7 @@ Local CommandClass::mandatory(const Arguments& args) { option = (CommandParameterOption)args[index++].asNumber().toInt32(); if (index != args.size()) throw std::runtime_error("Error Argument in newParameter"); - getEngineOwnData()->plugin->registeredCommands[commandName].push_back({name, type, false, enumName} + getEngineOwnData()->plugin->registeredCommands[commandName].push_back({name, type, false, enumName, option} ); // Stores the parameter name for onExecute use return Boolean::newBoolean(true); @@ -462,7 +462,7 @@ Local CommandClass::optional(const Arguments& args) { option = (CommandParameterOption)args[index++].asNumber().toInt32(); if (index != args.size()) throw std::runtime_error("Error Argument in newParameter"); - getEngineOwnData()->plugin->registeredCommands[commandName].push_back({name, type, true, enumName} + getEngineOwnData()->plugin->registeredCommands[commandName].push_back({name, type, true, enumName, option} ); // Stores the parameter name for onExecute use return Boolean::newBoolean(true); @@ -495,8 +495,8 @@ Local CommandClass::addOverload(const Arguments& args) { } } }; - auto delayRegFunc = [this, &overloadFunc](std::vector& enumValues) { - EventBus::getInstance().emplaceListener([enumValues, + auto delayRegFunc = [this, &overloadFunc](std::vector& paramNames) { + EventBus::getInstance().emplaceListener([paramNames, commandName(commandName), overloadFunc, e(EngineScope::currentEngine() @@ -504,7 +504,7 @@ Local CommandClass::addOverload(const Arguments& args) { auto cmd = ll::command::CommandRegistrar::getInstance() .getOrCreateCommand(commandName) .runtimeOverload(getEngineData(e)->plugin); - for (auto& paramName : enumValues) { + for (auto& paramName : paramNames) { overloadFunc(cmd, commandName, paramName); } cmd.execute(onExecute); @@ -513,12 +513,12 @@ Local CommandClass::addOverload(const Arguments& args) { if (args[0].isNumber()) { if (ll::getGamingStatus() == ll::GamingStatus::Starting) { - std::vector enumValues; + std::vector paramNames; for (int i = 0; i < args.size(); ++i) { CHECK_ARG_TYPE(args[i], ValueKind::kNumber); - enumValues.push_back(std::to_string(args[i].asNumber().toInt32())); + paramNames.push_back(std::to_string(args[i].asNumber().toInt32())); } - delayRegFunc(enumValues); + delayRegFunc(paramNames); } else { auto cmd = get().runtimeOverload(getEngineOwnData()->plugin); for (int i = 0; i < args.size(); ++i) { @@ -531,17 +531,17 @@ Local CommandClass::addOverload(const Arguments& args) { return Boolean::newBoolean(true); } else if (args[0].isString()) { if (ll::getGamingStatus() == ll::GamingStatus::Starting) { - std::vector enumValues; + std::vector paramNames; for (int i = 0; i < args.size(); ++i) { CHECK_ARG_TYPE(args[i], ValueKind::kString); - enumValues.push_back(args[0].asString().toString()); + paramNames.push_back(args[i].asString().toString()); } - delayRegFunc(enumValues); + delayRegFunc(paramNames); } else { auto cmd = get().runtimeOverload(getEngineOwnData()->plugin); for (int i = 0; i < args.size(); ++i) { CHECK_ARG_TYPE(args[i], ValueKind::kString); - std::string paramName = args[0].asString().toString(); + std::string paramName = args[i].asString().toString(); overloadFunc(cmd, commandName, paramName); } cmd.execute(onExecute); @@ -569,12 +569,12 @@ Local CommandClass::addOverload(const Arguments& args) { } if (arr.get(0).isNumber()) { if (ll::getGamingStatus() == ll::GamingStatus::Starting) { - std::vector enumValues; + std::vector paramNames; for (int i = 0; i < arr.size(); ++i) { CHECK_ARG_TYPE(arr.get(i), ValueKind::kNumber); - enumValues.push_back(std::to_string(arr.get(i).asNumber().toInt32())); + paramNames.push_back(std::to_string(arr.get(i).asNumber().toInt32())); } - delayRegFunc(enumValues); + delayRegFunc(paramNames); } else { auto cmd = get().runtimeOverload(getEngineOwnData()->plugin); for (int i = 0; i < arr.size(); ++i) { @@ -587,12 +587,12 @@ Local CommandClass::addOverload(const Arguments& args) { return Boolean::newBoolean(true); } else if (arr.get(0).isString()) { if (ll::getGamingStatus() == ll::GamingStatus::Starting) { - std::vector enumValues; + std::vector paramNames; for (int i = 0; i < arr.size(); ++i) { CHECK_ARG_TYPE(arr.get(i), ValueKind::kString); - enumValues.push_back(arr.get(i).asString().toString()); + paramNames.push_back(arr.get(i).asString().toString()); } - delayRegFunc(enumValues); + delayRegFunc(paramNames); } else { auto cmd = get().runtimeOverload(getEngineOwnData()->plugin); for (int i = 0; i < arr.size(); ++i) { diff --git a/src/legacy/api/CommandAPI.h b/src/legacy/api/CommandAPI.h index 0d46a63c..3af53a56 100644 --- a/src/legacy/api/CommandAPI.h +++ b/src/legacy/api/CommandAPI.h @@ -17,7 +17,7 @@ enum class OldCommandPermissionLevel : schar { Internal = 0x5, }; -enum class OldParameterType { +enum class OldParameterType : size_t { Int, Bool, Float, diff --git a/src/tests/EventTests/EventTests.js b/src/tests/LSETests/EventTests.js similarity index 70% rename from src/tests/EventTests/EventTests.js rename to src/tests/LSETests/EventTests.js index 8a35a2a2..22c646d5 100644 --- a/src/tests/EventTests/EventTests.js +++ b/src/tests/LSETests/EventTests.js @@ -1,4 +1,4 @@ -const events = [ +export const events = [ "onPreJoin", "onJoin", "onLeft", @@ -78,23 +78,17 @@ const events = [ "onMobSpawned" ]; -const triggeredEvents = new Set(); +export const triggeredEvents = new Set(); -events.forEach(event => { - mc.listen(event, () => { - if (triggeredEvents.has(event)) { - return; - } - logger.info(`Event ${event} triggered`); - triggeredEvents.add(event); - logger.info(`${triggeredEvents.size}/${events.length} events called`); +export function RegisterEvents() { + events.forEach(event => { + mc.listen(event, () => { + if (triggeredEvents.has(event)) { + return; + } + logger.info(`Event ${event} triggered`); + triggeredEvents.add(event); + logger.info(`${triggeredEvents.size}/${events.length} events called`); + }); }); -}); - -// Output which events have not been triggered -let cmd = mc.newCommand('lsetests', "LegacyScriptEngine tests", PermType.Console) -cmd.overload([]) -cmd.setCallback((cmd, origin, output, results) => { - const notTriggeredEvents = events.filter(event => !triggeredEvents.has(event)); - logger.info(`Events not triggered: ${notTriggeredEvents.join(', ')}`); -}) +} \ No newline at end of file diff --git a/src/tests/LSETests/ScriptTests.js b/src/tests/LSETests/ScriptTests.js new file mode 100644 index 00000000..821601c9 --- /dev/null +++ b/src/tests/LSETests/ScriptTests.js @@ -0,0 +1,12 @@ +export function loggerTest(player) { + if (player) { + logger.setPlayer(player) + } + logger.setFile("logs/LegacyScriptEngine/ScriptTests.log"); + logger.log("This is a log message"); + logger.warn("This is a warning message"); + logger.error("This is an error message"); + logger.debug("This is a debug message"); + logger.info("This is an info message"); + logger.fatal("This is a fetal message"); +} \ No newline at end of file diff --git a/src/tests/LSETests/main.js b/src/tests/LSETests/main.js new file mode 100644 index 00000000..ca66f223 --- /dev/null +++ b/src/tests/LSETests/main.js @@ -0,0 +1,29 @@ +import {RegisterEvents, events, triggeredEvents} from './plugins/LSETests/EventTests.js'; +import {loggerTest} from './plugins/LSETests/ScriptTests.js'; + +RegisterEvents(); + +mc.listen('onServerStarted', () => { + let cmd = mc.newCommand('lsetests', "LegacyScriptEngine tests", PermType.Console); + cmd.setEnum('testOption', ['logger', 'events']); + cmd.mandatory('testOption', ParamType.Enum, 'testOption'); + cmd.optional('player', ParamType.Player); + cmd.overload('testOption', 'player'); + cmd.setCallback((cmd, origin, output, results) => { + switch (results.testOption) { + case 'logger': + loggerTest(results.player); + break; + case 'events': + const + notTriggeredEvents = events.filter(event => !triggeredEvents.has(event)); + logger.info(`Events not triggered: ${notTriggeredEvents.join(', ')}`); + break; + default: + logger.error(`Invalid test option ${results.testOption}`); + break; + } + }); +}) + + diff --git a/src/tests/EventTests/manifest.json b/src/tests/LSETests/manifest.json similarity index 74% rename from src/tests/EventTests/manifest.json rename to src/tests/LSETests/manifest.json index 07c97b27..ee2887f2 100644 --- a/src/tests/EventTests/manifest.json +++ b/src/tests/LSETests/manifest.json @@ -1,6 +1,6 @@ { - "entry": "EventTests.js", - "name": "EventTests", + "entry": "main.js", + "name": "LSETests", "type": "lse-quickjs", "author": "LiteLDev", "version": "1.0.0",