Skip to content

Commit 8057d1f

Browse files
committed
refactor: refactoring PlayerAPI & EntityAPI & DeviceAPI
refactor: refactoring ItemAPI
1 parent 462a11d commit 8057d1f

File tree

14 files changed

+103
-111
lines changed

14 files changed

+103
-111
lines changed

src/legacy/api/CommandAPI.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ Local<Value> convertResult(DynamicCommand::Result const& result) {
121121
new ItemStack(result.getRaw<CommandItem>()
122122
.createInstance(1, 1, *new CommandOutput(CommandOutputType::None), true)
123123
.value_or(ItemInstance::EMPTY_ITEM)),
124-
true
125-
);
124+
false
125+
); // Not managed by BDS, pointer will be saved as unique_ptr
126126
case DynamicCommand::ParameterType::Block:
127127
return BlockClass::newBlock(
128128
const_cast<Block*>(result.getRaw<CommandBlockName>().resolveBlock(0).getBlock()),
@@ -266,13 +266,13 @@ CommandClass::CommandClass(std::unique_ptr<DynamicCommandInstance>&& p)
266266
: ScriptClass(ScriptClass::ConstructFromCpp<CommandClass>{}),
267267
uptr(std::move(p)),
268268
ptr(uptr.get()),
269-
registered(false){};
269+
registered(false) {};
270270

271271
CommandClass::CommandClass(DynamicCommandInstance* p)
272272
: ScriptClass(ScriptClass::ConstructFromCpp<CommandClass>{}),
273273
uptr(),
274274
ptr(p),
275-
registered(true){};
275+
registered(true) {};
276276

277277
Local<Object> CommandClass::newCommand(std::unique_ptr<DynamicCommandInstance>&& p) {
278278
auto newp = new CommandClass(std::move(p));

src/legacy/api/ContainerAPI.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ Local<Value> ContainerClass::getItem(const Arguments& args) {
142142
LOG_ERROR_WITH_SCRIPT_INFO("Fail to get slot from container!");
143143
return Local<Value>();
144144
}
145-
return ItemClass::newItem(item, false);
145+
return ItemClass::newItem(item);
146146
}
147147
CATCH("Fail in getItem!");
148148
}
@@ -170,7 +170,7 @@ Local<Value> ContainerClass::getAllItems(const Arguments& args) {
170170

171171
Local<Array> res = Array::newArray();
172172
for (auto& item : list) {
173-
res.add(ItemClass::newItem(const_cast<ItemStack*>(item), false));
173+
res.add(ItemClass::newItem(const_cast<ItemStack*>(item)));
174174
}
175175
return res;
176176
}

