Skip to content

Commit 5c8bff8

Browse files
committed
refactor: store CommandOutput and CommandOrigin as shared_ptr for asynchronous command processing
1 parent 126b090 commit 5c8bff8

7 files changed

Lines changed: 49 additions & 75 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.16.5] - 2026-01-12
11+
12+
### Changed
13+
14+
- Stored CommandOutput and CommandOrigin as shared_ptr for asynchronous command processing
15+
1016
## [0.16.4] - 2026-01-12
1117

1218
### Fixed
@@ -1081,7 +1087,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
10811087
[#332]: https://github.com/LiteLDev/LegacyScriptEngine/issues/332
10821088
[#339]: https://github.com/LiteLDev/LegacyScriptEngine/issues/339
10831089

1084-
[Unreleased]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.4...HEAD
1090+
[Unreleased]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.5...HEAD
1091+
[0.16.5]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.4...v0.16.5
10851092
[0.16.4]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.3...v0.16.4
10861093
[0.16.3]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.2...v0.16.3
10871094
[0.16.2]: https://github.com/LiteLDev/LegacyScriptEngine/compare/v0.16.1...v0.16.2

src/legacy/api/CommandAPI.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,8 +362,8 @@ void onExecute(CommandOrigin const& origin, CommandOutput& output, RuntimeComman
362362
try {
363363
Local<Object> args = Object::newObject();
364364
auto cmd = CommandClass::newCommand(commandName);
365-
auto* ori = new CommandOriginClass(origin);
366-
auto* outp = new CommandOutputClass(output, origin);
365+
auto* ori = new CommandOriginClass(origin.clone());
366+
auto* outp = new CommandOutputClass(std::make_shared<CommandOutput>(output), ori->get());
367367

368368
auto& registeredCommands = getEngineOwnData()->plugin->registeredCommands;
369369
if (registeredCommands.find(commandName) == registeredCommands.end()) {
@@ -396,8 +396,8 @@ void onExecute(CommandOrigin const& origin, CommandOutput& output, RuntimeComman
396396
}
397397
}
398398
localShareData->commandCallbacks[commandName].func.get().call({}, cmd, ori, outp, args);
399-
std::swap(output.mMessages, outp->output.mMessages);
400-
output.mSuccessCount = outp->output.mSuccessCount;
399+
std::swap(output.mMessages, outp->output->mMessages);
400+
output.mSuccessCount = outp->output->mSuccessCount;
401401
outp->isAsync = true;
402402
}
403403
CATCH_WITHOUT_RETURN("Fail in executing command \"" + commandName + "\"!")

src/legacy/api/CommandOriginAPI.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,50 +32,50 @@ ClassDefine<CommandOriginClass> CommandOriginClassBuilder =
3232

3333
//////////////////// APIs ////////////////////
3434

35-
CommandOriginClass::CommandOriginClass(CommandOrigin const& ori)
35+
CommandOriginClass::CommandOriginClass(std::shared_ptr<CommandOrigin const> ori)
3636
: ScriptClass(ScriptClass::ConstructFromCpp<CommandOriginClass>{}),
3737
origin(ori) {};
3838

3939
Local<Value> CommandOriginClass::getOriginType() {
4040
try {
41-
return Number::newNumber((int)get().getOriginType());
41+
return Number::newNumber((int)get()->getOriginType());
4242
}
4343
CATCH("Fail in getOriginType!");
4444
}
4545

4646
Local<Value> CommandOriginClass::getOriginTypeName() {
4747
try {
48-
return String::newString(magic_enum::enum_name(get().getOriginType()));
48+
return String::newString(magic_enum::enum_name(get()->getOriginType()));
4949
}
5050
CATCH("Fail in getOriginTypeName!");
5151
}
5252

5353
Local<Value> CommandOriginClass::getOriginName() {
5454
try {
55-
return String::newString(get().getName());
55+
return String::newString(get()->getName());
5656
}
5757
CATCH("Fail in getOriginName!");
5858
}
5959

6060
Local<Value> CommandOriginClass::getBlockPosition() {
6161
try {
62-
auto dim = get().getDimension();
63-
return IntPos::newPos(get().getBlockPosition(), dim ? (int)dim->getDimensionId() : 0);
62+
auto dim = get()->getDimension();
63+
return IntPos::newPos(get()->getBlockPosition(), dim ? (int)dim->getDimensionId() : 0);
6464
}
6565
CATCH("Fail in getBlockPosition!");
6666
}
6767

6868
Local<Value> CommandOriginClass::getPosition() {
6969
try {
70-
auto dim = get().getDimension();
71-
return FloatPos::newPos(get().getWorldPosition(), dim ? (int)dim->getDimensionId() : 0);
70+
auto dim = get()->getDimension();
71+
return FloatPos::newPos(get()->getWorldPosition(), dim ? (int)dim->getDimensionId() : 0);
7272
}
7373
CATCH("Fail in getPosition!");
7474
}
7575

7676
Local<Value> CommandOriginClass::getEntity() {
7777
try {
78-
auto entity = get().getEntity();
78+
auto entity = get()->getEntity();
7979
if (!entity) return Local<Value>();
8080
return EntityClass::newEntity(entity);
8181
}
@@ -84,7 +84,7 @@ Local<Value> CommandOriginClass::getEntity() {
8484

8585
Local<Value> CommandOriginClass::getPlayer() {
8686
try {
87-
Actor* player = get().getEntity();
87+
Actor* player = get()->getEntity();
8888
if (!player) return Local<Value>();
8989
return PlayerClass::newPlayer(static_cast<Player*>(player));
9090
}
@@ -93,7 +93,7 @@ Local<Value> CommandOriginClass::getPlayer() {
9393

9494
Local<Value> CommandOriginClass::getNbt(const Arguments&) {
9595
try {
96-
return NbtCompoundClass::pack(std::make_unique<CompoundTag>(get().serialize()));
96+
return NbtCompoundClass::pack(std::make_unique<CompoundTag>(get()->serialize()));
9797
}
9898
CATCH("Fail in getNbt!");
9999
}

src/legacy/api/CommandOriginAPI.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ extern ClassDefine<CommandOriginClass> CommandOriginClassBuilder;
88

99
class CommandOriginClass : public ScriptClass {
1010
public:
11-
CommandOrigin const& origin;
12-
inline CommandOrigin const& get() { return origin; }
11+
// Storing CommandOrigin as shared_ptr is for asynchronous command processing.
12+
std::shared_ptr<CommandOrigin const> origin;
13+
inline std::shared_ptr<CommandOrigin const> get() { return origin; }
1314

1415
public:
15-
CommandOriginClass(CommandOrigin const& ori);
16+
CommandOriginClass(std::shared_ptr<CommandOrigin const> ori);
1617
Local<Value> getOriginType();
1718
Local<Value> getOriginTypeName();
1819
Local<Value> getOriginName();

src/legacy/api/CommandOutputAPI.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,22 @@ ClassDefine<CommandOutputClass> CommandOutputClassBuilder =
2424

2525
//////////////////// APIs ////////////////////
2626

27-
CommandOutputClass::CommandOutputClass(CommandOutput& out, CommandOrigin const& ori)
27+
CommandOutputClass::CommandOutputClass(std::shared_ptr<CommandOutput> out, std::shared_ptr<CommandOrigin const> ori)
2828
: ScriptClass(ScriptClass::ConstructFromCpp<CommandOutputClass>{}),
2929
output(out),
3030
origin(ori),
3131
isAsync(false) {};
3232

3333
Local<Value> CommandOutputClass::empty() {
3434
try {
35-
return Boolean::newBoolean(get().mMessages.empty());
35+
return Boolean::newBoolean(get()->mMessages.empty());
3636
}
3737
CATCH("Fail in empty!");
3838
}
3939

4040
Local<Value> CommandOutputClass::getSuccessCount() {
4141
try {
42-
return Number::newNumber(get().mSuccessCount);
42+
return Number::newNumber(get()->mSuccessCount);
4343
}
4444
CATCH("Fail in getSuccessCount!");
4545
};
@@ -56,7 +56,7 @@ Local<Value> CommandOutputClass::getSuccessCount() {
5656
Local<Value> CommandOutputClass::success(const Arguments& args) {
5757
try {
5858
if (args.size() == 0) {
59-
++get().mSuccessCount;
59+
++get()->mSuccessCount;
6060
return Boolean::newBoolean(true);
6161
}
6262
CHECK_ARG_TYPE(args[0], ValueKind::kString);
@@ -68,11 +68,11 @@ Local<Value> CommandOutputClass::success(const Arguments& args) {
6868
for (int i = 0; i < paramArr.size(); ++i) {
6969
param.push_back(CommandOutputParameter(paramArr.get(i).asString().toString().c_str()));
7070
}
71-
get().success(msg, param);
71+
get()->success(msg, param);
7272
send();
7373
return Boolean::newBoolean(true);
7474
}
75-
get().success(msg);
75+
get()->success(msg);
7676
send();
7777
return Boolean::newBoolean(true);
7878
}
@@ -92,15 +92,15 @@ Local<Value> CommandOutputClass::addMessage(const Arguments& args) {
9292
}
9393
if (args.size() >= 3) {
9494
CHECK_ARG_TYPE(args[2], ValueKind::kNumber);
95-
get().addMessage(msg, param, (CommandOutputMessageType)args[2].asNumber().toInt32());
95+
get()->addMessage(msg, param, (CommandOutputMessageType)args[2].asNumber().toInt32());
9696
send();
9797
return Boolean::newBoolean(true);
9898
}
99-
get().addMessage(msg, param, (CommandOutputMessageType)0);
99+
get()->addMessage(msg, param, (CommandOutputMessageType)0);
100100
send();
101101
return Boolean::newBoolean(true);
102102
}
103-
get().addMessage(msg, {}, CommandOutputMessageType::Success);
103+
get()->addMessage(msg, {}, CommandOutputMessageType::Success);
104104
send();
105105
return Boolean::newBoolean(true);
106106
}
@@ -119,11 +119,11 @@ Local<Value> CommandOutputClass::error(const Arguments& args) {
119119
for (int i = 0; i < paramArr.size(); ++i) {
120120
param.push_back(CommandOutputParameter(paramArr.get(i).asString().toString().c_str()));
121121
}
122-
get().error(msg, param);
122+
get()->error(msg, param);
123123
send();
124124
return Boolean::newBoolean(true);
125125
}
126-
get().error(msg);
126+
get()->error(msg);
127127
send();
128128
return Boolean::newBoolean(true);
129129
}
@@ -133,9 +133,9 @@ Local<Value> CommandOutputClass::error(const Arguments& args) {
133133
void CommandOutputClass::send() {
134134
try {
135135
if (!isAsync) return;
136-
ll::service::getMinecraft()->mCommands->handleOutput(origin, output);
137-
output.mSuccessCount = 0;
138-
output.mMessages.clear();
136+
ll::service::getMinecraft()->mCommands->handleOutput(*origin, *output);
137+
output->mSuccessCount = 0;
138+
output->mMessages.clear();
139139
}
140140
CATCH_WITHOUT_RETURN("Fail in sendCommandOutput!");
141141
}

src/legacy/api/CommandOutputAPI.h

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,54 +7,20 @@ extern ClassDefine<CommandOutputClass> CommandOutputClassBuilder;
77

88
class CommandOutputClass : public ScriptClass {
99
public:
10-
CommandOutput& output;
11-
CommandOrigin const& origin;
12-
bool isAsync;
13-
inline CommandOutput& get() { return output; }
10+
// Storing CommandOutput and CommandOrigin as shared_ptr is for asynchronous command processing.
11+
std::shared_ptr<CommandOutput> output;
12+
std::shared_ptr<CommandOrigin const> origin;
13+
bool isAsync;
14+
inline std::shared_ptr<CommandOutput> get() { return output; }
1415

1516
public:
16-
CommandOutputClass(CommandOutput& output, CommandOrigin const& origin);
17+
CommandOutputClass(std::shared_ptr<CommandOutput> output, std::shared_ptr<CommandOrigin const> origin);
1718

1819
Local<Value> empty();
19-
2020
Local<Value> getSuccessCount();
21-
2221
Local<Value> success(const Arguments& args);
23-
2422
Local<Value> addMessage(const Arguments& args);
25-
2623
Local<Value> error(const Arguments& args);
27-
28-
void send();
29-
30-
// Local<Value> setHasPlayerText()
31-
//{
32-
// try
33-
// {
34-
// get()->setHasPlayerText();
35-
// return Boolean::newBoolean(true);
36-
// }
37-
// CATCH("Fail in getBlockPosition!");
38-
// };
39-
40-
// Local<Value> wantsData()
41-
//{
42-
// try
43-
// {
44-
// return Boolean::newBoolean(get()->wantsData());
45-
// }
46-
// CATCH("Fail in getBlockPosition!");
47-
// };
48-
49-
// Local<Value> addToResultList(const Arguments& args);
50-
51-
// Local<Value> forceOutput(const Arguments& args);
52-
53-
// Local<Value> getData() const;
54-
55-
// Local<Value> getMessages() const;
56-
57-
// Local<Value> load(const Arguments& args);
58-
24+
void send();
5925
Local<Value> toString(const Arguments& args);
6026
};

tooth.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"format_version": 3,
33
"format_uuid": "289f771f-2c9a-4d73-9f3f-8492495a924d",
44
"tooth": "github.com/LiteLDev/LegacyScriptEngine",
5-
"version": "0.16.4",
5+
"version": "0.16.5",
66
"info": {
77
"name": "LegacyScriptEngine",
88
"description": "A plugin engine for running LLSE plugins on LeviLamina",

0 commit comments

Comments
 (0)