From a4fc4a5044d394a8f1d054ecf76d18c6ebba0a78 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 9 Jan 2026 02:00:54 +0300 Subject: [PATCH 1/6] fix: player.set_suspend(pid, true) leaves entity in the world --- src/logic/scripting/lua/libs/libplayer.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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; } From d9a914ee5423ec216e216f6839785a887eb47036 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 9 Jan 2026 02:29:45 +0300 Subject: [PATCH 2/6] fix incorrect 3d text preset for existing players --- src/graphics/render/Decorator.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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) { From 088bfc878efc05fdd92078581068e16d1e38f652 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 9 Jan 2026 02:36:13 +0300 Subject: [PATCH 3/6] fix: player not spawning entity after set_suspended(pid, false) --- src/objects/Players.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); } } From 3282f5f8ae59bffa2b10a9491872fabeff7e5afe Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 9 Jan 2026 02:42:12 +0300 Subject: [PATCH 4/6] update doc/*/scripting/builtins/libplayer.md --- doc/en/scripting/builtins/libplayer.md | 1 + doc/ru/scripting/builtins/libplayer.md | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) 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 +``` From 5785060ffb85edb33c72410e0c65123c094fb3dd Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 9 Jan 2026 02:59:38 +0300 Subject: [PATCH 5/6] fix: player entity body is active before player flight state applied --- res/scripts/components/player.lua | 8 ++++++++ 1 file changed, 8 insertions(+) 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 From f602384a94aaec943b590654604b460d6c1b0f22 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 9 Jan 2026 03:26:32 +0300 Subject: [PATCH 6/6] update player spawn point auto selection --- src/objects/Player.cpp | 6 ++---- src/objects/Player.hpp | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) 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;