From 6bc549dd90ee10624a600af1d50c50961f4a6f9c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 22 Nov 2025 19:23:46 +0300 Subject: [PATCH] fix world previews generation --- src/frontend/screens/LevelScreen.cpp | 7 +++++-- src/graphics/ui/elements/UINode.hpp | 24 +----------------------- src/logic/LevelController.cpp | 1 + src/logic/LevelController.hpp | 3 +++ src/util/CallbacksSet.hpp | 28 ++++++++++++++++++++++++++++ 5 files changed, 38 insertions(+), 25 deletions(-) create mode 100644 src/util/CallbacksSet.hpp diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index 10348734..0f93de8c 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -94,7 +94,11 @@ LevelScreen::LevelScreen( renderer->clear(); return false; })); - + controller->preQuitCallbacks.listen([this]() { + if (!controller->getLevel()->getWorld()->isNameless()) { + saveWorldPreview(); + } + }); animator = std::make_unique(); animator->addAnimations(assets.getAnimations()); @@ -104,7 +108,6 @@ LevelScreen::LevelScreen( LevelScreen::~LevelScreen() { if (!controller->getLevel()->getWorld()->isNameless()) { saveDecorations(); - saveWorldPreview(); } scripting::on_frontend_close(); // unblock all bindings diff --git a/src/graphics/ui/elements/UINode.hpp b/src/graphics/ui/elements/UINode.hpp index db9b97dc..d42d2618 100644 --- a/src/graphics/ui/elements/UINode.hpp +++ b/src/graphics/ui/elements/UINode.hpp @@ -2,6 +2,7 @@ #include "delegates.hpp" #include "graphics/core/commons.hpp" +#include "util/CallbacksSet.hpp" #include "window/input.hpp" #include @@ -23,29 +24,6 @@ namespace gui { using OnNumberChange = std::function; using OnStringChange = std::function; - template - class CallbacksSet { - public: - using Func = std::function; - private: - std::unique_ptr> callbacks; - public: - void listen(const Func& callback) { - if (callbacks == nullptr) { - callbacks = std::make_unique>(); - } - callbacks->push_back(callback); - } - - void notify(Args&&... args) { - if (callbacks) { - for (auto& callback : *callbacks) { - callback(std::forward(args)...); - } - } - } - }; - template class TaggedCallbacksSet { public: diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp index 5851fada..460f4bd2 100644 --- a/src/logic/LevelController.cpp +++ b/src/logic/LevelController.cpp @@ -122,6 +122,7 @@ void LevelController::update(float delta, bool pause) { } void LevelController::processBeforeQuit() { + preQuitCallbacks.notify(); // todo: move somewhere else for (auto player : level->players->getAll()) { if (player->chunks) { diff --git a/src/logic/LevelController.hpp b/src/logic/LevelController.hpp index 60f50bf2..88ca53e8 100644 --- a/src/logic/LevelController.hpp +++ b/src/logic/LevelController.hpp @@ -5,6 +5,7 @@ #include "BlocksController.hpp" #include "ChunksController.hpp" #include "util/Clock.hpp" +#include "util/CallbacksSet.hpp" class Engine; class Level; @@ -21,6 +22,8 @@ class LevelController { util::Clock playerTickClock; public: + CallbacksSet<> preQuitCallbacks; + LevelController(Engine* engine, std::unique_ptr level, Player* clientPlayer); /// @param delta time elapsed since the last update diff --git a/src/util/CallbacksSet.hpp b/src/util/CallbacksSet.hpp new file mode 100644 index 00000000..0f6ad8ab --- /dev/null +++ b/src/util/CallbacksSet.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include + +template +class CallbacksSet { +public: + using Func = std::function; +private: + std::unique_ptr> callbacks; +public: + void listen(const Func& callback) { + if (callbacks == nullptr) { + callbacks = std::make_unique>(); + } + callbacks->push_back(callback); + } + + void notify(Args&&... args) { + if (callbacks) { + for (auto& callback : *callbacks) { + callback(std::forward(args)...); + } + } + } +};