Some change for loading codo maps

This commit is contained in:
GEEKiDoS 2021-06-12 07:58:12 +08:00
parent 2541533434
commit 440ae1d9d7

View File

@ -1381,7 +1381,7 @@ namespace Components
char* varWeaponAttach = *reinterpret_cast<char**>(0x112ADE0); // varAddonMapEnts char* varWeaponAttach = *reinterpret_cast<char**>(0x112ADE0); // varAddonMapEnts
// and do the stuff // and do the stuff
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
Game::Load_Stream(true, varWeaponAttach, 20); Game::Load_Stream(true, varWeaponAttach, 20);
@ -1426,7 +1426,7 @@ namespace Components
bool Zones::LoadMaterialShaderArgumentArray(bool atStreamStart, Game::MaterialShaderArgument* argument, int size) bool Zones::LoadMaterialShaderArgumentArray(bool atStreamStart, Game::MaterialShaderArgument* argument, int size)
{ {
// if (Zones::ZoneVersion >= 448 && currentAssetType == Game::XAssetType::ASSET_TYPE_FX) __debugbreak(); // if (Zones::ZoneVersion >= 446 && currentAssetType == Game::XAssetType::ASSET_TYPE_FX) __debugbreak();
bool result = Game::Load_Stream(atStreamStart, argument, size); bool result = Game::Load_Stream(atStreamStart, argument, size);
Game::MaterialPass* curPass = *Game::varMaterialPass; Game::MaterialPass* curPass = *Game::varMaterialPass;
@ -1436,13 +1436,13 @@ namespace Components
{ {
Game::MaterialShaderArgument* arg = &argument[i]; Game::MaterialShaderArgument* arg = &argument[i];
if (Zones::Version() < 448) if (arg->type != D3DSHADER_PARAM_REGISTER_TYPE::D3DSPR_TEXTURE && arg->type != D3DSHADER_PARAM_REGISTER_TYPE::D3DSPR_ATTROUT)
{ {
if (arg->type != D3DSHADER_PARAM_REGISTER_TYPE::D3DSPR_TEXTURE && arg->type != D3DSHADER_PARAM_REGISTER_TYPE::D3DSPR_ATTROUT) continue;
{ }
continue;
}
if (Zones::Version() < 446)
{
// should be min 68 currently // should be min 68 currently
// >= 58 fixes foliage without bad side effects // >= 58 fixes foliage without bad side effects
// >= 53 still has broken shadow mapping // >= 53 still has broken shadow mapping
@ -1489,7 +1489,100 @@ namespace Components
{ {
if (arg->type == 3 || arg->type == 5) if (arg->type == 3 || arg->type == 5)
{ {
if (Zones::Version() == 460 /*|| Zones::Version() == 448*/) // 448 is no longer compatible, needs correct mappings // 446 is from a special client version that had lot of
// unrelased/unfinished maps, is just enough for explore,
// trees had issue with it
if (Zones::Version() == 446)
{
static std::unordered_map<std::uint16_t, std::uint16_t> mapped_constants = {
{ 33, 31 },
{ 34, 32 },
{ 36, 34 },
{ 39, 37 },
{ 40, 38 },
{ 42, 40 },
{ 43, 41 },
{ 45, 43 },
{ 62, 52 },
{ 63, 53 },
{ 199, 58 },
{ 259, 86 },
{ 263, 90 },
{ 271, 98 },
{ 279, 106 },
};
const auto itr = mapped_constants.find(arg->u.codeConst.index);
if (itr != mapped_constants.end())
{
arg->u.codeConst.index = itr->second;
}
}
else if (Zones::Version() == 461)
{
static std::unordered_map<std::uint16_t, std::uint16_t> mapped_constants =
{
// mp_raid
{ 33, 31 },
{ 34, 32 },
{ 36, 34 },
{ 39, 37 },
{ 40, 38 },
{ 42, 40 },
{ 43, 41 },
{ 45, 43 },
{ 62, 52 },
{ 63, 53 },
{ 197, 58 },
{ 202, 63 },
{ 203, 64 },
{ 261, 90 },
{ 265, 94 },
{ 269, 98 },
{ 277, 106 },
// mp_dome
{ 38, 36 },
{ 40, 38 },
{ 118, 86 },
};
const auto itr = mapped_constants.find(arg->u.codeConst.index);
if (itr != mapped_constants.end())
{
arg->u.codeConst.index = itr->second;
}
if (arg->u.codeConst.index == 257)
{
auto techsetName = (*reinterpret_cast<Game::MaterialTechniqueSet**>(0x112AE8C))->name;
// dont know if this applies to 460 too, but I dont have 460 files to test
if (!strncmp(techsetName, "wc_unlit_add", 12) ||
!strncmp(techsetName, "wc_unlit_multiply", 17) )
{
// fixes glass and water
arg->u.codeConst.index = 116;
}
else
{
// anything else
arg->u.codeConst.index = 86;
}
}
else
{
// copy-paste from 460
if (arg->u.codeConst.index >= 259)
{
arg->u.codeConst.index -= 171;
}
else if (arg->u.codeConst.index >= 197)
{
arg->u.codeConst.index -= 139;
}
}
}
else if (Zones::Version() == 460 /*|| Zones::Version() == 446*/) // 446 is no longer compatible, needs correct mappings
{ {
static std::unordered_map<std::uint16_t, std::uint16_t> mapped_constants = { static std::unordered_map<std::uint16_t, std::uint16_t> mapped_constants = {
{ 22, 21 }, { 22, 21 },
@ -1741,8 +1834,8 @@ namespace Components
{ {
// 359 and above adds an extra remapped techset ptr // 359 and above adds an extra remapped techset ptr
if (Zones::ZoneVersion >= 359) size += 4; if (Zones::ZoneVersion >= 359) size += 4;
// 448 amd above adds an additional technique // 446 amd above adds an additional technique
if (Zones::ZoneVersion >= 448) size += 4; if (Zones::ZoneVersion >= 446) size += 4;
bool result = Game::Load_Stream(atStreamStart, buffer, size); bool result = Game::Load_Stream(atStreamStart, buffer, size);
@ -1754,22 +1847,22 @@ namespace Components
// As MW2 flags are only 1 byte large, this won't be possible anyways // As MW2 flags are only 1 byte large, this won't be possible anyways
int shiftTest = 4; int shiftTest = 4;
std::memmove(buffer + 8 + shiftTest, buffer + 12 + shiftTest, (Zones::Version() >= 448) ? 200 : 196 - shiftTest); std::memmove(buffer + 8 + shiftTest, buffer + 12 + shiftTest, (Zones::Version() >= 446) ? 200 : 196 - shiftTest);
AssetHandler::Relocate(buffer + 12 + shiftTest, buffer + 8 + shiftTest, (Zones::Version() >= 448) ? 200 : 196 - shiftTest); AssetHandler::Relocate(buffer + 12 + shiftTest, buffer + 8 + shiftTest, (Zones::Version() >= 446) ? 200 : 196 - shiftTest);
} }
return result; return result;
} }
int Zones::LoadMaterialTechniqueArray(bool atStreamStart, int count) int Zones::LoadMaterialTechniqueArray(bool atStreamStart, int count)
{ {
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
count += 1; count += 1;
} }
auto retval = Utils::Hook::Call<int(bool, int)>(0x497020)(atStreamStart, count); auto retval = Utils::Hook::Call<int(bool, int)>(0x497020)(atStreamStart, count);
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
auto lastTechnique = **reinterpret_cast<Game::MaterialTechnique * **>(0x112AEDC); auto lastTechnique = **reinterpret_cast<Game::MaterialTechnique * **>(0x112AEDC);
auto varMaterialTechniqueSet = **reinterpret_cast<Game::MaterialTechniqueSet * **>(0x112B070); auto varMaterialTechniqueSet = **reinterpret_cast<Game::MaterialTechniqueSet * **>(0x112B070);
@ -1783,11 +1876,11 @@ namespace Components
bool Zones::LoadMaterial(bool atStreamStart, char* buffer, int size) bool Zones::LoadMaterial(bool atStreamStart, char* buffer, int size)
{ {
// if (Zones::ZoneVersion >= 448 && currentAssetType == Game::ASSET_TYPE_XMODEL) __debugbreak(); // if (Zones::ZoneVersion >= 446 && currentAssetType == Game::ASSET_TYPE_XMODEL) __debugbreak();
bool result = Game::Load_Stream(atStreamStart, buffer, (Zones::Version() >= 448) ? 104 : size); bool result = Game::Load_Stream(atStreamStart, buffer, (Zones::Version() >= 446) ? 104 : size);
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
char codol_material[104]; char codol_material[104];
memcpy(codol_material, buffer, 104); memcpy(codol_material, buffer, 104);
@ -1990,7 +2083,7 @@ namespace Components
void Zones::LoadImpactFx(bool atStreamStart, char* buffer, int size) void Zones::LoadImpactFx(bool atStreamStart, char* buffer, int size)
{ {
if (Zones::Version() >= 460) size = 0xB94; if (Zones::Version() >= 460) size = 0xB94;
else if (Zones::Version() >= 448) size = 0xA64; else if (Zones::Version() >= 446) size = 0xA64;
else if (Zones::Version() >= VERSION_ALPHA2) size = 0x8C0; else if (Zones::Version() >= VERSION_ALPHA2) size = 0x8C0;
Game::Load_Stream(atStreamStart, buffer, size); Game::Load_Stream(atStreamStart, buffer, size);
@ -2007,7 +2100,7 @@ namespace Components
int Zones::ImpactFxArrayCount() int Zones::ImpactFxArrayCount()
{ {
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
return 19; return 19;
} }
@ -2170,7 +2263,7 @@ namespace Components
int Zones::LoadRandomFxGarbage(bool atStreamStart, char* buffer, int size) int Zones::LoadRandomFxGarbage(bool atStreamStart, char* buffer, int size)
{ {
int count = 0; int count = 0;
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
size /= 48; size /= 48;
count = size; count = size;
@ -2179,7 +2272,7 @@ namespace Components
const auto retval = Game::Load_Stream(atStreamStart, buffer, size); const auto retval = Game::Load_Stream(atStreamStart, buffer, size);
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
for (auto i = 0; i < count; i++) for (auto i = 0; i < count; i++)
{ {
@ -2258,7 +2351,7 @@ namespace Components
{ {
int count = 0; int count = 0;
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
size /= 12; size /= 12;
count = size; count = size;
@ -2267,7 +2360,7 @@ namespace Components
auto retval = Game::Load_Stream(atStreamStart, buffer, size); auto retval = Game::Load_Stream(atStreamStart, buffer, size);
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
@ -2332,8 +2425,8 @@ namespace Components
cmp dword ptr[eax], 0xFFFFFFFF; cmp dword ptr[eax], 0xFFFFFFFF;
je loadAssetData; je loadAssetData;
// check if FF is below 448, still load data in that case // check if FF is below 446, still load data in that case
cmp Zones::ZoneVersion, 448; cmp Zones::ZoneVersion, 446;
jl loadAssetData; jl loadAssetData;
// offset to pointer magic // offset to pointer magic
@ -2426,7 +2519,7 @@ namespace Components
int Zones::LoadMapEnts(bool atStreamStart, Game::MapEnts* buffer, int size) int Zones::LoadMapEnts(bool atStreamStart, Game::MapEnts* buffer, int size)
{ {
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
size /= 44; size /= 44;
size *= 36; size *= 36;
@ -2583,7 +2676,7 @@ namespace Components
int Zones::LoadClipMap(bool atStreamStart) int Zones::LoadClipMap(bool atStreamStart)
{ {
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
AssertOffset(codolClipMap_t, pInfo, 72); AssertOffset(codolClipMap_t, pInfo, 72);
@ -3139,8 +3232,8 @@ namespace Components
cmp dword ptr[edx + 4], 0xFFFFFFFF; cmp dword ptr[edx + 4], 0xFFFFFFFF;
je loadAssetData; je loadAssetData;
// check if FF is below 448, still load data in that case // check if FF is below 446, still load data in that case
cmp Zones::ZoneVersion, 448; cmp Zones::ZoneVersion, 446;
jl loadAssetData; jl loadAssetData;
// offset to pointer magic // offset to pointer magic
@ -3171,8 +3264,8 @@ namespace Components
cmp dword ptr[eax + 0Ch], 0xFFFFFFFF; cmp dword ptr[eax + 0Ch], 0xFFFFFFFF;
je loadAssetData; je loadAssetData;
// check if FF is below 448, still load data in that case // check if FF is below 446, still load data in that case
cmp Zones::ZoneVersion, 448; cmp Zones::ZoneVersion, 446;
jl loadAssetData; jl loadAssetData;
// offset to pointer magic // offset to pointer magic
@ -3203,8 +3296,8 @@ namespace Components
cmp dword ptr[eax + 14h], 0xFFFFFFFF; cmp dword ptr[eax + 14h], 0xFFFFFFFF;
je loadAssetData; je loadAssetData;
// check if FF is below 448, still load data in that case // check if FF is below 446, still load data in that case
cmp Zones::ZoneVersion, 448; cmp Zones::ZoneVersion, 446;
jl loadAssetData; jl loadAssetData;
// offset to pointer magic // offset to pointer magic
@ -3273,11 +3366,11 @@ namespace Components
void Zones::LoadXModelAsset(Game::XModel** asset) void Zones::LoadXModelAsset(Game::XModel** asset)
{ {
if (Zones::Version() >= 448) if (Zones::Version() >= 446)
{ {
for (int i = 0; i < (*asset)->numLods; i++) for (int i = 0; i < (*asset)->numLods; i++)
{ {
if ((*asset)->lodInfo[i].surfs == nullptr && Zones::Version() >= 448) if ((*asset)->lodInfo[i].surfs == nullptr && Zones::Version() >= 446)
{ {
const auto name = (*asset)->name; const auto name = (*asset)->name;
const auto fx_model = Game::DB_FindXAssetHeader(Game::XAssetType::ASSET_TYPE_XMODEL, "void").model; const auto fx_model = Game::DB_FindXAssetHeader(Game::XAssetType::ASSET_TYPE_XMODEL, "void").model;
@ -3303,7 +3396,7 @@ namespace Components
void Zones::LoadMaterialAsset(Game::Material** asset) void Zones::LoadMaterialAsset(Game::Material** asset)
{ {
if (asset && *asset && Zones::Version() >= 448) if (asset && *asset && Zones::Version() >= 446)
{ {
static std::vector<std::string> broken_materials = { static std::vector<std::string> broken_materials = {
"gfx_fxt_debris_wind_ash_z10", "gfx_fxt_debris_wind_ash_z10",