diff --git a/doc/en/scripting/builtins/libblock.md b/doc/en/scripting/builtins/libblock.md index 6346f9d2..2c2c0182 100644 --- a/doc/en/scripting/builtins/libblock.md +++ b/doc/en/scripting/builtins/libblock.md @@ -34,10 +34,10 @@ block.place(x: int, y: int, z: int, id: int, states: int, [optional] playerid: i block.destruct(x: int, y: int, z: int, playerid: int) -- Compose the complete state as an integer -block.compose_state(rotation: int, segment: int, userbits: int) -> int +block.compose_state(state: {rotation: int, segment: int, userbits: int}) -> int -- Decompose the complete state into: rotation, segment, user bits -block.decompose_state(state: int) -> int, int, int +block.decompose_state(state: int) -> {int, int, int} ``` > [!WARNING] diff --git a/doc/ru/scripting/builtins/libblock.md b/doc/ru/scripting/builtins/libblock.md index c89cc5c5..d4d28a28 100644 --- a/doc/ru/scripting/builtins/libblock.md +++ b/doc/ru/scripting/builtins/libblock.md @@ -33,10 +33,10 @@ block.place(x: int, y: int, z: int, id: int, states: int, [optional] playerid: i block.destruct(x: int, y: int, z: int, playerid: int) -- Собирает полное состояние в виде целого числа -block.compose_state(rotation: int, segment: int, userbits: int) -> int +block.compose_state(state: {rotation: int, segment: int, userbits: int}) -> int -- Разбирает полное состояние на: вращение, сегмент, пользовательские биты -block.decompose_state(state: int) -> int, int, int +block.decompose_state(state: int) -> {int, int, int} ``` > [!WARNING] diff --git a/src/logic/scripting/lua/libblock.cpp b/src/logic/scripting/lua/libblock.cpp index af2863b0..0d24db89 100644 --- a/src/logic/scripting/lua/libblock.cpp +++ b/src/logic/scripting/lua/libblock.cpp @@ -381,20 +381,32 @@ static int l_raycast(lua::State* L) { } static int l_compose_state(lua::State* L) { + if (lua::istable(L, 1) || lua::objlen(L, 1) < 3) { + throw std::runtime_error("expected array of 3 integers"); + } blockstate state {}; - state.rotation = lua::tointeger(L, 1); - state.segment = lua::tointeger(L, 2); - state.userbits = lua::tointeger(L, 3); + + lua::rawgeti(L, 1, 1); state.rotation = lua::tointeger(L, -1); lua::pop(L); + lua::rawgeti(L, 2, 1); state.segment = lua::tointeger(L, -1); lua::pop(L); + lua::rawgeti(L, 3, 1); state.userbits = lua::tointeger(L, -1); lua::pop(L); + return lua::pushinteger(L, blockstate2int(state)); } static int l_decompose_state(lua::State* L) { auto stateInt = static_cast(lua::tointeger(L, 1)); auto state = int2blockstate(stateInt); + + lua::createtable(L, 3, 0); lua::pushinteger(L, state.rotation); + lua::rawseti(L, 1); + lua::pushinteger(L, state.segment); + lua::rawseti(L, 2); + lua::pushinteger(L, state.userbits); - return 3; + lua::rawseti(L, 3); + return 1; } const luaL_Reg blocklib [] = {