66#include " api/McAPI.h"
77#include " api/NbtAPI.h"
88#include " ll/api/service/Bedrock.h"
9- #include " mc/nbt/CompoundTag .h"
9+ #include " lse/api/ItemHelper .h"
1010#include " mc/safety/RedactableString.h"
11- #include " mc/world/actor/Actor.h"
1211#include " mc/world/actor/item/ItemActor.h"
1312#include " mc/world/item/Item.h"
1413#include " mc/world/item/ItemStack.h"
2019#include < variant>
2120#include < vector>
2221
22+ using lse::api::ItemHelper;
23+
2324// ////////////////// Class Definition ////////////////////
2425
2526ClassDefine<ItemClass> ItemClassBuilder = defineClass<ItemClass>(" LLSE_Item" )
@@ -154,7 +155,12 @@ Local<Value> ItemClass::getDamage() {
154155
155156Local<Value> ItemClass::getAttackDamage () {
156157 try {
157- return Number::newNumber (get ()->getAttackDamage ());
158+ auto mItem = get ()->mItem ;
159+ if (mItem ) {
160+ return Number::newNumber (mItem ->getAttackDamage ());
161+ } else {
162+ return Number::newNumber (0 );
163+ }
158164 }
159165 CATCH (" Fail in GetAttackDamage!" );
160166}
@@ -232,7 +238,12 @@ Local<Value> ItemClass::isEnchantingBook() {
232238
233239Local<Value> ItemClass::isFireResistant () {
234240 try {
235- return Boolean::newBoolean (get ()->isFireResistant ());
241+ auto mItem = get ()->mItem ;
242+ if (mItem ) {
243+ return Boolean::newBoolean (mItem ->mFireResistant );
244+ } else {
245+ return Boolean::newBoolean (false );
246+ }
236247 }
237248 CATCH (" Fail in isFireResistant!" );
238249}
@@ -260,7 +271,12 @@ Local<Value> ItemClass::isHorseArmorItem() {
260271
261272Local<Value> ItemClass::isLiquidClipItem () {
262273 try {
263- return Boolean::newBoolean (get ()->isLiquidClipItem ());
274+ auto mItem = get ()->mItem ;
275+ if (mItem ) {
276+ return Boolean::newBoolean (mItem ->isLiquidClipItem ());
277+ } else {
278+ return Boolean::newBoolean (false );
279+ }
264280 }
265281 CATCH (" Fail in isLiquidClipItem!" );
266282}
@@ -274,7 +290,12 @@ Local<Value> ItemClass::isMusicDiscItem() {
274290
275291Local<Value> ItemClass::isOffhandItem () {
276292 try {
277- return Boolean::newBoolean (get ()->isOffhandItem ());
293+ auto mItem = get ()->mItem ;
294+ if (mItem ) {
295+ return Boolean::newBoolean (mItem ->mAllowOffhand );
296+ } else {
297+ return Boolean::newBoolean (false );
298+ }
278299 }
279300 CATCH (" Fail in isOffhandItem!" );
280301}
@@ -295,7 +316,11 @@ Local<Value> ItemClass::isStackable() {
295316
296317Local<Value> ItemClass::isWearableItem () {
297318 try {
298- return Boolean::newBoolean (get ()->isHumanoidWearableItem ());
319+ if (get ()->mItem ) {
320+ return Boolean::newBoolean (get ()->isHumanoidWearableBlockItem ());
321+ } else {
322+ return Boolean::newBoolean (false );
323+ }
299324 }
300325 CATCH (" Fail in isWearableItem!" );
301326}
@@ -309,9 +334,9 @@ Local<Value> ItemClass::set(const Arguments& args) {
309334
310335 auto tag = itemNew->save (*SaveContextFactory::createCloneSaveContext ());
311336 if (std::holds_alternative<std::unique_ptr<ItemStack>>(item)) {
312- std::get<std::unique_ptr<ItemStack>>(item)-> load ( *tag);
337+ ItemHelper::load (* std::get<std::unique_ptr<ItemStack>>(item), *tag);
313338 } else {
314- std::get<ItemStack*>(item)-> load ( *tag);
339+ ItemHelper::load (* std::get<ItemStack*>(item), *tag);
315340 }
316341 return Boolean::newBoolean (true );
317342 }
@@ -348,7 +373,7 @@ Local<Value> ItemClass::setAux(const Arguments& args) {
348373 CHECK_ARG_TYPE (args[0 ], ValueKind::kNumber );
349374
350375 try {
351- get ()->setAuxValue ( args[0 ].asNumber ().toInt32 () );
376+ get ()->mAuxValue = args[0 ].asNumber ().toInt32 ();
352377 return Boolean::newBoolean (true );
353378 }
354379 CATCH (" Fail in setAux!" );
@@ -378,7 +403,9 @@ Local<Value> ItemClass::setDisplayName(const Arguments& args) {
378403 CHECK_ARG_TYPE (args[0 ], ValueKind::kString );
379404
380405 try {
381- get ()->setCustomName (Bedrock::Safety::RedactableString (args[0 ].asString ().toString ()));
406+ Bedrock::Safety::RedactableString redactableString;
407+ redactableString.mUnredactedString = args[0 ].asString ().toString ();
408+ get ()->setCustomName (redactableString);
382409 return Boolean::newBoolean (true );
383410 }
384411 CATCH (" Fail in setDisplayName!" );
@@ -412,8 +439,7 @@ Local<Value> ItemClass::setNbt(const Arguments& args) {
412439 try {
413440 auto nbt = NbtCompoundClass::extract (args[0 ]);
414441 if (!nbt) return Local<Value>(); // Null
415- auto itemStack = get ();
416- itemStack->load (*nbt);
442+ ItemHelper::load (*get (), *nbt);
417443 // update Pre Data
418444 preloadData ();
419445 return Boolean::newBoolean (true );
@@ -442,13 +468,9 @@ Local<Value> McClass::newItem(const Arguments& args) {
442468 auto nbt = NbtCompoundClass::extract (args[0 ]);
443469 if (nbt) {
444470 auto newItem = new ItemStack{ItemStack::EMPTY_ITEM ()};
445- newItem->load (*nbt);
446- if (!newItem) return Local<Value>(); // Null
447- else
448- return ItemClass::newItem (
449- newItem,
450- false
451- ); // Not managed by BDS, pointer will be saved as unique_ptr
471+ ItemHelper::load (*newItem, *nbt);
472+ return ItemClass::newItem (newItem,
473+ false ); // Not managed by BDS, pointer will be saved as unique_ptr
452474 } else {
453475 LOG_WRONG_ARG_TYPE (__FUNCTION__);
454476 return Local<Value>();
@@ -507,7 +529,7 @@ Local<Value> McClass::spawnItem(const Arguments& args) {
507529 // By Item
508530 ;
509531 ItemActor* entity = ll::service::getLevel ()->getSpawner ().spawnItem (
510- ll::service::getLevel ()->getDimension (pos.dim )->getBlockSourceFromMainChunkSource (),
532+ ll::service::getLevel ()->getDimension (pos.dim ). lock () ->getBlockSourceFromMainChunkSource (),
511533 *it,
512534 0 ,
513535 pos.getVec3 (),
0 commit comments