Add zone priority option to zones.csv
This commit is contained in:
parent
a913dac149
commit
758b2d2006
@ -128,13 +128,14 @@ namespace fastfiles
|
||||
return true;
|
||||
}
|
||||
|
||||
void add_mod_zones(std::vector<game::XZoneInfo>& zones, utils::memory::allocator& allocator)
|
||||
void add_mod_zones(std::vector<game::XZoneInfo>& zones, utils::memory::allocator& allocator,
|
||||
const mods::zone_priority priority)
|
||||
{
|
||||
try_add_zone(zones, allocator, "mod", true);
|
||||
const auto mod_zones = mods::get_mod_zones();
|
||||
for (const auto& zone : mod_zones)
|
||||
{
|
||||
if (zone.alloc_flags & game::DB_ZONE_COMMON)
|
||||
if ((zone.alloc_flags & game::DB_ZONE_COMMON) && zone.priority == priority)
|
||||
{
|
||||
try_add_zone(zones, allocator, zone.name, true);
|
||||
}
|
||||
@ -158,6 +159,7 @@ namespace fastfiles
|
||||
utils::memory::allocator allocator;
|
||||
std::vector<game::XZoneInfo> zones;
|
||||
try_add_zone(zones, allocator, "h2_mod_pre_gfx", true);
|
||||
add_mod_zones(zones, allocator, mods::zone_priority::pre_gfx);
|
||||
push_zones(zones, zone_info, zone_count);
|
||||
|
||||
game::DB_LoadXAssets(zones.data(), static_cast<int>(zones.size()), sync_mode);
|
||||
@ -175,6 +177,8 @@ namespace fastfiles
|
||||
std::vector<game::XZoneInfo> zones;
|
||||
|
||||
try_add_zone(zones, allocator, "h2_mod_common", true);
|
||||
add_mod_zones(zones, allocator, mods::zone_priority::post_gfx);
|
||||
|
||||
for (auto i = 0u; i < zone_count; i++)
|
||||
{
|
||||
zones.push_back(zone_info[i]);
|
||||
@ -185,7 +189,7 @@ namespace fastfiles
|
||||
}
|
||||
}
|
||||
|
||||
add_mod_zones(zones, allocator);
|
||||
add_mod_zones(zones, allocator, mods::zone_priority::post_common);
|
||||
|
||||
game::DB_LoadXAssets(zones.data(), static_cast<int>(zones.size()), sync_mode);
|
||||
}
|
||||
@ -458,12 +462,12 @@ namespace fastfiles
|
||||
add_custom_level_load_zone(load, name, size_est);
|
||||
}
|
||||
|
||||
void add_mod_zones_to_load(game::LevelLoad* load)
|
||||
void add_mod_zones_to_load(game::LevelLoad* load, const mods::zone_priority priority)
|
||||
{
|
||||
const auto mod_zones = mods::get_mod_zones();
|
||||
for (const auto& zone : mod_zones)
|
||||
{
|
||||
if (zone.alloc_flags & game::DB_ZONE_GAME)
|
||||
if ((zone.alloc_flags & game::DB_ZONE_GAME) && zone.priority == priority)
|
||||
{
|
||||
add_custom_level_load_zone(load, zone.name.data(), 0x40000);
|
||||
}
|
||||
@ -476,6 +480,7 @@ namespace fastfiles
|
||||
|
||||
a.pushad64();
|
||||
a.mov(rcx, rbx);
|
||||
a.mov(rdx, mods::zone_priority::pre_map);
|
||||
a.call_aligned(add_mod_zones_to_load);
|
||||
a.popad64();
|
||||
|
||||
@ -529,6 +534,8 @@ namespace fastfiles
|
||||
{
|
||||
add_custom_level_load_zone(load, name, size_est);
|
||||
}
|
||||
|
||||
add_mod_zones_to_load(load, mods::zone_priority::post_map);
|
||||
}
|
||||
|
||||
void db_load_xassets_stub(game::XZoneInfo* info, unsigned int zone_count, game::DBSyncMode sync_mode)
|
||||
|
@ -40,16 +40,53 @@ namespace mods
|
||||
{"game", game::DB_ZONE_GAME},
|
||||
};
|
||||
|
||||
std::unordered_map<std::string, zone_priority> priority_map =
|
||||
{
|
||||
{"none", zone_priority::none},
|
||||
|
||||
{"pre_gfx", zone_priority::post_gfx},
|
||||
{"post_gfx", zone_priority::post_gfx},
|
||||
{"post_common", zone_priority::post_common},
|
||||
|
||||
{"pre_map", zone_priority::pre_map},
|
||||
{"post_map", zone_priority::post_map},
|
||||
};
|
||||
|
||||
unsigned int get_alloc_flag(const std::string& name)
|
||||
{
|
||||
const auto lower = utils::string::to_lower(name);
|
||||
if (alloc_flags_map.find(lower) != alloc_flags_map.end())
|
||||
if (const auto iter = alloc_flags_map.find(lower); iter != alloc_flags_map.end())
|
||||
{
|
||||
return alloc_flags_map[lower];
|
||||
return iter->second;
|
||||
}
|
||||
|
||||
return game::DB_ZONE_COMMON;
|
||||
}
|
||||
|
||||
zone_priority get_default_zone_priority(unsigned int alloc_flags)
|
||||
{
|
||||
if (alloc_flags & game::DB_ZONE_COMMON)
|
||||
{
|
||||
return zone_priority::post_common;
|
||||
}
|
||||
else if (alloc_flags & game::DB_ZONE_GAME)
|
||||
{
|
||||
return zone_priority::pre_map;
|
||||
}
|
||||
|
||||
return zone_priority::none;
|
||||
}
|
||||
|
||||
zone_priority get_zone_priority(const std::string& name, unsigned int alloc_flags)
|
||||
{
|
||||
const auto lower = utils::string::to_lower(name);
|
||||
if (const auto iter = priority_map.find(lower); iter != priority_map.end())
|
||||
{
|
||||
return iter->second;
|
||||
}
|
||||
|
||||
return get_default_zone_priority(alloc_flags);
|
||||
}
|
||||
|
||||
utils::hook::detour db_release_xassets_hook;
|
||||
bool release_assets = false;
|
||||
@ -113,13 +150,28 @@ namespace mods
|
||||
continue;
|
||||
}
|
||||
|
||||
mod_zone zone{};
|
||||
|
||||
const auto alloc_flags = get_alloc_flag(values[0]) | game::DB_ZONE_CUSTOM;
|
||||
if (alloc_flags & game::DB_ZONE_COMMON)
|
||||
{
|
||||
mod_info.zone_info.has_common_zones = true;
|
||||
}
|
||||
|
||||
mod_info.zone_info.zones.emplace_back(values[1], alloc_flags);
|
||||
zone.alloc_flags = alloc_flags;
|
||||
|
||||
if (values.size() <= 2)
|
||||
{
|
||||
zone.name = values[1];
|
||||
zone.priority = get_default_zone_priority(zone.alloc_flags);
|
||||
mod_info.zone_info.zones.emplace_back(zone);
|
||||
}
|
||||
else
|
||||
{
|
||||
zone.name = values[2];
|
||||
zone.priority = get_zone_priority(values[1], zone.alloc_flags);
|
||||
mod_info.zone_info.zones.emplace_back(zone);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,10 +2,25 @@
|
||||
|
||||
namespace mods
|
||||
{
|
||||
enum zone_priority
|
||||
{
|
||||
none,
|
||||
|
||||
// common
|
||||
pre_gfx,
|
||||
post_gfx,
|
||||
post_common,
|
||||
|
||||
// game
|
||||
pre_map,
|
||||
post_map,
|
||||
};
|
||||
|
||||
struct mod_zone
|
||||
{
|
||||
std::string name;
|
||||
unsigned int alloc_flags;
|
||||
zone_priority priority;
|
||||
};
|
||||
|
||||
bool mod_requires_restart(const std::string& path);
|
||||
|
Loading…
x
Reference in New Issue
Block a user