diff --git a/res/layouts/pages/404.xml b/res/layouts/pages/404.xml index 1912fc2f..c53262bc 100644 --- a/res/layouts/pages/404.xml +++ b/res/layouts/pages/404.xml @@ -1,4 +1,4 @@ - + diff --git a/res/layouts/pages/add_packs.xml b/res/layouts/pages/add_packs.xml deleted file mode 100644 index e70993a6..00000000 --- a/res/layouts/pages/add_packs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/res/layouts/pages/add_packs.xml.lua b/res/layouts/pages/add_packs.xml.lua deleted file mode 100644 index c27697c3..00000000 --- a/res/layouts/pages/add_packs.xml.lua +++ /dev/null @@ -1,14 +0,0 @@ -function add_pack(packid, packinfo) - local callback = string.format('core.add_packs({%q})', packid) - packinfo.id = packid - packinfo.callback = callback - packinfo.icon = "gui/no_icon" - document.packs_panel:add(gui.template("pack", packinfo)) -end - -function on_open() - local packs = pack.get_available() - for i,id in ipairs(packs) do - add_pack(id, pack.get_info(id)) - end -end diff --git a/res/layouts/pages/content.xml b/res/layouts/pages/content.xml index 82037dfa..d070212d 100644 --- a/res/layouts/pages/content.xml +++ b/res/layouts/pages/content.xml @@ -1,7 +1,13 @@ - - + + - - - + + + + + + + diff --git a/res/layouts/pages/content.xml.lua b/res/layouts/pages/content.xml.lua index e6c88c7c..c0edf7f9 100644 --- a/res/layouts/pages/content.xml.lua +++ b/res/layouts/pages/content.xml.lua @@ -1,19 +1,85 @@ -function add_pack(packid, packinfo) - local remover = '' - if packid ~= "base" then - remover = string.format('core.remove_packs({%q})', packid) +function on_open() + refresh() +end + +-- // FIXME: dependency checks +add_packs = {} +rem_packs = {} + +function apply() + core.reconfig_packs(add_packs, rem_packs) +end + +function refresh_changes() + document.apply_btn.enabled = (#add_packs>0) or (#rem_packs>0) +end + +function move_pack(id) + -- cancel pack addition + if table.has(add_packs, id) then + document["pack_"..id]:move_into(document.packs_add) + table.remove_value(add_packs, id) + -- cancel pack removal + elseif table.has(rem_packs, id) then + document["pack_"..id]:move_into(document.packs_cur) + table.remove_value(rem_packs, id) + -- add pack + elseif table.has(packs_installed, id) then + document["pack_"..id]:move_into(document.packs_add) + table.insert(rem_packs, id) + -- remove pack + else + document["pack_"..id]:move_into(document.packs_cur) + table.insert(add_packs, id) end + refresh_changes() +end + +function place_pack(panel, packid, packinfo, callback) + packinfo.id = packid + callback = callback or "" if packinfo.has_indices then packid = packid.."*" end - packinfo.id = packid - packinfo.remover = remover - document.packs_panel:add(gui.template("pack", packinfo)) + packinfo.id_verbose = packid + packinfo.callback = callback + panel:add(gui.template("pack", packinfo)) end -function on_open() - local packs = pack.get_installed() - for i,id in ipairs(packs) do - add_pack(id, pack.get_info(id)) +function refresh() + packs_installed = pack.get_installed() + packs_available = pack.get_available() + + local packs_cur = document.packs_cur + local packs_add = document.packs_add + + packs_cur:clear() + packs_add:clear() + refresh_changes() + + for i,id in ipairs(packs_installed) do + local packinfo = pack.get_info(id) + packinfo.index = i + callback = id ~= "base" and string.format('move_pack("%s")', id) or nil + place_pack(packs_cur, id, packinfo, callback) + end + + for i,id in ipairs(packs_available) do + local packinfo = pack.get_info(id) + packinfo.index = i + callback = string.format('move_pack("%s")', id) + place_pack(packs_add, id, packinfo, callback) + end + + -- apply packs movements + for i,id in ipairs(packs_installed) do + if table.has(rem_packs, id) then + document["pack_"..id]:move_into(packs_add) + end + end + for i,id in ipairs(packs_available) do + if table.has(add_packs, id) then + document["pack_"..id]:move_into(packs_cur) + end end end diff --git a/res/layouts/templates/pack.xml b/res/layouts/templates/pack.xml index 691c4173..ae637cc0 100644 --- a/res/layouts/templates/pack.xml +++ b/res/layouts/templates/pack.xml @@ -1,6 +1,6 @@ - + - - + diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index faf85909..422a6edb 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -232,6 +232,37 @@ function session.reset_entry(name) session.entries[name] = nil end +function timeit(func, ...) + local tm = time.uptime() + func(...) + print("[time mcs]", (time.uptime()-tm) * 1000000) +end + +function table.has(t, x) + for i,v in ipairs(t) do + if v == x then + return true + end + end + return false +end + +function table.index(t, x) + for i,v in ipairs(t) do + if v == x then + return i + end + end + return -1 +end + +function table.remove_value(t, x) + local index = table.index(t, x) + if index ~= -1 then + table.remove(t, index) + end +end + -- Deprecated functions block_index = block.index block_name = block.name diff --git a/res/texts/de_DE.txt b/res/texts/de_DE.txt index ce6b21ec..0251f395 100644 --- a/res/texts/de_DE.txt +++ b/res/texts/de_DE.txt @@ -13,44 +13,44 @@ error.dependency-not-found=Die verwendete Abhängigkeit wurde nicht gefunden pack.remove-confirm=Alle vom Paket bereitgestellten Inhalte (dauerhaft) aus der Welt löschen? # Меню +menu.Apply=Anwenden +menu.Audio=Klang +menu.Back to Main Menu=Zurück zum Menü +menu.Content Error=Inhaltsfehler +menu.Content=Inhalt +menu.Continue=Weitermachen +menu.Controls=Kontrolle +menu.Create World=Erschaffe eine Welt +menu.missing-content=Fehlender Inhalt! menu.New World=Neue Welt menu.Quit=Ausfahrt -menu.Continue=Weitermachen menu.Save and Quit to Menu=Speichern und zum Menü zurückkehren -menu.missing-content=Fehlender Inhalt! -menu.Content Error=Inhaltsfehler -menu.Controls=Kontrolle -menu.Back to Main Menu=Zurück zum Menü menu.Settings=Einstellungen -menu.Content=Inhalt -menu.Audio=Klang + world.Seed=Mais world.Name=Name - world.World generator=Weltgenerator world.generators.default=Normal world.generators.flat=Wohnung -menu.Create World=Erschaffe eine Welt - +world.Create World=Welt Erschaffen world.convert-request=Es gibt Änderungen in den Indizes! Die Welt bekehren? world.delete-confirm=Die Welt dauerhaft löschen? # Настройки +settings.Ambient=Hintergrund +settings.Backlight=Hintergrundbeleuchtung +settings.Camera Shaking=Wackelnde Kamera +settings.Fog Curve=Nebelkurve +settings.FOV=Sichtlinie +settings.Language=Sprache settings.Load Distance=Ladeentfernung settings.Load Speed=Download-Geschwindigkeit -settings.Fog Curve=Nebelkurve -settings.Backlight=Hintergrundbeleuchtung -settings.V-Sync=Vertikale Synchronisation -settings.Camera Shaking=Wackelnde Kamera settings.Master Volume=Allgemeine Lautstärke +settings.Mouse Sensitivity=Maus-Empfindlichkeit +settings.Music=Musik settings.Regular Sounds=Normale Geräusche settings.UI Sounds=Interface-Sounds -settings.Ambient=Hintergrund -settings.Music=Musik - -settings.FOV=Sichtlinie -settings.Mouse Sensitivity=Maus-Empfindlichkeit -settings.Language=Sprache +settings.V-Sync=Vertikale Synchronisation # Управление movement.forward=Vorwärts diff --git a/res/texts/pl_PL.txt b/res/texts/pl_PL.txt index aebdab1c..39f1a1a7 100644 --- a/res/texts/pl_PL.txt +++ b/res/texts/pl_PL.txt @@ -5,38 +5,53 @@ Ok=OK Cancel=Anulowanie Back=Powrót Continue=Kontynuacja +Add=Dodać +Converting world...=Konwersja świata w toku... error.pack-not-found=Nie udało się znaleźć pakietu # Menu -menu.New World=Nowy Świat -menu.Quit=Wyjście -menu.Continue=Kontynuacja -menu.Save and Quit to Menu=Zapisz i wyjdź do menu -menu.missing-content=Brak treści! -menu.Controls=Zarządzanie +menu.Apply=Zastosować +menu.Audio=Dźwięki menu.Back to Main Menu=Powrót do menu -menu.Settings=Ustawienia menu.Content=Treść +menu.Continue=Kontynuacja +menu.Controls=Zarządzanie +menu.Graphics=Grafika +menu.Create World=Stwórz świat +menu.missing-content=Brakująca treść! +menu.New World=Nowy Świat +menu.Page not found=Strona nie znaleziona +menu.Quit=Wyjście +menu.Save and Quit to Menu=Zapisz i wyjdź do menu +menu.Settings=Ustawienia + world.Seed=Ziarno world.Name=Nazwa -menu.Create World=Stwórz świat - world.World generator=Generator światła world.generators.default=Ekstremalne world.generators.flat=Mieszkanie +world.Create World=Stwórz świat world.convert-request=Szykują się zmiany w indeksach! Przekształcić świat? +world.delete-confirm=Trwale usunąć świat? # Ustawienia +settings.Ambient=Tło +settings.Backlight=Podświetlenie +settings.Camera Shaking=Drżąca kamera +settings.Fog Curve=Krzywa mgły +settings.FOV=Wzrok +settings.Fullscreen=Pełny ekran +settings.Gamma=Gamma +settings.Language=Język settings.Load Distance=Odległość ładowania settings.Load Speed=Prędkość pobierania -settings.Fog Curve=Krzywa mgły -settings.Backlight=Podświetlenie -settings.V-Sync=Synchronizacja pionowa - -settings.FOV=Wzrok +settings.Master Volume=Głośność główna settings.Mouse Sensitivity=Wrażliwość myszy -settings.Language=Język +settings.Music=Muzyka +settings.Regular Sounds=Normalne dźwięki +settings.UI Sounds=Dźwięki interfejsu +settings.V-Sync=Synchronizacja pionowa # Zarządzanie movement.forward=Naprzód diff --git a/res/texts/ru_RU.txt b/res/texts/ru_RU.txt index cd57751a..04ee4e69 100644 --- a/res/texts/ru_RU.txt +++ b/res/texts/ru_RU.txt @@ -13,48 +13,47 @@ error.dependency-not-found=Используемая зависимость не pack.remove-confirm=Удалить весь поставляемый паком/паками контент из мира (безвозвратно)? # Меню -menu.New World=Новый Мир -menu.Quit=Выход -menu.Continue=Продолжить -menu.Save and Quit to Menu=Сохранить и Выйти в Меню -menu.missing-content=Отсутствует Контент! -menu.Page does not exists=Страница не существует +menu.Apply=Применить +menu.Audio=Звук +menu.Back to Main Menu=Вернуться в Меню menu.Content Error=Ошибка Контента +menu.Content=Контент +menu.Continue=Продолжить menu.Controls=Управление menu.Graphics=Графика -menu.Back to Main Menu=Вернуться в Меню +menu.missing-content=Отсутствует Контент! +menu.New World=Новый Мир +menu.Page not found=Страница не найдена +menu.Quit=Выход +menu.Save and Quit to Menu=Сохранить и Выйти в Меню menu.Settings=Настройки -menu.Content=Контент -menu.Audio=Звук + world.Seed=Зерно world.Name=Название - world.World generator=Генератор мира world.generators.default=Обычный world.generators.flat=Плоский world.Create World=Создать Мир - world.convert-request=Есть изменения в индексах! Конвертировать мир? world.delete-confirm=Удалить мир безвозвратно? # Настройки +settings.Ambient=Фон +settings.Backlight=Подсветка +settings.Camera Shaking=Тряска Камеры +settings.Fog Curve=Кривая Тумана +settings.FOV=Поле Зрения +settings.Fullscreen=Полный экран +settings.Gamma=Гамма +settings.Language=Язык settings.Load Distance=Дистанция Загрузки settings.Load Speed=Скорость Загрузки -settings.Fog Curve=Кривая Тумана -settings.Backlight=Подсветка -settings.Gamma=Гамма -settings.Fullscreen=Полноэкранный -settings.V-Sync=Вертикальная Синхронизация -settings.Camera Shaking=Тряска Камеры settings.Master Volume=Общая Громкость +settings.Mouse Sensitivity=Чувствительность Мыши +settings.Music=Музыка settings.Regular Sounds=Обычные Звуки settings.UI Sounds=Звуки Интерфейса -settings.Ambient=Фон -settings.Music=Музыка - -settings.FOV=Поле Зрения -settings.Mouse Sensitivity=Чувствительность Мыши -settings.Language=Язык +settings.V-Sync=Вертикальная Синхронизация # Управление movement.forward=Вперёд diff --git a/res/texts/uk_UA.txt b/res/texts/uk_UA.txt index 4030d650..175c172f 100644 --- a/res/texts/uk_UA.txt +++ b/res/texts/uk_UA.txt @@ -5,19 +5,26 @@ Ok=Гаразд Cancel=Скасувати Back=Назад Continue=Продовжити +Add=Додати +Converting world...=Виконується конвертація світу... error.pack-not-found=Не вдалося знайти пакет # Меню -menu.New World=Новий Світ -menu.Quit=Вихід -menu.Continue=Продовжити -menu.Save and Quit to Menu=Зберегти і Вийти в Меню -menu.missing-content=Відсутній Контент! -menu.Controls=Керування +menu.Apply=Застосувати +menu.Audio=Звук menu.Back to Main Menu=Повернутися до Меню -menu.Settings=Налаштування +menu.Content Error=Помилка Контенту menu.Content=Контент +menu.Continue=Продовжити +menu.Controls=Керування +menu.Graphics=Графіка +menu.missing-content=Відсутній Контент! +menu.New World=Новий Світ +menu.Page not found=Сторінка не знайдена +menu.Quit=Вихід +menu.Save and Quit to Menu=Зберегти і Вийти в Меню +menu.Settings=Налаштування world.Seed=Зерно world.Name=Назва menu.Create World=Створити Світ @@ -28,15 +35,22 @@ world.generators.flat=Плоскі world.convert-request=Є зміни в індексах! Конвертувати світ? # Налаштування +settings.Ambient=Фон +settings.Backlight=Підсвічування +settings.Camera Shaking=Тряска Камери +settings.Fog Curve=Крива Туману +settings.FOV=Поле зору +settings.Fullscreen=Повний екран +settings.Gamma=Гамма +settings.Language=Мова settings.Load Distance=Дистанція Завантаження settings.Load Speed=Швидкість Завантаження -settings.Fog Curve=Крива Туману -settings.Backlight=Підсвічування -settings.V-Sync=Вертикальна Синхронізація - -settings.FOV=Поле зору +settings.Master Volume=Загальна Гучність settings.Mouse Sensitivity=Чутливість Миші -settings.Language=Мова +settings.Music=Музика +settings.Regular Sounds=Звичайні Звуки +settings.UI Sounds=Звуки інтерфейсу +settings.V-Sync=Вертикальна Синхронізація # Керування movement.forward=Уперед diff --git a/res/textures/gui/circle.png b/res/textures/gui/circle.png new file mode 100644 index 00000000..b82a72ee Binary files /dev/null and b/res/textures/gui/circle.png differ diff --git a/res/textures/gui/cross.png b/res/textures/gui/cross.png index 2656b8bc..021a5ef1 100644 Binary files a/res/textures/gui/cross.png and b/res/textures/gui/cross.png differ diff --git a/res/textures/gui/refresh.png b/res/textures/gui/refresh.png new file mode 100644 index 00000000..ffbbb387 Binary files /dev/null and b/res/textures/gui/refresh.png differ diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index 0c8368ba..d626582e 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -184,6 +184,7 @@ void AssetsLoader::addDefaults(AssetsLoader& loader, const Content* content) { loader.add(AssetType::texture, TEXTURES_FOLDER+"/gui/warning", "gui/warning"); loader.add(AssetType::texture, TEXTURES_FOLDER+"/gui/error", "gui/error"); loader.add(AssetType::texture, TEXTURES_FOLDER+"/gui/cross", "gui/cross"); + loader.add(AssetType::texture, TEXTURES_FOLDER+"/gui/refresh", "gui/refresh"); if (content) { loader.processPreloadConfigs(content); diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index e301d5b5..f067989e 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -203,6 +203,9 @@ void Hud::processInput(bool visible) { setPause(true); } } + if (!Window::isFocused() && !pause && !isInventoryOpen()) { + setPause(true); + } if (!pause && visible && Events::jactive(BIND_HUD_INVENTORY)) { if (inventoryOpen) { diff --git a/src/graphics/ui/elements/Container.cpp b/src/graphics/ui/elements/Container.cpp index 579ae8d9..93dead99 100644 --- a/src/graphics/ui/elements/Container.cpp +++ b/src/graphics/ui/elements/Container.cpp @@ -125,6 +125,14 @@ void Container::remove(std::shared_ptr selected) { refresh(); } +void Container::clear() { + for (auto node : nodes) { + node->setParent(nullptr); + } + nodes.clear(); + refresh(); +} + void Container::listenInterval(float interval, ontimeout callback, int repeat) { intervalEvents.push_back({callback, interval, 0.0f, repeat}); } diff --git a/src/graphics/ui/elements/Container.hpp b/src/graphics/ui/elements/Container.hpp index 96a29491..8aa38b2f 100644 --- a/src/graphics/ui/elements/Container.hpp +++ b/src/graphics/ui/elements/Container.hpp @@ -24,6 +24,7 @@ namespace gui { virtual std::shared_ptr getAt(glm::vec2 pos, std::shared_ptr self) override; virtual void add(std::shared_ptr node); virtual void add(std::shared_ptr node, glm::vec2 pos); + virtual void clear(); virtual void remove(std::shared_ptr node); virtual void scrolled(int value) override; virtual void setScrollable(bool flag); diff --git a/src/graphics/ui/elements/Image.cpp b/src/graphics/ui/elements/Image.cpp index d337a2c4..0b2d4945 100644 --- a/src/graphics/ui/elements/Image.cpp +++ b/src/graphics/ui/elements/Image.cpp @@ -22,9 +22,13 @@ void Image::draw(const DrawContext* pctx, Assets* assets) { setSize(glm::vec2(texture->getWidth(), texture->getHeight())); } batch->texture(texture); - batch->setColor(color); + if (enabled) { + batch->setColor(isPressed() ? pressedColor : (hover ? hoverColor : color)); + } else { + batch->setColor({color.r, color.g, color.b, color.a * 0.5f}); + } batch->rect(pos.x, pos.y, size.x, size.y, - 0, 0, 0, UVRegion(), false, true, color); + 0, 0, 0, UVRegion(), false, true, batch->getColor()); } void Image::setAutoResize(bool flag) { diff --git a/src/graphics/ui/elements/Panel.cpp b/src/graphics/ui/elements/Panel.cpp index 2cf1c432..036161ed 100644 --- a/src/graphics/ui/elements/Panel.cpp +++ b/src/graphics/ui/elements/Panel.cpp @@ -52,6 +52,10 @@ void Panel::add(std::shared_ptr node) { void Panel::refresh() { UINode::refresh(); + std::stable_sort(nodes.begin(), nodes.end(), [](auto a, auto b) { + return a->getZIndex() < b->getZIndex(); + }); + float x = padding.x; float y = padding.y; glm::vec2 size = getSize(); diff --git a/src/graphics/ui/elements/UINode.cpp b/src/graphics/ui/elements/UINode.cpp index ca08513e..cd85e265 100644 --- a/src/graphics/ui/elements/UINode.cpp +++ b/src/graphics/ui/elements/UINode.cpp @@ -198,7 +198,18 @@ int UINode::getZIndex() const { return zindex; } -void UINode::lock() { +void UINode::moveInto( + std::shared_ptr node, + std::shared_ptr dest +) { + auto parent = node->getParent(); + if (auto container = dynamic_cast(parent)) { + container->remove(node); + } + if (parent) { + parent->scrolled(0); + } + dest->add(node); } vec2supplier UINode::getPositionFunc() const { diff --git a/src/graphics/ui/elements/UINode.hpp b/src/graphics/ui/elements/UINode.hpp index cc2abf68..236b968d 100644 --- a/src/graphics/ui/elements/UINode.hpp +++ b/src/graphics/ui/elements/UINode.hpp @@ -17,6 +17,7 @@ class Assets; namespace gui { class UINode; class GUI; + class Container; using onaction = std::function; using onnumberchange = std::function; @@ -188,7 +189,10 @@ namespace gui { parent->fullRefresh(); } }; - virtual void lock(); + static void moveInto( + std::shared_ptr node, + std::shared_ptr dest + ); virtual vec2supplier getPositionFunc() const; virtual void setPositionFunc(vec2supplier); diff --git a/src/logic/EngineController.cpp b/src/logic/EngineController.cpp index 889498a6..79670eb1 100644 --- a/src/logic/EngineController.cpp +++ b/src/logic/EngineController.cpp @@ -217,8 +217,9 @@ void EngineController::reopenWorld(World* world) { openWorld(wname, true); } -void EngineController::removePacks( +void EngineController::reconfigPacks( LevelController* controller, + std::vector packsToAdd, std::vector packsToRemove ) { auto content = engine->getContent(); @@ -242,6 +243,9 @@ void EngineController::removePacks( manager.scan(); auto names = PacksManager::getNames(world->getPacks()); + for (const auto& id : packsToAdd) { + names.push_back(id); + } for (const auto& id : packsToRemove) { manager.exclude(id); names.erase(std::find(names.begin(), names.end(), id)); @@ -262,31 +266,3 @@ void EngineController::removePacks( removeFunc(); } } - -void EngineController::addPacks( - LevelController* controller, - std::vector packs -) { - auto level = controller->getLevel(); - auto gui = engine->getGUI(); - auto world = level->getWorld(); - auto new_packs = PacksManager::getNames(world->getPacks()); - for (auto& id : packs) { - new_packs.push_back(id); - } - - auto manager = engine->createPacksManager(world->wfile->getFolder()); - manager.scan(); - try { - new_packs = manager.assembly(new_packs); - } catch (const contentpack_error& err) { - guiutil::alert( - gui, langs::get(L"error.dependency-not-found")+ - L": "+util::str2wstr_utf8(err.getPackId()) - ); - return; - } - world->wfile->writePacks(manager.getAll(new_packs)); - controller->saveWorld(); - reopenWorld(world); -} diff --git a/src/logic/EngineController.hpp b/src/logic/EngineController.hpp index b2aebee0..b1041366 100644 --- a/src/logic/EngineController.hpp +++ b/src/logic/EngineController.hpp @@ -22,14 +22,10 @@ public: /// @param name world name void deleteWorld(std::string name); - void removePacks( - LevelController* controller, - std::vector packs - ); - - void addPacks( + void reconfigPacks( LevelController* controller, - std::vector packs + std::vector packsToAdd, + std::vector packsToRemove ); void createWorld( diff --git a/src/logic/scripting/lua/libcore.cpp b/src/logic/scripting/lua/libcore.cpp index 4cd90244..c6f262a5 100644 --- a/src/logic/scripting/lua/libcore.cpp +++ b/src/logic/scripting/lua/libcore.cpp @@ -8,6 +8,7 @@ #include "../../../frontend/screens/MenuScreen.hpp" #include "../../../logic/LevelController.h" #include "../../../logic/EngineController.hpp" +#include "../../../world/Level.h" #include "../../../window/Events.h" #include "../../../window/Window.h" #include "../../../world/WorldGenerators.h" @@ -37,6 +38,12 @@ static int l_open_world(lua_State* L) { return 0; } +static int l_reopen_world(lua_State* L) { + auto controller = scripting::engine->getController(); + controller->reopenWorld(scripting::level->getWorld()); + return 0; +} + static int l_close_world(lua_State* L) { if (scripting::controller == nullptr) { luaL_error(L, "no world open"); @@ -59,35 +66,30 @@ static int l_delete_world(lua_State* L) { return 0; } -static int l_remove_packs(lua_State* L) { +static int l_reconfig_packs(lua_State* L) { if (!lua_istable(L, 1)) { - luaL_error(L, "strings array expected as an argument"); + luaL_error(L, "strings array expected as the first argument"); } - std::vector packs; - int len = lua_objlen(L, 1); - for (int i = 0; i < len; i++) { - lua_rawgeti(L, -1, i+1); - packs.push_back(lua_tostring(L, -1)); + if (!lua_istable(L, 2)) { + luaL_error(L, "strings array expected as the second argument"); + } + std::vector addPacks; + int addLen = lua_objlen(L, 1); + for (int i = 0; i < addLen; i++) { + lua_rawgeti(L, 1, i+1); + addPacks.push_back(lua_tostring(L, -1)); lua_pop(L, 1); } - auto controller = scripting::engine->getController(); - controller->removePacks(scripting::controller, packs); - return 0; -} -static int l_add_packs(lua_State* L) { - if (!lua_istable(L, 1)) { - luaL_error(L, "strings array expected as an argument"); - } - std::vector packs; - int len = lua_objlen(L, 1); - for (int i = 0; i < len; i++) { - lua_rawgeti(L, -1, i+1); - packs.push_back(lua_tostring(L, -1)); + std::vector remPacks; + int remLen = lua_objlen(L, 2); + for (int i = 0; i < remLen; i++) { + lua_rawgeti(L, 2, i+1); + remPacks.push_back(lua_tostring(L, -1)); lua_pop(L, 1); } auto controller = scripting::engine->getController(); - controller->addPacks(scripting::controller, packs); + controller->reconfigPacks(scripting::controller, addPacks, remPacks); return 0; } @@ -174,10 +176,10 @@ static int l_get_generators(lua_State* L) { const luaL_Reg corelib [] = { {"new_world", lua_wrap_errors}, {"open_world", lua_wrap_errors}, + {"reopen_world", lua_wrap_errors}, {"close_world", lua_wrap_errors}, {"delete_world", lua_wrap_errors}, - {"add_packs", lua_wrap_errors}, - {"remove_packs", lua_wrap_errors}, + {"reconfig_packs", lua_wrap_errors}, {"get_bindings", lua_wrap_errors}, {"get_setting", lua_wrap_errors}, {"set_setting", lua_wrap_errors}, diff --git a/src/logic/scripting/lua/libgui.cpp b/src/logic/scripting/lua/libgui.cpp index 82acf228..6a093da3 100644 --- a/src/logic/scripting/lua/libgui.cpp +++ b/src/logic/scripting/lua/libgui.cpp @@ -27,7 +27,7 @@ using namespace gui; struct DocumentNode { UiDocument* document; - UINode* node; + std::shared_ptr node; }; static DocumentNode getDocumentNode(lua_State* L, const std::string& name, const std::string& nodeName) { @@ -39,7 +39,7 @@ static DocumentNode getDocumentNode(lua_State* L, const std::string& name, const if (node == nullptr) { luaL_error(L, "document '%s' has no element with id '%s'", name.c_str(), nodeName.c_str()); } - return {doc, node.get()}; + return {doc, node}; } static bool getattr(lua_State* L, TrackBar* bar, const std::string& attr) { @@ -137,9 +137,9 @@ static bool getattr(lua_State* L, TextBox* box, const std::string& attr) { return false; } -static DocumentNode getDocumentNode(lua_State* L) { - lua_getfield(L, 1, "docname"); - lua_getfield(L, 1, "name"); +static DocumentNode getDocumentNode(lua_State* L, int idx=1) { + lua_getfield(L, idx, "docname"); + lua_getfield(L, idx, "name"); auto docname = lua_tostring(L, -2); auto name = lua_tostring(L, -1); auto node = getDocumentNode(L, docname, name); @@ -149,14 +149,14 @@ static DocumentNode getDocumentNode(lua_State* L) { static int menu_back(lua_State* L) { auto node = getDocumentNode(L); - auto menu = dynamic_cast(node.node); + auto menu = dynamic_cast(node.node.get()); menu->back(); return 0; } static int menu_reset(lua_State* L) { auto node = getDocumentNode(L); - auto menu = dynamic_cast(node.node); + auto menu = dynamic_cast(node.node.get()); menu->reset(); return 0; } @@ -249,7 +249,7 @@ static bool setattr(lua_State* L, InventoryView* view, const std::string& attr) static int container_add(lua_State* L) { auto docnode = getDocumentNode(L); - auto node = dynamic_cast(docnode.node); + auto node = dynamic_cast(docnode.node.get()); auto xmlsrc = lua_tostring(L, 2); try { auto subnode = guiutil::create(xmlsrc, docnode.document->getEnvironment()); @@ -261,6 +261,14 @@ static int container_add(lua_State* L) { return 0; } +static int container_clear(lua_State* L) { + auto node = getDocumentNode(L, 1); + if (auto container = std::dynamic_pointer_cast(node.node)) { + container->clear(); + } + return 0; +} + static bool getattr(lua_State* L, Container* container, const std::string& attr) { if (container == nullptr) return false; @@ -268,6 +276,9 @@ static bool getattr(lua_State* L, Container* container, const std::string& attr) if (attr == "add") { lua_pushcfunction(L, container_add); return true; + } else if (attr == "clear") { + lua_pushcfunction(L, container_clear); + return true; } return false; } @@ -283,6 +294,13 @@ static bool getattr(lua_State* L, InventoryView* inventory, const std::string& a return false; } +static int uinode_move_into(lua_State* L) { + auto node = getDocumentNode(L, 1); + auto dest = getDocumentNode(L, 2); + UINode::moveInto(node.node, std::dynamic_pointer_cast(dest.node)); + return 0; +} + static int l_gui_getattr(lua_State* L) { auto docname = lua_tostring(L, 1); auto element = lua_tostring(L, 2); @@ -307,23 +325,26 @@ static int l_gui_getattr(lua_State* L) { } else if (attr == "enabled") { lua_pushboolean(L, node->isEnabled()); return 1; + } else if (attr == "move_into") { + lua_pushcfunction(L, uinode_move_into); + return 1; } - if (getattr(L, dynamic_cast(node), attr)) + if (getattr(L, dynamic_cast(node.get()), attr)) return 1; - if (getattr(L, dynamic_cast(node), attr)) + if (getattr(L, dynamic_cast(node.get()), attr)) return 1; - if (getattr(L, dynamic_cast(node), attr)) + if (getattr(L, dynamic_cast(node.get()), attr)) return 1; - if (getattr(L, dynamic_cast(node), attr)) + if (getattr(L, dynamic_cast(node.get()), attr)) return 1; - if (getattr(L, dynamic_cast(node), attr)) + if (getattr(L, dynamic_cast(node.get()), attr)) return 1; - if (getattr(L, dynamic_cast(node), attr)) + if (getattr(L, dynamic_cast(node.get()), attr)) return 1; - if (getattr(L, dynamic_cast(node), attr)) + if (getattr(L, dynamic_cast(node.get()), attr)) return 1; - if (getattr(L, dynamic_cast(node), attr)) + if (getattr(L, dynamic_cast(node.get()), attr)) return 1; return 0; @@ -356,19 +377,19 @@ static int l_gui_setattr(lua_State* L) { } else if (attr == "enabled") { node->setEnabled(lua_toboolean(L, 4)); } else { - if (setattr(L, dynamic_cast(node), attr)) + if (setattr(L, dynamic_cast(node.get()), attr)) return 0; - if (setattr(L, dynamic_cast(node), attr)) + if (setattr(L, dynamic_cast(node.get()), attr)) return 0; - if (setattr(L, dynamic_cast(node), attr)) + if (setattr(L, dynamic_cast(node.get()), attr)) return 0; - if (setattr(L, dynamic_cast(node), attr)) + if (setattr(L, dynamic_cast(node.get()), attr)) return 0; - if (setattr(L, dynamic_cast(node), attr)) + if (setattr(L, dynamic_cast(node.get()), attr)) return 0; - if (setattr(L, dynamic_cast(node), attr)) + if (setattr(L, dynamic_cast(node.get()), attr)) return 0; - if (setattr(L, dynamic_cast(node), attr)) + if (setattr(L, dynamic_cast(node.get()), attr)) return 0; } return 0; diff --git a/src/settings.h b/src/settings.h index cad7934e..28e3b780 100644 --- a/src/settings.h +++ b/src/settings.h @@ -61,7 +61,7 @@ struct GraphicsSettings { /// @brief Enable blocks backlight to prevent complete darkness FlagSetting backlight {true}; /// @brief Enable chunks frustum culling - FlagSetting frustumCulling {true}; // redutant? + FlagSetting frustumCulling {true}; IntegerSetting skyboxResolution {64 + 32, 64, 128}; };