diff --git a/TODO b/TODO index 7de755ef..37959c09 100644 --- a/TODO +++ b/TODO @@ -2,7 +2,6 @@ [bart] a class for binding hotkeys [bart] review directories loading search [bart] load modules from zip packages -[bart] capture close application events in lua (old setOnClose) [bart] create a class for reading binary files [bart] rework lua/c++ logger [bart] save lists on config manager @@ -67,6 +66,7 @@ [bart] chat with tabs [bart] limit FPS in options [baxnie] display 'You are dead.' message +[baxnie] display exit box when exiting from game [baxnie] do lua game event calls from Game instead from GameProtocol [baxnie] classic control [baxnie] trade window diff --git a/modules/core_lib/util.lua b/modules/core_lib/util.lua index 23234de7..0d7c2e68 100644 --- a/modules/core_lib/util.lua +++ b/modules/core_lib/util.lua @@ -10,6 +10,14 @@ function fatal(msg) Logger.log(LogFatal, msg) end +function setonclose(func) + g_app.onClose = func +end + +function exit() + g_app.exit() +end + function connect(object, signalsAndSlots, pushFront) for signal,slot in pairs(signalsAndSlots) do if not object[signal] then diff --git a/modules/game/game.lua b/modules/game/game.lua index e7a1132b..c4ffa040 100644 --- a/modules/game/game.lua +++ b/modules/game/game.lua @@ -60,5 +60,15 @@ function Game.onDeath() print('dead') end +local function onApplicationClose() + print('close app') + if Game.isOnline() then + Game.logout(false) + else + exit() + end +end + +setonclose(onApplicationClose) connect(Game, { onLogin = Game.createInterface }, true) connect(Game, { onLogout = Game.destroyInterface }) diff --git a/src/framework/application.cpp b/src/framework/application.cpp index 7d8fccc4..e8b7c114 100644 --- a/src/framework/application.cpp +++ b/src/framework/application.cpp @@ -212,6 +212,15 @@ void Application::poll() g_dispatcher.poll(); } +void Application::close() +{ + g_lua.getGlobalField("g_app", "onClose"); + if(!g_lua.isNil()) + g_lua.protectedCall(); + else + exit(); +} + void Application::render() { // everything is rendered by UI components diff --git a/src/framework/application.h b/src/framework/application.h index f8c1821a..502523b9 100644 --- a/src/framework/application.h +++ b/src/framework/application.h @@ -41,7 +41,7 @@ public: virtual void run(); virtual void exit(); virtual void poll(); - virtual void close() { exit(); } + virtual void close(); void setPollCycleDelay(int delay) { m_pollCycleDelay = delay; } diff --git a/src/framework/luafunctions.cpp b/src/framework/luafunctions.cpp index e6d14b16..07149f4d 100644 --- a/src/framework/luafunctions.cpp +++ b/src/framework/luafunctions.cpp @@ -234,6 +234,10 @@ void Application::registerLuaFunctions() // Protocol g_lua.registerClass(); + // Application + g_lua.registerStaticClass("g_app"); + g_lua.bindClassStaticFunction("g_app", "exit", std::bind(&Application::exit, g_app)); + // ConfigManager g_lua.registerStaticClass("g_configs"); g_lua.bindClassStaticFunction("g_configs", "set", std::bind(&ConfigManager::set, &g_configs, _1, _2)); @@ -241,7 +245,7 @@ void Application::registerLuaFunctions() g_lua.bindClassStaticFunction("g_configs", "exists", std::bind(&ConfigManager::exists, &g_configs, _1)); g_lua.bindClassStaticFunction("g_configs", "remove", std::bind(&ConfigManager::remove, &g_configs, _1)); - + // PlatformWindow g_lua.registerStaticClass("g_window"); g_lua.bindClassStaticFunction("g_window", "move", std::bind(&PlatformWindow::move, &g_window, _1)); g_lua.bindClassStaticFunction("g_window", "resize", std::bind(&PlatformWindow::resize, &g_window, _1)); diff --git a/src/otclient/luafunctions.cpp b/src/otclient/luafunctions.cpp index fac119e1..b74d2813 100644 --- a/src/otclient/luafunctions.cpp +++ b/src/otclient/luafunctions.cpp @@ -54,7 +54,6 @@ void OTClient::registerLuaFunctions() g_lua.bindClassStaticFunction("g_sprites", "isLoaded", std::bind(&SpriteManager::isLoaded, &g_sprites)); g_lua.bindClassStaticFunction("g_sprites", "getSignature", std::bind(&SpriteManager::getSignature, &g_sprites)); - g_lua.bindGlobalFunction("exit", std::bind(&Application::exit, g_app)); g_lua.bindGlobalFunction("getOufitColor", Outfit::getColor); g_lua.registerClass(); diff --git a/src/otclient/otclient.cpp b/src/otclient/otclient.cpp index 52e082b6..d3b643aa 100644 --- a/src/otclient/otclient.cpp +++ b/src/otclient/otclient.cpp @@ -39,10 +39,3 @@ void OTClient::init(const std::vector& args) g_modules.ensureModuleLoaded("client"); g_modules.autoLoadModules(1000); } - -void OTClient::close() -{ - if(g_game.isOnline()) - g_game.logout(true); - exit(); -} diff --git a/src/otclient/otclient.h b/src/otclient/otclient.h index b6f9fd15..1401ee17 100644 --- a/src/otclient/otclient.h +++ b/src/otclient/otclient.h @@ -31,7 +31,6 @@ class OTClient : public Application public: OTClient(); void init(const std::vector& args); - void close(); void registerLuaFunctions(); };