void* pCallOffset = (void*)0x59CE1F;
BYTE bMemory[] = { 0x56, 0xE8, 0x6B, 0x51, 0xF6 };
void* pMemory = (void*)bMemory;
DWORD dwSafeTraceRet = 0x0;
void __declspec(naked) SafeTrace_JumpBack(void)
{
__asm add esp, 14h
__asm pushad
memcpy(pCallOffset, pMemory, sizeof(bMemory));
__asm popad
__asm jmp [dwSafeTraceRet]
}
const DWORD dwTraceCall = 0x59CE1A;
void SafeTrace(mw2::trace_t* pTrace, vec3_t vEndPos)
{
dwSafeTraceRet = (DWORD)_ReturnAddress();
__replace(0x59CE1F, SafeTrace_JumpBack);
__asm
{
push [803003h]
push [-1]
mov ecx, [vEndPos]
push ecx
mov edx, [refdef]
add edx, 18h
push edx
mov eax, [pTrace]
push eax
jmp [dwTraceCall]
}
}