Skip to content

Commit 8456cfb

Browse files
committed
fix: fix ScoreboardAPI #84
1 parent e8a56a1 commit 8456cfb

File tree

1 file changed

+154
-49
lines changed

1 file changed

+154
-49
lines changed

src/legacy/api/PlayerAPI.cpp

Lines changed: 154 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)