diff --git a/src/client/component/arena.cpp b/src/client/component/arena.cpp index 2ee2bf5f..96d998cd 100644 --- a/src/client/component/arena.cpp +++ b/src/client/component/arena.cpp @@ -13,91 +13,45 @@ namespace { - struct UISpawnPos - { - float allySpawnPos[2]; - float axisSpawnPos[2]; - float objectives[5][2]; - }; - - struct mapInfo - { - char mapName[32]; - char mapLoadName[16]; - char mapDescription[32]; - char mapLoadImage[32]; - char mapCustomKey[32][16]; - char mapCustomValue[32][64]; - int mapCustomCount; - char mapCamoTypes[2][16]; - int isAliensMap; - int mapPack; - int unk1; - int gametype; - char __pad0[132]; - UISpawnPos mapSpawnPos[32]; - }; - static_assert(sizeof(mapInfo) == 4648); - - int* ui_num_arenas; - int* ui_arena_buf_pos; - - std::recursive_mutex _mutex; + std::recursive_mutex arena_mutex; bool parse_arena(const std::string& path) { - std::lock_guard $(_mutex); + std::lock_guard _0(arena_mutex); - char rawfile_buffer[0x18000]; - memset(rawfile_buffer, 0, sizeof(rawfile_buffer)); - - // read from disk - auto buffer = filesystem::read_file(path); - if (buffer.size()) + std::string buffer{}; + if (filesystem::read_file(path, &buffer) && !buffer.empty()) { - //console::debug("[DISK]: parsing arena \"%s\"...\n", path.data()); - - // GameInfo_ParseArenas - *ui_num_arenas += utils::hook::invoke(0x4DE0B0_b, buffer.data(), MAX_ARENAS - *ui_num_arenas, - reinterpret_cast(std::uintptr_t(0xAA55AE0_b) + (*ui_num_arenas * 8))); - + *game::ui_num_arenas += game::GameInfo_ParseArenas(buffer.data(), MAX_ARENAS - *game::ui_num_arenas, + &game::ui_arena_infos[*game::ui_num_arenas]); return true; } - // read from fastfile - // DB_ReadRawFile - auto* buf = utils::hook::invoke(0x3994B0_b, path.data(), rawfile_buffer, sizeof(rawfile_buffer)); + char rawfile_buffer[0x18000] = {0}; + const auto buf = game::DB_ReadRawFile(path.data(), rawfile_buffer, sizeof(rawfile_buffer)); if (buf) { - //console::debug("[FF]: parsing arena \"%s\"...\n", path.data()); - - // GameInfo_ParseArenas - *ui_num_arenas += utils::hook::invoke(0x4DE0B0_b, buf, MAX_ARENAS - *ui_num_arenas, - reinterpret_cast(std::uintptr_t(0xAA55AE0_b) + (*ui_num_arenas * 8))); - + *game::ui_num_arenas += game::GameInfo_ParseArenas(buf, MAX_ARENAS - *game::ui_num_arenas, + &game::ui_arena_infos[*game::ui_num_arenas]); return true; } - //console::debug("could not parse arena \"%s\"\n", path.data()); return false; } void load_arenas_stub() { - *ui_num_arenas = 0; - *ui_arena_buf_pos = 0; + *game::ui_num_arenas = 0; + *game::ui_arena_buf_pos = 0; - // parse basemaps parse_arena("mp/basemaps.arena"); // read usermap arena from disk - auto mapname = game::Dvar_FindVar("ui_mapname"); + const auto mapname = game::Dvar_FindVar("ui_mapname"); if (mapname && mapname->current.string) { - auto usermap_path = "usermaps/"s + mapname->current.string; - auto arena_path = usermap_path + "/" + mapname->current.string + ".arena"; - - // try parsing arena + const auto usermap_path = "usermaps/"s + mapname->current.string; + const auto arena_path = usermap_path + "/" + mapname->current.string + ".arena"; parse_arena(arena_path); } } @@ -115,14 +69,10 @@ namespace arena return; } - // patch arena stuff - ui_num_arenas = reinterpret_cast(0xAA55AD8_b); - ui_arena_buf_pos = reinterpret_cast(0xAA55ADC_b); - // load custom arenas utils::hook::jump(0x4DE030_b, load_arenas_stub); } }; } -REGISTER_COMPONENT(arena::component) \ No newline at end of file +REGISTER_COMPONENT(arena::component) diff --git a/src/client/game/structs.hpp b/src/client/game/structs.hpp index 5fb49d9d..2d1fc2fa 100644 --- a/src/client/game/structs.hpp +++ b/src/client/game/structs.hpp @@ -1563,6 +1563,33 @@ namespace game int unk; }; + struct UISpawnPos + { + float allySpawnPos[2]; + float axisSpawnPos[2]; + float objectives[5][2]; + }; + + struct mapInfo + { + char mapName[32]; + char mapLoadName[16]; + char mapDescription[32]; + char mapLoadImage[32]; + char mapCustomKey[32][16]; + char mapCustomValue[32][64]; + int mapCustomCount; + char mapCamoTypes[2][16]; + int isAliensMap; + int mapPack; + int unk1; + int gametype; + char __pad0[132]; + UISpawnPos mapSpawnPos[32]; + }; + + static_assert(sizeof(mapInfo) == 4648); + namespace mp { struct cachedSnapshot_t diff --git a/src/client/game/symbols.hpp b/src/client/game/symbols.hpp index a313c0fa..3e2b6086 100644 --- a/src/client/game/symbols.hpp +++ b/src/client/game/symbols.hpp @@ -112,6 +112,8 @@ namespace game WEAK symbol G_SelectWeapon{0x2F2EA0, 0x462560}; WEAK symbol G_TakePlayerWeapon{0x2F3050, 0x462770}; + WEAK symbol GameInfo_ParseArenas{0x0, 0x4DE0B0}; + WEAK symbol I_CleanStr{0x4293E0, 0x5AF2E0}; WEAK symbol Key_KeynumToString{0x1AC410, 0x199990}; @@ -192,6 +194,7 @@ namespace game WEAK symbol DB_GetRawFileLen{0x1F1F40, 0x3961B0}; WEAK symbol DB_GetRawBuffer{0x1F1E00, 0x396080}; + WEAK symbol DB_ReadRawFile{0x0, 0x3994B0}; WEAK symbol DB_FileExists{0x1F0D50, 0x394DC0}; WEAK symbol DB_LoadXAssets{0x1F31E0, 0x397500}; @@ -303,6 +306,10 @@ namespace game WEAK symbol threadIds{0xB896210, 0xAC80740}; + WEAK symbol ui_num_arenas{0x0, 0xAA55AD8}; + WEAK symbol ui_arena_buf_pos{0x0, 0xAA55ADC}; + WEAK symbol ui_arena_infos{0x0, 0xAA55AE0}; + WEAK symbol level_time{0x56DBAA0, 0x7361F9C}; WEAK symbol maps{0x7CE5A0, 0x926C80};