Add entity.get/setAbsPos

This commit is contained in:
Bigjango13 2024-10-30 00:45:35 -07:00
parent 8bc143db17
commit ae359de188
2 changed files with 19 additions and 10 deletions

View File

@ -103,7 +103,10 @@ Egdecases:
Extras:
- Compatibility mode, this is enabled by default, and can be changed with `reborn.disableCompatMode` or `reborn.enableCompatMode`.
- `events.clear`
- `entity.getAbsPos(id: int) -> {x: int, y: int, z: int}`
- Same as `player.getAbsPos`, but for the entity
- `entity.setAbsPos(id: int, x: int, y: int, z: int)`
- Same as `player.setAbsPos`, but for the entity
## How does it work?

View File

@ -257,7 +257,7 @@ std::string CommandServer_parse_injection(CommandServer_parse_t old, CommandServ
// Redirect player commands to the entity command
if (commandserver->minecraft->player != NULL) {
if (cmd.starts_with(player_namespace) && cmd != "player.setting" && command != "player.getAbsPos" && command != "player.setAbsPos") {
if (cmd.starts_with(player_namespace) && cmd != "player.setting") {
cmd = "entity." + cmd.substr(player_namespace.size());
args = std::to_string(commandserver->minecraft->player->id) + "," + args;
}
@ -521,15 +521,21 @@ std::string CommandServer_parse_injection(CommandServer_parse_t old, CommandServ
if (result.size() > 1) result.pop_back();
for (auto &c : result) c = toupper(c);
return result + "\n";
} else if (cmd == "player.setAbsPos" && commandserver->minecraft->player) {
} else if (cmd == "entity.setAbsPos") {
int id;
float x, y, z;
int ret = sscanf(args.c_str(), "%f,%f,%f", &x, &y, &z);
if (ret != 3) return fail;
commandserver->minecraft->player->moveTo(x, y, z, commandserver->minecraft->player->yaw, commandserver->minecraft->player->pitch);
} else if (cmd == "player.getAbsPos" && commandserver->minecraft->player) {
return std::to_string(commandserver->minecraft->player->x) + ","
+ std::to_string(commandserver->minecraft->player->y) + ","
+ std::to_string(commandserver->minecraft->player->z) + "\n";
int ret = sscanf(args.c_str(), "%d,%f,%f,%f", &id, &x, &y, &z);
Entity *entity = commandserver->minecraft->level->getEntity(id);
if (ret != 4 || entity == NULL) return fail;
entity->moveTo(x, y, z, entity->yaw, entity->pitch);
} else if (cmd == "entity.getAbsPos") {
int id;
int ret = sscanf(args.c_str(), "%d", &id);
Entity *entity = commandserver->minecraft->level->getEntity(id);
if (ret != 1 || entity == NULL) return fail;
return std::to_string(entity->x) + ","
+ std::to_string(entity->y) + ","
+ std::to_string(entity->z) + "\n";
} else if (cmd == "entity.events.clear") {
int id;
int ret = sscanf(args.c_str(), "%d", &id);