mirror of
https://github.com/CookiePLMonster/SilentPatch.git
synced 2024-12-29 23:33:02 +05:00
Compare commits
25 commits
e7d5dbc045
...
a3b3e4dbd8
Author | SHA1 | Date | |
---|---|---|---|
|
a3b3e4dbd8 | ||
|
dc04c3ca39 | ||
|
8362b0a1d0 | ||
|
184f3c60f9 | ||
|
74e16c5f04 | ||
|
44b9f507cf | ||
|
de2536a984 | ||
|
3120120ea4 | ||
|
83ac060e53 | ||
|
d5c3398606 | ||
|
8093c055e6 | ||
|
b80ee9d8ca | ||
|
3106c51455 | ||
|
277515a56b | ||
|
9cbc846dbd | ||
|
2bd71990de | ||
|
4cccda9da6 | ||
|
a360f693d3 | ||
|
4c78e857f0 | ||
|
d191bdf3b4 | ||
|
5738eb5d75 | ||
|
94f967245b | ||
|
5d90ed55d7 | ||
|
7819f30c75 | ||
|
73600974c5 |
29 changed files with 866 additions and 2461 deletions
|
@ -1,3 +1,3 @@
|
||||||
LIBRARY DDRAW
|
LIBRARY DDRAW
|
||||||
EXPORTS
|
EXPORTS
|
||||||
DirectDrawCreateEx=_DirectDrawCreateEx@16 @10
|
DirectDrawCreateEx = DirectDrawCreateEx@16
|
||||||
|
|
|
@ -83,7 +83,6 @@
|
||||||
<AdditionalOptions>/Zc:threadSafeInit- /Zc:strictStrings %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/Zc:threadSafeInit- /Zc:strictStrings %(AdditionalOptions)</AdditionalOptions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<ModuleDefinitionFile>ddraw.def</ModuleDefinitionFile>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<DelayLoadDLLs>shell32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
<DelayLoadDLLs>shell32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
||||||
<LargeAddressAware>true</LargeAddressAware>
|
<LargeAddressAware>true</LargeAddressAware>
|
||||||
|
@ -113,7 +112,6 @@
|
||||||
<Link>
|
<Link>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<ModuleDefinitionFile>ddraw.def</ModuleDefinitionFile>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<DelayLoadDLLs>shell32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
<DelayLoadDLLs>shell32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
||||||
<LargeAddressAware>true</LargeAddressAware>
|
<LargeAddressAware>true</LargeAddressAware>
|
||||||
|
@ -143,7 +141,6 @@
|
||||||
<Link>
|
<Link>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<ModuleDefinitionFile>ddraw.def</ModuleDefinitionFile>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<DelayLoadDLLs>shell32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
<DelayLoadDLLs>shell32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
||||||
<LargeAddressAware>true</LargeAddressAware>
|
<LargeAddressAware>true</LargeAddressAware>
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <Shlwapi.h>
|
#include <shlwapi.h>
|
||||||
#include <ShlObj.h>
|
#include <shlobj.h>
|
||||||
#include "Utils/MemoryMgr.h"
|
#include "Utils/MemoryMgr.h"
|
||||||
#include "Utils/Patterns.h"
|
#include "Utils/Patterns.h"
|
||||||
#include "Utils/ScopedUnprotect.hpp"
|
#include "Utils/ScopedUnprotect.hpp"
|
||||||
|
@ -14,6 +14,7 @@
|
||||||
#include "Desktop.h"
|
#include "Desktop.h"
|
||||||
|
|
||||||
#pragma comment(lib, "shlwapi.lib")
|
#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)
|
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()
|
static bool PatchIAT_ByPointers()
|
||||||
{
|
{
|
||||||
pOrgSystemParametersInfoA = SystemParametersInfoA;
|
pOrgSystemParametersInfoA = SystemParametersInfoA;
|
||||||
memcpy( orgCode, pOrgSystemParametersInfoA, sizeof(orgCode) );
|
memcpy( orgCode, reinterpret_cast<void*>(pOrgSystemParametersInfoA), sizeof(orgCode) );
|
||||||
Memory::VP::InjectHook( pOrgSystemParametersInfoA, SystemParametersInfoA_OverwritingHook, Memory::HookType::Jump );
|
Memory::VP::InjectHook( pOrgSystemParametersInfoA, SystemParametersInfoA_OverwritingHook, Memory::HookType::Jump );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ namespace HandlingNameLoadFix
|
||||||
// ============= Corona lines rendering fix =============
|
// ============= Corona lines rendering fix =============
|
||||||
namespace CoronaLinesFix
|
namespace CoronaLinesFix
|
||||||
{
|
{
|
||||||
static decltype(RwIm2DRenderLine)* orgRwIm2DRenderLine;
|
static RwIm2DRenderLineFunction orgRwIm2DRenderLine;
|
||||||
static RwBool RenderLine_SetRecipZ( RwIm2DVertex *vertices, RwInt32 numVertices, RwInt32 vert1, RwInt32 vert2 )
|
static RwBool RenderLine_SetRecipZ( RwIm2DVertex *vertices, RwInt32 numVertices, RwInt32 vert1, RwInt32 vert2 )
|
||||||
{
|
{
|
||||||
const RwReal nearScreenZ = RwIm2DGetNearScreenZ();
|
const RwReal nearScreenZ = RwIm2DGetNearScreenZ();
|
||||||
|
|
|
@ -2,6 +2,13 @@
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
// Workaround for old MSVC inline function bugs
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1930
|
||||||
|
#define STATIC_INLINE static
|
||||||
|
#else
|
||||||
|
#define STATIC_INLINE static inline
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace ExtraCompSpecularity
|
namespace ExtraCompSpecularity
|
||||||
{
|
{
|
||||||
void ReadExtraCompSpecularityExceptions(const wchar_t* pPath);
|
void ReadExtraCompSpecularityExceptions(const wchar_t* pPath);
|
||||||
|
|
|
@ -1,22 +1,20 @@
|
||||||
#include "Common_ddraw.h"
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
#define WINVER 0x0501
|
#define WINVER 0x0501
|
||||||
#define _WIN32_WINNT 0x0501
|
#define _WIN32_WINNT 0x0501
|
||||||
#define NOMINMAX
|
#define NOMINMAX
|
||||||
|
|
||||||
|
#include "Common_ddraw.h"
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include <Shlwapi.h>
|
#include <shlwapi.h>
|
||||||
#include <ShlObj.h>
|
#include <shlobj.h>
|
||||||
#include "Utils/MemoryMgr.h"
|
#include "Utils/MemoryMgr.h"
|
||||||
#include "Utils/Patterns.h"
|
#include "Utils/Patterns.h"
|
||||||
|
|
||||||
#pragma comment(lib, "shlwapi.lib")
|
#pragma comment(lib, "shlwapi.lib")
|
||||||
|
|
||||||
extern char** ppUserFilesDir;
|
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
char* GetMyDocumentsPath()
|
char* GetMyDocumentsPath()
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
extern char** ppUserFilesDir;
|
||||||
|
|
||||||
namespace Common
|
namespace Common
|
||||||
{
|
{
|
||||||
namespace Patches
|
namespace Patches
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#include "Desktop.h"
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
#define WINVER 0x0501
|
#define WINVER 0x0501
|
||||||
#define _WIN32_WINNT 0x0501
|
#define _WIN32_WINNT 0x0501
|
||||||
#define NOMINMAX
|
#define NOMINMAX
|
||||||
|
|
||||||
|
#include "Desktop.h"
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
std::pair<uint32_t, uint32_t> GetDesktopResolution()
|
std::pair<uint32_t, uint32_t> GetDesktopResolution()
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
#include "FriendlyMonitorNames.h"
|
|
||||||
|
|
||||||
// This API is Win7 only, so make sure we use dynamic imports
|
// This API is Win7 only, so make sure we use dynamic imports
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
@ -7,6 +5,8 @@
|
||||||
#define WINVER 0x0602
|
#define WINVER 0x0602
|
||||||
#define _WIN32_WINNT 0x0602
|
#define _WIN32_WINNT 0x0602
|
||||||
|
|
||||||
|
#include "FriendlyMonitorNames.h"
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
|
@ -6,6 +6,15 @@
|
||||||
|
|
||||||
#include <rwcore.h>
|
#include <rwcore.h>
|
||||||
|
|
||||||
|
// FIXME: Common.h might be a better place for this (but SA doesn't include it)
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define NOBUFFERCHECKS __declspec(safebuffers)
|
||||||
|
#elif defined(__GNUC__) && !defined(__clang__)
|
||||||
|
#define NOBUFFERCHECKS __attribute__((optimize("-fno-stack-protector")))
|
||||||
|
#else
|
||||||
|
#define NOBUFFERCHECKS __attribute__((no_stack_protector))
|
||||||
|
#endif
|
||||||
|
|
||||||
constexpr double RAD_TO_DEG (180.0/M_PI);
|
constexpr double RAD_TO_DEG (180.0/M_PI);
|
||||||
constexpr double DEG_TO_RAD (M_PI/180.0);
|
constexpr double DEG_TO_RAD (M_PI/180.0);
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
#include "ParseUtils.hpp"
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#define NOMINMAX
|
#define NOMINMAX
|
||||||
#include <Windows.h>
|
|
||||||
|
#include "ParseUtils.hpp"
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
static std::string WcharToUTF8(std::wstring_view str)
|
static std::string WcharToUTF8(std::wstring_view str)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
#include "Utils/MemoryMgr.h"
|
#include "Utils/MemoryMgr.h"
|
||||||
#include "Utils/Patterns.h"
|
#include "Utils/Patterns.h"
|
||||||
|
|
||||||
#define RwEngineInstance (*rwengine)
|
|
||||||
|
|
||||||
#include <rwcore.h>
|
#include <rwcore.h>
|
||||||
#include "RWGTA.h"
|
#include "RWGTA.h"
|
||||||
|
|
||||||
|
@ -52,6 +50,7 @@ void RwD3D8GetRenderState(RwUInt32 state, void* value)
|
||||||
fnRwD3D8GetRenderState(state, value);
|
fnRwD3D8GetRenderState(state, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef RwIm2DGetNearScreenZ
|
||||||
RwReal RwIm2DGetNearScreenZ()
|
RwReal RwIm2DGetNearScreenZ()
|
||||||
{
|
{
|
||||||
return RWSRCGLOBAL(dOpenDevice).zBufferNear;
|
return RWSRCGLOBAL(dOpenDevice).zBufferNear;
|
||||||
|
@ -66,6 +65,7 @@ RwBool RwRenderStateSet(RwRenderState state, void *value)
|
||||||
{
|
{
|
||||||
return RWSRCGLOBAL(dOpenDevice).fpRenderStateSet(state, value);
|
return RWSRCGLOBAL(dOpenDevice).fpRenderStateSet(state, value);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Unreachable stub
|
// Unreachable stub
|
||||||
RwBool RwMatrixDestroy(RwMatrix* /*mpMat*/) { assert(!"Unreachable!"); return TRUE; }
|
RwBool RwMatrixDestroy(RwMatrix* /*mpMat*/) { assert(!"Unreachable!"); return TRUE; }
|
||||||
|
@ -78,19 +78,19 @@ bool RWGTA::Patches::TryLocateRwD3D8() try
|
||||||
auto pfnRwD3D8SetRenderState = [] {
|
auto pfnRwD3D8SetRenderState = [] {
|
||||||
try {
|
try {
|
||||||
// Everything except for III Steam
|
// Everything except for III Steam
|
||||||
return static_cast<decltype(RwD3D8SetRenderState)*>(get_pattern("39 0C C5 ? ? ? ? 74 31", -8));
|
return reinterpret_cast<decltype(RwD3D8SetRenderState)*>(get_pattern("39 0C C5 ? ? ? ? 74 31", -8));
|
||||||
} catch (const hook::txn_exception&) {
|
} catch (const hook::txn_exception&) {
|
||||||
// III Steam
|
// III Steam
|
||||||
return static_cast<decltype(RwD3D8SetRenderState)*>(get_pattern("8B 0C C5 ? ? ? ? 3B CA", -8));
|
return reinterpret_cast<decltype(RwD3D8SetRenderState)*>(get_pattern("8B 0C C5 ? ? ? ? 3B CA", -8));
|
||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
auto pfnRwD3D8GetRenderState = [] {
|
auto pfnRwD3D8GetRenderState = [] {
|
||||||
try {
|
try {
|
||||||
// Everything except for III Steam
|
// Everything except for III Steam
|
||||||
return static_cast<decltype(RwD3D8GetRenderState)*>(get_pattern("8B 0C C5 ? ? ? ? 89 0A C3", -8));
|
return reinterpret_cast<decltype(RwD3D8GetRenderState)*>(get_pattern("8B 0C C5 ? ? ? ? 89 0A C3", -8));
|
||||||
} catch (const hook::txn_exception&) {
|
} catch (const hook::txn_exception&) {
|
||||||
// III Steam
|
// III Steam
|
||||||
return static_cast<decltype(RwD3D8GetRenderState)*>(get_pattern("8B 04 C5 ? ? ? ? 89 02 C3", -8));
|
return reinterpret_cast<decltype(RwD3D8GetRenderState)*>(get_pattern("8B 04 C5 ? ? ? ? 89 02 C3", -8));
|
||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#define RwEngineInstance (*rwengine)
|
||||||
|
|
||||||
|
extern void** rwengine;
|
||||||
|
|
||||||
namespace RWGTA::Patches
|
namespace RWGTA::Patches
|
||||||
{
|
{
|
||||||
bool TryLocateRwD3D8();
|
bool TryLocateRwD3D8();
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
#include <rwcore.h>
|
#include <rwcore.h>
|
||||||
#include <rpworld.h>
|
#include <rpworld.h>
|
||||||
|
|
||||||
|
#define RwEngineInstance (*rwengine)
|
||||||
|
|
||||||
|
extern void** rwengine;
|
||||||
|
|
||||||
template<RwRenderState State>
|
template<RwRenderState State>
|
||||||
class RwScopedRenderState
|
class RwScopedRenderState
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
#include "SVF.h"
|
#include "SVF.h"
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
#include <cstring>
|
||||||
|
#define _stricmp strcasecmp
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace SVF
|
namespace SVF
|
||||||
{
|
{
|
||||||
Feature GetFeatureFromName( const char* featureName )
|
Feature GetFeatureFromName( const char* featureName )
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "TheFLAUtils.h"
|
#include "TheFLAUtils.h"
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <Windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include "Utils/ModuleList.hpp"
|
#include "Utils/ModuleList.hpp"
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef __TIMER
|
#ifndef __TIMER
|
||||||
#define __TIMER
|
#define __TIMER
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
class CTimer
|
class CTimer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <functional>
|
||||||
#include "Maths.h"
|
#include "Maths.h"
|
||||||
|
|
||||||
#include <rwcore.h>
|
#include <rwcore.h>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <Shlwapi.h>
|
#include <shlwapi.h>
|
||||||
|
|
||||||
#include "Utils/ModuleList.hpp"
|
#include "Utils/ModuleList.hpp"
|
||||||
#include "Utils/Patterns.h"
|
#include "Utils/Patterns.h"
|
||||||
|
@ -194,38 +194,72 @@ void ResetMousePos()
|
||||||
orgConstructRenderList();
|
orgConstructRenderList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void __declspec(naked) M16StatsFix()
|
__declspec(naked) void M16StatsFix()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
add eax, 34h
|
add eax, 0x34
|
||||||
add ebx, 34h
|
add ebx, 0x34
|
||||||
mov ecx, [InstantHitsFiredByPlayer]
|
mov ecx, InstantHitsFiredByPlayer
|
||||||
inc [ecx]
|
inc dword ptr [ecx]
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__asm__ volatile
|
||||||
|
(
|
||||||
|
"add eax, 0x34\n"
|
||||||
|
"add ebx, 0x34\n"
|
||||||
|
"mov ecx, %[InstantHitsFiredByPlayer]\n"
|
||||||
|
"inc dword ptr [ecx]\n"
|
||||||
|
"ret"
|
||||||
|
:: [InstantHitsFiredByPlayer] "m" (InstantHitsFiredByPlayer)
|
||||||
|
);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void __declspec(naked) HeadlightsFix()
|
static const float fMinusOne = -1.0f;
|
||||||
|
__declspec(naked) void HeadlightsFix()
|
||||||
{
|
{
|
||||||
static const float fMinusOne = -1.0f;
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
fld [esp+708h-690h]
|
fld dword ptr [esp+0x708-0x690]
|
||||||
fcomp fMinusOne
|
fcomp fMinusOne
|
||||||
fnstsw ax
|
fnstsw ax
|
||||||
and ah, 5
|
and ah, 5
|
||||||
cmp ah, 1
|
cmp ah, 1
|
||||||
jnz HeadlightsFix_DontLimit
|
jnz HeadlightsFix_DontLimit
|
||||||
fld fMinusOne
|
fld fMinusOne
|
||||||
fstp [esp+708h-690h]
|
fstp dword ptr [esp+0x708-0x690]
|
||||||
|
|
||||||
HeadlightsFix_DontLimit:
|
HeadlightsFix_DontLimit:
|
||||||
fld [esp+708h-690h]
|
fld dword ptr [esp+0x708-0x690]
|
||||||
fabs
|
fabs
|
||||||
fld st
|
fld st
|
||||||
jmp [HeadlightsFix_JumpBack]
|
jmp HeadlightsFix_JumpBack
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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;
|
static float fShadowXSize, fShadowYSize;
|
||||||
|
@ -312,75 +346,140 @@ float FixedRefValue()
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __declspec(naked) SubtitlesShadowFix()
|
__declspec(naked) void SubtitlesShadowFix()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
push eax
|
push eax
|
||||||
call Recalculate
|
call Recalculate
|
||||||
fadd [esp+50h+8]
|
fadd dword ptr [esp+0x50+8]
|
||||||
fadd [fShadowYSize]
|
fadd fShadowYSize
|
||||||
jmp SubtitlesShadowFix_JumpBack
|
jmp SubtitlesShadowFix_JumpBack
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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()
|
__declspec(naked) void III_SensResetFix()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov ecx, 3A76h
|
mov ecx, 0x3A76
|
||||||
mov edi, ebp
|
mov edi, ebp
|
||||||
fld dword ptr [ebp+194h]
|
fld dword ptr [ebp+0x194]
|
||||||
fld dword ptr [ebp+198h]
|
fld dword ptr [ebp+0x198]
|
||||||
rep stosd
|
rep stosd
|
||||||
fstp dword ptr [ebp+198h]
|
fstp dword ptr [ebp+0x198]
|
||||||
fstp dword ptr [ebp+194h]
|
fstp dword ptr [ebp+0x194]
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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_JumpBack = AddressByVersion<void*>(0x4A55B8, 0x4A56A8, 0x4A5638);
|
||||||
static void* RadarBoundsCheckCoordBlip_Count = AddressByVersion<void*>(0x4A55AF, 0x4A569F, 0x4A562F);
|
static void* RadarBoundsCheckCoordBlip_Count = AddressByVersion<void*>(0x4A55AF, 0x4A569F, 0x4A562F);
|
||||||
void __declspec(naked) RadarBoundsCheckCoordBlip()
|
__declspec(naked) void RadarBoundsCheckCoordBlip()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov edx, dword ptr [RadarBoundsCheckCoordBlip_Count]
|
mov edx, RadarBoundsCheckCoordBlip_Count
|
||||||
cmp cl, byte ptr [edx]
|
cmp cl, byte ptr [edx]
|
||||||
jnb OutOfBounds
|
jnb OutOfBounds
|
||||||
mov edx, ecx
|
mov edx, ecx
|
||||||
mov eax, [esp+4]
|
mov eax, [esp+4]
|
||||||
jmp RadarBoundsCheckCoordBlip_JumpBack
|
jmp RadarBoundsCheckCoordBlip_JumpBack
|
||||||
|
|
||||||
OutOfBounds:
|
OutOfBounds:
|
||||||
or eax, -1
|
or eax, -1
|
||||||
fcompp
|
fcompp
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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);
|
static void* RadarBoundsCheckEntityBlip_JumpBack = AddressByVersion<void*>(0x4A565E, 0x4A574E, 0x4A56DE);
|
||||||
void __declspec(naked) RadarBoundsCheckEntityBlip()
|
__declspec(naked) void RadarBoundsCheckEntityBlip()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov edx, dword ptr [RadarBoundsCheckCoordBlip_Count]
|
mov edx, RadarBoundsCheckCoordBlip_Count
|
||||||
cmp cl, byte ptr [edx]
|
cmp cl, byte ptr [edx]
|
||||||
jnb OutOfBounds
|
jnb OutOfBounds
|
||||||
mov edx, ecx
|
mov edx, ecx
|
||||||
mov eax, [esp+4]
|
mov eax, [esp+4]
|
||||||
jmp RadarBoundsCheckEntityBlip_JumpBack
|
jmp RadarBoundsCheckEntityBlip_JumpBack
|
||||||
|
|
||||||
OutOfBounds:
|
OutOfBounds:
|
||||||
or eax, -1
|
or eax, -1
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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
|
||||||
}
|
}
|
||||||
|
|
||||||
extern char** ppUserFilesDir = AddressByVersion<char**>(0x580C16, 0x580F66, 0x580E66);
|
char** ppUserFilesDir = AddressByVersion<char**>(0x580C16, 0x580F66, 0x580E66);
|
||||||
|
|
||||||
static LARGE_INTEGER FrameTime;
|
static LARGE_INTEGER FrameTime;
|
||||||
__declspec(safebuffers) int32_t GetTimeSinceLastFrame()
|
NOBUFFERCHECKS int32_t GetTimeSinceLastFrame()
|
||||||
{
|
{
|
||||||
LARGE_INTEGER curTime;
|
LARGE_INTEGER curTime;
|
||||||
QueryPerformanceCounter(&curTime);
|
QueryPerformanceCounter(&curTime);
|
||||||
|
@ -411,11 +510,13 @@ unsigned int __cdecl AutoPilotTimerCalculation_III(unsigned int nTimer, int nSca
|
||||||
return nTimer - static_cast<unsigned int>(nScaleFactor * fScaleCoef);
|
return nTimer - static_cast<unsigned int>(nScaleFactor * fScaleCoef);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __declspec(naked) AutoPilotTimerFix_III()
|
__declspec(naked) void AutoPilotTimerFix_III()
|
||||||
{
|
{
|
||||||
_asm {
|
#ifdef _MSC_VER
|
||||||
push dword ptr[esp + 0x4]
|
_asm
|
||||||
push dword ptr[ebx + 0x10]
|
{
|
||||||
|
push dword ptr [esp + 0x4]
|
||||||
|
push dword ptr [ebx + 0x10]
|
||||||
push eax
|
push eax
|
||||||
call AutoPilotTimerCalculation_III
|
call AutoPilotTimerCalculation_III
|
||||||
add esp, 0xC
|
add esp, 0xC
|
||||||
|
@ -424,8 +525,25 @@ void __declspec(naked) AutoPilotTimerFix_III()
|
||||||
pop ebp
|
pop ebp
|
||||||
pop esi
|
pop esi
|
||||||
pop ebx
|
pop ebx
|
||||||
retn 4
|
ret 4
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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
|
namespace ZeroAmmoFix
|
||||||
|
@ -542,7 +660,7 @@ namespace Localization
|
||||||
// ============= Call cDMAudio::IsAudioInitialised before adding one shot sounds, like in VC =============
|
// ============= Call cDMAudio::IsAudioInitialised before adding one shot sounds, like in VC =============
|
||||||
namespace AudioInitializedFix
|
namespace AudioInitializedFix
|
||||||
{
|
{
|
||||||
auto IsAudioInitialised = static_cast<bool(*)()>(Memory::ReadCallFrom( hook::get_pattern( "E8 ? ? ? ? 84 C0 74 ? 0F B7 47 10" ) ));
|
auto IsAudioInitialised = reinterpret_cast<bool(*)()>(Memory::ReadCallFrom( hook::get_pattern( "E8 ? ? ? ? 84 C0 74 ? 0F B7 47 10" ) ));
|
||||||
void* (*operatorNew)(size_t size);
|
void* (*operatorNew)(size_t size);
|
||||||
|
|
||||||
void* operatorNew_InitializedCheck( size_t size )
|
void* operatorNew_InitializedCheck( size_t size )
|
||||||
|
@ -576,23 +694,39 @@ namespace SirenSwitchingFix
|
||||||
// ============= Fixed vehicles exploding twice if the driver leaves the car while it's exploding =============
|
// ============= Fixed vehicles exploding twice if the driver leaves the car while it's exploding =============
|
||||||
namespace RemoveDriverStatusFix
|
namespace RemoveDriverStatusFix
|
||||||
{
|
{
|
||||||
__declspec(naked) void RemoveDriver_SetStatus()
|
__declspec(naked) static void RemoveDriver_SetStatus()
|
||||||
{
|
{
|
||||||
// if (m_nStatus != STATUS_WRECKED)
|
// if (m_nStatus != STATUS_WRECKED)
|
||||||
// m_nStatus = STATUS_ABANDONED;
|
// m_nStatus = STATUS_ABANDONED;
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov ah, [ecx+50h]
|
mov ah, [ecx+0x50]
|
||||||
mov al, ah
|
mov al, ah
|
||||||
and ah, 0F8h
|
and ah, 0xF8
|
||||||
cmp ah, 28h
|
cmp ah, 0x28
|
||||||
je DontSetStatus
|
je DontSetStatus
|
||||||
and al, 7
|
and al, 7
|
||||||
or al, 20h
|
or al, 0x20
|
||||||
|
|
||||||
DontSetStatus:
|
DontSetStatus:
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -623,18 +757,32 @@ namespace EvasiveDiveFix
|
||||||
return CGeneral::LimitRadianAngle(angle);
|
return CGeneral::LimitRadianAngle(angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
__declspec(naked) void CalculateAngle_Hook()
|
__declspec(naked) static void CalculateAngle_Hook()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
push dword ptr [esi+7Ch]
|
push dword ptr [esi+0x7C]
|
||||||
push dword ptr [esi+78h]
|
push dword ptr [esi+0x78]
|
||||||
call CalculateAngle
|
call CalculateAngle
|
||||||
add esp, 8
|
add esp, 8
|
||||||
|
|
||||||
mov ecx, ebp
|
mov ecx, ebp
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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 +795,69 @@ namespace NullTerminatedLines
|
||||||
static void* orgSscanf_LoadPath;
|
static void* orgSscanf_LoadPath;
|
||||||
__declspec(naked) static void sscanf1_LoadPath_Terminate()
|
__declspec(naked) static void sscanf1_LoadPath_Terminate()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov eax, [esp+4]
|
mov eax, [esp+4]
|
||||||
mov byte ptr [eax+ecx], 0
|
mov byte ptr [eax+ecx], 0
|
||||||
jmp [orgSscanf_LoadPath]
|
jmp orgSscanf_LoadPath
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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;
|
static void* orgSscanf1;
|
||||||
__declspec(naked) static void sscanf1_Terminate()
|
__declspec(naked) static void sscanf1_Terminate()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov eax, [esp+4]
|
mov eax, [esp+4]
|
||||||
mov byte ptr [eax+ecx], 0
|
mov byte ptr [eax+ecx], 0
|
||||||
jmp [orgSscanf1]
|
jmp orgSscanf1
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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()
|
__declspec(naked) static void ReadTrackFile_Terminate()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov ecx, [gString]
|
mov ecx, gString
|
||||||
mov byte ptr [ecx+edx], 0
|
mov byte ptr [ecx+edx], 0
|
||||||
mov ecx, [esi]
|
mov ecx, [esi]
|
||||||
inc ebp
|
inc ebp
|
||||||
add ecx, [esp+0ACh-98h]
|
add ecx, [esp+0xAC-0x98]
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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 +884,33 @@ namespace DodoKeyboardControls
|
||||||
static void* (*orgFindPlayerVehicle)();
|
static void* (*orgFindPlayerVehicle)();
|
||||||
__declspec(naked) static void FindPlayerVehicle_DodoCheck()
|
__declspec(naked) static void FindPlayerVehicle_DodoCheck()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
call [orgFindPlayerVehicle]
|
call orgFindPlayerVehicle
|
||||||
mov ecx, [bAllDodosCheat]
|
mov ecx, bAllDodosCheat
|
||||||
cmp byte ptr [ecx], 0
|
cmp byte ptr [ecx], 0
|
||||||
je CheatDisabled
|
je CheatDisabled
|
||||||
mov byte ptr [esp+1Ch-14h], 1
|
mov byte ptr [esp+0x1C-0x14], 1
|
||||||
|
|
||||||
CheatDisabled:
|
CheatDisabled:
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -768,11 +965,12 @@ namespace GenerateNewPickup_ReuseObjectFix
|
||||||
static void* pPickupObject;
|
static void* pPickupObject;
|
||||||
static void (*orgGiveUsAPickUpObject)(int);
|
static void (*orgGiveUsAPickUpObject)(int);
|
||||||
|
|
||||||
__declspec(naked) void GiveUsAPickUpObject_CleanUpObject()
|
__declspec(naked) static void GiveUsAPickUpObject_CleanUpObject()
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov eax, [pPickupObject]
|
mov eax, pPickupObject
|
||||||
add eax, ebp
|
add eax, ebp
|
||||||
mov eax, [eax]
|
mov eax, [eax]
|
||||||
test eax, eax
|
test eax, eax
|
||||||
|
@ -781,7 +979,7 @@ namespace GenerateNewPickup_ReuseObjectFix
|
||||||
mov edi, eax
|
mov edi, eax
|
||||||
|
|
||||||
push edi
|
push edi
|
||||||
call [WorldRemove]
|
call WorldRemove
|
||||||
add esp, 4
|
add esp, 4
|
||||||
|
|
||||||
// Call dtor
|
// Call dtor
|
||||||
|
@ -793,8 +991,38 @@ namespace GenerateNewPickup_ReuseObjectFix
|
||||||
pop edi
|
pop edi
|
||||||
|
|
||||||
NoPickup:
|
NoPickup:
|
||||||
jmp [orgGiveUsAPickUpObject]
|
jmp orgGiveUsAPickUpObject
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1027,7 +1255,7 @@ namespace SlidingTextsScalingFixes
|
||||||
static inline float** pHorShadowValue;
|
static inline float** pHorShadowValue;
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void (*orgPrintString)(float,float,const wchar_t*);
|
STATIC_INLINE void (*orgPrintString)(float,float,const wchar_t*);
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void PrintString_Slide(float fX, float fY, const wchar_t* pText)
|
static void PrintString_Slide(float fX, float fY, const wchar_t* pText)
|
||||||
|
@ -1054,7 +1282,7 @@ namespace SlidingTextsScalingFixes
|
||||||
static inline bool bSlidingEnabled = false;
|
static inline bool bSlidingEnabled = false;
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void (*orgPrintString)(float,float,const wchar_t*);
|
STATIC_INLINE void (*orgPrintString)(float,float,const wchar_t*);
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void PrintString_Slide(float fX, float fY, const wchar_t* pText)
|
static void PrintString_Slide(float fX, float fY, const wchar_t* pText)
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<SILENTPATCH_EXT>.asi</SILENTPATCH_EXT>
|
<SILENTPATCH_EXT>.asi</SILENTPATCH_EXT>
|
||||||
<SILENTPATCH_FULL_NAME>SilentPatch for GTA III</SILENTPATCH_FULL_NAME>
|
<SILENTPATCH_FULL_NAME>SilentPatch for GTA III</SILENTPATCH_FULL_NAME>
|
||||||
<SILENTPATCH_REVISION_ID>9</SILENTPATCH_REVISION_ID>
|
<SILENTPATCH_REVISION_ID>9</SILENTPATCH_REVISION_ID>
|
||||||
<SILENTPATCH_BUILD_ID>1</SILENTPATCH_BUILD_ID>
|
<SILENTPATCH_BUILD_ID>2</SILENTPATCH_BUILD_ID>
|
||||||
<SILENTPATCH_COPYRIGHT>2013-2024</SILENTPATCH_COPYRIGHT>
|
<SILENTPATCH_COPYRIGHT>2013-2024</SILENTPATCH_COPYRIGHT>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup />
|
<PropertyGroup />
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define __AUDIOHARDWARE
|
#define __AUDIOHARDWARE
|
||||||
|
|
||||||
// IStream
|
// IStream
|
||||||
#include <Objidl.h>
|
#include <objidl.h>
|
||||||
|
|
||||||
enum eDecoderType
|
enum eDecoderType
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
#include "AudioHardwareSA.h"
|
#include "AudioHardwareSA.h"
|
||||||
|
|
||||||
// libflac
|
// libflac
|
||||||
#include "FLAC\stream_decoder.h"
|
#include "FLAC/stream_decoder.h"
|
||||||
#include "FLAC\metadata.h"
|
#include "FLAC/metadata.h"
|
||||||
|
|
||||||
class CAEFLACDecoder final : public CAEStreamingDecoder
|
class CAEFLACDecoder final : public CAEStreamingDecoder
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define __GENERAL
|
#define __GENERAL
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "Common.h"
|
||||||
#include "TheFLAUtils.h"
|
#include "TheFLAUtils.h"
|
||||||
|
|
||||||
class CSimpleTransform
|
class CSimpleTransform
|
||||||
|
|
|
@ -131,7 +131,7 @@ uint8_t CPed::GetWeaponSkillForRenderWeaponPedsForPC_SAMP()
|
||||||
|
|
||||||
bool CTaskComplexSequence::Contains(int taskID) const
|
bool CTaskComplexSequence::Contains(int taskID) const
|
||||||
{
|
{
|
||||||
for (CTask* task : m_taskSequence)
|
for (const CTask* task : m_taskSequence)
|
||||||
{
|
{
|
||||||
if (task != nullptr && task->GetTaskType() == taskID)
|
if (task != nullptr && task->GetTaskType() == taskID)
|
||||||
{
|
{
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -302,7 +302,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void (CVehicle::*orgDoHeadLightBeam)(int type, CMatrix& m, bool right);
|
STATIC_INLINE void (CVehicle::*orgDoHeadLightBeam)(int type, CMatrix& m, bool right);
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
void DoHeadLightBeam_LightBeamFixSaveObj(int type, CMatrix& m, bool right)
|
void DoHeadLightBeam_LightBeamFixSaveObj(int type, CMatrix& m, bool right)
|
||||||
|
@ -337,7 +337,7 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void (CAutomobile::*orgAutomobilePreRender)();
|
STATIC_INLINE void (CAutomobile::*orgAutomobilePreRender)();
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
void PreRender_SilentPatch()
|
void PreRender_SilentPatch()
|
||||||
|
@ -352,7 +352,7 @@ public:
|
||||||
void HideDestroyedWheels_SilentPatch(void (CAutomobile::*spawnFlyingComponentCB)(int, unsigned int), int nodeID, unsigned int modelID);
|
void HideDestroyedWheels_SilentPatch(void (CAutomobile::*spawnFlyingComponentCB)(int, unsigned int), int nodeID, unsigned int modelID);
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void (CAutomobile::*orgSpawnFlyingComponent)(int, unsigned int);
|
STATIC_INLINE void (CAutomobile::*orgSpawnFlyingComponent)(int, unsigned int);
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
void SpawnFlyingComponent_HideWheels(int nodeID, unsigned int modelID)
|
void SpawnFlyingComponent_HideWheels(int nodeID, unsigned int modelID)
|
||||||
|
@ -448,7 +448,7 @@ private:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static CVehicle* (CStoredCar::*orgRestoreCar)();
|
STATIC_INLINE CVehicle* (CStoredCar::*orgRestoreCar)();
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
CVehicle* RestoreCar_SilentPatch()
|
CVehicle* RestoreCar_SilentPatch()
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <Shlwapi.h>
|
#include <shlwapi.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "Utils/ModuleList.hpp"
|
#include "Utils/ModuleList.hpp"
|
||||||
|
@ -356,7 +356,7 @@ namespace RadarTraceOutlineFixes
|
||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void (*orgShowRadarTraceWithHeight)(float, float, unsigned int, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char);
|
STATIC_INLINE void (*orgShowRadarTraceWithHeight)(float, float, unsigned int, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char);
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void ShowRadarTraceWithHeight_RecalculatePositions(float a1, float a2, unsigned int a3, unsigned char a4, unsigned char a5, unsigned char a6, unsigned char a7, unsigned char a8)
|
static void ShowRadarTraceWithHeight_RecalculatePositions(float a1, float a2, unsigned int a3, unsigned char a4, unsigned char a5, unsigned char a6, unsigned char a7, unsigned char a8)
|
||||||
|
@ -456,7 +456,7 @@ namespace SlidingTextsScalingFixes
|
||||||
static inline bool bSlidingEnabled = false;
|
static inline bool bSlidingEnabled = false;
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void (*orgPrintString)(float,float,const wchar_t*);
|
STATIC_INLINE void (*orgPrintString)(float,float,const wchar_t*);
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void PrintString_Slide(float fX, float fY, const wchar_t* pText)
|
static void PrintString_Slide(float fX, float fY, const wchar_t* pText)
|
||||||
|
@ -466,7 +466,7 @@ namespace SlidingTextsScalingFixes
|
||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void (*orgSetRightJustifyWrap)(float wrap);
|
STATIC_INLINE void (*orgSetRightJustifyWrap)(float wrap);
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void SetRightJustifyWrap_Slide(float wrap)
|
static void SetRightJustifyWrap_Slide(float wrap)
|
||||||
|
@ -483,7 +483,7 @@ namespace SlidingTextsScalingFixes
|
||||||
static inline bool bSlidingEnabled = false;
|
static inline bool bSlidingEnabled = false;
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void (*orgPrintString)(float,float,const wchar_t*);
|
STATIC_INLINE void (*orgPrintString)(float,float,const wchar_t*);
|
||||||
|
|
||||||
template<std::size_t Index>
|
template<std::size_t Index>
|
||||||
static void PrintString_Slide(float fX, float fY, const wchar_t* pText)
|
static void PrintString_Slide(float fX, float fY, const wchar_t* pText)
|
||||||
|
@ -669,12 +669,13 @@ float FixedRefValue()
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __declspec(naked) SubtitlesShadowFix()
|
__declspec(naked) void SubtitlesShadowFix()
|
||||||
{
|
{
|
||||||
|
#ifdef MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov [esp], eax
|
mov [esp], eax
|
||||||
fild [esp]
|
fild dword ptr [esp]
|
||||||
push eax
|
push eax
|
||||||
lea eax, [esp+20h-18h]
|
lea eax, [esp+20h-18h]
|
||||||
push eax
|
push eax
|
||||||
|
@ -683,23 +684,56 @@ void __declspec(naked) SubtitlesShadowFix()
|
||||||
call Recalculate
|
call Recalculate
|
||||||
jmp SubtitlesShadowFix_JumpBack
|
jmp SubtitlesShadowFix_JumpBack
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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
|
||||||
}
|
}
|
||||||
|
|
||||||
void __declspec(naked) CreateInstance_BikeFix()
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
__declspec(naked) void CreateInstance_BikeFix()
|
||||||
|
{
|
||||||
|
#ifdef MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
push eax
|
push eax
|
||||||
mov ecx, ebp
|
mov ecx, ebp
|
||||||
call CVehicleModelInfo::GetExtrasFrame
|
call CVehicleModelInfo::GetExtrasFrame
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__asm__ volatile
|
||||||
|
(
|
||||||
|
"push eax\n"
|
||||||
|
"mov ecx, ebp\n"
|
||||||
|
"call %[CVehicleModelInfo_GetExtrasFrame]\n"
|
||||||
|
"ret"
|
||||||
|
:: [CVehicleModelInfo_GetExtrasFrame] "i" (CVehicleModelInfo_GetExtrasFrame)
|
||||||
|
);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
extern char** ppUserFilesDir = AddressByVersion<char**>(0x6022AA, 0x60228A, 0x601ECA);
|
char** ppUserFilesDir = AddressByVersion<char**>(0x6022AA, 0x60228A, 0x601ECA);
|
||||||
|
|
||||||
static LARGE_INTEGER FrameTime;
|
static LARGE_INTEGER FrameTime;
|
||||||
__declspec(safebuffers) int32_t GetTimeSinceLastFrame()
|
NOBUFFERCHECKS int32_t GetTimeSinceLastFrame()
|
||||||
{
|
{
|
||||||
LARGE_INTEGER curTime;
|
LARGE_INTEGER curTime;
|
||||||
QueryPerformanceCounter(&curTime);
|
QueryPerformanceCounter(&curTime);
|
||||||
|
@ -731,11 +765,13 @@ unsigned int __cdecl AutoPilotTimerCalculation_VC(unsigned int nTimer, int nScal
|
||||||
return nTimer - static_cast<unsigned int>(nScaleFactor * fScaleCoef);
|
return nTimer - static_cast<unsigned int>(nScaleFactor * fScaleCoef);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __declspec(naked) AutoPilotTimerFix_VC()
|
__declspec(naked) void AutoPilotTimerFix_VC()
|
||||||
{
|
{
|
||||||
_asm {
|
#ifdef MSC_VER
|
||||||
push dword ptr[esp + 0xC]
|
_asm
|
||||||
push dword ptr[ebx + 0x10]
|
{
|
||||||
|
push dword ptr [esp + 0xC]
|
||||||
|
push dword ptr [ebx + 0x10]
|
||||||
push eax
|
push eax
|
||||||
call AutoPilotTimerCalculation_VC
|
call AutoPilotTimerCalculation_VC
|
||||||
add esp, 0xC
|
add esp, 0xC
|
||||||
|
@ -743,8 +779,24 @@ void __declspec(naked) AutoPilotTimerFix_VC()
|
||||||
add esp, 0x30
|
add esp, 0x30
|
||||||
pop ebp
|
pop ebp
|
||||||
pop ebx
|
pop ebx
|
||||||
retn 4
|
ret 4
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -863,24 +915,43 @@ namespace Localization
|
||||||
// ============= Corrected FBI Washington sirens sound =============
|
// ============= Corrected FBI Washington sirens sound =============
|
||||||
namespace SirenSwitchingFix
|
namespace SirenSwitchingFix
|
||||||
{
|
{
|
||||||
void __declspec(naked) IsFBIRanchOrFBICar()
|
__declspec(naked) static void IsFBIRanchOrFBICar()
|
||||||
{
|
{
|
||||||
|
#ifdef MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov dword ptr [esi+1Ch], 1Ch
|
mov dword ptr [esi+0x1C], 0x1C
|
||||||
|
|
||||||
// al = 0 - high pitched siren
|
// al = 0 - high pitched siren
|
||||||
// al = 1 - normal siren
|
// al = 1 - normal siren
|
||||||
cmp dword ptr [ebp+14h], 90 // fbiranch
|
cmp dword ptr [ebp+0x14], 90 // fbiranch
|
||||||
je IsFBIRanchOrFBICar_HighPitchSiren
|
je IsFBIRanchOrFBICar_HighPitchSiren
|
||||||
cmp dword ptr [ebp+14h], 17 // fbicar
|
cmp dword ptr [ebp+0x14], 17 // fbicar
|
||||||
setne al
|
setne al
|
||||||
retn
|
ret
|
||||||
|
|
||||||
IsFBIRanchOrFBICar_HighPitchSiren:
|
IsFBIRanchOrFBICar_HighPitchSiren:
|
||||||
xor al, al
|
xor al, al
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -945,23 +1016,39 @@ namespace FBISirenCoronaFix
|
||||||
// ============= Fixed vehicles exploding twice if the driver leaves the car while it's exploding =============
|
// ============= Fixed vehicles exploding twice if the driver leaves the car while it's exploding =============
|
||||||
namespace RemoveDriverStatusFix
|
namespace RemoveDriverStatusFix
|
||||||
{
|
{
|
||||||
__declspec(naked) void RemoveDriver_SetStatus()
|
__declspec(naked) static void RemoveDriver_SetStatus()
|
||||||
{
|
{
|
||||||
// if (m_nStatus != STATUS_WRECKED)
|
// if (m_nStatus != STATUS_WRECKED)
|
||||||
// m_nStatus = STATUS_ABANDONED;
|
// m_nStatus = STATUS_ABANDONED;
|
||||||
|
#ifdef MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov cl, [ebx+50h]
|
mov cl, [ebx+0x50]
|
||||||
mov al, cl
|
mov al, cl
|
||||||
and cl, 0F8h
|
and cl, 0xF8
|
||||||
cmp cl, 28h
|
cmp cl, 0x28
|
||||||
je DontSetStatus
|
je DontSetStatus
|
||||||
and al, 7
|
and al, 7
|
||||||
or al, 20h
|
or al, 0x20
|
||||||
|
|
||||||
DontSetStatus:
|
DontSetStatus:
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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;
|
static void* orgSscanf_LoadPath;
|
||||||
__declspec(naked) static void sscanf1_LoadPath_Terminate()
|
__declspec(naked) static void sscanf1_LoadPath_Terminate()
|
||||||
{
|
{
|
||||||
|
#ifdef MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov eax, [esp+4]
|
mov eax, [esp+4]
|
||||||
mov byte ptr [eax+ecx], 0
|
mov byte ptr [eax+ecx], 0
|
||||||
jmp [orgSscanf_LoadPath]
|
jmp orgSscanf_LoadPath
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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()
|
__declspec(naked) static void PickUpEffects_BigDollarColor()
|
||||||
{
|
{
|
||||||
|
#ifdef MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov byte ptr [esp+184h-170h], 0
|
mov byte ptr [esp+0x184-0x170], 0
|
||||||
mov dword ptr [esp+184h-174h], 37
|
mov dword ptr [esp+0x184-0x174], 37
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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()
|
__declspec(naked) static void PickUpEffects_Minigun2Glow()
|
||||||
{
|
{
|
||||||
|
#ifdef MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
cmp ecx, 294 // minigun2
|
cmp ecx, 294 // minigun2
|
||||||
jnz NotMinigun2
|
jnz NotMinigun2
|
||||||
mov byte ptr [esp+184h-170h], 0
|
mov byte ptr [esp+0x184-0x170], 0
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
jmp Return
|
jmp Return
|
||||||
|
|
||||||
|
@ -1087,8 +1194,25 @@ namespace PickupEffectsFixes
|
||||||
|
|
||||||
Return:
|
Return:
|
||||||
mov ebx, ecx
|
mov ebx, ecx
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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()
|
__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
|
// 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
|
_asm
|
||||||
{
|
{
|
||||||
test bl, bl
|
test bl, bl
|
||||||
jnz ReturnToUpdateCompareFlag
|
jnz ReturnToUpdateCompareFlag
|
||||||
mov eax, [bUseMouse3rdPerson]
|
mov eax, bUseMouse3rdPerson
|
||||||
cmp byte ptr [eax], 0
|
cmp byte ptr [eax], 0
|
||||||
jne CmpAndReturn
|
jne CmpAndReturn
|
||||||
mov ecx, [TheCamera]
|
mov ecx, TheCamera
|
||||||
call [Using1stPersonWeaponMode]
|
call Using1stPersonWeaponMode
|
||||||
test al, al
|
test al, al
|
||||||
jz ReturnToUpdateCompareFlag
|
jz ReturnToUpdateCompareFlag
|
||||||
|
|
||||||
CmpAndReturn:
|
CmpAndReturn:
|
||||||
cmp byte ptr [esp+11Ch-10Ch], 0
|
cmp byte ptr [esp+0x11C-0x10C], 0
|
||||||
retn
|
ret
|
||||||
|
|
||||||
ReturnToUpdateCompareFlag:
|
ReturnToUpdateCompareFlag:
|
||||||
xor al, al
|
xor al, al
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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;
|
static void* EntityRender_Prologue_JumpBack;
|
||||||
__declspec(naked) static void __fastcall EntityRender_Original(CEntity*)
|
__declspec(naked) static void __fastcall EntityRender_Original(CEntity*)
|
||||||
{
|
{
|
||||||
|
#ifdef MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
push ebx
|
push ebx
|
||||||
mov ebx, ecx
|
mov ebx, ecx
|
||||||
cmp dword ptr [ebx+4Ch], 0
|
cmp dword ptr [ebx+0x4C], 0
|
||||||
jmp [EntityRender_Prologue_JumpBack]
|
jmp EntityRender_Prologue_JumpBack
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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)
|
static bool ShouldDisableBackfaceCulling(const CEntity* entity)
|
||||||
|
@ -1390,16 +1551,28 @@ namespace TommyFistShakeWithWeapons
|
||||||
return !bWeaponAllowsFistShake;
|
return !bWeaponAllowsFistShake;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __declspec(naked) void CheckWeaponGroupHook()
|
__declspec(naked) static void CheckWeaponGroupHook()
|
||||||
{
|
{
|
||||||
|
#ifdef MSC_VER
|
||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
push dword ptr [eax]
|
push dword ptr [eax]
|
||||||
call WeaponProhibitsFistShake
|
call WeaponProhibitsFistShake
|
||||||
add esp, 4
|
add esp, 4
|
||||||
test al, al
|
test al, al
|
||||||
retn
|
ret
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
__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>
|
template<std::size_t Index>
|
||||||
|
@ -1875,7 +2048,7 @@ void InjectDelayedPatches_VC_Common( bool bHasDebugMenu, const wchar_t* wcModule
|
||||||
|
|
||||||
|
|
||||||
// Stuff to let us (re)initialize
|
// Stuff to let us (re)initialize
|
||||||
static void (*HUDReInitialise)() = static_cast<decltype(HUDReInitialise)>(get_pattern("31 C0 53 0F EF C0 C6 05"));
|
static void (*HUDReInitialise)() = reinterpret_cast<decltype(HUDReInitialise)>(get_pattern("31 C0 53 0F EF C0 C6 05"));
|
||||||
|
|
||||||
// This pattern has 5 hits - first 2 are in Reinitialise, the rest is in Initialise
|
// This pattern has 5 hits - first 2 are in Reinitialise, the rest is in Initialise
|
||||||
auto reinitialise1 = pattern("C7 05 ? ? ? ? 05 00 00 00 66 C7 05 ? ? ? ? 00 00 C7 05 ? ? ? ? 00 00 00 00").count(5);
|
auto reinitialise1 = pattern("C7 05 ? ? ? ? 05 00 00 00 66 C7 05 ? ? ? ? 00 00 C7 05 ? ? ? ? 00 00 00 00").count(5);
|
||||||
|
@ -2758,7 +2931,7 @@ void Patch_VC_Common()
|
||||||
using namespace IsPlayerTargettingCharFix;
|
using namespace IsPlayerTargettingCharFix;
|
||||||
|
|
||||||
auto isPlayerTargettingChar = pattern("83 7C 24 ? ? A3 ? ? ? ? 0F 84").get_one();
|
auto isPlayerTargettingChar = pattern("83 7C 24 ? ? A3 ? ? ? ? 0F 84").get_one();
|
||||||
auto using1stPersonWeaponMode = static_cast<decltype(Using1stPersonWeaponMode)>(get_pattern("66 83 F8 07 74 18", -7));
|
auto using1stPersonWeaponMode = reinterpret_cast<decltype(Using1stPersonWeaponMode)>(get_pattern("66 83 F8 07 74 18", -7));
|
||||||
bool* useMouse3rdPerson = *get_pattern<bool*>("80 3D ? ? ? ? ? 75 09 66 C7 05 ? ? ? ? ? ? 8B 35", 2);
|
bool* useMouse3rdPerson = *get_pattern<bool*>("80 3D ? ? ? ? ? 75 09 66 C7 05 ? ? ? ? ? ? 8B 35", 2);
|
||||||
void* theCamera = *get_pattern<void*>("B9 ? ? ? ? 31 DB E8", 1);
|
void* theCamera = *get_pattern<void*>("B9 ? ? ? ? 31 DB E8", 1);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue