fix: extended block always main segment passed to on_iteract

This commit is contained in:
MihailRis 2024-10-15 05:24:52 +03:00
parent d59fac61bb
commit fbca439b2d
3 changed files with 15 additions and 2 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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);