diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 96dc6620..75af2fcd 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -276,6 +276,12 @@ void ContentLoader::load(ContentBuilder* builder) { fixPackIndices(); auto folder = pack->folder; + + fs::path scriptFile = folder/fs::path("scripts/world.lua"); + if (fs::is_regular_file(scriptFile)) { + scripting::load_world_script(pack->id, scriptFile); + } + if (!fs::is_regular_file(pack->getContentFile())) return; auto root = files::read_json(pack->getContentFile()); diff --git a/src/engine.cpp b/src/engine.cpp index 7ac81c6c..8b39b825 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -123,8 +123,8 @@ void Engine::mainloop() { } Engine::~Engine() { - scripting::close(); screen = nullptr; + scripting::close(); Audio::finalize(); diff --git a/src/frontend/screens.cpp b/src/frontend/screens.cpp index 4ce02380..1d2b2732 100644 --- a/src/frontend/screens.cpp +++ b/src/frontend/screens.cpp @@ -100,8 +100,10 @@ LevelScreen::LevelScreen(Engine* engine, Level* level) LevelScreen::~LevelScreen() { std::cout << "-- writing world" << std::endl; + controller->onWorldSave(); auto world = level->getWorld(); world->write(level.get()); + controller->onWorldQuit(); } void LevelScreen::updateHotkeys() { diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp index 7327f593..84b9ad27 100644 --- a/src/logic/LevelController.cpp +++ b/src/logic/LevelController.cpp @@ -17,7 +17,6 @@ LevelController::LevelController(EngineSettings& settings, Level* level) } LevelController::~LevelController() { - scripting::on_world_quit(); } void LevelController::update(float delta, bool input, bool pause) { @@ -26,3 +25,11 @@ void LevelController::update(float delta, bool input, bool pause) { chunks->update(settings.chunks.loadSpeed); blocks->update(delta); } + +void LevelController::onWorldSave() { + scripting::on_world_save(); +} + +void LevelController::onWorldQuit() { + scripting::on_world_quit(); +} diff --git a/src/logic/LevelController.h b/src/logic/LevelController.h index 01a98c97..bd5ce183 100644 --- a/src/logic/LevelController.h +++ b/src/logic/LevelController.h @@ -29,6 +29,9 @@ public: void update(float delta, bool input, bool pause); + + void onWorldSave(); + void onWorldQuit(); }; #endif // LOGIC_LEVEL_CONTROLLER_H_ diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 6c1ab283..3c62426f 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -4,6 +4,7 @@ #include #include +#include "../../content/ContentPack.h" #include "../../files/engine_paths.h" #include "../../files/files.h" #include "../../util/timeutil.h" @@ -105,9 +106,40 @@ void scripting::on_world_load(Level* level, BlocksController* blocks) { scripting::content = level->content; scripting::blocks = blocks; load_script("world.lua"); + + for (auto& pack : scripting::engine->getContentPacks()) { + std::string name = pack.id+".worldopen"; + lua_getglobal(L, name.c_str()); + if (lua_isnil(L, lua_gettop(L))) { + lua_pop(L, lua_gettop(L)); + continue; + } + call_func(L, 0, name); + } +} + +void scripting::on_world_save() { + for (auto& pack : scripting::engine->getContentPacks()) { + std::string name = pack.id+".worldsave"; + lua_getglobal(L, name.c_str()); + if (lua_isnil(L, lua_gettop(L))) { + lua_pop(L, lua_gettop(L)); + continue; + } + call_func(L, 0, name); + } } void scripting::on_world_quit() { + for (auto& pack : scripting::engine->getContentPacks()) { + std::string name = pack.id+".worldquit"; + lua_getglobal(L, name.c_str()); + if (lua_isnil(L, lua_gettop(L))) { + lua_pop(L, lua_gettop(L)); + continue; + } + call_func(L, 0, name); + } scripting::level = nullptr; scripting::content = nullptr; } @@ -211,6 +243,20 @@ void scripting::load_item_script(std::string prefix, fs::path file, item_funcs_s funcsset->on_block_break_by=rename_global(L, "on_block_break_by", (prefix+".blockbreakby").c_str()); } +void scripting::load_world_script(std::string prefix, fs::path file) { + std::string src = files::read_string(file); + std::cout << "loading script " << file.u8string() << std::endl; + if (luaL_loadbuffer(L, src.c_str(), src.size(), file.string().c_str())) { + handleError(L); + return; + } + call_func(L, 0, "