-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
1,501 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
premake5 vs2015 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
#ifndef __MEMORYMGR | ||
#define __MEMORYMGR | ||
typedef uintptr_t addr; | ||
#define WRAPPER __declspec(naked) | ||
#define DEPRECATED __declspec(deprecated) | ||
#define EAXJMP(a) { _asm mov eax, a _asm jmp eax } | ||
#define VARJMP(a) { _asm jmp a } | ||
#define WRAPARG(a) UNREFERENCED_PARAMETER(a) | ||
|
||
#define NOVMT __declspec(novtable) | ||
#define SETVMT(a) *((DWORD_PTR*)this) = (DWORD_PTR)a | ||
|
||
enum | ||
{ | ||
PATCH_CALL, | ||
PATCH_JUMP, | ||
PATCH_NOTHING, | ||
}; | ||
|
||
enum | ||
{ | ||
III_10 = 1, | ||
III_11, | ||
III_STEAM, | ||
VC_10, | ||
VC_11, | ||
VC_STEAM | ||
}; | ||
|
||
extern int gtaversion; | ||
|
||
template<typename T> | ||
inline T AddressByVersion(addr addressIII10, addr addressIII11, addr addressIIISteam, addr addressvc10, addr addressvc11, addr addressvcSteam) | ||
{ | ||
if(gtaversion == -1){ | ||
if(*(addr*)0x5C1E75 == 0xB85548EC) gtaversion = III_10; | ||
else if(*(addr*)0x5C2135 == 0xB85548EC) gtaversion = III_11; | ||
else if(*(addr*)0x5C6FD5 == 0xB85548EC) gtaversion = III_STEAM; | ||
else if(*(addr*)0x667BF5 == 0xB85548EC) gtaversion = VC_10; | ||
else if(*(addr*)0x667C45 == 0xB85548EC) gtaversion = VC_11; | ||
else if(*(addr*)0x666BA5 == 0xB85548EC) gtaversion = VC_STEAM; | ||
else gtaversion = 0; | ||
} | ||
switch(gtaversion){ | ||
case III_10: | ||
return (T)addressIII10; | ||
case III_11: | ||
return (T)addressIII11; | ||
case III_STEAM: | ||
return (T)addressIIISteam; | ||
case VC_10: | ||
return (T)addressvc10; | ||
case VC_11: | ||
return (T)addressvc11; | ||
case VC_STEAM: | ||
return (T)addressvcSteam; | ||
default: | ||
return (T)0; | ||
} | ||
} | ||
|
||
inline bool | ||
is10(void) | ||
{ | ||
return gtaversion == III_10 || gtaversion == VC_10; | ||
} | ||
|
||
inline bool | ||
isIII(void) | ||
{ | ||
return gtaversion >= III_10 && gtaversion <= III_STEAM; | ||
} | ||
|
||
inline bool | ||
isVC(void) | ||
{ | ||
return gtaversion >= VC_10 && gtaversion <= VC_STEAM; | ||
} | ||
|
||
template<typename T, typename AT> inline void | ||
Patch(AT address, T value) | ||
{ | ||
DWORD dwProtect[2]; | ||
VirtualProtect((void*)address, sizeof(T), PAGE_EXECUTE_READWRITE, &dwProtect[0]); | ||
*(T*)address = value; | ||
VirtualProtect((void*)address, sizeof(T), dwProtect[0], &dwProtect[1]); | ||
} | ||
|
||
template<typename AT> inline void | ||
Nop(AT address, unsigned int nCount) | ||
{ | ||
DWORD dwProtect[2]; | ||
VirtualProtect((void*)address, nCount, PAGE_EXECUTE_READWRITE, &dwProtect[0]); | ||
memset((void*)address, 0x90, nCount); | ||
VirtualProtect((void*)address, nCount, dwProtect[0], &dwProtect[1]); | ||
} | ||
|
||
template<typename AT, typename HT> inline void | ||
InjectHook(AT address, HT hook, unsigned int nType=PATCH_NOTHING) | ||
{ | ||
DWORD dwProtect[2]; | ||
switch ( nType ) | ||
{ | ||
case PATCH_JUMP: | ||
VirtualProtect((void*)address, 5, PAGE_EXECUTE_READWRITE, &dwProtect[0]); | ||
*(BYTE*)address = 0xE9; | ||
break; | ||
case PATCH_CALL: | ||
VirtualProtect((void*)address, 5, PAGE_EXECUTE_READWRITE, &dwProtect[0]); | ||
*(BYTE*)address = 0xE8; | ||
break; | ||
default: | ||
VirtualProtect((void*)((DWORD)address + 1), 4, PAGE_EXECUTE_READWRITE, &dwProtect[0]); | ||
break; | ||
} | ||
DWORD dwHook; | ||
_asm | ||
{ | ||
mov eax, hook | ||
mov dwHook, eax | ||
} | ||
|
||
*(ptrdiff_t*)((DWORD)address + 1) = (DWORD)dwHook - (DWORD)address - 5; | ||
if ( nType == PATCH_NOTHING ) | ||
VirtualProtect((void*)((DWORD)address + 1), 4, dwProtect[0], &dwProtect[1]); | ||
else | ||
VirtualProtect((void*)address, 5, dwProtect[0], &dwProtect[1]); | ||
} | ||
|
||
inline void ExtractCall(void *dst, addr a) | ||
{ | ||
*(addr*)dst = (addr)(*(addr*)(a+1) + a + 5); | ||
} | ||
template<typename T> | ||
inline void InterceptCall(void *dst, T func, addr a) | ||
{ | ||
ExtractCall(dst, a); | ||
InjectHook(a, func); | ||
} | ||
template<typename T> | ||
inline void InterceptVmethod(void *dst, T func, addr a) | ||
{ | ||
*(addr*)dst = *(addr*)a; | ||
Patch(a, func); | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
#include "tcycedit.h" | ||
|
||
RsGlobalType &RsGlobal = *(RsGlobalType*)ADDR(0x8F4360, 0x9B48D8); | ||
|
||
uint8 &CTimer::m_UserPause = *(uint8*)ADDR(0x95CD7C, 0xA10B36); | ||
uint8 &CTimer::m_CodePause = *(uint8*)ADDR(0x95CDB1, 0xA10B76); | ||
//WRAPPER void CTimer::Stop(void) { EAXJMP(0x4AD480); } | ||
//WRAPPER void CTimer::Update(void) { EAXJMP(0x4ACF70); } | ||
|
||
int8 &CClock::ms_nGameClockHours = *(int8*)ADDR(0x95CDA6, 0xA10B6B); | ||
int8 &CClock::ms_nGameClockMinutes = *(int8*)ADDR(0x95CDC8, 0xA10B92); | ||
int16 &CClock::ms_nGameClockSeconds = *(int16*)ADDR(0x95CC7C, 0xA10A3C); | ||
|
||
float &CWeather::InterpolationValue = *(float*)ADDR(0x8F2520, 0x9787D8); | ||
int16 &CWeather::OldWeatherType = *(int16*)ADDR(0x95CCEC, 0xA10AAA); | ||
int16 &CWeather::NewWeatherType = *(int16*)ADDR(0x95CC70, 0xA10A2E); | ||
|
||
WRAPPER void CFileMgr::SetDir(const char *path) { EAXJMP(ADDR(0x479020, 0x48E030)); } | ||
|
||
WRAPPER void CCoronas::DoSunAndMoon(void){ EAXJMP(ADDR(0x4FA380, 0x542210)); } | ||
WRAPPER void CCoronas::Update(void){ EAXJMP(ADDR(0x4F8EC0, 0x544130)); } | ||
|
||
WRAPPER CPad *CPad::GetPad(int id) { EAXJMP(ADDR(0x492F60, 0x4AB060)); } | ||
|
||
WRAPPER bool CControllerConfigManager::GetIsKeyboardKeyDown(RsKeyCodes key) { EAXJMP(ADDR(0x58D2A0, 0x617E10)); } | ||
WRAPPER bool CControllerConfigManager::GetIsKeyboardKeyJustDown(RsKeyCodes key) { EAXJMP(ADDR(0x58D8A0, 0x617430)); } | ||
|
||
WRAPPER void CSprite2d::Draw(CRect const &, CRGBA const &) { EAXJMP(ADDR(0x51ED50, 0x578710)); } | ||
WRAPPER void CSprite2d::DrawRect(CRect const &,CRGBA const &) { EAXJMP(ADDR(0x51F970, 0x577B00)); } | ||
|
||
//WRAPPER void CFont::Initialise(void) { EAXJMP(ADDR(0x500A40, 0x552310)); } | ||
//WRAPPER void CFont::Shutdown(void) { EAXJMP(ADDR(0x500BA0, 0x5522E0)); } | ||
//WRAPPER void CFont::InitPerFrame(void) { EAXJMP(ADDR(0x500BE0, 0x0)); } | ||
//WRAPPER void CFont::PrintChar(float,float,short) { EAXJMP(ADDR(0x500C30, 0x0)); } | ||
WRAPPER void CFont::PrintString(float,float,uint16 *) { EAXJMP(ADDR(0x500F50, 0x551040)); } | ||
//WRAPPER void CFont::PrintString(float,float,uint16 *,uint16 *,float) { EAXJMP(ADDR(0x501730, 0x0)); } | ||
//WRAPPER void CFont::ParseToken(uint16 *,uint16 *) { EAXJMP(ADDR(0x5019A0, 0x0)); } | ||
//WRAPPER void CFont::DrawFonts(void) { EAXJMP(ADDR(0x501B50, 0x0)); } | ||
WRAPPER void CFont::SetScale(float,float) { EAXJMP(ADDR(0x501B80, 0x550230)); } | ||
WRAPPER void CFont::SetColor(CRGBA*) { EAXJMP(ADDR(0x501BD0, 0x550170)); } | ||
WRAPPER void CFont::SetJustifyOff(void) { EAXJMP(ADDR(0x501C80, 0x550140)); } | ||
WRAPPER void CFont::SetCentreOn(void) { EAXJMP(ADDR(0x501C90, 0x550120)); } | ||
WRAPPER void CFont::SetCentreOff(void) { EAXJMP(ADDR(0x501CB0, 0x550110)); } | ||
//WRAPPER void CFont::SetCentreSize(float) { EAXJMP(ADDR(0x501CD0, 0x0)); } | ||
WRAPPER void CFont::SetBackgroundOff(void) { EAXJMP(ADDR(0x501CF0, 0x5500D0)); } | ||
WRAPPER void CFont::SetBackGroundOnlyTextOff(void) { EAXJMP(ADDR(0x501D40, 0x550080)); } | ||
WRAPPER void CFont::SetRightJustifyOn(void) { EAXJMP(ADDR(0x501D50, 0x550060)); } | ||
WRAPPER void CFont::SetPropOff(void) { EAXJMP(ADDR(0x501D90, 0x550030)); } | ||
WRAPPER void CFont::SetPropOn(void) { EAXJMP(ADDR(0x501DA0, 0x550020)); } | ||
WRAPPER void CFont::SetFontStyle(short) { EAXJMP(ADDR(0x501DB0, 0x54FFE0)); } | ||
WRAPPER void CFont::SetRightJustifyWrap(float) { EAXJMP(ADDR(0x501DC0, 0x54FFD0)); } | ||
//WRAPPER void CFont::SetDropShadowPosition(short) { EAXJMP(ADDR(0x501E70, 0x0)); } | ||
//WRAPPER double CFont::GetStringWidth(uint16 *str, bool spc) { EAXJMP(ADDR(0x5018A0, 0x0)); } | ||
|
||
WRAPPER void AsciiToUnicode(char const *,uint16 *) { EAXJMP(ADDR(0x5009C0, 0x552500)); } |
Oops, something went wrong.