From 09bae1cf3ee9c1e568c260ca198c19e15d61b67e Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Wed, 8 May 2024 20:18:50 -0400 Subject: [PATCH] Split Up Options Mod --- mods/CMakeLists.txt | 1 + mods/src/chat/chat-internal.h | 2 - mods/src/game-mode/game-mode-internal.h | 10 +- mods/src/input/input-internal.h | 10 +- mods/src/misc/misc-internal.h | 10 +- mods/src/options/options-internal.h | 4 + mods/src/options/options.cpp | 113 ++--------------------- mods/src/options/ui.cpp | 118 ++++++++++++++++++++++++ 8 files changed, 132 insertions(+), 136 deletions(-) create mode 100644 mods/src/options/options-internal.h create mode 100644 mods/src/options/ui.cpp diff --git a/mods/CMakeLists.txt b/mods/CMakeLists.txt index 46a4268417..d2e785da71 100644 --- a/mods/CMakeLists.txt +++ b/mods/CMakeLists.txt @@ -31,6 +31,7 @@ set(SRC src/misc/api.cpp # options src/options/options.cpp + src/options/ui.cpp # bucket src/bucket/bucket.cpp # cake diff --git a/mods/src/chat/chat-internal.h b/mods/src/chat/chat-internal.h index 128e478038..657ac5af89 100644 --- a/mods/src/chat/chat-internal.h +++ b/mods/src/chat/chat-internal.h @@ -2,8 +2,6 @@ #include -#include - // Message Limitations #define MAX_CHAT_MESSAGE_LENGTH 256 diff --git a/mods/src/game-mode/game-mode-internal.h b/mods/src/game-mode/game-mode-internal.h index 237ec26d6e..219a702bce 100644 --- a/mods/src/game-mode/game-mode-internal.h +++ b/mods/src/game-mode/game-mode-internal.h @@ -1,11 +1,3 @@ #pragma once -#ifdef __cplusplus -extern "C" { -#endif - -__attribute__((visibility("internal"))) void _init_game_mode_ui(); - -#ifdef __cplusplus -} -#endif +__attribute__((visibility("internal"))) void _init_game_mode_ui(); \ No newline at end of file diff --git a/mods/src/input/input-internal.h b/mods/src/input/input-internal.h index f7943ec5e6..95fd0ba2f1 100644 --- a/mods/src/input/input-internal.h +++ b/mods/src/input/input-internal.h @@ -1,16 +1,8 @@ #pragma once -#ifdef __cplusplus -extern "C" { -#endif - __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(); -__attribute__((visibility("internal"))) void _init_crafting(); - -#ifdef __cplusplus -} -#endif +__attribute__((visibility("internal"))) void _init_crafting(); \ No newline at end of file diff --git a/mods/src/misc/misc-internal.h b/mods/src/misc/misc-internal.h index 806dc41265..aad93ac7b7 100644 --- a/mods/src/misc/misc-internal.h +++ b/mods/src/misc/misc-internal.h @@ -1,12 +1,4 @@ #pragma once -#ifdef __cplusplus -extern "C" { -#endif - __attribute__((visibility("internal"))) void _init_misc_logging(); -__attribute__((visibility("internal"))) void _init_misc_api(); - -#ifdef __cplusplus -} -#endif +__attribute__((visibility("internal"))) void _init_misc_api(); \ No newline at end of file diff --git a/mods/src/options/options-internal.h b/mods/src/options/options-internal.h new file mode 100644 index 0000000000..4a7211899b --- /dev/null +++ b/mods/src/options/options-internal.h @@ -0,0 +1,4 @@ +#pragma once + +__attribute__((visibility("internal"))) void _init_options_ui(); +__attribute__((visibility("internal"))) extern Options *stored_options; \ No newline at end of file diff --git a/mods/src/options/options.cpp b/mods/src/options/options.cpp index 86c8dd0ea7..ad0063c013 100644 --- a/mods/src/options/options.cpp +++ b/mods/src/options/options.cpp @@ -10,6 +10,8 @@ #include #include +#include "options-internal.h" + // Force Mob Spawning static bool LevelData_getSpawnMobs_injection(__attribute__((unused)) LevelData *level_data) { return true; @@ -49,7 +51,7 @@ __attribute__((destructor)) static void _free_safe_username() { static int render_distance; // Configure Options -static Options *stored_options = nullptr; +Options *stored_options = nullptr; static void Options_initDefaultValue_injection(Options_initDefaultValue_t original, Options *options) { // Call Original Method original(options); @@ -83,19 +85,6 @@ static bool TileRenderer_tesselateBlockInWorld_injection(TileRenderer_tesselateB return original(tile_renderer, tile, x, y, z); } -// 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) { - // Call Original Method - OptionButton *ret = OptionButton_constructor(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(Options *options, std::vector *data, std::string option, int32_t value) { @@ -165,75 +154,6 @@ static char *get_new_options_txt_path() { } #endif -// Modify Option Toggles -static void OptionsPane_unknown_toggle_creating_function_injection(OptionsPane_unknown_toggle_creating_function_t original, OptionsPane *options_pane, uint32_t group_id, std::string *name_ptr, Options_Option *option) { - // Modify - std::string name = *name_ptr; - std::string new_name = name; - if (name == "Fancy Graphics") { - option = &Options_Option_GRAPHICS; - } else if (name == "Soft shadows") { - option = &Options_Option_AMBIENT_OCCLUSION; - } else if (name == "Fancy Skies" || name == "Animated water") { - // These have no corresponding option, so disable the toggle. - return; - } else if (name == "Third person camera") { - // This isn't saved/loaded, so disable the toggle. - return; - } else if (name == "Lefty" || name == "Use touch screen" || name == "Split touch controls") { - // These toggles require touch support, so disable them. - return; - } else if (name == "Vibrate on destroy") { - // This toggle requires vibration support, so disable it. - return; - } else if (name == "Invert X-axis") { - // Fix Incorrect Name - new_name = "Invert Y-axis"; - } - - // Call Original Method - original(options_pane, group_id, &new_name, option); - - // Add 3D Anaglyph - if (option == &Options_Option_GRAPHICS) { - std::string cpp_string = "3D Anaglyph"; - original(options_pane, group_id, &cpp_string, &Options_Option_ANAGLYPH); - } - - // Add Peaceful Mode - if (option == &Options_Option_SERVER_VISIBLE) { - std::string cpp_string = "Peaceful mode"; - original(options_pane, group_id, &cpp_string, &Options_Option_DIFFICULTY); - } -} - -// Add Missing Options To Options::getBooleanValue -static bool Options_getBooleanValue_injection(Options_getBooleanValue_t original, Options *options, Options_Option *option) { - // Check - if (option == &Options_Option_GRAPHICS) { - return options->fancy_graphics; - } else if (option == &Options_Option_DIFFICULTY) { - return options->game_difficulty == 0; - } else { - // Call Original Method - return original(options, option); - } -} - -// Fix Difficulty When Toggling -static void OptionButton_toggle_Options_save_injection(Options *self) { - // Fix Value - if (self->game_difficulty == 1) { - // Disable Peaceful - self->game_difficulty = 2; - } else if (self->game_difficulty == 3) { - // Switch To Peaceful - self->game_difficulty = 0; - } - // Call Original Method - Options_save(self); -} - // Init void init_options() { // Force Mob Spawning @@ -277,30 +197,6 @@ void init_options() { // 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(OptionsPane_unknown_toggle_creating_function, OptionsPane_unknown_toggle_creating_function_injection); - - // Add Missing Options To Options::getBooleanValue - overwrite_calls(Options_getBooleanValue, Options_getBooleanValue_injection); - - // Fix Difficulty When Toggling - overwrite_call((void *) 0x1cd00, (void *) OptionButton_toggle_Options_save_injection); - } - // Actually Save options.txt overwrite_call((void *) 0x197fc, (void *) Options_save_Options_addOptionToSaveOutput_injection); // Fix options.txt Path @@ -347,4 +243,7 @@ void init_options() { patch((void *) 0x19414, nop_patch); patch((void *) 0x1941c, nop_patch); } + + // UI + _init_options_ui(); } diff --git a/mods/src/options/ui.cpp b/mods/src/options/ui.cpp new file mode 100644 index 0000000000..e2f281da32 --- /dev/null +++ b/mods/src/options/ui.cpp @@ -0,0 +1,118 @@ +#include + +#include +#include + +#include + +#include "options-internal.h" + +// 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) { + // Call Original Method + OptionButton *ret = OptionButton_constructor(option_button, option); + + // Setup Image + OptionButton_updateImage(option_button, stored_options); + + // Return + return ret; +} + +// Modify Option Toggles +static void OptionsPane_unknown_toggle_creating_function_injection(OptionsPane_unknown_toggle_creating_function_t original, OptionsPane *options_pane, uint32_t group_id, std::string *name_ptr, Options_Option *option) { + // Modify + std::string name = *name_ptr; + std::string new_name = name; + if (name == "Fancy Graphics") { + option = &Options_Option_GRAPHICS; + } else if (name == "Soft shadows") { + option = &Options_Option_AMBIENT_OCCLUSION; + } else if (name == "Fancy Skies" || name == "Animated water") { + // These have no corresponding option, so disable the toggle. + return; + } else if (name == "Third person camera") { + // This isn't saved/loaded, so disable the toggle. + return; + } else if (name == "Lefty" || name == "Use touch screen" || name == "Split touch controls") { + // These toggles require touch support, so disable them. + return; + } else if (name == "Vibrate on destroy") { + // This toggle requires vibration support, so disable it. + return; + } else if (name == "Invert X-axis") { + // Fix Incorrect Name + new_name = "Invert Y-axis"; + } + + // Call Original Method + original(options_pane, group_id, &new_name, option); + + // Add 3D Anaglyph + if (option == &Options_Option_GRAPHICS) { + std::string cpp_string = "3D Anaglyph"; + original(options_pane, group_id, &cpp_string, &Options_Option_ANAGLYPH); + } + + // Add Peaceful Mode + if (option == &Options_Option_SERVER_VISIBLE) { + std::string cpp_string = "Peaceful mode"; + original(options_pane, group_id, &cpp_string, &Options_Option_DIFFICULTY); + } +} + +// Add Missing Options To Options::getBooleanValue +static bool Options_getBooleanValue_injection(Options_getBooleanValue_t original, Options *options, Options_Option *option) { + // Check + if (option == &Options_Option_GRAPHICS) { + return options->fancy_graphics; + } else if (option == &Options_Option_DIFFICULTY) { + return options->game_difficulty == 0; + } else { + // Call Original Method + return original(options, option); + } +} + +// Fix Difficulty When Toggling +static void OptionButton_toggle_Options_save_injection(Options *self) { + // Fix Value + if (self->game_difficulty == 1) { + // Disable Peaceful + self->game_difficulty = 2; + } else if (self->game_difficulty == 3) { + // Switch To Peaceful + self->game_difficulty = 0; + } + // Call Original Method + Options_save(self); +} + +// Init +void _init_options_ui() { + // Fix Options Screen + 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); + + // "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(OptionsPane_unknown_toggle_creating_function, OptionsPane_unknown_toggle_creating_function_injection); + + // Add Missing Options To Options::getBooleanValue + overwrite_calls(Options_getBooleanValue, Options_getBooleanValue_injection); + + // Fix Difficulty When Toggling + overwrite_call((void *) 0x1cd00, (void *) OptionButton_toggle_Options_save_injection); + } +} \ No newline at end of file