diff --git a/src/core/backend/ScriptMgr.cpp b/src/core/backend/ScriptMgr.cpp index e663bf3b..4f940e83 100644 --- a/src/core/backend/ScriptMgr.cpp +++ b/src/core/backend/ScriptMgr.cpp @@ -79,4 +79,4 @@ namespace YimMenu std::lock_guard lock(m_Mutex); m_Scripts.push_back(std::move(script)); } -} \ No newline at end of file +} diff --git a/src/core/hooking/DetourHook.hpp b/src/core/hooking/DetourHook.hpp index 178875a5..fcccfa2d 100644 --- a/src/core/hooking/DetourHook.hpp +++ b/src/core/hooking/DetourHook.hpp @@ -50,7 +50,10 @@ namespace YimMenu template inline DetourHook::~DetourHook() { - DisableNow(); + if (m_OriginalFunc) + { + MH_RemoveHook(m_TargetFunc); + } } template diff --git a/src/core/hooking/Hooking.cpp b/src/core/hooking/Hooking.cpp index f1967fd5..f2d0a21c 100644 --- a/src/core/hooking/Hooking.cpp +++ b/src/core/hooking/Hooking.cpp @@ -79,7 +79,7 @@ namespace YimMenu { BaseHook::DisableAll(); m_MinHook.ApplyQueued(); - + for (auto it : BaseHook::Hooks()) { delete it; diff --git a/src/game/backend/AnticheatBypass.cpp b/src/game/backend/AnticheatBypass.cpp index c2267900..52b18caf 100644 --- a/src/game/backend/AnticheatBypass.cpp +++ b/src/game/backend/AnticheatBypass.cpp @@ -111,4 +111,4 @@ namespace YimMenu ScriptMgr::Yield(); } } -} \ No newline at end of file +} diff --git a/src/game/backend/NativeHooks.cpp b/src/game/backend/NativeHooks.cpp index b9944fe3..41545a44 100644 --- a/src/game/backend/NativeHooks.cpp +++ b/src/game/backend/NativeHooks.cpp @@ -131,4 +131,4 @@ namespace YimMenu for (auto& [_, program] : m_RegisteredPrograms) program->Cleanup(); } -} \ No newline at end of file +} diff --git a/src/game/features/settings/UnloadMenu.cpp b/src/game/features/settings/UnloadMenu.cpp new file mode 100644 index 00000000..d3aadf3a --- /dev/null +++ b/src/game/features/settings/UnloadMenu.cpp @@ -0,0 +1,19 @@ +#include "core/commands/Command.hpp" +#include "game/backend/Self.hpp" +#include "core/commands/Commands.hpp" + +namespace YimMenu::Features +{ + class UnloadMenu : public Command + { + using Command::Command; + + virtual void OnCall() override + { + Commands::Shutdown(); + g_Running = false; + } + }; + + static UnloadMenu _UnloadMenu{"unloadmenu", "Unload", "Unload YimMenuV2."}; +} \ No newline at end of file diff --git a/src/game/frontend/submenus/Settings.cpp b/src/game/frontend/submenus/Settings.cpp index 8121aa64..99e27a28 100644 --- a/src/game/frontend/submenus/Settings.cpp +++ b/src/game/frontend/submenus/Settings.cpp @@ -20,7 +20,7 @@ namespace YimMenu::Submenus ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); - + // this assumes we can't add new commands in runtime, but a lot of other subsystems assume that too static std::map sortedCommands; static bool commandsSorted = []() { @@ -101,6 +101,7 @@ namespace YimMenu::Submenus chat->AddItem(std::make_shared("clearchat"_J)); + gui->AddItem(std::make_shared("unloadmenu"_J)); game->AddItem(playerEsp); game->AddItem(pedEsp); game->AddItem(objectEsp); diff --git a/src/main.cpp b/src/main.cpp index b4b62659..29c81ff4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -95,14 +95,19 @@ namespace YimMenu } LOG(INFO) << "Unloading"; + + ScriptMgr::Destroy(); + NativeHooks::Destroy(); + FiberPool::Destroy(); - ScriptMgr::Destroy(); + Hooking::Destroy(); CallSiteHook::Destroy(); EARLY_UNLOAD: g_Running = false; + Renderer::Destroy(); LogHelper::Destroy();