Skip to content

Commit 19a1192

Browse files
authored
fix: fix some scoreboard api (#60)
* fix: try fix scoreboard * fix: fix mc.getDisplayObjective * fix: change mc:clearDisplayObjective return type * docs: add simulateRespawn api
1 parent bb856fb commit 19a1192

File tree

2 files changed

+32
-17
lines changed

2 files changed

+32
-17
lines changed

docs/apis/GameAPI/Player.zh.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,6 +1766,14 @@
17661766
### 模拟玩家 - 函数
17671767
每一个模拟玩家对象都包含一些可以执行的成员函数(成员方法)。对于某个特定的模拟玩家对象`sp`,可以通过以下这些函数对这个模拟玩家进行一些操作
17681768

1769+
#### 模拟重生
1770+
1771+
'sp.simulateRespawn()'
1772+
1773+
- 返回值:是否成功模拟操作
1774+
- 返回值类型:'Boolean'
1775+
1776+
参考:[mojang-gametest docs](https://learn.microsoft.com/zh-cn/minecraft/creator/scriptapi/minecraft/server-gametest/simulatedplayer?view=minecraft-bedrock-experimental#respawn)
17691777

17701778
#### 模拟攻击
17711779

src/legacy/api/ScoreboardAPI.cpp

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ Local<Value> ObjectiveClass::setDisplay(const Arguments& args) {
8282
CATCH("Fail in setDisplay");
8383
}
8484

85+
///////////////////////////////////////////////////////////////////
86+
8587
Local<Value> ObjectiveClass::setScore(const Arguments& args) {
8688
CHECK_ARGS_COUNT(args, 2)
8789
CHECK_ARG_TYPE(args[1], ValueKind::kNumber)
@@ -92,7 +94,7 @@ Local<Value> ObjectiveClass::setScore(const Arguments& args) {
9294
if (args[0].isString()) {
9395
std::string name = args[0].toStr();
9496
Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard();
95-
Objective* obj = scoreboard.getObjective(objname);
97+
Objective* obj = get();
9698
if (!obj) {
9799
return Boolean::newBoolean(false);
98100
}
@@ -103,21 +105,23 @@ Local<Value> ObjectiveClass::setScore(const Arguments& args) {
103105
bool isSuccess = false;
104106
scoreboard.modifyPlayerScore(isSuccess, id, *obj, score, PlayerScoreSetFunction::Set);
105107
if (isSuccess) return Number::newNumber(score);
108+
return Local<Value>();
106109
} else if (IsInstanceOf<PlayerClass>(args[0])) {
107110
auto player = PlayerClass::extract(args[0]);
108111
Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard();
109-
Objective* obj = scoreboard.getObjective(objname);
112+
Objective* obj = get();
110113
if (!obj) {
111114
return Boolean::newBoolean(false);
112115
}
113-
const ScoreboardId& id = scoreboard.getScoreboardId(player->getOrCreateUniqueID());
116+
const ScoreboardId& id = scoreboard.getScoreboardId(*player);
114117
if (!id.isValid()) {
115118
scoreboard.createScoreboardId(*player);
116119
}
117120
bool isSuccess = false;
118121
scoreboard
119122
.modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Set);
120123
if (isSuccess) return Number::newNumber(score);
124+
return Local<Value>();
121125
} else {
122126
LOG_WRONG_ARG_TYPE();
123127
return Local<Value>();
@@ -136,7 +140,7 @@ Local<Value> ObjectiveClass::addScore(const Arguments& args) {
136140
if (args[0].isString()) {
137141
std::string name = args[0].toStr();
138142
Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard();
139-
Objective* obj = scoreboard.getObjective(objname);
143+
Objective* obj = get();
140144
if (!obj) {
141145
return Boolean::newBoolean(false);
142146
}
@@ -148,21 +152,23 @@ Local<Value> ObjectiveClass::addScore(const Arguments& args) {
148152
scoreboard
149153
.modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Add);
150154
if (isSuccess) return Number::newNumber(score);
155+
return Local<Value>();
151156
} else if (IsInstanceOf<PlayerClass>(args[0])) {
152157
auto player = PlayerClass::extract(args[0]);
153158
Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard();
154-
Objective* obj = scoreboard.getObjective(objname);
159+
Objective* obj = get();
155160
if (!obj) {
156161
return Boolean::newBoolean(false);
157162
}
158-
const ScoreboardId& id = scoreboard.getScoreboardId(player->getOrCreateUniqueID());
163+
const ScoreboardId& id = scoreboard.getScoreboardId(*player);
159164
if (!id.isValid()) {
160165
scoreboard.createScoreboardId(*player);
161166
}
162167
bool isSuccess = false;
163168
scoreboard
164169
.modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Add);
165170
if (isSuccess) return Number::newNumber(score);
171+
return Local<Value>();
166172
} else {
167173
LOG_WRONG_ARG_TYPE();
168174
return Local<Value>();
@@ -181,7 +187,7 @@ Local<Value> ObjectiveClass::reduceScore(const Arguments& args) {
181187
if (args[0].isString()) {
182188
std::string name = args[0].toStr();
183189
Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard();
184-
Objective* obj = scoreboard.getObjective(objname);
190+
Objective* obj = get();
185191
if (!obj) {
186192
return Boolean::newBoolean(false);
187193
}
@@ -193,21 +199,23 @@ Local<Value> ObjectiveClass::reduceScore(const Arguments& args) {
193199
scoreboard
194200
.modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Subtract);
195201
if (isSuccess) return Number::newNumber(score);
202+
return Local<Value>();
196203
} else if (IsInstanceOf<PlayerClass>(args[0])) {
197204
auto player = PlayerClass::extract(args[0]);
198205
Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard();
199-
Objective* obj = scoreboard.getObjective(objname);
206+
Objective* obj = get();
200207
if (!obj) {
201208
return Boolean::newBoolean(false);
202209
}
203-
const ScoreboardId& id = scoreboard.getScoreboardId(player->getOrCreateUniqueID());
210+
const ScoreboardId& id = scoreboard.getScoreboardId(*player);
204211
if (!id.isValid()) {
205212
scoreboard.createScoreboardId(*player);
206213
}
207214
bool isSuccess = false;
208215
scoreboard
209216
.modifyPlayerScore(isSuccess, id, *obj, args[1].asNumber().toInt32(), PlayerScoreSetFunction::Subtract);
210217
if (isSuccess) return Number::newNumber(score);
218+
return Local<Value>();
211219
} else {
212220
LOG_WRONG_ARG_TYPE();
213221
return Local<Value>();
@@ -222,7 +230,7 @@ Local<Value> ObjectiveClass::deleteScore(const Arguments& args) {
222230
try {
223231
if (args[0].isString()) {
224232
Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard();
225-
Objective* obj = scoreboard.getObjective(objname);
233+
Objective* obj = get();
226234
if (!obj) {
227235
return Boolean::newBoolean(false);
228236
}
@@ -234,11 +242,11 @@ Local<Value> ObjectiveClass::deleteScore(const Arguments& args) {
234242
} else if (IsInstanceOf<PlayerClass>(args[0])) {
235243
Player* player = PlayerClass::extract(args[0]);
236244
Scoreboard& scoreboard = ll::service::getLevel()->getScoreboard();
237-
Objective* obj = scoreboard.getObjective(objname);
245+
Objective* obj = get();
238246
if (!obj) {
239247
return Boolean::newBoolean(false);
240248
}
241-
const ScoreboardId& id = scoreboard.getScoreboardId(player->getOrCreateUniqueID());
249+
const ScoreboardId& id = scoreboard.getScoreboardId(*player);
242250
if (!id.isValid()) {
243251
return Boolean::newBoolean(true);
244252
}
@@ -258,8 +266,7 @@ Local<Value> ObjectiveClass::getScore(const Arguments& args) {
258266
if (args[0].isString()) {
259267
Scoreboard& board = ll::service::getLevel()->getScoreboard();
260268
Objective* objective = board.getObjective(objname);
261-
ScoreboardId sid =
262-
board.getScoreboardId(PlayerScoreboardId(std::atoll(args[0].asString().toString().c_str())));
269+
ScoreboardId sid = board.getScoreboardId(args[0].asString().toString());
263270
if (!objective || !sid.isValid() || !objective->hasScore(sid)) {
264271
return {};
265272
}
@@ -291,7 +298,7 @@ Local<Value> McClass::getDisplayObjective(const Arguments& args) {
291298
auto res = ll::service::getLevel()->getScoreboard().getDisplayObjective(slot);
292299

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

307-
if (!res) return Local<Value>();
308-
return ObjectiveClass::newObjective(res);
314+
if (!res) return Boolean::newBoolean(false);
315+
return Boolean::newBoolean(true);
309316
}
310317
CATCH("Fail in ClearDisplayObjective");
311318
}

0 commit comments

Comments
 (0)