Skip to content

Commit ad3785d

Browse files
committed
refactor: refactor gui api
1 parent 4f8e5c8 commit ad3785d

File tree

12 files changed

+236
-1190
lines changed

12 files changed

+236
-1190
lines changed

src/legacy/api/GuiAPI.cpp

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
#include "api/APIHelp.h"
44
#include "api/McAPI.h"
55
#include "api/PlayerAPI.h"
6-
#include "engine/EngineOwnData.h"
76
#include "engine/GlobalShareData.h"
7+
#include "ll/api/form/FormBase.h"
8+
#include "ll/api/form/SimpleForm.h"
89
#include "ll/api/service/GamingStatus.h"
9-
#include "ll/api/service/ServerInfo.h"
1010
#include "mc/world/actor/player/Player.h"
11+
#include "nlohmann/json_fwd.hpp"
1112

12-
#include <iostream>
13-
14-
using lse::form::FormCancelReason;
13+
using ll::form::FormCancelReason;
1514

1615
//////////////////// Class Definition ////////////////////
1716

@@ -44,33 +43,27 @@ Local<Object> SimpleFormClass::newForm() {
4443
return newp->getScriptObject();
4544
}
4645

47-
lse::form::SimpleForm* SimpleFormClass::extract(Local<Value> v) {
46+
ll::form::SimpleForm* SimpleFormClass::extract(Local<Value> v) {
4847
if (EngineScope::currentEngine()->isInstanceOf<SimpleFormClass>(v))
4948
return EngineScope::currentEngine()->getNativeInstance<SimpleFormClass>(v)->get();
5049
else return nullptr;
5150
}
5251

53-
void SimpleFormClass::sendForm(lse::form::SimpleForm* form, Player* player, script::Local<Function>& callback) {
52+
void SimpleFormClass::sendForm(ll::form::SimpleForm* form, Player* player, script::Local<Function>& callback) {
5453
script::Global<Function> callbackFunc{callback};
55-
5654
form->sendTo(
57-
player,
55+
*player,
5856
[engine{EngineScope::currentEngine()},
59-
callback{std::move(callbackFunc)}](Player* pl, int chosen, FormCancelReason reason) {
57+
callback{std::move(callbackFunc)}](Player& pl, int chosen, FormCancelReason reason) {
6058
if ((ll::getGamingStatus() != ll::GamingStatus::Running)) return;
6159
if (!EngineManager::isValid(engine)) return;
6260
if (callback.isEmpty()) return;
6361

6462
EngineScope scope(engine);
6563
try {
66-
if (chosen < 0) callback.get().call({}, PlayerClass::newPlayer(pl), Local<Value>());
67-
else
68-
callback.get().call(
69-
{},
70-
PlayerClass::newPlayer(pl),
71-
Number::newNumber(chosen),
72-
reason.has_value() ? Number::newNumber((uchar)reason.value()) : Local<Value>()
73-
);
64+
auto reasonValue = reason.has_value() ? Number::newNumber((uchar)reason.value()) : Local<Value>();
65+
if (chosen < 0) callback.get().call({}, PlayerClass::newPlayer(&pl), reasonValue);
66+
else callback.get().call({}, PlayerClass::newPlayer(&pl), Number::newNumber(chosen), reasonValue);
7467
}
7568
CATCH_IN_CALLBACK("sendForm")
7669
}
@@ -107,7 +100,8 @@ Local<Value> SimpleFormClass::addButton(const Arguments& args) {
107100

108101
try {
109102
std::string image = args.size() >= 2 ? args[1].asString().toString() : "";
110-
form.addButton(args[0].asString().toString(), image);
103+
std::string type = image.starts_with("http") ? "url" : "path";
104+
form.appendButton(args[0].asString().toString(), image, type);
111105
return this->getScriptObject();
112106
}
113107
CATCH("Fail in addButton!")
@@ -123,32 +117,32 @@ Local<Object> CustomFormClass::newForm() {
123117
return newp->getScriptObject();
124118
}
125119

126-
lse::form::CustomForm* CustomFormClass::extract(Local<Value> v) {
120+
lse::form::CustomFormWrapper* CustomFormClass::extract(Local<Value> v) {
127121
if (EngineScope::currentEngine()->isInstanceOf<CustomFormClass>(v))
128122
return EngineScope::currentEngine()->getNativeInstance<CustomFormClass>(v)->get();
129123
else return nullptr;
130124
}
131125

132126
// 成员函数
133-
void CustomFormClass::sendForm(lse::form::CustomForm* form, Player* player, script::Local<Function>& callback) {
127+
void CustomFormClass::sendForm(lse::form::CustomFormWrapper* form, Player* player, script::Local<Function>& callback) {
134128
script::Global<Function> callbackFunc{callback};
135-
136-
form->sendToForRawJson(
137-
player,
129+
form->sendTo(
130+
*player,
138131
[engine{EngineScope::currentEngine()},
139-
callback{std::move(callbackFunc)}](Player* player, std::string data, FormCancelReason reason) {
132+
callback{std::move(callbackFunc)
133+
}](Player& player, lse::form::CustomFormResult const& data, FormCancelReason reason) {
140134
if (ll::getGamingStatus() != ll::GamingStatus::Running) return;
141135
if (!EngineManager::isValid(engine)) return;
142136
if (callback.isEmpty()) return;
143137

144-
EngineScope scope(engine);
138+
EngineScope scope(engine);
139+
Local<Value> result;
140+
if (data) {
141+
result = JsonToValue(*data);
142+
}
143+
auto reasonVal = reason.has_value() ? Number::newNumber((uchar)reason.value()) : Local<Value>();
145144
try {
146-
callback.get().call(
147-
{},
148-
PlayerClass::newPlayer(player),
149-
JsonToValue(data),
150-
reason.has_value() ? Number::newNumber((uchar)reason.value()) : Local<Value>()
151-
);
145+
callback.get().call({}, PlayerClass::newPlayer(&player), result, reasonVal);
152146
}
153147
CATCH_IN_CALLBACK("sendForm")
154148
}
@@ -171,7 +165,7 @@ Local<Value> CustomFormClass::addLabel(const Arguments& args) {
171165
CHECK_ARG_TYPE(args[0], ValueKind::kString)
172166

173167
try {
174-
form.addLabel(args[0].asString().toString(), args[0].asString().toString());
168+
form.appendLabel(args[0].asString().toString());
175169
return this->getScriptObject();
176170
}
177171
CATCH("Fail in addLabel!")
@@ -187,7 +181,7 @@ Local<Value> CustomFormClass::addInput(const Arguments& args) {
187181
std::string placeholder = args.size() >= 2 ? args[1].asString().toString() : "";
188182
std::string def = args.size() >= 3 ? args[2].asString().toString() : "";
189183

190-
form.addInput(args[0].asString().toString(), args[0].asString().toString(), placeholder, def);
184+
form.appendInput(args[0].asString().toString(), placeholder, def);
191185
return this->getScriptObject();
192186
}
193187
CATCH("Fail in addInput!")
@@ -207,7 +201,7 @@ Local<Value> CustomFormClass::addSwitch(const Arguments& args) {
207201
bool def =
208202
args.size() >= 2 ? args[1].isBoolean() ? args[1].asBoolean().value() : args[1].asNumber().toInt32() : false;
209203

210-
form.addToggle(args[0].asString().toString(), args[0].asString().toString(), def);
204+
form.appendToggle(args[0].asString().toString(), def);
211205
return this->getScriptObject();
212206
}
213207
CATCH("Fail in addSwitch!")
@@ -222,11 +216,14 @@ Local<Value> CustomFormClass::addDropdown(const Arguments& args) {
222216
try {
223217
auto optionsArr = args[1].asArray();
224218
std::vector<std::string> options;
225-
for (int i = 0; i < optionsArr.size(); ++i) options.push_back(optionsArr.get(i).asString().toString());
219+
options.reserve(optionsArr.size());
220+
for (size_t i = 0; i < optionsArr.size(); ++i) {
221+
options.emplace_back(optionsArr.get(i).asString().toString());
222+
}
226223

227224
int def = args.size() >= 3 ? args[2].asNumber().toInt32() : 0;
228225

229-
form.addDropdown(args[0].asString().toString(), args[0].asString().toString(), options, def);
226+
form.appendDropdown(args[0].asString().toString(), options, def);
230227
return this->getScriptObject();
231228
}
232229
CATCH("Fail in addDropdown!")
@@ -249,8 +246,8 @@ Local<Value> CustomFormClass::addSlider(const Arguments& args) {
249246
int defValue = args.size() >= 5 ? args[4].asNumber().toInt32() : minValue;
250247
if (defValue < minValue || defValue > maxValue) defValue = minValue;
251248

252-
form.addSlider(
253-
args[0].asString().toString(),
249+
form.appendSlider(
250+
254251
args[0].asString().toString(),
255252
minValue,
256253
maxValue,
@@ -271,11 +268,12 @@ Local<Value> CustomFormClass::addStepSlider(const Arguments& args) {
271268
try {
272269
auto stepsArr = args[1].asArray();
273270
std::vector<std::string> steps;
274-
for (int i = 0; i < stepsArr.size(); ++i) steps.push_back(stepsArr.get(i).asString().toString());
271+
steps.reserve(stepsArr.size());
272+
for (size_t i = 0; i < stepsArr.size(); ++i) steps.push_back(stepsArr.get(i).asString().toString());
275273

276274
int defIndex = args.size() >= 3 ? args[2].asNumber().toInt32() : 0;
277275

278-
form.addStepSlider(args[0].asString().toString(), args[0].asString().toString(), steps, defIndex);
276+
form.appendStepSlider(args[0].asString().toString(), steps, defIndex);
279277
return this->getScriptObject();
280278
}
281279
CATCH("Fail in addStepSlider!")

src/legacy/api/GuiAPI.h

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
#pragma once
22
#include "api/APIHelp.h"
3-
#include "legacyapi/form/FormUI.h"
3+
#include "ll/api/form/SimpleForm.h"
4+
#include "lse/api/helper/CustomFormWrapper.h"
45

56
//////////////////// Classes ////////////////////
67

78
class SimpleFormClass : public ScriptClass {
89
private:
9-
lse::form::SimpleForm form;
10+
ll::form::SimpleForm form;
1011

1112
public:
1213
SimpleFormClass();
1314

14-
lse::form::SimpleForm* get() { return &form; }
15+
ll::form::SimpleForm* get() { return &form; }
1516

16-
static Local<Object> newForm();
17-
static lse::form::SimpleForm* extract(Local<Value> v);
18-
static void sendForm(lse::form::SimpleForm* form, Player* player, script::Local<Function>& callback);
17+
static Local<Object> newForm();
18+
static ll::form::SimpleForm* extract(Local<Value> v);
19+
static void sendForm(ll::form::SimpleForm* form, Player* player, script::Local<Function>& callback);
1920

2021
Local<Value> setTitle(const Arguments& args);
2122
Local<Value> setContent(const Arguments& args);
@@ -25,16 +26,16 @@ extern ClassDefine<SimpleFormClass> SimpleFormClassBuilder;
2526

2627
class CustomFormClass : public ScriptClass {
2728
private:
28-
lse::form::CustomForm form;
29+
lse::form::CustomFormWrapper form;
2930

3031
public:
3132
CustomFormClass();
3233

33-
lse::form::CustomForm* get() { return &form; }
34+
lse::form::CustomFormWrapper* get() { return &form; }
3435

35-
static Local<Object> newForm();
36-
static lse::form::CustomForm* extract(Local<Value> v);
37-
static void sendForm(lse::form::CustomForm* form, Player* player, script::Local<Function>& callback);
36+
static Local<Object> newForm();
37+
static lse::form::CustomFormWrapper* extract(Local<Value> v);
38+
static void sendForm(lse::form::CustomFormWrapper* form, Player* player, script::Local<Function>& callback);
3839

3940
Local<Value> setTitle(const Arguments& args);
4041
Local<Value> addLabel(const Arguments& args);

src/legacy/api/PlayerAPI.cpp

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@
1515
#include "api/PacketAPI.h"
1616
#include "engine/EngineOwnData.h"
1717
#include "engine/GlobalShareData.h"
18-
#include "legacyapi/form/FormPacketHelper.h"
19-
#include "legacyapi/form/FormUI.h"
2018
#include "ll/api/chrono/GameChrono.h"
2119
#include "ll/api/coro/CoroTask.h"
20+
#include "ll/api/form/ModalForm.h"
2221
#include "ll/api/service/Bedrock.h"
2322
#include "ll/api/service/GamingStatus.h"
2423
#include "ll/api/service/PlayerInfo.h"
@@ -64,7 +63,6 @@
6463
#include "mc/platform/UUID.h"
6564
#include "mc/server/NetworkChunkPublisher.h"
6665
#include "mc/server/ServerPlayer.h"
67-
#include "mc/server/commands/Command.h"
6866
#include "mc/server/commands/CommandContext.h"
6967
#include "mc/server/commands/CommandVersion.h"
7068
#include "mc/server/commands/MinecraftCommands.h"
@@ -87,9 +85,7 @@
8785
#include "mc/world/actor/provider/ActorAttribute.h"
8886
#include "mc/world/actor/provider/ActorEquipment.h"
8987
#include "mc/world/actor/provider/SynchedActorDataAccess.h"
90-
#include "mc/world/attribute/Attribute.h"
9188
#include "mc/world/attribute/AttributeInstance.h"
92-
#include "mc/world/attribute/AttributeModificationContext.h"
9389
#include "mc/world/attribute/SharedAttributes.h"
9490
#include "mc/world/effect/EffectDuration.h"
9591
#include "mc/world/effect/MobEffectInstance.h"
@@ -102,7 +98,6 @@
10298
#include "mc/world/level/block/VanillaBlockTypeIds.h"
10399
#include "mc/world/level/dimension/Dimension.h"
104100
#include "mc/world/level/material/Material.h"
105-
#include "mc/world/level/storage/AdventureSettings.h"
106101
#include "mc/world/level/storage/DBStorage.h"
107102
#include "mc/world/level/storage/db_helpers/Category.h"
108103
#include "mc/world/phys/HitResult.h"
@@ -115,18 +110,6 @@
115110
#include "mc/world/scores/Scoreboard.h"
116111
#include "mc/world/scores/ScoreboardId.h"
117112

118-
#include <algorithm>
119-
#include <climits>
120-
#include <memory>
121-
#include <optional>
122-
#include <stdexcept>
123-
#include <string>
124-
#include <vector>
125-
126-
using lse::api::AttributeHelper;
127-
using lse::api::ScoreboardHelper;
128-
using lse::form::FormCancelReason;
129-
130113
//////////////////// Class Definition ////////////////////
131114

132115
ClassDefine<PlayerClass> PlayerClassBuilder =
@@ -2469,27 +2452,30 @@ Local<Value> PlayerClass::sendSimpleForm(const Arguments& args) {
24692452
auto imagesArr = args[3].asArray();
24702453
if (imagesArr.size() != textsArr.size() || !imagesArr.get(0).isString()) return Local<Value>();
24712454

2472-
lse::form::SimpleForm form(args[0].asString().toString(), args[1].asString().toString());
2455+
ll::form::SimpleForm form(args[0].asString().toString(), args[1].asString().toString());
24732456
for (size_t i = 0; i < textsArr.size(); ++i) {
24742457
Local<Value> img = imagesArr.get(i);
24752458
if (img.isString()) {
2476-
form.addButton(textsArr.get(i).asString().toString(), img.asString().toString());
2459+
auto path = img.asString().toString();
2460+
auto type = path.starts_with("http") ? "url" : "path";
2461+
form.appendButton(textsArr.get(i).asString().toString(), path, type);
24772462
} else {
2478-
form.addButton(textsArr.get(i).asString().toString());
2463+
form.appendButton(textsArr.get(i).asString().toString());
24792464
}
24802465
}
24812466
form.sendTo(
2482-
player,
2467+
*player,
24832468
[engine{EngineScope::currentEngine()},
2484-
callback{script::Global(args[4].asFunction())}](Player* pl, int chosen, FormCancelReason reason) {
2469+
callback{script::Global(args[4].asFunction())
2470+
}](Player& pl, int chosen, ll::form::FormCancelReason reason) {
24852471
if ((ll::getGamingStatus() != ll::GamingStatus::Running)) return;
24862472
if (!EngineManager::isValid(engine)) return;
24872473

24882474
EngineScope scope(engine);
24892475
try {
24902476
callback.get().call(
24912477
{},
2492-
PlayerClass::newPlayer(pl),
2478+
PlayerClass::newPlayer(&pl),
24932479
chosen >= 0 ? Number::newNumber(chosen) : Local<Value>(),
24942480
reason.has_value() ? Number::newNumber((uchar)reason.value()) : Local<Value>()
24952481
);
@@ -2515,25 +2501,26 @@ Local<Value> PlayerClass::sendModalForm(const Arguments& args) {
25152501
Player* player = get();
25162502
if (!player) return Local<Value>();
25172503

2518-
lse::form::ModalForm form(
2504+
ll::form::ModalForm form(
25192505
args[0].asString().toString(),
25202506
args[1].asString().toString(),
25212507
args[2].asString().toString(),
25222508
args[3].asString().toString()
25232509
);
25242510
form.sendTo(
2525-
player,
2511+
*player,
25262512
[engine{EngineScope::currentEngine()},
2527-
callback{script::Global(args[4].asFunction())}](Player* pl, bool chosen, FormCancelReason reason) {
2513+
callback{script::Global(args[4].asFunction())
2514+
}](Player& pl, ll::form::ModalFormResult const& chosen, ll::form::FormCancelReason reason) {
25282515
if ((ll::getGamingStatus() != ll::GamingStatus::Running)) return;
25292516
if (!EngineManager::isValid(engine)) return;
25302517

25312518
EngineScope scope(engine);
25322519
try {
25332520
callback.get().call(
25342521
{},
2535-
PlayerClass::newPlayer(pl),
2536-
chosen ? Boolean::newBoolean(chosen) : Local<Value>(),
2522+
PlayerClass::newPlayer(&pl),
2523+
chosen ? Boolean::newBoolean(static_cast<bool>(*chosen)) : Local<Value>(),
25372524
reason.has_value() ? Number::newNumber((uchar)reason.value()) : Local<Value>()
25382525
);
25392526
}
@@ -2555,25 +2542,25 @@ Local<Value> PlayerClass::sendCustomForm(const Arguments& args) {
25552542
Player* player = get();
25562543
if (!player) return Local<Value>();
25572544

2558-
std::string data = ordered_json::parse(args[0].asString().toString()).dump();
2559-
2560-
unsigned formId = lse::form::NewFormId();
2561-
ModalFormRequestPacket packet(formId, data);
2562-
player->sendNetworkPacket(packet);
2563-
lse::form::SetCustomFormPacketCallback(
2564-
formId,
2545+
auto formData = ordered_json::parse(args[0].asString().toString());
2546+
ll::form::Form::sendRawTo(
2547+
*player,
2548+
formData.dump(),
25652549
[id{player->getOrCreateUniqueID()},
25662550
engine{EngineScope::currentEngine()},
2567-
callback{script::Global(args[1].asFunction())}](Player* player, string result, FormCancelReason reason) {
2551+
callback{script::Global(args[1].asFunction())},
2552+
formData = std::move(formData
2553+
)](Player& player, std::optional<std::string> const& result, ll::form::FormCancelReason reason) {
25682554
if ((ll::getGamingStatus() != ll::GamingStatus::Running)) return;
25692555
if (!EngineManager::isValid(engine)) return;
2556+
auto newResult = lse::form::CustomFormWrapper::convertResult(result, formData);
25702557

25712558
EngineScope scope(engine);
25722559
try {
25732560
callback.get().call(
25742561
{},
2575-
PlayerClass::newPlayer(player),
2576-
result != "null" ? JsonToValue(result) : Local<Value>(),
2562+
PlayerClass::newPlayer(&player),
2563+
newResult ? JsonToValue(*newResult) : Local<Value>(),
25772564
reason.has_value() ? Number::newNumber((uchar)reason.value()) : Local<Value>()
25782565
);
25792566
}

0 commit comments

Comments
 (0)