From 9cad468c0efa32668b32fbbac218fa159c58e6c1 Mon Sep 17 00:00:00 2001 From: 0O0o0oOoO00 <11174151+0O0o0oOoO00@users.noreply.github.com> Date: Sun, 16 Nov 2025 16:20:45 +0800 Subject: [PATCH] add: skip ship gain show --- blcrack/cracker/cracker.cpp | 54 ++++++++++++++++++++++++++ blcrack/cracker/cracker.hpp | 9 +++++ blcrack/cracker/server.cpp | 22 +++++++++++ blcrack/cracker/ui/ui.cpp | 1 + blcrack/http/cracker.http | 6 +++ config/template.json | 3 +- module/config/argument/args.json | 4 ++ module/config/argument/argument.yaml | 1 + module/config/config_generated.py | 1 + module/config/full_config_generated.py | 1 + module/config/i18n/en-US.json | 4 ++ module/config/i18n/ja-JP.json | 4 ++ module/config/i18n/zh-CN.json | 4 ++ module/config/i18n/zh-TW.json | 4 ++ module/luahook/api.py | 6 +++ module/luahook/crack.py | 8 ++++ module/luahook/op.py | 6 +++ 17 files changed, 137 insertions(+), 1 deletion(-) diff --git a/blcrack/cracker/cracker.cpp b/blcrack/cracker/cracker.cpp index 56f653b4f..ea1f38e5b 100644 --- a/blcrack/cracker/cracker.cpp +++ b/blcrack/cracker/cracker.cpp @@ -245,6 +245,7 @@ void Cracker::disable_all() { disable_no_damage(); disable_opsi_force_auto(); disable_opsi_no_map_fog(); + disable_skip_ship_gain_show(); } void Cracker::enable_hooked_lua_function_trace() { @@ -255,6 +256,14 @@ void Cracker::disable_hooked_lua_function_trace() { DISABLE(HOOKED_LUA_FUNCTION_TRACE); } +void Cracker::enable_skip_ship_gain_show() { + ENABLE(SKIP_SHIP_GAIN_SHOW); +} + +void Cracker::disable_skip_ship_gain_show() { + DISABLE(SKIP_SHIP_GAIN_SHOW); +} + void Cracker::enable_opsi_force_auto() { ENABLE(OPSI_FORCE_AUTO); } @@ -522,6 +531,8 @@ void Cracker::load_lua_resources() { .Hit = AttributeType.get("Hit"), .Dodge = AttributeType.get("Dodge"), }; + m_lua_res.BattleResultMediator_GET_NEW_SHIP = m_state["BattleResultMediator"]["GET_NEW_SHIP"]; + m_lua_res.NewBattleResultMediator_GET_NEW_SHIP = m_state["NewBattleResultMediator"]["GET_NEW_SHIP"]; SPDLOG_INFO("Load lua functions"); m_original.GetBattleCheckResult = m_state["GetBattleCheckResult"]; @@ -551,11 +562,47 @@ void Cracker::load_lua_resources() { m_original.Ship_getSkinId = m_state["Ship"]["getSkinId"]; m_original.WorldMap_CanAutoFight = m_state["WorldMap"]["CanAutoFight"]; m_original.WorldMap_UpdateVisionFlag = m_state["WorldMap"]["UpdateVisionFlag"]; + m_original.NewBattleResultDisplayAwardPage_ShowShips = m_state["NewBattleResultDisplayAwardPage"]["ShowShips"]; + m_original.BaseUI_emit = m_state["BaseUI"]["emit"]; } void Cracker::hook_all_lua_functions() { SPDLOG_INFO("Hook lua functions"); + // skip_ship_gain_show + m_state["NewBattleResultDisplayAwardPage"]["ShowShips"] = [this](sol::this_state L, Lua::VariadicArgs args) { + CALLED(NewBattleResultDisplayAwardPage.ShowShips); + if (!IS_ENABLED(SKIP_SHIP_GAIN_SHOW)) { + m_original.NewBattleResultDisplayAwardPage_ShowShips(L, args); + return; + } + + Lua::Function callback = args[2]; + callback(L); + }; + + m_state["BaseUI"]["emit"] = [this](sol::this_state L, Lua::VariadicArgs args) { + CALLED(BaseUI.emit); + if (!IS_ENABLED(SKIP_SHIP_GAIN_SHOW)) { + m_original.BaseUI_emit(L, args); + return; + } + + std::string event_name = args[1]; + if (event_name == m_lua_res.BattleResultMediator_GET_NEW_SHIP + || event_name == m_lua_res.NewBattleResultMediator_GET_NEW_SHIP) { + for (int i = 2; i <= args.size(); ++i) { + Lua::Object obj = args[i]; + if (obj.get_type() == sol::type::function) { + obj.as()(); + return; + } + return; + } + } + m_original.BaseUI_emit(L, args); + }; + // opsi_force_auto m_state["WorldMap"]["CanAutoFight"] = [this](sol::this_state L, Lua::VariadicArgs args) -> bool { if (!IS_ENABLED(OPSI_FORCE_AUTO)) { @@ -1141,6 +1188,7 @@ Cracker::Config Cracker::get_config() { SET_CONFIG_FLAG(NO_DAMAGE), SET_CONFIG_FLAG(OPSI_FORCE_AUTO), SET_CONFIG_FLAG(OPSI_NO_MAP_FOG), + SET_CONFIG_FLAG(SKIP_SHIP_GAIN_SHOW), }, .globle_ship_properties = m_globle_ship_properties, .global_speedup_rate = static_cast(m_global_speedup_rate), @@ -1160,6 +1208,12 @@ void Cracker::apply_config(Config& config) { disable_hooked_lua_function_trace(); } + if(IS_CONFIG_ENABLED(SKIP_SHIP_GAIN_SHOW)) { + enable_skip_ship_gain_show(); + } else { + disable_skip_ship_gain_show(); + } + if(IS_CONFIG_ENABLED(OPSI_FORCE_AUTO)) { enable_opsi_force_auto(); } else { diff --git a/blcrack/cracker/cracker.hpp b/blcrack/cracker/cracker.hpp index c7e54ed49..2a8bb4510 100644 --- a/blcrack/cracker/cracker.hpp +++ b/blcrack/cracker/cracker.hpp @@ -90,6 +90,7 @@ public: bool ALL_SKIN = false; bool OPSI_FORCE_AUTO = false; bool OPSI_NO_MAP_FOG = false; + bool SKIP_SHIP_GAIN_SHOW = false; } flag; ShipProperties globle_ship_properties; int global_speedup_rate = 1; @@ -128,6 +129,9 @@ public: void enable_hooked_lua_function_trace(); void disable_hooked_lua_function_trace(); + void enable_skip_ship_gain_show(); + void disable_skip_ship_gain_show(); + void enable_opsi_force_auto(); void disable_opsi_force_auto(); @@ -231,6 +235,7 @@ private: std::atomic ALL_SKIN = false; std::atomic OPSI_FORCE_AUTO = false; std::atomic OPSI_NO_MAP_FOG = false; + std::atomic SKIP_SHIP_GAIN_SHOW = false; } m_flag; struct { @@ -269,6 +274,8 @@ private: Lua::Function Ship_getSkinId; Lua::Function WorldMap_CanAutoFight; Lua::Function WorldMap_UpdateVisionFlag; + Lua::Function NewBattleResultDisplayAwardPage_ShowShips; + Lua::Function BaseUI_emit; } m_original; struct { Lua::Function Clone; @@ -285,6 +292,8 @@ private: std::string Hit; std::string Dodge; } AttributeType; + std::string BattleResultMediator_GET_NEW_SHIP; + std::string NewBattleResultMediator_GET_NEW_SHIP; } m_lua_res; std::atomic m_exercise_more_power_rate = 0.03; FakePlayerInfo m_fake_player_info; diff --git a/blcrack/cracker/server.cpp b/blcrack/cracker/server.cpp index 5fc6a13b0..5212c4b26 100644 --- a/blcrack/cracker/server.cpp +++ b/blcrack/cracker/server.cpp @@ -894,6 +894,28 @@ CrackerServer::CrackerServer() { CRACK_OK(); }); + Post("/enable_skip_ship_gain_show", [](const httplib::Request& req, httplib::Response& res) { + try { + Cracker::Instance().enable_skip_ship_gain_show(); + } catch (std::exception& e) { + SPDLOG_ERROR("Enable skip ship gain show failed: {}", e.what()); + res.status = 500; + return; + } + CRACK_OK(); + }); + + Post("/disable_skip_ship_gain_show", [](const httplib::Request& req, httplib::Response& res) { + try { + Cracker::Instance().disable_skip_ship_gain_show(); + } catch (std::exception& e) { + SPDLOG_ERROR("Disable skip ship gain show failed: {}", e.what()); + res.status = 500; + return; + } + CRACK_OK(); + }); + Post("/init", [](const httplib::Request& req, httplib::Response& res) { try { Cracker::Instance(); diff --git a/blcrack/cracker/ui/ui.cpp b/blcrack/cracker/ui/ui.cpp index 458cbde0b..899b6b103 100644 --- a/blcrack/cracker/ui/ui.cpp +++ b/blcrack/cracker/ui/ui.cpp @@ -113,6 +113,7 @@ void CrackerUI::draw_menu() { ImGui::Checkbox("怪自杀", &CONFIG_FLAG(MONSTER_KILL_SELF)); ImGui::Checkbox("无伤害无击杀", &CONFIG_FLAG(NO_DAMAGE)); ImGui::Checkbox("全皮肤", &CONFIG_FLAG(ALL_SKIN)); + ImGui::Checkbox("跳过舰船获取展示", &CONFIG_FLAG(SKIP_SHIP_GAIN_SHOW)); ImGui::EndTable(); } diff --git a/blcrack/http/cracker.http b/blcrack/http/cracker.http index 5e458798b..c35354137 100644 --- a/blcrack/http/cracker.http +++ b/blcrack/http/cracker.http @@ -179,6 +179,12 @@ POST http://{{Host}}:{{Port}}/enable_opsi_no_map_fog ### POST http://{{Host}}:{{Port}}/disable_opsi_no_map_fog +### +POST http://{{Host}}:{{Port}}/enable_skip_ship_gain_show + +### +POST http://{{Host}}:{{Port}}/disable_skip_ship_gain_show + ### POST http://{{Host}}:{{Port}}/is_alive diff --git a/config/template.json b/config/template.json index 0cbdcada2..c2d6969f0 100644 --- a/config/template.json +++ b/config/template.json @@ -221,7 +221,8 @@ "SkipBattleCelebrate": false, "NoDamage": false, "OpsiForceAuto": false, - "OpsiNoMapFog": false + "OpsiNoMapFog": false, + "SkipShipGainShow": false }, "ShipProperty": { "Method": "disable", diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 58f1183bb..c2af930ba 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -881,6 +881,10 @@ "OpsiNoMapFog": { "type": "checkbox", "value": false + }, + "SkipShipGainShow": { + "type": "checkbox", + "value": false } }, "ShipProperty": { diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index b30f018b1..41f5b8383 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -886,6 +886,7 @@ Misc: NoDamage: false OpsiForceAuto: false OpsiNoMapFog: false + SkipShipGainShow: false # ==================== Cheat ==================== PowerLimit: diff --git a/module/config/config_generated.py b/module/config/config_generated.py index 1c4d0a254..87ec05c74 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -541,6 +541,7 @@ class GeneratedConfig: Misc_NoDamage = False Misc_OpsiForceAuto = False Misc_OpsiNoMapFog = False + Misc_SkipShipGainShow = False # Group `PowerLimit` PowerLimit_Enable = True diff --git a/module/config/full_config_generated.py b/module/config/full_config_generated.py index 2891ecf40..f09877deb 100644 --- a/module/config/full_config_generated.py +++ b/module/config/full_config_generated.py @@ -155,6 +155,7 @@ class FullGeneratedConfig: Hook_Misc_NoDamage = None Hook_Misc_OpsiForceAuto = None Hook_Misc_OpsiNoMapFog = None + Hook_Misc_SkipShipGainShow = None Hook_ShipProperty_Method = None Hook_ShipProperty_Factor = None Hook_ShipProperty_Armor = None diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 38761adce..7f1b43d85 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -3124,6 +3124,10 @@ "OpsiNoMapFog": { "name": "Misc.OpsiNoMapFog.name", "help": "Misc.OpsiNoMapFog.help" + }, + "SkipShipGainShow": { + "name": "Misc.SkipShipGainShow.name", + "help": "Misc.SkipShipGainShow.help" } }, "PowerLimit": { diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index fd17595e4..1c31b34d2 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -3124,6 +3124,10 @@ "OpsiNoMapFog": { "name": "Misc.OpsiNoMapFog.name", "help": "Misc.OpsiNoMapFog.help" + }, + "SkipShipGainShow": { + "name": "Misc.SkipShipGainShow.name", + "help": "Misc.SkipShipGainShow.help" } }, "PowerLimit": { diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 12f73b413..99d07a09a 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -3124,6 +3124,10 @@ "OpsiNoMapFog": { "name": "大世界移除迷雾", "help": "" + }, + "SkipShipGainShow": { + "name": "跳过舰船获取展示", + "help": "" } }, "PowerLimit": { diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index d71c4dc61..a9bfd8105 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -3124,6 +3124,10 @@ "OpsiNoMapFog": { "name": "Misc.OpsiNoMapFog.name", "help": "Misc.OpsiNoMapFog.help" + }, + "SkipShipGainShow": { + "name": "Misc.SkipShipGainShow.name", + "help": "Misc.SkipShipGainShow.help" } }, "PowerLimit": { diff --git a/module/luahook/api.py b/module/luahook/api.py index 3b8cf9c7b..763f17a35 100644 --- a/module/luahook/api.py +++ b/module/luahook/api.py @@ -325,3 +325,9 @@ class CrackApi: def disable_hooked_lua_function_trace(self): self.post("disable_hooked_lua_function_trace") + + def enable_skip_ship_gain_show(self): + self.post("enable_skip_ship_gain_show") + + def disable_skip_ship_gain_show(self): + self.post("disable_skip_ship_gain_show") diff --git a/module/luahook/crack.py b/module/luahook/crack.py index 522e47e66..b145b7afe 100644 --- a/module/luahook/crack.py +++ b/module/luahook/crack.py @@ -38,6 +38,7 @@ ALL_ENABLE_OPS = [ CrackOp.EnableNoDamage, CrackOp.EnableOpsiForceAuto, CrackOp.EnableOpsiNoMapFog, + CrackOp.EnableSkipShipGainShow, ] REMOTE_PORT = 23897 @@ -252,6 +253,11 @@ def do_crack_op(config: AzurLaneConfig, device: Device, ops: Union[Type[CrackOp. api.enable_opsi_no_map_fog() elif op == CrackOp.DisableOpsiNoMapFog: api.disable_opsi_no_map_fog() + elif op == CrackOp.EnableSkipShipGainShow: + if full_config.Hook_Misc_SkipShipGainShow: + api.enable_skip_ship_gain_show() + elif op == CrackOp.DisableSkipShipGainShow: + api.disable_skip_ship_gain_show() else: logger.error(f"Unsupported op: {op}") @@ -303,6 +309,7 @@ CHAPTER_CRACK_OPS = [ CrackOp.EnableMonsterKillSelf, CrackOp.EnableSkipBattleCelebrate, CrackOp.EnableNoDamage, + CrackOp.EnableSkipShipGainShow, ] @@ -330,6 +337,7 @@ OPSI_CRACK_OPS = [ CrackOp.EnableNoDamage, CrackOp.EnableOpsiForceAuto, CrackOp.EnableOpsiNoMapFog, + CrackOp.EnableSkipShipGainShow, ] diff --git a/module/luahook/op.py b/module/luahook/op.py index de626acba..3e48d8ab3 100644 --- a/module/luahook/op.py +++ b/module/luahook/op.py @@ -136,3 +136,9 @@ class CrackOp: class DisableOpsiNoMapFog(Op): ... + + class EnableSkipShipGainShow(Op): + ... + + class DisableSkipShipGainShow(Op): + ...