diff --git a/doc/en/scripting/builtins/libplayer.md b/doc/en/scripting/builtins/libplayer.md index 379ea89b6..4b632d798 100644 --- a/doc/en/scripting/builtins/libplayer.md +++ b/doc/en/scripting/builtins/libplayer.md @@ -117,6 +117,7 @@ player.set_suspended(pid: int, suspended: bool) Setter and getter for the player's suspended status. When suspended, the entity is deleted and the player is disabled from the world simulation. +When resumed, a new entity will be created with a different ID. ```lua player.set_name(playerid: int, name: str) diff --git a/doc/ru/scripting/builtins/libplayer.md b/doc/ru/scripting/builtins/libplayer.md index d4f77cac6..1590d0a47 100644 --- a/doc/ru/scripting/builtins/libplayer.md +++ b/doc/ru/scripting/builtins/libplayer.md @@ -30,6 +30,7 @@ player.get_name(playerid: int) -> string -- Сеттер и геттер статуса "заморозки" игрока. +-- При заморозке сущность игрока удаляется. При последующей разморозке будет создана новая, с другим id. player.set_suspended(pid: int, suspended: boolean) player.is_suspended(pid: int) -> boolean ``` @@ -125,4 +126,4 @@ player.get_all() -> table -- Возвращает id ближайшего к указанной позиции игрока, либо nil если игроков нет. player.get_nearest(position: vec3) -> int / nil -``` \ No newline at end of file +``` diff --git a/res/scripts/components/player.lua b/res/scripts/components/player.lua index 2fc25b7e2..66fdda825 100644 --- a/res/scripts/components/player.lua +++ b/res/scripts/components/player.lua @@ -58,7 +58,15 @@ local function process_player_inputs(pid, rot, delta) end end +local prepared = false +body:set_enabled(false) + function on_physics_update(delta) + if not prepared then + prepared = true + body:set_enabled(true) + end + local pid = entity:get_player() if pid == -1 then return diff --git a/src/graphics/render/Decorator.cpp b/src/graphics/render/Decorator.cpp index 8bbb2c9d4..420f6d0dc 100644 --- a/src/graphics/render/Decorator.cpp +++ b/src/graphics/render/Decorator.cpp @@ -53,6 +53,9 @@ Decorator::Decorator( addParticles(def, pos); } }); + playerNamePreset.deserialize(engine.getResPaths().readCombinedObject( + "presets/text3d/player_name.toml" + )); for (const auto& [id, player] : *level.players) { if (id == this->player.getId()) { continue; @@ -63,9 +66,6 @@ Decorator::Decorator( player->getPosition() )); } - playerNamePreset.deserialize(engine.getResPaths().readCombinedObject( - "presets/text3d/player_name.toml" - )); } void Decorator::addParticles(const Block& def, const glm::ivec3& pos) { diff --git a/src/logic/scripting/lua/libs/libplayer.cpp b/src/logic/scripting/lua/libs/libplayer.cpp index 14ec48456..9f634bddb 100644 --- a/src/logic/scripting/lua/libs/libplayer.cpp +++ b/src/logic/scripting/lua/libs/libplayer.cpp @@ -324,8 +324,10 @@ static int l_is_suspended(lua::State* L) { } static int l_set_suspended(lua::State* L) { - if (auto player = get_player(L, 1)) { - player->setSuspended(lua::toboolean(L, 2)); + if (lua::toboolean(L, 2)) { + level->players->suspend(lua::tointeger(L, 1)); + } else { + level->players->resume(lua::tointeger(L, 1)); } return 0; } diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index f27dc743e..a63341d49 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -105,10 +105,8 @@ void Player::postUpdate() { if (flight && hitbox.grounded && !noclip) { flight = false; } - if (spawnpoint.y <= 0.1) { - for (int i = 0; i < SPAWN_ATTEMPTS_PER_UPDATE; i++) { - attemptToFindSpawnpoint(); - } + for (int i = 0; i < SPAWN_ATTEMPTS_PER_UPDATE && std::isnan(spawnpoint.x); i++) { + attemptToFindSpawnpoint(); } } diff --git a/src/objects/Player.hpp b/src/objects/Player.hpp index 18c5a5996..02a7ce54b 100644 --- a/src/objects/Player.hpp +++ b/src/objects/Player.hpp @@ -49,7 +49,7 @@ class Player : public Serializable { int chosenSlot; glm::vec3 position; - glm::vec3 spawnpoint {}; + glm::vec3 spawnpoint {std::nanf(""), std::nanf(""), std::nanf("")}; std::shared_ptr inventory; bool suspended = false; bool flight = false; diff --git a/src/objects/Players.cpp b/src/objects/Players.cpp index a90d6d07d..c925c9390 100644 --- a/src/objects/Players.cpp +++ b/src/objects/Players.cpp @@ -99,7 +99,7 @@ void Players::suspend(int64_t id) { } player->setSuspended(true); level.entities->despawn(player->getEntity()); - player->setEntity(0); + player->setEntity(ENTITY_AUTO); } }