@@ -352,17 +352,22 @@ Local<Value> McClass::setPlayerNbt(const Arguments& args) {
352352 CHECK_ARGS_COUNT (args, 2 );
353353 CHECK_ARG_TYPE (args[0 ], ValueKind::kString );
354354 try {
355- mce::UUID uuid = mce::UUID::fromString (args[0 ].asString ().toString ());
356- CompoundTag* tag = NbtCompoundClass::extract (args[1 ]);
357- DBStorage* db = MoreGlobal::dbStorage;
358- if (db && db->hasKey (" player_" + uuid.asString (), DBHelpers::Category::Player)) {
359- std::unique_ptr<CompoundTag> playerTag =
360- db->getCompoundTag (" player_" + uuid.asString (), DBHelpers::Category::Player);
361- if (playerTag) {
362- std::string serverId = playerTag->at (" ServerId" );
363- if (!serverId.empty ()) {
364- db->saveData (serverId, tag->toBinaryNbt (), DBHelpers::Category::Player);
365- return Boolean::newBoolean (true );
355+ mce::UUID uuid = mce::UUID::fromString (args[0 ].asString ().toString ());
356+ auto tag = NbtCompoundClass::extract (args[1 ]);
357+ Player* player = ll::service::getLevel ()->getPlayer (uuid);
358+ if (player && tag) {
359+ player->load (*tag, MoreGlobal::defaultDataLoadHelper ());
360+ } else if (tag) {
361+ DBStorage* db = MoreGlobal::dbStorage;
362+ if (db && db->hasKey (" player_" + uuid.asString (), DBHelpers::Category::Player)) {
363+ std::unique_ptr<CompoundTag> playerTag =
364+ db->getCompoundTag (" player_" + uuid.asString (), DBHelpers::Category::Player);
365+ if (playerTag) {
366+ std::string serverId = playerTag->at (" ServerId" );
367+ if (!serverId.empty ()) {
368+ db->saveData (serverId, tag->toBinaryNbt (), DBHelpers::Category::Player);
369+ return Boolean::newBoolean (true );
370+ }
366371 }
367372 }
368373 }
@@ -376,31 +381,47 @@ Local<Value> McClass::setPlayerNbtTags(const Arguments& args) {
376381 CHECK_ARG_TYPE (args[0 ], ValueKind::kString );
377382 CHECK_ARG_TYPE (args[2 ], ValueKind::kArray );
378383 try {
379- mce::UUID uuid = mce::UUID::fromString (args[0 ].asString ().toString ());
380- CompoundTag* tag = NbtCompoundClass::extract (args[1 ]);
381- Local<Array> arr = args[2 ].asArray ();
382- DBStorage* db = MoreGlobal::dbStorage;
383- if (db && db->hasKey (" player_" + uuid.asString (), DBHelpers::Category::Player)) {
384- std::unique_ptr<CompoundTag> playerTag =
385- db->getCompoundTag (" player_" + uuid.asString (), DBHelpers::Category::Player);
386- if (playerTag) {
387- std::string serverId = playerTag->at (" ServerId" );
388- if (!serverId.empty () && db->hasKey (serverId, DBHelpers::Category::Player)) {
389- auto loadedTag = db->getCompoundTag (serverId, DBHelpers::Category::Player);
390- if (loadedTag) {
391- for (int i = 0 ; i < arr.size (); ++i) {
392- auto value = arr.get (i);
393- if (value.getKind () == ValueKind::kString ) {
394- std::string tagName = value.asString ().toString ();
395- if (!tag->at (tagName).is_null ()) {
396- loadedTag->at (tagName) = tag->at (tagName);
384+ mce::UUID uuid = mce::UUID::fromString (args[0 ].asString ().toString ());
385+ auto tag = NbtCompoundClass::extract (args[1 ]);
386+ Local<Array> arr = args[2 ].asArray ();
387+ Player* player = ll::service::getLevel ()->getPlayer (uuid);
388+ if (player && tag) {
389+ CompoundTag loadedTag;
390+ player->save (loadedTag);
391+ for (int i = 0 ; i < arr.size (); ++i) {
392+ auto value = arr.get (i);
393+ if (value.getKind () == ValueKind::kString ) {
394+ std::string tagName = value.asString ().toString ();
395+ if (!tag->at (tagName).is_null ()) {
396+ loadedTag.at (tagName) = tag->at (tagName);
397+ }
398+ }
399+ }
400+ player->load (loadedTag, MoreGlobal::defaultDataLoadHelper ());
401+ } else if (tag) {
402+ DBStorage* db = MoreGlobal::dbStorage;
403+ if (db && db->hasKey (" player_" + uuid.asString (), DBHelpers::Category::Player)) {
404+ std::unique_ptr<CompoundTag> playerTag =
405+ db->getCompoundTag (" player_" + uuid.asString (), DBHelpers::Category::Player);
406+ if (playerTag) {
407+ std::string serverId = playerTag->at (" ServerId" );
408+ if (!serverId.empty () && db->hasKey (serverId, DBHelpers::Category::Player)) {
409+ auto loadedTag = db->getCompoundTag (serverId, DBHelpers::Category::Player);
410+ if (loadedTag) {
411+ for (int i = 0 ; i < arr.size (); ++i) {
412+ auto value = arr.get (i);
413+ if (value.getKind () == ValueKind::kString ) {
414+ std::string tagName = value.asString ().toString ();
415+ if (!tag->at (tagName).is_null ()) {
416+ loadedTag->at (tagName) = tag->at (tagName);
417+ }
397418 }
398419 }
420+ db->saveData (serverId, loadedTag->toBinaryNbt (), DBHelpers::Category::Player);
421+ return Boolean::newBoolean (true );
399422 }
400- db->saveData (serverId, loadedTag->toBinaryNbt (), DBHelpers::Category::Player);
401423 return Boolean::newBoolean (true );
402424 }
403- return Boolean::newBoolean (true );
404425 }
405426 }
406427 }
@@ -2957,10 +2978,10 @@ Local<Value> PlayerClass::setNbt(const Arguments& args) {
29572978 if (!player) return Local<Value>();
29582979
29592980 auto nbt = NbtCompoundClass::extract (args[0 ]);
2960- if (!nbt || !MoreGlobal::defaultDataLoadHelper ) {
2981+ if (!nbt) {
29612982 return Local<Value>();
29622983 }
2963- return Boolean::newBoolean (player->load (*nbt, * MoreGlobal::defaultDataLoadHelper));
2984+ return Boolean::newBoolean (player->load (*nbt, MoreGlobal::defaultDataLoadHelper () ));
29642985 }
29652986 CATCH (" Fail in setNbt!" )
29662987}
0 commit comments