-
Notifications
You must be signed in to change notification settings - Fork 2
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
0 parents
commit 7b49c2a
Showing
9 changed files
with
3,148 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
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,154 @@ | ||
#ifndef __MEMORYMGR | ||
#define __MEMORYMGR | ||
|
||
#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; | ||
} | ||
|
||
#define PTRFROMCALL(addr) (uint32_t)(*(uint32_t*)((uint32_t)addr+1) + (uint32_t)addr + 5) | ||
#define INTERCEPT(saved, func, a) \ | ||
{ \ | ||
saved = PTRFROMCALL(a); \ | ||
InjectHook(a, func); \ | ||
} | ||
|
||
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,45 @@ | ||
#pragma once | ||
#define WIN32_LEAN_AND_MEAN | ||
|
||
#define _CRT_SECURE_NO_WARNINGS | ||
#define _USE_MATH_DEFINES | ||
#pragma warning(disable: 4244) // int to float | ||
#pragma warning(disable: 4800) // int to bool | ||
#pragma warning(disable: 4305) // double to float | ||
#pragma warning(disable: 4838) // narrowing conversion | ||
#pragma warning(disable: 4996) // POSIX names | ||
|
||
#define PI 3.1415927f | ||
#define TWOPI (PI*2) | ||
#define HALFPI (PI/2) | ||
#define DEGTORAD(x) ((x) * PI / 180.0f) | ||
#define RADTODEG(x) ((x) * 180.0f / PI) | ||
|
||
#include <windows.h> | ||
#include <stdio.h> | ||
#include <stdint.h> | ||
#include <assert.h> | ||
#include <math.h> | ||
#include <new> | ||
#include <string> | ||
|
||
typedef uint8_t uint8; | ||
typedef int8_t int8; | ||
typedef uint16_t uint16; | ||
typedef int16_t int16; | ||
typedef uint32_t uint32; | ||
typedef int32_t int32; | ||
typedef uintptr_t uintptr; | ||
typedef uint64_t uint64; | ||
typedef int64_t int64; | ||
// hardcode ucs-2 | ||
typedef uint16_t wchar; | ||
|
||
typedef uintptr_t addr; | ||
#define nil nullptr | ||
|
||
inline float RecipSqrt(float x, float y) { return x / sqrtf(y); } | ||
inline float RecipSqrt(float x) { return RecipSqrt(1.0f, x); } | ||
|
||
#define clamp(v, low, high) ((v)<(low) ? (low) : (v)>(high) ? (high) : (v)) | ||
#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) |
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,154 @@ | ||
|
||
extern "C" { | ||
|
||
typedef void (*TriggerFunc)(void); | ||
|
||
struct DebugMenuEntry; | ||
|
||
typedef DebugMenuEntry *(*DebugMenuAddInt8_TYPE)(const char *path, const char *name, int8_t *ptr, TriggerFunc triggerFunc, int8_t step, int8_t lowerBound, int8_t upperBound, const char **strings); | ||
typedef DebugMenuEntry *(*DebugMenuAddInt16_TYPE)(const char *path, const char *name, int16_t *ptr, TriggerFunc triggerFunc, int16_t step, int16_t lowerBound, int16_t upperBound, const char **strings); | ||
typedef DebugMenuEntry *(*DebugMenuAddInt32_TYPE)(const char *path, const char *name, int32_t *ptr, TriggerFunc triggerFunc, int32_t step, int32_t lowerBound, int32_t upperBound, const char **strings); | ||
typedef DebugMenuEntry *(*DebugMenuAddInt64_TYPE)(const char *path, const char *name, int64_t *ptr, TriggerFunc triggerFunc, int64_t step, int64_t lowerBound, int64_t upperBound, const char **strings); | ||
typedef DebugMenuEntry *(*DebugMenuAddUInt8_TYPE)(const char *path, const char *name, uint8_t *ptr, TriggerFunc triggerFunc, uint8_t step, uint8_t lowerBound, uint8_t upperBound, const char **strings); | ||
typedef DebugMenuEntry *(*DebugMenuAddUInt16_TYPE)(const char *path, const char *name, uint16_t *ptr, TriggerFunc triggerFunc, uint16_t step, uint16_t lowerBound, uint16_t upperBound, const char **strings); | ||
typedef DebugMenuEntry *(*DebugMenuAddUInt32_TYPE)(const char *path, const char *name, uint32_t *ptr, TriggerFunc triggerFunc, uint32_t step, uint32_t lowerBound, uint32_t upperBound, const char **strings); | ||
typedef DebugMenuEntry *(*DebugMenuAddUInt64_TYPE)(const char *path, const char *name, uint64_t *ptr, TriggerFunc triggerFunc, uint64_t step, uint64_t lowerBound, uint64_t upperBound, const char **strings); | ||
typedef DebugMenuEntry *(*DebugMenuAddFloat32_TYPE)(const char *path, const char *name, float *ptr, TriggerFunc triggerFunc, float step, float lowerBound, float upperBound); | ||
typedef DebugMenuEntry *(*DebugMenuAddFloat64_TYPE)(const char *path, const char *name, double *ptr, TriggerFunc triggerFunc, double step, double lowerBound, double upperBound); | ||
typedef DebugMenuEntry *(*DebugMenuAddCmd_TYPE)(const char *path, const char *name, TriggerFunc triggerFunc); | ||
typedef void (*DebugMenuEntrySetWrap_TYPE)(DebugMenuEntry *e, bool wrap); | ||
typedef void (*DebugMenuEntrySetStrings_TYPE)(DebugMenuEntry *e, const char **strings); | ||
typedef void (*DebugMenuEntrySetAddress_TYPE)(DebugMenuEntry *e, void *addr); | ||
|
||
struct DebugMenuAPI | ||
{ | ||
bool isLoaded; | ||
HMODULE module; | ||
DebugMenuAddInt8_TYPE addint8; | ||
DebugMenuAddInt16_TYPE addint16; | ||
DebugMenuAddInt32_TYPE addint32; | ||
DebugMenuAddInt64_TYPE addint64; | ||
DebugMenuAddUInt8_TYPE adduint8; | ||
DebugMenuAddUInt16_TYPE adduint16; | ||
DebugMenuAddUInt32_TYPE adduint32; | ||
DebugMenuAddUInt64_TYPE adduint64; | ||
DebugMenuAddFloat32_TYPE addfloat32; | ||
DebugMenuAddFloat64_TYPE addfloat64; | ||
DebugMenuAddCmd_TYPE addcmd; | ||
DebugMenuEntrySetWrap_TYPE setwrap; | ||
DebugMenuEntrySetStrings_TYPE setstrings; | ||
DebugMenuEntrySetAddress_TYPE setaddress; | ||
}; | ||
extern DebugMenuAPI gDebugMenuAPI; | ||
|
||
inline DebugMenuEntry *DebugMenuAddInt8(const char *path, const char *name, int8_t *ptr, TriggerFunc triggerFunc, int8_t step, int8_t lowerBound, int8_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.addint8(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddInt16(const char *path, const char *name, int16_t *ptr, TriggerFunc triggerFunc, int16_t step, int16_t lowerBound, int16_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.addint16(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddInt32(const char *path, const char *name, int32_t *ptr, TriggerFunc triggerFunc, int32_t step, int32_t lowerBound, int32_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.addint32(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddInt64(const char *path, const char *name, int64_t *ptr, TriggerFunc triggerFunc, int64_t step, int64_t lowerBound, int64_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.addint64(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddUInt8(const char *path, const char *name, uint8_t *ptr, TriggerFunc triggerFunc, uint8_t step, uint8_t lowerBound, uint8_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.adduint8(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddUInt16(const char *path, const char *name, uint16_t *ptr, TriggerFunc triggerFunc, uint16_t step, uint16_t lowerBound, uint16_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.adduint16(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddUInt32(const char *path, const char *name, uint32_t *ptr, TriggerFunc triggerFunc, uint32_t step, uint32_t lowerBound, uint32_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.adduint32(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddUInt64(const char *path, const char *name, uint64_t *ptr, TriggerFunc triggerFunc, uint64_t step, uint64_t lowerBound, uint64_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.adduint64(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddFloat32(const char *path, const char *name, float *ptr, TriggerFunc triggerFunc, float step, float lowerBound, float upperBound) | ||
{ return gDebugMenuAPI.addfloat32(path, name, ptr, triggerFunc, step, lowerBound, upperBound); } | ||
inline DebugMenuEntry *DebugMenuAddFloat64(const char *path, const char *name, double *ptr, TriggerFunc triggerFunc, double step, double lowerBound, double upperBound) | ||
{ return gDebugMenuAPI.addfloat64(path, name, ptr, triggerFunc, step, lowerBound, upperBound); } | ||
inline DebugMenuEntry *DebugMenuAddCmd(const char *path, const char *name, TriggerFunc triggerFunc) | ||
{ return gDebugMenuAPI.addcmd(path, name, triggerFunc); } | ||
inline void DebugMenuEntrySetWrap(DebugMenuEntry *e, bool wrap) | ||
{ gDebugMenuAPI.setwrap(e, wrap); } | ||
inline void DebugMenuEntrySetStrings(DebugMenuEntry *e, const char **strings) | ||
{ gDebugMenuAPI.setstrings(e, strings); } | ||
inline void DebugMenuEntrySetAddress(DebugMenuEntry *e, void *addr) | ||
{ gDebugMenuAPI.setaddress(e, addr); } | ||
|
||
inline bool DebugMenuLoad(void) | ||
{ | ||
if(gDebugMenuAPI.isLoaded) | ||
return true; | ||
HMODULE mod = LoadLibraryA("debugmenu"); | ||
if(mod == 0){ | ||
char modulePath[MAX_PATH]; | ||
HMODULE dllModule; | ||
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR)&gDebugMenuAPI, &dllModule); | ||
GetModuleFileNameA(dllModule, modulePath, MAX_PATH); | ||
char *p = strchr(modulePath, '\\'); | ||
if(p) p[1] = '\0'; | ||
strcat(modulePath, "debugmenu"); | ||
mod = LoadLibraryA(modulePath); | ||
} | ||
if(mod == 0) | ||
return false; | ||
gDebugMenuAPI.addint8 = (DebugMenuAddInt8_TYPE)GetProcAddress(mod, "DebugMenuAddInt8"); | ||
gDebugMenuAPI.addint16 = (DebugMenuAddInt16_TYPE)GetProcAddress(mod, "DebugMenuAddInt16"); | ||
gDebugMenuAPI.addint32 = (DebugMenuAddInt32_TYPE)GetProcAddress(mod, "DebugMenuAddInt32"); | ||
gDebugMenuAPI.addint64 = (DebugMenuAddInt64_TYPE)GetProcAddress(mod, "DebugMenuAddInt64"); | ||
gDebugMenuAPI.adduint8 = (DebugMenuAddUInt8_TYPE)GetProcAddress(mod, "DebugMenuAddUInt8"); | ||
gDebugMenuAPI.adduint16 = (DebugMenuAddUInt16_TYPE)GetProcAddress(mod, "DebugMenuAddUInt16"); | ||
gDebugMenuAPI.adduint32 = (DebugMenuAddUInt32_TYPE)GetProcAddress(mod, "DebugMenuAddUInt32"); | ||
gDebugMenuAPI.adduint64 = (DebugMenuAddUInt64_TYPE)GetProcAddress(mod, "DebugMenuAddUInt64"); | ||
gDebugMenuAPI.addfloat32 = (DebugMenuAddFloat32_TYPE)GetProcAddress(mod, "DebugMenuAddFloat32"); | ||
gDebugMenuAPI.addfloat64 = (DebugMenuAddFloat64_TYPE)GetProcAddress(mod, "DebugMenuAddFloat64"); | ||
gDebugMenuAPI.addcmd = (DebugMenuAddCmd_TYPE)GetProcAddress(mod, "DebugMenuAddCmd"); | ||
gDebugMenuAPI.setwrap = (DebugMenuEntrySetWrap_TYPE)GetProcAddress(mod, "DebugMenuEntrySetWrap"); | ||
gDebugMenuAPI.setstrings = (DebugMenuEntrySetStrings_TYPE)GetProcAddress(mod, "DebugMenuEntrySetStrings"); | ||
gDebugMenuAPI.setaddress = (DebugMenuEntrySetAddress_TYPE)GetProcAddress(mod, "DebugMenuEntrySetAddress"); | ||
gDebugMenuAPI.isLoaded = true; | ||
gDebugMenuAPI.module = mod; | ||
return true; | ||
} | ||
|
||
} | ||
|
||
// Also overload them for simplicity | ||
|
||
inline DebugMenuEntry *DebugMenuAddVar(const char *path, const char *name, int8_t *ptr, TriggerFunc triggerFunc, int8_t step, int8_t lowerBound, int8_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.addint8(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddVar(const char *path, const char *name, int16_t *ptr, TriggerFunc triggerFunc, int16_t step, int16_t lowerBound, int16_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.addint16(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddVar(const char *path, const char *name, int32_t *ptr, TriggerFunc triggerFunc, int32_t step, int32_t lowerBound, int32_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.addint32(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddVar(const char *path, const char *name, int64_t *ptr, TriggerFunc triggerFunc, int64_t step, int64_t lowerBound, int64_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.addint64(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddVar(const char *path, const char *name, uint8_t *ptr, TriggerFunc triggerFunc, uint8_t step, uint8_t lowerBound, uint8_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.adduint8(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddVar(const char *path, const char *name, uint16_t *ptr, TriggerFunc triggerFunc, uint16_t step, uint16_t lowerBound, uint16_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.adduint16(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddVar(const char *path, const char *name, uint32_t *ptr, TriggerFunc triggerFunc, uint32_t step, uint32_t lowerBound, uint32_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.adduint32(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddVar(const char *path, const char *name, uint64_t *ptr, TriggerFunc triggerFunc, uint64_t step, uint64_t lowerBound, uint64_t upperBound, const char **strings) | ||
{ return gDebugMenuAPI.adduint64(path, name, ptr, triggerFunc, step, lowerBound, upperBound, strings); } | ||
inline DebugMenuEntry *DebugMenuAddVar(const char *path, const char *name, float *ptr, TriggerFunc triggerFunc, float step, float lowerBound, float upperBound) | ||
{ return gDebugMenuAPI.addfloat32(path, name, ptr, triggerFunc, step, lowerBound, upperBound); } | ||
inline DebugMenuEntry *DebugMenuAddVar(const char *path, const char *name, double *ptr, TriggerFunc triggerFunc, double step, double lowerBound, double upperBound) | ||
{ return gDebugMenuAPI.addfloat64(path, name, ptr, triggerFunc, step, lowerBound, upperBound); } | ||
|
||
inline DebugMenuEntry *DebugMenuAddVarBool32(const char *path, const char *name, int32_t *ptr, TriggerFunc triggerFunc) | ||
{ | ||
static const char *boolstr[] = { "Off", "On" }; | ||
DebugMenuEntry *e = DebugMenuAddVar(path, name, ptr, triggerFunc, 1, 0, 1, boolstr); | ||
DebugMenuEntrySetWrap(e, true); | ||
return e; | ||
} | ||
inline DebugMenuEntry *DebugMenuAddVarBool16(const char *path, const char *name, int16_t *ptr, TriggerFunc triggerFunc) | ||
{ | ||
static const char *boolstr[] = { "Off", "On" }; | ||
DebugMenuEntry *e = DebugMenuAddVar(path, name, ptr, triggerFunc, 1, 0, 1, boolstr); | ||
DebugMenuEntrySetWrap(e, true); | ||
return e; | ||
} | ||
inline DebugMenuEntry *DebugMenuAddVarBool8(const char *path, const char *name, int8_t *ptr, TriggerFunc triggerFunc) | ||
{ | ||
static const char *boolstr[] = { "Off", "On" }; | ||
DebugMenuEntry *e = DebugMenuAddVar(path, name, ptr, triggerFunc, 1, 0, 1, boolstr); | ||
DebugMenuEntrySetWrap(e, true); | ||
return e; | ||
} |
Binary file not shown.
Oops, something went wrong.