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/en/scripting/builtins/libmat4.md b/doc/en/scripting/builtins/libmat4.md index e652d2aa..0c4b437e 100644 --- a/doc/en/scripting/builtins/libmat4.md +++ b/doc/en/scripting/builtins/libmat4.md @@ -111,7 +111,7 @@ mat4.decompose(m: matrix) translation=vec3, skew=vec3, perspective=vec4 -} +} or nil ``` ## Look at point - *mat4.look_at(...)* 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/doc/ru/scripting/builtins/libmat4.md b/doc/ru/scripting/builtins/libmat4.md index e30ca0b6..e6f3a3b1 100644 --- a/doc/ru/scripting/builtins/libmat4.md +++ b/doc/ru/scripting/builtins/libmat4.md @@ -111,7 +111,7 @@ mat4.decompose(m: matrix) translation=vec3, skew=vec3, perspective=vec4 -} +} или nil ``` ## Отслеживание точки *mat4.look_at(...)* diff --git a/res/scripts/stdcmd.lua b/res/scripts/stdcmd.lua index 61dccba8..95ba2639 100644 --- a/res/scripts/stdcmd.lua +++ b/res/scripts/stdcmd.lua @@ -69,6 +69,21 @@ console.add_command( end ) +local function FormattedTime(seconds, format ) -- from gmod + if not seconds then seconds = 0 end + + local hours = math.floor(seconds / 3600) + local minutes = math.floor((seconds / 60) % 60) + local millisecs = (seconds - math.floor(seconds)) * 100 + seconds = math.floor(seconds % 60) + + if format then + return string.format(format, minutes, seconds, millisecs) + else + return {h = hours, m = minutes, s = seconds, ms = millisecs} + end +end + console.add_command( "time.uptime", "Get time elapsed since the engine started", @@ -76,7 +91,7 @@ console.add_command( local uptime = time.uptime() local formatted_uptime = "" - local t = string.formatted_time(uptime) + local t = FormattedTime(uptime) formatted_uptime = t.h .. "h " .. t.m .. "m " .. t.s .. "s" 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 [] = { diff --git a/src/logic/scripting/lua/libmat4.cpp b/src/logic/scripting/lua/libmat4.cpp index 8eaa3695..9ab0dde2 100644 --- a/src/logic/scripting/lua/libmat4.cpp +++ b/src/logic/scripting/lua/libmat4.cpp @@ -165,7 +165,7 @@ static int l_transpose(lua::State* L) { /// translation=float[3], /// skew=float[3], /// perspective=float[4] -/// } +/// } or nil static int l_decompose(lua::State* L) { auto matrix = lua::tomat4(L, 1); glm::vec3 scale; @@ -173,35 +173,36 @@ static int l_decompose(lua::State* L) { glm::vec3 translation; glm::vec3 skew; glm::vec4 perspective; - glm::decompose( + if (glm::decompose( matrix, scale, rotation, translation, skew, perspective - ); + )) { + lua::createtable(L, 0, 6); + + lua::pushvec3(L, scale); + lua::setfield(L, "scale"); - lua::createtable(L, 0, 6); - - lua::pushvec3(L, scale); - lua::setfield(L, "scale"); + lua::pushmat4(L, glm::toMat4(rotation)); + lua::setfield(L, "rotation"); - lua::pushmat4(L, glm::toMat4(rotation)); - lua::setfield(L, "rotation"); + lua::pushquat(L, rotation); + lua::setfield(L, "quaternion"); - lua::pushquat(L, rotation); - lua::setfield(L, "quaternion"); + lua::pushvec3(L, translation); + lua::setfield(L, "translation"); - lua::pushvec3(L, translation); - lua::setfield(L, "translation"); + lua::pushvec3(L, skew); + lua::setfield(L, "skew"); - lua::pushvec3(L, skew); - lua::setfield(L, "skew"); - - lua::pushvec4(L, perspective); - lua::setfield(L, "perspective"); - return 1; + lua::pushvec4(L, perspective); + lua::setfield(L, "perspective"); + return 1; + } + return 0; } static int l_look_at(lua::State* L) {