diff --git a/debian/client/common/usr/bin/minecraft-pi b/debian/client/common/usr/bin/minecraft-pi index 6ce02bc..929db96 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')" + 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_USERNAME="$(zenity --class 'Minecraft - Pi edition' --entry --text 'Minecraft Username:' --entry-text 'StevePi')" fi export MCPI_FEATURES diff --git a/mods/src/extra.cpp b/mods/src/extra.cpp index e609176..9ee9128 100644 --- a/mods/src/extra.cpp +++ b/mods/src/extra.cpp @@ -80,6 +80,51 @@ extern "C" { extra_clear_input(); } + typedef unsigned char *(*ItemInstance_t)(unsigned char *item_instance, unsigned char *item); + static ItemInstance_t ItemInstance_item = (ItemInstance_t) 0x9992c; + static ItemInstance_t ItemInstance_tile = (ItemInstance_t) 0x998e4; + + typedef void (*FillingContainer_addItem_t)(unsigned char *filling_container, unsigned char *item_instance); + static FillingContainer_addItem_t FillingContainer_addItem = (FillingContainer_addItem_t) 0x92aa0; + static void *FillingContainer_addItem_original = NULL; + + static void inventory_add_item(unsigned char *inventory, unsigned char *item, bool is_tile) { + unsigned char *item_instance = (unsigned char *) ::operator new(0xc); + item_instance = (*(is_tile ? ItemInstance_tile : ItemInstance_item))(item_instance, item); + (*FillingContainer_addItem)(inventory, item_instance); + } + + // Items + static unsigned char **item_flintAndSteel = (unsigned char **) 0x17ba70; + static unsigned char **item_snowball = (unsigned char **) 0x17bbb0; + static unsigned char **item_shears = (unsigned char **) 0x17bbf0; + static unsigned char **item_sign = (unsigned char **) 0x17bba4; + // Tiles + static unsigned char **tile_water = (unsigned char **) 0x181b3c; + static unsigned char **tile_lava = (unsigned char **) 0x181cc8; + static unsigned char **tile_glowing_obsidian = (unsigned char **) 0x181dcc; + static unsigned char **tile_invisible_bedrock = (unsigned char **) 0x181d94; + + static void FillingContainer_addItem_injection(unsigned char *filling_container, unsigned char *item_instance) { + // Call Original + revert_overwrite((void *) FillingContainer_addItem, FillingContainer_addItem_original); + (*FillingContainer_addItem)(filling_container, item_instance); + revert_overwrite((void *) FillingContainer_addItem, FillingContainer_addItem_original); + + // Add After Sign + if (*(int32_t *) (item_instance + 0x4) == *(int32_t *) (*item_sign + 0x4)) { + // Add Items + inventory_add_item(filling_container, *item_flintAndSteel, false); + inventory_add_item(filling_container, *item_snowball, false); + inventory_add_item(filling_container, *item_shears, false); + // Add Tiles + inventory_add_item(filling_container, *tile_water, true); + inventory_add_item(filling_container, *tile_lava, true); + inventory_add_item(filling_container, *tile_glowing_obsidian, true); + inventory_add_item(filling_container, *tile_invisible_bedrock, true); + } + } + __attribute((constructor)) static void init() { // Implement AppPlatform::readAssetFile So Translations Work overwrite((void *) 0x12b10, (void *) readAssetFile); @@ -89,5 +134,10 @@ extern "C" { patch_address((void *) 0x106460, (void *) openTextEdit); Screen_updateEvents_original = overwrite((void *) Screen_updateEvents, (void *) Screen_updateEvents_injection); } + + if (extra_has_feature("Expand Creative Inventory")) { + // Add Extra Items To Creative Inventory + FillingContainer_addItem_original = overwrite((void *) FillingContainer_addItem, (void *) FillingContainer_addItem_injection); + } } }