More zone stuff

This commit is contained in:
momo5502 2016-09-20 22:00:02 +02:00
parent 61fcea7742
commit 77f38525c4
9 changed files with 298 additions and 333 deletions

View File

@ -89,6 +89,7 @@ namespace Components
void AntiCheat::CrashClient()
{
#ifdef DEBUG_DETECTIONS
Logger::Flush();
MessageBoxA(0, "Check the log for more information!", "AntiCheat triggered", MB_ICONERROR);
ExitProcess(0xFFFFFFFF);
#else
@ -217,8 +218,8 @@ namespace Components
if (lastCheck) count = 0;
else ++count;
// If there was no check within the last 120 seconds, crash!
if ((milliseconds > 1000 * 25) && ((lastCheck && (milliseconds - lastCheck) > 1000 * 40) || count > 1))
// If there was no check within the last 40 seconds, crash!
if ((milliseconds > 1000 * 40) && ((lastCheck && (milliseconds - lastCheck) > 1000 * 40) || count > 1))
{
#ifdef DEBUG_DETECTIONS
Logger::Print("AntiCheat: Integrity check failed");
@ -260,7 +261,7 @@ namespace Components
void AntiCheat::Frame()
{
// Perform check only every 30 seconds
// Perform check only every 10 seconds
if (AntiCheat::LastCheck && (Game::Sys_Milliseconds() - AntiCheat::LastCheck) < 1000 * 10) return;
AntiCheat::LastCheck = Game::Sys_Milliseconds();

View File

@ -83,6 +83,21 @@ namespace Components
return buffer;
}
void Logger::Flush()
{
if (!Game::Sys_IsMainThread())
{
while (!Logger::MessageQueue.empty())
{
std::this_thread::sleep_for(10ms);
}
}
else
{
Logger::Frame();
}
}
void Logger::Frame()
{
std::lock_guard<std::mutex> _(Logger::MessageMutex);

View File

@ -23,6 +23,8 @@ namespace Components
static void PipeOutput(void(*callback)(std::string));
static void Flush();
private:
static std::mutex MessageMutex;
static std::vector<std::string> MessageQueue;

View File

@ -9,9 +9,6 @@ namespace Components
static DWORD fxEffectStringValue[64];
static int fxEffectIndex = 0;
#define VERSION_ALPHA2 316
#define VERSION_ALPHA3 318//319
void FxEffectLoadHookFunc(int a1, char* buffer, int len)
{
len /= 252;
@ -83,26 +80,7 @@ namespace Components
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++];
*Game::varXString = (char*)&fxEffectStringValue[fxEffectIndex++];
// Load_XStringPtr(0)
__asm
@ -171,12 +149,6 @@ namespace Components
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;
@ -187,17 +159,9 @@ namespace Components
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);
*Game::varXString = (char*)((*(DWORD*)0x112AE14) + (elSize - 4)) - (4 * i);
// Load_XStringPtr(0)
__asm
{
mov eax, 47FDA0h
push 0
call eax
add esp, 4h
}
Game::Load_XString(false);
}
void __declspec(naked) XModelLODTailHookStub()
@ -259,130 +223,83 @@ namespace Components
Utils::Hook loadWeaponDefHook;
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, (Zones::ZoneVersion >= 318) ? 3156 : 3112);
Game::Load_Stream(1, (void*)varWeaponDef, (Zones::ZoneVersion >= 318) ? 3156 : 3112);
DB_PushStreamPos(3);
Game::DB_PushStreamPos(3);
*varXString = varWeaponDef + 0;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 0;
Game::Load_XString(false);
*varXString = varWeaponDef + 4;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 4;
Game::Load_XString(false);
*varXString = varWeaponDef + 8;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 8;
Game::Load_XString(false);
*varXString = varWeaponDef + 12;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 12;
Game::Load_XString(false);
*varXModelPtr = varWeaponDef + 16;
Load_XModelPtr(0);
*Game::varXModelPtr = (Game::XModel*)(varWeaponDef + 16);
Game::Load_XModelPtr(false);
for (int i = 0, offset = 20; i < 32; i++, offset += 4)
{
*varXModelPtr = varWeaponDef + offset;
Load_XModelPtr(0);
*Game::varXModelPtr = (Game::XModel*)(varWeaponDef + offset);
Game::Load_XModelPtr(false);
}
// 148
for (int offset = 148; offset <= 168; offset += 4)
{
*varXModelPtr = varWeaponDef + offset;
Load_XModelPtr(0);
*Game::varXModelPtr = (Game::XModel*)(varWeaponDef + offset);
Game::Load_XModelPtr(false);
}
// 172
// 32 scriptstrings, should not need to be loaded
// 236
*varXString_ = varWeaponDef + 236;
Load_XString(0, 48);
*Game::varXString = (char*)varWeaponDef + 236;
Game::Load_XStringArray(false, 48);
// 428
*varXString_ = varWeaponDef + 428;
Load_XString(0, 48);
*Game::varXString = (char*)varWeaponDef + 428;
Game::Load_XStringArray(false, 48);
// 620
*varXString_ = varWeaponDef + 620;
Load_XString(0, 48);
*Game::varXString = (char*)varWeaponDef + 620;
Game::Load_XStringArray(false, 48);
// 812
// 16 * 4 scriptstrings
// 972
*varFxEffectDefPtr = varWeaponDef + 972;
Load_FxEffectDefPtr(0);
*Game::varFxEffectDefHandle = (Game::FxEffectDef*)(varWeaponDef + 972);;
Game::Load_FxEffectDefHandle(false);
*varFxEffectDefPtr = varWeaponDef + 976;
Load_FxEffectDefPtr(0);
*Game::varFxEffectDefHandle = (Game::FxEffectDef*)(varWeaponDef + 976);
Game::Load_FxEffectDefHandle(false);
// 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);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + offset);
Game::Load_SndAliasCustom(*Game::varsnd_alias_list_name);
}
if (Zones::ZoneVersion >= 318)
{
for (int i = 0, offset = 1184; i < 2; i++, offset += 4)
{
*varsnd_alias_list_name = varWeaponDef + offset;
Load_SndAliasCustom(*varsnd_alias_list_name);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + offset);
Game::Load_SndAliasCustom(*Game::varsnd_alias_list_name);
}
varWeaponDef += 8; // to compensate for the 2 in between here
@ -392,10 +309,10 @@ namespace Components
{
if (*(DWORD*)(varWeaponDef + 1184) == -1)
{
*(DWORD*)(varWeaponDef + 1184) = DB_AllocStreamPos(3);
*varsnd_alias_list_name = *(DWORD*)(varWeaponDef + 1184);
*(DWORD*)(varWeaponDef + 1184) = (DWORD)Game::DB_AllocStreamPos(3);
*Game::varsnd_alias_list_name = *(Game::snd_alias_list_t***)(varWeaponDef + 1184);
_load_lookupMultipleSounds(1, 31);
Game::Load_snd_alias_list_nameArray(true, 31);
}
else
{
@ -407,10 +324,10 @@ namespace Components
{
if (*(DWORD*)(varWeaponDef + 1188) == -1)
{
*(DWORD*)(varWeaponDef + 1188) = DB_AllocStreamPos(3);
*varsnd_alias_list_name = *(DWORD*)(varWeaponDef + 1188);
*(DWORD*)(varWeaponDef + 1188) = (DWORD)Game::DB_AllocStreamPos(3);
*Game::varsnd_alias_list_name = *(Game::snd_alias_list_t***)(varWeaponDef + 1188);
_load_lookupMultipleSounds(1, 31);
Game::Load_snd_alias_list_nameArray(true, 31);
}
else
{
@ -421,137 +338,137 @@ namespace Components
// 1192
for (int offset = 1192; offset <= 1204; offset += 4)
{
*varFxEffectDefPtr = varWeaponDef + offset;
Load_FxEffectDefPtr(0);
*Game::varFxEffectDefHandle = (Game::FxEffectDef*)(varWeaponDef + offset);
Game::Load_FxEffectDefHandle(false);
}
// 1208
int matOffsets1[] = { 1208, 1212, 1428, 1432, 1436, 1440, 1444, 1448, 1456, 1464 };
static 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);
*Game::varMaterialHandle = (Game::Material*)(varWeaponDef + matOffsets1[i]);
Game::Load_MaterialHandle(false);
}
*varXString = varWeaponDef + 1484;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 1484;
Game::Load_XString(false);
*varXString = varWeaponDef + 1492;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 1492;
Game::Load_XString(false);
*varXString = varWeaponDef + 1508;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 1508;
Game::Load_XString(false);
for (int offset = 1764; offset <= 1776; offset += 4)
{
*varMaterialPtr = varWeaponDef + offset;
Load_MaterialPtr(0);
*Game::varMaterialHandle = (Game::Material*)(varWeaponDef + offset);
Game::Load_MaterialHandle(false);
}
*varPhysCollmapPtr = varWeaponDef + 1964;
Load_PhysCollmapPtr(0);
*Game::varPhysCollmapPtr = (Game::PhysCollmap*)(varWeaponDef + 1964);
Game::Load_PhysCollmapPtr(0);
*varXModelPtr = varWeaponDef + 2052;
Load_XModelPtr(0);
*Game::varXModelPtr = (Game::XModel*)(varWeaponDef + 2052);
Game::Load_XModelPtr(0);
*varFxEffectDefPtr = varWeaponDef + 2060;
Load_FxEffectDefPtr(0);
*Game::varFxEffectDefHandle = (Game::FxEffectDef*)(varWeaponDef + 2060);
Game::Load_FxEffectDefHandle(false);
*varFxEffectDefPtr = varWeaponDef + 2064;
Load_FxEffectDefPtr(0);
*Game::varFxEffectDefHandle = (Game::FxEffectDef*)(varWeaponDef + 2064);
Game::Load_FxEffectDefHandle(false);
*varsnd_alias_list_name = varWeaponDef + 2068;
Load_SndAliasCustom(*varsnd_alias_list_name);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + 2068);
Game::Load_SndAliasCustom(*Game::varsnd_alias_list_name);
*varsnd_alias_list_name = varWeaponDef + 2072;
Load_SndAliasCustom(*varsnd_alias_list_name);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + 2072);
Game::Load_SndAliasCustom(*Game::varsnd_alias_list_name);
*varFxEffectDefPtr = varWeaponDef + 2336;
Load_FxEffectDefPtr(0);
*Game::varFxEffectDefHandle = (Game::FxEffectDef*)(varWeaponDef + 2336);
Game::Load_FxEffectDefHandle(false);
*varFxEffectDefPtr = varWeaponDef + 2340;
Load_FxEffectDefPtr(0);
*Game::varFxEffectDefHandle = (Game::FxEffectDef*)(varWeaponDef + 2340);
Game::Load_FxEffectDefHandle(false);
*varFxEffectDefPtr = varWeaponDef + 2368; // 2376
Load_FxEffectDefPtr(0);
*Game::varFxEffectDefHandle = (Game::FxEffectDef*)(varWeaponDef + 2368); // 2376
Game::Load_FxEffectDefHandle(false);
*varsnd_alias_list_name = varWeaponDef + 2372; // 2380
Load_SndAliasCustom(*varsnd_alias_list_name);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + 2372); // 2380
Game::Load_SndAliasCustom(*Game::varsnd_alias_list_name);
*varXString = varWeaponDef + 2548; // 2556
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2548; // 2556
Game::Load_XString(false);
if (*(DWORD*)(varWeaponDef + 2556) == -1) // 2564
{
DWORD vec2 = DB_AllocStreamPos(3);
DWORD vec2 = (DWORD)Game::DB_AllocStreamPos(3);
*(DWORD*)(varWeaponDef + 2556) = vec2;
Load_Stream(1, vec2, 8 * *(short*)(varWeaponDef + ((Zones::ZoneVersion >= 318) ? 3076 : 3040)));
Game::Load_Stream(1, (void*)vec2, 8 * *(short*)(varWeaponDef + ((Zones::ZoneVersion >= 318) ? 3076 : 3040)));
}
*varXString = varWeaponDef + 2552;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2552;
Game::Load_XString(false);
if (*(DWORD*)(varWeaponDef + 2560) == -1)
{
DWORD vec2 = DB_AllocStreamPos(3);
DWORD vec2 = (DWORD)Game::DB_AllocStreamPos(3);
*(DWORD*)(varWeaponDef + 2560) = vec2;
Load_Stream(1, vec2, 8 * *(short*)(varWeaponDef + ((Zones::ZoneVersion >= 318) ? 3078 : 3042)));
Game::Load_Stream(1, (void*)vec2, 8 * *(short*)(varWeaponDef + ((Zones::ZoneVersion >= 318) ? 3078 : 3042)));
}
*varXString = varWeaponDef + 2640;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2640;
Game::Load_XString(false);
*varXString = varWeaponDef + 2644;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2644;
Game::Load_XString(false);
*varXString = varWeaponDef + 2676;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2676;
Game::Load_XString(false);
*varXString = varWeaponDef + 2680;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2680;
Game::Load_XString(false);
*varXString = varWeaponDef + 2804;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2804;
Game::Load_XString(false);
*varXString = varWeaponDef + 2808;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2808;
Game::Load_XString(false);
*varTracerPtr = varWeaponDef + 2812;
Load_TracerPtr(0);
*Game::varTracerDefPtr = (Game::TracerDef*)(varWeaponDef + 2812);
Game::Load_TracerDefPtr(false);
*varsnd_alias_list_name = varWeaponDef + 2840;
Load_SndAliasCustom(*varsnd_alias_list_name); // 2848
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + 2840);
Game::Load_SndAliasCustom(*Game::varsnd_alias_list_name); // 2848
*varFxEffectDefPtr = varWeaponDef + 2844;
Load_FxEffectDefPtr(0);
*Game::varFxEffectDefHandle = (Game::FxEffectDef*)(varWeaponDef + 2844);
Game::Load_FxEffectDefHandle(false);
*varXString = varWeaponDef + 2848;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2848;
Game::Load_XString(false);
*varsnd_alias_list_name = varWeaponDef + 2864;
Load_SndAliasCustom(*varsnd_alias_list_name);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + 2864);
Game::Load_SndAliasCustom(*Game::varsnd_alias_list_name);
*varsnd_alias_list_name = varWeaponDef + 2868;
_load_lookupMultipleSounds(0, 4);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + 2868);
Game::Load_snd_alias_list_nameArray(false, 4);
*varsnd_alias_list_name = varWeaponDef + 2884;
_load_lookupMultipleSounds(0, 4);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + 2884);
Game::Load_snd_alias_list_nameArray(false, 4);
*varsnd_alias_list_name = varWeaponDef + 2900;
Load_SndAliasCustom(*varsnd_alias_list_name);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + 2900);
Game::Load_SndAliasCustom(*Game::varsnd_alias_list_name);
*varsnd_alias_list_name = varWeaponDef + 2904; // 2912
Load_SndAliasCustom(*varsnd_alias_list_name);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + 2904); // 2912
Game::Load_SndAliasCustom(*Game::varsnd_alias_list_name);
if (Zones::ZoneVersion >= 318)
{
for (int i = 0, offset = 2972; i < 6; i++, offset += 4)
{
*varsnd_alias_list_name = varWeaponDef + offset;
Load_SndAliasCustom(*varsnd_alias_list_name);
*Game::varsnd_alias_list_name = (Game::snd_alias_list_t**)(varWeaponDef + offset);
Game::Load_SndAliasCustom(*Game::varsnd_alias_list_name);
}
varWeaponDef += (6 * 4);
@ -562,46 +479,43 @@ namespace Components
}
*varXString = varWeaponDef + 2984;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2984;
Game::Load_XString(false);
*varXString = varWeaponDef + 2996;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 2996;
Game::Load_XString(false);
*varXString = varWeaponDef + 3000;
Load_XStringPtr(0);
*Game::varXString = (char*)varWeaponDef + 3000;
Game::Load_XString(false);
*varMaterialPtr = varWeaponDef + 3008;
Load_MaterialPtr(0);
*Game::varMaterialHandle = (Game::Material*)(varWeaponDef + 3008);
Game::Load_MaterialHandle(false);
*varMaterialPtr = varWeaponDef + 3012;
Load_MaterialPtr(0);
*Game::varMaterialHandle = (Game::Material*)(varWeaponDef + 3012);
Game::Load_MaterialHandle(false);
*varMaterialPtr = varWeaponDef + 3016;
Load_MaterialPtr(0);
*Game::varMaterialHandle = (Game::Material*)(varWeaponDef + 3016);
Game::Load_MaterialHandle(false);
if (*(DWORD*)(varWeaponDef + 3044) == -1)
{
DWORD vec2 = DB_AllocStreamPos(3);
DWORD vec2 = (DWORD)Game::DB_AllocStreamPos(3);
*(DWORD*)(varWeaponDef + 3044) = vec2;
Load_Stream(1, vec2, 8 * *(short*)(varWeaponDef + 3040));
Game::Load_Stream(1, (void*)vec2, 8 * *(short*)(varWeaponDef + 3040));
}
if (*(DWORD*)(varWeaponDef + 3048) == -1)
{
DWORD vec2 = DB_AllocStreamPos(3);
DWORD vec2 = (DWORD)Game::DB_AllocStreamPos(3);
*(DWORD*)(varWeaponDef + 3048) = vec2;
Load_Stream(1, vec2, 8 * *(short*)(varWeaponDef + 3042));
Game::Load_Stream(1, (void*)vec2, 8 * *(short*)(varWeaponDef + 3042));
}
DB_PopStreamPos();
Game::DB_PopStreamPos();
}
#undef Load_XStringPtr
#define Load_XStringPtr Load_XStringPtr_
Utils::Hook gameWorldSpLoadHook;
void GameWorldSpLoadHookFunc(int a1, char* buffer, size_t len)
@ -634,43 +548,23 @@ namespace Components
if (*(DWORD*)(varStuff + 56))
{
*(DWORD*)(varStuff + 56) = DB_AllocStreamPos(0);
*(DWORD*)(varStuff + 56) = (DWORD)Game::DB_AllocStreamPos(0);
varThing = *(DWORD*)(varStuff + 56);
Load_Stream(1, varThing, *(DWORD*)(varStuff + 52));
Game::Load_Stream(1, (void*)varThing, *(DWORD*)(varStuff + 52));
}
if (*(DWORD*)(varStuff + 64))
{
*(DWORD*)(varStuff + 64) = DB_AllocStreamPos(0);
*(DWORD*)(varStuff + 64) = (DWORD)Game::DB_AllocStreamPos(0);
varThing = *(DWORD*)(varStuff + 64);
Load_Stream(1, varThing, *(DWORD*)(varStuff + 60));
Game::Load_Stream(1, (void*)varThing, *(DWORD*)(varStuff + 60));
}
if (*(DWORD*)(varStuff + 76))
{
*(DWORD*)(varStuff + 76) = DB_AllocStreamPos(0);
*(DWORD*)(varStuff + 76) = (DWORD)Game::DB_AllocStreamPos(0);
varThing = *(DWORD*)(varStuff + 76);
Load_Stream(1, varThing, *(DWORD*)(varStuff + 72));
}
}
Utils::Hook allocZoneMemoryHook;
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
Game::Load_Stream(1, (void*)varThing, *(DWORD*)(varStuff + 72));
}
}
@ -695,15 +589,6 @@ namespace Components
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];
@ -737,7 +622,6 @@ namespace Components
memcpy(buffer + 28, buffer + 32, 16);
AssetHandler::Relocate((DWORD)buffer + 32, 16, (DWORD)buffer + 28);
//memcpy(buffer + 40, buffer + 44, 4);
}
Utils::Hook vehicleLoadHook;
@ -770,7 +654,7 @@ namespace Components
void Load_WeaponAttachStuff(int count)
{
Load_Stream(1, varWeaponAttachStuff, 12 * count);
Game::Load_Stream(1, (void*)varWeaponAttachStuff, 12 * count);
DWORD* varStuff = (DWORD*)varWeaponAttachStuff;
@ -782,9 +666,9 @@ namespace Components
{
if (varStuff[2] == -1)
{
varStuff[2] = DB_AllocStreamPos(0);
*varXStringData = varStuff[2];
Load_XStringData(varXStringData);
varStuff[2] = (DWORD)Game::DB_AllocStreamPos(0);
*Game::varConstChar = (const char*)varStuff[2];
Game::Load_XStringCustom(Game::varConstChar);
//if (*useEntryNames)
{
@ -828,19 +712,19 @@ namespace Components
DWORD* varXString = (DWORD*)0x112B340;
// and do the stuff
Load_Stream(1, varWeaponAttach, 12);
Game::Load_Stream(1, (void*)varWeaponAttach, 12);
DB_PushStreamPos(3);
Game::DB_PushStreamPos(3);
*varXString = varWeaponAttach + 0;
Load_XStringPtr(0);
Game::Load_XString(false);
*(DWORD*)(varWeaponAttach + 8) = DB_AllocStreamPos(3);
*(void**)(varWeaponAttach + 8) = Game::DB_AllocStreamPos(3);
varWeaponAttachStuff = *(DWORD*)(varWeaponAttach + 8);
Load_WeaponAttachStuff(*(int*)(varWeaponAttach + 4));
DB_PopStreamPos();
Game::DB_PopStreamPos();
}
Utils::Hook gameWorldSpIntHook;
@ -850,41 +734,22 @@ namespace Components
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;
void Load_TechniquePassHookFunc(int a1, MaterialArgumentDef* pass, size_t size)
void Load_TechniquePassHookFunc(bool atStreamStart, Game::ShaderArgumentDef* 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);
Game::Load_Stream(atStreamStart, pass, size);
for (int i = 0; i < count; i++)
{
MaterialArgumentDef* arg = &pass[i];
Game::ShaderArgumentDef* arg = &pass[i];
//if (arg->a1 == 1 || arg->a1 == 7)
if (arg->a1 != 3 && arg->a1 != 5)
if (arg->type != 3 && arg->type != 5)
{
continue;
}
@ -903,22 +768,17 @@ namespace Components
{
arg->paramID -= 2;
}
/*if (arg->paramID >= 132)
{
DBG(("(bad) changed from %i to %i\n", arg->paramID + 3, arg->paramID));
}*/
}
}
Utils::Hook loadStructuredDataChildArrayHook;
void Load_StructuredDataChildArrayHookFunc(int a1, char* data, size_t size)
void Load_StructuredDataChildArrayHookFunc(bool atStreamStart, char* data, size_t size)
{
int count = size / 16;
size = count * 24;
Load_Stream(a1, (DWORD)data, size);
Game::Load_Stream(atStreamStart, data, size);
for (int i = 0; i < count; i++)
{
@ -926,40 +786,49 @@ namespace Components
AssetHandler::Relocate((DWORD)data + (i * 24), 16, (DWORD)data + (i * 16));
}
}
void PatchMW2_FifthInfinityApply(bool iw5)
{
void Zones::InstallPatches(int version)
{
bool patch = (version >= VERSION_ALPHA2);
Zones::ZoneVersion = version;
AssetHandler::ClearRelocations();
if (Zones::ZoneVersion == VERSION_ALPHA2 || Zones::ZoneVersion == VERSION_ALPHA3 || Zones::ZoneVersion == XFILE_VERSION)
{
Utils::Hook::Set<DWORD>(0x4158F4, version);
Utils::Hook::Set<DWORD>(0x4158FB, version);
}
// physpreset size
*(BYTE*)0x49CE0A = (iw5) ? 68 : 44;
Utils::Hook::Set<BYTE>(0x49CE0A, (patch) ? 68 : 44);
// XModel size
*(DWORD*)0x410D8A = (iw5) ? ((Zones::ZoneVersion == VERSION_ALPHA2) ? 0x16C : 0x168) : 0x130;
Utils::Hook::Set<DWORD>(0x410D8A, (patch) ? ((Zones::ZoneVersion == VERSION_ALPHA2) ? 0x16C : 0x168) : 0x130);
// XSurface size
*(BYTE*)0x48E84A = (iw5) ? 48 : 36;
Utils::Hook::Set<BYTE>(0x48E84A, (patch) ? 48 : 36);
// impactfx internal size/count
*(DWORD*)0x4447B6 = (iw5) ? 0x8C0 : 0x834;
*(DWORD*)0x4447D1 = (iw5) ? 16 : 15;
Utils::Hook::Set<DWORD>(0x4447B6, (patch) ? 0x8C0 : 0x834);
Utils::Hook::Set<DWORD>(0x4447D1, (patch) ? 16 : 15);
// GameWorldSp asset type
*(BYTE*)0x41899A = (iw5) ? 18 : 17;
Utils::Hook::Set<BYTE>(0x41899A, (patch) ? 18 : 17);
// PathData internal struct size
*(DWORD*)0x4D6A04 = (iw5) ? 148 : 136;
*(DWORD*)0x4D6A49 = (iw5) ? 148 : 136;
Utils::Hook::Set<DWORD>(0x4D6A04, (patch) ? 148 : 136);
Utils::Hook::Set<DWORD>(0x4D6A49, (patch) ? 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
Utils::Hook::Set<WORD>(0x463D63, (patch) ? 0x9090 : 0x048D);
Utils::Hook::Set<BYTE>(0x463D65, (patch) ? 0x90 : 0x40);
Utils::Hook::Set<DWORD>(0x463D66, (patch) ? 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)
{
Utils::Hook::Set<BYTE>(0x418B30, (patch) ? 43 : Game::ASSET_TYPE_ADDON_MAP_ENTS);
if (patch)
{
fxEffectTailHook.Install();
fxEffectModifyHook.Install();
@ -986,10 +855,10 @@ namespace Components
}
loadTechniquePassHook.Install();
loadStructuredDataChildArrayHook.Install();
}
else
{
loadStructuredDataChildArrayHook.Install();
}
else
{
fxEffectTailHook.Uninstall();
fxEffectModifyHook.Uninstall();
@ -1013,23 +882,9 @@ namespace Components
gameWorldSpIntHook.Uninstall();
loadTechniquePassHook.Uninstall();
loadStructuredDataChildArrayHook.Uninstall();
}
}
void Zones::InstallPatches(int version)
{
Zones::ZoneVersion = version;
AssetHandler::ClearRelocations();
if (Zones::ZoneVersion == VERSION_ALPHA2 || Zones::ZoneVersion == VERSION_ALPHA3 || Zones::ZoneVersion == XFILE_VERSION)
{
Utils::Hook::Set<DWORD>(0x4158F4, version);
Utils::Hook::Set<DWORD>(0x4158FB, version);
loadStructuredDataChildArrayHook.Uninstall();
}
PatchMW2_FifthInfinityApply(version >= 316);
AntiCheat::EmptyHash();
}
@ -1050,7 +905,6 @@ namespace Components
gameWorldSpLoadHook.Initialize(0x4F4D0D, GameWorldSpLoadHookFunc, HOOK_CALL);
loadWeaponDefHook.Initialize(0x47CCD2, Load_WeaponDef_CodC, HOOK_CALL);
vehicleLoadHook.Initialize(0x483DA0, VehicleLoadHookFunc, HOOK_CALL);
allocZoneMemoryHook.Initialize(0x415A57, AllocXZoneMemoryHookStub, HOOK_CALL);
sndAliasLoadHook.Initialize(0x4F0AC8, SndAliasLoadHookFunc, HOOK_CALL);
mssSoundLoadHook.Initialize(0x403A5D, MssSoundLoadHookFunc, HOOK_CALL);
loadWeaponAttachHook.Initialize(0x463022, Load_WeaponAttach, HOOK_CALL);

View File

@ -1,3 +1,6 @@
#define VERSION_ALPHA2 316
#define VERSION_ALPHA3 318//319
namespace Components
{
class Zones : public Component

View File

@ -32,6 +32,10 @@ namespace Game
Con_DrawMiniConsole_t Con_DrawMiniConsole = (Con_DrawMiniConsole_t)0x464F30;
Con_DrawSolidConsole_t Con_DrawSolidConsole = (Con_DrawSolidConsole_t)0x5A5040;
DB_AllocStreamPos_t DB_AllocStreamPos = (DB_AllocStreamPos_t)0x418380;
DB_PushStreamPos_t DB_PushStreamPos = (DB_PushStreamPos_t)0x458A20;
DB_PopStreamPos_t DB_PopStreamPos = (DB_PopStreamPos_t)0x4D1D60;
DB_BeginRecoverLostDevice_t DB_BeginRecoverLostDevice = (DB_BeginRecoverLostDevice_t)0x4BFF90;
DB_EndRecoverLostDevice_t DB_EndRecoverLostDevice = (DB_EndRecoverLostDevice_t)0x46B660;
DB_EnumXAssets_t DB_EnumXAssets = (DB_EnumXAssets_t)0x4B76D0;
@ -94,6 +98,18 @@ namespace Game
Image_Release_t Image_Release = (Image_Release_t)0x51F010;
LargeLocalInit_t LargeLocalInit = (LargeLocalInit_t)0x4A62A0;
Load_Stream_t Load_Stream = (Load_Stream_t)0x470E30;
Load_XString_t Load_XString = (Load_XString_t)0x47FDA0;
Load_XModelPtr_t Load_XModelPtr = (Load_XModelPtr_t)0x4FCA70;
Load_XStringArray_t Load_XStringArray = (Load_XStringArray_t)0x4977F0;
Load_XStringCustom_t Load_XStringCustom = (Load_XStringCustom_t)0x4E0DD0;
Load_FxEffectDefHandle_t Load_FxEffectDefHandle = (Load_FxEffectDefHandle_t)0x4D9B90;
Load_SndAliasCustom_t Load_SndAliasCustom = (Load_SndAliasCustom_t)0x49B6B0;
Load_MaterialHandle_t Load_MaterialHandle = (Load_MaterialHandle_t)0x403960;
Load_PhysCollmapPtr_t Load_PhysCollmapPtr = (Load_PhysCollmapPtr_t)0x47E990;
Load_TracerDefPtr_t Load_TracerDefPtr = (Load_TracerDefPtr_t)0x493090;
Load_snd_alias_list_nameArray_t Load_snd_alias_list_nameArray = (Load_snd_alias_list_nameArray_t)0x4499F0;
Menus_CloseAll_t Menus_CloseAll = (Menus_CloseAll_t)0x4BA5B0;
Menus_OpenByName_t Menus_OpenByName = (Menus_OpenByName_t)0x4CCE60;
@ -257,6 +273,15 @@ namespace Game
mapname_t* mapnames = (mapname_t*)0x7471D0;
const char** varXString = (const char**)0x112B340;
TracerDef** varTracerDefPtr = (TracerDef**)0x112B3BC;
XModel** varXModelPtr = (XModel**)0x112A934;
const char** varConstChar = (const char**)0x112A774;
Material** varMaterialHandle = (Material**)0x112A878;
FxEffectDef** varFxEffectDefHandle = (FxEffectDef**)0x112ACC0;
PhysCollmap** varPhysCollmapPtr = (PhysCollmap **)0x112B440;
snd_alias_list_t*** varsnd_alias_list_name = (snd_alias_list_t***)0x112AF38;
XAssetHeader ReallocateAssetPool(XAssetType type, unsigned int newSize)
{
int elSize = DB_GetXAssetSizeHandlers[type]();

View File

@ -66,6 +66,15 @@ namespace Game
typedef void (__cdecl * Con_DrawSolidConsole_t)();
extern Con_DrawSolidConsole_t Con_DrawSolidConsole;
typedef char *(__cdecl *DB_AllocStreamPos_t)(int alignment);
extern DB_AllocStreamPos_t DB_AllocStreamPos;
typedef void(__cdecl * DB_PushStreamPos_t)(unsigned int index);
extern DB_PushStreamPos_t DB_PushStreamPos;
typedef void(__cdecl * DB_PopStreamPos_t)();
extern DB_PopStreamPos_t DB_PopStreamPos;
typedef void(__cdecl * DB_BeginRecoverLostDevice_t)();
extern DB_BeginRecoverLostDevice_t DB_BeginRecoverLostDevice;
@ -224,6 +233,39 @@ namespace Game
typedef void(__cdecl * LargeLocalInit_t)();
extern LargeLocalInit_t LargeLocalInit;
typedef bool(__cdecl * Load_Stream_t)(bool atStreamStart, const void *ptr, int size);
extern Load_Stream_t Load_Stream;
typedef void(__cdecl * Load_XString_t)(bool atStreamStart);
extern Load_XString_t Load_XString;
typedef void(__cdecl * Load_XModelPtr_t)(bool atStreamStart);
extern Load_XModelPtr_t Load_XModelPtr;
typedef void(__cdecl * Load_XStringArray_t)(bool atStreamStart, int count);
extern Load_XStringArray_t Load_XStringArray;
typedef void(__cdecl * Load_XStringCustom_t)(const char **str);
extern Load_XStringCustom_t Load_XStringCustom;
typedef void(__cdecl *Load_FxEffectDefHandle_t)(bool atStreamStart);
extern Load_FxEffectDefHandle_t Load_FxEffectDefHandle;
typedef void(__cdecl * Load_SndAliasCustom_t)(snd_alias_list_t** var);
extern Load_SndAliasCustom_t Load_SndAliasCustom;
typedef void(__cdecl *Load_MaterialHandle_t)(bool atStreamStart);
extern Load_MaterialHandle_t Load_MaterialHandle;
typedef void(__cdecl *Load_PhysCollmapPtr_t)(bool atStreamStart);
extern Load_PhysCollmapPtr_t Load_PhysCollmapPtr;
typedef void(__cdecl *Load_TracerDefPtr_t)(bool atStreamStart);
extern Load_TracerDefPtr_t Load_TracerDefPtr;
typedef void(__cdecl *Load_snd_alias_list_nameArray_t)(bool atStreamStart, int count);
extern Load_snd_alias_list_nameArray_t Load_snd_alias_list_nameArray;
typedef void(__cdecl * Menus_CloseAll_t)(UiContext *dc);
extern Menus_CloseAll_t Menus_CloseAll;
@ -517,6 +559,15 @@ namespace Game
extern mapname_t* mapnames;
extern const char** varXString;
extern TracerDef** varTracerDefPtr;
extern XModel** varXModelPtr;
extern const char** varConstChar;
extern Material** varMaterialHandle;
extern FxEffectDef** varFxEffectDefHandle;
extern PhysCollmap** varPhysCollmapPtr;
extern snd_alias_list_t*** varsnd_alias_list_name;
XAssetHeader ReallocateAssetPool(XAssetType type, unsigned int newSize);
void Menu_FreeItemMemory(Game::itemDef_t* item);
const char* TableLookup(StringTable* stringtable, int row, int column);

View File

@ -368,6 +368,19 @@ namespace Game
void *stateBitTable;
};
struct TracerDef
{
const char * name;
Material * material;
unsigned int drawInterval;
float speed;
float beamLength;
float beamWidth;
float screwRadius;
float screwDist;
float colors[5][4];
};
struct keyname_t
{
const char *name;
@ -2309,6 +2322,7 @@ namespace Game
FxEffectDef* fx;
GameMap_MP* gameMapMP;
GameMap_SP* gameMapSP;
TracerDef* tracer;
};
struct XAsset

View File

@ -59,7 +59,7 @@ BOOL APIENTRY DllMain(HMODULE /*hModule*/, DWORD ul_reason_for_call, LPVOID /*l
DWORD oldProtect;
std::uint8_t* module = reinterpret_cast<std::uint8_t*>(GetModuleHandle(NULL));
VirtualProtect(module, 0x6C73000, PAGE_EXECUTE_READWRITE, &oldProtect); // Unprotect the entire process
VirtualProtect(module + 0x1000, 0x2D6000, PAGE_EXECUTE_READWRITE, &oldProtect); // Protect the .text segment
VirtualProtect(module + 0x1000, 0x2D6000, PAGE_EXECUTE_READ, &oldProtect); // Protect the .text segment
Main::EntryPointHook.Initialize(0x6BAC0F, [] ()
{