Skip to content

Commit

Permalink
fix: fix some scoreboard api (#60)
Browse files Browse the repository at this point in the history
* fix: try fix scoreboard

* fix: fix mc.getDisplayObjective

* fix: change mc:clearDisplayObjective return type

* docs: add simulateRespawn api
  • Loading branch information
engsr6982 authored Mar 9, 2024
1 parent bb856fb commit 19a1192
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 17 deletions.
8 changes: 8 additions & 0 deletions docs/apis/GameAPI/Player.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

#### 模拟攻击

Expand Down
41 changes: 24 additions & 17 deletions src/legacy/api/ScoreboardAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ Local<Value> ObjectiveClass::setDisplay(const Arguments& args) {
CATCH("Fail in setDisplay");
}

///////////////////////////////////////////////////////////////////

Local<Value> ObjectiveClass::setScore(const Arguments& args) {
CHECK_ARGS_COUNT(args, 2)
CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
Expand All @@ -92,7 +94,7 @@ Local<Value> 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);
}
Expand All @@ -103,21 +105,23 @@ Local<Value> ObjectiveClass::setScore(const Arguments& args) {
bool isSuccess = false;
scoreboard.modifyPlayerScore(isSuccess, id, *obj, score, PlayerScoreSetFunction::Set);
if (isSuccess) return Number::newNumber(score);
return Local<Value>();
} else if (IsInstanceOf<PlayerClass>(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);
}
bool isSuccess = false;
scoreboard
.modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Set);
if (isSuccess) return Number::newNumber(score);
return Local<Value>();
} else {
LOG_WRONG_ARG_TYPE();
return Local<Value>();
Expand All @@ -136,7 +140,7 @@ Local<Value> 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);
}
Expand All @@ -148,21 +152,23 @@ Local<Value> ObjectiveClass::addScore(const Arguments& args) {
scoreboard
.modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Add);
if (isSuccess) return Number::newNumber(score);
return Local<Value>();
} else if (IsInstanceOf<PlayerClass>(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);
}
bool isSuccess = false;
scoreboard
.modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Add);
if (isSuccess) return Number::newNumber(score);
return Local<Value>();
} else {
LOG_WRONG_ARG_TYPE();
return Local<Value>();
Expand All @@ -181,7 +187,7 @@ Local<Value> 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);
}
Expand All @@ -193,21 +199,23 @@ Local<Value> ObjectiveClass::reduceScore(const Arguments& args) {
scoreboard
.modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Subtract);
if (isSuccess) return Number::newNumber(score);
return Local<Value>();
} else if (IsInstanceOf<PlayerClass>(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);
}
bool isSuccess = false;
scoreboard
.modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Subtract);
if (isSuccess) return Number::newNumber(score);
return Local<Value>();
} else {
LOG_WRONG_ARG_TYPE();
return Local<Value>();
Expand All @@ -222,7 +230,7 @@ Local<Value> 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);
}
Expand All @@ -234,11 +242,11 @@ Local<Value> ObjectiveClass::deleteScore(const Arguments& args) {
} else if (IsInstanceOf<PlayerClass>(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);
}
Expand All @@ -258,8 +266,7 @@ Local<Value> 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 {};
}
Expand Down Expand Up @@ -291,7 +298,7 @@ Local<Value> McClass::getDisplayObjective(const Arguments& args) {
auto res = ll::service::getLevel()->getScoreboard().getDisplayObjective(slot);

if (!res) return Local<Value>();
return ObjectiveClass::newObjective((Objective*)res);
return ObjectiveClass::newObjective(const_cast<Objective*>(res->mObjective));
}
CATCH("Fail in GetDisplayObjective");
}
Expand All @@ -304,8 +311,8 @@ Local<Value> McClass::clearDisplayObjective(const Arguments& args) {
string slot = args[0].toStr();
auto res = ll::service::getLevel()->getScoreboard().clearDisplayObjective(slot);

if (!res) return Local<Value>();
return ObjectiveClass::newObjective(res);
if (!res) return Boolean::newBoolean(false);
return Boolean::newBoolean(true);
}
CATCH("Fail in ClearDisplayObjective");
}
Expand Down

0 comments on commit 19a1192

Please sign in to comment.