diff --git a/doc/en/world-generator.md b/doc/en/world-generator.md index cce303a44..cd868b404 100644 --- a/doc/en/world-generator.md +++ b/doc/en/world-generator.md @@ -416,7 +416,7 @@ Structure: Where: - structure_name - a string containing the name of the structure, registered in structures.toml. -- structure_position - a vec3 (an array of three numbers) relative to the position of the chunk. +- structure_position - a vec3 (an array of three numbers). - rotation - a number from 0 to 3 indicating the rotation of the structure along the Y axis. - priority - a number determining the order in which structures are placed. Structures with lower priority are overlapped by structures with higher priority. diff --git a/doc/ru/world-generator.md b/doc/ru/world-generator.md index e22920a1e..30e4b1098 100644 --- a/doc/ru/world-generator.md +++ b/doc/ru/world-generator.md @@ -419,7 +419,7 @@ end Где: - имя_структуры - строка содержащая имя структуры, зарегистрированная в structures.toml. -- позиция_структуры - vec3 (массив из трех чисел) относительно позиции чанка. +- позиция_структуры - vec3 (массив из трех чисел). - поворот - число от 0 до 3 обозначающая поворот структуры по оси Y. - приоритет - число определяющее порядок установки структур. Структуры с меньшем приоритетом перекрываются структурами с большим. diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index 774fa1a00..23b316e6b 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -287,7 +287,7 @@ void AssetsLoader::addDefaults(AssetsLoader& loader, const Content* content) { for (const auto& file : io::directory_iterator(skeletonsDir)) { loader.add( AssetType::SKELETON, - file.string(), + (file.parent() / file.stem()).string(), entry.first + ":" + file.stem() ); } diff --git a/src/assets/assetload_funcs.cpp b/src/assets/assetload_funcs.cpp index 6a301ec62..74a298933 100644 --- a/src/assets/assetload_funcs.cpp +++ b/src/assets/assetload_funcs.cpp @@ -455,7 +455,8 @@ assetload::postfunc assetload::skeleton( const std::shared_ptr& settings ) { return [=](auto assets) { - std::string text = io::read_string(file); + auto path = paths.find(file + ".json"); + std::string text = io::read_string(path); auto skeleton = rigging::SkeletonConfig::parse(text, file, name); for (auto& bone : skeleton->getBones()) { std::string model = bone->model.name; diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index 737742afd..452fc3111 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -173,7 +173,7 @@ void LevelScreen::saveWorldPreview() { int previewSize = settings.ui.worldPreviewSize.get(); // camera special copy for world preview - Camera& camera = *player.fpCamera; + Camera camera = *player.fpCamera; camera.setFov(glm::radians(70.0f)); DrawContext pctx(nullptr, engine.getWindow(), batch.get()); diff --git a/src/graphics/render/TextsRenderer.cpp b/src/graphics/render/TextsRenderer.cpp index 0f9d32285..ed822fc9f 100644 --- a/src/graphics/render/TextsRenderer.cpp +++ b/src/graphics/render/TextsRenderer.cpp @@ -71,10 +71,9 @@ void TextsRenderer::renderNote( if (preset.displayMode == NoteDisplayMode::PROJECTED) { float scale = 1.0f; if (glm::abs(preset.perspective) > 0.0001f) { - float scale2 = scale / - (glm::distance(camera.position, pos) * - util::sqr(camera.zoom) * - glm::sqrt(glm::tan(camera.getFov() * 0.5f))); + float scale2 = + scale / (glm::distance(camera.position, pos) * camera.zoom * + glm::sqrt(glm::tan(camera.getFov() * 0.5f))); scale = scale2 * preset.perspective + scale * (1.0f - preset.perspective); } diff --git a/src/graphics/ui/gui_util.cpp b/src/graphics/ui/gui_util.cpp index 6c240e601..13364b0ed 100644 --- a/src/graphics/ui/gui_util.cpp +++ b/src/graphics/ui/gui_util.cpp @@ -12,6 +12,9 @@ #include "gui_xml.hpp" #include "logic/scripting/scripting.hpp" #include "util/stringutil.hpp" +#include "debug/Logger.hpp" + +debug::Logger logger("gui-util"); using namespace gui; @@ -25,6 +28,20 @@ std::shared_ptr guiutil::create( return reader.readXML("[string]", source); } +static bool notify_callback(const runnable& callback, std::string_view name) { + if (callback == nullptr) { + return false; + } + try { + callback(); + return true; + } catch (std::exception& err) { + logger.error() + << "exception thrown in " << name << ": " << err.what(); + } + return false; +} + void guiutil::alert( Engine& engine, const std::wstring& text, const runnable& on_hidden ) { @@ -47,9 +64,7 @@ void guiutil::alert( auto& menu = *menuPtr; runnable on_hidden_final = [on_hidden, &menu]() { menu.removePage(""); - if (on_hidden) { - on_hidden(); - } else if (!menu.back()) { + if (!notify_callback(on_hidden, "on_hidden") && !menu.back()) { menu.reset(); } }; @@ -119,18 +134,16 @@ void guiutil::confirm( runnable on_confirm_final = [on_confirm, menu]() { menu->removePage(""); - if (on_confirm) { - on_confirm(); - } else if (!menu->back()) { + + if (!notify_callback(on_confirm, "on_confirm") && !menu->back()) { menu->reset(); } }; runnable on_deny_final = [on_deny, menu]() { menu->removePage(""); - if (on_deny) { - on_deny(); - } else if (!menu->back()) { + + if (!notify_callback(on_deny, "on_deny") && !menu->back()) { menu->reset(); } }; @@ -189,9 +202,16 @@ void guiutil::confirm_with_memo( auto subpanel = std::make_shared(gui, glm::vec2(600, 53)); subpanel->setColor(glm::vec4(0)); + runnable on_confirm_final = [on_confirm, menu]() { + menu->removePage(""); + + if (!notify_callback(on_confirm, "on_confirm") && !menu->back()) { + menu->reset(); + } + }; + subpanel->add(std::make_shared