From 63304712f3c84ec17b246c9043bf5784b1384e18 Mon Sep 17 00:00:00 2001 From: ChancellorIkseew Date: Sat, 2 Nov 2024 03:40:35 +1000 Subject: [PATCH 1/4] add lua function block/unbloc bindings --- src/logic/scripting/lua/libs/libinput.cpp | 22 ++++++++++++++++++++++ src/window/Events.cpp | 3 +++ src/window/input.hpp | 1 + 3 files changed, 26 insertions(+) diff --git a/src/logic/scripting/lua/libs/libinput.cpp b/src/logic/scripting/lua/libs/libinput.cpp index 53f1effd..99749d2e 100644 --- a/src/logic/scripting/lua/libs/libinput.cpp +++ b/src/logic/scripting/lua/libs/libinput.cpp @@ -133,6 +133,26 @@ static int l_reset_bindings(lua::State*) { return 0; } +static void enableBinding(std::string& bindname, bool enable) { + const auto& bind = Events::bindings.find(bindname); + if (bind == Events::bindings.end()) { + throw std::runtime_error("unknown binding " + util::quote(bindname)); + } + Events::bindings[bindname].enable = enable; +} + +static int l_enable_binding(lua::State* L) { + std::string bindname = lua::require_string(L, 1); + enableBinding(bindname, true); + return 0; +} + +static int l_disable_binding(lua::State* L) { + std::string bindname = lua::require_string(L, 1); + enableBinding(bindname, false); + return 0; +} + const luaL_Reg inputlib[] = { {"keycode", lua::wrap}, {"mousecode", lua::wrap}, @@ -143,4 +163,6 @@ const luaL_Reg inputlib[] = { {"is_active", lua::wrap}, {"is_pressed", lua::wrap}, {"reset_bindings", lua::wrap}, + {"enable_binding", lua::wrap}, + {"disable_binding", lua::wrap}, {NULL, NULL}}; diff --git a/src/window/Events.cpp b/src/window/Events.cpp index f310969b..625b0a53 100644 --- a/src/window/Events.cpp +++ b/src/window/Events.cpp @@ -78,6 +78,9 @@ void Events::pollEvents() { for (auto& entry : bindings) { auto& binding = entry.second; + if (!binding.enable) { + continue; + } binding.justChange = false; bool newstate = false; diff --git a/src/window/input.hpp b/src/window/input.hpp index a90c8fe0..06ed1511 100644 --- a/src/window/input.hpp +++ b/src/window/input.hpp @@ -137,6 +137,7 @@ struct Binding { int code; bool state = false; bool justChange = false; + bool enable = true; Binding() = default; Binding(inputtype type, int code) : type(type), code(code) { From 7763157cdc31dfc7299904a6ec0520f4d7a49c2c Mon Sep 17 00:00:00 2001 From: ChancellorIkseew Date: Sat, 2 Nov 2024 05:09:55 +1000 Subject: [PATCH 2/4] bindings bug fix If binding was blocked in one world, it stayed being blocked in other. --- src/logic/scripting/lua/libs/libcore.cpp | 2 ++ src/window/Events.cpp | 7 +++++++ src/window/Events.hpp | 1 + 3 files changed, 10 insertions(+) diff --git a/src/logic/scripting/lua/libs/libcore.cpp b/src/logic/scripting/lua/libs/libcore.cpp index ee611b63..891cd791 100644 --- a/src/logic/scripting/lua/libs/libcore.cpp +++ b/src/logic/scripting/lua/libs/libcore.cpp @@ -60,6 +60,8 @@ static int l_close_world(lua::State* L) { if (save_world) { controller->saveWorld(); } + // unblock all bindings + Events::enableBindings(); // destroy LevelScreen and run quit callbacks engine->setScreen(nullptr); // create and go to menu screen diff --git a/src/window/Events.cpp b/src/window/Events.cpp index 625b0a53..4db271be 100644 --- a/src/window/Events.cpp +++ b/src/window/Events.cpp @@ -231,3 +231,10 @@ void Events::loadBindings( } } } + +void Events::enableBindings() { + for (auto& entry : bindings) { + auto& binding = entry.second; + binding.enable = true; + } +} diff --git a/src/window/Events.hpp b/src/window/Events.hpp index f5ed5720..8155bb2b 100644 --- a/src/window/Events.hpp +++ b/src/window/Events.hpp @@ -60,4 +60,5 @@ public: const std::string& filename, const std::string& source, BindType bindType ); + static void enableBindings(); }; From 4a4e9e83307deca364332176e43006e903a1046e Mon Sep 17 00:00:00 2001 From: ChancellorIkseew Date: Sat, 2 Nov 2024 15:02:27 +1000 Subject: [PATCH 3/4] bindings bug fix 2 --- src/window/Events.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/window/Events.cpp b/src/window/Events.cpp index 4db271be..f63431cf 100644 --- a/src/window/Events.cpp +++ b/src/window/Events.cpp @@ -79,6 +79,7 @@ void Events::pollEvents() { for (auto& entry : bindings) { auto& binding = entry.second; if (!binding.enable) { + binding.state = false; continue; } binding.justChange = false; From 7e25b6f8259b8e7308b12e5a362ebb7bacaed42e Mon Sep 17 00:00:00 2001 From: ChancellorIkseew Date: Sat, 2 Nov 2024 19:44:27 +1000 Subject: [PATCH 4/4] binding lock/unlock refactoring --- src/logic/scripting/lua/libs/libinput.cpp | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/logic/scripting/lua/libs/libinput.cpp b/src/logic/scripting/lua/libs/libinput.cpp index 99749d2e..2e869fe3 100644 --- a/src/logic/scripting/lua/libs/libinput.cpp +++ b/src/logic/scripting/lua/libs/libinput.cpp @@ -133,23 +133,14 @@ static int l_reset_bindings(lua::State*) { return 0; } -static void enableBinding(std::string& bindname, bool enable) { +static int l_enable_binding(lua::State* L) { + std::string bindname = lua::require_string(L, 1); + bool enable = lua::toboolean(L, 2); const auto& bind = Events::bindings.find(bindname); if (bind == Events::bindings.end()) { throw std::runtime_error("unknown binding " + util::quote(bindname)); } Events::bindings[bindname].enable = enable; -} - -static int l_enable_binding(lua::State* L) { - std::string bindname = lua::require_string(L, 1); - enableBinding(bindname, true); - return 0; -} - -static int l_disable_binding(lua::State* L) { - std::string bindname = lua::require_string(L, 1); - enableBinding(bindname, false); return 0; } @@ -164,5 +155,4 @@ const luaL_Reg inputlib[] = { {"is_pressed", lua::wrap}, {"reset_bindings", lua::wrap}, {"enable_binding", lua::wrap}, - {"disable_binding", lua::wrap}, {NULL, NULL}};