diff --git a/doc/en/scripting/builtins/libhud.md b/doc/en/scripting/builtins/libhud.md index 4beb5d93..963e428c 100644 --- a/doc/en/scripting/builtins/libhud.md +++ b/doc/en/scripting/builtins/libhud.md @@ -24,7 +24,9 @@ hud.open_block(x: int, y: int, z: int) -> int, str ```lua -- Show overlay with layout specified. -- Shows player inventory also if playerinv is true. -hud.show_overlay(layoutid: str, playerinv: bool) +-- Using `args` you can specify an array of parameter values ​​that will be passed +-- to on_open of the overlay being shown. +hud.show_overlay(layoutid: str, playerinv: bool, [optional] args: table) -- Add element to the screen. -- The element will be removed on world close only. diff --git a/doc/ru/scripting/builtins/libhud.md b/doc/ru/scripting/builtins/libhud.md index ae5a69c3..4bf14d99 100644 --- a/doc/ru/scripting/builtins/libhud.md +++ b/doc/ru/scripting/builtins/libhud.md @@ -25,7 +25,9 @@ hud.open_block(x: int, y: int, z: int) -> int, str ```lua -- Показывает элемент в режиме оверлея. -- Также показывает инвентарь игрока, если playerinv - **true**. -hud.show_overlay(layoutid: str, playerinv: bool) +-- Через args можно указать массив значений параметров, что будут переданы +-- в on_open показываемого оверлея. +hud.show_overlay(layoutid: str, playerinv: bool, [опционально] args: table) -- Добавляет постоянный элемент на экран. Элемент не удаляется при -- закрытии инвентаря. Чтобы не перекрывать затенение в режиме diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 889b102f..f81a4c26 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -233,7 +233,7 @@ void Hud::processInput(bool visible) { showOverlay( assets->get("core:console"), false, - std::string("console") + dv::list({std::string("console")}) ); } if (!Window::isFocused() && !pause && !isInventoryOpen()) { @@ -470,7 +470,7 @@ void Hud::showExchangeSlot() { } void Hud::showOverlay( - UiDocument* doc, bool playerInventory, const dv::value& arg + UiDocument* doc, bool playerInventory, const dv::value& args ) { if (isInventoryOpen()) { closeInventory(); @@ -483,7 +483,7 @@ void Hud::showOverlay( inventoryOpen = true; } add(HudElement(hud_element_mode::inventory_bound, doc, secondUI, false), - arg); + args); } void Hud::openPermanent(UiDocument* doc) { @@ -515,13 +515,18 @@ void Hud::closeInventory() { cleanup(); } -void Hud::add(const HudElement& element, const dv::value& arg) { +void Hud::add(const HudElement& element, const dv::value& argsArray) { gui->add(element.getNode()); auto document = element.getDocument(); if (document) { auto invview = std::dynamic_pointer_cast(element.getNode()); auto inventory = invview ? invview->getInventory() : nullptr; - std::vector args {arg}; + std::vector args; + if (argsArray != nullptr) { + for (const auto& arg : argsArray) { + args.push_back(arg); + } + } args.emplace_back(inventory ? inventory.get()->getId() : 0); for (int i = 0; i < 3; i++) { args.emplace_back(static_cast(blockPos[i])); diff --git a/src/logic/scripting/lua/libs/libhud.cpp b/src/logic/scripting/lua/libs/libhud.cpp index 17e1211a..460cf66b 100644 --- a/src/logic/scripting/lua/libs/libhud.cpp +++ b/src/logic/scripting/lua/libs/libhud.cpp @@ -98,7 +98,8 @@ static int l_show_overlay(lua::State* L) { if (layout == nullptr) { throw std::runtime_error("there is no ui layout " + util::quote(name)); } - hud->showOverlay(layout, playerInventory); + auto args = lua::tovalue(L, 3); + hud->showOverlay(layout, playerInventory, std::move(args)); return 0; } @@ -188,4 +189,5 @@ const luaL_Reg hudlib[] = { {"_is_content_access", lua::wrap}, {"_set_content_access", lua::wrap}, {"_set_debug_cheats", lua::wrap}, - {NULL, NULL}}; + {NULL, NULL} +};