diff --git a/res/project_script.lua b/res/project_client.lua similarity index 76% rename from res/project_script.lua rename to res/project_client.lua index 9158f361..ede54110 100644 --- a/res/project_script.lua +++ b/res/project_client.lua @@ -1,13 +1,13 @@ local menubg -local function clear_menu() +function on_menu_clear() if menubg then menubg:destruct() menubg = nil end end -local function configure_menu() +function on_menu_setup() local controller = {} function controller.resize_menu_bg() local w, h = unpack(gui.get_viewport()) @@ -24,11 +24,3 @@ local function configure_menu() controller.resize_menu_bg() menu.page = "main" end - -function on_screen_changed(screen) - if screen ~= "menu" then - clear_menu() - else - configure_menu() - end -end diff --git a/src/devtools/Project.hpp b/src/devtools/Project.hpp index 3824ecfd..be9d88a3 100644 --- a/src/devtools/Project.hpp +++ b/src/devtools/Project.hpp @@ -7,14 +7,14 @@ #include "interfaces/Serializable.hpp" namespace scripting { - class IProjectScript; + class IClientProjectScript; } struct Project : Serializable { std::string name; std::string title; std::vector basePacks; - std::unique_ptr script; + std::unique_ptr clientScript; ~Project(); diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 3f1ae9e5..0288d609 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -60,11 +60,11 @@ static std::unique_ptr load_icon() { return nullptr; } -static std::unique_ptr load_project_script() { - io::path scriptFile = "project:project_script.lua"; +static std::unique_ptr load_client_project_script() { + io::path scriptFile = "project:project_client.lua"; if (io::exists(scriptFile)) { logger.info() << "starting project script"; - return scripting::load_project_script(scriptFile); + return scripting::load_client_project_script(scriptFile); } else { logger.warning() << "project script does not exists"; } @@ -83,6 +83,68 @@ Engine& Engine::getInstance() { return *instance; } +void Engine::onContentLoad() { + editor->loadTools(); + langs::setup(langs::get_current(), paths.resPaths.collectRoots()); + + if (isHeadless()) { + return; + } + for (auto& pack : content->getAllContentPacks()) { + auto configFolder = pack.folder / "config"; + auto bindsFile = configFolder / "bindings.toml"; + if (io::is_regular_file(bindsFile)) { + input->getBindings().read( + toml::parse( + bindsFile.string(), io::read_string(bindsFile) + ), + BindType::BIND + ); + } + } + loadAssets(); +} + +void Engine::initializeClient() { + std::string title = project->title; + if (title.empty()) { + title = "VoxelCore v" + + std::to_string(ENGINE_VERSION_MAJOR) + "." + + std::to_string(ENGINE_VERSION_MINOR); + } + if (ENGINE_DEBUG_BUILD) { + title += " [debug]"; + } + auto [window, input] = Window::initialize(&settings.display, title); + if (!window || !input){ + throw initialize_error("could not initialize window"); + } + window->setFramerate(settings.display.framerate.get()); + + time.set(window->time()); + if (auto icon = load_icon()) { + icon->flipY(); + window->setIcon(icon.get()); + } + this->window = std::move(window); + this->input = std::move(input); + + loadControls(); + + gui = std::make_unique(*this); + if (ENGINE_DEBUG_BUILD) { + menus::create_version_label(*gui); + } + keepAlive(settings.display.fullscreen.observe( + [this](bool value) { + if (value != this->window->isFullscreen()) { + this->window->toggleFullscreen(); + } + }, + true + )); +} + void Engine::initialize(CoreParameters coreParameters) { params = std::move(coreParameters); settingsHandler = std::make_unique(settings); @@ -111,70 +173,17 @@ void Engine::initialize(CoreParameters coreParameters) { controller = std::make_unique(*this); if (!params.headless) { - std::string title = project->title; - if (title.empty()) { - title = "VoxelCore v" + - std::to_string(ENGINE_VERSION_MAJOR) + "." + - std::to_string(ENGINE_VERSION_MINOR); - } - if (ENGINE_DEBUG_BUILD) { - title += " [debug]"; - } - auto [window, input] = Window::initialize(&settings.display, title); - if (!window || !input){ - throw initialize_error("could not initialize window"); - } - window->setFramerate(settings.display.framerate.get()); - - time.set(window->time()); - if (auto icon = load_icon()) { - icon->flipY(); - window->setIcon(icon.get()); - } - this->window = std::move(window); - this->input = std::move(input); - - loadControls(); - - gui = std::make_unique(*this); - if (ENGINE_DEBUG_BUILD) { - menus::create_version_label(*gui); - } - keepAlive(settings.display.fullscreen.observe( - [this](bool value) { - if (value != this->window->isFullscreen()) { - this->window->toggleFullscreen(); - } - }, - true - )); + initializeClient(); } audio::initialize(!params.headless, settings.audio); - bool langNotSet = settings.ui.language.get() == "auto"; - if (langNotSet) { + if (settings.ui.language.get() == "auto") { settings.ui.language.set( langs::locale_by_envlocale(platform::detect_locale()) ); } content = std::make_unique(*project, paths, *input, [this]() { - editor->loadTools(); - langs::setup(langs::get_current(), paths.resPaths.collectRoots()); - if (!isHeadless()) { - for (auto& pack : content->getAllContentPacks()) { - auto configFolder = pack.folder / "config"; - auto bindsFile = configFolder / "bindings.toml"; - if (io::is_regular_file(bindsFile)) { - input->getBindings().read( - toml::parse( - bindsFile.string(), io::read_string(bindsFile) - ), - BindType::BIND - ); - } - } - loadAssets(); - } + onContentLoad(); }); scripting::initialize(this); @@ -185,7 +194,7 @@ void Engine::initialize(CoreParameters coreParameters) { langs::setup(lang, paths.resPaths.collectRoots()); }, true)); - project->script = load_project_script(); + project->clientScript = load_client_project_script(); } void Engine::loadSettings() { @@ -360,6 +369,9 @@ void Engine::loadProject() { } void Engine::setScreen(std::shared_ptr screen) { + if (project->clientScript && this->screen) { + project->clientScript->onScreenChange(this->screen->getName(), false); + } // reset audio channels (stop all sources) audio::reset_channel(audio::get_channel_index("regular")); audio::reset_channel(audio::get_channel_index("ambient")); @@ -367,8 +379,8 @@ void Engine::setScreen(std::shared_ptr screen) { if (this->screen) { this->screen->onOpen(); } - if (project->script && this->screen) { - project->script->onScreenChange(this->screen->getName()); + if (project->clientScript && this->screen) { + project->clientScript->onScreenChange(this->screen->getName(), true); } } diff --git a/src/engine/Engine.hpp b/src/engine/Engine.hpp index 35619a2a..98bcd497 100644 --- a/src/engine/Engine.hpp +++ b/src/engine/Engine.hpp @@ -38,10 +38,6 @@ namespace devtools { class Editor; } -namespace scripting { - class IProjectScript; -} - class initialize_error : public std::runtime_error { public: initialize_error(const std::string& message) : std::runtime_error(message) {} @@ -86,6 +82,9 @@ class Engine : public util::ObjectsKeeper { void updateHotkeys(); void loadAssets(); void loadProject(); + + void initializeClient(); + void onContentLoad(); public: Engine(); ~Engine(); diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index bb33a8bc..19ad225d 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -117,20 +117,19 @@ public: } }; -class LuaProjectScript : public IProjectScript { +class LuaProjectScript : public IClientProjectScript { public: LuaProjectScript(lua::State* L, scriptenv env) : L(L), env(std::move(env)) {} - void onScreenChange(const std::string& name) override { + void onScreenChange(const std::string& name, bool show) override { if (!lua::pushenv(L, *env)) { return; } - if (!lua::getfield(L, "on_screen_changed")) { + if (!lua::getfield(L, "on_" + name + (show ? "_setup" : "_clear"))) { lua::pop(L); return; } - lua::pushlstring(L, name); - lua::call_nothrow(L, 1, 0); + lua::call_nothrow(L, 0, 0); lua::pop(L); } private: @@ -138,7 +137,7 @@ private: scriptenv env; }; -std::unique_ptr scripting::load_project_script( +std::unique_ptr scripting::load_client_project_script( const io::path& script ) { auto L = lua::get_main_state(); diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index b6f8733d..78eb8e13 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -65,14 +65,16 @@ namespace scripting { void process_post_runnables(); - class IProjectScript { + class IClientProjectScript { public: - virtual ~IProjectScript() {} + virtual ~IClientProjectScript() {} - virtual void onScreenChange(const std::string& name) = 0; + virtual void onScreenChange(const std::string& name, bool show) = 0; }; - std::unique_ptr load_project_script(const io::path& script); + std::unique_ptr load_client_project_script( + const io::path& script + ); std::unique_ptr start_coroutine(const io::path& script);