├── Makefile ├── README.md ├── Red Dead Redemption 2.jpg ├── build ├── embed.o ├── gta.o ├── kern.o ├── main.o └── proc.o ├── gtaPayload ├── Makefile ├── build │ ├── invoker.o │ ├── lib.o │ ├── main.o │ └── menu.o ├── crt0.s ├── gtaPayload.bin ├── include │ ├── invoker.h │ ├── lib.h │ ├── menu.h │ ├── natives.h │ └── types.h ├── linker.x └── source │ ├── invoker.cpp │ ├── lib.cpp │ ├── main.cpp │ └── menu.cpp ├── include ├── gta.h ├── kern.h ├── proc.h └── type.h ├── rdr2-menu-base-129.bin └── source ├── embed.s ├── gta.c ├── kern.c ├── main.c └── proc.c /Makefile: -------------------------------------------------------------------------------- 1 | LIBPS4 := $(PS4SDK)/libPS4 2 | 3 | CC := gcc 4 | AS := gcc 5 | OBJCOPY := objcopy 6 | ODIR := build 7 | SDIR := source 8 | IDIRS := -I$(LIBPS4)/include -I. -Iinclude 9 | LDIRS := -L$(LIBPS4) -L. -Llib 10 | CFLAGS := $(IDIRS) -O2 -std=c11 -ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nostdlib -Wall -masm=intel -march=btver2 -mtune=btver2 -m64 -mabi=sysv -mcmodel=small -fpie 11 | SFLAGS := -nostartfiles -nostdlib -march=btver2 -mtune=btver2 -m64 -mabi=sysv -mcmodel=large 12 | LFLAGS := $(LDIRS) -Xlinker -T $(LIBPS4)/linker.x -Wl,--build-id=none 13 | CFILES := $(wildcard $(SDIR)/*.c) 14 | SFILES := $(wildcard $(SDIR)/*.s) 15 | OBJS := $(patsubst $(SDIR)/%.c, $(ODIR)/%.o, $(CFILES)) $(patsubst $(SDIR)/%.s, $(ODIR)/%.o, $(SFILES)) 16 | 17 | LIBS := -lPS4 18 | 19 | TARGET = $(shell basename $(CURDIR)).bin 20 | 21 | $(TARGET): makeGtaPayload requiredClean $(ODIR) $(OBJS) 22 | $(CC) $(LIBPS4)/crt0.s $(ODIR)/*.o -o temp.t $(CFLAGS) $(LFLAGS) $(LIBS) 23 | $(OBJCOPY) -O binary temp.t $(TARGET) 24 | rm -f temp.t 25 | 26 | $(ODIR)/%.o: $(SDIR)/%.c 27 | $(CC) -c -o $@ $< $(CFLAGS) 28 | 29 | $(ODIR)/%.o: $(SDIR)/%.s 30 | $(AS) -c -o $@ $< $(SFLAGS) 31 | 32 | $(ODIR): 33 | @mkdir $@ 34 | 35 | .PHONY: $(TARGET) 36 | 37 | makeGtaPayload: 38 | $(MAKE) -C gtaPayload $? 39 | 40 | requiredClean: 41 | rm -f $(TARGET) $(ODIR)/embed.o 42 | 43 | clean: 44 | rm -f $(TARGET) $(ODIR)/*.o 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PS4-RDR-2-Menu-Base 2 | A mod menu GUI for PS4 RDR 2 3 | 4 | 5 | A (very basic) mod menu GUI based on 2much4u's [PS4 GTA V Menu Base](https://github.com/2much4u/PS4-GTA-V-Menu-Base). 6 | 7 | Requires [Scene Collective/AlAzif's PS4 Payload SDK](https://github.com/Scene-Collective/ps4-payload-sdk) to compile. 8 | Compatible with firmwares 5.05, 6.72, 7.55, and 9.00 9 | 10 | **Supports only the 1.29 patch of RDR 2 on both US & EU regions.** 11 | 12 | Currently not compatible with GoldHEN's bin loader. 13 | 14 | Just as customizable as 2much4u's GTA V Menu Base. 15 | 16 | Special thanks to 2much4u, 0x199, AlAzif, and ChendoChap for their assistance. 17 | 18 | ![pic](https://github.com/ethylamine/PS4-RDR-2-Menu-Base/blob/main/Red%20Dead%20Redemption%202.jpg) 19 | -------------------------------------------------------------------------------- /Red Dead Redemption 2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/Red Dead Redemption 2.jpg -------------------------------------------------------------------------------- /build/embed.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/build/embed.o -------------------------------------------------------------------------------- /build/gta.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/build/gta.o -------------------------------------------------------------------------------- /build/kern.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/build/kern.o -------------------------------------------------------------------------------- /build/main.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/build/main.o -------------------------------------------------------------------------------- /build/proc.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/build/proc.o -------------------------------------------------------------------------------- /gtaPayload/Makefile: -------------------------------------------------------------------------------- 1 | CC := gcc 2 | AS := gcc 3 | OBJCOPY := objcopy 4 | ODIR := build 5 | SDIR := source 6 | IDIRS := -Iinclude 7 | LDIRS := -Llib 8 | CFLAGS := $(IDIRS) $(LDIRS) -O3 -s -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nostdlib -masm=intel -march=btver2 -mtune=btver2 -m64 -mabi=sysv -mcmodel=small -fpie -fpermissive 9 | LFLAGS := -Xlinker -T linker.x -Wl,--build-id=none 10 | SFLAGS := -nostartfiles -nostdlib -masm=intel -march=btver2 -mtune=btver2 -m64 -mabi=sysv -mcmodel=large 11 | CFILES := $(wildcard $(SDIR)/*.cpp) 12 | SFILES := $(wildcard $(SDIR)/*.s) 13 | OBJS := $(patsubst $(SDIR)/%.cpp, $(ODIR)/%.o, $(CFILES)) $(patsubst $(SDIR)/%.s, $(ODIR)/%.o, $(SFILES)) 14 | 15 | TARGET = $(shell basename $(CURDIR)).bin 16 | 17 | $(TARGET): $(ODIR) $(OBJS) 18 | $(CC) crt0.s $(ODIR)/*.o -o temp.t $(CFLAGS) $(LFLAGS) 19 | $(OBJCOPY) -O binary temp.t $(TARGET) 20 | rm -f temp.t 21 | 22 | $(ODIR)/%.o: $(SDIR)/%.cpp 23 | $(CC) -c -o $@ $< $(CFLAGS) 24 | 25 | $(ODIR)/%.o: $(SDIR)/%.s 26 | $(AS) -c -o $@ $< $(SFLAGS) 27 | 28 | $(ODIR): 29 | @mkdir $@ 30 | 31 | .PHONY: clean 32 | 33 | clean: 34 | rm -f $(TARGET) $(ODIR)/*.o 35 | -------------------------------------------------------------------------------- /gtaPayload/build/invoker.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/gtaPayload/build/invoker.o -------------------------------------------------------------------------------- /gtaPayload/build/lib.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/gtaPayload/build/lib.o -------------------------------------------------------------------------------- /gtaPayload/build/main.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/gtaPayload/build/main.o -------------------------------------------------------------------------------- /gtaPayload/build/menu.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/gtaPayload/build/menu.o -------------------------------------------------------------------------------- /gtaPayload/crt0.s: -------------------------------------------------------------------------------- 1 | .intel_syntax noprefix 2 | .text 3 | .global _start 4 | _start: 5 | jmp _main -------------------------------------------------------------------------------- /gtaPayload/gtaPayload.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/gtaPayload/gtaPayload.bin -------------------------------------------------------------------------------- /gtaPayload/include/invoker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "types.h" 4 | #include 5 | 6 | struct NativeArg_s { 7 | u64* returnValue; 8 | u32 argCount; 9 | u8 padding1[4]; 10 | u64* argValues; 11 | u32 vectorCount; 12 | u8 padding2[4]; 13 | Vector3* argVectors[4]; 14 | Vector4 tempVectors[4]; 15 | }; 16 | 17 | extern NativeArg_s nativeArg; 18 | 19 | extern void resetArgs(); 20 | extern void setVectors(); 21 | 22 | template 23 | inline void pushArg(T value) { 24 | *(T*)&nativeArg.argValues[nativeArg.argCount] = value; 25 | nativeArg.argCount++; 26 | } 27 | 28 | template 29 | inline R getReturn() { 30 | return *(R*)&nativeArg.returnValue[0]; 31 | } 32 | 33 | template 34 | N invoke(u64 nativeAddress, A &&... args) 35 | { 36 | resetArgs(); 37 | int dummy[] = { 0, ((void)pushArg(std::forward(args)), 0) ... }; 38 | ((void(*)(NativeArg_s*))(void*)nativeAddress)(&nativeArg); 39 | setVectors(); 40 | return getReturn(); 41 | } -------------------------------------------------------------------------------- /gtaPayload/include/lib.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "types.h" 4 | 5 | extern u64(*syscall)(int num, ...); 6 | 7 | extern void *(*malloc)(size_t size); 8 | extern void(*free)(void *ptr); 9 | extern void *(*calloc)(size_t num, size_t size); 10 | extern void *(*realloc)(void* ptr, size_t size); 11 | extern void *(*memset)(void *destination, int value, size_t num); 12 | extern void *(*memcpy)(void *destination, const void *source, size_t num); 13 | extern int(*memcmp)(const void *s1, const void *s2, size_t n); 14 | extern char *(*strcpy)(char *destination, const char *source); 15 | extern char *(*strncpy)(char *destination, const char *source, size_t num); 16 | extern char *(*strcat)(char *dest, const char *src); 17 | extern char *(*strncat)(char *dest, const char *src, size_t n); 18 | extern size_t(*strlen)(const char *s); 19 | extern int(*strcmp)(const char *s1, const char *s2); 20 | extern int(*strncmp)(const char *s1, const char *s2, size_t n); 21 | extern int(*sprintf)(char *str, const char *format, ...); 22 | extern int(*snprintf)(char *str, size_t size, const char *format, ...); 23 | extern int(*sscanf)(const char *str, const char *format, ...); 24 | extern char *(*strchr)(const char *s, int c); 25 | extern char *(*strrchr)(const char *s, int c); 26 | extern char *(*strstr)(char *str1, char *str2); 27 | extern int(*atoi)(const char * str); 28 | extern double(*atof)(const char * str); 29 | 30 | extern void initLibs(); -------------------------------------------------------------------------------- /gtaPayload/include/menu.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "types.h" 4 | #include 5 | 6 | #define MaxSubmenuLevels 20 7 | 8 | typedef void(*Function)(); 9 | typedef void(*KeyboardHandler)(char*); 10 | 11 | class Menu { 12 | private: 13 | Function mainMenu; 14 | Function currentMenu; 15 | Function lastSubmenu[MaxSubmenuLevels]; 16 | int submenuLevel; 17 | 18 | char* tipText; 19 | int currentOption; 20 | int optionCount; 21 | int lastOption[MaxSubmenuLevels]; 22 | 23 | bool optionPress, 24 | leftPress, 25 | rightPress, 26 | leftHold, 27 | rightHold, 28 | upPress, 29 | downPress, 30 | squarePress; 31 | 32 | int instructionCount; 33 | bool setupIntructionsThisFrame, 34 | xInstruction, 35 | squareInstruction, 36 | lrInstruction; 37 | 38 | bool keyboardActive; 39 | KeyboardHandler keyboardHandler; 40 | 41 | template struct scrollData { 42 | T* var; 43 | T min; 44 | T max; 45 | int decimals; 46 | }; 47 | static scrollData intScrollData; 48 | static scrollData floatScrollData; 49 | 50 | static void intScrollKeyboardHandler(char* text); 51 | static void floatScrollKeyboardHandler(char* text); 52 | 53 | void playSound(char* sound, char* ref = "HUD_PLAYER_MENU"); 54 | 55 | enum Alignment { 56 | Left, 57 | Center, 58 | Right 59 | }; 60 | void drawText(char* text, Vector2 pos, int size, Font font, char* color, char* alignment, bool outline); 61 | 62 | void positionMenuText(char* text, float xPos, Alignment alignment); 63 | 64 | bool fastScrolling; 65 | 66 | bool colorEditing; 67 | bool editingAlpha; 68 | Color *colorToEdit; 69 | Function colorChangeCallback; 70 | void colorEditor(); 71 | 72 | public: 73 | bool open, 74 | sounds, 75 | instructions; 76 | 77 | char* title; 78 | int maxOptions; 79 | 80 | Color bannerColor, 81 | bannerTextColor, 82 | optionsActiveColor, 83 | optionsInactiveColor, 84 | bodyColor, 85 | scrollerColor, 86 | indicatorColor, 87 | instructionsColor; 88 | 89 | Menu(); 90 | Menu(Menu& menu); 91 | Menu(Function main); 92 | 93 | static void drawCenterNotification(char* text, int duration = 3000); 94 | static void drawFeedNotification(char* text, char* subtitle, char* title = "Menu Base"); 95 | 96 | void monitorButtons(); 97 | void run(); 98 | 99 | void changeSubmenu(Function submenu); 100 | void openKeyboard(KeyboardHandler handler, int maxLength, char* defaultText = ""); 101 | 102 | void banner(char* text); 103 | 104 | bool hovered(); 105 | bool pressed(); 106 | bool scrolled(); 107 | 108 | Menu& option(char* text); 109 | void spacer(char* text); 110 | Menu& data(char* text); 111 | Menu& data(bool b); 112 | Menu& data(int i); 113 | Menu& data(float f, int decimalPlaces); 114 | 115 | Menu& scroller(int* i, int min, int max, bool fast, bool keyboard); 116 | Menu& scroller(float *f, float min, float max, float increment, int decimalPlaces, bool fast, bool keyboard); 117 | Menu& scroller(char** textArray, int* index, int numItems, bool fast); 118 | Menu& scroller(Font* font); 119 | 120 | Menu& toggle(bool *b); 121 | Menu& tip(char* text); 122 | Menu& submenu(Function sub); 123 | Menu& keyboard(KeyboardHandler handler, int maxLength, char* defaultText = ""); 124 | Menu& editColor(Color* color, bool editAlpha, Function callback = nullptr); 125 | template Menu& call(F func, Args&&... args) { 126 | if (pressed()) { 127 | func(std::forward(args)...); 128 | } 129 | return *this; 130 | } 131 | 132 | Hash vehicleToSpawn; 133 | Menu& vehicleSpawn(Hash vehicleHash); 134 | }; -------------------------------------------------------------------------------- /gtaPayload/include/types.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | typedef unsigned char u8; 4 | typedef unsigned short u16; 5 | typedef unsigned int u32; 6 | typedef unsigned long long u64; 7 | typedef unsigned long int size_t; 8 | 9 | typedef void* Void; 10 | typedef int Any; 11 | typedef unsigned int uint; 12 | typedef int Hash; 13 | typedef int BOOL; 14 | typedef int Entity; 15 | typedef int Player; 16 | typedef int FireId; 17 | typedef int Ped; 18 | typedef int Vehicle; 19 | typedef int Cam; 20 | typedef int CarGenerator; 21 | typedef int Group; 22 | typedef int Train; 23 | typedef int Pickup; 24 | typedef int Object; 25 | typedef int Weapon; 26 | typedef int Interior; 27 | typedef int Blip; 28 | typedef int Texture; 29 | typedef int TextureDict; 30 | typedef int CoverPoint; 31 | typedef int Camera; 32 | typedef int TaskSequence; 33 | typedef int ColourIndex; 34 | typedef int Sphere; 35 | typedef int ScrHandle; 36 | // missing types 37 | typedef Any AnimScene; 38 | typedef Any Prompt; 39 | typedef Any ItemSet; 40 | typedef Any PersChar; 41 | typedef Any PopZone; 42 | typedef Any PropSet; 43 | typedef Any Volume; 44 | 45 | typedef struct { 46 | float x, y; 47 | } Vector2; 48 | 49 | typedef struct { 50 | float x, _padX, y, _padY, z, _padZ; 51 | } Vector3; 52 | 53 | typedef struct { 54 | float x, y, z, w; 55 | } Vector4; 56 | 57 | typedef struct { 58 | int r, g, b, a; 59 | } Color; 60 | 61 | enum Font { 62 | Arial, 63 | Cabrito, 64 | DroidSerif, 65 | Hapna, 66 | Helvetica, 67 | Catalogue, 68 | Chalk, 69 | Gothica, 70 | Ledger, 71 | Lino, 72 | Turri, 73 | Redemption, 74 | Gamertag, 75 | DreamerScript, 76 | }; 77 | 78 | enum Buttons { 79 | INPUT_NEXT_CAMERA = 0x7f8d09b8, 80 | INPUT_LOOK_LR = 0xa987235f, 81 | INPUT_LOOK_UD = 0xd2047988, 82 | INPUT_LOOK_UP_ONLY = 0xc0651d40, 83 | INPUT_LOOK_DOWN_ONLY = 0x8ed92e16, 84 | INPUT_LOOK_LEFT_ONLY = 0x08f8bc6d, 85 | INPUT_LOOK_RIGHT_ONLY = 0xa1eb1353, 86 | INPUT_CINEMATIC_SLOWMO = 0x7a9093de, 87 | INPUT_RADIAL_MENU_NAV_UD = 0xba60039f, 88 | INPUT_RADIAL_MENU_NAV_LR = 0x390948dc, 89 | INPUT_RADIAL_MENU_SLOT_NAV_NEXT = 0xe71f89b8, 90 | INPUT_RADIAL_MENU_SLOT_NAV_PREV = 0x93d6723f, 91 | INPUT_SELECT_NEXT_WHEEL = 0x77e56fb3, 92 | INPUT_SELECT_ITEM_WHEEL = 0x1f6d95e5, 93 | INPUT_QUICK_SELECT_INSPECT = 0xf09866f3, 94 | INPUT_QUICK_SELECT_SET_FOR_SWAP = 0xd45ec04f, 95 | INPUT_QUICK_SHORTCUT_ABILITIES_MENU = 0x9cc7a1a4, 96 | INPUT_QUICK_SELECT_SECONDARY_NAV_NEXT = 0xf1421cf5, 97 | INPUT_QUICK_SELECT_SECONDARY_NAV_PREV = 0xd9f9f017, 98 | INPUT_QUICK_SELECT_TOGGLE_SHORTCUT_ITEM = 0xfa0b29cd, 99 | INPUT_QUICK_SELECT_PUT_AWAY_ROD = 0x253fec09, 100 | INPUT_EMOTES_FAVORITE = 0xa835261b, 101 | INPUT_EMOTES_MANAGE = 0x7e75f4dc, 102 | INPUT_EMOTES_SLOT_NAV_NEXT = 0xcbb12f87, 103 | INPUT_SELECT_NEXT_WEAPON = 0xd0842edf, 104 | INPUT_SELECT_PREV_WEAPON = 0xf78d7337, 105 | INPUT_SKIP_CUTSCENE = 0xcdc4e4e9, 106 | INPUT_CHARACTER_WHEEL = 0x972f8d1e, 107 | INPUT_MULTIPLAYER_INFO = 0xe8342ff2, 108 | INPUT_SPRINT = 0x8ffc75d6, 109 | INPUT_JUMP = 0xd9d0e1c0, 110 | INPUT_ENTER = 0xcefd9220, 111 | INPUT_ATTACK = 0x07ce1e61, 112 | INPUT_AIM = 0xf84fa74f, 113 | INPUT_LOOK_BEHIND = 0x9959a6f0, 114 | INPUT_PHONE = 0x4cf871d0, 115 | INPUT_SPECIAL_ABILITY = 0xcee12b50, 116 | INPUT_SPECIAL_ABILITY_SECONDARY = 0x6328239b, 117 | INPUT_SECONDARY_SPECIAL_ABILITY_SECONDA = 0xfdbb7295, 118 | INPUT_SPECIAL_ABILITY_ACTION = 0x1eca87d4, 119 | INPUT_MOVE_LR = 0x4d8fb4c1, 120 | INPUT_MOVE_UD = 0xfda83190, 121 | INPUT_MOVE_UP_ONLY = 0x8fd015d8, 122 | INPUT_MOVE_DOWN_ONLY = 0xd27782e3, 123 | INPUT_MOVE_LEFT_ONLY = 0x7065027d, 124 | INPUT_MOVE_RIGHT_ONLY = 0xb4e465b4, 125 | INPUT_DUCK = 0xdb096b85, 126 | INPUT_TWIRL_PISTOL = 0x938d4071, 127 | INPUT_TOGGLE_HOLSTER = 0xb238fe0b, 128 | INPUT_OPEN_WHEEL_MENU = 0xac4bd4f1, 129 | INPUT_OPEN_SATCHEL_MENU = 0x4cc0e2fe, 130 | INPUT_OPEN_SATCHEL_HORSE_MENU = 0x5966d52a, 131 | INPUT_OPEN_CRAFTING_MENU = 0x734c6e39, 132 | INPUT_OPEN_JOURNAL = 0xf3830d8e, 133 | INPUT_PICKUP = 0xe6360a8e, 134 | INPUT_IGNITE = 0xc75c27b0, 135 | INPUT_SNIPER_ZOOM = 0x7abc6a66, 136 | INPUT_SNIPER_ZOOM_IN_ONLY = 0xa5bdcd3c, 137 | INPUT_SNIPER_ZOOM_OUT_ONLY = 0x430593aa, 138 | INPUT_SNIPER_ZOOM_IN_SECONDARY = 0x6be9c207, 139 | INPUT_SNIPER_ZOOM_OUT_SECONDARY = 0x8a7b8833, 140 | INPUT_TOGGLE_WEAPON_SCOPE = 0x3076e97c, 141 | INPUT_COVER = 0xde794e3e, 142 | INPUT_COVER_TRANSITION = 0x750c8010, 143 | INPUT_RELOAD = 0xe30cd707, 144 | INPUT_TALK = 0x7dca9c75, 145 | INPUT_DETONATE = 0x73846677, 146 | INPUT_HUD_SPECIAL = 0x580c4473, 147 | INPUT_ARREST = 0xa4f1006b, 148 | INPUT_ACCURATE_AIM = 0x406adfae, 149 | INPUT_SWITCH_SHOULDER = 0x827e9ee8, 150 | INPUT_IRON_SIGHT = 0x841240a9, 151 | INPUT_AIM_IN_AIR = 0xd8f73058, 152 | INPUT_SWITCH_FIRING_MODE = 0xeed15f18, 153 | INPUT_CONTEXT = 0xb73bca77, 154 | INPUT_CONTEXT_SECONDARY = 0xf19be385, 155 | INPUT_WEAPON_SPECIAL = 0x733901f3, 156 | INPUT_WEAPON_SPECIAL_TWO = 0x50ba1a77, 157 | INPUT_DIVE = 0x06052d11, 158 | INPUT_DROP_WEAPON = 0x7dbcd016, 159 | INPUT_DROP_AMMO = 0x4e42696e, 160 | INPUT_THROW_GRENADE = 0x0af99998, 161 | INPUT_FOCUS_CAM = 0xe72b43f4, 162 | INPUT_INSPECT = 0xa61dc630, 163 | INPUT_INSPECT_ZOOM = 0x53296b75, 164 | INPUT_INSPECT_LR = 0x1788c283, 165 | INPUT_INSPECT_UD = 0xf9781997, 166 | INPUT_INSPECT_OPEN_SATCHEL = 0x9b1ca8da, 167 | INPUT_DYNAMIC_SCENARIO = 0x2eab0795, 168 | INPUT_PLAYER_MENU = 0x80f28e95, 169 | INPUT_OPEN_EMOTE_WHEEL = 0xe2b557a3, 170 | INPUT_OPEN_EMOTE_WHEEL_HORSE = 0x8b3fa65e, 171 | INPUT_EMOTE_GROUP_LINK = 0x1c826362, 172 | INPUT_EMOTE_GROUP_LINK_HORSE = 0x4fd1c57b, 173 | INPUT_REVEAL_HUD = 0xcf8a4eca, 174 | INPUT_SELECT_RADAR_MODE = 0x0f39b3d4, 175 | INPUT_SIMPLE_RADAR = 0x5fef1b6d, 176 | INPUT_EXPAND_RADAR = 0xcf0b11de, 177 | INPUT_REGULAR_RADAR = 0x51aa7a35, 178 | INPUT_DISABLE_RADAR = 0x70cbd78d, 179 | INPUT_SURRENDER = 0xdb8d69b8, 180 | INPUT_WHISTLE = 0x24978a28, 181 | INPUT_WHISTLE_HORSEBACK = 0xe7eb9185, 182 | INPUT_STOP_LEADING_ANIMAL = 0x7914a3dd, 183 | INPUT_CINEMATIC_CAM = 0x620a6c5e, 184 | INPUT_CINEMATIC_CAM_HOLD = 0xd7e7b375, 185 | INPUT_CINEMATIC_CAM_CHANGE_SHOT = 0xa6c67243, 186 | INPUT_CINEMATIC_CAM_UD = 0x84574ae8, 187 | INPUT_CINEMATIC_CAM_UP_ONLY = 0xefcfe6b7, 188 | INPUT_CINEMATIC_CAM_DOWN_ONLY = 0x23ae34a2, 189 | INPUT_CINEMATIC_CAM_LR = 0x6bc904fc, 190 | INPUT_CONTEXT_A = 0x5181713d, 191 | INPUT_CONTEXT_B = 0x3b24c470, 192 | INPUT_CONTEXT_X = 0xe3bf959b, 193 | INPUT_CONTEXT_Y = 0xd51b784f, 194 | INPUT_CONTEXT_LT = 0xc13a6564, 195 | INPUT_CONTEXT_RT = 0x07b8beaf, 196 | INPUT_CONTEXT_ACTION = 0xb28318c0, 197 | INPUT_VEH_MOVE_LR = 0xf1e2852c, 198 | INPUT_VEH_MOVE_UD = 0x8a81c00c, 199 | INPUT_VEH_MOVE_UP_ONLY = 0xdebd7ef6, 200 | INPUT_VEH_MOVE_DOWN_ONLY = 0x16d73e1d, 201 | INPUT_VEH_MOVE_LEFT_ONLY = 0x9df54706, 202 | INPUT_VEH_MOVE_RIGHT_ONLY = 0x97a8fd98, 203 | INPUT_VEH_SPECIAL = 0x493919db, 204 | INPUT_VEH_GUN_LR = 0xb6f3e4fe, 205 | INPUT_VEH_GUN_UD = 0x482560ee, 206 | INPUT_VEH_AIM = 0xd7cafcef, 207 | INPUT_VEH_ATTACK = 0xf4330038, 208 | INPUT_VEH_ATTACK2 = 0xf1c341ba, 209 | INPUT_VEH_ACCELERATE = 0x5b9fd4e2, 210 | INPUT_VEH_BRAKE = 0x6e1f639b, 211 | INPUT_VEH_DUCK = 0x5b3690f2, 212 | INPUT_VEH_HEADLIGHT = 0xf1301666, 213 | INPUT_VEH_EXIT = 0xfefab9b4, 214 | INPUT_VEH_HANDBRAKE = 0x65d24c98, 215 | INPUT_VEH_LOOK_BEHIND = 0xcae9b017, 216 | INPUT_VEH_NEXT_RADIO = 0x22e0f7e7, 217 | INPUT_VEH_PREV_RADIO = 0x9785ce13, 218 | INPUT_VEH_NEXT_RADIO_TRACK = 0xf7fa2ddc, 219 | INPUT_VEH_PREV_RADIO_TRACK = 0x0a94c4ff, 220 | INPUT_VEH_RADIO_WHEEL = 0x4915ac0a, 221 | INPUT_VEH_HORN = 0x63a0d258, 222 | INPUT_VEH_FLY_THROTTLE_UP = 0x7232bab3, 223 | INPUT_VEH_FLY_THROTTLE_DOWN = 0x084dff95, 224 | INPUT_VEH_FLY_YAW_LEFT = 0x31589ad1, 225 | INPUT_VEH_FLY_YAW_RIGHT = 0xbd143fc6, 226 | INPUT_VEH_PASSENGER_AIM = 0xee2804d0, 227 | INPUT_VEH_PASSENGER_ATTACK = 0x27ad4433, 228 | INPUT_VEH_SPECIAL_ABILITY_FRANKLIN = 0x5ec33578, 229 | INPUT_VEH_STUNT_UD = 0x4aa1560e, 230 | INPUT_VEH_SELECT_NEXT_WEAPON = 0x889a626f, 231 | INPUT_VEH_SELECT_PREV_WEAPON = 0x0c97bac7, 232 | INPUT_VEH_ROOF = 0x3e7cf9a4, 233 | INPUT_VEH_JUMP = 0xaa56b926, 234 | INPUT_VEH_GRAPPLING_HOOK = 0xb985aa5e, 235 | INPUT_VEH_SHUFFLE = 0xc7083798, 236 | INPUT_VEH_TRAVERSAL = 0x739d6261, 237 | INPUT_VEH_DROP_PROJECTILE = 0xc61611e6, 238 | INPUT_VEH_MOUSE_CONTROL_OVERRIDE = 0x39ccabd5, 239 | INPUT_VEH_FLY_ROLL_LR = 0x3c8ab570, 240 | INPUT_VEH_FLY_ROLL_LEFT_ONLY = 0x56f84ea0, 241 | INPUT_VEH_FLY_ROLL_RIGHT_ONLY = 0x876b3361, 242 | INPUT_VEH_FLY_PITCH_UD = 0xe67e1e57, 243 | INPUT_VEH_FLY_PITCH_UP_ONLY = 0x6280ba1a, 244 | INPUT_VEH_FLY_PITCH_DOWN_ONLY = 0x0f4e369f, 245 | INPUT_VEH_FLY_UNDERCARRIAGE = 0xfe0fe518, 246 | INPUT_VEH_FLY_ATTACK = 0x1d71d7aa, 247 | INPUT_VEH_FLY_SELECT_NEXT_WEAPON = 0x24e94299, 248 | INPUT_VEH_FLY_SELECT_PREV_WEAPON = 0xc0d874e5, 249 | INPUT_VEH_FLY_SELECT_TARGET_LEFT = 0x307fc4c1, 250 | INPUT_VEH_FLY_SELECT_TARGET_RIGHT = 0x52f25c96, 251 | INPUT_VEH_FLY_VERTICAL_FLIGHT_MODE = 0xe3238029, 252 | INPUT_VEH_FLY_DUCK = 0x378a10f7, 253 | INPUT_VEH_FLY_ATTACK_CAMERA = 0x2fba3f0b, 254 | INPUT_VEH_FLY_MOUSE_CONTROL_OVERRIDE = 0x6c9810a5, 255 | INPUT_VEH_SUB_MOUSE_CONTROL_OVERRIDE = 0x2caf327e, 256 | INPUT_VEH_SUB_TURN_LR = 0x627c4619, 257 | INPUT_VEH_SUB_TURN_LEFT_ONLY = 0x44e7e093, 258 | INPUT_VEH_SUB_TURN_RIGHT_ONLY = 0xe78a5a3c, 259 | INPUT_VEH_SUB_PITCH_UD = 0x469ce271, 260 | INPUT_VEH_SUB_PITCH_UP_ONLY = 0xf9ef072a, 261 | INPUT_VEH_SUB_PITCH_DOWN_ONLY = 0xba2d22aa, 262 | INPUT_VEH_SUB_THROTTLE_UP = 0xd28c446f, 263 | INPUT_VEH_SUB_THROTTLE_DOWN = 0xf5b2cefb, 264 | INPUT_VEH_SUB_ASCEND = 0xd7991f74, 265 | INPUT_VEH_SUB_DESCEND = 0x7d51de24, 266 | INPUT_VEH_SUB_TURN_HARD_LEFT = 0x64214d49, 267 | INPUT_VEH_SUB_TURN_HARD_RIGHT = 0xa44c0f83, 268 | INPUT_VEH_PUSHBIKE_PEDAL = 0xfd8d64a7, 269 | INPUT_VEH_PUSHBIKE_SPRINT = 0xf03ee151, 270 | INPUT_VEH_PUSHBIKE_FRONT_BRAKE = 0x585e942d, 271 | INPUT_VEH_PUSHBIKE_REAR_BRAKE = 0xf8cbafb5, 272 | INPUT_VEH_DRAFT_MOVE_UD = 0x23595cea, 273 | INPUT_VEH_DRAFT_TURN_LR = 0xa7dfae8a, 274 | INPUT_VEH_DRAFT_MOVE_UP_ONLY = 0x29a5e51e, 275 | INPUT_VEH_DRAFT_MOVE_DOWN_ONLY = 0x25493eb3, 276 | INPUT_VEH_DRAFT_TURN_LEFT_ONLY = 0x198afc64, 277 | INPUT_VEH_DRAFT_TURN_RIGHT_ONLY = 0x5e371ea7, 278 | INPUT_VEH_DRAFT_ACCELERATE = 0xe99d2b05, 279 | INPUT_VEH_DRAFT_BRAKE = 0xd648e48d, 280 | INPUT_VEH_DRAFT_AIM = 0xbdd5830d, 281 | INPUT_VEH_DRAFT_ATTACK = 0xf40ab198, 282 | INPUT_VEH_DRAFT_ATTACK2 = 0x886f12dd, 283 | INPUT_VEH_DRAFT_SWITCH_DRIVERS = 0x70b87844, 284 | INPUT_VEH_BOAT_TURN_LR = 0xd8dfcab3, 285 | INPUT_VEH_BOAT_TURN_LEFT_ONLY = 0x5bed7c91, 286 | INPUT_VEH_BOAT_TURN_RIGHT_ONLY = 0xf9780dfb, 287 | INPUT_VEH_BOAT_ACCELERATE = 0xb341e812, 288 | INPUT_VEH_BOAT_BRAKE = 0x428d5f39, 289 | INPUT_VEH_BOAT_AIM = 0x92f5f01e, 290 | INPUT_VEH_BOAT_ATTACK = 0x6866fa3a, 291 | INPUT_VEH_BOAT_ATTACK2 = 0x876096e9, 292 | INPUT_VEH_CAR_TURN_LR = 0x3bd38d43, 293 | INPUT_VEH_CAR_TURN_LEFT_ONLY = 0x07d1654c, 294 | INPUT_VEH_CAR_TURN_RIGHT_ONLY = 0x6e3c3649, 295 | INPUT_VEH_CAR_ACCELERATE = 0xb9f544b0, 296 | INPUT_VEH_CAR_BRAKE = 0xd1887b3f, 297 | INPUT_VEH_CAR_AIM = 0x6777b840, 298 | INPUT_VEH_CAR_ATTACK = 0x5572f386, 299 | INPUT_VEH_CAR_ATTACK2 = 0x5b763ad7, 300 | INPUT_VEH_HANDCART_ACCELERATE = 0xff3626fc, 301 | INPUT_VEH_HANDCART_BRAKE = 0x2d79d80a, 302 | INPUT_HORSE_MOVE_LR = 0x126796eb, 303 | INPUT_HORSE_MOVE_UD = 0x3bbdefef, 304 | INPUT_HORSE_MOVE_UP_ONLY = 0x699487bb, 305 | INPUT_HORSE_MOVE_DOWN_ONLY = 0x56f82045, 306 | INPUT_HORSE_MOVE_LEFT_ONLY = 0x86d773f6, 307 | INPUT_HORSE_MOVE_RIGHT_ONLY = 0x7e6b8612, 308 | INPUT_HORSE_SPECIAL = 0x70089459, 309 | INPUT_HORSE_GUN_LR = 0x3d99eec6, 310 | INPUT_HORSE_GUN_UD = 0xbff476f9, 311 | INPUT_HORSE_ATTACK = 0x60c81cde, 312 | INPUT_HORSE_ATTACK2 = 0xc904196d, 313 | INPUT_HORSE_SPRINT = 0x5aa007d7, 314 | INPUT_HORSE_STOP = 0xe16b9aad, 315 | INPUT_HORSE_EXIT = 0xcbdb82a8, 316 | INPUT_HORSE_LOOK_BEHIND = 0x81280569, 317 | INPUT_HORSE_JUMP = 0xe4d2ce1d, 318 | INPUT_HORSE_AIM = 0x61470051, 319 | INPUT_HORSE_COLLECT = 0x7d5b3717, 320 | INPUT_HITCH_ANIMAL = 0xa95e1468, 321 | INPUT_HORSE_COMMAND_FLEE = 0x4216af06, 322 | INPUT_HORSE_COMMAND_STAY = 0xae5dfded, 323 | INPUT_HORSE_COMMAND_FOLLOW = 0x763e4d27, 324 | INPUT_HORSE_MELEE = 0x1a3eabbb, 325 | INPUT_MELEE_HORSE_ATTACK_PRIMARY = 0x78ed2132, 326 | INPUT_MELEE_HORSE_ATTACK_SECONDARY = 0x162afeb8, 327 | INPUT_HORSE_COVER_TRANSITION = 0x2996dd15, 328 | INPUT_MELEE_ATTACK = 0xb2f377e8, 329 | INPUT_MELEE_MODIFIER = 0x1e7d7275, 330 | INPUT_MELEE_BLOCK = 0xb5eeefb7, 331 | INPUT_MELEE_GRAPPLE = 0x2277fae9, 332 | INPUT_MELEE_GRAPPLE_ATTACK = 0xadeaf48c, 333 | INPUT_MELEE_GRAPPLE_CHOKE = 0x018c47cf, 334 | INPUT_MELEE_GRAPPLE_REVERSAL = 0x91c9a817, 335 | INPUT_MELEE_GRAPPLE_BREAKOUT = 0xd0c1feff, 336 | INPUT_MELEE_GRAPPLE_STAND_SWITCH = 0xbe1f4699, 337 | INPUT_MELEE_GRAPPLE_MOUNT_SWITCH = 0x67ed272e, 338 | INPUT_PARACHUTE_DEPLOY = 0xebf53058, 339 | INPUT_PARACHUTE_DETACH = 0xffbff139, 340 | INPUT_PARACHUTE_TURN_LR = 0x8ec920bf, 341 | INPUT_PARACHUTE_TURN_LEFT_ONLY = 0xc4cf3322, 342 | INPUT_PARACHUTE_TURN_RIGHT_ONLY = 0x2bdba378, 343 | INPUT_PARACHUTE_PITCH_UD = 0xf0526228, 344 | INPUT_PARACHUTE_PITCH_UP_ONLY = 0x08bfea69, 345 | INPUT_PARACHUTE_PITCH_DOWN_ONLY = 0x7c3a4352, 346 | INPUT_PARACHUTE_BRAKE_LEFT = 0x272bd8ba, 347 | INPUT_PARACHUTE_BRAKE_RIGHT = 0x948b3ea7, 348 | INPUT_PARACHUTE_SMOKE = 0x2574fab0, 349 | INPUT_PARACHUTE_PRECISION_LANDING = 0xc675b8bd, 350 | INPUT_MAP = 0xe31c6a41, 351 | INPUT_SELECT_WEAPON_UNARMED = 0x1f6eeb0f, 352 | INPUT_SELECT_WEAPON_MELEE = 0x109e6852, 353 | INPUT_SELECT_WEAPON_HANDGUN = 0x184960e3, 354 | INPUT_SELECT_WEAPON_SHOTGUN = 0x76d3ea05, 355 | INPUT_SELECT_WEAPON_SMG = 0xcef1bb48, 356 | INPUT_SELECT_WEAPON_AUTO_RIFLE = 0x05eea9d0, 357 | INPUT_SELECT_WEAPON_SNIPER = 0x96c61fdf, 358 | INPUT_SELECT_WEAPON_HEAVY = 0x3d1675c3, 359 | INPUT_SELECT_WEAPON_SPECIAL = 0xc41ecef8, 360 | INPUT_SELECT_CHARACTER_MICHAEL = 0xea9256b8, 361 | INPUT_SELECT_CHARACTER_FRANKLIN = 0x8e8b08cb, 362 | INPUT_SELECT_CHARACTER_TREVOR = 0xb00cc093, 363 | INPUT_SELECT_CHARACTER_MULTIPLAYER = 0xdfb2b3b8, 364 | INPUT_SAVE_REPLAY_CLIP = 0x5b3af9e3, 365 | INPUT_SPECIAL_ABILITY_PC = 0x52e60a8b, 366 | INPUT_SELECT_QUICKSELECT_SIDEARMS_LEFT = 0xe6f612e4, 367 | INPUT_SELECT_QUICKSELECT_DUALWIELD = 0x1ce6d9eb, 368 | INPUT_SELECT_QUICKSELECT_SIDEARMS_RIGHT = 0x4f49cc4c, 369 | INPUT_SELECT_QUICKSELECT_UNARMED = 0x8f9f9e58, 370 | INPUT_SELECT_QUICKSELECT_MELEE_NO_UNARM = 0xbe22bfeb, 371 | INPUT_SELECT_QUICKSELECT_SECONDARY_LONG = 0x819d1c85, 372 | INPUT_SELECT_QUICKSELECT_THROWN = 0xb03a913b, 373 | INPUT_SELECT_QUICKSELECT_PRIMARY_LONGAR = 0x417914ef, 374 | INPUT_CELLPHONE_UP = 0xd2ee3b1e, 375 | INPUT_CELLPHONE_DOWN = 0x82196002, 376 | INPUT_CELLPHONE_LEFT = 0x3abbe990, 377 | INPUT_CELLPHONE_RIGHT = 0xd25efdcd, 378 | INPUT_CELLPHONE_SELECT = 0xdc264018, 379 | INPUT_CELLPHONE_CANCEL = 0xdd833287, 380 | INPUT_CELLPHONE_OPTION = 0xd2c28bb4, 381 | INPUT_CELLPHONE_EXTRA_OPTION = 0xbe354011, 382 | INPUT_CELLPHONE_SCROLL_FORWARD = 0xcb4e1798, 383 | INPUT_CELLPHONE_SCROLL_BACKWARD = 0x47cd0f3b, 384 | INPUT_CELLPHONE_CAMERA_FOCUS_LOCK = 0x5ac1805e, 385 | INPUT_CELLPHONE_CAMERA_GRID = 0xe18cc57a, 386 | INPUT_CELLPHONE_CAMERA_SELFIE = 0x6a440bfe, 387 | INPUT_CELLPHONE_CAMERA_DOF = 0x593db489, 388 | INPUT_CELLPHONE_CAMERA_EXPRESSION = 0xd7e274e7, 389 | INPUT_FRONTEND_DOWN = 0x05ca7c52, 390 | INPUT_FRONTEND_UP = 0x6319db71, 391 | INPUT_FRONTEND_LEFT = 0xa65ebab4, 392 | INPUT_FRONTEND_RIGHT = 0xdeb34313, 393 | INPUT_FRONTEND_RDOWN = 0x5734a944, 394 | INPUT_FRONTEND_RUP = 0xd7de6b1e, 395 | INPUT_FRONTEND_RLEFT = 0x39336a4f, 396 | INPUT_FRONTEND_RRIGHT = 0x5b48f938, 397 | INPUT_FRONTEND_AXIS_X = 0xfb56dd5b, 398 | INPUT_FRONTEND_AXIS_Y = 0x091178d0, 399 | INPUT_FRONTEND_SCROLL_AXIS_X = 0x3224bc55, 400 | INPUT_FRONTEND_SCROLL_AXIS_Y = 0x21651ad6, 401 | INPUT_FRONTEND_RIGHT_AXIS_X = 0x3d23549a, 402 | INPUT_FRONTEND_RIGHT_AXIS_Y = 0xeb4130df, 403 | INPUT_FRONTEND_PAUSE = 0xd82e0bd2, 404 | INPUT_FRONTEND_PAUSE_ALTERNATE = 0x4a903c11, 405 | INPUT_FRONTEND_ACCEPT = 0xc7b5340a, 406 | INPUT_FRONTEND_CANCEL = 0x156f7119, 407 | INPUT_FRONTEND_X = 0x6db8c62f, 408 | INPUT_FRONTEND_Y = 0x7c0162c0, 409 | INPUT_FRONTEND_LB = 0xe885ef16, 410 | INPUT_FRONTEND_RB = 0x17bec168, 411 | INPUT_FRONTEND_LT = 0x51104035, 412 | INPUT_FRONTEND_RT = 0x6fed71bc, 413 | INPUT_FRONTEND_LS = 0x43cda5b0, 414 | INPUT_FRONTEND_RS = 0x7da48d2a, 415 | INPUT_FRONTEND_LEADERBOARD = 0x9edc8d65, 416 | INPUT_FRONTEND_SOCIAL_CLUB = 0x064d1698, 417 | INPUT_FRONTEND_SOCIAL_CLUB_SECONDARY = 0xbdb8d6f3, 418 | INPUT_FRONTEND_DELETE = 0x4af4d473, 419 | INPUT_FRONTEND_ENDSCREEN_ACCEPT = 0x3e32fcee, 420 | INPUT_FRONTEND_ENDSCREEN_EXPAND = 0xc79bde9f, 421 | INPUT_FRONTEND_SELECT = 0x171910dc, 422 | INPUT_FRONTEND_PHOTO_MODE = 0x44cd301b, 423 | INPUT_FRONTEND_NAV_UP = 0x8cffe0a1, 424 | INPUT_FRONTEND_NAV_DOWN = 0x78114ab3, 425 | INPUT_FRONTEND_NAV_LEFT = 0x877f1027, 426 | INPUT_FRONTEND_NAV_RIGHT = 0x08bd758c, 427 | INPUT_FRONTEND_MAP_NAV_UP = 0x125a70e5, 428 | INPUT_FRONTEND_MAP_NAV_DOWN = 0xf8480eed, 429 | INPUT_FRONTEND_MAP_NAV_LEFT = 0xe0d75b00, 430 | INPUT_FRONTEND_MAP_NAV_RIGHT = 0x28725e5d, 431 | INPUT_FRONTEND_MAP_ZOOM = 0x6b359a27, 432 | INPUT_GAME_MENU_ACCEPT = 0x43dbf61f, 433 | INPUT_GAME_MENU_CANCEL = 0x308588e6, 434 | INPUT_GAME_MENU_OPTION = 0xfbd7b3e6, 435 | INPUT_GAME_MENU_EXTRA_OPTION = 0xd596cfb0, 436 | INPUT_GAME_MENU_UP = 0x911cb09e, 437 | INPUT_GAME_MENU_DOWN = 0x4403f97f, 438 | INPUT_GAME_MENU_LEFT = 0xad7fcc5b, 439 | INPUT_GAME_MENU_RIGHT = 0x65f9ec5b, 440 | INPUT_GAME_MENU_TAB_LEFT = 0xcbd5b26e, 441 | INPUT_GAME_MENU_TAB_RIGHT = 0x110ad1d2, 442 | INPUT_GAME_MENU_TAB_LEFT_SECONDARY = 0x26e9dc00, 443 | INPUT_GAME_MENU_TAB_RIGHT_SECONDARY = 0x8cc9cd42, 444 | INPUT_GAME_MENU_SCROLL_FORWARD = 0x81457a1a, 445 | INPUT_GAME_MENU_SCROLL_BACKWARD = 0x9da42644, 446 | INPUT_GAME_MENU_STICK_UP = 0x9ca97399, 447 | INPUT_GAME_MENU_STICK_DOWN = 0x63898d36, 448 | INPUT_GAME_MENU_STICK_LEFT = 0x06c089d4, 449 | INPUT_GAME_MENU_STICK_RIGHT = 0x5bdbe841, 450 | INPUT_GAME_MENU_RIGHT_STICK_UP = 0xf0232a03, 451 | INPUT_GAME_MENU_RIGHT_STICK_DOWN = 0xadb78673, 452 | INPUT_GAME_MENU_RIGHT_STICK_LEFT = 0x71e38966, 453 | INPUT_GAME_MENU_RIGHT_STICK_RIGHT = 0xe1cece4b, 454 | INPUT_GAME_MENU_LS = 0xa8f6de66, 455 | INPUT_GAME_MENU_RS = 0x89ea3fa5, 456 | INPUT_GAME_MENU_RIGHT_AXIS_X = 0x4685aa33, 457 | INPUT_GAME_MENU_RIGHT_AXIS_Y = 0x60c65eb4, 458 | INPUT_GAME_MENU_LEFT_AXIS_X = 0xf431d57a, 459 | INPUT_GAME_MENU_LEFT_AXIS_Y = 0x226eb1ef, 460 | INPUT_QUIT = 0x8e90c7bb, 461 | INPUT_DOCUMENT_PAGE_NEXT = 0xc97792b7, 462 | INPUT_DOCUMENT_PAGE_PREV = 0x20190ab4, 463 | INPUT_DOCUMENT_SCROLL = 0xac70f311, 464 | INPUT_DOCUMENT_SCROLL_UP_ONLY = 0x3d0c19ec, 465 | INPUT_DOCUMENT_SCROLL_DOWN_ONLY = 0xd72f3e29, 466 | INPUT_ATTACK2 = 0x0283c582, 467 | INPUT_PREV_WEAPON = 0xcc1075a7, 468 | INPUT_NEXT_WEAPON = 0xfd0f0c2c, 469 | INPUT_SNIPER_ZOOM_IN = 0xe4568aa1, 470 | INPUT_SNIPER_ZOOM_OUT = 0xe40ce39e, 471 | INPUT_SNIPER_ZOOM_IN_ALTERNATE = 0x3a9897c1, 472 | INPUT_SNIPER_ZOOM_OUT_ALTERNATE = 0xbc820489, 473 | INPUT_REPLAY_START_STOP_RECORDING = 0xdca6978e, 474 | INPUT_REPLAY_START_STOP_RECORDING_SECON = 0xb510bfe5, 475 | INPUT_REPLAY_MARKER_DELETE = 0xc7d2c51b, 476 | INPUT_REPLAY_CLIP_DELETE = 0xf6734e42, 477 | INPUT_REPLAY_PAUSE = 0x083137b2, 478 | INPUT_REPLAY_REWIND = 0xc1339a31, 479 | INPUT_REPLAY_FFWD = 0x609a27e8, 480 | INPUT_REPLAY_NEWMARKER = 0xf7c6da28, 481 | INPUT_REPLAY_RECORD = 0xad9a9c7c, 482 | INPUT_REPLAY_SCREENSHOT = 0x567faf34, 483 | INPUT_REPLAY_HIDEHUD = 0x7e479c7b, 484 | INPUT_REPLAY_STARTPOINT = 0x5dafaccf, 485 | INPUT_REPLAY_ENDPOINT = 0x4ef75bbd, 486 | INPUT_REPLAY_ADVANCE = 0x323aa450, 487 | INPUT_REPLAY_BACK = 0x088c7cd4, 488 | INPUT_REPLAY_TOOLS = 0x561a3387, 489 | INPUT_REPLAY_RESTART = 0x81b8bc9d, 490 | INPUT_REPLAY_SHOWHOTKEY = 0xeba2a41e, 491 | INPUT_REPLAY_CYCLEMARKERLEFT = 0x5c220959, 492 | INPUT_REPLAY_CYCLEMARKERRIGHT = 0xc69ae799, 493 | INPUT_REPLAY_FOVINCREASE = 0x5925a10d, 494 | INPUT_REPLAY_FOVDECREASE = 0x2b88d701, 495 | INPUT_REPLAY_CAMERAUP = 0x749eff0c, 496 | INPUT_REPLAY_CAMERADOWN = 0xa1fe9e2a, 497 | INPUT_REPLAY_SAVE = 0xebc60685, 498 | INPUT_REPLAY_TOGGLETIME = 0xe3fb91b3, 499 | INPUT_REPLAY_TOGGLETIPS = 0xc8a1de20, 500 | INPUT_REPLAY_PREVIEW = 0x58ac1355, 501 | INPUT_REPLAY_TOGGLE_TIMELINE = 0xf8629909, 502 | INPUT_REPLAY_TIMELINE_PICKUP_CLIP = 0xd2454f90, 503 | INPUT_REPLAY_TIMELINE_DUPLICATE_CLIP = 0x4146a033, 504 | INPUT_REPLAY_TIMELINE_PLACE_CLIP = 0x60726f50, 505 | INPUT_REPLAY_CTRL = 0xd88b47e7, 506 | INPUT_REPLAY_TIMELINE_SAVE = 0x65d70e9d, 507 | INPUT_REPLAY_PREVIEW_AUDIO = 0x79022218, 508 | INPUT_REPLAY_ACTION_REPLAY_START = 0xd9961107, 509 | INPUT_REPLAY_ACTION_REPLAY_CANCEL = 0x93776cae, 510 | INPUT_REPLAY_RECORDING_START = 0xfd28d0f4, 511 | INPUT_REPLAY_RECORDING_STOP = 0xdb16e702, 512 | INPUT_REPLAY_SAVE_SNAPSHOT = 0xefec8fde, 513 | INPUT_VEH_DRIVE_LOOK = 0xa2117c9a, 514 | INPUT_VEH_DRIVE_LOOK2 = 0x55ac04e5, 515 | INPUT_VEH_FLY_ATTACK2 = 0x4d83147c, 516 | INPUT_RADIO_WHEEL_UD = 0x14c7291d, 517 | INPUT_RADIO_WHEEL_LR = 0xf9fa6bc8, 518 | INPUT_VEH_SLOWMO_UD = 0xf1f9cd26, 519 | INPUT_VEH_SLOWMO_UP_ONLY = 0x2b981f4f, 520 | INPUT_VEH_SLOWMO_DOWN_ONLY = 0x642de054, 521 | INPUT_MAP_POI = 0x9bee9213, 522 | INPUT_INTERACT_LOCKON = 0xf8982f00, 523 | INPUT_INTERACT_LOCKON_NEG = 0x26a18f47, 524 | INPUT_INTERACT_LOCKON_POS = 0xf63a17f9, 525 | INPUT_INTERACT_LOCKON_ROB = 0x9fa5ad07, 526 | INPUT_INTERACT_LOCKON_Y = 0x09a92b8b, 527 | INPUT_INTERACT_LOCKON_A = 0xd10a3a36, 528 | INPUT_INTERACT_NEG = 0x424bd2d2, 529 | INPUT_INTERACT_POS = 0xf6bb7378, 530 | INPUT_INTERACT_OPTION1 = 0x760a9c6f, 531 | INPUT_INTERACT_OPTION2 = 0x84543902, 532 | INPUT_INTERACT_ANIMAL = 0xa1abb953, 533 | INPUT_INTERACT_LOCKON_ANIMAL = 0x5415be48, 534 | INPUT_INTERACT_LEAD_ANIMAL = 0x17d3bff5, 535 | INPUT_INTERACT_LOCKON_DETACH_HORSE = 0xf5c4701b, 536 | INPUT_INTERACT_HORSE_CARE = 0xb0bce5d6, 537 | INPUT_INTERACT_LOCKON_CALL_ANIMAL = 0x71f89bbc, 538 | INPUT_INTERACT_LOCKON_TRACK_ANIMAL = 0xe2473bf0, 539 | INPUT_INTERACT_LOCKON_TARGET_INFO = 0x31219490, 540 | INPUT_INTERACT_LOCKON_STUDY_BINOCULARS = 0xb3f388bc, 541 | INPUT_INTERACT_WILD_ANIMAL = 0x89f3d2e0, 542 | INPUT_INTERACT_HORSE_FEED = 0x0d55a0f0, 543 | INPUT_INTERACT_HORSE_BRUSH = 0x63a38f2c, 544 | INPUT_EMOTE_ACTION = 0x13c42bb2, 545 | INPUT_EMOTE_TAUNT = 0x470dc190, 546 | INPUT_EMOTE_GREET = 0x72bad5aa, 547 | INPUT_EMOTE_COMM = 0x661857b3, 548 | INPUT_EMOTE_DANCE = 0xf311100c, 549 | INPUT_EMOTE_TWIRL_GUN_HOLD = 0x04fb8191, 550 | INPUT_EMOTE_TWIRL_GUN_VAR_A = 0x6990bddf, 551 | INPUT_EMOTE_TWIRL_GUN_VAR_B = 0x52d29063, 552 | INPUT_EMOTE_TWIRL_GUN_VAR_C = 0xbc2ae312, 553 | INPUT_EMOTE_TWIRL_GUN_VAR_D = 0xae69478f, 554 | INPUT_QUICK_EQUIP_ITEM = 0x6070d032, 555 | INPUT_MINIGAME_BUILDING_CAMERA_NEXT = 0x16b0eef8, 556 | INPUT_MINIGAME_BUILDING_CAMERA_PREV = 0x5f97b231, 557 | INPUT_MINIGAME_BUILDING_HAMMER = 0xfa91aecd, 558 | INPUT_CURSOR_ACCEPT_DOUBLE_CLICK = 0x1c559f2e, 559 | INPUT_CURSOR_ACCEPT_HOLD = 0xe474f150, 560 | INPUT_CURSOR_ACCEPT = 0x9d2aea88, 561 | INPUT_CURSOR_CANCEL = 0x27568539, 562 | INPUT_CURSOR_CANCEL_DOUBLE_CLICK = 0x9cb4ecce, 563 | INPUT_CURSOR_CANCEL_HOLD = 0xd7f70f36, 564 | INPUT_CURSOR_X = 0xd6c4ecdc, 565 | INPUT_CURSOR_Y = 0xe4130778, 566 | INPUT_CURSOR_SCROLL_UP = 0x62800c92, 567 | INPUT_CURSOR_SCROLL_DOWN = 0x8bde7443, 568 | INPUT_CURSOR_SCROLL_CLICK = 0x6aa8a71b, 569 | INPUT_CURSOR_SCROLL_DOUBLE_CLICK = 0xe1b6ed6d, 570 | INPUT_CURSOR_SCROLL_HOLD = 0x5484dbdd, 571 | INPUT_CURSOR_FORWARD_CLICK = 0x11dbbab9, 572 | INPUT_CURSOR_FORWARD_DOUBLE_CLICK = 0x9805d715, 573 | INPUT_CURSOR_FORWARD_HOLD = 0x7630c9a1, 574 | INPUT_CURSOR_BACKWARD_CLICK = 0x9af38793, 575 | INPUT_CURSOR_BACKWARD_DOUBLE_CLICK = 0xa14ba1fc, 576 | INPUT_CURSOR_BACKWARD_HOLD = 0x01aa9fa1, 577 | INPUT_ENTER_CHEAT_CODE = 0x7bf65ac8, 578 | INPUT_INTERACTION_MENU = 0xcc510e59, 579 | INPUT_MP_TEXT_CHAT_ALL = 0x9720fcee, 580 | INPUT_MP_TEXT_CHAT_TEAM = 0x9098ad9d, 581 | INPUT_MP_TEXT_CHAT_FRIENDS = 0x7098ac73, 582 | INPUT_MP_TEXT_CHAT_CREW = 0x8142fa92, 583 | INPUT_PUSH_TO_TALK = 0x4bc9dabb, 584 | INPUT_CREATOR_LS = 0x339f3730, 585 | INPUT_CREATOR_RS = 0xd8cf0c95, 586 | INPUT_CREATOR_LT = 0x446258b6, 587 | INPUT_CREATOR_RT = 0x3c3dd371, 588 | INPUT_CREATOR_MENU_TOGGLE = 0x85d24405, 589 | INPUT_CREATOR_ACCEPT = 0x2cd5343e, 590 | INPUT_CREATOR_MENU_UP = 0xbcd1444b, 591 | INPUT_CREATOR_MENU_DOWN = 0x97410755, 592 | INPUT_CREATOR_MENU_LEFT = 0xec6a30aa, 593 | INPUT_CREATOR_MENU_RIGHT = 0x19d8334c, 594 | INPUT_CREATOR_MENU_ACCEPT = 0xfb9c3231, 595 | INPUT_CREATOR_MENU_CANCEL = 0xbb3fc460, 596 | INPUT_CREATOR_MENU_FUNCTION = 0x5a03b3f3, 597 | INPUT_CREATOR_MENU_EXTRA_FUNCTION = 0xe6b8f103, 598 | INPUT_CREATOR_MENU_SELECT = 0x0984e40a, 599 | INPUT_CREATOR_PLACE = 0xd74cacad, 600 | INPUT_CREATOR_DELETE = 0x3f4dc0ef, 601 | INPUT_CREATOR_DROP = 0x414034d5, 602 | INPUT_CREATOR_FUNCTION = 0xb05fda25, 603 | INPUT_CREATOR_ROTATE_RIGHT = 0x9d75674e, 604 | INPUT_CREATOR_ROTATE_LEFT = 0xd41e9c2a, 605 | INPUT_CREATOR_GRAB = 0x338a0d45, 606 | INPUT_CREATOR_SWITCH_CAM = 0x16ccfec6, 607 | INPUT_CREATOR_ZOOM_IN = 0x335d8d76, 608 | INPUT_CREATOR_ZOOM_OUT = 0x24a42f93, 609 | INPUT_CREATOR_RAISE = 0x0d0fb9b1, 610 | INPUT_CREATOR_LOWER = 0x1bde2eb3, 611 | INPUT_CREATOR_SEARCH = 0xf55864cd, 612 | INPUT_CREATOR_MOVE_UD = 0x82428676, 613 | INPUT_CREATOR_MOVE_LR = 0x59753edc, 614 | INPUT_CREATOR_LOOK_UD = 0x55ea24f3, 615 | INPUT_CREATOR_LOOK_LR = 0xaeb2a9c7, 616 | INPUT_CUT_FREE = 0xd2cc4644, 617 | INPUT_DROP = 0xd2928083, 618 | INPUT_PICKUP_CARRIABLE = 0xeb2ac491, 619 | INPUT_PICKUP_CARRIABLE2 = 0xbe8593af, 620 | INPUT_PLACE_CARRIABLE_ONTO_PARENT = 0x7d326951, 621 | INPUT_PICKUP_CARRIABLE_FROM_PARENT = 0xa1202c7b, 622 | INPUT_MERCY_KILL = 0x956c2a0e, 623 | INPUT_REVIVE = 0x43f2959c, 624 | INPUT_HOGTIE = 0xd9c50532, 625 | INPUT_CARRIABLE_SUICIDE = 0x6e9734e8, 626 | INPUT_CARRIABLE_BREAK_FREE = 0x295175bf, 627 | INPUT_INTERACT_HIT_CARRIABLE = 0x0522b243, 628 | INPUT_LOOT = 0x41ac83d1, 629 | INPUT_LOOT2 = 0x399c6619, 630 | INPUT_LOOT3 = 0x27d1c284, 631 | INPUT_LOOT_VEHICLE = 0x14db6c5e, 632 | INPUT_LOOT_AMMO = 0xc23d7b9e, 633 | INPUT_BREAK_VEHICLE_LOCK = 0x97c71b28, 634 | INPUT_LOOT_ALIVE_COMPONENT = 0xff8109d8, 635 | INPUT_FEED_INTERACT = 0xa8e3f467, 636 | INPUT_SADDLE_TRANSFER = 0x73a8fd83, 637 | INPUT_SHOP_BUY = 0xdff812f9, 638 | INPUT_SHOP_SELL = 0x6d1319be, 639 | INPUT_SHOP_SPECIAL = 0xea150e72, 640 | INPUT_SHOP_BOUNTY = 0xd3ecf82f, 641 | INPUT_SHOP_INSPECT = 0x5e723d8c, 642 | INPUT_SHOP_CHANGE_CURRENCY = 0x90fa19ab, 643 | INPUT_QUICK_USE_ITEM = 0xc1989f95, 644 | INPUT_PROMPT_PAGE_NEXT = 0x8cf90a9d, 645 | INPUT_FRONTEND_TOUCH_ZOOM_FACTOR = 0xe7f89c38, 646 | INPUT_FRONTEND_TOUCH_ZOOM_X = 0x16661ad0, 647 | INPUT_FRONTEND_TOUCH_ZOOM_Y = 0x253db87f, 648 | INPUT_FRONTEND_TOUCH_DRAG_X = 0xec93548e, 649 | INPUT_FRONTEND_TOUCH_DRAG_Y = 0x9ac130eb, 650 | INPUT_FRONTEND_TOUCH_TAP_X = 0xc10e180a, 651 | INPUT_FRONTEND_TOUCH_TAP_Y = 0xcf4b3484, 652 | INPUT_FRONTEND_TOUCH_DOUBLE_TAP_X = 0x1661fab0, 653 | INPUT_FRONTEND_TOUCH_DOUBLE_TAP_Y = 0x96e87bbf, 654 | INPUT_FRONTEND_TOUCH_HOLD_X = 0x0ff17f1d, 655 | INPUT_FRONTEND_TOUCH_HOLD_Y = 0x398ed257, 656 | INPUT_FRONTEND_TOUCH_SWIPE_UP_X = 0x0b71d439, 657 | INPUT_FRONTEND_TOUCH_SWIPE_UP_Y = 0x19ca70ea, 658 | INPUT_FRONTEND_TOUCH_SWIPE_DOWN_X = 0xe3b30955, 659 | INPUT_FRONTEND_TOUCH_SWIPE_DOWN_Y = 0xbdff3dea, 660 | INPUT_FRONTEND_TOUCH_SWIPE_LEFT_X = 0x2545b0de, 661 | INPUT_FRONTEND_TOUCH_SWIPE_LEFT_Y = 0xd43d0ece, 662 | INPUT_FRONTEND_TOUCH_SWIPE_RIGHT_X = 0xeab68397, 663 | INPUT_FRONTEND_TOUCH_SWIPE_RIGHT_Y = 0x675b7ce3, 664 | INPUT_MULTIPLAYER_INFO_PLAYERS = 0x9c68ce34, 665 | INPUT_MULTIPLAYER_DEAD_SWITCH_RESPAWN = 0xb4f298ba, 666 | INPUT_MULTIPLAYER_DEAD_INFORM_LAW = 0x6816a38e, 667 | INPUT_MULTIPLAYER_DEAD_RESPAWN = 0x18987353, 668 | INPUT_MULTIPLAYER_DEAD_DUEL = 0xf875fc78, 669 | INPUT_MULTIPLAYER_DEAD_PARLEY = 0x4d11fe01, 670 | INPUT_MULTIPLAYER_DEAD_FEUD = 0xb4a11066, 671 | INPUT_MULTIPLAYER_DEAD_LEADER_FEUD = 0xcc18f960, 672 | INPUT_MULTIPLAYER_DEAD_PRESS_CHARGES = 0xe50dca13, 673 | INPUT_MULTIPLAYER_RACE_RESPAWN = 0x014ca044, 674 | INPUT_MULTIPLAYER_PREDATOR_ABILITY = 0xc5cf41b2, 675 | INPUT_MULTIPLAYER_SPECTATE_PLAYER_NEXT = 0xba065692, 676 | INPUT_MULTIPLAYER_SPECTATE_PLAYER_PREV = 0x5092bf47, 677 | INPUT_MULTIPLAYER_SPECTATE_HIDE_HUD = 0x7dba5d49, 678 | INPUT_MULTIPLAYER_SPECTATE_PLAYER_OPTIO = 0x5cff7675, 679 | INPUT_MULTIPLAYER_LEADERBOARD_SCROLL_UD = 0xa917d24b, 680 | INPUT_MINIGAME_QUIT = 0xe9094ba0, 681 | INPUT_MINIGAME_INCREASE_BET = 0xc7cb8d5f, 682 | INPUT_MINIGAME_DECREASE_BET = 0xd3ebf425, 683 | INPUT_MINIGAME_CHANGE_BET_AXIS_Y = 0xbdc733ee, 684 | INPUT_MINIGAME_PLACE_BET = 0x410b0b2e, 685 | INPUT_MINIGAME_CLEAR_BET = 0x4a21c66b, 686 | INPUT_MINIGAME_HELP = 0x9384e0a8, 687 | INPUT_MINIGAME_HELP_PREV = 0xc5f53156, 688 | INPUT_MINIGAME_HELP_NEXT = 0x83608ac0, 689 | INPUT_MINIGAME_REPLAY = 0x985243b7, 690 | INPUT_MINIGAME_NEW_GAME = 0x5d1788ff, 691 | INPUT_MINIGAME_POKER_SKIP = 0x646a7792, 692 | INPUT_MINIGAME_POKER_CALL = 0xdab9ee72, 693 | INPUT_MINIGAME_POKER_FOLD = 0x49b4ad1e, 694 | INPUT_MINIGAME_POKER_CHECK = 0x206b2087, 695 | INPUT_MINIGAME_POKER_CHECK_FOLD = 0x72a9d1f7, 696 | INPUT_MINIGAME_POKER_BET = 0xa9883369, 697 | INPUT_MINIGAME_POKER_HOLE_CARDS = 0xc2b1193a, 698 | INPUT_MINIGAME_POKER_BOARD_CARDS = 0x03753498, 699 | INPUT_MINIGAME_POKER_SKIP_TUTORIAL = 0xb568bcd0, 700 | INPUT_MINIGAME_POKER_SHOW_POSSIBLE_HAND = 0x32fd7547, 701 | INPUT_MINIGAME_POKER_YOUR_CARDS = 0xf923b337, 702 | INPUT_MINIGAME_POKER_COMMUNITY_CARDS = 0xe402b898, 703 | INPUT_MINIGAME_POKER_CHEAT_LR = 0x2330f517, 704 | INPUT_MINIGAME_FISHING_RESET_CAST = 0xb40a9bdb, 705 | INPUT_MINIGAME_FISHING_RELEASE_FISH = 0xf14fd435, 706 | INPUT_MINIGAME_FISHING_KEEP_FISH = 0x52c5c34a, 707 | INPUT_MINIGAME_FISHING_HOOK = 0xa1cd103a, 708 | INPUT_MINIGAME_FISHING_LEFT_AXIS_X = 0x69b10623, 709 | INPUT_MINIGAME_FISHING_LEFT_AXIS_Y = 0x09bf4645, 710 | INPUT_MINIGAME_FISHING_RIGHT_AXIS_X = 0x4fd4e558, 711 | INPUT_MINIGAME_FISHING_RIGHT_AXIS_Y = 0x95f2f193, 712 | INPUT_MINIGAME_FISHING_LEAN_LEFT = 0x0d4c3aba, 713 | INPUT_MINIGAME_FISHING_LEAN_RIGHT = 0x05074a9b, 714 | INPUT_MINIGAME_FISHING_QUICK_EQUIP = 0x25f525cd, 715 | INPUT_MINIGAME_FISHING_REEL_SPEED_UP = 0x2fa915f5, 716 | INPUT_MINIGAME_FISHING_REEL_SPEED_DOWN = 0xd7af56a0, 717 | INPUT_MINIGAME_FISHING_REEL_SPEED_AXIS = 0x49c73cb2, 718 | INPUT_MINIGAME_FISHING_MANUAL_REEL_IN = 0xa303f462, 719 | INPUT_MINIGAME_FISHING_MANUAL_REEL_OUT_ = 0x3f9fc774, 720 | INPUT_MINIGAME_CRACKPOT_BOAT_SHOW_CONTR = 0x32c98e8d, 721 | INPUT_MINIGAME_DOMINOES_VIEW_DOMINOES = 0x88f8b6b1, 722 | INPUT_MINIGAME_DOMINOES_VIEW_MOVES = 0x7733cf2c, 723 | INPUT_MINIGAME_DOMINOES_PLAY_TILE = 0x95f5bb7c, 724 | INPUT_MINIGAME_DOMINOES_SKIP_DEAL = 0xc5e622d7, 725 | INPUT_MINIGAME_DOMINOES_MOVE_LEFT_ONLY = 0xfddd89d4, 726 | INPUT_MINIGAME_DOMINOES_MOVE_RIGHT_ONLY = 0x7d5187c9, 727 | INPUT_MINIGAME_DOMINOES_MOVE_UP_ONLY = 0xc6ab8cb3, 728 | INPUT_MINIGAME_DOMINOES_MOVE_DOWN_ONLY = 0xfd9fc86d, 729 | INPUT_MINIGAME_BLACKJACK_HAND_VIEW = 0x03f1e7cb, 730 | INPUT_MINIGAME_BLACKJACK_TABLE_VIEW = 0xade09435, 731 | INPUT_MINIGAME_BLACKJACK_BET_AXIS_Y = 0x3d2ea092, 732 | INPUT_MINIGAME_BLACKJACK_BET = 0x661d8a31, 733 | INPUT_MINIGAME_BLACKJACK_DECLINE = 0xcd7ddf9b, 734 | INPUT_MINIGAME_BLACKJACK_STAND = 0x31260507, 735 | INPUT_MINIGAME_BLACKJACK_HIT = 0xa8142713, 736 | INPUT_MINIGAME_BLACKJACK_DOUBLE = 0x74486ca4, 737 | INPUT_MINIGAME_BLACKJACK_SPLIT = 0x432b111f, 738 | INPUT_MINIGAME_FFF_A = 0x0e717dc6, 739 | INPUT_MINIGAME_FFF_B = 0x1bc81873, 740 | INPUT_MINIGAME_FFF_X = 0x65f0acdf, 741 | INPUT_MINIGAME_FFF_Y = 0x73ad4858, 742 | INPUT_MINIGAME_FFF_ZOOM = 0x61e4cacc, 743 | INPUT_MINIGAME_FFF_SKIP_TURN = 0x3073681b, 744 | INPUT_MINIGAME_FFF_CYCLE_SEQUENCE_LEFT = 0x29a3550e, 745 | INPUT_MINIGAME_FFF_CYCLE_SEQUENCE_RIGHT = 0x7b5b896d, 746 | INPUT_MINIGAME_FFF_FLOURISH_CONTINUE = 0x6fc9de68, 747 | INPUT_MINIGAME_FFF_FLOURISH_END = 0xf7750b25, 748 | INPUT_MINIGAME_FFF_PRACTICE = 0xca379f82, 749 | INPUT_MINIGAME_MILKING_LEFT_ACTION = 0xff4b2ada, 750 | INPUT_MINIGAME_MILKING_RIGHT_ACTION = 0x30be7cf2, 751 | INPUT_MINIGAME_LEFT_TRIGGER = 0x7ec33553, 752 | INPUT_MINIGAME_RIGHT_TRIGGER = 0xbe78b715, 753 | INPUT_MINIGAME_ACTION_LEFT = 0x0a1efc09, 754 | INPUT_MINIGAME_ACTION_RIGHT = 0x16d70379, 755 | INPUT_MINIGAME_ACTION_UP = 0xf5a13a0d, 756 | INPUT_MINIGAME_ACTION_DOWN = 0xf601bcfc, 757 | INPUT_STICKY_FEED_ACCEPT = 0xf4dd4c67, 758 | INPUT_STICKY_FEED_CANCEL = 0x0cfb963f, 759 | INPUT_STICKY_FEED_X = 0xbd1d94a1, 760 | INPUT_STICKY_FEED_Y = 0xc85bab1d, 761 | INPUT_CAMERA_PUT_AWAY = 0x5fc770ea, 762 | INPUT_CAMERA_BACK = 0xa4bd74a5, 763 | INPUT_CAMERA_TAKE_PHOTO = 0x44fa14c2, 764 | INPUT_CAMERA_CONTEXT_GALLERY = 0xe8337356, 765 | INPUT_CAMERA_HANDHELD_USE = 0x776f65e9, 766 | INPUT_CAMERA_DOF = 0x3003f9dc, 767 | INPUT_CAMERA_SELFIE = 0xac5922ea, 768 | INPUT_CAMERA_ZOOM = 0x47ec4c22, 769 | INPUT_CAMERA_POSE_NEXT = 0xf810fb35, 770 | INPUT_CAMERA_POSE_PREV = 0x8d5be9d1, 771 | INPUT_CAMERA_EXPRESSION_NEXT = 0xcfa703d3, 772 | INPUT_CAMERA_EXPRESSION_PREV = 0x07b6435d, 773 | INPUT_TITHING_INCREASE_AMOUNT = 0x24f37ab5, 774 | INPUT_TITHING_DECREASE_AMOUNT = 0xceff5c13, 775 | INPUT_BREAK_DOOR_LOCK = 0x77110b0a, 776 | INPUT_INTERROGATE_QUESTION = 0xa1aa2d8d, 777 | INPUT_INTERROGATE_BEAT = 0x6e1e0d62, 778 | INPUT_INTERROGATE_KILL = 0x81b2e311, 779 | INPUT_INTERROGATE_RELEASE = 0x3c22ef0e, 780 | INPUT_CAMP_BED_INSPECT = 0xc67e13bb, 781 | INPUT_PC_FREE_LOOK = 0x8aaa0ad4, 782 | INPUT_MINIGAME_BARTENDER_RAISE_GLASS = 0xa13460f5, 783 | INPUT_MINIGAME_BARTENDER_RAISE_BOTTLE = 0xf0a25112, 784 | INPUT_MINIGAME_BARTENDER_POUR = 0xcabc2460, 785 | INPUT_MINIGAME_BARTENDER_SERVE = 0xdc03b043, 786 | INPUT_PHOTO_MODE = 0x3c0a40f2, 787 | INPUT_PHOTO_MODE_PC = 0x35957f6c, 788 | INPUT_PHOTO_MODE_CHANGE_CAMERA = 0x9f06b29c, 789 | INPUT_PHOTO_MODE_MOVE_LR = 0x4f136512, 790 | INPUT_PHOTO_MODE_MOVE_LEFT_ONLY = 0x311353eb, 791 | INPUT_PHOTO_MODE_MOVE_RIGHT_ONLY = 0x5357a7f5, 792 | INPUT_PHOTO_MODE_MOVE_UD = 0xec001315, 793 | INPUT_PHOTO_MODE_MOVE_UP_ONLY = 0x315d57e6, 794 | INPUT_PHOTO_MODE_MOVE_DOWN_ONLY = 0x4ebcc409, 795 | INPUT_PHOTO_MODE_RESET = 0xa209bd57, 796 | INPUT_PHOTO_MODE_LENSE_NEXT = 0xb138d899, 797 | INPUT_PHOTO_MODE_LENSE_PREV = 0x06a057f8, 798 | INPUT_PHOTO_MODE_ROTATE_LEFT = 0x2eea1d2a, 799 | INPUT_PHOTO_MODE_ROTATE_RIGHT = 0x96e70854, 800 | INPUT_PHOTO_MODE_TOGGLE_HUD = 0x7f9055f5, 801 | INPUT_PHOTO_MODE_VIEW_PHOTOS = 0xdce96d67, 802 | INPUT_PHOTO_MODE_TAKE_PHOTO = 0xa190aac7, 803 | INPUT_PHOTO_MODE_BACK = 0x2f13ec9a, 804 | INPUT_PHOTO_MODE_SWITCH_MODE = 0x8f32e2eb, 805 | INPUT_PHOTO_MODE_FILTER_INTENSITY = 0xfe6dd360, 806 | INPUT_PHOTO_MODE_FILTER_INTENSITY_UP = 0x2286d46b, 807 | INPUT_PHOTO_MODE_FILTER_INTENSITY_DOWN = 0xb341f407, 808 | INPUT_PHOTO_MODE_FOCAL_LENGTH = 0x886aba4e, 809 | INPUT_PHOTO_MODE_FOCAL_LENGTH_UP_ONLY = 0xfafbd66a, 810 | INPUT_PHOTO_MODE_FOCAL_LENGTH_DOWN_ONLY = 0x01ebfabd, 811 | INPUT_PHOTO_MODE_FILTER_NEXT = 0x699f8d08, 812 | INPUT_PHOTO_MODE_FILTER_PREV = 0x4f640885, 813 | INPUT_PHOTO_MODE_ZOOM_IN = 0x5b843bc9, 814 | INPUT_PHOTO_MODE_ZOOM_OUT = 0x2354d2e6, 815 | INPUT_PHOTO_MODE_DOF = 0x26b9ae6a, 816 | INPUT_PHOTO_MODE_DOF_UP_ONLY = 0x87b07940, 817 | INPUT_PHOTO_MODE_DOF_DOWN_ONLY = 0x047099f1, 818 | INPUT_PHOTO_MODE_EXPOSURE_UP = 0xc64e2284, 819 | INPUT_PHOTO_MODE_EXPOSURE_DOWN = 0xad07a5a5, 820 | INPUT_PHOTO_MODE_EXPOSURE_LOCK = 0x9de08d71, 821 | INPUT_PHOTO_MODE_CONTRAST = 0x483f707f, 822 | INPUT_PHOTO_MODE_CONTRAST_UP_ONLY = 0x5d2dd717, 823 | INPUT_PHOTO_MODE_CONTRAST_DOWN_ONLY = 0x30811620, 824 | INPUT_CRAFTING_EAT = 0xb99a9cad, 825 | INPUT_CAMP_SETUP_TENT = 0x0b1be2e8, 826 | INPUT_MINIGAME_ACTION_X = 0x1d927df2, 827 | INPUT_DEPRECATED_ABOVE = 0xc1d24f92, 828 | INPUT_SCRIPT_LEFT_AXIS_X = 0x1f8eef84, 829 | INPUT_SCRIPT_LEFT_AXIS_Y = 0x5418d8ab, 830 | INPUT_SCRIPT_RIGHT_AXIS_X = 0xa6b769e9, 831 | INPUT_SCRIPT_RIGHT_AXIS_Y = 0x27a5ebc0, 832 | INPUT_SCRIPT_RUP = 0x771d6e13, 833 | INPUT_SCRIPT_RDOWN = 0x37933367, 834 | INPUT_SCRIPT_RLEFT = 0xa4db0458, 835 | INPUT_SCRIPT_RRIGHT = 0x22a3b800, 836 | INPUT_SCRIPT_LB = 0xe624c062, 837 | INPUT_SCRIPT_RB = 0x91e9231c, 838 | INPUT_SCRIPT_LT = 0x2b314a1e, 839 | INPUT_SCRIPT_RT = 0x26e9cd17, 840 | INPUT_SCRIPT_LS = 0xaaddc975, 841 | INPUT_SCRIPT_RS = 0xd04e9fe2, 842 | INPUT_SCRIPT_PAD_UP = 0x0dc15add, 843 | INPUT_SCRIPT_PAD_DOWN = 0xb1da5574, 844 | INPUT_SCRIPT_PAD_LEFT = 0x1af81d9e, 845 | INPUT_SCRIPT_PAD_RIGHT = 0x82a9b758, 846 | INPUT_SCRIPT_SELECT = 0xc8722109, 847 | INPUT_SCRIPTED_FLY_UD = 0xaeb4b1de, 848 | INPUT_SCRIPTED_FLY_LR = 0xf1111e4a, 849 | INPUT_SCRIPTED_FLY_ZUP = 0x639b9fc9, 850 | INPUT_SCRIPTED_FLY_ZDOWN = 0x9c5e030c, 851 | }; -------------------------------------------------------------------------------- /gtaPayload/linker.x: -------------------------------------------------------------------------------- 1 | OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") 2 | OUTPUT_ARCH(i386:x86-64) 3 | 4 | ENTRY(_start) 5 | 6 | PHDRS 7 | { 8 | code_seg PT_LOAD; 9 | data_seg PT_LOAD; 10 | } 11 | 12 | SECTIONS 13 | { 14 | /* Code segment */ 15 | .text : { 16 | *(.text.start) 17 | *(.text*) 18 | } : code_seg 19 | .rodata : { *(.rodata) *(.rodata*) } : code_seg 20 | 21 | /* Data segment */ 22 | .data : { *(.data) } : data_seg 23 | .bss : { *(.bss) } : data_seg 24 | } 25 | -------------------------------------------------------------------------------- /gtaPayload/source/invoker.cpp: -------------------------------------------------------------------------------- 1 | #include "invoker.h" 2 | 3 | NativeArg_s nativeArg; 4 | u64 args[30]; 5 | 6 | void setVectors() { 7 | while (nativeArg.vectorCount) { 8 | nativeArg.vectorCount--; 9 | 10 | Vector3* argVector = nativeArg.argVectors[nativeArg.vectorCount]; 11 | Vector4 tempVector = nativeArg.tempVectors[nativeArg.vectorCount]; 12 | argVector->x = tempVector.x; 13 | argVector->y = tempVector.y; 14 | argVector->z = tempVector.z; 15 | } 16 | } 17 | 18 | void resetArgs() { 19 | nativeArg.argCount = 0; 20 | nativeArg.vectorCount = 0; 21 | nativeArg.argValues = nativeArg.returnValue = args; 22 | } -------------------------------------------------------------------------------- /gtaPayload/source/lib.cpp: -------------------------------------------------------------------------------- 1 | #include "lib.h" 2 | 3 | //u64 (*syscall)(int num, ...) = (void*)0x537B964; 4 | u64 (*syscall)(int num, ...) = (void*)0x6270664; 5 | // 1.29 = 0x6270664 6 | #define resolve(module, name) syscall(591, module, #name, &name); 7 | 8 | void *(*malloc)(size_t size); 9 | void(*free)(void *ptr); 10 | void *(*calloc)(size_t num, size_t size); 11 | void *(*realloc)(void* ptr, size_t size); 12 | void *(*memset)(void *destination, int value, size_t num); 13 | void *(*memcpy)(void *destination, const void *source, size_t num); 14 | int(*memcmp)(const void *s1, const void *s2, size_t n); 15 | char *(*strcpy)(char *destination, const char *source); 16 | char *(*strncpy)(char *destination, const char *source, size_t num); 17 | char *(*strcat)(char *dest, const char *src); 18 | char *(*strncat)(char *dest, const char *src, size_t n); 19 | size_t(*strlen)(const char *s); 20 | int(*strcmp)(const char *s1, const char *s2); 21 | int(*strncmp)(const char *s1, const char *s2, size_t n); 22 | int(*sprintf)(char *str, const char *format, ...); 23 | int(*snprintf)(char *str, size_t size, const char *format, ...); 24 | int(*sscanf)(const char *str, const char *format, ...); 25 | char *(*strchr)(const char *s, int c); 26 | char *(*strrchr)(const char *s, int c); 27 | char *(*strstr)(char *str1, char *str2); 28 | int(*atoi)(const char * str); 29 | double(*atof)(const char * str); 30 | 31 | void resolveLibs() { 32 | int libcHandle; 33 | syscall(594, "libSceLibcInternal.sprx", 0, &libcHandle, 0); 34 | 35 | resolve(libcHandle, malloc); 36 | resolve(libcHandle, free); 37 | resolve(libcHandle, calloc); 38 | resolve(libcHandle, realloc); 39 | resolve(libcHandle, memset); 40 | resolve(libcHandle, memcpy); 41 | resolve(libcHandle, memcmp); 42 | resolve(libcHandle, strcpy); 43 | resolve(libcHandle, strncpy); 44 | resolve(libcHandle, strcat); 45 | resolve(libcHandle, strncat); 46 | resolve(libcHandle, strlen); 47 | resolve(libcHandle, strcmp); 48 | resolve(libcHandle, strncmp); 49 | resolve(libcHandle, sprintf); 50 | resolve(libcHandle, snprintf); 51 | resolve(libcHandle, sscanf); 52 | resolve(libcHandle, strchr); 53 | resolve(libcHandle, strrchr); 54 | resolve(libcHandle, strstr); 55 | resolve(libcHandle, atoi); 56 | resolve(libcHandle, atof); 57 | } 58 | 59 | void initLibs() { 60 | do { 61 | resolveLibs(); 62 | } while (malloc == nullptr); 63 | } -------------------------------------------------------------------------------- /gtaPayload/source/main.cpp: -------------------------------------------------------------------------------- 1 | #include "lib.h" 2 | #include "natives.h" 3 | #include "menu.h" 4 | 5 | bool init = false; 6 | int frameCount = 0; 7 | Menu menu; 8 | 9 | void mainMenu() { 10 | menu.banner("Main Menu"); 11 | menu.option("Self Options"); 12 | menu.option("Vehicle Spawner"); 13 | menu.option("Settings"); 14 | } 15 | 16 | extern "C" void _main(void) { 17 | if (!init) { 18 | initLibs(); 19 | menu = Menu(mainMenu); 20 | init = true; 21 | } 22 | 23 | int newFrameCount = MISC::GET_FRAME_COUNT(); 24 | if (newFrameCount > frameCount) { 25 | frameCount = newFrameCount; 26 | 27 | menu.monitorButtons(); 28 | 29 | if (menu.open) { 30 | menu.run(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /gtaPayload/source/menu.cpp: -------------------------------------------------------------------------------- 1 | #include "menu.h" 2 | #include "natives.h" 3 | #include "lib.h" 4 | 5 | Menu::Menu() {} 6 | Menu::Menu(Menu& menu) {} 7 | Menu::Menu(Function mainSubmenu) { 8 | mainMenu = mainSubmenu; 9 | open = false; 10 | sounds = true; 11 | instructions = true; 12 | maxOptions = 15; 13 | } 14 | 15 | void Menu::playSound(char* sound, char* ref) { 16 | if (sounds) { 17 | AUDIO::_STOP_SOUND_WITH_NAME(sound, ref); 18 | AUDIO::PLAY_SOUND_FRONTEND(sound, ref, 1, 0); 19 | } 20 | } 21 | 22 | void Menu::monitorButtons() { 23 | if (open) { 24 | PAD::DISABLE_CONTROL_ACTION(0, INPUT_FRONTEND_UP, true); 25 | PAD::DISABLE_CONTROL_ACTION(0, INPUT_FRONTEND_DOWN, true); 26 | PAD::DISABLE_CONTROL_ACTION(0, INPUT_FRONTEND_RIGHT, true); 27 | PAD::DISABLE_CONTROL_ACTION(0, INPUT_FRONTEND_LEFT, true); 28 | PAD::DISABLE_CONTROL_ACTION(0, INPUT_FRONTEND_ACCEPT, true); 29 | PAD::DISABLE_CONTROL_ACTION(0, INPUT_FRONTEND_CANCEL, true); 30 | PAD::DISABLE_CONTROL_ACTION(0, INPUT_FRONTEND_X, true); 31 | PAD::SET_INPUT_EXCLUSIVE(0, INPUT_FRONTEND_UP); 32 | PAD::SET_INPUT_EXCLUSIVE(0, INPUT_FRONTEND_RIGHT); 33 | PAD::SET_INPUT_EXCLUSIVE(0, INPUT_FRONTEND_LEFT); 34 | PAD::SET_INPUT_EXCLUSIVE(0, INPUT_FRONTEND_CANCEL); 35 | 36 | optionPress = leftPress = rightPress = leftHold = rightHold = upPress = downPress = squarePress = false; 37 | 38 | if (PAD::IS_DISABLED_CONTROL_JUST_PRESSED(0, INPUT_FRONTEND_CANCEL)) { 39 | if (currentMenu == mainMenu) { 40 | open = false; 41 | playSound("MENU_CLOSE"); 42 | } 43 | else { 44 | submenuLevel--; 45 | currentMenu = lastSubmenu[submenuLevel]; 46 | currentOption = lastOption[submenuLevel]; 47 | if (colorEditing) { 48 | colorEditing = false; 49 | } 50 | } 51 | playSound("BACK"); 52 | } 53 | else if (PAD::IS_DISABLED_CONTROL_JUST_PRESSED(0, INPUT_FRONTEND_UP)) { 54 | upPress = true; 55 | currentOption--; 56 | if (currentOption < 1) { 57 | currentOption = optionCount; 58 | } 59 | playSound("NAV_UP"); 60 | } 61 | else if (PAD::IS_DISABLED_CONTROL_JUST_PRESSED(0, INPUT_FRONTEND_DOWN)) { 62 | downPress = true; 63 | currentOption++; 64 | if (currentOption > optionCount) { 65 | currentOption = 1; 66 | } 67 | playSound("NAV_DOWN"); 68 | } 69 | else if (PAD::IS_DISABLED_CONTROL_JUST_PRESSED(0, INPUT_FRONTEND_RIGHT)) { 70 | rightPress = true; 71 | } 72 | else if (PAD::IS_DISABLED_CONTROL_JUST_PRESSED(0, INPUT_FRONTEND_LEFT)) { 73 | leftPress = true; 74 | } 75 | else if (PAD::IS_DISABLED_CONTROL_PRESSED(0, INPUT_FRONTEND_RIGHT)) { 76 | rightHold = true; 77 | } 78 | else if (PAD::IS_DISABLED_CONTROL_PRESSED(0, INPUT_FRONTEND_LEFT)) { 79 | leftHold = true; 80 | } 81 | else if (PAD::IS_DISABLED_CONTROL_JUST_PRESSED(0, INPUT_FRONTEND_X)) { 82 | squarePress = true; 83 | } 84 | else if (PAD::IS_DISABLED_CONTROL_JUST_PRESSED(0, INPUT_FRONTEND_ACCEPT)) { 85 | optionPress = true; 86 | playSound("SELECT"); 87 | } 88 | } 89 | else { 90 | if (PAD::IS_CONTROL_PRESSED(0, INPUT_FRONTEND_RB) && PAD::IS_CONTROL_PRESSED(0, INPUT_FRONTEND_RS)) { 91 | open = true; 92 | optionPress = false; 93 | submenuLevel = 0; 94 | currentMenu = mainMenu; 95 | currentOption = 1; 96 | playSound("MENU_ENTER"); 97 | } 98 | } 99 | } 100 | 101 | void Menu::drawText(char* text, Vector2 pos, int size, Font font, char* color, char* alignment, bool outline) { 102 | char buffer[512]; 103 | char* fontList[] = { "util", "catalog5", "body1", "body", "Debug_REG", "catalog4", "chalk", "catalog1", "ledger", "title", "wantedPostersGeneric", "gtaCash", "gamername", "handwritten" }; 104 | 105 | sprintf(buffer, "

