From 962a4e750780d03a0f2146d9af05ec235a92c5ab Mon Sep 17 00:00:00 2001 From: kodenamekrak Date: Sun, 31 Mar 2024 13:11:44 +0100 Subject: [PATCH] Update to 1.35 --- .vscode/c_cpp_properties.json | 30 ++++----- .vscode/settings.json | 10 ++- CMakeLists.txt | 4 +- extern.cmake | 19 ------ include/main.hpp | 11 ++-- qpm.json | 42 +++++++++---- src/ColorManager.cpp | 99 ++++++++++++++++------------- src/SettingsViewController.cpp | 12 ++-- src/main.cpp | 111 +++++++++++++-------------------- 9 files changed, 164 insertions(+), 174 deletions(-) delete mode 100644 extern.cmake diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 2b385a2..f895b16 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -1,6 +1,6 @@ { "env": { - "ndkPath": "C:/android-ndk-r25c" + "ndkPath": "${ANDROID_NDK_HOME}" }, "configurations": [ { @@ -11,25 +11,25 @@ "__aarch64__" ], "includePath": [ + "${ndkPath}/toolchains/llvm/prebuilt/*/sysroot/usr/include/aarch64-linux-android", + "${ndkPath}/toolchains/llvm/prebuilt/*/sysroot/usr/include", + "${ndkPath}/toolchains/llvm/prebuilt/*/sysroot/usr/include/*", + "${ndkPath}/sources/cxx-stl/system/include", + "${workspaceFolder}/extern/includes/libil2cpp/il2cpp/libil2cpp", - "${workspaceFolder}/extern/includes/codegen/include", + "${workspaceFolder}/extern/includes/fmt/fmt/include", + "${workspaceFolder}/extern/includes/bs-cordl/include", "${workspaceFolder}/extern/includes", - "${workspaceFolder}/include", - "${workspaceFolder}/shared", - "${workspaceFolder}", - "${ndkPath}/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/aarch64-linux-android", - "${ndkPath}/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include", - "${ndkPath}/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/*", - "${ndkPath}/sources/cxx-stl/llvm-libc++abi/include", - "${ndkPath}/sources/cxx-stl/llvm-libc++/include", - "${ndkPath}/" + "${workspaceFolder}/include" ], - "compilerPath": "${ndkPath}/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe", + "compilerPath": "${ndkPath}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang", "name": "Quest", - "cStandard": "c11", "cppStandard": "c++20", - "intelliSenseMode": "${default}", - "configurationProvider": "ms-vscode.cmake-tools" + "intelliSenseMode": "linux-clang-x64", + "compilerArgs": [ + "-fdeclspec", + "-fms-extensions" + ] } ], "version": 4 diff --git a/.vscode/settings.json b/.vscode/settings.json index ce816bc..b686073 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "files.associations": { + "*.bsml": "xml", "iosfwd": "cpp", "__config": "cpp", "__nullptr": "cpp", @@ -112,6 +113,13 @@ "xstddef": "cpp", "xtr1common": "cpp", "xtree": "cpp", - "xutility": "cpp" + "xutility": "cpp", + "ranges": "cpp", + "*.tcc": "cpp" + }, + "cmake.configureOnOpen": true, + "editor.tokenColorCustomizations": { + "comments": "", + "textMateRules": [] } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index ad321fb..66340ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,7 @@ set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include) # compile options used -add_compile_options(-frtti -fexceptions) +add_compile_options(-frtti -fexceptions -fdeclspec -fvisibilty=hidden) add_compile_options(-O3) # compile definitions used add_compile_definitions(VERSION=\"${MOD_VERSION}\") @@ -52,8 +52,6 @@ target_include_directories(${COMPILE_ID} PRIVATE ${SOURCE_DIR}) target_include_directories(${COMPILE_ID} PRIVATE ${INCLUDE_DIR}) # add shared dir as include dir target_include_directories(${COMPILE_ID} PUBLIC ${SHARED_DIR}) -# codegen includes -target_include_directories(${COMPILE_ID} PRIVATE ${EXTERN_DIR}/includes/${CODEGEN_ID}/include) target_link_libraries(${COMPILE_ID} PRIVATE -llog) # add extern stuff like libs and other includes diff --git a/extern.cmake b/extern.cmake deleted file mode 100644 index a8edc12..0000000 --- a/extern.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# YOU SHOULD NOT MANUALLY EDIT THIS FILE, QPM WILL VOID ALL CHANGES -# always added -target_include_directories(${COMPILE_ID} PRIVATE ${EXTERN_DIR}/includes) -target_include_directories(${COMPILE_ID} SYSTEM PRIVATE ${EXTERN_DIR}/includes/libil2cpp/il2cpp/libil2cpp) - -# includes and compile options added by other libraries -target_include_directories(${COMPILE_ID} SYSTEM PRIVATE ${EXTERN_DIR}/includes/questui/shared/cppcodec) - -# libs dir -> stores .so or .a files (or symlinked!) -target_link_directories(${COMPILE_ID} PRIVATE ${EXTERN_DIR}/libs) -RECURSE_FILES(so_list ${EXTERN_DIR}/libs/*.so) -RECURSE_FILES(a_list ${EXTERN_DIR}/libs/*.a) - -# every .so or .a that needs to be linked, put here! -# I don't believe you need to specify if a lib is static or not, poggers! -target_link_libraries(${COMPILE_ID} PRIVATE - ${so_list} - ${a_list} -) diff --git a/include/main.hpp b/include/main.hpp index ba3f93c..805f3b6 100644 --- a/include/main.hpp +++ b/include/main.hpp @@ -1,15 +1,16 @@ #pragma once // Include the modloader header, which allows us to tell the modloader which mod this is, and the version etc. -#include "modloader/shared/modloader.hpp" +#include "scotland2/shared/modloader.h" // beatsaber-hook is a modding framework that lets us call functions and fetch field values from in the game // It also allows creating objects, configuration, and importantly, hooking methods to modify their values #include "beatsaber-hook/shared/utils/logging.hpp" -#include "beatsaber-hook/shared/config/config-utils.hpp" #include "beatsaber-hook/shared/utils/il2cpp-functions.hpp" #include "beatsaber-hook/shared/utils/hooking.hpp" -// Define these functions here so that we can easily read configuration and log information from other files -Configuration& getConfig(); -Logger& getLogger(); \ No newline at end of file +static constexpr auto Logger = Paper::ConstLoggerContext("QonsistentSaberColors"); + +#define INFO(message, ...) Logger.info(message, ## __VA_ARGS__) + +#define MOD_EXPORT extern "C" __attribute__((visibility("default"))) \ No newline at end of file diff --git a/qpm.json b/qpm.json index 61f217d..39599bd 100644 --- a/qpm.json +++ b/qpm.json @@ -1,41 +1,57 @@ { + "version": "0.1.0", "sharedDir": "shared", "dependenciesDir": "extern", "info": { "name": "QonsistentSaberColors", "id": "qonsistentsabercolors", - "version": "0.1.1", + "version": "0.2.0", "url": null, "additionalData": { - "overrideSoName": "libqonsistentsabercolors.so" + "overrideSoName": "libqonsistentsabercolors.so", + "cmake": true } }, + "workspace": { + "scripts": {} + }, "dependencies": [ + { + "id": "paper", + "versionRange": "^3.6.3", + "additionalData": {} + }, { "id": "beatsaber-hook", - "versionRange": "^3.14.0", + "versionRange": "^5.1.6", "additionalData": {} }, { - "id": "config-utils", - "versionRange": "^1.0.1", + "id": "bs-cordl", + "versionRange": "^3500.0.0", "additionalData": {} }, { - "id": "questui", - "versionRange": "^0.17.11", + "id": "custom-types", + "versionRange": "^0.17.6", "additionalData": {} }, { - "id": "codegen", - "versionRange": "^0.33.0", + "id": "scotland2", + "versionRange": "^0.1.4", + "additionalData": { + "includeQmod": false + } + }, + { + "id": "bsml", + "versionRange": "^0.4.19", "additionalData": {} }, { - "id": "custom-types", - "versionRange": "^0.15.23", + "id": "config-utils", + "versionRange": "^1.4.2", "additionalData": {} } - ], - "additionalData": {} + ] } \ No newline at end of file diff --git a/src/ColorManager.cpp b/src/ColorManager.cpp index 0bad4db..4f404c2 100644 --- a/src/ColorManager.cpp +++ b/src/ColorManager.cpp @@ -22,91 +22,100 @@ #include "VRUIControls/VRPointer.hpp" #include "UnityEngine/XR/XRNode.hpp" -VRUIControls::VRInputModule* inputModule; +using namespace UnityEngine; +using namespace VRUIControls; +using namespace GlobalNamespace; +UnityW inputModule; GlobalNamespace::ColorSchemesSettings* colorSchemesSettings; -const UnityEngine::Color defaultLeftColor {0.784314, 0.078431, 0.078431, 1.000000}; -const UnityEngine::Color defaultRightColor{0.156863, 0.556863, 0.823529, 1.000000}; -const UnityEngine::Color defaultLaserColor{0.125490f, 0.752941f, 1.000000f, 0.501961f}; +UnityEngine::Color defaultLeftColor {0.784314, 0.078431, 0.078431, 1.000000}; +UnityEngine::Color defaultRightColor{0.156863, 0.556863, 0.823529, 1.000000}; +UnityEngine::Color defaultLaserColor{0.125490f, 0.752941f, 1.000000f, 0.501961f}; namespace QonsistentSaberColors { - - UnityEngine::Color GetLeftColor() + + UnityEngine::Color get_LeftColor() + { + if(!colorSchemesSettings || (colorSchemesSettings->overrideDefaultColors && !getModConfig().Enabled.GetValue())) + return defaultLeftColor; + + return colorSchemesSettings->GetSelectedColorScheme()->saberAColor; + } + __declspec(property(get=get_LeftColor)) Color LeftColor; + + UnityEngine::Color get_RightColor() { - auto scheme = colorSchemesSettings->GetSelectedColorScheme(); - return (colorSchemesSettings->overrideDefaultColors && getModConfig().Enabled.GetValue()) ? colorSchemesSettings->GetSelectedColorScheme()->saberAColor : defaultLeftColor; + if(!colorSchemesSettings || (colorSchemesSettings->overrideDefaultColors && !getModConfig().Enabled.GetValue())) + return defaultRightColor; + + return colorSchemesSettings->GetSelectedColorScheme()->saberBColor; } + __declspec(property(get=get_RightColor)) Color RightColor; - UnityEngine::Color GetRightColor() + UnityEngine::Color get_LaserColor() { - auto scheme = colorSchemesSettings->GetSelectedColorScheme(); - return (colorSchemesSettings->overrideDefaultColors && getModConfig().Enabled.GetValue()) ? colorSchemesSettings->GetSelectedColorScheme()->saberBColor : defaultRightColor; + if(!inputModule || !getModConfig().Enabled.GetValue() || !getModConfig().ColoredLasers.GetValue()) + return defaultLaserColor; + + auto parent = inputModule->_vrPointer->_laserPointer->transform->parent->name; + return parent == "ControllerLeft" ? LeftColor : RightColor; } void UpdatePointers() { - getLogger().info("Updating pointers"); + INFO("Updating pointers"); - inputModule = UnityEngine::Resources::FindObjectsOfTypeAll()[0]; + inputModule = UnityEngine::Resources::FindObjectsOfTypeAll().front_or_default(); - colorSchemesSettings = UnityEngine::Resources::FindObjectsOfTypeAll()[0]->playerData->colorSchemesSettings; + auto playerDataModel = UnityEngine::Resources::FindObjectsOfTypeAll().front_or_default(); + if(!playerDataModel) { + colorSchemesSettings = nullptr; + } + colorSchemesSettings = playerDataModel->playerData->colorSchemesSettings; } void SetControllerColor(GlobalNamespace::VRController* controller, UnityEngine::Color color) { - auto glowColors = controller->GetComponentsInChildren(); - for(auto glow : glowColors) - { - auto glowColor = glow ->get_gameObject()->GetComponentInChildren(); - auto scheme = glow->colorManager->colorScheme; - controller->node == UnityEngine::XR::XRNode::LeftHand ? scheme->saberAColor = color : scheme->saberBColor = color; - glowColor->SetColors(); - } - - auto fakeGlowColors = controller->GetComponentsInChildren(); - for(auto fake : fakeGlowColors) - { - auto glowColor = fake->get_gameObject()->GetComponentInChildren(); - auto scheme = glowColor->colorManager->colorScheme; - controller->node == UnityEngine::XR::XRNode::LeftHand ? scheme->saberAColor = color : scheme->saberBColor = color; - glowColor->SetColors(); - } + auto glow = controller ->gameObject->GetComponentInChildren(); + auto scheme = glow->_colorManager->_colorScheme; + controller->node == UnityEngine::XR::XRNode::LeftHand ? scheme->_saberAColor = color : scheme->_saberBColor = color; + glow->SetColors(); + + auto fakeGlow = controller->gameObject->GetComponentInChildren(); + auto scheme2 = fakeGlow->_colorManager->_colorScheme; + controller->node == UnityEngine::XR::XRNode::LeftHand ? scheme2->_saberAColor = color : scheme2->_saberBColor = color; + fakeGlow->SetColors(); } void SetLaserColor(VRUIControls::VRLaserPointer* pointer, UnityEngine::Color color) { auto renderer = pointer->GetComponentInChildren(); auto matArray = renderer->GetMaterialArray(); - for(auto mat: matArray) + for(auto mat : matArray) { - mat->set_color(color); + mat->color = color; } } void UpdateControllerColors() { - if(!inputModule || !inputModule->m_CachedPtr.m_value) + if(!inputModule || !colorSchemesSettings) return; - SetControllerColor(inputModule->vrPointer->leftVRController, GetLeftColor()); - SetControllerColor(inputModule->vrPointer->rightVRController, GetRightColor()); + + SetControllerColor(inputModule->_vrPointer->_leftVRController, LeftColor); + SetControllerColor(inputModule->_vrPointer->_rightVRController, RightColor); } void UpdateLaserColor() { - if(!inputModule || !inputModule->m_CachedPtr.m_value) + if(!inputModule) return; UnityEngine::Color color; - if(getModConfig().ColoredLasers.GetValue() && getModConfig().Enabled.GetValue()) - { - auto parent = inputModule->vrPointer->laserPointer->get_transform()->get_parent()->get_name(); - color = parent == "ControllerLeft" ? GetLeftColor() : GetRightColor(); - } - else - color = defaultLaserColor; + color.a = 0; - SetLaserColor(inputModule->vrPointer->laserPointer, color); + SetLaserColor(inputModule->_vrPointer->_laserPointer, color); } } \ No newline at end of file diff --git a/src/SettingsViewController.cpp b/src/SettingsViewController.cpp index 7b6115f..a3d7b98 100644 --- a/src/SettingsViewController.cpp +++ b/src/SettingsViewController.cpp @@ -3,27 +3,31 @@ #include "ColorManager.hpp" #include "ModConfig.hpp" -#include "questui/shared/BeatSaberUI.hpp" +#include "bsml/shared/BSML-Lite.hpp" DEFINE_TYPE(QonsistentSaberColors, SettingsViewController) +int getf() { return 5; } +__declspec(property(get=getf)) int f; + void QonsistentSaberColors::SettingsViewController::DidActivate(bool firstActivation, bool addedToHierarchy, bool screenSystemEnabling) { if(!firstActivation) return; - auto transform = QuestUI::BeatSaberUI::CreateScrollableSettingsContainer(get_transform())->get_transform(); + auto container = BSML::Lite::CreateScrollableSettingsContainer(transform)->transform; - QuestUI::BeatSaberUI::CreateToggle(transform, "Enabled", getModConfig().Enabled.GetValue(), [](bool value) + BSML::Lite::CreateToggle(container, "Enabled", getModConfig().Enabled.GetValue(), [](bool value) { getModConfig().Enabled.SetValue(value); QonsistentSaberColors::UpdateControllerColors(); QonsistentSaberColors::UpdateLaserColor(); }); - QuestUI::BeatSaberUI::CreateToggle(transform, "Colored lasers", getModConfig().ColoredLasers.GetValue(), [](bool value) + BSML::Lite::CreateToggle(container, "Colored lasers", getModConfig().ColoredLasers.GetValue(), [](bool value) { getModConfig().ColoredLasers.SetValue(value); QonsistentSaberColors::UpdateLaserColor(); + StringW }); } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 5762ba4..69b9201 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,22 +9,14 @@ #include "VRUIControls/VRPointer.hpp" -#include "questui/shared/QuestUI.hpp" +#include "bsml/shared/BSML.hpp" -static ModInfo modInfo; +static modloader::ModInfo modInfo {MOD_ID, VERSION, 0}; using namespace QonsistentSaberColors; -MAKE_HOOK_MATCH(VRPointer_CreateLaserPointerAndLaserHit, &VRUIControls::VRPointer::CreateLaserPointerAndLaserHit, void, VRUIControls::VRPointer* self) +inline void UpdateColors() { - VRPointer_CreateLaserPointerAndLaserHit(self); - if(getModConfig().ColoredLasers.GetValue() && getModConfig().Enabled.GetValue()) - UpdateLaserColor(); -} - -MAKE_HOOK_MATCH(MainMenuViewController_DidActivate, &GlobalNamespace::MainMenuViewController::DidActivate, void, GlobalNamespace::MainMenuViewController* self, bool a, bool b, bool c) -{ - MainMenuViewController_DidActivate(self, a, b, c); if(getModConfig().Enabled.GetValue()) { UpdateControllerColors(); @@ -33,89 +25,70 @@ MAKE_HOOK_MATCH(MainMenuViewController_DidActivate, &GlobalNamespace::MainMenuVi } } +MAKE_HOOK_MATCH(VRPointer_CreateLaserPointerAndLaserHit, &VRUIControls::VRPointer::RefreshLaserPointerAndLaserHit, void, VRUIControls::VRPointer* self, UnityEngine::EventSystems::PointerEventData* pointerData) +{ + VRPointer_CreateLaserPointerAndLaserHit(self, pointerData); + if(getModConfig().Enabled.GetValue() && getModConfig().ColoredLasers.GetValue()) + UpdateLaserColor(); +} + +MAKE_HOOK_MATCH(MainMenuViewController_DidActivate, &GlobalNamespace::MainMenuViewController::DidActivate, void, GlobalNamespace::MainMenuViewController* self, bool a, bool b, bool c) +{ + MainMenuViewController_DidActivate(self, a, b, c); + UpdateColors(); +} + MAKE_HOOK_MATCH(ColorsOverrideSettingsPanelController_HandleOverrideColorsToggleValueChanged, &GlobalNamespace::ColorsOverrideSettingsPanelController::HandleOverrideColorsToggleValueChanged, void, GlobalNamespace::ColorsOverrideSettingsPanelController* self, bool isOn) { ColorsOverrideSettingsPanelController_HandleOverrideColorsToggleValueChanged(self, isOn); - if(getModConfig().Enabled.GetValue()) - { - UpdateControllerColors(); - if(getModConfig().ColoredLasers.GetValue()) - UpdateLaserColor(); - } + UpdateColors(); } MAKE_HOOK_MATCH(ColorsOverrideSettingsPanelController_HandleEditColorSchemeControllerDidChangeColorScheme, &GlobalNamespace::ColorsOverrideSettingsPanelController::HandleEditColorSchemeControllerDidChangeColorScheme, void, GlobalNamespace::ColorsOverrideSettingsPanelController* self, GlobalNamespace::ColorScheme* colorScheme) { ColorsOverrideSettingsPanelController_HandleEditColorSchemeControllerDidChangeColorScheme(self, colorScheme); - if(getModConfig().Enabled.GetValue()) - { - UpdateControllerColors(); - if(getModConfig().ColoredLasers.GetValue()) - UpdateLaserColor(); - } + UpdateColors(); } MAKE_HOOK_MATCH(ColorsOverrideSettingsPanelController_HandleDropDownDidSelectCellWithIdx, &GlobalNamespace::ColorsOverrideSettingsPanelController::HandleDropDownDidSelectCellWithIdx, void, GlobalNamespace::ColorsOverrideSettingsPanelController* self, HMUI::DropdownWithTableView* dropDownWithTableView, int idx) { ColorsOverrideSettingsPanelController_HandleDropDownDidSelectCellWithIdx(self, dropDownWithTableView, idx); - if(getModConfig().Enabled.GetValue()) - { - UpdateControllerColors(); - if(getModConfig().ColoredLasers.GetValue()) - UpdateLaserColor(); - } + UpdateColors(); } MAKE_HOOK_MATCH(MenuEnvironmentManager_ShowEnvironmentType, &GlobalNamespace::MenuEnvironmentManager::ShowEnvironmentType, void, GlobalNamespace::MenuEnvironmentManager* self, GlobalNamespace::MenuEnvironmentManager::MenuEnvironmentType type) { MenuEnvironmentManager_ShowEnvironmentType(self, type); - UpdatePointers(); if(type == GlobalNamespace::MenuEnvironmentManager::MenuEnvironmentType::None) return; - - if(getModConfig().Enabled.GetValue()) - { - UpdateControllerColors(); - if(getModConfig().ColoredLasers.GetValue()) - UpdateLaserColor(); - } + UpdatePointers(); + UpdateColors(); } -Configuration& getConfig() { - static Configuration config(modInfo); - return config; -} +// Called at the early stages of game loading +MOD_EXPORT void setup(CModInfo* info) { + *info = modInfo.to_c(); -Logger& getLogger() { - static Logger* logger = new Logger(modInfo); - return *logger; -} + getModConfig().Init(modInfo); -// Called at the early stages of game loading -extern "C" void setup(ModInfo& info) { - info.id = MOD_ID; - info.version = VERSION; - modInfo = info; - - getConfig().Load(); - getLogger().info("Completed setup!"); + INFO("Completed setup!"); } // Called later on in the game loading - a good time to install function hooks -extern "C" void load() { +MOD_EXPORT void load() { il2cpp_functions::Init(); - - getModConfig().Init(modInfo); - - QuestUI::Init(); - QuestUI::Register::RegisterAllModSettingsViewController(modInfo, "QonsistentSaberColors"); - - getLogger().info("Installing hooks..."); - INSTALL_HOOK(getLogger(), VRPointer_CreateLaserPointerAndLaserHit); - INSTALL_HOOK(getLogger(), MainMenuViewController_DidActivate); - INSTALL_HOOK(getLogger(), ColorsOverrideSettingsPanelController_HandleOverrideColorsToggleValueChanged); - INSTALL_HOOK(getLogger(), ColorsOverrideSettingsPanelController_HandleEditColorSchemeControllerDidChangeColorScheme); - INSTALL_HOOK(getLogger(), ColorsOverrideSettingsPanelController_HandleDropDownDidSelectCellWithIdx); - INSTALL_HOOK(getLogger(), MenuEnvironmentManager_ShowEnvironmentType); - getLogger().info("Installed all hooks!"); -} + #include "GlobalNamespace/BeatmapLevel.hpp" + + + BSML::Init(); + BSML::Register::RegisterMainMenu("QonsistentSaberColors", "QonsistentSaberColors", "QonsistentSaberColors mod settings"); + + INFO("Installing hooks..."); + INSTALL_HOOK(Logger, VRPointer_CreateLaserPointerAndLaserHit); + INSTALL_HOOK(Logger, MainMenuViewController_DidActivate); + INSTALL_HOOK(Logger, ColorsOverrideSettingsPanelController_HandleOverrideColorsToggleValueChanged); + INSTALL_HOOK(Logger, ColorsOverrideSettingsPanelController_HandleEditColorSchemeControllerDidChangeColorScheme); + INSTALL_HOOK(Logger, ColorsOverrideSettingsPanelController_HandleDropDownDidSelectCellWithIdx); + INSTALL_HOOK(Logger, MenuEnvironmentManager_ShowEnvironmentType); + INFO("Installed all hooks!"); +} \ No newline at end of file