diff --git a/dependencies/minecraft-pi/CMakeLists.txt b/dependencies/minecraft-pi/CMakeLists.txt index 647410dfc..7c719f41c 100644 --- a/dependencies/minecraft-pi/CMakeLists.txt +++ b/dependencies/minecraft-pi/CMakeLists.txt @@ -7,7 +7,7 @@ include(FetchContent) # Download FetchContent_Declare( 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) diff --git a/dependencies/minecraft-pi/minecraft-pi-0.1.0.tar.gz b/dependencies/minecraft-pi/minecraft-pi-0.1.0.tar.gz new file mode 100644 index 000000000..4be74a78f Binary files /dev/null and b/dependencies/minecraft-pi/minecraft-pi-0.1.0.tar.gz differ diff --git a/dependencies/minecraft-pi/minecraft-pi-0.1.1.tar.gz b/dependencies/minecraft-pi/minecraft-pi-0.1.1.tar.gz deleted file mode 100644 index 1bb0c93f6..000000000 Binary files a/dependencies/minecraft-pi/minecraft-pi-0.1.1.tar.gz and /dev/null differ diff --git a/images/start.png b/images/start.png index 6e8c64a8d..6604d98ea 100644 Binary files a/images/start.png and b/images/start.png differ diff --git a/launcher/data/client/lib/minecraft-pi-reborn-client/available-feature-flags b/launcher/data/client/lib/minecraft-pi-reborn-client/available-feature-flags index 9ae44aeed..034fe4db9 100644 --- a/launcher/data/client/lib/minecraft-pi-reborn-client/available-feature-flags +++ b/launcher/data/client/lib/minecraft-pi-reborn-client/available-feature-flags @@ -1,16 +1,17 @@ TRUE Touch GUI -TRUE Fix Bow & Arrow TRUE Fix Attacking FALSE Force Mob Spawning +TRUE Fancy Graphics TRUE Disable Autojump By Default TRUE Display Nametags By Default -TRUE Fix Sign Placement TRUE Show Block Outlines FALSE Expand Creative Inventory FALSE Remove Creative Mode Restrictions +FALSE Peaceful Mode TRUE Animated Water TRUE Remove Invalid Item Background TRUE Disable "gui_blocks" Atlas +TRUE Smooth Lighting FALSE 3D Anaglyph TRUE Fix Camera Rendering TRUE Implement Chat @@ -28,8 +29,8 @@ TRUE Implement Sound Engine TRUE Close Current Screen On Death FALSE Disable Raw Mouse Motion (Not Recommended) TRUE Fix Furnace Not Checking Item Auxiliary +FALSE Disable Hosting LAN Worlds TRUE Improved Cursor Rendering FALSE Disable V-Sync -TRUE Fix Options Screen FALSE Force Touch Inventory TRUE Fix Pause Menu diff --git a/mods/CMakeLists.txt b/mods/CMakeLists.txt index 6ffe03f31..5ec360f86 100644 --- a/mods/CMakeLists.txt +++ b/mods/CMakeLists.txt @@ -28,7 +28,7 @@ if(MCPI_SERVER_MODE) add_library(server SHARED src/server/server.cpp src/server/server_properties.cpp) target_link_libraries(server reborn-patch symbols feature home misc compat dl media-layer-core pthread) else() - target_link_libraries(compat input sign chat home dl) + target_link_libraries(compat input chat home dl) target_link_libraries(chat input) @@ -41,12 +41,9 @@ else() add_library(camera SHARED src/camera/camera.cpp) target_link_libraries(camera reborn-patch symbols media-layer-core feature home) - 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 reborn-patch symbols creative feature media-layer-core) - add_library(sign SHARED src/sign/sign.cpp) - target_link_libraries(sign reborn-patch symbols feature input) - add_library(touch SHARED src/touch/touch.cpp) target_link_libraries(touch reborn-patch symbols feature) @@ -74,8 +71,8 @@ target_link_libraries(death reborn-patch symbols feature) add_library(misc SHARED src/misc/misc.c src/misc/misc.cpp src/misc/logging.cpp) target_link_libraries(misc reborn-patch symbols media-layer-core feature GLESv1_CM) -add_library(options SHARED src/options/options.c src/options/options.cpp) -target_link_libraries(options reborn-patch symbols feature home) +add_library(options SHARED src/options/options.c) +target_link_libraries(options reborn-patch symbols feature) add_library(home SHARED src/home/home.c) target_link_libraries(home reborn-patch symbols) @@ -88,7 +85,7 @@ target_link_libraries(init compat game-mode misc death options chat creative hom if(MCPI_SERVER_MODE) target_link_libraries(init server) else() - target_link_libraries(init multiplayer sound camera input sign touch textures atlas) + target_link_libraries(init multiplayer sound camera input touch textures atlas) if(NOT MCPI_HEADLESS_MODE) target_link_libraries(init benchmark) endif() @@ -99,7 +96,7 @@ install(TARGETS init compat readdir feature game-mode misc death options chat cr if(MCPI_SERVER_MODE) install(TARGETS server DESTINATION "${MCPI_INSTALL_DIR}/mods") else() - install(TARGETS multiplayer sound override camera input sign touch textures atlas DESTINATION "${MCPI_INSTALL_DIR}/mods") + install(TARGETS multiplayer sound override camera input touch textures atlas DESTINATION "${MCPI_INSTALL_DIR}/mods") if(NOT MCPI_HEADLESS_MODE) install(TARGETS benchmark DESTINATION "${MCPI_INSTALL_DIR}/mods") endif() diff --git a/mods/src/atlas/atlas.cpp b/mods/src/atlas/atlas.cpp index f0c883717..66ec62805 100644 --- a/mods/src/atlas/atlas.cpp +++ b/mods/src/atlas/atlas.cpp @@ -68,9 +68,9 @@ static void Tesselator_colorABGR_injection(unsigned char *tesselator, int32_t co // Call Original Method (*Tesselator_colorABGR)(tesselator, color); } -static void Tesselator_begin_injection(unsigned char *tesselator, int32_t mode) { +static void Tesselator_begin_injection(unsigned char *tesselator) { // Call Original Method - (*Tesselator_begin)(tesselator, mode); + (*Tesselator_begin)(tesselator); // Fix Furnace UI if (item_color_fix_mode != 0) { @@ -124,15 +124,15 @@ void init_atlas() { // Disable The gui_blocks Atlas Which Contains Pre-Rendered Textures For Blocks In The Inventory if (feature_has("Disable \"gui_blocks\" Atlas", server_disabled)) { - unsigned char disable_gui_blocks_atlas_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop" - patch((void *) 0x63c2c, disable_gui_blocks_atlas_patch); + unsigned char disable_gui_blocks_atlas_patch[4] = {0x45, 0x00, 0x00, 0xea}; // "b 0x7f740" + patch((void *) 0x7f624, disable_gui_blocks_atlas_patch); // Fix Grass And Leaves Inventory Rendering When The gui_blocks Atlas Is Disabled overwrite_calls((void *) ItemRenderer_renderGuiItemCorrect, (void *) ItemRenderer_renderGuiItemCorrect_injection); // Fix Furnace UI overwrite_calls((void *) Tesselator_colorABGR, (void *) Tesselator_colorABGR_injection); overwrite_calls((void *) Tesselator_begin, (void *) Tesselator_begin_injection); overwrite_calls((void *) Tesselator_color, (void *) Tesselator_color_injection); - overwrite_call((void *) 0x32324, (void *) FurnaceScreen_render_ItemRenderer_renderGuiItem_one_injection); - overwrite_call((void *) 0x1e21c, (void *) InventoryPane_renderBatch_Tesselator_color_injection); + overwrite_call((void *) 0x3bff4, (void *) FurnaceScreen_render_ItemRenderer_renderGuiItem_one_injection); + overwrite_call((void *) 0x23c0c, (void *) InventoryPane_renderBatch_Tesselator_color_injection); } } diff --git a/mods/src/camera/camera.cpp b/mods/src/camera/camera.cpp index 2679fd5be..f2b223dc8 100644 --- a/mods/src/camera/camera.cpp +++ b/mods/src/camera/camera.cpp @@ -41,6 +41,6 @@ void init_camera() { // Enable TripodCameraRenderer overwrite_calls((void *) EntityRenderDispatcher, (void *) EntityRenderDispatcher_injection); // 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); } } diff --git a/mods/src/chat/chat.cpp b/mods/src/chat/chat.cpp index 17c5719f7..7e2569fef 100644 --- a/mods/src/chat/chat.cpp +++ b/mods/src/chat/chat.cpp @@ -72,7 +72,8 @@ static void CommandServer_parse_CommandServer_dispatchPacket_injection(unsigned // 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) { - 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) { char *username = *(char **) (player + Player_username_property_offset); char *message = *(char **) (chat_packet + ChatPacket_message_property_offset); @@ -123,9 +124,9 @@ void init_chat() { if (_chat_enabled) { // Disable Original ChatPacket Loopback 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 - overwrite_call((void *) 0x6b518, (void *) CommandServer_parse_CommandServer_dispatchPacket_injection); + overwrite_call((void *) 0x8c1a4, (void *) CommandServer_parse_CommandServer_dispatchPacket_injection); // Re-Broadcast ChatPacket patch_address(ServerSideNetworkHandler_handle_ChatPacket_vtable_addr, (void *) ServerSideNetworkHandler_handle_ChatPacket_injection); // Send Messages On Input Tick diff --git a/mods/src/compat/bcm_host.c b/mods/src/compat/bcm_host.c index 954c4272e..3e7a8c80a 100644 --- a/mods/src/compat/bcm_host.c +++ b/mods/src/compat/bcm_host.c @@ -8,11 +8,11 @@ static void do_nothing() { // Patch bcm_host Calls __attribute__((constructor)) static void patch_bcm_host_calls() { // Disable bcm_host Calls - overwrite_call((void *) 0xdfec, (void *) do_nothing); // bcm_host_init - overwrite_call((void *) 0x12418, (void *) do_nothing); // bcm_host_deinit - overwrite_call((void *) 0x125a8, (void *) do_nothing); // graphics_get_display_size - overwrite_call((void *) 0x125dc, (void *) do_nothing); // vc_dispmanx_display_open - overwrite_call((void *) 0x125e8, (void *) do_nothing); // vc_dispmanx_update_start - overwrite_call((void *) 0x12618, (void *) do_nothing); // vc_dispmanx_element_add - overwrite_call((void *) 0x12624, (void *) do_nothing); // vc_dispmanx_update_submit_sync + overwrite_call((void *) 0xdbe8, (void *) do_nothing); // bcm_host_init + overwrite_call((void *) 0x11c54, (void *) do_nothing); // bcm_host_deinit + overwrite_call((void *) 0x11de4, (void *) do_nothing); // graphics_get_display_size + overwrite_call((void *) 0x11e18, (void *) do_nothing); // vc_dispmanx_display_open + overwrite_call((void *) 0x11e28, (void *) do_nothing); // vc_dispmanx_update_start + overwrite_call((void *) 0x11e58, (void *) do_nothing); // vc_dispmanx_element_add + overwrite_call((void *) 0x11e64, (void *) do_nothing); // vc_dispmanx_update_submit_sync } diff --git a/mods/src/compat/compat.c b/mods/src/compat/compat.c index 1f75fffd9..33f5e69f1 100644 --- a/mods/src/compat/compat.c +++ b/mods/src/compat/compat.c @@ -13,7 +13,6 @@ #include #include "../input/input.h" -#include "../sign/sign.h" #include "../chat/chat.h" #include "../home/home.h" @@ -84,20 +83,12 @@ HOOK(SDL_PollEvent, int, (SDL_Event *event)) { } case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { - // Track Right-Click State - if (event->button.button == SDL_BUTTON_RIGHT) { - input_set_is_right_click(event->button.state != SDL_RELEASED); - } else if (event->button.button == SDL_BUTTON_LEFT) { + // Track Left-Click State + if (event->button.button == SDL_BUTTON_LEFT) { input_set_is_left_click(event->button.state != SDL_RELEASED); } 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) { diff --git a/mods/src/compat/egl.c b/mods/src/compat/egl.c index 42fbf0483..1042be80f 100644 --- a/mods/src/compat/egl.c +++ b/mods/src/compat/egl.c @@ -23,17 +23,17 @@ static EGLBoolean eglSwapBuffers_injection(__attribute__((unused)) EGLDisplay di __attribute__((constructor)) static void patch_egl_calls() { // Disable EGL Calls unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop" - patch((void *) 0x1250c, nop_patch); // eglTerminate - patch((void *) 0x12580, nop_patch); // eglBindAPI - overwrite_call((void *) 0x12638, (void *) eglCreateWindowSurface_injection); // eglCreateWindowSurface - patch((void *) 0x12578, nop_patch); // eglChooseConfig - patch((void *) 0x1255c, nop_patch); // eglInitialize - patch((void *) 0x124f0, nop_patch); // eglMakeCurrent #1 - patch((void *) 0x12654, nop_patch); // eglMakeCurrent #2 - overwrite_call((void *) 0x124dc, (void *) eglSwapBuffers_injection); // eglSwapBuffers #1 - overwrite_call((void *) 0x14b6c, (void *) eglSwapBuffers_injection); // eglSwapBuffers #2 - overwrite_call((void *) 0x1254c, (void *) eglGetDisplay_injection); // eglGetDisplay - patch((void *) 0x124fc, nop_patch); // eglDestroySurface #1 - patch((void *) 0x12504, nop_patch); // eglDestroySurface #2 - overwrite_call((void *) 0x12594, (void *) eglCreateContext_injection); // eglCreateContext + patch((void *) 0x11d3c, nop_patch); // eglTerminate + patch((void *) 0x11dbc, nop_patch); // eglBindAPI + overwrite_call((void *) 0x11e78, (void *) eglCreateWindowSurface_injection); // eglCreateWindowSurface + patch((void *) 0x11db4, nop_patch); // eglChooseConfig + patch((void *) 0x11d98, nop_patch); // eglInitialize + patch((void *) 0x11d20, nop_patch); // eglMakeCurrent #1 + patch((void *) 0x11e90, nop_patch); // eglMakeCurrent #2 + overwrite_call((void *) 0x11d0c, (void *) eglSwapBuffers_injection); // eglSwapBuffers #1 + overwrite_call((void *) 0x14ce4, (void *) eglSwapBuffers_injection); // eglSwapBuffers #2 + overwrite_call((void *) 0x11d7c, (void *) eglGetDisplay_injection); // eglGetDisplay + patch((void *) 0x11d2c, nop_patch); // eglDestroySurface #1 + patch((void *) 0x11d34, nop_patch); // eglDestroySurface #2 + overwrite_call((void *) 0x11dd0, (void *) eglCreateContext_injection); // eglCreateContext } diff --git a/mods/src/compat/x11.c b/mods/src/compat/x11.c index 27dbb73f9..f246051cd 100644 --- a/mods/src/compat/x11.c +++ b/mods/src/compat/x11.c @@ -23,6 +23,6 @@ static int XGetWindowAttributes_injection(__attribute__((unused)) void *display, // Patch X11 Calls __attribute__((constructor)) static void patch_x11_calls() { // Disable X11 Calls - overwrite_call((void *) 0x132a4, (void *) XGetWindowAttributes_injection); // XGetWindowAttributes - overwrite_call((void *) 0x132d4, (void *) XTranslateCoordinates_injection); // XTranslateCoordinates + overwrite_call((void *) 0x12f2c, (void *) XGetWindowAttributes_injection); // XGetWindowAttributes + overwrite_call((void *) 0x12f64, (void *) XTranslateCoordinates_injection); // XTranslateCoordinates } diff --git a/mods/src/creative/creative.cpp b/mods/src/creative/creative.cpp index 7a272a1bb..282cad26f 100644 --- a/mods/src/creative/creative.cpp +++ b/mods/src/creative/creative.cpp @@ -1,3 +1,5 @@ +#include + #include #include @@ -39,7 +41,6 @@ static int32_t Inventory_setupDefault_FillingContainer_addItem_call_injection(un // Add Tiles inventory_add_item(filling_container, *Tile_water, 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_glowingObsidian, true); inventory_add_item(filling_container, *Tile_web, true); @@ -83,21 +84,40 @@ static int32_t Inventory_setupDefault_FillingContainer_addItem_call_injection(un } #endif -// Hook Specific TileItem Constructor -static unsigned char *Tile_initTiles_TileItem_injection(unsigned char *tile_item, int32_t id) { +// Store All Default TileItems +static std::vector &get_default_tile_items() { + static std::vector 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 - unsigned char *ret = (*TileItem)(tile_item, id); + unsigned char *ret = (unsigned char *) ::operator new(AUX_DATA_TILE_ITEM_SIZE); - // Switch VTable - *(unsigned char **) tile_item = AuxDataTileItem_vtable; - // Configure Item - *(bool *) (tile_item + Item_is_stacked_by_data_property_offset) = true; - *(int32_t *) (tile_item + Item_max_damage_property_offset) = 0; - *(unsigned char **) (tile_item + AuxDataTileItem_icon_tile_property_offset) = Tile_tiles[id + 0x100]; + // Store + get_default_tile_items().push_back(ret); // Return return ret; } +// Modify All Default TileItems +static void Tile_initTiles_injection() { + // Call Original Method + (*Tile_initTiles)(); + + // 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 + *(unsigned char **) tile_item = AuxDataTileItem_vtable; + // Configure Item + *(bool *) (tile_item + Item_is_stacked_by_data_property_offset) = true; + *(int32_t *) (tile_item + Item_max_damage_property_offset) = 0; + *(unsigned char **) (tile_item + AuxDataTileItem_icon_tile_property_offset) = Tile_tiles[id]; + } + get_default_tile_items().clear(); +} // Check Restriction Status static int is_restricted = 1; @@ -110,17 +130,16 @@ void init_creative() { // Add Extra Items To Creative Inventory (Only Replace Specific Function Call) if (feature_has("Expand Creative Inventory", server_enabled)) { #ifndef MCPI_SERVER_MODE - overwrite_call((void *) 0x8e0fc, (void *) Inventory_setupDefault_FillingContainer_addItem_call_injection); + overwrite_call((void *) 0xcdcf4, (void *) Inventory_setupDefault_FillingContainer_addItem_call_injection); #endif // Use AuxDataTileItem by default instead of TileItem, so tiles in the Creative // Inventory can have arbitrary auxiliary values. { - // Fix Size - unsigned char size_patch[4] = {AUX_DATA_TILE_ITEM_SIZE, 0x00, 0xa0, 0xe3}; // "mov r0, #AUX_DATA_TILE_ITEM_SIZE" - patch((void *) 0xc6f64, size_patch); - // Hook Constructor - overwrite_call((void *) 0xc6f74, (void *) Tile_initTiles_TileItem_injection); + // Hook TileItem ::operator new To Store TileItems + overwrite_call((void *) 0x1295a4, (void *) Tile_initTiles_operator_new_injection); + // Modify Stored TileItems + overwrite_calls((void *) Tile_initTiles, (void *) Tile_initTiles_injection); } } @@ -128,34 +147,35 @@ void init_creative() { if (feature_has("Remove Creative Mode Restrictions", server_disabled)) { unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop" // Remove Restrictions - patch((void *) 0x43ee8, nop_patch); - patch((void *) 0x43f3c, nop_patch); - patch((void *) 0x43f8c, nop_patch); - patch((void *) 0x43fd8, nop_patch); - patch((void *) 0x99010, nop_patch); + patch((void *) 0x59e68, nop_patch); + patch((void *) 0x59ebc, nop_patch); + patch((void *) 0x59f10, nop_patch); + unsigned char allow_eating_patch[4] = {0x02, 0x00, 0x00, 0xea}; // "b 0xddcbc" + patch((void *) 0xddcac, allow_eating_patch); // Fix UI - patch((void *) 0x341c0, nop_patch); - patch((void *) 0x3adb4, nop_patch); - patch((void *) 0x3b374, nop_patch); + patch((void *) 0x4cb88, nop_patch); + unsigned char fix_ui_patch[4] = {0x05, 0x00, 0x55, 0xe1}; // "cmp r5, r5" + patch((void *) 0x4bf20, fix_ui_patch); // 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 *) 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 - patch((void *) 0x1e3f4, nop_patch); - unsigned char slot_count_patch[4] = {0x18, 0x00, 0x00, 0xea}; // "b 0x27110" - patch((void *) 0x270a8, slot_count_patch); - patch((void *) 0x33954, nop_patch); + patch((void *) 0x23d4c, nop_patch); + patch((void *) 0x2c570, nop_patch); + patch((void *) 0x3eec0, nop_patch); // Maximize Creative Inventory Stack Size - unsigned char maximize_stack_patch[4] = {0xff, 0xc0, 0xa0, 0xe3}; // "mov r12, 0xff" - patch((void *) 0x8e104, maximize_stack_patch); + unsigned char maximize_stack_patch[4] = {0xff, 0x60, 0xa0, 0xe3}; // "mov r6, 0xff" + patch((void *) 0xccf80, maximize_stack_patch); // 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 is_restricted = 0; } diff --git a/mods/src/game-mode/game-mode.c b/mods/src/game-mode/game-mode.c index 04d4b592c..a3b8639ba 100644 --- a/mods/src/game-mode/game-mode.c +++ b/mods/src/game-mode/game-mode.c @@ -14,14 +14,14 @@ static void set_is_survival(int new_is_survival) { // Correct Inventpry UI 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 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 - overwrite_call((void *) 0x16ef4, new_is_survival ? SurvivalMode : CreatorMode); + overwrite_call((void *) 0x178b8, new_is_survival ? SurvivalMode : CreatorMode); is_survival = new_is_survival; } @@ -54,11 +54,11 @@ void init_game_mode() { overwrite_calls((void *) Minecraft_setIsCreativeMode, (void *) Minecraft_setIsCreativeMode_injection); // 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 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 overwrite_calls((void *) Minecraft_getCreator, (void *) Minecraft_getCreator_injection); @@ -69,7 +69,7 @@ void init_game_mode() { // Allow Joining Survival Servers if (feature_has("Allow Joining Survival Servers", server_enabled)) { - unsigned char server_patch[4] = {0x0f, 0x00, 0x00, 0xea}; // "b 0x6dcb4" - patch((void *) 0x6dc70, server_patch); + unsigned char server_patch[4] = {0x16, 0x00, 0x00, 0xea}; // "b 0x8e998" + patch((void *) 0x8e938, server_patch); } } diff --git a/mods/src/game-mode/game-mode.cpp b/mods/src/game-mode/game-mode.cpp index 0fa98a929..5d6e3c6cb 100644 --- a/mods/src/game-mode/game-mode.cpp +++ b/mods/src/game-mode/game-mode.cpp @@ -9,17 +9,19 @@ static unsigned char *get_minecraft_from_screen(unsigned char *screen) { return *(unsigned char **) (screen + Screen_minecraft_property_offset); } -// Redirect Create World Button To SimpleLevelChooseScreen +// Redirect Create World Button To DemoLevelChooseScreen #define WORLD_NAME "world" static void SelectWorldScreen_tick_injection(unsigned char *screen) { bool create_world = *(bool *) (screen + SelectWorldScreen_should_create_world_property_offset); if (create_world) { // Get New World Name + free(*demo_level_name); std::string new_name = (*SelectWorldScreen_getUniqueLevelName)(screen, WORLD_NAME); - // Create SimpleLevelChooseScreen - unsigned char *new_screen = (unsigned char *) ::operator new(SIMPLE_LEVEL_CHOOSE_SCREEN_SIZE); + patch_address((void *) demo_level_name, (void *) strdup(new_name.c_str())); + // Create DemoLevelChooseScreen + unsigned char *new_screen = (unsigned char *) ::operator new(DEMO_LEVEL_CHOOSE_SCREEN_SIZE); ALLOC_CHECK(new_screen); - (*SimpleChooseLevelScreen)(new_screen, new_name); + (*DemoChooseLevelScreen)(new_screen); // Set Screen unsigned char *minecraft = get_minecraft_from_screen(screen); (*Minecraft_setScreen)(minecraft, new_screen); @@ -33,11 +35,13 @@ static void Touch_SelectWorldScreen_tick_injection(unsigned char *screen) { bool create_world = *(bool *) (screen + Touch_SelectWorldScreen_should_create_world_property_offset); if (create_world) { // Get New World Name + free(*demo_level_name); std::string new_name = (*Touch_SelectWorldScreen_getUniqueLevelName)(screen, WORLD_NAME); - // Create SimpleLevelChooseScreen - unsigned char *new_screen = (unsigned char *) ::operator new(SIMPLE_LEVEL_CHOOSE_SCREEN_SIZE); + patch_address((void *) demo_level_name, (void *) strdup(new_name.c_str())); + // Create DemoLevelChooseScreen + unsigned char *new_screen = (unsigned char *) ::operator new(DEMO_LEVEL_CHOOSE_SCREEN_SIZE); ALLOC_CHECK(new_screen); - (*SimpleChooseLevelScreen)(new_screen, new_name); + (*DemoChooseLevelScreen)(new_screen); // Set Screen unsigned char *minecraft = get_minecraft_from_screen(screen); (*Minecraft_setScreen)(minecraft, new_screen); @@ -52,8 +56,16 @@ void _init_game_mode_cpp() { // Hijack Create World Button patch_address(SelectWorldScreen_tick_vtable_addr, (void *) SelectWorldScreen_tick_injection); patch_address(Touch_SelectWorldScreen_tick_vtable_addr, (void *) Touch_SelectWorldScreen_tick_injection); - // Make The SimpleChooseLevelScreen Back Button Go To SelectWorldScreen Instead Of StartMenuScreen - unsigned char simple_choose_level_screen_back_button_patch[4] = {0x05, 0x10, 0xa0, 0xe3}; // "mov r1, #0x5" - patch((void *) 0x31144, simple_choose_level_screen_back_button_patch); - patch((void *) 0x3134c, simple_choose_level_screen_back_button_patch); + // Make The DemoChooseLevelScreen Back Button Go To SelectWorldScreen Instead Of StartMenuScreen + unsigned char demo_choose_level_screen_back_button_patch[4] = {0x05, 0x10, 0xa0, 0xe3}; // "mov r1, #0x5" + patch((void *) 0x3a298, demo_choose_level_screen_back_button_patch); + patch((void *) 0x39fa0, demo_choose_level_screen_back_button_patch); +} +// Reset Level Name +__attribute__((constructor)) static void _reset_level_name() { + patch_address((void *) demo_level_name, NULL); +} +// Free Level Name +__attribute__((destructor)) static void _free_level_name() { + free(*demo_level_name); } diff --git a/mods/src/home/home.c b/mods/src/home/home.c index 1474b8aae..65fd81a27 100644 --- a/mods/src/home/home.c +++ b/mods/src/home/home.c @@ -24,11 +24,9 @@ __attribute__((destructor)) static void _free_home() { // Init void init_home() { // 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()); - // Change Directory To Binary Directory Manually - unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop" - patch((void *) 0xe0ac, nop_patch); + // Change Directory To Binary Directory char *binary_directory = get_mcpi_directory(); if (chdir(binary_directory) != 0) { ERR("Unable To Change Directory: %s", strerror(errno)); diff --git a/mods/src/init/init.c b/mods/src/init/init.c index c1a0adbeb..e13d3fa1a 100644 --- a/mods/src/init/init.c +++ b/mods/src/init/init.c @@ -13,7 +13,6 @@ __attribute__((constructor)) static void init() { init_multiplayer(); init_sound(); init_input(); - init_sign(); init_creative(); init_camera(); init_touch(); diff --git a/mods/src/init/init.h b/mods/src/init/init.h index db001036b..780e1504a 100644 --- a/mods/src/init/init.h +++ b/mods/src/init/init.h @@ -13,7 +13,6 @@ void init_server(); void init_multiplayer(); void init_sound(); void init_input(); -void init_sign(); void init_creative(); void init_camera(); void init_touch(); diff --git a/mods/src/input/bow.c b/mods/src/input/bow.c deleted file mode 100644 index 157237a8d..000000000 --- a/mods/src/input/bow.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include - -#include "../feature/feature.h" -#include "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); -} diff --git a/mods/src/input/input.cpp b/mods/src/input/input.cpp index c7b5ef7d5..e0da1bb9c 100644 --- a/mods/src/input/input.cpp +++ b/mods/src/input/input.cpp @@ -39,9 +39,6 @@ void init_input() { // Item Dropping _init_drop(); - // Enable Bow & Arrow Fix - _init_bow(); - // Loop overwrite_calls((void *) Minecraft_tickInput, (void *) Minecraft_tickInput_injection); diff --git a/mods/src/input/input.h b/mods/src/input/input.h index 83fe11026..5f55c2be7 100644 --- a/mods/src/input/input.h +++ b/mods/src/input/input.h @@ -7,7 +7,6 @@ extern "C" { typedef void (*input_tick_function_t)(unsigned char *minecraft); void input_run_on_tick(input_tick_function_t function); -void input_set_is_right_click(int val); void input_hide_gui(); void input_third_person(); int input_back(); @@ -18,7 +17,6 @@ void input_set_is_left_click(int val); void input_set_mouse_grab_state(int state); __attribute__((visibility("internal"))) void _init_attack(); -__attribute__((visibility("internal"))) void _init_bow(); __attribute__((visibility("internal"))) void _init_misc(); __attribute__((visibility("internal"))) void _init_toggle(); __attribute__((visibility("internal"))) void _init_drop(); diff --git a/mods/src/input/misc.c b/mods/src/input/misc.c index 5be260f63..ae4b0c81c 100644 --- a/mods/src/input/misc.c +++ b/mods/src/input/misc.c @@ -87,7 +87,7 @@ void _init_misc() { overwrite_calls((void *) Gui_handleClick, (void *) Gui_handleClick_injection); } // 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_mouse_grab); diff --git a/mods/src/misc/misc.c b/mods/src/misc/misc.c index beca6ae3e..36a7b565d 100644 --- a/mods/src/misc/misc.c +++ b/mods/src/misc/misc.c @@ -201,12 +201,17 @@ static void GameRenderer_render_injection(unsigned char *game_renderer, float pa } } +// Stop Checking GL Renderer +static bool AppPlatform_isPowerVR_injection(__attribute__((unused)) unsigned char *app_platform) { + return 0; +} + // Init void init_misc() { // 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)) { 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); } // Render Selected Item Text + Hide Chat Messages @@ -223,7 +228,7 @@ void init_misc() { overwrite_calls((void *) RakNet_RakString, (void *) RakNet_RakString_injection); // 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 overwrite_calls((void *) RakNetInstance, (void *) RakNetInstance_injection); @@ -242,7 +247,7 @@ void init_misc() { if (feature_has("Improved Cursor Rendering", server_disabled)) { // Disable Normal Cursor Rendering 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 overwrite_calls((void *) GameRenderer_render, (void *) GameRenderer_render_injection); } @@ -252,6 +257,9 @@ void init_misc() { media_disable_vsync(); } + // Stop Checking GL Renderer + overwrite((void *) AppPlatform_isPowerVR, (void *) AppPlatform_isPowerVR_injection); + // Init C++ And Logging _init_misc_cpp(); _init_misc_logging(); diff --git a/mods/src/options/options.c b/mods/src/options/options.c index 870448f14..acf0631e1 100644 --- a/mods/src/options/options.c +++ b/mods/src/options/options.c @@ -5,7 +5,6 @@ #include "../feature/feature.h" #include "../init/init.h" -#include "options.h" // Force Mob Spawning static bool LevelData_getSpawnMobs_injection(__attribute__((unused)) unsigned char *level_data) { @@ -42,36 +41,32 @@ static char *get_username() { return username; } +static int fancy_graphics; +static int peaceful_mode; static int anaglyph; +static int smooth_lighting; static int render_distance; +static int server_visible; // Configure Options -unsigned char *stored_options = NULL; -static void Options_initDefaultValue_injection(unsigned char *options) { +static void Minecraft_init_injection(unsigned char *this) { // Call Original Method - (*Options_initDefaultValue)(options); + (*Minecraft_init)(this); + unsigned char *options = this + Minecraft_options_property_offset; + // Enable Fancy Graphics + *(options + Options_fancy_graphics_property_offset) = fancy_graphics; // Enable Crosshair In Touch GUI *(options + Options_split_controls_property_offset) = 1; + // Peaceful Mode + *(int32_t *) (options + Options_game_difficulty_property_offset) = peaceful_mode ? 0 : 2; // 3D Anaglyph *(options + Options_3d_anaglyph_property_offset) = anaglyph; + // Smooth Lighting + *(options + Options_ambient_occlusion_property_offset) = smooth_lighting; // Render Distance *(int32_t *) (options + Options_render_distance_property_offset) = render_distance; - - // Default Graphics Settings - *(options + Options_fancy_graphics_property_offset) = 1; - *(options + Options_ambient_occlusion_property_offset) = 1; - - // Store - stored_options = options; -} - -// 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); + // Server Visible + *(options + Options_server_visible_property_offset) = server_visible; } // Init @@ -81,6 +76,10 @@ void init_options() { 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 anaglyph = feature_has("3D Anaglyph", server_disabled); // Render Distance @@ -90,9 +89,11 @@ void init_options() { #else render_distance = 3; #endif + // Server Visible + server_visible = !feature_has("Disable Hosting LAN Worlds", server_disabled); // Set Options - overwrite_calls((void *) Options_initDefaultValue, (void *) Options_initDefaultValue_injection); + overwrite_calls((void *) Minecraft_init, (void *) Minecraft_init_injection); // Change Username const char *username = get_username(); @@ -103,23 +104,26 @@ void init_options() { ERR("Default Username Is Invalid"); } patch_address((void *) default_username, (void *) username); + unsigned char username_length_patch[4] = {(unsigned char) strlen(username), 0x20, 0xa0, 0xe3}; // "mov r2, #USERNAME_LENGTH" + patch((void *) 0x1ba2c, username_length_patch); // Disable Autojump By Default if (feature_has("Disable Autojump By Default", server_disabled)) { - unsigned char autojump_patch[4] = {0x00, 0x30, 0xa0, 0xe3}; // "mov r3, #0x0" - patch((void *) 0x44b90, autojump_patch); + unsigned char autojump_patch[4] = {0x00, 0x00, 0xa0, 0xe3}; // "mov r0, #0x0" + patch((void *) 0x5b148, autojump_patch); } // Display Nametags By Default if (feature_has("Display Nametags By Default", server_disabled)) { // r6 = 0x1 - // r5 = 0x0 - unsigned char display_nametags_patch[4] = {0x1d, 0x60, 0xc0, 0xe5}; // "strb r6, [r0, #0x1d]" - patch((void *) 0xa6628, display_nametags_patch); + // r12 = 0x0 + unsigned char display_nametags_patch[4] = {0x1d, 0x60, 0xc4, 0xe5}; // "strb r6, [r4, #0x1d]" + patch((void *) 0xf2d44, display_nametags_patch); } - // Smooth Lighting - overwrite_calls((void *) TileRenderer_tesselateBlockInWorld, (void *) TileRenderer_tesselateBlockInWorld_injection); - - // Init C++ - _init_options_cpp(); + // Enable Smooth Lighting + smooth_lighting = feature_has("Smooth Lighting", server_disabled); + if (smooth_lighting) { + unsigned char smooth_lighting_patch[4] = {0x01, 0x00, 0x53, 0xe3}; // "cmp r3, #0x1" + patch((void *) 0x73b74, smooth_lighting_patch); + } } diff --git a/mods/src/options/options.cpp b/mods/src/options/options.cpp deleted file mode 100644 index bcd866183..000000000 --- a/mods/src/options/options.cpp +++ /dev/null @@ -1,226 +0,0 @@ -#include -#include -#include -#include - -#include - -#include "../feature/feature.h" -#include "../home/home.h" -#include "options.h" - -#include - -// 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 &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 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 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, unsigned char *unknown_object, std::string const& name, unsigned char *option) { - // Modify - 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; - } - - // Call Original Method - (*OptionsPane_unknown_toggle_creating_function)(options_pane, unknown_object, 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 *rendered_buttons = (std::vector *) (screen + Screen_rendered_buttons_property_offset); - std::vector *selectable_buttons = (std::vector *) (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); -} diff --git a/mods/src/options/options.h b/mods/src/options/options.h deleted file mode 100644 index 924c4e2c1..000000000 --- a/mods/src/options/options.h +++ /dev/null @@ -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 diff --git a/mods/src/server/server.cpp b/mods/src/server/server.cpp index c9c1a390c..e6a9089b9 100644 --- a/mods/src/server/server.cpp +++ b/mods/src/server/server.cpp @@ -54,6 +54,7 @@ static ServerProperties &get_server_properties() { #define DEFAULT_PORT "19132" #define DEFAULT_SEED "" #define DEFAULT_FORCE_MOB_SPAWNING "false" +#define DEFAULT_PEACEFUL_MODE "false" #define DEFAULT_WORLD_NAME "world" #define DEFAULT_MAX_PLAYERS "4" #define DEFAULT_WHITELIST "false" @@ -87,6 +88,7 @@ static void start_world(unsigned char *minecraft) { // Open Port int port = get_server_properties().get_int("port", DEFAULT_PORT); INFO("Listening On: %i", port); + patch_address((void *) 0x16cd8, (void *) port); (*Minecraft_hostMultiplayer)(minecraft, port); } @@ -262,6 +264,15 @@ __attribute__((destructor)) static void _free_stdin_buffer() { 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 static void handle_commands(unsigned char *minecraft) { @@ -417,6 +428,9 @@ static const char *get_features() { loaded_features = true; 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)) { features += "Force Mob Spawning|"; } @@ -461,6 +475,8 @@ static void server_init() { properties_file_output << "seed=" DEFAULT_SEED "\n"; properties_file_output << "# Force Mob Spawning (false = Disabled, true = Enabled)\n"; properties_file_output << "force-mob-spawning=" DEFAULT_FORCE_MOB_SPAWNING "\n"; + properties_file_output << "# Peaceful Mode (false = Disabled, true = Enabled)\n"; + properties_file_output << "peaceful-mode=" DEFAULT_PEACEFUL_MODE "\n"; properties_file_output << "# World To Select\n"; properties_file_output << "world-name=" DEFAULT_WORLD_NAME "\n"; properties_file_output << "# Maximum Player Count\n"; @@ -498,23 +514,23 @@ static void server_init() { // Prevent Main Player From Loading 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 misc_run_on_update(Minecraft_update_injection); // Set 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 overwrite((void *) RakNet_RakPeer_IsBanned, (void *) RakNet_RakPeer_IsBanned_injection); // Show The MineCon Icon Next To MOTD In Server List 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]" - patch((void *) 0x737e4, minecon_badge_patch); + unsigned char minecon_badge_patch[4] = {0x5c, 0x1a, 0x9f, 0xe5}; // "ldr r1, [0x98af0]" + patch((void *) 0x9808c, minecon_badge_patch); } // Log IPs - overwrite_call((void *) 0x75e54, (void *) ServerSideNetworkHandler_onReady_ClientGeneration_ServerSideNetworkHandler_popPendingPlayer_injection); + overwrite_call((void *) 0x9a63c, (void *) ServerSideNetworkHandler_onReady_ClientGeneration_ServerSideNetworkHandler_popPendingPlayer_injection); // Start Reading STDIN pthread_t read_stdin_thread_obj; diff --git a/mods/src/sign/README.md b/mods/src/sign/README.md deleted file mode 100644 index 1f706602a..000000000 --- a/mods/src/sign/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# ``sign`` Mod -This mod fixes sign placement. diff --git a/mods/src/sign/sign.cpp b/mods/src/sign/sign.cpp deleted file mode 100644 index aa2523521..000000000 --- a/mods/src/sign/sign.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include - -#include -#include - -#include "../init/init.h" -#include "../feature/feature.h" -#include "../input/input.h" -#include "sign.h" - -// 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); - } -} - -#define BACKSPACE_KEY 8 - -static int is_valid_key(char key) { - return (key >= 32 && key <= 126) || key == BACKSPACE_KEY; -} - -// Store Text Input -std::vector input; -void sign_key_press(char key) { - if (is_valid_key(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 (*(char *)(screen + 4) == '\0') { - uint32_t vtable = *((uint32_t *) screen); - for (char key : input) { - if (key == BACKSPACE_KEY) { - // Handle Backspace - (*(Screen_keyPressed_t *) (vtable + Screen_keyPressed_vtable_offset))(screen, BACKSPACE_KEY); - } else { - // Handle Nrmal 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)) { - // 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); - } -} diff --git a/mods/src/sign/sign.h b/mods/src/sign/sign.h deleted file mode 100644 index fd654311a..000000000 --- a/mods/src/sign/sign.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -void sign_key_press(char key); - -#ifdef __cplusplus -} -#endif diff --git a/mods/src/textures/textures.cpp b/mods/src/textures/textures.cpp index 0c3798352..f7d519d4b 100644 --- a/mods/src/textures/textures.cpp +++ b/mods/src/textures/textures.cpp @@ -171,5 +171,5 @@ void init_textures() { } // Scale Animated Textures - overwrite_call((void *) 0x53274, (void *) Textures_tick_glTexSubImage2D_injection); + overwrite_call((void *) 0x6bfd0, (void *) Textures_tick_glTexSubImage2D_injection); } diff --git a/mods/src/touch/touch.cpp b/mods/src/touch/touch.cpp index 57fc45434..ba6703963 100644 --- a/mods/src/touch/touch.cpp +++ b/mods/src/touch/touch.cpp @@ -24,17 +24,17 @@ void init_touch() { // Force Correct Toolbar Size unsigned char toolbar_patch[4] = {0x01, 0x00, 0x50, 0xe3}; // "cmp r0, #0x1" - patch((void *) 0x257b0, toolbar_patch); + patch((void *) 0x2a6cc, toolbar_patch); } // Show Block Outlines int block_outlines = feature_has("Show Block Outlines", 0); 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); // Force Touch Inventory if (feature_has("Force Touch Inventory", server_disabled)) { - overwrite_call((void *) 0x2943c, (void *) operator_new_IngameBlockSelectionScreen_injection); - overwrite_call((void *) 0x29444, (void *) Touch_IngameBlockSelectionScreen); + overwrite_call((void *) 0x2f628, (void *) operator_new_IngameBlockSelectionScreen_injection); + overwrite_call((void *) 0x2f630, (void *) Touch_IngameBlockSelectionScreen); } } diff --git a/mods/src/version/version.cpp b/mods/src/version/version.cpp index ca310a1d2..88fccb8f3 100644 --- a/mods/src/version/version.cpp +++ b/mods/src/version/version.cpp @@ -31,6 +31,8 @@ void init_version() { overwrite((void *) Common_getGameVersionString, (void *) Common_getGameVersionString_injection); // Normal GUI 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 INFO("Starting Minecraft: Pi Edition (%s)", version_get()); diff --git a/symbols/include/symbols/minecraft.h b/symbols/include/symbols/minecraft.h index e29954522..b90068359 100644 --- a/symbols/include/symbols/minecraft.h +++ b/symbols/include/symbols/minecraft.h @@ -13,54 +13,42 @@ typedef unsigned char bool; // Globals typedef void (*renderCursor_t)(float x, float y, unsigned char *minecraft); -static renderCursor_t renderCursor = (renderCursor_t) 0x480c4; +static renderCursor_t renderCursor = (renderCursor_t) 0x5f414; -static char **default_path = (char **) 0xe264; // /.minecraft/ -static char **default_username = (char **) 0x18fd4; // StevePi -static char **minecraft_pi_version = (char **) 0x39d94; // v0.1.1 alpha -static char **options_txt_path = (char **) 0x19bc8; // options.txt -static char **options_txt_fopen_mode_when_loading = (char **) 0x19d24; // w -static char ***feedback_vibration_options_txt_name_1 = (char ***) 0x198a0; // feedback_vibration -static char ***feedback_vibration_options_txt_name_2 = (char ***) 0x194bc; // feedback_vibration +static char **full_data_path = (char **) 0xdd10; // . +static char **default_username = (char **) 0x1c250; // StevePi +static char **minecraft_pi_version = (char **) 0x4b2a0; // v0.1.0 alpha +static char **demo_level_name = (char **) 0x3a37c; // _DemoLevel -static unsigned char **Material_stone = (unsigned char **) 0x180a9c; // Material +static unsigned char **Item_flintAndSteel = (unsigned char **) 0x1da680; // Item +static unsigned char **Item_snowball = (unsigned char **) 0x1da770; // Item +static unsigned char **Item_shears = (unsigned char **) 0x1da7b0; // Item +static unsigned char **Item_egg = (unsigned char **) 0x1da790; // Item +static unsigned char **Item_dye_powder = (unsigned char **) 0x1da7a0; // Item +static unsigned char **Item_camera = (unsigned char **) 0x1da7cc; // Item -static unsigned char *SOUND_STONE = (unsigned char *) 0x181c80; // Tile::SoundType +static unsigned char **Tile_water = (unsigned char **) 0x1dfca4; // Tile +static unsigned char **Tile_lava = (unsigned char **) 0x1dfe30; // Tile +static unsigned char **Tile_calmWater = (unsigned char **) 0x1dfca8; // Tile +static unsigned char **Tile_calmLava = (unsigned char **) 0x1dfe34; // Tile +static unsigned char **Tile_glowingObsidian = (unsigned char **) 0x1e0014; // Tile +static unsigned char **Tile_web = (unsigned char **) 0x1dfe70; // Tile +static unsigned char **Tile_topSnow = (unsigned char **) 0x1dfc98; // Tile +static unsigned char **Tile_ice = (unsigned char **) 0x1dfee8; // Tile +static unsigned char **Tile_invisible_bedrock = (unsigned char **) 0x1dfef8; // Tile +static unsigned char **Tile_netherReactor = (unsigned char **) 0x1e0018; // Tile +static unsigned char **Tile_info_updateGame1 = (unsigned char **) 0x1dfdd4; // Tile +static unsigned char **Tile_info_updateGame2 = (unsigned char **) 0x1dfdd0; // Tile +static unsigned char **Tile_bedrock = (unsigned char **) 0x1dfe2c; // Tile +static unsigned char **Tile_tallgrass = (unsigned char **) 0x1dfe74; // Tile +static unsigned char **Tile_stoneSlab = (unsigned char **) 0x1dfdb8; // Tile -static unsigned char **Item_flintAndSteel = (unsigned char **) 0x17ba70; // Item -static unsigned char **Item_snowball = (unsigned char **) 0x17bbb0; // Item -static unsigned char **Item_shears = (unsigned char **) 0x17bbf0; // Item -static unsigned char **Item_egg = (unsigned char **) 0x17bbd0; // Item -static unsigned char **Item_dye_powder = (unsigned char **) 0x17bbe0; // Item -static unsigned char **Item_camera = (unsigned char **) 0x17bc14; // Item +static unsigned char **Tile_leaves = (unsigned char **) 0x1df374; // Tile +static unsigned char **Tile_leaves_carried = (unsigned char **) 0x1e0020; // Tile +static unsigned char **Tile_grass = (unsigned char **) 0x1dfc7c; // Tile +static unsigned char **Tile_grass_carried = (unsigned char **) 0x1e001c; // Tile -static unsigned char **Tile_water = (unsigned char **) 0x181b3c; // Tile -static unsigned char **Tile_lava = (unsigned char **) 0x181cc8; // Tile -static unsigned char **Tile_calmWater = (unsigned char **) 0x181b40; // Tile -static unsigned char **Tile_calmLava = (unsigned char **) 0x181ccc; // Tile -static unsigned char **Tile_glowingObsidian = (unsigned char **) 0x181dcc; // Tile -static unsigned char **Tile_web = (unsigned char **) 0x181d08; // Tile -static unsigned char **Tile_topSnow = (unsigned char **) 0x181b30; // Tile -static unsigned char **Tile_ice = (unsigned char **) 0x181d80; // Tile -static unsigned char **Tile_invisible_bedrock = (unsigned char **) 0x181d94; // Tile -static unsigned char **Tile_netherReactor = (unsigned char **) 0x181dd0; // Tile -static unsigned char **Tile_info_updateGame1 = (unsigned char **) 0x181c68; // Tile -static unsigned char **Tile_info_updateGame2 = (unsigned char **) 0x181c6c; // Tile -static unsigned char **Tile_bedrock = (unsigned char **) 0x181cc4; // Tile -static unsigned char **Tile_tallgrass = (unsigned char **) 0x181d0c; // Tile -static unsigned char **Tile_stoneSlab = (unsigned char **) 0x181b44; // Tile - -static unsigned char **Tile_leaves = (unsigned char **) 0x18120c; // Tile -static unsigned char **Tile_leaves_carried = (unsigned char **) 0x181dd8; // Tile -static unsigned char **Tile_grass = (unsigned char **) 0x181b14; // Tile -static unsigned char **Tile_grass_carried = (unsigned char **) 0x181dd4; // Tile - -static float *InvGuiScale = (float *) 0x135d98; - -static unsigned char *Options_Option_GRAPHICS = (unsigned char *) 0x136c2c; // Option -static unsigned char *Options_Option_AMBIENT_OCCLUSION = (unsigned char *) 0x136c38; // Option - -static bool *Minecraft_useAmbientOcclusion = (bool *) 0x136b90; +static float *InvGuiScale = (float *) 0x1949fc; // Structures @@ -87,120 +75,91 @@ struct RakNet_SystemAddress { // Tile -static unsigned char **Tile_tiles = (unsigned char **) 0x180e08; +static unsigned char **Tile_tiles = (unsigned char **) 0x1def70; typedef void (*Tile_initTiles_t)(); -static Tile_initTiles_t Tile_initTiles = (Tile_initTiles_t) 0xc358c; - -#define TILE_SIZE 0x5c -#define TILE_VTABLE_SIZE 0x104 - -static unsigned char *Tile_vtable = (unsigned char *) 0x115670; - -typedef unsigned char *(*Tile_t)(unsigned char *tile, int32_t id, int32_t texture, const void *material); -static Tile_t Tile = (Tile_t) 0xc33a0; - -typedef unsigned char *(*Tile_init_t)(unsigned char *tile); -static Tile_init_t Tile_init = (Tile_init_t) 0xc34dc; - -typedef unsigned char *(*Tile_setDestroyTime_t)(unsigned char *tile, float destroy_time); -static uint32_t Tile_setDestroyTime_vtable_offset = 0xf8; - -typedef unsigned char *(*Tile_setExplodeable_t)(unsigned char *tile, float explodeable); -static uint32_t Tile_setExplodeable_vtable_offset = 0xf4; - -typedef unsigned char *(*Tile_setSoundType_t)(unsigned char *tile, unsigned char *sound_type); -static uint32_t Tile_setSoundType_vtable_offset = 0xe8; - -typedef int32_t (*Tile_use_t)(unsigned char *tile, unsigned char *level, int32_t x, int32_t y, int32_t z, unsigned char *player); -static uint32_t Tile_use_vtable_offset = 0x98; +static Tile_initTiles_t Tile_initTiles = (Tile_initTiles_t) 0x125bac; static uint32_t Tile_id_property_offset = 0x8; // int32_t static uint32_t Tile_category_property_offset = 0x3c; // int32_t -// TileRenderer +// AppPlatform -typedef void (*TileRenderer_tesselateBlockInWorld_t)(unsigned char *tile_renderer, unsigned char *tile, int32_t x, int32_t y, int32_t z); -static TileRenderer_tesselateBlockInWorld_t TileRenderer_tesselateBlockInWorld = (TileRenderer_tesselateBlockInWorld_t) 0x59e30; - -// GameMode - -typedef void (*GameMode_releaseUsingItem_t)(unsigned char *game_mode, unsigned char *player); -static uint32_t GameMode_releaseUsingItem_vtable_offset = 0x5c; +typedef bool (*AppPlatform_isPowerVR_t)(unsigned char *app_platform); +static AppPlatform_isPowerVR_t AppPlatform_isPowerVR = (AppPlatform_isPowerVR_t) 0x12670; // Minecraft typedef void (*Minecraft_init_t)(unsigned char *minecraft); -static Minecraft_init_t Minecraft_init = (Minecraft_init_t) 0x1700c; +static Minecraft_init_t Minecraft_init = (Minecraft_init_t) 0x182c8; typedef void (*Minecraft_tickInput_t)(unsigned char *minecraft); -static Minecraft_tickInput_t Minecraft_tickInput = (Minecraft_tickInput_t) 0x15ffc; +static Minecraft_tickInput_t Minecraft_tickInput = (Minecraft_tickInput_t) 0x166a8; typedef void (*Minecraft_setIsCreativeMode_t)(unsigned char *, int32_t); -static Minecraft_setIsCreativeMode_t Minecraft_setIsCreativeMode = (Minecraft_setIsCreativeMode_t) 0x16ec4; +static Minecraft_setIsCreativeMode_t Minecraft_setIsCreativeMode = (Minecraft_setIsCreativeMode_t) 0x17888; typedef int32_t (*Minecraft_isTouchscreen_t)(unsigned char *minecraft); -static Minecraft_isTouchscreen_t Minecraft_isTouchscreen = (Minecraft_isTouchscreen_t) 0x1639c; +static Minecraft_isTouchscreen_t Minecraft_isTouchscreen = (Minecraft_isTouchscreen_t) 0x16b38; typedef void (*Minecraft_setScreen_t)(unsigned char *minecraft, unsigned char *screen); -static Minecraft_setScreen_t Minecraft_setScreen = (Minecraft_setScreen_t) 0x15d6c; +static Minecraft_setScreen_t Minecraft_setScreen = (Minecraft_setScreen_t) 0x16388; typedef void (*Minecraft_tick_t)(unsigned char *minecraft, int32_t param_1, int32_t param_2); -static Minecraft_tick_t Minecraft_tick = (Minecraft_tick_t) 0x16934; +static Minecraft_tick_t Minecraft_tick = (Minecraft_tick_t) 0x17030; typedef void (*Minecraft_update_t)(unsigned char *minecraft); -static Minecraft_update_t Minecraft_update = (Minecraft_update_t) 0x16b74; +static Minecraft_update_t Minecraft_update = (Minecraft_update_t) 0x172e4; typedef void (*Minecraft_hostMultiplayer_t)(unsigned char *minecraft, int32_t port); -static Minecraft_hostMultiplayer_t Minecraft_hostMultiplayer = (Minecraft_hostMultiplayer_t) 0x16664; +static Minecraft_hostMultiplayer_t Minecraft_hostMultiplayer = (Minecraft_hostMultiplayer_t) 0x16c50; typedef const char *(*Minecraft_getProgressMessage_t)(unsigned char *minecraft); -static Minecraft_getProgressMessage_t Minecraft_getProgressMessage = (Minecraft_getProgressMessage_t) 0x16e58; +static Minecraft_getProgressMessage_t Minecraft_getProgressMessage = (Minecraft_getProgressMessage_t) 0x17810; typedef uint32_t (*Minecraft_isLevelGenerated_t)(unsigned char *minecraft); -static Minecraft_isLevelGenerated_t Minecraft_isLevelGenerated = (Minecraft_isLevelGenerated_t) 0x16e6c; +static Minecraft_isLevelGenerated_t Minecraft_isLevelGenerated = (Minecraft_isLevelGenerated_t) 0x17824; typedef bool (*Minecraft_isCreativeMode_t)(unsigned char *minecraft); -static Minecraft_isCreativeMode_t Minecraft_isCreativeMode = (Minecraft_isCreativeMode_t) 0x17270; +static Minecraft_isCreativeMode_t Minecraft_isCreativeMode = (Minecraft_isCreativeMode_t) 0x17a48; typedef void (*Minecraft_releaseMouse_t)(unsigned char *minecraft); -static Minecraft_releaseMouse_t Minecraft_releaseMouse = (Minecraft_releaseMouse_t) 0x15d30; +static Minecraft_releaseMouse_t Minecraft_releaseMouse = (Minecraft_releaseMouse_t) 0x1634c; typedef void (*Minecraft_grabMouse_t)(unsigned char *minecraft); -static Minecraft_grabMouse_t Minecraft_grabMouse = (Minecraft_grabMouse_t) 0x15d10; +static Minecraft_grabMouse_t Minecraft_grabMouse = (Minecraft_grabMouse_t) 0x1632c; typedef void (*Minecraft_leaveGame_t)(unsigned char *minecraft, bool save_remote_level); -static Minecraft_leaveGame_t Minecraft_leaveGame = (Minecraft_leaveGame_t) 0x15ea0; +static Minecraft_leaveGame_t Minecraft_leaveGame = (Minecraft_leaveGame_t) 0x1653c; typedef int (*Minecraft_handleBack_t)(unsigned char *minecraft, bool do_nothing); static uint32_t Minecraft_handleBack_vtable_offset = 0x34; typedef unsigned char *(*Minecraft_getCreator_t)(unsigned char *minecraft); -static Minecraft_getCreator_t Minecraft_getCreator = (Minecraft_getCreator_t) 0x17538; +static Minecraft_getCreator_t Minecraft_getCreator = (Minecraft_getCreator_t) 0x17d74; typedef unsigned char *(*Minecraft_getLevelSource_t)(unsigned char *minecraft); -static Minecraft_getLevelSource_t Minecraft_getLevelSource = (Minecraft_getLevelSource_t) 0x16e84; +static Minecraft_getLevelSource_t Minecraft_getLevelSource = (Minecraft_getLevelSource_t) 0x1783c; static uint32_t Minecraft_screen_width_property_offset = 0x20; // int32_t -static uint32_t Minecraft_network_handler_property_offset = 0x174; // NetEventCallback * -static uint32_t Minecraft_rak_net_instance_property_offset = 0x170; // RakNetInstance * -static uint32_t Minecraft_level_property_offset = 0x188; // Level * -static uint32_t Minecraft_textures_property_offset = 0x164; // Textures * -static uint32_t Minecraft_game_mode_property_offset = 0x160; // GameMode * -static uint32_t Minecraft_player_property_offset = 0x18c; // LocalPlayer * -static uint32_t Minecraft_options_property_offset = 0x3c; // Options -static uint32_t Minecraft_hit_result_property_offset = 0xc38; // HitResult -static uint32_t Minecraft_progress_property_offset = 0xc60; // int32_t -static uint32_t Minecraft_command_server_property_offset = 0xcc0; // CommandServer * -static uint32_t Minecraft_screen_property_offset = 0xc10; // Screen * -static uint32_t Minecraft_gui_property_offset = 0x198; // Gui -static uint32_t Minecraft_pov_property_offset = 0x150; // Mob * -static uint32_t Minecraft_perf_renderer_property_offset = 0xcbc; // PerfRenderer * +static uint32_t Minecraft_network_handler_property_offset = 0x158; // NetEventCallback * +static uint32_t Minecraft_rak_net_instance_property_offset = 0x154; // RakNetInstance * +static uint32_t Minecraft_level_property_offset = 0x16c; // Level * +static uint32_t Minecraft_textures_property_offset = 0x148; // Textures * +static uint32_t Minecraft_game_mode_property_offset = 0x144; // GameMode * +static uint32_t Minecraft_player_property_offset = 0x170; // LocalPlayer * +static uint32_t Minecraft_options_property_offset = 0x28; // Options +static uint32_t Minecraft_hit_result_property_offset = 0xc1c; // HitResult +static uint32_t Minecraft_progress_property_offset = 0xc44; // int32_t +static uint32_t Minecraft_command_server_property_offset = 0xca4; // CommandServer * +static uint32_t Minecraft_screen_property_offset = 0xbf4; // Screen * +static uint32_t Minecraft_gui_property_offset = 0x17c; // Gui +static uint32_t Minecraft_pov_property_offset = 0x170; // Mob * // GameRenderer typedef void (*GameRenderer_render_t)(unsigned char *game_renderer, float param_1); -static GameRenderer_render_t GameRenderer_render = (GameRenderer_render_t) 0x4a338; +static GameRenderer_render_t GameRenderer_render = (GameRenderer_render_t) 0x619c0; static uint32_t GameRenderer_minecraft_property_offset = 0x4; // Minecraft * @@ -208,19 +167,19 @@ static uint32_t GameRenderer_minecraft_property_offset = 0x4; // Minecraft * typedef int (*Mouse_get_t)(); -static Mouse_get_t Mouse_getX = (Mouse_get_t) 0x1385c; -static Mouse_get_t Mouse_getY = (Mouse_get_t) 0x1386c; +static Mouse_get_t Mouse_getX = (Mouse_get_t) 0x13480; +static Mouse_get_t Mouse_getY = (Mouse_get_t) 0x13490; // CommandServer -static uint32_t CommandServer_minecraft_property_offset = 0x18; // Minecraft * +static uint32_t CommandServer_minecraft_property_offset = 0x14; // Minecraft * // ServerLevel #define SERVER_LEVEL_SIZE 0xb80 typedef unsigned char *(*ServerLevel_t)(unsigned char *server_level, unsigned char *storage, unsigned char *name, struct LevelSettings *settings, int param_4, unsigned char *dimension); -static ServerLevel_t ServerLevel = (ServerLevel_t) 0x7692c; +static ServerLevel_t ServerLevel = (ServerLevel_t) 0x9b6c4; // Packet @@ -228,16 +187,16 @@ typedef void (*Packet_read_t)(unsigned char *packet, unsigned char *bit_stream); // LoginPacket -static Packet_read_t LoginPacket_read = (Packet_read_t) 0x6e5f8; -static void *LoginPacket_read_vtable_addr = (void *) 0x108dcc; +static Packet_read_t LoginPacket_read = (Packet_read_t) 0x8fc4c; +static void *LoginPacket_read_vtable_addr = (void *) 0x169e64; static uint32_t LoginPacket_username_property_offset = 0xc; // RakString // StartGamePacket typedef void (*StartGamePacket_read_t)(unsigned char *packet, unsigned char *bit_stream); -static StartGamePacket_read_t StartGamePacket_read = (StartGamePacket_read_t) 0x72c58; -static void *StartGamePacket_read_vtable_addr = (void *) 0x109264; +static StartGamePacket_read_t StartGamePacket_read = (StartGamePacket_read_t) 0x96e50; +static void *StartGamePacket_read_vtable_addr = (void *) 0x16a2cc; static uint32_t StartGamePacket_game_mode_property_offset = 0x14; // int32_t @@ -251,16 +210,9 @@ static uint32_t HitResult_type_property_offset = 0x0; // Options -typedef void (*Options_initDefaultValue_t)(unsigned char *options); -static Options_initDefaultValue_t Options_initDefaultValue = (Options_initDefaultValue_t) 0x18a54; - -typedef bool (*Options_getBooleanValue_t)(unsigned char *options, unsigned char *option); -static Options_getBooleanValue_t Options_getBooleanValue = (Options_getBooleanValue_t) 0x1cd74; - -static uint32_t Options_options_file_property_offset = 0x10c; // OptionsFile static uint32_t Options_fancy_graphics_property_offset = 0x17; // unsigned char / bool -static uint32_t Options_split_controls_property_offset = 0x105; // int32_t static uint32_t Options_game_difficulty_property_offset = 0xe8; // int32_t +static uint32_t Options_split_controls_property_offset = 0x105; // unsigned char / bool static uint32_t Options_3d_anaglyph_property_offset = 0x15; // unsigned char / bool static uint32_t Options_ambient_occlusion_property_offset = 0x18; // unsigned char / bool static uint32_t Options_hide_gui_property_offset = 0xec; // unsigned char / bool @@ -269,38 +221,25 @@ static uint32_t Options_render_distance_property_offset = 0x10; // int32_t static uint32_t Options_sound_property_offset = 0x4; // int32_t static uint32_t Options_debug_property_offset = 0xee; // unsigned char / bool static uint32_t Options_server_visible_property_offset = 0x104; // unsigned char / bool -static uint32_t Options_username_property_offset = 0x100; // std::string - -// OptionButton - -typedef unsigned char *(*OptionButton_t)(unsigned char *option_button, unsigned char *option); -static OptionButton_t OptionButton = (OptionButton_t) 0x1c968; - -typedef void (*OptionButton_updateImage_t)(unsigned char *option_button, unsigned char *options); -static OptionButton_updateImage_t OptionButton_updateImage = (OptionButton_updateImage_t) 0x1ca58; // MouseBuildInput typedef int32_t (*MouseBuildInput_tickBuild_t)(unsigned char *mouse_build_input, unsigned char *player, uint32_t *build_action_intention_return); -static MouseBuildInput_tickBuild_t MouseBuildInput_tickBuild = (MouseBuildInput_tickBuild_t) 0x17c98; -static void *MouseBuildInput_tickBuild_vtable_addr = (void *) 0x102564; +static MouseBuildInput_tickBuild_t MouseBuildInput_tickBuild = (MouseBuildInput_tickBuild_t) 0x19118; +static void *MouseBuildInput_tickBuild_vtable_addr = (void *) 0x16405c; // Item +static uint32_t Item_id_property_offset = 0x4; // int32_t static uint32_t Item_is_stacked_by_data_property_offset = 0x19; // unsigned char / bool static uint32_t Item_category_property_offset = 0x10; // int32_t static uint32_t Item_max_damage_property_offset = 0x8; // int32_t -// TileItem - -typedef unsigned char *(*TileItem_t)(unsigned char *tile_item, int32_t id); -static TileItem_t TileItem = (TileItem_t) 0xce3a4; - // AuxDataTileItem #define AUX_DATA_TILE_ITEM_SIZE 0x2c -static unsigned char *AuxDataTileItem_vtable = (unsigned char *) 0x114a58; +static unsigned char *AuxDataTileItem_vtable = (unsigned char *) 0x175220; static uint32_t AuxDataTileItem_icon_tile_property_offset = 0x28; // Tile * @@ -313,12 +252,12 @@ typedef struct { } ItemInstance; typedef ItemInstance *(*ItemInstance_constructor_t)(ItemInstance *item_instance, unsigned char *item); -static ItemInstance_constructor_t ItemInstance_constructor_item = (ItemInstance_constructor_t) 0x9992c; -static ItemInstance_constructor_t ItemInstance_constructor_tile = (ItemInstance_constructor_t) 0x998e4; +static ItemInstance_constructor_t ItemInstance_constructor_item = (ItemInstance_constructor_t) 0xdf40c; +static ItemInstance_constructor_t ItemInstance_constructor_tile = (ItemInstance_constructor_t) 0xdf3c8; typedef ItemInstance *(*ItemInstance_constructor_extra_t)(ItemInstance *item_instance, unsigned char *item, int32_t count, int32_t auxiliary); -static ItemInstance_constructor_extra_t ItemInstance_constructor_tile_extra = (ItemInstance_constructor_extra_t) 0x99918; -static ItemInstance_constructor_extra_t ItemInstance_constructor_item_extra = (ItemInstance_constructor_extra_t) 0x99960; +static ItemInstance_constructor_extra_t ItemInstance_constructor_tile_extra = (ItemInstance_constructor_extra_t) 0xdf3fc; +static ItemInstance_constructor_extra_t ItemInstance_constructor_item_extra = (ItemInstance_constructor_extra_t) 0xdf440; // Entity @@ -334,10 +273,8 @@ static uint32_t Entity_old_yaw_property_offset = 0x48; // float // Mob typedef void (*Mob_actuallyHurt_t)(unsigned char *entity, int32_t damage); -static Mob_actuallyHurt_t Mob_actuallyHurt = (Mob_actuallyHurt_t) 0x7f11c; -static uint32_t Mob_actuallyHurt_vtable_offset = 0x16c; - -typedef float (*Mob_getWalkingSpeedModifier_t)(unsigned char *entity); +static Mob_actuallyHurt_t Mob_actuallyHurt = (Mob_actuallyHurt_t) 0xab2d4; +static uint32_t Mob_actuallyHurt_vtable_offset = 0x1a0; typedef void (*Mob_die_t)(unsigned char *entity, unsigned char *cause); static uint32_t Mob_die_vtable_offset = 0x130; @@ -347,48 +284,44 @@ static uint32_t Mob_health_property_offset = 0xec; // int32_t // Player typedef int (*Player_isUsingItem_t)(unsigned char *player); -static Player_isUsingItem_t Player_isUsingItem = (Player_isUsingItem_t) 0x8f15c; +static Player_isUsingItem_t Player_isUsingItem = (Player_isUsingItem_t) 0xceb24; typedef void (*Player_drop_t)(unsigned char *player, ItemInstance *item_instance, bool is_death); -static uint32_t Player_drop_vtable_offset = 0x208; +static uint32_t Player_drop_vtable_offset = 0x1f8; -static Mob_getWalkingSpeedModifier_t Player_getWalkingSpeedModifier = (Mob_getWalkingSpeedModifier_t) 0x8ea0c; - -static uint32_t Player_username_property_offset = 0xbf4; // std::string -static uint32_t Player_inventory_property_offset = 0xbe0; // Inventory * +static uint32_t Player_username_property_offset = 0xbec; // std::string +static uint32_t Player_inventory_property_offset = 0xbd8; // Inventory * // LocalPlayer -static Mob_actuallyHurt_t LocalPlayer_actuallyHurt = (Mob_actuallyHurt_t) 0x44010; -static void *LocalPlayer_actuallyHurt_vtable_addr = (void *) 0x10639c; +static Mob_actuallyHurt_t LocalPlayer_actuallyHurt = (Mob_actuallyHurt_t) 0x59f48; +static void *LocalPlayer_actuallyHurt_vtable_addr = (void *) 0x1676d0; -static void *LocalPlayer_openTextEdit_vtable_addr = (void *) 0x106460; +static Mob_die_t LocalPlayer_die = (Mob_die_t) 0x5b208; +static void *LocalPlayer_die_vtable_addr = (void *) 0x167660; -static Mob_die_t LocalPlayer_die = (Mob_die_t) 0x45078; -static void *LocalPlayer_die_vtable_addr = (void *) 0x106360; - -static uint32_t LocalPlayer_minecraft_property_offset = 0xc90; // Minecraft * +static uint32_t LocalPlayer_minecraft_property_offset = 0xc58; // Minecraft * // ServerPlayer -static void *ServerPlayer_actuallyHurt_vtable_addr = (void *) 0x109fa4; +static void *ServerPlayer_actuallyHurt_vtable_addr = (void *) 0x16b020; -static uint32_t ServerPlayer_minecraft_property_offset = 0xc8c; // Minecraft * -static uint32_t ServerPlayer_guid_property_offset = 0xc08; // RakNetGUID +static uint32_t ServerPlayer_minecraft_property_offset = 0xc54; // Minecraft * +static uint32_t ServerPlayer_guid_property_offset = 0xc00; // RakNetGUID // Gui typedef void (*Gui_tick_t)(unsigned char *gui); -static Gui_tick_t Gui_tick = (Gui_tick_t) 0x27778; +static Gui_tick_t Gui_tick = (Gui_tick_t) 0x2b0b0; typedef void (*Gui_handleClick_t)(unsigned char *gui, int32_t param_2, int32_t param_3, int32_t param_4); -static Gui_handleClick_t Gui_handleClick = (Gui_handleClick_t) 0x2599c; +static Gui_handleClick_t Gui_handleClick = (Gui_handleClick_t) 0x2a8f0; typedef void (*Gui_renderOnSelectItemNameText_t)(unsigned char *gui, int32_t param_1, unsigned char *font, int32_t param_2); -static Gui_renderOnSelectItemNameText_t Gui_renderOnSelectItemNameText = (Gui_renderOnSelectItemNameText_t) 0x26aec; +static Gui_renderOnSelectItemNameText_t Gui_renderOnSelectItemNameText = (Gui_renderOnSelectItemNameText_t) 0x2bcb8; typedef void (*Gui_renderChatMessages_t)(unsigned char *gui, int32_t y_offset, uint32_t max_messages, bool disable_fading, unsigned char *font); -static Gui_renderChatMessages_t Gui_renderChatMessages = (Gui_renderChatMessages_t) 0x273d8; +static Gui_renderChatMessages_t Gui_renderChatMessages = (Gui_renderChatMessages_t) 0x2bed8; static uint32_t Gui_minecraft_property_offset = 0x9f4; // Minecraft * static uint32_t Gui_selected_item_text_timer_property_offset = 0x9fc; // float @@ -396,88 +329,65 @@ static uint32_t Gui_selected_item_text_timer_property_offset = 0x9fc; // float // Textures typedef void (*Textures_tick_t)(unsigned char *textures, bool param_1); -static Textures_tick_t Textures_tick = (Textures_tick_t) 0x531c4; +static Textures_tick_t Textures_tick = (Textures_tick_t) 0x6bee4; // GameMode Constructors #define CREATOR_MODE_SIZE 0x1c -static void *CreatorMode = (void *) 0x1a044; +static void *CreatorMode = (void *) 0x1d254; #define SURVIVAL_MODE_SIZE 0x24 -static void *SurvivalMode = (void *) 0x1b7d8; +static void *SurvivalMode = (void *) 0x1fecc; // LevelData typedef uint32_t (*LevelData_getSpawnMobs_t)(unsigned char *level_data); -static LevelData_getSpawnMobs_t LevelData_getSpawnMobs = (LevelData_getSpawnMobs_t) 0xbabec; +static LevelData_getSpawnMobs_t LevelData_getSpawnMobs = (LevelData_getSpawnMobs_t) 0x1171e0; // Level typedef void (*Level_saveLevelData_t)(unsigned char *level); -static Level_saveLevelData_t Level_saveLevelData = (Level_saveLevelData_t) 0xa2e94; +static Level_saveLevelData_t Level_saveLevelData = (Level_saveLevelData_t) 0xeef98; typedef void (*Level_setTileAndData_t)(unsigned char *level, int32_t x, int32_t y, int32_t z, int32_t id, int32_t data); -static Level_setTileAndData_t Level_setTileAndData = (Level_setTileAndData_t) 0xa38b4; +static Level_setTileAndData_t Level_setTileAndData = (Level_setTileAndData_t) 0xefa8c; static uint32_t Level_players_property_offset = 0x60; // std::vector // LevelRenderer typedef void (*LevelRenderer_render_t)(unsigned char *level_renderer, unsigned char *mob, int param_1, float delta); -static LevelRenderer_render_t LevelRenderer_render = (LevelRenderer_render_t) 0x4f710; +static LevelRenderer_render_t LevelRenderer_render = (LevelRenderer_render_t) 0x67604; typedef void (*LevelRenderer_renderDebug_t)(unsigned char *level_renderer, struct AABB *aabb, float delta); -static LevelRenderer_renderDebug_t LevelRenderer_renderDebug = (LevelRenderer_renderDebug_t) 0x4d310; +static LevelRenderer_renderDebug_t LevelRenderer_renderDebug = (LevelRenderer_renderDebug_t) 0x65c34; static uint32_t LevelRenderer_minecraft_property_offset = 0x4; // Minecraft * -// PerfRenderer - -typedef void (*PerfRenderer_debugFpsMeterKeyPress_t)(unsigned char *perf_renderer, int key); -static PerfRenderer_debugFpsMeterKeyPress_t PerfRenderer_debugFpsMeterKeyPress = (PerfRenderer_debugFpsMeterKeyPress_t) 0x79118; - -// TextEditScreen - -#define TEXT_EDIT_SCREEN_SIZE 0xa9 - -typedef unsigned char *(*TextEditScreen_t)(unsigned char *text_edit_screen, unsigned char *sign); -static TextEditScreen_t TextEditScreen = (TextEditScreen_t) 0x3a840; - -static void *TextEditScreen_updateEvents_vtable_addr = (void *) 0x10531c; - // ProgressScreen -#define PROGRESS_SCREEN_SIZE 0x4c +#define PROGRESS_SCREEN_SIZE 0x40 typedef void *(*ProgressScreen_t)(unsigned char *obj); -static ProgressScreen_t ProgressScreen = (ProgressScreen_t) 0x37044; +static ProgressScreen_t ProgressScreen = (ProgressScreen_t) 0x42a08; // OptionsScreen -static void *OptionsScreen_handleBackEvent_vtable_addr = (void *) 0x10499c; +static void *OptionsScreen_handleBackEvent_vtable_addr = (void *) 0x165fb8; // FurnaceScreen typedef int32_t (*FurnaceScreen_handleAddItem_t)(unsigned char *furnace_screen, int32_t slot, ItemInstance const *item); -static FurnaceScreen_handleAddItem_t FurnaceScreen_handleAddItem = (FurnaceScreen_handleAddItem_t) 0x327a0; +static FurnaceScreen_handleAddItem_t FurnaceScreen_handleAddItem = (FurnaceScreen_handleAddItem_t) 0x3c534; -static uint32_t FurnaceScreen_tile_entity_property_offset = 0x1d0; // FurnaceTileEntity * +static uint32_t FurnaceScreen_tile_entity_property_offset = 0x1b0; // FurnaceTileEntity * // FurnaceTileEntity typedef ItemInstance *(*FurnaceTileEntity_getItem_t)(unsigned char *furnace_tile_entity, int32_t slot); -static uint32_t FurnaceTileEntity_getItem_vtable_offset = 0x2c; +static uint32_t FurnaceTileEntity_getItem_vtable_offset = 0x28; // Screen -typedef void (*Screen_updateEvents_t)(unsigned char *screen); -static Screen_updateEvents_t Screen_updateEvents = (Screen_updateEvents_t) 0x28eb8; - -typedef void (*Screen_keyboardNewChar_t)(unsigned char *screen, char key); -static uint32_t Screen_keyboardNewChar_vtable_offset = 0x70; - -typedef void (*Screen_keyPressed_t)(unsigned char *screen, int32_t key); -static uint32_t Screen_keyPressed_vtable_offset = 0x6c; - typedef void (*Screen_init_t)(unsigned char *screen); typedef void (*Screen_tick_t)(unsigned char *screen); @@ -486,52 +396,52 @@ typedef int32_t (*Screen_handleBackEvent_t)(unsigned char *screen, bool param_1) static uint32_t Screen_minecraft_property_offset = 0x14; // Minecraft * static uint32_t Screen_rendered_buttons_property_offset = 0x18; // std::vector