%s

", fontList[font], color, size, alignment, text); 106 | 107 | const char* varString = MISC::VAR_STRING(10, "LITERAL_STRING", buffer); 108 | const char* varString2 = MISC::VAR_STRING(42, "COLOR_STRING", nullptr, varString); 109 | 110 | UIDEBUG::_BG_DISPLAY_TEXT(varString2, pos.x, pos.y); 111 | } 112 | 113 | void Menu::drawCenterNotification(char* text, int duration) { 114 | const char* literalString = MISC::VAR_STRING(10, "LITERAL_STRING", text); 115 | UILOG::_UILOG_SET_CACHED_OBJECTIVE(literalString); 116 | UILOG::_UILOG_PRINT_CACHED_OBJECTIVE(); 117 | UILOG::_UILOG_CLEAR_CACHED_OBJECTIVE(); 118 | } 119 | 120 | void Menu::run() { 121 | optionCount = 0; 122 | tipText = nullptr; 123 | setupIntructionsThisFrame = xInstruction = squareInstruction = lrInstruction = false; 124 | 125 | currentMenu(); 126 | 127 | // Draw banner top 128 | GRAPHICS::DRAW_RECT(0.825f, 0.1175f, 0.23f, 0.083f, 201, 0, 44, 255, false, true); 129 | 130 | drawText("Test Menu", { 0.660f, 0.1f }, 45, Redemption, "004B93", "CENTER", true); 131 | 132 | // Draw body 133 | if (optionCount > maxOptions) { 134 | GRAPHICS::DRAW_RECT(0.825f, (((maxOptions * 0.035f) / 2) + 0.159f), 0.23f, (maxOptions * 0.035f), 0, 0, 0, 255, false, true); // Body 135 | if (currentOption > maxOptions) { 136 | GRAPHICS::DRAW_RECT(0.825f, ((maxOptions * 0.035f) + 0.1415f), 0.23f, 0.035f, 255, 255, 255, 255, false, true); // Scroller 137 | GRAPHICS::DRAW_RECT(0.825f, 0.159f, 0.23f, 0.005f, 0, 0, 0, 255, false, true); // Up indicator 138 | } 139 | else { 140 | GRAPHICS::DRAW_RECT(0.825f, ((currentOption * 0.035f) + 0.1415f), 0.23f, 0.035f, 255, 255, 255, 255, false, true); // Scroller 141 | } 142 | if (currentOption != optionCount) { 143 | GRAPHICS::DRAW_RECT(0.825f, ((maxOptions * 0.035f) + 0.161f), 0.23f, 0.005f, 0, 0, 0, 255, false, true); // Down indicator 144 | } 145 | } 146 | else { 147 | GRAPHICS::DRAW_RECT(0.825f, (((optionCount * 0.035f) / 2) + 0.159f), 0.23f, (optionCount * 0.035f), 0, 0, 0, 255, false, true); // Body 148 | GRAPHICS::DRAW_RECT(0.825f, ((currentOption * 0.035f) + 0.1415f), 0.23f, 0.035f, 255, 255, 255, 255, false, true); // Scroller 149 | } 150 | 151 | // Handle keyboard 152 | if (keyboardActive) { 153 | int keyboardStatus = MISC::UPDATE_ONSCREEN_KEYBOARD(); 154 | if (keyboardStatus == 1) { 155 | keyboardHandler(MISC::GET_ONSCREEN_KEYBOARD_RESULT()); 156 | keyboardActive = false; 157 | } 158 | else if (keyboardStatus == 2 || keyboardStatus == 3) { 159 | keyboardActive = false; 160 | } 161 | } 162 | } 163 | 164 | void Menu::changeSubmenu(Function submenu) { 165 | lastSubmenu[submenuLevel] = currentMenu; 166 | lastOption[submenuLevel] = currentOption; 167 | currentOption = 1; 168 | optionPress = false; 169 | currentMenu = submenu; 170 | submenuLevel++; 171 | } 172 | 173 | void Menu::openKeyboard(KeyboardHandler handler, int maxLength, char* defaultText) { 174 | MISC::DISPLAY_ONSCREEN_KEYBOARD(0, "FMMC_KEY_TIP8", "", defaultText, "", "", "", maxLength); 175 | keyboardHandler = handler; 176 | keyboardActive = true; 177 | } 178 | 179 | Menu::scrollData Menu::intScrollData; 180 | Menu::scrollData Menu::floatScrollData; 181 | void Menu::intScrollKeyboardHandler(char* text) { 182 | int i = atoi(text); 183 | if (i <= intScrollData.max && i >= intScrollData.min) { 184 | *intScrollData.var = i; 185 | } 186 | else { 187 | char buffer[70]; 188 | sprintf(buffer, "~r~Error: input must be between %i and %i", intScrollData.min, intScrollData.max); 189 | drawCenterNotification(buffer); 190 | } 191 | } 192 | void Menu::floatScrollKeyboardHandler(char* text) { 193 | float f = (float)atof(text); 194 | if (f <= floatScrollData.max && f >= floatScrollData.min) { 195 | *floatScrollData.var = f; 196 | } 197 | else { 198 | char buffer1[70]; 199 | char buffer2[70]; 200 | sprintf(buffer1, "~r~Error: input must be between %%.%if and %%.%if", floatScrollData.decimals, floatScrollData.decimals); 201 | sprintf(buffer2, buffer1, floatScrollData.min, floatScrollData.max); 202 | drawCenterNotification(buffer2); 203 | } 204 | } 205 | 206 | void Menu::banner(char* text) { 207 | title = text; 208 | } 209 | 210 | bool Menu::hovered() { 211 | return currentOption == optionCount; 212 | } 213 | 214 | bool Menu::pressed() { 215 | if (hovered()) { 216 | xInstruction = true; 217 | if (optionPress) { 218 | return true; 219 | } 220 | } 221 | return false; 222 | } 223 | 224 | bool Menu::scrolled() { 225 | if (hovered()) { 226 | lrInstruction = true; 227 | if (rightPress || leftPress || (fastScrolling && rightHold) || (fastScrolling && leftHold)) { 228 | return true; 229 | } 230 | } 231 | return false; 232 | } 233 | 234 | void Menu::positionMenuText(char* text, float xPos, Alignment alignment) { 235 | int optionIndex = 0; 236 | if (currentOption <= maxOptions && optionCount <= maxOptions) { 237 | optionIndex = optionCount; 238 | } 239 | else if ((optionCount > (currentOption - maxOptions)) && optionCount <= currentOption) { 240 | optionIndex = optionCount - (currentOption - maxOptions); 241 | } 242 | if (optionIndex != 0) { 243 | drawText(text, { xPos, optionIndex * 0.035f + 0.125f }, 23, Hapna, hovered() ? "000000" : "FFFFFF", "LEFT", false); 244 | } 245 | } 246 | 247 | Menu& Menu::option(char* text) { 248 | optionCount++; 249 | positionMenuText(text, 0.715f, Left); 250 | return *this; 251 | } 252 | 253 | void Menu::spacer(char* text) { 254 | char buffer[60]; 255 | sprintf(buffer, "~italic~%s", text); 256 | 257 | optionCount++; 258 | positionMenuText(buffer, 0.825f, Center); 259 | 260 | if (hovered()) { 261 | if (upPress) { 262 | currentOption--; 263 | } 264 | else if (downPress) { 265 | currentOption++; 266 | } 267 | } 268 | } 269 | 270 | Menu& Menu::data(char* text) { 271 | positionMenuText(text, 0.935f, Right); 272 | return *this; 273 | } 274 | 275 | Menu& Menu::data(bool b) { 276 | return b ? data("On") : data("Off"); 277 | } 278 | 279 | Menu& Menu::data(int i) { 280 | char buffer[30]; 281 | sprintf(buffer, "%i", i); 282 | return data(buffer); 283 | } 284 | 285 | Menu& Menu::data(float f, int decimalPlaces) { 286 | char formatBuffer[10]; 287 | char dataBuffer[30]; 288 | sprintf(formatBuffer, "%%.%if", decimalPlaces); 289 | sprintf(dataBuffer, formatBuffer, f); 290 | return data(dataBuffer); 291 | } 292 | 293 | Menu& Menu::scroller(int *i, int min, int max, bool fast, bool keyboard) { 294 | char buffer[30]; 295 | 296 | if (hovered()) { 297 | lrInstruction = true; 298 | fastScrolling = fast; 299 | if (rightPress || (rightHold && fast)) { 300 | playSound("NAV_RIGHT"); 301 | if (*i >= max) { 302 | *i = min; 303 | } 304 | else { 305 | *i = *i + 1; 306 | } 307 | } 308 | else if (leftPress || (leftHold && fast)) { 309 | playSound("NAV_LEFT"); 310 | if (*i <= min) { 311 | *i = max; 312 | } 313 | else { 314 | *i = *i - 1; 315 | } 316 | } 317 | 318 | if (keyboard) { 319 | squareInstruction = true; 320 | if (squarePress) { 321 | intScrollData = { i, min, max, 0 }; 322 | sprintf(buffer, "%i", max); 323 | openKeyboard(intScrollKeyboardHandler, strlen(buffer) + 1); 324 | } 325 | } 326 | } 327 | 328 | if (hovered()) { 329 | sprintf(buffer, "< %i >", *i); 330 | return data(buffer); 331 | } 332 | return data(*i); 333 | } 334 | 335 | Menu& Menu::scroller(float *f, float min, float max, float increment, int decimalPlaces, bool fast, bool keyboard) { 336 | char buffer1[30]; 337 | 338 | if (hovered()) { 339 | lrInstruction = true; 340 | fastScrolling = fast; 341 | if (rightPress || (rightHold && fast)) { 342 | playSound("NAV_RIGHT"); 343 | if (*f >= max) { 344 | *f = min; 345 | } 346 | else { 347 | *f = *f + increment; 348 | } 349 | } 350 | else if (leftPress || (leftHold && fast)) { 351 | playSound("NAV_LEFT"); 352 | if (*f <= min) { 353 | *f = max; 354 | } 355 | else { 356 | *f = *f - increment; 357 | } 358 | } 359 | 360 | if (keyboard) { 361 | squareInstruction = true; 362 | if (squarePress) { 363 | floatScrollData = { f, min, max, decimalPlaces }; 364 | sprintf(buffer1, "%i", (int)max); 365 | openKeyboard(floatScrollKeyboardHandler, strlen(buffer1) + decimalPlaces + 1); 366 | } 367 | } 368 | } 369 | 370 | if (hovered()) { 371 | char buffer2[30]; 372 | sprintf(buffer1, "< %%.%if >", decimalPlaces); 373 | sprintf(buffer2, buffer1, *f); 374 | return data(buffer2); 375 | } 376 | return data(*f, decimalPlaces); 377 | } 378 | 379 | Menu& Menu::scroller(char** textArray, int* index, int numItems, bool fast) { 380 | char buffer[60]; 381 | 382 | numItems--; 383 | if (hovered()) { 384 | lrInstruction = true; 385 | fastScrolling = fast; 386 | if (rightPress || (rightHold && fast)) { 387 | playSound("NAV_RIGHT"); 388 | if (*index >= numItems) { 389 | *index = 0; 390 | } 391 | else { 392 | *index = *index + 1; 393 | } 394 | } 395 | else if (leftPress || (leftHold && fast)) { 396 | playSound("NAV_LEFT"); 397 | if (*index <= 0) { 398 | *index = numItems; 399 | } 400 | else { 401 | *index = *index - 1; 402 | } 403 | } 404 | } 405 | 406 | if (hovered()) { 407 | sprintf(buffer, "< %s >", textArray[*index]); 408 | return data(buffer); 409 | } 410 | return data(textArray[*index]); 411 | } 412 | 413 | Menu& Menu::toggle(bool *b) { 414 | if (pressed()) { 415 | *b = !*b; 416 | } 417 | return data(*b); 418 | } 419 | 420 | Menu& Menu::tip(char* text) { 421 | if (hovered()) { 422 | tipText = text; 423 | } 424 | return *this; 425 | } 426 | 427 | Menu& Menu::submenu(Function sub) { 428 | if (pressed()) { 429 | changeSubmenu(sub); 430 | } 431 | return *this; 432 | } 433 | 434 | Menu& Menu::keyboard(KeyboardHandler handler, int maxLength, char* defaultText) { 435 | if (pressed()) { 436 | openKeyboard(handler, maxLength, defaultText); 437 | } 438 | return *this; 439 | } 440 | 441 | Menu& Menu::vehicleSpawn(Hash vehicleHash) { 442 | if (pressed()) { 443 | vehicleToSpawn = vehicleHash; 444 | } 445 | return *this; 446 | } -------------------------------------------------------------------------------- /include/gta.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "type.h" 4 | 5 | // Same for all regions 6 | //#define PayloadAddress (void*)0x66A6BE0 //new 7 | #define PayloadAddress (void*)0x75FCA80 8 | // 1.29 patch = 0x75FCA80 good for US & EU 9 | //#define GTAVarsAddress (void*)0x74580FE // new 10 | #define GTAVarsAddress (void*)0x8387E2E 11 | // 1.29 patch = 0x8387E2E good for US & EU 12 | 13 | 14 | //#define SyscallAddress (void*)0x537B964 // unused code within .text 15 | #define SyscallAddress (void*)0x6270664 16 | // 1.29 patch = 0x6270664 good for US & EU 17 | #define SyscallBytes 0x48, 0x89, 0xF8, 0x48, 0x89, 0xF7, 0x48, 0x89, 0xD6, 0x48, 0x89, 0xCA, 0x4D, 0x89, 0xC2, 0x4D, 0x89, 0xC8, 0x4C, 0x8B, 0x4C, 0x24, 0x08, 0x0F, 0x05, 0xC3 //stays the same 18 | /* 19 | mov rax, rdi 20 | mov rdi, rsi 21 | mov rsi, rdx 22 | mov rdx, rcx 23 | mov r10, r8 24 | mov r8, r9 25 | mov r9, [rsp+0x8] 26 | syscall 27 | ret 28 | */ 29 | 30 | // Location not important, this is a random place in the EBOOT to detect region and version 31 | #define GameCheckAddress (void*)0x5E57A4 // new 32 | 33 | // GET_CLOCK_DAY_OF_MONTH 34 | //#define HookAddress (void*)0x2129DFB // new 35 | #define HookAddress (void*)0x21C4E31 36 | // 1.29 patch = 0x21C4E31 good for US & EU 37 | 38 | #define HookBytes 0x48, 0x8D, 0x15, 0xDE, 0xCD, 0x57, 0x04 // 1.00 version 39 | // 1.29 patch = 48 8D 15 48 7C 43 05 40 | 41 | /* 42 | lea rdx, [rip+0x457CDDE] 43 | 1.29 = lea rdx, [rip+0x5437C48] 44 | */ 45 | 46 | struct _gtaVars { 47 | BOOL allocationNeeded; 48 | int allocationSize; 49 | void* executableSpace; 50 | void* dataSpace; 51 | }; 52 | static struct _gtaVars *gtaVars = (struct _gtaVars*)GTAVarsAddress; 53 | 54 | extern BOOL nativeHook(); -------------------------------------------------------------------------------- /include/kern.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "type.h" 4 | #include "ps4.h" 5 | 6 | 7 | #define KERN_PTRACE_CHECK 0x30D9AA // default is 5.05 8 | #define KERN_PTRACE_CHECK_672 0x10F879 9 | //#define KERN_PTRACE_CHECK_702 10 | #define KERN_PTRACE_CHECK_755 0x361CF5 11 | //#define KERN_PTRACE_CHECK_852 12 | #define KERN_PTRACE_CHECK_900 0x41F4E5 13 | 14 | #define KERN_DISABLE_ASLR_672 0x3CECE1 15 | 16 | #define X86_CR0_WP (1 << 16) 17 | uint64_t kernel_base; 18 | u16 fw; 19 | 20 | 21 | struct kernel_payload_args 22 | { 23 | void* syscall_handler; 24 | uint64_t user_arg; 25 | }; 26 | 27 | extern void patch_ptrace(void); 28 | -------------------------------------------------------------------------------- /include/proc.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "type.h" 4 | #include "ps4.h" 5 | 6 | #define CTL_KERN 1 7 | #define KERN_PROC 14 8 | #define KERN_PROC_ALL 0 /* everything */ 9 | #define KERN_PROC_PID 1 /* by process id */ 10 | #define KERN_PROC_PGRP 2 /* by process group id */ 11 | #define KERN_PROC_SESSION 3 /* by session of pid */ 12 | #define KERN_PROC_TTY 4 /* by controlling tty */ 13 | #define KERN_PROC_UID 5 /* by effective uid */ 14 | #define KERN_PROC_RUID 6 /* by real uid */ 15 | 16 | #define PT_TRACE_ME 0 /* child declares it's being traced */ 17 | #define PT_READ_I 1 /* read word in child's I space */ 18 | #define PT_READ_D 2 /* read word in child's D space */ 19 | /* was PT_READ_U 3 * read word in child's user structure */ 20 | #define PT_WRITE_I 4 /* write word in child's I space */ 21 | #define PT_WRITE_D 5 /* write word in child's D space */ 22 | /* was PT_WRITE_U 6 * write word in child's user structure */ 23 | #define PT_CONTINUE 7 /* continue the child */ 24 | #define PT_KILL 8 /* kill the child process */ 25 | #define PT_STEP 9 /* single step the child */ 26 | #define PT_ATTACH 10 /* trace some running process */ 27 | #define PT_DETACH 11 /* stop tracing a process */ 28 | #define PT_IO 12 /* do I/O to/from stopped process. */ 29 | #define PT_LWPINFO 13 /* Info about the LWP that stopped. */ 30 | #define PT_GETNUMLWPS 14 /* get total number of threads */ 31 | #define PT_GETLWPLIST 15 /* get thread list */ 32 | #define PT_CLEARSTEP 16 /* turn off single step */ 33 | #define PT_SETSTEP 17 /* turn on single step */ 34 | #define PT_SUSPEND 18 /* suspend a thread */ 35 | #define PT_RESUME 19 /* resume a thread */ 36 | #define PT_TO_SCE 20 37 | #define PT_TO_SCX 21 38 | #define PT_SYSCALL 22 39 | #define PT_FOLLOW_FORK 23 40 | #define PT_GETREGS 33 /* get general-purpose registers */ 41 | #define PT_SETREGS 34 /* set general-purpose registers */ 42 | #define PT_GETFPREGS 35 /* get floating-point registers */ 43 | #define PT_SETFPREGS 36 /* set floating-point registers */ 44 | #define PT_GETDBREGS 37 /* get debugging registers */ 45 | #define PT_SETDBREGS 38 /* set debugging registers */ 46 | #define PT_VM_TIMESTAMP 40 /* Get VM version (timestamp) */ 47 | #define PT_VM_ENTRY 41 /* Get VM map (entry) */ 48 | 49 | #define PIOD_READ_D 1 /* Read from D space */ 50 | #define PIOD_WRITE_D 2 /* Write to D space */ 51 | #define PIOD_READ_I 3 /* Read from I space */ 52 | #define PIOD_WRITE_I 4 /* Write to I space */ 53 | 54 | struct kinfo_proc { 55 | int structSize; 56 | int layout; 57 | void* args; 58 | void* paddr; 59 | void* addr; 60 | void* tracep; 61 | void* textvp; 62 | void* fd; 63 | void* vmspace; 64 | void* wchan; 65 | int pid; 66 | char useless[0x173]; 67 | char name[]; 68 | }; 69 | 70 | struct ptrace_io_desc { 71 | int piod_op; /* I/O operation */ 72 | void *piod_offs; /* child offset */ 73 | void *piod_addr; /* parent offset */ 74 | size_t piod_len; /* request length */ 75 | }; -------------------------------------------------------------------------------- /include/type.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #define TRUE 1 6 | #define FALSE 0 7 | 8 | #define Inline static inline __attribute__((always_inline)) 9 | 10 | typedef char BOOL; 11 | typedef unsigned char u8; -------------------------------------------------------------------------------- /rdr2-menu-base-129.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethylamine/PS4-RDR-2-Menu-Base/999e88db102874719961ac61ea30b5fff3d7aefa/rdr2-menu-base-129.bin -------------------------------------------------------------------------------- /source/embed.s: -------------------------------------------------------------------------------- 1 | .section .rodata 2 | .global gtaPayload 3 | .type gtaPayload, @object 4 | .align 4 5 | gtaPayload: 6 | .incbin "gtaPayload/gtaPayload.bin" 7 | gtaPayloadEnd: 8 | .global gtaPayloadSize 9 | .type gtaPayloadSize, @object 10 | .align 4 11 | gtaPayloadSize: 12 | .int gtaPayloadEnd - gtaPayload 13 | -------------------------------------------------------------------------------- /source/gta.c: -------------------------------------------------------------------------------- 1 | #include "gta.h" 2 | #include "ps4.h" 3 | 4 | static u64 (*_syscall)(int num, ...) = (void*)SyscallAddress; 5 | Inline void* sys_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) { 6 | return (void*)_syscall(477, addr, len, prot, flags, fd, offset); 7 | } 8 | 9 | BOOL nativeHook() { 10 | if (gtaVars->allocationNeeded) { 11 | if (!gtaVars->executableSpace) { 12 | //gtaVars->executableSpace = sys_mmap((void*)0x926200000, gtaVars->allocationSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); 13 | gtaVars->executableSpace = sys_mmap(0, gtaVars->allocationSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 14 | } 15 | else if (!gtaVars->dataSpace) { 16 | //gtaVars->dataSpace = sys_mmap((void*)0x926300000, gtaVars->allocationSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); 17 | gtaVars->dataSpace = sys_mmap(0, gtaVars->allocationSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 18 | } 19 | else { 20 | *(char*)gtaVars->executableSpace = 0xC3; // retn 21 | gtaVars->allocationNeeded = FALSE; 22 | } 23 | } 24 | else { 25 | ((void(*)())gtaVars->executableSpace)(); 26 | } 27 | 28 | return TRUE; 29 | } 30 | -------------------------------------------------------------------------------- /source/kern.c: -------------------------------------------------------------------------------- 1 | #include "kern.h" 2 | 3 | void patch_ptrace() 4 | { 5 | uint8_t *kernel_ptr = (uint8_t*)kernel_base; 6 | 7 | // Disable write protection 8 | uint64_t cr0 = readCr0(); 9 | writeCr0(cr0 & ~X86_CR0_WP); 10 | 11 | 12 | if (fw == 505) 13 | // Disable ptrace check 14 | *(uint8_t *)&kernel_ptr[KERN_PTRACE_CHECK] = 0xEB; 15 | 16 | else if (fw == 672) // these patches are needed for 6.72 to work 17 | { 18 | // patch dynlib_dlsym 19 | *(uint8_t *)&kernel_ptr[0x1D895A] = 0xE9; 20 | *(uint8_t *)&kernel_ptr[0x1D895A + 1] = 0xC7; 21 | *(uint8_t *)&kernel_ptr[0x1D895A + 2] = 0x01; 22 | *(uint8_t *)&kernel_ptr[0x1D895A + 3] = 0x00; 23 | *(uint8_t *)&kernel_ptr[0x1D895A + 4] = 0x00; 24 | 25 | // Disable ptrace check, 6.72 26 | *(uint8_t *)&kernel_ptr[KERN_PTRACE_CHECK_672] = 0xEB; 27 | *(uint8_t *)&kernel_ptr[0x10FD22] = 0xE9; 28 | *(uint8_t *)&kernel_ptr[0x10FD22 + 1] = 0xE2; 29 | *(uint8_t *)&kernel_ptr[0x10FD22 + 2] = 0x02; 30 | *(uint8_t *)&kernel_ptr[0x10FD22 + 3] = 0x00; 31 | *(uint8_t *)&kernel_ptr[0x10FD22 + 4] = 0x00; 32 | 33 | // disable ASLR 34 | *(uint8_t *)&kernel_ptr[KERN_DISABLE_ASLR_672] = 0xEB; 35 | } 36 | 37 | 38 | else if (fw == 755) 39 | // Disable ptrace check, 7.55 40 | *(uint8_t *)&kernel_ptr[KERN_PTRACE_CHECK_755] = 0xEB; 41 | 42 | else if (fw == 900) 43 | // Disable ptrace check, 9.00 44 | *(uint8_t *)&kernel_ptr[KERN_PTRACE_CHECK_900] = 0xEB; 45 | 46 | 47 | // Enable write protection 48 | writeCr0(cr0); 49 | } 50 | -------------------------------------------------------------------------------- /source/main.c: -------------------------------------------------------------------------------- 1 | #include "ps4.h" 2 | #include "kern.h" 3 | #include "proc.h" 4 | #include "gta.h" 5 | 6 | extern char gtaPayload[]; 7 | extern int gtaPayloadSize; 8 | 9 | int gamePID; 10 | int GameVersion; 11 | 12 | 13 | void sysNotify(char* msg) { 14 | sceSysUtilSendSystemNotificationWithText(222, msg); 15 | } 16 | 17 | BOOL gameCheck() { 18 | procAttach(gamePID); 19 | 20 | u8 testBytes; 21 | procReadBytes(gamePID, GameCheckAddress, (void*)&testBytes, sizeof(testBytes)); 22 | 23 | BOOL success = FALSE; 24 | 25 | if (testBytes == 0x11) 26 | { 27 | GameVersion = 0x64; 28 | success = FALSE; 29 | sysNotify("Detected Game. \nYour version 1.00"); 30 | } 31 | 32 | else if (testBytes == 0x00) 33 | { 34 | GameVersion = 0x81; 35 | success = TRUE; 36 | sysNotify("Detected Game. \nYour version 1.29"); 37 | } 38 | 39 | else 40 | { 41 | success = FALSE; 42 | sysNotify("Failed to detect RDR 2."); 43 | } 44 | 45 | procDetach(gamePID); 46 | return success; 47 | } 48 | BOOL setupDone() { 49 | procAttach(gamePID); 50 | 51 | BOOL allocationNeeded; 52 | procReadBytes(gamePID, >aVars->allocationNeeded, &allocationNeeded, sizeof(allocationNeeded)); 53 | 54 | procDetach(gamePID); 55 | return !allocationNeeded; 56 | } 57 | 58 | void runSetup() { 59 | procAttach(gamePID); 60 | 61 | BOOL allocationNeeded = TRUE; 62 | procWriteBytes(gamePID, >aVars->allocationNeeded, &allocationNeeded, sizeof(allocationNeeded)); 63 | 64 | void* null = NULL; 65 | procWriteBytes(gamePID, >aVars->executableSpace, &null, sizeof(null)); 66 | procWriteBytes(gamePID, >aVars->dataSpace, &null, sizeof(null)); 67 | 68 | int executableSize = (int)ceil((double)gtaPayloadSize / 0x4000) * 0x4000; 69 | procWriteBytes(gamePID, >aVars->allocationSize, &executableSize, sizeof(executableSize)); 70 | 71 | procWriteBytes(gamePID, PayloadAddress, nativeHook, 0x3000); 72 | 73 | u8 syscallASM[] = { SyscallBytes }; 74 | procWriteBytes(gamePID, SyscallAddress, syscallASM, sizeof(syscallASM)); 75 | 76 | if (GameVersion == 0x81) //new for 1.29 77 | { 78 | u8 hookASM[] = { 0x48, 0x8D, 0x15, 0x48, 0x7C, 0x43, 0x05 }; 79 | procWriteBytes(gamePID, HookAddress, hookASM, sizeof(hookASM)); 80 | } 81 | 82 | /*else if (GameVersion == 0x64) 83 | { 84 | u8 hookASM[] = { HookBytes }; 85 | procWriteBytes(gamePID, HookAddress, hookASM, sizeof(hookASM)); 86 | }*/ 87 | 88 | else 89 | { 90 | sysNotify("Unsupported game version detected\n. Use 1.29 patch only"); 91 | } 92 | 93 | 94 | procDetach(gamePID); 95 | } 96 | void startExecution() { 97 | procAttach(gamePID); 98 | 99 | void* executableSpace; 100 | procReadBytes(gamePID, >aVars->executableSpace, &executableSpace, sizeof(executableSpace)); 101 | 102 | procWriteBytes(gamePID, executableSpace, gtaPayload, gtaPayloadSize); 103 | 104 | procDetach(gamePID); 105 | } 106 | 107 | int _main(void) { 108 | initKernel(); 109 | initLibc(); 110 | 111 | jailbreak(); 112 | initSysUtil(); 113 | 114 | fw = get_firmware(); 115 | kernel_base = get_kernel_base(); 116 | if (fw != 672) 117 | disable_aslr(); 118 | 119 | if (fw != 505 && fw != 672 && fw != 755 && fw != 900) // shitty check for firmware 120 | return 0; 121 | 122 | syscall(11, patch_ptrace); 123 | 124 | 125 | sysNotify("Payload loaded.\nPlease launch RDR 2."); 126 | gamePID = findProcess("eboot.bin"); 127 | 128 | sceKernelSleep(3); 129 | 130 | if (!gameCheck()) { 131 | return 0; 132 | } 133 | 134 | sysNotify("Setting up environment."); 135 | runSetup(); 136 | 137 | while (!setupDone()) sceKernelSleep(3); 138 | 139 | sceKernelSleep(5); 140 | startExecution(); 141 | sysNotify("Mods activated.\nOpen menu with R1 + R3. \nEnjoy!"); 142 | 143 | return 0; 144 | } 145 | -------------------------------------------------------------------------------- /source/proc.c: -------------------------------------------------------------------------------- 1 | #include "proc.h" 2 | 3 | /*int findProcess(char* procName) { 4 | int procPID = 0; 5 | printf_debug("before while loop, procPID = %d, %s", procPID, " placeholder\n"); 6 | while (!procPID) { 7 | int mib[3]; 8 | size_t len; 9 | mib[0] = CTL_KERN; 10 | mib[1] = KERN_PROC; 11 | mib[2] = KERN_PROC_ALL; 12 | printf_debug("before sysctl, procPID = %d, %s", procPID, " placeholder\n"); 13 | 14 | if (sysctl(mib, 3, NULL, &len, NULL, 0) != -1) { 15 | if (len > 0) { 16 | printf_debug("in first if statement, before malloc, procPID = %d, %s", procPID, " placeholder\n"); 17 | void* dump = malloc(len); 18 | printf_debug("after malloc, procPID = %d, %s", procPID, " placeholder\n"); 19 | if (sysctl(mib, 3, dump, &len, NULL, 0) != -1) { 20 | printf_debug("sysctl if check passed, procPID = %d, %s", procPID, " placeholder\n"); 21 | int structSize = *(int*)dump; 22 | for (int i = 0; i < (len / structSize); i++) { 23 | struct kinfo_proc* procInfo = (struct kinfo_proc*)(dump + (i * structSize)); 24 | if (!strcmp(procInfo->name, procName)) { 25 | procPID = procInfo->pid; 26 | break; 27 | } 28 | } 29 | } 30 | free(dump); 31 | } 32 | } 33 | 34 | sceKernelSleep(1); 35 | } 36 | return procPID; 37 | }*/ 38 | 39 | /*int ptrace(int req, int pid, void* addr, int data); 40 | SYSCALL(ptrace, 26); 41 | 42 | void PTRACE(int req, int pid, void* addr, int data) { 43 | while (ptrace(req, pid, addr, data)); 44 | } 45 | 46 | void procAttach(int pid) { 47 | PTRACE(PT_ATTACH, pid, NULL, NULL); 48 | } 49 | 50 | void procDetach(int pid) { 51 | PTRACE(PT_DETACH, pid, NULL, NULL); 52 | } 53 | 54 | void procReadBytes(int pid, void* offset, void* buffer, size_t len) { 55 | struct ptrace_io_desc pt_desc; 56 | pt_desc.piod_op = PIOD_READ_D; 57 | pt_desc.piod_addr = buffer; 58 | pt_desc.piod_offs = offset; 59 | pt_desc.piod_len = len; 60 | PTRACE(PT_IO, pid, &pt_desc, NULL); 61 | } 62 | 63 | void procWriteBytes(int pid, void* offset, void *buffer, size_t len) { 64 | struct ptrace_io_desc pt_desc; 65 | pt_desc.piod_op = PIOD_WRITE_D; 66 | pt_desc.piod_addr = buffer; 67 | pt_desc.piod_offs = offset; 68 | pt_desc.piod_len = len; 69 | PTRACE(PT_IO, pid, &pt_desc, NULL); 70 | }*/ --------------------------------------------------------------------------------