iw4x-client/src/Components/Modules/Zones.cpp

1158 lines
27 KiB
C++
Raw Normal View History

2016-09-18 09:10:23 -04:00
#include "STDInclude.hpp"
namespace Components
{
int Zones::ZoneVersion;
2016-09-18 12:08:30 -04:00
extern bool* useEntryNames;
Utils::Hook fxEffectLoadHook;
DWORD fxEffectLoadHookLoc = 0x49591B;
static DWORD fxEffectStringValue[64];
static int fxEffectIndex = 0;
int ffVersion = 0;
#define VERSION_ALPHA2 316
#define VERSION_ALPHA3 318//319
void FxEffectLoadHookFunc(int a1, char* buffer, int len)
{
len /= 252;
int count = len;
len *= 260;
__asm
{
push len
push buffer
push a1
call fxEffectLoadHook.Original
add esp, 0Ch
}
fxEffectIndex = 0;
char* tempVar = new char[len];
for (int i = 0; i < count; i++)
{
AssetHandler::Relocate((DWORD)buffer + (260 * i), 252, (DWORD)buffer + (252 * i));
memcpy(tempVar + (252 * i), buffer + (260 * i), 252);
fxEffectStringValue[i] = *(DWORD*)(buffer + (260 * i) + 256);
}
memcpy(buffer, tempVar, len);
delete[] tempVar;
}
Utils::Hook fxEffectModifyHook;
DWORD fxEffectModifyHookLoc = 0x45ADA0;
bool ignoreThisFx = false;
void FxEffectModifyHookFunc(int a1, char* buffer, size_t len)
{
char typeNum = *(char*)(buffer + 176);
//DBG(("ot %i\n", typeNum));
if (typeNum == 2)
{
ignoreThisFx = true;
}
else if (typeNum == 3)
{
typeNum = 2;
}
else if (typeNum == 4)
{
ignoreThisFx = true;
}
else if (typeNum >= 5)
{
typeNum -= 2;
}
/*if (typeNum >= 2)
{
typeNum -= 2;
}*/
*(char*)(buffer + 176) = typeNum;
__asm
{
push len
push buffer
push a1
call fxEffectModifyHook.Original
add esp, 0Ch
}
}
Utils::Hook fxEffectTailHook;
DWORD fxEffectTailHookLoc = 0x495938;
void FxEffectTailHookFunc()
{
// varXString = (varFxEffect + 256)
//*(DWORD*)0x112B340 = (*(DWORD*)0x112B018) + 256;
DWORD thisFX = *(DWORD*)0x112B018;
/*if (*(char*)(thisFX + 176) == 0 || *(char*)(thisFX + 176) == 4)
{
Material* material = *(Material**)(thisFX + 188);
if (material && ((DWORD)material) != 0x3F800000)
{
//DBG(("%s\n", material->name));
}
else
{
*(void**)(thisFX + 188) = DB_FindXAssetHeader(ASSET_TYPE_MATERIAL, "$default");
//DBG(("!!nullmat!!\n"));
}
}*/
*(DWORD**)0x112B340 = &fxEffectStringValue[fxEffectIndex++];
// Load_XStringPtr(0)
__asm
{
mov eax, 47FDA0h
push 0
call eax
add esp, 4h
}
}
void __declspec(naked) FxEffectTailHookStub()
{
__asm
{
push 0
call fxEffectTailHook.Original
add esp, 4
jmp FxEffectTailHookFunc
}
}
Utils::Hook xModelModifyHook;
DWORD xModelModifyHookLoc = 0x410D90;
void XModelModifyHookFunc(int a1, char* buffer, size_t len)
{
__asm
{
push len
push buffer
push a1
call xModelModifyHook.Original
add esp, 0Ch
}
int elSize = (ffVersion == VERSION_ALPHA2) ? 364 : 360;
static unsigned char tempVar[364];
memcpy(&tempVar[0], &buffer[0], 36);
memcpy(&tempVar[36], &buffer[44], 28);
//DB_AddRelocation((DWORD)buffer + 44, 28, (DWORD)buffer + 36);
for (int i = 0; i < 4; i++)
{
//DB_AddRelocation((DWORD)buffer + 72 + (i * 56), 12, (DWORD)buffer + 64 + (i * 44));
//DB_AddRelocation((DWORD)buffer + 72 + (i * 56) + 12, 32, (DWORD)buffer + 64 + (i * 44) + 16);
memcpy(&tempVar[64 + (i * 44)], &buffer[72 + (i * 56)], 12);
memcpy(&tempVar[64 + (i * 44) + 12], &buffer[72 + (i * 56) + 16], 32);
memcpy(&tempVar[(elSize - 4) - (i * 4)], &buffer[72 + (i * 56) + 12], 4);
}
//DB_AddRelocation((DWORD)buffer + 292, (elSize - 292 - 4), (DWORD)buffer + 236);
//DB_AddRelocation((DWORD)buffer + (elSize - 8), 8, (DWORD)buffer + 296);
memcpy(&tempVar[236], &buffer[292], (elSize - 292 - 4)/*68*/);
memcpy(&tempVar[296], &buffer[(elSize - 8)], 8);
tempVar[304] = 0xDE;
tempVar[305] = 0xAD;
tempVar[306] = 0xC0;
tempVar[307] = 0xDE;
memcpy(buffer, tempVar, elSize);
/*void* grenade = DB_FindXAssetHeader(ASSET_TYPE_XMODELSURFS, "us_smoke_grenade_proj10");
*(void**)(buffer + 72) = grenade;
*(void**)(buffer + 72 + 44) = grenade;
*(void**)(buffer + 72 + 88) = grenade;
*(void**)(buffer + 72 + 88 + 44) = grenade;*/
}
Utils::Hook xLodTailHook;
DWORD xLodTailHookLoc = 0x4EA6FE;
void XModelLODTailHookFunc(int i)
{
int elSize = (ffVersion == VERSION_ALPHA2) ? 364 : 360;
i = (4 - i)/* + 1*/;
// varXString = (varXModel + 0x16C - (4 * i)) // where the above function parked the new xstring
*(DWORD*)0x112B340 = ((*(DWORD*)0x112AE14) + (elSize - 4)) - (4 * i);
// Load_XStringPtr(0)
__asm
{
mov eax, 47FDA0h
push 0
call eax
add esp, 4h
}
}
void __declspec(naked) XModelLODTailHookStub()
{
__asm
{
push edi
call XModelLODTailHookFunc
add esp, 4h
mov eax, [esp + 8h]
push eax
add eax, 8
push eax
call xLodTailHook.Original
add esp, 8h
retn
}
}
Utils::Hook fxDefaultHook;
DWORD fxDefaultHookLoc = 0x4D9C0E;
void FxDefaultHookFunc()
{
DWORD* varFxEffectDefPtr = *(DWORD**)0x112ACC0;
*varFxEffectDefPtr = (DWORD)Game::DB_FindXAssetHeader(Game::ASSET_TYPE_FX, "misc/missing_fx").data;
}
void __declspec(naked) FxDefaultHookStub()
{
__asm
{
jmp FxDefaultHookFunc
}
}
Utils::Hook xmodelDefaultHook;
DWORD xmodelDefaultHookLoc = 0x4FCAEE;
void XModelDefaultHookFunc()
{
DWORD* varXModelPtr = *(DWORD**)0x112A934;
*varXModelPtr = (DWORD)Game::DB_FindXAssetHeader(Game::ASSET_TYPE_XMODEL, "void").data;
}
void __declspec(naked) XModelDefaultHookStub()
{
__asm
{
jmp XModelDefaultHookFunc
}
}
Utils::Hook xsurfaceIntLoadHook;
DWORD xsurfaceIntLoadHookLoc = 0x4925C8;
void XSurfaceIntLoadHookFunc(int a1, char* buffer, size_t len)
{
len >>= 6;
int count = len;
len *= 84;
__asm
{
push len
push buffer
push a1
call xsurfaceIntLoadHook.Original
add esp, 0Ch
}
char* tempVar = new char[len];
for (int i = 0; i < count; i++)
{
char* source = &buffer[i * 84];
char* dest = &tempVar[i * 64];
//memcpy(dest, source, 12);
//memcpy(dest + 12, source + 16, 72);
memcpy(dest, source, 12);
memcpy(dest + 12, source + 16, 20);
memcpy(dest + 32, source + 40, 8);
memcpy(dest + 40, source + 52, 24);
}
memcpy(buffer, tempVar, len);
delete[] tempVar;
}
Utils::Hook loadWeaponDefHook;
DWORD loadWeaponDefHookLoc = 0x47CCD2;
typedef void(__cdecl * Load_Stream_t)(int load, DWORD ptr, int len);
Load_Stream_t Load_Stream = (Load_Stream_t)0x470E30;
typedef DWORD(__cdecl * DB_PushStreamPos_t)(int block);
DB_PushStreamPos_t DB_PushStreamPos = (DB_PushStreamPos_t)0x458A20;
typedef void(__cdecl * DB_PopStreamPos_t)();
DB_PopStreamPos_t DB_PopStreamPos = (DB_PopStreamPos_t)0x4D1D60;
typedef DWORD(__cdecl * Load_XStringPtr_t)(int a1);
Load_XStringPtr_t Load_XStringPtr = (Load_XStringPtr_t)0x47FDA0;
Load_XStringPtr_t Load_XStringPtr_ = (Load_XStringPtr_t)0x47FDA0;
DWORD* varXModelPtr = (DWORD*)0x112A934;
Load_XStringPtr_t Load_XModelPtr = (Load_XStringPtr_t)0x4FCA70;
typedef void(__cdecl * Load_XString_t)(int a1, int count);
DWORD* varXString_ = (DWORD*)0x112B340;
Load_XString_t Load_XString = (Load_XString_t)0x4977F0;
typedef void(__cdecl * Load_XStringData_t)(DWORD* target);
DWORD* varXStringData = (DWORD*)0x112A774;
Load_XStringData_t Load_XStringData = (Load_XStringData_t)0x4E0DD0;
DWORD* varFxEffectDefPtr = (DWORD*)0x112ACC0;
Load_XStringPtr_t Load_FxEffectDefPtr = (Load_XStringPtr_t)0x4D9B90;
typedef void(__cdecl * Load_SndAliasCustom_t)(DWORD);
DWORD* varsnd_alias_list_name = (DWORD*)0x112AF38;
Load_SndAliasCustom_t Load_SndAliasCustom = (Load_SndAliasCustom_t)0x49B6B0;
DWORD* varMaterialPtr = (DWORD*)0x112A878;
Load_XStringPtr_t Load_MaterialPtr = (Load_XStringPtr_t)0x403960;
DWORD* varPhysCollmapPtr = (DWORD*)0x112B440;
Load_XStringPtr_t Load_PhysCollmapPtr = (Load_XStringPtr_t)0x47E990;
DWORD* varTracerPtr = (DWORD*)0x112B3BC;
Load_XStringPtr_t Load_TracerPtr = (Load_XStringPtr_t)0x493090;
Load_XStringPtr_t DB_AllocStreamPos = (Load_XStringPtr_t)0x418380;
Load_XString_t _load_lookupMultipleSounds = (Load_XString_t)0x4499F0;
//#define Load_XStringPtr(x) Load_XStringPtr_(x); DBG(("wF: %s\n", **(DWORD**)varXString))
#define Load_XStringPtr Load_XStringPtr_
void Load_WeaponDef_CodC(int doLoad)
{
// setup structures we use
DWORD varWeaponDef = *(DWORD*)0x112A9F4;//*(DWORD*)0x112AE14;
DWORD* varXString = (DWORD*)0x112B340;
// and do the stuff
Load_Stream(1, varWeaponDef, (ffVersion >= 318) ? 3156 : 3112);
DB_PushStreamPos(3);
*varXString = varWeaponDef + 0;
Load_XStringPtr(0);
*varXString = varWeaponDef + 4;
Load_XStringPtr(0);
*varXString = varWeaponDef + 8;
Load_XStringPtr(0);
*varXString = varWeaponDef + 12;
Load_XStringPtr(0);
*varXModelPtr = varWeaponDef + 16;
Load_XModelPtr(0);
for (int i = 0, offset = 20; i < 32; i++, offset += 4)
{
*varXModelPtr = varWeaponDef + offset;
Load_XModelPtr(0);
}
// 148
for (int offset = 148; offset <= 168; offset += 4)
{
*varXModelPtr = varWeaponDef + offset;
Load_XModelPtr(0);
}
// 172
// 32 scriptstrings, should not need to be loaded
// 236
*varXString_ = varWeaponDef + 236;
Load_XString(0, 48);
// 428
*varXString_ = varWeaponDef + 428;
Load_XString(0, 48);
// 620
*varXString_ = varWeaponDef + 620;
Load_XString(0, 48);
// 812
// 16 * 4 scriptstrings
// 972
*varFxEffectDefPtr = varWeaponDef + 972;
Load_FxEffectDefPtr(0);
*varFxEffectDefPtr = varWeaponDef + 976;
Load_FxEffectDefPtr(0);
// 980
// 50 soundalias name references; up to and including 1180
for (int i = 0, offset = 980; i < 50; i++, offset += 4)
{
*varsnd_alias_list_name = varWeaponDef + offset;
Load_SndAliasCustom(*varsnd_alias_list_name);
}
if (ffVersion >= 318)
{
for (int i = 0, offset = 1184; i < 2; i++, offset += 4)
{
*varsnd_alias_list_name = varWeaponDef + offset;
Load_SndAliasCustom(*varsnd_alias_list_name);
}
varWeaponDef += 8; // to compensate for the 2 in between here
}
if (*(DWORD*)(varWeaponDef + 1184))
{
if (*(DWORD*)(varWeaponDef + 1184) == -1)
{
*(DWORD*)(varWeaponDef + 1184) = DB_AllocStreamPos(3);
*varsnd_alias_list_name = *(DWORD*)(varWeaponDef + 1184);
_load_lookupMultipleSounds(1, 31);
}
else
{
// full usability requires ConvertOffsetToPointer here
}
}
if (*(DWORD*)(varWeaponDef + 1188))
{
if (*(DWORD*)(varWeaponDef + 1188) == -1)
{
*(DWORD*)(varWeaponDef + 1188) = DB_AllocStreamPos(3);
*varsnd_alias_list_name = *(DWORD*)(varWeaponDef + 1188);
_load_lookupMultipleSounds(1, 31);
}
else
{
// full usability requires ConvertOffsetToPointer here
}
}
// 1192
for (int offset = 1192; offset <= 1204; offset += 4)
{
*varFxEffectDefPtr = varWeaponDef + offset;
Load_FxEffectDefPtr(0);
}
// 1208
int matOffsets1[] = { 1208, 1212, 1428, 1432, 1436, 1440, 1444, 1448, 1456, 1464 };
for (int i = 0; i < sizeof(matOffsets1) / sizeof(int); i++)
{
*varMaterialPtr = varWeaponDef + matOffsets1[i];
Load_MaterialPtr(0);
}
*varXString = varWeaponDef + 1484;
Load_XStringPtr(0);
*varXString = varWeaponDef + 1492;
Load_XStringPtr(0);
*varXString = varWeaponDef + 1508;
Load_XStringPtr(0);
for (int offset = 1764; offset <= 1776; offset += 4)
{
*varMaterialPtr = varWeaponDef + offset;
Load_MaterialPtr(0);
}
*varPhysCollmapPtr = varWeaponDef + 1964;
Load_PhysCollmapPtr(0);
*varXModelPtr = varWeaponDef + 2052;
Load_XModelPtr(0);
*varFxEffectDefPtr = varWeaponDef + 2060;
Load_FxEffectDefPtr(0);
*varFxEffectDefPtr = varWeaponDef + 2064;
Load_FxEffectDefPtr(0);
*varsnd_alias_list_name = varWeaponDef + 2068;
Load_SndAliasCustom(*varsnd_alias_list_name);
*varsnd_alias_list_name = varWeaponDef + 2072;
Load_SndAliasCustom(*varsnd_alias_list_name);
*varFxEffectDefPtr = varWeaponDef + 2336;
Load_FxEffectDefPtr(0);
*varFxEffectDefPtr = varWeaponDef + 2340;
Load_FxEffectDefPtr(0);
*varFxEffectDefPtr = varWeaponDef + 2368; // 2376
Load_FxEffectDefPtr(0);
*varsnd_alias_list_name = varWeaponDef + 2372; // 2380
Load_SndAliasCustom(*varsnd_alias_list_name);
*varXString = varWeaponDef + 2548; // 2556
Load_XStringPtr(0);
if (*(DWORD*)(varWeaponDef + 2556) == -1) // 2564
{
DWORD vec2 = DB_AllocStreamPos(3);
*(DWORD*)(varWeaponDef + 2556) = vec2;
Load_Stream(1, vec2, 8 * *(short*)(varWeaponDef + ((ffVersion >= 318) ? 3076 : 3040)));
}
*varXString = varWeaponDef + 2552;
Load_XStringPtr(0);
if (*(DWORD*)(varWeaponDef + 2560) == -1)
{
DWORD vec2 = DB_AllocStreamPos(3);
*(DWORD*)(varWeaponDef + 2560) = vec2;
Load_Stream(1, vec2, 8 * *(short*)(varWeaponDef + ((ffVersion >= 318) ? 3078 : 3042)));
}
*varXString = varWeaponDef + 2640;
Load_XStringPtr(0);
*varXString = varWeaponDef + 2644;
Load_XStringPtr(0);
*varXString = varWeaponDef + 2676;
Load_XStringPtr(0);
*varXString = varWeaponDef + 2680;
Load_XStringPtr(0);
*varXString = varWeaponDef + 2804;
Load_XStringPtr(0);
*varXString = varWeaponDef + 2808;
Load_XStringPtr(0);
*varTracerPtr = varWeaponDef + 2812;
Load_TracerPtr(0);
*varsnd_alias_list_name = varWeaponDef + 2840;
Load_SndAliasCustom(*varsnd_alias_list_name); // 2848
*varFxEffectDefPtr = varWeaponDef + 2844;
Load_FxEffectDefPtr(0);
*varXString = varWeaponDef + 2848;
Load_XStringPtr(0);
*varsnd_alias_list_name = varWeaponDef + 2864;
Load_SndAliasCustom(*varsnd_alias_list_name);
*varsnd_alias_list_name = varWeaponDef + 2868;
_load_lookupMultipleSounds(0, 4);
*varsnd_alias_list_name = varWeaponDef + 2884;
_load_lookupMultipleSounds(0, 4);
*varsnd_alias_list_name = varWeaponDef + 2900;
Load_SndAliasCustom(*varsnd_alias_list_name);
*varsnd_alias_list_name = varWeaponDef + 2904; // 2912
Load_SndAliasCustom(*varsnd_alias_list_name);
if (ffVersion >= 318)
{
for (int i = 0, offset = 2972; i < 6; i++, offset += 4)
{
*varsnd_alias_list_name = varWeaponDef + offset;
Load_SndAliasCustom(*varsnd_alias_list_name);
}
varWeaponDef += (6 * 4);
varWeaponDef += 12;
}
else
{
}
*varXString = varWeaponDef + 2984;
Load_XStringPtr(0);
*varXString = varWeaponDef + 2996;
Load_XStringPtr(0);
*varXString = varWeaponDef + 3000;
Load_XStringPtr(0);
*varMaterialPtr = varWeaponDef + 3008;
Load_MaterialPtr(0);
*varMaterialPtr = varWeaponDef + 3012;
Load_MaterialPtr(0);
*varMaterialPtr = varWeaponDef + 3016;
Load_MaterialPtr(0);
if (*(DWORD*)(varWeaponDef + 3044) == -1)
{
DWORD vec2 = DB_AllocStreamPos(3);
*(DWORD*)(varWeaponDef + 3044) = vec2;
Load_Stream(1, vec2, 8 * *(short*)(varWeaponDef + 3040));
}
if (*(DWORD*)(varWeaponDef + 3048) == -1)
{
DWORD vec2 = DB_AllocStreamPos(3);
*(DWORD*)(varWeaponDef + 3048) = vec2;
Load_Stream(1, vec2, 8 * *(short*)(varWeaponDef + 3042));
}
DB_PopStreamPos();
}
#undef Load_XStringPtr
#define Load_XStringPtr Load_XStringPtr_
Utils::Hook gameWorldSpLoadHook;
DWORD gameWorldSpLoadHookLoc = 0x4F4D0D;
void GameWorldSpLoadHookFunc(int a1, char* buffer, size_t len)
{
len = 84;
__asm
{
push len
push buffer
push a1
call gameWorldSpLoadHook.Original
add esp, 0Ch
}
static char tempVar[84];
memcpy(&tempVar[0], &buffer[0], 44);
memcpy(&tempVar[56], &buffer[44], 28);
memcpy(&tempVar[44], &buffer[72], 12);
memcpy(buffer, tempVar, sizeof(tempVar));
}
Utils::Hook pathDataTailHook;
DWORD pathDataTailHookLoc = 0x427A1B;
void PathDataTailHookFunc()
{
DWORD varStuff = *(DWORD*)0x112AD7C;
DWORD varThing;
if (*(DWORD*)(varStuff + 56))
{
*(DWORD*)(varStuff + 56) = DB_AllocStreamPos(0);
varThing = *(DWORD*)(varStuff + 56);
Load_Stream(1, varThing, *(DWORD*)(varStuff + 52));
}
if (*(DWORD*)(varStuff + 64))
{
*(DWORD*)(varStuff + 64) = DB_AllocStreamPos(0);
varThing = *(DWORD*)(varStuff + 64);
Load_Stream(1, varThing, *(DWORD*)(varStuff + 60));
}
if (*(DWORD*)(varStuff + 76))
{
*(DWORD*)(varStuff + 76) = DB_AllocStreamPos(0);
varThing = *(DWORD*)(varStuff + 76);
Load_Stream(1, varThing, *(DWORD*)(varStuff + 72));
}
}
Utils::Hook allocZoneMemoryHook;
DWORD allocZoneMemoryHookLoc = 0x415A57;
void AllocXZoneMemoryHookFunc(unsigned int* sizes)
{
sizes[3] = (unsigned int)(sizes[3] * 1.5);
}
void __declspec(naked) AllocXZoneMemoryHookStub()
{
__asm
{
mov eax, [esp + 4]
push eax
call AllocXZoneMemoryHookFunc
add esp, 4h
jmp allocZoneMemoryHook.Original
}
}
Utils::Hook sndAliasLoadHook;
DWORD sndAliasLoadHookLoc = 0x4F0AC8;
void SndAliasLoadHookFunc(int a1, char* buffer, size_t len)
{
len /= 100;
int count = len;
len *= 108;
__asm
{
push len
push buffer
push a1
call gameWorldSpLoadHook.Original
add esp, 0Ch
}
char* tempVar = new char[len];
for (int i = 0; i < count; i++)
{
/*char* src = &buffer[i * 108];
char* dest = &tempVar[i * 100];
memcpy(dest + 0, src + 0, 80);
memcpy(dest + 80, src + 88, 20);
DB_AddRelocation((DWORD)src + 0, 80, (DWORD)(buffer + (i * 100)) + 0);
DB_AddRelocation((DWORD)src + 88, 20, (DWORD)(buffer + (i * 100)) + 80);*/
char* src = &buffer[i * 108];
char* dest = &tempVar[i * 100];
memcpy(dest + 0, src + 0, 60);
memcpy(dest + 60, src + 68, 20);
memcpy(dest + 80, src + 88, 20);
AssetHandler::Relocate((DWORD)src + 0, 60, (DWORD)(buffer + (i * 100)) + 0);
AssetHandler::Relocate((DWORD)src + 68, 20, (DWORD)(buffer + (i * 100)) + 60);
AssetHandler::Relocate((DWORD)src + 88, 20, (DWORD)(buffer + (i * 100)) + 80);
}
memcpy(buffer, tempVar, len);
delete[] tempVar;
}
Utils::Hook mssSoundLoadHook;
DWORD mssSoundLoadHookLoc = 0x403A5D;
void MssSoundLoadHookFunc(int a1, char* buffer, size_t len)
{
len = 48;
__asm
{
push len
push buffer
push a1
call gameWorldSpLoadHook.Original
add esp, 0Ch
}
memcpy(buffer + 28, buffer + 32, 16);
AssetHandler::Relocate((DWORD)buffer + 32, 16, (DWORD)buffer + 28);
//memcpy(buffer + 40, buffer + 44, 4);
}
Utils::Hook vehicleLoadHook;
DWORD vehicleLoadHookLoc = 0x483DA0;
void VehicleLoadHookFunc(int a1, char* buffer, int len)
{
len = 788;
__asm
{
push len
push buffer
push a1
call vehicleLoadHook.Original
add esp, 0Ch
}
static char tempVar[788];
memcpy(&tempVar[0], &buffer[0], 400);
memcpy(&tempVar[408], &buffer[400], 388);
AssetHandler::Relocate((DWORD)buffer + 400, 388, (DWORD)buffer + 408);
memcpy(buffer, tempVar, sizeof(tempVar));
}
Utils::Hook loadWeaponAttachHook;
DWORD loadWeaponAttachHookLoc = 0x463022;
DWORD varWeaponAttachStuff;
void Load_WeaponAttachStuff(int count)
{
Load_Stream(1, varWeaponAttachStuff, 12 * count);
DWORD* varStuff = (DWORD*)varWeaponAttachStuff;
for (int i = 0; i < count; i++)
{
DWORD* varXString = (DWORD*)0x112B340;
if (varStuff[1] < 16 || varStuff[1] == 39)
{
if (varStuff[2] == -1)
{
varStuff[2] = DB_AllocStreamPos(0);
*varXStringData = varStuff[2];
Load_XStringData(varXStringData);
//if (*useEntryNames)
{
//DBG(("wA: %s\n", *varXStringData));
}
}
else if (varStuff[2])
{
// meh, no convertin' here
}
}
varStuff += 3;
}
}
Utils::Hook menuDefLoadHook;
DWORD menuDefLoadHookLoc = 0x41A570;
void MenuDefLoadHookFunc(int doLoad, char* buffer, int len)
{
len += 4;
__asm
{
push len
push buffer
push doLoad
call menuDefLoadHook.Original
add esp, 0Ch
}
memcpy(buffer + 168, buffer + 172, 232);
AssetHandler::Relocate((DWORD)buffer + 172, 232, (DWORD)buffer + 168);
}
void Load_WeaponAttach(int doLoad)
{
// setup structures we use
DWORD varWeaponAttach = *(DWORD*)0x112ADE0;//*(DWORD*)0x112AE14;
DWORD* varXString = (DWORD*)0x112B340;
// and do the stuff
Load_Stream(1, varWeaponAttach, 12);
DB_PushStreamPos(3);
*varXString = varWeaponAttach + 0;
Load_XStringPtr(0);
*(DWORD*)(varWeaponAttach + 8) = DB_AllocStreamPos(3);
varWeaponAttachStuff = *(DWORD*)(varWeaponAttach + 8);
Load_WeaponAttachStuff(*(int*)(varWeaponAttach + 4));
DB_PopStreamPos();
}
Utils::Hook gameWorldSpIntHook;
DWORD gameWorldSpIntHookLoc = 0x4F4D3B;
void GameWorldSpIntHookFunc(int doLoad)
{
memset(*(void**)0x112AD7C, 0, 40);
}
extern char lastZoneName[256];
FILE* outFile;
DWORD sb3Start = 0;
void DB_InitStreamsHook()
{
sb3Start = *(DWORD*)0x16E5564;
}
struct MaterialArgumentDef
{
short a1;
short a2;
short paramID;
short more;
};
Utils::Hook loadTechniquePassHook;
DWORD loadTechniquePassHookLoc = 0x428F0A;
void Load_TechniquePassHookFunc(int a1, MaterialArgumentDef* pass, size_t size)
{
int count = size / 8;
Game::MaterialPass* curPass = *(Game::MaterialPass**)0x112A960;
count = curPass->argCount1 + curPass->argCount2 + curPass->argCount3;
Load_Stream(a1, (DWORD)pass, size);
for (int i = 0; i < count; i++)
{
MaterialArgumentDef* arg = &pass[i];
//if (arg->a1 == 1 || arg->a1 == 7)
if (arg->a1 != 3 && arg->a1 != 5)
{
continue;
}
// should be min 68 currently
// >= 58 fixes foliage without bad side effects
// >= 53 still has broken shadow mapping
// >= 23 is still broken somehow
if (arg->paramID >= 58 && arg->paramID <= 135) // >= 34 would be 31 in iw4 terms
{
arg->paramID -= 3;
}
// >= 21 works fine for specular, but breaks trees
// >= 4 is too low, breaks specular
else if (arg->paramID >= 11 && arg->paramID < 58)
{
arg->paramID -= 2;
}
/*if (arg->paramID >= 132)
{
DBG(("(bad) changed from %i to %i\n", arg->paramID + 3, arg->paramID));
}*/
}
}
Utils::Hook loadStructuredDataChildArrayHook;
DWORD loadStructuredDataChildArrayHookLoc = 0x4B1EB8;
void Load_StructuredDataChildArrayHookFunc(int a1, char* data, size_t size)
{
int count = size / 16;
size = count * 24;
Load_Stream(a1, (DWORD)data, size);
for (int i = 0; i < count; i++)
{
memcpy(data + (i * 16), data + (i * 24), 16);
AssetHandler::Relocate((DWORD)data + (i * 24), 16, (DWORD)data + (i * 16));
}
}
void PatchMW2_FifthInfinityApply(int fileVersion, bool iw5)
{
ffVersion = fileVersion;
// patch the expected version
int version = (iw5) ? 316 : 276;
if (iw5 && fileVersion >= 318)
{
version = fileVersion;
}
*(DWORD*)0x4158F4 = version;
*(DWORD*)0x4158FB = version;
// physpreset size
*(BYTE*)0x49CE0A = (iw5) ? 68 : 44;
// XModel size
*(DWORD*)0x410D8A = (iw5) ? ((ffVersion == VERSION_ALPHA2) ? 0x16C : 0x168) : 0x130;
// XSurface size
*(BYTE*)0x48E84A = (iw5) ? 48 : 36;
// impactfx internal size/count
*(DWORD*)0x4447B6 = (iw5) ? 0x8C0 : 0x834;
*(DWORD*)0x4447D1 = (iw5) ? 16 : 15;
// GameWorldSp asset type
*(BYTE*)0x41899A = (iw5) ? 18 : 17;
// PathData internal struct size
*(DWORD*)0x4D6A04 = (iw5) ? 148 : 136;
*(DWORD*)0x4D6A49 = (iw5) ? 148 : 136;
// PathData internal struct data size
*(WORD*)0x463D63 = (iw5) ? 0x9090 : 0x048D;
*(BYTE*)0x463D65 = (iw5) ? 0x90 : 0x40;
*(DWORD*)0x463D66 = (iw5) ? 0x9004E0C1 : 0xC003C003; // shl eax, 4 instead of add eax, eax * 2
// addon_map_ents asset type (we reuse it for weaponattach)
*(BYTE*)0x418B30 = (iw5) ? 43 : Game::ASSET_TYPE_ADDON_MAP_ENTS;
// hooks
if (iw5)
{
fxEffectTailHook.Install();
fxEffectModifyHook.Install();
xLodTailHook.Install();
xModelModifyHook.Install();
xsurfaceIntLoadHook.Install();
gameWorldSpLoadHook.Install();
pathDataTailHook.Install();
loadWeaponDefHook.Install();
vehicleLoadHook.Install();
sndAliasLoadHook.Install();
mssSoundLoadHook.Install();
menuDefLoadHook.Install();
fxEffectLoadHook.Install();
loadWeaponAttachHook.Install();
if (ffVersion >= VERSION_ALPHA3)
{
gameWorldSpIntHook.Install();
}
loadTechniquePassHook.Install();
loadStructuredDataChildArrayHook.Install();
//xmodelDefaultHook.Install();
fxDefaultHook.Install();
}
else
{
fxEffectTailHook.Uninstall();
fxEffectModifyHook.Uninstall();
xLodTailHook.Uninstall();
xModelModifyHook.Uninstall();
xsurfaceIntLoadHook.Uninstall();
gameWorldSpLoadHook.Uninstall();
pathDataTailHook.Uninstall();
loadWeaponDefHook.Uninstall();
vehicleLoadHook.Uninstall();
sndAliasLoadHook.Uninstall();
mssSoundLoadHook.Uninstall();
menuDefLoadHook.Uninstall();
fxEffectLoadHook.Uninstall();
loadWeaponAttachHook.Uninstall();
xmodelDefaultHook.Uninstall();
fxDefaultHook.Uninstall();
gameWorldSpIntHook.Uninstall();
loadTechniquePassHook.Uninstall();
loadStructuredDataChildArrayHook.Uninstall();
//xmodelDefaultHook.Uninstall();
fxDefaultHook.Uninstall();
}
}
2016-09-18 09:10:23 -04:00
void Zones::InstallPatches(int version)
{
Zones::ZoneVersion = version;
2016-09-18 12:08:30 -04:00
PatchMW2_FifthInfinityApply(version, version >= 316);
}
bool IgnoreEntityHookFunc(const char* entity)
{
return (!strncmp(entity, "dyn_", 4) || !strncmp(entity, "node_", 5) || !strncmp(entity, "actor_", 6)/* || !strncmp(entity, "weapon_", 7)*/);
2016-09-18 09:10:23 -04:00
}
Zones::Zones()
{
2016-09-18 12:08:30 -04:00
// Ignore missing soundaliases for now
// TODO: Include them in the dependency zone!
Utils::Hook::Nop(0x644207, 5);
Utils::Hook(0x5FBD6E, IgnoreEntityHookFunc).Install()->Quick();
2016-09-18 09:10:23 -04:00
2016-09-18 12:08:30 -04:00
fxEffectTailHook.Initialize(fxEffectTailHookLoc, FxEffectTailHookStub, HOOK_CALL);
fxEffectModifyHook.Initialize(fxEffectModifyHookLoc, FxEffectModifyHookFunc, HOOK_CALL);
xLodTailHook.Initialize(xLodTailHookLoc, XModelLODTailHookStub, HOOK_CALL);
xModelModifyHook.Initialize(xModelModifyHookLoc, XModelModifyHookFunc, HOOK_CALL);
xsurfaceIntLoadHook.Initialize(xsurfaceIntLoadHookLoc, XSurfaceIntLoadHookFunc, HOOK_CALL);
gameWorldSpLoadHook.Initialize(gameWorldSpLoadHookLoc, GameWorldSpLoadHookFunc, HOOK_CALL);
loadWeaponDefHook.Initialize(loadWeaponDefHookLoc, Load_WeaponDef_CodC, HOOK_CALL);
vehicleLoadHook.Initialize(vehicleLoadHookLoc, VehicleLoadHookFunc, HOOK_CALL);
xmodelDefaultHook.Initialize(xmodelDefaultHookLoc, XModelDefaultHookStub, HOOK_CALL);
fxDefaultHook.Initialize(fxDefaultHookLoc, FxDefaultHookStub, HOOK_CALL);
allocZoneMemoryHook.Initialize(allocZoneMemoryHookLoc, AllocXZoneMemoryHookStub, HOOK_CALL);
sndAliasLoadHook.Initialize(sndAliasLoadHookLoc, SndAliasLoadHookFunc, HOOK_CALL);
mssSoundLoadHook.Initialize(mssSoundLoadHookLoc, MssSoundLoadHookFunc, HOOK_CALL);
loadWeaponAttachHook.Initialize(loadWeaponAttachHookLoc, Load_WeaponAttach, HOOK_CALL);
menuDefLoadHook.Initialize(menuDefLoadHookLoc, MenuDefLoadHookFunc, HOOK_CALL);
fxEffectLoadHook.Initialize(fxEffectLoadHookLoc, FxEffectLoadHookFunc, HOOK_CALL);
gameWorldSpIntHook.Initialize(gameWorldSpIntHookLoc, GameWorldSpIntHookFunc, HOOK_CALL);
loadTechniquePassHook.Initialize(loadTechniquePassHookLoc, Load_TechniquePassHookFunc, HOOK_CALL);
loadStructuredDataChildArrayHook.Initialize(loadStructuredDataChildArrayHookLoc, Load_StructuredDataChildArrayHookFunc, HOOK_CALL);
pathDataTailHook.Initialize(pathDataTailHookLoc, PathDataTailHookFunc, HOOK_JUMP);
2016-09-18 09:10:23 -04:00
}
Zones::~Zones()
{
}
}