From 87ff77a73fd0640d478827f8a3e73f06eda48e7c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 9 Nov 2025 18:26:36 +0300 Subject: [PATCH] add project start application script --- src/devtools/Project.hpp | 2 ++ src/engine/Engine.cpp | 28 ++++++++++++++++++++++++---- src/engine/Engine.hpp | 1 + src/engine/Mainloop.cpp | 1 + src/engine/ServerMainloop.cpp | 1 + src/frontend/screens/MenuScreen.cpp | 8 +++++--- 6 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/devtools/Project.hpp b/src/devtools/Project.hpp index be9d88a3..68093ada 100644 --- a/src/devtools/Project.hpp +++ b/src/devtools/Project.hpp @@ -4,6 +4,7 @@ #include #include +#include "interfaces/Process.hpp" #include "interfaces/Serializable.hpp" namespace scripting { @@ -15,6 +16,7 @@ struct Project : Serializable { std::string title; std::vector basePacks; std::unique_ptr clientScript; + std::unique_ptr setupCoroutine; ~Project(); diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 3053b613..1b8cd440 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -62,13 +62,24 @@ static std::unique_ptr load_icon() { return nullptr; } -static std::unique_ptr load_client_project_script() { +static std::unique_ptr load_project_client_script() { io::path scriptFile = "project:project_client.lua"; if (io::exists(scriptFile)) { - logger.info() << "starting project script"; + logger.info() << "starting project client script"; return scripting::load_client_project_script(scriptFile); } else { - logger.warning() << "project script does not exists"; + logger.warning() << "project client script does not exists"; + } + return nullptr; +} + +static std::unique_ptr load_project_start_script() { + io::path scriptFile = "project:start.lua"; + if (io::exists(scriptFile)) { + logger.info() << "starting project start script"; + return scripting::start_app_script(scriptFile); + } else { + logger.warning() << "project start script does not exists"; } return nullptr; } @@ -226,7 +237,10 @@ void Engine::initialize(CoreParameters coreParameters) { langs::setup(lang, paths.resPaths.collectRoots()); }, true)); - project->clientScript = load_client_project_script(); + project->setupCoroutine = load_project_start_script(); + if (!params.headless) { + project->clientScript = load_project_client_script(); + } } void Engine::loadSettings() { @@ -301,6 +315,12 @@ void Engine::detachDebugger() { debuggingServer.reset(); } +void Engine::applicationTick() { + if (project->setupCoroutine && project->setupCoroutine->isActive()) { + project->setupCoroutine->update(); + } +} + void Engine::updateFrontend() { double delta = time.getDelta(); updateHotkeys(); diff --git a/src/engine/Engine.hpp b/src/engine/Engine.hpp index 98a2c3ef..468563d0 100644 --- a/src/engine/Engine.hpp +++ b/src/engine/Engine.hpp @@ -105,6 +105,7 @@ public: void postUpdate(); + void applicationTick(); void updateFrontend(); void renderFrame(); void nextFrame(); diff --git a/src/engine/Mainloop.cpp b/src/engine/Mainloop.cpp index a14c5464..5435e983 100644 --- a/src/engine/Mainloop.cpp +++ b/src/engine/Mainloop.cpp @@ -38,6 +38,7 @@ void Mainloop::run() { logger.info() << "main loop started"; while (!window.isShouldClose()){ time.update(window.time()); + engine.applicationTick(); engine.updateFrontend(); if (!window.isIconified()) { diff --git a/src/engine/ServerMainloop.cpp b/src/engine/ServerMainloop.cpp index ab35ffbd..7fb8ffed 100644 --- a/src/engine/ServerMainloop.cpp +++ b/src/engine/ServerMainloop.cpp @@ -60,6 +60,7 @@ void ServerMainloop::run() { controller->getLevel()->getWorld()->updateTimers(delta); controller->update(glm::min(delta, 0.2), false); } + engine.applicationTick(); engine.postUpdate(); if (!coreParams.testMode) { diff --git a/src/frontend/screens/MenuScreen.cpp b/src/frontend/screens/MenuScreen.cpp index c1339494..e1015e8c 100644 --- a/src/frontend/screens/MenuScreen.cpp +++ b/src/frontend/screens/MenuScreen.cpp @@ -12,9 +12,11 @@ #include "window/Camera.hpp" #include "engine/Engine.hpp" -MenuScreen::MenuScreen(Engine& engine) : Screen(engine) { - uicamera = - std::make_unique(glm::vec3(), engine.getWindow().getSize().y); +MenuScreen::MenuScreen(Engine& engine) + : Screen(engine), + uicamera( + std::make_unique(glm::vec3(), engine.getWindow().getSize().y) + ) { uicamera->perspective = false; uicamera->near = -1.0f; uicamera->far = 1.0f;