#include #include "loader/component_loader.hpp" #include "fastfiles.hpp" #include "command.hpp" #include "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) { printf("Loading fastfile %s\n", zone_name); current_fastfile.access([&](std::string& fastfile) { fastfile = zone_name; }); db_try_load_x_file_internal_hook.invoke(zone_name, flags); } } std::string get_current_fastfile() { return current_fastfile.access([&](std::string& fastfile) { return fastfile; }); } void enum_assets(const game::XAssetType type, const std::function& callback, const bool includeOverride) { game::DB_EnumXAssets_Internal(type, static_cast([](game::XAssetHeader header, void* data) { const auto& cb = *static_cast*>(data); cb(header); }), &callback, includeOverride); } class component final : public component_interface { public: void post_unpack() override { db_try_load_x_file_internal_hook.create( SELECT_VALUE(0x1401CDDD0, 0x1402BFFE0), &db_try_load_x_file_internal); } }; } REGISTER_COMPONENT(fastfiles::component)