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>();
0 commit comments