90 lines
2.9 KiB
C
90 lines
2.9 KiB
C
|
#include <libreborn/libreborn.h>
|
||
|
#include <libreborn/minecraft.h>
|
||
|
|
||
|
#include "input.h"
|
||
|
#include "../feature/feature.h"
|
||
|
|
||
|
// Enable Miscellaneous Input Fixes
|
||
|
static int enable_misc = 0;
|
||
|
|
||
|
// Store Back Button Presses
|
||
|
static int back_button_presses = 0;
|
||
|
int input_back() {
|
||
|
if (enable_misc) {
|
||
|
back_button_presses++;
|
||
|
return 1; // Handled
|
||
|
} else {
|
||
|
return 0; // Not Handled
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Handle Back Button Presses
|
||
|
void _handle_back(unsigned char *minecraft) {
|
||
|
unsigned char *minecraft_vtable = *(unsigned char **) minecraft;
|
||
|
Minecraft_handleBack_t Minecraft_handleBack = *(Minecraft_handleBack_t *) (minecraft_vtable + Minecraft_handleBack_vtable_offset);
|
||
|
for (int i = 0; i < back_button_presses; i++) {
|
||
|
(*Minecraft_handleBack)(minecraft, 0);
|
||
|
}
|
||
|
back_button_presses = 0;
|
||
|
}
|
||
|
|
||
|
// Fix OptionsScreen Ignoring The Back Button
|
||
|
static int32_t OptionsScreen_handleBackEvent_injection(unsigned char *screen, __attribute__((unused)) bool param_1) {
|
||
|
unsigned char *minecraft = *(unsigned char **) (screen + Screen_minecraft_property_offset);
|
||
|
(*Minecraft_setScreen)(minecraft, NULL);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
// Set Mouse Grab State
|
||
|
static int mouse_grab_state = 0;
|
||
|
void input_set_mouse_grab_state(int state) {
|
||
|
mouse_grab_state = state;
|
||
|
}
|
||
|
|
||
|
// Grab/Un-Grab Mouse
|
||
|
void _handle_mouse_grab(unsigned char *minecraft) {
|
||
|
if (mouse_grab_state == -1) {
|
||
|
// Grab
|
||
|
(*Minecraft_grabMouse)(minecraft);
|
||
|
} else if (mouse_grab_state == 1) {
|
||
|
// Un-Grab
|
||
|
(*Minecraft_releaseMouse)(minecraft);
|
||
|
}
|
||
|
mouse_grab_state = 0;
|
||
|
}
|
||
|
|
||
|
#include <SDL/SDL.h>
|
||
|
|
||
|
// Block UI Interaction When Mouse Is Locked
|
||
|
static bool Gui_tickItemDrop_Minecraft_isCreativeMode_call_injection(unsigned char *minecraft) {
|
||
|
if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) {
|
||
|
// Call Original Method
|
||
|
return (*Minecraft_isCreativeMode)(minecraft);
|
||
|
} else {
|
||
|
// Disable Item Drop Ticking
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Block UI Interaction When Mouse Is Locked
|
||
|
static void Gui_handleClick_injection(unsigned char *gui, int32_t param_2, int32_t param_3, int32_t param_4) {
|
||
|
if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) {
|
||
|
// Call Original Method
|
||
|
(*Gui_handleClick)(gui, param_2, param_3, param_4);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Init
|
||
|
void _init_misc() {
|
||
|
enable_misc = feature_has("Miscellaneous Input Fixes", 0);
|
||
|
if (enable_misc) {
|
||
|
// Fix OptionsScreen Ignoring The Back Button
|
||
|
patch_address(OptionsScreen_handleBackEvent_vtable_addr, (void *) OptionsScreen_handleBackEvent_injection);
|
||
|
|
||
|
// Disable Item Dropping Using The Cursor When Cursor Is Hidden
|
||
|
overwrite_call((void *) 0x27800, (void *) Gui_tickItemDrop_Minecraft_isCreativeMode_call_injection);
|
||
|
// Disable Opening Inventory Using The Cursor When Cursor Is Hidden
|
||
|
overwrite_calls((void *) Gui_handleClick, (void *) Gui_handleClick_injection);
|
||
|
}
|
||
|
}
|