From 19a1192b66eae2e0c00cf1428d7d2ba3420ee9a3 Mon Sep 17 00:00:00 2001 From: engsr6982 <109733049+engsr6982@users.noreply.github.com> Date: Sat, 9 Mar 2024 10:33:45 +0800 Subject: [PATCH] fix: fix some scoreboard api (#60) * fix: try fix scoreboard * fix: fix mc.getDisplayObjective * fix: change mc:clearDisplayObjective return type * docs: add simulateRespawn api --- docs/apis/GameAPI/Player.zh.md | 8 +++++++ src/legacy/api/ScoreboardAPI.cpp | 41 +++++++++++++++++++------------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/docs/apis/GameAPI/Player.zh.md b/docs/apis/GameAPI/Player.zh.md index 0b6aede2..94fd86e0 100644 --- a/docs/apis/GameAPI/Player.zh.md +++ b/docs/apis/GameAPI/Player.zh.md @@ -1766,6 +1766,14 @@ ### 模拟玩家 - 函数 每一个模拟玩家对象都包含一些可以执行的成员函数(成员方法)。对于某个特定的模拟玩家对象`sp`,可以通过以下这些函数对这个模拟玩家进行一些操作 +#### 模拟重生 + +'sp.simulateRespawn()' + +- 返回值:是否成功模拟操作 +- 返回值类型:'Boolean' + +参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#respawn) #### 模拟攻击 diff --git a/src/legacy/api/ScoreboardAPI.cpp b/src/legacy/api/ScoreboardAPI.cpp index e2e8107e..9c34689a 100644 --- a/src/legacy/api/ScoreboardAPI.cpp +++ b/src/legacy/api/ScoreboardAPI.cpp @@ -82,6 +82,8 @@ Local ObjectiveClass::setDisplay(const Arguments& args) { CATCH("Fail in setDisplay"); } +/////////////////////////////////////////////////////////////////// + Local ObjectiveClass::setScore(const Arguments& args) { CHECK_ARGS_COUNT(args, 2) CHECK_ARG_TYPE(args[1], ValueKind::kNumber) @@ -92,7 +94,7 @@ Local ObjectiveClass::setScore(const Arguments& args) { if (args[0].isString()) { std::string name = args[0].toStr(); Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard(); - Objective* obj = scoreboard.getObjective(objname); + Objective* obj = get(); if (!obj) { return Boolean::newBoolean(false); } @@ -103,14 +105,15 @@ Local ObjectiveClass::setScore(const Arguments& args) { bool isSuccess = false; scoreboard.modifyPlayerScore(isSuccess, id, *obj, score, PlayerScoreSetFunction::Set); if (isSuccess) return Number::newNumber(score); + return Local(); } else if (IsInstanceOf(args[0])) { auto player = PlayerClass::extract(args[0]); Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard(); - Objective* obj = scoreboard.getObjective(objname); + Objective* obj = get(); if (!obj) { return Boolean::newBoolean(false); } - const ScoreboardId& id = scoreboard.getScoreboardId(player->getOrCreateUniqueID()); + const ScoreboardId& id = scoreboard.getScoreboardId(*player); if (!id.isValid()) { scoreboard.createScoreboardId(*player); } @@ -118,6 +121,7 @@ Local ObjectiveClass::setScore(const Arguments& args) { scoreboard .modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Set); if (isSuccess) return Number::newNumber(score); + return Local(); } else { LOG_WRONG_ARG_TYPE(); return Local(); @@ -136,7 +140,7 @@ Local ObjectiveClass::addScore(const Arguments& args) { if (args[0].isString()) { std::string name = args[0].toStr(); Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard(); - Objective* obj = scoreboard.getObjective(objname); + Objective* obj = get(); if (!obj) { return Boolean::newBoolean(false); } @@ -148,14 +152,15 @@ Local ObjectiveClass::addScore(const Arguments& args) { scoreboard .modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Add); if (isSuccess) return Number::newNumber(score); + return Local(); } else if (IsInstanceOf(args[0])) { auto player = PlayerClass::extract(args[0]); Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard(); - Objective* obj = scoreboard.getObjective(objname); + Objective* obj = get(); if (!obj) { return Boolean::newBoolean(false); } - const ScoreboardId& id = scoreboard.getScoreboardId(player->getOrCreateUniqueID()); + const ScoreboardId& id = scoreboard.getScoreboardId(*player); if (!id.isValid()) { scoreboard.createScoreboardId(*player); } @@ -163,6 +168,7 @@ Local ObjectiveClass::addScore(const Arguments& args) { scoreboard .modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Add); if (isSuccess) return Number::newNumber(score); + return Local(); } else { LOG_WRONG_ARG_TYPE(); return Local(); @@ -181,7 +187,7 @@ Local ObjectiveClass::reduceScore(const Arguments& args) { if (args[0].isString()) { std::string name = args[0].toStr(); Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard(); - Objective* obj = scoreboard.getObjective(objname); + Objective* obj = get(); if (!obj) { return Boolean::newBoolean(false); } @@ -193,14 +199,15 @@ Local ObjectiveClass::reduceScore(const Arguments& args) { scoreboard .modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Subtract); if (isSuccess) return Number::newNumber(score); + return Local(); } else if (IsInstanceOf(args[0])) { auto player = PlayerClass::extract(args[0]); Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard(); - Objective* obj = scoreboard.getObjective(objname); + Objective* obj = get(); if (!obj) { return Boolean::newBoolean(false); } - const ScoreboardId& id = scoreboard.getScoreboardId(player->getOrCreateUniqueID()); + const ScoreboardId& id = scoreboard.getScoreboardId(*player); if (!id.isValid()) { scoreboard.createScoreboardId(*player); } @@ -208,6 +215,7 @@ Local ObjectiveClass::reduceScore(const Arguments& args) { scoreboard .modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Subtract); if (isSuccess) return Number::newNumber(score); + return Local(); } else { LOG_WRONG_ARG_TYPE(); return Local(); @@ -222,7 +230,7 @@ Local ObjectiveClass::deleteScore(const Arguments& args) { try { if (args[0].isString()) { Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard(); - Objective* obj = scoreboard.getObjective(objname); + Objective* obj = get(); if (!obj) { return Boolean::newBoolean(false); } @@ -234,11 +242,11 @@ Local ObjectiveClass::deleteScore(const Arguments& args) { } else if (IsInstanceOf(args[0])) { Player* player = PlayerClass::extract(args[0]); Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard(); - Objective* obj = scoreboard.getObjective(objname); + Objective* obj = get(); if (!obj) { return Boolean::newBoolean(false); } - const ScoreboardId& id = scoreboard.getScoreboardId(player->getOrCreateUniqueID()); + const ScoreboardId& id = scoreboard.getScoreboardId(*player); if (!id.isValid()) { return Boolean::newBoolean(true); } @@ -258,8 +266,7 @@ Local ObjectiveClass::getScore(const Arguments& args) { if (args[0].isString()) { Scoreboard& board = ll::service::getLevel()->getScoreboard(); Objective* objective = board.getObjective(objname); - ScoreboardId sid = - board.getScoreboardId(PlayerScoreboardId(std::atoll(args[0].asString().toString().c_str()))); + ScoreboardId sid = board.getScoreboardId(args[0].asString().toString()); if (!objective || !sid.isValid() || !objective->hasScore(sid)) { return {}; } @@ -291,7 +298,7 @@ Local McClass::getDisplayObjective(const Arguments& args) { auto res = ll::service::getLevel()->getScoreboard().getDisplayObjective(slot); if (!res) return Local(); - return ObjectiveClass::newObjective((Objective*)res); + return ObjectiveClass::newObjective(const_cast(res->mObjective)); } CATCH("Fail in GetDisplayObjective"); } @@ -304,8 +311,8 @@ Local McClass::clearDisplayObjective(const Arguments& args) { string slot = args[0].toStr(); auto res = ll::service::getLevel()->getScoreboard().clearDisplayObjective(slot); - if (!res) return Local(); - return ObjectiveClass::newObjective(res); + if (!res) return Boolean::newBoolean(false); + return Boolean::newBoolean(true); } CATCH("Fail in ClearDisplayObjective"); }