#include #include "loader/component_loader.hpp" #include "fastfiles.hpp" #include "game/game.hpp" #include namespace weapon { namespace { utils::hook::detour g_setup_level_weapon_def_hook; void g_setup_level_weapon_def_stub() { // precache level weapons first g_setup_level_weapon_def_hook.invoke(); std::vector weapons; // find all weapons in asset pools fastfiles::enum_assets(game::ASSET_TYPE_WEAPON, [&weapons](game::XAssetHeader header) { weapons.push_back(header.weapon); }, false); // sort weapons std::sort(weapons.begin(), weapons.end(), [](game::WeaponCompleteDef* weapon1, game::WeaponCompleteDef* weapon2) { return std::string_view(weapon1->name) < std::string_view(weapon2->name); }); // precache items for (std::size_t i = 0; i < weapons.size(); i++) { //console::debug("precaching weapon \"%s\"\n", weapons[i]->name); game::G_GetWeaponForName(weapons[i]->name); } } } class component final : public component_interface { public: void post_unpack() override { if (!game::environment::is_sp()) { // precache all weapons that are loaded in zones g_setup_level_weapon_def_hook.create(0x1403DA910, g_setup_level_weapon_def_stub); } } }; } REGISTER_COMPONENT(weapon::component)