1
0
mirror of https://github.com/0O0o0oOoO00/Alas.git synced 2026-05-14 14:29:26 +08:00

fix: separate the loading logic of data proxy from the initial load to prevent crashes when data is not loaded

This commit is contained in:
0O0o0oOoO00
2025-11-18 21:30:44 +08:00
parent b81c9d25b1
commit 0b2d60f977
2 changed files with 41 additions and 15 deletions

View File

@@ -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<int>(coin);
}
int Cracker::get_oil() {
ensure_data_proxies();
double oil = m_data_proxy.player["data"]["oil"];
return static_cast<int>(oil);
}
int Cracker::get_gems() {
ensure_data_proxies();
double gems = m_data_proxy.player["data"]["awardGem"];
return static_cast<int>(gems);
}
int Cracker::get_level() {
ensure_data_proxies();
double level = m_data_proxy.player["data"]["level"];
return static_cast<int>(level);
}
int Cracker::get_exp() {
ensure_data_proxies();
double exp = m_data_proxy.player["data"]["exp"];
return static_cast<int>(exp);
}
int Cracker::get_merit() {
ensure_data_proxies();
double merit = m_data_proxy.player["data"]["exploit"];
return static_cast<int>(merit);
}
int Cracker::get_guild_coin() {
ensure_data_proxies();
double guild_coin = m_data_proxy.player["data"]["guildCoin"];
return static_cast<int>(guild_coin);
}
int Cracker::get_design_prt() {
ensure_data_proxies();
double design_prt = m_data_proxy.player["data"]["design_prt"];
return static_cast<int>(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<Lua::Table>(CORE_DATA_ITEM_ID)["count"];
return static_cast<int>(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<Lua::Table>(MEDAL_ITEM_ID)["count"];
return static_cast<int>(medal);
}
int Cracker::get_pt() {
ensure_data_proxies();
double pt = m_data_proxy.player["data"]["pt"];
return static_cast<int>(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<Lua::Table>(SPECIALIZED_CORE_ITEM_ID)["count"];
return static_cast<int>(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<int>(curr_action_point);
}
std::map<Cracker::ShipId, Cracker::ShipInfo> Cracker::scan_dock() {
ensure_data_proxies();
std::map<ShipId, ShipInfo> ships;
Lua::Table dock = m_data_proxy.dock["data"];
for (auto& [ship_id, ship_info] : dock) {
@@ -180,6 +194,7 @@ std::map<Cracker::ShipId, Cracker::ShipInfo> Cracker::scan_dock() {
}
std::map<Cracker::StorageItemId, Cracker::StorageItemCount> Cracker::scan_storage() {
ensure_data_proxies();
std::map<StorageItemId, StorageItemCount> items;
Lua::Table storage = m_data_proxy.storage["data"];
for (auto& [item_id, item_info] : storage) {
@@ -192,6 +207,7 @@ std::map<Cracker::StorageItemId, Cracker::StorageItemCount> Cracker::scan_storag
}
std::optional<Cracker::ShipInfo> Cracker::get_ship_info(ShipId ship_id) {
ensure_data_proxies();
double id = static_cast<double>(ship_id);
Lua::Table dock = m_data_proxy.dock["data"];
try {
@@ -212,6 +228,7 @@ std::optional<Cracker::ShipInfo> Cracker::get_ship_info(ShipId ship_id) {
}
std::optional<Cracker::StorageItemCount> Cracker::get_storage_item_count(StorageItemId item_id) {
ensure_data_proxies();
double id = static_cast<double>(item_id);
Lua::Table storage = m_data_proxy.storage["data"];
try {
@@ -554,21 +571,6 @@ void Cracker::print_value(std::vector<std::string>& 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()) {