From 90ed175915bc3e81218da8cb59268ae5895486f1 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 9 Jun 2024 19:54:34 +0300 Subject: [PATCH] feat: extended blocks rotation --- res/content/base/blocks/door.json | 4 +- res/content/base/preload.json | 6 ++ res/content/base/scripts/door.lua | 13 +++ res/content/base/sounds/blocks/door_close.ogg | Bin 0 -> 10119 bytes res/content/base/sounds/blocks/door_open.ogg | Bin 0 -> 12073 bytes src/logic/scripting/lua/libblock.cpp | 7 +- src/voxels/Chunks.cpp | 88 +++++++++++++++++- src/voxels/Chunks.hpp | 4 +- 8 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 res/content/base/preload.json create mode 100644 res/content/base/scripts/door.lua create mode 100644 res/content/base/sounds/blocks/door_close.ogg create mode 100644 res/content/base/sounds/blocks/door_open.ogg diff --git a/res/content/base/blocks/door.json b/res/content/base/blocks/door.json index 2cc23144..fd134355 100644 --- a/res/content/base/blocks/door.json +++ b/res/content/base/blocks/door.json @@ -11,7 +11,7 @@ "light-passing": true, "sky-light-passing": true, "size": [1, 2, 1], - "rotation": "pipe", + "rotation": "pane", "model": "aabb", - "hitbox": [0.0, 0.0, 0.8, 1.0, 2.0, 0.2] + "hitbox": [0.0, 0.0, 0.0, 1.0, 2.0, 0.2] } diff --git a/res/content/base/preload.json b/res/content/base/preload.json new file mode 100644 index 00000000..801938a6 --- /dev/null +++ b/res/content/base/preload.json @@ -0,0 +1,6 @@ +{ + "sounds": [ + "blocks/door_open", + "blocks/door_close" + ] +} diff --git a/res/content/base/scripts/door.lua b/res/content/base/scripts/door.lua new file mode 100644 index 00000000..b922464d --- /dev/null +++ b/res/content/base/scripts/door.lua @@ -0,0 +1,13 @@ +function on_interact(x, y, z) + local inc = 1 + if block.get_user_bits(x, y, z, 0, 1) > 0 then + inc = 3 + block.set_user_bits(x, y, z, 0, 1, 0) + audio.play_sound("blocks/door_close", x+0.5, y+1, z+0.5, 1, 1) + else + block.set_user_bits(x, y, z, 0, 1, 1) + audio.play_sound("blocks/door_open", x+0.5, y+1, z+0.5, 1, 1) + end + block.set_rotation(x, y, z, (block.get_rotation(x, y, z) + inc) % 4) + return true +end diff --git a/res/content/base/sounds/blocks/door_close.ogg b/res/content/base/sounds/blocks/door_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..53ead574012e0a8445c8f9b63941d9a0ae5c817d GIT binary patch literal 10119 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, y, z); - if (vox == nullptr) { - return 0; - } - vox->state.rotation = value; - scripting::level->chunks->getChunkByVoxel(x, y, z)->setModifiedAndUnsaved(); + scripting::level->chunks->setRotation(x, y, z, value); return 0; } diff --git a/src/voxels/Chunks.cpp b/src/voxels/Chunks.cpp index 9c09de7d..61c70058 100644 --- a/src/voxels/Chunks.cpp +++ b/src/voxels/Chunks.cpp @@ -200,6 +200,10 @@ void Chunks::eraseSegments(const Block* def, blockstate state, int x, int y, int } } +static constexpr uint8_t segment_to_int(int sx, int sy, int sz) { + return ((sx > 0) | ((sy > 0) << 1) | ((sz > 0) << 2)); +} + void Chunks::repairSegments(const Block* def, blockstate state, int x, int y, int z) { const auto& rotation = def->rotations.variants[state.rotation]; const auto id = def->rt.id; @@ -211,7 +215,7 @@ void Chunks::repairSegments(const Block* def, blockstate state, int x, int y, in continue; } blockstate segState = state; - segState.segment = ((sx > 0) | ((sy > 0) << 1) | ((sz > 0) << 2)); + segState.segment = segment_to_int(sx, sy, sz); glm::ivec3 pos(x, y, z); pos += rotation.axisX * sx; @@ -223,14 +227,14 @@ void Chunks::repairSegments(const Block* def, blockstate state, int x, int y, in } } -bool Chunks::checkReplaceability(const Block* def, blockstate state, glm::ivec3 origin) { +bool Chunks::checkReplaceability(const Block* def, blockstate state, glm::ivec3 origin, blockid_t ignore) { const auto& rotation = def->rotations.variants[state.rotation]; const auto size = def->size; for (int sy = 0; sy < size.y; sy++) { for (int sz = 0; sz < size.z; sz++) { for (int sx = 0; sx < size.x; sx++) { blockstate segState = state; - segState.segment = ((sx > 0) | ((sy > 0) << 1) | ((sz > 0) << 2)); + segState.segment = segment_to_int(sx, sy, sz); auto pos = origin; pos += rotation.axisX * sx; @@ -238,7 +242,7 @@ bool Chunks::checkReplaceability(const Block* def, blockstate state, glm::ivec3 pos += rotation.axisZ * sz; if (auto vox = get(pos.x, pos.y, pos.z)) { auto target = indices->getBlockDef(vox->id); - if (!target->replaceable) { + if (!target->replaceable && vox->id != ignore) { return false; } } else { @@ -250,6 +254,82 @@ bool Chunks::checkReplaceability(const Block* def, blockstate state, glm::ivec3 return true; } +void Chunks::setRotationExtended( + Block* def, blockstate state, glm::ivec3 origin, uint8_t index +) { + auto newstate = state; + newstate.rotation = index; + + // unable to rotate block (cause: obstacles) + if (!checkReplaceability(def, newstate, origin, def->rt.id)) { + return; + } + + const auto& rotation = def->rotations.variants[index]; + const auto size = def->size; + std::vector segmentBlocks; + + for (int sy = 0; sy < size.y; sy++) { + for (int sz = 0; sz < size.z; sz++) { + for (int sx = 0; sx < size.x; sx++) { + auto pos = origin; + pos += rotation.axisX * sx; + pos += rotation.axisY * sy; + pos += rotation.axisZ * sz; + + blockstate segState = newstate; + segState.segment = segment_to_int(sx, sy, sz); + + auto vox = get(pos); + // checked for nullptr by checkReplaceability + if (vox->id != def->rt.id) { + set(pos.x, pos.y, pos.z, def->rt.id, segState); + } else { + vox->state = segState; + auto chunk = getChunkByVoxel(pos.x, pos.y, pos.z); + chunk->setModifiedAndUnsaved(); + segmentBlocks.emplace_back(pos); + } + } + } + } + const auto& prevRotation = def->rotations.variants[state.rotation]; + for (int sy = 0; sy < size.y; sy++) { + for (int sz = 0; sz < size.z; sz++) { + for (int sx = 0; sx < size.x; sx++) { + auto pos = origin; + pos += prevRotation.axisX * sx; + pos += prevRotation.axisY * sy; + pos += prevRotation.axisZ * sz; + if (std::find(segmentBlocks.begin(), segmentBlocks.end(), pos) == segmentBlocks.end()) { + set(pos.x, pos.y, pos.z, 0, {}); + } + } + } + } +} + +void Chunks::setRotation(int32_t x, int32_t y, int32_t z, uint8_t index) { + if (index >= BlockRotProfile::MAX_COUNT) { + return; + } + auto vox = get(x, y, z); + if (vox == nullptr) { + return; + } + auto def = indices->getBlockDef(vox->id); + if (!def->rotatable || vox->state.rotation == index) { + return; + } + if (def->rt.extended) { + setRotationExtended(def, vox->state, {x, y, z}, index); + } else { + vox->state.rotation = index; + auto chunk = getChunkByVoxel(x, y, z); + chunk->setModifiedAndUnsaved(); + } +} + void Chunks::set(int32_t x, int32_t y, int32_t z, uint32_t id, blockstate state) { if (y < 0 || y >= CHUNK_H) { return; diff --git a/src/voxels/Chunks.hpp b/src/voxels/Chunks.hpp index fc2438c9..54b20b29 100644 --- a/src/voxels/Chunks.hpp +++ b/src/voxels/Chunks.hpp @@ -25,6 +25,7 @@ class Chunks { void eraseSegments(const Block* def, blockstate state, int x, int y, int z); void repairSegments(const Block* def, blockstate state, int x, int y, int z); + void setRotationExtended(Block* def, blockstate state, glm::ivec3 origin, uint8_t rotation); public: std::vector> chunks; std::vector> chunksSecond; @@ -40,7 +41,7 @@ public: WorldFiles* worldFiles, LevelEvents* events, const Content* content); ~Chunks() = default; - bool checkReplaceability(const Block* def, blockstate state, glm::ivec3 coord); + bool checkReplaceability(const Block* def, blockstate state, glm::ivec3 coord, blockid_t ignore=0); bool putChunk(const std::shared_ptr& chunk); Chunk* getChunk(int32_t x, int32_t z); @@ -55,6 +56,7 @@ public: ubyte getLight(int32_t x, int32_t y, int32_t z, int channel); void set(int32_t x, int32_t y, int32_t z, uint32_t id, blockstate state); glm::ivec3 seekOrigin(glm::ivec3 pos, const Block* def, blockstate state); + void setRotation(int32_t x, int32_t y, int32_t z, uint8_t rotation); voxel* rayCast( glm::vec3 start,