From fbca439b2da5a236a122c29488dc8809044ae919 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 15 Oct 2024 05:24:52 +0300 Subject: [PATCH] fix: extended block always main segment passed to on_iteract --- src/logic/PlayerController.cpp | 2 +- src/logic/scripting/lua/libs/libblock.cpp | 11 +++++++++++ src/voxels/Chunks.cpp | 4 +++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index d567c374..35d92b95 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -423,7 +423,7 @@ void PlayerController::processRightClick(const Block& def, const Block& target) if (!input.shift && target.rt.funcsset.oninteract) { if (scripting::on_block_interact( - player.get(), target, selection.position + player.get(), target, selection.actualPosition )) { return; } diff --git a/src/logic/scripting/lua/libs/libblock.cpp b/src/logic/scripting/lua/libs/libblock.cpp index df388fea..f7fb4209 100644 --- a/src/logic/scripting/lua/libs/libblock.cpp +++ b/src/logic/scripting/lua/libs/libblock.cpp @@ -211,6 +211,7 @@ static int l_get_user_bits(lua::State* L) { auto x = lua::tointeger(L, 1); auto y = lua::tointeger(L, 2); auto z = lua::tointeger(L, 3); + auto offset = lua::tointeger(L, 4) + VOXEL_USER_BITS_OFFSET; auto bits = lua::tointeger(L, 5); @@ -218,6 +219,11 @@ static int l_get_user_bits(lua::State* L) { if (vox == nullptr) { return lua::pushinteger(L, 0); } + const auto& def = content->getIndices()->blocks.require(vox->id); + if (def.rt.extended) { + auto origin = level->chunks->seekOrigin({x, y, z}, def, vox->state); + vox = level->chunks->get(origin.x, origin.y, origin.z); + } uint mask = ((1 << bits) - 1) << offset; uint data = (blockstate2int(vox->state) & mask) >> offset; return lua::pushinteger(L, data); @@ -241,6 +247,11 @@ static int l_set_user_bits(lua::State* L) { if (vox == nullptr) { return 0; } + const auto& def = content->getIndices()->blocks.require(vox->id); + if (def.rt.extended) { + auto origin = level->chunks->seekOrigin({x, y, z}, def, vox->state); + vox = level->chunks->get(origin); + } vox->state.userbits = (vox->state.userbits & (~mask)) | value; chunk->setModifiedAndUnsaved(); return 0; diff --git a/src/voxels/Chunks.cpp b/src/voxels/Chunks.cpp index df00d72f..9021d4d1 100644 --- a/src/voxels/Chunks.cpp +++ b/src/voxels/Chunks.cpp @@ -337,7 +337,9 @@ void Chunks::setRotation(int32_t x, int32_t y, int32_t z, uint8_t index) { return; } if (def.rt.extended) { - setRotationExtended(def, vox->state, {x, y, z}, index); + auto origin = seekOrigin({x, y, z}, def, vox->state); + vox = get(origin); + setRotationExtended(def, vox->state, origin, index); } else { vox->state.rotation = index; auto chunk = getChunkByVoxel(x, y, z);