fix on_block_interact & fix segfault after engine finished

This commit is contained in:
MihailRis 2024-12-07 02:10:36 +03:00
parent e0670c11d5
commit d1f92c21d0
6 changed files with 12 additions and 7 deletions

View File

@ -42,7 +42,6 @@ jobs:
run: ctest --test-dir ${{github.workspace}}/build run: ctest --test-dir ${{github.workspace}}/build
- name: Run engine (headless) - name: Run engine (headless)
run: | run: |
mkdir ${{github.workspace}}/userdir
chmod +x ${{github.workspace}}/build/VoxelEngine chmod +x ${{github.workspace}}/build/VoxelEngine
${{github.workspace}}/build/VoxelEngine --headless --dir ${{github.workspace}}/userdir ${{github.workspace}}/build/VoxelEngine --headless --dir ${{github.workspace}}/userdir
# - name: Build AppImage # - name: Build AppImage

View File

@ -258,6 +258,7 @@ Engine::~Engine() {
} }
audio::close(); audio::close();
network.reset(); network.reset();
clearKeepedObjects();
scripting::close(); scripting::close();
logger.info() << "scripting finished"; logger.info() << "scripting finished";
if (!params.headless) { if (!params.headless) {

View File

@ -68,12 +68,11 @@ class Engine : public util::ObjectsKeeper {
std::unique_ptr<cmd::CommandsInterpreter> interpreter; std::unique_ptr<cmd::CommandsInterpreter> interpreter;
std::unique_ptr<network::Network> network; std::unique_ptr<network::Network> network;
std::vector<std::string> basePacks; std::vector<std::string> basePacks;
std::unique_ptr<gui::GUI> gui;
uint64_t frame = 0; uint64_t frame = 0;
double lastTime = 0.0; double lastTime = 0.0;
double delta = 0.0; double delta = 0.0;
std::unique_ptr<gui::GUI> gui;
void loadControls(); void loadControls();
void loadSettings(); void loadSettings();

View File

@ -48,9 +48,6 @@ static std::filesystem::path toCanonic(std::filesystem::path path) {
} }
void EnginePaths::prepare() { 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)) { if (!fs::is_directory(resourcesFolder)) {
throw std::runtime_error( throw std::runtime_error(
resourcesFolder.u8string() + " is not a directory" resourcesFolder.u8string() + " is not a directory"
@ -59,6 +56,10 @@ void EnginePaths::prepare() {
if (!fs::is_directory(userFilesFolder)) { if (!fs::is_directory(userFilesFolder)) {
fs::create_directories(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; auto contentFolder = userFilesFolder / CONTENT_FOLDER;
if (!fs::is_directory(contentFolder)) { if (!fs::is_directory(contentFolder)) {
fs::create_directories(contentFolder); fs::create_directories(contentFolder);

View File

@ -368,7 +368,7 @@ bool scripting::on_block_interact(
Player* player, const Block& block, const glm::ivec3& pos Player* player, const Block& block, const glm::ivec3& pos
) { ) {
std::string name = block.name + ".interact"; 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::pushivec_stack(L, pos);
lua::pushinteger(L, player->getId()); lua::pushinteger(L, player->getId());
return 4; return 4;
@ -386,6 +386,7 @@ bool scripting::on_block_interact(
); );
} }
} }
return result;
} }
void scripting::on_player_tick(Player* player, int tps) { void scripting::on_player_tick(Player* player, int tps) {

View File

@ -14,5 +14,9 @@ namespace util {
virtual void keepAlive(std::shared_ptr<void> ptr) { virtual void keepAlive(std::shared_ptr<void> ptr) {
ptrs.push_back(ptr); ptrs.push_back(ptr);
} }
virtual void clearKeepedObjects() {
ptrs.clear();
}
}; };
} }