Some Fixes

This commit is contained in:
TheBrokenRail 2024-12-17 05:50:20 -05:00
parent 587ba38ffe
commit f0005ff002
43 changed files with 219 additions and 196 deletions

@ -1 +1 @@
Subproject commit 551b6c4d662a3938f0cd197e79cc29922feec1ff
Subproject commit f5f11e94be35078c3bbb5196f55269f88634b9bd

View File

@ -9,7 +9,7 @@ FetchContent_Declare(
minecraft-pi
URL "${CMAKE_CURRENT_SOURCE_DIR}/minecraft-pi-0.1.1.tar.gz"
)
FetchContent_Populate(minecraft-pi)
FetchContent_MakeAvailable(minecraft-pi)
# Install
install(

View File

@ -54,6 +54,7 @@
* `Fix Sugar Position In Hand` (Enabled By Default)
* `Fix Reloading Textures On Resize` (Enabled By Default)
* `Improved UI Scaling` (Enabled By Default)
* `Text Rendering Fixes` (Enabled By Default)
* Existing Functionality (All Enabled By Default)
* `Fix Screen Rendering When Hiding HUD`
* `Sanitize Usernames`
@ -62,7 +63,6 @@
* `Prevent Unnecessary Server Pinging`
* `Proper OpenGL Buffer Generation`
* `Fix Furnace Screen Visual Bug`
* `Fix Text Wrapping`
* `Fullscreen Support`
* `Always Save Chest Tile Entities`
* `Fix Transferring Durability When Using Items`

View File

@ -11,10 +11,14 @@
void reborn_init_patch();
// Replace Call Located At start With A Call To target
void overwrite_call(void *start, void *target, bool force_b_instruction = false);
void overwrite_call_manual(void *addr, void *new_target, bool force_b_instruction = false);
template <typename T>
void overwrite_call(void *addr, __attribute__((unused)) T *target_type, typename T::ptr_type new_target, const bool force_b_instruction = false) {
overwrite_call_manual(addr, (void *) new_target, force_b_instruction);
}
// Replace All Calls To Method start With target
void *overwrite_calls_manual(void *start, void *target, bool allow_no_callsites = false);
void *overwrite_calls_manual(void *target, void *replacement, bool allow_no_callsites = false);
template <typename T>
void overwrite_calls(T *target, typename T::overwrite_type replacement) {
DEBUG("Overwriting Method: %s", target->name);
@ -27,28 +31,28 @@ void overwrite_calls(T *target, typename T::overwrite_type replacement) {
void *reborn_thunk_enabler(void *target, void *thunk);
// Replace All Calls To start With target Within [to, from)
void overwrite_calls_within_manual(void *from, void *to, void *start, void *target);
void overwrite_calls_within_manual(void *from, void *to, const void *target, void *replacement);
template <typename T>
void overwrite_calls_within(void *from, void *to, T *start, typename T::ptr_type target) {
overwrite_calls_within_manual(from, to, (void *) start->get(), (void *) target);
void overwrite_calls_within(void *from, void *to, T *target, typename T::ptr_type replacement) {
overwrite_calls_within_manual(from, to, (void *) target->get(), (void *) replacement);
}
// Get Target Address From BL Instruction
void *extract_from_bl_instruction(unsigned char *from);
void *extract_from_bl_instruction(unsigned char *addr);
// Patch Instruction
void patch(void *start, unsigned char patch[4]);
void patch(void *addr, unsigned char patch[4]);
// Patch 4 Bytes Of Data
void patch_address(void *start, void *target);
void patch_address(void *addr, void *target);
// Patch VTable Entry
// This does not affect subclasses.
template <typename T>
void patch_vtable(const T *start, typename T::ptr_type target) {
DEBUG("Patching VTable: %s", start->name);
if (start->enabled) {
void patch_vtable(const T *target, typename T::ptr_type replacement) {
DEBUG("Patching VTable: %s", target->name);
if (target->enabled) {
WARN("Use overwrite_calls() Instead!");
}
patch_address((void *) start->get_vtable_addr(), (void *) target);
patch_address((void *) target->get_vtable_addr(), (void *) replacement);
}

View File

@ -31,8 +31,8 @@ static void *extract_from_bl_instruction(unsigned char *from, const uint32_t ins
// Compute Target Address
return from + 8 + offset;
}
void *extract_from_bl_instruction(unsigned char *from) {
return extract_from_bl_instruction(from, *(uint32_t *) from);
void *extract_from_bl_instruction(unsigned char *addr) {
return extract_from_bl_instruction(addr, *(uint32_t *) addr);
}
// Generate A BL Instruction

View File

@ -21,9 +21,9 @@ static void _overwrite_call_internal(void *start, void *target, const bool use_b
// Increment Code Block Position
increment_code_block();
}
void overwrite_call(void *start, void *target, const bool force_b_instruction) {
const bool use_b_instruction = force_b_instruction || ((unsigned char *) start)[3] == B_INSTRUCTION;
_overwrite_call_internal(start, target, use_b_instruction);
void overwrite_call_manual(void *addr, void *new_target, const bool force_b_instruction) {
const bool use_b_instruction = force_b_instruction || ((unsigned char *) addr)[3] == B_INSTRUCTION;
_overwrite_call_internal(addr, new_target, use_b_instruction);
}
// .rodata Information
@ -51,7 +51,7 @@ static int _patch_vtables(void *target, void *replacement) {
#undef scan_vtables
// Patch Calls Within Range
static int _overwrite_calls_within_internal(void *from, void *to, void *target, void *replacement) {
static int _overwrite_calls_within_internal(void *from, void *to, const void *target, void *replacement) {
int found = 0;
for (uintptr_t i = (uintptr_t) from; i < (uintptr_t) to; i = i + 4) {
unsigned char *addr = (unsigned char *) i;
@ -77,14 +77,14 @@ static int _overwrite_calls_within_internal(void *from, void *to, void *target,
#define TEXT_END 0x1020c0
// Overwrite All B(L) Intrusctions That Target The Specified Address
#define NO_CALLSITE_ERROR() ERR("Unable To Find Callsites")
void *overwrite_calls_manual(void *start, void *target, const bool allow_no_callsites) {
void *overwrite_calls_manual(void *target, void *replacement, const bool allow_no_callsites) {
// Add New Target To Code Block
void *code_block = update_code_block(target);
void *code_block = update_code_block(replacement);
// Patch Code
int found = _overwrite_calls_within_internal((void *) TEXT_START, (void *) TEXT_END, start, code_block);
int found = _overwrite_calls_within_internal((void *) TEXT_START, (void *) TEXT_END, target, code_block);
// Patch VTables
found += _patch_vtables(start, code_block);
found += _patch_vtables(target, code_block);
// Increment Code Block Position
increment_code_block();
@ -97,7 +97,7 @@ void *overwrite_calls_manual(void *start, void *target, const bool allow_no_call
// Return
return code_block;
}
void overwrite_calls_within_manual(void *from /* inclusive */, void *to /* exclusive */, void *target, void *replacement) {
void overwrite_calls_within_manual(void *from /* inclusive */, void *to /* exclusive */, const void *target, void *replacement) {
// Add New Target To Code Block
void *code_block = update_code_block(replacement);
@ -123,13 +123,13 @@ static void safe_mprotect(void *addr, const size_t len, const int prot) {
ERR("Unable To Set Permissions: %p: %s", addr, strerror(errno));
}
}
void patch(void *start, unsigned char patch[4]) {
if (((uint32_t) start) % 4 != 0) {
ERR("Invalid Address: %p", start);
void patch(void *addr, unsigned char patch[4]) {
if (uint32_t(addr) % 4 != 0) {
ERR("Invalid Address: %p", addr);
}
// Get Current Permissions
segment_data &segment_data = get_data_for_addr(start);
const segment_data &segment_data = get_data_for_addr(addr);
int prot = PROT_READ;
if (segment_data.is_executable) {
prot |= PROT_EXEC;
@ -139,25 +139,25 @@ void patch(void *start, unsigned char patch[4]) {
}
// Allow Writing To Code Memory
const uint32_t size = 4;
safe_mprotect(start, size, prot | PROT_WRITE);
constexpr uint32_t size = 4;
safe_mprotect(addr, size, prot | PROT_WRITE);
// Patch
unsigned char *data = (unsigned char *) start;
unsigned char *data = (unsigned char *) addr;
memcpy(data, patch, 4);
// Reset Code Memory Permissions
safe_mprotect(start, size, prot);
safe_mprotect(addr, size, prot);
// Clear ARM Instruction Cache
__clear_cache(start, (void *) (((uintptr_t) start) + size));
__clear_cache(addr, (void *) (((uintptr_t) addr) + size));
}
// Patch Address
void patch_address(void *start, void *target) {
uint32_t addr = (uint32_t) target;
unsigned char *patch_data = (unsigned char *) &addr;
patch(start, patch_data);
void patch_address(void *addr, void *target) {
uint32_t target_addr = (uint32_t) target;
unsigned char *patch_data = (unsigned char *) &target_addr;
patch(addr, patch_data);
}
// Thunks

View File

@ -108,7 +108,7 @@ CATEGORY Bug Fixes
TRUE Fix Held Item Caching
TRUE Fix Cobweb Lighting
TRUE Fix Furnace Screen Visual Bug
TRUE Fix Text Wrapping
TRUE Text Rendering Fixes
TRUE Fix Carried Grass's Bottom Texture
TRUE Fix Screen Rendering When Hiding HUD
TRUE Fix Sugar Position In Hand

View File

@ -3,6 +3,7 @@
#include <limits>
#include <libreborn/env/servers.h>
#include <libreborn/env/flags.h>
#include <libreborn/util/util.h>
// Seperator
@ -26,7 +27,7 @@ void ServerList::load(const std::string &str) {
// Iterate Lines
std::string line;
while (std::getline(server_list_file, line)) {
while (std::getline(server_list_file, line, FLAG_SEPERATOR_CHAR)) {
// Check Line
if (!line.empty()) {
// Parse
@ -50,7 +51,7 @@ void ServerList::load(const std::string &str) {
std::string ServerList::to_string() const {
std::stringstream out;
for (const Entry &entry : entries) {
out << entry.first << PORT_SEPERATOR_CHAR << std::to_string(entry.second) << '\n';
out << entry.first << PORT_SEPERATOR_CHAR << std::to_string(entry.second) << FLAG_SEPERATOR_CHAR;
}
return out.str();
}

View File

@ -242,6 +242,6 @@ void init_atlas() {
misc_run_on_init(generate_atlas);
overwrite_calls(CropTile_getTexture2, CropTile_getTexture2_injection);
overwrite_calls(ItemRenderer_renderGuiItem_two, ItemRenderer_renderGuiItem_two_injection);
overwrite_call((void *) 0x26f50, (void *) Gui_renderToolBar_GuiComponent_blit_injection);
overwrite_call((void *) 0x26f50, GuiComponent_blit, Gui_renderToolBar_GuiComponent_blit_injection);
}
}

View File

@ -359,7 +359,7 @@ void init_bucket() {
// Creative Inventory
misc_run_on_creative_inventory_setup(Inventory_setupDefault_FillingContainer_addItem_call_injection);
// Make Liquids Selectable
overwrite_call((void *) 0x7f5b0, (void *) Mob_pick_Level_clip_injection);
overwrite_call((void *) 0x7f5b0, Level_clip, Mob_pick_Level_clip_injection);
misc_run_on_tick(handle_tick);
// Prevent Breaking Liquid
overwrite_calls(Minecraft_handleMouseDown, Minecraft_handleMouseDown_injection);
@ -367,7 +367,7 @@ void init_bucket() {
misc_run_on_recipes_setup(Recipes_injection);
// Custom Furnace Fuel
overwrite_calls(FurnaceTileEntity_getBurnDuration, FurnaceTileEntity_getBurnDuration_injection);
overwrite_call((void *) 0xd351c, (void *) FurnaceTileEntity_tick_ItemInstance_setNull_injection);
overwrite_call((void *) 0xd351c, ItemInstance_setNull, FurnaceTileEntity_tick_ItemInstance_setNull_injection);
// Language for milk
misc_run_on_language_setup(Language_injection);
}

View File

@ -37,7 +37,7 @@ static void TripodCamera_tick_Level_addParticle_call_injection(Level *level, con
static void TripodCameraRenderer_render_EntityRenderer_bindTexture_injection(EntityRenderer *self, __attribute__((unused)) const std::string &file) {
self->bindTexture("item/camera.png");
}
static void TripodCameraRenderer_render_TileRenderer_tesselateCrossTexture_injection() {
static void TripodCameraRenderer_render_TileRenderer_tesselateCrossTexture_injection(__attribute__((unused)) TileRenderer *self, __attribute__((unused)) Tile *tile, __attribute__((unused)) int data, __attribute__((unused)) float x, __attribute__((unused)) float y, __attribute__((unused)) float z) {
Tesselator *t = &Tesselator::instance;
for (const float a : {-1.f, 1.f}) {
for (const float b : {-1.f, 1.f}) {
@ -62,11 +62,11 @@ void init_camera() {
// Enable TripodCameraRenderer
overwrite_calls(EntityRenderDispatcher_constructor, EntityRenderDispatcher_injection);
// Display Smoke From TripodCamera Higher
overwrite_call((void *) 0x87dc4, (void *) TripodCamera_tick_Level_addParticle_call_injection);
overwrite_call((void *) 0x87dc4, Level_addParticle, TripodCamera_tick_Level_addParticle_call_injection);
}
// Camera Legs
if (feature_has("Render Camera Legs", server_disabled)) {
overwrite_call((void *) 0x659dc, (void *) TripodCameraRenderer_render_EntityRenderer_bindTexture_injection);
overwrite_call((void *) 0x65a08, (void *) TripodCameraRenderer_render_TileRenderer_tesselateCrossTexture_injection);
overwrite_call((void *) 0x659dc, EntityRenderer_bindTexture, TripodCameraRenderer_render_EntityRenderer_bindTexture_injection);
overwrite_call((void *) 0x65a08, TileRenderer_tesselateCrossTexture, TripodCameraRenderer_render_TileRenderer_tesselateCrossTexture_injection);
}
}

View File

@ -56,10 +56,10 @@ void chat_handle_packet_send(const Minecraft *minecraft, ChatPacket *packet) {
}
// Manually Send (And Loopback) ChatPacket
static void CommandServer_parse_CommandServer_dispatchPacket_injection(const CommandServer *command_server, Packet *packet) {
static void CommandServer_parse_CommandServer_dispatchPacket_injection(CommandServer *command_server, Packet &packet) {
const Minecraft *minecraft = command_server->minecraft;
if (minecraft != nullptr) {
chat_handle_packet_send(minecraft, (ChatPacket *) packet);
chat_handle_packet_send(minecraft, (ChatPacket *) &packet);
}
}
@ -95,7 +95,7 @@ void init_chat() {
unsigned char disable_chat_packet_loopback_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
patch((void *) 0x6b490, disable_chat_packet_loopback_patch);
// Manually Send (And Loopback) ChatPacket
overwrite_call((void *) 0x6b518, (void *) CommandServer_parse_CommandServer_dispatchPacket_injection);
overwrite_call((void *) 0x6b518, CommandServer_dispatchPacket, CommandServer_parse_CommandServer_dispatchPacket_injection);
// Re-Broadcast ChatPacket
patch_vtable(ServerSideNetworkHandler_handle_ChatPacket, ServerSideNetworkHandler_handle_ChatPacket_injection);
// Init UI

View File

@ -29,8 +29,8 @@ static void Gui_renderHearts_GuiComponent_blit_hearts_injection(GuiComponent *co
std::remove_reference_t<GuiComponent_blit_t> get_blit_with_classic_hud_offset() {
return use_classic_hud ? Gui_renderHearts_GuiComponent_blit_hearts_injection : GuiComponent_blit->get(false);
}
static void Gui_renderHearts_GuiComponent_blit_armor_injection(Gui *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) {
const Minecraft *minecraft = component->minecraft;
static void Gui_renderHearts_GuiComponent_blit_armor_injection(GuiComponent *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) {
const Minecraft *minecraft = ((Gui *) component)->minecraft;
x_dest -= DEFAULT_HUD_PADDING + HUD_ELEMENT_WIDTH;
const float width = float(minecraft->screen_width) * Gui::InvGuiScale;
const float height = float(minecraft->screen_height) * Gui::InvGuiScale;
@ -40,8 +40,8 @@ static void Gui_renderHearts_GuiComponent_blit_armor_injection(Gui *component, i
// Call Original Method
component->blit(x_dest, y_dest, x_src, y_src, width_dest, height_dest, width_src, height_src);
}
static void Gui_renderBubbles_GuiComponent_blit_injection(Gui *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) {
const Minecraft *minecraft = component->minecraft;
static void Gui_renderBubbles_GuiComponent_blit_injection(GuiComponent *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) {
const Minecraft *minecraft = ((Gui *) component)->minecraft;
x_dest -= DEFAULT_HUD_PADDING;
const float width = float(minecraft->screen_width) * Gui::InvGuiScale;
const float height = float(minecraft->screen_height) * Gui::InvGuiScale;
@ -110,7 +110,7 @@ static void Gui_renderSlotText_Font_draw_injection(Font *self, const char *raw_s
color = 0xffffffff;
}
// Call
(*func)->get(false)(self, string, x, y, color);
(*func)->get(false)(self, string.c_str(), x, y, color);
}
// Init
@ -118,11 +118,11 @@ void init_classic_ui() {
// Classic HUD
if (feature_has("Classic HUD", server_disabled)) {
use_classic_hud = true;
overwrite_call((void *) 0x26758, (void *) Gui_renderHearts_GuiComponent_blit_hearts_injection);
overwrite_call((void *) 0x2656c, (void *) Gui_renderHearts_GuiComponent_blit_armor_injection);
overwrite_call((void *) 0x268c4, (void *) Gui_renderBubbles_GuiComponent_blit_injection);
overwrite_call((void *) 0x266f8, (void *) Gui_renderHearts_GuiComponent_blit_hearts_injection);
overwrite_call((void *) 0x267c8, (void *) Gui_renderHearts_GuiComponent_blit_hearts_injection);
overwrite_call((void *) 0x26758, GuiComponent_blit, Gui_renderHearts_GuiComponent_blit_hearts_injection);
overwrite_call((void *) 0x2656c, GuiComponent_blit, Gui_renderHearts_GuiComponent_blit_armor_injection);
overwrite_call((void *) 0x268c4, GuiComponent_blit, Gui_renderBubbles_GuiComponent_blit_injection);
overwrite_call((void *) 0x266f8, GuiComponent_blit, Gui_renderHearts_GuiComponent_blit_hearts_injection);
overwrite_call((void *) 0x267c8, GuiComponent_blit, Gui_renderHearts_GuiComponent_blit_hearts_injection);
}
// Classic Slot Count Location
@ -131,12 +131,12 @@ void init_classic_ui() {
patch((void *) 0x27074, nop_patch);
patch((void *) 0x33984, nop_patch);
patch((void *) 0x1e424, nop_patch);
overwrite_call((void *) 0x1e4b8, (void *) Gui_renderSlotText_injection_inventory);
overwrite_call((void *) 0x27100, (void *) Gui_renderSlotText_injection_toolbar);
overwrite_call((void *) 0x339b4, (void *) Gui_renderSlotText_injection_classic_inventory);
overwrite_call((void *) 0x2b268, (void *) Gui_renderSlotText_injection_furnace);
overwrite_call((void *) 0x320c4, (void *) Gui_renderSlotText_injection_furnace);
overwrite_call((void *) 0x25e84, (void *) Gui_renderSlotText_Font_draw_injection<&Font_draw>);
overwrite_call((void *) 0x25e74, (void *) Gui_renderSlotText_Font_draw_injection<&Font_drawShadow>);
overwrite_call((void *) 0x1e4b8, Gui_renderSlotText, Gui_renderSlotText_injection_inventory);
overwrite_call((void *) 0x27100, Gui_renderSlotText, Gui_renderSlotText_injection_toolbar);
overwrite_call((void *) 0x339b4, Gui_renderSlotText, Gui_renderSlotText_injection_classic_inventory);
overwrite_call((void *) 0x2b268, Gui_renderSlotText, Gui_renderSlotText_injection_furnace);
overwrite_call((void *) 0x320c4, Gui_renderSlotText, Gui_renderSlotText_injection_furnace);
overwrite_call((void *) 0x25e84, Font_draw_raw, Gui_renderSlotText_Font_draw_injection<&Font_draw_raw>);
overwrite_call((void *) 0x25e74, Font_drawShadow_raw, Gui_renderSlotText_Font_draw_injection<&Font_drawShadow_raw>);
}
}

View File

@ -9,11 +9,11 @@ static void do_nothing() {
// Patch bcm_host Calls
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_manual((void *) 0xdfec, (void *) do_nothing); // bcm_host_init
overwrite_call_manual((void *) 0x12418, (void *) do_nothing); // bcm_host_deinit
overwrite_call_manual((void *) 0x125a8, (void *) do_nothing); // graphics_get_display_size
overwrite_call_manual((void *) 0x125dc, (void *) do_nothing); // vc_dispmanx_display_open
overwrite_call_manual((void *) 0x125e8, (void *) do_nothing); // vc_dispmanx_update_start
overwrite_call_manual((void *) 0x12618, (void *) do_nothing); // vc_dispmanx_element_add
overwrite_call_manual((void *) 0x12624, (void *) do_nothing); // vc_dispmanx_update_submit_sync
}

View File

@ -26,15 +26,15 @@ void _patch_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
overwrite_call_manual((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
overwrite_call_manual((void *) 0x124dc, (void *) eglSwapBuffers_injection); // eglSwapBuffers #1
overwrite_call_manual((void *) 0x14b6c, (void *) eglSwapBuffers_injection); // eglSwapBuffers #2
overwrite_call_manual((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
overwrite_call_manual((void *) 0x12594, (void *) eglCreateContext_injection); // eglCreateContext
}

View File

@ -37,7 +37,7 @@ static void SDL_Quit_injection() {
// Patch SDL Calls
void _patch_sdl_calls() {
// Disable SDL Calls
overwrite_call((void *) 0xe020, (void *) SDL_SetVideoMode_injection);
overwrite_call((void *) 0x13284, (void *) SDL_GetWMInfo_injection);
overwrite_call((void *) 0x12410, (void *) SDL_Quit_injection);
overwrite_call_manual((void *) 0xe020, (void *) SDL_SetVideoMode_injection);
overwrite_call_manual((void *) 0x13284, (void *) SDL_GetWMInfo_injection);
overwrite_call_manual((void *) 0x12410, (void *) SDL_Quit_injection);
}

View File

@ -24,6 +24,6 @@ static int XGetWindowAttributes_injection(__attribute__((unused)) void *display,
// Patch X11 Calls
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_manual((void *) 0x132a4, (void *) XGetWindowAttributes_injection); // XGetWindowAttributes
overwrite_call_manual((void *) 0x132d4, (void *) XTranslateCoordinates_injection); // XTranslateCoordinates
}

View File

@ -118,7 +118,7 @@ void init_creative() {
unsigned char size_patch[4] = {sizeof(AuxDataTileItem), 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);
overwrite_call((void *) 0xc6f74, TileItem_constructor, Tile_initTiles_TileItem_injection);
}
}
@ -137,7 +137,7 @@ void init_creative() {
void *addr = (void *) 0x27800;
const void *func = extract_from_bl_instruction((unsigned char *) addr);
if (func == Minecraft_isCreativeMode->backup) {
overwrite_call(addr, (void *) Gui_tickItemDrop_Minecraft_isCreativeMode_call_injection);
overwrite_call(addr, Minecraft_isCreativeMode, Gui_tickItemDrop_Minecraft_isCreativeMode_call_injection);
} else {
// Handled By input/misc.cpp
}

View File

@ -27,7 +27,7 @@ static void set_is_survival(const bool new_is_survival) {
patch((void *) 0x16ee4, size_patch);
// Replace Default CreatorMode Constructor With CreatorMode Or SurvivalMode Constructor
overwrite_call((void *) 0x16ef4, new_is_survival ? survival_mode_constructor : creative_mode_constructor);
overwrite_call_manual((void *) 0x16ef4, new_is_survival ? survival_mode_constructor : creative_mode_constructor);
is_survival = new_is_survival;
}
@ -62,7 +62,7 @@ void init_game_mode() {
overwrite_calls(Minecraft_setIsCreativeMode, Minecraft_setIsCreativeMode_injection);
// Replace CreatorLevel With ServerLevel (This Fixes Beds And Mob Spawning)
overwrite_call((void *) 0x16f84, (void *) ServerLevel_constructor->get(true));
overwrite_call_manual((void *) 0x16f84, (void *) ServerLevel_constructor->get(true));
// Allocate Correct Size For ServerLevel
constexpr uint32_t level_size = sizeof(ServerLevel);

View File

@ -86,6 +86,6 @@ void _init_misc() {
// Disable Opening Inventory Using The Cursor When Cursor Is Hidden
overwrite_calls(Gui_handleClick, 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 *) 0x27800, Minecraft_isCreativeMode, Gui_tickItemDrop_Minecraft_isCreativeMode_call_injection);
}
}

View File

@ -105,6 +105,6 @@ void _init_toggle() {
overwrite_calls(ParticleEngine_render, ParticleEngine_render_injection);
}
if (feature_has("Hide Crosshair In Third-Person", server_disabled)) {
overwrite_call((void *) 0x261b8, (void *) Gui_renderProgressIndicator_GuiComponent_blit_injection);
overwrite_call((void *) 0x261b8, GuiComponent_blit, Gui_renderProgressIndicator_GuiComponent_blit_injection);
}
}

View File

@ -33,12 +33,15 @@ struct Callbacks {
// Run Functions On Creative Inventory Setup
SETUP_CALLBACK(creative_inventory_setup, FillingContainer *);
// Handle Custom Creative Inventory Setup Behavior
static void Inventory_setupDefault_FillingContainer_addItem_call_injection(FillingContainer *filling_container, ItemInstance *item_instance) {
static int Inventory_setupDefault_FillingContainer_addItem_call_injection(FillingContainer *filling_container, ItemInstance *item_instance) {
// Call Original Method
filling_container->addItem(item_instance);
const int ret = filling_container->addItem(item_instance);
// Run Functions
get_misc_creative_inventory_setup_functions().run(filling_container);
// Return
return ret;
}
// Track Frames
@ -139,5 +142,5 @@ void misc_render_background(int color, const Minecraft *minecraft, const int x,
// Init
void _init_misc_api() {
// Handle Custom Creative Inventory Setup Behavior
overwrite_call((void *) 0x8e0fc, (void *) Inventory_setupDefault_FillingContainer_addItem_call_injection);
overwrite_call((void *) 0x8e0fc, FillingContainer_addItem, Inventory_setupDefault_FillingContainer_addItem_call_injection);
}

View File

@ -1,4 +1,5 @@
#include <cmath>
#include <algorithm>
#include <libreborn/patch.h>
#include <libreborn/config.h>
@ -337,7 +338,7 @@ static void PlayerRenderer_render_injection(PlayerRenderer *model_renderer, Enti
}
// 3D Chests
static int32_t Tile_getRenderShape_injection(Tile *tile) {
static int32_t TileRenderer_tesselateInWorld_Tile_getRenderShape_injection(Tile *tile) {
if (tile == Tile::chest) {
// Don't Render "Simple" Chest Model
return -1;
@ -357,7 +358,7 @@ static ChestTileEntity *ChestTileEntity_injection(ChestTileEntity_constructor_t
return tile_entity;
}
static bool is_rendering_chest = false;
static void ModelPart_render_injection(ModelPart *model_part, float scale) {
static void ChestRenderer_render_ModelPart_render_injection(ModelPart *model_part, float scale) {
// Start
is_rendering_chest = true;
@ -367,7 +368,7 @@ static void ModelPart_render_injection(ModelPart *model_part, float scale) {
// Stop
is_rendering_chest = false;
}
static void Tesselator_vertexUV_injection(Tesselator *self, const float x, const float y, const float z, const float u, float v) {
static void PolygonQuad_render_Tesselator_vertexUV_injection(Tesselator *self, const float x, const float y, const float z, const float u, float v) {
// Fix Chest Texture
if (is_rendering_chest) {
v /= 2;
@ -523,7 +524,7 @@ void _init_misc_graphics() {
});
unsigned char fix_outline_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
patch((void *) 0x4d830, fix_outline_patch);
overwrite_call((void *) 0x4d764, (void *) LevelRenderer_render_AABB_glColor4f_injection);
overwrite_call_manual((void *) 0x4d764, (void *) LevelRenderer_render_AABB_glColor4f_injection);
}
// Properly Hide Block Outline
@ -558,13 +559,13 @@ void _init_misc_graphics() {
hijack_entity_rendering = true;
}
if (hijack_entity_rendering) {
overwrite_call((void *) 0x606c0, (void *) EntityRenderDispatcher_render_EntityRenderer_render_injection);
overwrite_call((void *) 0x606c0, EntityRenderer_render, EntityRenderDispatcher_render_EntityRenderer_render_injection);
}
// Slightly Nicer Water Rendering
if (feature_has("Improved Water Rendering", server_disabled)) {
overwrite_call((void *) 0x49ed4, (void *) GameRenderer_render_glColorMask_injection);
overwrite_call((void *) 0x4a18c, (void *) GameRenderer_render_LevelRenderer_render_injection);
overwrite_call_manual((void *) 0x49ed4, (void *) GameRenderer_render_glColorMask_injection);
overwrite_call((void *) 0x4a18c, LevelRenderer_render, GameRenderer_render_LevelRenderer_render_injection);
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
patch((void *) 0x4a12c, nop_patch);
}
@ -581,12 +582,12 @@ void _init_misc_graphics() {
// 3D Chests
if (feature_has("3D Chest Model", server_disabled)) {
overwrite_call((void *) 0x5e830, (void *) Tile_getRenderShape_injection);
overwrite_call((void *) 0x5e830, Tile_getRenderShape, TileRenderer_tesselateInWorld_Tile_getRenderShape_injection);
overwrite_calls(ChestTileEntity_constructor, ChestTileEntity_injection);
overwrite_call((void *) 0x6655c, (void *) ModelPart_render_injection);
overwrite_call((void *) 0x66568, (void *) ModelPart_render_injection);
overwrite_call((void *) 0x66574, (void *) ModelPart_render_injection);
overwrite_call((void *) 0x4278c, (void *) Tesselator_vertexUV_injection);
overwrite_call((void *) 0x6655c, ModelPart_render, ChestRenderer_render_ModelPart_render_injection);
overwrite_call((void *) 0x66568, ModelPart_render, ChestRenderer_render_ModelPart_render_injection);
overwrite_call((void *) 0x66574, ModelPart_render, ChestRenderer_render_ModelPart_render_injection);
overwrite_call((void *) 0x4278c, Tesselator_vertexUV, PolygonQuad_render_Tesselator_vertexUV_injection);
unsigned char chest_model_patch[4] = {0x13, 0x20, 0xa0, 0xe3}; // "mov r2, #0x13"
patch((void *) 0x66fc8, chest_model_patch);
unsigned char chest_color_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
@ -603,7 +604,7 @@ void _init_misc_graphics() {
// 3D Dropped Items
if (feature_has("3D Dropped Items", server_disabled)) {
overwrite_calls(ItemRenderer_render, ItemRenderer_render_injection);
overwrite_call((void *) 0x4bf34, (void *) ItemInHandRenderer_renderItem_glTranslatef_injection);
overwrite_call_manual((void *) 0x4bf34, (void *) ItemInHandRenderer_renderItem_glTranslatef_injection);
}
// Vignette

View File

@ -16,7 +16,7 @@ void _init_misc_home() {
// Store Data In ~/.minecraft-pi Instead Of ~/.minecraft
patch_address(&Strings::default_path, (void *) get_home_subdirectory_for_game_data());
// Use MCPI_HOME Instead Of $HOME
overwrite_call((void *) 0xe0e4, (void *) getenv_HOME);
overwrite_call_manual((void *) 0xe0e4, (void *) getenv_HOME);
// The override code resolves assets manually,
// making changing directory redundant.

View File

@ -165,7 +165,7 @@ static void RandomLevelSource_buildSurface_injection(RandomLevelSource_buildSurf
}
// Disable Hostile AI In Creative Mode
static Entity *PathfinderMob_findAttackTarget_injection(PathfinderMob *mob) {
static Entity *PathfinderMob_updateAi_PathfinderMob_findAttackTarget_injection(PathfinderMob *mob) {
// Call Original Method
Entity *target = mob->findAttackTarget();
@ -456,7 +456,7 @@ void init_misc() {
// Print Error Message If RakNet Startup Fails
if (feature_has("Log RakNet Startup Errors", server_enabled)) {
overwrite_call((void *) 0x73778, (void *) RakNetInstance_host_RakNet_RakPeer_Startup_injection);
overwrite_call((void *) 0x73778, RakNet_RakPeer_Startup, RakNetInstance_host_RakNet_RakPeer_Startup_injection);
}
// Fix Furnace Not Checking Item Auxiliary When Inserting New Item
@ -483,7 +483,7 @@ void init_misc() {
// Disable Hostile AI In Creative Mode
if (feature_has("Disable Hostile AI In Creative Mode", server_enabled)) {
overwrite_call((void *) 0x83b8c, (void *) PathfinderMob_findAttackTarget_injection);
overwrite_call((void *) 0x83b8c, PathfinderMob_findAttackTarget, PathfinderMob_updateAi_PathfinderMob_findAttackTarget_injection);
}
// Send The Full Level, Not Only Changed Chunks
@ -507,7 +507,7 @@ void init_misc() {
// Implement Crafting Remainders
if (feature_has("Implement Crafting Remainders", server_enabled)) {
overwrite_call((void *) 0x2e230, (void *) PaneCraftingScreen_craftSelectedItem_PaneCraftingScreen_recheckRecipes_injection);
overwrite_call((void *) 0x2e230, PaneCraftingScreen_recheckRecipes, PaneCraftingScreen_craftSelectedItem_PaneCraftingScreen_recheckRecipes_injection);
overwrite_calls(Item_getCraftingRemainingItem, Item_getCraftingRemainingItem_injection);
}
@ -532,31 +532,31 @@ void init_misc() {
if (feature_has("Add Missing Language Strings", server_disabled)) {
misc_run_on_language_setup(Language_injection);
// Water/Lava Language Strings
overwrite_call((void *) 0xc3b54, (void *) Tile_initTiles_std_string_constructor);
overwrite_call((void *) 0xc3c7c, (void *) Tile_initTiles_std_string_constructor);
overwrite_call_manual((void *) 0xc3b54, (void *) Tile_initTiles_std_string_constructor);
overwrite_call_manual((void *) 0xc3c7c, (void *) Tile_initTiles_std_string_constructor);
// Carried Tile Language Strings
patch_address((void *) 0xc6674, (void *) "grassCarried");
patch_address((void *) 0xc6684, (void *) "leavesCarried");
// Invisible Bedrock Language String
overwrite_call((void *) 0xc5f04, (void *) Tile_initTiles_Tile_init_invBedrock_injection);
overwrite_call((void *) 0xc5f04, Tile_init, Tile_initTiles_Tile_init_invBedrock_injection);
}
// Prevent Pigmen From Burning In The Sun
if (feature_has("Fix Pigmen Burning In The Sun", server_enabled)) {
fix_pigmen_burning = true;
overwrite_call((void *) 0x89a1c, (void *) Zombie_aiStep_getBrightness_injection);
overwrite_call((void *) 0x89a1c, Entity_getBrightness, Zombie_aiStep_getBrightness_injection);
}
// Fix Door Duplication
if (feature_has("Fix Door Duplication", server_enabled)) {
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
patch((void *) 0xbe230, nop_patch);
overwrite_call((void *) 0xbe110, (void *) DoorTile_neighborChanged_Tile_spawnResources_injection);
overwrite_call((void *) 0xbe110, DoorTile_spawnResources, DoorTile_neighborChanged_Tile_spawnResources_injection);
}
// Fix Cobweb Lighting
if (feature_has("Fix Cobweb Lighting", server_enabled)) {
overwrite_call((void *) 0xc444c, (void *) Tile_initTiles_WebTile_setLightBlock_injection);
overwrite_call((void *) 0xc444c, Tile_setLightBlock, Tile_initTiles_WebTile_setLightBlock_injection);
}
// Fix Fire Immunity
@ -589,12 +589,12 @@ void init_misc() {
// Rare Segfault
if (feature_has("Fix Crash When Generating Certain Seeds", server_enabled)) {
overwrite_call((void *) 0xb198c, (void *) Dimension_isValidSpawn_Level_getTopTile_injection);
overwrite_call((void *) 0xb198c, Level_getTopTile, Dimension_isValidSpawn_Level_getTopTile_injection);
}
// Fix Sugar Rendering
if (feature_has("Fix Sugar Position In Hand", server_disabled)) {
overwrite_call((void *) 0x976f8, (void *) Item_initItems_Item_handEquipped_injection);
overwrite_call((void *) 0x976f8, Item_handEquipped, Item_initItems_Item_handEquipped_injection);
}
// Disable overwrite_calls() After Minecraft::init

View File

@ -39,31 +39,31 @@ static void Gui_renderHearts_injection(Gui_renderHearts_t original, Gui *gui) {
}
#define PINK_HEART_FULL 70
#define PINK_HEART_HALF 79
static void Gui_renderHearts_GuiComponent_blit_overlay_empty_injection(Gui *gui, const int32_t x1, const int32_t y1, const int32_t x2, const int32_t y2, const int32_t w1, const int32_t h1, const int32_t w2, const int32_t h2) {
static void Gui_renderHearts_GuiComponent_blit_overlay_empty_injection(GuiComponent *gui, const int32_t x1, const int32_t y1, const int32_t x2, const int32_t y2, const int32_t w1, const int32_t h1, const int32_t w2, const int32_t h2) {
// Call Original Method
get_blit_with_classic_hud_offset()((GuiComponent *) gui, x1, y1, x2, y2, w1, h1, w2, h2);
get_blit_with_classic_hud_offset()(gui, x1, y1, x2, y2, w1, h1, w2, h2);
// Render The Overlay
if (heal_amount_drawing == 1) {
// Half Heart
get_blit_with_classic_hud_offset()((GuiComponent *) gui, x1, y1, PINK_HEART_HALF, 0, w1, h1, w2, h2);
get_blit_with_classic_hud_offset()(gui, x1, y1, PINK_HEART_HALF, 0, w1, h1, w2, h2);
heal_amount_drawing = 0;
} else if (heal_amount_drawing > 0) {
// Full Heart
get_blit_with_classic_hud_offset()((GuiComponent *) gui, x1, y1, PINK_HEART_FULL, 0, w1, h1, w2, h2);
get_blit_with_classic_hud_offset()(gui, x1, y1, PINK_HEART_FULL, 0, w1, h1, w2, h2);
heal_amount_drawing -= 2;
}
}
static void Gui_renderHearts_GuiComponent_blit_overlay_hearts_injection(Gui *gui, const int32_t x1, const int32_t y1, const int32_t x2, const int32_t y2, const int32_t w1, const int32_t h1, const int32_t w2, const int32_t h2) {
static void Gui_renderHearts_GuiComponent_blit_overlay_hearts_injection(GuiComponent *gui, const int32_t x1, const int32_t y1, const int32_t x2, const int32_t y2, const int32_t w1, const int32_t h1, const int32_t w2, const int32_t h2) {
// Offset the overlay
if (x2 == 52) {
heal_amount_drawing += 2;
} else if (x2 == 61 && heal_amount) {
// Half heart, flipped
get_blit_with_classic_hud_offset()((GuiComponent *) gui, x1, y1, PINK_HEART_FULL, 0, w1, h1, w2, h2);
get_blit_with_classic_hud_offset()(gui, x1, y1, PINK_HEART_FULL, 0, w1, h1, w2, h2);
heal_amount_drawing += 1;
}
// Call Original Method
get_blit_with_classic_hud_offset()((GuiComponent *) gui, x1, y1, x2, y2, w1, h1, w2, h2);
get_blit_with_classic_hud_offset()(gui, x1, y1, x2, y2, w1, h1, w2, h2);
heal_amount_drawing = std::min(heal_amount_drawing, heal_amount);
}
@ -285,8 +285,8 @@ void _init_misc_ui() {
// Food Overlay
if (feature_has("Food Overlay", server_disabled)) {
overwrite_calls(Gui_renderHearts, Gui_renderHearts_injection);
overwrite_call((void *) 0x266f8, (void *) Gui_renderHearts_GuiComponent_blit_overlay_empty_injection);
overwrite_call((void *) 0x267c8, (void *) Gui_renderHearts_GuiComponent_blit_overlay_hearts_injection);
overwrite_call((void *) 0x266f8, GuiComponent_blit, Gui_renderHearts_GuiComponent_blit_overlay_empty_injection);
overwrite_call((void *) 0x267c8, GuiComponent_blit, Gui_renderHearts_GuiComponent_blit_overlay_hearts_injection);
}
// Render Selected Item Text + Hide Chat Messages
@ -299,7 +299,7 @@ void _init_misc_ui() {
// Translucent Toolbar
if (feature_has("Translucent Toolbar", server_disabled)) {
overwrite_calls(Gui_renderToolBar, Gui_renderToolBar_injection);
overwrite_call((void *) 0x26c5c, (void *) Gui_renderToolBar_glColor4f_injection);
overwrite_call_manual((void *) 0x26c5c, (void *) Gui_renderToolBar_glColor4f_injection);
}
// Fix Screen Rendering When GUI is Hidden
@ -358,9 +358,15 @@ void _init_misc_ui() {
patch((void *) 0x173f0, nop_patch);
}
// Don't Wrap Text On '\r' Or '\t' Because They Are Actual Characters In MCPI
if (feature_has("Fix Text Wrapping", server_disabled)) {
// Text Bugs
if (feature_has("Text Rendering Fixes", server_disabled)) {
// Don't Wrap Text On '\r' Or '\t' Because They Are Actual Characters In MCPI
patch_address(&Strings::text_wrapping_delimiter, (void *) " \n");
// Fix Width Of "Masculine Ordinal Indicator"
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
patch((void *) 0x24d6c, nop_patch);
patch((void *) 0x24d70, nop_patch);
patch((void *) 0x24d74, nop_patch);
}
// Fix Invalid ItemInHandRenderer Texture Cache

View File

@ -139,8 +139,8 @@ void LevelRenderer_renderSameAsLast(LevelRenderer *self, const float delta) {
void init_multidraw() {
// Setup
if (feature_has("Multidraw Rendering", server_disabled)) {
overwrite_call((void *) 0x4e51c, (void *) setup_multidraw);
overwrite_call((void *) 0x4e6f8, (void *) setup_multidraw);
overwrite_call_manual((void *) 0x4e51c, (void *) setup_multidraw);
overwrite_call_manual((void *) 0x4e6f8, (void *) setup_multidraw);
overwrite_calls(LevelRenderer_renderChunks, LevelRenderer_renderChunks_injection);
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
patch((void *) 0x479fc, nop_patch);

View File

@ -212,7 +212,7 @@ void init_options() {
// options.txt
if (feature_has("Fix options.txt Loading/Saving", server_enabled)) {
// Actually Save options.txt
overwrite_call((void *) 0x197fc, (void *) Options_save_Options_addOptionToSaveOutput_injection);
overwrite_call((void *) 0x197fc, Options_addOptionToSaveOutput, Options_save_Options_addOptionToSaveOutput_injection);
// Fix options.txt Path
patch_address((void *) &Strings::options_txt_path, (void *) get_new_options_txt_path());
// When Loading, options.txt Should Be Opened In Read Mode

View File

@ -11,7 +11,7 @@
// Fix Initial Option Button Rendering
// The calling function doesn't exist in MCPE v0.6.1, so its name is unknown.
static OptionButton *OptionsPane_unknown_toggle_creating_function_OptionButton_injection(OptionButton *option_button, Options_Option *option) {
static OptionButton *OptionsPane_unknown_toggle_creating_function_OptionButton_injection(OptionButton *option_button, const Options_Option *option) {
// Call Original Method
OptionButton *ret = option_button->constructor(option);
@ -162,7 +162,7 @@ void _init_options_ui() {
unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
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);
overwrite_call((void *) 0x24510, OptionButton_constructor, OptionsPane_unknown_toggle_creating_function_OptionButton_injection);
// "Gui Scale" slider is broken, so disable it.
patch((void *) 0x35a10, nop_patch);
@ -180,7 +180,7 @@ void _init_options_ui() {
overwrite_calls(Options_getBooleanValue, Options_getBooleanValue_injection);
// Fix Difficulty When Toggling
overwrite_call((void *) 0x1cd00, (void *) OptionButton_toggle_Options_save_injection);
overwrite_call((void *) 0x1cd00, Options_save, OptionButton_toggle_Options_save_injection);
}
// Info Button

View File

@ -581,7 +581,7 @@ static void server_init() {
}
// Log IPs
overwrite_call((void *) 0x75e54, (void *) ServerSideNetworkHandler_onReady_ClientGeneration_ServerSideNetworkHandler_popPendingPlayer_injection);
overwrite_call((void *) 0x75e54, ServerSideNetworkHandler_popPendingPlayer, ServerSideNetworkHandler_onReady_ClientGeneration_ServerSideNetworkHandler_popPendingPlayer_injection);
// Start Reading STDIN
pthread_create(&read_stdin_thread_obj, nullptr, read_stdin_thread, nullptr);

View File

@ -116,20 +116,20 @@ static void TripodCameraRenderer_render_Tesselator_draw_injection(Tesselator *se
// Init
void _init_lighting() {
overwrite_calls(LevelRenderer_renderEntities, LevelRenderer_renderEntities_injection);
overwrite_call((void *) 0x4c04c, (void *) ItemInHandRenderer_render_glPopMatrix_injection);
overwrite_call_manual((void *) 0x4c04c, (void *) ItemInHandRenderer_render_glPopMatrix_injection);
overwrite_calls(ItemInHandRenderer_render, ItemInHandRenderer_render_injection);
overwrite_call((void *) 0x4bedc, (void *) enable_rescale_normal);
overwrite_call((void *) 0x4bf70, (void *) disable_rescale_normal);
overwrite_call_manual((void *) 0x4bedc, (void *) enable_rescale_normal);
overwrite_call_manual((void *) 0x4bf70, (void *) disable_rescale_normal);
overwrite_calls(ItemRenderer_render, EntityRenderer_render_injection<ItemRenderer>);
overwrite_calls(ArrowRenderer_render, EntityRenderer_render_injection<ArrowRenderer>);
overwrite_calls(ItemSpriteRenderer_render, EntityRenderer_render_injection<ItemSpriteRenderer>);
overwrite_calls(PaintingRenderer_render, EntityRenderer_render_injection<PaintingRenderer>);
overwrite_call((void *) 0x641ec, (void *) enable_rescale_normal);
overwrite_call((void *) 0x647a0, (void *) disable_rescale_normal);
overwrite_call((void *) 0x62b08, (void *) FallingTileRenderer_render_TileRenderer_renderBlock_injection);
overwrite_call((void *) 0x65754, (void *) TntRenderer_render_TileRenderer_renderTile_injection);
overwrite_call_manual((void *) 0x641ec, (void *) enable_rescale_normal);
overwrite_call_manual((void *) 0x647a0, (void *) disable_rescale_normal);
overwrite_call((void *) 0x62b08, TileRenderer_renderBlock, FallingTileRenderer_render_TileRenderer_renderBlock_injection);
overwrite_call((void *) 0x65754, TileRenderer_renderTile, TntRenderer_render_TileRenderer_renderTile_injection);
overwrite_calls(MobRenderer_renderNameTag, MobRenderer_renderNameTag_injection);
overwrite_calls(ArmorScreen_renderPlayer, ArmorScreen_renderPlayer_injection);
overwrite_call((void *) 0x29d88, (void *) ArmorScreen_renderPlayer_glRotatef_injection);
overwrite_call((void *) 0x65a10, (void *) TripodCameraRenderer_render_Tesselator_draw_injection);
overwrite_call_manual((void *) 0x29d88, (void *) ArmorScreen_renderPlayer_glRotatef_injection);
overwrite_call((void *) 0x65a10, Tesselator_draw, TripodCameraRenderer_render_Tesselator_draw_injection);
}

View File

@ -32,7 +32,7 @@ static void PolygonQuad_render_injection(PolygonQuad_render_t original, PolygonQ
template <int nx, int ny, int nz> \
static void add_normal_before_##name(uint32_t addr) { \
std::remove_pointer_t<decltype(type##_##name)>::ptr_type func = type##_##name##_injection<nx, ny, nz>; \
overwrite_call((void *) addr, (void *) func); \
overwrite_call((void *) addr, type##_##name, func); \
}
add_normal_before(Tesselator, vertexUV)
add_normal_before(Tesselator, vertex)

View File

@ -148,7 +148,7 @@ static void drawArrayVT_injection(const int buffer, const int vertices, int vert
}
// Add Vertex
static void Tesselator_vertex_injection(const Tesselator *self, const float x, const float y, const float z) {
static void Tesselator_vertex_injection(Tesselator *self, const float x, const float y, const float z) {
CustomVertex &vertex = CustomTesselator::instance.vertices[CustomTesselator::instance.vertex_count++];
vertex.pos = {
(self->offset_x + x) * self->sx,
@ -195,9 +195,9 @@ void _init_custom_tesselator() {
overwrite_calls(Tesselator_init, Tesselator_init_injection);
overwrite_calls(Tesselator_clear, Tesselator_clear_injection);
overwrite_calls(Tesselator_begin, Tesselator_begin_injection);
overwrite_call((void *) Tesselator_end->backup, (void *) Tesselator_end_injection, true);
overwrite_call((void *) Tesselator_draw->backup, (void *) Tesselator_draw_injection, true);
overwrite_call((void *) Tesselator_vertex->backup, (void *) Tesselator_vertex_injection, true);
overwrite_call((void *) Tesselator_normal->backup, (void *) Tesselator_normal_injection, true);
overwrite_call((void *) Common_drawArrayVT->backup, (void *) drawArrayVT_injection, true);
overwrite_call((void *) Tesselator_end->backup, Tesselator_end, Tesselator_end_injection, true);
overwrite_call((void *) Tesselator_draw->backup, Tesselator_draw, Tesselator_draw_injection, true);
overwrite_call((void *) Tesselator_vertex->backup, Tesselator_vertex, Tesselator_vertex_injection, true);
overwrite_call((void *) Tesselator_normal->backup, Tesselator_normal, Tesselator_normal_injection, true);
overwrite_call((void *) Common_drawArrayVT->backup, Common_drawArrayVT, drawArrayVT_injection, true);
}

View File

@ -1,3 +1,5 @@
#include <cstdint>
#include <libreborn/patch.h>
#include <symbols/minecraft.h>
@ -65,7 +67,7 @@ static void Player_username_assign_injection_2(std::string *target, const char *
}
// Change Texture For HUD
static int32_t Textures_loadAndBindTexture_injection(Textures *textures, __attribute__((unused)) std::string const& name) {
static uint32_t Textures_loadAndBindTexture_injection(Textures *textures, __attribute__((unused)) std::string const& name) {
// Change Texture
static std::string new_texture;
if (new_texture.length() == 0) {
@ -82,14 +84,14 @@ void init_skin() {
// Check Feature Flag
if (feature_has("Load Custom Skins", server_disabled)) {
// LocalPlayer
overwrite_call((void *) 0x44c28, (void *) Player_username_assign_injection);
overwrite_call_manual((void *) 0x44c28, (void *) Player_username_assign_injection);
// RemotePlayer
overwrite_call((void *) 0x6ce58, (void *) Player_username_assign_injection_2);
overwrite_call_manual((void *) 0x6ce58, (void *) Player_username_assign_injection_2);
// ServerPlayer
overwrite_call((void *) 0x7639c, (void *) Player_username_assign_injection_2);
overwrite_call_manual((void *) 0x7639c, (void *) Player_username_assign_injection_2);
// HUD
overwrite_call((void *) 0x4c6d0, (void *) Textures_loadAndBindTexture_injection);
overwrite_call((void *) 0x4c6d0, Textures_loadAndBindTexture, Textures_loadAndBindTexture_injection);
// Loader
_init_skin_loader();

View File

@ -202,7 +202,7 @@ static DynamicTexture *create_fire_texture(const int a2) {
static bool animated_water = false;
static bool animated_lava = false;
static bool animated_fire = false;
static void Textures_addDynamicTexture_injection(Textures *textures, DynamicTexture *dynamic_texture) {
static void Minecraft_init_Textures_addDynamicTexture_injection(Textures *textures, DynamicTexture *dynamic_texture) {
// Call Original Method
if (animated_water) {
textures->addDynamicTexture(dynamic_texture);
@ -228,5 +228,5 @@ void _init_textures_lava(const bool animated_water_param, const bool animated_la
unsigned char disable_water_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
patch((void *) 0x17094, disable_water_patch);
}
overwrite_call((void *) 0x170b4, (void *) Textures_addDynamicTexture_injection);
overwrite_call((void *) 0x170b4, Textures_addDynamicTexture, Minecraft_init_Textures_addDynamicTexture_injection);
}

View File

@ -87,7 +87,7 @@ struct SplashLine {
// Add Splashes
static std::string current_splash;
static bool draw_splash(StartMenuScreen *screen, const float y_factor, const bool allow_bad_y_factor) {
static bool draw_splash(const StartMenuScreen *screen, const float y_factor, const bool allow_bad_y_factor) {
// Position
const SplashLine line(screen, y_factor);
const float x = line.origin_x();
@ -121,9 +121,8 @@ static bool draw_splash(StartMenuScreen *screen, const float y_factor, const boo
media_glScalef(scale, scale, 1);
media_glTranslatef(-text_width / 2.0f, 0, 0);
// Render
float y_offset = float(-line_height) / 2.0f;
y_offset += 1; // Make It Look Vertically Centered
screen->drawString(screen->font, current_splash, 0, y_offset, 0xffff00);
float y_offset = -float(line_height - 1) / 2.0f;
screen->font->drawShadow(current_splash, 0, y_offset, 0xffff00);
// Finish
media_glPopMatrix();
return true;

View File

@ -42,7 +42,7 @@ static void StartMenuScreen_init_injection(StartMenuScreen_init_t original, Star
// Add Functionality To Quit Button
static void StartMenuScreen_buttonClicked_injection(StartMenuScreen_buttonClicked_t original, StartMenuScreen *screen, Button *button) {
Button *quit_button = &screen->create_button;
const Button *quit_button = &screen->create_button;
if (button == quit_button) {
// Quit
compat_request_exit();
@ -72,7 +72,7 @@ static float StartMenuScreen_render_Mth_min_injection(__attribute__((unused)) fl
// Track Version Text Y
int version_text_bottom;
static int (*adjust_version_y)(const StartMenuScreen *) = nullptr;
static void StartMenuScreen_render_GuiComponent_drawString_injection(GuiComponent *self, Font *font, const std::string &text, int x, int y, int color) {
static void StartMenuScreen_render_GuiComponent_drawString_injection(GuiComponent *self, Font *font, const std::string &text, int x, int y, uint color) {
// Adjust Position
if (adjust_version_y) {
y = adjust_version_y((StartMenuScreen *) self);
@ -175,18 +175,18 @@ void init_title_screen() {
// High-Resolution Title
if (feature_has("Allow High-Resolution Title", server_disabled) || modern_logo) {
// Touch
overwrite_call((void *) 0x3df2c, (void *) StartMenuScreen_render_Textures_getTemporaryTextureData_injection);
overwrite_call((void *) 0x3df98, (void *) StartMenuScreen_render_Mth_min_injection);
overwrite_call((void *) 0x3df2c, Textures_getTemporaryTextureData, StartMenuScreen_render_Textures_getTemporaryTextureData_injection);
overwrite_call((void *) 0x3df98, Mth_min, StartMenuScreen_render_Mth_min_injection);
// Classic
overwrite_call((void *) 0x3956c, (void *) StartMenuScreen_render_Textures_getTemporaryTextureData_injection);
overwrite_call((void *) 0x395d8, (void *) StartMenuScreen_render_Mth_min_injection);
overwrite_call((void *) 0x3956c, Textures_getTemporaryTextureData, StartMenuScreen_render_Textures_getTemporaryTextureData_injection);
overwrite_call((void *) 0x395d8, Mth_min, StartMenuScreen_render_Mth_min_injection);
}
// Better Scaling And Position
bool hijack_version_rendering = false;
if (feature_has("Improved Classic Title Positioning", server_disabled)) {
overwrite_call((void *) 0x3956c, (void *) StartMenuScreen_render_Textures_getTemporaryTextureData_injection_modern);
overwrite_call((void *) 0x39528, (void *) StartMenuScreen_render_Screen_renderBackground_injection);
overwrite_call((void *) 0x3956c, Textures_getTemporaryTextureData, StartMenuScreen_render_Textures_getTemporaryTextureData_injection_modern);
overwrite_call((void *) 0x39528, StartMenuScreen_renderBackground, StartMenuScreen_render_Screen_renderBackground_injection);
hijack_version_rendering = true;
adjust_version_y = get_version_y;
}
@ -199,7 +199,7 @@ void init_title_screen() {
// Adjust And Record Version String Rendering
if (hijack_version_rendering) {
overwrite_call((void *) 0x39728, (void *) StartMenuScreen_render_GuiComponent_drawString_injection);
overwrite_call((void *) 0x39728, GuiComponent_drawString, StartMenuScreen_render_GuiComponent_drawString_injection);
}
// Init Welcome Screen

View File

@ -131,7 +131,7 @@ static Screen *create_welcome_screen() {
}
// Show Welcome Screen
static void NinecraftApp_init_ScreenChooser_setScreen_injection(ScreenChooser *self, int id) {
static void NinecraftApp_init_ScreenChooser_setScreen_injection(ScreenChooser *self, uint id) {
if (should_show_welcome()) {
// Show Welcome Screen
self->minecraft->setScreen(create_welcome_screen());
@ -144,5 +144,5 @@ static void NinecraftApp_init_ScreenChooser_setScreen_injection(ScreenChooser *s
// Init
void _init_welcome() {
// Hijack Start Screen
overwrite_call((void *) 0x14a34, (void *) NinecraftApp_init_ScreenChooser_setScreen_injection);
overwrite_call((void *) 0x14a34, ScreenChooser_setScreen, NinecraftApp_init_ScreenChooser_setScreen_injection);
}

View File

@ -9,9 +9,12 @@
#include <symbols/minecraft.h>
// Enable Touch GUI
static bool Minecraft_isTouchscreen_injection(__attribute__((unused)) Minecraft_isTouchscreen_t original, __attribute__((unused)) Minecraft *minecraft) {
static bool Minecraft_isTouchscreen_call_injection(__attribute__((unused)) Minecraft *minecraft) {
return true;
}
static bool Minecraft_isTouchscreen_injection(__attribute__((unused)) Minecraft_isTouchscreen_t original, __attribute__((unused)) Minecraft *minecraft) {
return Minecraft_isTouchscreen_call_injection(minecraft);
}
// IngameBlockSelectionScreen Memory Allocation Override
static unsigned char *operator_new_IngameBlockSelectionScreen_injection(__attribute__((unused)) uint32_t size) {
@ -33,7 +36,7 @@ static int32_t Button_hovered_injection(__attribute__((unused)) Button_hovered_t
// Check
return x >= button_x1 && x < button_x2 && y >= button_y1 && y < button_y2;
}
static void LargeImageButton_render_GuiComponent_drawCenteredString_injection(GuiComponent *component, Font *font, const std::string &text, int32_t x, int32_t y, int32_t color) {
static void LargeImageButton_render_GuiComponent_drawCenteredString_injection(GuiComponent *component, Font *font, const std::string &text, int32_t x, int32_t y, uint32_t color) {
// Change Color On Hover
if (color == 0xe0e0e0 && Button_hovered_injection(nullptr, (Button *) component, nullptr, 0, 0)) {
color = 0xffffa0;
@ -73,33 +76,33 @@ void init_touch() {
} else {
// Force Touch Inventory
if (feature_has("Force Touch UI Inventory", server_disabled)) {
overwrite_call((void *) 0x2943c, (void *) operator_new_IngameBlockSelectionScreen_injection);
overwrite_call((void *) 0x29444, (void *) Touch_IngameBlockSelectionScreen_constructor->get(true));
overwrite_call_manual((void *) 0x2943c, (void *) operator_new_IngameBlockSelectionScreen_injection);
overwrite_call_manual((void *) 0x29444, (void *) Touch_IngameBlockSelectionScreen_constructor->get(true));
// Make "Craft" And "Armor" Buttons Use Classic GUI Style (Button And TButton Have The Same Size)
overwrite_call((void *) 0x3b060, (void *) Button_constructor->get(true));
overwrite_call((void *) 0x3b08c, (void *) Button_constructor->get(true));
overwrite_call_manual((void *) 0x3b060, (void *) Button_constructor->get(true));
overwrite_call_manual((void *) 0x3b08c, (void *) Button_constructor->get(true));
}
// Force Touch Button Behavior
if (feature_has("Force Touch UI Button Behavior", server_disabled)) {
touch_buttons = true;
overwrite_call((void *) 0x1baf4, (void *) Minecraft_isTouchscreen_injection);
overwrite_call((void *) 0x1be40, (void *) Minecraft_isTouchscreen_injection);
overwrite_call((void *) 0x1c470, (void *) Minecraft_isTouchscreen_injection);
overwrite_call((void *) 0x1e868, (void *) Minecraft_isTouchscreen_injection);
overwrite_call((void *) 0x290b8, (void *) Minecraft_isTouchscreen_injection);
overwrite_call((void *) 0x29168, (void *) Minecraft_isTouchscreen_injection);
overwrite_call((void *) 0x3e314, (void *) Minecraft_isTouchscreen_injection);
overwrite_call((void *) 0x2cbc0, (void *) Minecraft_isTouchscreen_injection);
overwrite_call((void *) 0x2ea7c, (void *) Minecraft_isTouchscreen_injection);
overwrite_call((void *) 0x4a438, (void *) Minecraft_isTouchscreen_injection);
overwrite_call((void *) 0x1baf4, Minecraft_isTouchscreen, Minecraft_isTouchscreen_call_injection);
overwrite_call((void *) 0x1be40, Minecraft_isTouchscreen, Minecraft_isTouchscreen_call_injection);
overwrite_call((void *) 0x1c470, Minecraft_isTouchscreen, Minecraft_isTouchscreen_call_injection);
overwrite_call((void *) 0x1e868, Minecraft_isTouchscreen, Minecraft_isTouchscreen_call_injection);
overwrite_call((void *) 0x290b8, Minecraft_isTouchscreen, Minecraft_isTouchscreen_call_injection);
overwrite_call((void *) 0x29168, Minecraft_isTouchscreen, Minecraft_isTouchscreen_call_injection);
overwrite_call((void *) 0x3e314, Minecraft_isTouchscreen, Minecraft_isTouchscreen_call_injection);
overwrite_call((void *) 0x2cbc0, Minecraft_isTouchscreen, Minecraft_isTouchscreen_call_injection);
overwrite_call((void *) 0x2ea7c, Minecraft_isTouchscreen, Minecraft_isTouchscreen_call_injection);
overwrite_call((void *) 0x4a438, Minecraft_isTouchscreen, Minecraft_isTouchscreen_call_injection);
}
}
// Improved Button Hover Behavior
if (touch_buttons && feature_has("Improved Button Hover Behavior", server_disabled)) {
overwrite_calls(Button_hovered, Button_hovered_injection);
overwrite_call((void *) 0x1ebd4, (void *) LargeImageButton_render_GuiComponent_drawCenteredString_injection);
overwrite_call((void *) 0x1ebd4, GuiComponent_drawCenteredString, LargeImageButton_render_GuiComponent_drawCenteredString_injection);
}
// Show Block Outlines

View File

@ -1,4 +1,5 @@
method std::string parse(ConnectedClient &client, const std::string &command) = 0x6aa8c;
method void dispatchPacket(Packet &packet) = 0x6a548;
property Minecraft *minecraft = 0x18;
property OffsetPosTranslator pos_translator = 0x1c;

View File

@ -2,7 +2,7 @@ vtable 0x102700;
method void tickInput() = 0x15ffc;
method void setIsCreativeMode(int is_creative) = 0x16ec4;
method int isTouchscreen() = 0x1639c;
method bool isTouchscreen() = 0x1639c;
method void setScreen(Screen *screen) = 0x15d6c;
method void tick(int tick, int max_ticks) = 0x16934;
method void hostMultiplayer(int port) = 0x16664;

View File

@ -1,4 +1,6 @@
method int width(const std::string &string) = 0x24d4c;
method void draw(const std::string &string, float x, float y, uint color) = 0x250e0;
method void draw_raw(const char *string, float x, float y, uint color) = 0x25148;
method void drawShadow(const std::string &string, float x, float y, uint color) = 0x250ec;
method void drawShadow_raw(const char *string, float x, float y, uint color) = 0x25150;
method void drawSlow(const char *text, float x, float y, uint color, bool param_1) = 0x24fa8;

View File

@ -10,6 +10,7 @@ static-method ItemInstance *fromTag(CompoundTag *tag) = 0x9a124;
method CompoundTag *save(CompoundTag *tag) = 0x9a31c;
method int getMaxStackSize() = 0x99ac8;
method bool isNull() = 0x999b0;
method void setNull() = 0x999cc;
property int count = 0x0;
property int id = 0x4;