From f455780833b39e23fb983bef11f543c641c0405b Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Mon, 11 Apr 2022 19:59:21 -0400 Subject: [PATCH] Add "Force Touch Inventory" --- .../available-feature-flags | 1 + mods/CMakeLists.txt | 2 +- mods/src/touch/{touch.c => touch.cpp} | 13 ++++++++++++- symbols/include/symbols/minecraft.h | 7 +++++++ 4 files changed, 21 insertions(+), 2 deletions(-) rename mods/src/touch/{touch.c => touch.cpp} (53%) diff --git a/launcher/data/client/lib/minecraft-pi-reborn-client/available-feature-flags b/launcher/data/client/lib/minecraft-pi-reborn-client/available-feature-flags index 74f4c023..145096d3 100644 --- a/launcher/data/client/lib/minecraft-pi-reborn-client/available-feature-flags +++ b/launcher/data/client/lib/minecraft-pi-reborn-client/available-feature-flags @@ -31,3 +31,4 @@ TRUE Fix Furnace Not Checking Item Auxiliary TRUE Improved Cursor Rendering FALSE Disable V-Sync TRUE Fix Options Screen +FALSE Force Touch Inventory diff --git a/mods/CMakeLists.txt b/mods/CMakeLists.txt index 988f4d49..6ffe03f3 100644 --- a/mods/CMakeLists.txt +++ b/mods/CMakeLists.txt @@ -47,7 +47,7 @@ else() add_library(sign SHARED src/sign/sign.cpp) target_link_libraries(sign reborn-patch symbols feature input) - add_library(touch SHARED src/touch/touch.c) + add_library(touch SHARED src/touch/touch.cpp) target_link_libraries(touch reborn-patch symbols feature) add_library(override SHARED src/override/override.c) diff --git a/mods/src/touch/touch.c b/mods/src/touch/touch.cpp similarity index 53% rename from mods/src/touch/touch.c rename to mods/src/touch/touch.cpp index 134fc242..57fc4543 100644 --- a/mods/src/touch/touch.c +++ b/mods/src/touch/touch.cpp @@ -10,6 +10,11 @@ static int32_t Minecraft_isTouchscreen_injection(__attribute__((unused)) unsigne return 1; } +// IngameBlockSelectionScreen Memory Allocation Override +static unsigned char *operator_new_IngameBlockSelectionScreen_injection(__attribute__((unused)) uint32_t size) { + return (unsigned char *) ::operator new(TOUCH_INGAME_BLOCK_SELECTION_SCREEN_SIZE); +} + // Init void init_touch() { int touch_gui = feature_has("Touch GUI", server_disabled); @@ -24,6 +29,12 @@ void init_touch() { // Show Block Outlines int block_outlines = feature_has("Show Block Outlines", 0); - unsigned char outline_patch[4] = {block_outlines ? !touch_gui : touch_gui, 0x00, 0x50, 0xe3}; // "cmp r0, #0x1" or "cmp r0, #0x0" + unsigned char outline_patch[4] = {(unsigned char) (block_outlines ? !touch_gui : touch_gui), 0x00, 0x50, 0xe3}; // "cmp r0, #0x1" or "cmp r0, #0x0" patch((void *) 0x4a210, outline_patch); + + // Force Touch Inventory + if (feature_has("Force Touch Inventory", server_disabled)) { + overwrite_call((void *) 0x2943c, (void *) operator_new_IngameBlockSelectionScreen_injection); + overwrite_call((void *) 0x29444, (void *) Touch_IngameBlockSelectionScreen); + } } diff --git a/symbols/include/symbols/minecraft.h b/symbols/include/symbols/minecraft.h index 1a0d817e..b138736c 100644 --- a/symbols/include/symbols/minecraft.h +++ b/symbols/include/symbols/minecraft.h @@ -495,6 +495,13 @@ static void *StartMenuScreen_init_vtable_addr = (void *) 0x105194; static uint32_t StartMenuScreen_options_button_property_offset = 0x98; // Button +// Touch::IngameBlockSelectionScreen + +#define TOUCH_INGAME_BLOCK_SELECTION_SCREEN_SIZE 0x16c + +typedef unsigned char *(*Touch_IngameBlockSelectionScreen_t)(unsigned char *screen); +static Touch_IngameBlockSelectionScreen_t Touch_IngameBlockSelectionScreen = (Touch_IngameBlockSelectionScreen_t) 0x3afbc; + // SelectWorldScreen static Screen_tick_t SelectWorldScreen_tick = (Screen_tick_t) 0x38a2c;