Close imagefile handles

This commit is contained in:
fed 2023-01-15 04:05:13 +01:00
parent ee2daaf0e9
commit 1826aef8b4
3 changed files with 62 additions and 0 deletions

View File

@ -478,6 +478,34 @@ namespace fastfiles
{ {
return format_bsp_name(dest, size, mapname); return format_bsp_name(dest, size, mapname);
} }
const char* get_zone_name(const unsigned int index)
{
if (game::environment::is_sp())
{
return game::sp::g_zones[index].name;
}
else
{
return game::mp::g_zones[index].name;
}
}
utils::hook::detour db_unload_x_zones_hook;
void db_unload_x_zones_stub(const unsigned short* unload_zones,
const unsigned int unload_count, const bool create_default)
{
for (auto i = 0u; i < unload_count; i++)
{
const auto zone_name = get_zone_name(unload_zones[i]);
if (zone_name[0] != '\0')
{
imagefiles::close_handle(zone_name);
}
}
db_unload_x_zones_hook.invoke<void>(unload_zones, unload_count, create_default);
}
} }
bool exists(const std::string& zone, bool ignore_usermap) bool exists(const std::string& zone, bool ignore_usermap)
@ -570,6 +598,9 @@ namespace fastfiles
SELECT_VALUE(0x1F5700_b, 0x39A620_b), &db_try_load_x_file_internal); SELECT_VALUE(0x1F5700_b, 0x39A620_b), &db_try_load_x_file_internal);
db_find_xasset_header_hook.create(game::DB_FindXAssetHeader, db_find_xasset_header_stub); db_find_xasset_header_hook.create(game::DB_FindXAssetHeader, db_find_xasset_header_stub);
db_unload_x_zones_hook.create(SELECT_VALUE(0x1F6040_b,
0x39B3C0_b), db_unload_x_zones_stub);
g_dump_scripts = dvars::register_bool("g_dumpScripts", false, game::DVAR_FLAG_NONE, "Dump GSC scripts"); g_dump_scripts = dvars::register_bool("g_dumpScripts", false, game::DVAR_FLAG_NONE, "Dump GSC scripts");
// Allow loading of unsigned fastfiles & imagefiles // Allow loading of unsigned fastfiles & imagefiles

View File

@ -1086,6 +1086,13 @@ namespace game
int freeFlags; int freeFlags;
}; };
struct XZoneInfoInternal
{
char name[64];
int flags;
int isBaseMap;
};
enum XAssetType enum XAssetType
{ {
ASSET_TYPE_PHYSPRESET, ASSET_TYPE_PHYSPRESET,
@ -1897,6 +1904,15 @@ namespace game
}; // size = 1011960 }; // size = 1011960
static_assert(sizeof(client_t) == 1011960); static_assert(sizeof(client_t) == 1011960);
struct XZone
{
char __pad0[32];
char name[64];
char __pad1[408];
};
static_assert(sizeof(XZone) == 504);
} }
namespace sp namespace sp
@ -1918,6 +1934,15 @@ namespace game
struct playerState_s struct playerState_s
{ {
}; };
struct XZone
{
char __pad0[32];
char name[64];
char __pad1[128];
};
static_assert(sizeof(XZone) == 224);
} }
union playerState_s union playerState_s

View File

@ -314,6 +314,8 @@ namespace game
WEAK symbol<void*> DB_XAssetPool{0xEC9FB0, 0x10B4460}; WEAK symbol<void*> DB_XAssetPool{0xEC9FB0, 0x10B4460};
WEAK symbol<const char*> g_assetNames{0x991BA0, 0x10B30D0}; WEAK symbol<const char*> g_assetNames{0x991BA0, 0x10B30D0};
WEAK symbol<XZoneInfoInternal> g_zoneInfo{0x0, 0x5F5A370};
WEAK symbol<unsigned short> g_zoneIndex{0x0, 0x3D1008C};
WEAK symbol< DB_FileSysInterface*> db_fs{0x25C1168, 0x1566C08}; WEAK symbol< DB_FileSysInterface*> db_fs{0x25C1168, 0x1566C08};
@ -346,11 +348,15 @@ namespace game
WEAK symbol<client_state_t*> client_state{0x0, 0x2EC84F0}; WEAK symbol<client_state_t*> client_state{0x0, 0x2EC84F0};
WEAK symbol<connect_state_t*> connect_state{0x0, 0x2EC8510}; WEAK symbol<connect_state_t*> connect_state{0x0, 0x2EC8510};
WEAK symbol<XZone> g_zones{0x0, 0x5F292B0};
} }
namespace sp namespace sp
{ {
WEAK symbol<gentity_s> g_entities{0x56E74D0, 0x0}; WEAK symbol<gentity_s> g_entities{0x56E74D0, 0x0};
WEAK symbol<XZone> g_zones{0x45FE990, 0x0};
} }
namespace hks namespace hks