1313#include " engine/LocalShareData.h"
1414#include " ll/api/command/CommandHandle.h"
1515#include " ll/api/command/runtime/RuntimeCommand.h"
16- #include " ll/api/command/runtime/RuntimeEnum.h"
1716#include " ll/api/command/runtime/RuntimeOverload.h"
18- #include " ll/api/event/EventBus.h"
19- #include " ll/api/event/server/ServerStartedEvent.h"
17+ #include " ll/api/coro/CoroTask.h"
2018#include " ll/api/service/Bedrock.h"
2119#include " ll/api/service/GamingStatus.h"
22- #include " lse/Plugin.h"
2320#include " magic_enum.hpp"
2421#include " mc/_HeaderOutputPredefine.h"
25- #include " mc/deps/core/string/HashedString.h"
2622#include " mc/deps/core/utility/MCRESULT.h"
2723#include " mc/locale/I18n.h"
2824#include " mc/locale/Localization.h"
29- #include " mc/server/ServerLevel.h"
3025#include " mc/server/commands/CommandBlockName.h"
3126#include " mc/server/commands/CommandBlockNameResult.h"
3227#include " mc/server/commands/CommandContext.h"
4237#include " mc/world/item/ItemInstance.h"
4338#include " mc/world/item/ItemStack.h"
4439#include " mc/world/level/dimension/Dimension.h"
40+ #include " ll/api/thread/ServerThreadExecutor.h"
4541
4642#include < string>
4743#include < vector>
4844
4945using namespace ll ::command;
50- using ll::event::EventBus;
51- using ll::event::ServerStartedEvent;
5246
5347// ////////////////// Class Definition ////////////////////
5448
@@ -277,11 +271,10 @@ Local<Value> McClass::newCommand(const Arguments& args) {
277271 }
278272 };
279273 if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
280- EventBus::getInstance ().emplaceListener <ServerStartedEvent>(
281- [name, desc, permission, flag, alias, newCommandFunc](ServerStartedEvent&) {
282- newCommandFunc (name, desc, permission, flag, alias);
283- }
284- );
274+ ll::coro::keepThis ([name, desc, permission, flag, alias, newCommandFunc]() -> ll::coro::CoroTask<> {
275+ newCommandFunc (name, desc, permission, flag, alias);
276+ co_return ;
277+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
285278 } else {
286279 newCommandFunc (name, desc, permission, flag, alias);
287280 }
@@ -314,10 +307,10 @@ Local<Value> CommandClass::setAlias(const Arguments& args) {
314307 try {
315308 std::string alias = args[0 ].asString ().toString ();
316309 if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
317- EventBus::getInstance ().emplaceListener <ServerStartedEvent>([commandName (commandName),
318- alias](ServerStartedEvent&) {
310+ ll::coro::keepThis ([commandName (commandName), alias]() -> ll::coro::CoroTask<> {
319311 ll::command::CommandRegistrar::getInstance ().getOrCreateCommand (commandName).alias (alias);
320- });
312+ co_return ;
313+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
321314 return Boolean::newBoolean (true );
322315 } else {
323316 get ().alias (alias);
@@ -341,9 +334,10 @@ Local<Value> CommandClass::setEnum(const Arguments& args) {
341334 enumValues.push_back ({enumArr.get (i).asString ().toString (), i});
342335 }
343336 if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
344- EventBus::getInstance (). emplaceListener <ServerStartedEvent>( [enumName, enumValues](ServerStartedEvent&) {
337+ ll::coro::keepThis ( [enumName, enumValues]() -> ll::coro::CoroTask<> {
345338 CommandRegistrar::getInstance ().tryRegisterRuntimeEnum (enumName, std::move (enumValues));
346- });
339+ co_return ;
340+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
347341 return String::newString (enumName);
348342 } else {
349343 if (CommandRegistrar::getInstance ().tryRegisterRuntimeEnum (enumName, std::move (enumValues))) {
@@ -516,31 +510,33 @@ Local<Value> CommandClass::addOverload(const Arguments& args) {
516510 }
517511 };
518512 auto delayRegFunc = [this , &overloadFunc](std::vector<std::string>& paramNames) {
519- EventBus::getInstance ().emplaceListener <ServerStartedEvent>([paramNames,
520- commandName (commandName),
521- overloadFunc,
522- e (EngineScope::currentEngine ()
523- )](ServerStartedEvent&) {
524- auto cmd = ll::command::CommandRegistrar::getInstance ()
525- .getOrCreateCommand (commandName)
526- .runtimeOverload (getEngineData (e)->plugin );
527- for (auto & paramName : paramNames) {
528- overloadFunc (cmd, commandName, paramName);
513+ ll::coro::keepThis (
514+ [paramNames, commandName (commandName), overloadFunc, e (EngineScope::currentEngine ())](
515+ ) -> ll::coro::CoroTask<> {
516+ auto cmd = ll::command::CommandRegistrar::getInstance ()
517+ .getOrCreateCommand (commandName)
518+ .runtimeOverload (getEngineData (e)->plugin );
519+ for (auto & paramName : paramNames) {
520+ overloadFunc (cmd, commandName, paramName);
521+ }
522+ cmd.execute (onExecute);
523+ co_return ;
529524 }
530- cmd.execute (onExecute);
531- });
525+ ).launch (ll::thread::ServerThreadExecutor::getDefault ());
532526 };
533527 if (args.size () == 0 ) {
534528 if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
535- EventBus::getInstance (). emplaceListener <ServerStartedEvent> (
536- [commandName (commandName), e (EngineScope::currentEngine ())](ServerStartedEvent&) {
529+ ll::coro::keepThis (
530+ [commandName (commandName), e (EngineScope::currentEngine ())]() -> ll::coro::CoroTask<> {
537531 getEngineData (e)->plugin ->registeredCommands [commandName].push_back ({});
538532 auto cmd = ll::command::CommandRegistrar::getInstance ()
539533 .getOrCreateCommand (commandName)
540534 .runtimeOverload (getEngineData (e)->plugin );
541535 cmd.execute (onExecute);
536+ co_return ;
542537 }
543- );
538+ ).launch (ll::thread::ServerThreadExecutor::getDefault ());
539+
544540 } else {
545541 getEngineOwnData ()->plugin ->registeredCommands [commandName].push_back ({});
546542 auto cmd = get ().runtimeOverload (getEngineOwnData ()->plugin );
@@ -588,15 +584,16 @@ Local<Value> CommandClass::addOverload(const Arguments& args) {
588584 auto arr = args[0 ].asArray ();
589585 if (arr.size () == 0 ) {
590586 if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
591- EventBus::getInstance (). emplaceListener <ServerStartedEvent> (
592- [commandName (commandName), e (EngineScope::currentEngine ())](ServerStartedEvent&) {
587+ ll::coro::keepThis (
588+ [commandName (commandName), e (EngineScope::currentEngine ())]() -> ll::coro::CoroTask<> {
593589 getEngineData (e)->plugin ->registeredCommands [commandName].push_back ({});
594590 auto cmd = ll::command::CommandRegistrar::getInstance ()
595591 .getOrCreateCommand (commandName)
596592 .runtimeOverload (getEngineData (e)->plugin );
597593 cmd.execute (onExecute);
594+ co_return ;
598595 }
599- );
596+ ). launch ( ll::thread::ServerThreadExecutor::getDefault ()) ;
600597 } else {
601598 getEngineOwnData ()->plugin ->registeredCommands [commandName].push_back ({});
602599 auto cmd = get ().runtimeOverload (getEngineOwnData ()->plugin );
@@ -689,9 +686,10 @@ Local<Value> CommandClass::setSoftEnum(const Arguments& args) {
689686 auto name = args[0 ].asString ().toString ();
690687 auto enums = parseStringList (args[1 ].asArray ());
691688 if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
692- EventBus::getInstance (). emplaceListener <ServerStartedEvent>( [name, enums](ServerStartedEvent&) {
689+ ll::coro::keepThis ( [name, enums]() -> ll::coro::CoroTask<> {
693690 CommandRegistrar::getInstance ().tryRegisterSoftEnum (name, std::move (enums));
694- });
691+ co_return ;
692+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
695693 } else {
696694 CommandRegistrar::getInstance ().tryRegisterSoftEnum (name, std::move (enums));
697695 }
@@ -708,9 +706,10 @@ Local<Value> CommandClass::addSoftEnumValues(const Arguments& args) {
708706 auto name = args[0 ].asString ().toString ();
709707 auto enums = parseStringList (args[1 ].asArray ());
710708 if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
711- EventBus::getInstance (). emplaceListener <ServerStartedEvent>( [name, enums](ServerStartedEvent&) {
709+ ll::coro::keepThis ( [name, enums]() -> ll::coro::CoroTask<> {
712710 CommandRegistrar::getInstance ().addSoftEnumValues (name, std::move (enums));
713- });
711+ co_return ;
712+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
714713 } else {
715714 CommandRegistrar::getInstance ().addSoftEnumValues (name, std::move (enums));
716715 }
@@ -727,9 +726,10 @@ Local<Value> CommandClass::removeSoftEnumValues(const Arguments& args) {
727726 auto name = args[0 ].asString ().toString ();
728727 auto enums = parseStringList (args[1 ].asArray ());
729728 if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
730- EventBus::getInstance (). emplaceListener <ServerStartedEvent>( [name, enums](ServerStartedEvent&) {
729+ ll::coro::keepThis ( [name, enums]() -> ll::coro::CoroTask<> {
731730 CommandRegistrar::getInstance ().removeSoftEnumValues (name, std::move (enums));
732- });
731+ co_return ;
732+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
733733 } else {
734734 CommandRegistrar::getInstance ().removeSoftEnumValues (name, std::move (enums));
735735 }
0 commit comments