Merge branch 'main' into vcm-bones

This commit is contained in:
MihailRis 2026-01-10 23:28:11 +03:00
commit e01cc25f7c
8 changed files with 22 additions and 12 deletions

View file

@ -117,6 +117,7 @@ player.set_suspended(pid: int, suspended: bool)
Setter and getter for the player's suspended status. 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 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 ```lua
player.set_name(playerid: int, name: str) player.set_name(playerid: int, name: str)

View file

@ -30,6 +30,7 @@ player.get_name(playerid: int) -> string
-- Сеттер и геттер статуса "заморозки" игрока. -- Сеттер и геттер статуса "заморозки" игрока.
-- При заморозке сущность игрока удаляется. При последующей разморозке будет создана новая, с другим id.
player.set_suspended(pid: int, suspended: boolean) player.set_suspended(pid: int, suspended: boolean)
player.is_suspended(pid: int) -> boolean player.is_suspended(pid: int) -> boolean
``` ```
@ -125,4 +126,4 @@ player.get_all() -> table<int>
-- Возвращает id ближайшего к указанной позиции игрока, либо nil если игроков нет. -- Возвращает id ближайшего к указанной позиции игрока, либо nil если игроков нет.
player.get_nearest(position: vec3) -> int / nil player.get_nearest(position: vec3) -> int / nil
``` ```

View file

@ -58,7 +58,15 @@ local function process_player_inputs(pid, rot, delta)
end end
end end
local prepared = false
body:set_enabled(false)
function on_physics_update(delta) function on_physics_update(delta)
if not prepared then
prepared = true
body:set_enabled(true)
end
local pid = entity:get_player() local pid = entity:get_player()
if pid == -1 then if pid == -1 then
return return

View file

@ -53,6 +53,9 @@ Decorator::Decorator(
addParticles(def, pos); addParticles(def, pos);
} }
}); });
playerNamePreset.deserialize(engine.getResPaths().readCombinedObject(
"presets/text3d/player_name.toml"
));
for (const auto& [id, player] : *level.players) { for (const auto& [id, player] : *level.players) {
if (id == this->player.getId()) { if (id == this->player.getId()) {
continue; continue;
@ -63,9 +66,6 @@ Decorator::Decorator(
player->getPosition() player->getPosition()
)); ));
} }
playerNamePreset.deserialize(engine.getResPaths().readCombinedObject(
"presets/text3d/player_name.toml"
));
} }
void Decorator::addParticles(const Block& def, const glm::ivec3& pos) { void Decorator::addParticles(const Block& def, const glm::ivec3& pos) {

View file

@ -324,8 +324,10 @@ static int l_is_suspended(lua::State* L) {
} }
static int l_set_suspended(lua::State* L) { static int l_set_suspended(lua::State* L) {
if (auto player = get_player(L, 1)) { if (lua::toboolean(L, 2)) {
player->setSuspended(lua::toboolean(L, 2)); level->players->suspend(lua::tointeger(L, 1));
} else {
level->players->resume(lua::tointeger(L, 1));
} }
return 0; return 0;
} }

View file

@ -105,10 +105,8 @@ void Player::postUpdate() {
if (flight && hitbox.grounded && !noclip) { if (flight && hitbox.grounded && !noclip) {
flight = false; flight = false;
} }
if (spawnpoint.y <= 0.1) { for (int i = 0; i < SPAWN_ATTEMPTS_PER_UPDATE && std::isnan(spawnpoint.x); i++) {
for (int i = 0; i < SPAWN_ATTEMPTS_PER_UPDATE; i++) { attemptToFindSpawnpoint();
attemptToFindSpawnpoint();
}
} }
} }

View file

@ -49,7 +49,7 @@ class Player : public Serializable {
int chosenSlot; int chosenSlot;
glm::vec3 position; glm::vec3 position;
glm::vec3 spawnpoint {}; glm::vec3 spawnpoint {std::nanf(""), std::nanf(""), std::nanf("")};
std::shared_ptr<Inventory> inventory; std::shared_ptr<Inventory> inventory;
bool suspended = false; bool suspended = false;
bool flight = false; bool flight = false;

View file

@ -99,7 +99,7 @@ void Players::suspend(int64_t id) {
} }
player->setSuspended(true); player->setSuspended(true);
level.entities->despawn(player->getEntity()); level.entities->despawn(player->getEntity());
player->setEntity(0); player->setEntity(ENTITY_AUTO);
} }
} }