From d1f92c21d0bbdf2df0eb3b31c5637bdf7110444c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 7 Dec 2024 02:10:36 +0300 Subject: [PATCH] fix on_block_interact & fix segfault after engine finished --- .github/workflows/appimage.yml | 1 - src/engine.cpp | 1 + src/engine.hpp | 3 +-- src/files/engine_paths.cpp | 7 ++++--- src/logic/scripting/scripting.cpp | 3 ++- src/util/ObjectsKeeper.hpp | 4 ++++ 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index d7c2a57f..9c26a805 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -42,7 +42,6 @@ jobs: run: ctest --test-dir ${{github.workspace}}/build - name: Run engine (headless) run: | - mkdir ${{github.workspace}}/userdir chmod +x ${{github.workspace}}/build/VoxelEngine ${{github.workspace}}/build/VoxelEngine --headless --dir ${{github.workspace}}/userdir # - name: Build AppImage diff --git a/src/engine.cpp b/src/engine.cpp index 3d0b1c21..5b0c6803 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -258,6 +258,7 @@ Engine::~Engine() { } audio::close(); network.reset(); + clearKeepedObjects(); scripting::close(); logger.info() << "scripting finished"; if (!params.headless) { diff --git a/src/engine.hpp b/src/engine.hpp index aad32100..f05a4607 100644 --- a/src/engine.hpp +++ b/src/engine.hpp @@ -68,12 +68,11 @@ class Engine : public util::ObjectsKeeper { std::unique_ptr interpreter; std::unique_ptr network; std::vector basePacks; + std::unique_ptr gui; uint64_t frame = 0; double lastTime = 0.0; double delta = 0.0; - - std::unique_ptr gui; void loadControls(); void loadSettings(); diff --git a/src/files/engine_paths.cpp b/src/files/engine_paths.cpp index 23de64a7..26857331 100644 --- a/src/files/engine_paths.cpp +++ b/src/files/engine_paths.cpp @@ -48,9 +48,6 @@ static std::filesystem::path toCanonic(std::filesystem::path path) { } void EnginePaths::prepare() { - logger.info() << "resources folder: " << fs::canonical(resourcesFolder).u8string(); - logger.info() << "user files folder: " << fs::canonical(userFilesFolder).u8string(); - if (!fs::is_directory(resourcesFolder)) { throw std::runtime_error( resourcesFolder.u8string() + " is not a directory" @@ -59,6 +56,10 @@ void EnginePaths::prepare() { if (!fs::is_directory(userFilesFolder)) { fs::create_directories(userFilesFolder); } + + logger.info() << "resources folder: " << fs::canonical(resourcesFolder).u8string(); + logger.info() << "user files folder: " << fs::canonical(userFilesFolder).u8string(); + auto contentFolder = userFilesFolder / CONTENT_FOLDER; if (!fs::is_directory(contentFolder)) { fs::create_directories(contentFolder); diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 9b43cf28..ded9a970 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -368,7 +368,7 @@ bool scripting::on_block_interact( Player* player, const Block& block, const glm::ivec3& pos ) { std::string name = block.name + ".interact"; - return lua::emit_event(lua::get_main_state(), name, [pos, player](auto L) { + auto result = lua::emit_event(lua::get_main_state(), name, [pos, player](auto L) { lua::pushivec_stack(L, pos); lua::pushinteger(L, player->getId()); return 4; @@ -386,6 +386,7 @@ bool scripting::on_block_interact( ); } } + return result; } void scripting::on_player_tick(Player* player, int tps) { diff --git a/src/util/ObjectsKeeper.hpp b/src/util/ObjectsKeeper.hpp index 000c4fc1..74a5a36b 100644 --- a/src/util/ObjectsKeeper.hpp +++ b/src/util/ObjectsKeeper.hpp @@ -14,5 +14,9 @@ namespace util { virtual void keepAlive(std::shared_ptr ptr) { ptrs.push_back(ptr); } + + virtual void clearKeepedObjects() { + ptrs.clear(); + } }; }