mirror of
https://github.com/CookiePLMonster/SilentPatch.git
synced 2024-12-29 15:23:02 +05:00
Compare commits
11 commits
a48e81a296
...
870e3d63a1
Author | SHA1 | Date | |
---|---|---|---|
|
870e3d63a1 | ||
|
3f26e0045e | ||
|
b7a08843be | ||
|
fd395f3c6a | ||
|
d9c3561d7b | ||
|
8a930e6e4b | ||
|
90e5ba15ab | ||
|
f9adddf0e1 | ||
|
d49e03e372 | ||
|
4445c9e24a | ||
|
23af8cd7ca |
13 changed files with 505 additions and 91 deletions
|
@ -1,3 +1,3 @@
|
|||
LIBRARY DDRAW
|
||||
EXPORTS
|
||||
DirectDrawCreateEx=_DirectDrawCreateEx@16 @10
|
||||
DirectDrawCreateEx = DirectDrawCreateEx@16
|
||||
|
|
|
@ -83,7 +83,6 @@
|
|||
<AdditionalOptions>/Zc:threadSafeInit- /Zc:strictStrings %(AdditionalOptions)</AdditionalOptions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<ModuleDefinitionFile>ddraw.def</ModuleDefinitionFile>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<DelayLoadDLLs>shell32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
||||
<LargeAddressAware>true</LargeAddressAware>
|
||||
|
@ -113,7 +112,6 @@
|
|||
<Link>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<ModuleDefinitionFile>ddraw.def</ModuleDefinitionFile>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<DelayLoadDLLs>shell32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
||||
<LargeAddressAware>true</LargeAddressAware>
|
||||
|
@ -143,7 +141,6 @@
|
|||
<Link>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<ModuleDefinitionFile>ddraw.def</ModuleDefinitionFile>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<DelayLoadDLLs>shell32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
||||
<LargeAddressAware>true</LargeAddressAware>
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "Desktop.h"
|
||||
|
||||
#pragma comment(lib, "shlwapi.lib")
|
||||
#pragma comment(linker, "/EXPORT:DirectDrawCreateEx=_DirectDrawCreateEx@16")
|
||||
|
||||
extern "C" HRESULT WINAPI DirectDrawCreateEx(GUID FAR *lpGUID, LPVOID *lplpDD, REFIID iid, IUnknown FAR *pUnkOuter)
|
||||
{
|
||||
|
@ -197,7 +198,7 @@ static bool PatchIAT()
|
|||
static bool PatchIAT_ByPointers()
|
||||
{
|
||||
pOrgSystemParametersInfoA = SystemParametersInfoA;
|
||||
memcpy( orgCode, pOrgSystemParametersInfoA, sizeof(orgCode) );
|
||||
memcpy( orgCode, reinterpret_cast<void*>(pOrgSystemParametersInfoA), sizeof(orgCode) );
|
||||
Memory::VP::InjectHook( pOrgSystemParametersInfoA, SystemParametersInfoA_OverwritingHook, Memory::HookType::Jump );
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ namespace HandlingNameLoadFix
|
|||
// ============= Corona lines rendering fix =============
|
||||
namespace CoronaLinesFix
|
||||
{
|
||||
static decltype(RwIm2DRenderLine)* orgRwIm2DRenderLine;
|
||||
static RwIm2DRenderLineFunction orgRwIm2DRenderLine;
|
||||
static RwBool RenderLine_SetRecipZ( RwIm2DVertex *vertices, RwInt32 numVertices, RwInt32 vert1, RwInt32 vert2 )
|
||||
{
|
||||
const RwReal nearScreenZ = RwIm2DGetNearScreenZ();
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
#include "Utils/MemoryMgr.h"
|
||||
#include "Utils/Patterns.h"
|
||||
|
||||
#define RwEngineInstance (*rwengine)
|
||||
|
||||
#include <rwcore.h>
|
||||
#include "RWGTA.h"
|
||||
|
||||
|
@ -52,6 +50,7 @@ void RwD3D8GetRenderState(RwUInt32 state, void* value)
|
|||
fnRwD3D8GetRenderState(state, value);
|
||||
}
|
||||
|
||||
#ifndef RwIm2DGetNearScreenZ
|
||||
RwReal RwIm2DGetNearScreenZ()
|
||||
{
|
||||
return RWSRCGLOBAL(dOpenDevice).zBufferNear;
|
||||
|
@ -66,6 +65,7 @@ RwBool RwRenderStateSet(RwRenderState state, void *value)
|
|||
{
|
||||
return RWSRCGLOBAL(dOpenDevice).fpRenderStateSet(state, value);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Unreachable stub
|
||||
RwBool RwMatrixDestroy(RwMatrix* /*mpMat*/) { assert(!"Unreachable!"); return TRUE; }
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
#pragma once
|
||||
|
||||
#define RwEngineInstance (*rwengine)
|
||||
|
||||
extern void** rwengine;
|
||||
|
||||
namespace RWGTA::Patches
|
||||
{
|
||||
bool TryLocateRwD3D8();
|
||||
|
|
|
@ -3,6 +3,10 @@
|
|||
#include <rwcore.h>
|
||||
#include <rpworld.h>
|
||||
|
||||
#define RwEngineInstance (*rwengine)
|
||||
|
||||
extern void** rwengine;
|
||||
|
||||
template<RwRenderState State>
|
||||
class RwScopedRenderState
|
||||
{
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
#include "SVF.h"
|
||||
|
||||
#include <cstdint>
|
||||
#include <algorithm>
|
||||
#include <map>
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#include <cstring>
|
||||
#define _stricmp strcasecmp
|
||||
#endif
|
||||
|
||||
namespace SVF
|
||||
{
|
||||
Feature GetFeatureFromName( const char* featureName )
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef __TIMER
|
||||
#define __TIMER
|
||||
|
||||
#include <cmath>
|
||||
|
||||
class CTimer
|
||||
{
|
||||
public:
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <functional>
|
||||
#include "Maths.h"
|
||||
|
||||
#include <rwcore.h>
|
||||
|
|
|
@ -196,36 +196,70 @@ void ResetMousePos()
|
|||
|
||||
void __declspec(naked) M16StatsFix()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
add eax, 34h
|
||||
add ebx, 34h
|
||||
mov ecx, [InstantHitsFiredByPlayer]
|
||||
inc [ecx]
|
||||
retn
|
||||
add eax, 0x34
|
||||
add ebx, 0x34
|
||||
mov ecx, InstantHitsFiredByPlayer
|
||||
inc dword ptr [ecx]
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"add eax, 0x34\n"
|
||||
"add ebx, 0x34\n"
|
||||
"mov ecx, %[InstantHitsFiredByPlayer]\n"
|
||||
"inc dword ptr [ecx]\n"
|
||||
"ret"
|
||||
:: [InstantHitsFiredByPlayer] "m" (InstantHitsFiredByPlayer)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
static const float fMinusOne = -1.0f;
|
||||
void __declspec(naked) HeadlightsFix()
|
||||
{
|
||||
static const float fMinusOne = -1.0f;
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
fld [esp+708h-690h]
|
||||
fld dword ptr [esp+0x708-0x690]
|
||||
fcomp fMinusOne
|
||||
fnstsw ax
|
||||
and ah, 5
|
||||
cmp ah, 1
|
||||
jnz HeadlightsFix_DontLimit
|
||||
fld fMinusOne
|
||||
fstp [esp+708h-690h]
|
||||
fstp dword ptr [esp+0x708-0x690]
|
||||
|
||||
HeadlightsFix_DontLimit:
|
||||
fld [esp+708h-690h]
|
||||
fld dword ptr [esp+0x708-0x690]
|
||||
fabs
|
||||
fld st
|
||||
jmp [HeadlightsFix_JumpBack]
|
||||
jmp HeadlightsFix_JumpBack
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"fld dword ptr [esp+0x708-0x690]\n"
|
||||
"fcomp %[fMinusOne]\n"
|
||||
"fnstsw ax\n"
|
||||
"and ah, 5\n"
|
||||
"cmp ah, 1\n"
|
||||
"jnz HeadlightsFix_DontLimit\n"
|
||||
"fld %[fMinusOne]\n"
|
||||
"fstp dword ptr [esp+0x708-0x690]\n"
|
||||
|
||||
"HeadlightsFix_DontLimit:\n"
|
||||
"fld dword ptr [esp+0x708-0x690]\n"
|
||||
"fabs\n"
|
||||
"fld st\n"
|
||||
"jmp %[HeadlightsFix_JumpBack]"
|
||||
:: [fMinusOne] "f" (fMinusOne),
|
||||
[HeadlightsFix_JumpBack] "m" (HeadlightsFix_JumpBack)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
static float fShadowXSize, fShadowYSize;
|
||||
|
@ -314,38 +348,67 @@ float FixedRefValue()
|
|||
|
||||
void __declspec(naked) SubtitlesShadowFix()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
push eax
|
||||
call Recalculate
|
||||
fadd [esp+50h+8]
|
||||
fadd [fShadowYSize]
|
||||
fadd dword ptr [esp+0x50+8]
|
||||
fadd fShadowYSize
|
||||
jmp SubtitlesShadowFix_JumpBack
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"push eax\n"
|
||||
"call %[Recalculate]\n"
|
||||
"fadd dword ptr [esp+0x50+8]\n"
|
||||
"fadd %[fShadowYSize]\n"
|
||||
"jmp %[SubtitlesShadowFix_JumpBack]"
|
||||
:: [Recalculate] "i" (Recalculate),
|
||||
[fShadowYSize] "m" (fShadowYSize),
|
||||
[SubtitlesShadowFix_JumpBack] "m" (SubtitlesShadowFix_JumpBack)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
void __declspec(naked) III_SensResetFix()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov ecx, 3A76h
|
||||
mov ecx, 0x3A76
|
||||
mov edi, ebp
|
||||
fld dword ptr [ebp+194h]
|
||||
fld dword ptr [ebp+198h]
|
||||
fld dword ptr [ebp+0x194]
|
||||
fld dword ptr [ebp+0x198]
|
||||
rep stosd
|
||||
fstp dword ptr [ebp+198h]
|
||||
fstp dword ptr [ebp+194h]
|
||||
retn
|
||||
fstp dword ptr [ebp+0x198]
|
||||
fstp dword ptr [ebp+0x194]
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov ecx, 0x3A76\n"
|
||||
"mov edi, ebp\n"
|
||||
"fld dword ptr [ebp+0x194]\n"
|
||||
"fld dword ptr [ebp+0x198]\n"
|
||||
"rep stosd\n"
|
||||
"fstp dword ptr [ebp+0x198]\n"
|
||||
"fstp dword ptr [ebp+0x194]\n"
|
||||
"ret"
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void* RadarBoundsCheckCoordBlip_JumpBack = AddressByVersion<void*>(0x4A55B8, 0x4A56A8, 0x4A5638);
|
||||
static void* RadarBoundsCheckCoordBlip_Count = AddressByVersion<void*>(0x4A55AF, 0x4A569F, 0x4A562F);
|
||||
void __declspec(naked) RadarBoundsCheckCoordBlip()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov edx, dword ptr [RadarBoundsCheckCoordBlip_Count]
|
||||
mov edx, RadarBoundsCheckCoordBlip_Count
|
||||
cmp cl, byte ptr [edx]
|
||||
jnb OutOfBounds
|
||||
mov edx, ecx
|
||||
|
@ -355,16 +418,35 @@ void __declspec(naked) RadarBoundsCheckCoordBlip()
|
|||
OutOfBounds:
|
||||
or eax, -1
|
||||
fcompp
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov edx, %[RadarBoundsCheckCoordBlip_Count]\n"
|
||||
"cmp cl, byte ptr [edx]\n"
|
||||
"jnb OutOfBounds\n"
|
||||
"mov edx, ecx\n"
|
||||
"mov eax, [esp+4]\n"
|
||||
"jmp %[RadarBoundsCheckCoordBlip_JumpBack]\n"
|
||||
|
||||
"OutOfBounds:\n"
|
||||
"or eax, -1\n"
|
||||
"fcompp\n"
|
||||
"ret"
|
||||
:: [RadarBoundsCheckCoordBlip_Count] "m" (RadarBoundsCheckCoordBlip_Count),
|
||||
[RadarBoundsCheckCoordBlip_JumpBack] "m" (RadarBoundsCheckCoordBlip_JumpBack)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void* RadarBoundsCheckEntityBlip_JumpBack = AddressByVersion<void*>(0x4A565E, 0x4A574E, 0x4A56DE);
|
||||
void __declspec(naked) RadarBoundsCheckEntityBlip()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov edx, dword ptr [RadarBoundsCheckCoordBlip_Count]
|
||||
mov edx, RadarBoundsCheckCoordBlip_Count
|
||||
cmp cl, byte ptr [edx]
|
||||
jnb OutOfBounds
|
||||
mov edx, ecx
|
||||
|
@ -373,8 +455,25 @@ void __declspec(naked) RadarBoundsCheckEntityBlip()
|
|||
|
||||
OutOfBounds:
|
||||
or eax, -1
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov edx, %[RadarBoundsCheckCoordBlip_Count]\n"
|
||||
"cmp cl, byte ptr [edx]\n"
|
||||
"jnb OutOfBounds2\n"
|
||||
"mov edx, ecx\n"
|
||||
"mov eax, [esp+4]\n"
|
||||
"jmp %[RadarBoundsCheckEntityBlip_JumpBack]\n"
|
||||
|
||||
"OutOfBounds2:\n"
|
||||
"or eax, -1\n"
|
||||
"ret"
|
||||
:: [RadarBoundsCheckCoordBlip_Count] "m" (RadarBoundsCheckCoordBlip_Count),
|
||||
[RadarBoundsCheckEntityBlip_JumpBack] "m" (RadarBoundsCheckEntityBlip_JumpBack)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
char** ppUserFilesDir = AddressByVersion<char**>(0x580C16, 0x580F66, 0x580E66);
|
||||
|
@ -413,6 +512,7 @@ unsigned int __cdecl AutoPilotTimerCalculation_III(unsigned int nTimer, int nSca
|
|||
|
||||
void __declspec(naked) AutoPilotTimerFix_III()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm {
|
||||
push dword ptr [esp + 0x4]
|
||||
push dword ptr [ebx + 0x10]
|
||||
|
@ -424,8 +524,25 @@ void __declspec(naked) AutoPilotTimerFix_III()
|
|||
pop ebp
|
||||
pop esi
|
||||
pop ebx
|
||||
retn 4
|
||||
ret 4
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"push dword ptr [esp + 0x4]\n"
|
||||
"push dword ptr [ebx + 0x10]\n"
|
||||
"push eax\n"
|
||||
"call %[AutoPilotTimerCalculation_III]\n"
|
||||
"add esp, 0xC\n"
|
||||
"mov [ebx + 0xC], eax\n"
|
||||
"add esp, 0x28\n"
|
||||
"pop ebp\n"
|
||||
"pop esi\n"
|
||||
"pop ebx\n"
|
||||
"ret 4"
|
||||
:: [AutoPilotTimerCalculation_III] "i" (AutoPilotTimerCalculation_III)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
namespace ZeroAmmoFix
|
||||
|
@ -580,19 +697,35 @@ namespace RemoveDriverStatusFix
|
|||
{
|
||||
// if (m_nStatus != STATUS_WRECKED)
|
||||
// m_nStatus = STATUS_ABANDONED;
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov ah, [ecx+50h]
|
||||
mov ah, [ecx+0x50]
|
||||
mov al, ah
|
||||
and ah, 0F8h
|
||||
cmp ah, 28h
|
||||
and ah, 0xF8
|
||||
cmp ah, 0x28
|
||||
je DontSetStatus
|
||||
and al, 7
|
||||
or al, 20h
|
||||
or al, 0x20
|
||||
|
||||
DontSetStatus:
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov ah, [ecx+0x50]\n"
|
||||
"mov al, ah\n"
|
||||
"and ah, 0xF8\n"
|
||||
"cmp ah, 0x28\n"
|
||||
"je DontSetStatus\n"
|
||||
"and al, 7\n"
|
||||
"or al, 0x20\n"
|
||||
|
||||
"DontSetStatus:\n"
|
||||
"ret"
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -625,16 +758,30 @@ namespace EvasiveDiveFix
|
|||
|
||||
__declspec(naked) void CalculateAngle_Hook()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
push dword ptr [esi+7Ch]
|
||||
push dword ptr [esi+78h]
|
||||
push dword ptr [esi+0x7C]
|
||||
push dword ptr [esi+0x78]
|
||||
call CalculateAngle
|
||||
add esp, 8
|
||||
|
||||
mov ecx, ebp
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"push dword ptr [esi+0x7C]\n"
|
||||
"push dword ptr [esi+0x78]\n"
|
||||
"call %[CalculateAngle]\n"
|
||||
"add esp, 8\n"
|
||||
|
||||
"mov ecx, ebp\n"
|
||||
"ret"
|
||||
:: [CalculateAngle] "i" (CalculateAngle)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -647,36 +794,69 @@ namespace NullTerminatedLines
|
|||
static void* orgSscanf_LoadPath;
|
||||
__declspec(naked) static void sscanf1_LoadPath_Terminate()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov eax, [esp+4]
|
||||
mov byte ptr [eax+ecx], 0
|
||||
jmp [orgSscanf_LoadPath]
|
||||
jmp orgSscanf_LoadPath
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov eax, [esp+4]\n"
|
||||
"mov byte ptr [eax+ecx], 0\n"
|
||||
"jmp %[orgSscanf_LoadPath]"
|
||||
:: [orgSscanf_LoadPath] "m" (orgSscanf_LoadPath)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void* orgSscanf1;
|
||||
__declspec(naked) static void sscanf1_Terminate()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov eax, [esp+4]
|
||||
mov byte ptr [eax+ecx], 0
|
||||
jmp [orgSscanf1]
|
||||
jmp orgSscanf1
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov eax, [esp+4]\n"
|
||||
"mov byte ptr [eax+ecx], 0\n"
|
||||
"jmp %[orgSscanf1]"
|
||||
:: [orgSscanf1] "m" (orgSscanf1)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
__declspec(naked) static void ReadTrackFile_Terminate()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov ecx, [gString]
|
||||
mov ecx, gString
|
||||
mov byte ptr [ecx+edx], 0
|
||||
mov ecx, [esi]
|
||||
inc ebp
|
||||
add ecx, [esp+0ACh-98h]
|
||||
retn
|
||||
add ecx, [esp+0xAC-0x98]
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov ecx, %[gString]\n"
|
||||
"mov byte ptr [ecx+edx], 0\n"
|
||||
"mov ecx, [esi]\n"
|
||||
"inc ebp\n"
|
||||
"add ecx, [esp+0xAC-0x98]\n"
|
||||
"ret"
|
||||
:: [gString] "m" (gString)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -703,17 +883,33 @@ namespace DodoKeyboardControls
|
|||
static void* (*orgFindPlayerVehicle)();
|
||||
__declspec(naked) static void FindPlayerVehicle_DodoCheck()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
call [orgFindPlayerVehicle]
|
||||
mov ecx, [bAllDodosCheat]
|
||||
call orgFindPlayerVehicle
|
||||
mov ecx, bAllDodosCheat
|
||||
cmp byte ptr [ecx], 0
|
||||
je CheatDisabled
|
||||
mov byte ptr [esp+1Ch-14h], 1
|
||||
mov byte ptr [esp+0x1C-0x14], 1
|
||||
|
||||
CheatDisabled:
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"call %[orgFindPlayerVehicle]\n"
|
||||
"mov ecx, %[bAllDodosCheat]\n"
|
||||
"cmp byte ptr [ecx], 0\n"
|
||||
"je CheatDisabled\n"
|
||||
"mov byte ptr [esp+0x1C-0x14], 1\n"
|
||||
|
||||
"CheatDisabled:\n"
|
||||
"ret"
|
||||
:: [orgFindPlayerVehicle] "m" (orgFindPlayerVehicle),
|
||||
[bAllDodosCheat] "m" (bAllDodosCheat)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -770,9 +966,10 @@ namespace GenerateNewPickup_ReuseObjectFix
|
|||
|
||||
__declspec(naked) void GiveUsAPickUpObject_CleanUpObject()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov eax, [pPickupObject]
|
||||
mov eax, pPickupObject
|
||||
add eax, ebp
|
||||
mov eax, [eax]
|
||||
test eax, eax
|
||||
|
@ -781,7 +978,7 @@ namespace GenerateNewPickup_ReuseObjectFix
|
|||
mov edi, eax
|
||||
|
||||
push edi
|
||||
call [WorldRemove]
|
||||
call WorldRemove
|
||||
add esp, 4
|
||||
|
||||
// Call dtor
|
||||
|
@ -793,8 +990,38 @@ namespace GenerateNewPickup_ReuseObjectFix
|
|||
pop edi
|
||||
|
||||
NoPickup:
|
||||
jmp [orgGiveUsAPickUpObject]
|
||||
jmp orgGiveUsAPickUpObject
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov eax, %[pPickupObject]\n"
|
||||
"add eax, ebp\n"
|
||||
"mov eax, [eax]\n"
|
||||
"test eax, eax\n"
|
||||
"jz NoPickup\n"
|
||||
"push edi\n"
|
||||
"mov edi, eax\n"
|
||||
|
||||
"push edi\n"
|
||||
"call offset %[WorldRemove]\n"
|
||||
"add esp, 4\n"
|
||||
|
||||
// Call dtor
|
||||
"mov ecx, edi\n"
|
||||
"mov eax, [edi]\n"
|
||||
"push 1\n"
|
||||
"call dword ptr [eax]\n"
|
||||
|
||||
"pop edi\n"
|
||||
|
||||
"NoPickup:\n"
|
||||
"jmp %[orgGiveUsAPickUpObject]"
|
||||
:: [pPickupObject] "m" (pPickupObject),
|
||||
[WorldRemove] "m" (WorldRemove),
|
||||
[orgGiveUsAPickUpObject] "m" (orgGiveUsAPickUpObject)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -671,10 +671,11 @@ float FixedRefValue()
|
|||
|
||||
void __declspec(naked) SubtitlesShadowFix()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov [esp], eax
|
||||
fild [esp]
|
||||
fild dword ptr [esp]
|
||||
push eax
|
||||
lea eax, [esp+20h-18h]
|
||||
push eax
|
||||
|
@ -683,17 +684,50 @@ void __declspec(naked) SubtitlesShadowFix()
|
|||
call Recalculate
|
||||
jmp SubtitlesShadowFix_JumpBack
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov [esp], eax\n"
|
||||
"fild dword ptr [esp]\n"
|
||||
"push eax\n"
|
||||
"lea eax, [esp+0x20-0x18]\n"
|
||||
"push eax\n"
|
||||
"lea eax, [esp+0x24-0x14]\n"
|
||||
"push eax\n"
|
||||
"call %[Recalculate]\n"
|
||||
"jmp %[SubtitlesShadowFix_JumpBack]"
|
||||
:: [Recalculate] "i" (Recalculate),
|
||||
[SubtitlesShadowFix_JumpBack] "m" (SubtitlesShadowFix_JumpBack)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
// C-style wrapper for calling a C++ function in GCC-style inline assembly (the function signature is really important here)
|
||||
RwFrame* __thiscall CVehicleModelInfo_GetExtrasFrame(CVehicleModelInfo* modelInfo, RpClump* clump)
|
||||
{
|
||||
return modelInfo->GetExtrasFrame(clump);
|
||||
}
|
||||
|
||||
void __declspec(naked) CreateInstance_BikeFix()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
push eax
|
||||
mov ecx, ebp
|
||||
call CVehicleModelInfo::GetExtrasFrame
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"push eax\n"
|
||||
"mov ecx, ebp\n"
|
||||
"call %[CVehicleModelInfo_GetExtrasFrame]\n"
|
||||
"ret"
|
||||
:: [CVehicleModelInfo_GetExtrasFrame] "i" (CVehicleModelInfo_GetExtrasFrame)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
char** ppUserFilesDir = AddressByVersion<char**>(0x6022AA, 0x60228A, 0x601ECA);
|
||||
|
@ -733,7 +767,9 @@ unsigned int __cdecl AutoPilotTimerCalculation_VC(unsigned int nTimer, int nScal
|
|||
|
||||
void __declspec(naked) AutoPilotTimerFix_VC()
|
||||
{
|
||||
_asm {
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
push dword ptr [esp + 0xC]
|
||||
push dword ptr [ebx + 0x10]
|
||||
push eax
|
||||
|
@ -743,8 +779,24 @@ void __declspec(naked) AutoPilotTimerFix_VC()
|
|||
add esp, 0x30
|
||||
pop ebp
|
||||
pop ebx
|
||||
retn 4
|
||||
ret 4
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"push dword ptr [esp + 0xC]\n"
|
||||
"push dword ptr [ebx + 0x10]\n"
|
||||
"push eax\n"
|
||||
"call %[AutoPilotTimerCalculation_VC]\n"
|
||||
"add esp, 0xC\n"
|
||||
"mov [ebx + 0xC], eax\n"
|
||||
"add esp, 0x30\n"
|
||||
"pop ebp\n"
|
||||
"pop ebx\n"
|
||||
"ret 4"
|
||||
:: [AutoPilotTimerCalculation_VC] "i" (AutoPilotTimerCalculation_VC)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -865,22 +917,41 @@ namespace SirenSwitchingFix
|
|||
{
|
||||
void __declspec(naked) IsFBIRanchOrFBICar()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov dword ptr [esi+1Ch], 1Ch
|
||||
mov dword ptr [esi+0x1C], 0x1C
|
||||
|
||||
// al = 0 - high pitched siren
|
||||
// al = 1 - normal siren
|
||||
cmp dword ptr [ebp+14h], 90 // fbiranch
|
||||
cmp dword ptr [ebp+0x14], 90 // fbiranch
|
||||
je IsFBIRanchOrFBICar_HighPitchSiren
|
||||
cmp dword ptr [ebp+14h], 17 // fbicar
|
||||
cmp dword ptr [ebp+0x14], 17 // fbicar
|
||||
setne al
|
||||
retn
|
||||
ret
|
||||
|
||||
IsFBIRanchOrFBICar_HighPitchSiren:
|
||||
xor al, al
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov dword ptr [esi+0x1C], 0x1C\n"
|
||||
|
||||
// al = 0 - high pitched siren
|
||||
// al = 1 - normal siren
|
||||
"cmp dword ptr [ebp+0x14], 90\n" // fbiranch
|
||||
"je IsFBIRanchOrFBICar_HighPitchSiren\n"
|
||||
"cmp dword ptr [ebp+0x14], 17\n" // fbicar
|
||||
"setne al\n"
|
||||
"ret\n"
|
||||
|
||||
"IsFBIRanchOrFBICar_HighPitchSiren:\n"
|
||||
"xor al, al\n"
|
||||
"ret"
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -949,19 +1020,35 @@ namespace RemoveDriverStatusFix
|
|||
{
|
||||
// if (m_nStatus != STATUS_WRECKED)
|
||||
// m_nStatus = STATUS_ABANDONED;
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov cl, [ebx+50h]
|
||||
mov cl, [ebx+0x50]
|
||||
mov al, cl
|
||||
and cl, 0F8h
|
||||
cmp cl, 28h
|
||||
and cl, 0xF8
|
||||
cmp cl, 0x28
|
||||
je DontSetStatus
|
||||
and al, 7
|
||||
or al, 20h
|
||||
or al, 0x20
|
||||
|
||||
DontSetStatus:
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov cl, [ebx+0x50]\n"
|
||||
"mov al, cl\n"
|
||||
"and cl, 0xF8\n"
|
||||
"cmp cl, 0x28\n"
|
||||
"je DontSetStatus\n"
|
||||
"and al, 7\n"
|
||||
"or al, 0x20\n"
|
||||
|
||||
"DontSetStatus:\n"
|
||||
"ret"
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1034,12 +1121,22 @@ namespace NullTerminatedLines
|
|||
static void* orgSscanf_LoadPath;
|
||||
__declspec(naked) static void sscanf1_LoadPath_Terminate()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov eax, [esp+4]
|
||||
mov byte ptr [eax+ecx], 0
|
||||
jmp [orgSscanf_LoadPath]
|
||||
jmp orgSscanf_LoadPath
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov eax, [esp+4]\n"
|
||||
"mov byte ptr [eax+ecx], 0\n"
|
||||
"jmp %[orgSscanf_LoadPath]"
|
||||
:: [orgSscanf_LoadPath] "m" (orgSscanf_LoadPath)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1064,21 +1161,31 @@ namespace PickupEffectsFixes
|
|||
{
|
||||
__declspec(naked) static void PickUpEffects_BigDollarColor()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov byte ptr [esp+184h-170h], 0
|
||||
mov dword ptr [esp+184h-174h], 37
|
||||
retn
|
||||
mov byte ptr [esp+0x184-0x170], 0
|
||||
mov dword ptr [esp+0x184-0x174], 37
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov byte ptr [esp+0x184-0x170], 0\n"
|
||||
"mov dword ptr [esp+0x184-0x174], 37\n"
|
||||
"ret"
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
__declspec(naked) static void PickUpEffects_Minigun2Glow()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
cmp ecx, 294 // minigun2
|
||||
jnz NotMinigun2
|
||||
mov byte ptr [esp+184h-170h], 0
|
||||
mov byte ptr [esp+0x184-0x170], 0
|
||||
xor eax, eax
|
||||
jmp Return
|
||||
|
||||
|
@ -1087,8 +1194,25 @@ namespace PickupEffectsFixes
|
|||
|
||||
Return:
|
||||
mov ebx, ecx
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"cmp ecx, 294\n" // minigun2
|
||||
"jnz NotMinigun2\n"
|
||||
"mov byte ptr [esp+0x184-0x170], 0\n"
|
||||
"xor eax, eax\n"
|
||||
"jmp Return\n"
|
||||
|
||||
"NotMinigun2:\n"
|
||||
"lea eax, [ecx+1]\n"
|
||||
|
||||
"Return:\n"
|
||||
"mov ebx, ecx\n"
|
||||
"ret"
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1105,26 +1229,52 @@ namespace IsPlayerTargettingCharFix
|
|||
__declspec(naked) static void IsPlayerTargettingChar_ExtraChecks()
|
||||
{
|
||||
// After this extra block of code, there is a jz Return, so set ZF to 0 here if this path is to be entered
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
test bl, bl
|
||||
jnz ReturnToUpdateCompareFlag
|
||||
mov eax, [bUseMouse3rdPerson]
|
||||
mov eax, bUseMouse3rdPerson
|
||||
cmp byte ptr [eax], 0
|
||||
jne CmpAndReturn
|
||||
mov ecx, [TheCamera]
|
||||
call [Using1stPersonWeaponMode]
|
||||
mov ecx, TheCamera
|
||||
call Using1stPersonWeaponMode
|
||||
test al, al
|
||||
jz ReturnToUpdateCompareFlag
|
||||
|
||||
CmpAndReturn:
|
||||
cmp byte ptr [esp+11Ch-10Ch], 0
|
||||
retn
|
||||
cmp byte ptr [esp+0x11C-0x10C], 0
|
||||
ret
|
||||
|
||||
ReturnToUpdateCompareFlag:
|
||||
xor al, al
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"test bl, bl\n"
|
||||
"jnz ReturnToUpdateCompareFlag\n"
|
||||
"mov eax, %[bUseMouse3rdPerson]\n"
|
||||
"cmp byte ptr [eax], 0\n"
|
||||
"jne CmpAndReturn\n"
|
||||
"mov ecx, %[TheCamera]\n"
|
||||
"call %[Using1stPersonWeaponMode]\n"
|
||||
"test al, al\n"
|
||||
"jz ReturnToUpdateCompareFlag\n"
|
||||
|
||||
"CmpAndReturn:\n"
|
||||
"cmp byte ptr [esp+0x11C-0x10C], 0\n"
|
||||
"ret\n"
|
||||
|
||||
"ReturnToUpdateCompareFlag:\n"
|
||||
"xor al, al\n"
|
||||
"ret"
|
||||
:: [bUseMouse3rdPerson] "m" (bUseMouse3rdPerson),
|
||||
[TheCamera] "m" (TheCamera),
|
||||
[Using1stPersonWeaponMode] "m" (Using1stPersonWeaponMode)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1210,13 +1360,24 @@ namespace SelectableBackfaceCulling
|
|||
static void* EntityRender_Prologue_JumpBack;
|
||||
__declspec(naked) static void __fastcall EntityRender_Original(CEntity*)
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
push ebx
|
||||
mov ebx, ecx
|
||||
cmp dword ptr [ebx+4Ch], 0
|
||||
jmp [EntityRender_Prologue_JumpBack]
|
||||
cmp dword ptr [ebx+0x4C], 0
|
||||
jmp EntityRender_Prologue_JumpBack
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"push ebx\n"
|
||||
"mov ebx, ecx\n"
|
||||
"cmp dword ptr [ebx+0x4C], 0\n"
|
||||
"jmp %[EntityRender_Prologue_JumpBack]"
|
||||
:: [EntityRender_Prologue_JumpBack] "m" (EntityRender_Prologue_JumpBack)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool ShouldDisableBackfaceCulling(const CEntity* entity)
|
||||
|
@ -1392,14 +1553,26 @@ namespace TommyFistShakeWithWeapons
|
|||
|
||||
static __declspec(naked) void CheckWeaponGroupHook()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
push dword ptr [eax]
|
||||
call WeaponProhibitsFistShake
|
||||
add esp, 4
|
||||
test al, al
|
||||
retn
|
||||
ret
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
__asm__ volatile
|
||||
(
|
||||
"push dword ptr [eax]\n"
|
||||
"call %[WeaponProhibitsFistShake]\n"
|
||||
"add esp, 4\n"
|
||||
"test al, al\n"
|
||||
"ret"
|
||||
:: [WeaponProhibitsFistShake] "i" (WeaponProhibitsFistShake)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
template<std::size_t Index>
|
||||
|
|
Loading…
Reference in a new issue