From 0b2d60f9777271c25e497d58a1d6849daeac5b64 Mon Sep 17 00:00:00 2001 From: 0O0o0oOoO00 <11174151+0O0o0oOoO00@users.noreply.github.com> Date: Tue, 18 Nov 2025 21:30:44 +0800 Subject: [PATCH] fix: separate the loading logic of data proxy from the initial load to prevent crashes when data is not loaded --- blcrack/cracker/cracker.cpp | 53 ++++++++++++++++++++++++++----------- blcrack/cracker/cracker.hpp | 3 +++ 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/blcrack/cracker/cracker.cpp b/blcrack/cracker/cracker.cpp index ca95fe8d8..f8c420435 100644 --- a/blcrack/cracker/cracker.cpp +++ b/blcrack/cracker/cracker.cpp @@ -88,41 +88,49 @@ Cracker& Cracker::Instance() { #endif int Cracker::get_coin() { + ensure_data_proxies(); double coin = m_data_proxy.player["data"]["gold"]; return static_cast(coin); } int Cracker::get_oil() { + ensure_data_proxies(); double oil = m_data_proxy.player["data"]["oil"]; return static_cast(oil); } int Cracker::get_gems() { + ensure_data_proxies(); double gems = m_data_proxy.player["data"]["awardGem"]; return static_cast(gems); } int Cracker::get_level() { + ensure_data_proxies(); double level = m_data_proxy.player["data"]["level"]; return static_cast(level); } int Cracker::get_exp() { + ensure_data_proxies(); double exp = m_data_proxy.player["data"]["exp"]; return static_cast(exp); } int Cracker::get_merit() { + ensure_data_proxies(); double merit = m_data_proxy.player["data"]["exploit"]; return static_cast(merit); } int Cracker::get_guild_coin() { + ensure_data_proxies(); double guild_coin = m_data_proxy.player["data"]["guildCoin"]; return static_cast(guild_coin); } int Cracker::get_design_prt() { + ensure_data_proxies(); double design_prt = m_data_proxy.player["data"]["design_prt"]; return static_cast(design_prt); } @@ -130,6 +138,7 @@ int Cracker::get_design_prt() { #define CORE_DATA_ITEM_ID 59900 int Cracker::get_core_data() { + ensure_data_proxies(); Lua::Table storage = m_data_proxy.storage["data"]; double core_data = storage.get(CORE_DATA_ITEM_ID)["count"]; return static_cast(core_data); @@ -138,12 +147,14 @@ int Cracker::get_core_data() { #define MEDAL_ITEM_ID 15001 int Cracker::get_medal() { + ensure_data_proxies(); Lua::Table storage = m_data_proxy.storage["data"]; double medal = storage.get(MEDAL_ITEM_ID)["count"]; return static_cast(medal); } int Cracker::get_pt() { + ensure_data_proxies(); double pt = m_data_proxy.player["data"]["pt"]; return static_cast(pt); } @@ -151,17 +162,20 @@ int Cracker::get_pt() { #define SPECIALIZED_CORE_ITEM_ID 59010 int Cracker::get_specialized_core() { + ensure_data_proxies(); Lua::Table storage = m_data_proxy.storage["data"]; double specialized_core = storage.get(SPECIALIZED_CORE_ITEM_ID)["count"]; return static_cast(specialized_core); } int Cracker::get_curr_action_point() { + ensure_data_proxies(); double curr_action_point = m_data_proxy.world["world"]["fields"]["staminaMgr"]["fields"]["stamina"]; return static_cast(curr_action_point); } std::map Cracker::scan_dock() { + ensure_data_proxies(); std::map ships; Lua::Table dock = m_data_proxy.dock["data"]; for (auto& [ship_id, ship_info] : dock) { @@ -180,6 +194,7 @@ std::map Cracker::scan_dock() { } std::map Cracker::scan_storage() { + ensure_data_proxies(); std::map items; Lua::Table storage = m_data_proxy.storage["data"]; for (auto& [item_id, item_info] : storage) { @@ -192,6 +207,7 @@ std::map Cracker::scan_storag } std::optional Cracker::get_ship_info(ShipId ship_id) { + ensure_data_proxies(); double id = static_cast(ship_id); Lua::Table dock = m_data_proxy.dock["data"]; try { @@ -212,6 +228,7 @@ std::optional Cracker::get_ship_info(ShipId ship_id) { } std::optional Cracker::get_storage_item_count(StorageItemId item_id) { + ensure_data_proxies(); double id = static_cast(item_id); Lua::Table storage = m_data_proxy.storage["data"]; try { @@ -554,21 +571,6 @@ void Cracker::print_value(std::vector& path) { void Cracker::load_lua_resources() { SPDLOG_INFO("Load lua resources"); - SPDLOG_INFO("Load data proxies"); - Lua::Table proxies = m_state["pg"]["proxyRegister"]["data"]; - for (int i = 1; i <= proxies.size(); ++i) { - Lua::Table proxy = proxies[i]; - std::string proxy_name = proxy["proxyName"]; - if (proxy_name == "PlayerProxy") { - Lua::Table proxy_map = proxy["facade"]["model"]["proxyMap"]; - m_data_proxy.player = proxy_map["PlayerProxy"]; - m_data_proxy.dock = proxy_map["BayProxy"]; - m_data_proxy.storage = proxy_map["BagProxy"]; - } else if (proxy_name == "WorldProxy") { - m_data_proxy.world = proxy["facade"]["model"]["proxyMap"]["WorldProxy"]; - } - } - SPDLOG_INFO("Load lua res"); m_lua_res.Clone = m_state["Clone"]; m_lua_res.Ship_getIntimacyLevel = m_state["Ship"]["getIntimacyLevel"]; @@ -1584,6 +1586,27 @@ void Cracker::load_real_lua_func() { m_real_func.LevelStageView_tryAutoTrigger = m_state["LevelStageView"]["tryAutoTrigger"]; } +void Cracker::ensure_data_proxies() { + if (m_proxy_data_loaded) { + return; + } + + SPDLOG_INFO("Load data proxies"); + Lua::Table proxies = m_state["pg"]["proxyRegister"]["data"]; + for (int i = 1; i <= proxies.size(); ++i) { + Lua::Table proxy = proxies[i]; + std::string proxy_name = proxy["proxyName"]; + if (proxy_name == "PlayerProxy") { + Lua::Table proxy_map = proxy["facade"]["model"]["proxyMap"]; + m_data_proxy.player = proxy_map["PlayerProxy"]; + m_data_proxy.dock = proxy_map["BayProxy"]; + m_data_proxy.storage = proxy_map["BagProxy"]; + } else if (proxy_name == "WorldProxy") { + m_data_proxy.world = proxy["facade"]["model"]["proxyMap"]["WorldProxy"]; + } + } +} + void Cracker::mover_stop(sol::this_state& L) { if (m_mover.moving) { if (m_mover.view.has_value()) { diff --git a/blcrack/cracker/cracker.hpp b/blcrack/cracker/cracker.hpp index 59dd0c354..ec3cd17d1 100644 --- a/blcrack/cracker/cracker.hpp +++ b/blcrack/cracker/cracker.hpp @@ -231,6 +231,8 @@ public: private: void load_real_lua_func(); + void ensure_data_proxies(); + void mover_stop(sol::this_state& L); void mover_go(sol::this_state& L, Lua::Table& view, Lua::Table& path); void mover_step(sol::this_state& L); @@ -293,6 +295,7 @@ private: Lua::Table dock; Lua::Table storage; } m_data_proxy; + bool m_proxy_data_loaded = false; int m_gg_factor = 1; sol::state_view m_state; struct {