Skip to content

Commit

Permalink
Merge branch 'main' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
ShrBox committed Mar 9, 2024
2 parents 0f5b9d4 + 19a1192 commit 8c768d2
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 @@ -137,7 +141,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 @@ -149,21 +153,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 @@ -183,7 +189,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 @@ -195,21 +201,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 @@ -225,7 +233,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 @@ -237,11 +245,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 @@ -261,8 +269,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 @@ -294,7 +301,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 @@ -307,8 +314,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 8c768d2

Please sign in to comment.