#include #include "loader/component_loader.hpp" #include "fastfiles.hpp" #include "command.hpp" #include "game_console.hpp" #include #include namespace fastfiles { static utils::concurrency::container current_fastfile; namespace { utils::hook::detour db_try_load_x_file_internal_hook; void db_try_load_x_file_internal(const char* zone_name, const int flags) { game_console::print(game_console::con_type_info, "Loading fastfile %s\n", zone_name); current_fastfile.access([&](std::string& fastfile) { fastfile = zone_name; }); return db_try_load_x_file_internal_hook.invoke(zone_name, flags); } } std::string get_current_fastfile() { std::string fastfile_copy; current_fastfile.access([&](std::string& fastfile) { fastfile_copy = fastfile; }); return fastfile_copy; } class component final : public component_interface { public: void post_unpack() override { db_try_load_x_file_internal_hook.create(game::base_address + 0x4173B0, &db_try_load_x_file_internal); command::add("loadzone", [](const command::params& params) { if (params.size() < 2) { game_console::print(game_console::con_type_info, "usage: loadzone \n"); return; } game::XZoneInfo info{}; info.name = params.get(1); info.allocFlags = 1; info.freeFlags = 0; game::DB_LoadXAssets(&info, 1u, game::DBSyncMode::DB_LOAD_SYNC); }); command::add("g_poolSizes", []() { for (auto i = 0; i < game::ASSET_TYPE_COUNT; i++) { game_console::print(game_console::con_type_info, "g_poolSize[%i]: %i // %s\n", i, game::g_poolSize[i], game::g_assetNames[i]); } }); } }; } REGISTER_COMPONENT(fastfiles::component)