diff --git a/src/logic/scripting/lua/libblock.cpp b/src/logic/scripting/lua/libblock.cpp index a4380751..0bc509fc 100644 --- a/src/logic/scripting/lua/libblock.cpp +++ b/src/logic/scripting/lua/libblock.cpp @@ -156,7 +156,7 @@ int l_set_block_rotation(lua_State* L) { return 0; } vox->state.rotation = value; - scripting::level->chunks->getChunkByVoxel(x, y, z)->setModified(true); + scripting::level->chunks->getChunkByVoxel(x, y, z)->setModifiedAndUnsaved(); return 0; } @@ -182,7 +182,7 @@ int l_set_block_states(lua_State* L) { } voxel* vox = scripting::level->chunks->get(x, y, z); vox->state = int2blockstate(states); - chunk->setModified(true); + chunk->setModifiedAndUnsaved(); return 0; } @@ -214,12 +214,17 @@ int l_set_block_user_bits(lua_State* L) { size_t mask = ((1 << bits) - 1) << offset; lua_Integer value = (lua_tointeger(L, 6) << offset) & mask; + Chunk* chunk = scripting::level->chunks->getChunkByVoxel(x, y, z); + if (chunk == nullptr) { + return 0; + } voxel* vox = scripting::level->chunks->get(x, y, z); if (vox == nullptr) { return 0; } vox->state.userbits = (vox->state.userbits & (~mask)) | value; - return 0; + chunk->setModifiedAndUnsaved(); + return 0; } int l_is_replaceable_at(lua_State* L) { diff --git a/src/voxels/Chunk.hpp b/src/voxels/Chunk.hpp index 0cab4025..29b4916c 100644 --- a/src/voxels/Chunk.hpp +++ b/src/voxels/Chunk.hpp @@ -79,6 +79,11 @@ public: inline void setModified(bool newState) {setFlags(ChunkFlag::MODIFIED, newState);} + inline void setModifiedAndUnsaved() { + setModified(true); + setUnsaved(true); + } + inline void setLoaded(bool newState) {setFlags(ChunkFlag::LOADED, newState);} inline void setLoadedLights(bool newState) {setFlags(ChunkFlag::LOADED_LIGHTS, newState);} diff --git a/src/voxels/Chunks.cpp b/src/voxels/Chunks.cpp index 2504e0b1..9b1dbc73 100644 --- a/src/voxels/Chunks.cpp +++ b/src/voxels/Chunks.cpp @@ -179,9 +179,7 @@ void Chunks::set(int32_t x, int32_t y, int32_t z, uint32_t id, blockstate state) chunk->removeBlockInventory(lx, y, lz); vox.id = id; vox.state = state; - - chunk->setUnsaved(true); - chunk->setModified(true); + chunk->setModifiedAndUnsaved(); if (y < chunk->bottom) chunk->bottom = y; else if (y + 1 > chunk->top) chunk->top = y + 1; diff --git a/src/voxels/voxel.hpp b/src/voxels/voxel.hpp index 03647727..d7062b36 100644 --- a/src/voxels/voxel.hpp +++ b/src/voxels/voxel.hpp @@ -19,10 +19,10 @@ struct blockstate { static_assert (sizeof(blockstate) == 2); inline constexpr blockstate_t blockstate2int(blockstate b) { - return b.rotation | - (b.segment << 3) | - (b.reserved << 5) | - (b.userbits << 8); + return static_cast(b.rotation) | + static_cast(b.segment) << 3 | + static_cast(b.reserved) << 5 | + static_cast(b.userbits) << 8; } inline constexpr blockstate int2blockstate(blockstate_t i) {