@@ -334,11 +334,13 @@ Local<Value> McClass::getPlayerNbt(const Arguments& args) {
334334 CHECK_ARGS_COUNT (args, 1 );
335335 CHECK_ARG_TYPE (args[0 ], ValueKind::kString );
336336 try {
337- auto uuid = mce::UUID::fromString (args[0 ].asString ().toString ());
338- std::unique_ptr<CompoundTag> tag = std::make_unique<CompoundTag>();
339- Player* player = ll::service::getLevel ()->getPlayer (uuid);
337+ auto uuid = mce::UUID::fromString (args[0 ].asString ().toString ());
338+ Player* player = ll::service::getLevel ()->getPlayer (uuid);
340339 if (player) {
341- player->save (*tag);
340+ std::unique_ptr<CompoundTag> tag;
341+ if (player->save (*tag)) {
342+ return NbtCompoundClass::pack (std::move (tag));
343+ }
342344 } else {
343345 DBStorage* db = MoreGlobal::db;
344346 if (db) {
@@ -349,16 +351,15 @@ Local<Value> McClass::getPlayerNbt(const Arguments& args) {
349351 std::string serverId = playerTag->at (" ServerId" );
350352 if (!serverId.empty ()) {
351353 if (db->hasKey (serverId, DBHelpers::Category::Player)) {
352- tag = db->getCompoundTag (serverId, DBHelpers::Category::Player);
354+ return NbtCompoundClass::pack (
355+ std::move (db->getCompoundTag (serverId, DBHelpers::Category::Player))
356+ );
353357 }
354358 }
355359 }
356360 }
357361 }
358362 }
359- if (tag && !tag->isEmpty ()) {
360- return NbtCompoundClass::pack (std::move (tag));
361- }
362363 return Local<Value>();
363364 }
364365 CATCH (" Fail in getPlayerNbt!" )
@@ -443,12 +444,39 @@ Local<Value> McClass::getPlayerScore(const Arguments& args) {
443444 CHECK_ARG_TYPE (args[0 ], ValueKind::kString );
444445 CHECK_ARG_TYPE (args[1 ], ValueKind::kString );
445446 try {
446- auto obj = args[1 ].asString ().toString ();
447- Scoreboard& board = ll::service::getLevel ()->getScoreboard ();
448- Objective* objective = board.getObjective (obj);
449- ScoreboardId sid = board.getScoreboardId (PlayerScoreboardId (std::atoll (args[0 ].asString ().toString ().c_str ())));
450- if (!objective || !sid.isValid () || !objective->hasScore (sid)) {
451- return {};
447+ auto obj = args[1 ].asString ().toString ();
448+ Scoreboard& scoreboard = ll::service::getLevel ()->getScoreboard ();
449+ Objective* objective = scoreboard.getObjective (obj);
450+ DBStorage* db = MoreGlobal::db;
451+ if (!objective) {
452+ return Number::newNumber (0 );
453+ }
454+ if (!db) {
455+ return Number::newNumber (0 );
456+ }
457+ if (!db->hasKey (" player_" + args[0 ].asString ().toString (), DBHelpers::Category::Player)) {
458+ return Number::newNumber (0 );
459+ }
460+ std::unique_ptr<CompoundTag> playerTag =
461+ db->getCompoundTag (" player_" + args[0 ].asString ().toString (), DBHelpers::Category::Player);
462+ if (!playerTag) {
463+ return Number::newNumber (0 );
464+ }
465+ std::string serverId = playerTag->at (" ServerId" );
466+ if (serverId.empty ()) {
467+ return Number::newNumber (0 );
468+ }
469+ if (!db->hasKey (serverId, DBHelpers::Category::Player)) {
470+ return Number::newNumber (0 );
471+ }
472+ std::unique_ptr<CompoundTag> serverIdTag = db->getCompoundTag (serverId, DBHelpers::Category::Player);
473+ if (!serverIdTag || !serverIdTag->contains (" UniqueID" )) {
474+ return Number::newNumber (0 );
475+ }
476+ int64 uniqueId = serverIdTag->at (" UniqueID" );
477+ ScoreboardId sid = scoreboard.getScoreboardId (PlayerScoreboardId (uniqueId));
478+ if (!sid.isValid () || !objective->hasScore (sid)) {
479+ return Number::newNumber (0 );
452480 }
453481 return Number::newNumber (objective->getPlayerScore (sid).mScore );
454482 }
@@ -467,19 +495,37 @@ Local<Value> McClass::setPlayerScore(const Arguments& args) {
467495 if (!objective) {
468496 return Boolean::newBoolean (false );
469497 }
470- const ScoreboardId& id =
471- scoreboard.getScoreboardId (PlayerScoreboardId (std::atoll (args[0 ].asString ().toString ().c_str ())));
472- if (!id.isValid ()) {
473- Player* pl = ll::service::getLevel ()->getPlayer (uuid);
474- if (pl) {
475- scoreboard.createScoreboardId (*pl);
476- } else {
477- return Boolean::newBoolean (false );
478- }
498+ DBStorage* db = MoreGlobal::db;
499+ if (!db) {
500+ return Boolean::newBoolean (false );
501+ }
502+ if (!db->hasKey (" player_" + args[0 ].asString ().toString (), DBHelpers::Category::Player)) {
503+ return Boolean::newBoolean (false );
504+ }
505+ std::unique_ptr<CompoundTag> playerTag =
506+ db->getCompoundTag (" player_" + args[0 ].asString ().toString (), DBHelpers::Category::Player);
507+ if (!playerTag) {
508+ return Boolean::newBoolean (false );
509+ }
510+ std::string serverId = playerTag->at (" ServerId" );
511+ if (serverId.empty ()) {
512+ return Boolean::newBoolean (false );
513+ }
514+ if (!db->hasKey (serverId, DBHelpers::Category::Player)) {
515+ return Boolean::newBoolean (false );
516+ }
517+ std::unique_ptr<CompoundTag> serverIdTag = db->getCompoundTag (serverId, DBHelpers::Category::Player);
518+ if (!serverIdTag || !serverIdTag->contains (" UniqueID" )) {
519+ return Boolean::newBoolean (false );
520+ }
521+ int64 uniqueId = serverIdTag->at (" UniqueID" );
522+ ScoreboardId sid = scoreboard.getScoreboardId (PlayerScoreboardId (uniqueId));
523+ if (!sid.isValid ()) {
524+ return Boolean::newBoolean (false );
479525 }
480526 bool isSuccess = false ;
481527 scoreboard
482- .modifyPlayerScore (isSuccess, id , *objective, args[2 ].asNumber ().toInt32 (), PlayerScoreSetFunction::Set);
528+ .modifyPlayerScore (isSuccess, sid , *objective, args[2 ].asNumber ().toInt32 (), PlayerScoreSetFunction::Set);
483529 return Boolean::newBoolean (isSuccess);
484530 }
485531 CATCH (" Fail in setPlayerScore!" )
@@ -497,19 +543,37 @@ Local<Value> McClass::addPlayerScore(const Arguments& args) {
497543 if (!objective) {
498544 return Boolean::newBoolean (false );
499545 }
500- const ScoreboardId& id =
501- scoreboard.getScoreboardId (PlayerScoreboardId (std::atoll (args[0 ].asString ().toString ().c_str ())));
502- if (!id.isValid ()) {
503- Player* pl = ll::service::getLevel ()->getPlayer (uuid);
504- if (pl) {
505- scoreboard.createScoreboardId (*pl);
506- } else {
507- return Boolean::newBoolean (false );
508- }
546+ DBStorage* db = MoreGlobal::db;
547+ if (!db) {
548+ return Boolean::newBoolean (false );
549+ }
550+ if (!db->hasKey (" player_" + args[0 ].asString ().toString (), DBHelpers::Category::Player)) {
551+ return Boolean::newBoolean (false );
552+ }
553+ std::unique_ptr<CompoundTag> playerTag =
554+ db->getCompoundTag (" player_" + args[0 ].asString ().toString (), DBHelpers::Category::Player);
555+ if (!playerTag) {
556+ return Boolean::newBoolean (false );
557+ }
558+ std::string serverId = playerTag->at (" ServerId" );
559+ if (serverId.empty ()) {
560+ return Boolean::newBoolean (false );
561+ }
562+ if (!db->hasKey (serverId, DBHelpers::Category::Player)) {
563+ return Boolean::newBoolean (false );
564+ }
565+ std::unique_ptr<CompoundTag> serverIdTag = db->getCompoundTag (serverId, DBHelpers::Category::Player);
566+ if (!serverIdTag || !serverIdTag->contains (" UniqueID" )) {
567+ return Boolean::newBoolean (false );
568+ }
569+ int64 uniqueId = serverIdTag->at (" UniqueID" );
570+ ScoreboardId sid = scoreboard.getScoreboardId (PlayerScoreboardId (uniqueId));
571+ if (!sid.isValid ()) {
572+ return Boolean::newBoolean (false );
509573 }
510574 bool isSuccess = false ;
511575 scoreboard
512- .modifyPlayerScore (isSuccess, id , *objective, args[2 ].asNumber ().toInt32 (), PlayerScoreSetFunction::Add);
576+ .modifyPlayerScore (isSuccess, sid , *objective, args[2 ].asNumber ().toInt32 (), PlayerScoreSetFunction::Add);
513577 return Boolean::newBoolean (isSuccess);
514578 }
515579 CATCH (" Fail in addPlayerScore!" )
@@ -527,20 +591,38 @@ Local<Value> McClass::reducePlayerScore(const Arguments& args) {
527591 if (!objective) {
528592 return Boolean::newBoolean (false );
529593 }
530- const ScoreboardId& id =
531- scoreboard.getScoreboardId (PlayerScoreboardId (std::atoll (args[0 ].asString ().toString ().c_str ())));
532- if (!id.isValid ()) {
533- Player* pl = ll::service::getLevel ()->getPlayer (uuid);
534- if (pl) {
535- scoreboard.createScoreboardId (*pl);
536- } else {
537- return Boolean::newBoolean (false );
538- }
594+ DBStorage* db = MoreGlobal::db;
595+ if (!db) {
596+ return Boolean::newBoolean (false );
597+ }
598+ if (!db->hasKey (" player_" + args[0 ].asString ().toString (), DBHelpers::Category::Player)) {
599+ return Boolean::newBoolean (false );
600+ }
601+ std::unique_ptr<CompoundTag> playerTag =
602+ db->getCompoundTag (" player_" + args[0 ].asString ().toString (), DBHelpers::Category::Player);
603+ if (!playerTag) {
604+ return Boolean::newBoolean (false );
605+ }
606+ std::string serverId = playerTag->at (" ServerId" );
607+ if (serverId.empty ()) {
608+ return Boolean::newBoolean (false );
609+ }
610+ if (!db->hasKey (serverId, DBHelpers::Category::Player)) {
611+ return Boolean::newBoolean (false );
612+ }
613+ std::unique_ptr<CompoundTag> serverIdTag = db->getCompoundTag (serverId, DBHelpers::Category::Player);
614+ if (!serverIdTag || !serverIdTag->contains (" UniqueID" )) {
615+ return Boolean::newBoolean (false );
616+ }
617+ int64 uniqueId = serverIdTag->at (" UniqueID" );
618+ ScoreboardId sid = scoreboard.getScoreboardId (PlayerScoreboardId (uniqueId));
619+ if (!sid.isValid ()) {
620+ return Boolean::newBoolean (false );
539621 }
540622 bool isSuccess = false ;
541623 scoreboard.modifyPlayerScore (
542624 isSuccess,
543- id ,
625+ sid ,
544626 *objective,
545627 args[2 ].asNumber ().toInt32 (),
546628 PlayerScoreSetFunction::Subtract
@@ -560,12 +642,35 @@ Local<Value> McClass::deletePlayerScore(const Arguments& args) {
560642 if (!objective) {
561643 return Boolean::newBoolean (false );
562644 }
563- const ScoreboardId& id =
564- scoreboard.getScoreboardId (PlayerScoreboardId (std::atoll (args[0 ].asString ().toString ().c_str ())));
565- if (!id.isValid ()) {
566- return Boolean::newBoolean (true );
645+ DBStorage* db = MoreGlobal::db;
646+ if (!db) {
647+ return Boolean::newBoolean (false );
648+ }
649+ if (!db->hasKey (" player_" + args[0 ].asString ().toString (), DBHelpers::Category::Player)) {
650+ return Boolean::newBoolean (false );
651+ }
652+ std::unique_ptr<CompoundTag> playerTag =
653+ db->getCompoundTag (" player_" + args[0 ].asString ().toString (), DBHelpers::Category::Player);
654+ if (!playerTag) {
655+ return Boolean::newBoolean (false );
656+ }
657+ std::string serverId = playerTag->at (" ServerId" );
658+ if (serverId.empty ()) {
659+ return Boolean::newBoolean (false );
660+ }
661+ if (!db->hasKey (serverId, DBHelpers::Category::Player)) {
662+ return Boolean::newBoolean (false );
663+ }
664+ std::unique_ptr<CompoundTag> serverIdTag = db->getCompoundTag (serverId, DBHelpers::Category::Player);
665+ if (!serverIdTag || !serverIdTag->contains (" UniqueID" )) {
666+ return Boolean::newBoolean (false );
667+ }
668+ int64 uniqueId = serverIdTag->at (" UniqueID" );
669+ ScoreboardId sid = scoreboard.getScoreboardId (PlayerScoreboardId (uniqueId));
670+ if (!sid.isValid ()) {
671+ return Boolean::newBoolean (false );
567672 }
568- objective->_resetPlayer (id );
673+ objective->_resetPlayer (sid );
569674 return Boolean::newBoolean (true );
570675 }
571676 CATCH (" Fail in deletePlayerScore!" )
0 commit comments