diff --git a/mods/src/input/misc.c b/mods/src/input/misc.c index 8674d3097..898987dcb 100644 --- a/mods/src/input/misc.c +++ b/mods/src/input/misc.c @@ -45,6 +45,23 @@ static int32_t OptionsScreen_handleBackEvent_injection(unsigned char *screen, bo return 1; } +// Fix "Sleeping Beaty" Bug +static int32_t InBedScreen_handleBackEvent_injection(unsigned char *screen, bool do_nothing) { + if (!do_nothing) { + // Close Screen + unsigned char *minecraft = *(unsigned char **) (screen + Screen_minecraft_property_offset); + (*Minecraft_setScreen)(minecraft, NULL); + // Stop Sleeping + unsigned char *player = *(unsigned char **) (minecraft + Minecraft_player_property_offset); + if (player != NULL) { + unsigned char *player_vtable = *(unsigned char **) player; + Player_stopSleepInBed_t Player_stopSleepInBed = *(Player_stopSleepInBed_t *) (player_vtable + Player_stopSleepInBed_vtable_offset); + (*Player_stopSleepInBed)(player, 1, 1, 1); + } + } + return 1; +} + // Set Mouse Grab State static int mouse_grab_state = 0; void input_set_mouse_grab_state(int state) { @@ -90,6 +107,8 @@ void _init_misc() { if (enable_misc) { // Fix OptionsScreen Ignoring The Back Button patch_address(OptionsScreen_handleBackEvent_vtable_addr, (void *) OptionsScreen_handleBackEvent_injection); + // Fix "Sleeping Beauty" Bug + patch_address(InBedScreen_handleBackEvent_vtable_addr, (void *) InBedScreen_handleBackEvent_injection); // Disable Opening Inventory Using The Cursor When Cursor Is Hidden overwrite_calls((void *) Gui_handleClick, (void *) Gui_handleClick_injection); } diff --git a/symbols/include/symbols/minecraft.h b/symbols/include/symbols/minecraft.h index 997504aec..7e0bd01cd 100644 --- a/symbols/include/symbols/minecraft.h +++ b/symbols/include/symbols/minecraft.h @@ -460,6 +460,9 @@ static uint32_t Player_drop_vtable_offset = 0x208; static Mob_getWalkingSpeedModifier_t Player_getWalkingSpeedModifier = (Mob_getWalkingSpeedModifier_t) 0x8ea0c; +typedef void (*Player_stopSleepInBed_t)(unsigned char *player, bool param_1, bool param_2, bool param_3); +static uint32_t Player_stopSleepInBed_vtable_offset = 0x228; + static uint32_t Player_username_property_offset = 0xbf4; // std::string static uint32_t Player_inventory_property_offset = 0xbe0; // Inventory * @@ -590,6 +593,10 @@ static FurnaceScreen_handleAddItem_t FurnaceScreen_handleAddItem = (FurnaceScree static uint32_t FurnaceScreen_tile_entity_property_offset = 0x1d0; // FurnaceTileEntity * +// InBedScreen + +static void *InBedScreen_handleBackEvent_vtable_addr = (void *) 0x104614; + // FurnaceTileEntity typedef ItemInstance *(*FurnaceTileEntity_getItem_t)(unsigned char *furnace_tile_entity, int32_t slot);