src/legacy/api/DeviceAPI.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,23 @@ ClassDefine<DeviceClass> DeviceClassBuilder = defineClass<DeviceClass>("LLSE_Dev
3434
//////////////////// Classes ////////////////////
3535

3636
// 生成函数
37-
Local<Object> DeviceClass::newDevice(ActorUniqueID& uid) {
38-
auto newp = new DeviceClass(uid);
37+
Local<Object> DeviceClass::newDevice(ActorRuntimeID& id) {
38+
auto newp = new DeviceClass(id);
3939
return newp->getScriptObject();
4040
}
4141

4242
// 成员函数
43-
void DeviceClass::setPlayer(ActorUniqueID& uid) {
44-
try {
45-
id = uid;
46-
} catch (...) {
47-
isValid = false;
43+
void DeviceClass::setPlayer(ActorRuntimeID& id) {
44+
if (id) {
45+
runtimeId = id;
4846
}
4947
}
5048

5149
Player* DeviceClass::getPlayer() {
52-
Player* player = ll::service::getLevel()->getPlayer(id);
53-
if (!isValid || !player) {
54-
return nullptr;
55-
} else {
56-
return player;
50+
if (runtimeId) {
51+
ll::service::getLevel()->getRuntimePlayer(runtimeId);
5752
}
53+
return nullptr;
5854
}
5955

6056
Local<Value> DeviceClass::getIP() {

src/legacy/api/DeviceAPI.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
#pragma once
22
#include "api/APIHelp.h"
33
#include "mc/deps/core/mce/UUID.h"
4+
#include "mc/world/ActorRuntimeID.h"
45
#include "mc/world/ActorUniqueID.h"
56

67
//////////////////// Classes ////////////////////
78
class Player;
89
class DeviceClass : public ScriptClass {
910
private:
10-
ActorUniqueID id;
11-
bool isValid = true;
11+
ActorRuntimeID runtimeId;
1212

1313
public:
14-
explicit DeviceClass(ActorUniqueID& uid) : ScriptClass(ScriptClass::ConstructFromCpp<DeviceClass>{}) {
15-
setPlayer(uid);
14+
explicit DeviceClass(ActorRuntimeID& id) : ScriptClass(ScriptClass::ConstructFromCpp<DeviceClass>{}) {
15+
setPlayer(id);
1616
}
1717

18-
void setPlayer(ActorUniqueID& uid);
18+
void setPlayer(ActorRuntimeID& id);
1919
Player* getPlayer();
2020

21-
static Local<Object> newDevice(ActorUniqueID& uid);
21+
static Local<Object> newDevice(ActorRuntimeID& id);
2222

2323
Local<Value> getIP();
2424
Local<Value> getAvgPing();

src/legacy/api/EntityAPI.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#include <mc/world/level/material/Material.h>
4747
#include <mc/world/phys/AABB.h>
4848
#include <memory>
49+
#include <vector>
4950

5051
using magic_enum::enum_integer;
5152

@@ -190,8 +191,8 @@ ClassDefine<void> ActorDamageCauseBuilder =
190191
// clang-format on
191192

192193
// 生成函数
193-
Local<Object> EntityClass::newEntity(Actor* p) {
194-
auto newp = new EntityClass(p);
194+
Local<Object> EntityClass::newEntity(Actor* actor) {
195+
auto newp = new EntityClass(actor);
195196
return newp->getScriptObject();
196197
}
197198

@@ -209,16 +210,16 @@ std::optional<Actor*> EntityClass::tryExtractActor(Local<Value> v) {
209210

210211
// 成员函数
211212
void EntityClass::set(Actor* actor) {
212-
try {
213-
id = actor->getOrCreateUniqueID();
214-
} catch (...) {
215-
isValid = false;
213+
if (actor) {
214+
runtimeId = actor->getRuntimeID();
216215
}
217216
}
218217

219218
Actor* EntityClass::get() {
220-
if (!isValid) return nullptr;
221-
else return ll::service::getLevel()->fetchEntity(id);
219+
if (runtimeId) {
220+
return ll::service::getLevel()->getRuntimeEntity(runtimeId);
221+
}
222+
return nullptr;
222223
}
223224

224225
Local<Value> EntityClass::asPointer(const Arguments& args) {
@@ -900,12 +901,11 @@ Local<Value> EntityClass::isPlayer(const Arguments& args) {
900901

901902
Local<Value> EntityClass::toPlayer(const Arguments& args) {
902903
try {
903-
Player* player = ll::service::getLevel()->getPlayer(id);
904+
Player* player = ll::service::getLevel()->getRuntimePlayer(runtimeId);
904905
if (!player) {
905906
return Local<Value>();
906-
} else {
907-
return PlayerClass::newPlayer(player);
908907
}
908+
return PlayerClass::newPlayer(player);
909909
}
910910
CATCH("Fail in toPlayer!");
911911
}
@@ -926,7 +926,7 @@ Local<Value> EntityClass::toItem(const Arguments& args) {
926926
if (!entity || !entity->hasCategory(ActorCategory::Item)) {
927927
return Local<Value>();
928928
} else {
929-
return ItemClass::newItem(&static_cast<ItemActor*>(entity)->item(), false);
929+
return ItemClass::newItem(&static_cast<ItemActor*>(entity)->item());
930930
}
931931
}
932932
CATCH("Fail in toItem!");

src/legacy/api/EntityAPI.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
#pragma once
22
#include "api/APIHelp.h"
3+
#include "mc/world/ActorRuntimeID.h"
34
#include "mc/world/ActorUniqueID.h"
45

56
//////////////////// Classes ////////////////////
67
class Actor;
78
class EntityClass : public ScriptClass {
89
private:
9-
ActorUniqueID id;
10-
bool isValid = true;
10+
ActorRuntimeID runtimeId;
1111

1212
public:
13-
explicit EntityClass(Actor* p) : ScriptClass(ScriptClass::ConstructFromCpp<EntityClass>{}) { set(p); }
13+
explicit EntityClass(Actor* actor) : ScriptClass(ScriptClass::ConstructFromCpp<EntityClass>{}) { set(actor); }
1414

1515
void set(Actor* actor);
1616
Actor* get();
1717

18-
static Local<Object> newEntity(Actor* p);
18+
static Local<Object> newEntity(Actor* actor);
1919
static Actor* extract(Local<Value> v);
2020
static std::optional<Actor*> tryExtractActor(Local<Value> v);
2121
Local<Value> asPointer(const Arguments& args);

src/legacy/api/EventAPI.cpp

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ void EnableEventListener(int eventId) {
313313
EVENT_TYPES::onTakeItem,
314314
PlayerClass::newPlayer(&ev.self()),
315315
EntityClass::newEntity(&ev.itemActor()),
316-
ItemClass::newItem(&ev.itemActor().item(), false)
316+
ItemClass::newItem(&ev.itemActor().item())
317317
);
318318
}
319319
IF_LISTENED_END(EVENT_TYPES::onTakeItem);
@@ -335,11 +335,7 @@ void EnableEventListener(int eventId) {
335335
case EVENT_TYPES::onUseItem:
336336
bus.emplaceListener<PlayerUseItemEvent>([](PlayerUseItemEvent& ev) {
337337
IF_LISTENED(EVENT_TYPES::onUseItem) {
338-
CallEvent(
339-
EVENT_TYPES::onUseItem,
340-
PlayerClass::newPlayer(&ev.self()),
341-
ItemClass::newItem(&ev.item(), false)
342-
);
338+
CallEvent(EVENT_TYPES::onUseItem, PlayerClass::newPlayer(&ev.self()), ItemClass::newItem(&ev.item()));
343339
}
344340
IF_LISTENED_END(EVENT_TYPES::onUseItem);
345341
});
@@ -351,7 +347,7 @@ void EnableEventListener(int eventId) {
351347
CallEvent(
352348
EVENT_TYPES::onUseItemOn,
353349
PlayerClass::newPlayer(&ev.self()),
354-
ItemClass::newItem(&ev.item(), false),
350+
ItemClass::newItem(&ev.item()),
355351
BlockClass::newBlock(&ev.block().get(), &ev.blockPos(), ev.self().getDimensionId()),
356352
Number::newNumber((schar)ev.face()),
357353
FloatPos::newPos(ev.clickPos(), ev.self().getDimensionId())
@@ -428,11 +424,7 @@ void EnableEventListener(int eventId) {
428424
if ((ev.item().getItem()->isFood() || ev.item().isPotionItem()
429425
|| ev.item().getTypeName() == VanillaItemNames::MilkBucket.c_str())
430426
&& (ev.self().isHungry() || ev.self().forceAllowEating())) {
431-
CallEvent(
432-
EVENT_TYPES::onEat,
433-
PlayerClass::newPlayer(&ev.self()),
434-
ItemClass::newItem(&ev.item(), false)
435-
);
427+
CallEvent(EVENT_TYPES::onEat, PlayerClass::newPlayer(&ev.self()), ItemClass::newItem(&ev.item()));
436428
}
437429
}
438430
IF_LISTENED_END(EVENT_TYPES::onEat);

src/legacy/api/ItemAPI.cpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <mc/world/item/Item.h>
1717
#include <mc/world/item/registry/ItemStack.h>
1818
#include <string>
19+
#include <variant>
1920
#include <vector>
2021

2122
//////////////////// Class Definition ////////////////////
@@ -71,18 +72,19 @@ ClassDefine<ItemClass> ItemClassBuilder = defineClass<ItemClass>("LLSE_Item")
7172

7273
//////////////////// Classes ////////////////////
7374

74-
ItemClass::ItemClass(ItemStack* p, bool isNew) : ScriptClass(ScriptClass::ConstructFromCpp<ItemClass>{}) {
75-
if (isNew) {
76-
item = std::shared_ptr<ItemStack>(p);
75+
ItemClass::ItemClass(ItemStack* itemStack, bool isManagedByBDS)
76+
: ScriptClass(ScriptClass::ConstructFromCpp<ItemClass>{}) {
77+
if (isManagedByBDS) {
78+
item = itemStack;
7779
} else {
78-
item = p;
80+
item = std::unique_ptr<ItemStack>(itemStack);
7981
}
8082
preloadData();
8183
}
8284

8385
// 生成函数
84-
Local<Object> ItemClass::newItem(ItemStack* p, bool isNew) {
85-
auto newp = new ItemClass(p, isNew);
86+
Local<Object> ItemClass::newItem(ItemStack* itemStack, bool isManagedByBDS) {
87+
auto newp = new ItemClass(itemStack, isManagedByBDS);
8688
return newp->getScriptObject();
8789
}
8890

@@ -314,12 +316,11 @@ Local<Value> ItemClass::set(const Arguments& args) {
314316
if (!itemNew) return Local<Value>(); // Null
315317

316318
auto tag = itemNew->save();
317-
if (std::holds_alternative<std::shared_ptr<ItemStack>>(item)) {
318-
std::get<std::shared_ptr<ItemStack>>(item)->load(*tag);
319+
if (std::holds_alternative<std::unique_ptr<ItemStack>>(item)) {
320+
std::get<std::unique_ptr<ItemStack>>(item)->load(*tag);
319321
} else {
320322
std::get<ItemStack*>(item)->load(*tag);
321323
}
322-
323324
return Boolean::newBoolean(true);
324325
}
325326
CATCH("Fail in set!");
@@ -330,7 +331,7 @@ Local<Value> ItemClass::clone(const Arguments& args) {
330331
auto item = get();
331332
if (!item) return Local<Value>(); // Null
332333
auto itemNew = new ItemStack(*item);
333-
return ItemClass::newItem(itemNew, true);
334+
return ItemClass::newItem(itemNew, false);
334335
}
335336
CATCH("Fail in cloneItem!");
336337
}
@@ -439,8 +440,8 @@ Local<Value> McClass::newItem(const Arguments& args) {
439440
int cnt = args[1].toInt();
440441

441442
ItemStack* item = new ItemStack{type, cnt};
442-
if (!item) return Local<Value>(); // Null
443-
else return ItemClass::newItem(item, true);
443+
if (!item) return Local<Value>(); // Null
444+
else return ItemClass::newItem(item, false); // Not managed by BDS, pointer will be saved as unique_ptr
444445
} else {
445446
LOG_TOO_FEW_ARGS();
446447
return Local<Value>();
@@ -451,7 +452,11 @@ Local<Value> McClass::newItem(const Arguments& args) {
451452
auto newItem = new ItemStack{ItemStack::EMPTY_ITEM};
452453
newItem->load(*nbt);
453454
if (!newItem) return Local<Value>(); // Null
454-
else return ItemClass::newItem(newItem, true);
455+
else
456+
return ItemClass::newItem(
457+
newItem,
458+
false
459+
); // Not managed by BDS, pointer will be saved as unique_ptr
455460
} else {
456461
LOG_WRONG_ARG_TYPE();
457462
return Local<Value>();

src/legacy/api/ItemAPI.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,34 @@
11
#pragma once
22
#include "api/APIHelp.h"
33

4+
#include <memory>
45
#include <string>
6+
#include <variant>
57

68
//////////////////// Classes ////////////////////
79
class ItemStack;
810

911
class ItemClass : public ScriptClass {
1012
private:
11-
std::variant<std::shared_ptr<ItemStack>, ItemStack*> item;
13+
std::variant<ItemStack*, std::unique_ptr<ItemStack>> item; // BDS manages ItemStack*
1214

1315
// Pre data
1416
std::string name, type;
1517
int id, count, aux;
1618

1719
public:
18-
explicit ItemClass(ItemStack* p, bool isNew = false);
20+
explicit ItemClass(ItemStack* itemStack, bool isManagedByBDS = true);
1921
void preloadData();
2022

2123
ItemStack* get() {
22-
if (std::holds_alternative<std::shared_ptr<ItemStack>>(item)) {
23-
return std::get<std::shared_ptr<ItemStack>>(item).get();
24+
if (std::holds_alternative<std::unique_ptr<ItemStack>>(item)) {
25+
return std::get<std::unique_ptr<ItemStack>>(item).get();
2426
} else {
2527
return std::get<ItemStack*>(item);
2628
}
2729
}
2830

29-
static Local<Object> newItem(ItemStack* p, bool isNew = false);
31+
static Local<Object> newItem(ItemStack* itemStack, bool isManagedByBDS = true);
3032
static ItemStack* extract(Local<Value> v);
3133
Local<Value> asPointer(const Arguments& args);
3234

src/legacy/api/NativePointer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ Local<Value> NativePointer::asEntity() {
399399

400400
Local<Value> NativePointer::asItem() {
401401
try {
402-
return ItemClass::newItem((ItemStack*)mPtr, false);
402+
return ItemClass::newItem((ItemStack*)mPtr);
403403
}
404404
CATCH("Fail in NativePointer::asItem!")
405405
}

0 commit comments

Comments
 (0)