h2-mod/src/client/component/fastfiles.cpp

133 lines
3.3 KiB
C++
Raw Normal View History

2021-09-06 18:40:37 -04:00
#include <std_include.hpp>
2021-04-29 17:47:05 -04:00
#include "loader/component_loader.hpp"
#include "fastfiles.hpp"
#include "command.hpp"
2022-06-17 14:22:12 -04:00
#include "console.hpp"
2022-05-04 18:48:19 -04:00
#include "localized_strings.hpp"
2022-07-31 17:59:01 -04:00
#include "sound.hpp"
2021-04-29 17:47:05 -04:00
#include <utils/hook.hpp>
#include <utils/concurrency.hpp>
2022-05-04 18:48:19 -04:00
#include <utils/string.hpp>
2021-04-29 17:47:05 -04:00
namespace fastfiles
{
static utils::concurrency::container<std::string> current_fastfile;
namespace
{
utils::hook::detour db_try_load_x_file_internal_hook;
2022-05-04 18:48:19 -04:00
utils::hook::detour db_find_xasset_header;
2021-04-29 17:47:05 -04:00
void db_try_load_x_file_internal(const char* zone_name, const int flags)
{
2022-06-17 14:22:12 -04:00
console::info("Loading fastfile %s\n", zone_name);
2021-04-29 17:47:05 -04:00
current_fastfile.access([&](std::string& fastfile)
{
fastfile = zone_name;
});
return db_try_load_x_file_internal_hook.invoke<void>(zone_name, flags);
}
2022-05-04 18:48:19 -04:00
game::XAssetHeader db_find_xasset_header_stub(game::XAssetType type, const char* name, int allow_create_default)
{
2022-07-31 17:59:01 -04:00
if (type == game::ASSET_TYPE_SOUND)
{
const auto res = sound::find_sound(name);
if (res.sound != nullptr)
{
return res;
}
}
2022-05-04 18:48:19 -04:00
const auto start = game::Sys_Milliseconds();
const auto result = db_find_xasset_header.invoke<game::XAssetHeader>(type, name, allow_create_default);
const auto diff = game::Sys_Milliseconds() - start;
if (diff > 100)
{
2022-06-17 14:22:12 -04:00
console::print(
2022-05-04 18:48:19 -04:00
result.data == nullptr
2022-06-17 14:22:12 -04:00
? console::con_type_error
: console::con_type_warning,
2022-05-04 18:48:19 -04:00
"Waited %i msec for %sasset \"%s\", of type \"%s\"\n",
diff,
result.data == nullptr
? "missing "
: "",
name,
game::g_assetNames[type]
);
}
return result;
}
void add_missing_localized_strings()
{
for (auto map = &game::maps[0]; map->unk; ++map)
{
const auto str = utils::string::va("LUA_MENU_SP_LOCATION_%s",
utils::string::to_upper(map->name).data());
localized_strings::override(str, str);
}
}
2021-04-29 17:47:05 -04:00
}
2022-01-02 17:51:38 -05:00
void enum_assets(const game::XAssetType type, const std::function<void(game::XAssetHeader)>& callback, const bool includeOverride)
{
game::DB_EnumXAssets_Internal(type, static_cast<void(*)(game::XAssetHeader, void*)>([](game::XAssetHeader header, void* data)
{
const auto& cb = *static_cast<const std::function<void(game::XAssetHeader)>*>(data);
cb(header);
}), &callback, includeOverride);
}
2021-04-29 17:47:05 -04:00
std::string get_current_fastfile()
{
std::string fastfile_copy;
2022-05-04 18:48:19 -04:00
return current_fastfile.access<std::string>([&](std::string& fastfile)
2021-04-29 17:47:05 -04:00
{
2022-05-04 18:48:19 -04:00
return fastfile;
2021-04-29 17:47:05 -04:00
});
}
class component final : public component_interface
{
public:
void post_unpack() override
{
2022-05-04 18:48:19 -04:00
db_try_load_x_file_internal_hook.create(0x1404173B0, db_try_load_x_file_internal);
db_find_xasset_header.create(game::DB_FindXAssetHeader, db_find_xasset_header_stub);
add_missing_localized_strings();
2021-04-29 17:47:05 -04:00
command::add("loadzone", [](const command::params& params)
{
if (params.size() < 2)
{
2022-06-17 14:22:12 -04:00
console::info("usage: loadzone <zone>\n");
2021-04-29 17:47:05 -04:00
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++)
{
2022-06-17 14:29:53 -04:00
console::info("g_poolSize[%i]: %i // %s\n", i, game::g_poolSize[i], game::g_assetNames[i]);
2021-04-29 17:47:05 -04:00
}
});
}
};
}
REGISTER_COMPONENT(fastfiles::component)