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