From fdda0b1e8c27045cc3c129176a5615db880bd2e3 Mon Sep 17 00:00:00 2001 From: 0O0o0oOoO00 <11174151+0O0o0oOoO00@users.noreply.github.com> Date: Fri, 21 Nov 2025 17:42:16 +0800 Subject: [PATCH] add: pause lua state when setting better global speedup rate --- blcrack/cracker/cracker.cpp | 20 ++++++++++++++++++++ blcrack/cracker/cracker.hpp | 6 ++++++ blcrack/cracker/server.cpp | 12 +++++++++--- blcrack/cracker/ui/ui.cpp | 4 +++- 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/blcrack/cracker/cracker.cpp b/blcrack/cracker/cracker.cpp index ad048657e..f363feed1 100644 --- a/blcrack/cracker/cracker.cpp +++ b/blcrack/cracker/cracker.cpp @@ -641,6 +641,10 @@ void Cracker::print_value(std::vector& path) { } } +void Cracker::better_global_speedup_pause(bool is_need) { + m_better_global_speedup_need_pause.store(is_need); +} + void Cracker::load_lua_resources() { SPDLOG_INFO("Load lua resources"); @@ -966,6 +970,7 @@ void Cracker::hook_all_lua_functions() { m_state["ys"]["Battle"]["BattleState"]["ExitBattle"] = [this](sol::this_state L, Lua::VariadicArgs args) { m_original.ys_Battle_BattleState_ExitBattle(L, args); if (IS_ENABLED(BETTER_GLOBAL_SPEEDUP)) { + better_global_speedup_pause(false); better_global_speedup_set_rate(m_better_global_speedup_rate.load()); } }; @@ -973,6 +978,7 @@ void Cracker::hook_all_lua_functions() { m_state["ys"]["Battle"]["BattleState"]["ScaleTimer"] = [this](sol::this_state L, Lua::VariadicArgs args) { m_original.ys_Battle_BattleState_ScaleTimer(L, args); if (IS_ENABLED(BETTER_GLOBAL_SPEEDUP)) { + better_global_speedup_pause(false); better_global_speedup_set_rate(m_better_global_speedup_rate.load()); } }; @@ -1452,6 +1458,20 @@ void Cracker::hook_all_lua_functions() { } void Cracker::better_global_speedup_set_rate(double rate) { + if (m_better_global_speedup_need_pause.load()) { + better_global_speedup_set_rate_with_pause(rate); + } else { + better_global_speedup_set_rate_without_pause(rate); + } +} + +void Cracker::better_global_speedup_set_rate_with_pause(double rate) { + LUA_STATUS_PAUSER_GUARD(); + m_state["ys"]["Battle"]["BattleConfig"]["BASIC_TIME_SCALE"] = rate; + m_state["Time"]["timeScale"] = rate; +} + +void Cracker::better_global_speedup_set_rate_without_pause(double rate) { m_state["ys"]["Battle"]["BattleConfig"]["BASIC_TIME_SCALE"] = rate; m_state["Time"]["timeScale"] = rate; } diff --git a/blcrack/cracker/cracker.hpp b/blcrack/cracker/cracker.hpp index 9a50cb13b..e6b6363e3 100644 --- a/blcrack/cracker/cracker.hpp +++ b/blcrack/cracker/cracker.hpp @@ -256,11 +256,16 @@ public: void print_table_field(std::vector& path); void print_value(std::vector& path); + void better_global_speedup_pause(bool is_need); + Config get_config(); void apply_config(Config& config); private: + void better_global_speedup_set_rate_with_pause(double rate); + void better_global_speedup_set_rate_without_pause(double rate); + void load_cracker_with_pause(); void load_cracker_without_pause(); @@ -436,6 +441,7 @@ private: std::atomic m_global_speedup_rate = 1.0; std::atomic m_better_global_speedup_rate = 1.0; LuaStatePauser m_lua_state_pauser; + std::atomic m_better_global_speedup_need_pause = false; }; #endif //CRACKER_HPP diff --git a/blcrack/cracker/server.cpp b/blcrack/cracker/server.cpp index 0c0f877ff..387f40e02 100644 --- a/blcrack/cracker/server.cpp +++ b/blcrack/cracker/server.cpp @@ -794,7 +794,9 @@ CrackerServer::CrackerServer() { Post("/enable_better_global_speedup", [](const httplib::Request& req, httplib::Response& res) { try { - Cracker::Instance().enable_better_global_speedup(); + auto& ins = Cracker::Instance(); + ins.better_global_speedup_pause(true); + ins.enable_better_global_speedup(); } catch (std::exception& e) { SPDLOG_ERROR("Enable better global speedup failed: {}", e.what()); res.status = 500; @@ -808,7 +810,9 @@ CrackerServer::CrackerServer() { Json::Reader reader; Json::Value j; reader.parse(req.body, j); - Cracker::Instance().update_better_global_speedup_rate(j["rate"].asDouble()); + auto& ins = Cracker::Instance(); + ins.better_global_speedup_pause(true); + ins.update_better_global_speedup_rate(j["rate"].asDouble()); } catch (std::exception& e) { SPDLOG_ERROR("Update better global speedup rate failed: {}", e.what()); res.status = 500; @@ -819,7 +823,9 @@ CrackerServer::CrackerServer() { Post("/disable_better_global_speedup", [](const httplib::Request& req, httplib::Response& res) { try { - Cracker::Instance().disable_better_global_speedup(); + auto& ins = Cracker::Instance(); + ins.better_global_speedup_pause(true); + ins.disable_better_global_speedup(); } catch (std::exception& e) { SPDLOG_ERROR("Disable better global speedup failed: {}", e.what()); res.status = 500; diff --git a/blcrack/cracker/ui/ui.cpp b/blcrack/cracker/ui/ui.cpp index 9eff2c6c2..4392698f1 100644 --- a/blcrack/cracker/ui/ui.cpp +++ b/blcrack/cracker/ui/ui.cpp @@ -85,7 +85,9 @@ void CrackerUI::draw_menu() { } ImGui::SameLine(); if(ImGui::Button("应用")) { - Cracker::Instance(false).apply_config(m_cracker_config); + auto& ins = Cracker::Instance(false); + ins.better_global_speedup_pause(false); + ins.apply_config(m_cracker_config); } ImGui::SameLine(); if(ImGui::Button("关闭UI")) {