Port To v0.1.0
This commit is contained in:
parent
9a521ebca2
commit
c4dd7a570a
2
dependencies/minecraft-pi/CMakeLists.txt
vendored
2
dependencies/minecraft-pi/CMakeLists.txt
vendored
@ -7,7 +7,7 @@ include(FetchContent)
|
|||||||
# Download
|
# Download
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
minecraft-pi
|
minecraft-pi
|
||||||
URL "${CMAKE_CURRENT_SOURCE_DIR}/minecraft-pi-0.1.1.tar.gz"
|
URL "${CMAKE_CURRENT_SOURCE_DIR}/minecraft-pi-0.1.0.tar.gz"
|
||||||
)
|
)
|
||||||
FetchContent_Populate(minecraft-pi)
|
FetchContent_Populate(minecraft-pi)
|
||||||
|
|
||||||
|
BIN
dependencies/minecraft-pi/minecraft-pi-0.1.0.tar.gz
vendored
Normal file
BIN
dependencies/minecraft-pi/minecraft-pi-0.1.0.tar.gz
vendored
Normal file
Binary file not shown.
BIN
dependencies/minecraft-pi/minecraft-pi-0.1.1.tar.gz
vendored
BIN
dependencies/minecraft-pi/minecraft-pi-0.1.1.tar.gz
vendored
Binary file not shown.
@ -378,146 +378,6 @@ static void Inventory_setupDefault_FillingContainer_addItem_call_injection(unsig
|
|||||||
bread_instance->id = 297;
|
bread_instance->id = 297;
|
||||||
(*FillingContainer_addItem)(filling_container, bread_instance);
|
(*FillingContainer_addItem)(filling_container, bread_instance);
|
||||||
|
|
||||||
ItemInstance *diamondHelm_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(diamondHelm_instance);
|
|
||||||
diamondHelm_instance->count = 255;
|
|
||||||
diamondHelm_instance->auxiliary = 0;
|
|
||||||
diamondHelm_instance->id = 310;
|
|
||||||
(*FillingContainer_addItem)(filling_container, diamondHelm_instance);
|
|
||||||
|
|
||||||
ItemInstance *diamondChest_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(diamondChest_instance);
|
|
||||||
diamondChest_instance->count = 255;
|
|
||||||
diamondChest_instance->auxiliary = 0;
|
|
||||||
diamondChest_instance->id = 311;
|
|
||||||
(*FillingContainer_addItem)(filling_container, diamondChest_instance);
|
|
||||||
|
|
||||||
ItemInstance *diamondLeg_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(diamondLeg_instance);
|
|
||||||
diamondLeg_instance->count = 255;
|
|
||||||
diamondLeg_instance->auxiliary = 0;
|
|
||||||
diamondLeg_instance->id = 312;
|
|
||||||
(*FillingContainer_addItem)(filling_container, diamondLeg_instance);
|
|
||||||
|
|
||||||
ItemInstance *diamondBoot_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(diamondBoot_instance);
|
|
||||||
diamondBoot_instance->count = 255;
|
|
||||||
diamondBoot_instance->auxiliary = 0;
|
|
||||||
diamondBoot_instance->id = 313;
|
|
||||||
(*FillingContainer_addItem)(filling_container, diamondBoot_instance);
|
|
||||||
|
|
||||||
ItemInstance *leatherCap_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(leatherCap_instance);
|
|
||||||
leatherCap_instance->count = 255;
|
|
||||||
leatherCap_instance->auxiliary = 0;
|
|
||||||
leatherCap_instance->id = 298;
|
|
||||||
(*FillingContainer_addItem)(filling_container, leatherCap_instance);
|
|
||||||
|
|
||||||
ItemInstance *leatherShirt_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(leatherShirt_instance);
|
|
||||||
leatherShirt_instance->count = 255;
|
|
||||||
leatherShirt_instance->auxiliary = 0;
|
|
||||||
leatherShirt_instance->id = 299;
|
|
||||||
(*FillingContainer_addItem)(filling_container, leatherShirt_instance);
|
|
||||||
|
|
||||||
ItemInstance *leatherPants_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(leatherPants_instance);
|
|
||||||
leatherPants_instance->count = 255;
|
|
||||||
leatherPants_instance->auxiliary = 0;
|
|
||||||
leatherPants_instance->id = 300;
|
|
||||||
(*FillingContainer_addItem)(filling_container, leatherPants_instance);
|
|
||||||
|
|
||||||
ItemInstance *leatherBoots_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(leatherBoots_instance);
|
|
||||||
leatherBoots_instance->count = 255;
|
|
||||||
leatherBoots_instance->auxiliary = 0;
|
|
||||||
leatherBoots_instance->id = 301;
|
|
||||||
(*FillingContainer_addItem)(filling_container, leatherBoots_instance);
|
|
||||||
|
|
||||||
ItemInstance *chainHelm_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(chainHelm_instance);
|
|
||||||
chainHelm_instance->count = 255;
|
|
||||||
chainHelm_instance->auxiliary = 0;
|
|
||||||
chainHelm_instance->id = 302;
|
|
||||||
(*FillingContainer_addItem)(filling_container, chainHelm_instance);
|
|
||||||
|
|
||||||
ItemInstance *chainShirt_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(chainShirt_instance);
|
|
||||||
chainShirt_instance->count = 255;
|
|
||||||
chainShirt_instance->auxiliary = 0;
|
|
||||||
chainShirt_instance->id = 303;
|
|
||||||
(*FillingContainer_addItem)(filling_container, chainShirt_instance);
|
|
||||||
|
|
||||||
ItemInstance *chainLegs_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(chainLegs_instance);
|
|
||||||
chainLegs_instance->count = 255;
|
|
||||||
chainLegs_instance->auxiliary = 0;
|
|
||||||
chainLegs_instance->id = 304;
|
|
||||||
(*FillingContainer_addItem)(filling_container, chainLegs_instance);
|
|
||||||
|
|
||||||
ItemInstance *chainBoots_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(chainBoots_instance);
|
|
||||||
chainBoots_instance->count = 255;
|
|
||||||
chainBoots_instance->auxiliary = 0;
|
|
||||||
chainBoots_instance->id = 305;
|
|
||||||
(*FillingContainer_addItem)(filling_container, chainBoots_instance);
|
|
||||||
|
|
||||||
ItemInstance *goldHelm_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(goldHelm_instance);
|
|
||||||
goldHelm_instance->count = 255;
|
|
||||||
goldHelm_instance->auxiliary = 0;
|
|
||||||
goldHelm_instance->id = 314;
|
|
||||||
(*FillingContainer_addItem)(filling_container, goldHelm_instance);
|
|
||||||
|
|
||||||
ItemInstance *goldChest_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(goldChest_instance);
|
|
||||||
goldChest_instance->count = 255;
|
|
||||||
goldChest_instance->auxiliary = 0;
|
|
||||||
goldChest_instance->id = 315;
|
|
||||||
(*FillingContainer_addItem)(filling_container, goldChest_instance);
|
|
||||||
|
|
||||||
ItemInstance *goldLegs_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(goldLegs_instance);
|
|
||||||
goldLegs_instance->count = 255;
|
|
||||||
goldLegs_instance->auxiliary = 0;
|
|
||||||
goldLegs_instance->id = 316;
|
|
||||||
(*FillingContainer_addItem)(filling_container, goldLegs_instance);
|
|
||||||
|
|
||||||
ItemInstance *goldBoots_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(goldBoots_instance);
|
|
||||||
goldBoots_instance->count = 255;
|
|
||||||
goldBoots_instance->auxiliary = 0;
|
|
||||||
goldBoots_instance->id = 317;
|
|
||||||
(*FillingContainer_addItem)(filling_container, goldBoots_instance);
|
|
||||||
|
|
||||||
ItemInstance *ironHelm_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(ironHelm_instance);
|
|
||||||
ironHelm_instance->count = 255;
|
|
||||||
ironHelm_instance->auxiliary = 0;
|
|
||||||
ironHelm_instance->id = 306;
|
|
||||||
(*FillingContainer_addItem)(filling_container, ironHelm_instance);
|
|
||||||
|
|
||||||
ItemInstance *ironChest_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(ironChest_instance);
|
|
||||||
ironChest_instance->count = 255;
|
|
||||||
ironChest_instance->auxiliary = 0;
|
|
||||||
ironChest_instance->id = 307;
|
|
||||||
(*FillingContainer_addItem)(filling_container, ironChest_instance);
|
|
||||||
|
|
||||||
ItemInstance *ironLegs_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(ironLegs_instance);
|
|
||||||
ironLegs_instance->count = 255;
|
|
||||||
ironLegs_instance->auxiliary = 0;
|
|
||||||
ironLegs_instance->id = 308;
|
|
||||||
(*FillingContainer_addItem)(filling_container, ironLegs_instance);
|
|
||||||
|
|
||||||
ItemInstance *ironBoots_instance = new ItemInstance;
|
|
||||||
ALLOC_CHECK(ironBoots_instance);
|
|
||||||
ironBoots_instance->count = 255;
|
|
||||||
ironBoots_instance->auxiliary = 0;
|
|
||||||
ironBoots_instance->id = 309;
|
|
||||||
(*FillingContainer_addItem)(filling_container, ironBoots_instance);
|
|
||||||
|
|
||||||
ItemInstance *flint2_instance = new ItemInstance;
|
ItemInstance *flint2_instance = new ItemInstance;
|
||||||
ALLOC_CHECK(flint2_instance);
|
ALLOC_CHECK(flint2_instance);
|
||||||
flint2_instance->count = 255;
|
flint2_instance->count = 255;
|
||||||
|
BIN
images/start.png
BIN
images/start.png
Binary file not shown.
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 169 KiB |
@ -1,16 +1,17 @@
|
|||||||
FALSE Full Touch GUI
|
FALSE Full Touch GUI
|
||||||
TRUE Fix Bow & Arrow
|
|
||||||
TRUE Fix Attacking
|
TRUE Fix Attacking
|
||||||
FALSE Force Mob Spawning
|
FALSE Force Mob Spawning
|
||||||
|
TRUE Fancy Graphics
|
||||||
TRUE Disable Autojump By Default
|
TRUE Disable Autojump By Default
|
||||||
TRUE Display Nametags By Default
|
TRUE Display Nametags By Default
|
||||||
TRUE Fix Sign Placement
|
|
||||||
TRUE Show Block Outlines
|
TRUE Show Block Outlines
|
||||||
FALSE Expand Creative Inventory
|
FALSE Expand Creative Inventory
|
||||||
FALSE Remove Creative Mode Restrictions
|
FALSE Remove Creative Mode Restrictions
|
||||||
|
FALSE Peaceful Mode
|
||||||
TRUE Animated Water
|
TRUE Animated Water
|
||||||
TRUE Remove Invalid Item Background
|
TRUE Remove Invalid Item Background
|
||||||
TRUE Disable "gui_blocks" Atlas
|
TRUE Disable "gui_blocks" Atlas
|
||||||
|
TRUE Smooth Lighting
|
||||||
FALSE 3D Anaglyph
|
FALSE 3D Anaglyph
|
||||||
TRUE Fix Camera Rendering
|
TRUE Fix Camera Rendering
|
||||||
TRUE Implement Chat
|
TRUE Implement Chat
|
||||||
@ -28,9 +29,9 @@ TRUE Implement Sound Engine
|
|||||||
TRUE Close Current Screen On Death
|
TRUE Close Current Screen On Death
|
||||||
FALSE Disable Raw Mouse Motion (Not Recommended)
|
FALSE Disable Raw Mouse Motion (Not Recommended)
|
||||||
TRUE Fix Furnace Not Checking Item Auxiliary
|
TRUE Fix Furnace Not Checking Item Auxiliary
|
||||||
|
FALSE Disable Hosting LAN Worlds
|
||||||
TRUE Improved Cursor Rendering
|
TRUE Improved Cursor Rendering
|
||||||
TRUE Disable V-Sync
|
TRUE Disable V-Sync
|
||||||
TRUE Fix Options Screen
|
|
||||||
TRUE Force Touch GUI Inventory
|
TRUE Force Touch GUI Inventory
|
||||||
TRUE Fix Pause Menu
|
TRUE Fix Pause Menu
|
||||||
TRUE Improved Title Background
|
TRUE Improved Title Background
|
||||||
|
@ -20,7 +20,7 @@ if(NOT MCPI_HEADLESS_MODE)
|
|||||||
target_link_libraries(compat screenshot)
|
target_link_libraries(compat screenshot)
|
||||||
endif()
|
endif()
|
||||||
if(NOT MCPI_SERVER_MODE)
|
if(NOT MCPI_SERVER_MODE)
|
||||||
target_link_libraries(compat input sign chat home dl)
|
target_link_libraries(compat input chat home dl)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(readdir SHARED src/readdir/readdir.c)
|
add_library(readdir SHARED src/readdir/readdir.c)
|
||||||
@ -62,12 +62,9 @@ else()
|
|||||||
target_link_libraries(camera screenshot)
|
target_link_libraries(camera screenshot)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(input SHARED src/input/input.cpp src/input/bow.c src/input/attack.c src/input/toggle.c src/input/misc.c src/input/drop.cpp)
|
add_library(input SHARED src/input/input.cpp src/input/attack.c src/input/toggle.c src/input/misc.c src/input/drop.cpp)
|
||||||
target_link_libraries(input mods-headers reborn-patch symbols creative feature misc media-layer-core)
|
target_link_libraries(input mods-headers reborn-patch symbols creative feature misc media-layer-core)
|
||||||
|
|
||||||
add_library(sign SHARED src/sign/sign.cpp)
|
|
||||||
target_link_libraries(sign mods-headers reborn-patch symbols feature input media-layer-core)
|
|
||||||
|
|
||||||
add_library(touch SHARED src/touch/touch.cpp)
|
add_library(touch SHARED src/touch/touch.cpp)
|
||||||
target_link_libraries(touch mods-headers reborn-patch symbols feature)
|
target_link_libraries(touch mods-headers reborn-patch symbols feature)
|
||||||
|
|
||||||
@ -90,8 +87,8 @@ target_link_libraries(death mods-headers reborn-patch symbols feature)
|
|||||||
add_library(misc SHARED src/misc/misc.c src/misc/misc.cpp src/misc/logging.cpp src/misc/api.cpp)
|
add_library(misc SHARED src/misc/misc.c src/misc/misc.cpp src/misc/logging.cpp src/misc/api.cpp)
|
||||||
target_link_libraries(misc mods-headers reborn-patch symbols media-layer-core feature)
|
target_link_libraries(misc mods-headers reborn-patch symbols media-layer-core feature)
|
||||||
|
|
||||||
add_library(options SHARED src/options/options.c src/options/options.cpp)
|
add_library(options SHARED src/options/options.c)
|
||||||
target_link_libraries(options mods-headers reborn-patch symbols feature home)
|
target_link_libraries(options mods-headers reborn-patch symbols feature)
|
||||||
|
|
||||||
add_library(bucket SHARED src/bucket/bucket.cpp)
|
add_library(bucket SHARED src/bucket/bucket.cpp)
|
||||||
target_link_libraries(bucket mods-headers reborn-patch symbols feature misc)
|
target_link_libraries(bucket mods-headers reborn-patch symbols feature misc)
|
||||||
@ -112,7 +109,7 @@ target_link_libraries(init mods-headers reborn-util compat game-mode misc death
|
|||||||
if(MCPI_SERVER_MODE)
|
if(MCPI_SERVER_MODE)
|
||||||
target_link_libraries(init server)
|
target_link_libraries(init server)
|
||||||
else()
|
else()
|
||||||
target_link_libraries(init multiplayer sound camera input sign touch textures atlas benchmark)
|
target_link_libraries(init multiplayer sound camera input touch textures atlas benchmark)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
## Install Mods
|
## Install Mods
|
||||||
@ -120,7 +117,7 @@ set(MODS_TO_INSTALL init compat readdir feature game-mode misc override death op
|
|||||||
if(MCPI_SERVER_MODE)
|
if(MCPI_SERVER_MODE)
|
||||||
list(APPEND MODS_TO_INSTALL server)
|
list(APPEND MODS_TO_INSTALL server)
|
||||||
else()
|
else()
|
||||||
list(APPEND MODS_TO_INSTALL multiplayer sound camera input sign touch textures atlas benchmark)
|
list(APPEND MODS_TO_INSTALL multiplayer sound camera input touch textures atlas benchmark)
|
||||||
endif()
|
endif()
|
||||||
if(NOT MCPI_HEADLESS_MODE)
|
if(NOT MCPI_HEADLESS_MODE)
|
||||||
list(APPEND MODS_TO_INSTALL screenshot)
|
list(APPEND MODS_TO_INSTALL screenshot)
|
||||||
|
@ -15,7 +15,6 @@ void init_server();
|
|||||||
void init_multiplayer();
|
void init_multiplayer();
|
||||||
void init_sound();
|
void init_sound();
|
||||||
void init_input();
|
void init_input();
|
||||||
void init_sign();
|
|
||||||
void init_creative();
|
void init_creative();
|
||||||
void init_camera();
|
void init_camera();
|
||||||
void init_touch();
|
void init_touch();
|
||||||
|
@ -7,7 +7,6 @@ extern "C" {
|
|||||||
typedef void (*input_tick_function_t)(unsigned char *minecraft);
|
typedef void (*input_tick_function_t)(unsigned char *minecraft);
|
||||||
void input_run_on_tick(input_tick_function_t function);
|
void input_run_on_tick(input_tick_function_t function);
|
||||||
|
|
||||||
void input_set_is_right_click(int val);
|
|
||||||
void input_hide_gui();
|
void input_hide_gui();
|
||||||
void input_third_person();
|
void input_third_person();
|
||||||
int input_back();
|
int input_back();
|
||||||
|
@ -15,6 +15,7 @@ void misc_run_on_recipes_setup(misc_update_function_t function); // obj == Recip
|
|||||||
void misc_run_on_furnace_recipes_setup(misc_update_function_t function); // obj == FurnaceRecipes *
|
void misc_run_on_furnace_recipes_setup(misc_update_function_t function); // obj == FurnaceRecipes *
|
||||||
void misc_run_on_creative_inventory_setup(misc_update_function_t function); // obj == FillingContainer *
|
void misc_run_on_creative_inventory_setup(misc_update_function_t function); // obj == FillingContainer *
|
||||||
void misc_run_on_tiles_setup(misc_update_function_t function); // obj == NULL
|
void misc_run_on_tiles_setup(misc_update_function_t function); // obj == NULL
|
||||||
|
void misc_run_on_internal_after_tiles_setup(misc_update_function_t function); // obj == NULL
|
||||||
void misc_run_on_items_setup(misc_update_function_t function); // obj == NULL
|
void misc_run_on_items_setup(misc_update_function_t function); // obj == NULL
|
||||||
|
|
||||||
void Level_saveLevelData_injection(unsigned char *level);
|
void Level_saveLevelData_injection(unsigned char *level);
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void sign_key_press(char key);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -57,9 +57,9 @@ static void Tesselator_color_injection(unsigned char *tesselator, int32_t r, int
|
|||||||
// Call Original Method
|
// Call Original Method
|
||||||
(*Tesselator_color)(tesselator, r, g, b, a);
|
(*Tesselator_color)(tesselator, r, g, b, a);
|
||||||
}
|
}
|
||||||
static void Tesselator_begin_injection(unsigned char *tesselator, int32_t mode) {
|
static void Tesselator_begin_injection(unsigned char *tesselator) {
|
||||||
// Call Original Method
|
// Call Original Method
|
||||||
(*Tesselator_begin)(tesselator, mode);
|
(*Tesselator_begin)(tesselator);
|
||||||
|
|
||||||
// Fix Furnace UI
|
// Fix Furnace UI
|
||||||
if (item_color_fix_mode != 0) {
|
if (item_color_fix_mode != 0) {
|
||||||
@ -96,14 +96,14 @@ void init_atlas() {
|
|||||||
|
|
||||||
// Disable The gui_blocks Atlas Which Contains Pre-Rendered Textures For Blocks In The Inventory
|
// Disable The gui_blocks Atlas Which Contains Pre-Rendered Textures For Blocks In The Inventory
|
||||||
if (feature_has("Disable \"gui_blocks\" Atlas", server_disabled)) {
|
if (feature_has("Disable \"gui_blocks\" Atlas", server_disabled)) {
|
||||||
unsigned char disable_gui_blocks_atlas_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
unsigned char disable_gui_blocks_atlas_patch[4] = {0x45, 0x00, 0x00, 0xea}; // "b 0x7f740"
|
||||||
patch((void *) 0x63c2c, disable_gui_blocks_atlas_patch);
|
patch((void *) 0x7f624, disable_gui_blocks_atlas_patch);
|
||||||
// Fix Grass And Leaves Inventory Rendering When The gui_blocks Atlas Is Disabled
|
// Fix Grass And Leaves Inventory Rendering When The gui_blocks Atlas Is Disabled
|
||||||
overwrite_calls((void *) ItemRenderer_renderGuiItemCorrect, (void *) ItemRenderer_renderGuiItemCorrect_injection);
|
overwrite_calls((void *) ItemRenderer_renderGuiItemCorrect, (void *) ItemRenderer_renderGuiItemCorrect_injection);
|
||||||
// Fix Furnace UI
|
// Fix Furnace UI
|
||||||
overwrite_calls((void *) Tesselator_begin, (void *) Tesselator_begin_injection);
|
overwrite_calls((void *) Tesselator_begin, (void *) Tesselator_begin_injection);
|
||||||
overwrite_calls((void *) Tesselator_color, (void *) Tesselator_color_injection);
|
overwrite_calls((void *) Tesselator_color, (void *) Tesselator_color_injection);
|
||||||
overwrite_call((void *) 0x32324, (void *) FurnaceScreen_render_ItemRenderer_renderGuiItem_one_injection);
|
overwrite_call((void *) 0x3bff4, (void *) FurnaceScreen_render_ItemRenderer_renderGuiItem_one_injection);
|
||||||
overwrite_call((void *) 0x1e21c, (void *) InventoryPane_renderBatch_Tesselator_color_injection);
|
overwrite_call((void *) 0x23c0c, (void *) InventoryPane_renderBatch_Tesselator_color_injection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ static unsigned char *create_bucket(int32_t id, int32_t texture_x, int32_t textu
|
|||||||
// Construct
|
// Construct
|
||||||
unsigned char *item = (unsigned char *) ::operator new(ITEM_SIZE);
|
unsigned char *item = (unsigned char *) ::operator new(ITEM_SIZE);
|
||||||
ALLOC_CHECK(item);
|
ALLOC_CHECK(item);
|
||||||
(*Item)(item, id);
|
new ((std::string *) (item + Item_description_id_property_offset)) std::string;
|
||||||
|
|
||||||
// Set VTable
|
// Set VTable
|
||||||
*(unsigned char **) item = get_bucket_vtable();
|
*(unsigned char **) item = get_bucket_vtable();
|
||||||
@ -160,10 +160,16 @@ static unsigned char *create_bucket(int32_t id, int32_t texture_x, int32_t textu
|
|||||||
// Setup
|
// Setup
|
||||||
(*Item_setIcon)(item, texture_x, texture_y);
|
(*Item_setIcon)(item, texture_x, texture_y);
|
||||||
(*Item_setDescriptionId)(item, name);
|
(*Item_setDescriptionId)(item, name);
|
||||||
|
*(int32_t *) (item + Item_id_property_offset) = id + 0x100;
|
||||||
*(int32_t *) (item + Item_is_stacked_by_data_property_offset) = 1;
|
*(int32_t *) (item + Item_is_stacked_by_data_property_offset) = 1;
|
||||||
*(int32_t *) (item + Item_category_property_offset) = 2;
|
*(int32_t *) (item + Item_is_hand_equipped_property_offset) = 0;
|
||||||
|
*(int32_t *) (item + Item_category_property_offset) = 1;
|
||||||
*(int32_t *) (item + Item_max_damage_property_offset) = 0;
|
*(int32_t *) (item + Item_max_damage_property_offset) = 0;
|
||||||
*(int32_t *) (item + Item_max_stack_size_property_offset) = 1;
|
*(int32_t *) (item + Item_max_stack_size_property_offset) = 16;
|
||||||
|
*(unsigned char **) (item + Item_crafting_remaining_item_property_offset) = NULL;
|
||||||
|
|
||||||
|
// Register
|
||||||
|
Item_items[*(int32_t *) (item + Item_id_property_offset)] = item;
|
||||||
|
|
||||||
// Return
|
// Return
|
||||||
return item;
|
return item;
|
||||||
@ -174,9 +180,9 @@ static void Item_initItems_injection(__attribute__((unused)) unsigned char *null
|
|||||||
|
|
||||||
// Change Max Stack Size Based On Auxiliary
|
// Change Max Stack Size Based On Auxiliary
|
||||||
static int32_t ItemInstance_getMaxStackSize_injection(ItemInstance *item_instance) {
|
static int32_t ItemInstance_getMaxStackSize_injection(ItemInstance *item_instance) {
|
||||||
if (item_instance->id == *(int32_t *) (bucket + Item_id_property_offset) && item_instance->auxiliary == 0) {
|
if (item_instance->id == *(int32_t *) (bucket + Item_id_property_offset) && item_instance->auxiliary != 0) {
|
||||||
// Custom Value
|
// Custom Value
|
||||||
return 16;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
// Call Original Method
|
// Call Original Method
|
||||||
return (*ItemInstance_getMaxStackSize)(item_instance);
|
return (*ItemInstance_getMaxStackSize)(item_instance);
|
||||||
@ -300,7 +306,7 @@ void init_bucket() {
|
|||||||
// Creative Inventory
|
// Creative Inventory
|
||||||
misc_run_on_creative_inventory_setup(Inventory_setupDefault_FillingContainer_addItem_call_injection);
|
misc_run_on_creative_inventory_setup(Inventory_setupDefault_FillingContainer_addItem_call_injection);
|
||||||
// Make Liquids Selectable
|
// Make Liquids Selectable
|
||||||
overwrite_call((void *) 0x7f5b0, (void *) Mob_pick_Level_clip_injection);
|
overwrite_call((void *) 0xab594, (void *) Mob_pick_Level_clip_injection);
|
||||||
misc_run_on_tick(handle_tick);
|
misc_run_on_tick(handle_tick);
|
||||||
// Prevent Breaking Liquid
|
// Prevent Breaking Liquid
|
||||||
overwrite_calls((void *) Minecraft_handleMouseDown, (void *) Minecraft_handleMouseDown_injection);
|
overwrite_calls((void *) Minecraft_handleMouseDown, (void *) Minecraft_handleMouseDown_injection);
|
||||||
@ -308,6 +314,6 @@ void init_bucket() {
|
|||||||
misc_run_on_recipes_setup(Recipes_injection);
|
misc_run_on_recipes_setup(Recipes_injection);
|
||||||
// Custom Furnace Fuel
|
// Custom Furnace Fuel
|
||||||
overwrite_calls((void *) FurnaceTileEntity_getBurnDuration, (void *) FurnaceTileEntity_getBurnDuration_injection);
|
overwrite_calls((void *) FurnaceTileEntity_getBurnDuration, (void *) FurnaceTileEntity_getBurnDuration_injection);
|
||||||
overwrite_call((void *) 0xd351c, (void *) FurnaceTileEntity_tick_ItemInstance_setNull_injection);
|
overwrite_call((void *) 0x14048c, (void *) FurnaceTileEntity_tick_ItemInstance_setNull_injection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,6 +43,6 @@ void init_camera() {
|
|||||||
// Enable TripodCameraRenderer
|
// Enable TripodCameraRenderer
|
||||||
overwrite_calls((void *) EntityRenderDispatcher, (void *) EntityRenderDispatcher_injection);
|
overwrite_calls((void *) EntityRenderDispatcher, (void *) EntityRenderDispatcher_injection);
|
||||||
// Display Smoke From TripodCamera Higher
|
// Display Smoke From TripodCamera Higher
|
||||||
overwrite_call((void *) 0x87dc4, (void *) TripodCamera_tick_Level_addParticle_call_injection);
|
overwrite_call((void *) 0xbcf18, (void *) TripodCamera_tick_Level_addParticle_call_injection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,8 @@ static void CommandServer_parse_CommandServer_dispatchPacket_injection(unsigned
|
|||||||
|
|
||||||
// Handle ChatPacket Server-Side
|
// Handle ChatPacket Server-Side
|
||||||
static void ServerSideNetworkHandler_handle_ChatPacket_injection(unsigned char *server_side_network_handler, RakNet_RakNetGUID *rak_net_guid, unsigned char *chat_packet) {
|
static void ServerSideNetworkHandler_handle_ChatPacket_injection(unsigned char *server_side_network_handler, RakNet_RakNetGUID *rak_net_guid, unsigned char *chat_packet) {
|
||||||
unsigned char *player = (*ServerSideNetworkHandler_getPlayer)(server_side_network_handler, rak_net_guid);
|
unsigned char *level = *(unsigned char **) (server_side_network_handler + ServerSideNetworkHandler_level_property_offset);
|
||||||
|
unsigned char *player = (*NetEventCallback_findPlayer)(server_side_network_handler, level, rak_net_guid);
|
||||||
if (player != NULL) {
|
if (player != NULL) {
|
||||||
char *username = *(char **) (player + Player_username_property_offset);
|
char *username = *(char **) (player + Player_username_property_offset);
|
||||||
char *message = *(char **) (chat_packet + ChatPacket_message_property_offset);
|
char *message = *(char **) (chat_packet + ChatPacket_message_property_offset);
|
||||||
@ -138,9 +139,9 @@ void init_chat() {
|
|||||||
if (_chat_enabled) {
|
if (_chat_enabled) {
|
||||||
// Disable Original ChatPacket Loopback
|
// Disable Original ChatPacket Loopback
|
||||||
unsigned char disable_chat_packet_loopback_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
unsigned char disable_chat_packet_loopback_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
||||||
patch((void *) 0x6b490, disable_chat_packet_loopback_patch);
|
patch((void *) 0x8c118, disable_chat_packet_loopback_patch);
|
||||||
// Manually Send (And Loopback) ChatPacket
|
// Manually Send (And Loopback) ChatPacket
|
||||||
overwrite_call((void *) 0x6b518, (void *) CommandServer_parse_CommandServer_dispatchPacket_injection);
|
overwrite_call((void *) 0x8c1a4, (void *) CommandServer_parse_CommandServer_dispatchPacket_injection);
|
||||||
// Re-Broadcast ChatPacket
|
// Re-Broadcast ChatPacket
|
||||||
patch_address(ServerSideNetworkHandler_handle_ChatPacket_vtable_addr, (void *) ServerSideNetworkHandler_handle_ChatPacket_injection);
|
patch_address(ServerSideNetworkHandler_handle_ChatPacket_vtable_addr, (void *) ServerSideNetworkHandler_handle_ChatPacket_injection);
|
||||||
// Send Messages On Input Tick
|
// Send Messages On Input Tick
|
||||||
|
@ -8,11 +8,11 @@ static void do_nothing() {
|
|||||||
// Patch bcm_host Calls
|
// Patch bcm_host Calls
|
||||||
__attribute__((constructor)) static void patch_bcm_host_calls() {
|
__attribute__((constructor)) static void patch_bcm_host_calls() {
|
||||||
// Disable bcm_host Calls
|
// Disable bcm_host Calls
|
||||||
overwrite_call((void *) 0xdfec, (void *) do_nothing); // bcm_host_init
|
overwrite_call((void *) 0xdbe8, (void *) do_nothing); // bcm_host_init
|
||||||
overwrite_call((void *) 0x12418, (void *) do_nothing); // bcm_host_deinit
|
overwrite_call((void *) 0x11c54, (void *) do_nothing); // bcm_host_deinit
|
||||||
overwrite_call((void *) 0x125a8, (void *) do_nothing); // graphics_get_display_size
|
overwrite_call((void *) 0x11de4, (void *) do_nothing); // graphics_get_display_size
|
||||||
overwrite_call((void *) 0x125dc, (void *) do_nothing); // vc_dispmanx_display_open
|
overwrite_call((void *) 0x11e18, (void *) do_nothing); // vc_dispmanx_display_open
|
||||||
overwrite_call((void *) 0x125e8, (void *) do_nothing); // vc_dispmanx_update_start
|
overwrite_call((void *) 0x11e28, (void *) do_nothing); // vc_dispmanx_update_start
|
||||||
overwrite_call((void *) 0x12618, (void *) do_nothing); // vc_dispmanx_element_add
|
overwrite_call((void *) 0x11e58, (void *) do_nothing); // vc_dispmanx_element_add
|
||||||
overwrite_call((void *) 0x12624, (void *) do_nothing); // vc_dispmanx_update_submit_sync
|
overwrite_call((void *) 0x11e64, (void *) do_nothing); // vc_dispmanx_update_submit_sync
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,6 @@ HOOK(SDL_ShowCursor, int, (int toggle)) {
|
|||||||
#include <media-layer/core.h>
|
#include <media-layer/core.h>
|
||||||
|
|
||||||
#include <mods/input/input.h>
|
#include <mods/input/input.h>
|
||||||
#include <mods/sign/sign.h>
|
|
||||||
#include <mods/chat/chat.h>
|
#include <mods/chat/chat.h>
|
||||||
#include <mods/home/home.h>
|
#include <mods/home/home.h>
|
||||||
|
|
||||||
@ -89,20 +88,12 @@ HOOK(SDL_PollEvent, int, (SDL_Event *event)) {
|
|||||||
}
|
}
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
case SDL_MOUSEBUTTONUP: {
|
case SDL_MOUSEBUTTONUP: {
|
||||||
// Track Right-Click State
|
// Track Left-Click State
|
||||||
if (event->button.button == SDL_BUTTON_RIGHT) {
|
if (event->button.button == SDL_BUTTON_LEFT) {
|
||||||
input_set_is_right_click(event->button.state != SDL_RELEASED);
|
|
||||||
} else if (event->button.button == SDL_BUTTON_LEFT) {
|
|
||||||
input_set_is_left_click(event->button.state != SDL_RELEASED);
|
input_set_is_left_click(event->button.state != SDL_RELEASED);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SDL_USEREVENT: {
|
|
||||||
// SDL_UserEvent Is Never Used In MCPI, So It Is Repurposed For Character Events
|
|
||||||
sign_key_press((char) event->user.code);
|
|
||||||
handled = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handled) {
|
if (handled) {
|
||||||
|
@ -23,17 +23,17 @@ static EGLBoolean eglSwapBuffers_injection(__attribute__((unused)) EGLDisplay di
|
|||||||
__attribute__((constructor)) static void patch_egl_calls() {
|
__attribute__((constructor)) static void patch_egl_calls() {
|
||||||
// Disable EGL Calls
|
// Disable EGL Calls
|
||||||
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
||||||
patch((void *) 0x1250c, nop_patch); // eglTerminate
|
patch((void *) 0x11d3c, nop_patch); // eglTerminate
|
||||||
patch((void *) 0x12580, nop_patch); // eglBindAPI
|
patch((void *) 0x11dbc, nop_patch); // eglBindAPI
|
||||||
overwrite_call((void *) 0x12638, (void *) eglCreateWindowSurface_injection); // eglCreateWindowSurface
|
overwrite_call((void *) 0x11e78, (void *) eglCreateWindowSurface_injection); // eglCreateWindowSurface
|
||||||
patch((void *) 0x12578, nop_patch); // eglChooseConfig
|
patch((void *) 0x11db4, nop_patch); // eglChooseConfig
|
||||||
patch((void *) 0x1255c, nop_patch); // eglInitialize
|
patch((void *) 0x11d98, nop_patch); // eglInitialize
|
||||||
patch((void *) 0x124f0, nop_patch); // eglMakeCurrent #1
|
patch((void *) 0x11d20, nop_patch); // eglMakeCurrent #1
|
||||||
patch((void *) 0x12654, nop_patch); // eglMakeCurrent #2
|
patch((void *) 0x11e90, nop_patch); // eglMakeCurrent #2
|
||||||
overwrite_call((void *) 0x124dc, (void *) eglSwapBuffers_injection); // eglSwapBuffers #1
|
overwrite_call((void *) 0x11d0c, (void *) eglSwapBuffers_injection); // eglSwapBuffers #1
|
||||||
overwrite_call((void *) 0x14b6c, (void *) eglSwapBuffers_injection); // eglSwapBuffers #2
|
overwrite_call((void *) 0x14ce4, (void *) eglSwapBuffers_injection); // eglSwapBuffers #2
|
||||||
overwrite_call((void *) 0x1254c, (void *) eglGetDisplay_injection); // eglGetDisplay
|
overwrite_call((void *) 0x11d7c, (void *) eglGetDisplay_injection); // eglGetDisplay
|
||||||
patch((void *) 0x124fc, nop_patch); // eglDestroySurface #1
|
patch((void *) 0x11d2c, nop_patch); // eglDestroySurface #1
|
||||||
patch((void *) 0x12504, nop_patch); // eglDestroySurface #2
|
patch((void *) 0x11d34, nop_patch); // eglDestroySurface #2
|
||||||
overwrite_call((void *) 0x12594, (void *) eglCreateContext_injection); // eglCreateContext
|
overwrite_call((void *) 0x11dd0, (void *) eglCreateContext_injection); // eglCreateContext
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,6 @@ static int XGetWindowAttributes_injection(__attribute__((unused)) void *display,
|
|||||||
// Patch X11 Calls
|
// Patch X11 Calls
|
||||||
__attribute__((constructor)) static void patch_x11_calls() {
|
__attribute__((constructor)) static void patch_x11_calls() {
|
||||||
// Disable X11 Calls
|
// Disable X11 Calls
|
||||||
overwrite_call((void *) 0x132a4, (void *) XGetWindowAttributes_injection); // XGetWindowAttributes
|
overwrite_call((void *) 0x12f2c, (void *) XGetWindowAttributes_injection); // XGetWindowAttributes
|
||||||
overwrite_call((void *) 0x132d4, (void *) XTranslateCoordinates_injection); // XTranslateCoordinates
|
overwrite_call((void *) 0x12f64, (void *) XTranslateCoordinates_injection); // XTranslateCoordinates
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <libreborn/libreborn.h>
|
#include <libreborn/libreborn.h>
|
||||||
#include <symbols/minecraft.h>
|
#include <symbols/minecraft.h>
|
||||||
|
|
||||||
@ -37,7 +39,6 @@ static void Inventory_setupDefault_FillingContainer_addItem_call_injection(unsig
|
|||||||
// Add Tiles
|
// Add Tiles
|
||||||
inventory_add_item(filling_container, *Tile_water, true);
|
inventory_add_item(filling_container, *Tile_water, true);
|
||||||
inventory_add_item(filling_container, *Tile_lava, true);
|
inventory_add_item(filling_container, *Tile_lava, true);
|
||||||
inventory_add_item(filling_container, *Tile_calmWater, true);
|
|
||||||
inventory_add_item(filling_container, *Tile_calmLava, true);
|
inventory_add_item(filling_container, *Tile_calmLava, true);
|
||||||
inventory_add_item(filling_container, *Tile_glowingObsidian, true);
|
inventory_add_item(filling_container, *Tile_glowingObsidian, true);
|
||||||
inventory_add_item(filling_container, *Tile_web, true);
|
inventory_add_item(filling_container, *Tile_web, true);
|
||||||
@ -79,20 +80,36 @@ static void Inventory_setupDefault_FillingContainer_addItem_call_injection(unsig
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Hook Specific TileItem Constructor
|
// Store All Default TileItems
|
||||||
static unsigned char *Tile_initTiles_TileItem_injection(unsigned char *tile_item, int32_t id) {
|
static std::vector<unsigned char *> &get_default_tile_items() {
|
||||||
|
static std::vector<unsigned char *> tile_items;
|
||||||
|
return tile_items;
|
||||||
|
}
|
||||||
|
// Hook Specific TileItem :;operator new
|
||||||
|
static unsigned char *Tile_initTiles_operator_new_injection(__attribute__((unused)) uint32_t size) {
|
||||||
// Call Original Method
|
// Call Original Method
|
||||||
unsigned char *ret = (*TileItem)(tile_item, id);
|
unsigned char *ret = (unsigned char *) ::operator new(AUX_DATA_TILE_ITEM_SIZE);
|
||||||
|
|
||||||
|
// Store
|
||||||
|
get_default_tile_items().push_back(ret);
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
// Modify All Default TileItems
|
||||||
|
static void Tile_initTiles_injection(__attribute__((unused)) unsigned char *null) {
|
||||||
|
// Loop
|
||||||
|
for (unsigned char *tile_item : get_default_tile_items()) {
|
||||||
|
// Get ID
|
||||||
|
int32_t id = *(int32_t *) (tile_item + Item_id_property_offset);
|
||||||
// Switch VTable
|
// Switch VTable
|
||||||
*(unsigned char **) tile_item = AuxDataTileItem_vtable;
|
*(unsigned char **) tile_item = AuxDataTileItem_vtable;
|
||||||
// Configure Item
|
// Configure Item
|
||||||
*(bool *) (tile_item + Item_is_stacked_by_data_property_offset) = true;
|
*(bool *) (tile_item + Item_is_stacked_by_data_property_offset) = true;
|
||||||
*(int32_t *) (tile_item + Item_max_damage_property_offset) = 0;
|
*(int32_t *) (tile_item + Item_max_damage_property_offset) = 0;
|
||||||
*(unsigned char **) (tile_item + AuxDataTileItem_icon_tile_property_offset) = Tile_tiles[id + 0x100];
|
*(unsigned char **) (tile_item + AuxDataTileItem_icon_tile_property_offset) = Tile_tiles[id];
|
||||||
|
}
|
||||||
// Return
|
get_default_tile_items().clear();
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check Restriction Status
|
// Check Restriction Status
|
||||||
@ -112,11 +129,10 @@ void init_creative() {
|
|||||||
// Use AuxDataTileItem by default instead of TileItem, so tiles in the Creative
|
// Use AuxDataTileItem by default instead of TileItem, so tiles in the Creative
|
||||||
// Inventory can have arbitrary auxiliary values.
|
// Inventory can have arbitrary auxiliary values.
|
||||||
{
|
{
|
||||||
// Fix Size
|
// Hook TileItem ::operator new To Store TileItems
|
||||||
unsigned char size_patch[4] = {AUX_DATA_TILE_ITEM_SIZE, 0x00, 0xa0, 0xe3}; // "mov r0, #AUX_DATA_TILE_ITEM_SIZE"
|
overwrite_call((void *) 0x1295a4, (void *) Tile_initTiles_operator_new_injection);
|
||||||
patch((void *) 0xc6f64, size_patch);
|
// Modify Stored TileItems
|
||||||
// Hook Constructor
|
misc_run_on_internal_after_tiles_setup(Tile_initTiles_injection);
|
||||||
overwrite_call((void *) 0xc6f74, (void *) Tile_initTiles_TileItem_injection);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,34 +140,35 @@ void init_creative() {
|
|||||||
if (feature_has("Remove Creative Mode Restrictions", server_disabled)) {
|
if (feature_has("Remove Creative Mode Restrictions", server_disabled)) {
|
||||||
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
||||||
// Remove Restrictions
|
// Remove Restrictions
|
||||||
patch((void *) 0x43ee8, nop_patch);
|
patch((void *) 0x59e68, nop_patch);
|
||||||
patch((void *) 0x43f3c, nop_patch);
|
patch((void *) 0x59ebc, nop_patch);
|
||||||
patch((void *) 0x43f8c, nop_patch);
|
patch((void *) 0x59f10, nop_patch);
|
||||||
patch((void *) 0x43fd8, nop_patch);
|
unsigned char allow_eating_patch[4] = {0x02, 0x00, 0x00, 0xea}; // "b 0xddcbc"
|
||||||
patch((void *) 0x99010, nop_patch);
|
patch((void *) 0xddcac, allow_eating_patch);
|
||||||
// Fix UI
|
// Fix UI
|
||||||
patch((void *) 0x341c0, nop_patch);
|
patch((void *) 0x4cb88, nop_patch);
|
||||||
patch((void *) 0x3adb4, nop_patch);
|
unsigned char fix_ui_patch[4] = {0x05, 0x00, 0x55, 0xe1}; // "cmp r5, r5"
|
||||||
patch((void *) 0x3b374, nop_patch);
|
patch((void *) 0x4bf20, fix_ui_patch);
|
||||||
// Fix Inventory
|
// Fix Inventory
|
||||||
|
patch((void *) 0xcce90, nop_patch);
|
||||||
|
patch((void *) 0xd5548, nop_patch);
|
||||||
|
unsigned char inv_creative_check_r3_patch[4] = {0x03, 0x00, 0x53, 0xe1}; // "cmp r3, r3"
|
||||||
|
patch((void *) 0xd497c, inv_creative_check_r3_patch);
|
||||||
|
unsigned char inv_creative_check_r5_patch[4] = {0x05, 0x00, 0x55, 0xe1}; // "cmp r5, r5"
|
||||||
|
patch((void *) 0xd4d94, inv_creative_check_r5_patch);
|
||||||
|
patch((void *) 0xd50ac, nop_patch);
|
||||||
patch((void *) 0x8d080, nop_patch);
|
patch((void *) 0x8d080, nop_patch);
|
||||||
patch((void *) 0x8d090, nop_patch);
|
patch((void *) 0x8d090, nop_patch);
|
||||||
patch((void *) 0x91d48, nop_patch);
|
|
||||||
patch((void *) 0x92098, nop_patch);
|
|
||||||
unsigned char inv_creative_check_r3_patch[4] = {0x03, 0x00, 0x53, 0xe1}; // "cmp r3, r3"
|
|
||||||
patch((void *) 0x923c0, inv_creative_check_r3_patch);
|
|
||||||
patch((void *) 0x92828, nop_patch);
|
|
||||||
patch((void *) 0x92830, nop_patch);
|
|
||||||
// Display Slot Count
|
// Display Slot Count
|
||||||
patch((void *) 0x1e3f4, nop_patch);
|
patch((void *) 0x23d4c, nop_patch);
|
||||||
unsigned char slot_count_patch[4] = {0x18, 0x00, 0x00, 0xea}; // "b 0x27110"
|
patch((void *) 0x2c570, nop_patch);
|
||||||
patch((void *) 0x270a8, slot_count_patch);
|
patch((void *) 0x3eec0, nop_patch);
|
||||||
patch((void *) 0x33954, nop_patch);
|
|
||||||
// Maximize Creative Inventory Stack Size
|
// Maximize Creative Inventory Stack Size
|
||||||
unsigned char maximize_stack_patch[4] = {0xff, 0xc0, 0xa0, 0xe3}; // "mov r12, 0xff"
|
unsigned char maximize_stack_patch[4] = {0xff, 0x60, 0xa0, 0xe3}; // "mov r6, 0xff"
|
||||||
patch((void *) 0x8e104, maximize_stack_patch);
|
patch((void *) 0xccf80, maximize_stack_patch);
|
||||||
// Allow Nether Reactor
|
// Allow Nether Reactor
|
||||||
patch((void *) 0xc0290, nop_patch);
|
unsigned char nether_reactor_patch[4] = {0x00, 0x00, 0xa0, 0xe3}; // "mov r0, #0x0"
|
||||||
|
patch((void *) 0x12283c, nether_reactor_patch);
|
||||||
// Disable Other Restrictions
|
// Disable Other Restrictions
|
||||||
is_restricted = 0;
|
is_restricted = 0;
|
||||||
}
|
}
|
||||||
|
@ -14,14 +14,14 @@ static void set_is_survival(int new_is_survival) {
|
|||||||
|
|
||||||
// Correct Inventpry UI
|
// Correct Inventpry UI
|
||||||
unsigned char inventory_patch[4] = {new_is_survival ? 0x00 : 0x01, 0x30, 0xa0, 0xe3}; // "mov r3, #0x0" or "mov r3, #0x1"
|
unsigned char inventory_patch[4] = {new_is_survival ? 0x00 : 0x01, 0x30, 0xa0, 0xe3}; // "mov r3, #0x0" or "mov r3, #0x1"
|
||||||
patch((void *) 0x16efc, inventory_patch);
|
patch((void *) 0x178c0, inventory_patch);
|
||||||
|
|
||||||
// Use Correct Size For GameMode Object
|
// Use Correct Size For GameMode Object
|
||||||
unsigned char size_patch[4] = {new_is_survival ? SURVIVAL_MODE_SIZE : CREATOR_MODE_SIZE, 0x00, 0xa0, 0xe3}; // "mov r0, #SURVIVAL_MODE_SIZE" or "mov r0, #CREATOR_MODE_SIZE"
|
unsigned char size_patch[4] = {new_is_survival ? SURVIVAL_MODE_SIZE : CREATOR_MODE_SIZE, 0x00, 0xa0, 0xe3}; // "mov r0, #SURVIVAL_MODE_SIZE" or "mov r0, #CREATOR_MODE_SIZE"
|
||||||
patch((void *) 0x16ee4, size_patch);
|
patch((void *) 0x178a8, size_patch);
|
||||||
|
|
||||||
// Replace Default CreatorMode Constructor With CreatorMode Or SurvivalMode Constructor
|
// Replace Default CreatorMode Constructor With CreatorMode Or SurvivalMode Constructor
|
||||||
overwrite_call((void *) 0x16ef4, new_is_survival ? SurvivalMode : CreatorMode);
|
overwrite_call((void *) 0x178b8, new_is_survival ? SurvivalMode : CreatorMode);
|
||||||
|
|
||||||
is_survival = new_is_survival;
|
is_survival = new_is_survival;
|
||||||
}
|
}
|
||||||
@ -54,11 +54,11 @@ void init_game_mode() {
|
|||||||
overwrite_calls((void *) Minecraft_setIsCreativeMode, (void *) Minecraft_setIsCreativeMode_injection);
|
overwrite_calls((void *) Minecraft_setIsCreativeMode, (void *) Minecraft_setIsCreativeMode_injection);
|
||||||
|
|
||||||
// Replace CreatorLevel With ServerLevel (This Fixes Beds And Mob Spawning)
|
// Replace CreatorLevel With ServerLevel (This Fixes Beds And Mob Spawning)
|
||||||
overwrite_call((void *) 0x16f84, (void *) ServerLevel);
|
overwrite_call((void *) 0x17950, (void *) ServerLevel);
|
||||||
|
|
||||||
// Allocate Correct Size For ServerLevel
|
// Allocate Correct Size For ServerLevel
|
||||||
uint32_t level_size = SERVER_LEVEL_SIZE;
|
uint32_t level_size = SERVER_LEVEL_SIZE;
|
||||||
patch_address((void *) 0x17004, (void *) level_size);
|
patch_address((void *) 0x17a38, (void *) level_size);
|
||||||
|
|
||||||
// Disable CreatorMode-Specific API Features (Polling Block Hits) In SurvivalMode, This Is Preferable To Crashing
|
// Disable CreatorMode-Specific API Features (Polling Block Hits) In SurvivalMode, This Is Preferable To Crashing
|
||||||
overwrite_calls((void *) Minecraft_getCreator, (void *) Minecraft_getCreator_injection);
|
overwrite_calls((void *) Minecraft_getCreator, (void *) Minecraft_getCreator_injection);
|
||||||
@ -72,7 +72,7 @@ void init_game_mode() {
|
|||||||
|
|
||||||
// Allow Joining Survival Servers
|
// Allow Joining Survival Servers
|
||||||
if (feature_has("Allow Joining Survival Servers", server_enabled)) {
|
if (feature_has("Allow Joining Survival Servers", server_enabled)) {
|
||||||
unsigned char server_patch[4] = {0x0f, 0x00, 0x00, 0xea}; // "b 0x6dcb4"
|
unsigned char server_patch[4] = {0x16, 0x00, 0x00, 0xea}; // "b 0x8e998"
|
||||||
patch((void *) 0x6dc70, server_patch);
|
patch((void *) 0x8e938, server_patch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,8 @@ __attribute__((destructor)) static void _free_home() {
|
|||||||
// Init
|
// Init
|
||||||
void init_home() {
|
void init_home() {
|
||||||
// Store Data In ~/.minecraft-pi Instead Of ~/.minecraft
|
// Store Data In ~/.minecraft-pi Instead Of ~/.minecraft
|
||||||
patch_address((void *) default_path, (void *) HOME_SUBDIRECTORY_FOR_GAME_DATA);
|
patch_address((void *) full_data_path, (void *) home_get());
|
||||||
|
|
||||||
// The override code resolves assets manually,
|
// The override code resolves assets manually,
|
||||||
// making changing directory redundant.
|
// making changing directory redundant.
|
||||||
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
|
||||||
patch((void *) 0xe0ac, nop_patch);
|
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,6 @@ __attribute__((constructor)) static void init() {
|
|||||||
init_multiplayer();
|
init_multiplayer();
|
||||||
init_sound();
|
init_sound();
|
||||||
init_input();
|
init_input();
|
||||||
init_sign();
|
|
||||||
init_creative();
|
init_creative();
|
||||||
init_camera();
|
init_camera();
|
||||||
init_touch();
|
init_touch();
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
#include <libreborn/libreborn.h>
|
|
||||||
#include <symbols/minecraft.h>
|
|
||||||
|
|
||||||
#include <mods/feature/feature.h>
|
|
||||||
#include "input-internal.h"
|
|
||||||
#include <mods/input/input.h>
|
|
||||||
|
|
||||||
// Store Right-Click Status
|
|
||||||
static int is_right_click = 0;
|
|
||||||
void input_set_is_right_click(int val) {
|
|
||||||
is_right_click = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable Bow & Arrow Fix
|
|
||||||
static int fix_bow = 0;
|
|
||||||
|
|
||||||
// Handle Bow & Arrow
|
|
||||||
static void _handle_bow(unsigned char *minecraft) {
|
|
||||||
if (fix_bow && !is_right_click) {
|
|
||||||
// GameMode Is Offset From minecraft By 0x160
|
|
||||||
// Player Is Offset From minecraft By 0x18c
|
|
||||||
unsigned char *game_mode = *(unsigned char **) (minecraft + Minecraft_game_mode_property_offset);
|
|
||||||
unsigned char *player = *(unsigned char **) (minecraft + Minecraft_player_property_offset);
|
|
||||||
if (player != NULL && game_mode != NULL && (*Player_isUsingItem)(player)) {
|
|
||||||
unsigned char *game_mode_vtable = *(unsigned char **) game_mode;
|
|
||||||
GameMode_releaseUsingItem_t GameMode_releaseUsingItem = *(GameMode_releaseUsingItem_t *) (game_mode_vtable + GameMode_releaseUsingItem_vtable_offset);
|
|
||||||
(*GameMode_releaseUsingItem)(game_mode, player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init
|
|
||||||
void _init_bow() {
|
|
||||||
// Enable Bow & Arrow Fix
|
|
||||||
fix_bow = feature_has("Fix Bow & Arrow", server_disabled);
|
|
||||||
input_run_on_tick(_handle_bow);
|
|
||||||
}
|
|
@ -5,7 +5,6 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
__attribute__((visibility("internal"))) void _init_attack();
|
__attribute__((visibility("internal"))) void _init_attack();
|
||||||
__attribute__((visibility("internal"))) void _init_bow();
|
|
||||||
__attribute__((visibility("internal"))) void _init_misc();
|
__attribute__((visibility("internal"))) void _init_misc();
|
||||||
__attribute__((visibility("internal"))) void _init_toggle();
|
__attribute__((visibility("internal"))) void _init_toggle();
|
||||||
__attribute__((visibility("internal"))) void _init_drop();
|
__attribute__((visibility("internal"))) void _init_drop();
|
||||||
|
@ -40,9 +40,6 @@ void init_input() {
|
|||||||
// Item Dropping
|
// Item Dropping
|
||||||
_init_drop();
|
_init_drop();
|
||||||
|
|
||||||
// Enable Bow & Arrow Fix
|
|
||||||
_init_bow();
|
|
||||||
|
|
||||||
// Loop
|
// Loop
|
||||||
overwrite_calls((void *) Minecraft_tickInput, (void *) Minecraft_tickInput_injection);
|
overwrite_calls((void *) Minecraft_tickInput, (void *) Minecraft_tickInput_injection);
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ void _init_misc() {
|
|||||||
overwrite_calls((void *) Gui_handleClick, (void *) Gui_handleClick_injection);
|
overwrite_calls((void *) Gui_handleClick, (void *) Gui_handleClick_injection);
|
||||||
}
|
}
|
||||||
// Disable Item Dropping Using The Cursor When Cursor Is Hidden
|
// Disable Item Dropping Using The Cursor When Cursor Is Hidden
|
||||||
overwrite_call((void *) 0x27800, (void *) Gui_tickItemDrop_Minecraft_isCreativeMode_call_injection);
|
overwrite_call((void *) 0x2b130, (void *) Gui_tickItemDrop_Minecraft_isCreativeMode_call_injection);
|
||||||
|
|
||||||
input_run_on_tick(_handle_back);
|
input_run_on_tick(_handle_back);
|
||||||
input_run_on_tick(_handle_mouse_grab);
|
input_run_on_tick(_handle_mouse_grab);
|
||||||
|
@ -83,6 +83,7 @@ static void Inventory_setupDefault_FillingContainer_addItem_call_injection(unsig
|
|||||||
|
|
||||||
// Run Functions On Tiles Setup
|
// Run Functions On Tiles Setup
|
||||||
SETUP_CALLBACK(tiles_setup);
|
SETUP_CALLBACK(tiles_setup);
|
||||||
|
SETUP_CALLBACK(internal_after_tiles_setup);
|
||||||
// Handle Custom Tiles Setup Behavior
|
// Handle Custom Tiles Setup Behavior
|
||||||
static void Tile_initTiles_injection() {
|
static void Tile_initTiles_injection() {
|
||||||
// Run Functions
|
// Run Functions
|
||||||
@ -90,6 +91,9 @@ static void Tile_initTiles_injection() {
|
|||||||
|
|
||||||
// Call Original Method
|
// Call Original Method
|
||||||
(*Tile_initTiles)();
|
(*Tile_initTiles)();
|
||||||
|
|
||||||
|
// Run Functions
|
||||||
|
handle_misc_internal_after_tiles_setup(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run Functions On Items Setup
|
// Run Functions On Items Setup
|
||||||
@ -113,7 +117,7 @@ void _init_misc_api() {
|
|||||||
overwrite_calls((void *) Recipes, (void *) Recipes_injection);
|
overwrite_calls((void *) Recipes, (void *) Recipes_injection);
|
||||||
overwrite_calls((void *) FurnaceRecipes, (void *) FurnaceRecipes_injection);
|
overwrite_calls((void *) FurnaceRecipes, (void *) FurnaceRecipes_injection);
|
||||||
// Handle Custom Creative Inventory Setup Behavior
|
// Handle Custom Creative Inventory Setup Behavior
|
||||||
overwrite_call((void *) 0x8e0fc, (void *) Inventory_setupDefault_FillingContainer_addItem_call_injection);
|
overwrite_call((void *) 0xcdcf4, (void *) Inventory_setupDefault_FillingContainer_addItem_call_injection);
|
||||||
// Handle Custom Item/Tile Init Behavior
|
// Handle Custom Item/Tile Init Behavior
|
||||||
overwrite_calls((void *) Tile_initTiles, (void *) Tile_initTiles_injection);
|
overwrite_calls((void *) Tile_initTiles, (void *) Tile_initTiles_injection);
|
||||||
overwrite_calls((void *) Item_initItems, (void *) Item_initItems_injection);
|
overwrite_calls((void *) Item_initItems, (void *) Item_initItems_injection);
|
||||||
|
@ -36,17 +36,6 @@ static void Gui_renderHearts_GuiComponent_blit_hearts_injection(unsigned char *c
|
|||||||
// Call Original Method
|
// Call Original Method
|
||||||
(*GuiComponent_blit)(component, x_dest, y_dest, x_src, y_src, width_dest, height_dest, width_src, height_src);
|
(*GuiComponent_blit)(component, x_dest, y_dest, x_src, y_src, width_dest, height_dest, width_src, height_src);
|
||||||
}
|
}
|
||||||
static void Gui_renderHearts_GuiComponent_blit_armor_injection(unsigned char *component, int32_t x_dest, int32_t y_dest, int32_t x_src, int32_t y_src, int32_t width_dest, int32_t height_dest, int32_t width_src, int32_t height_src) {
|
|
||||||
unsigned char *minecraft = *(unsigned char **) (component + Gui_minecraft_property_offset);
|
|
||||||
x_dest -= DEFAULT_HUD_PADDING + HUD_ELEMENT_WIDTH;
|
|
||||||
float width = ((float) *(int32_t *) (minecraft + Minecraft_screen_width_property_offset)) * *InvGuiScale;
|
|
||||||
float height = ((float) *(int32_t *) (minecraft + Minecraft_screen_height_property_offset)) * *InvGuiScale;
|
|
||||||
x_dest += width - ((width - (NUMBER_OF_SLOTS * SLOT_WIDTH)) / 2) - HUD_ELEMENT_WIDTH;
|
|
||||||
y_dest -= DEFAULT_HUD_PADDING;
|
|
||||||
y_dest += height - HUD_ELEMENT_HEIGHT - TOOLBAR_HEIGHT - NEW_HUD_PADDING;
|
|
||||||
// Call Original Method
|
|
||||||
(*GuiComponent_blit)(component, x_dest, y_dest, x_src, y_src, width_dest, height_dest, width_src, height_src);
|
|
||||||
}
|
|
||||||
static void Gui_renderBubbles_GuiComponent_blit_injection(unsigned char *component, int32_t x_dest, int32_t y_dest, int32_t x_src, int32_t y_src, int32_t width_dest, int32_t height_dest, int32_t width_src, int32_t height_src) {
|
static void Gui_renderBubbles_GuiComponent_blit_injection(unsigned char *component, int32_t x_dest, int32_t y_dest, int32_t x_src, int32_t y_src, int32_t width_dest, int32_t height_dest, int32_t width_src, int32_t height_src) {
|
||||||
unsigned char *minecraft = *(unsigned char **) (component + Gui_minecraft_property_offset);
|
unsigned char *minecraft = *(unsigned char **) (component + Gui_minecraft_property_offset);
|
||||||
x_dest -= DEFAULT_HUD_PADDING;
|
x_dest -= DEFAULT_HUD_PADDING;
|
||||||
@ -297,6 +286,11 @@ int32_t misc_get_real_selected_slot(unsigned char *player) {
|
|||||||
return selected_slot;
|
return selected_slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stop Checking GL Renderer
|
||||||
|
static bool AppPlatform_isPowerVR_injection(__attribute__((unused)) unsigned char *app_platform) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
static void nop() {
|
static void nop() {
|
||||||
}
|
}
|
||||||
@ -304,17 +298,16 @@ void init_misc() {
|
|||||||
// Remove Invalid Item Background (A Red Background That Appears For Items That Are Not Included In The gui_blocks Atlas)
|
// Remove Invalid Item Background (A Red Background That Appears For Items That Are Not Included In The gui_blocks Atlas)
|
||||||
if (feature_has("Remove Invalid Item Background", server_disabled)) {
|
if (feature_has("Remove Invalid Item Background", server_disabled)) {
|
||||||
unsigned char invalid_item_background_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
unsigned char invalid_item_background_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
||||||
patch((void *) 0x63c98, invalid_item_background_patch);
|
patch((void *) 0x7f7e8, invalid_item_background_patch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Classic HUD
|
// Classic HUD
|
||||||
if (feature_has("Classic HUD", server_disabled)) {
|
if (feature_has("Classic HUD", server_disabled)) {
|
||||||
use_classic_hud = 1;
|
use_classic_hud = 1;
|
||||||
overwrite_call((void *) 0x266f8, (void *) Gui_renderHearts_GuiComponent_blit_hearts_injection);
|
overwrite_call((void *) 0x2b730, (void *) Gui_renderHearts_GuiComponent_blit_hearts_injection);
|
||||||
overwrite_call((void *) 0x26758, (void *) Gui_renderHearts_GuiComponent_blit_hearts_injection);
|
overwrite_call((void *) 0x2b8a4, (void *) Gui_renderHearts_GuiComponent_blit_hearts_injection);
|
||||||
overwrite_call((void *) 0x267c8, (void *) Gui_renderHearts_GuiComponent_blit_hearts_injection);
|
overwrite_call((void *) 0x2b788, (void *) Gui_renderHearts_GuiComponent_blit_hearts_injection);
|
||||||
overwrite_call((void *) 0x2656c, (void *) Gui_renderHearts_GuiComponent_blit_armor_injection);
|
overwrite_call((void *) 0x2ba80, (void *) Gui_renderBubbles_GuiComponent_blit_injection);
|
||||||
overwrite_call((void *) 0x268c4, (void *) Gui_renderBubbles_GuiComponent_blit_injection);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render Selected Item Text + Hide Chat Messages
|
// Render Selected Item Text + Hide Chat Messages
|
||||||
@ -327,7 +320,7 @@ void init_misc() {
|
|||||||
// Translucent Toolbar
|
// Translucent Toolbar
|
||||||
if (feature_has("Translucent Toolbar", server_disabled)) {
|
if (feature_has("Translucent Toolbar", server_disabled)) {
|
||||||
overwrite_calls((void *) Gui_renderToolBar, (void *) Gui_renderToolBar_injection);
|
overwrite_calls((void *) Gui_renderToolBar, (void *) Gui_renderToolBar_injection);
|
||||||
overwrite_call((void *) 0x26c5c, (void *) Gui_renderToolBar_glColor4f_injection);
|
overwrite_call((void *) 0x2c130, (void *) Gui_renderToolBar_glColor4f_injection);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix Screen Rendering When GUI is Hidden
|
// Fix Screen Rendering When GUI is Hidden
|
||||||
@ -340,7 +333,7 @@ void init_misc() {
|
|||||||
overwrite_calls((void *) RakNet_RakString, (void *) RakNet_RakString_injection);
|
overwrite_calls((void *) RakNet_RakString, (void *) RakNet_RakString_injection);
|
||||||
|
|
||||||
// Print Error Message If RakNet Startup Fails
|
// Print Error Message If RakNet Startup Fails
|
||||||
overwrite_call((void *) 0x73778, (void *) RakNetInstance_host_RakNet_RakPeer_Startup_injection);
|
overwrite_call((void *) 0x98014, (void *) RakNetInstance_host_RakNet_RakPeer_Startup_injection);
|
||||||
|
|
||||||
// Fix Bug Where RakNetInstance Starts Pinging Potential Servers Before The "Join Game" Screen Is Opened
|
// Fix Bug Where RakNetInstance Starts Pinging Potential Servers Before The "Join Game" Screen Is Opened
|
||||||
overwrite_calls((void *) RakNetInstance, (void *) RakNetInstance_injection);
|
overwrite_calls((void *) RakNetInstance, (void *) RakNetInstance_injection);
|
||||||
@ -359,7 +352,7 @@ void init_misc() {
|
|||||||
if (feature_has("Improved Cursor Rendering", server_disabled)) {
|
if (feature_has("Improved Cursor Rendering", server_disabled)) {
|
||||||
// Disable Normal Cursor Rendering
|
// Disable Normal Cursor Rendering
|
||||||
unsigned char disable_cursor_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
unsigned char disable_cursor_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
||||||
patch((void *) 0x4a6c0, disable_cursor_patch);
|
patch((void *) 0x61afc, disable_cursor_patch);
|
||||||
// Add Custom Cursor Rendering
|
// Add Custom Cursor Rendering
|
||||||
overwrite_calls((void *) GameRenderer_render, (void *) GameRenderer_render_injection);
|
overwrite_calls((void *) GameRenderer_render, (void *) GameRenderer_render_injection);
|
||||||
}
|
}
|
||||||
@ -379,6 +372,9 @@ void init_misc() {
|
|||||||
overwrite_calls((void *) sleepMs, (void *) nop);
|
overwrite_calls((void *) sleepMs, (void *) nop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stop Checking GL Renderer
|
||||||
|
overwrite((void *) AppPlatform_isPowerVR, (void *) AppPlatform_isPowerVR_injection);
|
||||||
|
|
||||||
// Init C++ And Logging
|
// Init C++ And Logging
|
||||||
_init_misc_cpp();
|
_init_misc_cpp();
|
||||||
_init_misc_logging();
|
_init_misc_logging();
|
||||||
|
@ -75,10 +75,10 @@ void _init_misc_cpp() {
|
|||||||
// Improved Title Background
|
// Improved Title Background
|
||||||
if (feature_has("Improved Title Background", server_disabled)) {
|
if (feature_has("Improved Title Background", server_disabled)) {
|
||||||
// Switch Background
|
// Switch Background
|
||||||
overwrite_call((void *) 0x39528, (void *) StartMenuScreen_render_Screen_renderBackground_injection);
|
overwrite_call((void *) 0x4a40c, (void *) StartMenuScreen_render_Screen_renderBackground_injection);
|
||||||
overwrite_call((void *) 0x3dee0, (void *) StartMenuScreen_render_Screen_renderBackground_injection);
|
overwrite_call((void *) 0x52360, (void *) StartMenuScreen_render_Screen_renderBackground_injection);
|
||||||
// Text Color
|
// Text Color
|
||||||
patch_address((void *) 0x397ac, (void *) 0xffffffff);
|
patch_address((void *) 0x4a764, (void *) 0xffffffff);
|
||||||
patch_address((void *) 0x3e10c, (void *) 0xffffffff);
|
patch_address((void *) 0x525f4, (void *) 0xffffffff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__attribute__((visibility("internal"))) void _init_options_cpp();
|
|
||||||
__attribute__((visibility("internal"))) extern unsigned char *stored_options;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include <mods/feature/feature.h>
|
#include <mods/feature/feature.h>
|
||||||
#include <mods/init/init.h>
|
#include <mods/init/init.h>
|
||||||
#include "options-internal.h"
|
|
||||||
|
|
||||||
// Force Mob Spawning
|
// Force Mob Spawning
|
||||||
static bool LevelData_getSpawnMobs_injection(__attribute__((unused)) unsigned char *level_data) {
|
static bool LevelData_getSpawnMobs_injection(__attribute__((unused)) unsigned char *level_data) {
|
||||||
@ -44,43 +43,32 @@ __attribute__((destructor)) static void _free_safe_username() {
|
|||||||
free(safe_username);
|
free(safe_username);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fancy_graphics;
|
||||||
|
static int peaceful_mode;
|
||||||
static int anaglyph;
|
static int anaglyph;
|
||||||
|
static int smooth_lighting;
|
||||||
static int render_distance;
|
static int render_distance;
|
||||||
|
static int server_visible;
|
||||||
// Configure Options
|
// Configure Options
|
||||||
unsigned char *stored_options = NULL;
|
static void Minecraft_init_injection(unsigned char *this) {
|
||||||
static void Options_initDefaultValue_injection(unsigned char *options) {
|
|
||||||
// Call Original Method
|
// Call Original Method
|
||||||
(*Options_initDefaultValue)(options);
|
(*Minecraft_init)(this);
|
||||||
|
|
||||||
// Default Graphics Settings
|
unsigned char *options = this + Minecraft_options_property_offset;
|
||||||
#ifndef MCPI_SERVER_MODE
|
// Enable Fancy Graphics
|
||||||
*(options + Options_fancy_graphics_property_offset) = 1;
|
*(options + Options_fancy_graphics_property_offset) = fancy_graphics;
|
||||||
*(options + Options_ambient_occlusion_property_offset) = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Store
|
|
||||||
stored_options = options;
|
|
||||||
}
|
|
||||||
static void Minecraft_init_injection(unsigned char *minecraft) {
|
|
||||||
// Call Original Method
|
|
||||||
(*Minecraft_init)(minecraft);
|
|
||||||
|
|
||||||
unsigned char *options = minecraft + Minecraft_options_property_offset;
|
|
||||||
// Enable Crosshair In Touch GUI
|
// Enable Crosshair In Touch GUI
|
||||||
*(options + Options_split_controls_property_offset) = 1;
|
*(options + Options_split_controls_property_offset) = 1;
|
||||||
|
// Peaceful Mode
|
||||||
|
*(int32_t *) (options + Options_game_difficulty_property_offset) = peaceful_mode ? 0 : 2;
|
||||||
// 3D Anaglyph
|
// 3D Anaglyph
|
||||||
*(options + Options_3d_anaglyph_property_offset) = anaglyph;
|
*(options + Options_3d_anaglyph_property_offset) = anaglyph;
|
||||||
|
// Smooth Lighting
|
||||||
|
*(options + Options_ambient_occlusion_property_offset) = smooth_lighting;
|
||||||
// Render Distance
|
// Render Distance
|
||||||
*(int32_t *) (options + Options_render_distance_property_offset) = render_distance;
|
*(int32_t *) (options + Options_render_distance_property_offset) = render_distance;
|
||||||
}
|
// Server Visible
|
||||||
|
*(options + Options_server_visible_property_offset) = server_visible;
|
||||||
// Smooth Lighting
|
|
||||||
static void TileRenderer_tesselateBlockInWorld_injection(unsigned char *tile_renderer, unsigned char *tile, int32_t x, int32_t y, int32_t z) {
|
|
||||||
// Set Variable
|
|
||||||
*Minecraft_useAmbientOcclusion = *(stored_options + Options_ambient_occlusion_property_offset);
|
|
||||||
|
|
||||||
// Call Original Method
|
|
||||||
(*TileRenderer_tesselateBlockInWorld)(tile_renderer, tile, x, y, z);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
@ -90,14 +78,19 @@ void init_options() {
|
|||||||
overwrite((void *) LevelData_getSpawnMobs, (void *) LevelData_getSpawnMobs_injection);
|
overwrite((void *) LevelData_getSpawnMobs, (void *) LevelData_getSpawnMobs_injection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enable Fancy Graphics
|
||||||
|
fancy_graphics = feature_has("Fancy Graphics", server_disabled);
|
||||||
|
// Peaceful Mode
|
||||||
|
peaceful_mode = feature_has("Peaceful Mode", server_auto);
|
||||||
// 3D Anaglyph
|
// 3D Anaglyph
|
||||||
anaglyph = feature_has("3D Anaglyph", server_disabled);
|
anaglyph = feature_has("3D Anaglyph", server_disabled);
|
||||||
// Render Distance
|
// Render Distance
|
||||||
render_distance = get_render_distance();
|
render_distance = get_render_distance();
|
||||||
DEBUG("Setting Render Distance: %i", render_distance);
|
DEBUG("Setting Render Distance: %i", render_distance);
|
||||||
|
// Server Visible
|
||||||
|
server_visible = !feature_has("Disable Hosting LAN Worlds", server_disabled);
|
||||||
|
|
||||||
// Set Options
|
// Set Options
|
||||||
overwrite_calls((void *) Options_initDefaultValue, (void *) Options_initDefaultValue_injection);
|
|
||||||
overwrite_calls((void *) Minecraft_init, (void *) Minecraft_init_injection);
|
overwrite_calls((void *) Minecraft_init, (void *) Minecraft_init_injection);
|
||||||
|
|
||||||
// Change Username
|
// Change Username
|
||||||
@ -108,23 +101,26 @@ void init_options() {
|
|||||||
}
|
}
|
||||||
safe_username = to_cp437(username);
|
safe_username = to_cp437(username);
|
||||||
patch_address((void *) default_username, (void *) safe_username);
|
patch_address((void *) default_username, (void *) safe_username);
|
||||||
|
unsigned char username_length_patch[4] = {(unsigned char) strlen(safe_username), 0x20, 0xa0, 0xe3}; // "mov r2, #USERNAME_LENGTH"
|
||||||
|
patch((void *) 0x1ba2c, username_length_patch);
|
||||||
|
|
||||||
// Disable Autojump By Default
|
// Disable Autojump By Default
|
||||||
if (feature_has("Disable Autojump By Default", server_disabled)) {
|
if (feature_has("Disable Autojump By Default", server_disabled)) {
|
||||||
unsigned char autojump_patch[4] = {0x00, 0x30, 0xa0, 0xe3}; // "mov r3, #0x0"
|
unsigned char autojump_patch[4] = {0x00, 0x00, 0xa0, 0xe3}; // "mov r0, #0x0"
|
||||||
patch((void *) 0x44b90, autojump_patch);
|
patch((void *) 0x5b148, autojump_patch);
|
||||||
}
|
}
|
||||||
// Display Nametags By Default
|
// Display Nametags By Default
|
||||||
if (feature_has("Display Nametags By Default", server_disabled)) {
|
if (feature_has("Display Nametags By Default", server_disabled)) {
|
||||||
// r6 = 0x1
|
// r6 = 0x1
|
||||||
// r5 = 0x0
|
// r12 = 0x0
|
||||||
unsigned char display_nametags_patch[4] = {0x1d, 0x60, 0xc0, 0xe5}; // "strb r6, [r0, #0x1d]"
|
unsigned char display_nametags_patch[4] = {0x1d, 0x60, 0xc4, 0xe5}; // "strb r6, [r4, #0x1d]"
|
||||||
patch((void *) 0xa6628, display_nametags_patch);
|
patch((void *) 0xf2d44, display_nametags_patch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Smooth Lighting
|
// Enable Smooth Lighting
|
||||||
overwrite_calls((void *) TileRenderer_tesselateBlockInWorld, (void *) TileRenderer_tesselateBlockInWorld_injection);
|
smooth_lighting = feature_has("Smooth Lighting", server_disabled);
|
||||||
|
if (smooth_lighting) {
|
||||||
// Init C++
|
unsigned char smooth_lighting_patch[4] = {0x01, 0x00, 0x53, 0xe3}; // "cmp r3, #0x1"
|
||||||
_init_options_cpp();
|
patch((void *) 0x73b74, smooth_lighting_patch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,230 +0,0 @@
|
|||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <sstream>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <libreborn/libreborn.h>
|
|
||||||
|
|
||||||
#include <mods/feature/feature.h>
|
|
||||||
#include <mods/home/home.h>
|
|
||||||
#include "options-internal.h"
|
|
||||||
|
|
||||||
#include <symbols/minecraft.h>
|
|
||||||
|
|
||||||
// Fix Initial Option Button Rendering
|
|
||||||
// The calling function doesn't exist in MCPE v0.6.1, so its name is unknown.
|
|
||||||
static unsigned char *OptionsPane_unknown_toggle_creating_function_OptionButton_injection(unsigned char *option_button, unsigned char *option) {
|
|
||||||
// Call Original Method
|
|
||||||
unsigned char *ret = (*OptionButton)(option_button, option);
|
|
||||||
|
|
||||||
// Setup Image
|
|
||||||
(*OptionButton_updateImage)(option_button, stored_options);
|
|
||||||
|
|
||||||
// Return
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actually Save options.txt
|
|
||||||
// Hook Last Options::addOptionToSaveOutput Call
|
|
||||||
static void Options_save_Options_addOptionToSaveOutput_injection(unsigned char *options, std::vector<std::string> &data, std::string option, int32_t value) {
|
|
||||||
// Call Original Method
|
|
||||||
(*Options_addOptionToSaveOutput)(options, data, option, value);
|
|
||||||
|
|
||||||
// Save Fancy Graphics
|
|
||||||
(*Options_addOptionToSaveOutput)(options, data, "gfx_fancygraphics", *(options + Options_fancy_graphics_property_offset));
|
|
||||||
|
|
||||||
// Save File
|
|
||||||
unsigned char *options_file = options + Options_options_file_property_offset;
|
|
||||||
(*OptionsFile_save)(options_file, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// MCPI's OptionsFile::getOptionStrings is broken, this is the version in v0.7.0
|
|
||||||
static std::vector<std::string> OptionsFile_getOptionStrings_injection(unsigned char *options_file) {
|
|
||||||
// Get options.txt Path
|
|
||||||
std::string path = *(std::string *) (options_file + OptionsFile_options_txt_path_property_offset);
|
|
||||||
// Parse
|
|
||||||
std::vector<std::string> ret;
|
|
||||||
FILE *stream = fopen(path.c_str(), "r");
|
|
||||||
char line[128];
|
|
||||||
if (stream != NULL) {
|
|
||||||
while (fgets(line, 0x80, stream) != NULL) {
|
|
||||||
size_t sVar1 = strlen(line);
|
|
||||||
if (2 < sVar1) {
|
|
||||||
std::stringstream string_stream(line);
|
|
||||||
while (true) {
|
|
||||||
std::string data;
|
|
||||||
std::getline(string_stream, data, ':');
|
|
||||||
int iVar2 = data.find_last_not_of(" \n\r\t");
|
|
||||||
data.erase(iVar2 + 1);
|
|
||||||
if (data.length() == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ret.push_back(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(stream);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get New options.txt Path
|
|
||||||
#ifndef MCPI_SERVER_MODE
|
|
||||||
static char *get_new_options_txt_path() {
|
|
||||||
static char *path = NULL;
|
|
||||||
// Path
|
|
||||||
if (path == NULL) {
|
|
||||||
safe_asprintf(&path, "%s/options.txt", home_get());
|
|
||||||
}
|
|
||||||
// Return
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
// Free
|
|
||||||
__attribute__((destructor)) static void _free_new_options_txt_path() {
|
|
||||||
free(get_new_options_txt_path());
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static char *get_new_options_txt_path() {
|
|
||||||
// Block options.txt On Servers
|
|
||||||
return (char *) "/dev/null";
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Modify Option Toggles
|
|
||||||
static void OptionsPane_unknown_toggle_creating_function_injection(unsigned char *options_pane, uint32_t group_id, std::string const& name, unsigned char *option) {
|
|
||||||
// Modify
|
|
||||||
std::string new_name = name;
|
|
||||||
if (name == "Fancy Graphics") {
|
|
||||||
option = Options_Option_GRAPHICS;
|
|
||||||
} else if (name == "Soft shadows") {
|
|
||||||
option = Options_Option_AMBIENT_OCCLUSION;
|
|
||||||
} else if (name == "Fancy Skies" || name == "Animated water") {
|
|
||||||
// These have no corresponding option, so disable the toggle.
|
|
||||||
return;
|
|
||||||
} else if (name == "Third person camera") {
|
|
||||||
// This isn't saved/loaded, so disable the toggle.
|
|
||||||
return;
|
|
||||||
} else if (name == "Lefty" || name == "Use touch screen" || name == "Split touch controls") {
|
|
||||||
// These toggles require touch support, so disable them.
|
|
||||||
return;
|
|
||||||
} else if (name == "Vibrate on destroy") {
|
|
||||||
// This toggle requires vibration support, so disable it.
|
|
||||||
return;
|
|
||||||
} else if (name == "Invert X-axis") {
|
|
||||||
// Fix Incorrect Name
|
|
||||||
new_name = "Invert Y-axis";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call Original Method
|
|
||||||
(*OptionsPane_unknown_toggle_creating_function)(options_pane, group_id, new_name, option);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add Missing Options To Options::getBooleanValue
|
|
||||||
static bool Options_getBooleanValue_injection(unsigned char *options, unsigned char *option) {
|
|
||||||
// Check
|
|
||||||
if (option == Options_Option_GRAPHICS) {
|
|
||||||
return *(options + Options_fancy_graphics_property_offset);
|
|
||||||
} else {
|
|
||||||
// Call Original Method
|
|
||||||
return (*Options_getBooleanValue)(options, option);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add Options Button Back To Classic Start Screen
|
|
||||||
static void StartMenuScreen_init_injection(unsigned char *screen) {
|
|
||||||
// Call Original Method
|
|
||||||
(*StartMenuScreen_init)(screen);
|
|
||||||
|
|
||||||
// Add Button
|
|
||||||
std::vector<unsigned char *> *rendered_buttons = (std::vector<unsigned char *> *) (screen + Screen_rendered_buttons_property_offset);
|
|
||||||
std::vector<unsigned char *> *selectable_buttons = (std::vector<unsigned char *> *) (screen + Screen_selectable_buttons_property_offset);
|
|
||||||
unsigned char *options_button = screen + StartMenuScreen_options_button_property_offset;
|
|
||||||
rendered_buttons->push_back(options_button);
|
|
||||||
selectable_buttons->push_back(options_button);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init C++
|
|
||||||
void _init_options_cpp() {
|
|
||||||
// NOP
|
|
||||||
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
|
||||||
|
|
||||||
// Fix Options Screen
|
|
||||||
if (feature_has("Fix Options Screen", server_disabled)) {
|
|
||||||
// Fix Initial Option Button Rendering
|
|
||||||
overwrite_call((void *) 0x24510, (void *) OptionsPane_unknown_toggle_creating_function_OptionButton_injection);
|
|
||||||
|
|
||||||
// "Gui Scale" slider is broken, so disable it.
|
|
||||||
patch((void *) 0x35a10, nop_patch);
|
|
||||||
// "Vibrate on destroy" is disabled, so "Feedback" is empty, so disable it.
|
|
||||||
patch((void *) 0x35960, nop_patch);
|
|
||||||
|
|
||||||
// Disconnect "This works?" Slider From Difficulty
|
|
||||||
unsigned char this_works_slider_patch[4] = {0x00, 0x30, 0xa0, 0xe3}; // "mov r3, #0x0"
|
|
||||||
patch((void *) 0x3577c, this_works_slider_patch);
|
|
||||||
|
|
||||||
// Modify Option Toggles
|
|
||||||
overwrite_calls((void *) OptionsPane_unknown_toggle_creating_function, (void *) OptionsPane_unknown_toggle_creating_function_injection);
|
|
||||||
|
|
||||||
// Add Missing Options To Options::getBooleanValue
|
|
||||||
overwrite_calls((void *) Options_getBooleanValue, (void *) Options_getBooleanValue_injection);
|
|
||||||
|
|
||||||
// Add Options Button Back To Classic Start Screen
|
|
||||||
patch_address(StartMenuScreen_init_vtable_addr, (void *) StartMenuScreen_init_injection);
|
|
||||||
// Fix Classic UI Options Button Size
|
|
||||||
unsigned char classic_options_button_width_patch[4] = {0xa0, 0x00, 0xa0, 0xe3}; // "mov r0, #0xa0"
|
|
||||||
patch((void *) 0x39a98, classic_options_button_width_patch);
|
|
||||||
unsigned char classic_options_button_height_patch[4] = {0x18, 0x30, 0xa0, 0xe3}; // "mov r3, #0x18"
|
|
||||||
patch((void *) 0x39a9c, classic_options_button_height_patch);
|
|
||||||
// Fix Classic UI Buttons Spacing
|
|
||||||
{
|
|
||||||
// Join Button
|
|
||||||
unsigned char classic_join_button_spacing_patch[4] = {0x12, 0x20, 0x83, 0xe2}; // "add r2, r3, #0x12"
|
|
||||||
patch((void *) 0x39894, classic_join_button_spacing_patch);
|
|
||||||
// Start Button
|
|
||||||
unsigned char classic_start_button_spacing_patch[4] = {0x08, 0x20, 0x43, 0xe2}; // "sub r2, r3, #0x08"
|
|
||||||
patch((void *) 0x3988c, classic_start_button_spacing_patch);
|
|
||||||
// Options Button
|
|
||||||
unsigned char classic_options_button_spacing_patch[4] = {0x2c, 0x30, 0x83, 0xe2}; // "add r3, r3, #0x2c"
|
|
||||||
patch((void *) 0x39898, classic_options_button_spacing_patch);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actually Save options.txt
|
|
||||||
overwrite_call((void *) 0x197fc, (void *) Options_save_Options_addOptionToSaveOutput_injection);
|
|
||||||
// Fix options.txt Path
|
|
||||||
patch_address((void *) options_txt_path, (void *) get_new_options_txt_path());
|
|
||||||
// When Loading, options.txt Should Be Opened In Read Mode
|
|
||||||
patch_address((void *) options_txt_fopen_mode_when_loading, (void *) "r");
|
|
||||||
// Fix OptionsFile::getOptionStrings
|
|
||||||
overwrite_calls((void *) OptionsFile_getOptionStrings, (void *) OptionsFile_getOptionStrings_injection);
|
|
||||||
|
|
||||||
// Sensitivity Loading/Saving Is Broken, Disable It
|
|
||||||
patch((void *) 0x1931c, nop_patch);
|
|
||||||
patch((void *) 0x1973c, nop_patch);
|
|
||||||
|
|
||||||
// Unsplit Touch Controls Breaks Things, Never Load/Save It
|
|
||||||
unsigned char cmp_r0_r0_patch[4] = {0x00, 0x00, 0x50, 0xe1}; // "cmp r0, r0"
|
|
||||||
patch((void *) 0x19378, cmp_r0_r0_patch);
|
|
||||||
patch((void *) 0x197cc, nop_patch);
|
|
||||||
|
|
||||||
// Custom Username Is Loaded Manually, Disable Loading From options.txt
|
|
||||||
patch((void *) 0x192ac, nop_patch);
|
|
||||||
|
|
||||||
// Replace "feedback_vibration" Loading/Saving With "gfx_ao"
|
|
||||||
{
|
|
||||||
// Replace String
|
|
||||||
static const char *new_feedback_vibration_options_txt_nam = "gfx_ao";
|
|
||||||
patch_address((void *) feedback_vibration_options_txt_name_1, (void *) &new_feedback_vibration_options_txt_nam);
|
|
||||||
patch_address((void *) feedback_vibration_options_txt_name_2, (void *) &new_feedback_vibration_options_txt_nam);
|
|
||||||
// Loading
|
|
||||||
unsigned char gfx_ao_loading_patch[4] = {(unsigned char) Options_ambient_occlusion_property_offset, 0x10, 0x84, 0xe2}; // "add param_2, r4, #OFFSET"
|
|
||||||
patch((void *) 0x193b8, gfx_ao_loading_patch);
|
|
||||||
// Saving
|
|
||||||
unsigned char gfx_ao_saving_patch[4] = {(unsigned char) Options_ambient_occlusion_property_offset, 0x30, 0xd4, 0xe5}; // "ldrb r3, [r4, #OFFSET]"
|
|
||||||
patch((void *) 0x197f8, gfx_ao_saving_patch);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disable "gfx_lowquality" Loading
|
|
||||||
patch((void *) 0x19414, nop_patch);
|
|
||||||
patch((void *) 0x1941c, nop_patch);
|
|
||||||
}
|
|
@ -79,10 +79,6 @@ static void start_world(unsigned char *minecraft) {
|
|||||||
// Log
|
// Log
|
||||||
INFO("Loading World: %s", world_name.c_str());
|
INFO("Loading World: %s", world_name.c_str());
|
||||||
|
|
||||||
// Peaceful Mode
|
|
||||||
unsigned char *options = minecraft + Minecraft_options_property_offset;
|
|
||||||
*(int32_t *) (options + Options_game_difficulty_property_offset) = get_server_properties().get_bool("peaceful-mode", DEFAULT_PEACEFUL_MODE) ? 0 : 2;
|
|
||||||
|
|
||||||
// Specify Level Settings
|
// Specify Level Settings
|
||||||
LevelSettings settings;
|
LevelSettings settings;
|
||||||
settings.game_type = get_server_properties().get_int("game-mode", DEFAULT_GAME_MODE);
|
settings.game_type = get_server_properties().get_int("game-mode", DEFAULT_GAME_MODE);
|
||||||
@ -98,6 +94,7 @@ static void start_world(unsigned char *minecraft) {
|
|||||||
// Open Port
|
// Open Port
|
||||||
int port = get_server_properties().get_int("port", DEFAULT_PORT);
|
int port = get_server_properties().get_int("port", DEFAULT_PORT);
|
||||||
INFO("Listening On: %i", port);
|
INFO("Listening On: %i", port);
|
||||||
|
patch_address((void *) 0x16cd8, (void *) port);
|
||||||
(*Minecraft_hostMultiplayer)(minecraft, port);
|
(*Minecraft_hostMultiplayer)(minecraft, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,6 +298,15 @@ __attribute__((destructor)) static void _free_stdin_buffer() {
|
|||||||
stdin_buffer = NULL;
|
stdin_buffer = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Prevent STDIN From Being Closed
|
||||||
|
HOOK(close, int, (int fd)) {
|
||||||
|
if (fd != fileno(stdin)) {
|
||||||
|
ensure_close();
|
||||||
|
return (*real_close)(fd);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Handle Commands
|
// Handle Commands
|
||||||
static void handle_commands(unsigned char *minecraft) {
|
static void handle_commands(unsigned char *minecraft) {
|
||||||
@ -481,6 +487,9 @@ static const char *get_features() {
|
|||||||
loaded_features = true;
|
loaded_features = true;
|
||||||
|
|
||||||
features.clear();
|
features.clear();
|
||||||
|
if (get_server_properties().get_bool("peaceful-mode", DEFAULT_PEACEFUL_MODE)) {
|
||||||
|
features += "Peaceful Mode|";
|
||||||
|
}
|
||||||
if (get_server_properties().get_bool("force-mob-spawning", DEFAULT_FORCE_MOB_SPAWNING)) {
|
if (get_server_properties().get_bool("force-mob-spawning", DEFAULT_FORCE_MOB_SPAWNING)) {
|
||||||
features += "Force Mob Spawning|";
|
features += "Force Mob Spawning|";
|
||||||
}
|
}
|
||||||
@ -566,23 +575,23 @@ static void server_init() {
|
|||||||
|
|
||||||
// Prevent Main Player From Loading
|
// Prevent Main Player From Loading
|
||||||
unsigned char player_patch[4] = {0x00, 0x20, 0xa0, 0xe3}; // "mov r2, #0x0"
|
unsigned char player_patch[4] = {0x00, 0x20, 0xa0, 0xe3}; // "mov r2, #0x0"
|
||||||
patch((void *) 0x1685c, player_patch);
|
patch((void *) 0x16ef8, player_patch);
|
||||||
// Start World On Launch
|
// Start World On Launch
|
||||||
misc_run_on_update(Minecraft_update_injection);
|
misc_run_on_update(Minecraft_update_injection);
|
||||||
// Set Max Players
|
// Set Max Players
|
||||||
unsigned char max_players_patch[4] = {get_max_players(), 0x30, 0xa0, 0xe3}; // "mov r3, #MAX_PLAYERS"
|
unsigned char max_players_patch[4] = {get_max_players(), 0x30, 0xa0, 0xe3}; // "mov r3, #MAX_PLAYERS"
|
||||||
patch((void *) 0x166d0, max_players_patch);
|
patch((void *) 0x16cc0, max_players_patch);
|
||||||
// Custom Banned IP List
|
// Custom Banned IP List
|
||||||
overwrite((void *) RakNet_RakPeer_IsBanned, (void *) RakNet_RakPeer_IsBanned_injection);
|
overwrite((void *) RakNet_RakPeer_IsBanned, (void *) RakNet_RakPeer_IsBanned_injection);
|
||||||
|
|
||||||
// Show The MineCon Icon Next To MOTD In Server List
|
// Show The MineCon Icon Next To MOTD In Server List
|
||||||
if (get_server_properties().get_bool("show-minecon-badge", DEFAULT_SHOW_MINECON_BADGE)) {
|
if (get_server_properties().get_bool("show-minecon-badge", DEFAULT_SHOW_MINECON_BADGE)) {
|
||||||
unsigned char minecon_badge_patch[4] = {0x04, 0x1a, 0x9f, 0xe5}; // "ldr r1, [0x741f0]"
|
unsigned char minecon_badge_patch[4] = {0x5c, 0x1a, 0x9f, 0xe5}; // "ldr r1, [0x98af0]"
|
||||||
patch((void *) 0x737e4, minecon_badge_patch);
|
patch((void *) 0x9808c, minecon_badge_patch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log IPs
|
// Log IPs
|
||||||
overwrite_call((void *) 0x75e54, (void *) ServerSideNetworkHandler_onReady_ClientGeneration_ServerSideNetworkHandler_popPendingPlayer_injection);
|
overwrite_call((void *) 0x9a63c, (void *) ServerSideNetworkHandler_onReady_ClientGeneration_ServerSideNetworkHandler_popPendingPlayer_injection);
|
||||||
|
|
||||||
// Track TPS
|
// Track TPS
|
||||||
misc_run_on_tick(Minecraft_tick_injection);
|
misc_run_on_tick(Minecraft_tick_injection);
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
# ``sign`` Mod
|
|
||||||
This mod fixes sign placement.
|
|
@ -1,68 +0,0 @@
|
|||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <SDL/SDL.h>
|
|
||||||
#include <libreborn/libreborn.h>
|
|
||||||
#include <symbols/minecraft.h>
|
|
||||||
|
|
||||||
#include <mods/init/init.h>
|
|
||||||
#include <mods/feature/feature.h>
|
|
||||||
#include <mods/input/input.h>
|
|
||||||
#include <mods/sign/sign.h>
|
|
||||||
|
|
||||||
// Handle Backspace
|
|
||||||
static int32_t sdl_key_to_minecraft_key_injection(int32_t sdl_key) {
|
|
||||||
if (sdl_key == SDLK_BACKSPACE) {
|
|
||||||
return 8;
|
|
||||||
} else {
|
|
||||||
// Call Original Method
|
|
||||||
return (*sdl_key_to_minecraft_key)(sdl_key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open Sign Screen
|
|
||||||
static void LocalPlayer_openTextEdit_injection(unsigned char *local_player, unsigned char *sign) {
|
|
||||||
if (*(int32_t *) (sign + TileEntity_id_property_offset) == 4) {
|
|
||||||
unsigned char *minecraft = *(unsigned char **) (local_player + LocalPlayer_minecraft_property_offset);
|
|
||||||
unsigned char *screen = (unsigned char *) ::operator new(TEXT_EDIT_SCREEN_SIZE);
|
|
||||||
ALLOC_CHECK(screen);
|
|
||||||
screen = (*TextEditScreen)(screen, sign);
|
|
||||||
(*Minecraft_setScreen)(minecraft, screen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store Text Input
|
|
||||||
std::vector<char> input;
|
|
||||||
void sign_key_press(char key) {
|
|
||||||
input.push_back(key);
|
|
||||||
}
|
|
||||||
static void clear_input(__attribute__((unused)) unsigned char *minecraft) {
|
|
||||||
input.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle Text Input
|
|
||||||
static void TextEditScreen_updateEvents_injection(unsigned char *screen) {
|
|
||||||
// Call Original Method
|
|
||||||
(*Screen_updateEvents)(screen);
|
|
||||||
|
|
||||||
if (!*(bool *)(screen + Screen_passthrough_input_property_offset)) {
|
|
||||||
unsigned char *vtable = *(unsigned char **) screen;
|
|
||||||
for (char key : input) {
|
|
||||||
// Handle Normal Key
|
|
||||||
(*(Screen_keyboardNewChar_t *) (vtable + Screen_keyboardNewChar_vtable_offset))(screen, key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
clear_input(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init
|
|
||||||
void init_sign() {
|
|
||||||
if (feature_has("Fix Sign Placement", server_disabled)) {
|
|
||||||
// Handle Backspace
|
|
||||||
overwrite_calls((void *) sdl_key_to_minecraft_key, (void *) sdl_key_to_minecraft_key_injection);
|
|
||||||
// Fix Signs
|
|
||||||
patch_address(LocalPlayer_openTextEdit_vtable_addr, (void *) LocalPlayer_openTextEdit_injection);
|
|
||||||
patch_address(TextEditScreen_updateEvents_vtable_addr, (void *) TextEditScreen_updateEvents_injection);
|
|
||||||
// Clear Input On Input Tick
|
|
||||||
input_run_on_tick(clear_input);
|
|
||||||
}
|
|
||||||
}
|
|
@ -170,5 +170,5 @@ void init_textures() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Scale Animated Textures
|
// Scale Animated Textures
|
||||||
overwrite_call((void *) 0x53274, (void *) Textures_tick_glTexSubImage2D_injection);
|
overwrite_call((void *) 0x6bfd0, (void *) Textures_tick_glTexSubImage2D_injection);
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ static int32_t Button_hovered_injection(__attribute__((unused)) unsigned char *b
|
|||||||
// Check
|
// Check
|
||||||
return x >= button_x1 && x <= button_x2 && y >= button_y1 && y <= button_y2;
|
return x >= button_x1 && x <= button_x2 && y >= button_y1 && y <= button_y2;
|
||||||
}
|
}
|
||||||
static void LargeImageButton_render_GuiComponent_drawCenteredString_injection(unsigned char *component, unsigned char *font, std::string const& text, int32_t x, int32_t y, int32_t color) {
|
static void Button_render_GuiComponent_drawCenteredString_injection(unsigned char *component, unsigned char *font, std::string const& text, int32_t x, int32_t y, int32_t color) {
|
||||||
// Change Color On Hover
|
// Change Color On Hover
|
||||||
if (color == 0xe0e0e0 && Button_hovered_injection(component, NULL, 0, 0)) {
|
if (color == 0xe0e0e0 && Button_hovered_injection(component, NULL, 0, 0)) {
|
||||||
color = 0xffffa0;
|
color = 0xffffa0;
|
||||||
@ -39,6 +39,15 @@ static void LargeImageButton_render_GuiComponent_drawCenteredString_injection(un
|
|||||||
// Call Original Method
|
// Call Original Method
|
||||||
(*GuiComponent_drawCenteredString)(component, font, text, x, y, color);
|
(*GuiComponent_drawCenteredString)(component, font, text, x, y, color);
|
||||||
}
|
}
|
||||||
|
static void Button_renderBg_GuiComponent_blit_injection(unsigned char *component, int32_t x_dest, int32_t y_dest, int32_t x_src, int32_t y_src, int32_t width_dest, int32_t height_dest, int32_t width_src, int32_t height_src) {
|
||||||
|
// Change Color On Hover
|
||||||
|
if (y_src == 66 && Button_hovered_injection(component, NULL, 0, 0)) {
|
||||||
|
y_src += 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call Original Method
|
||||||
|
(*GuiComponent_blit)(component, x_dest, y_dest, x_src, y_src, width_dest, height_dest, width_src, height_src);
|
||||||
|
}
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
void init_touch() {
|
void init_touch() {
|
||||||
@ -50,46 +59,50 @@ void init_touch() {
|
|||||||
|
|
||||||
// Force Correct Toolbar Size
|
// Force Correct Toolbar Size
|
||||||
unsigned char toolbar_patch[4] = {0x01, 0x00, 0x50, 0xe3}; // "cmp r0, #0x1"
|
unsigned char toolbar_patch[4] = {0x01, 0x00, 0x50, 0xe3}; // "cmp r0, #0x1"
|
||||||
patch((void *) 0x257b0, toolbar_patch);
|
patch((void *) 0x2a6cc, toolbar_patch);
|
||||||
} else {
|
} else {
|
||||||
// Force Touch Inventory
|
// Force Touch Inventory
|
||||||
if (feature_has("Force Touch GUI Inventory", server_disabled)) {
|
if (feature_has("Force Touch GUI Inventory", server_disabled)) {
|
||||||
overwrite_call((void *) 0x2943c, (void *) operator_new_IngameBlockSelectionScreen_injection);
|
overwrite_call((void *) 0x2f628, (void *) operator_new_IngameBlockSelectionScreen_injection);
|
||||||
overwrite_call((void *) 0x29444, (void *) Touch_IngameBlockSelectionScreen);
|
overwrite_call((void *) 0x2f630, (void *) Touch_IngameBlockSelectionScreen);
|
||||||
// Make "Craft" And "Armor" Buttons Use Classic GUI Style (Button And TButton Have The Same Size)
|
// Make "Craft" And "Armor" Buttons Use Classic GUI Style (Button And TButton Have The Same Size)
|
||||||
overwrite_call((void *) 0x3b060, (void *) Button);
|
overwrite_call((void *) 0x4c6fc, (void *) Button);
|
||||||
overwrite_call((void *) 0x3b08c, (void *) Button);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Force Touch Button Behavior
|
// Force Touch Button Behavior
|
||||||
if (feature_has("Force Touch GUI Button Behavior", server_disabled)) {
|
if (feature_has("Force Touch GUI Button Behavior", server_disabled)) {
|
||||||
touch_buttons = 1;
|
touch_buttons = 1;
|
||||||
overwrite_call((void *) 0x1baf4, (void *) Minecraft_isTouchscreen_injection);
|
overwrite_call((void *) 0x2007c, (void *) Minecraft_isTouchscreen_injection);
|
||||||
overwrite_call((void *) 0x1be40, (void *) Minecraft_isTouchscreen_injection);
|
overwrite_call((void *) 0x2020c, (void *) Minecraft_isTouchscreen_injection);
|
||||||
overwrite_call((void *) 0x1c470, (void *) Minecraft_isTouchscreen_injection);
|
overwrite_call((void *) 0x20674, (void *) Minecraft_isTouchscreen_injection);
|
||||||
overwrite_call((void *) 0x1e868, (void *) Minecraft_isTouchscreen_injection);
|
overwrite_call((void *) 0x2f200, (void *) Minecraft_isTouchscreen_injection);
|
||||||
overwrite_call((void *) 0x290b8, (void *) Minecraft_isTouchscreen_injection);
|
overwrite_call((void *) 0x2fe9c, (void *) Minecraft_isTouchscreen_injection);
|
||||||
overwrite_call((void *) 0x29168, (void *) Minecraft_isTouchscreen_injection);
|
overwrite_call((void *) 0x213bc, (void *) Minecraft_isTouchscreen_injection);
|
||||||
overwrite_call((void *) 0x3e314, (void *) Minecraft_isTouchscreen_injection);
|
overwrite_call((void *) 0x24250, (void *) Minecraft_isTouchscreen_injection);
|
||||||
overwrite_call((void *) 0x2cbc0, (void *) Minecraft_isTouchscreen_injection);
|
overwrite_call((void *) 0x2f200, (void *) Minecraft_isTouchscreen_injection);
|
||||||
overwrite_call((void *) 0x2ea7c, (void *) Minecraft_isTouchscreen_injection);
|
overwrite_call((void *) 0x2f2a8, (void *) Minecraft_isTouchscreen_injection);
|
||||||
overwrite_call((void *) 0x4a438, (void *) Minecraft_isTouchscreen_injection);
|
overwrite_call((void *) 0x520c4, (void *) Minecraft_isTouchscreen_injection);
|
||||||
|
overwrite_call((void *) 0x33cac, (void *) Minecraft_isTouchscreen_injection);
|
||||||
|
overwrite_call((void *) 0x37e7c, (void *) Minecraft_isTouchscreen_injection);
|
||||||
|
overwrite_call((void *) 0x61a0c, (void *) Minecraft_isTouchscreen_injection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Improved Button Hover Behavior
|
// Improved Button Hover Behavior
|
||||||
if (touch_buttons && feature_has("Improved Button Hover Behavior", server_disabled)) {
|
if (touch_buttons && feature_has("Improved Button Hover Behavior", server_disabled)) {
|
||||||
overwrite((void *) Button_hovered, (void *) Button_hovered_injection);
|
overwrite_call((void *) 0x20190, (void *) Button_render_GuiComponent_drawCenteredString_injection);
|
||||||
overwrite_call((void *) 0x1ebd4, (void *) LargeImageButton_render_GuiComponent_drawCenteredString_injection);
|
overwrite_call((void *) 0x24108, (void *) Button_render_GuiComponent_drawCenteredString_injection);
|
||||||
|
overwrite_call((void *) 0x202d0, (void *) Button_renderBg_GuiComponent_blit_injection);
|
||||||
|
overwrite_call((void *) 0x20304, (void *) Button_renderBg_GuiComponent_blit_injection);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show Block Outlines
|
// Show Block Outlines
|
||||||
int block_outlines = feature_has("Show Block Outlines", server_disabled);
|
int block_outlines = feature_has("Show Block Outlines", server_disabled);
|
||||||
unsigned char outline_patch[4] = {(unsigned char) (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);
|
patch((void *) 0x6183c, outline_patch);
|
||||||
if (block_outlines) {
|
if (block_outlines) {
|
||||||
// Disable Broken Touchscreen-Specific Block Outline Behavior
|
// Disable Broken Touchscreen-Specific Block Outline Behavior
|
||||||
unsigned char block_highlight_patch[4] = {0x03, 0x00, 0x53, 0xe1}; // "cmp r3, r3"
|
unsigned char block_highlight_patch[4] = {0x03, 0x00, 0x53, 0xe1}; // "cmp r3, r3"
|
||||||
patch((void *) 0x494b4, block_highlight_patch);
|
patch((void *) 0x60bdc, block_highlight_patch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,8 @@ void init_version() {
|
|||||||
overwrite((void *) Common_getGameVersionString, (void *) Common_getGameVersionString_injection);
|
overwrite((void *) Common_getGameVersionString, (void *) Common_getGameVersionString_injection);
|
||||||
// Normal GUI
|
// Normal GUI
|
||||||
patch_address((void *) minecraft_pi_version, version_get());
|
patch_address((void *) minecraft_pi_version, version_get());
|
||||||
|
unsigned char normal_gui_version_length_patch[4] = {(unsigned char) strlen(version_get()), 0x20, 0xa0, 0xe3}; // "mov r2, #VERSION_LENGTH"
|
||||||
|
patch((void *) 0x4b11c, normal_gui_version_length_patch);
|
||||||
|
|
||||||
// Log
|
// Log
|
||||||
INFO("Starting Minecraft: Pi Edition (%s)", version_get());
|
INFO("Starting Minecraft: Pi Edition (%s)", version_get());
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user