From e153e1fbd7fdfbe773a43b480258ea02fbbe939a Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 24 Dec 2024 10:35:09 +0300 Subject: [PATCH] add player.is_loading_chunks, .set_loading_chunks --- doc/en/scripting/builtins/libplayer.md | 7 +++++++ doc/ru/scripting/builtins/libplayer.md | 7 +++++++ src/logic/ChunksController.cpp | 10 +++++++++- src/logic/scripting/lua/libs/libplayer.cpp | 16 ++++++++++++++++ src/objects/Player.cpp | 12 +++++++++++- src/objects/Player.hpp | 4 ++++ 6 files changed, 54 insertions(+), 2 deletions(-) diff --git a/doc/en/scripting/builtins/libplayer.md b/doc/en/scripting/builtins/libplayer.md index 3bff1547..52324d30 100644 --- a/doc/en/scripting/builtins/libplayer.md +++ b/doc/en/scripting/builtins/libplayer.md @@ -70,6 +70,13 @@ player.set_instant_destruction(playerid: int, bool) Getter and setter for instant destruction of blocks when the `player.destroy` binding is activated. +```lua +player.is_loading_chunks(playerid: int) -> bool +player.set_loading_chunks(playerid: int, bool) +``` + +Getter and setter of the property that determines whether the player is loading chunks. + ``` lua player.set_spawnpoint(playerid: int, x: number, y: number, z: number) player.get_spawnpoint(playerid: int) -> number, number, number diff --git a/doc/ru/scripting/builtins/libplayer.md b/doc/ru/scripting/builtins/libplayer.md index d4912e61..01a6d581 100644 --- a/doc/ru/scripting/builtins/libplayer.md +++ b/doc/ru/scripting/builtins/libplayer.md @@ -70,6 +70,13 @@ player.set_instant_destruction(playerid: int, bool) Геттер и сеттер мнгновенного разрушения блоков при активации привязки `player.destroy`. +```lua +player.is_loading_chunks(playerid: int) -> bool +player.set_loading_chunks(playerid: int, bool) +``` + +Геттер и сеттер свойства, определяющего, прогружает ли игрок чанки вокруг. + ```lua player.set_spawnpoint(playerid: int, x: number, y: number, z: number) player.get_spawnpoint(playerid: int) -> number, number, number diff --git a/src/logic/ChunksController.cpp b/src/logic/ChunksController.cpp index f431efa7..162ca2fe 100644 --- a/src/logic/ChunksController.cpp +++ b/src/logic/ChunksController.cpp @@ -38,7 +38,9 @@ void ChunksController::update( int centerX = floordiv(position.x); int centerY = floordiv(position.z); - generator->update(centerX, centerY, loadDistance); + if (player.isLoadingChunks()) { + generator->update(centerX, centerY, loadDistance); + } int64_t mcstotal = 0; @@ -121,6 +123,12 @@ bool ChunksController::buildLights(const Player& player, const std::shared_ptrfetch(x, z)) { + player.chunks->putChunk(chunk); + } + return; + } auto chunk = level.chunks->create(x, z); player.chunks->putChunk(chunk); auto& chunkFlags = chunk->flags; diff --git a/src/logic/scripting/lua/libs/libplayer.cpp b/src/logic/scripting/lua/libs/libplayer.cpp index 12905e01..7c1c11ce 100644 --- a/src/logic/scripting/lua/libs/libplayer.cpp +++ b/src/logic/scripting/lua/libs/libplayer.cpp @@ -164,6 +164,20 @@ static int l_set_instant_destruction(lua::State* L) { return 0; } +static int l_is_loading_chunks(lua::State* L) { + if (auto player = get_player(L, 1)) { + return lua::pushboolean(L, player->isLoadingChunks()); + } + return 0; +} + +static int l_set_loading_chunks(lua::State* L) { + if (auto player = get_player(L, 1)) { + player->setLoadingChunks(lua::toboolean(L, 2)); + } + return 0; +} + static int l_get_selected_block(lua::State* L) { if (auto player = get_player(L, 1)) { if (player->selection.vox.id == BLOCK_VOID) { @@ -282,6 +296,8 @@ const luaL_Reg playerlib[] = { {"set_infinite_items", lua::wrap}, {"is_instant_destruction", lua::wrap}, {"set_instant_destruction", lua::wrap}, + {"is_loading_chunks", lua::wrap}, + {"set_loading_chunks", lua::wrap}, {"set_selected_slot", lua::wrap}, {"get_selected_block", lua::wrap}, {"get_selected_entity", lua::wrap}, diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index d5493a6e..b20b32e9 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -251,6 +251,14 @@ void Player::setInstantDestruction(bool flag) { instantDestruction = flag; } +bool Player::isLoadingChunks() const { + return loadingChunks; +} + +void Player::setLoadingChunks(bool flag) { + loadingChunks = flag; +} + entityid_t Player::getEntity() const { return eid; } @@ -297,6 +305,7 @@ dv::value Player::serialize() const { root["noclip"] = noclip; root["infinite-items"] = infiniteItems; root["instant-destruction"] = instantDestruction; + root["loading-chunks"] = loadingChunks; root["chosen-slot"] = chosenSlot; root["entity"] = eid; root["inventory"] = inventory->serialize(); @@ -329,7 +338,8 @@ void Player::deserialize(const dv::value& src) { noclip = src["noclip"].asBoolean(); src.at("infinite-items").get(infiniteItems); src.at("instant-destruction").get(instantDestruction); - + src.at("loading-chunks").get(loadingChunks); + setChosenSlot(src["chosen-slot"].asInteger()); eid = src["entity"].asNumber(); diff --git a/src/objects/Player.hpp b/src/objects/Player.hpp index 55f824d6..447b1eab 100644 --- a/src/objects/Player.hpp +++ b/src/objects/Player.hpp @@ -51,6 +51,7 @@ class Player : public Serializable { bool noclip = false; bool infiniteItems = true; bool instantDestruction = true; + bool loadingChunks = true; entityid_t eid; entityid_t selectedEid = 0; public: @@ -97,6 +98,9 @@ public: bool isInstantDestruction() const; void setInstantDestruction(bool flag); + bool isLoadingChunks() const; + void setLoadingChunks(bool flag); + entityid_t getEntity() const; void setEntity(entityid_t eid);