diff --git a/debian/client/common/usr/bin/minecraft-pi b/debian/client/common/usr/bin/minecraft-pi index 929db96..31960df 100755 --- a/debian/client/common/usr/bin/minecraft-pi +++ b/debian/client/common/usr/bin/minecraft-pi @@ -4,7 +4,7 @@ set -e # Ensure Features Are Selected if [ -z "${MCPI_SUBSHELL}" ]; then - MCPI_FEATURES="$(zenity --class 'Minecraft - Pi edition' --list --checklist --column 'Enabled' --column 'Feature' TRUE 'Touch GUI' FALSE 'Survival Mode' TRUE 'Fix Bow & Arrow' TRUE 'Fix Attacking' TRUE 'Mob Spawning' TRUE 'Fancy Graphics' TRUE 'Disable Autojump By Default' TRUE 'Fix Sign Placement' TRUE 'Show Block Outlines' FALSE 'Expand Creative Inventory')" + MCPI_FEATURES="$(zenity --class 'Minecraft - Pi edition' --list --checklist --column 'Enabled' --column 'Feature' TRUE 'Touch GUI' FALSE 'Survival Mode' TRUE 'Fix Bow & Arrow' TRUE 'Fix Attacking' TRUE 'Mob Spawning' TRUE 'Fancy Graphics' TRUE 'Disable Autojump By Default' TRUE 'Fix Sign Placement' TRUE 'Show Block Outlines' FALSE 'Expand Creative Inventory' FALSE 'Peaceful Mode')" MCPI_USERNAME="$(zenity --class 'Minecraft - Pi edition' --entry --text 'Minecraft Username:' --entry-text 'StevePi')" fi export MCPI_FEATURES diff --git a/mods/src/extra.c b/mods/src/extra.c index 17f1e81..ced75e3 100644 --- a/mods/src/extra.c +++ b/mods/src/extra.c @@ -116,12 +116,19 @@ static char *get_username() { typedef void (*Minecraft_init_t)(unsigned char *this); static Minecraft_init_t Minecraft_init = (Minecraft_init_t) 0x1700c; +static int fancy_graphics; +static int peaceful_mode; static void Minecraft_init_injection(unsigned char *this) { // Call Original Method (*Minecraft_init)(this); + unsigned char *options = this + 0x3c; // Enable Fancy Graphics - *(this + 83) = 1; + *(options + 0x17) = fancy_graphics; + // Enable Crosshair In Touch GUI + *(options + 0x105) = 1; + // Peaceful Mode + *(int32_t *) (options + 0xe8) = peaceful_mode ? 0 : 2; } // Is Dedicated Server @@ -165,31 +172,23 @@ int extra_get_mode() { } } +static int32_t Minecraft_isTouchscreen(__attribute__((unused)) unsigned char *minecraft) { + return 1; +} + __attribute__((constructor)) static void init() { is_server = extra_get_mode() == 2; if (is_server) { server_init(); } - if (!is_server && extra_has_feature("Touch GUI")) { + int touch_gui = !is_server && extra_has_feature("Touch GUI"); + if (touch_gui) { // Main UI - unsigned char touch_gui_patch[4] = {0x01, 0x00, 0x50, 0xe3}; - patch((void *) 0x292fc, touch_gui_patch); - // Invalid License UI - patch((void *) 0x3a008, touch_gui_patch); - // Disconnection UI - patch((void *) 0x371f0, touch_gui_patch); - // Pause UI - patch((void *) 0x36824, touch_gui_patch); - // Bed UI - patch((void *) 0x336d0, touch_gui_patch); - // Game Mode UI - patch((void *) 0x31474, touch_gui_patch); - // Death UI - patch((void *) 0x3055c, touch_gui_patch); - // Delete UI - unsigned char delete_touch_gui[4] = {0x01, 0x70, 0x50, 0xe2}; - patch((void *) 0x2ad04, delete_touch_gui); + overwrite((void *) 0x1639c, Minecraft_isTouchscreen); + // Force Correct Toolbar Size + unsigned char toolbar_patch[4] = {0x01, 0x00, 0x50, 0xe3}; + patch((void *) 0x257b0, toolbar_patch); } // Dynamic Game Mode Switching @@ -244,10 +243,13 @@ __attribute__((constructor)) static void init() { unsigned char level_size_patch[4] = {0x94, 0x0b, 0x00, 0x00}; patch((void *) 0x17004, level_size_patch); - if (extra_has_feature("Fancy Graphics")) { - // Enable Fancy Graphics - overwrite_calls((void *) Minecraft_init, Minecraft_init_injection); - } + // Enable Fancy Graphics + fancy_graphics = extra_has_feature("Fancy Graphics"); + // Peaceful Mode + peaceful_mode = extra_has_feature("Peaceful Mode"); + + // Set Options + overwrite_calls((void *) Minecraft_init, Minecraft_init_injection); // Allow Connecting To Non-Pi Servers unsigned char server_patch[4] = {0x0f, 0x00, 0x00, 0xea}; @@ -274,9 +276,8 @@ __attribute__((constructor)) static void init() { patch((void *) 0x44b90, autojump_patch); } - if (extra_has_feature("Show Block Outlines")) { - // Show Block Outlines - unsigned char outline_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; - patch((void *) 0x4a214, outline_patch); - } + // Show Block Outlines + int block_outlines = extra_has_feature("Show Block Outlines"); + unsigned char outline_patch[4] = {block_outlines ? touch_gui : !touch_gui, 0xf0, 0x20, 0xe3}; + patch((void *) 0x4a214, outline_patch); }