13
13
#include " engine/LocalShareData.h"
14
14
#include " ll/api/command/CommandHandle.h"
15
15
#include " ll/api/command/runtime/RuntimeCommand.h"
16
- #include " ll/api/command/runtime/RuntimeEnum.h"
17
16
#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"
20
18
#include " ll/api/service/Bedrock.h"
21
19
#include " ll/api/service/GamingStatus.h"
22
- #include " lse/Plugin.h"
23
20
#include " magic_enum.hpp"
24
21
#include " mc/_HeaderOutputPredefine.h"
25
- #include " mc/deps/core/string/HashedString.h"
26
22
#include " mc/deps/core/utility/MCRESULT.h"
27
23
#include " mc/locale/I18n.h"
28
24
#include " mc/locale/Localization.h"
29
- #include " mc/server/ServerLevel.h"
30
25
#include " mc/server/commands/CommandBlockName.h"
31
26
#include " mc/server/commands/CommandBlockNameResult.h"
32
27
#include " mc/server/commands/CommandContext.h"
42
37
#include " mc/world/item/ItemInstance.h"
43
38
#include " mc/world/item/ItemStack.h"
44
39
#include " mc/world/level/dimension/Dimension.h"
40
+ #include " ll/api/thread/ServerThreadExecutor.h"
45
41
46
42
#include < string>
47
43
#include < vector>
48
44
49
45
using namespace ll ::command;
50
- using ll::event::EventBus;
51
- using ll::event::ServerStartedEvent;
52
46
53
47
// ////////////////// Class Definition ////////////////////
54
48
@@ -277,11 +271,10 @@ Local<Value> McClass::newCommand(const Arguments& args) {
277
271
}
278
272
};
279
273
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 ());
285
278
} else {
286
279
newCommandFunc (name, desc, permission, flag, alias);
287
280
}
@@ -314,10 +307,10 @@ Local<Value> CommandClass::setAlias(const Arguments& args) {
314
307
try {
315
308
std::string alias = args[0 ].asString ().toString ();
316
309
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<> {
319
311
ll::command::CommandRegistrar::getInstance ().getOrCreateCommand (commandName).alias (alias);
320
- });
312
+ co_return ;
313
+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
321
314
return Boolean::newBoolean (true );
322
315
} else {
323
316
get ().alias (alias);
@@ -341,9 +334,10 @@ Local<Value> CommandClass::setEnum(const Arguments& args) {
341
334
enumValues.push_back ({enumArr.get (i).asString ().toString (), i});
342
335
}
343
336
if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
344
- EventBus::getInstance (). emplaceListener <ServerStartedEvent>( [enumName, enumValues](ServerStartedEvent&) {
337
+ ll::coro::keepThis ( [enumName, enumValues]() -> ll::coro::CoroTask<> {
345
338
CommandRegistrar::getInstance ().tryRegisterRuntimeEnum (enumName, std::move (enumValues));
346
- });
339
+ co_return ;
340
+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
347
341
return String::newString (enumName);
348
342
} else {
349
343
if (CommandRegistrar::getInstance ().tryRegisterRuntimeEnum (enumName, std::move (enumValues))) {
@@ -516,31 +510,33 @@ Local<Value> CommandClass::addOverload(const Arguments& args) {
516
510
}
517
511
};
518
512
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 ;
529
524
}
530
- cmd.execute (onExecute);
531
- });
525
+ ).launch (ll::thread::ServerThreadExecutor::getDefault ());
532
526
};
533
527
if (args.size () == 0 ) {
534
528
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<> {
537
531
getEngineData (e)->plugin ->registeredCommands [commandName].push_back ({});
538
532
auto cmd = ll::command::CommandRegistrar::getInstance ()
539
533
.getOrCreateCommand (commandName)
540
534
.runtimeOverload (getEngineData (e)->plugin );
541
535
cmd.execute (onExecute);
536
+ co_return ;
542
537
}
543
- );
538
+ ).launch (ll::thread::ServerThreadExecutor::getDefault ());
539
+
544
540
} else {
545
541
getEngineOwnData ()->plugin ->registeredCommands [commandName].push_back ({});
546
542
auto cmd = get ().runtimeOverload (getEngineOwnData ()->plugin );
@@ -588,15 +584,16 @@ Local<Value> CommandClass::addOverload(const Arguments& args) {
588
584
auto arr = args[0 ].asArray ();
589
585
if (arr.size () == 0 ) {
590
586
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<> {
593
589
getEngineData (e)->plugin ->registeredCommands [commandName].push_back ({});
594
590
auto cmd = ll::command::CommandRegistrar::getInstance ()
595
591
.getOrCreateCommand (commandName)
596
592
.runtimeOverload (getEngineData (e)->plugin );
597
593
cmd.execute (onExecute);
594
+ co_return ;
598
595
}
599
- );
596
+ ). launch ( ll::thread::ServerThreadExecutor::getDefault ()) ;
600
597
} else {
601
598
getEngineOwnData ()->plugin ->registeredCommands [commandName].push_back ({});
602
599
auto cmd = get ().runtimeOverload (getEngineOwnData ()->plugin );
@@ -689,9 +686,10 @@ Local<Value> CommandClass::setSoftEnum(const Arguments& args) {
689
686
auto name = args[0 ].asString ().toString ();
690
687
auto enums = parseStringList (args[1 ].asArray ());
691
688
if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
692
- EventBus::getInstance (). emplaceListener <ServerStartedEvent>( [name, enums](ServerStartedEvent&) {
689
+ ll::coro::keepThis ( [name, enums]() -> ll::coro::CoroTask<> {
693
690
CommandRegistrar::getInstance ().tryRegisterSoftEnum (name, std::move (enums));
694
- });
691
+ co_return ;
692
+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
695
693
} else {
696
694
CommandRegistrar::getInstance ().tryRegisterSoftEnum (name, std::move (enums));
697
695
}
@@ -708,9 +706,10 @@ Local<Value> CommandClass::addSoftEnumValues(const Arguments& args) {
708
706
auto name = args[0 ].asString ().toString ();
709
707
auto enums = parseStringList (args[1 ].asArray ());
710
708
if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
711
- EventBus::getInstance (). emplaceListener <ServerStartedEvent>( [name, enums](ServerStartedEvent&) {
709
+ ll::coro::keepThis ( [name, enums]() -> ll::coro::CoroTask<> {
712
710
CommandRegistrar::getInstance ().addSoftEnumValues (name, std::move (enums));
713
- });
711
+ co_return ;
712
+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
714
713
} else {
715
714
CommandRegistrar::getInstance ().addSoftEnumValues (name, std::move (enums));
716
715
}
@@ -727,9 +726,10 @@ Local<Value> CommandClass::removeSoftEnumValues(const Arguments& args) {
727
726
auto name = args[0 ].asString ().toString ();
728
727
auto enums = parseStringList (args[1 ].asArray ());
729
728
if (ll::getGamingStatus () == ll::GamingStatus::Starting) {
730
- EventBus::getInstance (). emplaceListener <ServerStartedEvent>( [name, enums](ServerStartedEvent&) {
729
+ ll::coro::keepThis ( [name, enums]() -> ll::coro::CoroTask<> {
731
730
CommandRegistrar::getInstance ().removeSoftEnumValues (name, std::move (enums));
732
- });
731
+ co_return ;
732
+ }).launch (ll::thread::ServerThreadExecutor::getDefault ());
733
733
} else {
734
734
CommandRegistrar::getInstance ().removeSoftEnumValues (name, std::move (enums));
735
735
}
0 commit comments