From 31be8c1add4f9d2745c5d430546b4e0800b07ef9 Mon Sep 17 00:00:00 2001 From: Abdullah Arafat <62858251+kmaba@users.noreply.github.com> Date: Mon, 11 Dec 2023 22:51:15 +0800 Subject: [PATCH 001/240] Create build.yml --- .github/workflows/build.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..d73a06e2 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,26 @@ +name: Build Flarial + +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + build: + runs-on: windows-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Run build.bat + run: | + call .\build.bat + shell: cmd + + - name: Upload DLL + uses: actions/upload-artifact@v2 + with: + name: FlarialDLL + path: "Release/Flarial.dll" From b9da4a3e1efe48da839a44b5fbe664a4133b0772 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 18 Jul 2024 14:19:42 +0600 Subject: [PATCH 002/240] possible bug --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 23027095..7f878531 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -119,7 +119,6 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI if (!SwapchainHook::init) { if (Client::settings.getSettingByName("killdx")->value) { - ID3D12Device5 *d3d12device3; if (SUCCEEDED(pSwapChain->GetDevice(IID_PPV_ARGS(&d3d12device3)))) { @@ -129,8 +128,10 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI return funcOriginal(pSwapChain, syncInterval, flags); } + } if(SwapchainHook::queue == nullptr) { + Logger::debug("[SwapChain] Not a DX12 device, running dx11 procedures"); const D2D1_CREATION_PROPERTIES properties @@ -138,7 +139,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI D2D1_THREADING_MODE_MULTI_THREADED, D2D1_DEBUG_LEVEL_NONE, D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS - }; + }; IDXGISurface1 *eBackBuffer; pSwapChain->GetBuffer(0, IID_PPV_ARGS(&eBackBuffer)); @@ -154,8 +155,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI SwapchainHook::init = true; } - - } else { + else { ID3D12Device5 *device; From 711b372c42376c8052f7f5ae49b176ff1653af57 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sun, 21 Jul 2024 12:40:40 +0300 Subject: [PATCH 003/240] Update --- .../Module/Modules/Nick/NickListener.hpp | 18 ++++- .../Module/Modules/NoHurtCam/NoHurtCam.hpp | 21 +----- .../Modules/NoHurtCam/NoHurtCamListener.hpp | 69 +++++++++++++++++++ 3 files changed, 88 insertions(+), 20 deletions(-) create mode 100644 src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp diff --git a/src/Client/Module/Modules/Nick/NickListener.hpp b/src/Client/Module/Modules/Nick/NickListener.hpp index 61f43fca..d8e1832f 100644 --- a/src/Client/Module/Modules/Nick/NickListener.hpp +++ b/src/Client/Module/Modules/Nick/NickListener.hpp @@ -15,11 +15,25 @@ class NickListener : public Listener { public: static inline std::string backupOri; + void onRaknetTick(RaknetTickEvent &event) override { + if (module->isEnabled()) { + std::string serverIP = SDK::getServerIP(); + if(serverIP.find("cubecraft") != std::string::npos) { + if(!module->restricted) { + FlarialGUI::Notify("Can't use Nick on " + serverIP); // TODO: move restrictions to API + module->restricted = true; + } + } else { + module->restricted = false; + } + } + } + void onDrawText(DrawTextEvent &event) override { if (SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { if (original.empty()) original = SDK::clientInstance->getLocalPlayer()->playerName; - if (module->isEnabled()) { + if (module->isEnabled() && !module->restricted) { std::string localPlayerName = original; size_t pos = event.getText()->find(localPlayerName); if (pos != std::string::npos) { @@ -48,7 +62,7 @@ class NickListener : public Listener { if (!enabled) original2 = *SDK::clientInstance->getLocalPlayer()->getNametag(); } - if (enabled) { + if (enabled && !module->restricted) { std::string val = module->settings.getSettingByName("nick")->value; SDK::clientInstance->getLocalPlayer()->setNametag(&val); diff --git a/src/Client/Module/Modules/NoHurtCam/NoHurtCam.hpp b/src/Client/Module/Modules/NoHurtCam/NoHurtCam.hpp index cf868f3d..2b24c147 100644 --- a/src/Client/Module/Modules/NoHurtCam/NoHurtCam.hpp +++ b/src/Client/Module/Modules/NoHurtCam/NoHurtCam.hpp @@ -2,38 +2,23 @@ #include "../Module.hpp" #include "../../../Events/EventHandler.hpp" +#include "NoHurtCamListener.hpp" class NoHurtCam : public Module { public: - // 76 1C 66 0F 6E 00 | 40 F2 0F 11 03 8B 44 24 48 89 43 08 C6 43 0C 01 - // 8B 44 24 48 89 43 08 C6 patch to 8B 44 24 48 90 90 90 C6 - - // TODO: restrict on hive - - static inline uintptr_t sigOffset; - static inline std::vector originalCameraAngle; - static inline uint8_t newCameraAngle[3] = {0x90, 0x90, 0x90}; NoHurtCam() : Module("No Hurt Cam", "Disables hurt camera animation", IDR_REACH_PNG, "") { - - originalCameraAngle.resize(3); - - sigOffset = Memory::findSig(GET_SIG("CameraAssignAngle")) + 4; - - memcpy(originalCameraAngle.data(), (LPVOID) sigOffset, 3); - Module::setup(); - }; void onEnable() override { - Memory::patchBytes((LPVOID) sigOffset, newCameraAngle, 3); + EventHandler::registerListener(new NoHurtCamListener("NoHurtCam", this)); Module::onEnable(); } void onDisable() override { - Memory::patchBytes((LPVOID) sigOffset, originalCameraAngle.data(), 3); + EventHandler::unregisterListener("NoHurtCam"); Module::onDisable(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp b/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp new file mode 100644 index 00000000..0c54b685 --- /dev/null +++ b/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp @@ -0,0 +1,69 @@ +#pragma once + +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../../../../Utils/Logger/Logger.hpp" +#include "../Module.hpp" +#include "../../../../SDK/SDK.hpp" +#include + +class NoHurtCamListener : public Listener { + Module* module; + + // 76 1C 66 0F 6E 00 | 40 F2 0F 11 03 8B 44 24 48 89 43 08 C6 43 0C 01 + // 8B 44 24 48 89 43 08 C6 patch to 8B 44 24 48 90 90 90 C6 + + static inline bool patched = false; + + static inline uintptr_t sigOffset; + static inline std::vector originalCameraAngle; + static inline uint8_t newCameraAngle[3] = {0x90, 0x90, 0x90}; + +public: + + static void patch() { + if(patched) return; + patched = true; + Memory::patchBytes((LPVOID) sigOffset, newCameraAngle, 3); + } + + static void unpatch() { + if(!patched) return; + patched = false; + Memory::patchBytes((LPVOID) sigOffset, originalCameraAngle.data(), 3); + } + + void onRaknetTick(RaknetTickEvent &event) override { + if (module->isEnabled()) { + std::string serverIP = SDK::getServerIP(); + if (serverIP.find("hive") != std::string::npos) { + if (!module->restricted) { + FlarialGUI::Notify("Can't use No Hurt Cam on " + serverIP); // TODO: move restrictions to API + module->restricted = true; + } + } else { + module->restricted = false; + } + } + } + + void onTick(TickEvent &event) override { + if (module->isEnabled() && !module->restricted) { + patch(); + } else { + unpatch(); + } + } + + NoHurtCamListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + + originalCameraAngle.resize(3); + + sigOffset = Memory::findSig(GET_SIG("CameraAssignAngle")) + 4; + + memcpy(originalCameraAngle.data(), (LPVOID) sigOffset, 3); + } +}; \ No newline at end of file From 9044a581c072a17b138bb73625c1857c905f1611 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sun, 21 Jul 2024 14:38:51 +0300 Subject: [PATCH 004/240] Update 2 --- .../Module/Modules/Nick/NickListener.hpp | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Client/Module/Modules/Nick/NickListener.hpp b/src/Client/Module/Modules/Nick/NickListener.hpp index d8e1832f..295caeae 100644 --- a/src/Client/Module/Modules/Nick/NickListener.hpp +++ b/src/Client/Module/Modules/Nick/NickListener.hpp @@ -16,17 +16,17 @@ class NickListener : public Listener { static inline std::string backupOri; void onRaknetTick(RaknetTickEvent &event) override { - if (module->isEnabled()) { - std::string serverIP = SDK::getServerIP(); - if(serverIP.find("cubecraft") != std::string::npos) { - if(!module->restricted) { - FlarialGUI::Notify("Can't use Nick on " + serverIP); // TODO: move restrictions to API - module->restricted = true; - } - } else { - module->restricted = false; - } - } +// if (module->isEnabled()) { +// std::string serverIP = SDK::getServerIP(); +// if(serverIP.find("cubecraft") != std::string::npos) { +// if(!module->restricted) { +// FlarialGUI::Notify("Can't use Nick on " + serverIP); // TODO: move restrictions to API +// module->restricted = true; +// } +// } else { +// module->restricted = false; +// } +// } } void onDrawText(DrawTextEvent &event) override { @@ -39,7 +39,7 @@ class NickListener : public Listener { if (pos != std::string::npos) { std::string faketxt = *event.getText(); faketxt.replace(pos, localPlayerName.length(), - module->settings.getSettingByName("nick")->value); + "§o"+Utils::removeColorCodes(module->settings.getSettingByName("nick")->value)); *event.getText() = faketxt; } } @@ -64,7 +64,7 @@ class NickListener : public Listener { if (enabled && !module->restricted) { - std::string val = module->settings.getSettingByName("nick")->value; + std::string val = "§o"+Utils::removeColorCodes(module->settings.getSettingByName("nick")->value); SDK::clientInstance->getLocalPlayer()->setNametag(&val); SDK::clientInstance->getLocalPlayer()->playerName = val; From d3ca150f4bd302df79371e770fd1f8b1ffb7b054 Mon Sep 17 00:00:00 2001 From: St0neHunter Date: Sun, 21 Jul 2024 16:22:35 +0200 Subject: [PATCH 005/240] Added role avoiders + scroll function on settings tab --- src/Client/Module/Modules/AutoRQ/AutoRQ.hpp | 137 +++++++++++++++- .../Module/Modules/AutoRQ/AutoRQListener.hpp | 147 ++++++++++++++++++ 2 files changed, 283 insertions(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp b/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp index eff071ee..7f1a6a01 100644 --- a/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp +++ b/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp @@ -32,6 +32,20 @@ class AutoRQ : public Module { settings.addSetting("command", (std::string)""); if (settings.getSettingByName("solo") == nullptr) settings.addSetting("solo", false); + if (settings.getSettingByName("murderer") == nullptr) + settings.addSetting("murderer", false); + if (settings.getSettingByName("sheriff") == nullptr) + settings.addSetting("sheriff", false); + if (settings.getSettingByName("innocent") == nullptr) + settings.addSetting("innocent", false); + if (settings.getSettingByName("hider") == nullptr) + settings.addSetting("hider", false); + if (settings.getSettingByName("seeker") == nullptr) + settings.addSetting("seeker", false); + if (settings.getSettingByName("death") == nullptr) + settings.addSetting("death", false); + if (settings.getSettingByName("runner") == nullptr) + settings.addSetting("runner", false); if (settings.getSettingByName("AutoMapAvoider") == nullptr) settings.addSetting("AutoMapAvoider", false); if (settings.getSettingByName("text") == nullptr) @@ -45,6 +59,11 @@ class AutoRQ : public Module { const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); + FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(1.0f, "height")); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Solo mode", textWidth * 6.9f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), @@ -58,7 +77,122 @@ class AutoRQ : public Module { toggleY += Constraints::SpacingConstraint(0.35, textWidth); FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, - L"Avoid Maps (Hive). Input one or more maps using comma's.", textWidth * 6.9f, textHeight, + L"Re-Q when you get a specific role (Hive)", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, + L"Murder Mystery", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Murderer", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(3, toggleX, toggleY, this->settings.getSettingByName( + "murderer")->value)) + this->settings.getSettingByName("murderer")->value = !this->settings.getSettingByName( + "murderer")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Sheriff", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( + "sheriff")->value)) + this->settings.getSettingByName("sheriff")->value = !this->settings.getSettingByName( + "sheriff")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Innocent", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(6, toggleX, toggleY, this->settings.getSettingByName( + "innocent")->value)) + this->settings.getSettingByName("innocent")->value = !this->settings.getSettingByName( + "innocent")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, + L"Hide and Seek", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Hider", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(7, toggleX, toggleY, this->settings.getSettingByName( + "hider")->value)) + this->settings.getSettingByName("hider")->value = !this->settings.getSettingByName( + "hider")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Seeker", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(8, toggleX, toggleY, this->settings.getSettingByName( + "seeker")->value)) + this->settings.getSettingByName("seeker")->value = !this->settings.getSettingByName( + "seeker")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, + L"Deathrun", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Death", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(9, toggleX, toggleY, this->settings.getSettingByName( + "death")->value)) + this->settings.getSettingByName("death")->value = !this->settings.getSettingByName( + "death")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Runner", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(10, toggleX, toggleY, this->settings.getSettingByName( + "runner")->value)) + this->settings.getSettingByName("runner")->value = !this->settings.getSettingByName( + "runner")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY = Constraints::PercentageConstraint(0.10, "top"); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, + L"Avoid Maps (Hive). Input one or more maps\nusing comma's.", textWidth * 6.9f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), DWRITE_FONT_WEIGHT_NORMAL); @@ -72,6 +206,7 @@ class AutoRQ : public Module { Constraints::SpacingConstraint(0.60, textWidth), toggleY, ""); toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::UnsetScrollView(); } }; diff --git a/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp b/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp index 35c1e057..3f3ba970 100644 --- a/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp +++ b/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp @@ -86,6 +86,153 @@ class AutoRQListener : public Listener { } //std::cout << pkt->mName << std::endl; } } + if (id == MinecraftPacketIds::Text) { + if(module->settings.getSettingByName("murderer")->value){ + auto *pkt = reinterpret_cast(event.getPacket()); + + if (pkt->message == "§c§l» §r§c§lMurderer") { + triggered = true; + FlarialGUI::Notify("Found role Murderer"); + std::shared_ptr packet = SDK::createPacket(77); + auto* command_packet = reinterpret_cast(packet.get()); + + command_packet->command = "/connection"; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + + } //std::cout << pkt->mName << std::endl; + } + } + if (id == MinecraftPacketIds::Text) { + if(module->settings.getSettingByName("sheriff")->value){ + auto *pkt = reinterpret_cast(event.getPacket()); + + if (pkt->message == "§9§l» §r§9§lSheriff") { + triggered = true; + FlarialGUI::Notify("Found role Sheriff"); + std::shared_ptr packet = SDK::createPacket(77); + auto* command_packet = reinterpret_cast(packet.get()); + + command_packet->command = "/connection"; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + + } //std::cout << pkt->mName << std::endl; + } + } + if (id == MinecraftPacketIds::Text) { + if(module->settings.getSettingByName("innocent")->value){ + auto *pkt = reinterpret_cast(event.getPacket()); + + if (pkt->message == "§a§l» §r§a§lInnocent") { + triggered = true; + FlarialGUI::Notify("Found role Innocent"); + std::shared_ptr packet = SDK::createPacket(77); + auto* command_packet = reinterpret_cast(packet.get()); + + command_packet->command = "/connection"; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + + } //std::cout << pkt->mName << std::endl; + } + } + if (id == MinecraftPacketIds::Text) { + if(module->settings.getSettingByName("death")->value){ + auto *pkt = reinterpret_cast(event.getPacket()); + + if (pkt->message == "§d§l» §r§bYou are a §cDeath") { + triggered = true; + FlarialGUI::Notify("Found role Death"); + std::shared_ptr packet = SDK::createPacket(77); + auto* command_packet = reinterpret_cast(packet.get()); + + command_packet->command = "/connection"; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + + } //std::cout << pkt->mName << std::endl; + } + } + if (id == MinecraftPacketIds::Text) { + if(module->settings.getSettingByName("runner")->value){ + auto *pkt = reinterpret_cast(event.getPacket()); + + if (pkt->message == "§d§l» §r§bYou are a §aRunner") { + triggered = true; + FlarialGUI::Notify("Found role Runner"); + std::shared_ptr packet = SDK::createPacket(77); + auto* command_packet = reinterpret_cast(packet.get()); + + command_packet->command = "/connection"; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + + } //std::cout << pkt->mName << std::endl; + } + } + if (id == MinecraftPacketIds::Text) { + if(module->settings.getSettingByName("hider")->value){ + auto *pkt = reinterpret_cast(event.getPacket()); + + if (pkt->message == "§e§l» §rYou are a §eHIDER") { + triggered = true; + FlarialGUI::Notify("Found role Hider"); + std::shared_ptr packet = SDK::createPacket(77); + auto* command_packet = reinterpret_cast(packet.get()); + + command_packet->command = "/connection"; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + + } //std::cout << pkt->mName << std::endl; + } + } + if (id == MinecraftPacketIds::Text) { + if(module->settings.getSettingByName("seeker")->value){ + auto *pkt = reinterpret_cast(event.getPacket()); + + if (pkt->message == "§c§l» §rYou are a §cSEEKER") { + triggered = true; + FlarialGUI::Notify("Found role Seeker"); + std::shared_ptr packet = SDK::createPacket(77); + auto* command_packet = reinterpret_cast(packet.get()); + + command_packet->command = "/connection"; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + + } //std::cout << pkt->mName << std::endl; + } + } if (id == MinecraftPacketIds::Text) { if(module->settings.getSettingByName("AutoMapAvoider")->value){ auto *pkt = reinterpret_cast(event.getPacket()); From 94d717a8981a983a660bf5d803207c6b8f0d8323 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 24 Jul 2024 19:26:25 +0300 Subject: [PATCH 006/240] Some cleanup + new packet --- src/Client/Hook/Hooks/Game/PacketHooks.cpp | 23 ++++-- src/Client/Hook/Hooks/Game/PacketHooks.hpp | 8 +- .../Network/Packet/CommandRequestPacket.hpp | 4 +- .../Network/Packet/EntityEventPacket.hpp | 73 +++++++++++++++++++ .../Client/Network/Packet/PlaySoundPacket.hpp | 4 +- .../Client/Network/Packet/SetTitlePacket.hpp | 4 +- src/SDK/Client/Network/Packet/TextPacket.hpp | 4 +- 7 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 src/SDK/Client/Network/Packet/EntityEventPacket.hpp diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.cpp b/src/Client/Hook/Hooks/Game/PacketHooks.cpp index 87d05a35..8f2540e4 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.cpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.cpp @@ -11,7 +11,7 @@ void SendPacketHook::callback(LoopbackPacketSender *pSender, Packet *pPacket) { EventHandler::onPacketSend(event); if (!event.isCancelled()) { - sendPacketkOriginal(pSender, pPacket); + sendPacketOriginal(pSender, pPacket); } } @@ -46,7 +46,16 @@ SendPacketHook::receiveCallbackPlaySound(const float *a1, const float *networkId PacketEvent event(packet.get()); EventHandler::onPacketReceive(event); if (!event.isCancelled()) - receivePacketPlaySounOriginal(a1, networkIdentifier, netEventCallback, packet); + receivePacketPlaySoundOriginal(a1, networkIdentifier, netEventCallback, packet); +} + +void SendPacketHook::receiveCallbackEntityEvent(const float *a1, const float *networkIdentifier, + const float *netEventCallback, const std::shared_ptr &packet) { + PacketEvent event(packet.get()); + EventHandler::onPacketReceive(event); + if (!event.isCancelled()) + receivePacketEntityEventOriginal(a1, networkIdentifier, netEventCallback, packet); + } void SendPacketHook::enableHook() { @@ -69,7 +78,11 @@ void SendPacketHook::enableHook() { std::shared_ptr playSoundPacket = SDK::createPacket((int) MinecraftPacketIds::PlaySoundA); Memory::hookFunc((void *) playSoundPacket->packetHandler->vTable[1], (void*)receiveCallbackPlaySound, - (void **) &receivePacketPlaySounOriginal, "ReceivePacketHook"); + (void **) &receivePacketPlaySoundOriginal, "ReceivePacketHook"); - this->autoHook((void *) callback, (void **) &sendPacketkOriginal); -} + std::shared_ptr EntityEventPacket = SDK::createPacket((int) MinecraftPacketIds::ActorEvent); + Memory::hookFunc((void *) EntityEventPacket->packetHandler->vTable[1], (void*)receiveCallbackEntityEvent, + (void **) &receivePacketEntityEventOriginal, "ReceivePacketHook"); + + this->autoHook((void *) callback, (void **) &sendPacketOriginal); +} \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.hpp b/src/Client/Hook/Hooks/Game/PacketHooks.hpp index 973bea43..0ae07848 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.hpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.hpp @@ -19,6 +19,9 @@ class SendPacketHook : public Hook { static void receiveCallbackPlaySound(const float *a1, const float *networkIdentifier, const float *netEventCallback, const std::shared_ptr& packet); + static void receiveCallbackEntityEvent(const float *a1, const float *networkIdentifier, const float *netEventCallback, + const std::shared_ptr& packet); + public: typedef void(__thiscall *original)(LoopbackPacketSender *, Packet *); @@ -26,10 +29,11 @@ class SendPacketHook : public Hook { typedef void(__thiscall *receive)(const float *a1, const float *networkIdentifier, const float *netEventCallback, std::shared_ptr packet); - static inline original sendPacketkOriginal = nullptr; + static inline original sendPacketOriginal = nullptr; static inline receive receiveTextPacketOriginal = nullptr; static inline receive receiveSetTitlePacketOriginal = nullptr; - static inline receive receivePacketPlaySounOriginal = nullptr; + static inline receive receivePacketPlaySoundOriginal = nullptr; + static inline receive receivePacketEntityEventOriginal = nullptr; SendPacketHook() : Hook("sendPacket", GET_SIG("LoopbackPacketSender::sendPacket")) {} diff --git a/src/SDK/Client/Network/Packet/CommandRequestPacket.hpp b/src/SDK/Client/Network/Packet/CommandRequestPacket.hpp index d710e3cb..7c0f9ca0 100644 --- a/src/SDK/Client/Network/Packet/CommandRequestPacket.hpp +++ b/src/SDK/Client/Network/Packet/CommandRequestPacket.hpp @@ -34,10 +34,10 @@ class CommandOriginData { class CommandRequestPacket : public Packet { public: - CommandRequestPacket(); - std::string command; CommandOriginData origin; bool InternalSource; + + CommandRequestPacket() = default; }; diff --git a/src/SDK/Client/Network/Packet/EntityEventPacket.hpp b/src/SDK/Client/Network/Packet/EntityEventPacket.hpp new file mode 100644 index 00000000..450ac532 --- /dev/null +++ b/src/SDK/Client/Network/Packet/EntityEventPacket.hpp @@ -0,0 +1,73 @@ +#include +#include "Packet.hpp" + +enum class ActorEvent : unsigned char { + None = 0x0, + Jump = 0x1, + Hurt = 0x2, + Death = 0x3, + StartAttacking = 0x4, + StopAttacking = 0x5, + TamingFailed = 0x6, + TamingSucceeded = 0x7, + ShakeWetness = 0x8, + EatGrass = 0xA, + FishhookBubble = 0xB, + FishhookFishpos = 0xC, + FishhookHooktime = 0xD, + FishhookTease = 0xE, + SquidFleeing = 0xF, + ZombieConverting = 0x10, + PlayAmbient = 0x11, + SpawnAlive = 0x12, + StartOfferFlower = 0x13, + StopOfferFlower = 0x14, + LoveHearts = 0x15, + VillagerAngry = 0x16, + VillagerHappy = 0x17, + WitchHatMagic = 0x18, + FireworksExplode = 0x19, + InLoveHearts = 0x1A, + SilverfishMergeAnim = 0x1B, + GuardianAttackSound = 0x1C, + DrinkPotion = 0x1D, + ThrowPotion = 0x1E, + PrimeTntcart = 0x1F, + PrimeCreeper = 0x20, + AirSupply = 0x21, + AddPlayerLevels = 0x22, + GuardianMiningFatigue = 0x23, + AgentSwingArm = 0x24, + DragonStartDeathAnim = 0x25, + GroundDust = 0x26, + Shake = 0x27, + Feed = 0x39, + BabyEat = 0x3C, + InstantDeath = 0x3D, + NotifyTrade = 0x3E, + LeashDestroyed = 0x3F, + CaravanUpdated = 0x40, + TalismanActivate = 0x41, + UpdateStructureFeature = 0x42, + PlayerSpawnedMob = 0x43, + Puke = 0x44, + UpdateStackSize = 0x45, + StartSwimming = 0x46, + BalloonPop = 0x47, + TreasureHunt = 0x48, + SummonAgent = 0x49, + FinishedChargingCrossbow = 0x4A, + LandedOnGround = 0x4B, + ActorGrowUp = 0x4C, + VibrationDetected = 0x4D, + DrinkMilk = 0x4E, +}; + +class EntityEventPacket : public Packet { +public: + int64_t RuntimeID; + ActorEvent EventID; + int Data; + + EntityEventPacket() = default; +}; \ No newline at end of file diff --git a/src/SDK/Client/Network/Packet/PlaySoundPacket.hpp b/src/SDK/Client/Network/Packet/PlaySoundPacket.hpp index 806b1703..a8758703 100644 --- a/src/SDK/Client/Network/Packet/PlaySoundPacket.hpp +++ b/src/SDK/Client/Network/Packet/PlaySoundPacket.hpp @@ -11,10 +11,10 @@ class NetworkBlockPosition { class PlaySoundPacket : public ::Packet { public: - PlaySoundPacket(); - std::string mName; // this+0x30 Vec3 mPos; // this+0x50 float mVolume; // this+0x5C float mPitch; // this+0x60 + + PlaySoundPacket() = default; }; \ No newline at end of file diff --git a/src/SDK/Client/Network/Packet/SetTitlePacket.hpp b/src/SDK/Client/Network/Packet/SetTitlePacket.hpp index c482faae..9594f5ab 100644 --- a/src/SDK/Client/Network/Packet/SetTitlePacket.hpp +++ b/src/SDK/Client/Network/Packet/SetTitlePacket.hpp @@ -21,8 +21,6 @@ enum SetTitleType { class SetTitlePacket : public Packet { public: - SetTitlePacket(); - SetTitleType type; // 0x30 std::string text; // 0x50 float fadeInTime; // 0x70 @@ -31,4 +29,6 @@ class SetTitlePacket : public Packet { std::string xuid; std::string platformId; + + SetTitlePacket() = default; }; diff --git a/src/SDK/Client/Network/Packet/TextPacket.hpp b/src/SDK/Client/Network/Packet/TextPacket.hpp index ffac9958..4a648a55 100644 --- a/src/SDK/Client/Network/Packet/TextPacket.hpp +++ b/src/SDK/Client/Network/Packet/TextPacket.hpp @@ -21,8 +21,6 @@ enum class TextPacketType { class TextPacket : public Packet { public: - TextPacket(); - TextPacketType type; // 0x28 std::string name; // 0x30 @@ -32,4 +30,6 @@ class TextPacket : public Packet { std::string xuid; std::string platformId; + + TextPacket() = default; }; From a0c104dd80bfcb90b54aa27a41db46e2c1e04d41 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 24 Jul 2024 20:38:17 +0300 Subject: [PATCH 007/240] New component --- src/SDK/Client/Actor/Actor.cpp | 11 ++++++ src/SDK/Client/Actor/Actor.hpp | 3 ++ .../Actor/Components/RuntimeIDComponent.hpp | 6 +++ src/Utils/Memory/Game/Sig/SigInit.cpp | 38 +++++++++++++------ 4 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 src/SDK/Client/Actor/Components/RuntimeIDComponent.hpp diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index 711bb486..1cdda45e 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -1,6 +1,7 @@ #include "Actor.hpp" #include "Components/ActorGameTypeComponent.hpp" #include "Components/AABBShapeComponent.hpp" +#include "Components/RuntimeIDComponent.hpp" // TODO add comments to all components, replace their sigs with simpler ones ? marioCST: use entt's try_get func in EntityContext instead of using sigs, there are no simpler sigs @@ -151,6 +152,16 @@ ItemStack *Actor::getOffhandSlot() { } } +RuntimeIDComponent *Actor::getRuntimeIDComponent() { + static uintptr_t sig; + + if (sig == NULL) { + sig = Memory::findSig(GET_SIG("Actor::getRuntimeIDComponent")); + } + + return tryGet(sig); +} + V1_20_50::EntityContext *Actor::GetEntityContextV1_20_50() { return reinterpret_cast((uintptr_t)this + 0x8); } diff --git a/src/SDK/Client/Actor/Actor.hpp b/src/SDK/Client/Actor/Actor.hpp index e1fe81e0..3c003d6b 100644 --- a/src/SDK/Client/Actor/Actor.hpp +++ b/src/SDK/Client/Actor/Actor.hpp @@ -14,6 +14,7 @@ #include "EntityContext.hpp" #include "Components/ActorGameTypeComponent.hpp" #include "Components/AABBShapeComponent.hpp" +#include "Components/RuntimeIDComponent.hpp" enum ActorFlags { @@ -216,4 +217,6 @@ class Actor { AABBShapeComponent *getAABBShapeComponent(); StateVectorComponent *getStateVectorComponent(); + + RuntimeIDComponent *getRuntimeIDComponent(); }; diff --git a/src/SDK/Client/Actor/Components/RuntimeIDComponent.hpp b/src/SDK/Client/Actor/Components/RuntimeIDComponent.hpp new file mode 100644 index 00000000..60c9d9c6 --- /dev/null +++ b/src/SDK/Client/Actor/Components/RuntimeIDComponent.hpp @@ -0,0 +1,6 @@ +#pragma once +#include + +struct RuntimeIDComponent { + int64_t runtimeID; +}; diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 6c0a4ffe..6c9d6a7a 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -28,6 +28,8 @@ void SigInit::init2120() { // Reach display ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); + ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); + // Fog color ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); @@ -124,6 +126,8 @@ void SigInit::init2100() { // Reach display ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); + ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); + // Fog color ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); @@ -220,6 +224,8 @@ void SigInit::init2080() { // Reach display ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); + ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); + // Fog color ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); @@ -315,6 +321,8 @@ void SigInit::init2070() { // Reach display ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); + ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); + // Fog color ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); @@ -391,13 +399,13 @@ void SigInit::init2060() { Logger::debug("[Signatures] Loading sigs for 1.20.6X"); ADD_SIG("Keyboard::feed", "48 ?? ?? ?? 0F B6 ?? 4C ?? ?? ?? ?? ?? ?? 89 ?? ?? ?? 88"); - ADD_SIG("MouseDevice::feed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); + ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); - ADD_SIG("ScreenView::setupAndRender", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89 54 24 ? 4C 8B E9 48 89 4C 24"); + ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); @@ -412,6 +420,8 @@ void SigInit::init2060() { // Reach display ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); + ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); + // Fog color ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "41 0F 10 08 48 8B C2 0F"); @@ -486,14 +496,14 @@ void SigInit::init2060() { void SigInit::init2050() { Logger::debug("[Signatures] Loading sigs for 1.20.5X"); - ADD_SIG("Keyboard::feed", "48 ?? ?? ?? 0F B6 ?? 4C ?? ?? ?? ?? ?? ?? 89 ?? ?? ?? 88"); - ADD_SIG("MouseDevice::feed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); + ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); + ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B F9 4C 8D B1"); - ADD_SIG("ScreenView::setupAndRender", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89 54 24 ? 4C 8B E9 48 89 4C 24"); + ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); @@ -508,6 +518,8 @@ void SigInit::init2050() { // Reach display ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); + ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); + // Fog color ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "41 0F 10 08 48 8B C2 0F"); @@ -582,14 +594,14 @@ void SigInit::init2050() { void SigInit::init2040() { Logger::debug("[Signatures] Loading sigs for 1.20.4X"); - ADD_SIG("Keyboard::feed", "48 ?? ?? ?? 0F B6 ?? 4C ?? ?? ?? ?? ?? ?? 89 ?? ?? ?? 88"); - ADD_SIG("MouseDevice::feed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); + ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); + ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 55 57 41 56 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B F1 48 8D B1 ? ? ? ? 48 83 3E 00 0F 85 ? ? ? ? 48 8D 4C 24 ? E8 ? ? ? ? 48 3B F0 74 1A 48 8B 08 48 C7 00 ? ? ? ? 48 8B 16 48 89 0E"); - ADD_SIG("ScreenView::setupAndRender", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89 54 24 ? 4C 8B E9 48 89 4C 24"); + ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); ADD_SIG("Actor::getActorGameTypeComponent", "40 53 48 83 EC ? 48 8B DA BA DE AB CB AF"); @@ -604,6 +616,8 @@ void SigInit::init2040() { // Reach display ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); + ADD_SIG("Actor::getRuntimeIDComponent", "40 53 48 83 EC 20 48 8B DA BA 14 14 A1 3C"); + // Fog color ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "41 0F 10 08 48 8B C2 0F"); @@ -678,14 +692,14 @@ void SigInit::init2040() { void SigInit::init2030() { Logger::debug("[Signatures] Loading sigs for 1.20.3X"); - ADD_SIG("Keyboard::feed", "48 ?? ?? ?? 0F B6 ?? 4C ?? ?? ?? ?? ?? ?? 89 ?? ?? ?? 88"); - ADD_SIG("MouseDevice::feed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); + ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); + ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 55 57 41 56 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B F1 48 8D B1 ? ? ? ? 48 83 3E 00 0F 85 ? ? ? ? 48 8D 4C 24 ? E8 ? ? ? ? 48 3B F0 74 1A 48 8B 08 48 C7 00 ? ? ? ? 48 8B 16 48 89 0E"); - ADD_SIG("ScreenView::setupAndRender", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89 54 24 ? 4C 8B E9 48 89 4C 24"); + ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); ADD_SIG("Actor::getActorGameTypeComponent", "40 53 48 83 EC 20 48 8B DA BA DE AB CB AF"); @@ -700,6 +714,8 @@ void SigInit::init2030() { // Reach display ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); + ADD_SIG("Actor::getRuntimeIDComponent", "40 53 48 83 EC 20 48 8B DA BA 14 14 A1 3C"); + // Fog color ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "41 0F 10 08 48 8B C2 0F"); From 7115a557b03dc8e563c51c518cf398cf762d7c73 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 29 Jul 2024 21:56:37 +0600 Subject: [PATCH 008/240] API stuff -> Main --- main.cpp | 2 +- src/Utils/Utils.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main.cpp b/main.cpp index 320a8286..277dddcd 100644 --- a/main.cpp +++ b/main.cpp @@ -94,7 +94,7 @@ DWORD WINAPI init(HMODULE real) name = Utils::removeNonAlphanumeric(Utils::removeColorCodes(NickListener::original)); } // send thing - DownloadString(std::format("https://api.flarial.synthetix.host/heartbeat/{}/{}",Utils::removeColorCodes(name),ipToSend)); + std::cout << DownloadString(std::format("https://api.flarial.synthetix.host/heartbeat/{}/{}",Utils::removeColorCodes(name),ipToSend)) << std::endl; lastBeatTime = now; } diff --git a/src/Utils/Utils.cpp b/src/Utils/Utils.cpp index 2123805e..86eebb88 100644 --- a/src/Utils/Utils.cpp +++ b/src/Utils/Utils.cpp @@ -52,7 +52,7 @@ std::string Utils::removeNonAlphanumeric(const std::string &input) { std::string result; std::copy_if(input.begin(), input.end(), std::back_inserter(result), [](char c) { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == ' ' || - c == '-'; + c == '-' || c == NULL || c == '�'; }); return result; } From d8acf37a22aa024c2bf1fc95602ee1b9debf4dc5 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Wed, 31 Jul 2024 14:43:57 +0600 Subject: [PATCH 009/240] stuff --- main.cpp | 9 ++++++-- .../Hook/Hooks/Render/SwapchainHook.cpp | 22 +++++++++---------- src/Utils/Utils.cpp | 3 +-- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/main.cpp b/main.cpp index 277dddcd..d0b50877 100644 --- a/main.cpp +++ b/main.cpp @@ -71,7 +71,10 @@ DWORD WINAPI init(HMODULE real) std::cerr << "Invalid or missing 'lastbeat' for player: " << player.key() << std::endl; continue; } - ModuleManager::onlineUsers.push_back(Utils::removeNonAlphanumeric(player.key())); + + std::string name2 = Utils::removeNonAlphanumeric(player.key()); + name2 = replaceAll(name2, "�", ""); + ModuleManager::onlineUsers.push_back(name2); } catch (const std::exception& e) { std::cerr << "Error processing player: " << player.key() << " - " << e.what() << std::endl; continue; @@ -92,6 +95,8 @@ DWORD WINAPI init(HMODULE real) if(SDK::clientInstance->getLocalPlayer() != nullptr) if (module->isEnabled()) { name = Utils::removeNonAlphanumeric(Utils::removeColorCodes(NickListener::original)); + name = replaceAll(name, "�", ""); + } // send thing std::cout << DownloadString(std::format("https://api.flarial.synthetix.host/heartbeat/{}/{}",Utils::removeColorCodes(name),ipToSend)) << std::endl; @@ -157,7 +162,7 @@ BOOL APIENTRY DllMain(HMODULE instance, DWORD ul_reason_for_call, LPVOID lpReser } std::string DownloadString(std::string URL) { - HINTERNET interwebs = InternetOpenA("Samsung Smart Fridge", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL); + HINTERNET interwebs = InternetOpenA("holyshitplsdonthurtme", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL); HINTERNET urlFile; std::string rtn; if (interwebs) { diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 7f878531..8233bb60 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -93,6 +93,17 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI std::chrono::duration elapsed = std::chrono::high_resolution_clock::now() - start; MC::frames += 1; + if (Client::settings.getSettingByName("killdx")->value) { + ID3D12Device5 *d3d12device3; + + if (SUCCEEDED(pSwapChain->GetDevice(IID_PPV_ARGS(&d3d12device3)))) { + Logger::debug("[SwapChain] Removed d3d12 device"); + pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0); + d3d12device3->RemoveDevice(); + + return funcOriginal(pSwapChain, syncInterval, flags); + } + } if (elapsed.count() >= 0.5f) { // Calculate frame rate based on elapsed time @@ -118,17 +129,6 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI FlarialGUI::frameFactor = std::min(FlarialGUI::frameFactor, 1.0f); if (!SwapchainHook::init) { - if (Client::settings.getSettingByName("killdx")->value) { - ID3D12Device5 *d3d12device3; - - if (SUCCEEDED(pSwapChain->GetDevice(IID_PPV_ARGS(&d3d12device3)))) { - Logger::debug("[SwapChain] Removed d3d12 device"); - pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0); - d3d12device3->RemoveDevice(); - - return funcOriginal(pSwapChain, syncInterval, flags); - } - } if(SwapchainHook::queue == nullptr) { diff --git a/src/Utils/Utils.cpp b/src/Utils/Utils.cpp index 86eebb88..d782227b 100644 --- a/src/Utils/Utils.cpp +++ b/src/Utils/Utils.cpp @@ -51,8 +51,7 @@ std::string Utils::removeColorCodes(const std::string &input) { std::string Utils::removeNonAlphanumeric(const std::string &input) { std::string result; std::copy_if(input.begin(), input.end(), std::back_inserter(result), [](char c) { - return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == ' ' || - c == '-' || c == NULL || c == '�'; + return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == ' '; }); return result; } From 098801ac70458997e4b93e8e87bc244f342b5bc0 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Wed, 31 Jul 2024 14:47:25 +0600 Subject: [PATCH 010/240] i forgor --- main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index d0b50877..33f34ddb 100644 --- a/main.cpp +++ b/main.cpp @@ -162,7 +162,7 @@ BOOL APIENTRY DllMain(HMODULE instance, DWORD ul_reason_for_call, LPVOID lpReser } std::string DownloadString(std::string URL) { - HINTERNET interwebs = InternetOpenA("holyshitplsdonthurtme", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL); + HINTERNET interwebs = InternetOpenA("Samsung Smart Fridge", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL); HINTERNET urlFile; std::string rtn; if (interwebs) { From 9cdfce3bb44db99f5111ae53c82ab4f0d4e1e8e7 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Wed, 31 Jul 2024 20:55:03 +0600 Subject: [PATCH 011/240] somehow should fix? --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 8233bb60..2cbdfd0f 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -94,6 +94,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI MC::frames += 1; if (Client::settings.getSettingByName("killdx")->value) { + SwapchainHook::queue = nullptr; ID3D12Device5 *d3d12device3; if (SUCCEEDED(pSwapChain->GetDevice(IID_PPV_ARGS(&d3d12device3)))) { @@ -154,8 +155,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI Memory::SafeRelease(eBackBuffer); SwapchainHook::init = true; - } - else { + } else { ID3D12Device5 *device; From c6b7fada1dde55f07a7ee771844a0412e88769c1 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 1 Aug 2024 18:29:50 +0600 Subject: [PATCH 012/240] Update main.cpp --- main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index 33f34ddb..9c74e4f8 100644 --- a/main.cpp +++ b/main.cpp @@ -47,8 +47,10 @@ DWORD WINAPI init(HMODULE real) if(SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { if(elapsed >= std::chrono::seconds(60)) { - ModuleManager::onlineUsers.clear(); std::string name = SDK::clientInstance->getLocalPlayer()->playerName; + + /* + ModuleManager::onlineUsers.clear(); ModuleManager::onlineUsers.push_back(Utils::removeColorCodes(name)); std::string pp = DownloadString("https://api.flarial.synthetix.host/users"); @@ -80,6 +82,7 @@ DWORD WINAPI init(HMODULE real) continue; } } + */ std::string ipToSend = SDK::getServerIP(); From 6165a31e9e4b55b9a123af450f03854a480f7e5d Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 16:11:46 +0300 Subject: [PATCH 013/240] Compact way to store sigs/offsets --- src/Utils/Memory/Game/Offset/OffsetInit.cpp | 645 ++----------------- src/Utils/Memory/Game/Sig/SigInit.cpp | 676 ++------------------ src/Utils/Versions/VersionUtils.cpp | 69 +- src/Utils/Versions/VersionUtils.hpp | 2 +- 4 files changed, 135 insertions(+), 1257 deletions(-) diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index ab79c00e..ec524390 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -6,116 +6,20 @@ void OffsetInit::init2100() { Logger::debug("[Offsets] Loading offsets for 1.21.0X"); - // Keystrokes - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); - - // Hitboxes and other +/- 1 - ADD_OFFSET("Actor::getActorFlag", 0); ADD_OFFSET("Actor::isAlive", 50); ADD_OFFSET("Actor::isValidTarget", 56); - // Armour HUD, Inventory HUD ADD_OFFSET("Inventory::getItem", 7); - ADD_OFFSET("ClientInstance::getBlockSource", 28); - ADD_OFFSET("ClientInstance::getLocalPlayer", 29); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("Packet::getId", 1); - - ADD_OFFSET("Actor::hurtTime", 0x20C); // ?hurtEffects@Mob@@UEAAXAEBVActorDamageSource@@M_N1@Z Mob::hurtEffects 2nd after Actor::getHealth(void) + ADD_OFFSET("Actor::hurtTime", 0x20C); ADD_OFFSET("Actor::level", 0x250); ADD_OFFSET("Actor::categories", 0x288); - ADD_OFFSET("Actor::baseTickVft", 26); - - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); ADD_OFFSET("Player::playerInventory", 0x760); ADD_OFFSET("Player::playerName", 0x1D30); ADD_OFFSET("Player::gamemode", 0xEC8); - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x10); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0xC8); - ADD_OFFSET("ClientInstance::guiData", 0x558); - ADD_OFFSET("ClientInstance::viewMatrix", 0x330); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F0); - ADD_OFFSET("ClientInstance::getFovY", 0x704); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Minecraft::timer", 0xD8); - - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); - - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); - - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); - - ADD_OFFSET("ItemStack::tag", 0x10); - ADD_OFFSET("ItemStack::count", 0x22); - - ADD_OFFSET("Biome::temparature", 0x38); - - ADD_OFFSET("Dimension::weather", 0x1B0); - ADD_OFFSET("Weather::lightingLevel", 0x48); - ADD_OFFSET("Weather::rainLevel", 0x3C); - - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5FC); - - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); - - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x80); - - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); - - ADD_OFFSET("RaknetConnector::JoinedIp", 0x458); - ADD_OFFSET("RaknetConnector::getPeer", 0x298); - ADD_OFFSET("RakPeer::GetAveragePing", 44); - - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); - - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); - - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); - - ADD_OFFSET("ScreenView::VisualTree", 0x48); - - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); - - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); - - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); - - ADD_OFFSET("VisualTree::root", 0x8); ADD_OFFSET("Level::hitResult", 0xB38); ADD_OFFSET("Level::getPlayerMap", 0x1BC8); @@ -124,352 +28,73 @@ void OffsetInit::init2100() { void OffsetInit::init2080() { Logger::debug("[Offsets] Loading offsets for 1.20.8X"); - // Keystrokes - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); - - // Hitboxes and other +/- 1 - ADD_OFFSET("Actor::getActorFlag", 0); ADD_OFFSET("Actor::isAlive", 51); ADD_OFFSET("Actor::isValidTarget", 57); - - // Armour HUD, Inventory HUD - ADD_OFFSET("Inventory::getItem", 5); - - ADD_OFFSET("ClientInstance::getBlockSource", 28); - ADD_OFFSET("ClientInstance::getLocalPlayer", 29); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("Packet::getId", 1); - - ADD_OFFSET("Actor::hurtTime", 0x214); // ?hurtEffects@Mob@@UEAAXAEBVActorDamageSource@@M_N1@Z Mob::hurtEffects 2nd after Actor::getHealth(void) - ADD_OFFSET("Actor::level", 0x258); - ADD_OFFSET("Actor::categories", 0x290); ADD_OFFSET("Actor::baseTickVft", 26); - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); - - ADD_OFFSET("Player::playerInventory", 0x788); + ADD_OFFSET("Player::playerInventory", 0x788); ADD_OFFSET("Player::playerName", 0x1D18); ADD_OFFSET("Player::gamemode", 0xEB0); - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x10); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0xC8); - ADD_OFFSET("ClientInstance::guiData", 0x558); - ADD_OFFSET("ClientInstance::viewMatrix", 0x330); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F0); - ADD_OFFSET("ClientInstance::getFovY", 0x704); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Minecraft::timer", 0xD8); - - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); - - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); - - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); - - ADD_OFFSET("ItemStack::tag", 0x10); - ADD_OFFSET("ItemStack::count", 0x22); - ADD_OFFSET("Biome::temparature", 0x38); - ADD_OFFSET("Dimension::weather", 0x1B0); - - ADD_OFFSET("Weather::lightingLevel", 0x44); ADD_OFFSET("Weather::rainLevel", 0x3C); - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5FC); - - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); - - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x80); - - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); - - ADD_OFFSET("RaknetConnector::JoinedIp", 0x458); - ADD_OFFSET("RaknetConnector::getPeer", 0x298); - ADD_OFFSET("RakPeer::GetAveragePing", 44); - - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); - - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); - - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); - - ADD_OFFSET("ScreenView::VisualTree", 0x48); - - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); - - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); - - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); - - ADD_OFFSET("VisualTree::root", 0x8); - - ADD_OFFSET("Level::hitResult", 0xB30); - ADD_OFFSET("Level::getPlayerMap", 0x1C88); -} - -void OffsetInit::init2070() { - Logger::debug("[Offsets] Loading offsets for 1.20.7X"); - - // Keystrokes - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); - - // Hitboxes and other - ADD_OFFSET("Actor::getActorFlag", 0); - ADD_OFFSET("Actor::isAlive", 53); - ADD_OFFSET("Actor::isValidTarget", 61); - - // Armour HUD, Inventory HUD - ADD_OFFSET("Inventory::getItem", 5); - - ADD_OFFSET("ClientInstance::getBlockSource", 28); - ADD_OFFSET("ClientInstance::getLocalPlayer", 29); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("Packet::getId", 1); - - ADD_OFFSET("Actor::hurtTime", 0x214); // ?hurtEffects@Mob@@UEAAXAEBVActorDamageSource@@M_N1@Z Mob::hurtEffects 2nd after Actor::getHealth(void) - ADD_OFFSET("Actor::level", 0x258); - ADD_OFFSET("Actor::categories", 0x290); - ADD_OFFSET("Actor::baseTickVft", 29); - - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); - - ADD_OFFSET("Player::playerInventory", 0x7B0); - ADD_OFFSET("Player::playerName", 0x1D70); - ADD_OFFSET("Player::gamemode", 0xED8); - - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x010); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0xC8); - ADD_OFFSET("ClientInstance::guiData", 0x558); - ADD_OFFSET("ClientInstance::viewMatrix", 0x330); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F0); - ADD_OFFSET("ClientInstance::getFovY", 0x704); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Minecraft::timer", 0xD8); - - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); - - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); - - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); - - ADD_OFFSET("ItemStack::tag", 0x10); - ADD_OFFSET("ItemStack::count", 0x22); - - ADD_OFFSET("Biome::temparature", 0x40); - - ADD_OFFSET("Dimension::weather", 0x1B0); - - ADD_OFFSET("Weather::lightingLevel", 0x44); - ADD_OFFSET("Weather::rainLevel", 0x38); - - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5FC); - - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); - - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x80); - - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); - - ADD_OFFSET("RaknetConnector::JoinedIp", 0x438); - ADD_OFFSET("RaknetConnector::getPeer", 0x278); - ADD_OFFSET("RakPeer::GetAveragePing", 44); - - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); - - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); - - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); - - ADD_OFFSET("ScreenView::VisualTree", 0x48); - - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); - - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); - - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); - - ADD_OFFSET("VisualTree::root", 0x8); - - ADD_OFFSET("Level::hitResult", 0xB18); - ADD_OFFSET("Level::getPlayerMap", 0x1E98); -} - -void OffsetInit::init2060() { - Logger::debug("[Offsets] Loading offsets for 1.20.6X"); - - // Keystrokes - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); - - // Hitboxes and other - ADD_OFFSET("Actor::getActorFlag", 0); - ADD_OFFSET("Actor::isAlive", 54); - ADD_OFFSET("Actor::isValidTarget", 62); - - // Armour HUD, Inventory HUD - ADD_OFFSET("Inventory::getItem", 5); - - ADD_OFFSET("ClientInstance::getBlockSource", 27); - ADD_OFFSET("ClientInstance::getLocalPlayer", 28); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("Packet::getId", 1); - - ADD_OFFSET("Actor::hurtTime", 0x234); - ADD_OFFSET("Actor::level", 0x290); - ADD_OFFSET("Actor::categories", 0x2C8); - ADD_OFFSET("Actor::baseTickVft", 30); - - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); - - ADD_OFFSET("Player::playerInventory", 0x7F0); - ADD_OFFSET("Player::playerName", 0x1D40); - ADD_OFFSET("Player::gamemode", 0xF18); - - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x010); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0x0C8); - ADD_OFFSET("ClientInstance::guiData", 0x558); - ADD_OFFSET("ClientInstance::viewMatrix", 0x0330); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F0); - ADD_OFFSET("ClientInstance::getFovY", 0x704); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Minecraft::timer", 0xD8); - - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); - - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); + ADD_OFFSET("RaknetConnector::JoinedIp", 0x458); + ADD_OFFSET("RaknetConnector::getPeer", 0x298); - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); + ADD_OFFSET("Level::hitResult", 0xB30); + ADD_OFFSET("Level::getPlayerMap", 0x1C88); +} - ADD_OFFSET("ItemStack::tag", 0x10); - ADD_OFFSET("ItemStack::count", 0x22); +void OffsetInit::init2070() { + Logger::debug("[Offsets] Loading offsets for 1.20.7X"); - ADD_OFFSET("Biome::temparature", 0x40); + ADD_OFFSET("Actor::isAlive", 53); + ADD_OFFSET("Actor::isValidTarget", 61); - ADD_OFFSET("Dimension::weather", 0x1A8); + ADD_OFFSET("ClientInstance::getBlockSource", 28); + ADD_OFFSET("ClientInstance::getLocalPlayer", 29); - ADD_OFFSET("Weather::lightingLevel", 0x44); - ADD_OFFSET("Weather::rainLevel", 0x38); + ADD_OFFSET("Actor::hurtTime", 0x214); + ADD_OFFSET("Actor::level", 0x258); + ADD_OFFSET("Actor::categories", 0x290); - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5E4); + ADD_OFFSET("Actor::baseTickVft", 29); - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); + ADD_OFFSET("Player::playerInventory", 0x7B0); + ADD_OFFSET("Player::playerName", 0x1D70); + ADD_OFFSET("Player::gamemode", 0xED8); - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x80); + ADD_OFFSET("Dimension::weather", 0x1B0); - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); + ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5FC); - ADD_OFFSET("RaknetConnector::JoinedIp", 0x438); - ADD_OFFSET("RaknetConnector::getPeer", 0x278); - ADD_OFFSET("RakPeer::GetAveragePing", 44); + ADD_OFFSET("Level::hitResult", 0xB18); - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); +} - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); +void OffsetInit::init2060() { + Logger::debug("[Offsets] Loading offsets for 1.20.6X"); - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); + ADD_OFFSET("Actor::isAlive", 54); + ADD_OFFSET("Actor::isValidTarget", 62); - ADD_OFFSET("ScreenView::VisualTree", 0x48); + ADD_OFFSET("Actor::hurtTime", 0x234); + ADD_OFFSET("Actor::level", 0x290); + ADD_OFFSET("Actor::categories", 0x2C8); - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); + ADD_OFFSET("Player::playerInventory", 0x7F0); + ADD_OFFSET("Player::playerName", 0x1D40); + ADD_OFFSET("Player::gamemode", 0xF18); - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); + ADD_OFFSET("ClientInstance::guiData", 0x558); + ADD_OFFSET("ClientInstance::getFovX", 0x6F0); + ADD_OFFSET("ClientInstance::getFovY", 0x704); - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); + ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); - ADD_OFFSET("VisualTree::root", 0x8); + ADD_OFFSET("RakPeer::GetAveragePing", 44); ADD_OFFSET("Level::hitResult", 0xA98); ADD_OFFSET("Level::getPlayerMap", 0x1E98); @@ -478,234 +103,48 @@ void OffsetInit::init2060() { void OffsetInit::init2050() { Logger::debug("[Offsets] Loading offsets for 1.20.5X"); - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); - - // Hitboxes and other - ADD_OFFSET("Actor::getActorFlag", 0); ADD_OFFSET("Actor::isAlive", 57); ADD_OFFSET("Actor::isValidTarget", 65); - // Armour HUD, Inventory HUD - ADD_OFFSET("Inventory::getItem", 5); - ADD_OFFSET("ClientInstance::getBlockSource", 27); ADD_OFFSET("ClientInstance::getLocalPlayer", 28); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F8); - ADD_OFFSET("ClientInstance::getFovY", 0x70C); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Packet::getId", 1); ADD_OFFSET("Actor::hurtTime", 0x22C); ADD_OFFSET("Actor::level", 0x288); ADD_OFFSET("Actor::categories", 0x2C0); - ADD_OFFSET("Actor::baseTickVft", 30); - - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); ADD_OFFSET("Player::playerInventory", 0x7E8); ADD_OFFSET("Player::playerName", 0x1D28); ADD_OFFSET("Player::gamemode", 0xF10); - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x010); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0x0C8); - ADD_OFFSET("ClientInstance::guiData", 0x560); - ADD_OFFSET("ClientInstance::viewMatrix", 0x0330); - - ADD_OFFSET("Minecraft::timer", 0xD8); - - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x190); - - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); - - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); - - ADD_OFFSET("ItemStack::tag", 0x10); ADD_OFFSET("ItemStack::count", 0x22); - ADD_OFFSET("Biome::temparature", 0x40); - - ADD_OFFSET("Dimension::weather", 0x1A8); - ADD_OFFSET("Weather::lightingLevel", 0x44); ADD_OFFSET("Weather::rainLevel", 0x38); - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5E4); - - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x80); - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); - - ADD_OFFSET("RaknetConnector::JoinedIp", 0x438); - ADD_OFFSET("RaknetConnector::getPeer", 0x278); - ADD_OFFSET("RakPeer::GetAveragePing", 42); - - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); - - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); - - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); - - ADD_OFFSET("ScreenView::VisualTree", 0x48); - - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); - - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); - - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); - - ADD_OFFSET("VisualTree::root", 0x8); - ADD_OFFSET("Level::hitResult", 0xA48); ADD_OFFSET("Level::getPlayerMap", 0x1EA8); } void OffsetInit::init2040() { // getGamma, combo & - Logger::debug("[Offsets] Loading offsets for 1.20.4X"); // quite some offsets are wrong - - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); + Logger::debug("[Offsets] Loading offsets for 1.20.4X"); - // Hitboxes and other - ADD_OFFSET("Actor::getActorFlag", 0); ADD_OFFSET("Actor::isAlive", 58); ADD_OFFSET("Actor::isValidTarget", 66); - - // Armour HUD, Inventory HUD - ADD_OFFSET("Inventory::getItem", 5); - - ADD_OFFSET("ClientInstance::getBlockSource", 26); - ADD_OFFSET("ClientInstance::getLocalPlayer", 27); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F8); - ADD_OFFSET("ClientInstance::getFovY", 0x70C); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Packet::getId", 1); - ADD_OFFSET("Actor::hurtTime", 0x204); - ADD_OFFSET("Actor::level", 0x260); - ADD_OFFSET("Actor::categories", 0x298); ADD_OFFSET("Actor::baseTickVft", 30); - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); - - ADD_OFFSET("Player::playerInventory", 0x7C0); ADD_OFFSET("Player::playerName", 0x1CB8); ADD_OFFSET("Player::gamemode", 0xEB0); - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x10); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0xC8); - ADD_OFFSET("ClientInstance::guiData", 0x560); - ADD_OFFSET("ClientInstance::viewMatrix", 0x330); - - ADD_OFFSET("Minecraft::timer", 0xD8); - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x190); - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); - - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); - - ADD_OFFSET("ItemStack::tag", 0x10); - ADD_OFFSET("ItemStack::count", 0x20); - - ADD_OFFSET("Biome::temparature", 0x40); - - ADD_OFFSET("Dimension::weather", 0x1A8); - - ADD_OFFSET("Weather::lightingLevel", 0x48); + ADD_OFFSET("Weather::lightingLevel", 0x48); ADD_OFFSET("Weather::rainLevel", 0x3C); - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5E4); - - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); - - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x60); - - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); - - ADD_OFFSET("RaknetConnector::JoinedIp", 0x438); - ADD_OFFSET("RaknetConnector::getPeer", 0x278); - ADD_OFFSET("RakPeer::GetAveragePing", 42); - - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); - - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); - - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); - - ADD_OFFSET("ScreenView::VisualTree", 0x48); - - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); - - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); - - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); - - ADD_OFFSET("VisualTree::root", 0x8); - ADD_OFFSET("Level::hitResult", 0xA68); ADD_OFFSET("Level::getPlayerMap", 0x25F0); } @@ -739,7 +178,7 @@ void OffsetInit::init2030() { ADD_OFFSET("Packet::getId", 1); - ADD_OFFSET("Actor::hurtTime", 0x22C); + ADD_OFFSET("Actor::hurtTime", 0x22C); // ?hurtEffects@Mob@@UEAAXAEBVActorDamageSource@@M_N1@Z Mob::hurtEffects 2nd after Actor::getHealth(void) ADD_OFFSET("Actor::level", 0x260); ADD_OFFSET("Actor::categories", 0x298); ADD_OFFSET("Actor::baseTickVft", 44); diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 6c9d6a7a..0e935460 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -6,692 +6,101 @@ void SigInit::init2120() { Logger::debug("[Signatures] Loading sigs for 1.21.2X"); - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8D ? ? ? ? E8"); - - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); // wrong - - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); // wrong - - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC ? 45 33 C0 48 8B D9 81 FA"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "? ? ? ? ? ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); // wrong - - // Fullbright - ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); // wrong - - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); - - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); // wrong - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); - - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - - // Weather - ADD_SIG("BlockSource::getBiome", "48 89 5C 24 18 57 48 83 EC 50 48 8B F9 E8"); - - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - - // Nametag - ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84"); - - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "? ? ? ? ? ? ? ? ? ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD - ADD_SIG("Actor::getActorEquipmentComponent", "4C 8B 41 48 4C 8B C9 48 8B 41 50 4C 8B 51 68 49 2B C0 48 C1 F8 03 48 FF C8 25 36"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); - ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 10"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); - -} - -void SigInit::init2100() { - Logger::debug("[Signatures] Loading sigs for 1.21.0X"); - - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8D ? ? ? ? E8"); - - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); // wrong - - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); // wrong - - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "? ? ? ? ? ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); // wrong - - // Fullbright - ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); // wrong - - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); - - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); // wrong - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); - - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - - // Weather - ADD_SIG("BlockSource::getBiome", "48 89 5C 24 18 57 48 83 EC 50 48 8B F9 E8"); - - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - - // Nametag - ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84"); - - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "? ? ? ? ? ? ? ? ? ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD - ADD_SIG("Actor::getActorEquipmentComponent", "4C 8B 41 48 4C 8B C9 48 8B 41 50 4C 8B 51 68 49 2B C0 48 C1 F8 03 48 FF C8 25 36"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); - ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 10"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); - -} - -void SigInit::init2080() { - Logger::debug("[Signatures] Loading sigs for 1.20.8X"); - - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8D ? ? ? ? E8"); - - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); - - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); - - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "? ? ? ? ? ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); - - // Fullbright - ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); - - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); - - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); - - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - - // Weather - ADD_SIG("BlockSource::getBiome", "40 53 48 83 EC ? 48 8B D9 E8 ? ? ? ? 48 85 C0 75 5C"); - - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - - // Nametag - ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84"); - - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD - ADD_SIG("Actor::getActorEquipmentComponent", "4C 8B 41 48 4C 8B C9 48 8B 41 50 4C 8B 51 68 49 2B C0 48 C1 F8 03 48 FF C8 25 36"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); - ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C0"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); -} - -void SigInit::init2070() { - Logger::debug("[Signatures] Loading sigs for 1.20.7X"); - - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); - - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); - - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89 54 24 ? 4C 8B E9 48 89 4C 24"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); - - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "? ? ? ? ? ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); - - // Fullbright - ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); - - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); - - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); - - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - - // Weather - ADD_SIG("BlockSource::getBiome", "40 53 48 83 EC ? 48 8B D9 E8 ? ? ? ? 48 85 C0 75 5C"); - - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - - // Nametag - ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84"); - - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - - // Armour HUD - ADD_SIG("Actor::getArmor", "48 8B 89 20 04 00 00 48 8B 01 48 8B 40 28 48"); - ADD_SIG("Actor::getOffhandSlot", "48 8B 89 ? ? ? ? BA ? ? ? ? 48 8B 01 48 8B 40 ? 48 FF 25"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); - ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 E0 1C 00 00"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); + ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC ? 45 33 C0 48 8B D9 81 FA"); } -void SigInit::init2060() { - Logger::debug("[Signatures] Loading sigs for 1.20.6X"); - - ADD_SIG("Keyboard::feed", "48 ?? ?? ?? 0F B6 ?? 4C ?? ?? ?? ?? ?? ?? 89 ?? ?? ?? 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); +void SigInit::init2100() { + Logger::debug("[Signatures] Loading sigs for 1.21.0X"); - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); + ADD_SIG("BlockSource::getBiome", "48 89 5C 24 18 57 48 83 EC 50 48 8B F9 E8"); + ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 10"); +} - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); +void SigInit::init2080() { + Logger::debug("[Signatures] Loading sigs for 1.20.8X"); - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); + ADD_SIG("tryGetPrefix2", "4C 8B 41 48 4C 8B C9 48 8B 41 50 4C 8B 51 68 49 2B C0 48 C1 F8 03 48 FF"); - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); + // 36 48 C4 71 + ADD_SIG("Actor::getActorEquipmentComponent", "C8 25 36 48 C4 71"); - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); + ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8D ? ? ? ? E8"); - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); + ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C0"); - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "41 0F 10 08 48 8B C2 0F"); + ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); +} - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "48 8B ? 48 89 ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); +void SigInit::init2070() { + Logger::debug("[Signatures] Loading sigs for 1.20.7X"); - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); + ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); - // Fullbright - ADD_SIG("Options::getGamma", "48 83 EC ? 80 B9 ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); + ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); + ADD_SIG("LevelRendererPlayer::getFov", "? ? ? ? ? ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); + ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); + ADD_SIG("Actor::getArmor", "48 8B 89 20 04 00 00 48 8B 01 48 8B 40 28 48"); - //TimeChanger - ADD_SIG("TimeChanger", "44 8B C2 B8 F1 19 76 05 F7 EA"); + ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 E0 1C 00 00"); +} - // Weather - ADD_SIG("BlockSource::getBiome", "40 53 48 83 EC ? 48 8B D9 E8 ? ? ? ? 48 85 C0 75 5C"); +void SigInit::init2060() { + Logger::debug("[Signatures] Loading sigs for 1.20.6X"); - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); + ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); + ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); - // Nametag ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84"); - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD ADD_SIG("Actor::getArmor", "48 8B 89 58 04 00 00 48 8B 01 48 8B 40 28 48"); - ADD_SIG("Actor::getOffhandSlot", "48 8B 89 ? ? ? ? BA ? ? ? ? 48 8B 01 48 8B 40 ? 48 FF 25"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C8 1C 00 00"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); } void SigInit::init2050() { Logger::debug("[Signatures] Loading sigs for 1.20.5X"); - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); + ADD_SIG("tryGetPrefix", "48 89 5C 24 ? 57 48 83 EC ? 48 8B"); ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B F9 4C 8D B1"); - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); - - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "41 0F 10 08 48 8B C2 0F"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "48 8B ? 48 89 ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); - - // Fullbright - ADD_SIG("Options::getGamma", "48 83 EC ? 80 B9 ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); - - // HurtColor ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 18 89 44 24 ? 48 8D 54 24 ? 48 8B 4B ? E8 ? ? ? ? 48 8B F8"); - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "44 8B C2 B8 F1 19 76 05 F7 EA"); - - // Weather ADD_SIG("BlockSource::getBiome", "40 53 48 83 EC ? 48 8B D9 E8 ? ? ? ? 48 85 C0 75 5C"); - // FreeLook ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - // Nametag ADD_SIG("ThirdPersonNametag", "? ? ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84 ? ? ? ? 49 8B 97"); - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "40 53 48 83 EC ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "40 53 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD ADD_SIG("Actor::getArmor", "48 8B 89 50 04 00 00 48 8B 01 48 8B 40 28 48"); ADD_SIG("Actor::getOffhandSlot", "48 8B 89 ? ? ? ? BA ? ? ? ? 48 8B 01 48 8B 40 ? 48 FF 25"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 D8 1C 00 00"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); } void SigInit::init2040() { Logger::debug("[Signatures] Loading sigs for 1.20.4X"); - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); - - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 55 57 41 56 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B F1 48 8D B1 ? ? ? ? 48 83 3E 00 0F 85 ? ? ? ? 48 8D 4C 24 ? E8 ? ? ? ? 48 3B F0 74 1A 48 8B 08 48 C7 00 ? ? ? ? 48 8B 16 48 89 0E"); - - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); - - ADD_SIG("Actor::getActorGameTypeComponent", "40 53 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "40 53 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "40 53 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "40 53 48 83 EC 20 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "41 0F 10 08 48 8B C2 0F"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "48 8B ? 48 89 ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); - // Fullbright ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 48 8B ? ? 48 8B ? 8B 43 ? 89 44 ? ? 48 8D ? ? ? E8 ? ? ? ? 48 8B ? 48 85 ? 0F 84 ? ? ? ? 48 8B"); - - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11"); - - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "44 8B C2 B8 F1 19 76 05 F7 EA"); - - // Weather - ADD_SIG("BlockSource::getBiome", "40 57 48 83 EC 50 48 8B F9 E8"); - - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 30 F3 ? ? 78 ? 49 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - - // Nametag - ADD_SIG("ThirdPersonNametag", "? ? ? ? ? ? 49 8B ? 48 8B ? E8 ? ? ? ? 84 C0 ? ? ? ? ? ? 49 8B ? 49 8b"); - - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "40 53 48 83 EC 20 48 8B DA BA 2E"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "40 53 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD - ADD_SIG("Actor::getArmor", "48 8B 89 28 04 00 00 48 8B 01 48 8B 40 28 48 FF 25"); - ADD_SIG("Actor::getOffhandSlot", "48 8B 89 30 04 00 00 BA 01 00 00 00"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); + ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 78"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); } void SigInit::init2030() { Logger::debug("[Signatures] Loading sigs for 1.20.3X"); + ADD_SIG("tryGetPrefix", "40 53 48 83 EC 20 48 8B"); + ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); @@ -702,9 +111,9 @@ void SigInit::init2030() { ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); - ADD_SIG("Actor::getActorGameTypeComponent", "40 53 48 83 EC 20 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "40 53 48 83 EC 20 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "40 53 48 83 EC 20 48 8B DA BA 91 3C C9 0E"); + ADD_SIG("Actor::getActorGameTypeComponent", "DA BA DE AB CB AF"); + ADD_SIG("Actor::getAABBShapeComponent", "DA BA F2 C9 10 1B"); + ADD_SIG("Actor::getStateVectorComponent", "DA BA 91 3C C9 0E"); // AutoGG, AutoRQ, DiscordRPC ... ADD_SIG("LoopbackPacketSender::sendPacket", "48 89 5C 24 ? 57 48 83 EC 20 48 8B D9 48 8B FA 48 8B 49 20 E8 ? ? ? ? 4C 8B 03 48 8B D7"); @@ -714,7 +123,7 @@ void SigInit::init2030() { // Reach display ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - ADD_SIG("Actor::getRuntimeIDComponent", "40 53 48 83 EC 20 48 8B DA BA 14 14 A1 3C"); + ADD_SIG("Actor::getRuntimeIDComponent", "DA BA 14 14 A1 3C"); // Fog color ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); @@ -759,10 +168,10 @@ void SigInit::init2030() { ADD_SIG("ThirdPersonNametag", "? ? ? ? ? ? 49 8B ? 48 8B ? E8 ? ? ? ? 84 C0 ? ? ? ? ? ? 49 8B ? 49 8b"); // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "40 53 48 83 EC 20 48 8B DA BA 2E"); + ADD_SIG("Actor::getMoveInputHandler", "DA BA 2E CD 8B 46"); // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "40 53 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); + ADD_SIG("Actor::getRenderPositionComponent", "DA BA 6E F3 E8 D4"); ADD_SIG("Actor::canSee", "48 89 5C 24 20 56 48 81 EC 00"); // Hitboxes // onTick event @@ -776,6 +185,7 @@ void SigInit::init2030() { ADD_SIG("Actor::getOffhandSlot", "48 8B 89 30 04 00 00 BA 01 00 00 00"); ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); + ADD_SIG("ItemStack::isEnchanted", "48 83 EC 38 48 8B 49 10 48 85 C9 74 4B"); ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); // Tablist @@ -784,5 +194,13 @@ void SigInit::init2030() { ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); + ADD_SIG("Tessellator::begin", "48 89 5C 24 ? 56 48 83 EC ? 80 B9 ? ? ? ? ? 45 0F B6"); + ADD_SIG("Tessellator::vertex", "40 57 48 81 EC ? ? ? ? 0F 29 7C ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 ? 8B 81"); + ADD_SIG("Tessellator::colorF", "80 B9 ? ? ? ? ? 4C 8B C1 75"); + ADD_SIG("Tessellator::setRotation", "48 89 5C 24 ? 57 48 81 EC ? ? ? ? F3 41 0F 10"); + ADD_SIG("Tessellator::resetTransform", "80 B9 ? ? ? ? ? 4C 8B C1 75"); + ADD_SIG("MeshHelper::renderImmediately", "48 89 5C 24 ? 48 89 74 24 ? 57 48 81 EC ? ? ? ? 49 8B F8 48 8B DA 48 8B F1 80 BA"); + + ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); } diff --git a/src/Utils/Versions/VersionUtils.cpp b/src/Utils/Versions/VersionUtils.cpp index 9df4e1a4..19a66f0f 100644 --- a/src/Utils/Versions/VersionUtils.cpp +++ b/src/Utils/Versions/VersionUtils.cpp @@ -8,46 +8,67 @@ #include "../Memory/Game/Sig/SigInit.hpp" #include "../../Client/Client.hpp" -std::unordered_map, std::function>> VersionUtils::versions; +std::vector, std::function>>> VersionUtils::versions; void VersionUtils::init() { - std::pair, std::function> p2120 = {SigInit::init2120, OffsetInit::init2100}; - versions.emplace("1.21.2", p2120); + std::pair, std::function>> p2120 = {"1.21.2", {SigInit::init2120, OffsetInit::init2100}}; + versions.push_back(p2120); - std::pair, std::function> p2110 = {SigInit::init2100, OffsetInit::init2100}; - versions.emplace("1.21.1", p2110); + std::pair, std::function>> p2110 = {"1.21.1", {SigInit::init2100, OffsetInit::init2100}}; + versions.push_back(p2110); - std::pair, std::function> p2100 = {SigInit::init2100, OffsetInit::init2100}; - versions.emplace("1.21.3", p2100); + std::pair, std::function>> p2100 = {"1.21.3", {SigInit::init2100, OffsetInit::init2100}}; + versions.push_back(p2100); - std::pair, std::function> p2080 = {SigInit::init2080, OffsetInit::init2080}; - versions.emplace("1.20.8", p2080); + std::pair, std::function>> p2080 = {"1.20.8", {SigInit::init2080, OffsetInit::init2080}}; + versions.push_back(p2080); - std::pair, std::function> p2070 = {SigInit::init2070, OffsetInit::init2070}; - versions.emplace("1.20.7", p2070); + std::pair, std::function>> p2070 = {"1.20.7", {SigInit::init2070, OffsetInit::init2070}}; + versions.push_back(p2070); - std::pair, std::function> p2060 = {SigInit::init2060, OffsetInit::init2060}; - versions.emplace("1.20.6", p2060); + std::pair, std::function>> p2060 = {"1.20.6", {SigInit::init2060, OffsetInit::init2060}}; + versions.push_back(p2060); - std::pair, std::function> p2050 = {SigInit::init2050, OffsetInit::init2050}; - versions.emplace("1.20.5", p2050); + std::pair, std::function>> p2050 = {"1.20.5", {SigInit::init2050, OffsetInit::init2050}}; + versions.push_back(p2050); - std::pair, std::function> p2040 = {SigInit::init2040, OffsetInit::init2040}; - versions.emplace("1.20.4", p2040); + std::pair, std::function>> p2040 = {"1.20.4", {SigInit::init2040, OffsetInit::init2040}}; + versions.push_back(p2040); - std::pair, std::function> p2030 = {SigInit::init2030, OffsetInit::init2030}; - versions.emplace("1.20.3", p2030); + std::pair, std::function>> p2030 = {"1.20.3", {SigInit::init2030, OffsetInit::init2030}}; + versions.push_back(p2030); + + std::reverse(versions.begin(), versions.end()); } bool VersionUtils::isSupported(const std::string& version) { - return versions.contains(version); + return std::find_if(versions.begin(), versions.end(), + [version](const std::pair, std::function>>& p) { + return p.first == version; + }) != versions.end(); } void VersionUtils::addData() { - const auto& [v, o] = versions.at(Client::version); - - std::thread t1(v); - std::thread t2(o); + // load all offsets and sigs for each version + auto sigs = [&](){ + for (const auto &item: versions) { + item.second.first(); + if(item.first == Client::version) { + return; + } + } + }; + auto offsets = [&](){ + for (const auto &item: versions) { + item.second.second(); + if(item.first == Client::version) { + return; + } + } + }; + + std::thread t1(sigs); + std::thread t2(offsets); t1.join(); t2.join(); diff --git a/src/Utils/Versions/VersionUtils.hpp b/src/Utils/Versions/VersionUtils.hpp index 868f43de..b135ab01 100644 --- a/src/Utils/Versions/VersionUtils.hpp +++ b/src/Utils/Versions/VersionUtils.hpp @@ -12,5 +12,5 @@ class VersionUtils { static bool isSupported(const std::string& version); static void addData(); - static std::unordered_map, std::function>> versions; + static std::vector, std::function>>> versions; }; From 1964e8fa5a038906e624fcdcbfa9cd3109de55e5 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 16:12:17 +0300 Subject: [PATCH 014/240] New packet stuff --- src/Client/Hook/Hooks/Game/PacketHooks.cpp | 33 ++++++++++++++-------- src/Client/Hook/Hooks/Game/PacketHooks.hpp | 16 +++++++---- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.cpp b/src/Client/Hook/Hooks/Game/PacketHooks.cpp index 8f2540e4..be490c7c 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.cpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.cpp @@ -15,8 +15,10 @@ void SendPacketHook::callback(LoopbackPacketSender *pSender, Packet *pPacket) { } } -void SendPacketHook::receiveCallbackText(const float *a1, const float *networkIdentifier, const float *netEventCallback, +void SendPacketHook::receiveCallbackText(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet) { + + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); if ( packet.get() && CompactChatListener::prev == reinterpret_cast(packet.get())->message @@ -25,36 +27,39 @@ void SendPacketHook::receiveCallbackText(const float *a1, const float *networkId PacketEvent event(packet.get()); EventHandler::onPacketReceive(event); if (!event.isCancelled()) - receiveTextPacketOriginal(a1, networkIdentifier, netEventCallback, packet); + receiveTextPacketOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } } void -SendPacketHook::receiveCallbackSetTitle(const float *a1, const float *networkIdentifier, const float *netEventCallback, +SendPacketHook::receiveCallbackSetTitle(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet) { + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); + PacketEvent event(packet.get()); EventHandler::onPacketReceive(event); if (!event.isCancelled()) - receiveSetTitlePacketOriginal(a1, networkIdentifier, netEventCallback, packet); + receiveSetTitlePacketOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } void -SendPacketHook::receiveCallbackPlaySound(const float *a1, const float *networkIdentifier, const float *netEventCallback, +SendPacketHook::receiveCallbackPlaySound(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet) { - + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); PacketEvent event(packet.get()); EventHandler::onPacketReceive(event); if (!event.isCancelled()) - receivePacketPlaySoundOriginal(a1, networkIdentifier, netEventCallback, packet); + receivePacketPlaySoundOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } -void SendPacketHook::receiveCallbackEntityEvent(const float *a1, const float *networkIdentifier, - const float *netEventCallback, const std::shared_ptr &packet) { +void SendPacketHook::receiveCallbackEntityEvent(void *packetHandlerDispatcher, void *networkIdentifier, + void *netEventCallback, const std::shared_ptr &packet) { + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); PacketEvent event(packet.get()); EventHandler::onPacketReceive(event); if (!event.isCancelled()) - receivePacketEntityEventOriginal(a1, networkIdentifier, netEventCallback, packet); + receivePacketEntityEventOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } @@ -85,4 +90,10 @@ void SendPacketHook::enableHook() { (void **) &receivePacketEntityEventOriginal, "ReceivePacketHook"); this->autoHook((void *) callback, (void **) &sendPacketOriginal); -} \ No newline at end of file +} + +void SendPacketHook::setVariables(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback) { + SendPacketHook::NetworkIdentifier = networkIdentifier; + SendPacketHook::PacketHandlerDispatcher = packetHandlerDispatcher; + SendPacketHook::NetEventCallback = netEventCallback; +} diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.hpp b/src/Client/Hook/Hooks/Game/PacketHooks.hpp index 0ae07848..4c26782b 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.hpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.hpp @@ -8,25 +8,31 @@ class SendPacketHook : public Hook { private: + static void setVariables(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback); + static void callback(LoopbackPacketSender *pSender, Packet *pPacket); - static void receiveCallbackText(const float *a1, const float *networkIdentifier, const float *netEventCallback, + static void receiveCallbackText(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet); - static void receiveCallbackSetTitle(const float *a1, const float *networkIdentifier, const float *netEventCallback, + static void receiveCallbackSetTitle(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet); - static void receiveCallbackPlaySound(const float *a1, const float *networkIdentifier, const float *netEventCallback, + static void receiveCallbackPlaySound(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet); - static void receiveCallbackEntityEvent(const float *a1, const float *networkIdentifier, const float *netEventCallback, + static void receiveCallbackEntityEvent(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet); public: + static inline void* NetworkIdentifier; + static inline void* PacketHandlerDispatcher; + static inline void* NetEventCallback; + typedef void(__thiscall *original)(LoopbackPacketSender *, Packet *); - typedef void(__thiscall *receive)(const float *a1, const float *networkIdentifier, const float *netEventCallback, + typedef void(__thiscall *receive)(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, std::shared_ptr packet); static inline original sendPacketOriginal = nullptr; From 0bfa59fc4b77edb81952dc23e289444f3c67e4dc Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 16:15:08 +0300 Subject: [PATCH 015/240] 2 new modules (testing) --- src/Client/Events/Game/AttackEvent.hpp | 2 +- src/Client/Events/Game/FOVEvent.hpp | 2 +- src/Client/Module/Manager.cpp | 4 + src/Client/Module/Modules/HitPing/HitPing.hpp | 278 ++++++++++++++++++ .../Modules/HitPing/HitPingListener.hpp | 146 +++++++++ .../InstantHurtAnimation.hpp | 51 ++++ .../InstantHurtAnimationListener.hpp | 132 +++++++++ .../Network/Packet/EntityEventPacket.hpp | 2 + 8 files changed, 615 insertions(+), 2 deletions(-) create mode 100644 src/Client/Module/Modules/HitPing/HitPing.hpp create mode 100644 src/Client/Module/Modules/HitPing/HitPingListener.hpp create mode 100644 src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp create mode 100644 src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp diff --git a/src/Client/Events/Game/AttackEvent.hpp b/src/Client/Events/Game/AttackEvent.hpp index c0caa74b..ec1419df 100644 --- a/src/Client/Events/Game/AttackEvent.hpp +++ b/src/Client/Events/Game/AttackEvent.hpp @@ -3,7 +3,7 @@ #include "../Cancellable.hpp" #include "../../../SDK/Client/Actor/Actor.hpp" -class AttackEvent : public Event { +class AttackEvent : public Event, public Cancellable { Actor* actor; public: Actor* getActor() { diff --git a/src/Client/Events/Game/FOVEvent.hpp b/src/Client/Events/Game/FOVEvent.hpp index 436651b7..dfc76372 100644 --- a/src/Client/Events/Game/FOVEvent.hpp +++ b/src/Client/Events/Game/FOVEvent.hpp @@ -3,7 +3,7 @@ #include "../Event.hpp" #include "../Cancellable.hpp" -class FOVEvent : public Event, Cancellable { +class FOVEvent : public Event, public Cancellable { private: float fov; public: diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 39562fc2..3c4586af 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -61,6 +61,8 @@ #include "Modules/Misc/DiscordRPC/DiscordRPCListener.hpp" //#include "Modules/Overlay/OverlayModule.hpp" #include "Modules/AutoRQ/AutoRQ.hpp" +#include "Modules/HitPing/HitPing.hpp" +#include "Modules/InstantHurtAnimation/InstantHurtAnimation.hpp" //#include "Modules/MovableChat/MovableChat.hpp" #include @@ -147,6 +149,8 @@ void ModuleManager::initialize() { ModuleManager::addModule(new CommandHotkey()); ModuleManager::addModule(new NoHurtCam()); ModuleManager::addModule(new InventoryHUD()); + ModuleManager::addModule(new HitPing()); + ModuleManager::addModule(new InstantHurtAnimation()); //ModuleManager::addModule(new OverlayModule()); ModuleManager::addModule(new AutoRQ()); //ModuleManager::addModule(new MovableChat()); diff --git a/src/Client/Module/Modules/HitPing/HitPing.hpp b/src/Client/Module/Modules/HitPing/HitPing.hpp new file mode 100644 index 00000000..0084e28a --- /dev/null +++ b/src/Client/Module/Modules/HitPing/HitPing.hpp @@ -0,0 +1,278 @@ +#pragma once + +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" +#include "HitPingListener.hpp" + + +class HitPing : public Module { + +public: + + + HitPing() : Module("Hit ping", "Measures your hit delay!", + IDR_LIKE_PNG, "") { + Module::setup(); + }; + + void onEnable() override { + EventHandler::registerListener(new HitPingListener("HitPing", this)); + Module::onEnable(); + } + + void onDisable() override { + EventHandler::unregisterListener("HitPing"); + Module::onDisable(); + } + + void defaultConfig() override { + if (settings.getSettingByName("text") == nullptr) + settings.addSetting("text", (std::string) "{value} ms"); + + if (settings.getSettingByName("textscale") == nullptr) settings.addSetting("textscale", 0.80f); + } + + void settingsRender() override { + + /* Border Start */ + + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); + + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); + FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(1.0f, "height")); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), + toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + + this->settings.getSettingByName("uiscale")->value = percent; + + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( + "border")->value)) + this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( + "border")->value; + + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", + textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + + percent = FlarialGUI::Slider(1, toggleX + Constraints::SpacingConstraint(0.60, textWidth) + + FlarialGUI::SettingsTextWidth("Border "), + toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + + this->settings.getSettingByName("borderWidth")->value = percent; + + /* Border End */ + + /* Rounding Start */ + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), + toggleY, this->settings.getSettingByName("rounding")->value); + + this->settings.getSettingByName("rounding")->value = percent; + + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Translucency", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( + "BlurEffect")->value)) + this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( + "BlurEffect")->value; + + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), + toggleY, this->settings.getSettingByName("textscale")->value, 2.00); + + + this->settings.getSettingByName("textscale")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + + std::string txtAlignment = FlarialGUI::Dropdown(1, + toggleX, toggleY, + std::vector{"Left", "Center", "Right"}, + this->settings.getSettingByName( + "textalignment")->value, + "Text Alignment" + ); + + this->settings.getSettingByName("textalignment")->value = txtAlignment; + + FlarialGUI::SetIsInAdditionalYMode(); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Reverse Padding X", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( + "reversepaddingx")->value)) + this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( + "reversepaddingx")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Reverse Padding Y", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( + "reversepaddingy")->value)) + this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( + "reversepaddingy")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), + toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, + false); + + this->settings.getSettingByName("padx")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), + toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, + false); + + this->settings.getSettingByName("pady")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), + toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); + + this->settings.getSettingByName("rectwidth")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), + toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); + + this->settings.getSettingByName("rectheight")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Responsive Rectangle (Moves with the Text)", + textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( + "responsivewidth")->value)) + this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( + "responsivewidth")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), + toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, + false); + + this->settings.getSettingByName("rotation")->value = percent; + + FlarialGUI::UnSetIsInAdditionalYMode(); + + /* Rounding End */ + + /* Color Pickers Start*/ + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY = Constraints::PercentageConstraint(0.10, "top"); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), + toggleY - Constraints::SpacingConstraint(0.017, textWidth), + settings.getSettingByName("bgColor")->value, + settings.getSettingByName("bgRGB")->value); + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, + settings.getSettingByName("textColor")->value, + settings.getSettingByName("textRGB")->value); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, + settings.getSettingByName("borderColor")->value, + settings.getSettingByName("borderRGB")->value); + + FlarialGUI::UnsetScrollView(); + + FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, + settings.getSettingByName("bgOpacity")->value, + settings.getSettingByName("bgRGB")->value); + FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, + settings.getSettingByName("textOpacity")->value, + settings.getSettingByName("textRGB")->value); + FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, + settings.getSettingByName("borderOpacity")->value, + settings.getSettingByName("borderRGB")->value); + /* Color Pickers End */ + + } +}; + diff --git a/src/Client/Module/Modules/HitPing/HitPingListener.hpp b/src/Client/Module/Modules/HitPing/HitPingListener.hpp new file mode 100644 index 00000000..e5778f5a --- /dev/null +++ b/src/Client/Module/Modules/HitPing/HitPingListener.hpp @@ -0,0 +1,146 @@ +#pragma once + +#include "../../../../SDK/SDK.hpp" +#include "../../../../SDK//Client/Network/Packet/PlaySoundPacket.hpp" +#include "../../../../SDK//Client/Network/Packet/TextPacket.hpp" +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../Module.hpp" +#include "../../../GUI/Engine/Engine.hpp" +#include "../../../Hook/Hooks/Game/PacketHooks.hpp" +#include "../../../../SDK/Client/Network/Packet/EntityEventPacket.hpp" +#include +#include + +using Duration = std::chrono::duration; + +struct HitInfo { + std::chrono::time_point lastActorStableTouch; + std::chrono::time_point lastActorTouch; + std::chrono::time_point lastActorHit; + Vec3 lastActorTouchPos; + Duration lastActorHitDelay{}; +}; + +class HitPingListener : public Listener { + Module *module; + std::chrono::time_point last_hit; + Duration hitDelay = std::chrono::milliseconds(0); + float pingReach{}; + + std::map> actorsHit; + + void onRender(RenderEvent &event) override { + if (module->isEnabled()) { + auto delayStr = std::to_string(pingReach)+"\n"+std::to_string((int)round(hitDelay.count() * 1000)); + + this->module->normalRender(7, delayStr); + } + } + + void onAttack(AttackEvent &event) override { // only calculate ping on first hit + ClearOldHits(); + auto playerPos = SDK::clientInstance->getLocalPlayer()->getStateVectorComponent()->Pos; + auto entity = event.getActor(); + auto hitActors = &actorsHit; + auto id = entity->getRuntimeIDComponent()->runtimeID; + + std::chrono::time_point start = std::chrono::high_resolution_clock::now(); + + auto it = hitActors->find(id); + if (it != hitActors->end()) { + if(start - (*hitActors)[id].second.lastActorTouch <= std::chrono::milliseconds(480)) { + // hitting too fast + (*hitActors)[id].second.lastActorTouch = start; + return; + } else if (!(*hitActors)[id].first){ + (*hitActors)[id].first = true; + (*hitActors)[id].second.lastActorTouch = start; + (*hitActors)[id].second.lastActorStableTouch = start; + (*hitActors)[id].second.lastActorTouchPos = playerPos; + } + } else { + (*hitActors)[id].first = true; + (*hitActors)[id].second.lastActorTouch = start; + (*hitActors)[id].second.lastActorStableTouch = start; + (*hitActors)[id].second.lastActorTouchPos = playerPos; + } + } + + void onPacketReceive(PacketEvent &event) override { + if (event.getPacket()->getId() == MinecraftPacketIds::ActorEvent) { + auto packet = (EntityEventPacket *) event.getPacket(); + if (packet->EventID == ActorEvent::Hurt) { + auto id = packet->RuntimeID; + auto actorHitInfo = actorsHit.find(id); + if(actorHitInfo != actorsHit.end()) { + auto now = std::chrono::high_resolution_clock::now(); + auto start = actorHitInfo->second.second.lastActorStableTouch; + + if(!actorHitInfo->second.first) { + return; // hit registered + } + + actorHitInfo->second.first = false; + + if(start + std::chrono::milliseconds(500) > now) { + std::chrono::duration time = now - start; + + if(time.count() >= 0.0001) { + hitDelay = time; + auto actors = SDK::clientInstance->getLocalPlayer()->level->getRuntimeActorList(); + auto actor = std::find_if(actors.begin(), actors.end(), [&](auto &a) { + return a->getRuntimeIDComponent()->runtimeID == id; + }); + if(actor != actors.end()) { + + auto actorPtr = (*actor); + auto actorHitBox = actorPtr->getAABBShapeComponent()->aabb.expandedXZ(0.1); + + auto upper = actorHitBox.upper; + auto lower = actorHitBox.lower; + + auto posAtTimeOfHit = actorHitInfo->second.second.lastActorTouchPos; + + auto closestPoint = Vec3{ std::clamp(posAtTimeOfHit.x, lower.x, upper.x), + std::clamp(posAtTimeOfHit.y, lower.y, upper.y), + std::clamp(posAtTimeOfHit.z, lower.z, upper.z) }; + + pingReach = actorHitInfo->second.second.lastActorTouchPos.dist(closestPoint); + last_hit = now; + actorHitInfo->second.second.lastActorHit = now; + actorHitInfo->second.second.lastActorHitDelay = time; + } + } + } + } + } + } + } + + void onTick(TickEvent &event) override { + std::chrono::duration duration = std::chrono::high_resolution_clock::now() - last_hit; + if (duration.count() >= 15) { + pingReach = 0; + hitDelay = std::chrono::milliseconds(0); + }; + } + + void ClearOldHits() { + auto now = std::chrono::steady_clock::now(); + for(auto it = actorsHit.begin(); it != actorsHit.end();) { + if(now - it->second.second.lastActorTouch > std::chrono::milliseconds(3000)) { + it = actorsHit.erase(it); + } else { + ++it; + } + } + } + +public: + explicit HitPingListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + } +}; diff --git a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp new file mode 100644 index 00000000..55677840 --- /dev/null +++ b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" +#include "InstantHurtAnimationListener.hpp" + + +class InstantHurtAnimation : public Module { + +public: + + InstantHurtAnimation() : Module("Instant Hurt Animation", "Hurt animation becomes ping independent, helps time hits.", + IDR_COMBO_PNG, "") { + Module::setup(); + }; + + void onEnable() override { + EventHandler::registerListener(new InstantHurtAnimationListener("InstantHurtAnimation", this)); + Module::onEnable(); + } + + void onDisable() override { + EventHandler::unregisterListener("InstantHurtAnimation"); + Module::onDisable(); + } + + void defaultConfig() override { + + if (settings.getSettingByName("tryToExcludeTeam") == nullptr) settings.addSetting("tryToExcludeTeam", false); + + } + + void settingsRender() override { + + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); + + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Try to exclude team", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( + "tryToExcludeTeam")->value)) + this->settings.getSettingByName("tryToExcludeTeam")->value = !this->settings.getSettingByName( + "tryToExcludeTeam")->value; + } +}; diff --git a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp new file mode 100644 index 00000000..6dbdbc7d --- /dev/null +++ b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp @@ -0,0 +1,132 @@ +#pragma once + +#include "../../../../SDK/SDK.hpp" +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../Module.hpp" +#include "../../../GUI/Engine/Engine.hpp" +#include "../../../../SDK/SDK.hpp" +#include "../../../../Utils/Utils.hpp" +#include "../../../Client.hpp" +#include "../../../../SDK/Client/Network/Packet/EntityEventPacket.hpp" +#include "../../../Hook/Hooks/Game/PacketHooks.hpp" +#include +#include + +class InstantHurtAnimationListener : public Listener { + + std::unordered_map hitEntities; + + Module *module; + + static bool IsOnTeam(Actor *actor) { + auto player = SDK::clientInstance->getLocalPlayer(); + if (!player) return false; + + std::string playerName = *player->getNametag(); + std::string actorName = *actor->getNametag(); + + if (playerName.empty() || actorName.empty()) return false; + + auto cleanName = [](std::string &name) { + constexpr std::string tags[] = {"§r", "§l"}; + for (const auto &tag : tags) { + size_t pos; + while ((pos = name.find(tag)) != std::string::npos) { + name.erase(pos, tag.length()); + } + } + }; + + cleanName(playerName); + cleanName(actorName); + + size_t playerTeamPos = playerName.find("§"); + if (playerTeamPos == std::string::npos) return false; + + std::string playerTeam = playerName.substr(playerTeamPos + 2, 1); + + size_t actorTeamPos = actorName.find("§"); + if (actorTeamPos != std::string::npos) { + std::string actorTeam = actorName.substr(actorTeamPos + 2, 1); + return actorTeam == playerTeam; + } + + return false; + } + + void onPacketReceive(PacketEvent &event) override { + auto player = SDK::clientInstance->getLocalPlayer(); + if (!SDK::clientInstance->getLocalPlayer()) return; + if(event.getPacket()->getId() == MinecraftPacketIds::ActorEvent) { + auto ee = (EntityEventPacket *) event.getPacket(); + if (ee->RuntimeID != player->getRuntimeIDComponent()->runtimeID) { + if (ee->EventID == ActorEvent::Hurt) { + // Cancel hurt anim packet, that was caused by our hit + auto it = hitEntities.find(ee->RuntimeID); + if (it != hitEntities.end()) { + auto now = std::chrono::steady_clock::now(); + auto hitTime = it->second; + auto duration = std::chrono::duration_cast(now - hitTime).count(); + if (duration <= 500) { + event.cancel(); + } else { + hitEntities.erase(it); + } + } + } + } + } + } + + + void onAttack(AttackEvent &event) override { + if(module->settings.getSettingByName("tryToExcludeTeam")->value) + if(IsOnTeam(event.getActor())) return; + + ClearOldHits(); + + auto runtimeID = event.getActor()->getRuntimeIDComponent()->runtimeID; + auto now = std::chrono::steady_clock::now(); + + auto it = hitEntities.find(runtimeID); + if (it != hitEntities.end()) { + auto hitTime = it->second; + auto duration = std::chrono::duration_cast(now - hitTime).count(); + if (duration <= 500) { + return; + } + } + + std::shared_ptr packet = SDK::createPacket((int)MinecraftPacketIds::ActorEvent); + auto ee = (EntityEventPacket *) packet.get(); + ee->EventID = ActorEvent::Hurt; + ee->RuntimeID = runtimeID; + + hitEntities[runtimeID] = now; + + SendPacketHook::receivePacketEntityEventOriginal(SendPacketHook::PacketHandlerDispatcher, + SendPacketHook::NetworkIdentifier, + SendPacketHook::NetEventCallback, + packet); + }; + + void ClearOldHits() { + auto now = std::chrono::steady_clock::now(); + for (auto it = hitEntities.begin(); it != hitEntities.end(); ) { + auto duration = std::chrono::duration_cast(now - it->second).count(); + if (duration > 500) { + it = hitEntities.erase(it); + } else { + ++it; + } + } + } + +public: + explicit InstantHurtAnimationListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + } +}; \ No newline at end of file diff --git a/src/SDK/Client/Network/Packet/EntityEventPacket.hpp b/src/SDK/Client/Network/Packet/EntityEventPacket.hpp index 450ac532..f01b6bce 100644 --- a/src/SDK/Client/Network/Packet/EntityEventPacket.hpp +++ b/src/SDK/Client/Network/Packet/EntityEventPacket.hpp @@ -1,3 +1,5 @@ +#pragma once + #include #include "Packet.hpp" From 6009768f9e00e7efe9410398c9d4bec01a298d33 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 16:53:49 +0300 Subject: [PATCH 016/240] Show enchanted items in ArmorHUD --- .../Modules/ArmorHUD/ArmorHUDListener.hpp | 99 +++++++++++++------ src/SDK/Client/Actor/Actor.cpp | 16 +++ src/SDK/Client/Item/ItemStack.cpp | 6 ++ src/SDK/Client/Item/ItemStack.hpp | 1 + src/Utils/Utils.cpp | 15 ++- src/Utils/Utils.hpp | 2 + 6 files changed, 106 insertions(+), 33 deletions(-) diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp index 9db2e476..68648485 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp @@ -20,11 +20,11 @@ class ArmorHUDListener : public Listener { Vec2 currentPos; bool enabled = false; int durabilities[5][2] = { - {0,0}, - {0,0}, - {0,0}, - {0,0}, - {0,0} + {0,0}, + {0,0}, + {0,0}, + {0,0}, + {0,0} }; // TODO: delete testing variables (or adjust and delete) Vec2 testOffset = Vec2{4,0}; @@ -135,31 +135,37 @@ class ArmorHUDListener : public Listener { std::string text; - if (module->settings.getSettingByName("percent")->value) - text = std::to_string((int)std::round((float)durabilities[i][0] / (float)durabilities[i][1] * 100))+"%"; - else - text = std::to_string(durabilities[i][0]) + "/" + std::to_string(durabilities[i][1]); + if (durabilities[i][1] != 0) { // for some servers with custom items with max durability of 0 + if (module->settings.getSettingByName("percent")->value) + text = std::to_string((int) std::round( + (float) durabilities[i][0] / (float) durabilities[i][1] * 100)) + "%"; + else + text = std::to_string(durabilities[i][0]) + "/" + + std::to_string(durabilities[i][1]); + - std::wstring widestr = std::wstring(text.begin(), text.end()); + std::wstring widestr = std::wstring(text.begin(), text.end()); - const wchar_t *widecstr = widestr.c_str(); + const wchar_t *widecstr = widestr.c_str(); - D2D1_COLOR_F color = mainColor; + D2D1_COLOR_F color = mainColor; - if (module->settings.getSettingByName("color")->value){ - if(std::round((float)durabilities[i][0] / (float)durabilities[i][1] * 100) <= 15){ - color = lowColor; - } else { - color = fullColor; + if (module->settings.getSettingByName("color")->value) { + if (std::round((float) durabilities[i][0] / (float) durabilities[i][1] * 100) <= + 15) { + color = lowColor; + } else { + color = fullColor; + } } - } - FlarialGUI::FlarialTextWithFont( - currentPos.x + xmodifier + xoffset + testOffset.x, - currentPos.y + ymodifier + yoffset + testOffset.y, widecstr, textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - textWidth, - DWRITE_FONT_WEIGHT_NORMAL, color, false); + FlarialGUI::FlarialTextWithFont( + currentPos.x + xmodifier + xoffset + testOffset.x, + currentPos.y + ymodifier + yoffset + testOffset.y, widecstr, textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + textWidth, + DWRITE_FONT_WEIGHT_NORMAL, color, false); + } } } } @@ -240,14 +246,28 @@ class ArmorHUDListener : public Listener { nullptr) { auto item = SDK::clientInstance->getLocalPlayer()->playerInventory->inventory->getItem( SDK::clientInstance->getLocalPlayer()->playerInventory->SelectedSlot); - durabilities[0][1] = item->getMaxDamage(); - durabilities[0][0] = durabilities[0][1] - item->getDamageValue(); + + auto maxDamage = item->getMaxDamage(); + auto durabilityLeft = maxDamage - item->getDamageValue(); + + durabilities[0][1] = maxDamage; + durabilities[0][0] = durabilityLeft; + barc.itemRenderer->renderGuiItemNew(&barc, item, 0, convert.x, convert.y, 1.0f, module->settings.getSettingByName( "uiscale")->value, false); + + if(item->isEnchanted()) { + barc.itemRenderer->renderGuiItemNew(&barc, + item, + 0, convert.x, convert.y, 1.0f, + module->settings.getSettingByName( + "uiscale")->value, + true); + } } @@ -261,20 +281,35 @@ class ArmorHUDListener : public Listener { if (module->settings.getSettingByName("vertical")->value) ymodifier += spacing; else xmodifier += spacing; - if (SDK::clientInstance->getLocalPlayer()->getArmor(i-1)->getItem() != nullptr) { - durabilities[i][1] = SDK::clientInstance->getLocalPlayer()->getArmor(i-1)->getMaxDamage(); - durabilities[i][0] = durabilities[i][1] - - SDK::clientInstance->getLocalPlayer()->getArmor( - i-1)->getDamageValue(); + auto armorSlot = SDK::clientInstance->getLocalPlayer()->getArmor(i-1); + + if (armorSlot->getItem() != nullptr) { + + auto maxDamage = armorSlot->getMaxDamage(); + auto durabilityLeft = maxDamage - armorSlot->getDamageValue(); + + durabilities[i][1] = maxDamage; + durabilities[i][0] = durabilityLeft; convert = this->convert(); + barc.itemRenderer->renderGuiItemNew(&barc, - SDK::clientInstance->getLocalPlayer()->getArmor(i-1), + armorSlot, 0, convert.x + xmodifier, convert.y + ymodifier, 1.0f, module->settings.getSettingByName( "uiscale")->value, false); + + if(armorSlot->isEnchanted()) { + barc.itemRenderer->renderGuiItemNew(&barc, + armorSlot, + 0, + convert.x + xmodifier, convert.y + ymodifier, 1.0f, + module->settings.getSettingByName( + "uiscale")->value, + true); + } } } } diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index 1cdda45e..742ac29e 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -62,6 +62,8 @@ SimpleContainer* Actor::getArmorContainer() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getActorEquipmentComponent")); // 8B DA BA 2E CD 8B 46 + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix2")); + sig = sig - size; } return tryGet(sig)->mArmorContainer; @@ -73,6 +75,8 @@ SimpleContainer* Actor::getOffhandContainer() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getActorEquipmentComponent")); // 8B DA BA 2E CD 8B 46 + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix2")); + sig = sig - size; } return tryGet(sig)->mOffhandContainer; @@ -99,6 +103,8 @@ MoveInputComponent *Actor::getMoveInputHandler() { //??$try_get@UMoveInputCompon if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getMoveInputHandler")); // 8B DA BA 2E CD 8B 46 + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); @@ -110,6 +116,8 @@ ActorGameTypeComponent *Actor::getGameModeType() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getActorGameTypeComponent")); // 8B DA BA DE AB CB AF + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); @@ -121,6 +129,8 @@ AABBShapeComponent *Actor::getAABBShapeComponent() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getAABBShapeComponent")); // 8B DA BA F2 C9 10 1B + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); @@ -132,6 +142,8 @@ StateVectorComponent *Actor::getStateVectorComponent() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getStateVectorComponent")); // 8B DA BA 91 3C C9 0E + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); @@ -157,6 +169,8 @@ RuntimeIDComponent *Actor::getRuntimeIDComponent() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getRuntimeIDComponent")); + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); @@ -197,6 +211,8 @@ RenderPositionComponent *Actor::getRenderPositionComponent() { //??$try_get@URen if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getRenderPositionComponent")); // 8B DA BA 6E F3 E8 D4 + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); diff --git a/src/SDK/Client/Item/ItemStack.cpp b/src/SDK/Client/Item/ItemStack.cpp index a05e4b26..561b3f09 100644 --- a/src/SDK/Client/Item/ItemStack.cpp +++ b/src/SDK/Client/Item/ItemStack.cpp @@ -9,6 +9,12 @@ Item* ItemStack::getItem() const { return item.get(); } +bool ItemStack::isEnchanted() { + using isEnchantedFunc = bool(__fastcall*)(ItemStack*); + static auto getIsEnchanted = reinterpret_cast(Memory::findSig(GET_SIG("ItemStack::isEnchanted"))); + return getIsEnchanted(this); +} + short ItemStack::getDamageValue() { if (item.counter == nullptr) return 0; diff --git a/src/SDK/Client/Item/ItemStack.hpp b/src/SDK/Client/Item/ItemStack.hpp index 6cf420a6..c91cabd5 100644 --- a/src/SDK/Client/Item/ItemStack.hpp +++ b/src/SDK/Client/Item/ItemStack.hpp @@ -18,4 +18,5 @@ class ItemStack { [[nodiscard]] Item* getItem() const; short getDamageValue(); short getMaxDamage(); + bool isEnchanted(); }; \ No newline at end of file diff --git a/src/Utils/Utils.cpp b/src/Utils/Utils.cpp index d782227b..3e4c2c6a 100644 --- a/src/Utils/Utils.cpp +++ b/src/Utils/Utils.cpp @@ -51,7 +51,8 @@ std::string Utils::removeColorCodes(const std::string &input) { std::string Utils::removeNonAlphanumeric(const std::string &input) { std::string result; std::copy_if(input.begin(), input.end(), std::back_inserter(result), [](char c) { - return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == ' '; + return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == ' ' || + c == '-'; }); return result; } @@ -391,3 +392,15 @@ bool Utils::CursorInEllipse(float ellipseX, float ellipseY, float radiusX, float return (normalizedX * normalizedX + normalizedY * normalizedY) <= 1.0f; } + +int Utils::CountBytes(const std::string& data) { + std::istringstream iss(data); + int count = 0; + std::string byte; + + while (iss >> byte) { + count++; + } + + return count; +} diff --git a/src/Utils/Utils.hpp b/src/Utils/Utils.hpp index 2fb9fc0c..b6e9dde2 100644 --- a/src/Utils/Utils.hpp +++ b/src/Utils/Utils.hpp @@ -251,6 +251,8 @@ class Utils { static bool CursorInEllipse(float ellipseX, float ellipseY, float radiusX, float radiusY); + static int CountBytes(const std::string &data); + static constexpr unsigned int hash(const char *str) { unsigned int hash = 5381; int c; From c3f29154b5460f37ebd5a6487ca00f46adb06691 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 17:17:07 +0300 Subject: [PATCH 017/240] GuiData::displayClientMessage --- src/SDK/Client/Render/GuiData.cpp | 16 ++++++++++++++++ src/SDK/Client/Render/GuiData.hpp | 3 +++ src/Utils/Memory/Game/Sig/SigInit.cpp | 3 +++ 3 files changed, 22 insertions(+) create mode 100644 src/SDK/Client/Render/GuiData.cpp diff --git a/src/SDK/Client/Render/GuiData.cpp b/src/SDK/Client/Render/GuiData.cpp new file mode 100644 index 00000000..c9ce0f7c --- /dev/null +++ b/src/SDK/Client/Render/GuiData.cpp @@ -0,0 +1,16 @@ +#include "GuiData.hpp" +#include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" + +void GuiData::displayClientMessage(std::string &str) { + if (str.empty()) + return; + + static uintptr_t sig; + + if (sig == NULL) { + sig = Memory::findSig(GET_SIG("GuiData::displayClientMessage")); + } + + auto fn = reinterpret_cast(sig); + return fn(this, str, false); +} diff --git a/src/SDK/Client/Render/GuiData.hpp b/src/SDK/Client/Render/GuiData.hpp index 928792a7..4e9f54cd 100644 --- a/src/SDK/Client/Render/GuiData.hpp +++ b/src/SDK/Client/Render/GuiData.hpp @@ -2,6 +2,7 @@ #include "../../../Utils/Memory/Memory.hpp" #include "../../../Utils/Utils.hpp" +#include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" class GuiData { public: @@ -11,4 +12,6 @@ class GuiData { BUILD_ACCESS(this, float, screenResRounded, GET_OFFSET("GuiData::screenResRounded")); BUILD_ACCESS(this, float, sliderAmount, GET_OFFSET("GuiData::sliderAmount")); BUILD_ACCESS(this, float, scalingMultiplier, GET_OFFSET("GuiData::scalingMultiplier")); + + void displayClientMessage(std::string &str); }; \ No newline at end of file diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 0e935460..d2c75b5c 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -28,6 +28,8 @@ void SigInit::init2080() { ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C0"); + ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 48 8D AC 24 F0 FE FF FF 48 81 EC 10 02 00 00 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 85 00 01 00 00 41"); + ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); } @@ -201,6 +203,7 @@ void SigInit::init2030() { ADD_SIG("Tessellator::resetTransform", "80 B9 ? ? ? ? ? 4C 8B C1 75"); ADD_SIG("MeshHelper::renderImmediately", "48 89 5C 24 ? 48 89 74 24 ? 57 48 81 EC ? ? ? ? 49 8B F8 48 8B DA 48 8B F1 80 BA"); + ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 41 0F B6 F0"); ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); } From d8ef1f9f5868bc26d4c53390c58ea549f09d7e76 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 17:45:50 +0300 Subject: [PATCH 018/240] Info on how to get 1 of the offsets --- src/Utils/Memory/Game/Offset/OffsetInit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index ec524390..888385dc 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -188,7 +188,7 @@ void OffsetInit::init2030() { ADD_OFFSET("Gamemode::attackVft", 14); ADD_OFFSET("Player::playerInventory", 0x7C0); - ADD_OFFSET("Player::playerName", 0x1C78); + ADD_OFFSET("Player::playerName", 0x1C78); // 48 89 5C 24 20 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 C0 48 81 EC 40 01 00 00 41 | line 278 | book.defaultAuthor ADD_OFFSET("Player::gamemode", 0xE70); ADD_OFFSET("BlockSource::dimension", 0x30); From 0d522dbf9fa05183fa0e2a512ab32f92105daf11 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 17:57:48 +0300 Subject: [PATCH 019/240] Fix hit ping moving with keystrokes --- src/Client/Module/Modules/HitPing/HitPingListener.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/HitPing/HitPingListener.hpp b/src/Client/Module/Modules/HitPing/HitPingListener.hpp index e5778f5a..81fad93e 100644 --- a/src/Client/Module/Modules/HitPing/HitPingListener.hpp +++ b/src/Client/Module/Modules/HitPing/HitPingListener.hpp @@ -35,7 +35,7 @@ class HitPingListener : public Listener { if (module->isEnabled()) { auto delayStr = std::to_string(pingReach)+"\n"+std::to_string((int)round(hitDelay.count() * 1000)); - this->module->normalRender(7, delayStr); + this->module->normalRender(21, delayStr); } } From d05bf5cea5d8e21c22d8ccba28e3de220ef4c1d0 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 19:37:24 +0300 Subject: [PATCH 020/240] Fix crash on minecraft close from main menu --- .../Modules/ArrowCounter/ArrowListener.hpp | 20 +++++------ .../Module/Modules/PotCounter/PotListener.hpp | 18 +++++----- .../SpeedDisplay/SpeedDisplayListener.hpp | 35 +++---------------- 3 files changed, 22 insertions(+), 51 deletions(-) diff --git a/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp b/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp index 35c0760f..0b197ae1 100644 --- a/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp +++ b/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp @@ -19,13 +19,10 @@ class ArrowListener : public Listener { void onTick(TickEvent &event) override { - - } - - void onRender(RenderEvent &event) override { if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { if (SDK::clientInstance->getLocalPlayer()->playerInventory != nullptr) { + auto arrowsCount = 0; auto inventory = SDK::clientInstance->getLocalPlayer()->playerInventory->inventory; if(inventory == nullptr) return; @@ -34,7 +31,7 @@ class ArrowListener : public Listener { if(offhandItem != nullptr) if (offhandItem->getItem() != nullptr) if (offhandItem->getItem()->name == "arrow") - arrows = offhandItem->count; + arrowsCount = offhandItem->count; for (int i = 0; i < 36; i++) { @@ -42,22 +39,23 @@ class ArrowListener : public Listener { if (item->getItem() != nullptr) { if (item->getItem()->name == "arrow") { - arrows += item->count; + arrowsCount += item->count; } } } - auto arrowsStr = std::to_string(arrows); - - this->module->normalRender(13, arrowsStr); - - arrows = 0; + arrows = arrowsCount; } } } } + void onRender(RenderEvent &event) override { + auto arrowsStr = std::to_string(arrows); + this->module->normalRender(13, arrowsStr); + } + public: explicit ArrowListener(const char string[5], Module *module) { this->name = string; diff --git a/src/Client/Module/Modules/PotCounter/PotListener.hpp b/src/Client/Module/Modules/PotCounter/PotListener.hpp index 9d639b54..3698fda1 100644 --- a/src/Client/Module/Modules/PotCounter/PotListener.hpp +++ b/src/Client/Module/Modules/PotCounter/PotListener.hpp @@ -20,12 +20,9 @@ class PotListener : public Listener { void onTick(TickEvent& event) override { - - } - - void onRender(RenderEvent& event) override { if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { + auto potsCount = 0; if (SDK::clientInstance->getLocalPlayer()->playerInventory != nullptr) { auto inventory = SDK::clientInstance->getLocalPlayer()->playerInventory->inventory; @@ -35,22 +32,23 @@ class PotListener : public Listener { if (item->getItem() != nullptr) { if (item->getItem()->name == "splash_potion") { - pots++; + potsCount++; } } } } - auto potsStr = std::to_string(pots); - - this->module->normalRender(14, potsStr); - - pots = 0; + pots = potsCount; } } } } + void onRender(RenderEvent& event) override { + auto potsStr = std::to_string(pots); + this->module->normalRender(14, potsStr); + } + public: explicit PotListener(const char string[5], Module* module) { this->name = string; diff --git a/src/Client/Module/Modules/SpeedDisplay/SpeedDisplayListener.hpp b/src/Client/Module/Modules/SpeedDisplay/SpeedDisplayListener.hpp index f5af3084..0e72bc80 100644 --- a/src/Client/Module/Modules/SpeedDisplay/SpeedDisplayListener.hpp +++ b/src/Client/Module/Modules/SpeedDisplay/SpeedDisplayListener.hpp @@ -18,44 +18,19 @@ class SpeedDisplayListener : public Listener { Vec3 PrevPos; std::string speed; - bool toes = false; - int interval = 50; //ms void onRender(RenderEvent &event) override { - if ( - module->isEnabled() && - SDK::hasInstanced && SDK::clientInstance != nullptr && - SDK::clientInstance->getLocalPlayer() != nullptr - ) - this->module->normalRender(15, speed); + this->module->normalRender(15, speed); } - void update() { - if ( - module->isEnabled() && - SDK::hasInstanced && SDK::clientInstance != nullptr && - SDK::clientInstance->getLocalPlayer() != nullptr - ) { - if(SDK::clientInstance->getLocalPlayer()->getStateVectorComponent() != nullptr) - speed = std::format("{:.2f}", SDK::clientInstance->getLocalPlayer()->getStateVectorComponent()->Pos.dist(PrevPos) * 20); - } - }; - void onTick(TickEvent &event) override { if (!SDK::clientInstance->getLocalPlayer()) return; - - if (!toes) { - toes = true; - std::thread lol([&]() { - while (!Client::disable) { - update(); - Sleep(interval); - } - }); - lol.detach(); + auto stateVectorComponent = SDK::clientInstance->getLocalPlayer()->getStateVectorComponent(); + if(stateVectorComponent != nullptr) { + speed = std::format("{:.2f}", stateVectorComponent->Pos.dist(PrevPos) * 20); + PrevPos = stateVectorComponent->Pos; } - PrevPos = SDK::clientInstance->getLocalPlayer()->getStateVectorComponent()->Pos; } public: From 89be4b252d663e34cd030ea01a5e11b40a2bf4d7 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 21:46:09 +0300 Subject: [PATCH 021/240] No hurt cam fix --- .../Module/Modules/NoHurtCam/NoHurtCamListener.hpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp b/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp index 0c54b685..53f61141 100644 --- a/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp +++ b/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp @@ -49,21 +49,27 @@ class NoHurtCamListener : public Listener { } void onTick(TickEvent &event) override { - if (module->isEnabled() && !module->restricted) { + if (!module->restricted) { patch(); } else { unpatch(); } } + void onUnregister() override { + unpatch(); + } + NoHurtCamListener(const char string[5], Module *module) { this->name = string; this->module = module; originalCameraAngle.resize(3); - sigOffset = Memory::findSig(GET_SIG("CameraAssignAngle")) + 4; + if(sigOffset == NULL) { + sigOffset = Memory::findSig(GET_SIG("CameraAssignAngle")) + 4; + } - memcpy(originalCameraAngle.data(), (LPVOID) sigOffset, 3); + Memory::patchBytes( originalCameraAngle.data(), (LPVOID)sigOffset, 3); } }; \ No newline at end of file From f407ea708991d28d2ad0a15ac3fbde905f4c0b18 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Fri, 2 Aug 2024 14:06:23 +0600 Subject: [PATCH 022/240] ok --- main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/main.cpp b/main.cpp index 9c74e4f8..ac2d26db 100644 --- a/main.cpp +++ b/main.cpp @@ -49,7 +49,7 @@ DWORD WINAPI init(HMODULE real) if(elapsed >= std::chrono::seconds(60)) { std::string name = SDK::clientInstance->getLocalPlayer()->playerName; - /* + ModuleManager::onlineUsers.clear(); ModuleManager::onlineUsers.push_back(Utils::removeColorCodes(name)); std::string pp = DownloadString("https://api.flarial.synthetix.host/users"); @@ -82,7 +82,6 @@ DWORD WINAPI init(HMODULE real) continue; } } - */ std::string ipToSend = SDK::getServerIP(); From c771a237cc7388a3cef9b637c7f96d2d11f55c1e Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 3 Aug 2024 15:57:28 +0600 Subject: [PATCH 023/240] structure --- src/Client/Module/Modules/Module.hpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index 45f3b244..2bc67d04 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -39,6 +39,7 @@ class Module { bool active = false; bool restricted = false; bool terminating = false; + float padding = 0; public: @@ -228,6 +229,15 @@ class Module { } + void resetPadding () { + padding = 0; + } + + void addToggle(std::string text, std::string subtext, bool& value) { + //FlarialGUI::Toggle + //padding += ...... + } + virtual void settingsRender() {} bool isKeybind(const std::array &keys) { From 43753a00bd2e4be05a9ef75d7feef8ff57c3dab7 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 3 Aug 2024 19:44:13 +0600 Subject: [PATCH 024/240] Settings --- .../Engine/Elements/Control/Toggle/Toggle.cpp | 4 +- .../Modules/ClickGUI/ClickGUIRenderer.hpp | 38 +-- .../Modules/ComboCounter/ComboCounter.hpp | 231 +----------------- src/Client/Module/Modules/Module.cpp | 17 +- src/Client/Module/Modules/Module.hpp | 44 +++- 5 files changed, 74 insertions(+), 260 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp b/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp index 73d55321..ece5efe9 100644 --- a/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp @@ -152,8 +152,8 @@ bool FlarialGUI::Toggle(int index, float x, float y, bool isEnabled, bool rgb) { float circleHeight = Constraints::RelativeConstraint(0.02, "height", true); - float ySpacing = Constraints::SpacingConstraint(0.2, circleHeight); - float xSpacing = Constraints::SpacingConstraint(0.2, circleWidth); + float ySpacing = Constraints::SpacingConstraint(0.2205f, circleHeight); + float xSpacing = Constraints::SpacingConstraint(0.2f, circleWidth); round = Constraints::RoundingConstraint(23, 23); float enabledSpacing; diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 850fafe2..a279e4d5 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -127,15 +127,9 @@ class ClickGUIRenderer : public Listener { float baseWidth = Constraints::RelativeConstraint(0.85); if (module->active) { - if (ClickGUIRenderer::page.type == "settings" || curr == "settings") { - FlarialGUI::lerp(baseHeightReal, 0.50f, 0.28f * floorf(FlarialGUI::frameFactor * 100.0f) / 100.0f); + FlarialGUI::lerp(baseHeightReal, 0.64f, 0.28f * floorf(FlarialGUI::frameFactor * 100.0f) / 100.0f); - //FadeEffect::ApplyFadeOutEffect(0.015f * FlarialGUI::frameFactor, baseHeightReal, 0.35f); - } else { - FlarialGUI::lerp(baseHeightReal, 0.64f, 0.28f * floorf(FlarialGUI::frameFactor * 100.0f) / 100.0f); - //FadeEffect::ApplyFadeInEffect(0.015f * FlarialGUI::frameFactor, 0.64f, baseHeightReal); - } } float baseHeight = Constraints::RelativeConstraint(baseHeightReal); @@ -162,9 +156,9 @@ class ClickGUIRenderer : public Listener { /* Nav Bar Start */ float navigationBarWidth = Constraints::RelativeConstraint(1.293f); - float navigationBarHeight = Constraints::RelativeConstraint(0.134f); + float navigationBarHeight = Constraints::RelativeConstraint(0.124f); float navx = Constraints::PercentageConstraint(0.013f, "left"); - float navy = Constraints::PercentageConstraint(0.016f, "top"); + float navy = Constraints::PercentageConstraint(0.019f, "top"); round = Constraints::RoundingConstraint(28, 28); D2D1_COLOR_F navColor = colors_secondary2_rgb ? FlarialGUI::rgbColor : colors_secondary2; @@ -459,7 +453,7 @@ class ClickGUIRenderer : public Listener { float rectX = Constraints::PercentageConstraint(0.01, "left"); float rectY = Constraints::PercentageConstraint(0.20, "top"); float rectWidth = Constraints::RelativeConstraint(0.965, "width"); - float rectHeight = Constraints::RelativeConstraint(0.755); + float rectHeight = Constraints::RelativeConstraint(0.6); float scrollWidth = Constraints::RelativeConstraint(1.12); float scrollHeight = Constraints::RelativeConstraint(1.3); @@ -469,7 +463,7 @@ class ClickGUIRenderer : public Listener { const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); round = Constraints::RoundingConstraint(50, 50); - float anotherRectHeight = Constraints::RelativeConstraint(0.785); + float anotherRectHeight = Constraints::RelativeConstraint(0.6); float anotherRectWidth = Constraints::RelativeConstraint(0.981, "width"); D2D1_COLOR_F iRanOutOfNamesToCallTheseColors = colors_secondary2_rgb ? FlarialGUI::rgbColor @@ -749,14 +743,14 @@ class ClickGUIRenderer : public Listener { FlarialGUI::PushSize(center.x, center.y, baseWidth, baseHeight); - float rectX = Constraints::PercentageConstraint(0.01, "left"); - float rectY = Constraints::PercentageConstraint(0.20, "top"); + float rectX = Constraints::PercentageConstraint(0.015, "left"); + float rectY = Constraints::PercentageConstraint(0.167, "top"); float rectWidth = Constraints::RelativeConstraint(0.965, "width"); - float rectHeight = Constraints::RelativeConstraint(0.755); - round = Constraints::RoundingConstraint(50, 50); + float rectHeight = Constraints::RelativeConstraint(0.85); + round = Constraints::RoundingConstraint(38.f, 38.5f); - float anotherRectHeight = Constraints::RelativeConstraint(0.785); - float anotherRectWidth = Constraints::RelativeConstraint(0.981, "width"); + float anotherRectHeight = Constraints::RelativeConstraint(0.8105); + float anotherRectWidth = Constraints::RelativeConstraint(0.972, "width"); D2D1_COLOR_F colorThing = colors_secondary2_rgb ? FlarialGUI::rgbColor : colors_secondary2; colorThing.a = o_colors_secondary2; @@ -770,12 +764,6 @@ class ClickGUIRenderer : public Listener { D2D1_COLOR_F textCol = colors_text_rgb ? FlarialGUI::rgbColor : colors_text; textCol.a = o_colors_text; - round = Constraints::RoundingConstraint(40, 40); - FlarialGUI::RoundedRect(rectX + Constraints::SpacingConstraint(0.0085, rectWidth), - rectY + Constraints::SpacingConstraint(0.01, rectWidth), - bruv, rectWidth, - rectHeight, round.x, round.x); - FlarialGUI::PopSize(); FlarialGUI::PushSize(rectX + Constraints::SpacingConstraint(0.0085, rectWidth), @@ -811,7 +799,7 @@ class ClickGUIRenderer : public Listener { if (FlarialGUI::RoundedButton(0, spacingX + centered.first + rectX, - thingYes.second + rectHeight + rectY + Constraints::RelativeConstraint(0.09), colorThing, textCol, L"Reset", + thingYes.second + rectHeight + rectY - Constraints::RelativeConstraint(0.06f), colorThing, textCol, L"Reset", buttonWidth, buttonHeight, round.x, round.x)) { auto currentModule = ModuleManager::getModule(ClickGUIRenderer::page.module); bool wasEnabled = module->isEnabled(); @@ -824,7 +812,7 @@ class ClickGUIRenderer : public Listener { if (FlarialGUI::RoundedButton(1, -spacingX + centered.first + rectX + childWidth - buttonWidth, - thingYes.second + rectHeight + rectY + Constraints::RelativeConstraint(0.09), colorThing, textCol, + thingYes.second + rectHeight + rectY - Constraints::RelativeConstraint(0.06f), colorThing, textCol, L"Copy From", buttonWidth, buttonHeight, round.x, round.x)) { } diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index 8d967f0a..79b8569d 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -37,239 +37,20 @@ class ComboCounter : public Module { float toggleX = Constraints::PercentageConstraint(0.019, "left"); float toggleY = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); + + FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), Constraints::RelativeConstraint(1.0f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); - - this->settings.getSettingByName("uiscale")->value = percent; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; - - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - - percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Border ") + - Constraints::SpacingConstraint(0.60, textWidth), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); - - this->settings.getSettingByName("borderWidth")->value = percent; - - /* Border End */ - - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addToggle("funny", "im just trolling", settings.getSettingByName("border")->value); + this->addToggle("NO MORE TROLLING.....", "", settings.getSettingByName("reversepaddingx")->value); - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->resetPadding(); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index cf43790c..eeeb6525 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -54,6 +54,19 @@ void Module::normalRender(int index, std::string &value) { ); float realspacing = Constraints::SpacingConstraint(0.05f, textWidth); + + std::string rname = FlarialGUI::FlarialTextWithFont(0,0, + FlarialGUI::to_wide(text).c_str(), + 1000000, + textHeight, + alignment, + textSize, DWRITE_FONT_WEIGHT_NORMAL, + D2D1::ColorF(0, 0, 0 ,0), + true +); + + Lname = rname; + float rectWidth = (!responsivewidth ? (Constraints::RelativeConstraint( 0.225f * settings.getSettingByName("uiscale")->value) * @@ -137,7 +150,7 @@ void Module::normalRender(int index, std::string &value) { rounde.x ); - std::string rname = FlarialGUI::FlarialTextWithFont( + FlarialGUI::FlarialTextWithFont( realcenter.x + Constraints::SpacingConstraint(paddingX, textWidth), realcenter.y + Constraints::SpacingConstraint(paddingY, textWidth), FlarialGUI::to_wide(text).c_str(), @@ -149,8 +162,6 @@ void Module::normalRender(int index, std::string &value) { true ); - Lname = rname; - if (this->settings.getSettingByName("border")->value) { FlarialGUI::RoundedHollowRect( realcenter.x, diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index 2bc67d04..e5a4ca25 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -35,13 +35,17 @@ class Module { loadSettings(); } -public: bool active = false; bool restricted = false; bool terminating = false; - float padding = 0; -public: + float padding = 0; + int toggleIndex = 0; + int sliderIndex = 0; + int dropdownIndex = 0; + int textboxIndex = 0; + int keybindIndex = 0; + int colorPickerIndex = 0; virtual void loadDefaults() { settings.reset(); @@ -231,11 +235,41 @@ class Module { void resetPadding () { padding = 0; + toggleIndex = 0; + dropdownIndex = 0; + sliderIndex = 0; + colorPickerIndex = 0; + keybindIndex = 0; + textboxIndex = 0; } void addToggle(std::string text, std::string subtext, bool& value) { - //FlarialGUI::Toggle - //padding += ...... + + float x = Constraints::PercentageConstraint(0.019, "left"); + float elementX = Constraints::PercentageConstraint(0.119f, "right"); + float y = Constraints::PercentageConstraint(0.10, "top") + padding; + + if(FlarialGUI::Toggle(toggleIndex, elementX, y, value, false)) value = !value; + + float textX = x; + float textY = y - Constraints::RelativeConstraint(0.087f, "height", true); // For some reason, if you do not do this minus, the spacing is way bigger than expected. + float subtextY; + float fontSize = Constraints::RelativeConstraint(0.132f, "height", true); + + if(!subtext.empty()) { + subtextY = textY; + textY -= Constraints::RelativeConstraint(0.009f, "height", true); + subtextY += Constraints::RelativeConstraint(0.009f, "height", true); + } else { + textY += Constraints::RelativeConstraint(0.0015f, "height", true); + } + + FlarialGUI::FlarialTextWithFont(textX, textY, FlarialGUI::to_wide(text).c_str(), 200, 200, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_MEDIUM, false); + if(!subtext.empty()) FlarialGUI::FlarialTextWithFont(textX, subtextY, FlarialGUI::to_wide(subtext).c_str(), 200, 200, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_MEDIUM, FlarialGUI::HexToColorF("473b3d"), false); + + + padding += Constraints::RelativeConstraint(0.05f, "height", true); + toggleIndex++; } virtual void settingsRender() {} From ea1e2d3d8370dbde0494591a6e39f62972ff3fa6 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 3 Aug 2024 23:55:14 +0800 Subject: [PATCH 025/240] smooth toggles --- .../Engine/Elements/Control/Toggle/Toggle.cpp | 99 +----- src/Client/Module/Modules/Module.cpp | 280 ++++++++++++++++ src/Client/Module/Modules/Module.hpp | 298 ++---------------- 3 files changed, 315 insertions(+), 362 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp b/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp index ece5efe9..46e0198a 100644 --- a/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp @@ -37,81 +37,10 @@ #define colors_secondary7_rgb clickgui->settings.getSettingByName("colors_secondary7_rgb")->value bool FlarialGUI::Toggle(int index, float x, float y, bool isEnabled) { - - D2D1_COLOR_F disabledColor = colors_primary3_rgb ? rgbColor : colors_primary3; - D2D1_COLOR_F enabledColor = colors_primary1_rgb ? rgbColor : colors_primary1; - D2D1_COLOR_F circleColor = colors_primary2_rgb ? rgbColor : colors_primary2; - - disabledColor.a = o_colors_primary3; - enabledColor.a = o_colors_primary1; - circleColor.a = o_colors_primary2; - - if (shouldAdditionalY) { - - for (int i = 0; i < highestAddIndexes + 1; i++) { - if (FlarialGUI::DropDownMenus[i].isActive && i <= additionalIndex) { - y += additionalY[i]; - } - } - } - - const bool isAdditionalY = shouldAdditionalY; - float rectWidth = Constraints::RelativeConstraint(0.062, "height", true); - float rectHeight = Constraints::RelativeConstraint(0.03, "height", true); - - Vec2 round = Constraints::RoundingConstraint(30, 30); - - if (isAdditionalY) UnSetIsInAdditionalYMode(); - - if (isEnabled) { - toggleColors[index] = FlarialGUI::LerpColor(toggleColors[index], enabledColor, 0.10f * FlarialGUI::frameFactor); - } else { - toggleColors[index] = FlarialGUI::LerpColor(toggleColors[index], disabledColor, - 0.10f * FlarialGUI::frameFactor); - } - - FlarialGUI::RoundedRect(x, y, toggleColors[index], rectWidth, rectHeight, round.x, round.x); - - // the circle (I KNOW IM USING A RECT LOL) - - float circleWidth = Constraints::RelativeConstraint(0.0202, "height", true); - float circleHeight = Constraints::RelativeConstraint(0.02, "height", true); - - - float ySpacing = Constraints::SpacingConstraint(0.2, circleHeight); - float xSpacing = Constraints::SpacingConstraint(0.2, circleWidth); - round = Constraints::RoundingConstraint(23, 23); - - float enabledSpacing; - - if (isEnabled) { - FadeEffect::ApplyFadeInEffect(2.4f * FlarialGUI::frameFactor, Constraints::SpacingConstraint(1.6, circleWidth), - FlarialGUI::toggleSpacings[index]); - enabledSpacing = FlarialGUI::toggleSpacings[index]; - if (enabledSpacing > Constraints::SpacingConstraint(1.6, circleWidth)) - enabledSpacing = Constraints::SpacingConstraint(1.6, circleWidth); - } else { - FadeEffect::ApplyFadeOutEffect(2.4f * FlarialGUI::frameFactor, FlarialGUI::toggleSpacings[index]); - enabledSpacing = FlarialGUI::toggleSpacings[index]; - } - - FlarialGUI::RoundedRect(x + xSpacing + enabledSpacing, y + ySpacing, circleColor, circleWidth, circleHeight, - round.x, round.x); - - if (isAdditionalY) SetIsInAdditionalYMode(); - - if (isInScrollView) y += FlarialGUI::scrollpos; - if (CursorInRect(x, y, rectWidth, rectHeight) && MC::mouseButton == MouseButton::Left && !MC::held && - (!activeColorPickerWindows || index == 123)) { - MC::mouseButton = MouseButton::None; - return true; - } - - return false; + return FlarialGUI::Toggle(index, x, y, isEnabled, false); } bool FlarialGUI::Toggle(int index, float x, float y, bool isEnabled, bool rgb) { - D2D1_COLOR_F disabledColor = colors_primary3; D2D1_COLOR_F enabledColor = colors_primary1; D2D1_COLOR_F circleColor = colors_primary2; @@ -121,7 +50,6 @@ bool FlarialGUI::Toggle(int index, float x, float y, bool isEnabled, bool rgb) { circleColor.a = o_colors_primary2; if (shouldAdditionalY) { - for (int i = 0; i < highestAddIndexes + 1; i++) { if (FlarialGUI::DropDownMenus[i].isActive && i <= additionalIndex) { y += additionalY[i]; @@ -130,8 +58,10 @@ bool FlarialGUI::Toggle(int index, float x, float y, bool isEnabled, bool rgb) { } const bool isAdditionalY = shouldAdditionalY; - float rectWidth = Constraints::RelativeConstraint(0.062, "height", true); - float rectHeight = Constraints::RelativeConstraint(0.03, "height", true); + float rectWidth = Constraints::RelativeConstraint(0.058, "height", true); + float rectHeight = Constraints::RelativeConstraint(0.027, "height", true); + + y -= rectHeight / 2.0f; Vec2 round = Constraints::RoundingConstraint(30, 30); @@ -140,32 +70,31 @@ bool FlarialGUI::Toggle(int index, float x, float y, bool isEnabled, bool rgb) { if (isEnabled) { toggleColors[index] = FlarialGUI::LerpColor(toggleColors[index], enabledColor, 0.10f * FlarialGUI::frameFactor); } else { - toggleColors[index] = FlarialGUI::LerpColor(toggleColors[index], disabledColor, - 0.10f * FlarialGUI::frameFactor); + toggleColors[index] = FlarialGUI::LerpColor(toggleColors[index], disabledColor, 0.10f * FlarialGUI::frameFactor); } FlarialGUI::RoundedRect(x, y, rgb ? rgbColor : toggleColors[index], rectWidth, rectHeight, round.x, round.x); // the circle (I KNOW IM USING A RECT LOL) - float circleWidth = Constraints::RelativeConstraint(0.0202, "height", true); - float circleHeight = Constraints::RelativeConstraint(0.02, "height", true); - + float circleWidth = Constraints::SpacingConstraint(0.7, rectHeight); + float circleHeight = Constraints::SpacingConstraint(0.7, rectHeight); - float ySpacing = Constraints::SpacingConstraint(0.2205f, circleHeight); + float ySpacing = Constraints::SpacingConstraint(0.2f, circleHeight); float xSpacing = Constraints::SpacingConstraint(0.2f, circleWidth); round = Constraints::RoundingConstraint(23, 23); float enabledSpacing; if (isEnabled) { - FadeEffect::ApplyFadeInEffect(2.4f * FlarialGUI::frameFactor, Constraints::SpacingConstraint(1.6, circleWidth), - FlarialGUI::toggleSpacings[index]); + FlarialGUI::lerp(FlarialGUI::toggleSpacings[index], Constraints::SpacingConstraint(1.6, circleWidth), 0.25f * FlarialGUI::frameFactor); + //FadeEffect::ApplyFadeInEffect(2.4f * FlarialGUI::frameFactor, Constraints::SpacingConstraint(1.6, circleWidth),FlarialGUI::toggleSpacings[index]); enabledSpacing = FlarialGUI::toggleSpacings[index]; if (enabledSpacing > Constraints::SpacingConstraint(1.6, circleWidth)) - enabledSpacing = Constraints::SpacingConstraint(1.6, circleWidth); + enabledSpacing = Constraints::SpacingConstraint(1.6, circleWidth); } else { - FadeEffect::ApplyFadeOutEffect(2.4f * FlarialGUI::frameFactor, FlarialGUI::toggleSpacings[index]); + FlarialGUI::lerp(FlarialGUI::toggleSpacings[index], 0.0f, 0.25f * FlarialGUI::frameFactor); + //FadeEffect::ApplyFadeOutEffect(2.4f * FlarialGUI::frameFactor, FlarialGUI::toggleSpacings[index]); enabledSpacing = FlarialGUI::toggleSpacings[index]; } diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index eeeb6525..b59ca04c 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -186,3 +186,283 @@ void Module::normalRender(int index, std::string &value) { FlarialGUI::UnsetWindowRect(); } +void Module::resetPadding() { + padding = 0; + toggleIndex = 0; + dropdownIndex = 0; + sliderIndex = 0; + colorPickerIndex = 0; + keybindIndex = 0; + textboxIndex = 0; +} + +void Module::addToggle(std::string text, std::string subtext, bool& value) { + float x = Constraints::PercentageConstraint(0.019, "left"); + float elementX = Constraints::PercentageConstraint(0.119f, "right"); + float y = Constraints::PercentageConstraint(0.10, "top") + padding; + + if (FlarialGUI::Toggle(toggleIndex, elementX, y, value, false)) value = !value; + + float textX = x; + float textY = y; // For some reason, if you do not do this minus, the spacing is way bigger than expected. + float subtextY; + float fontSize = Constraints::RelativeConstraint(0.155f, "height", true); + float fontSize2 = Constraints::RelativeConstraint(0.132f, "height", true); + + if (!subtext.empty()) { + subtextY = textY; + textY -= Constraints::RelativeConstraint(0.009f, "height", true); + subtextY += Constraints::RelativeConstraint(0.009f, "height", true); + } + else { + textY += Constraints::RelativeConstraint(0.0015f, "height", true); + } + + FlarialGUI::FlarialTextWithFont(textX, textY, FlarialGUI::to_wide(text).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_MEDIUM, false); + if (!subtext.empty()) FlarialGUI::FlarialTextWithFont(textX, subtextY, FlarialGUI::to_wide(subtext).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize2, DWRITE_FONT_WEIGHT_MEDIUM, FlarialGUI::HexToColorF("473b3d"), false); + + + padding += Constraints::RelativeConstraint(0.05f, "height", true); + toggleIndex++; +} + +void Module::loadDefaults() { + settings.reset(); + setup(); +} + +void Module::saveSettings() const { + try { + std::ofstream outputFile(settingspath); + if (outputFile.is_open()) { + std::string jsonString = settings.ToJson(); + outputFile << jsonString; + outputFile.close(); + } + else { + Logger::error("Failed to open file. Maybe it doesn't exist?: " + settingspath); + } + } + catch (const std::exception& ex) { + Logger::error(ex.what()); + } +} + +void Module::loadSettings() { + std::ifstream inputFile(settingspath); + std::stringstream ss; + + if (inputFile.is_open()) { + ss << inputFile.rdbuf(); + inputFile.close(); + } + else { + Logger::error("File could not be opened. Maybe it doesn't exist?: " + settingspath); + return; + } + + std::string settingstring = ss.str(); + settings.FromJson(settingstring); +} + +void Module::checkSettingsFile() const { + + if (!std::filesystem::exists(settingspath)) { + + std::filesystem::path filePath(settingspath); + std::filesystem::create_directories(filePath.parent_path()); + + HANDLE fileHandle = CreateFileA(settingspath.c_str(), GENERIC_WRITE | GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + + if (fileHandle == INVALID_HANDLE_VALUE) { + Logger::error("Failed to create file: " + settingspath); + return; + } + + CloseHandle(fileHandle); + } +} + +void Module::toggle() { + bool& enabled = settings.getSettingByName("enabled")->value; + enabled = !enabled; + if (enabled) { + onEnable(); + } + else { + onDisable(); + } +} + +void Module::setup() { + defaultConfig(); + Module::defaultConfig(); + onSetup(); + // TODO: might call on enable twice + if (settings.getSettingByName("enabled")->value) + onEnable(); +} + +void Module::onSetup() { } + +// TODO: rename to Enable/Disable? +void Module::onEnable() { + settings.getSettingByName("enabled")->value = true; + saveSettings(); +} + +void Module::onDisable() { + active = false; + if (!terminating) { + settings.getSettingByName("enabled")->value = false; + } + saveSettings(); +} + +void Module::terminate() { + terminating = true; + onDisable(); + active = false; + settings.getSettingByName("enabled")->value = false; +} + +// TODO: find all getSettingByName("enabled")->value and replace!!! +bool Module::isEnabled() { + return settings.getSettingByName("enabled")->value; +} + +void Module::setEnabled(bool enabled) { + settings.getSettingByName("enabled")->value = enabled; +} + +void Module::setKeybind(const std::string& newKeybind) { + auto key = settings.getSettingByName("keybind"); + if (key == nullptr) + settings.addSetting("keybind", newKeybind); +} + +std::string& Module::getKeybind() { + auto key = settings.getSettingByName("keybind"); + if (key == nullptr) + settings.addSetting("keybind", defaultKeybind); + return settings.getSettingByName("keybind")->value; +} + +void Module::defaultConfig() { + + getKeybind(); + + if (settings.getSettingByName("enabled") == nullptr) { + settings.addSetting("enabled", false); + } + + if (settings.getSettingByName("percentageX") == nullptr) { + settings.addSetting("percentageX", 0.0f); + settings.addSetting("percentageY", 0.0f); + } + + if (settings.getSettingByName("border") == nullptr) { + settings.addSetting("border", false); + settings.addSetting("borderWidth", 1.0f); + } + + if (settings.getSettingByName("reversepaddingx") == nullptr) + settings.addSetting("reversepaddingx", false); + if (settings.getSettingByName("reversepaddingy") == nullptr) + settings.addSetting("reversepaddingy", false); + if (settings.getSettingByName("padx") == nullptr) settings.addSetting("padx", 0.0f); + if (settings.getSettingByName("pady") == nullptr) settings.addSetting("pady", 0.0f); + if (settings.getSettingByName("rectwidth") == nullptr) settings.addSetting("rectwidth", 1.0f); + if (settings.getSettingByName("rectheight") == nullptr) settings.addSetting("rectheight", 1.0f); + if (settings.getSettingByName("responsivewidth") == nullptr) + settings.addSetting("responsivewidth", false); + if (settings.getSettingByName("textalignment") == nullptr) + settings.addSetting("textalignment", (std::string)"Center"); + + if (settings.getSettingByName("rounding") == nullptr) settings.addSetting("rounding", 32.0f); + + if (settings.getSettingByName("bgColor") == nullptr) { + settings.addSetting("bgColor", (std::string)"000000"); + settings.addSetting("textColor", (std::string)"fafafa"); + settings.addSetting("borderColor", (std::string)"000000"); + } + + if (settings.getSettingByName("bgOpacity") == nullptr) { + settings.addSetting("bgOpacity", 0.55f); + settings.addSetting("textOpacity", 1.0f); + settings.addSetting("borderOpacity", 1.0f); + } + + if (settings.getSettingByName("bgRGB") == nullptr) { + settings.addSetting("bgRGB", false); + settings.addSetting("textRGB", false); + settings.addSetting("borderRGB", false); + } + + if (settings.getSettingByName("uiscale") == nullptr) { + + settings.addSetting("uiscale", 0.65f); + } + + if (settings.getSettingByName("rotation") == nullptr) { + settings.addSetting("rotation", 0.0f); + } + + if (settings.getSettingByName("BlurEffect") == nullptr) { + settings.addSetting("BlurEffect", false); + } + +} + +bool Module::isKeybind(const std::array& keys) { + + std::vector keyCodes = Utils::getStringAsKeys(getKeybind()); + + for (int keyCode : keyCodes) { + if (!keys[keyCode]) { + // Key is not being held down + return false; + } + } + // TODO: in menu should also mean in Edit Mode, when edit mode all modules set to active(visible? add visible setting (for TAB)) + if (name != "ClickGUI") + if (FlarialGUI::inMenu) return false; + if (SDK::currentScreen == "chat_screen") return false; + bool allInactive = std::ranges::all_of(FlarialGUI::TextBoxes, [](const TextBoxStruct& i) { + return !i.isActive; + }); + // All keys in the keybind are being held down + return allInactive; +} + +[[nodiscard]] bool Module::isAdditionalKeybind(const std::array& keys, const std::string& bind) const { + std::vector keyCodes = Utils::getStringAsKeys(bind); + + for (int keyCode : keyCodes) { + if (!keys[keyCode]) { + + // Key is not being held down + return false; + } + } + if (name != "ClickGUI") + if (FlarialGUI::inMenu) return false; + if (SDK::currentScreen == "chat_screen") return false; + bool allInactive = std::ranges::all_of(FlarialGUI::TextBoxes, [](const TextBoxStruct& i) { + return !i.isActive; + }); + // All keys in the keybind are being held down + return allInactive; +} + +bool Module::isKeyPartOfKeybind(int keyCode) { + std::vector keyCodes = Utils::getStringAsKeys(getKeybind()); + return std::find(keyCodes.begin(), keyCodes.end(), keyCode) != keyCodes.end(); +} + +bool Module::isKeyPartOfAdditionalKeybind(int keyCode, const std::string& bind) { + std::vector keyCodes = Utils::getStringAsKeys(bind); + return std::find(keyCodes.begin(), keyCodes.end(), keyCode) != keyCodes.end(); +} \ No newline at end of file diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index e5a4ca25..965e961b 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -47,283 +47,27 @@ class Module { int keybindIndex = 0; int colorPickerIndex = 0; - virtual void loadDefaults() { - settings.reset(); - setup(); - } - - void saveSettings() const { - try { - std::ofstream outputFile(settingspath); - if (outputFile.is_open()) { - std::string jsonString = settings.ToJson(); - outputFile << jsonString; - outputFile.close(); - } else { - Logger::error("Failed to open file. Maybe it doesn't exist?: " + settingspath); - } - } catch (const std::exception &ex) { - Logger::error(ex.what()); - } - } - - void loadSettings() { - std::ifstream inputFile(settingspath); - std::stringstream ss; - - if (inputFile.is_open()) { - ss << inputFile.rdbuf(); - inputFile.close(); - } else { - Logger::error("File could not be opened. Maybe it doesn't exist?: " + settingspath); - return; - } - - std::string settingstring = ss.str(); - settings.FromJson(settingstring); - } - - void checkSettingsFile() const { - - if (!std::filesystem::exists(settingspath)) { - - std::filesystem::path filePath(settingspath); - std::filesystem::create_directories(filePath.parent_path()); - - HANDLE fileHandle = CreateFileA(settingspath.c_str(), GENERIC_WRITE | GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); - - if (fileHandle == INVALID_HANDLE_VALUE) { - Logger::error("Failed to create file: " + settingspath); - return; - } - - CloseHandle(fileHandle); - } - } - - virtual void toggle() { - bool &enabled = settings.getSettingByName("enabled")->value; - enabled = !enabled; - if (enabled) { - onEnable(); - } else { - onDisable(); - } - } - - virtual void setup() { - defaultConfig(); - Module::defaultConfig(); - onSetup(); - // TODO: might call on enable twice - if(settings.getSettingByName("enabled")->value) - onEnable(); - } - - virtual void onSetup() { } - - // TODO: rename to Enable/Disable? - virtual void onEnable() { - settings.getSettingByName("enabled")->value = true; - saveSettings(); - } - - virtual void onDisable() { - active = false; - if(!terminating) { - settings.getSettingByName("enabled")->value = false; - } - saveSettings(); - } - - virtual void terminate() { - terminating = true; - onDisable(); - active = false; - settings.getSettingByName("enabled")->value = false; - } - - // TODO: find all getSettingByName("enabled")->value and replace!!! - bool isEnabled() { - return settings.getSettingByName("enabled")->value; - } - - void setEnabled(bool enabled) { - settings.getSettingByName("enabled")->value = enabled; - } - - void setKeybind(const std::string& newKeybind) { - auto key = settings.getSettingByName("keybind"); - if(key == nullptr) - settings.addSetting("keybind", newKeybind); - } - - std::string& getKeybind() { - auto key = settings.getSettingByName("keybind"); - if(key == nullptr) - settings.addSetting("keybind", defaultKeybind); - return settings.getSettingByName("keybind")->value; - } - - virtual void defaultConfig() { - - getKeybind(); - - if (settings.getSettingByName("enabled") == nullptr) { - settings.addSetting("enabled", false); - } - - if (settings.getSettingByName("percentageX") == nullptr) { - settings.addSetting("percentageX", 0.0f); - settings.addSetting("percentageY", 0.0f); - } - - if (settings.getSettingByName("border") == nullptr) { - settings.addSetting("border", false); - settings.addSetting("borderWidth", 1.0f); - } - - if (settings.getSettingByName("reversepaddingx") == nullptr) - settings.addSetting("reversepaddingx", false); - if (settings.getSettingByName("reversepaddingy") == nullptr) - settings.addSetting("reversepaddingy", false); - if (settings.getSettingByName("padx") == nullptr) settings.addSetting("padx", 0.0f); - if (settings.getSettingByName("pady") == nullptr) settings.addSetting("pady", 0.0f); - if (settings.getSettingByName("rectwidth") == nullptr) settings.addSetting("rectwidth", 1.0f); - if (settings.getSettingByName("rectheight") == nullptr) settings.addSetting("rectheight", 1.0f); - if (settings.getSettingByName("responsivewidth") == nullptr) - settings.addSetting("responsivewidth", false); - if (settings.getSettingByName("textalignment") == nullptr) - settings.addSetting("textalignment", (std::string) "Center"); - - if (settings.getSettingByName("rounding") == nullptr) settings.addSetting("rounding", 32.0f); - - if (settings.getSettingByName("bgColor") == nullptr) { - settings.addSetting("bgColor", (std::string) "000000"); - settings.addSetting("textColor", (std::string) "fafafa"); - settings.addSetting("borderColor", (std::string) "000000"); - } - - if (settings.getSettingByName("bgOpacity") == nullptr) { - settings.addSetting("bgOpacity", 0.55f); - settings.addSetting("textOpacity", 1.0f); - settings.addSetting("borderOpacity", 1.0f); - } - - if (settings.getSettingByName("bgRGB") == nullptr) { - settings.addSetting("bgRGB", false); - settings.addSetting("textRGB", false); - settings.addSetting("borderRGB", false); - } - - if (settings.getSettingByName("uiscale") == nullptr) { - - settings.addSetting("uiscale", 0.65f); - } - - if (settings.getSettingByName("rotation") == nullptr) { - settings.addSetting("rotation", 0.0f); - } - - if (settings.getSettingByName("BlurEffect") == nullptr) { - settings.addSetting("BlurEffect", false); - } - - } - - void resetPadding () { - padding = 0; - toggleIndex = 0; - dropdownIndex = 0; - sliderIndex = 0; - colorPickerIndex = 0; - keybindIndex = 0; - textboxIndex = 0; - } - - void addToggle(std::string text, std::string subtext, bool& value) { - - float x = Constraints::PercentageConstraint(0.019, "left"); - float elementX = Constraints::PercentageConstraint(0.119f, "right"); - float y = Constraints::PercentageConstraint(0.10, "top") + padding; - - if(FlarialGUI::Toggle(toggleIndex, elementX, y, value, false)) value = !value; - - float textX = x; - float textY = y - Constraints::RelativeConstraint(0.087f, "height", true); // For some reason, if you do not do this minus, the spacing is way bigger than expected. - float subtextY; - float fontSize = Constraints::RelativeConstraint(0.132f, "height", true); - - if(!subtext.empty()) { - subtextY = textY; - textY -= Constraints::RelativeConstraint(0.009f, "height", true); - subtextY += Constraints::RelativeConstraint(0.009f, "height", true); - } else { - textY += Constraints::RelativeConstraint(0.0015f, "height", true); - } - - FlarialGUI::FlarialTextWithFont(textX, textY, FlarialGUI::to_wide(text).c_str(), 200, 200, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_MEDIUM, false); - if(!subtext.empty()) FlarialGUI::FlarialTextWithFont(textX, subtextY, FlarialGUI::to_wide(subtext).c_str(), 200, 200, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_MEDIUM, FlarialGUI::HexToColorF("473b3d"), false); - - - padding += Constraints::RelativeConstraint(0.05f, "height", true); - toggleIndex++; - } - + void resetPadding(); + void addToggle(std::string text, std::string subtext, bool& value); + virtual void loadDefaults(); + void saveSettings() const; + void loadSettings(); + void checkSettingsFile() const; + virtual void toggle(); + virtual void setup(); + virtual void onSetup(); + virtual void onEnable(); + virtual void onDisable(); + virtual void terminate(); + bool isEnabled(); + void setEnabled(bool enabled); + void setKeybind(const std::string& newKeybind); + std::string& getKeybind(); + virtual void defaultConfig(); virtual void settingsRender() {} - - bool isKeybind(const std::array &keys) { - - std::vector keyCodes = Utils::getStringAsKeys(getKeybind()); - - for (int keyCode: keyCodes) { - if (!keys[keyCode]) { - // Key is not being held down - return false; - } - } - // TODO: in menu should also mean in Edit Mode, when edit mode all modules set to active(visible? add visible setting (for TAB)) - if(name!="ClickGUI") - if (FlarialGUI::inMenu) return false; - if (SDK::currentScreen == "chat_screen") return false; - bool allInactive = std::ranges::all_of(FlarialGUI::TextBoxes, [](const TextBoxStruct& i) { - return !i.isActive; - }); - // All keys in the keybind are being held down - return allInactive; - } - - [[nodiscard]] bool isAdditionalKeybind(const std::array &keys, const std::string& bind) const { - std::vector keyCodes = Utils::getStringAsKeys(bind); - - for (int keyCode: keyCodes) { - if (!keys[keyCode]) { - - // Key is not being held down - return false; - } - } - if(name!="ClickGUI") - if (FlarialGUI::inMenu) return false; - if (SDK::currentScreen == "chat_screen") return false; - bool allInactive = std::ranges::all_of(FlarialGUI::TextBoxes, [](const TextBoxStruct& i) { - return !i.isActive; - }); - // All keys in the keybind are being held down - return allInactive; - } - - bool isKeyPartOfKeybind(int keyCode) { - std::vector keyCodes = Utils::getStringAsKeys(getKeybind()); - return std::find(keyCodes.begin(), keyCodes.end(), keyCode) != keyCodes.end(); - } - - static bool isKeyPartOfAdditionalKeybind(int keyCode, const std::string& bind) { - std::vector keyCodes = Utils::getStringAsKeys(bind); - return std::find(keyCodes.begin(), keyCodes.end(), keyCode) != keyCodes.end(); - } - + bool isKeybind(const std::array& keys); + [[nodiscard]] bool isAdditionalKeybind(const std::array& keys, const std::string& bind) const; + bool isKeyPartOfKeybind(int keyCode); + static bool isKeyPartOfAdditionalKeybind(int keyCode, const std::string& bind); virtual void normalRender(int index, std::string& value); }; \ No newline at end of file From b4f2a0466ad501bdb989f63bfa92366ee3f7b37f Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 3 Aug 2024 22:07:37 +0600 Subject: [PATCH 026/240] adjust size --- src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index a279e4d5..e007a2e6 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -190,7 +190,7 @@ class ClickGUIRenderer : public Listener { /* tab buttons start */ - float shit = Constraints::RelativeConstraint(0.395f); + float shit = Constraints::RelativeConstraint(0.448f); float RadioButtonWidth = Constraints::RelativeConstraint(0.134, "width"); float RadioButtonHeight = shit; @@ -249,7 +249,7 @@ class ClickGUIRenderer : public Listener { } - logoWidth = Constraints::RelativeConstraint(0.243f); + logoWidth = shit * 0.625f; radioX += Constraints::SpacingConstraint(0.29f, logoWidth); radioY += Constraints::SpacingConstraint(0.29f, logoWidth); @@ -261,7 +261,7 @@ class ClickGUIRenderer : public Listener { // radiobutton of settings - radioX = navx - Constraints::SpacingConstraint(-0.85f, logoWidth); + radioX = navx - Constraints::SpacingConstraint(-0.36f, logoWidth); radioY = (navy + navigationBarHeight / 2.0f - RadioButtonHeight / 2.0f); if(ClickGUIRenderer::curr != "settings") { @@ -304,7 +304,7 @@ class ClickGUIRenderer : public Listener { // radiobutton of editmenu - radioX = navx - Constraints::SpacingConstraint(-0.85f, logoWidth); + radioX = navx - Constraints::SpacingConstraint(-0.36f, logoWidth); radioY = (navy + navigationBarHeight / 2.0f - RadioButtonHeight / 2.0f); radioPushAmount2 = Constraints::SpacingConstraint(0.9f * 5.69f, logoWidth) + width1 + width2; From b5c32051856c5379442c5c3112aa31ae44794f41 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 4 Aug 2024 00:36:35 +0800 Subject: [PATCH 027/240] headers n toggles fixed --- .../Engine/Elements/Control/Toggle/Toggle.cpp | 12 ++++-------- .../Modules/ComboCounter/ComboCounter.hpp | 2 ++ src/Client/Module/Modules/Module.cpp | 19 ++++++++++++++++++- src/Client/Module/Modules/Module.hpp | 1 + 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp b/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp index 46e0198a..c99c2cff 100644 --- a/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp @@ -67,11 +67,8 @@ bool FlarialGUI::Toggle(int index, float x, float y, bool isEnabled, bool rgb) { if (isAdditionalY) UnSetIsInAdditionalYMode(); - if (isEnabled) { - toggleColors[index] = FlarialGUI::LerpColor(toggleColors[index], enabledColor, 0.10f * FlarialGUI::frameFactor); - } else { - toggleColors[index] = FlarialGUI::LerpColor(toggleColors[index], disabledColor, 0.10f * FlarialGUI::frameFactor); - } + if (isEnabled) toggleColors[index] = FlarialGUI::LerpColor(toggleColors[index], enabledColor, 0.10f * FlarialGUI::frameFactor); + else toggleColors[index] = FlarialGUI::LerpColor(toggleColors[index], disabledColor, 0.10f * FlarialGUI::frameFactor); FlarialGUI::RoundedRect(x, y, rgb ? rgbColor : toggleColors[index], rectWidth, rectHeight, round.x, round.x); @@ -90,10 +87,9 @@ bool FlarialGUI::Toggle(int index, float x, float y, bool isEnabled, bool rgb) { FlarialGUI::lerp(FlarialGUI::toggleSpacings[index], Constraints::SpacingConstraint(1.6, circleWidth), 0.25f * FlarialGUI::frameFactor); //FadeEffect::ApplyFadeInEffect(2.4f * FlarialGUI::frameFactor, Constraints::SpacingConstraint(1.6, circleWidth),FlarialGUI::toggleSpacings[index]); enabledSpacing = FlarialGUI::toggleSpacings[index]; - if (enabledSpacing > Constraints::SpacingConstraint(1.6, circleWidth)) - enabledSpacing = Constraints::SpacingConstraint(1.6, circleWidth); + if (enabledSpacing > Constraints::SpacingConstraint(1.6, circleWidth)) enabledSpacing = Constraints::SpacingConstraint(1.6, circleWidth); } else { - FlarialGUI::lerp(FlarialGUI::toggleSpacings[index], 0.0f, 0.25f * FlarialGUI::frameFactor); + FlarialGUI::lerp(FlarialGUI::toggleSpacings[index], Constraints::SpacingConstraint(0.1, circleWidth), 0.25f * FlarialGUI::frameFactor); //FadeEffect::ApplyFadeOutEffect(2.4f * FlarialGUI::frameFactor, FlarialGUI::toggleSpacings[index]); enabledSpacing = FlarialGUI::toggleSpacings[index]; } diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index 79b8569d..cf2f1deb 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -45,6 +45,8 @@ class ComboCounter : public Module { Constraints::RelativeConstraint(1.0, "width"), Constraints::RelativeConstraint(1.0f, "height")); + this->addHeader("Module UI"); + this->addToggle("funny", "im just trolling", settings.getSettingByName("border")->value); this->addToggle("NO MORE TROLLING.....", "", settings.getSettingByName("reversepaddingx")->value); diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index b59ca04c..3e004a26 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -2,6 +2,10 @@ #include "../../Client.hpp" #include "ClickGUI/ClickGUIRenderer.hpp" +#define colors_secondary6 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_secondary6")->value) +#define o_colors_secondary6 clickgui->settings.getSettingByName("o_colors_secondary6")->value +#define colors_secondary6_rgb clickgui->settings.getSettingByName("colors_secondary6_rgb")->value + std::map alignments = { {"Left", DWRITE_TEXT_ALIGNMENT_LEADING}, {"Center", DWRITE_TEXT_ALIGNMENT_CENTER}, @@ -196,6 +200,19 @@ void Module::resetPadding() { textboxIndex = 0; } +void Module::addHeader(std::string text) { + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top") + padding; + + D2D1_COLOR_F col = colors_secondary6_rgb ? FlarialGUI::rgbColor : colors_secondary6; + col.a = o_colors_secondary6; + + std::string name = FlarialGUI::FlarialTextWithFont(x, y, FlarialGUI::to_wide(text).c_str(), 500, 0, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::RelativeConstraint(0.215f, "height", true), DWRITE_FONT_WEIGHT_BOLD, false); + FlarialGUI::RoundedRect(x, y + Constraints::RelativeConstraint(0.011f, "width", true), col, FlarialGUI::TextSizes[name], 3.0f, 0, 0); + + padding += Constraints::RelativeConstraint(0.055f, "height", true); +} + void Module::addToggle(std::string text, std::string subtext, bool& value) { float x = Constraints::PercentageConstraint(0.019, "left"); float elementX = Constraints::PercentageConstraint(0.119f, "right"); @@ -206,7 +223,7 @@ void Module::addToggle(std::string text, std::string subtext, bool& value) { float textX = x; float textY = y; // For some reason, if you do not do this minus, the spacing is way bigger than expected. float subtextY; - float fontSize = Constraints::RelativeConstraint(0.155f, "height", true); + float fontSize = Constraints::RelativeConstraint(0.140f, "height", true); float fontSize2 = Constraints::RelativeConstraint(0.132f, "height", true); if (!subtext.empty()) { diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index 965e961b..d40a3ed3 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -48,6 +48,7 @@ class Module { int colorPickerIndex = 0; void resetPadding(); + void addHeader(std::string text); void addToggle(std::string text, std::string subtext, bool& value); virtual void loadDefaults(); void saveSettings() const; From 85555cf52a18f9635906583d77d7dfa73c97e312 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 01:47:35 +0600 Subject: [PATCH 028/240] adjustments before i go --- .../GUI/Engine/Elements/Control/ModCard/ModCard.cpp | 8 ++++---- .../Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp b/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp index 7087c09c..e79250a3 100644 --- a/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp +++ b/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp @@ -74,12 +74,12 @@ void ClickGUIElements::ModCard(float x, float y, Module *mod, int iconId, const if (FlarialGUI::CursorInRect(x, realY, BottomRoundedWidth, BottomRoundedHeight)) { - FlarialGUI::lerp(sizes[index].x, Constraints::RelativeConstraint(0.198f, "height", true), + FlarialGUI::lerp(sizes[index].x, Constraints::RelativeConstraint(0.186f, "height", true), 0.15f * FlarialGUI::frameFactor); FlarialGUI::lerp(sizes[index].y, Constraints::RelativeConstraint(0.149f, "height", true), 0.15f * FlarialGUI::frameFactor); - diffX = (sizes[index].x - Constraints::RelativeConstraint(0.19f, "height", true)) / 2.0f; + diffX = (sizes[index].x - Constraints::RelativeConstraint(0.178f, "height", true)) / 2.0f; diffY = (sizes[index].y - Constraints::RelativeConstraint(0.141f, "height", true)) / 2.0f; FlarialGUI::lerp(shadowSizes[index].x, BottomRoundedWidth, 0.25f * FlarialGUI::frameFactor); @@ -87,7 +87,7 @@ void ClickGUIElements::ModCard(float x, float y, Module *mod, int iconId, const } else { - FlarialGUI::lerp(sizes[index].x, Constraints::RelativeConstraint(0.19f, "height", true), + FlarialGUI::lerp(sizes[index].x, Constraints::RelativeConstraint(0.178f, "height", true), 0.15f * FlarialGUI::frameFactor); FlarialGUI::lerp(sizes[index].y, Constraints::RelativeConstraint(0.141f, "height", true), 0.15f * FlarialGUI::frameFactor); @@ -95,7 +95,7 @@ void ClickGUIElements::ModCard(float x, float y, Module *mod, int iconId, const FlarialGUI::lerp(shadowSizes[index].x, 0.01f, 0.01f * FlarialGUI::frameFactor); FlarialGUI::lerp(shadowSizes[index].y, 0.01f, 0.01f * FlarialGUI::frameFactor); - diffX = (sizes[index].x - Constraints::RelativeConstraint(0.19f, "height", true)) / 2.0f; + diffX = (sizes[index].x - Constraints::RelativeConstraint(0.178f, "height", true)) / 2.0f; diffY = (sizes[index].y - Constraints::RelativeConstraint(0.141f, "height", true)) / 2.0f; } diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index e007a2e6..51a2205f 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -124,7 +124,7 @@ class ClickGUIRenderer : public Listener { /* Base Rectangle Start */ - float baseWidth = Constraints::RelativeConstraint(0.85); + float baseWidth = Constraints::RelativeConstraint(0.81); if (module->active) { @@ -155,7 +155,7 @@ class ClickGUIRenderer : public Listener { /* Nav Bar Start */ - float navigationBarWidth = Constraints::RelativeConstraint(1.293f); + float navigationBarWidth = Constraints::RelativeConstraint(1.235f); float navigationBarHeight = Constraints::RelativeConstraint(0.124f); float navx = Constraints::PercentageConstraint(0.013f, "left"); float navy = Constraints::PercentageConstraint(0.019f, "top"); @@ -354,7 +354,7 @@ class ClickGUIRenderer : public Listener { float modWidth = Constraints::RelativeConstraint(0.19f, "height", true); float modHeight = Constraints::RelativeConstraint(0.1369f, "height", true); - Vec2 modcenter = Constraints::CenterConstraint(modWidth, modHeight, "both", -0.63, + Vec2 modcenter = Constraints::CenterConstraint(modWidth, modHeight, "both", -0.58, -0.52); FlarialGUI::PushSize(center.x, center.y, baseWidth, @@ -414,7 +414,7 @@ class ClickGUIRenderer : public Listener { name.find(search) != std::string::npos) { ClickGUIElements::ModCard(modcenter.x + xModifier, modcenter.y + yModifier, pModule, pModule->icon, i, visible); - xModifier += Constraints::SpacingConstraint(1.09, modWidth); + xModifier += Constraints::SpacingConstraint(1.02f, modWidth); if ((++i % 3) == 0) { yModifier += Constraints::SpacingConstraint(0.8, modWidth); xModifier = 0.0f; @@ -424,7 +424,7 @@ class ClickGUIRenderer : public Listener { ClickGUIElements::ModCard(modcenter.x + xModifier, modcenter.y + yModifier, pModule, pModule->icon, i, visible); - xModifier += Constraints::SpacingConstraint(1.09, modWidth); + xModifier += Constraints::SpacingConstraint(1.02f, modWidth); if ((++i % 3) == 0) { yModifier += Constraints::SpacingConstraint(0.8, modWidth); xModifier = 0.0f; From 00e9eb6184e897ff77434100f6f7e758a46a73b0 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 01:59:02 +0600 Subject: [PATCH 029/240] fix --- src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp b/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp index e79250a3..0e23ec50 100644 --- a/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp +++ b/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp @@ -132,7 +132,7 @@ void ClickGUIElements::ModCard(float x, float y, Module *mod, int iconId, const FlarialGUI::PushSize(x, y, BottomRoundedWidth, BottomRoundedHeight); // Mod Name - float textx = Constraints::PercentageConstraint(0.1405, "left"); + float textx = Constraints::PercentageConstraint(0.121, "left"); float texty = Constraints::PercentageConstraint(0.415, "top"); float textWidth = Constraints::RelativeConstraint(1.0); float textHeight = Constraints::RelativeConstraint(0.2); From fa4f423668f50ead2c0ad9908ad7c30b9a9eb657 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 01:59:42 +0600 Subject: [PATCH 030/240] wow --- src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp b/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp index 0e23ec50..4eeb4bb7 100644 --- a/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp +++ b/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp @@ -132,7 +132,7 @@ void ClickGUIElements::ModCard(float x, float y, Module *mod, int iconId, const FlarialGUI::PushSize(x, y, BottomRoundedWidth, BottomRoundedHeight); // Mod Name - float textx = Constraints::PercentageConstraint(0.121, "left"); + float textx = Constraints::PercentageConstraint(0.119, "left"); float texty = Constraints::PercentageConstraint(0.415, "top"); float textWidth = Constraints::RelativeConstraint(1.0); float textHeight = Constraints::RelativeConstraint(0.2); From 04b5b488ef6efb9e9cd900b66db7533f44ab07a1 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 02:10:38 +0600 Subject: [PATCH 031/240] adjustments --- src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp | 2 +- src/Client/Module/Modules/ComboCounter/ComboCounter.hpp | 8 ++++++++ src/Client/Module/Modules/Module.cpp | 6 +++++- src/Client/Module/Modules/Module.hpp | 3 +++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp b/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp index c99c2cff..8fa09ff0 100644 --- a/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp @@ -78,7 +78,7 @@ bool FlarialGUI::Toggle(int index, float x, float y, bool isEnabled, bool rgb) { float circleHeight = Constraints::SpacingConstraint(0.7, rectHeight); float ySpacing = Constraints::SpacingConstraint(0.2f, circleHeight); - float xSpacing = Constraints::SpacingConstraint(0.2f, circleWidth); + float xSpacing = Constraints::SpacingConstraint(0.134f, circleWidth); round = Constraints::RoundingConstraint(23, 23); float enabledSpacing; diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index cf2f1deb..57d0c3a6 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -51,6 +51,14 @@ class ComboCounter : public Module { this->addToggle("NO MORE TROLLING.....", "", settings.getSettingByName("reversepaddingx")->value); + this->extraPadding(); + + this->addHeader("Text"); + + this->addToggle("Infinity", "Trolling just reached infinity.", settings.getSettingByName("border")->value); + + this->addToggle("Always Troll", "", settings.getSettingByName("reversepaddingx")->value); + this->resetPadding(); FlarialGUI::UnsetScrollView(); diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 3e004a26..2efe8e1d 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -200,6 +200,10 @@ void Module::resetPadding() { textboxIndex = 0; } +void Module::extraPadding() { + padding += Constraints::RelativeConstraint(0.055f, "height", true); +} + void Module::addHeader(std::string text) { float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top") + padding; @@ -210,7 +214,7 @@ void Module::addHeader(std::string text) { std::string name = FlarialGUI::FlarialTextWithFont(x, y, FlarialGUI::to_wide(text).c_str(), 500, 0, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::RelativeConstraint(0.215f, "height", true), DWRITE_FONT_WEIGHT_BOLD, false); FlarialGUI::RoundedRect(x, y + Constraints::RelativeConstraint(0.011f, "width", true), col, FlarialGUI::TextSizes[name], 3.0f, 0, 0); - padding += Constraints::RelativeConstraint(0.055f, "height", true); + padding += Constraints::RelativeConstraint(0.043f, "height", true); } void Module::addToggle(std::string text, std::string subtext, bool& value) { diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index d40a3ed3..393f765e 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -48,6 +48,9 @@ class Module { int colorPickerIndex = 0; void resetPadding(); + + void extraPadding(); + void addHeader(std::string text); void addToggle(std::string text, std::string subtext, bool& value); virtual void loadDefaults(); From 0f1fed1f51740912363ac1958b2df742fbdf6e66 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 02:11:25 +0600 Subject: [PATCH 032/240] woops! --- src/Client/Module/Modules/Module.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 2efe8e1d..da5cd05e 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -201,7 +201,7 @@ void Module::resetPadding() { } void Module::extraPadding() { - padding += Constraints::RelativeConstraint(0.055f, "height", true); + padding += Constraints::RelativeConstraint(0.04f, "height", true); } void Module::addHeader(std::string text) { @@ -214,7 +214,7 @@ void Module::addHeader(std::string text) { std::string name = FlarialGUI::FlarialTextWithFont(x, y, FlarialGUI::to_wide(text).c_str(), 500, 0, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::RelativeConstraint(0.215f, "height", true), DWRITE_FONT_WEIGHT_BOLD, false); FlarialGUI::RoundedRect(x, y + Constraints::RelativeConstraint(0.011f, "width", true), col, FlarialGUI::TextSizes[name], 3.0f, 0, 0); - padding += Constraints::RelativeConstraint(0.043f, "height", true); + padding += Constraints::RelativeConstraint(0.055f, "height", true); } void Module::addToggle(std::string text, std::string subtext, bool& value) { From 6fc5bd6dd99526fd99c9dae36d535bb6c7c43b48 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 02:21:49 +0600 Subject: [PATCH 033/240] yes --- src/Client/Module/Modules/Module.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index da5cd05e..703e8804 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -212,7 +212,7 @@ void Module::addHeader(std::string text) { col.a = o_colors_secondary6; std::string name = FlarialGUI::FlarialTextWithFont(x, y, FlarialGUI::to_wide(text).c_str(), 500, 0, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::RelativeConstraint(0.215f, "height", true), DWRITE_FONT_WEIGHT_BOLD, false); - FlarialGUI::RoundedRect(x, y + Constraints::RelativeConstraint(0.011f, "width", true), col, FlarialGUI::TextSizes[name], 3.0f, 0, 0); + FlarialGUI::RoundedRect(x, y + Constraints::RelativeConstraint(0.023f, "width"), col, FlarialGUI::TextSizes[name], 3.0f, 0, 0); padding += Constraints::RelativeConstraint(0.055f, "height", true); } From 8a5593f061a612a3bd9c658444bed171e0ff5e01 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 4 Aug 2024 07:56:20 +0800 Subject: [PATCH 034/240] sliders --- .../Engine/Elements/Control/Slider/Slider.cpp | 14 +++++--- .../Engine/Elements/Control/Toggle/Toggle.cpp | 3 +- src/Client/GUI/Engine/Engine.cpp | 1 - src/Client/GUI/Engine/Engine.hpp | 6 ++-- .../Modules/ComboCounter/ComboCounter.hpp | 2 ++ src/Client/Module/Modules/Module.cpp | 32 +++++++++++++++++-- src/Client/Module/Modules/Module.hpp | 1 + 7 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/Slider/Slider.cpp b/src/Client/GUI/Engine/Elements/Control/Slider/Slider.cpp index 1b57ae66..3e246327 100644 --- a/src/Client/GUI/Engine/Elements/Control/Slider/Slider.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Slider/Slider.cpp @@ -35,8 +35,12 @@ #define o_colors_secondary7 clickgui->settings.getSettingByName("o_colors_secondary7")->value #define colors_secondary7_rgb clickgui->settings.getSettingByName("colors_secondary7_rgb")->value -float FlarialGUI::Slider(int index, float x, float y, float startingPoint, const float maxValue, const float minValue, - const bool zerosafe) { +//void FlarialGUI::Slider(bool troll, int index, float x, float y, float& startingPoint, const float maxValue, const float minValue, const bool zerosafe) { +//float yes = Slider(index, x, y, (float)startingPoint, maxValue, minValue, zerosafe); +// startingPoint = yes; +//} + +float FlarialGUI::Slider(int index, float x, float y, float& startingPoint, const float maxValue, const float minValue, const bool zerosafe) { D2D1_COLOR_F color = colors_primary1_rgb ? rgbColor : colors_primary1; D2D1_COLOR_F disabledColor = colors_primary3_rgb ? rgbColor : colors_primary3; D2D1_COLOR_F circleColor = colors_primary2_rgb ? rgbColor : colors_primary2; @@ -76,6 +80,8 @@ float FlarialGUI::Slider(int index, float x, float y, float startingPoint, const const float percWidth = Constraints::RelativeConstraint(0.056, "height", true); const float percHeight = Constraints::RelativeConstraint(0.029, "height", true); + y -= percHeight / 2.0f; + std::string text; if (isAdditionalY) UnSetIsInAdditionalYMode(); @@ -92,8 +98,7 @@ float FlarialGUI::Slider(int index, float x, float y, float startingPoint, const text = stream.str(); } - if (!TextBoxes[30 + index].isActive) - FlarialGUI::RoundedRect(x, y, disabledColor, percWidth, percHeight, round.x, round.x); + if (!TextBoxes[30 + index].isActive) FlarialGUI::RoundedRect(x, y, disabledColor, percWidth, percHeight, round.x, round.x); else FlarialGUI::RoundedRect(x, y, color, percWidth, percHeight, round.x, round.x); @@ -238,5 +243,6 @@ float FlarialGUI::Slider(int index, float x, float y, float startingPoint, const if (isAdditionalY) SetIsInAdditionalYMode(); + startingPoint = percentage; return percentage; } \ No newline at end of file diff --git a/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp b/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp index c99c2cff..e8e988fc 100644 --- a/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.cpp @@ -94,8 +94,7 @@ bool FlarialGUI::Toggle(int index, float x, float y, bool isEnabled, bool rgb) { enabledSpacing = FlarialGUI::toggleSpacings[index]; } - FlarialGUI::RoundedRect(x + xSpacing + enabledSpacing, y + ySpacing, circleColor, circleWidth, circleHeight, - round.x, round.x); + FlarialGUI::RoundedRect(x + xSpacing + enabledSpacing, y + ySpacing, circleColor, circleWidth, circleHeight, round.x, round.x); if (isAdditionalY) SetIsInAdditionalYMode(); diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index 9c76461b..a00c5a81 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -581,7 +581,6 @@ bool ifFontScale2(const float fontSize) { return fontSize / 135 > 1; } - std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *text, const float width, const float height, const DWRITE_TEXT_ALIGNMENT alignment, const float fontSize, const DWRITE_FONT_WEIGHT weight, D2D1_COLOR_F color, bool moduleFont) { diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 276f6085..92e908c9 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -190,9 +190,9 @@ namespace FlarialGUI { bool Toggle(int index, float x, float y, bool isEnabled, bool rgb); - float Slider(int index, float x, float y, float startingPoint = 50.0f, float maxValue = 100.0f, - float minValue = 0.0f, - bool zerosafe = true); + float Slider(int index, float x, float y, float& startingPoint, float maxValue = 100.0f, float minValue = 0.0f, bool zerosafe = true); + //void Slider(bool troll, int index, float x, float y, float& startingPoint, float maxValue = 100.0f, float minValue = 0.0f, bool zerosafe = true); + void Circle(float x, float y, const D2D1_COLOR_F &color, float radius); diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index cf2f1deb..c938bc43 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -51,6 +51,8 @@ class ComboCounter : public Module { this->addToggle("NO MORE TROLLING.....", "", settings.getSettingByName("reversepaddingx")->value); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->resetPadding(); FlarialGUI::UnsetScrollView(); diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 3e004a26..7589b920 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -213,6 +213,35 @@ void Module::addHeader(std::string text) { padding += Constraints::RelativeConstraint(0.055f, "height", true); } +void Module::addSlider(std::string text, std::string subtext, float& startingPoint, float maxVal, float minVal, bool zerosafe) { + float x = Constraints::PercentageConstraint(0.019, "left"); + float elementX = Constraints::PercentageConstraint(0.33f, "right"); + float y = Constraints::PercentageConstraint(0.10, "top") + padding; + + FlarialGUI::Slider(sliderIndex, elementX, y, startingPoint, maxVal, minVal, zerosafe); + + float textX = x; + float textY = y; + float subtextY; + float fontSize = Constraints::RelativeConstraint(0.140f, "height", true); + float fontSize2 = Constraints::RelativeConstraint(0.132f, "height", true); + + if (!subtext.empty()) { + subtextY = textY; + textY -= Constraints::RelativeConstraint(0.009f, "height", true); + subtextY += Constraints::RelativeConstraint(0.009f, "height", true); + } + else { + textY += Constraints::RelativeConstraint(0.0015f, "height", true); + } + + FlarialGUI::FlarialTextWithFont(textX, textY, FlarialGUI::to_wide(text).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_MEDIUM, false); + if (!subtext.empty()) FlarialGUI::FlarialTextWithFont(textX, subtextY, FlarialGUI::to_wide(subtext).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize2, DWRITE_FONT_WEIGHT_MEDIUM, FlarialGUI::HexToColorF("473b3d"), false); + + padding += Constraints::RelativeConstraint(0.05f, "height", true); + sliderIndex++; +} + void Module::addToggle(std::string text, std::string subtext, bool& value) { float x = Constraints::PercentageConstraint(0.019, "left"); float elementX = Constraints::PercentageConstraint(0.119f, "right"); @@ -221,7 +250,7 @@ void Module::addToggle(std::string text, std::string subtext, bool& value) { if (FlarialGUI::Toggle(toggleIndex, elementX, y, value, false)) value = !value; float textX = x; - float textY = y; // For some reason, if you do not do this minus, the spacing is way bigger than expected. + float textY = y; float subtextY; float fontSize = Constraints::RelativeConstraint(0.140f, "height", true); float fontSize2 = Constraints::RelativeConstraint(0.132f, "height", true); @@ -238,7 +267,6 @@ void Module::addToggle(std::string text, std::string subtext, bool& value) { FlarialGUI::FlarialTextWithFont(textX, textY, FlarialGUI::to_wide(text).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_MEDIUM, false); if (!subtext.empty()) FlarialGUI::FlarialTextWithFont(textX, subtextY, FlarialGUI::to_wide(subtext).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize2, DWRITE_FONT_WEIGHT_MEDIUM, FlarialGUI::HexToColorF("473b3d"), false); - padding += Constraints::RelativeConstraint(0.05f, "height", true); toggleIndex++; } diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index d40a3ed3..df6db69d 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -49,6 +49,7 @@ class Module { void resetPadding(); void addHeader(std::string text); + void addSlider(std::string text, std::string subtext, float& startingPoint, float maxVal = 100.0f, float minVal = 0.0f, bool zerosafe = true); void addToggle(std::string text, std::string subtext, bool& value); virtual void loadDefaults(); void saveSettings() const; From bbe2b857e4ccf43be87201cec8ccc023a812e15c Mon Sep 17 00:00:00 2001 From: = Date: Sun, 4 Aug 2024 09:48:03 +0800 Subject: [PATCH 035/240] elementtext and conditional sliders --- src/Client/GUI/Engine/Engine.hpp | 2 - .../Modules/ComboCounter/ComboCounter.hpp | 12 ++-- src/Client/Module/Modules/Module.cpp | 65 ++++++++++--------- src/Client/Module/Modules/Module.hpp | 6 +- 4 files changed, 45 insertions(+), 40 deletions(-) diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 92e908c9..1a706c0c 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -191,8 +191,6 @@ namespace FlarialGUI { bool Toggle(int index, float x, float y, bool isEnabled, bool rgb); float Slider(int index, float x, float y, float& startingPoint, float maxValue = 100.0f, float minValue = 0.0f, bool zerosafe = true); - //void Slider(bool troll, int index, float x, float y, float& startingPoint, float maxValue = 100.0f, float minValue = 0.0f, bool zerosafe = true); - void Circle(float x, float y, const D2D1_COLOR_F &color, float radius); diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index 32dc801b..128fbbf0 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -47,7 +47,11 @@ class ComboCounter : public Module { this->addHeader("Module UI"); - this->addToggle("funny", "im just trolling", settings.getSettingByName("border")->value); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + + this->addToggle("Border", "im just trolling", settings.getSettingByName("border")->value); + + this->addConditionalSlider(settings.getSettingByName("border")->value, "Border Width", "", settings.getSettingByName("borderWidth")->value, 4.0f); this->addToggle("NO MORE TROLLING.....", "", settings.getSettingByName("reversepaddingx")->value); @@ -55,12 +59,6 @@ class ComboCounter : public Module { this->addHeader("Text"); - this->addToggle("Infinity", "Trolling just reached infinity.", settings.getSettingByName("border")->value); - - this->addToggle("Always Troll", "", settings.getSettingByName("reversepaddingx")->value); - - this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); - this->resetPadding(); FlarialGUI::UnsetScrollView(); diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 731c0f01..08012707 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -212,36 +212,57 @@ void Module::addHeader(std::string text) { col.a = o_colors_secondary6; std::string name = FlarialGUI::FlarialTextWithFont(x, y, FlarialGUI::to_wide(text).c_str(), 500, 0, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::RelativeConstraint(0.215f, "height", true), DWRITE_FONT_WEIGHT_BOLD, false); - FlarialGUI::RoundedRect(x, y + Constraints::RelativeConstraint(0.023f, "width"), col, FlarialGUI::TextSizes[name], 3.0f, 0, 0); + FlarialGUI::RoundedRect(x, y + Constraints::RelativeConstraint(0.023f, "width"), col, FlarialGUI::TextSizes[name] + Constraints::RelativeConstraint(0.02f, "width"), 3.0f, 0, 0); padding += Constraints::RelativeConstraint(0.055f, "height", true); } -void Module::addSlider(std::string text, std::string subtext, float& startingPoint, float maxVal, float minVal, bool zerosafe) { +void Module::addConditionalSlider(bool condition, std::string text, std::string subtext, float& startingPoint, float maxVal, float minVal, bool zerosafe) { + if (condition) { + padding -= conditionalSliderAnims[sliderIndex]; + FlarialGUI::lerp(conditionalSliderAnims[sliderIndex], 0.0f, 0.25f * FlarialGUI::frameFactor); + Module::addSlider(text, subtext, startingPoint, maxVal, minVal, zerosafe); + } + else { + FlarialGUI::lerp(conditionalSliderAnims[sliderIndex], Constraints::RelativeConstraint(0.05f, "height", true), 0.25f * FlarialGUI::frameFactor); + if (conditionalSliderAnims[sliderIndex] < Constraints::RelativeConstraint(0.0499f, "height", true)) { + padding -= conditionalSliderAnims[sliderIndex]; + if (conditionalSliderAnims[sliderIndex] < Constraints::RelativeConstraint(0.045f, "height", true)) Module::addSlider(text, subtext, startingPoint, maxVal, minVal, zerosafe); + else padding += Constraints::RelativeConstraint(0.05f, "height", true); + } + } +} + +void Module::addElementText(std::string text, std::string subtext) { float x = Constraints::PercentageConstraint(0.019, "left"); - float elementX = Constraints::PercentageConstraint(0.33f, "right"); float y = Constraints::PercentageConstraint(0.10, "top") + padding; - FlarialGUI::Slider(sliderIndex, elementX, y, startingPoint, maxVal, minVal, zerosafe); - - float textX = x; - float textY = y; float subtextY; float fontSize = Constraints::RelativeConstraint(0.140f, "height", true); float fontSize2 = Constraints::RelativeConstraint(0.132f, "height", true); if (!subtext.empty()) { - subtextY = textY; - textY -= Constraints::RelativeConstraint(0.009f, "height", true); + subtextY = y; + y -= Constraints::RelativeConstraint(0.009f, "height", true); subtextY += Constraints::RelativeConstraint(0.009f, "height", true); } else { - textY += Constraints::RelativeConstraint(0.0015f, "height", true); + y += Constraints::RelativeConstraint(0.0015f, "height", true); } - FlarialGUI::FlarialTextWithFont(textX, textY, FlarialGUI::to_wide(text).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_MEDIUM, false); - if (!subtext.empty()) FlarialGUI::FlarialTextWithFont(textX, subtextY, FlarialGUI::to_wide(subtext).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize2, DWRITE_FONT_WEIGHT_MEDIUM, FlarialGUI::HexToColorF("473b3d"), false); + FlarialGUI::FlarialTextWithFont(x, y, FlarialGUI::to_wide(text).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_MEDIUM, false); + if (!subtext.empty()) FlarialGUI::FlarialTextWithFont(x, subtextY, FlarialGUI::to_wide(subtext).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize2, DWRITE_FONT_WEIGHT_MEDIUM, FlarialGUI::HexToColorF("473b3d"), false); +} +void Module::addSlider(std::string text, std::string subtext, float& startingPoint, float maxVal, float minVal, bool zerosafe) { + float x = Constraints::PercentageConstraint(0.019, "left"); + float elementX = Constraints::PercentageConstraint(0.33f, "right"); + float y = Constraints::PercentageConstraint(0.10, "top") + padding; + + FlarialGUI::Slider(sliderIndex, elementX, y, startingPoint, maxVal, minVal, zerosafe); + + Module::addElementText(text, subtext); + padding += Constraints::RelativeConstraint(0.05f, "height", true); sliderIndex++; } @@ -253,24 +274,8 @@ void Module::addToggle(std::string text, std::string subtext, bool& value) { if (FlarialGUI::Toggle(toggleIndex, elementX, y, value, false)) value = !value; - float textX = x; - float textY = y; - float subtextY; - float fontSize = Constraints::RelativeConstraint(0.140f, "height", true); - float fontSize2 = Constraints::RelativeConstraint(0.132f, "height", true); - - if (!subtext.empty()) { - subtextY = textY; - textY -= Constraints::RelativeConstraint(0.009f, "height", true); - subtextY += Constraints::RelativeConstraint(0.009f, "height", true); - } - else { - textY += Constraints::RelativeConstraint(0.0015f, "height", true); - } - - FlarialGUI::FlarialTextWithFont(textX, textY, FlarialGUI::to_wide(text).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_MEDIUM, false); - if (!subtext.empty()) FlarialGUI::FlarialTextWithFont(textX, subtextY, FlarialGUI::to_wide(subtext).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize2, DWRITE_FONT_WEIGHT_MEDIUM, FlarialGUI::HexToColorF("473b3d"), false); - + Module::addElementText(text, subtext); + padding += Constraints::RelativeConstraint(0.05f, "height", true); toggleIndex++; } diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index f5fd8818..697756dc 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -9,12 +9,14 @@ #include #include #include +#include #include "../../GUI/Engine/Engine.hpp" #include "../../GUI/Engine/Constraints.hpp" #include "../../../SDK/SDK.hpp" #include "../../../Assets/Assets.hpp" class Module { + public: std::string name; std::string description; @@ -42,6 +44,7 @@ class Module { float padding = 0; int toggleIndex = 0; int sliderIndex = 0; + std::vector conditionalSliderAnims = std::vector(100, Constraints::RelativeConstraint(0.05f, "height", true)); int dropdownIndex = 0; int textboxIndex = 0; int keybindIndex = 0; @@ -50,8 +53,9 @@ class Module { void resetPadding(); void extraPadding(); - + void addElementText(std::string text, std::string subtext = ""); void addHeader(std::string text); + void addConditionalSlider(bool condition, std::string text, std::string subtext, float& startingPoint, float maxVal = 100.0f, float minVal = 0.0f, bool zerosafe = true); void addSlider(std::string text, std::string subtext, float& startingPoint, float maxVal = 100.0f, float minVal = 0.0f, bool zerosafe = true); void addToggle(std::string text, std::string subtext, bool& value); virtual void loadDefaults(); From 2ab6fa2b178232bc73b30614b44e5aab7ec21969 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 12:36:27 +0600 Subject: [PATCH 036/240] Fix --- src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp b/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp index 4eeb4bb7..4d3ae2b5 100644 --- a/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp +++ b/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp @@ -246,7 +246,7 @@ void ClickGUIElements::ModCard(float x, float y, Module *mod, int iconId, const buttonColor = D2D1::ColorF(FlarialGUI::buttonColors[index].r - FlarialGUI::darkenAmounts[index], FlarialGUI::buttonColors[index].g - FlarialGUI::darkenAmounts[index], FlarialGUI::buttonColors[index].b - FlarialGUI::darkenAmounts[index], FlarialGUI::buttonColors[index].a); - FlarialGUI::RoundedRect((buttonx - buttonWidth) - Constraints::SpacingConstraint(0.155f, paddingwidth), buttony - buttonHeight, + FlarialGUI::RoundedRect((buttonx - buttonWidth) - Constraints::SpacingConstraint(0.105f, paddingwidth), buttony - buttonHeight, buttonColor, buttonWidth - Constraints::SpacingConstraint(1.5, paddingwidth), buttonHeight, 0.f, 0.f); if (FlarialGUI::RoundedButton(index, buttonx - buttonWidth, buttony - buttonHeight, @@ -261,8 +261,8 @@ void ClickGUIElements::ModCard(float x, float y, Module *mod, int iconId, const if (FlarialGUI::isInScrollView) buttony += FlarialGUI::scrollpos; - if (FlarialGUI::CursorInRect(buttonx - paddingspacing, (buttony - paddingwidth) - paddingheightspac, - paddingwidth, paddingwidth) && MC::mouseButton == MouseButton::Left && + if (FlarialGUI::CursorInRect(settingx, buttony - buttonHeight, + paddingwidth + Constraints::RelativeConstraint(0.26), buttonHeight) && MC::mouseButton == MouseButton::Left && !MC::held) { FlarialGUI::TextBoxes[0].isActive = false; MC::mouseButton = MouseButton::None; From c3cae0bf6fb6a12d8289187a0f106621a98539a0 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 14:05:06 +0600 Subject: [PATCH 037/240] blur working as expected --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 66 +++++++++++-------- src/Client/GUI/Engine/Engine.hpp | 10 +-- .../Hook/Hooks/Render/SwapchainHook.cpp | 4 +- .../Modules/MotionBlur/MotionBlurListener.hpp | 62 +++++++++++++++-- 4 files changed, 100 insertions(+), 42 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 56b11dfa..1dc4a0ba 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -2,8 +2,12 @@ #include #include #include "../../Engine.hpp" +#include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" +#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" -#define BLUR_OFFSET 1.0f +// CREDITS @MR CHIPS (@chyves) + +#define BLUR_OFFSET 5.0f static const XMFLOAT4 quadVertices[] = { @@ -80,11 +84,6 @@ float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET {\ return texture0.Sample(sampler0, uv);\ }"; -void Blur::blur(ID3D11Device* Device) { - pDevice = Device; - Blur::InitializePipeline(); -} - ID3DBlob *TryCompileShader(const char *pSrcData, const char *pTarget) { HRESULT hr; @@ -107,6 +106,8 @@ ID3D11PixelShader *dbgShader; void Blur::InitializePipeline() { HRESULT hr; + ID3D11DeviceContext* pContext; + SwapchainHook::d3d11Device->GetImmediateContext(&pContext); // byteWidth has to be a multiple of 32, BlurInputBuffer has a size of 24 CD3D11_BUFFER_DESC cbd( @@ -116,53 +117,53 @@ void Blur::InitializePipeline() sizeof(quadVertices), D3D11_BIND_VERTEX_BUFFER); - pDevice->CreateBuffer( + SwapchainHook::d3d11Device->CreateBuffer( &cbd, nullptr, &pConstantBuffer); D3D11_SUBRESOURCE_DATA vertexBufferData = {quadVertices, 0, 0}; - pDevice->CreateBuffer( + SwapchainHook::d3d11Device->CreateBuffer( &cbdVertex, &vertexBufferData, &pVertexBuffer); ID3DBlob *shaderBlob = TryCompileShader(upsampleShaderSrc, "ps_4_0"); - pDevice->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pUpsampleShader); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pUpsampleShader); shaderBlob = TryCompileShader(downsampleShaderSrc, "ps_4_0"); - pDevice->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pDownsampleShader); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pDownsampleShader); shaderBlob = TryCompileShader(dbgDrawTextureShaderSrc, "ps_4_0"); - pDevice->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &dbgShader); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &dbgShader); shaderBlob = TryCompileShader(vertexShaderSrc, "vs_4_0"); - pDevice->CreateVertexShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pVertexShader); + SwapchainHook::d3d11Device->CreateVertexShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pVertexShader); D3D11_INPUT_ELEMENT_DESC ied = {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}; - pDevice->CreateInputLayout(&ied, 1, shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &pInputLayout); + SwapchainHook::d3d11Device->CreateInputLayout(&ied, 1, shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &pInputLayout); D3D11_SAMPLER_DESC sd{}; sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; sd.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - pDevice->CreateSamplerState(&sd, &pSampler); + SwapchainHook::d3d11Device->CreateSamplerState(&sd, &pSampler); - pDevice->GetImmediateContext(&pContext); } void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderResourceView *pShaderResourceView, XMFLOAT2 rtvSize) { HRESULT hr; - + ID3D11DeviceContext* pContext; + SwapchainHook::d3d11Device->GetImmediateContext(&pContext); D3D11_DEPTH_STENCIL_DESC dsd{}; dsd.DepthEnable = false; dsd.StencilEnable = false; ID3D11DepthStencilState *pDepthStencilState; - pDevice->CreateDepthStencilState(&dsd, &pDepthStencilState); + SwapchainHook::d3d11Device->CreateDepthStencilState(&dsd, &pDepthStencilState); pContext->OMSetDepthStencilState(pDepthStencilState, 0); void *null = nullptr; @@ -195,7 +196,7 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe bd.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; bd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; ID3D11BlendState *pBlendState; - pDevice->CreateBlendState(&bd, &pBlendState); + SwapchainHook::d3d11Device->CreateBlendState(&bd, &pBlendState); pContext->OMSetBlendState(pBlendState, NULL, 0xffffffff); D3D11_RASTERIZER_DESC rd{}; rd.FillMode = D3D11_FILL_SOLID; @@ -203,7 +204,7 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe rd.DepthClipEnable = false; rd.ScissorEnable = false; ID3D11RasterizerState *pRasterizerState; - pDevice->CreateRasterizerState(&rd, &pRasterizerState); + SwapchainHook::d3d11Device->CreateRasterizerState(&rd, &pRasterizerState); pContext->RSSetState(pRasterizerState); pContext->PSSetShaderResources(0, 1, &pShaderResourceView); @@ -222,25 +223,34 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe pContext->OMSetRenderTargets(1, &kajgd, nullptr); } -void Blur::RenderBlur(ID3D11Texture2D *pTextureToBlur, ID3D11RenderTargetView *pDstRenderTargetView, int iterations) +void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations) { + + ID3D11Texture2D* tex = MotionBlurListener::GetBackbuffer(); + if(!tex) return; + + ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::SaveBackbuffer(); + if(!pOrigShaderResourceView) return; + + ID3D11DeviceContext* pContext; + SwapchainHook::d3d11Device->GetImmediateContext(&pContext); + HRESULT hr; std::vector framebuffers; std::vector renderTargetViews; std::vector shaderResourceViews; std::vector fbSizes; D3D11_TEXTURE2D_DESC desc; - pTextureToBlur->GetDesc(&desc); + tex->GetDesc(&desc); framebuffers.reserve((size_t)iterations); renderTargetViews.reserve((size_t)iterations); D3D11_SHADER_RESOURCE_VIEW_DESC srvd{}; - ID3D11ShaderResourceView *pOrigShaderResourceView; srvd.Format = desc.Format; srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; srvd.Texture2D.MipLevels = 1; - pDevice->CreateShaderResourceView(pTextureToBlur, &srvd, &pOrigShaderResourceView); + desc.BindFlags |= D3D11_BIND_RENDER_TARGET; @@ -251,12 +261,12 @@ void Blur::RenderBlur(ID3D11Texture2D *pTextureToBlur, ID3D11RenderTargetView *p ID3D11RenderTargetView *pRenderTargetView; ID3D11ShaderResourceView *pShaderResourceView; - pDevice->CreateTexture2D(&desc, nullptr, &pFrameBuffer); + SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); if (i == 0) pRenderTargetView = pDstRenderTargetView; else - pDevice->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); - pDevice->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); + SwapchainHook::d3d11Device->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); + SwapchainHook::d3d11Device->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); framebuffers.push_back(pFrameBuffer); renderTargetViews.push_back(pRenderTargetView); @@ -267,7 +277,6 @@ void Blur::RenderBlur(ID3D11Texture2D *pTextureToBlur, ID3D11RenderTargetView *p desc.Height /= 2; } - pTextureToBlur->GetDesc(&desc); constantBuffer.offset = XMFLOAT2(BLUR_OFFSET, BLUR_OFFSET); pContext->PSSetShader(pDownsampleShader, nullptr, 0); @@ -296,4 +305,7 @@ void Blur::RenderBlur(ID3D11Texture2D *pTextureToBlur, ID3D11RenderTargetView *p framebuffers[i]->Release(); shaderResourceViews[i]->Release(); } + + tex->Release(); + pOrigShaderResourceView->Release(); } \ No newline at end of file diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index e6128b8a..3354a9e7 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -36,9 +36,7 @@ struct BlurInputBuffer class Blur { -private: - static inline ID3D11Device *pDevice = nullptr; - static inline ID3D11DeviceContext *pContext = nullptr; +public: static inline ID3D11PixelShader *pUpsampleShader = nullptr; static inline ID3D11PixelShader *pDownsampleShader = nullptr; @@ -55,11 +53,7 @@ class Blur //static void Cleanup(); static void RenderToRTV(ID3D11RenderTargetView *, ID3D11ShaderResourceView *, XMFLOAT2); - -public: - static void blur(ID3D11Device *); - - static void RenderBlur(ID3D11Texture2D *, ID3D11RenderTargetView *, int); + static void RenderBlur(ID3D11RenderTargetView *, int); }; class Dimension { diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index ae043d7f..d68244c0 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -419,7 +419,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); - Blur::RenderBlur(pBackBuffer, mainRenderTargetView, 3); + Blur::RenderBlur(mainRenderTargetView, 3); RenderEvent event; EventHandler::onRender(event); @@ -512,7 +512,7 @@ void SwapchainHook::DX11Init() { } - Blur::blur(d3d11Device); + Blur::InitializePipeline(); Memory::SafeRelease(eBackBuffer); init = true; diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index c1f2af02..6087cf8c 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -40,7 +40,8 @@ class MotionBlurListener : public Listener { previousFrames.erase(previousFrames.begin(), previousFrames.begin() + framesToRemove); } - previousFrames.push_back(SaveBackbuffer()); + ID3D11ShaderResourceView* buffer = SaveBackbuffer(); + if(buffer) previousFrames.push_back(buffer); float alpha = 0.3f; @@ -74,8 +75,59 @@ class MotionBlurListener : public Listener { ImGui::SetCursorScreenPos(ImVec2(pos.x + size.x, pos.y)); } + static ID3D11Texture2D* GetBackbuffer() + { + + ID3D11DeviceContext* deviceContext; + SwapchainHook::d3d11Device->GetImmediateContext(&deviceContext); + IDXGISurface1* backBuffer = nullptr; + HRESULT hr; + SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); + + ID3D11Texture2D* buffer2D = nullptr; + if(FAILED(backBuffer->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&buffer2D)))) std::cout << "failed to get 2d" << std::endl; + + D3D11_TEXTURE2D_DESC desc; + buffer2D->GetDesc(&desc); + + ID3D11Texture2D* stageTex = nullptr; + D3D11_TEXTURE2D_DESC stageDesc = desc; + stageDesc.Usage = D3D11_USAGE_STAGING; + stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + stageDesc.BindFlags = 0; + + //desc.Usage = DXGI_USAGE_SHADER_INPUT; + HRESULT r = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); + deviceContext->CopyResource(stageTex, buffer2D); + + if (FAILED(r)) std::cout << "Failed to create stage texture: " << std::hex << r << std::endl; + - ID3D11ShaderResourceView* SaveBackbuffer() + D3D11_TEXTURE2D_DESC defaultDesc = desc; + defaultDesc.Usage = D3D11_USAGE_DEFAULT; + defaultDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + defaultDesc.CPUAccessFlags = 0; + + ID3D11Texture2D* defaultTexture = nullptr; + hr = SwapchainHook::d3d11Device->CreateTexture2D(&defaultDesc, nullptr, &defaultTexture); + if (FAILED(hr)) { + std::cout << "Failed to create def texture: " << std::hex << r << std::endl; + } + + deviceContext->CopyResource(defaultTexture, stageTex); + + stageTex->Release(); + + //if(outSRV) std::cout << "Wroekd" << std::endl; + + backBuffer->Release(); + buffer2D->Release(); + + return defaultTexture; + } + + + static ID3D11ShaderResourceView* SaveBackbuffer() { ID3D11DeviceContext* deviceContext; @@ -132,9 +184,9 @@ class MotionBlurListener : public Listener { //if(outSRV) std::cout << "Wroekd" << std::endl; - backBuffer->Release(); - buffer2D->Release(); - defaultTexture->Release(); + Memory::SafeRelease(backBuffer); + Memory::SafeRelease(buffer2D); + Memory::SafeRelease(defaultTexture); return outSRV; } From 24ee3c0f244b765597574bd9e01438f99f73a583 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 14:19:34 +0600 Subject: [PATCH 038/240] gaussian blur --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 132 ++++++++++++-------- 1 file changed, 79 insertions(+), 53 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 1dc4a0ba..44ae6a66 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -7,7 +7,7 @@ // CREDITS @MR CHIPS (@chyves) -#define BLUR_OFFSET 5.0f +#define BLUR_OFFSET 0.5f static const XMFLOAT4 quadVertices[] = { @@ -25,48 +25,82 @@ const char *vertexShaderSrc = "struct VS_INPUT {\ float4 main(VS_INPUT input) : SV_POSITION {\ return input.pos;\ }"; -const char *downsampleShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ -{\ - float2 resolution;\ - float2 offset;\ - float2 halfpixel;\ -};\ -sampler sampler0 : register(s0);\ -Texture2D texture0 : register(t0);\ -\ -float4 main(float4 screenSpace : SV_Position) : SV_TARGET {\ - float2 uv = screenSpace.xy / resolution;\ - float4 sum = texture0.Sample(sampler0, uv) * 4.0;\ - sum += texture0.Sample(sampler0, uv - halfpixel * offset);\ - sum += texture0.Sample(sampler0, uv + halfpixel * offset);\ - sum += texture0.Sample(sampler0, uv + float2(halfpixel.x, -halfpixel.y) * offset);\ - sum += texture0.Sample(sampler0, uv - float2(halfpixel.x, -halfpixel.y) * offset);\ - return sum / 8.0;\ -}"; -const char *upsampleShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ -{\ - float2 resolution;\ - float2 offset;\ - float2 halfpixel;\ -};\ -struct PS_INPUT {\ - float4 pos : POSITION;\ -};\ -sampler sampler0 : register(s0);\ -Texture2D texture0 : register(t0);\ -\ -float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET {\ - float2 uv = screenSpace.xy / resolution;\ - float4 sum = texture0.Sample(sampler0, uv + float2(-halfpixel.x * 2.0, 0.0) * offset);\ - sum += texture0.Sample(sampler0, uv + float2(-halfpixel.x, halfpixel.y) * offset) * 2.0;\ - sum += texture0.Sample(sampler0, uv + float2(0.0, halfpixel.y * 2.0) * offset);\ - sum += texture0.Sample(sampler0, uv + float2(halfpixel.x, halfpixel.y) * offset) * 2.0;\ - sum += texture0.Sample(sampler0, uv + float2(halfpixel.x * 2.0, 0.0) * offset);\ - sum += texture0.Sample(sampler0, uv + float2(halfpixel.x, -halfpixel.y) * offset) * 2.0;\ - sum += texture0.Sample(sampler0, uv + float2(0.0, -halfpixel.y * 2.0) * offset);\ - sum += texture0.Sample(sampler0, uv + float2(-halfpixel.x, -halfpixel.y) * offset) * 2.0;\ - return sum / 12.0;\ -}"; + +const char *downsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfpixel; +}; +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 sum = float4(0.0, 0.0, 0.0, 0.0); + float2 offsets[5] = { + -2.0 * halfpixel * offset, + -halfpixel * offset, + float2(0.0, 0.0), + halfpixel * offset, + 2.0 * halfpixel * offset + }; + float weights[5] = { + 0.06136, + 0.24477, + 0.38774, + 0.24477, + 0.06136 + }; + for (int i = 0; i < 5; i++) + { + sum += texture0.Sample(sampler0, uv + offsets[i]) * weights[i]; + } + return sum; +})"; + + +const char *upsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfpixel; +}; +struct PS_INPUT +{ + float4 pos : POSITION; +}; +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 sum = float4(0.0, 0.0, 0.0, 0.0); + float2 offsets[5] = { + -2.0 * halfpixel * offset, + -halfpixel * offset, + float2(0.0, 0.0), + halfpixel * offset, + 2.0 * halfpixel * offset + }; + float weights[5] = { + 0.06136, + 0.24477, + 0.38774, + 0.24477, + 0.06136 + }; + for (int i = 0; i < 5; i++) + { + sum += texture0.Sample(sampler0, uv + offsets[i]) * weights[i]; + } + return sum; +})"; + const char *dbgDrawTextureShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ {\ float2 resolution;\ @@ -215,7 +249,7 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe viewport.Height = rtvSize.y; viewport.MaxDepth = 1.0f; - FLOAT backgroundColor[4] = {0.1f, 0.2f, 0.6f, 1.0f}; + FLOAT backgroundColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; pContext->ClearRenderTargetView(pRenderTargetView, backgroundColor); pContext->RSSetViewports(1, &viewport); pContext->Draw(sizeof(quadVertices) / sizeof(quadVertices[0]), 0); @@ -225,7 +259,6 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations) { - ID3D11Texture2D* tex = MotionBlurListener::GetBackbuffer(); if(!tex) return; @@ -251,10 +284,8 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; srvd.Texture2D.MipLevels = 1; - desc.BindFlags |= D3D11_BIND_RENDER_TARGET; - // ! I should probably reuse the textures and RenderTargetViews for (int i = 0; i <= iterations; i++) { ID3D11Texture2D *pFrameBuffer; @@ -277,7 +308,6 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio desc.Height /= 2; } - constantBuffer.offset = XMFLOAT2(BLUR_OFFSET, BLUR_OFFSET); pContext->PSSetShader(pDownsampleShader, nullptr, 0); RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); @@ -291,13 +321,9 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio for (int i = iterations; i > 0; i--) { - if (renderTargetViews[i - 1] == pDstRenderTargetView) RenderToRTV(renderTargetViews[i - 1], shaderResourceViews[i], fbSizes[i - 1]); } - // pContext->PSSetShader(dbgShader, nullptr, 0); - // RenderToRTV(pDstRenderTargetView, shaderResourceViews[0], fbSizes[0]); - for (int i = 0; i < iterations; i++) { if (i != 0) @@ -308,4 +334,4 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio tex->Release(); pOrigShaderResourceView->Release(); -} \ No newline at end of file +} From 4ca2d4e50648a98ffa7f7e67f0aa9c7be1a8c05b Mon Sep 17 00:00:00 2001 From: oAnshull Date: Sun, 4 Aug 2024 16:06:02 +0530 Subject: [PATCH 039/240] blur (insane fps drops for me idk why) --- src/Client/Events/Render/RenderEvent.hpp | 6 + src/Client/GUI/Engine/Effects/Blur/blur.cpp | 113 +++++++++++------- src/Client/GUI/Engine/Engine.hpp | 2 +- .../Hook/Hooks/Render/SwapchainHook.cpp | 3 +- src/Client/Module/Manager.cpp | 6 +- .../Modules/ClickGUI/ClickGUIRenderer.hpp | 5 +- 6 files changed, 81 insertions(+), 54 deletions(-) diff --git a/src/Client/Events/Render/RenderEvent.hpp b/src/Client/Events/Render/RenderEvent.hpp index 76dc8f63..9a9e2894 100644 --- a/src/Client/Events/Render/RenderEvent.hpp +++ b/src/Client/Events/Render/RenderEvent.hpp @@ -3,6 +3,12 @@ #include "../Event.hpp" #include "../Cancellable.hpp" +#include +#include +#include +#include class RenderEvent : public Event { +public: + ID3D11RenderTargetView* RTV; }; \ No newline at end of file diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 44ae6a66..67e540b9 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -7,7 +7,7 @@ // CREDITS @MR CHIPS (@chyves) -#define BLUR_OFFSET 0.5f +#define BLUR_OFFSET 10 static const XMFLOAT4 quadVertices[] = { @@ -31,75 +31,100 @@ cbuffer BlurInputBuffer : register(b0) { float2 resolution; float2 offset; - float2 halfpixel; + float2 halfPixel; }; + sampler sampler0 : register(s0); Texture2D texture0 : register(t0); float4 main(float4 screenSpace : SV_Position) : SV_TARGET { float2 uv = screenSpace.xy / resolution; - float4 sum = float4(0.0, 0.0, 0.0, 0.0); - float2 offsets[5] = { - -2.0 * halfpixel * offset, - -halfpixel * offset, - float2(0.0, 0.0), - halfpixel * offset, - 2.0 * halfpixel * offset + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset }; - float weights[5] = { - 0.06136, - 0.24477, - 0.38774, - 0.24477, - 0.06136 + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 }; - for (int i = 0; i < 5; i++) + + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) { - sum += texture0.Sample(sampler0, uv + offsets[i]) * weights[i]; + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); } - return sum; -})"; + return colorSum; +} +)"; const char *upsampleShaderSrc = R"( cbuffer BlurInputBuffer : register(b0) { float2 resolution; float2 offset; - float2 halfpixel; -}; -struct PS_INPUT -{ - float4 pos : POSITION; + float2 halfPixel; }; + sampler sampler0 : register(s0); Texture2D texture0 : register(t0); -float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET +float4 main(float4 screenSpace : SV_Position) : SV_TARGET { float2 uv = screenSpace.xy / resolution; - float4 sum = float4(0.0, 0.0, 0.0, 0.0); - float2 offsets[5] = { - -2.0 * halfpixel * offset, - -halfpixel * offset, - float2(0.0, 0.0), - halfpixel * offset, - 2.0 * halfpixel * offset + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset }; - float weights[5] = { - 0.06136, - 0.24477, - 0.38774, - 0.24477, - 0.06136 + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 }; - for (int i = 0; i < 5; i++) + + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) { - sum += texture0.Sample(sampler0, uv + offsets[i]) * weights[i]; + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); } - return sum; -})"; + + return colorSum; +} +)"; + + const char *dbgDrawTextureShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ {\ @@ -257,7 +282,7 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe pContext->OMSetRenderTargets(1, &kajgd, nullptr); } -void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations) +void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) { ID3D11Texture2D* tex = MotionBlurListener::GetBackbuffer(); if(!tex) return; @@ -308,7 +333,7 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio desc.Height /= 2; } - constantBuffer.offset = XMFLOAT2(BLUR_OFFSET, BLUR_OFFSET); + constantBuffer.offset = XMFLOAT2(intensity, intensity); pContext->PSSetShader(pDownsampleShader, nullptr, 0); RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 3354a9e7..4b44c7cd 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -53,7 +53,7 @@ class Blur //static void Cleanup(); static void RenderToRTV(ID3D11RenderTargetView *, ID3D11ShaderResourceView *, XMFLOAT2); - static void RenderBlur(ID3D11RenderTargetView *, int); + static void RenderBlur(ID3D11RenderTargetView *, int, float); }; class Dimension { diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index d68244c0..a964d083 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -419,9 +419,10 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); - Blur::RenderBlur(mainRenderTargetView, 3); + RenderEvent event; + event.RTV = mainRenderTargetView; EventHandler::onRender(event); D2D::context->EndDraw(); diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index da5cfc53..c7ed4024 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -198,10 +198,6 @@ bool ModuleManager::doesAnyModuleHave(const std::string& settingName) { Module* ModuleManager::getModule(const std::string& name) { size_t hash = std::hash{}(name); - auto it = moduleMap.find(hash); - if (it != moduleMap.end()) { - return it->second; - } + return moduleMap[hash]; - return nullptr; } diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 51a2205f..4afee4ed 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -117,9 +117,6 @@ class ClickGUIRenderer : public Listener { } - //if (realBlurAmount > 0.1) FlarialGUI::AllahBlur(realBlurAmount); - - if (SwapchainHook::init && baseHeightActual > 0.1) { /* Base Rectangle Start */ @@ -132,6 +129,8 @@ class ClickGUIRenderer : public Listener { } + Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); + float baseHeight = Constraints::RelativeConstraint(baseHeightReal); Vec2 center = Constraints::CenterConstraint(baseWidth, From 0017006776f3abcfc278411537309166aaf7c501 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 4 Aug 2024 21:58:37 +0800 Subject: [PATCH 040/240] smoother conditional sliders --- .../Engine/Elements/Control/Slider/Slider.cpp | 5 - src/Client/GUI/Engine/Engine.cpp | 150 ++++++++++++++++++ src/Client/GUI/Engine/Engine.hpp | 4 + .../Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- .../Modules/ComboCounter/ComboCounter.hpp | 2 +- src/Client/Module/Modules/Module.cpp | 8 +- 6 files changed, 162 insertions(+), 9 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/Slider/Slider.cpp b/src/Client/GUI/Engine/Elements/Control/Slider/Slider.cpp index 3e246327..a7b863c3 100644 --- a/src/Client/GUI/Engine/Elements/Control/Slider/Slider.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Slider/Slider.cpp @@ -35,11 +35,6 @@ #define o_colors_secondary7 clickgui->settings.getSettingByName("o_colors_secondary7")->value #define colors_secondary7_rgb clickgui->settings.getSettingByName("colors_secondary7_rgb")->value -//void FlarialGUI::Slider(bool troll, int index, float x, float y, float& startingPoint, const float maxValue, const float minValue, const bool zerosafe) { -//float yes = Slider(index, x, y, (float)startingPoint, maxValue, minValue, zerosafe); -// startingPoint = yes; -//} - float FlarialGUI::Slider(int index, float x, float y, float& startingPoint, const float maxValue, const float minValue, const bool zerosafe) { D2D1_COLOR_F color = colors_primary1_rgb ? rgbColor : colors_primary1; D2D1_COLOR_F disabledColor = colors_primary3_rgb ? rgbColor : colors_primary3; diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index a00c5a81..b903933f 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -34,6 +34,14 @@ #define o_colors_text clickgui->settings.getSettingByName("o_colors_text")->value #define colors_text_rgb clickgui->settings.getSettingByName("colors_text_rgb")->value +#define colors_enabled HexToColorF(clickgui->settings.getSettingByName("colors_enabled")->value) +#define o_colors_enabled clickgui->settings.getSettingByName("o_colors_enabled")->value +#define colors_enabled_rgb clickgui->settings.getSettingByName("colors_enabled_rgb")->value + +#define colors_disabled HexToColorF(clickgui->settings.getSettingByName("colors_disabled")->value) +#define o_colors_disabled clickgui->settings.getSettingByName("o_colors_disabled")->value +#define colors_disabled_rgb clickgui->settings.getSettingByName("colors_disabled_rgb")->value + #define colors_primary1 HexToColorF(clickgui->settings.getSettingByName("colors_primary1")->value) #define o_colors_primary1 clickgui->settings.getSettingByName("o_colors_primary1")->value #define colors_primary1_rgb clickgui->settings.getSettingByName("colors_primary1_rgb")->value @@ -58,10 +66,46 @@ #define o_colors_secondary2 clickgui->settings.getSettingByName("o_colors_secondary2")->value #define colors_secondary2_rgb clickgui->settings.getSettingByName("colors_secondary2_rgb")->value +#define colors_secondary3 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_secondary4")->value) +#define o_colors_secondary3 clickgui->settings.getSettingByName("o_colors_secondary3")->value +#define colors_secondary3_rgb clickgui->settings.getSettingByName("colors_secondary4_rgb")->value + +#define colors_secondary4 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_secondary3")->value) +#define o_colors_secondary4 clickgui->settings.getSettingByName("o_colors_secondary4")->value +#define colors_secondary4_rgb clickgui->settings.getSettingByName("colors_secondary3_rgb")->value + +#define colors_secondary5 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_secondary5")->value) +#define o_colors_secondary5 clickgui->settings.getSettingByName("o_colors_secondary5")->value +#define colors_secondary5_rgb clickgui->settings.getSettingByName("colors_secondary5_rgb")->value + +#define colors_secondary6 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_secondary6")->value) +#define o_colors_secondary6 clickgui->settings.getSettingByName("o_colors_secondary6")->value +#define colors_secondary6_rgb clickgui->settings.getSettingByName("colors_secondary6_rgb")->value + #define colors_secondary7 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_secondary7")->value) #define o_colors_secondary7 clickgui->settings.getSettingByName("o_colors_secondary7")->value #define colors_secondary7_rgb clickgui->settings.getSettingByName("colors_secondary7_rgb")->value +#define colors_secondary8 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_secondary8")->value) +#define o_colors_secondary8 clickgui->settings.getSettingByName("o_colors_secondary8")->value +#define colors_secondary8_rgb clickgui->settings.getSettingByName("colors_secondary8_rgb")->value + +#define colors_mod1 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_mod1")->value) +#define o_colors_mod1 clickgui->settings.getSettingByName("o_colors_mod1")->value +#define colors_mod1_rgb clickgui->settings.getSettingByName("colors_mod1_rgb")->value + +#define colors_mod2 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_mod2")->value) +#define o_colors_mod2 clickgui->settings.getSettingByName("o_colors_mod2")->value +#define colors_mod2_rgb clickgui->settings.getSettingByName("colors_mod2_rgb")->value + +#define colors_mod3 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_mod3")->value) +#define o_colors_mod3 clickgui->settings.getSettingByName("o_colors_mod3")->value +#define colors_mod3_rgb clickgui->settings.getSettingByName("colors_mod3_rgb")->value + +#define colors_mod4 FlarialGUI::HexToColorF(clickgui->settings.getSettingByName("colors_mod4")->value) +#define o_colors_mod4 clickgui->settings.getSettingByName("o_colors_mod4")->value +#define colors_mod4_rgb clickgui->settings.getSettingByName("colors_mod4_rgb")->value + std::map ImagesClass::eimages; std::map ImagesClass::images; @@ -86,6 +130,112 @@ std::unordered_map FlarialGUI::additionalY; //std::unordered_map> FlarialGUI::gradientStopCache; LRUCache> FlarialGUI::gradientBrushCache(300); +/* +float b_o_colors_text = o_colors_text; +float b_o_colors_enabled = o_colors_enabled; +float b_o_colors_disabled = o_colors_disabled; +float b_o_colors_primary1 = o_colors_primary1; +float b_o_colors_primary2 = o_colors_primary2; +float b_o_colors_primary3 = o_colors_primary3; +float b_o_colors_primary4 = o_colors_primary4; +float b_o_colors_secondary1 = o_colors_secondary1; +float b_o_colors_secondary2 = o_colors_secondary2; +float b_o_colors_secondary3 = o_colors_secondary3; +float b_o_colors_secondary4 = o_colors_secondary4; +float b_o_colors_secondary5 = o_colors_secondary5; +float b_o_colors_secondary6 = o_colors_secondary6; +float b_o_colors_secondary7 = o_colors_secondary7; +float b_o_colors_secondary8 = o_colors_secondary8; +float b_o_colors_mod1 = o_colors_mod1; +float b_o_colors_mod2 = o_colors_mod2; +float b_o_colors_mod3 = o_colors_mod3; +float b_o_colors_mod4 = o_colors_mod4; +*/ + +float b_o_colors_text; +float b_o_colors_enabled; +float b_o_colors_disabled; +float b_o_colors_primary1; +float b_o_colors_primary2; +float b_o_colors_primary3; +float b_o_colors_primary4; +float b_o_colors_secondary1; +float b_o_colors_secondary2; +float b_o_colors_secondary3; +float b_o_colors_secondary4; +float b_o_colors_secondary5; +float b_o_colors_secondary6; +float b_o_colors_secondary7; +float b_o_colors_secondary8; +float b_o_colors_mod1; +float b_o_colors_mod2; +float b_o_colors_mod3; +float b_o_colors_mod4; + +void FlarialGUI::OverrideAlphaValues(float percent) { + b_o_colors_text = o_colors_text; + b_o_colors_enabled = o_colors_enabled; + b_o_colors_disabled = o_colors_disabled; + b_o_colors_primary1 = o_colors_primary1; + b_o_colors_primary2 = o_colors_primary2; + b_o_colors_primary3 = o_colors_primary3; + b_o_colors_primary4 = o_colors_primary4; + b_o_colors_secondary1 = o_colors_secondary1; + b_o_colors_secondary2 = o_colors_secondary2; + b_o_colors_secondary3 = o_colors_secondary3; + b_o_colors_secondary4 = o_colors_secondary4; + b_o_colors_secondary5 = o_colors_secondary5; + b_o_colors_secondary6 = o_colors_secondary6; + b_o_colors_secondary7 = o_colors_secondary7; + b_o_colors_secondary8 = o_colors_secondary8; + b_o_colors_mod1 = o_colors_mod1; + b_o_colors_mod2 = o_colors_mod2; + b_o_colors_mod3 = o_colors_mod3; + b_o_colors_mod4 = o_colors_mod4; + + o_colors_text = percent * b_o_colors_text; + o_colors_enabled = percent * b_o_colors_enabled; + o_colors_disabled = percent * b_o_colors_disabled; + o_colors_primary1 = percent * b_o_colors_primary1; + o_colors_primary2 = percent * b_o_colors_primary2; + o_colors_primary3 = percent * b_o_colors_primary3; + o_colors_primary4 = percent * b_o_colors_primary4; + o_colors_secondary1 = percent * b_o_colors_secondary1; + o_colors_secondary2 = percent * b_o_colors_secondary2; + o_colors_secondary3 = percent * b_o_colors_secondary3; + o_colors_secondary4 = percent * b_o_colors_secondary4; + o_colors_secondary5 = percent * b_o_colors_secondary5; + o_colors_secondary6 = percent * b_o_colors_secondary6; + o_colors_secondary7 = percent * b_o_colors_secondary7; + o_colors_secondary8 = percent * b_o_colors_secondary8; + o_colors_mod1 = percent * b_o_colors_mod1; + o_colors_mod2 = percent * b_o_colors_mod2; + o_colors_mod3 = percent * b_o_colors_mod3; + o_colors_mod4 = percent * b_o_colors_mod4; +} + +void FlarialGUI::ResetOverrideAlphaValues() { + o_colors_text = b_o_colors_text; + o_colors_enabled = b_o_colors_enabled; + o_colors_disabled = b_o_colors_disabled; + o_colors_primary1 = b_o_colors_primary1; + o_colors_primary2 = b_o_colors_primary2; + o_colors_primary3 = b_o_colors_primary3; + o_colors_primary4 = b_o_colors_primary4; + o_colors_secondary1 = b_o_colors_secondary1; + o_colors_secondary2 = b_o_colors_secondary2; + o_colors_secondary3 = b_o_colors_secondary3; + o_colors_secondary4 = b_o_colors_secondary4; + o_colors_secondary5 = b_o_colors_secondary5; + o_colors_secondary6 = b_o_colors_secondary6; + o_colors_secondary7 = b_o_colors_secondary7; + o_colors_secondary8 = b_o_colors_secondary8; + o_colors_mod1 = b_o_colors_mod1; + o_colors_mod2 = b_o_colors_mod2; + o_colors_mod3 = b_o_colors_mod3; + o_colors_mod4 = b_o_colors_mod4; +} + UINT32 ColorValueToUInt(const D3DCOLORVALUE &color) { auto r = static_cast(color.r * 255.0f); auto g = static_cast(color.g * 255.0f); diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 4b44c7cd..89ff9cda 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -361,4 +361,8 @@ namespace FlarialGUI { const float imageHeight); ImColor D2DColorToImColor(D2D1_COLOR_F color); + + void OverrideAlphaValues(float percent); + + void ResetOverrideAlphaValues(); } \ No newline at end of file diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 4afee4ed..71cf98dd 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -129,7 +129,7 @@ class ClickGUIRenderer : public Listener { } - Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); + //Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index 128fbbf0..35c10abe 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -52,7 +52,7 @@ class ComboCounter : public Module { this->addToggle("Border", "im just trolling", settings.getSettingByName("border")->value); this->addConditionalSlider(settings.getSettingByName("border")->value, "Border Width", "", settings.getSettingByName("borderWidth")->value, 4.0f); - + this->addToggle("NO MORE TROLLING.....", "", settings.getSettingByName("reversepaddingx")->value); this->extraPadding(); diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 08012707..92a9ab1d 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -218,6 +218,9 @@ void Module::addHeader(std::string text) { } void Module::addConditionalSlider(bool condition, std::string text, std::string subtext, float& startingPoint, float maxVal, float minVal, bool zerosafe) { + + FlarialGUI::OverrideAlphaValues((Constraints::RelativeConstraint(0.05f, "height", true) - conditionalSliderAnims[sliderIndex]) / Constraints::RelativeConstraint(0.05f, "height", true)); + if (condition) { padding -= conditionalSliderAnims[sliderIndex]; FlarialGUI::lerp(conditionalSliderAnims[sliderIndex], 0.0f, 0.25f * FlarialGUI::frameFactor); @@ -227,10 +230,11 @@ void Module::addConditionalSlider(bool condition, std::string text, std::string FlarialGUI::lerp(conditionalSliderAnims[sliderIndex], Constraints::RelativeConstraint(0.05f, "height", true), 0.25f * FlarialGUI::frameFactor); if (conditionalSliderAnims[sliderIndex] < Constraints::RelativeConstraint(0.0499f, "height", true)) { padding -= conditionalSliderAnims[sliderIndex]; - if (conditionalSliderAnims[sliderIndex] < Constraints::RelativeConstraint(0.045f, "height", true)) Module::addSlider(text, subtext, startingPoint, maxVal, minVal, zerosafe); - else padding += Constraints::RelativeConstraint(0.05f, "height", true); + Module::addSlider(text, subtext, startingPoint, maxVal, minVal, zerosafe); } } + + FlarialGUI::ResetOverrideAlphaValues(); } void Module::addElementText(std::string text, std::string subtext) { From 8a55962bd0ccb57d00a439116320ef5e623ace23 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 4 Aug 2024 22:53:24 +0800 Subject: [PATCH 041/240] textbox!!!! --- .../Elements/Control/TextBox/TextBox.cpp | 13 +++------- src/Client/GUI/Engine/Engine.cpp | 22 ----------------- src/Client/GUI/Engine/Engine.hpp | 3 +-- .../Modules/ComboCounter/ComboCounter.hpp | 11 ++++----- src/Client/Module/Modules/Module.cpp | 24 ++++++++++++++----- src/Client/Module/Modules/Module.hpp | 5 ++-- 6 files changed, 30 insertions(+), 48 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/TextBox/TextBox.cpp b/src/Client/GUI/Engine/Elements/Control/TextBox/TextBox.cpp index b5a2b9f7..35202ec1 100644 --- a/src/Client/GUI/Engine/Elements/Control/TextBox/TextBox.cpp +++ b/src/Client/GUI/Engine/Elements/Control/TextBox/TextBox.cpp @@ -49,8 +49,7 @@ std::string FlarialGUI::TextBoxVisual(int index, std::string &text, int limit, f } if (FlarialGUI::TextBoxes[index].isActive) { - if (FlarialGUI::TextBoxes[index].isAt1) - FlarialGUI::lerp(FlarialGUI::TextBoxes[index].cursorOpac, -1.0f, 0.05f * FlarialGUI::frameFactor); + if (FlarialGUI::TextBoxes[index].isAt1) FlarialGUI::lerp(FlarialGUI::TextBoxes[index].cursorOpac, -1.0f, 0.05f * FlarialGUI::frameFactor); else FlarialGUI::lerp(FlarialGUI::TextBoxes[index].cursorOpac, 2.0f, 0.05f * FlarialGUI::frameFactor); } else FlarialGUI::TextBoxes[index].cursorOpac = 0; @@ -65,6 +64,8 @@ std::string FlarialGUI::TextBoxVisual(int index, std::string &text, int limit, f const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); const float percHeight = Constraints::RelativeConstraint(0.035, "height", true); + y -= percHeight / 2.0f; + if (isAdditionalY) UnSetIsInAdditionalYMode(); text = FlarialGUI::TextBox(index, text, limit, x, y, Constraints::SpacingConstraint(1.55, textWidth), percHeight); @@ -85,14 +86,6 @@ std::string FlarialGUI::TextBoxVisual(int index, std::string &text, int limit, f Constraints::SpacingConstraint(1.55, textWidth), percHeight, DWRITE_TEXT_ALIGNMENT_LEADING, textSize, DWRITE_FONT_WEIGHT_NORMAL); - - - //IDWriteTextFormat* textFormat; - //FlarialGUI::writeFactory->CreateTextFormat(LClient::settings.getSettingByName("fontname")->value, NULL, DWRITE_FONT_WEIGHT_REGULAR, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, Constraints::FontScaler(textSize), L"", &textFormat); - - // textFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_NEAR); !!! - //textLayout->Release(); - D2D1_COLOR_F cursorCol = colors_primary2_rgb ? rgbColor : colors_primary2; cursorCol.a = o_colors_primary2; diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index b903933f..d3ce3414 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -130,28 +130,6 @@ std::unordered_map FlarialGUI::additionalY; //std::unordered_map> FlarialGUI::gradientStopCache; LRUCache> FlarialGUI::gradientBrushCache(300); -/* -float b_o_colors_text = o_colors_text; -float b_o_colors_enabled = o_colors_enabled; -float b_o_colors_disabled = o_colors_disabled; -float b_o_colors_primary1 = o_colors_primary1; -float b_o_colors_primary2 = o_colors_primary2; -float b_o_colors_primary3 = o_colors_primary3; -float b_o_colors_primary4 = o_colors_primary4; -float b_o_colors_secondary1 = o_colors_secondary1; -float b_o_colors_secondary2 = o_colors_secondary2; -float b_o_colors_secondary3 = o_colors_secondary3; -float b_o_colors_secondary4 = o_colors_secondary4; -float b_o_colors_secondary5 = o_colors_secondary5; -float b_o_colors_secondary6 = o_colors_secondary6; -float b_o_colors_secondary7 = o_colors_secondary7; -float b_o_colors_secondary8 = o_colors_secondary8; -float b_o_colors_mod1 = o_colors_mod1; -float b_o_colors_mod2 = o_colors_mod2; -float b_o_colors_mod3 = o_colors_mod3; -float b_o_colors_mod4 = o_colors_mod4; -*/ - float b_o_colors_text; float b_o_colors_enabled; float b_o_colors_disabled; diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 89ff9cda..ffcee36b 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -291,8 +291,7 @@ namespace FlarialGUI { void NotifyHeartbeat(); - std::string - TextBoxVisual(int index, std::string &text, int limit, float x, float y, const std::string &real = "Text Format"); + std::string TextBoxVisual(int index, std::string& text, int limit, float x, float y, const std::string& real = ""); winrt::com_ptr getBrush(D2D1_COLOR_F color); diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index 35c10abe..a3a6858c 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -46,14 +46,13 @@ class ComboCounter : public Module { Constraints::RelativeConstraint(1.0f, "height")); this->addHeader("Module UI"); - this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); - - this->addToggle("Border", "im just trolling", settings.getSettingByName("border")->value); - + this->addToggle("Border", "", settings.getSettingByName("border")->value); this->addConditionalSlider(settings.getSettingByName("border")->value, "Border Width", "", settings.getSettingByName("borderWidth")->value, 4.0f); - - this->addToggle("NO MORE TROLLING.....", "", settings.getSettingByName("reversepaddingx")->value); + this->addSlider("Rounding", "", this->settings.getSettingByName("rounding")->value); + this->addToggle("Translucency", "", this->settings.getSettingByName("BlurEffect")->value); + this->addTextBox("Text Format", "", settings.getSettingByName("text")->value); + this->extraPadding(); diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 92a9ab1d..6751ab25 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -217,20 +217,33 @@ void Module::addHeader(std::string text) { padding += Constraints::RelativeConstraint(0.055f, "height", true); } -void Module::addConditionalSlider(bool condition, std::string text, std::string subtext, float& startingPoint, float maxVal, float minVal, bool zerosafe) { +void Module::addTextBox(std::string text, std::string subtext, std::string& value) { + float x = Constraints::PercentageConstraint(0.019, "left"); + float elementX = Constraints::PercentageConstraint(0.285f, "right"); + float y = Constraints::PercentageConstraint(0.10, "top") + padding; + + FlarialGUI::TextBoxVisual(textboxIndex, settings.getSettingByName("text")->value, 16, elementX , y); + + Module::addElementText(text, subtext); + + padding += Constraints::RelativeConstraint(0.05f, "height", true); + textboxIndex++; +} + +void Module::addConditionalSlider(bool condition, std::string text, std::string subtext, float& value, float maxVal, float minVal, bool zerosafe) { FlarialGUI::OverrideAlphaValues((Constraints::RelativeConstraint(0.05f, "height", true) - conditionalSliderAnims[sliderIndex]) / Constraints::RelativeConstraint(0.05f, "height", true)); if (condition) { padding -= conditionalSliderAnims[sliderIndex]; FlarialGUI::lerp(conditionalSliderAnims[sliderIndex], 0.0f, 0.25f * FlarialGUI::frameFactor); - Module::addSlider(text, subtext, startingPoint, maxVal, minVal, zerosafe); + Module::addSlider(text, subtext, value, maxVal, minVal, zerosafe); } else { FlarialGUI::lerp(conditionalSliderAnims[sliderIndex], Constraints::RelativeConstraint(0.05f, "height", true), 0.25f * FlarialGUI::frameFactor); if (conditionalSliderAnims[sliderIndex] < Constraints::RelativeConstraint(0.0499f, "height", true)) { padding -= conditionalSliderAnims[sliderIndex]; - Module::addSlider(text, subtext, startingPoint, maxVal, minVal, zerosafe); + Module::addSlider(text, subtext, value, maxVal, minVal, zerosafe); } } @@ -258,12 +271,11 @@ void Module::addElementText(std::string text, std::string subtext) { if (!subtext.empty()) FlarialGUI::FlarialTextWithFont(x, subtextY, FlarialGUI::to_wide(subtext).c_str(), 200, 0, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize2, DWRITE_FONT_WEIGHT_MEDIUM, FlarialGUI::HexToColorF("473b3d"), false); } -void Module::addSlider(std::string text, std::string subtext, float& startingPoint, float maxVal, float minVal, bool zerosafe) { - float x = Constraints::PercentageConstraint(0.019, "left"); +void Module::addSlider(std::string text, std::string subtext, float& value, float maxVal, float minVal, bool zerosafe) { float elementX = Constraints::PercentageConstraint(0.33f, "right"); float y = Constraints::PercentageConstraint(0.10, "top") + padding; - FlarialGUI::Slider(sliderIndex, elementX, y, startingPoint, maxVal, minVal, zerosafe); + FlarialGUI::Slider(sliderIndex, elementX, y, value, maxVal, minVal, zerosafe); Module::addElementText(text, subtext); diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index 697756dc..ed182efd 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -55,9 +55,10 @@ class Module { void extraPadding(); void addElementText(std::string text, std::string subtext = ""); void addHeader(std::string text); - void addConditionalSlider(bool condition, std::string text, std::string subtext, float& startingPoint, float maxVal = 100.0f, float minVal = 0.0f, bool zerosafe = true); - void addSlider(std::string text, std::string subtext, float& startingPoint, float maxVal = 100.0f, float minVal = 0.0f, bool zerosafe = true); + void addConditionalSlider(bool condition, std::string text, std::string subtext, float& value, float maxVal = 100.0f, float minVal = 0.0f, bool zerosafe = true); + void addSlider(std::string text, std::string subtext, float& value, float maxVal = 100.0f, float minVal = 0.0f, bool zerosafe = true); void addToggle(std::string text, std::string subtext, bool& value); + void addTextBox(std::string text, std::string subtext, std::string& value); virtual void loadDefaults(); void saveSettings() const; void loadSettings(); From 0fe9003680fd43833584be953abb09a1c84eac52 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 21:10:38 +0600 Subject: [PATCH 042/240] idk --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 37 ++++-- .../Engine/Elements/Control/Image/Image.cpp | 2 + .../Shapes/Rect/ShadowRect/ShadowRect.cpp | 88 ++++++-------- .../Hook/Hooks/Render/SwapchainHook.cpp | 59 +++++++++- .../Hook/Hooks/Render/SwapchainHook.hpp | 5 +- .../Modules/MotionBlur/MotionBlurListener.hpp | 110 +----------------- 6 files changed, 129 insertions(+), 172 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 67e540b9..9ad7dffe 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -164,6 +164,7 @@ ID3D11PixelShader *dbgShader; void Blur::InitializePipeline() { + HRESULT hr; ID3D11DeviceContext* pContext; SwapchainHook::d3d11Device->GetImmediateContext(&pContext); @@ -211,8 +212,9 @@ void Blur::InitializePipeline() sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; SwapchainHook::d3d11Device->CreateSamplerState(&sd, &pSampler); -} + pContext->Release(); +} void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderResourceView *pShaderResourceView, XMFLOAT2 rtvSize) { HRESULT hr; @@ -222,7 +224,8 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe dsd.DepthEnable = false; dsd.StencilEnable = false; ID3D11DepthStencilState *pDepthStencilState; - SwapchainHook::d3d11Device->CreateDepthStencilState(&dsd, &pDepthStencilState); + hr = SwapchainHook::d3d11Device->CreateDepthStencilState(&dsd, &pDepthStencilState); + if (FAILED(hr)) { pContext->Release(); return; } pContext->OMSetDepthStencilState(pDepthStencilState, 0); void *null = nullptr; @@ -243,7 +246,7 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe pContext->VSSetShader(pVertexShader, nullptr, 0); pContext->PSSetSamplers(0, 1, &pSampler); pContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); - D3D11_BLEND_DESC bd; + D3D11_BLEND_DESC bd{}; ZeroMemory(&bd, sizeof(bd)); bd.AlphaToCoverageEnable = false; bd.RenderTarget[0].BlendEnable = true; @@ -255,7 +258,8 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe bd.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; bd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; ID3D11BlendState *pBlendState; - SwapchainHook::d3d11Device->CreateBlendState(&bd, &pBlendState); + hr = SwapchainHook::d3d11Device->CreateBlendState(&bd, &pBlendState); + if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); return; } pContext->OMSetBlendState(pBlendState, NULL, 0xffffffff); D3D11_RASTERIZER_DESC rd{}; rd.FillMode = D3D11_FILL_SOLID; @@ -263,7 +267,8 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe rd.DepthClipEnable = false; rd.ScissorEnable = false; ID3D11RasterizerState *pRasterizerState; - SwapchainHook::d3d11Device->CreateRasterizerState(&rd, &pRasterizerState); + hr = SwapchainHook::d3d11Device->CreateRasterizerState(&rd, &pRasterizerState); + if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); pBlendState->Release(); return; } pContext->RSSetState(pRasterizerState); pContext->PSSetShaderResources(0, 1, &pShaderResourceView); @@ -280,26 +285,29 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe pContext->Draw(sizeof(quadVertices) / sizeof(quadVertices[0]), 0); ID3D11RenderTargetView* kajgd = nullptr; pContext->OMSetRenderTargets(1, &kajgd, nullptr); + + pDepthStencilState->Release(); + pBlendState->Release(); + pRasterizerState->Release(); + pContext->Release(); } void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) { - ID3D11Texture2D* tex = MotionBlurListener::GetBackbuffer(); - if(!tex) return; + if (!SwapchainHook::GetBackbuffer()) return; - ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::SaveBackbuffer(); - if(!pOrigShaderResourceView) return; + ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); + if (!pOrigShaderResourceView) return; ID3D11DeviceContext* pContext; SwapchainHook::d3d11Device->GetImmediateContext(&pContext); - HRESULT hr; std::vector framebuffers; std::vector renderTargetViews; std::vector shaderResourceViews; std::vector fbSizes; D3D11_TEXTURE2D_DESC desc; - tex->GetDesc(&desc); + SwapchainHook::GetBackbuffer()->GetDesc(&desc); framebuffers.reserve((size_t)iterations); renderTargetViews.reserve((size_t)iterations); @@ -355,8 +363,13 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio renderTargetViews[i]->Release(); framebuffers[i]->Release(); shaderResourceViews[i]->Release(); + + renderTargetViews.clear(); + framebuffers.clear(); + shaderResourceViews.clear(); + fbSizes.clear(); } - tex->Release(); + pContext->Release(); pOrigShaderResourceView->Release(); } diff --git a/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp b/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp index e0fa7a5a..efa7549a 100644 --- a/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp @@ -271,6 +271,8 @@ bool FlarialGUI::LoadImageFromResource(int resourceId, D3D12_CPU_DESCRIPTOR_HAND void FlarialGUI::image(int resourceId, D2D1_RECT_F rect, LPCTSTR type, bool shouldadd) { + if(Client::settings.getSettingByName("noicons")->value) return; + if (isInScrollView and shouldadd) { rect.top += scrollpos; rect.bottom += scrollpos; diff --git a/src/Client/GUI/Engine/Elements/Shapes/Rect/ShadowRect/ShadowRect.cpp b/src/Client/GUI/Engine/Elements/Shapes/Rect/ShadowRect/ShadowRect.cpp index 48c04f2b..b27b47ee 100644 --- a/src/Client/GUI/Engine/Elements/Shapes/Rect/ShadowRect/ShadowRect.cpp +++ b/src/Client/GUI/Engine/Elements/Shapes/Rect/ShadowRect/ShadowRect.cpp @@ -1,66 +1,48 @@ #include "../../../../Engine.hpp" #include "../../../../../../Client.hpp" -inline float GetColorComponent(ImU32 color, int shift) { - return ((color >> shift) & 0xFF) / 255.0f; -} void RoundedRectBorder(Vec2 Position, Vec2 Size, ImColor Colour, float Thickness, float Rounding, int Flags) { ImGui::GetBackgroundDrawList()->AddRect(ImVec2(Position.x, Position.y), ImVec2(Position.x + Size.x, Position.y + Size.y), Colour, Rounding, Flags, Thickness); } -void FlarialGUI::ShadowRect(Vec2 pos, Vec2 size, D2D_COLOR_F color, float rounding, int shadowSize) -{ - if (isInScrollView) pos.y += scrollpos; - - ImColor shadowColor = ImColor(color.r, color.g, color.b, color.a); - shadowColor.Value.w *= .5f; - - for (int i = 0; i < shadowSize; i++) - { - float progress = (float)i / shadowSize; - float alphaFactor = (1.0f - progress) * (1.0f - progress); //took help from gpt for alpha factor - - float shadowR = GetColorComponent(shadowColor, IM_COL32_R_SHIFT); - float shadowG = GetColorComponent(shadowColor, IM_COL32_G_SHIFT); - float shadowB = GetColorComponent(shadowColor, IM_COL32_B_SHIFT); - float shadowA = GetColorComponent(shadowColor, IM_COL32_A_SHIFT) * alphaFactor; - - ImU32 fadedShadowColor = ImColor(shadowR, shadowG, shadowB, shadowA); - - Vec2 offset = Vec2(progress * shadowSize, progress * shadowSize); - - //ImGui::GetBackgroundDrawList()->AddRect(ImVec2(pos.x - offset.x, pos.y - offset.y), ImVec2(pos.x + size.x + (offset.x * 2), pos.y + size.y + (offset.y * 2)), fadedShadowColor, rounding + progress * shadowSize, 240, 2); - - RoundedRectBorder(pos - offset, size + offset + offset, fadedShadowColor, 2.0f, rounding + progress * shadowSize, 240); - } - //ImGui::GetBackgroundDrawList()->AddRect(ImVec2(pos.x, pos.y), ImVec2(size.x + pos.y, size.y + pos.y), shadowColor, rounding, 240, 1); - RoundedRectBorder(pos, size, ImColor(color.r, color.g, color.b, color.a), 1, rounding, 240); - - /* - - color.a *= .5f; - - for (int i = 0; i < shadowSize; i++) - { - float progress = (float)i / shadowSize; - float alphaFactor = (1.0f - progress) * (1.0f - progress); //took help from gpt for alpha factor - - ImColor fadedShadowColor = ImColor(color.r, color.g, color.b, color.a * alphaFactor); +void FlarialGUI::ShadowRect(Vec2 pos, Vec2 size, D2D_COLOR_F color, float rounding, int shadowSize) { - Vec2 offset = Vec2(progress * shadowSize, progress * shadowSize); + if (Client::settings.getSettingByName("noshadows")->value) return; - ImGui::GetBackgroundDrawList()->AddRect(ImVec2(pos.x - (offset.x), pos.y - (offset.y)), ImVec2(pos.x + size.x + (offset.x * 2), pos.y + size.y + (offset.y * 2)), fadedShadowColor, rounding + progress * shadowSize, 0, 2); + if (isInScrollView) pos.y += scrollpos; - //FlarialGUI::RoundedHollowRect(pos.x - offset.x, pos.y - offset.y, 2.0f, fadedShadowColor, size.x + offset.x*2, size.y + offset.y*2, rounding + progress * shadowSize, rounding + progress * shadowSize); - - //RoundedRectBorder(pos - offset, size + offset + offset, fadedShadowColor, 2.0f, rounding + progress * shadowSize); + ImColor shadowColor(color.r, color.g, color.b, color.a * 0.5f); + + for (int i = 0; i < shadowSize; i++) { + float progress = static_cast(i) / shadowSize; + float alphaFactor = (1.0f - progress) * (1.0f - progress); + + ImColor fadedShadowColor = ImColor( + shadowColor.Value.x, + shadowColor.Value.y, + shadowColor.Value.z, + shadowColor.Value.w * alphaFactor + ); + + Vec2 offset(progress * shadowSize, progress * shadowSize); + + RoundedRectBorder( + pos - offset, + size + offset + offset, + fadedShadowColor, + 2.0f, + rounding + progress * shadowSize, + 240 + ); } - ImGui::GetBackgroundDrawList()->AddRect(ImVec2(pos.x, pos.y), ImVec2(pos.x + size.x, pos.y + size.y), D2DColorToImColor(color), rounding, 0, 2); - - //FlarialGUI::RoundedHollowRect(pos.x, pos.y, shadowSize, color, size.x, size.y, rounding, rounding); - //RoundedRectBorder(pos, size, color, 1, rounding); - - */ -} \ No newline at end of file + RoundedRectBorder( + pos, + size, + ImColor(color.r, color.g, color.b, color.a), + 1.0f, + rounding, + 240 + ); +} diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index a964d083..0638daac 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -162,6 +162,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI } else { + SaveBackbuffer(); /* IMPORTANT FONT STUFF */ if (ImGui::GetCurrentContext()) { @@ -419,8 +420,6 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); - - RenderEvent event; event.RTV = mainRenderTargetView; EventHandler::onRender(event); @@ -610,3 +609,59 @@ void SwapchainHook::DX12Init() { init = true; } } + +ID3D11Texture2D* SwapchainHook::GetBackbuffer() +{ + return SavedD3D11BackBuffer; +} + + void SwapchainHook::SaveBackbuffer() + { + + Memory::SafeRelease(SavedD3D11BackBuffer); + + ID3D11DeviceContext* deviceContext; + SwapchainHook::d3d11Device->GetImmediateContext(&deviceContext); + IDXGISurface1* backBuffer = nullptr; + HRESULT hr; + SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); + + ID3D11Texture2D* buffer2D = nullptr; + if(FAILED(backBuffer->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&buffer2D)))) std::cout << "failed to get 2d" << std::endl; + + D3D11_TEXTURE2D_DESC desc; + buffer2D->GetDesc(&desc); + + ID3D11Texture2D* stageTex = nullptr; + D3D11_TEXTURE2D_DESC stageDesc = desc; + stageDesc.Usage = D3D11_USAGE_STAGING; + stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + stageDesc.BindFlags = 0; + + //desc.Usage = DXGI_USAGE_SHADER_INPUT; + HRESULT r = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); + deviceContext->CopyResource(stageTex, buffer2D); + + if (FAILED(r)) std::cout << "Failed to create stage texture: " << std::hex << r << std::endl; + + + D3D11_TEXTURE2D_DESC defaultDesc = desc; + defaultDesc.Usage = D3D11_USAGE_DEFAULT; + defaultDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + defaultDesc.CPUAccessFlags = 0; + + ID3D11Texture2D* defaultTexture = nullptr; + hr = SwapchainHook::d3d11Device->CreateTexture2D(&defaultDesc, nullptr, &defaultTexture); + if (FAILED(hr)) { + std::cout << "Failed to create def texture: " << std::hex << r << std::endl; + } + + deviceContext->CopyResource(defaultTexture, stageTex); + + stageTex->Release(); + Memory::SafeRelease(backBuffer); + Memory::SafeRelease(buffer2D); + Memory::SafeRelease(deviceContext); + + SavedD3D11BackBuffer = defaultTexture; + } diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp index 573b5b33..d7cbb4f6 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp @@ -33,6 +33,9 @@ class SwapchainHook : public Hook { static void DX12Init(); + static ID3D11Texture2D* GetBackbuffer(); + static void SaveBackbuffer(); + typedef HRESULT(__thiscall *SwapchainOriginal)(IDXGISwapChain3 *, UINT, UINT); static inline SwapchainOriginal funcOriginal = nullptr; @@ -41,7 +44,7 @@ class SwapchainHook : public Hook { SwapchainHook(); void enableHook() override; - + static inline ID3D11Texture2D* SavedD3D11BackBuffer; static ID3D12CommandQueue *queue; static inline std::vector DXGISurfaces; static inline std::vector D2D1Bitmaps; diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index 6087cf8c..5058f49c 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -40,7 +40,7 @@ class MotionBlurListener : public Listener { previousFrames.erase(previousFrames.begin(), previousFrames.begin() + framesToRemove); } - ID3D11ShaderResourceView* buffer = SaveBackbuffer(); + ID3D11ShaderResourceView* buffer = BackbufferToSRV(); if(buffer) previousFrames.push_back(buffer); @@ -75,119 +75,21 @@ class MotionBlurListener : public Listener { ImGui::SetCursorScreenPos(ImVec2(pos.x + size.x, pos.y)); } - static ID3D11Texture2D* GetBackbuffer() - { + static ID3D11ShaderResourceView* BackbufferToSRV() { - ID3D11DeviceContext* deviceContext; - SwapchainHook::d3d11Device->GetImmediateContext(&deviceContext); - IDXGISurface1* backBuffer = nullptr; HRESULT hr; - SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); - - ID3D11Texture2D* buffer2D = nullptr; - if(FAILED(backBuffer->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&buffer2D)))) std::cout << "failed to get 2d" << std::endl; - - D3D11_TEXTURE2D_DESC desc; - buffer2D->GetDesc(&desc); - - ID3D11Texture2D* stageTex = nullptr; - D3D11_TEXTURE2D_DESC stageDesc = desc; - stageDesc.Usage = D3D11_USAGE_STAGING; - stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - stageDesc.BindFlags = 0; - - //desc.Usage = DXGI_USAGE_SHADER_INPUT; - HRESULT r = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); - deviceContext->CopyResource(stageTex, buffer2D); - - if (FAILED(r)) std::cout << "Failed to create stage texture: " << std::hex << r << std::endl; - - - D3D11_TEXTURE2D_DESC defaultDesc = desc; - defaultDesc.Usage = D3D11_USAGE_DEFAULT; - defaultDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - defaultDesc.CPUAccessFlags = 0; - - ID3D11Texture2D* defaultTexture = nullptr; - hr = SwapchainHook::d3d11Device->CreateTexture2D(&defaultDesc, nullptr, &defaultTexture); - if (FAILED(hr)) { - std::cout << "Failed to create def texture: " << std::hex << r << std::endl; - } - - deviceContext->CopyResource(defaultTexture, stageTex); - - stageTex->Release(); - - //if(outSRV) std::cout << "Wroekd" << std::endl; - - backBuffer->Release(); - buffer2D->Release(); - - return defaultTexture; - } - - - static ID3D11ShaderResourceView* SaveBackbuffer() - { - - ID3D11DeviceContext* deviceContext; - SwapchainHook::d3d11Device->GetImmediateContext(&deviceContext); - IDXGISurface1* backBuffer = nullptr; - HRESULT hr; - SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); - - ID3D11Texture2D* buffer2D = nullptr; - if(FAILED(backBuffer->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&buffer2D)))) std::cout << "failed to get 2d" << std::endl; - - D3D11_TEXTURE2D_DESC desc; - buffer2D->GetDesc(&desc); - - ID3D11Texture2D* stageTex = nullptr; - D3D11_TEXTURE2D_DESC stageDesc = desc; - stageDesc.Usage = D3D11_USAGE_STAGING; - stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - stageDesc.BindFlags = 0; - - //desc.Usage = DXGI_USAGE_SHADER_INPUT; - HRESULT r = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); - deviceContext->CopyResource(stageTex, buffer2D); - - if (FAILED(r)) std::cout << "Failed to create stage texture: " << std::hex << r << std::endl; - - - D3D11_TEXTURE2D_DESC defaultDesc = desc; - defaultDesc.Usage = D3D11_USAGE_DEFAULT; - defaultDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - defaultDesc.CPUAccessFlags = 0; - - ID3D11Texture2D* defaultTexture = nullptr; - hr = SwapchainHook::d3d11Device->CreateTexture2D(&defaultDesc, nullptr, &defaultTexture); - if (FAILED(hr)) { - std::cout << "Failed to create def texture: " << std::hex << r << std::endl; - } - - deviceContext->CopyResource(defaultTexture, stageTex); - - stageTex->Release(); - ID3D11ShaderResourceView* outSRV; D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = desc.Format; + srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = desc.MipLevels; + srvDesc.Texture2D.MipLevels = 1; srvDesc.Texture2D.MostDetailedMip = 0; - if (FAILED(hr = SwapchainHook::d3d11Device->CreateShaderResourceView(defaultTexture, &srvDesc, &outSRV))) + if (FAILED(hr = SwapchainHook::d3d11Device->CreateShaderResourceView(SwapchainHook::GetBackbuffer(), &srvDesc, &outSRV))) { std::cout << "Failed to create shader resource view: " << std::hex << hr << std::endl; } - //if(outSRV) std::cout << "Wroekd" << std::endl; - - Memory::SafeRelease(backBuffer); - Memory::SafeRelease(buffer2D); - Memory::SafeRelease(defaultTexture); - return outSRV; } @@ -405,6 +307,6 @@ void InitializeRenderResources(ID3D11Device* device) //context->OMSetRenderTargets(1, nullptr, nullptr); - std::cout << "trolled" << std::endl; + context->Release(); } }; \ No newline at end of file From f1915c1318d358ec364cea47db3806675c77a9ca Mon Sep 17 00:00:00 2001 From: = Date: Sun, 4 Aug 2024 23:23:55 +0800 Subject: [PATCH 043/240] dropdowns idk --- .../Engine/Elements/Control/Dropdown/Dropdown.cpp | 3 +++ src/Client/GUI/Engine/Engine.hpp | 8 +++----- .../Module/Modules/ComboCounter/ComboCounter.hpp | 6 +++--- src/Client/Module/Modules/Module.cpp | 15 +++++++++++++-- src/Client/Module/Modules/Module.hpp | 1 + 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.cpp b/src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.cpp index ca72662e..93e396a0 100644 --- a/src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.cpp @@ -45,6 +45,9 @@ std::string FlarialGUI::Dropdown(int index, float x, float y, const std::vector< const bool isAdditionalY = shouldAdditionalY; const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); const float percHeight = Constraints::RelativeConstraint(0.035, "height", true); + + y -= percHeight / 2.0f; + float childHeights = Constraints::RelativeConstraint(0.030, "height", true); float maxHeight = ((float)options.size() - 1.0f) * childHeights + 2.0f; float addYVal = maxHeight + Constraints::SpacingConstraint(0.05, textWidth); diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index ffcee36b..3539e474 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -179,8 +179,7 @@ namespace FlarialGUI { void LoadImageFromFile(const wchar_t *filename, ID2D1Bitmap **bitmap); - void FlarialText(float x, float y, const wchar_t *text, float width, float height, - DWRITE_TEXT_ALIGNMENT alignment); + void FlarialText(float x, float y, const wchar_t *text, float width, float height,DWRITE_TEXT_ALIGNMENT alignment); void SetScrollView(float x, float y, float width, float height); @@ -223,7 +222,7 @@ namespace FlarialGUI { bool Toggle(int index, float x, float y, bool isEnabled, bool rgb); - float Slider(int index, float x, float y, float& startingPoint, float maxValue = 100.0f, float minValue = 0.0f, bool zerosafe = true); + float Slider(int index, float x, float y, float& value, float maxValue = 100.0f, float minValue = 0.0f, bool zerosafe = true); void Circle(float x, float y, const D2D1_COLOR_F &color, float radius); @@ -241,8 +240,7 @@ namespace FlarialGUI { std::string ColorFToHex(const D2D1_COLOR_F &color); - void - RoundedHollowRect(float x, float y, float borderWidth, D2D_COLOR_F color, float width, + void RoundedHollowRect(float x, float y, float borderWidth, D2D_COLOR_F color, float width, float height, float radiusX, float radiusY); diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index a3a6858c..ba750b88 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -51,12 +51,12 @@ class ComboCounter : public Module { this->addConditionalSlider(settings.getSettingByName("border")->value, "Border Width", "", settings.getSettingByName("borderWidth")->value, 4.0f); this->addSlider("Rounding", "", this->settings.getSettingByName("rounding")->value); this->addToggle("Translucency", "", this->settings.getSettingByName("BlurEffect")->value); - this->addTextBox("Text Format", "", settings.getSettingByName("text")->value); - - this->extraPadding(); this->addHeader("Text"); + this->addTextBox("Text Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.00f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); this->resetPadding(); diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 6751ab25..ad194caf 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -218,11 +218,10 @@ void Module::addHeader(std::string text) { } void Module::addTextBox(std::string text, std::string subtext, std::string& value) { - float x = Constraints::PercentageConstraint(0.019, "left"); float elementX = Constraints::PercentageConstraint(0.285f, "right"); float y = Constraints::PercentageConstraint(0.10, "top") + padding; - FlarialGUI::TextBoxVisual(textboxIndex, settings.getSettingByName("text")->value, 16, elementX , y); + FlarialGUI::TextBoxVisual(textboxIndex, value, 16, elementX , y); Module::addElementText(text, subtext); @@ -230,6 +229,18 @@ void Module::addTextBox(std::string text, std::string subtext, std::string& valu textboxIndex++; } +void Module::addDropdown(std::string text, std::string subtext, const std::vector& options, std::string& value) { + float elementX = Constraints::PercentageConstraint(0.285f, "right"); + float y = Constraints::PercentageConstraint(0.10, "top") + padding; + + FlarialGUI::Dropdown(dropdownIndex, elementX, y, options, value, ""); + + Module::addElementText(text, subtext); + + padding += Constraints::RelativeConstraint(0.05f, "height", true); + dropdownIndex++; +} + void Module::addConditionalSlider(bool condition, std::string text, std::string subtext, float& value, float maxVal, float minVal, bool zerosafe) { FlarialGUI::OverrideAlphaValues((Constraints::RelativeConstraint(0.05f, "height", true) - conditionalSliderAnims[sliderIndex]) / Constraints::RelativeConstraint(0.05f, "height", true)); diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index ed182efd..8f95d771 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -59,6 +59,7 @@ class Module { void addSlider(std::string text, std::string subtext, float& value, float maxVal = 100.0f, float minVal = 0.0f, bool zerosafe = true); void addToggle(std::string text, std::string subtext, bool& value); void addTextBox(std::string text, std::string subtext, std::string& value); + void addDropdown(std::string text, std::string subtext, const std::vector& options, std::string& value); virtual void loadDefaults(); void saveSettings() const; void loadSettings(); From 494d7054dacc6e5dbf20530ff831226939f74826 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 21:59:08 +0600 Subject: [PATCH 044/240] fps boost --- src/Client/GUI/Engine/Engine.cpp | 16 ++++++++++++++-- src/Client/GUI/Engine/Engine.hpp | 2 ++ .../Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index d3ce3414..a52f663e 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -126,6 +126,9 @@ std::unordered_map FlarialGUI::cachedBitmaps; LRUCache> FlarialGUI::textLayoutCache(4000); LRUCache> FlarialGUI::textFormatCache(300); +LRUCache FlarialGUI::fromWideCache(4000); +LRUCache FlarialGUI::toWideCache(4000); + std::unordered_map FlarialGUI::additionalY; //std::unordered_map> FlarialGUI::gradientStopCache; LRUCache> FlarialGUI::gradientBrushCache(300); @@ -296,13 +299,17 @@ uint64_t generateUniqueLinearGradientBrushKey(float x, float hexPreviewSize, flo return combinedHash; } -std::string FlarialGUI::WideToNarrow(const std::wstring& wideStr) { +std::string WideToNarrow_creator(const std::wstring& wideStr) { int narrowStrLen = WideCharToMultiByte(CP_UTF8, 0, wideStr.c_str(), -1, nullptr, 0, nullptr, nullptr); std::vector narrowStr(narrowStrLen); WideCharToMultiByte(CP_UTF8, 0, wideStr.c_str(), -1, narrowStr.data(), narrowStrLen, nullptr, nullptr); return std::string(narrowStr.data()); } +std::string FlarialGUI::WideToNarrow(const std::wstring& wideStr) { + return fromWideCache.getOrInsert(WideToNarrow_creator, wideStr, wideStr); +} + bool FlarialGUI::CursorInRect(float rectX, float rectY, float width, float height) { if (MC::mousePos.x >= rectX && MC::mousePos.x <= rectX + width && MC::mousePos.y >= rectY && MC::mousePos.y <= rectY + height) { @@ -1501,7 +1508,8 @@ void FlarialGUI::CopyBitmap(ID2D1Bitmap1 *from, ID2D1Bitmap **to) { (*to)->CopyFromBitmap(&destPoint, from, &rect); } -std::wstring FlarialGUI::to_wide(const std::string &str) { +std::wstring to_wide_creator(const std::string &str) { + int wchars_num = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, nullptr, 0); std::wstring wide; wide.resize(wchars_num); @@ -1509,6 +1517,10 @@ std::wstring FlarialGUI::to_wide(const std::string &str) { return wide; } +std::wstring FlarialGUI::to_wide(const std::string &str) { + return toWideCache.getOrInsert(to_wide_creator, str, str); +} + template void FlarialGUI::lerp(T &a, const T &b, float t) { if (!Client::settings.getSettingByName("disableanims")->value) { diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 3539e474..68e6c228 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -133,6 +133,8 @@ namespace FlarialGUI { extern LRUCache> brushCache; extern LRUCache> textLayoutCache; extern LRUCache> textFormatCache; + extern LRUCache fromWideCache; + extern LRUCache toWideCache; //extern std::unordered_map> gradientStopCache; extern LRUCache> gradientBrushCache; diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 71cf98dd..4afee4ed 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -129,7 +129,7 @@ class ClickGUIRenderer : public Listener { } - //Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); + Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); From 1408194a129ff44e881e9d3341226476e39c955a Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 4 Aug 2024 22:03:57 +0600 Subject: [PATCH 045/240] Fix --- src/Client/Module/Modules/ComboCounter/ComboCounter.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index ba750b88..217dc5d6 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -43,7 +43,7 @@ class ComboCounter : public Module { FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); this->addHeader("Module UI"); this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); From c8e2f10b5ff59989746712434e0984dc6b8f8c85 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 5 Aug 2024 00:14:47 +0800 Subject: [PATCH 046/240] ill continue tomr (color pickers and stuff) --- .../Control/ColorPicker/ColorPicker.cpp | 6 ++++-- src/Client/GUI/Engine/Engine.hpp | 2 +- .../Modules/ComboCounter/ComboCounter.hpp | 21 ++++++++++++++++--- src/Client/Module/Modules/Module.cpp | 14 ++++++++++++- src/Client/Module/Modules/Module.hpp | 2 +- 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp b/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp index 493cf8c3..998abca4 100644 --- a/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp +++ b/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp @@ -37,7 +37,7 @@ static std::map sizes; -void FlarialGUI::ColorPicker(const int index, float x, const float y, std::string &hex, bool &rgb) { +void FlarialGUI::ColorPicker(const int index, float x, float y, std::string &hex, bool &rgb) { // Accepts hex, so for e.g. fps counter bg color wants to be changed then you'd have to give a modifyable hex value // Preferably save every color in config as a hex (string) @@ -58,7 +58,9 @@ void FlarialGUI::ColorPicker(const int index, float x, const float y, std::strin Vec2 round = Constraints::RoundingConstraint(13, 13); - float s = Constraints::RelativeConstraint(0.0285, "height", true); + float s = Constraints::RelativeConstraint(0.0285, "height", true); // this is the height of whole rect; + + y -= s / 2.f; D2D1_COLOR_F baseColor = colors_primary4_rgb ? rgbColor : colors_primary4; baseColor.a = o_colors_primary4; diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 3539e474..b660df3c 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -251,7 +251,7 @@ namespace FlarialGUI { D2D1::ColorF HSVtoColorF(float H, float s, float v); - void ColorPicker(const int index, float x, const float y, std::string &hex, bool &rgb); + void ColorPicker(const int index, float x, float y, std::string &hex, bool &rgb); void ColorPickerWindow(int index, std::string &hex, float &opacity, bool &rgb); diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index ba750b88..151091c6 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -46,17 +46,32 @@ class ComboCounter : public Module { Constraints::RelativeConstraint(1.0f, "height")); this->addHeader("Module UI"); - this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.f); this->addToggle("Border", "", settings.getSettingByName("border")->value); - this->addConditionalSlider(settings.getSettingByName("border")->value, "Border Width", "", settings.getSettingByName("borderWidth")->value, 4.0f); + this->addConditionalSlider(settings.getSettingByName("border")->value, "Border Width", "", settings.getSettingByName("borderWidth")->value, 4.f); this->addSlider("Rounding", "", this->settings.getSettingByName("rounding")->value); this->addToggle("Translucency", "", this->settings.getSettingByName("BlurEffect")->value); + this->addToggle("Responsive Rectangle", "Resizes width with text", this->settings.getSettingByName("responsivewidth")->value); + this->addSlider("Rotation", "", this->settings.getSettingByName("rotation")->value, 359.f, 0.f, false); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value, 3.f); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value, 3.f); + this->extraPadding(); this->addHeader("Text"); this->addTextBox("Text Format", "", settings.getSettingByName("text")->value); - this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.00f); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.f); this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addToggle("Reverse Padding X", "", this->settings.getSettingByName("reversepaddingx")->value); + this->addToggle("Reverse Padding Y", "", this->settings.getSettingByName("reversepaddingy")->value); + this->addSlider("Padding X", "", this->settings.getSettingByName("padx")->value, 1.f, 0.f, false); + this->addSlider("Padding Y", "", this->settings.getSettingByName("pady")->value, 1.f, 0.f, false); + + this->extraPadding(); + + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgRGB")->value); + this->resetPadding(); diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index ad194caf..3f3f9125 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -212,11 +212,23 @@ void Module::addHeader(std::string text) { col.a = o_colors_secondary6; std::string name = FlarialGUI::FlarialTextWithFont(x, y, FlarialGUI::to_wide(text).c_str(), 500, 0, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::RelativeConstraint(0.215f, "height", true), DWRITE_FONT_WEIGHT_BOLD, false); - FlarialGUI::RoundedRect(x, y + Constraints::RelativeConstraint(0.023f, "width"), col, FlarialGUI::TextSizes[name] + Constraints::RelativeConstraint(0.02f, "width"), 3.0f, 0, 0); + FlarialGUI::RoundedRect(x, y + Constraints::RelativeConstraint(0.023f, "width"), col, FlarialGUI::TextSizes[name] + Constraints::RelativeConstraint(0.01f, "width"), 3.0f, 0, 0); padding += Constraints::RelativeConstraint(0.055f, "height", true); } +void Module::addColorPicker(std::string text, std::string subtext, std::string& value, bool& rgb) { + float elementX = Constraints::PercentageConstraint(0.285f, "right"); + float y = Constraints::PercentageConstraint(0.10, "top") + padding; + + FlarialGUI::ColorPicker(colorPickerIndex, elementX, y, value, rgb); + + Module::addElementText(text, subtext); + + padding += Constraints::RelativeConstraint(0.05f, "height", true); + colorPickerIndex++; +} + void Module::addTextBox(std::string text, std::string subtext, std::string& value) { float elementX = Constraints::PercentageConstraint(0.285f, "right"); float y = Constraints::PercentageConstraint(0.10, "top") + padding; diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index 8f95d771..6f4c6399 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -51,7 +51,6 @@ class Module { int colorPickerIndex = 0; void resetPadding(); - void extraPadding(); void addElementText(std::string text, std::string subtext = ""); void addHeader(std::string text); @@ -60,6 +59,7 @@ class Module { void addToggle(std::string text, std::string subtext, bool& value); void addTextBox(std::string text, std::string subtext, std::string& value); void addDropdown(std::string text, std::string subtext, const std::vector& options, std::string& value); + void addColorPicker(std::string text, std::string subtext, std::string& value, bool& rgb); virtual void loadDefaults(); void saveSettings() const; void loadSettings(); From 137e3fbbdfc2c56e5b6b00a11aaab5535a8ca39e Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sun, 4 Aug 2024 20:54:56 +0300 Subject: [PATCH 047/240] Rendersync fix? --- src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp | 3 +++ src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 12 +++++++----- src/Client/Hook/Hooks/Render/SwapchainHook.hpp | 1 + 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp index 3d765029..c152d609 100644 --- a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp +++ b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp @@ -93,7 +93,10 @@ class SetUpAndRenderHook : public Hook } FrameTransform transform = { SDK::clientInstance->getviewMatrix(), origin, SDK::clientInstance->getFov(), pos}; + + SwapchainHook::frameTransformsMtx.lock(); SwapchainHook::FrameTransforms.push(transform); + SwapchainHook::frameTransformsMtx.unlock(); if(layer == "debug_screen" || layer == "hud_screen" || layer == "start_screen") { SetupAndRenderEvent event(muirc); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 0638daac..8a36c131 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -244,11 +244,13 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI /* RENDER SYNC */ - if(init && initImgui) - while(FrameTransforms.size() > transformDelay) - { - MC::Transform = FrameTransforms.front(); - FrameTransforms.pop(); + if(init && initImgui) { + frameTransformsMtx.lock(); + while (FrameTransforms.size() > transformDelay) { + MC::Transform = FrameTransforms.front(); + FrameTransforms.pop(); + } + frameTransformsMtx.unlock(); } /* RENDER SYNC */ diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp index d7cbb4f6..4f6cbc66 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp @@ -73,6 +73,7 @@ class SwapchainHook : public Hook { static inline uint64_t buffersCounts = 0; static inline std::vector frameContexts = {}; + static inline std::mutex frameTransformsMtx; static inline std::queue FrameTransforms; static inline int transformDelay = 3; From 6912a2c2b6b7311fcbf9d4e31783dc5b87416434 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 16:11:46 +0300 Subject: [PATCH 048/240] Compact way to store sigs/offsets --- src/Utils/Memory/Game/Offset/OffsetInit.cpp | 645 ++----------------- src/Utils/Memory/Game/Sig/SigInit.cpp | 676 ++------------------ src/Utils/Versions/VersionUtils.cpp | 69 +- src/Utils/Versions/VersionUtils.hpp | 2 +- 4 files changed, 135 insertions(+), 1257 deletions(-) diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index ab79c00e..ec524390 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -6,116 +6,20 @@ void OffsetInit::init2100() { Logger::debug("[Offsets] Loading offsets for 1.21.0X"); - // Keystrokes - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); - - // Hitboxes and other +/- 1 - ADD_OFFSET("Actor::getActorFlag", 0); ADD_OFFSET("Actor::isAlive", 50); ADD_OFFSET("Actor::isValidTarget", 56); - // Armour HUD, Inventory HUD ADD_OFFSET("Inventory::getItem", 7); - ADD_OFFSET("ClientInstance::getBlockSource", 28); - ADD_OFFSET("ClientInstance::getLocalPlayer", 29); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("Packet::getId", 1); - - ADD_OFFSET("Actor::hurtTime", 0x20C); // ?hurtEffects@Mob@@UEAAXAEBVActorDamageSource@@M_N1@Z Mob::hurtEffects 2nd after Actor::getHealth(void) + ADD_OFFSET("Actor::hurtTime", 0x20C); ADD_OFFSET("Actor::level", 0x250); ADD_OFFSET("Actor::categories", 0x288); - ADD_OFFSET("Actor::baseTickVft", 26); - - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); ADD_OFFSET("Player::playerInventory", 0x760); ADD_OFFSET("Player::playerName", 0x1D30); ADD_OFFSET("Player::gamemode", 0xEC8); - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x10); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0xC8); - ADD_OFFSET("ClientInstance::guiData", 0x558); - ADD_OFFSET("ClientInstance::viewMatrix", 0x330); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F0); - ADD_OFFSET("ClientInstance::getFovY", 0x704); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Minecraft::timer", 0xD8); - - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); - - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); - - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); - - ADD_OFFSET("ItemStack::tag", 0x10); - ADD_OFFSET("ItemStack::count", 0x22); - - ADD_OFFSET("Biome::temparature", 0x38); - - ADD_OFFSET("Dimension::weather", 0x1B0); - ADD_OFFSET("Weather::lightingLevel", 0x48); - ADD_OFFSET("Weather::rainLevel", 0x3C); - - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5FC); - - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); - - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x80); - - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); - - ADD_OFFSET("RaknetConnector::JoinedIp", 0x458); - ADD_OFFSET("RaknetConnector::getPeer", 0x298); - ADD_OFFSET("RakPeer::GetAveragePing", 44); - - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); - - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); - - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); - - ADD_OFFSET("ScreenView::VisualTree", 0x48); - - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); - - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); - - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); - - ADD_OFFSET("VisualTree::root", 0x8); ADD_OFFSET("Level::hitResult", 0xB38); ADD_OFFSET("Level::getPlayerMap", 0x1BC8); @@ -124,352 +28,73 @@ void OffsetInit::init2100() { void OffsetInit::init2080() { Logger::debug("[Offsets] Loading offsets for 1.20.8X"); - // Keystrokes - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); - - // Hitboxes and other +/- 1 - ADD_OFFSET("Actor::getActorFlag", 0); ADD_OFFSET("Actor::isAlive", 51); ADD_OFFSET("Actor::isValidTarget", 57); - - // Armour HUD, Inventory HUD - ADD_OFFSET("Inventory::getItem", 5); - - ADD_OFFSET("ClientInstance::getBlockSource", 28); - ADD_OFFSET("ClientInstance::getLocalPlayer", 29); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("Packet::getId", 1); - - ADD_OFFSET("Actor::hurtTime", 0x214); // ?hurtEffects@Mob@@UEAAXAEBVActorDamageSource@@M_N1@Z Mob::hurtEffects 2nd after Actor::getHealth(void) - ADD_OFFSET("Actor::level", 0x258); - ADD_OFFSET("Actor::categories", 0x290); ADD_OFFSET("Actor::baseTickVft", 26); - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); - - ADD_OFFSET("Player::playerInventory", 0x788); + ADD_OFFSET("Player::playerInventory", 0x788); ADD_OFFSET("Player::playerName", 0x1D18); ADD_OFFSET("Player::gamemode", 0xEB0); - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x10); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0xC8); - ADD_OFFSET("ClientInstance::guiData", 0x558); - ADD_OFFSET("ClientInstance::viewMatrix", 0x330); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F0); - ADD_OFFSET("ClientInstance::getFovY", 0x704); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Minecraft::timer", 0xD8); - - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); - - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); - - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); - - ADD_OFFSET("ItemStack::tag", 0x10); - ADD_OFFSET("ItemStack::count", 0x22); - ADD_OFFSET("Biome::temparature", 0x38); - ADD_OFFSET("Dimension::weather", 0x1B0); - - ADD_OFFSET("Weather::lightingLevel", 0x44); ADD_OFFSET("Weather::rainLevel", 0x3C); - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5FC); - - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); - - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x80); - - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); - - ADD_OFFSET("RaknetConnector::JoinedIp", 0x458); - ADD_OFFSET("RaknetConnector::getPeer", 0x298); - ADD_OFFSET("RakPeer::GetAveragePing", 44); - - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); - - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); - - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); - - ADD_OFFSET("ScreenView::VisualTree", 0x48); - - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); - - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); - - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); - - ADD_OFFSET("VisualTree::root", 0x8); - - ADD_OFFSET("Level::hitResult", 0xB30); - ADD_OFFSET("Level::getPlayerMap", 0x1C88); -} - -void OffsetInit::init2070() { - Logger::debug("[Offsets] Loading offsets for 1.20.7X"); - - // Keystrokes - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); - - // Hitboxes and other - ADD_OFFSET("Actor::getActorFlag", 0); - ADD_OFFSET("Actor::isAlive", 53); - ADD_OFFSET("Actor::isValidTarget", 61); - - // Armour HUD, Inventory HUD - ADD_OFFSET("Inventory::getItem", 5); - - ADD_OFFSET("ClientInstance::getBlockSource", 28); - ADD_OFFSET("ClientInstance::getLocalPlayer", 29); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("Packet::getId", 1); - - ADD_OFFSET("Actor::hurtTime", 0x214); // ?hurtEffects@Mob@@UEAAXAEBVActorDamageSource@@M_N1@Z Mob::hurtEffects 2nd after Actor::getHealth(void) - ADD_OFFSET("Actor::level", 0x258); - ADD_OFFSET("Actor::categories", 0x290); - ADD_OFFSET("Actor::baseTickVft", 29); - - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); - - ADD_OFFSET("Player::playerInventory", 0x7B0); - ADD_OFFSET("Player::playerName", 0x1D70); - ADD_OFFSET("Player::gamemode", 0xED8); - - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x010); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0xC8); - ADD_OFFSET("ClientInstance::guiData", 0x558); - ADD_OFFSET("ClientInstance::viewMatrix", 0x330); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F0); - ADD_OFFSET("ClientInstance::getFovY", 0x704); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Minecraft::timer", 0xD8); - - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); - - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); - - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); - - ADD_OFFSET("ItemStack::tag", 0x10); - ADD_OFFSET("ItemStack::count", 0x22); - - ADD_OFFSET("Biome::temparature", 0x40); - - ADD_OFFSET("Dimension::weather", 0x1B0); - - ADD_OFFSET("Weather::lightingLevel", 0x44); - ADD_OFFSET("Weather::rainLevel", 0x38); - - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5FC); - - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); - - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x80); - - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); - - ADD_OFFSET("RaknetConnector::JoinedIp", 0x438); - ADD_OFFSET("RaknetConnector::getPeer", 0x278); - ADD_OFFSET("RakPeer::GetAveragePing", 44); - - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); - - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); - - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); - - ADD_OFFSET("ScreenView::VisualTree", 0x48); - - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); - - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); - - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); - - ADD_OFFSET("VisualTree::root", 0x8); - - ADD_OFFSET("Level::hitResult", 0xB18); - ADD_OFFSET("Level::getPlayerMap", 0x1E98); -} - -void OffsetInit::init2060() { - Logger::debug("[Offsets] Loading offsets for 1.20.6X"); - - // Keystrokes - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); - - // Hitboxes and other - ADD_OFFSET("Actor::getActorFlag", 0); - ADD_OFFSET("Actor::isAlive", 54); - ADD_OFFSET("Actor::isValidTarget", 62); - - // Armour HUD, Inventory HUD - ADD_OFFSET("Inventory::getItem", 5); - - ADD_OFFSET("ClientInstance::getBlockSource", 27); - ADD_OFFSET("ClientInstance::getLocalPlayer", 28); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("Packet::getId", 1); - - ADD_OFFSET("Actor::hurtTime", 0x234); - ADD_OFFSET("Actor::level", 0x290); - ADD_OFFSET("Actor::categories", 0x2C8); - ADD_OFFSET("Actor::baseTickVft", 30); - - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); - - ADD_OFFSET("Player::playerInventory", 0x7F0); - ADD_OFFSET("Player::playerName", 0x1D40); - ADD_OFFSET("Player::gamemode", 0xF18); - - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x010); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0x0C8); - ADD_OFFSET("ClientInstance::guiData", 0x558); - ADD_OFFSET("ClientInstance::viewMatrix", 0x0330); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F0); - ADD_OFFSET("ClientInstance::getFovY", 0x704); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Minecraft::timer", 0xD8); - - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); - - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); + ADD_OFFSET("RaknetConnector::JoinedIp", 0x458); + ADD_OFFSET("RaknetConnector::getPeer", 0x298); - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); + ADD_OFFSET("Level::hitResult", 0xB30); + ADD_OFFSET("Level::getPlayerMap", 0x1C88); +} - ADD_OFFSET("ItemStack::tag", 0x10); - ADD_OFFSET("ItemStack::count", 0x22); +void OffsetInit::init2070() { + Logger::debug("[Offsets] Loading offsets for 1.20.7X"); - ADD_OFFSET("Biome::temparature", 0x40); + ADD_OFFSET("Actor::isAlive", 53); + ADD_OFFSET("Actor::isValidTarget", 61); - ADD_OFFSET("Dimension::weather", 0x1A8); + ADD_OFFSET("ClientInstance::getBlockSource", 28); + ADD_OFFSET("ClientInstance::getLocalPlayer", 29); - ADD_OFFSET("Weather::lightingLevel", 0x44); - ADD_OFFSET("Weather::rainLevel", 0x38); + ADD_OFFSET("Actor::hurtTime", 0x214); + ADD_OFFSET("Actor::level", 0x258); + ADD_OFFSET("Actor::categories", 0x290); - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5E4); + ADD_OFFSET("Actor::baseTickVft", 29); - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); + ADD_OFFSET("Player::playerInventory", 0x7B0); + ADD_OFFSET("Player::playerName", 0x1D70); + ADD_OFFSET("Player::gamemode", 0xED8); - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x80); + ADD_OFFSET("Dimension::weather", 0x1B0); - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); + ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5FC); - ADD_OFFSET("RaknetConnector::JoinedIp", 0x438); - ADD_OFFSET("RaknetConnector::getPeer", 0x278); - ADD_OFFSET("RakPeer::GetAveragePing", 44); + ADD_OFFSET("Level::hitResult", 0xB18); - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); +} - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); +void OffsetInit::init2060() { + Logger::debug("[Offsets] Loading offsets for 1.20.6X"); - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); + ADD_OFFSET("Actor::isAlive", 54); + ADD_OFFSET("Actor::isValidTarget", 62); - ADD_OFFSET("ScreenView::VisualTree", 0x48); + ADD_OFFSET("Actor::hurtTime", 0x234); + ADD_OFFSET("Actor::level", 0x290); + ADD_OFFSET("Actor::categories", 0x2C8); - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); + ADD_OFFSET("Player::playerInventory", 0x7F0); + ADD_OFFSET("Player::playerName", 0x1D40); + ADD_OFFSET("Player::gamemode", 0xF18); - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); + ADD_OFFSET("ClientInstance::guiData", 0x558); + ADD_OFFSET("ClientInstance::getFovX", 0x6F0); + ADD_OFFSET("ClientInstance::getFovY", 0x704); - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); + ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); - ADD_OFFSET("VisualTree::root", 0x8); + ADD_OFFSET("RakPeer::GetAveragePing", 44); ADD_OFFSET("Level::hitResult", 0xA98); ADD_OFFSET("Level::getPlayerMap", 0x1E98); @@ -478,234 +103,48 @@ void OffsetInit::init2060() { void OffsetInit::init2050() { Logger::debug("[Offsets] Loading offsets for 1.20.5X"); - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); - - // Hitboxes and other - ADD_OFFSET("Actor::getActorFlag", 0); ADD_OFFSET("Actor::isAlive", 57); ADD_OFFSET("Actor::isValidTarget", 65); - // Armour HUD, Inventory HUD - ADD_OFFSET("Inventory::getItem", 5); - ADD_OFFSET("ClientInstance::getBlockSource", 27); ADD_OFFSET("ClientInstance::getLocalPlayer", 28); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F8); - ADD_OFFSET("ClientInstance::getFovY", 0x70C); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Packet::getId", 1); ADD_OFFSET("Actor::hurtTime", 0x22C); ADD_OFFSET("Actor::level", 0x288); ADD_OFFSET("Actor::categories", 0x2C0); - ADD_OFFSET("Actor::baseTickVft", 30); - - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); ADD_OFFSET("Player::playerInventory", 0x7E8); ADD_OFFSET("Player::playerName", 0x1D28); ADD_OFFSET("Player::gamemode", 0xF10); - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x010); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0x0C8); - ADD_OFFSET("ClientInstance::guiData", 0x560); - ADD_OFFSET("ClientInstance::viewMatrix", 0x0330); - - ADD_OFFSET("Minecraft::timer", 0xD8); - - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x190); - - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); - - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); - - ADD_OFFSET("ItemStack::tag", 0x10); ADD_OFFSET("ItemStack::count", 0x22); - ADD_OFFSET("Biome::temparature", 0x40); - - ADD_OFFSET("Dimension::weather", 0x1A8); - ADD_OFFSET("Weather::lightingLevel", 0x44); ADD_OFFSET("Weather::rainLevel", 0x38); - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5E4); - - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x80); - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); - - ADD_OFFSET("RaknetConnector::JoinedIp", 0x438); - ADD_OFFSET("RaknetConnector::getPeer", 0x278); - ADD_OFFSET("RakPeer::GetAveragePing", 42); - - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); - - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); - - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); - - ADD_OFFSET("ScreenView::VisualTree", 0x48); - - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); - - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); - - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); - - ADD_OFFSET("VisualTree::root", 0x8); - ADD_OFFSET("Level::hitResult", 0xA48); ADD_OFFSET("Level::getPlayerMap", 0x1EA8); } void OffsetInit::init2040() { // getGamma, combo & - Logger::debug("[Offsets] Loading offsets for 1.20.4X"); // quite some offsets are wrong - - ADD_OFFSET("MoveInputComponent::forward", 0x0A); - ADD_OFFSET("MoveInputComponent::backward", 0x0B); - ADD_OFFSET("MoveInputComponent::left", 0x0C); - ADD_OFFSET("MoveInputComponent::right", 0x0D); - ADD_OFFSET("MoveInputComponent::sneaking", 0x20); - ADD_OFFSET("MoveInputComponent::jumping", 0x26); - ADD_OFFSET("MoveInputComponent::sprinting", 0x27); + Logger::debug("[Offsets] Loading offsets for 1.20.4X"); - // Hitboxes and other - ADD_OFFSET("Actor::getActorFlag", 0); ADD_OFFSET("Actor::isAlive", 58); ADD_OFFSET("Actor::isValidTarget", 66); - - // Armour HUD, Inventory HUD - ADD_OFFSET("Inventory::getItem", 5); - - ADD_OFFSET("ClientInstance::getBlockSource", 26); - ADD_OFFSET("ClientInstance::getLocalPlayer", 27); - ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); - - ADD_OFFSET("ClientInstance::getFovX", 0x6F8); - ADD_OFFSET("ClientInstance::getFovY", 0x70C); - ADD_OFFSET("ClientInstance::getPacketSender", 0xF0); - - ADD_OFFSET("Packet::getId", 1); - ADD_OFFSET("Actor::hurtTime", 0x204); - ADD_OFFSET("Actor::level", 0x260); - ADD_OFFSET("Actor::categories", 0x298); ADD_OFFSET("Actor::baseTickVft", 30); - ADD_OFFSET("Gamemode::player", 0x8); - ADD_OFFSET("Gamemode::lastBreakProgress", 0x20); - ADD_OFFSET("Gamemode::attackVft", 14); - - ADD_OFFSET("Player::playerInventory", 0x7C0); ADD_OFFSET("Player::playerName", 0x1CB8); ADD_OFFSET("Player::gamemode", 0xEB0); - ADD_OFFSET("BlockSource::dimension", 0x30); - - ADD_OFFSET("PlayerInventory::SelectedSlot", 0x10); - ADD_OFFSET("PlayerInventory::inventory", 0xC0); - - ADD_OFFSET("ClientInstance::minecraftGame", 0xC8); - ADD_OFFSET("ClientInstance::guiData", 0x560); - ADD_OFFSET("ClientInstance::viewMatrix", 0x330); - - ADD_OFFSET("Minecraft::timer", 0xD8); - ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x190); - ADD_OFFSET("Option::optionInformation", 0x8); - ADD_OFFSET("Option::value", 0x10); - ADD_OFFSET("Option::value1", 0x70); - ADD_OFFSET("OptionInfo::TranslateName", 0x158); - - ADD_OFFSET("Item::AtlasTextureFile", 0x8); - ADD_OFFSET("Item::Namespace", 0xF8); - ADD_OFFSET("Item::name",0xD0); - - ADD_OFFSET("ItemStack::tag", 0x10); - ADD_OFFSET("ItemStack::count", 0x20); - - ADD_OFFSET("Biome::temparature", 0x40); - - ADD_OFFSET("Dimension::weather", 0x1A8); - - ADD_OFFSET("Weather::lightingLevel", 0x48); + ADD_OFFSET("Weather::lightingLevel", 0x48); ADD_OFFSET("Weather::rainLevel", 0x3C); - ADD_OFFSET("LevelRender::getLevelRendererPlayer", 0x308); - ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x5E4); - - ADD_OFFSET("LoopbackPacketSender::networkSystem", 0x20); - - ADD_OFFSET("NetworkSystem::remoteConnectorComposite", 0x60); - - ADD_OFFSET("RemoteConnectorComposite::rakNetConnector", 0x60); - - ADD_OFFSET("RaknetConnector::JoinedIp", 0x438); - ADD_OFFSET("RaknetConnector::getPeer", 0x278); - ADD_OFFSET("RakPeer::GetAveragePing", 42); - - ADD_OFFSET("BaseActorRenderContext::itemRenderer", 0x58); - - ADD_OFFSET("GuiData::ScreenSize", 0x30); - ADD_OFFSET("GuiData::ScreenSizeScaled", 0x40); - ADD_OFFSET("GuiData::GuiScale", 0x4C); - ADD_OFFSET("GuiData::screenResRounded", 0x38); - ADD_OFFSET("GuiData::sliderAmount", 0x4C); - ADD_OFFSET("GuiData::scalingMultiplier", 0x50); - - ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); - ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); - - ADD_OFFSET("ScreenView::VisualTree", 0x48); - - ADD_OFFSET("MinecraftCustomUIRenderer::state", 0x10); - - ADD_OFFSET("CustomRenderComponent::renderer", 0x18); - - ADD_OFFSET("UIControl::LayerName", 0x18); - ADD_OFFSET("UIControl::scale", 0x40); - ADD_OFFSET("UIControl::x", 0x78); - ADD_OFFSET("UIControl::y", 0x7C); - ADD_OFFSET("UIControl::children", 0xA0); - - ADD_OFFSET("VisualTree::root", 0x8); - ADD_OFFSET("Level::hitResult", 0xA68); ADD_OFFSET("Level::getPlayerMap", 0x25F0); } @@ -739,7 +178,7 @@ void OffsetInit::init2030() { ADD_OFFSET("Packet::getId", 1); - ADD_OFFSET("Actor::hurtTime", 0x22C); + ADD_OFFSET("Actor::hurtTime", 0x22C); // ?hurtEffects@Mob@@UEAAXAEBVActorDamageSource@@M_N1@Z Mob::hurtEffects 2nd after Actor::getHealth(void) ADD_OFFSET("Actor::level", 0x260); ADD_OFFSET("Actor::categories", 0x298); ADD_OFFSET("Actor::baseTickVft", 44); diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 6c9d6a7a..0e935460 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -6,692 +6,101 @@ void SigInit::init2120() { Logger::debug("[Signatures] Loading sigs for 1.21.2X"); - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8D ? ? ? ? E8"); - - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); // wrong - - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); // wrong - - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC ? 45 33 C0 48 8B D9 81 FA"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "? ? ? ? ? ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); // wrong - - // Fullbright - ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); // wrong - - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); - - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); // wrong - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); - - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - - // Weather - ADD_SIG("BlockSource::getBiome", "48 89 5C 24 18 57 48 83 EC 50 48 8B F9 E8"); - - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - - // Nametag - ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84"); - - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "? ? ? ? ? ? ? ? ? ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD - ADD_SIG("Actor::getActorEquipmentComponent", "4C 8B 41 48 4C 8B C9 48 8B 41 50 4C 8B 51 68 49 2B C0 48 C1 F8 03 48 FF C8 25 36"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); - ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 10"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); - -} - -void SigInit::init2100() { - Logger::debug("[Signatures] Loading sigs for 1.21.0X"); - - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8D ? ? ? ? E8"); - - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); // wrong - - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); // wrong - - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "? ? ? ? ? ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); // wrong - - // Fullbright - ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); // wrong - - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); - - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); // wrong - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); - - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - - // Weather - ADD_SIG("BlockSource::getBiome", "48 89 5C 24 18 57 48 83 EC 50 48 8B F9 E8"); - - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - - // Nametag - ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84"); - - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "? ? ? ? ? ? ? ? ? ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD - ADD_SIG("Actor::getActorEquipmentComponent", "4C 8B 41 48 4C 8B C9 48 8B 41 50 4C 8B 51 68 49 2B C0 48 C1 F8 03 48 FF C8 25 36"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); - ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 10"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); - -} - -void SigInit::init2080() { - Logger::debug("[Signatures] Loading sigs for 1.20.8X"); - - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8D ? ? ? ? E8"); - - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); - - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); - - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "? ? ? ? ? ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); - - // Fullbright - ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); - - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); - - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); - - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - - // Weather - ADD_SIG("BlockSource::getBiome", "40 53 48 83 EC ? 48 8B D9 E8 ? ? ? ? 48 85 C0 75 5C"); - - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - - // Nametag - ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84"); - - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD - ADD_SIG("Actor::getActorEquipmentComponent", "4C 8B 41 48 4C 8B C9 48 8B 41 50 4C 8B 51 68 49 2B C0 48 C1 F8 03 48 FF C8 25 36"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); - ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C0"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); -} - -void SigInit::init2070() { - Logger::debug("[Signatures] Loading sigs for 1.20.7X"); - - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); - - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); - - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89 54 24 ? 4C 8B E9 48 89 4C 24"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); - - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "? ? ? ? ? ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); - - // Fullbright - ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); - - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); - - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); - - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - - // Weather - ADD_SIG("BlockSource::getBiome", "40 53 48 83 EC ? 48 8B D9 E8 ? ? ? ? 48 85 C0 75 5C"); - - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - - // Nametag - ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84"); - - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - - // Armour HUD - ADD_SIG("Actor::getArmor", "48 8B 89 20 04 00 00 48 8B 01 48 8B 40 28 48"); - ADD_SIG("Actor::getOffhandSlot", "48 8B 89 ? ? ? ? BA ? ? ? ? 48 8B 01 48 8B 40 ? 48 FF 25"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); - ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 E0 1C 00 00"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); + ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC ? 45 33 C0 48 8B D9 81 FA"); } -void SigInit::init2060() { - Logger::debug("[Signatures] Loading sigs for 1.20.6X"); - - ADD_SIG("Keyboard::feed", "48 ?? ?? ?? 0F B6 ?? 4C ?? ?? ?? ?? ?? ?? 89 ?? ?? ?? 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); +void SigInit::init2100() { + Logger::debug("[Signatures] Loading sigs for 1.21.0X"); - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); + ADD_SIG("BlockSource::getBiome", "48 89 5C 24 18 57 48 83 EC 50 48 8B F9 E8"); + ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 10"); +} - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); +void SigInit::init2080() { + Logger::debug("[Signatures] Loading sigs for 1.20.8X"); - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); + ADD_SIG("tryGetPrefix2", "4C 8B 41 48 4C 8B C9 48 8B 41 50 4C 8B 51 68 49 2B C0 48 C1 F8 03 48 FF"); - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); + // 36 48 C4 71 + ADD_SIG("Actor::getActorEquipmentComponent", "C8 25 36 48 C4 71"); - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); + ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8D ? ? ? ? E8"); - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); + ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C0"); - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "41 0F 10 08 48 8B C2 0F"); + ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); +} - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "48 8B ? 48 89 ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); +void SigInit::init2070() { + Logger::debug("[Signatures] Loading sigs for 1.20.7X"); - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); + ADD_SIG("Dimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 11 02 C3 CC CC CC CC CC 48 89 54"); - // Fullbright - ADD_SIG("Options::getGamma", "48 83 EC ? 80 B9 ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); + ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "? ? ? ? ? ? C2 0F 28 D3 F3 0F 59 1D"); - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); + ADD_SIG("LevelRendererPlayer::getFov", "? ? ? ? ? ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); + ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); + ADD_SIG("Actor::getArmor", "48 8B 89 20 04 00 00 48 8B 01 48 8B 40 28 48"); - //TimeChanger - ADD_SIG("TimeChanger", "44 8B C2 B8 F1 19 76 05 F7 EA"); + ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 E0 1C 00 00"); +} - // Weather - ADD_SIG("BlockSource::getBiome", "40 53 48 83 EC ? 48 8B D9 E8 ? ? ? ? 48 85 C0 75 5C"); +void SigInit::init2060() { + Logger::debug("[Signatures] Loading sigs for 1.20.6X"); - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); + ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 45 33 F6"); - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); + ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24"); - // Nametag ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84"); - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD ADD_SIG("Actor::getArmor", "48 8B 89 58 04 00 00 48 8B 01 48 8B 40 28 48"); - ADD_SIG("Actor::getOffhandSlot", "48 8B 89 ? ? ? ? BA ? ? ? ? 48 8B 01 48 8B 40 ? 48 FF 25"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C8 1C 00 00"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); } void SigInit::init2050() { Logger::debug("[Signatures] Loading sigs for 1.20.5X"); - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); + ADD_SIG("tryGetPrefix", "48 89 5C 24 ? 57 48 83 EC ? 48 8B"); ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B F9 4C 8D B1"); - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); - - ADD_SIG("Actor::getActorGameTypeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... - ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "41 0F 10 08 48 8B C2 0F"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "48 8B ? 48 89 ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); - - // Fullbright - ADD_SIG("Options::getGamma", "48 83 EC ? 80 B9 ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); - - // HurtColor ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 18 89 44 24 ? 48 8D 54 24 ? 48 8B 4B ? E8 ? ? ? ? 48 8B F8"); - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11 4D"); - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "44 8B C2 B8 F1 19 76 05 F7 EA"); - - // Weather ADD_SIG("BlockSource::getBiome", "40 53 48 83 EC ? 48 8B D9 E8 ? ? ? ? 48 85 C0 75 5C"); - // FreeLook ADD_SIG("CameraYaw", "F3 0F 11 ? F3 0F 11 ? ? 48 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - // Nametag ADD_SIG("ThirdPersonNametag", "? ? ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84 ? ? ? ? 49 8B 97"); - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "40 53 48 83 EC ? 48 8B DA BA 2E CD 8B 46"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "40 53 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD ADD_SIG("Actor::getArmor", "48 8B 89 50 04 00 00 48 8B 01 48 8B 40 28 48"); ADD_SIG("Actor::getOffhandSlot", "48 8B 89 ? ? ? ? BA ? ? ? ? 48 8B 01 48 8B 40 ? 48 FF 25"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 D8 1C 00 00"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); } void SigInit::init2040() { Logger::debug("[Signatures] Loading sigs for 1.20.4X"); - ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); - ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); - - ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8F ? ? ? ? E8 ? ? ? ? 33 D2"); - - ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 55 57 41 56 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B F1 48 8D B1 ? ? ? ? 48 83 3E 00 0F 85 ? ? ? ? 48 8D 4C 24 ? E8 ? ? ? ? 48 3B F0 74 1A 48 8B 08 48 C7 00 ? ? ? ? 48 8B 16 48 89 0E"); - - ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); - ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); - - ADD_SIG("Actor::getActorGameTypeComponent", "40 53 48 83 EC ? 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "40 53 48 83 EC ? 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "40 53 48 83 EC ? 48 8B DA BA 91 3C C9 0E"); - - // AutoGG, AutoRQ, DiscordRPC ... ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); - ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); - ADD_SIG("RaknetTick", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 45 33 FF 4C 89 BD ? ? ? ? 48 8D 95 ? ? ? ?"); - - // Reach display - ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - - ADD_SIG("Actor::getRuntimeIDComponent", "40 53 48 83 EC 20 48 8B DA BA 14 14 A1 3C"); - - // Fog color - ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); - ADD_SIG("OverworldDimension::getBrightnessDependentFogColor", "41 0F 10 08 48 8B C2 0F"); - - // Zoom, UpsideDown and FOV Changer - ADD_SIG("LevelRendererPlayer::getFov", "48 8B ? 48 89 ? ? 48 89 ? ? 57 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 44 0F ? ? ? 44 0F ? ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? 41 0F"); - - // Zoom - ADD_SIG("Options::getSensitivity", "4C 8B 51 20 49 B9"); - // Fullbright ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); - // HurtColor - ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 48 8B ? ? 48 8B ? 8B 43 ? 89 44 ? ? 48 8D ? ? ? E8 ? ? ? ? 48 8B ? 48 85 ? 0F 84 ? ? ? ? 48 8B"); - - // Block outline - ADD_SIG("blockHighlightColor", "? ? ? ? 0F 11 45 ? 0F 11 00 C6 40 10 ? 45 38 96"); - ADD_SIG("mce::Color::BLACK", "? ? ? ? 0F 11 00 C6 40 10 ? 0F 57 C9 0F 11"); - - // Coordinates - ADD_SIG("ForceCoordsOption", "80 78 ? ? 0F 95 C0 48 8B 5C 24"); - - //TimeChanger - ADD_SIG("TimeChanger", "44 8B C2 B8 F1 19 76 05 F7 EA"); - - // Weather - ADD_SIG("BlockSource::getBiome", "40 57 48 83 EC 50 48 8B F9 E8"); - - // FreeLook - ADD_SIG("CameraYaw", "F3 0F 11 30 F3 ? ? 78 ? 49 8B CE"); - ADD_SIG("CameraYaw2", "F3 0F 11 ? F3 0F 11 ? ? 48 8B 4D"); - ADD_SIG("CameraPitch", "F3 0F 11 0E 48 89 9C"); - ADD_SIG("CameraMovement", "F3 0F 11 01 48 8D 56"); - ADD_SIG("getViewPerspective", "48 83 EC ? 48 8B 01 48 8D 54 ? ? 41 B8 03 00 00 00"); - - // No Hurt Cam - ADD_SIG("CameraAssignAngle", "8B 44 24 48 89 43 08 C6"); - - // Nametag - ADD_SIG("ThirdPersonNametag", "? ? ? ? ? ? 49 8B ? 48 8B ? E8 ? ? ? ? 84 C0 ? ? ? ? ? ? 49 8B ? 49 8b"); - - // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "40 53 48 83 EC 20 48 8B DA BA 2E"); - - // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "40 53 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); - ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); // Hitboxes - - // onTick event - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 ? ? ? ? 8D 50 FA 44 8D 48 ? 44 8D 40 ? 66 89 44 ? ? E8 ? ? ? ? 48 8B 8B"); - - // Nick - ADD_SIG("Actor::setNametag", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 48 8B FA 48 8B 89 ? ? ? ? 48 85 C9 0F 84"); - - // Armour HUD - ADD_SIG("Actor::getArmor", "48 8B 89 28 04 00 00 48 8B 01 48 8B 40 28 48 FF 25"); - ADD_SIG("Actor::getOffhandSlot", "48 8B 89 30 04 00 00 BA 01 00 00 00"); - ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); - ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); - ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); + ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); - // Tablist - ADD_SIG("Actor::getNametag", "48 83 EC ? 48 8B 81 ? ? ? ? 48 85 C0 74 3B 48 8B 08 BA ? ? ? ? 48 8B 40 ? 48 2B C1 48 C1 F8 ? 66 3B D0 73 17"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 78"); - - ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - - ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); } void SigInit::init2030() { Logger::debug("[Signatures] Loading sigs for 1.20.3X"); + ADD_SIG("tryGetPrefix", "40 53 48 83 EC 20 48 8B"); + ADD_SIG("Keyboard::feed", "? ? ? ? ? ? ? 4C 8D 05 ? ? ? ? 89 54 24 20 88"); ADD_SIG("MouseDevice::feed", "? ? ? ? ? ? ? ? 89 68 ? 48 89 70 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 44 0F B7 BC 24 ? ? ? ? 48 8B D9"); @@ -702,9 +111,9 @@ void SigInit::init2030() { ADD_SIG("ScreenView::setupAndRender", "? ? ? ? ? ? ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B FA 48 89"); ADD_SIG("Font::drawTransformed", "48 8B C4 48 89 58 ? 48 89 68 ? 48 89 70 ? 48 89 78 ? 41 54 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78"); - ADD_SIG("Actor::getActorGameTypeComponent", "40 53 48 83 EC 20 48 8B DA BA DE AB CB AF"); - ADD_SIG("Actor::getAABBShapeComponent", "40 53 48 83 EC 20 48 8B DA BA F2 C9 10 1B"); - ADD_SIG("Actor::getStateVectorComponent", "40 53 48 83 EC 20 48 8B DA BA 91 3C C9 0E"); + ADD_SIG("Actor::getActorGameTypeComponent", "DA BA DE AB CB AF"); + ADD_SIG("Actor::getAABBShapeComponent", "DA BA F2 C9 10 1B"); + ADD_SIG("Actor::getStateVectorComponent", "DA BA 91 3C C9 0E"); // AutoGG, AutoRQ, DiscordRPC ... ADD_SIG("LoopbackPacketSender::sendPacket", "48 89 5C 24 ? 57 48 83 EC 20 48 8B D9 48 8B FA 48 8B 49 20 E8 ? ? ? ? 4C 8B 03 48 8B D7"); @@ -714,7 +123,7 @@ void SigInit::init2030() { // Reach display ADD_SIG("GameMode::attack", "48 8D 05 ? ? ? ? 48 89 01 48 89 51 08 48 C7 41 ? ? ? ? ? C7 41 ? ? ? ? ?"); - ADD_SIG("Actor::getRuntimeIDComponent", "40 53 48 83 EC 20 48 8B DA BA 14 14 A1 3C"); + ADD_SIG("Actor::getRuntimeIDComponent", "DA BA 14 14 A1 3C"); // Fog color ADD_SIG("Dimension::getBrightnessDependentFogColor", "41 0F 10 00 48 8B C2 0F 11 02"); @@ -759,10 +168,10 @@ void SigInit::init2030() { ADD_SIG("ThirdPersonNametag", "? ? ? ? ? ? 49 8B ? 48 8B ? E8 ? ? ? ? 84 C0 ? ? ? ? ? ? 49 8B ? 49 8b"); // Keystrokes - ADD_SIG("Actor::getMoveInputHandler", "40 53 48 83 EC 20 48 8B DA BA 2E"); + ADD_SIG("Actor::getMoveInputHandler", "DA BA 2E CD 8B 46"); // Hitboxes - ADD_SIG("Actor::getRenderPositionComponent", "40 53 48 83 EC ? 48 8B DA BA 6E F3 E8 D4"); + ADD_SIG("Actor::getRenderPositionComponent", "DA BA 6E F3 E8 D4"); ADD_SIG("Actor::canSee", "48 89 5C 24 20 56 48 81 EC 00"); // Hitboxes // onTick event @@ -776,6 +185,7 @@ void SigInit::init2030() { ADD_SIG("Actor::getOffhandSlot", "48 8B 89 30 04 00 00 BA 01 00 00 00"); ADD_SIG("ItemStack::getDamageValue", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 85 D2"); ADD_SIG("ItemStack::getMaxDamage", "48 8B 41 08 48 85 C0 74 19"); + ADD_SIG("ItemStack::isEnchanted", "48 83 EC 38 48 8B 49 10 48 85 C9 74 4B"); ADD_SIG("ItemRenderer::renderGuiItemNew", "48 8B ? 53 55 56 57 41 ? 41 ? 41 ? 41 ? 48 81 EC ? ? ? ? 0F 29 ? ? 0F 29 ? ? 48 8B ? ? ? ? ? 48 33 ? 48 89 ? ? ? ? ? ? 45 8B"); // Tablist @@ -784,5 +194,13 @@ void SigInit::init2030() { ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); + ADD_SIG("Tessellator::begin", "48 89 5C 24 ? 56 48 83 EC ? 80 B9 ? ? ? ? ? 45 0F B6"); + ADD_SIG("Tessellator::vertex", "40 57 48 81 EC ? ? ? ? 0F 29 7C ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 ? 8B 81"); + ADD_SIG("Tessellator::colorF", "80 B9 ? ? ? ? ? 4C 8B C1 75"); + ADD_SIG("Tessellator::setRotation", "48 89 5C 24 ? 57 48 81 EC ? ? ? ? F3 41 0F 10"); + ADD_SIG("Tessellator::resetTransform", "80 B9 ? ? ? ? ? 4C 8B C1 75"); + ADD_SIG("MeshHelper::renderImmediately", "48 89 5C 24 ? 48 89 74 24 ? 57 48 81 EC ? ? ? ? 49 8B F8 48 8B DA 48 8B F1 80 BA"); + + ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); } diff --git a/src/Utils/Versions/VersionUtils.cpp b/src/Utils/Versions/VersionUtils.cpp index 9df4e1a4..19a66f0f 100644 --- a/src/Utils/Versions/VersionUtils.cpp +++ b/src/Utils/Versions/VersionUtils.cpp @@ -8,46 +8,67 @@ #include "../Memory/Game/Sig/SigInit.hpp" #include "../../Client/Client.hpp" -std::unordered_map, std::function>> VersionUtils::versions; +std::vector, std::function>>> VersionUtils::versions; void VersionUtils::init() { - std::pair, std::function> p2120 = {SigInit::init2120, OffsetInit::init2100}; - versions.emplace("1.21.2", p2120); + std::pair, std::function>> p2120 = {"1.21.2", {SigInit::init2120, OffsetInit::init2100}}; + versions.push_back(p2120); - std::pair, std::function> p2110 = {SigInit::init2100, OffsetInit::init2100}; - versions.emplace("1.21.1", p2110); + std::pair, std::function>> p2110 = {"1.21.1", {SigInit::init2100, OffsetInit::init2100}}; + versions.push_back(p2110); - std::pair, std::function> p2100 = {SigInit::init2100, OffsetInit::init2100}; - versions.emplace("1.21.3", p2100); + std::pair, std::function>> p2100 = {"1.21.3", {SigInit::init2100, OffsetInit::init2100}}; + versions.push_back(p2100); - std::pair, std::function> p2080 = {SigInit::init2080, OffsetInit::init2080}; - versions.emplace("1.20.8", p2080); + std::pair, std::function>> p2080 = {"1.20.8", {SigInit::init2080, OffsetInit::init2080}}; + versions.push_back(p2080); - std::pair, std::function> p2070 = {SigInit::init2070, OffsetInit::init2070}; - versions.emplace("1.20.7", p2070); + std::pair, std::function>> p2070 = {"1.20.7", {SigInit::init2070, OffsetInit::init2070}}; + versions.push_back(p2070); - std::pair, std::function> p2060 = {SigInit::init2060, OffsetInit::init2060}; - versions.emplace("1.20.6", p2060); + std::pair, std::function>> p2060 = {"1.20.6", {SigInit::init2060, OffsetInit::init2060}}; + versions.push_back(p2060); - std::pair, std::function> p2050 = {SigInit::init2050, OffsetInit::init2050}; - versions.emplace("1.20.5", p2050); + std::pair, std::function>> p2050 = {"1.20.5", {SigInit::init2050, OffsetInit::init2050}}; + versions.push_back(p2050); - std::pair, std::function> p2040 = {SigInit::init2040, OffsetInit::init2040}; - versions.emplace("1.20.4", p2040); + std::pair, std::function>> p2040 = {"1.20.4", {SigInit::init2040, OffsetInit::init2040}}; + versions.push_back(p2040); - std::pair, std::function> p2030 = {SigInit::init2030, OffsetInit::init2030}; - versions.emplace("1.20.3", p2030); + std::pair, std::function>> p2030 = {"1.20.3", {SigInit::init2030, OffsetInit::init2030}}; + versions.push_back(p2030); + + std::reverse(versions.begin(), versions.end()); } bool VersionUtils::isSupported(const std::string& version) { - return versions.contains(version); + return std::find_if(versions.begin(), versions.end(), + [version](const std::pair, std::function>>& p) { + return p.first == version; + }) != versions.end(); } void VersionUtils::addData() { - const auto& [v, o] = versions.at(Client::version); - - std::thread t1(v); - std::thread t2(o); + // load all offsets and sigs for each version + auto sigs = [&](){ + for (const auto &item: versions) { + item.second.first(); + if(item.first == Client::version) { + return; + } + } + }; + auto offsets = [&](){ + for (const auto &item: versions) { + item.second.second(); + if(item.first == Client::version) { + return; + } + } + }; + + std::thread t1(sigs); + std::thread t2(offsets); t1.join(); t2.join(); diff --git a/src/Utils/Versions/VersionUtils.hpp b/src/Utils/Versions/VersionUtils.hpp index 868f43de..b135ab01 100644 --- a/src/Utils/Versions/VersionUtils.hpp +++ b/src/Utils/Versions/VersionUtils.hpp @@ -12,5 +12,5 @@ class VersionUtils { static bool isSupported(const std::string& version); static void addData(); - static std::unordered_map, std::function>> versions; + static std::vector, std::function>>> versions; }; From 5f6a4c643086d2c8ade5393772ae63338bfa1b75 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 16:12:17 +0300 Subject: [PATCH 049/240] New packet stuff --- src/Client/Hook/Hooks/Game/PacketHooks.cpp | 33 ++++++++++++++-------- src/Client/Hook/Hooks/Game/PacketHooks.hpp | 16 +++++++---- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.cpp b/src/Client/Hook/Hooks/Game/PacketHooks.cpp index 8f2540e4..be490c7c 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.cpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.cpp @@ -15,8 +15,10 @@ void SendPacketHook::callback(LoopbackPacketSender *pSender, Packet *pPacket) { } } -void SendPacketHook::receiveCallbackText(const float *a1, const float *networkIdentifier, const float *netEventCallback, +void SendPacketHook::receiveCallbackText(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet) { + + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); if ( packet.get() && CompactChatListener::prev == reinterpret_cast(packet.get())->message @@ -25,36 +27,39 @@ void SendPacketHook::receiveCallbackText(const float *a1, const float *networkId PacketEvent event(packet.get()); EventHandler::onPacketReceive(event); if (!event.isCancelled()) - receiveTextPacketOriginal(a1, networkIdentifier, netEventCallback, packet); + receiveTextPacketOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } } void -SendPacketHook::receiveCallbackSetTitle(const float *a1, const float *networkIdentifier, const float *netEventCallback, +SendPacketHook::receiveCallbackSetTitle(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet) { + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); + PacketEvent event(packet.get()); EventHandler::onPacketReceive(event); if (!event.isCancelled()) - receiveSetTitlePacketOriginal(a1, networkIdentifier, netEventCallback, packet); + receiveSetTitlePacketOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } void -SendPacketHook::receiveCallbackPlaySound(const float *a1, const float *networkIdentifier, const float *netEventCallback, +SendPacketHook::receiveCallbackPlaySound(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet) { - + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); PacketEvent event(packet.get()); EventHandler::onPacketReceive(event); if (!event.isCancelled()) - receivePacketPlaySoundOriginal(a1, networkIdentifier, netEventCallback, packet); + receivePacketPlaySoundOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } -void SendPacketHook::receiveCallbackEntityEvent(const float *a1, const float *networkIdentifier, - const float *netEventCallback, const std::shared_ptr &packet) { +void SendPacketHook::receiveCallbackEntityEvent(void *packetHandlerDispatcher, void *networkIdentifier, + void *netEventCallback, const std::shared_ptr &packet) { + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); PacketEvent event(packet.get()); EventHandler::onPacketReceive(event); if (!event.isCancelled()) - receivePacketEntityEventOriginal(a1, networkIdentifier, netEventCallback, packet); + receivePacketEntityEventOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } @@ -85,4 +90,10 @@ void SendPacketHook::enableHook() { (void **) &receivePacketEntityEventOriginal, "ReceivePacketHook"); this->autoHook((void *) callback, (void **) &sendPacketOriginal); -} \ No newline at end of file +} + +void SendPacketHook::setVariables(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback) { + SendPacketHook::NetworkIdentifier = networkIdentifier; + SendPacketHook::PacketHandlerDispatcher = packetHandlerDispatcher; + SendPacketHook::NetEventCallback = netEventCallback; +} diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.hpp b/src/Client/Hook/Hooks/Game/PacketHooks.hpp index 0ae07848..4c26782b 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.hpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.hpp @@ -8,25 +8,31 @@ class SendPacketHook : public Hook { private: + static void setVariables(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback); + static void callback(LoopbackPacketSender *pSender, Packet *pPacket); - static void receiveCallbackText(const float *a1, const float *networkIdentifier, const float *netEventCallback, + static void receiveCallbackText(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet); - static void receiveCallbackSetTitle(const float *a1, const float *networkIdentifier, const float *netEventCallback, + static void receiveCallbackSetTitle(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet); - static void receiveCallbackPlaySound(const float *a1, const float *networkIdentifier, const float *netEventCallback, + static void receiveCallbackPlaySound(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet); - static void receiveCallbackEntityEvent(const float *a1, const float *networkIdentifier, const float *netEventCallback, + static void receiveCallbackEntityEvent(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet); public: + static inline void* NetworkIdentifier; + static inline void* PacketHandlerDispatcher; + static inline void* NetEventCallback; + typedef void(__thiscall *original)(LoopbackPacketSender *, Packet *); - typedef void(__thiscall *receive)(const float *a1, const float *networkIdentifier, const float *netEventCallback, + typedef void(__thiscall *receive)(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, std::shared_ptr packet); static inline original sendPacketOriginal = nullptr; From e5163a14ba0b0a53db725f6cadcaef7cdd796178 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 16:15:08 +0300 Subject: [PATCH 050/240] Resolve conflicts --- src/Client/Events/Game/AttackEvent.hpp | 2 +- src/Client/Events/Game/FOVEvent.hpp | 2 +- src/Client/Module/Manager.cpp | 5 +- src/Client/Module/Modules/HitPing/HitPing.hpp | 278 ++++++++++++++++++ .../Modules/HitPing/HitPingListener.hpp | 146 +++++++++ .../InstantHurtAnimation.hpp | 51 ++++ .../InstantHurtAnimationListener.hpp | 132 +++++++++ .../Network/Packet/EntityEventPacket.hpp | 2 + 8 files changed, 615 insertions(+), 3 deletions(-) create mode 100644 src/Client/Module/Modules/HitPing/HitPing.hpp create mode 100644 src/Client/Module/Modules/HitPing/HitPingListener.hpp create mode 100644 src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp create mode 100644 src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp diff --git a/src/Client/Events/Game/AttackEvent.hpp b/src/Client/Events/Game/AttackEvent.hpp index c0caa74b..ec1419df 100644 --- a/src/Client/Events/Game/AttackEvent.hpp +++ b/src/Client/Events/Game/AttackEvent.hpp @@ -3,7 +3,7 @@ #include "../Cancellable.hpp" #include "../../../SDK/Client/Actor/Actor.hpp" -class AttackEvent : public Event { +class AttackEvent : public Event, public Cancellable { Actor* actor; public: Actor* getActor() { diff --git a/src/Client/Events/Game/FOVEvent.hpp b/src/Client/Events/Game/FOVEvent.hpp index 436651b7..dfc76372 100644 --- a/src/Client/Events/Game/FOVEvent.hpp +++ b/src/Client/Events/Game/FOVEvent.hpp @@ -3,7 +3,7 @@ #include "../Event.hpp" #include "../Cancellable.hpp" -class FOVEvent : public Event, Cancellable { +class FOVEvent : public Event, public Cancellable { private: float fov; public: diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index c7ed4024..861186dc 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -61,6 +61,8 @@ #include "Modules/Misc/DiscordRPC/DiscordRPCListener.hpp" //#include "Modules/Overlay/OverlayModule.hpp" #include "Modules/AutoRQ/AutoRQ.hpp" +#include "Modules/HitPing/HitPing.hpp" +#include "Modules/InstantHurtAnimation/InstantHurtAnimation.hpp" //#include "Modules/MovableChat/MovableChat.hpp" #include @@ -149,6 +151,8 @@ void ModuleManager::initialize() { addModule(new InventoryHUD()); //addModule(new OverlayModule()); addModule(new AutoRQ()); + addModule(new HitPing()); + addModule(new InstantHurtAnimation()); //addModule(new MovableChat()); //addModule(new CompactChat()); @@ -199,5 +203,4 @@ Module* ModuleManager::getModule(const std::string& name) { size_t hash = std::hash{}(name); return moduleMap[hash]; - } diff --git a/src/Client/Module/Modules/HitPing/HitPing.hpp b/src/Client/Module/Modules/HitPing/HitPing.hpp new file mode 100644 index 00000000..0084e28a --- /dev/null +++ b/src/Client/Module/Modules/HitPing/HitPing.hpp @@ -0,0 +1,278 @@ +#pragma once + +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" +#include "HitPingListener.hpp" + + +class HitPing : public Module { + +public: + + + HitPing() : Module("Hit ping", "Measures your hit delay!", + IDR_LIKE_PNG, "") { + Module::setup(); + }; + + void onEnable() override { + EventHandler::registerListener(new HitPingListener("HitPing", this)); + Module::onEnable(); + } + + void onDisable() override { + EventHandler::unregisterListener("HitPing"); + Module::onDisable(); + } + + void defaultConfig() override { + if (settings.getSettingByName("text") == nullptr) + settings.addSetting("text", (std::string) "{value} ms"); + + if (settings.getSettingByName("textscale") == nullptr) settings.addSetting("textscale", 0.80f); + } + + void settingsRender() override { + + /* Border Start */ + + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); + + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); + FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(1.0f, "height")); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), + toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + + this->settings.getSettingByName("uiscale")->value = percent; + + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( + "border")->value)) + this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( + "border")->value; + + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", + textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + + percent = FlarialGUI::Slider(1, toggleX + Constraints::SpacingConstraint(0.60, textWidth) + + FlarialGUI::SettingsTextWidth("Border "), + toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + + this->settings.getSettingByName("borderWidth")->value = percent; + + /* Border End */ + + /* Rounding Start */ + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), + toggleY, this->settings.getSettingByName("rounding")->value); + + this->settings.getSettingByName("rounding")->value = percent; + + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Translucency", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( + "BlurEffect")->value)) + this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( + "BlurEffect")->value; + + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), + toggleY, this->settings.getSettingByName("textscale")->value, 2.00); + + + this->settings.getSettingByName("textscale")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + + std::string txtAlignment = FlarialGUI::Dropdown(1, + toggleX, toggleY, + std::vector{"Left", "Center", "Right"}, + this->settings.getSettingByName( + "textalignment")->value, + "Text Alignment" + ); + + this->settings.getSettingByName("textalignment")->value = txtAlignment; + + FlarialGUI::SetIsInAdditionalYMode(); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Reverse Padding X", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( + "reversepaddingx")->value)) + this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( + "reversepaddingx")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Reverse Padding Y", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( + "reversepaddingy")->value)) + this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( + "reversepaddingy")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), + toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, + false); + + this->settings.getSettingByName("padx")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), + toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, + false); + + this->settings.getSettingByName("pady")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), + toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); + + this->settings.getSettingByName("rectwidth")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), + toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); + + this->settings.getSettingByName("rectheight")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Responsive Rectangle (Moves with the Text)", + textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( + "responsivewidth")->value)) + this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( + "responsivewidth")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), + toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, + false); + + this->settings.getSettingByName("rotation")->value = percent; + + FlarialGUI::UnSetIsInAdditionalYMode(); + + /* Rounding End */ + + /* Color Pickers Start*/ + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY = Constraints::PercentageConstraint(0.10, "top"); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), + toggleY - Constraints::SpacingConstraint(0.017, textWidth), + settings.getSettingByName("bgColor")->value, + settings.getSettingByName("bgRGB")->value); + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, + settings.getSettingByName("textColor")->value, + settings.getSettingByName("textRGB")->value); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, + settings.getSettingByName("borderColor")->value, + settings.getSettingByName("borderRGB")->value); + + FlarialGUI::UnsetScrollView(); + + FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, + settings.getSettingByName("bgOpacity")->value, + settings.getSettingByName("bgRGB")->value); + FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, + settings.getSettingByName("textOpacity")->value, + settings.getSettingByName("textRGB")->value); + FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, + settings.getSettingByName("borderOpacity")->value, + settings.getSettingByName("borderRGB")->value); + /* Color Pickers End */ + + } +}; + diff --git a/src/Client/Module/Modules/HitPing/HitPingListener.hpp b/src/Client/Module/Modules/HitPing/HitPingListener.hpp new file mode 100644 index 00000000..e5778f5a --- /dev/null +++ b/src/Client/Module/Modules/HitPing/HitPingListener.hpp @@ -0,0 +1,146 @@ +#pragma once + +#include "../../../../SDK/SDK.hpp" +#include "../../../../SDK//Client/Network/Packet/PlaySoundPacket.hpp" +#include "../../../../SDK//Client/Network/Packet/TextPacket.hpp" +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../Module.hpp" +#include "../../../GUI/Engine/Engine.hpp" +#include "../../../Hook/Hooks/Game/PacketHooks.hpp" +#include "../../../../SDK/Client/Network/Packet/EntityEventPacket.hpp" +#include +#include + +using Duration = std::chrono::duration; + +struct HitInfo { + std::chrono::time_point lastActorStableTouch; + std::chrono::time_point lastActorTouch; + std::chrono::time_point lastActorHit; + Vec3 lastActorTouchPos; + Duration lastActorHitDelay{}; +}; + +class HitPingListener : public Listener { + Module *module; + std::chrono::time_point last_hit; + Duration hitDelay = std::chrono::milliseconds(0); + float pingReach{}; + + std::map> actorsHit; + + void onRender(RenderEvent &event) override { + if (module->isEnabled()) { + auto delayStr = std::to_string(pingReach)+"\n"+std::to_string((int)round(hitDelay.count() * 1000)); + + this->module->normalRender(7, delayStr); + } + } + + void onAttack(AttackEvent &event) override { // only calculate ping on first hit + ClearOldHits(); + auto playerPos = SDK::clientInstance->getLocalPlayer()->getStateVectorComponent()->Pos; + auto entity = event.getActor(); + auto hitActors = &actorsHit; + auto id = entity->getRuntimeIDComponent()->runtimeID; + + std::chrono::time_point start = std::chrono::high_resolution_clock::now(); + + auto it = hitActors->find(id); + if (it != hitActors->end()) { + if(start - (*hitActors)[id].second.lastActorTouch <= std::chrono::milliseconds(480)) { + // hitting too fast + (*hitActors)[id].second.lastActorTouch = start; + return; + } else if (!(*hitActors)[id].first){ + (*hitActors)[id].first = true; + (*hitActors)[id].second.lastActorTouch = start; + (*hitActors)[id].second.lastActorStableTouch = start; + (*hitActors)[id].second.lastActorTouchPos = playerPos; + } + } else { + (*hitActors)[id].first = true; + (*hitActors)[id].second.lastActorTouch = start; + (*hitActors)[id].second.lastActorStableTouch = start; + (*hitActors)[id].second.lastActorTouchPos = playerPos; + } + } + + void onPacketReceive(PacketEvent &event) override { + if (event.getPacket()->getId() == MinecraftPacketIds::ActorEvent) { + auto packet = (EntityEventPacket *) event.getPacket(); + if (packet->EventID == ActorEvent::Hurt) { + auto id = packet->RuntimeID; + auto actorHitInfo = actorsHit.find(id); + if(actorHitInfo != actorsHit.end()) { + auto now = std::chrono::high_resolution_clock::now(); + auto start = actorHitInfo->second.second.lastActorStableTouch; + + if(!actorHitInfo->second.first) { + return; // hit registered + } + + actorHitInfo->second.first = false; + + if(start + std::chrono::milliseconds(500) > now) { + std::chrono::duration time = now - start; + + if(time.count() >= 0.0001) { + hitDelay = time; + auto actors = SDK::clientInstance->getLocalPlayer()->level->getRuntimeActorList(); + auto actor = std::find_if(actors.begin(), actors.end(), [&](auto &a) { + return a->getRuntimeIDComponent()->runtimeID == id; + }); + if(actor != actors.end()) { + + auto actorPtr = (*actor); + auto actorHitBox = actorPtr->getAABBShapeComponent()->aabb.expandedXZ(0.1); + + auto upper = actorHitBox.upper; + auto lower = actorHitBox.lower; + + auto posAtTimeOfHit = actorHitInfo->second.second.lastActorTouchPos; + + auto closestPoint = Vec3{ std::clamp(posAtTimeOfHit.x, lower.x, upper.x), + std::clamp(posAtTimeOfHit.y, lower.y, upper.y), + std::clamp(posAtTimeOfHit.z, lower.z, upper.z) }; + + pingReach = actorHitInfo->second.second.lastActorTouchPos.dist(closestPoint); + last_hit = now; + actorHitInfo->second.second.lastActorHit = now; + actorHitInfo->second.second.lastActorHitDelay = time; + } + } + } + } + } + } + } + + void onTick(TickEvent &event) override { + std::chrono::duration duration = std::chrono::high_resolution_clock::now() - last_hit; + if (duration.count() >= 15) { + pingReach = 0; + hitDelay = std::chrono::milliseconds(0); + }; + } + + void ClearOldHits() { + auto now = std::chrono::steady_clock::now(); + for(auto it = actorsHit.begin(); it != actorsHit.end();) { + if(now - it->second.second.lastActorTouch > std::chrono::milliseconds(3000)) { + it = actorsHit.erase(it); + } else { + ++it; + } + } + } + +public: + explicit HitPingListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + } +}; diff --git a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp new file mode 100644 index 00000000..55677840 --- /dev/null +++ b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" +#include "InstantHurtAnimationListener.hpp" + + +class InstantHurtAnimation : public Module { + +public: + + InstantHurtAnimation() : Module("Instant Hurt Animation", "Hurt animation becomes ping independent, helps time hits.", + IDR_COMBO_PNG, "") { + Module::setup(); + }; + + void onEnable() override { + EventHandler::registerListener(new InstantHurtAnimationListener("InstantHurtAnimation", this)); + Module::onEnable(); + } + + void onDisable() override { + EventHandler::unregisterListener("InstantHurtAnimation"); + Module::onDisable(); + } + + void defaultConfig() override { + + if (settings.getSettingByName("tryToExcludeTeam") == nullptr) settings.addSetting("tryToExcludeTeam", false); + + } + + void settingsRender() override { + + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); + + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Try to exclude team", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( + "tryToExcludeTeam")->value)) + this->settings.getSettingByName("tryToExcludeTeam")->value = !this->settings.getSettingByName( + "tryToExcludeTeam")->value; + } +}; diff --git a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp new file mode 100644 index 00000000..6dbdbc7d --- /dev/null +++ b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp @@ -0,0 +1,132 @@ +#pragma once + +#include "../../../../SDK/SDK.hpp" +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../Module.hpp" +#include "../../../GUI/Engine/Engine.hpp" +#include "../../../../SDK/SDK.hpp" +#include "../../../../Utils/Utils.hpp" +#include "../../../Client.hpp" +#include "../../../../SDK/Client/Network/Packet/EntityEventPacket.hpp" +#include "../../../Hook/Hooks/Game/PacketHooks.hpp" +#include +#include + +class InstantHurtAnimationListener : public Listener { + + std::unordered_map hitEntities; + + Module *module; + + static bool IsOnTeam(Actor *actor) { + auto player = SDK::clientInstance->getLocalPlayer(); + if (!player) return false; + + std::string playerName = *player->getNametag(); + std::string actorName = *actor->getNametag(); + + if (playerName.empty() || actorName.empty()) return false; + + auto cleanName = [](std::string &name) { + constexpr std::string tags[] = {"§r", "§l"}; + for (const auto &tag : tags) { + size_t pos; + while ((pos = name.find(tag)) != std::string::npos) { + name.erase(pos, tag.length()); + } + } + }; + + cleanName(playerName); + cleanName(actorName); + + size_t playerTeamPos = playerName.find("§"); + if (playerTeamPos == std::string::npos) return false; + + std::string playerTeam = playerName.substr(playerTeamPos + 2, 1); + + size_t actorTeamPos = actorName.find("§"); + if (actorTeamPos != std::string::npos) { + std::string actorTeam = actorName.substr(actorTeamPos + 2, 1); + return actorTeam == playerTeam; + } + + return false; + } + + void onPacketReceive(PacketEvent &event) override { + auto player = SDK::clientInstance->getLocalPlayer(); + if (!SDK::clientInstance->getLocalPlayer()) return; + if(event.getPacket()->getId() == MinecraftPacketIds::ActorEvent) { + auto ee = (EntityEventPacket *) event.getPacket(); + if (ee->RuntimeID != player->getRuntimeIDComponent()->runtimeID) { + if (ee->EventID == ActorEvent::Hurt) { + // Cancel hurt anim packet, that was caused by our hit + auto it = hitEntities.find(ee->RuntimeID); + if (it != hitEntities.end()) { + auto now = std::chrono::steady_clock::now(); + auto hitTime = it->second; + auto duration = std::chrono::duration_cast(now - hitTime).count(); + if (duration <= 500) { + event.cancel(); + } else { + hitEntities.erase(it); + } + } + } + } + } + } + + + void onAttack(AttackEvent &event) override { + if(module->settings.getSettingByName("tryToExcludeTeam")->value) + if(IsOnTeam(event.getActor())) return; + + ClearOldHits(); + + auto runtimeID = event.getActor()->getRuntimeIDComponent()->runtimeID; + auto now = std::chrono::steady_clock::now(); + + auto it = hitEntities.find(runtimeID); + if (it != hitEntities.end()) { + auto hitTime = it->second; + auto duration = std::chrono::duration_cast(now - hitTime).count(); + if (duration <= 500) { + return; + } + } + + std::shared_ptr packet = SDK::createPacket((int)MinecraftPacketIds::ActorEvent); + auto ee = (EntityEventPacket *) packet.get(); + ee->EventID = ActorEvent::Hurt; + ee->RuntimeID = runtimeID; + + hitEntities[runtimeID] = now; + + SendPacketHook::receivePacketEntityEventOriginal(SendPacketHook::PacketHandlerDispatcher, + SendPacketHook::NetworkIdentifier, + SendPacketHook::NetEventCallback, + packet); + }; + + void ClearOldHits() { + auto now = std::chrono::steady_clock::now(); + for (auto it = hitEntities.begin(); it != hitEntities.end(); ) { + auto duration = std::chrono::duration_cast(now - it->second).count(); + if (duration > 500) { + it = hitEntities.erase(it); + } else { + ++it; + } + } + } + +public: + explicit InstantHurtAnimationListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + } +}; \ No newline at end of file diff --git a/src/SDK/Client/Network/Packet/EntityEventPacket.hpp b/src/SDK/Client/Network/Packet/EntityEventPacket.hpp index 450ac532..f01b6bce 100644 --- a/src/SDK/Client/Network/Packet/EntityEventPacket.hpp +++ b/src/SDK/Client/Network/Packet/EntityEventPacket.hpp @@ -1,3 +1,5 @@ +#pragma once + #include #include "Packet.hpp" From 5cc6b05b7531e6a1c1b075f8bab0ed895f66da03 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 16:53:49 +0300 Subject: [PATCH 051/240] Resolve conflicts #2 --- .../Modules/ArmorHUD/ArmorHUDListener.hpp | 99 +++++++++++++------ src/SDK/Client/Actor/Actor.cpp | 16 +++ src/SDK/Client/Item/ItemStack.cpp | 6 ++ src/SDK/Client/Item/ItemStack.hpp | 1 + src/Utils/Utils.cpp | 12 +++ src/Utils/Utils.hpp | 2 + 6 files changed, 104 insertions(+), 32 deletions(-) diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp index 9db2e476..68648485 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp @@ -20,11 +20,11 @@ class ArmorHUDListener : public Listener { Vec2 currentPos; bool enabled = false; int durabilities[5][2] = { - {0,0}, - {0,0}, - {0,0}, - {0,0}, - {0,0} + {0,0}, + {0,0}, + {0,0}, + {0,0}, + {0,0} }; // TODO: delete testing variables (or adjust and delete) Vec2 testOffset = Vec2{4,0}; @@ -135,31 +135,37 @@ class ArmorHUDListener : public Listener { std::string text; - if (module->settings.getSettingByName("percent")->value) - text = std::to_string((int)std::round((float)durabilities[i][0] / (float)durabilities[i][1] * 100))+"%"; - else - text = std::to_string(durabilities[i][0]) + "/" + std::to_string(durabilities[i][1]); + if (durabilities[i][1] != 0) { // for some servers with custom items with max durability of 0 + if (module->settings.getSettingByName("percent")->value) + text = std::to_string((int) std::round( + (float) durabilities[i][0] / (float) durabilities[i][1] * 100)) + "%"; + else + text = std::to_string(durabilities[i][0]) + "/" + + std::to_string(durabilities[i][1]); + - std::wstring widestr = std::wstring(text.begin(), text.end()); + std::wstring widestr = std::wstring(text.begin(), text.end()); - const wchar_t *widecstr = widestr.c_str(); + const wchar_t *widecstr = widestr.c_str(); - D2D1_COLOR_F color = mainColor; + D2D1_COLOR_F color = mainColor; - if (module->settings.getSettingByName("color")->value){ - if(std::round((float)durabilities[i][0] / (float)durabilities[i][1] * 100) <= 15){ - color = lowColor; - } else { - color = fullColor; + if (module->settings.getSettingByName("color")->value) { + if (std::round((float) durabilities[i][0] / (float) durabilities[i][1] * 100) <= + 15) { + color = lowColor; + } else { + color = fullColor; + } } - } - FlarialGUI::FlarialTextWithFont( - currentPos.x + xmodifier + xoffset + testOffset.x, - currentPos.y + ymodifier + yoffset + testOffset.y, widecstr, textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - textWidth, - DWRITE_FONT_WEIGHT_NORMAL, color, false); + FlarialGUI::FlarialTextWithFont( + currentPos.x + xmodifier + xoffset + testOffset.x, + currentPos.y + ymodifier + yoffset + testOffset.y, widecstr, textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + textWidth, + DWRITE_FONT_WEIGHT_NORMAL, color, false); + } } } } @@ -240,14 +246,28 @@ class ArmorHUDListener : public Listener { nullptr) { auto item = SDK::clientInstance->getLocalPlayer()->playerInventory->inventory->getItem( SDK::clientInstance->getLocalPlayer()->playerInventory->SelectedSlot); - durabilities[0][1] = item->getMaxDamage(); - durabilities[0][0] = durabilities[0][1] - item->getDamageValue(); + + auto maxDamage = item->getMaxDamage(); + auto durabilityLeft = maxDamage - item->getDamageValue(); + + durabilities[0][1] = maxDamage; + durabilities[0][0] = durabilityLeft; + barc.itemRenderer->renderGuiItemNew(&barc, item, 0, convert.x, convert.y, 1.0f, module->settings.getSettingByName( "uiscale")->value, false); + + if(item->isEnchanted()) { + barc.itemRenderer->renderGuiItemNew(&barc, + item, + 0, convert.x, convert.y, 1.0f, + module->settings.getSettingByName( + "uiscale")->value, + true); + } } @@ -261,20 +281,35 @@ class ArmorHUDListener : public Listener { if (module->settings.getSettingByName("vertical")->value) ymodifier += spacing; else xmodifier += spacing; - if (SDK::clientInstance->getLocalPlayer()->getArmor(i-1)->getItem() != nullptr) { - durabilities[i][1] = SDK::clientInstance->getLocalPlayer()->getArmor(i-1)->getMaxDamage(); - durabilities[i][0] = durabilities[i][1] - - SDK::clientInstance->getLocalPlayer()->getArmor( - i-1)->getDamageValue(); + auto armorSlot = SDK::clientInstance->getLocalPlayer()->getArmor(i-1); + + if (armorSlot->getItem() != nullptr) { + + auto maxDamage = armorSlot->getMaxDamage(); + auto durabilityLeft = maxDamage - armorSlot->getDamageValue(); + + durabilities[i][1] = maxDamage; + durabilities[i][0] = durabilityLeft; convert = this->convert(); + barc.itemRenderer->renderGuiItemNew(&barc, - SDK::clientInstance->getLocalPlayer()->getArmor(i-1), + armorSlot, 0, convert.x + xmodifier, convert.y + ymodifier, 1.0f, module->settings.getSettingByName( "uiscale")->value, false); + + if(armorSlot->isEnchanted()) { + barc.itemRenderer->renderGuiItemNew(&barc, + armorSlot, + 0, + convert.x + xmodifier, convert.y + ymodifier, 1.0f, + module->settings.getSettingByName( + "uiscale")->value, + true); + } } } } diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index 1cdda45e..742ac29e 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -62,6 +62,8 @@ SimpleContainer* Actor::getArmorContainer() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getActorEquipmentComponent")); // 8B DA BA 2E CD 8B 46 + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix2")); + sig = sig - size; } return tryGet(sig)->mArmorContainer; @@ -73,6 +75,8 @@ SimpleContainer* Actor::getOffhandContainer() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getActorEquipmentComponent")); // 8B DA BA 2E CD 8B 46 + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix2")); + sig = sig - size; } return tryGet(sig)->mOffhandContainer; @@ -99,6 +103,8 @@ MoveInputComponent *Actor::getMoveInputHandler() { //??$try_get@UMoveInputCompon if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getMoveInputHandler")); // 8B DA BA 2E CD 8B 46 + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); @@ -110,6 +116,8 @@ ActorGameTypeComponent *Actor::getGameModeType() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getActorGameTypeComponent")); // 8B DA BA DE AB CB AF + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); @@ -121,6 +129,8 @@ AABBShapeComponent *Actor::getAABBShapeComponent() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getAABBShapeComponent")); // 8B DA BA F2 C9 10 1B + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); @@ -132,6 +142,8 @@ StateVectorComponent *Actor::getStateVectorComponent() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getStateVectorComponent")); // 8B DA BA 91 3C C9 0E + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); @@ -157,6 +169,8 @@ RuntimeIDComponent *Actor::getRuntimeIDComponent() { if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getRuntimeIDComponent")); + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); @@ -197,6 +211,8 @@ RenderPositionComponent *Actor::getRenderPositionComponent() { //??$try_get@URen if (sig == NULL) { sig = Memory::findSig(GET_SIG("Actor::getRenderPositionComponent")); // 8B DA BA 6E F3 E8 D4 + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); + sig = sig - size; } return tryGet(sig); diff --git a/src/SDK/Client/Item/ItemStack.cpp b/src/SDK/Client/Item/ItemStack.cpp index a05e4b26..561b3f09 100644 --- a/src/SDK/Client/Item/ItemStack.cpp +++ b/src/SDK/Client/Item/ItemStack.cpp @@ -9,6 +9,12 @@ Item* ItemStack::getItem() const { return item.get(); } +bool ItemStack::isEnchanted() { + using isEnchantedFunc = bool(__fastcall*)(ItemStack*); + static auto getIsEnchanted = reinterpret_cast(Memory::findSig(GET_SIG("ItemStack::isEnchanted"))); + return getIsEnchanted(this); +} + short ItemStack::getDamageValue() { if (item.counter == nullptr) return 0; diff --git a/src/SDK/Client/Item/ItemStack.hpp b/src/SDK/Client/Item/ItemStack.hpp index 6cf420a6..c91cabd5 100644 --- a/src/SDK/Client/Item/ItemStack.hpp +++ b/src/SDK/Client/Item/ItemStack.hpp @@ -18,4 +18,5 @@ class ItemStack { [[nodiscard]] Item* getItem() const; short getDamageValue(); short getMaxDamage(); + bool isEnchanted(); }; \ No newline at end of file diff --git a/src/Utils/Utils.cpp b/src/Utils/Utils.cpp index dbd427f1..1030ed28 100644 --- a/src/Utils/Utils.cpp +++ b/src/Utils/Utils.cpp @@ -392,3 +392,15 @@ bool Utils::CursorInEllipse(float ellipseX, float ellipseY, float radiusX, float return (normalizedX * normalizedX + normalizedY * normalizedY) <= 1.0f; } + +int Utils::CountBytes(const std::string& data) { + std::istringstream iss(data); + int count = 0; + std::string byte; + + while (iss >> byte) { + count++; + } + + return count; +} diff --git a/src/Utils/Utils.hpp b/src/Utils/Utils.hpp index b15d638a..ee0c057c 100644 --- a/src/Utils/Utils.hpp +++ b/src/Utils/Utils.hpp @@ -259,6 +259,8 @@ class Utils { static bool CursorInEllipse(float ellipseX, float ellipseY, float radiusX, float radiusY); + static int CountBytes(const std::string &data); + static constexpr unsigned int hash(const char *str) { unsigned int hash = 5381; int c; From f3288393a614c8c4e8e976383b8466d2b4bde34a Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 17:17:07 +0300 Subject: [PATCH 052/240] GuiData::displayClientMessage --- src/SDK/Client/Render/GuiData.cpp | 16 ++++++++++++++++ src/SDK/Client/Render/GuiData.hpp | 3 +++ src/Utils/Memory/Game/Sig/SigInit.cpp | 3 +++ 3 files changed, 22 insertions(+) create mode 100644 src/SDK/Client/Render/GuiData.cpp diff --git a/src/SDK/Client/Render/GuiData.cpp b/src/SDK/Client/Render/GuiData.cpp new file mode 100644 index 00000000..c9ce0f7c --- /dev/null +++ b/src/SDK/Client/Render/GuiData.cpp @@ -0,0 +1,16 @@ +#include "GuiData.hpp" +#include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" + +void GuiData::displayClientMessage(std::string &str) { + if (str.empty()) + return; + + static uintptr_t sig; + + if (sig == NULL) { + sig = Memory::findSig(GET_SIG("GuiData::displayClientMessage")); + } + + auto fn = reinterpret_cast(sig); + return fn(this, str, false); +} diff --git a/src/SDK/Client/Render/GuiData.hpp b/src/SDK/Client/Render/GuiData.hpp index 928792a7..4e9f54cd 100644 --- a/src/SDK/Client/Render/GuiData.hpp +++ b/src/SDK/Client/Render/GuiData.hpp @@ -2,6 +2,7 @@ #include "../../../Utils/Memory/Memory.hpp" #include "../../../Utils/Utils.hpp" +#include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" class GuiData { public: @@ -11,4 +12,6 @@ class GuiData { BUILD_ACCESS(this, float, screenResRounded, GET_OFFSET("GuiData::screenResRounded")); BUILD_ACCESS(this, float, sliderAmount, GET_OFFSET("GuiData::sliderAmount")); BUILD_ACCESS(this, float, scalingMultiplier, GET_OFFSET("GuiData::scalingMultiplier")); + + void displayClientMessage(std::string &str); }; \ No newline at end of file diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 0e935460..d2c75b5c 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -28,6 +28,8 @@ void SigInit::init2080() { ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C0"); + ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 48 8D AC 24 F0 FE FF FF 48 81 EC 10 02 00 00 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 85 00 01 00 00 41"); + ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); } @@ -201,6 +203,7 @@ void SigInit::init2030() { ADD_SIG("Tessellator::resetTransform", "80 B9 ? ? ? ? ? 4C 8B C1 75"); ADD_SIG("MeshHelper::renderImmediately", "48 89 5C 24 ? 48 89 74 24 ? 57 48 81 EC ? ? ? ? 49 8B F8 48 8B DA 48 8B F1 80 BA"); + ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 41 0F B6 F0"); ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); } From 6a961555c6acdcabdfc7693ce82cafda0b8a9edc Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 17:45:50 +0300 Subject: [PATCH 053/240] Info on how to get 1 of the offsets --- src/Utils/Memory/Game/Offset/OffsetInit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index ec524390..888385dc 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -188,7 +188,7 @@ void OffsetInit::init2030() { ADD_OFFSET("Gamemode::attackVft", 14); ADD_OFFSET("Player::playerInventory", 0x7C0); - ADD_OFFSET("Player::playerName", 0x1C78); + ADD_OFFSET("Player::playerName", 0x1C78); // 48 89 5C 24 20 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 C0 48 81 EC 40 01 00 00 41 | line 278 | book.defaultAuthor ADD_OFFSET("Player::gamemode", 0xE70); ADD_OFFSET("BlockSource::dimension", 0x30); From 0e1fefe7fa44e533b0bec350baf335c542fd7787 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 17:57:48 +0300 Subject: [PATCH 054/240] Fix hit ping moving with keystrokes --- src/Client/Module/Modules/HitPing/HitPingListener.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/HitPing/HitPingListener.hpp b/src/Client/Module/Modules/HitPing/HitPingListener.hpp index e5778f5a..81fad93e 100644 --- a/src/Client/Module/Modules/HitPing/HitPingListener.hpp +++ b/src/Client/Module/Modules/HitPing/HitPingListener.hpp @@ -35,7 +35,7 @@ class HitPingListener : public Listener { if (module->isEnabled()) { auto delayStr = std::to_string(pingReach)+"\n"+std::to_string((int)round(hitDelay.count() * 1000)); - this->module->normalRender(7, delayStr); + this->module->normalRender(21, delayStr); } } From 9a66d16866318eeac62643cd4615c76cdee94499 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 1 Aug 2024 19:37:24 +0300 Subject: [PATCH 055/240] Fix crash on minecraft close from main menu --- .../Modules/ArrowCounter/ArrowListener.hpp | 20 +++++------ .../Module/Modules/PotCounter/PotListener.hpp | 18 +++++----- .../SpeedDisplay/SpeedDisplayListener.hpp | 35 +++---------------- 3 files changed, 22 insertions(+), 51 deletions(-) diff --git a/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp b/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp index 35c0760f..0b197ae1 100644 --- a/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp +++ b/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp @@ -19,13 +19,10 @@ class ArrowListener : public Listener { void onTick(TickEvent &event) override { - - } - - void onRender(RenderEvent &event) override { if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { if (SDK::clientInstance->getLocalPlayer()->playerInventory != nullptr) { + auto arrowsCount = 0; auto inventory = SDK::clientInstance->getLocalPlayer()->playerInventory->inventory; if(inventory == nullptr) return; @@ -34,7 +31,7 @@ class ArrowListener : public Listener { if(offhandItem != nullptr) if (offhandItem->getItem() != nullptr) if (offhandItem->getItem()->name == "arrow") - arrows = offhandItem->count; + arrowsCount = offhandItem->count; for (int i = 0; i < 36; i++) { @@ -42,22 +39,23 @@ class ArrowListener : public Listener { if (item->getItem() != nullptr) { if (item->getItem()->name == "arrow") { - arrows += item->count; + arrowsCount += item->count; } } } - auto arrowsStr = std::to_string(arrows); - - this->module->normalRender(13, arrowsStr); - - arrows = 0; + arrows = arrowsCount; } } } } + void onRender(RenderEvent &event) override { + auto arrowsStr = std::to_string(arrows); + this->module->normalRender(13, arrowsStr); + } + public: explicit ArrowListener(const char string[5], Module *module) { this->name = string; diff --git a/src/Client/Module/Modules/PotCounter/PotListener.hpp b/src/Client/Module/Modules/PotCounter/PotListener.hpp index 9d639b54..3698fda1 100644 --- a/src/Client/Module/Modules/PotCounter/PotListener.hpp +++ b/src/Client/Module/Modules/PotCounter/PotListener.hpp @@ -20,12 +20,9 @@ class PotListener : public Listener { void onTick(TickEvent& event) override { - - } - - void onRender(RenderEvent& event) override { if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { + auto potsCount = 0; if (SDK::clientInstance->getLocalPlayer()->playerInventory != nullptr) { auto inventory = SDK::clientInstance->getLocalPlayer()->playerInventory->inventory; @@ -35,22 +32,23 @@ class PotListener : public Listener { if (item->getItem() != nullptr) { if (item->getItem()->name == "splash_potion") { - pots++; + potsCount++; } } } } - auto potsStr = std::to_string(pots); - - this->module->normalRender(14, potsStr); - - pots = 0; + pots = potsCount; } } } } + void onRender(RenderEvent& event) override { + auto potsStr = std::to_string(pots); + this->module->normalRender(14, potsStr); + } + public: explicit PotListener(const char string[5], Module* module) { this->name = string; diff --git a/src/Client/Module/Modules/SpeedDisplay/SpeedDisplayListener.hpp b/src/Client/Module/Modules/SpeedDisplay/SpeedDisplayListener.hpp index f5af3084..0e72bc80 100644 --- a/src/Client/Module/Modules/SpeedDisplay/SpeedDisplayListener.hpp +++ b/src/Client/Module/Modules/SpeedDisplay/SpeedDisplayListener.hpp @@ -18,44 +18,19 @@ class SpeedDisplayListener : public Listener { Vec3 PrevPos; std::string speed; - bool toes = false; - int interval = 50; //ms void onRender(RenderEvent &event) override { - if ( - module->isEnabled() && - SDK::hasInstanced && SDK::clientInstance != nullptr && - SDK::clientInstance->getLocalPlayer() != nullptr - ) - this->module->normalRender(15, speed); + this->module->normalRender(15, speed); } - void update() { - if ( - module->isEnabled() && - SDK::hasInstanced && SDK::clientInstance != nullptr && - SDK::clientInstance->getLocalPlayer() != nullptr - ) { - if(SDK::clientInstance->getLocalPlayer()->getStateVectorComponent() != nullptr) - speed = std::format("{:.2f}", SDK::clientInstance->getLocalPlayer()->getStateVectorComponent()->Pos.dist(PrevPos) * 20); - } - }; - void onTick(TickEvent &event) override { if (!SDK::clientInstance->getLocalPlayer()) return; - - if (!toes) { - toes = true; - std::thread lol([&]() { - while (!Client::disable) { - update(); - Sleep(interval); - } - }); - lol.detach(); + auto stateVectorComponent = SDK::clientInstance->getLocalPlayer()->getStateVectorComponent(); + if(stateVectorComponent != nullptr) { + speed = std::format("{:.2f}", stateVectorComponent->Pos.dist(PrevPos) * 20); + PrevPos = stateVectorComponent->Pos; } - PrevPos = SDK::clientInstance->getLocalPlayer()->getStateVectorComponent()->Pos; } public: From 4c907c35300cf40cb0c663666816593524c589b1 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 5 Aug 2024 13:36:45 +0600 Subject: [PATCH 056/240] Massive FPS boost, but gaussian blur looks like box blur --- CMakeSettings.json | 2 +- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 51 +++---------------- src/Client/GUI/Engine/Engine.cpp | 18 +++---- .../Hook/Hooks/Render/SwapchainHook.cpp | 36 +++++++------ .../Hook/Hooks/Render/SwapchainHook.hpp | 1 + .../Modules/ArmorHUD/ArmorHUDListener.hpp | 1 + .../InventoryHUD/InventoryHUDListener.hpp | 2 + .../Modules/MotionBlur/MotionBlurListener.hpp | 3 +- .../MovableChat/MovableChatListener.hpp | 2 + .../Module/Modules/PaperDoll/DollListener.hpp | 4 +- 10 files changed, 42 insertions(+), 78 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index d2bcfced..b81ead14 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -14,7 +14,7 @@ { "name": "x64-Release", "generator": "Ninja", - "configurationType": "Release", + "configurationType": "RelWithDebInfo", "buildRoot": "${projectDir}\\out\\build\\${name}", "installRoot": "${projectDir}\\out\\install\\${name}", "cmakeCommandArgs": "", diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 9ad7dffe..d2979ea5 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -294,6 +294,8 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) { + if(intensity < 1) return; + if (!SwapchainHook::GetBackbuffer()) return; ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); @@ -319,56 +321,15 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio desc.BindFlags |= D3D11_BIND_RENDER_TARGET; - for (int i = 0; i <= iterations; i++) - { - ID3D11Texture2D *pFrameBuffer; - ID3D11RenderTargetView *pRenderTargetView; - ID3D11ShaderResourceView *pShaderResourceView; - - SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); - if (i == 0) - pRenderTargetView = pDstRenderTargetView; - else - SwapchainHook::d3d11Device->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); - SwapchainHook::d3d11Device->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); - - framebuffers.push_back(pFrameBuffer); - renderTargetViews.push_back(pRenderTargetView); - shaderResourceViews.push_back(pShaderResourceView); - fbSizes.push_back(XMFLOAT2(desc.Width, desc.Height)); - - desc.Width /= 2; - desc.Height /= 2; - } - - constantBuffer.offset = XMFLOAT2(intensity, intensity); - pContext->PSSetShader(pDownsampleShader, nullptr, 0); - RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); + XMFLOAT2 fbSize = XMFLOAT2(desc.Width, desc.Height); - for (int i = 1; i < iterations; i++) - { - RenderToRTV(renderTargetViews[i + 1], shaderResourceViews[i], fbSizes[i + 1]); - } + constantBuffer.offset = XMFLOAT2(intensity * 4, intensity * 4); pContext->PSSetShader(pUpsampleShader, nullptr, 0); + RenderToRTV(pDstRenderTargetView, pOrigShaderResourceView, fbSize); + - for (int i = iterations; i > 0; i--) - { - RenderToRTV(renderTargetViews[i - 1], shaderResourceViews[i], fbSizes[i - 1]); - } - for (int i = 0; i < iterations; i++) - { - if (i != 0) - renderTargetViews[i]->Release(); - framebuffers[i]->Release(); - shaderResourceViews[i]->Release(); - - renderTargetViews.clear(); - framebuffers.clear(); - shaderResourceViews.clear(); - fbSizes.clear(); - } pContext->Release(); pOrigShaderResourceView->Release(); diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index a52f663e..0e375c3c 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -765,7 +765,6 @@ std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *tex //std::cout << weightedName << std::endl; - float sizeMultiplier = 1.0f; if(hasEnding(weightedName, "2.0")) sizeMultiplier = 0.6f; @@ -773,7 +772,9 @@ std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *tex float fSize = (fontSize / 135) * sizeMultiplier; ImGui::SetWindowFontScale(fSize); - + std::string stringText = WideToNarrow(text).c_str(); + ImVec2 size = ImGui::CalcTextSize(stringText.c_str()); + std::string fontedName = weightedName + std::to_string(fSize); switch (alignment) { @@ -781,23 +782,22 @@ std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *tex break; case DWRITE_TEXT_ALIGNMENT_CENTER: { - x += (width / 2) - (ImGui::CalcTextSize(WideToNarrow(text).c_str()).x / 2); + x += (width / 2) - (size.x / 2); break; } case DWRITE_TEXT_ALIGNMENT_TRAILING: { - x += (width - ImGui::CalcTextSize(WideToNarrow(text).c_str()).x); + x += (width - size.x); break; } } - TextSizes[weightedName + std::to_string(fSize)] = ImGui::CalcTextSize(WideToNarrow(text).c_str()).x; - - y += (height / 2) - (ImGui::CalcTextSize(WideToNarrow(text).c_str()).y / 2); - ImGui::GetBackgroundDrawList()->AddText(ImVec2(x, y), ImColor(color.r, color.g, color.b, color.a), WideToNarrow(text).c_str()); + TextSizes[fontedName] = size.x; + y += (height / 2) - (size.y / 2); + ImGui::GetBackgroundDrawList()->AddText(ImVec2(x, y), ImColor(color.r, color.g, color.b, color.a), stringText.c_str()); ImGui::PopFont(); - return weightedName + std::to_string(fSize); + return fontedName; } void FlarialGUI::LoadFont(int resourceId) { diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 8a36c131..1af1ea96 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -620,7 +620,7 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() void SwapchainHook::SaveBackbuffer() { - Memory::SafeRelease(SavedD3D11BackBuffer); + if(SwapchainHook::queue) return; ID3D11DeviceContext* deviceContext; SwapchainHook::d3d11Device->GetImmediateContext(&deviceContext); @@ -633,18 +633,18 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() D3D11_TEXTURE2D_DESC desc; buffer2D->GetDesc(&desc); - - ID3D11Texture2D* stageTex = nullptr; - D3D11_TEXTURE2D_DESC stageDesc = desc; - stageDesc.Usage = D3D11_USAGE_STAGING; - stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - stageDesc.BindFlags = 0; - - //desc.Usage = DXGI_USAGE_SHADER_INPUT; - HRESULT r = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); + HRESULT r; + + if(!stageTex) { + D3D11_TEXTURE2D_DESC stageDesc = desc; + stageDesc.Usage = D3D11_USAGE_STAGING; + stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + stageDesc.BindFlags = 0; + r = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); + if (FAILED(r)) std::cout << "Failed to create stage texture: " << std::hex << r << std::endl; + } deviceContext->CopyResource(stageTex, buffer2D); - if (FAILED(r)) std::cout << "Failed to create stage texture: " << std::hex << r << std::endl; D3D11_TEXTURE2D_DESC defaultDesc = desc; @@ -652,18 +652,16 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() defaultDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; defaultDesc.CPUAccessFlags = 0; - ID3D11Texture2D* defaultTexture = nullptr; - hr = SwapchainHook::d3d11Device->CreateTexture2D(&defaultDesc, nullptr, &defaultTexture); - if (FAILED(hr)) { - std::cout << "Failed to create def texture: " << std::hex << r << std::endl; + if(!SavedD3D11BackBuffer) { + hr = SwapchainHook::d3d11Device->CreateTexture2D(&defaultDesc, nullptr, &SavedD3D11BackBuffer); + if (FAILED(hr)) { + std::cout << "Failed to create def texture: " << std::hex << r << std::endl; + } } - deviceContext->CopyResource(defaultTexture, stageTex); + deviceContext->CopyResource(SavedD3D11BackBuffer, stageTex); - stageTex->Release(); Memory::SafeRelease(backBuffer); Memory::SafeRelease(buffer2D); Memory::SafeRelease(deviceContext); - - SavedD3D11BackBuffer = defaultTexture; } diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp index 4f6cbc66..f60f2c15 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp @@ -59,6 +59,7 @@ class SwapchainHook : public Hook { static inline ID3D12GraphicsCommandList* DX12CommandLists; static bool hasResized; static int currentBitmap; + static inline ID3D11Texture2D* stageTex; static inline ID3D12Device5* d3d12Device5 = nullptr; diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp index 9db2e476..aa565665 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp @@ -226,6 +226,7 @@ class ArmorHUDListener : public Listener { } void onSetupAndRender(SetupAndRenderEvent &event) override { + if(this->module->isEnabled()) if (ClientInstance::getTopScreenName() == "hud_screen") { auto muirc = event.getMuirc(); BaseActorRenderContext barc(muirc->screenContext, muirc->clientInstance, diff --git a/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp b/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp index da0b2515..a74d27af 100644 --- a/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp +++ b/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp @@ -86,6 +86,8 @@ class InventoryHUDListener : public Listener { } void onSetupAndRender(SetupAndRenderEvent &event) override { + + if(this->module->isEnabled()) if (ClientInstance::getTopScreenName() == "hud_screen") { auto muirc = event.getMuirc(); BaseActorRenderContext barc(muirc->screenContext, muirc->clientInstance, diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index 5058f49c..821349a9 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -263,8 +263,7 @@ void InitializeRenderResources(ID3D11Device* device) void RenderSRV(ID3D11ShaderResourceView* srv, float width, float height, float opacity) { - ID3D11DeviceContext* context; - SwapchainHook::d3d11Device->GetImmediateContext(&context); + ID3D11DeviceContext* context = SwapchainHook::context; context->OMSetRenderTargets(1, &gRTV, gDSV); diff --git a/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp b/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp index 2ffcc8a5..c3b82ee7 100644 --- a/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp +++ b/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp @@ -91,6 +91,8 @@ class MovableChatListener : public Listener { void onSetupAndRender(SetupAndRenderEvent &event) override { + if(this->module->isEnabled()) + if (SDK::screenView->VisualTree->root->LayerName == "hud_screen") { diff --git a/src/Client/Module/Modules/PaperDoll/DollListener.hpp b/src/Client/Module/Modules/PaperDoll/DollListener.hpp index b546bb3c..476d9c64 100644 --- a/src/Client/Module/Modules/PaperDoll/DollListener.hpp +++ b/src/Client/Module/Modules/PaperDoll/DollListener.hpp @@ -75,8 +75,9 @@ class DollListener : public Listener { } void onSetupAndRender(SetupAndRenderEvent &event) override { - if(SDK::currentScreen == "hud_screen") { + if(this->module->isEnabled()) + if(SDK::currentScreen == "hud_screen") { SDK::screenView->VisualTree->root->forEachControl([this](std::shared_ptr& control) { if (control->LayerName == "hud_player") { @@ -101,7 +102,6 @@ class DollListener : public Listener { return; // dont go through other controls } - }); } } From c7183dca16757c868594fce89baa5bfd9fed180b Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 5 Aug 2024 14:27:25 +0600 Subject: [PATCH 057/240] tes --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 72 ++++++++++----------- src/Client/GUI/Engine/Engine.hpp | 5 +- 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index d2979ea5..c8feec01 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -78,54 +78,53 @@ float4 main(float4 screenSpace : SV_Position) : SV_TARGET const char *upsampleShaderSrc = R"( cbuffer BlurInputBuffer : register(b0) { + float intensity; float2 resolution; - float2 offset; - float2 halfPixel; }; sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); +Texture2D inputTexture : register(t0); float4 main(float4 screenSpace : SV_Position) : SV_TARGET { - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; - - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 + float2 texSize = resolution; + float2 texelSize = 1.0f / texSize; + float2 texCoord = screenSpace.xy / texSize; + + // Scale offsets with a larger factor for more noticeable blur + float2 offsets[9] = { + float2(-1.0f, -1.0f), float2(0.0f, -1.0f), float2(1.0f, -1.0f), + float2(-1.0f, 0.0f), float2(0.0f, 0.0f), float2(1.0f, 0.0f), + float2(-1.0f, 1.0f), float2(0.0f, 1.0f), float2(1.0f, 1.0f) }; - float weightSum = 0.0; + float weights[9]; + float sum = 0.0f; + float sigma = intensity * 2.0f; // Scale intensity for more noticeable blur for (int i = 0; i < 9; i++) { - weightSum += weights[i]; + float2 offset = offsets[i] * texelSize * sigma; + weights[i] = exp(-dot(offset, offset) / (2.0f * sigma * sigma)); + sum += weights[i]; } + float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f); for (int i = 0; i < 9; i++) { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + float2 offset = offsets[i] * texelSize * sigma; + color += inputTexture.Sample(sampler0, texCoord + offset) * weights[i]; } - return colorSum; + color /= sum; + + return color; } + )"; + const char *dbgDrawTextureShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ {\ float2 resolution;\ @@ -146,20 +145,25 @@ float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET {\ ID3DBlob *TryCompileShader(const char *pSrcData, const char *pTarget) { HRESULT hr; + ID3DBlob *shaderBlob = nullptr; + ID3DBlob *errorBlob = nullptr; - ID3DBlob *shaderBlob; - ID3DBlob *errorBlob; hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); if (FAILED(hr)) { - Logger::error("[Blur] Failed to compile shader"); - errorBlob->Release(); + if (errorBlob) + { + Logger::error(std::format("[Blur] Failed to compile shader: {}", static_cast(errorBlob->GetBufferPointer()))); + errorBlob->Release(); + } throw std::logic_error("Failed to compile shader!"); } + return shaderBlob; } + ID3D11PixelShader *dbgShader; void Blur::InitializePipeline() @@ -232,8 +236,6 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe pContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView **)&null); pContext->OMSetRenderTargets(1, &pRenderTargetView, nullptr); - constantBuffer.resolution = rtvSize; - constantBuffer.halfpixel = XMFLOAT2(0.5 / rtvSize.x, 0.5 / rtvSize.y); pContext->UpdateSubresource(pConstantBuffer, 0, nullptr, &constantBuffer, 0, 0); pContext->IASetInputLayout(pInputLayout); @@ -323,14 +325,12 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio XMFLOAT2 fbSize = XMFLOAT2(desc.Width, desc.Height); - constantBuffer.offset = XMFLOAT2(intensity * 4, intensity * 4); + constantBuffer.intensity = intensity; + constantBuffer.resolution = fbSize; pContext->PSSetShader(pUpsampleShader, nullptr, 0); RenderToRTV(pDstRenderTargetView, pOrigShaderResourceView, fbSize); - - - pContext->Release(); pOrigShaderResourceView->Release(); } diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 6ee3216a..9cb33a3c 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -27,10 +27,9 @@ using namespace DirectX; struct BlurInputBuffer { + FLOAT intensity; XMFLOAT2 resolution; - XMFLOAT2 offset; - XMFLOAT2 halfpixel; - XMFLOAT2 _dummy; + FLOAT padding[1]; }; From 8f17e3461f4c32fde2b7ec1958eef4a31a0e4dd8 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 5 Aug 2024 22:54:35 +0600 Subject: [PATCH 058/240] There is nothing we can do... --- main.cpp | 2 +- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 128 +++++++++++------- src/Client/GUI/Engine/Engine.hpp | 7 +- src/Client/Hook/Hooks/Render/ResizeHook.cpp | 3 + .../Hook/Hooks/Render/SwapchainHook.cpp | 11 +- .../Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- 6 files changed, 96 insertions(+), 57 deletions(-) diff --git a/main.cpp b/main.cpp index b28bef6c..6feed7d0 100644 --- a/main.cpp +++ b/main.cpp @@ -23,7 +23,7 @@ std::string removeColorCodes(const std::string& input); DWORD WINAPI init(HMODULE real) { - if (GetConsoleWindow() == nullptr and true) { + if (true) { AllocConsole(); SetConsoleTitleA("Caspian-Debug"); FILE *out; diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index c8feec01..7f63afde 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -78,53 +78,54 @@ float4 main(float4 screenSpace : SV_Position) : SV_TARGET const char *upsampleShaderSrc = R"( cbuffer BlurInputBuffer : register(b0) { - float intensity; float2 resolution; + float2 offset; + float2 halfPixel; }; sampler sampler0 : register(s0); -Texture2D inputTexture : register(t0); +Texture2D texture0 : register(t0); float4 main(float4 screenSpace : SV_Position) : SV_TARGET { - float2 texSize = resolution; - float2 texelSize = 1.0f / texSize; - float2 texCoord = screenSpace.xy / texSize; - - // Scale offsets with a larger factor for more noticeable blur - float2 offsets[9] = { - float2(-1.0f, -1.0f), float2(0.0f, -1.0f), float2(1.0f, -1.0f), - float2(-1.0f, 0.0f), float2(0.0f, 0.0f), float2(1.0f, 0.0f), - float2(-1.0f, 1.0f), float2(0.0f, 1.0f), float2(1.0f, 1.0f) + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 }; - float weights[9]; - float sum = 0.0f; - float sigma = intensity * 2.0f; // Scale intensity for more noticeable blur + float weightSum = 0.0; for (int i = 0; i < 9; i++) { - float2 offset = offsets[i] * texelSize * sigma; - weights[i] = exp(-dot(offset, offset) / (2.0f * sigma * sigma)); - sum += weights[i]; + weightSum += weights[i]; } - float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f); for (int i = 0; i < 9; i++) { - float2 offset = offsets[i] * texelSize * sigma; - color += inputTexture.Sample(sampler0, texCoord + offset) * weights[i]; + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); } - color /= sum; - - return color; + return colorSum; } - )"; - const char *dbgDrawTextureShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ {\ float2 resolution;\ @@ -145,25 +146,20 @@ float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET {\ ID3DBlob *TryCompileShader(const char *pSrcData, const char *pTarget) { HRESULT hr; - ID3DBlob *shaderBlob = nullptr; - ID3DBlob *errorBlob = nullptr; + ID3DBlob *shaderBlob; + ID3DBlob *errorBlob; hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); if (FAILED(hr)) { - if (errorBlob) - { - Logger::error(std::format("[Blur] Failed to compile shader: {}", static_cast(errorBlob->GetBufferPointer()))); - errorBlob->Release(); - } + Logger::error("[Blur] Failed to compile shader"); + errorBlob->Release(); throw std::logic_error("Failed to compile shader!"); } - return shaderBlob; } - ID3D11PixelShader *dbgShader; void Blur::InitializePipeline() @@ -222,8 +218,7 @@ void Blur::InitializePipeline() void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderResourceView *pShaderResourceView, XMFLOAT2 rtvSize) { HRESULT hr; - ID3D11DeviceContext* pContext; - SwapchainHook::d3d11Device->GetImmediateContext(&pContext); + ID3D11DeviceContext* pContext = SwapchainHook::context; D3D11_DEPTH_STENCIL_DESC dsd{}; dsd.DepthEnable = false; dsd.StencilEnable = false; @@ -236,6 +231,8 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe pContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView **)&null); pContext->OMSetRenderTargets(1, &pRenderTargetView, nullptr); + constantBuffer.resolution = rtvSize; + constantBuffer.halfpixel = XMFLOAT2(0.5 / rtvSize.x, 0.5 / rtvSize.y); pContext->UpdateSubresource(pConstantBuffer, 0, nullptr, &constantBuffer, 0, 0); pContext->IASetInputLayout(pInputLayout); @@ -291,20 +288,16 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe pDepthStencilState->Release(); pBlendState->Release(); pRasterizerState->Release(); - pContext->Release(); } void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) { - if(intensity < 1) return; - if (!SwapchainHook::GetBackbuffer()) return; ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); if (!pOrigShaderResourceView) return; - ID3D11DeviceContext* pContext; - SwapchainHook::d3d11Device->GetImmediateContext(&pContext); + ID3D11DeviceContext* pContext = SwapchainHook::context; std::vector framebuffers; std::vector renderTargetViews; @@ -323,14 +316,57 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio desc.BindFlags |= D3D11_BIND_RENDER_TARGET; - XMFLOAT2 fbSize = XMFLOAT2(desc.Width, desc.Height); + for (int i = 0; i <= iterations; i++) + { + ID3D11Texture2D *pFrameBuffer; + ID3D11RenderTargetView *pRenderTargetView; + ID3D11ShaderResourceView *pShaderResourceView; + + SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); + if (i == 0) + pRenderTargetView = pDstRenderTargetView; + else + SwapchainHook::d3d11Device->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); + SwapchainHook::d3d11Device->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); + + framebuffers.push_back(pFrameBuffer); + renderTargetViews.push_back(pRenderTargetView); + shaderResourceViews.push_back(pShaderResourceView); + fbSizes.push_back(XMFLOAT2(desc.Width, desc.Height)); + + desc.Width /= 2; + desc.Height /= 2; + } + + constantBuffer.offset = XMFLOAT2(intensity, intensity); + pContext->PSSetShader(pDownsampleShader, nullptr, 0); + RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); - constantBuffer.intensity = intensity; - constantBuffer.resolution = fbSize; + for (int i = 1; i < iterations; i++) + { + RenderToRTV(renderTargetViews[i + 1], shaderResourceViews[i], fbSizes[i + 1]); + } pContext->PSSetShader(pUpsampleShader, nullptr, 0); - RenderToRTV(pDstRenderTargetView, pOrigShaderResourceView, fbSize); + + for (int i = iterations; i > 0; i--) + { + RenderToRTV(renderTargetViews[i - 1], shaderResourceViews[i], fbSizes[i - 1]); + } + + for (int i = 0; i < iterations; i++) + { + if (i != 0) + renderTargetViews[i]->Release(); + framebuffers[i]->Release(); + shaderResourceViews[i]->Release(); + + renderTargetViews.clear(); + framebuffers.clear(); + shaderResourceViews.clear(); + fbSizes.clear(); + } pContext->Release(); pOrigShaderResourceView->Release(); -} +} \ No newline at end of file diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 9cb33a3c..1b49fd69 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -27,9 +27,10 @@ using namespace DirectX; struct BlurInputBuffer { - FLOAT intensity; XMFLOAT2 resolution; - FLOAT padding[1]; + XMFLOAT2 offset; + XMFLOAT2 halfpixel; + XMFLOAT2 _dummy; }; @@ -52,9 +53,11 @@ class Blur //static void Cleanup(); static void RenderToRTV(ID3D11RenderTargetView *, ID3D11ShaderResourceView *, XMFLOAT2); + static void RenderBlur(ID3D11RenderTargetView *, int, float); }; + class Dimension { public: float x = 0; diff --git a/src/Client/Hook/Hooks/Render/ResizeHook.cpp b/src/Client/Hook/Hooks/Render/ResizeHook.cpp index bd4925ff..55722695 100644 --- a/src/Client/Hook/Hooks/Render/ResizeHook.cpp +++ b/src/Client/Hook/Hooks/Render/ResizeHook.cpp @@ -49,6 +49,9 @@ ResizeHook::resizeCallback(IDXGISwapChain *pSwapChain, UINT bufferCount, UINT wi // TODO: get back to this to check void ResizeHook::cleanShit(bool isResize) { + Memory::SafeRelease(SwapchainHook::stageTex); + Memory::SafeRelease(SwapchainHook::SavedD3D11BackBuffer); + for (auto &i: ClickGUIElements::images) { Memory::SafeRelease(i.second); } diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 1af1ea96..e914ee37 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -498,24 +498,21 @@ void SwapchainHook::DX11Init() { D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW, D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED), 96.0, 96.0); D2D::context->CreateBitmapFromDxgiSurface(eBackBuffer, props, &D2D1Bitmap); - //ImGui Init if(!initImgui) { ImGui::CreateContext(); - ID3D11DeviceContext* ppContext = nullptr; - d3d11Device->GetImmediateContext(&ppContext); + d3d11Device->GetImmediateContext(&context); ImGui_ImplWin32_Init(window); - ImGui_ImplDX11_Init(d3d11Device, ppContext); - ppContext->Release(); - + ImGui_ImplDX11_Init(d3d11Device, context); initImgui = true; } - Blur::InitializePipeline(); + SaveBackbuffer(); + Blur::InitializePipeline(); Memory::SafeRelease(eBackBuffer); init = true; } diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 4afee4ed..7965e104 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -129,7 +129,7 @@ class ClickGUIRenderer : public Listener { } - Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); + Blur::RenderBlur(event.RTV, 1, realBlurAmount/4); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); From e53cf7024f6ea8004ad419283f913d9df4610386 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 5 Aug 2024 22:55:16 +0600 Subject: [PATCH 059/240] yas queen --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 7f63afde..015a04f7 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -338,7 +338,7 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio desc.Height /= 2; } - constantBuffer.offset = XMFLOAT2(intensity, intensity); + constantBuffer.offset = XMFLOAT2(intensity * 3, intensity * 3); pContext->PSSetShader(pDownsampleShader, nullptr, 0); RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); From f13f88e858caa5012d5f8ba00cd71a37632bcb67 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 5 Aug 2024 23:26:50 +0600 Subject: [PATCH 060/240] ig this is needed for it to look better --- src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 7965e104..4afee4ed 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -129,7 +129,7 @@ class ClickGUIRenderer : public Listener { } - Blur::RenderBlur(event.RTV, 1, realBlurAmount/4); + Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); From cf1d5965fb0d0077d7bb8fb80ce0c5221a2788cd Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 5 Aug 2024 23:44:55 +0600 Subject: [PATCH 061/240] i forgot --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 015a04f7..2a1fafd7 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -292,6 +292,9 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) { + + if(intensity < 1) return; + if (!SwapchainHook::GetBackbuffer()) return; ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); From 788a73dd495ce987c87a83bc83cfafaf74ef78d2 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:05:35 +0600 Subject: [PATCH 062/240] 11on12 progress --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 9 +- src/Client/GUI/Engine/Effects/Blur/blur.cpp~ | 372 ++++++++++++++++++ .../Hook/Hooks/Render/SwapchainHook.cpp | 76 +++- .../Modules/MotionBlur/MotionBlurListener.hpp | 4 +- 4 files changed, 440 insertions(+), 21 deletions(-) create mode 100644 src/Client/GUI/Engine/Effects/Blur/blur.cpp~ diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 2a1fafd7..33853888 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -166,8 +166,7 @@ void Blur::InitializePipeline() { HRESULT hr; - ID3D11DeviceContext* pContext; - SwapchainHook::d3d11Device->GetImmediateContext(&pContext); + ID3D11DeviceContext* pContext = SwapchainHook::context; // byteWidth has to be a multiple of 32, BlurInputBuffer has a size of 24 CD3D11_BUFFER_DESC cbd( @@ -211,9 +210,7 @@ void Blur::InitializePipeline() sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; SwapchainHook::d3d11Device->CreateSamplerState(&sd, &pSampler); - - pContext->Release(); - + } void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderResourceView *pShaderResourceView, XMFLOAT2 rtvSize) { @@ -294,7 +291,7 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio { if(intensity < 1) return; - + if (!SwapchainHook::GetBackbuffer()) return; ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp~ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp~ new file mode 100644 index 00000000..33853888 --- /dev/null +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp~ @@ -0,0 +1,372 @@ +#include +#include +#include +#include "../../Engine.hpp" +#include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" +#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" + +// CREDITS @MR CHIPS (@chyves) + +#define BLUR_OFFSET 10 + +static const XMFLOAT4 quadVertices[] = + { + XMFLOAT4(1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; + +const char *vertexShaderSrc = "struct VS_INPUT {\ + float4 pos : POSITION;\ +};\ +\ +float4 main(VS_INPUT input) : SV_POSITION {\ + return input.pos;\ +}"; + +const char *downsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; + + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } + + return colorSum; +} +)"; + +const char *upsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; + + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } + + return colorSum; +} +)"; + + + +const char *dbgDrawTextureShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ +{\ + float2 resolution;\ + float2 offset;\ + float2 halfpixel;\ +};\ +struct PS_INPUT {\ + float4 pos : POSITION;\ +};\ +sampler sampler0 : register(s0);\ +Texture2D texture0 : register(t0);\ +\ +float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET {\ + float2 uv = screenSpace.xy / resolution;\ + return texture0.Sample(sampler0, uv);\ +}"; + +ID3DBlob *TryCompileShader(const char *pSrcData, const char *pTarget) +{ + HRESULT hr; + + ID3DBlob *shaderBlob; + ID3DBlob *errorBlob; + hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); + + if (FAILED(hr)) + { + Logger::error("[Blur] Failed to compile shader"); + errorBlob->Release(); + throw std::logic_error("Failed to compile shader!"); + } + return shaderBlob; +} + +ID3D11PixelShader *dbgShader; + +void Blur::InitializePipeline() +{ + + HRESULT hr; + ID3D11DeviceContext* pContext = SwapchainHook::context; + + // byteWidth has to be a multiple of 32, BlurInputBuffer has a size of 24 + CD3D11_BUFFER_DESC cbd( + sizeof(BlurInputBuffer), + D3D11_BIND_CONSTANT_BUFFER); + CD3D11_BUFFER_DESC cbdVertex( + sizeof(quadVertices), + D3D11_BIND_VERTEX_BUFFER); + + SwapchainHook::d3d11Device->CreateBuffer( + &cbd, + nullptr, + &pConstantBuffer); + + D3D11_SUBRESOURCE_DATA vertexBufferData = {quadVertices, 0, 0}; + + SwapchainHook::d3d11Device->CreateBuffer( + &cbdVertex, + &vertexBufferData, + &pVertexBuffer); + + ID3DBlob *shaderBlob = TryCompileShader(upsampleShaderSrc, "ps_4_0"); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pUpsampleShader); + + shaderBlob = TryCompileShader(downsampleShaderSrc, "ps_4_0"); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pDownsampleShader); + + shaderBlob = TryCompileShader(dbgDrawTextureShaderSrc, "ps_4_0"); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &dbgShader); + + shaderBlob = TryCompileShader(vertexShaderSrc, "vs_4_0"); + SwapchainHook::d3d11Device->CreateVertexShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pVertexShader); + + D3D11_INPUT_ELEMENT_DESC ied = + {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, + 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}; + SwapchainHook::d3d11Device->CreateInputLayout(&ied, 1, shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &pInputLayout); + D3D11_SAMPLER_DESC sd{}; + sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + sd.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; + SwapchainHook::d3d11Device->CreateSamplerState(&sd, &pSampler); + +} +void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderResourceView *pShaderResourceView, XMFLOAT2 rtvSize) +{ + HRESULT hr; + ID3D11DeviceContext* pContext = SwapchainHook::context; + D3D11_DEPTH_STENCIL_DESC dsd{}; + dsd.DepthEnable = false; + dsd.StencilEnable = false; + ID3D11DepthStencilState *pDepthStencilState; + hr = SwapchainHook::d3d11Device->CreateDepthStencilState(&dsd, &pDepthStencilState); + if (FAILED(hr)) { pContext->Release(); return; } + pContext->OMSetDepthStencilState(pDepthStencilState, 0); + + void *null = nullptr; + pContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView **)&null); + pContext->OMSetRenderTargets(1, &pRenderTargetView, nullptr); + + constantBuffer.resolution = rtvSize; + constantBuffer.halfpixel = XMFLOAT2(0.5 / rtvSize.x, 0.5 / rtvSize.y); + pContext->UpdateSubresource(pConstantBuffer, 0, nullptr, &constantBuffer, 0, 0); + + pContext->IASetInputLayout(pInputLayout); + UINT stride = sizeof(XMFLOAT4); + UINT offset = 0; + + pContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset); + pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + pContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0); + pContext->VSSetShader(pVertexShader, nullptr, 0); + pContext->PSSetSamplers(0, 1, &pSampler); + pContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); + D3D11_BLEND_DESC bd{}; + ZeroMemory(&bd, sizeof(bd)); + bd.AlphaToCoverageEnable = false; + bd.RenderTarget[0].BlendEnable = true; + bd.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + bd.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + bd.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; + bd.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; + bd.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + bd.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + bd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + ID3D11BlendState *pBlendState; + hr = SwapchainHook::d3d11Device->CreateBlendState(&bd, &pBlendState); + if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); return; } + pContext->OMSetBlendState(pBlendState, NULL, 0xffffffff); + D3D11_RASTERIZER_DESC rd{}; + rd.FillMode = D3D11_FILL_SOLID; + rd.CullMode = D3D11_CULL_NONE; + rd.DepthClipEnable = false; + rd.ScissorEnable = false; + ID3D11RasterizerState *pRasterizerState; + hr = SwapchainHook::d3d11Device->CreateRasterizerState(&rd, &pRasterizerState); + if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); pBlendState->Release(); return; } + pContext->RSSetState(pRasterizerState); + + pContext->PSSetShaderResources(0, 1, &pShaderResourceView); + D3D11_VIEWPORT viewport{}; + viewport.TopLeftX = 0; + viewport.TopLeftY = 0; + viewport.Width = rtvSize.x; + viewport.Height = rtvSize.y; + viewport.MaxDepth = 1.0f; + + FLOAT backgroundColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + pContext->ClearRenderTargetView(pRenderTargetView, backgroundColor); + pContext->RSSetViewports(1, &viewport); + pContext->Draw(sizeof(quadVertices) / sizeof(quadVertices[0]), 0); + ID3D11RenderTargetView* kajgd = nullptr; + pContext->OMSetRenderTargets(1, &kajgd, nullptr); + + pDepthStencilState->Release(); + pBlendState->Release(); + pRasterizerState->Release(); +} + +void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) +{ + + if(intensity < 1) return; + + if (!SwapchainHook::GetBackbuffer()) return; + + ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); + if (!pOrigShaderResourceView) return; + + ID3D11DeviceContext* pContext = SwapchainHook::context; + + std::vector framebuffers; + std::vector renderTargetViews; + std::vector shaderResourceViews; + std::vector fbSizes; + D3D11_TEXTURE2D_DESC desc; + SwapchainHook::GetBackbuffer()->GetDesc(&desc); + + framebuffers.reserve((size_t)iterations); + renderTargetViews.reserve((size_t)iterations); + + D3D11_SHADER_RESOURCE_VIEW_DESC srvd{}; + srvd.Format = desc.Format; + srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvd.Texture2D.MipLevels = 1; + + desc.BindFlags |= D3D11_BIND_RENDER_TARGET; + + for (int i = 0; i <= iterations; i++) + { + ID3D11Texture2D *pFrameBuffer; + ID3D11RenderTargetView *pRenderTargetView; + ID3D11ShaderResourceView *pShaderResourceView; + + SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); + if (i == 0) + pRenderTargetView = pDstRenderTargetView; + else + SwapchainHook::d3d11Device->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); + SwapchainHook::d3d11Device->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); + + framebuffers.push_back(pFrameBuffer); + renderTargetViews.push_back(pRenderTargetView); + shaderResourceViews.push_back(pShaderResourceView); + fbSizes.push_back(XMFLOAT2(desc.Width, desc.Height)); + + desc.Width /= 2; + desc.Height /= 2; + } + + constantBuffer.offset = XMFLOAT2(intensity * 3, intensity * 3); + pContext->PSSetShader(pDownsampleShader, nullptr, 0); + RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); + + for (int i = 1; i < iterations; i++) + { + RenderToRTV(renderTargetViews[i + 1], shaderResourceViews[i], fbSizes[i + 1]); + } + + pContext->PSSetShader(pUpsampleShader, nullptr, 0); + + for (int i = iterations; i > 0; i--) + { + RenderToRTV(renderTargetViews[i - 1], shaderResourceViews[i], fbSizes[i - 1]); + } + + for (int i = 0; i < iterations; i++) + { + if (i != 0) + renderTargetViews[i]->Release(); + framebuffers[i]->Release(); + shaderResourceViews[i]->Release(); + + renderTargetViews.clear(); + framebuffers.clear(); + shaderResourceViews.clear(); + fbSizes.clear(); + } + + pContext->Release(); + pOrigShaderResourceView->Release(); +} \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index e914ee37..351a3578 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -161,9 +161,6 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI /* RENDERING START */ } else { - - SaveBackbuffer(); - /* IMPORTANT FONT STUFF */ if (ImGui::GetCurrentContext()) { @@ -228,7 +225,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI if (fontLoaded) { ImGui::GetIO().Fonts->Build(); - if (d3d11Device) { + if (!queue) { ImGui_ImplDX11_InvalidateDeviceObjects(); ImGui_ImplDX11_CreateDeviceObjects(); } @@ -266,6 +263,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI ID3D11Resource *resource = D3D11Resources[currentBitmap]; d3d11On12Device->AcquireWrappedResources(&resource, 1); + SaveBackbuffer(); D2D::context->SetTarget(D2D1Bitmaps[currentBitmap]); DX12Blur(); @@ -338,7 +336,14 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); + ID3D11Texture2D* buffer2D = nullptr; + D3D11Resources[currentBitmap]->QueryInterface(IID_PPV_ARGS(&buffer2D)); + + ID3D11RenderTargetView* mainRenderTargetView; + d3d11Device->CreateRenderTargetView(buffer2D, NULL, &mainRenderTargetView); + RenderEvent event{}; + event.RTV = mainRenderTargetView; EventHandler::onRender(event); @@ -378,6 +383,9 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI queue->ExecuteCommandLists(1, reinterpret_cast(&d3d12CommandList)); + Memory::SafeRelease(mainRenderTargetView); + Memory::SafeRelease(buffer2D); + } } } @@ -402,6 +410,8 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI DX11Blur(); + SaveBackbuffer(); + D2D::context->BeginDraw(); MC::windowSize = Vec2(D2D::context->GetSize().width, D2D::context->GetSize().height); @@ -519,18 +529,19 @@ void SwapchainHook::DX11Init() { void SwapchainHook::DX12Init() { + + ID3D12Device5 *device; swapchain->GetDevice(IID_PPV_ARGS(&d3d12Device5)); if (SUCCEEDED(swapchain->GetDevice(IID_PPV_ARGS(&device))) && kiero::getRenderType() == kiero::RenderType::D3D12) { - ID3D11Device *d3d11device; D3D11On12CreateDevice(device, D3D11_CREATE_DEVICE_FLAG::D3D11_CREATE_DEVICE_BGRA_SUPPORT, nullptr, 0, - (IUnknown **) &queue, 1, 0, &d3d11device, &context, + (IUnknown **) &queue, 1, 0, &d3d11Device, &context, nullptr); - d3d11device->QueryInterface(IID_PPV_ARGS(&d3d11On12Device)); + d3d11Device->QueryInterface(IID_PPV_ARGS(&d3d11On12Device)); D2D1_DEVICE_CONTEXT_OPTIONS deviceOptions = D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS; ID2D1Factory7 *d2dFactory; @@ -601,10 +612,10 @@ void SwapchainHook::DX12Init() { Memory::SafeRelease(device); Memory::SafeRelease(device2); - Memory::SafeRelease(d3d11device); Memory::SafeRelease(dxgiDevice); Memory::SafeRelease(d2dFactory); + Blur::InitializePipeline(); init = true; } } @@ -614,13 +625,10 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() return SavedD3D11BackBuffer; } - void SwapchainHook::SaveBackbuffer() - { - - if(SwapchainHook::queue) return; + void SwapchainHook::SaveBackbuffer() { + if(!SwapchainHook::queue) { - ID3D11DeviceContext* deviceContext; - SwapchainHook::d3d11Device->GetImmediateContext(&deviceContext); + ID3D11DeviceContext* deviceContext = SwapchainHook::context; IDXGISurface1* backBuffer = nullptr; HRESULT hr; SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); @@ -661,4 +669,44 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() Memory::SafeRelease(backBuffer); Memory::SafeRelease(buffer2D); Memory::SafeRelease(deviceContext); + + } else { + + + ID3D11Texture2D* buffer2D = nullptr; + D3D11Resources[currentBitmap]->QueryInterface(IID_PPV_ARGS(&buffer2D)); + + ID3D11DeviceContext* deviceContext = context; + HRESULT hr; + + D3D11_TEXTURE2D_DESC desc; + buffer2D->GetDesc(&desc); + HRESULT r; + + if(!stageTex) { + D3D11_TEXTURE2D_DESC stageDesc = desc; + stageDesc.Usage = D3D11_USAGE_STAGING; + stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + stageDesc.BindFlags = 0; + r = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); + if (FAILED(r)) std::cout << "Failed to create stage texture: " << std::hex << r << std::endl; + } + deviceContext->CopyResource(stageTex, buffer2D); + + D3D11_TEXTURE2D_DESC defaultDesc = desc; + defaultDesc.Usage = D3D11_USAGE_DEFAULT; + defaultDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + defaultDesc.CPUAccessFlags = 0; + + if(!SavedD3D11BackBuffer) { + hr = SwapchainHook::d3d11Device->CreateTexture2D(&defaultDesc, nullptr, &SavedD3D11BackBuffer); + if (FAILED(hr)) { + std::cout << "Failed to create def texture: " << std::hex << r << std::endl; + } + } + + deviceContext->CopyResource(SavedD3D11BackBuffer, stageTex); + Memory::SafeRelease(buffer2D); + Memory::SafeRelease(deviceContext); } +} diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index 821349a9..e30fead9 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -87,7 +87,9 @@ class MotionBlurListener : public Listener { if (FAILED(hr = SwapchainHook::d3d11Device->CreateShaderResourceView(SwapchainHook::GetBackbuffer(), &srvDesc, &outSRV))) { - std::cout << "Failed to create shader resource view: " << std::hex << hr << std::endl; + std::stringstream ss; + ss << "0x" << std::hex << std::setw(8) << std::setfill('0') << hr; + Logger::error("Failed to create shader resource view: " + ss.str()); } return outSRV; From 3ac0c73ae53f0768b20ba735f6c6a77a2ede4a1e Mon Sep 17 00:00:00 2001 From: Ashank Sundaram Date: Tue, 6 Aug 2024 19:32:37 +0800 Subject: [PATCH 063/240] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..dd84ea78 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..bbcbbe7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 0896a03c566fac3217c04ca6733ed41255cde488 Mon Sep 17 00:00:00 2001 From: Raspberry <84133368+EpiclyRaspberry@users.noreply.github.com> Date: Tue, 6 Aug 2024 20:26:11 +0800 Subject: [PATCH 064/240] issues temps from markdowns to yaml --- .github/ISSUE_TEMPLATE/bug_report.md | 38 --------- .github/ISSUE_TEMPLATE/bug_report.yaml | 90 +++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ----- .github/ISSUE_TEMPLATE/feature_request.yaml | 41 ++++++++++ .gitignore | 3 +- 5 files changed, 133 insertions(+), 59 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yaml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yaml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dd84ea78..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 00000000..580c0fa5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,90 @@ +name: Bug report +description: Report a bug in Flarial +title: "[BUG] " +labels: ["dll","launcher"] + +body: + # - type: markdown + # attributes: + # value: | + # **Before you submit a bug report, please make sure you have done the following:** + - type: checkboxes + id: checklist + attributes: + label: Checklist + description: | + **Before you submit a bug report, please make sure you have done the following:** + options: + - label: | + I have checked the [FAQ](https://ptb.discord.com/channels/1049946152092586054/1135112998453788672) + required: true + - label: | + I have searched the [issues](https://github.com/flarialmc/dll/issues?q=is%3Aissue+is%3Aopen) of this repository and believe that this is not a duplicate + required: true + - type: input + id: bug + attributes: + label: Bug description + description: A clear and concise description of what the bug is. + placeholder: I was trying to [...] but [...] + + - type: input + id: expected + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. + placeholder: I expected [...] + + - type: input + id: actual + attributes: + label: Actual behavior + description: A clear and concise description of what actually happened. + placeholder: Instead [...] + + - type: input + id: steps + attributes: + label: Steps to reproduce + description: | + Please provide detailed steps for reproducing the issue. + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + placeholder: | + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + + - type: dropdown + id: os + attributes: + label: Operating System + description: Which operating system are you using? + options: + - Windows 10 + - Windows 11 + + - type: input + id: osversion + attributes: + label: OS Version + description: What version of the operating system are you using? + placeholder: 21H1, 21H2, 22H1, etc. + + - type: input + id: additional + attributes: + label: Additional notes + description: | + Add any other context about the problem here. + If applicable, add screenshots to help explain your problem. + placeholder: | + - Screenshots + - Logs + - etc. + + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7d..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 00000000..c86e675c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,41 @@ +name: featrequest +description: Suggest a new feature for Flarial +title: "[FEATURE REQUEST] " +labels: ["enhancement"] + +body: + - type: input + id: feature + attributes: + label: Feature description + description: A clear and concise description of what the feature is. + placeholder: I would like to see [...] + + - type: input + id: reason + attributes: + label: Reason + description: Why do you think this feature should be added? + placeholder: I think this feature should be added because [...] + + - type: input + id: usecase + attributes: + label: Use case + description: How would you use this feature? + placeholder: I would use this feature to [...] + + - type: input + id: alternatives + attributes: + label: Alternatives + description: Have you considered any alternative solutions or features? + placeholder: An alternative solution could be [...] + + - type: input + id: additional + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + placeholder: | + Add any other context or screenshots about the feature request here. \ No newline at end of file diff --git a/.gitignore b/.gitignore index e9a56011..1927de1b 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,5 @@ cmake-build-minsizerel-visual-studio/ cmake-build-visual-profile/ clion/ clion-ninja/ -*.zip \ No newline at end of file +*.zip +localextras/ \ No newline at end of file From 13e660336d9f73b5ff1be13efaaab18538e0815d Mon Sep 17 00:00:00 2001 From: Raspberry <84133368+EpiclyRaspberry@users.noreply.github.com> Date: Tue, 6 Aug 2024 21:37:50 +0800 Subject: [PATCH 065/240] Refactor bug_report and feature_request issue templates to use textarea instead of input --- .github/ISSUE_TEMPLATE/bug_report.yaml | 14 +++++++------- .github/ISSUE_TEMPLATE/feature_request.yaml | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 580c0fa5..18be5d99 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -1,4 +1,4 @@ -name: Bug report +name: Bug Report description: Report a bug in Flarial title: "[BUG] " labels: ["dll","launcher"] @@ -21,28 +21,28 @@ body: - label: | I have searched the [issues](https://github.com/flarialmc/dll/issues?q=is%3Aissue+is%3Aopen) of this repository and believe that this is not a duplicate required: true - - type: input + - type: textarea id: bug attributes: label: Bug description description: A clear and concise description of what the bug is. placeholder: I was trying to [...] but [...] - - type: input + - type: textarea id: expected attributes: label: Expected behavior description: A clear and concise description of what you expected to happen. placeholder: I expected [...] - - type: input + - type: textarea id: actual attributes: label: Actual behavior description: A clear and concise description of what actually happened. placeholder: Instead [...] - - type: input + - type: textarea id: steps attributes: label: Steps to reproduce @@ -67,14 +67,14 @@ body: - Windows 10 - Windows 11 - - type: input + - type: textarea id: osversion attributes: label: OS Version description: What version of the operating system are you using? placeholder: 21H1, 21H2, 22H1, etc. - - type: input + - type: textarea id: additional attributes: label: Additional notes diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index c86e675c..932c2c81 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -1,38 +1,38 @@ -name: featrequest +name: Feature Request description: Suggest a new feature for Flarial title: "[FEATURE REQUEST] " labels: ["enhancement"] body: - - type: input + - type: textarea id: feature attributes: label: Feature description description: A clear and concise description of what the feature is. placeholder: I would like to see [...] - - type: input + - type: textarea id: reason attributes: label: Reason description: Why do you think this feature should be added? placeholder: I think this feature should be added because [...] - - type: input + - type: textarea id: usecase attributes: label: Use case description: How would you use this feature? placeholder: I would use this feature to [...] - - type: input + - type: textarea id: alternatives attributes: label: Alternatives description: Have you considered any alternative solutions or features? placeholder: An alternative solution could be [...] - - type: input + - type: textarea id: additional attributes: label: Additional context From 6a85d59d6f51f8cd2badbb1b13b39a615a828a7c Mon Sep 17 00:00:00 2001 From: Raspberry <84133368+EpiclyRaspberry@users.noreply.github.com> Date: Tue, 6 Aug 2024 21:44:34 +0800 Subject: [PATCH 066/240] render: Markdown (lol) --- .github/ISSUE_TEMPLATE/bug_report.yaml | 8 +++++++- .github/ISSUE_TEMPLATE/feature_request.yaml | 4 ++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 18be5d99..945f13e4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -4,7 +4,7 @@ title: "[BUG] " labels: ["dll","launcher"] body: - # - type: markdown + # - type: Markdown # attributes: # value: | # **Before you submit a bug report, please make sure you have done the following:** @@ -24,6 +24,7 @@ body: - type: textarea id: bug attributes: + render: Markdown label: Bug description description: A clear and concise description of what the bug is. placeholder: I was trying to [...] but [...] @@ -31,6 +32,7 @@ body: - type: textarea id: expected attributes: + render: Markdown label: Expected behavior description: A clear and concise description of what you expected to happen. placeholder: I expected [...] @@ -38,6 +40,7 @@ body: - type: textarea id: actual attributes: + render: Markdown label: Actual behavior description: A clear and concise description of what actually happened. placeholder: Instead [...] @@ -45,6 +48,7 @@ body: - type: textarea id: steps attributes: + render: Markdown label: Steps to reproduce description: | Please provide detailed steps for reproducing the issue. @@ -70,6 +74,7 @@ body: - type: textarea id: osversion attributes: + render: Markdown label: OS Version description: What version of the operating system are you using? placeholder: 21H1, 21H2, 22H1, etc. @@ -78,6 +83,7 @@ body: id: additional attributes: label: Additional notes + render: Markdown description: | Add any other context about the problem here. If applicable, add screenshots to help explain your problem. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 932c2c81..fee87c03 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -15,6 +15,7 @@ body: id: reason attributes: label: Reason + render: Markdown description: Why do you think this feature should be added? placeholder: I think this feature should be added because [...] @@ -22,6 +23,7 @@ body: id: usecase attributes: label: Use case + render: Markdown description: How would you use this feature? placeholder: I would use this feature to [...] @@ -29,6 +31,7 @@ body: id: alternatives attributes: label: Alternatives + render: Markdown description: Have you considered any alternative solutions or features? placeholder: An alternative solution could be [...] @@ -36,6 +39,7 @@ body: id: additional attributes: label: Additional context + render: Markdown description: Add any other context or screenshots about the feature request here. placeholder: | Add any other context or screenshots about the feature request here. \ No newline at end of file From cac077d718f9bce2ec95dec9a7eac2763ab8029f Mon Sep 17 00:00:00 2001 From: Ashank Sundaram Date: Tue, 6 Aug 2024 23:05:38 +0800 Subject: [PATCH 067/240] Update README.md --- README.md | 51 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cdbaf587..465da349 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,50 @@ -This base is really shit and contains a lot of shit code as a result of being me, Shane, and Anshul's first C++ project. Thank you for everyone who has joined me and my friends on this journey, it has been great! Maybe the readme will be updated in the future. Pull requests are welcomed. +### Prerequisites: +1. **CMake**: Ensure CMake is installed on your system. You can download it from [cmake.org](https://cmake.org/download/) and follow the installation instructions for your operating system. -Make sure to read the license terms before modifying or distributing, though i don't really care, shame on you if you skid from this shitass base +2. **Git**: Install Git if you haven't already. You can download Git from [git-scm.com](https://git-scm.com/downloads) and follow the installation instructions. -Building the DLL should be easy. Just clone, set up your IDE and make sure you have the necessary tools ready to build with CMAKE, watch a tutorial or two if you don't know and there you have it. In theory, debug and release builds both should work. +### Steps to Clone and Build the Project: + +1. **Clone the Repository**: + Open a terminal or command prompt and clone the repository using Git: + ```bash + git clone https://github.com/flarialmc/dll.git + ``` + +2. **Navigate to the Project Directory**: + Change into the directory of the cloned repository: + ```bash + cd dll + ``` + +3. **Create a Build Directory**: + It's a good practice to create a separate directory for out-of-source builds. This keeps your source directory clean and allows for easier management of builds: + ```bash + mkdir build + cd build + ``` + +4. **Configure with CMake**: + Run CMake to configure the build environment. Specify the path to the CMakeLists.txt file in the root of the cloned repository: + ```bash + cmake .. + ``` + This command generates the necessary build files based on the CMake configuration. + +5. **Build the Project**: + Once CMake has configured the build files successfully, you can build the project using a suitable build tool (like `make` on Unix-like systems or Visual Studio on Windows): + ```bash + cmake --build . + ``` + This command compiles the project according to the generated build files. + +### Additional Notes: +- **Dependencies**: If the project has external dependencies that are not included in the repository, ensure they are installed on your system before running CMake. You may need to specify their paths or use CMake options (`-D` flags) to configure the project correctly. + +- **Build Configurations**: CMake supports different build configurations (e.g., Debug, Release). You can specify these configurations during the CMake configuration step using `-DCMAKE_BUILD_TYPE`: + ```bash + cmake -DCMAKE_BUILD_TYPE=Release .. + ``` + Replace `Release` with `Debug` or any other configuration you need. + +By following these steps, you should be able to clone and build the project using CMake successfully. From 5f0863705065b4ef491b24a86c8792c672c4f41d Mon Sep 17 00:00:00 2001 From: Ashank Sundaram Date: Tue, 6 Aug 2024 23:15:45 +0800 Subject: [PATCH 068/240] Update README.md --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 465da349..ca5d97b1 100644 --- a/README.md +++ b/README.md @@ -38,13 +38,4 @@ ``` This command compiles the project according to the generated build files. -### Additional Notes: -- **Dependencies**: If the project has external dependencies that are not included in the repository, ensure they are installed on your system before running CMake. You may need to specify their paths or use CMake options (`-D` flags) to configure the project correctly. - -- **Build Configurations**: CMake supports different build configurations (e.g., Debug, Release). You can specify these configurations during the CMake configuration step using `-DCMAKE_BUILD_TYPE`: - ```bash - cmake -DCMAKE_BUILD_TYPE=Release .. - ``` - Replace `Release` with `Debug` or any other configuration you need. - By following these steps, you should be able to clone and build the project using CMake successfully. From 960cbb280758655e63e40cf44840e611e25d7b94 Mon Sep 17 00:00:00 2001 From: TTF-fog <74908128+TTF-fog@users.noreply.github.com> Date: Tue, 6 Aug 2024 21:26:32 +0530 Subject: [PATCH 069/240] Update ZoomListener.hpp --- .../Module/Modules/Zoom/ZoomListener.hpp | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/Client/Module/Modules/Zoom/ZoomListener.hpp b/src/Client/Module/Modules/Zoom/ZoomListener.hpp index b356d3ba..1f0d7b9c 100644 --- a/src/Client/Module/Modules/Zoom/ZoomListener.hpp +++ b/src/Client/Module/Modules/Zoom/ZoomListener.hpp @@ -75,29 +75,32 @@ class ZoomListener : public Listener { //todo make it so that modules work together auto fovchanger = ModuleManager::getModule("FOV Changer"); auto upsidedown = ModuleManager::getModule("Upside Down"); + if (this->module->settings.getSettingByName("UseScroll")->value == true) { + if (event.getAction() == MouseAction::ScrollUp) { + if ((fovchanger != nullptr && + fovchanger->settings.getSettingByName("fovvalue")->value > 180) || + (upsidedown != nullptr && upsidedown->isEnabled())) + zoomValue += this->module->settings.getSettingByName("modifier")->value; + else zoomValue -= this->module->settings.getSettingByName("modifier")->value; + } + if (event.getAction() != MouseAction::ScrollUp && event.getButton() == MouseButton::Scroll) { + if ((fovchanger != nullptr && + fovchanger->settings.getSettingByName("fovvalue")->value > 180) || + (upsidedown != nullptr && upsidedown->isEnabled())) + zoomValue -= this->module->settings.getSettingByName("modifier")->value; + else zoomValue += this->module->settings.getSettingByName("modifier")->value; + } + + if (zoomValue < 1) zoomValue = 1; + else if (zoomValue > realFov) zoomValue = realFov; + + if (event.getAction() == MouseAction::ScrollUp || + event.getAction() != MouseAction::ScrollUp && event.getButton() == MouseButton::Scroll) { + event.setButton(MouseButton::None); + event.setAction(MouseAction::Release); - if (event.getAction() == MouseAction::ScrollUp) { - if ((fovchanger != nullptr && - fovchanger->settings.getSettingByName("fovvalue")->value > 180) || - (upsidedown != nullptr && upsidedown->isEnabled())) - zoomValue += this->module->settings.getSettingByName("modifier")->value; - else zoomValue -= this->module->settings.getSettingByName("modifier")->value; - } - if (event.getAction() != MouseAction::ScrollUp && event.getButton() == MouseButton::Scroll) { - if ((fovchanger != nullptr && - fovchanger->settings.getSettingByName("fovvalue")->value > 180) || - (upsidedown != nullptr && upsidedown->isEnabled())) - zoomValue -= this->module->settings.getSettingByName("modifier")->value; - else zoomValue += this->module->settings.getSettingByName("modifier")->value; - } - - if (zoomValue < 1) zoomValue = 1; - else if (zoomValue > realFov) zoomValue = realFov; - if (event.getAction() == MouseAction::ScrollUp || - event.getAction() != MouseAction::ScrollUp && event.getButton() == MouseButton::Scroll) { - event.setButton(MouseButton::None); - event.setAction(MouseAction::Release); + } } } } From e158bf6b83e2bd4aa0909b0fdf40b46d56796b9a Mon Sep 17 00:00:00 2001 From: TTF-fog <74908128+TTF-fog@users.noreply.github.com> Date: Tue, 6 Aug 2024 21:27:28 +0530 Subject: [PATCH 070/240] Update Zoom.hpp --- src/Client/Module/Modules/Zoom/Zoom.hpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Client/Module/Modules/Zoom/Zoom.hpp b/src/Client/Module/Modules/Zoom/Zoom.hpp index b62883be..626b2d19 100644 --- a/src/Client/Module/Modules/Zoom/Zoom.hpp +++ b/src/Client/Module/Modules/Zoom/Zoom.hpp @@ -9,7 +9,7 @@ class Zoom : public Module { public: - Zoom() : Module("Zoom", "Allows you to see distant places.", IDR_MAGNIFY_PNG, "C") { + Zoom() : Module("Zoom", "Allows you to see distant places.", R"(\Flarial\assets\magnify.png)", "C") { Module::setup(); @@ -32,6 +32,7 @@ class Zoom : public Module { if (settings.getSettingByName("SaveModifier") == nullptr) settings.addSetting("SaveModifier", true); if (settings.getSettingByName("hidehand") == nullptr) settings.addSetting("hidehand", true); if (settings.getSettingByName("hidemodules") == nullptr) settings.addSetting("hidemodules", false); + if (settings.getSettingByName("UseScroll") == nullptr) settings.addSetting("UseScroll", true); //if (settings.getSettingByName("hidehud") == nullptr) settings.addSetting("hidehud", false); if (settings.getSettingByName("modifier") == nullptr) settings.addSetting("modifier", 10.0f); if (settings.getSettingByName("anim") == nullptr) settings.addSetting("anim", 0.20f); @@ -150,8 +151,18 @@ class Zoom : public Module { "alwaysanim")->value)) this->settings.getSettingByName("alwaysanim")->value = !this->settings.getSettingByName( "alwaysanim")->value; + toggleY += Constraints::SpacingConstraint(0.25, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Use Scroll", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(7, toggleX, toggleY, this->settings.getSettingByName( + "UseScroll")->value)) + this->settings.getSettingByName("UseScroll")->value = !this->settings.getSettingByName( + "UseScroll")->value; FlarialGUI::UnsetScrollView(); } -}; \ No newline at end of file +}; From fcb0e2569c528ac927ca11f542fc6873869bad41 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 7 Aug 2024 19:51:27 +0300 Subject: [PATCH 071/240] getCurrentScreen mtx --- src/Client/Client.cpp | 4 ++-- src/Client/Events/EventHandler.cpp | 11 +++++----- .../Modules/ArmorHUD/ArmorHUDListener.hpp | 2 +- .../BlockBreakIndicator.hpp | 2 +- .../Modules/ClickGUI/ClickGUIRenderer.hpp | 11 +++++----- .../Modules/GuiScale/GuiScaleListener.hpp | 1 + .../InventoryHUD/InventoryHUDListener.hpp | 2 +- .../Modules/Keystrokes/KeystrokesListener.hpp | 2 +- src/Client/Module/Modules/Module.cpp | 6 ++--- .../Modules/MotionBlur/MotionBlurListener.hpp | 2 +- .../Module/Modules/PaperDoll/DollListener.hpp | 2 +- .../Module/Modules/Sprint/SprintListener.hpp | 2 +- .../Module/Modules/Zoom/ZoomListener.hpp | 2 +- src/SDK/Client/Core/ClientInstance.cpp | 1 + src/SDK/SDK.cpp | 22 ++++++++++--------- src/SDK/SDK.hpp | 5 ++++- 16 files changed, 42 insertions(+), 35 deletions(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 7d82a625..229b1712 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -196,8 +196,8 @@ void Client::centerCursor() { } - if ((SDK::currentScreen != "hud_screen" && InHudScreen) || - (SDK::currentScreen == "hud_screen" && !InHudScreen)) { + if ((SDK::getCurrentScreen() != "hud_screen" && InHudScreen) || + (SDK::getCurrentScreen() == "hud_screen" && !InHudScreen)) { GetWindowRect(hWnd, ¤tRect); GetClientRect(hWnd, &clientRect); diff --git a/src/Client/Events/EventHandler.cpp b/src/Client/Events/EventHandler.cpp index 73a2ed88..4332aa09 100644 --- a/src/Client/Events/EventHandler.cpp +++ b/src/Client/Events/EventHandler.cpp @@ -93,11 +93,12 @@ void EventHandler::onKey(KeyEvent &event) { if (Client::disable) return; if (!ModuleManager::initialized) return; - if (SDK::currentScreen != "hud_screen" && - SDK::currentScreen != "f1_screen" && - SDK::currentScreen != "zoom_screen"&& - SDK::currentScreen != "start_screen"&& - SDK::currentScreen != "play_screen") return; + auto currentScreen = SDK::getCurrentScreen(); + if (currentScreen != "hud_screen" && + currentScreen != "f1_screen" && + currentScreen != "zoom_screen"&& + currentScreen != "start_screen"&& + currentScreen != "play_screen") return; for (Listener *&listener: listeners) { listener->onKey(event); diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp index 5826a54e..4ac7d594 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp @@ -228,7 +228,7 @@ class ArmorHUDListener : public Listener { renderDurability(); } - if (SDK::currentScreen != "hud_screen") ClickGUIRenderer::editmenu = false; + if (SDK::getCurrentScreen() != "hud_screen") ClickGUIRenderer::editmenu = false; } void onSetupAndRender(SetupAndRenderEvent &event) override { diff --git a/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicator.hpp b/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicator.hpp index 6b868a5a..ce2d5a53 100644 --- a/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicator.hpp +++ b/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicator.hpp @@ -357,7 +357,7 @@ class BlockBreakIndicator : public Module { float currentHeight = 0.0f; void normalRender(int index, std::string& value) override { - if(SDK::currentScreen != "hud_screen") return; + if(SDK::getCurrentScreen() != "hud_screen") return; // TODO: needs a logic where if you stopped holding left button it wont show progress if its higher than 0% (if u resetted mining you start at 0%) if (!CPSListener::GetLeftHeld()) { value = "0%"; diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 4afee4ed..e191b669 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -85,8 +85,7 @@ class ClickGUIRenderer : public Listener { Vec2 allahuakbar = Constraints::CenterConstraint(allahu, akbar, "y", 1.175, 1.175); // TODO: add inventory screen to onRender? // watermark - if (ClientInstance::getTopScreenName() == "inventory_screen" || - SDK::currentScreen.find("chest") != std::string::npos) + if (SDK::getCurrentScreen() == "inventory_screen" || SDK::getCurrentScreen().find("chest") != std::string::npos) if (Client::settings.getSettingByName("watermark")->value) FlarialGUI::image(IDR_FLARIAL_TITLE_PNG, D2D1::RectF(allahuakbar.x, allahuakbar.y, allahuakbar.x + allahu, @@ -828,7 +827,7 @@ class ClickGUIRenderer : public Listener { //TODO: MAKE module->setActive() module->isActive() module->isRestricted() if (module->isKeybind(event.keys) && module->isKeyPartOfKeybind(event.key) && event.getAction() == (int)ActionType::Pressed) { - if (SDK::currentScreen != "hud_screen" && SDK::currentScreen != "pause_screen") + if (SDK::getCurrentScreen() != "hud_screen" && SDK::getCurrentScreen() != "pause_screen") module->active = false; else { module->active = !module->active; @@ -915,7 +914,7 @@ class ClickGUIRenderer : public Listener { } - if (module->active || editmenu && SDK::currentScreen == "hud_screen") + if (module->active || editmenu && SDK::getCurrentScreen() == "hud_screen") SDK::clientInstance->releaseMouse(); // release mouse lets cursor move if (module->active || editmenu) @@ -925,12 +924,12 @@ class ClickGUIRenderer : public Listener { } void onMouse(MouseEvent &event) override { - if(SDK::currentScreen != "hud_screen"){ + if(SDK::getCurrentScreen() != "hud_screen"){ if(module->active) module->active = false; } - if ((module->active || editmenu) && SDK::currentScreen == "hud_screen") + if ((module->active || editmenu) && SDK::getCurrentScreen() == "hud_screen") event.cancel(); // TODO: modules dont listen for canceled state!!! } diff --git a/src/Client/Module/Modules/GuiScale/GuiScaleListener.hpp b/src/Client/Module/Modules/GuiScale/GuiScaleListener.hpp index c7b28fac..03b57ed6 100644 --- a/src/Client/Module/Modules/GuiScale/GuiScaleListener.hpp +++ b/src/Client/Module/Modules/GuiScale/GuiScaleListener.hpp @@ -11,6 +11,7 @@ class GuiScaleListener : public Listener { void onRender(RenderEvent& event) override { if(SDK::currentScreen == "hud_screen") if(SDK::clientInstance->guiData != nullptr) + if(SDK::getCurrentScreen() == "hud_screen") if (module->settings.getSettingByName("enabled")->value){ float percent = module->settings.getSettingByName("guiscale")->value; SDK::clientInstance->guiData->GuiScale = percent; diff --git a/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp b/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp index a74d27af..b2016f20 100644 --- a/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp +++ b/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp @@ -82,7 +82,7 @@ class InventoryHUDListener : public Listener { } } - if (SDK::currentScreen != "hud_screen") ClickGUIRenderer::editmenu = false; + if (SDK::getCurrentScreen() != "hud_screen") ClickGUIRenderer::editmenu = false; } void onSetupAndRender(SetupAndRenderEvent &event) override { diff --git a/src/Client/Module/Modules/Keystrokes/KeystrokesListener.hpp b/src/Client/Module/Modules/Keystrokes/KeystrokesListener.hpp index c7d13420..65846b2c 100644 --- a/src/Client/Module/Modules/Keystrokes/KeystrokesListener.hpp +++ b/src/Client/Module/Modules/Keystrokes/KeystrokesListener.hpp @@ -14,7 +14,7 @@ class KeystrokesListener : public Listener { Module *module; void onRender(RenderEvent &event) override { - if(!module->isEnabled() || SDK::currentScreen != "hud_screen") return; + if(!module->isEnabled() || SDK::getCurrentScreen() != "hud_screen") return; this->module->normalRender(7, (std::string &) ""); } diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 3f3f9125..2a610e8a 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -15,7 +15,7 @@ std::map alignments = { static std::string Lname = ""; void Module::normalRender(int index, std::string &value) { - if(!isEnabled() || SDK::currentScreen != "hud_screen") return; + if(!isEnabled() || SDK::getCurrentScreen() != "hud_screen") return; std::string text{}; if(this->settings.getSettingByName("text")!=nullptr) @@ -522,7 +522,7 @@ bool Module::isKeybind(const std::array& keys) { // TODO: in menu should also mean in Edit Mode, when edit mode all modules set to active(visible? add visible setting (for TAB)) if (name != "ClickGUI") if (FlarialGUI::inMenu) return false; - if (SDK::currentScreen == "chat_screen") return false; + if (SDK::getCurrentScreen() == "chat_screen") return false; bool allInactive = std::ranges::all_of(FlarialGUI::TextBoxes, [](const TextBoxStruct& i) { return !i.isActive; }); @@ -542,7 +542,7 @@ bool Module::isKeybind(const std::array& keys) { } if (name != "ClickGUI") if (FlarialGUI::inMenu) return false; - if (SDK::currentScreen == "chat_screen") return false; + if (SDK::getCurrentScreen() == "chat_screen") return false; bool allInactive = std::ranges::all_of(FlarialGUI::TextBoxes, [](const TextBoxStruct& i) { return !i.isActive; }); diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index e30fead9..8800b86a 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -30,7 +30,7 @@ class MotionBlurListener : public Listener { void onRender(RenderEvent &event) override { int maxFrames = (int)round(module->settings.getSettingByName("intensity2")->value); - if (SDK::currentScreen == "hud_screen" && !SwapchainHook::queue) { + if (SDK::getCurrentScreen() == "hud_screen" && !SwapchainHook::queue) { if (previousFrames.size() >= static_cast(maxFrames)) { // Remove excess frames if maxFrames is reduced int framesToRemove = (int)previousFrames.size() - static_cast(maxFrames); diff --git a/src/Client/Module/Modules/PaperDoll/DollListener.hpp b/src/Client/Module/Modules/PaperDoll/DollListener.hpp index 476d9c64..a9f851ce 100644 --- a/src/Client/Module/Modules/PaperDoll/DollListener.hpp +++ b/src/Client/Module/Modules/PaperDoll/DollListener.hpp @@ -77,7 +77,7 @@ class DollListener : public Listener { void onSetupAndRender(SetupAndRenderEvent &event) override { if(this->module->isEnabled()) - if(SDK::currentScreen == "hud_screen") { + if(SDK::getCurrentScreen() == "hud_screen") { SDK::screenView->VisualTree->root->forEachControl([this](std::shared_ptr& control) { if (control->LayerName == "hud_player") { diff --git a/src/Client/Module/Modules/Sprint/SprintListener.hpp b/src/Client/Module/Modules/Sprint/SprintListener.hpp index cbe586b4..fecd3618 100644 --- a/src/Client/Module/Modules/Sprint/SprintListener.hpp +++ b/src/Client/Module/Modules/Sprint/SprintListener.hpp @@ -22,7 +22,7 @@ class SprintListener : public Listener { }; void onRender(RenderEvent &event) override { - if(!module->isEnabled() || SDK::currentScreen != "hud_screen") return; + if(!module->isEnabled() || SDK::getCurrentScreen() != "hud_screen") return; if (SDK::hasInstanced && SDK::clientInstance != nullptr) { diff --git a/src/Client/Module/Modules/Zoom/ZoomListener.hpp b/src/Client/Module/Modules/Zoom/ZoomListener.hpp index b356d3ba..0ace627d 100644 --- a/src/Client/Module/Modules/Zoom/ZoomListener.hpp +++ b/src/Client/Module/Modules/Zoom/ZoomListener.hpp @@ -70,7 +70,7 @@ class ZoomListener : public Listener { //TODO: RE CHECK void onMouse(MouseEvent &event) override { - if (SDK::currentScreen == "hud_screen" || SDK::currentScreen == "f1_screen" || SDK::currentScreen == "zoom_screen") + if (SDK::getCurrentScreen() == "hud_screen" || SDK::getCurrentScreen() == "f1_screen" || SDK::getCurrentScreen() == "zoom_screen") if (module->active) { //todo make it so that modules work together auto fovchanger = ModuleManager::getModule("FOV Changer"); diff --git a/src/SDK/Client/Core/ClientInstance.cpp b/src/SDK/Client/Core/ClientInstance.cpp index 44c40abd..e4fccaee 100644 --- a/src/SDK/Client/Core/ClientInstance.cpp +++ b/src/SDK/Client/Core/ClientInstance.cpp @@ -39,6 +39,7 @@ void ClientInstance::releaseMouse() { } std::string ClientInstance::getTopScreenName() { + std::lock_guard guard(SDK::currentScreenMtx); return SDK::currentScreen; } diff --git a/src/SDK/SDK.cpp b/src/SDK/SDK.cpp index fc3b153c..d6661ac5 100644 --- a/src/SDK/SDK.cpp +++ b/src/SDK/SDK.cpp @@ -5,9 +5,13 @@ ClientInstance *SDK::clientInstance = nullptr; ScreenView *SDK::screenView = nullptr; + +std::mutex SDK::currentScreenMtx; std::string SDK::currentScreen; + bool SDK::hasInstanced = false; -__int64 SDK::serverPing = 0; +uint64_t SDK::serverPing = 0; + std::chrono::steady_clock::time_point SDK::lastSetCurrentScreenTime; @@ -23,17 +27,15 @@ std::shared_ptr SDK::createPacket(int id) { return pFunction(id); } +// TODO: use CI::GetScreenName void SDK::setCurrentScreen(const std::string& layer) { + std::lock_guard guard(currentScreenMtx); SDK::currentScreen = layer; - return; - // TODO: use CI::GetScreenName -// auto currentTime = std::chrono::steady_clock::now(); -// auto elapsedTime = std::chrono::duration_cast(currentTime - lastSetCurrentScreenTime).count(); -// -// if (layer != SDK::currentScreen && elapsedTime >= (layer == SDK::currentScreen ? 16 : 500)) { -// lastSetCurrentScreenTime = std::chrono::steady_clock::now(); -// SDK::currentScreen = layer; -// } +} + +std::string SDK::getCurrentScreen() { + std::lock_guard guard(currentScreenMtx); + return SDK::currentScreen; } int SDK::getServerPing() { diff --git a/src/SDK/SDK.hpp b/src/SDK/SDK.hpp index 0208793f..8ba07e8d 100644 --- a/src/SDK/SDK.hpp +++ b/src/SDK/SDK.hpp @@ -8,14 +8,17 @@ namespace SDK { extern ClientInstance *clientInstance; extern ScreenView *screenView; extern bool hasInstanced; + extern std::mutex currentScreenMtx; extern std::string currentScreen; extern std::chrono::steady_clock::time_point lastSetCurrentScreenTime; - extern __int64 serverPing; + extern uint64_t serverPing; extern int getServerPing(); extern void setCurrentScreen(const std::string& layer); + extern std::string getCurrentScreen(); + extern std::string getServerIP(); extern std::shared_ptr createPacket(int id); From 39367b41dcbc7aae953daea82839d731afe7f9a3 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 7 Aug 2024 19:53:05 +0300 Subject: [PATCH 072/240] Bring back old debug console code --- main.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/main.cpp b/main.cpp index 6feed7d0..b03e0c8a 100644 --- a/main.cpp +++ b/main.cpp @@ -23,12 +23,16 @@ std::string removeColorCodes(const std::string& input); DWORD WINAPI init(HMODULE real) { - if (true) { + #ifndef NDEBUG + bool shouldDebug = true; // Change this bool locally, NEVER push it set to true + + if (GetConsoleWindow() == nullptr && shouldDebug) { AllocConsole(); - SetConsoleTitleA("Caspian-Debug"); + SetConsoleTitleA("Flarial-Debugger"); FILE *out; freopen_s(&out, ("CONOUT$"), ("w"), stdout); } + #endif Client::initialize(); From 64fca6c194c78246bd70d98bc19d3861a91c1fb2 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 7 Aug 2024 19:56:19 +0300 Subject: [PATCH 073/240] Remove some stuff + formating --- main.cpp | 25 +++++++++++++------------ src/Client/Events/EventHandler.cpp | 1 - src/SDK/Client/Actor/EntityContext.hpp | 8 -------- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/main.cpp b/main.cpp index b03e0c8a..64392213 100644 --- a/main.cpp +++ b/main.cpp @@ -46,11 +46,12 @@ DWORD WINAPI init(HMODULE real) if(!Client::disable) { if(SDK::hasInstanced && SDK::clientInstance != nullptr) { + // may crash here cuz accessed on other thread if (SDK::clientInstance->getLocalPlayer() != nullptr) { if(elapsed >= std::chrono::seconds(27)) { ModuleManager::onlineUsers.clear(); - std::string name = SDK::clientInstance->getLocalPlayer()->playerName; + std::string name = SDK::clientInstance->getLocalPlayer()->getPlayerName(); ModuleManager::onlineUsers.clear(); @@ -97,12 +98,12 @@ DWORD WINAPI init(HMODULE real) auto module = ModuleManager::getModule("Nick"); if(SDK::clientInstance != nullptr) - if(SDK::clientInstance->getLocalPlayer() != nullptr) - if (module->isEnabled()) { - name = Utils::removeNonAlphanumeric(Utils::removeColorCodes(NickListener::original)); - name = replaceAll(name, "�", ""); + if(SDK::clientInstance->getLocalPlayer() != nullptr) + if (module->isEnabled()) { + name = Utils::removeNonAlphanumeric(Utils::removeColorCodes(NickListener::original)); + name = replaceAll(name, "�", ""); - } + } std::cout << std::format("https://api.flarial.synthetix.host/heartbeat/{}/{}",Utils::removeColorCodes(name),ipToSend) << std::endl; std::cout << DownloadString(std::format("https://api.flarial.synthetix.host/heartbeat/{}/{}",Utils::removeColorCodes(name),ipToSend)) << std::endl; @@ -156,12 +157,12 @@ BOOL APIENTRY DllMain(HMODULE instance, DWORD ul_reason_for_call, LPVOID lpReser { switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: - Client::currentModule = instance; - CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)init, instance, 0, nullptr); - break; - case DLL_PROCESS_DETACH: - ModuleManager::terminate(); + case DLL_PROCESS_ATTACH: + Client::currentModule = instance; + CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)init, instance, 0, nullptr); + break; + case DLL_PROCESS_DETACH: + ModuleManager::terminate(); } return TRUE; diff --git a/src/Client/Events/EventHandler.cpp b/src/Client/Events/EventHandler.cpp index 4332aa09..14dd1018 100644 --- a/src/Client/Events/EventHandler.cpp +++ b/src/Client/Events/EventHandler.cpp @@ -102,7 +102,6 @@ void EventHandler::onKey(KeyEvent &event) { for (Listener *&listener: listeners) { listener->onKey(event); - } } diff --git a/src/SDK/Client/Actor/EntityContext.hpp b/src/SDK/Client/Actor/EntityContext.hpp index 49cacee9..9e0676bd 100644 --- a/src/SDK/Client/Actor/EntityContext.hpp +++ b/src/SDK/Client/Actor/EntityContext.hpp @@ -15,12 +15,4 @@ namespace V1_20_50 { uintptr_t &basicReg; EntityId id; }; -} - -namespace V1_20_40 { - class EntityContext { - public: - uintptr_t &basicReg; - EntityId id; - }; } \ No newline at end of file From be8fac8bb87c9e8a6d09b85c98adead0f8d74d58 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 7 Aug 2024 20:12:07 +0300 Subject: [PATCH 074/240] Some renaming + SDK shrinkage --- src/Client/Hook/Hooks/Game/GameModeAttack.cpp | 2 +- .../Hook/Hooks/Render/SetupAndRenderHook.hpp | 2 +- .../Modules/ArmorHUD/ArmorHUDListener.hpp | 42 ++++++------------- .../Modules/ArrowCounter/ArrowListener.hpp | 4 +- .../Module/Modules/AutoGG/AutoGGListener.hpp | 4 +- .../BlockBreakIndicatorListener.hpp | 4 +- .../Modules/ComboCounter/ComboListener.hpp | 2 +- .../Modules/GuiScale/GuiScaleListener.hpp | 9 ++-- .../Modules/HitPing/HitPingListener.hpp | 2 +- .../Module/Modules/Hitbox/HitboxListener.cpp | 14 +++---- .../InventoryHUD/InventoryHUDListener.hpp | 10 ++--- .../Module/Modules/Nick/NickListener.hpp | 4 +- src/Client/Module/Modules/Nick/NickModule.hpp | 2 +- .../Module/Modules/PotCounter/PotListener.hpp | 4 +- .../Modules/ReachCounter/ReachListener.hpp | 2 +- src/Client/Module/Modules/TabList/TabList.hpp | 8 ++-- .../Modules/TextHotkey/TextHotkeyListener.hpp | 2 +- .../WeatherChanger/WeatherListener.hpp | 8 ++-- src/SDK/Client/Actor/Actor.cpp | 31 ++++++++------ src/SDK/Client/Actor/Actor.hpp | 17 ++++---- src/SDK/Client/Actor/Gamemode.hpp | 8 +++- src/SDK/Client/Actor/Player.hpp | 14 +++++-- src/SDK/Client/Block/BlockSource.cpp | 4 ++ src/SDK/Client/Block/BlockSource.hpp | 3 +- src/SDK/Client/Core/ClientInstance.hpp | 15 +++++-- src/SDK/Client/Level/Level.hpp | 6 +-- src/SDK/Client/Render/Matrix.cpp | 2 +- src/Utils/Memory/Game/Offset/OffsetInit.cpp | 22 ++-------- src/Utils/Render/DrawUtils.cpp | 8 ++-- 29 files changed, 123 insertions(+), 132 deletions(-) diff --git a/src/Client/Hook/Hooks/Game/GameModeAttack.cpp b/src/Client/Hook/Hooks/Game/GameModeAttack.cpp index 5700f0d4..ed2cc78e 100644 --- a/src/Client/Hook/Hooks/Game/GameModeAttack.cpp +++ b/src/Client/Hook/Hooks/Game/GameModeAttack.cpp @@ -5,7 +5,7 @@ void GameModeAttackHook::callback(Gamemode *gamemode, Actor *actor) { // Combo counter and reach counter logic will be done here in the next commit. if (SDK::clientInstance->getLocalPlayer() != nullptr) { - if (SDK::clientInstance->getLocalPlayer() == gamemode->player) { + if (SDK::clientInstance->getLocalPlayer() == gamemode->getPlayer()) { AttackEvent event(actor); EventHandler::onAttack(event); diff --git a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp index c152d609..f6d57f48 100644 --- a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp +++ b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp @@ -92,7 +92,7 @@ class SetUpAndRenderHook : public Hook pos = player->getRenderPositionComponent()->renderPos; } - FrameTransform transform = { SDK::clientInstance->getviewMatrix(), origin, SDK::clientInstance->getFov(), pos}; + FrameTransform transform = { SDK::clientInstance->getViewMatrix(), origin, SDK::clientInstance->getFov(), pos}; SwapchainHook::frameTransformsMtx.lock(); SwapchainHook::FrameTransforms.push(transform); diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp index 4ac7d594..3316a5fa 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp @@ -30,24 +30,6 @@ class ArmorHUDListener : public Listener { Vec2 testOffset = Vec2{4,0}; float testSpacing = 15; - [[nodiscard]] Vec2 convert() const { - - auto e = SDK::clientInstance->guiData; - Vec2 xd = Vec2(e->ScreenSize.x, e->ScreenSize.y); - Vec2 LOL = Vec2(e->ScreenSizeScaled.x, e->ScreenSizeScaled.y); - - return Vec2{currentPos.x * (LOL.x / xd.x), currentPos.y * (LOL.y / xd.y)}; - } - - [[nodiscard]] Vec2 convert(Vec2 pos) { - - auto e = SDK::clientInstance->guiData; - Vec2 LOL = Vec2(e->ScreenSize.x, e->ScreenSize.y); - Vec2 xd = Vec2(e->ScreenSizeScaled.x, e->ScreenSizeScaled.y); - float scale = module->settings.getSettingByName("uiscale")->value; - return Vec2{pos.x * (LOL.x / xd.x) * scale, pos.y * (LOL.y / xd.y) * scale}; - } - // TODO: Make it look better void renderDurability() { if(FlarialGUI::inMenu) return; @@ -67,18 +49,18 @@ class ArmorHUDListener : public Listener { if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) - if (SDK::clientInstance->getLocalPlayer()->playerInventory != nullptr) { + if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { auto vertical = module->settings.getSettingByName("vertical")->value; float spacing = testSpacing; spacing = convert(Vec2{spacing, spacing}).x; - if (SDK::clientInstance->getLocalPlayer()->playerInventory->inventory->getItem( - SDK::clientInstance->getLocalPlayer()->playerInventory->SelectedSlot)->getItem() != + if (SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->SelectedSlot)->getItem() != nullptr) { - auto currentItem = SDK::clientInstance->getLocalPlayer()->playerInventory->inventory->getItem( - SDK::clientInstance->getLocalPlayer()->playerInventory->SelectedSlot); + auto currentItem = SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->SelectedSlot); std::string text; @@ -235,18 +217,18 @@ class ArmorHUDListener : public Listener { if(this->module->isEnabled()) if (ClientInstance::getTopScreenName() == "hud_screen") { auto muirc = event.getMuirc(); - BaseActorRenderContext barc(muirc->screenContext, muirc->clientInstance, - muirc->clientInstance->mcgame); + BaseActorRenderContext barc(muirc->getScreenContext(), muirc->getClientInstance(), + muirc->getClientInstance()->getMinecraftGame()); Vec2 convert = this->convert(); if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) - if (SDK::clientInstance->getLocalPlayer()->playerInventory != nullptr) { - if (SDK::clientInstance->getLocalPlayer()->playerInventory->inventory->getItem( - SDK::clientInstance->getLocalPlayer()->playerInventory->SelectedSlot)->getItem() != + if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { + if (SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->SelectedSlot)->getItem() != nullptr) { - auto item = SDK::clientInstance->getLocalPlayer()->playerInventory->inventory->getItem( - SDK::clientInstance->getLocalPlayer()->playerInventory->SelectedSlot); + auto item = SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->SelectedSlot); auto maxDamage = item->getMaxDamage(); auto durabilityLeft = maxDamage - item->getDamageValue(); diff --git a/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp b/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp index 0b197ae1..8ebe862c 100644 --- a/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp +++ b/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp @@ -21,10 +21,10 @@ class ArrowListener : public Listener { void onTick(TickEvent &event) override { if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { - if (SDK::clientInstance->getLocalPlayer()->playerInventory != nullptr) { + if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { auto arrowsCount = 0; - auto inventory = SDK::clientInstance->getLocalPlayer()->playerInventory->inventory; + auto inventory = SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory; if(inventory == nullptr) return; auto offhandItem = SDK::clientInstance->getLocalPlayer()->getOffhandSlot(); diff --git a/src/Client/Module/Modules/AutoGG/AutoGGListener.hpp b/src/Client/Module/Modules/AutoGG/AutoGGListener.hpp index 43e5e7cd..9e27cb8f 100644 --- a/src/Client/Module/Modules/AutoGG/AutoGGListener.hpp +++ b/src/Client/Module/Modules/AutoGG/AutoGGListener.hpp @@ -40,7 +40,7 @@ class AutoGGListener : public Listener { text->platformId = ""; text->translationNeeded = false; text->xuid = ""; - text->name = player->playerName; + text->name = player->getPlayerName(); SDK::clientInstance->getPacketSender()->sendToServer(text); } @@ -67,7 +67,7 @@ class AutoGGListener : public Listener { text->platformId = ""; text->translationNeeded = false; text->xuid = ""; - text->name = player->playerName; + text->name = player->getPlayerName(); SDK::clientInstance->getPacketSender()->sendToServer(text); } diff --git a/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp b/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp index 4c0db566..02ac0acc 100644 --- a/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp +++ b/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp @@ -20,9 +20,9 @@ class BlockBreakIndicatorListener : public Listener { if ( SDK::hasInstanced && SDK::clientInstance != nullptr && SDK::clientInstance->getLocalPlayer() != nullptr && - SDK::clientInstance->getLocalPlayer()->getgamemode() != nullptr + SDK::clientInstance->getLocalPlayer()->getGamemode() != nullptr ) { - auto progress_value = (*SDK::clientInstance->getLocalPlayer()->getgamemode()).lastBreakProgress *100; + auto progress_value = (*SDK::clientInstance->getLocalPlayer()->getGamemode()).getLastBreakProgress() *100; std::string progress = std::format("{:.0f}%", progress_value); this->module->normalRender(16, progress); } diff --git a/src/Client/Module/Modules/ComboCounter/ComboListener.hpp b/src/Client/Module/Modules/ComboCounter/ComboListener.hpp index e0300666..5f80e72b 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboListener.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboListener.hpp @@ -28,7 +28,7 @@ class ComboListener : public Listener { return; auto LP = reinterpret_cast(event.getActor()); - if (LP->hurtTime != 0) + if (LP->getHurtTime() != 0) Combo = 0; std::chrono::duration duration = std::chrono::high_resolution_clock::now() - last_hit; if (duration.count() >= 15) Combo = 0; diff --git a/src/Client/Module/Modules/GuiScale/GuiScaleListener.hpp b/src/Client/Module/Modules/GuiScale/GuiScaleListener.hpp index 03b57ed6..37c528f2 100644 --- a/src/Client/Module/Modules/GuiScale/GuiScaleListener.hpp +++ b/src/Client/Module/Modules/GuiScale/GuiScaleListener.hpp @@ -9,14 +9,13 @@ class GuiScaleListener : public Listener { public: void onRender(RenderEvent& event) override { - if(SDK::currentScreen == "hud_screen") - if(SDK::clientInstance->guiData != nullptr) if(SDK::getCurrentScreen() == "hud_screen") + if(SDK::clientInstance->getGuiData() != nullptr) if (module->settings.getSettingByName("enabled")->value){ float percent = module->settings.getSettingByName("guiscale")->value; - SDK::clientInstance->guiData->GuiScale = percent; - SDK::clientInstance->guiData->ScreenSizeScaled = Vec2{ SDK::clientInstance->guiData->ScreenSize.x * 1 / percent, SDK::clientInstance->guiData->ScreenSize.y * 1 / percent }; - SDK::clientInstance->guiData->scalingMultiplier = 1 / percent; + SDK::clientInstance->getGuiData()->GuiScale = percent; + SDK::clientInstance->getGuiData()->ScreenSizeScaled = Vec2{ SDK::clientInstance->getGuiData()->ScreenSize.x * 1 / percent, SDK::clientInstance->getGuiData()->ScreenSize.y * 1 / percent }; + SDK::clientInstance->getGuiData()->scalingMultiplier = 1 / percent; } } diff --git a/src/Client/Module/Modules/HitPing/HitPingListener.hpp b/src/Client/Module/Modules/HitPing/HitPingListener.hpp index 81fad93e..297321f3 100644 --- a/src/Client/Module/Modules/HitPing/HitPingListener.hpp +++ b/src/Client/Module/Modules/HitPing/HitPingListener.hpp @@ -89,7 +89,7 @@ class HitPingListener : public Listener { if(time.count() >= 0.0001) { hitDelay = time; - auto actors = SDK::clientInstance->getLocalPlayer()->level->getRuntimeActorList(); + auto actors = SDK::clientInstance->getLocalPlayer()->getLevel()->getRuntimeActorList(); auto actor = std::find_if(actors.begin(), actors.end(), [&](auto &a) { return a->getRuntimeIDComponent()->runtimeID == id; }); diff --git a/src/Client/Module/Modules/Hitbox/HitboxListener.cpp b/src/Client/Module/Modules/Hitbox/HitboxListener.cpp index 50a7ed98..ae1fb4c4 100644 --- a/src/Client/Module/Modules/Hitbox/HitboxListener.cpp +++ b/src/Client/Module/Modules/Hitbox/HitboxListener.cpp @@ -3,16 +3,16 @@ void HitboxListener::onSetupAndRender(SetupAndRenderEvent &event) { aabbsToRender.clear(); - if (!SDK::clientInstance || !SDK::clientInstance->getLocalPlayer() || !SDK::clientInstance->mcgame->mouseGrabbed || - !SDK::clientInstance->getLocalPlayer()->level) + if (!SDK::clientInstance || !SDK::clientInstance->getLocalPlayer() || !SDK::clientInstance->getMinecraftGame()->mouseGrabbed || + !SDK::clientInstance->getLocalPlayer()->getLevel()) return; auto player = SDK::clientInstance->getLocalPlayer(); - for (const auto &ent: player->level->getRuntimeActorList()) { + for (const auto &ent: player->getLevel()->getRuntimeActorList()) { if (ent != nullptr && ent != player /*&& ent->isPlayer() && ent->hasCategory(ActorCategory::Player)*/) { float dist = player->getPosition()->dist(*ent->getPosition()); // This may let through some entites - if (!ent->isAlive() || !player->isValidTarget(ent) || dist > 30 || !player->canSee(*ent) || - ent->getActorFlag(ActorFlags::FLAG_INVISIBLE)) // + ent == player || + if (!ent->isValidAABB() || dist > 30 || !player->canSee(*ent) || + ent->getActorFlag(ActorFlags::FLAG_INVISIBLE)) continue; float mod = 0.f; @@ -31,8 +31,8 @@ void HitboxListener::onSetupAndRender(SetupAndRenderEvent &event) { void HitboxListener::onRender(RenderEvent &event) { - if (!SDK::clientInstance || !SDK::clientInstance->getLocalPlayer() || !SDK::clientInstance->mcgame->mouseGrabbed || - !SDK::clientInstance->getLocalPlayer()->level) + if (!SDK::clientInstance || !SDK::clientInstance->getLocalPlayer() || !SDK::clientInstance->getMinecraftGame()->mouseGrabbed || + !SDK::clientInstance->getLocalPlayer()->getLevel()) return; auto player = SDK::clientInstance->getLocalPlayer(); diff --git a/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp b/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp index b2016f20..94c10d48 100644 --- a/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp +++ b/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp @@ -90,13 +90,13 @@ class InventoryHUDListener : public Listener { if(this->module->isEnabled()) if (ClientInstance::getTopScreenName() == "hud_screen") { auto muirc = event.getMuirc(); - BaseActorRenderContext barc(muirc->screenContext, muirc->clientInstance, - muirc->clientInstance->mcgame); + BaseActorRenderContext barc(muirc->getScreenContext(), muirc->getClientInstance(), + muirc->getClientInstance()->getMinecraftGame()); Vec2 convert = this->convert(); if (SDK::clientInstance->getLocalPlayer() != nullptr) - if (SDK::clientInstance->getLocalPlayer()->playerInventory != nullptr) { + if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { float spacing = 15 * module->settings.getSettingByName("uiscale")->value; @@ -107,11 +107,11 @@ class InventoryHUDListener : public Listener { int counter = 0; for (int i = 9; i < 36; i++) { - if (SDK::clientInstance->getLocalPlayer()->playerInventory->getinventory()->getItem(i)->getItem() != nullptr) { + if (SDK::clientInstance->getLocalPlayer()->getSupplies()->getinventory()->getItem(i)->getItem() != nullptr) { //durabilities[i][1] = SDK::clientInstance->getLocalPlayer()->getArmor(i)->getMaxDamage(); //durabilities[i][0] = durabilities[i][1] - SDK::clientInstance->getLocalPlayer()->getArmor(i)->getDamageValue(); barc.itemRenderer->renderGuiItemNew(&barc, - SDK::clientInstance->getLocalPlayer()->playerInventory->getinventory()->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->getinventory()->getItem( i), 0, convert.x + xmodifier, convert.y + ymodifier, 1.0f, module->settings.getSettingByName( diff --git a/src/Client/Module/Modules/Nick/NickListener.hpp b/src/Client/Module/Modules/Nick/NickListener.hpp index 295caeae..d3a2e861 100644 --- a/src/Client/Module/Modules/Nick/NickListener.hpp +++ b/src/Client/Module/Modules/Nick/NickListener.hpp @@ -66,7 +66,7 @@ class NickListener : public Listener { std::string val = "§o"+Utils::removeColorCodes(module->settings.getSettingByName("nick")->value); SDK::clientInstance->getLocalPlayer()->setNametag(&val); - SDK::clientInstance->getLocalPlayer()->playerName = val; + SDK::clientInstance->getLocalPlayer()->getPlayerName() = val; } else { @@ -83,7 +83,7 @@ class NickListener : public Listener { //std::cout << original2 << std::endl; SDK::clientInstance->getLocalPlayer()->setNametag(&val2); - SDK::clientInstance->getLocalPlayer()->playerName = val; + SDK::clientInstance->getLocalPlayer()->getPlayerName() = val; } diff --git a/src/Client/Module/Modules/Nick/NickModule.hpp b/src/Client/Module/Modules/Nick/NickModule.hpp index 23370ecb..9fe69d70 100644 --- a/src/Client/Module/Modules/Nick/NickModule.hpp +++ b/src/Client/Module/Modules/Nick/NickModule.hpp @@ -41,7 +41,7 @@ class NickModule : public Module { val2 = NickListener::original2; SDK::clientInstance->getLocalPlayer()->setNametag(&val2); - SDK::clientInstance->getLocalPlayer()->playerName = val; + SDK::clientInstance->getLocalPlayer()->getPlayerName() = val; } EventHandler::unregisterListener("NickListener"); Module::onDisable(); diff --git a/src/Client/Module/Modules/PotCounter/PotListener.hpp b/src/Client/Module/Modules/PotCounter/PotListener.hpp index 3698fda1..cd419b17 100644 --- a/src/Client/Module/Modules/PotCounter/PotListener.hpp +++ b/src/Client/Module/Modules/PotCounter/PotListener.hpp @@ -23,8 +23,8 @@ class PotListener : public Listener { if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { auto potsCount = 0; - if (SDK::clientInstance->getLocalPlayer()->playerInventory != nullptr) { - auto inventory = SDK::clientInstance->getLocalPlayer()->playerInventory->inventory; + if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { + auto inventory = SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory; if (inventory != nullptr) { for (int i = 0; i < 36; i++) { diff --git a/src/Client/Module/Modules/ReachCounter/ReachListener.hpp b/src/Client/Module/Modules/ReachCounter/ReachListener.hpp index adc5a9df..9d918a8a 100644 --- a/src/Client/Module/Modules/ReachCounter/ReachListener.hpp +++ b/src/Client/Module/Modules/ReachCounter/ReachListener.hpp @@ -19,7 +19,7 @@ class ReachListener : public Listener { Module *module; // TODO: Better reach calculation void onAttack(AttackEvent &event) override { - Reach = event.getActor()->getlevel()->getHitResult().distance(); + Reach = event.getActor()->getLevel()->getHitResult().distance(); last_hit = std::chrono::high_resolution_clock::now(); } diff --git a/src/Client/Module/Modules/TabList/TabList.hpp b/src/Client/Module/Modules/TabList/TabList.hpp index fd90d7d7..9225d714 100644 --- a/src/Client/Module/Modules/TabList/TabList.hpp +++ b/src/Client/Module/Modules/TabList/TabList.hpp @@ -225,7 +225,7 @@ class TabList : public Module { int i3 = 0; float i2 = 0; - for (const auto &pair: SDK::clientInstance->getLocalPlayer()->getlevel()->getPlayerMap()) { + for (const auto &pair: SDK::clientInstance->getLocalPlayer()->getLevel()->getPlayerMap()) { i3++; @@ -249,7 +249,7 @@ class TabList : public Module { float fakex = realcenter.x; float fixer = 0; - for (const auto &pair: SDK::clientInstance->getLocalPlayer()->getlevel()->getPlayerMap()) { + for (const auto &pair: SDK::clientInstance->getLocalPlayer()->getLevel()->getPlayerMap()) { i3++; if (i3 % 10 == 1) { @@ -329,7 +329,7 @@ class TabList : public Module { if (yes) { auto vecmap = copyMapInAlphabeticalOrder( - SDK::clientInstance->getLocalPlayer()->getlevel()->getPlayerMap()); + SDK::clientInstance->getLocalPlayer()->getLevel()->getPlayerMap()); for (const auto &pair: vecmap) { i++; @@ -438,7 +438,7 @@ class TabList : public Module { } } else { - for (const auto &pair: SDK::clientInstance->getLocalPlayer()->getlevel()->getPlayerMap()) { + for (const auto &pair: SDK::clientInstance->getLocalPlayer()->getLevel()->getPlayerMap()) { i++; diff --git a/src/Client/Module/Modules/TextHotkey/TextHotkeyListener.hpp b/src/Client/Module/Modules/TextHotkey/TextHotkeyListener.hpp index 4745240f..e6afc7ce 100644 --- a/src/Client/Module/Modules/TextHotkey/TextHotkeyListener.hpp +++ b/src/Client/Module/Modules/TextHotkey/TextHotkeyListener.hpp @@ -35,7 +35,7 @@ class TextHotkeyListener : public Listener { akbar->platformId = ""; akbar->translationNeeded = false; //akbar->xuid = xuid; - akbar->name = player->playerName; + akbar->name = player->getPlayerName(); SDK::clientInstance->getPacketSender()->sendToServer(akbar); diff --git a/src/Client/Module/Modules/WeatherChanger/WeatherListener.hpp b/src/Client/Module/Modules/WeatherChanger/WeatherListener.hpp index eef33b95..e84bd10b 100644 --- a/src/Client/Module/Modules/WeatherChanger/WeatherListener.hpp +++ b/src/Client/Module/Modules/WeatherChanger/WeatherListener.hpp @@ -18,13 +18,13 @@ class WeatherListener : public Listener { if (module->isEnabled()) { if (module->settings.getSettingByName("rain")->value > 0.02f) - SDK::clientInstance->getBlockSource()->dimension->weather->rainLevel = module->settings.getSettingByName( + SDK::clientInstance->getBlockSource()->getDimension()->weather->rainLevel = module->settings.getSettingByName( "rain")->value; - else SDK::clientInstance->getBlockSource()->dimension->weather->rainLevel = 0.0f; + else SDK::clientInstance->getBlockSource()->getDimension()->weather->rainLevel = 0.0f; if (module->settings.getSettingByName("lighting")->value < 0.02f) - SDK::clientInstance->getBlockSource()->dimension->weather->lightingLevel = module->settings.getSettingByName( + SDK::clientInstance->getBlockSource()->getDimension()->weather->lightingLevel = module->settings.getSettingByName( "lighting")->value; - else SDK::clientInstance->getBlockSource()->dimension->weather->lightingLevel = 0.0f; + else SDK::clientInstance->getBlockSource()->getDimension()->weather->lightingLevel = 0.0f; if (!WinrtUtils::check(21, 0)) { // TODO: When you set snow, it will stay even if on until game reload diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index 742ac29e..4573a947 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -6,7 +6,7 @@ // TODO add comments to all components, replace their sigs with simpler ones ? marioCST: use entt's try_get func in EntityContext instead of using sigs, there are no simpler sigs template -Component *Actor::tryGet(uintptr_t addr) { // TODO: Multiversion +Component *Actor::tryGet(uintptr_t addr) { uintptr_t* basicReg; EntityId id; @@ -28,9 +28,16 @@ Component *Actor::tryGet(uintptr_t addr) { // TODO: Multiversion } } -bool Actor::isAlive() { - static int off = GET_OFFSET("Actor::isAlive"); - return Memory::CallVFuncI(off, this); +int16_t Actor::getHurtTime() { + return hat::member_at(this, GET_OFFSET("Actor::hurtTime")); +} + +Level *Actor::getLevel() { + return hat::member_at(this, GET_OFFSET("Actor::level")); +} + +ActorCategory Actor::getCategories() { + return hat::member_at(this, GET_OFFSET("Actor::categories")); } bool Actor::canSee(const Actor& actor) { @@ -168,7 +175,7 @@ RuntimeIDComponent *Actor::getRuntimeIDComponent() { static uintptr_t sig; if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getRuntimeIDComponent")); + sig = Memory::findSig(GET_SIG("Actor::getRuntimeIDComponent")); // 8B DA BA 14 14 A1 3C auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); sig = sig - size; } @@ -203,7 +210,7 @@ std::string *Actor::getNametag() { } bool Actor::hasCategory(ActorCategory category) { - return ((int) this->categories & (int) category) != 0; + return ((int) this->getCategories() & (int) category) != 0; } RenderPositionComponent *Actor::getRenderPositionComponent() { //??$try_get@URenderPositionComponent @@ -218,10 +225,10 @@ RenderPositionComponent *Actor::getRenderPositionComponent() { //??$try_get@URen return tryGet(sig); } -bool Actor::isValidTarget(Actor *actor) { - if(!WinrtUtils::check(20, 40)) { - return true; - } - static int off = GET_OFFSET("Actor::isValidTarget"); - return Memory::CallVFuncI(off, this, actor); +bool Actor::isValidAABB() { + auto AABBShapeComponent = this->getAABBShapeComponent(); + if(!AABBShapeComponent) return false; + auto size = AABBShapeComponent->size; + if(size.x < 0.1f || size.y < 0.1f) return false; + return true; } diff --git a/src/SDK/Client/Actor/Actor.hpp b/src/SDK/Client/Actor/Actor.hpp index 3c003d6b..f4f383ab 100644 --- a/src/SDK/Client/Actor/Actor.hpp +++ b/src/SDK/Client/Actor/Actor.hpp @@ -170,14 +170,13 @@ enum class ActorCategory { class Level; - class Actor { public: -// BUILD_ACCESS(this, int32_t , bobOffset, 0x98); -// BUILD_ACCESS(this, int32_t , Age, 0x98); - BUILD_ACCESS(this, int16_t, hurtTime, GET_OFFSET("Actor::hurtTime")); - BUILD_ACCESS(this, Level*, level, GET_OFFSET("Actor::level")); - BUILD_ACCESS(this, ActorCategory, categories, GET_OFFSET("Actor::categories")); + int16_t getHurtTime(); + + Level* getLevel(); + + ActorCategory getCategories(); template Component *tryGet(uintptr_t addr); @@ -186,8 +185,6 @@ class Actor { MoveInputComponent *getMoveInputHandler(); - bool isAlive(); - bool getActorFlag(int flag); bool canSee(const Actor& actor); @@ -206,8 +203,6 @@ class Actor { RenderPositionComponent *getRenderPositionComponent(); - bool isValidTarget(Actor *actor); - SimpleContainer *getArmorContainer(); SimpleContainer *getOffhandContainer(); @@ -219,4 +214,6 @@ class Actor { StateVectorComponent *getStateVectorComponent(); RuntimeIDComponent *getRuntimeIDComponent(); + + bool isValidAABB(); }; diff --git a/src/SDK/Client/Actor/Gamemode.hpp b/src/SDK/Client/Actor/Gamemode.hpp index db3e362e..bbb01b46 100644 --- a/src/SDK/Client/Actor/Gamemode.hpp +++ b/src/SDK/Client/Actor/Gamemode.hpp @@ -5,6 +5,10 @@ class Gamemode { public: - BUILD_ACCESS(this, Player*, player, GET_OFFSET("Gamemode::player")); - BUILD_ACCESS(this, float, lastBreakProgress, GET_OFFSET("Gamemode::lastBreakProgress")); + Player* getPlayer() { + return hat::member_at(this, GET_OFFSET("Gamemode::player")); + }; + float getLastBreakProgress() { + return hat::member_at(this, GET_OFFSET("Gamemode::lastBreakProgress")); + }; }; \ No newline at end of file diff --git a/src/SDK/Client/Actor/Player.hpp b/src/SDK/Client/Actor/Player.hpp index 1cb2fdc2..67d6418b 100644 --- a/src/SDK/Client/Actor/Player.hpp +++ b/src/SDK/Client/Actor/Player.hpp @@ -7,7 +7,15 @@ FK(Gamemode) class Player : public Actor { public: - BUILD_ACCESS(this, PlayerInventory*, playerInventory, GET_OFFSET("Player::playerInventory")) // Player::getSupplies return x 8 - BUILD_ACCESS(this, std::string, playerName, GET_OFFSET("Player::playerName")); - BUILD_ACCESS(this, Gamemode*, gamemode, GET_OFFSET("Player::gamemode")); + PlayerInventory* getSupplies() { + return hat::member_at(this, GET_OFFSET("Player::playerInventory")); + } + + std::string getPlayerName() { + return hat::member_at(this, GET_OFFSET("Player::playerName")); + } + + Gamemode* getGamemode() { + return hat::member_at(this, GET_OFFSET("Player::gamemode")); + } }; \ No newline at end of file diff --git a/src/SDK/Client/Block/BlockSource.cpp b/src/SDK/Client/Block/BlockSource.cpp index 6584d9bf..fe254a38 100644 --- a/src/SDK/Client/Block/BlockSource.cpp +++ b/src/SDK/Client/Block/BlockSource.cpp @@ -1,5 +1,9 @@ #include "BlockSource.hpp" +mcDimension *BlockSource::getDimension() { + return hat::member_at(this, GET_OFFSET("BlockSource::dimension")); +} + Biome *BlockSource::getBiome(const Vec3 &bp) { static uintptr_t sig; diff --git a/src/SDK/Client/Block/BlockSource.hpp b/src/SDK/Client/Block/BlockSource.hpp index 7c00089e..3ee523b0 100644 --- a/src/SDK/Client/Block/BlockSource.hpp +++ b/src/SDK/Client/Block/BlockSource.hpp @@ -8,8 +8,7 @@ class BlockSource { public: - - BUILD_ACCESS(this, mcDimension*, dimension, GET_OFFSET("BlockSource::dimension")); + mcDimension* getDimension(); Biome *getBiome(const Vec3 &); }; \ No newline at end of file diff --git a/src/SDK/Client/Core/ClientInstance.hpp b/src/SDK/Client/Core/ClientInstance.hpp index a317e2d6..c71d051e 100644 --- a/src/SDK/Client/Core/ClientInstance.hpp +++ b/src/SDK/Client/Core/ClientInstance.hpp @@ -14,9 +14,17 @@ class ClientInstance { public: - BUILD_ACCESS(this, MinecraftGame*, mcgame, GET_OFFSET("ClientInstance::minecraftGame")); - BUILD_ACCESS(this, GuiData*, guiData, GET_OFFSET("ClientInstance::guiData")); - BUILD_ACCESS(this, GLMatrix, viewMatrix, GET_OFFSET("ClientInstance::viewMatrix")); + MinecraftGame* getMinecraftGame() { + return hat::member_at(this, GET_OFFSET("ClientInstance::minecraftGame")); + }; + + GuiData *getGuiData() { + return hat::member_at(this, GET_OFFSET("ClientInstance::guiData")); + }; + + GLMatrix getViewMatrix() { + return hat::member_at(this, GET_OFFSET("ClientInstance::viewMatrix")); + }; LocalPlayer *getLocalPlayer(); @@ -30,7 +38,6 @@ class ClientInstance { LevelRender *getLevelRender(); - float getFovX() { return hat::member_at(this, GET_OFFSET("ClientInstance::getFovX")); }; diff --git a/src/SDK/Client/Level/Level.hpp b/src/SDK/Client/Level/Level.hpp index 45bfdfd0..4a94b19c 100644 --- a/src/SDK/Client/Level/Level.hpp +++ b/src/SDK/Client/Level/Level.hpp @@ -33,11 +33,9 @@ class PlayerListEntry { }; class Level { - using troll = std::unordered_map; - public: - troll &getPlayerMap() { - return direct_access(this, GET_OFFSET("Level::getPlayerMap")); + std::unordered_map &getPlayerMap() { + return hat::member_at>(this, GET_OFFSET("Level::getPlayerMap")); } HitResult &getHitResult() { diff --git a/src/SDK/Client/Render/Matrix.cpp b/src/SDK/Client/Render/Matrix.cpp index 9d50f718..e72ef4f6 100644 --- a/src/SDK/Client/Render/Matrix.cpp +++ b/src/SDK/Client/Render/Matrix.cpp @@ -17,7 +17,7 @@ glm::mat4 Matrix::getMatrixCorrection(GLMatrix mat) { bool Matrix::WorldToScreen(Vec3 pos, Vec2 &screen) { // pos = pos 2 w2s, screen = output screen coords - Vec2 displaySize = SDK::clientInstance->guiData->ScreenSize; + Vec2 displaySize = SDK::clientInstance->getGuiData()->ScreenSize; Vec3 origin = MC::Transform.origin; pos = pos.sub(origin); diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index 888385dc..89dee8fa 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -6,9 +6,6 @@ void OffsetInit::init2100() { Logger::debug("[Offsets] Loading offsets for 1.21.0X"); - ADD_OFFSET("Actor::isAlive", 50); - ADD_OFFSET("Actor::isValidTarget", 56); - ADD_OFFSET("Inventory::getItem", 7); ADD_OFFSET("Actor::hurtTime", 0x20C); @@ -28,8 +25,6 @@ void OffsetInit::init2100() { void OffsetInit::init2080() { Logger::debug("[Offsets] Loading offsets for 1.20.8X"); - ADD_OFFSET("Actor::isAlive", 51); - ADD_OFFSET("Actor::isValidTarget", 57); ADD_OFFSET("Actor::baseTickVft", 26); ADD_OFFSET("Player::playerInventory", 0x788); @@ -50,9 +45,6 @@ void OffsetInit::init2080() { void OffsetInit::init2070() { Logger::debug("[Offsets] Loading offsets for 1.20.7X"); - ADD_OFFSET("Actor::isAlive", 53); - ADD_OFFSET("Actor::isValidTarget", 61); - ADD_OFFSET("ClientInstance::getBlockSource", 28); ADD_OFFSET("ClientInstance::getLocalPlayer", 29); @@ -77,9 +69,6 @@ void OffsetInit::init2070() { void OffsetInit::init2060() { Logger::debug("[Offsets] Loading offsets for 1.20.6X"); - ADD_OFFSET("Actor::isAlive", 54); - ADD_OFFSET("Actor::isValidTarget", 62); - ADD_OFFSET("Actor::hurtTime", 0x234); ADD_OFFSET("Actor::level", 0x290); ADD_OFFSET("Actor::categories", 0x2C8); @@ -103,9 +92,6 @@ void OffsetInit::init2060() { void OffsetInit::init2050() { Logger::debug("[Offsets] Loading offsets for 1.20.5X"); - ADD_OFFSET("Actor::isAlive", 57); - ADD_OFFSET("Actor::isValidTarget", 65); - ADD_OFFSET("ClientInstance::getBlockSource", 27); ADD_OFFSET("ClientInstance::getLocalPlayer", 28); @@ -132,8 +118,6 @@ void OffsetInit::init2040() { // getGamma, combo & Logger::debug("[Offsets] Loading offsets for 1.20.4X"); - ADD_OFFSET("Actor::isAlive", 58); - ADD_OFFSET("Actor::isValidTarget", 66); ADD_OFFSET("Actor::hurtTime", 0x204); ADD_OFFSET("Actor::baseTickVft", 30); @@ -162,8 +146,6 @@ void OffsetInit::init2030() { // Hitboxes and other ADD_OFFSET("Actor::getActorFlag", 0); - ADD_OFFSET("Actor::isAlive", 89); - ADD_OFFSET("Actor::isValidTarget", 65); // Armour HUD, Inventory HUD ADD_OFFSET("Inventory::getItem", 5); @@ -247,6 +229,10 @@ void OffsetInit::init2030() { ADD_OFFSET("MinecraftUIRenderContext::clientInstance", 0x8); ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); + ADD_OFFSET("MinecraftUIRenderContext::textures", 0x48); + + ADD_OFFSET("TextureGroup::base", 0x18); + ADD_OFFSET("TextureGroup::loadedTextures", 0x178); ADD_OFFSET("ScreenView::VisualTree", 0x48); diff --git a/src/Utils/Render/DrawUtils.cpp b/src/Utils/Render/DrawUtils.cpp index 8ba6fa2b..5a72bc69 100644 --- a/src/Utils/Render/DrawUtils.cpp +++ b/src/Utils/Render/DrawUtils.cpp @@ -7,13 +7,13 @@ void DrawUtils::addLine(Vec2 start, Vec2 end, float lineWidth, D2D_COLOR_F color) { - if (start.x < 0 || start.x > SDK::clientInstance->guiData->ScreenSize.x || start.y < 0 || - start.y > SDK::clientInstance->guiData->ScreenSize.y) { + if (start.x < 0 || start.x > SDK::clientInstance->getGuiData()->ScreenSize.x || start.y < 0 || + start.y > SDK::clientInstance->getGuiData()->ScreenSize.y) { return; } - if (end.x < 0 || end.x > SDK::clientInstance->guiData->ScreenSize.x || end.y < 0 || - end.y > SDK::clientInstance->guiData->ScreenSize.y) { + if (end.x < 0 || end.x > SDK::clientInstance->getGuiData()->ScreenSize.x || end.y < 0 || + end.y > SDK::clientInstance->getGuiData()->ScreenSize.y) { return; } From b73a3b222359832d59e419ebeecfd36f6b265c23 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 7 Aug 2024 20:14:05 +0300 Subject: [PATCH 075/240] Position utils --- .../Modules/ArmorHUD/ArmorHUDListener.hpp | 17 ++++++++--------- .../Modules/MovableChat/MovableChatListener.hpp | 17 ++++------------- .../Module/Modules/PaperDoll/DollListener.hpp | 16 +++------------- src/Utils/Render/PositionUtils.cpp | 17 +++++++++++++++++ src/Utils/Render/PositionUtils.hpp | 11 +++++++++++ src/Utils/Utils.hpp | 4 ++++ 6 files changed, 47 insertions(+), 35 deletions(-) create mode 100644 src/Utils/Render/PositionUtils.cpp create mode 100644 src/Utils/Render/PositionUtils.hpp diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp index 3316a5fa..1617f0c0 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp @@ -10,6 +10,7 @@ #include "../../../../SDK/SDK.hpp" #include "../../../../SDK/Client/Render/BaseActorRenderContext.hpp" #include "../../../../SDK/Client/Render/ItemRenderer.hpp" +#include "../../../../Utils/Render/PositionUtils.hpp" #include #include @@ -54,7 +55,7 @@ class ArmorHUDListener : public Listener { auto vertical = module->settings.getSettingByName("vertical")->value; float spacing = testSpacing; - spacing = convert(Vec2{spacing, spacing}).x; + spacing = PositionUtils::getScaledPos(Vec2{spacing, spacing}).x; if (SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory->getItem( SDK::clientInstance->getLocalPlayer()->getSupplies()->SelectedSlot)->getItem() != @@ -220,7 +221,8 @@ class ArmorHUDListener : public Listener { BaseActorRenderContext barc(muirc->getScreenContext(), muirc->getClientInstance(), muirc->getClientInstance()->getMinecraftGame()); - Vec2 convert = this->convert(); + Vec2 scaledPos = PositionUtils::getScaledPos(currentPos); + if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { @@ -238,7 +240,7 @@ class ArmorHUDListener : public Listener { barc.itemRenderer->renderGuiItemNew(&barc, item, - 0, convert.x, convert.y, 1.0f, + 0, scaledPos.x, scaledPos.y, 1.0f, module->settings.getSettingByName( "uiscale")->value, false); @@ -246,7 +248,7 @@ class ArmorHUDListener : public Listener { if(item->isEnchanted()) { barc.itemRenderer->renderGuiItemNew(&barc, item, - 0, convert.x, convert.y, 1.0f, + 0, scaledPos.x, scaledPos.y, 1.0f, module->settings.getSettingByName( "uiscale")->value, true); @@ -274,13 +276,10 @@ class ArmorHUDListener : public Listener { durabilities[i][1] = maxDamage; durabilities[i][0] = durabilityLeft; - - convert = this->convert(); - barc.itemRenderer->renderGuiItemNew(&barc, armorSlot, 0, - convert.x + xmodifier, convert.y + ymodifier, 1.0f, + scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, module->settings.getSettingByName( "uiscale")->value, false); @@ -288,7 +287,7 @@ class ArmorHUDListener : public Listener { barc.itemRenderer->renderGuiItemNew(&barc, armorSlot, 0, - convert.x + xmodifier, convert.y + ymodifier, 1.0f, + scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, module->settings.getSettingByName( "uiscale")->value, true); diff --git a/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp b/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp index c3b82ee7..7995a92a 100644 --- a/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp +++ b/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp @@ -11,6 +11,7 @@ #include "MovableChatListener.hpp" #include "../../Manager.hpp" #include "../ClickGUI/ClickGUIRenderer.hpp" +#include "../../../../Utils/Render/PositionUtils.hpp" #include #include @@ -24,16 +25,6 @@ class MovableChatListener : public Listener { bool enabled = true; static inline Vec2 oriXy = Vec2{0.0f, 0.0f}; - - [[nodiscard]] Vec2 convert() const { - - auto e = SDK::clientInstance->guiData; - Vec2 xd = Vec2(e->ScreenSize.x, e->ScreenSize.y); - Vec2 LOL = Vec2(e->ScreenSizeScaled.x, e->ScreenSizeScaled.y); - - return Vec2{currentPos.x * (LOL.x / xd.x), currentPos.y * (LOL.y / xd.y)}; - } - void onRender(RenderEvent &event) override { if (!module->isEnabled()) enabled = false; @@ -106,10 +97,10 @@ class MovableChatListener : public Listener { MovableChatListener::oriXy.y = control->y; } - Vec2 convert = this->convert(); + Vec2 scaledPos = PositionUtils::getScaledPos(currentPos); - control->x = convert.x + 5; - control->y = convert.y; + control->x = scaledPos.x + 5; + control->y = scaledPos.y; control->scale = module->settings.getSettingByName("uiscale")->value + 100; diff --git a/src/Client/Module/Modules/PaperDoll/DollListener.hpp b/src/Client/Module/Modules/PaperDoll/DollListener.hpp index a9f851ce..4828c16d 100644 --- a/src/Client/Module/Modules/PaperDoll/DollListener.hpp +++ b/src/Client/Module/Modules/PaperDoll/DollListener.hpp @@ -21,16 +21,6 @@ class DollListener : public Listener { bool enabled = false; static inline Vec2 oriXY = Vec2{0.0f, 0.0f}; - - [[nodiscard]] Vec2 convert() const { - - auto e = SDK::clientInstance->guiData; - Vec2 xd = Vec2(e->ScreenSize.x, e->ScreenSize.y); - Vec2 LOL = Vec2(e->ScreenSizeScaled.x, e->ScreenSizeScaled.y); - - return Vec2{currentPos.x * (LOL.x / xd.x), currentPos.y * (LOL.y / xd.y)}; - } - void onRender(RenderEvent &event) override { if (ClientInstance::getTopScreenName() == "hud_screen" && @@ -87,10 +77,10 @@ class DollListener : public Listener { DollListener::oriXY.y = control->y; } - Vec2 convert = this->convert(); + Vec2 scaledPos = PositionUtils::getScaledPos(currentPos); - control->x = convert.x + 7; - control->y = convert.y; + control->x = scaledPos.x + 7; + control->y = scaledPos.y; control->scale = module->settings.getSettingByName("uiscale")->value; diff --git a/src/Utils/Render/PositionUtils.cpp b/src/Utils/Render/PositionUtils.cpp new file mode 100644 index 00000000..65aed11c --- /dev/null +++ b/src/Utils/Render/PositionUtils.cpp @@ -0,0 +1,17 @@ +#include "PositionUtils.hpp" +#include "../../SDK/SDK.hpp" + +Vec2 PositionUtils::getUIScale() { + auto screenSize = SDK::clientInstance->getGuiData()->getScreenSize(); + auto uiSize = SDK::clientInstance->getGuiData()->getScreenSizeScaled(); + return uiSize.div(screenSize); +} + +Vec2 PositionUtils::getScaledPos(Vec2 pos) { + Vec2 uiScale = getUIScale(); + return pos.mul(uiScale); +} + +Vec2 PositionUtils::getCustomScaledPos(Vec2 pos, float scale) { + return getScaledPos(pos).mul(scale); +} diff --git a/src/Utils/Render/PositionUtils.hpp b/src/Utils/Render/PositionUtils.hpp new file mode 100644 index 00000000..0b39ac30 --- /dev/null +++ b/src/Utils/Render/PositionUtils.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "../Utils.hpp" + +class PositionUtils { +public: + static Vec2 getUIScale(); + + static Vec2 getScaledPos(Vec2 pos); + static Vec2 getCustomScaledPos(Vec2 pos, float scale); +}; diff --git a/src/Utils/Utils.hpp b/src/Utils/Utils.hpp index ee0c057c..ae999f6d 100644 --- a/src/Utils/Utils.hpp +++ b/src/Utils/Utils.hpp @@ -89,6 +89,10 @@ class Vec2 { return Vec2(this->x * v.x, this->y * v.y); }; + auto mul(float v) -> Vec2 { + return Vec2(this->x * v, this->y * v); + }; + auto dist(const Vec2 &v) -> float { auto dX = this->x - v.x; auto dY = this->y - v.y; From 16779ced8ec3482f32a2d5e07b4fa23aaf640b5e Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 7 Aug 2024 20:14:39 +0300 Subject: [PATCH 076/240] Position utils #2 --- .../Modules/InventoryHUD/InventoryHUDListener.hpp | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp b/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp index 94c10d48..c5301739 100644 --- a/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp +++ b/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp @@ -28,17 +28,6 @@ class InventoryHUDListener : public Listener { Vec2 testOffset = Vec2{0,0}; - - - [[nodiscard]] Vec2 convert() const { - - auto e = SDK::clientInstance->guiData; - Vec2 xd = Vec2(e->ScreenSize.x, e->ScreenSize.y); - Vec2 LOL = Vec2(e->ScreenSizeScaled.x, e->ScreenSizeScaled.y); - - return Vec2{currentPos.x * (LOL.x / xd.x), currentPos.y * (LOL.y / xd.y)}; - } - void onRender(RenderEvent &event) override { if (ClientInstance::getTopScreenName() == "hud_screen" && module->isEnabled() || @@ -93,7 +82,7 @@ class InventoryHUDListener : public Listener { BaseActorRenderContext barc(muirc->getScreenContext(), muirc->getClientInstance(), muirc->getClientInstance()->getMinecraftGame()); - Vec2 convert = this->convert(); + Vec2 scaledPos = PositionUtils::getScaledPos(currentPos); if (SDK::clientInstance->getLocalPlayer() != nullptr) if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { @@ -113,7 +102,7 @@ class InventoryHUDListener : public Listener { barc.itemRenderer->renderGuiItemNew(&barc, SDK::clientInstance->getLocalPlayer()->getSupplies()->getinventory()->getItem( i), 0, - convert.x + xmodifier, convert.y + ymodifier, 1.0f, + scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, module->settings.getSettingByName( "uiscale")->value, false); } From 15d6d4f982a9e8021da66f6218364c6df2fa092a Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 7 Aug 2024 20:15:32 +0300 Subject: [PATCH 077/240] Reset nick formatting --- src/Client/Module/Modules/Nick/NickListener.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Client/Module/Modules/Nick/NickListener.hpp b/src/Client/Module/Modules/Nick/NickListener.hpp index d3a2e861..25b56215 100644 --- a/src/Client/Module/Modules/Nick/NickListener.hpp +++ b/src/Client/Module/Modules/Nick/NickListener.hpp @@ -32,14 +32,14 @@ class NickListener : public Listener { void onDrawText(DrawTextEvent &event) override { if (SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { - if (original.empty()) original = SDK::clientInstance->getLocalPlayer()->playerName; + if (original.empty()) original = SDK::clientInstance->getLocalPlayer()->getPlayerName(); if (module->isEnabled() && !module->restricted) { std::string localPlayerName = original; size_t pos = event.getText()->find(localPlayerName); if (pos != std::string::npos) { std::string faketxt = *event.getText(); faketxt.replace(pos, localPlayerName.length(), - "§o"+Utils::removeColorCodes(module->settings.getSettingByName("nick")->value)); + "§o"+Utils::removeColorCodes(module->settings.getSettingByName("nick")->value)+"§r"); *event.getText() = faketxt; } } @@ -51,7 +51,7 @@ class NickListener : public Listener { if (!SDK::clientInstance->getLocalPlayer()) return; - if (original.empty()) original = SDK::clientInstance->getLocalPlayer()->playerName; + if (original.empty()) original = SDK::clientInstance->getLocalPlayer()->getPlayerName(); if (original2.empty()) original2 = *SDK::clientInstance->getLocalPlayer()->getNametag(); if (backupOri.empty()) backupOri = *SDK::clientInstance->getLocalPlayer()->getNametag(); @@ -64,7 +64,7 @@ class NickListener : public Listener { if (enabled && !module->restricted) { - std::string val = "§o"+Utils::removeColorCodes(module->settings.getSettingByName("nick")->value); + std::string val = "§o"+Utils::removeColorCodes(module->settings.getSettingByName("nick")->value)+"§r"; SDK::clientInstance->getLocalPlayer()->setNametag(&val); SDK::clientInstance->getLocalPlayer()->getPlayerName() = val; From ca615dc364708520f511b0a07616ad591248dc5c Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 7 Aug 2024 20:19:09 +0300 Subject: [PATCH 078/240] Some texture SDK --- src/Client/Events/Render/DrawImageEvent.hpp | 6 +- .../Hook/Hooks/Render/SetupAndRenderHook.hpp | 6 +- src/SDK/Client/Render/BedrockTexture.hpp | 36 +++++++++ src/SDK/Client/Render/BedrockTextureData.hpp | 22 ++++++ .../Render/MinecraftUIRenderContext.hpp | 73 ++++++++++++++++++- src/SDK/Client/Render/ResourceLocation.hpp | 67 +++++++++++++++++ src/SDK/Client/Render/Texture2D.hpp | 19 ----- src/SDK/Client/Render/TextureGroup.hpp | 14 ++++ src/SDK/Client/Render/TexturePtr.hpp | 19 +++++ .../Client/Render/Textures/BindFlagsBit.hpp | 17 +++++ .../Client/Render/Textures/ClientTexture.hpp | 23 ++++++ src/SDK/Client/Render/Textures/Color.hpp | 10 +++ .../Client/Render/Textures/ColorChannel.hpp | 5 ++ .../Render/Textures/ImageDescription.hpp | 13 ++++ .../Render/Textures/IsMissingTexture.hpp | 6 ++ .../Render/Textures/SampleDescription.hpp | 10 +++ .../Render/Textures/TextureDescription.hpp | 10 +++ .../Client/Render/Textures/TextureFormat.hpp | 44 +++++++++++ .../Render/Textures/TextureLoadState.hpp | 9 +++ .../Textures/TextureSetImageDescription.hpp | 19 +++++ .../Render/Textures/TextureSetLayerType.hpp | 16 ++++ .../Render/Textures/mceTextureDescription.hpp | 17 +++++ src/Utils/Memory/Game/Sig/SigInit.cpp | 4 + 23 files changed, 437 insertions(+), 28 deletions(-) create mode 100644 src/SDK/Client/Render/BedrockTexture.hpp create mode 100644 src/SDK/Client/Render/BedrockTextureData.hpp create mode 100644 src/SDK/Client/Render/ResourceLocation.hpp delete mode 100644 src/SDK/Client/Render/Texture2D.hpp create mode 100644 src/SDK/Client/Render/TextureGroup.hpp create mode 100644 src/SDK/Client/Render/TexturePtr.hpp create mode 100644 src/SDK/Client/Render/Textures/BindFlagsBit.hpp create mode 100644 src/SDK/Client/Render/Textures/ClientTexture.hpp create mode 100644 src/SDK/Client/Render/Textures/Color.hpp create mode 100644 src/SDK/Client/Render/Textures/ColorChannel.hpp create mode 100644 src/SDK/Client/Render/Textures/ImageDescription.hpp create mode 100644 src/SDK/Client/Render/Textures/IsMissingTexture.hpp create mode 100644 src/SDK/Client/Render/Textures/SampleDescription.hpp create mode 100644 src/SDK/Client/Render/Textures/TextureDescription.hpp create mode 100644 src/SDK/Client/Render/Textures/TextureFormat.hpp create mode 100644 src/SDK/Client/Render/Textures/TextureLoadState.hpp create mode 100644 src/SDK/Client/Render/Textures/TextureSetImageDescription.hpp create mode 100644 src/SDK/Client/Render/Textures/TextureSetLayerType.hpp create mode 100644 src/SDK/Client/Render/Textures/mceTextureDescription.hpp diff --git a/src/Client/Events/Render/DrawImageEvent.hpp b/src/Client/Events/Render/DrawImageEvent.hpp index a229c92c..3b2c864f 100644 --- a/src/Client/Events/Render/DrawImageEvent.hpp +++ b/src/Client/Events/Render/DrawImageEvent.hpp @@ -3,11 +3,11 @@ #include "../Event.hpp" #include "../Cancellable.hpp" #include "../../../Utils/Utils.hpp" -#include "../../../SDK/Client/Render/Texture2D.hpp" +#include "../../../SDK/Client/Render/TexturePtr.hpp" class DrawImageEvent : public Event, Cancellable { private: - TextureData *texturePtr; + TexturePtr *texturePtr; Vec2 &imagePos; public: [[nodiscard]] Vec2 &getImagePos() const { @@ -18,7 +18,7 @@ class DrawImageEvent : public Event, Cancellable { return this->texturePtr->GetFilePath(); } - explicit DrawImageEvent(TextureData *texturePtr, Vec2 &imagePos) + explicit DrawImageEvent(TexturePtr *texturePtr, Vec2 &imagePos) : texturePtr(texturePtr), imagePos(imagePos) { } }; \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp index f6d57f48..2e74e100 100644 --- a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp +++ b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp @@ -30,7 +30,7 @@ class SetUpAndRenderHook : public Hook static void drawImageDetour( MinecraftUIRenderContext* _this, - TextureData* texturePtr, + TexturePtr* texturePtr, Vec2& imagePos, Vec2& imageDimension, Vec2& uvPos, @@ -40,7 +40,7 @@ class SetUpAndRenderHook : public Hook DrawImageEvent event(texturePtr, imagePos); EventHandler::onDrawImage(event); - Memory::CallFunc&, Vec2&, Vec2&, Vec2&>( + Memory::CallFunc&, Vec2&, Vec2&, Vec2&>( oDrawImage, _this, texturePtr, @@ -67,7 +67,7 @@ class SetUpAndRenderHook : public Hook static void setUpAndRenderCallback(ScreenView* pScreenView, MinecraftUIRenderContext* muirc) { SDK::screenView = pScreenView; - SDK::clientInstance = muirc->getclientInstance(); + SDK::clientInstance = muirc->getClientInstance(); SDK::hasInstanced = true; if(funcOriginalText == nullptr || oDrawImage == nullptr) diff --git a/src/SDK/Client/Render/BedrockTexture.hpp b/src/SDK/Client/Render/BedrockTexture.hpp new file mode 100644 index 00000000..4338f873 --- /dev/null +++ b/src/SDK/Client/Render/BedrockTexture.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include +#include "BedrockTextureData.hpp" + +struct BedrockTexture { +public: + std::shared_ptr bedrockTextureData; + + BedrockTexture() = default; + + BedrockTexture(const BedrockTextureData& data) { + bedrockTextureData = std::make_shared(data); + } + + void unload() { + if(bedrockTextureData != nullptr) { + bedrockTextureData.reset(); + + int newState = bedrockTextureData->textureLoadState & ~TextureLoadState::LoadedBit; + bedrockTextureData->textureLoadState = static_cast(newState); + + bedrockTextureData->isMissingTexture = IsMissingTexture::No; + } + } + + bool operator==(const BedrockTexture& other) const { + if(bedrockTextureData == other.bedrockTextureData) return true; + return bedrockTextureData->clientTexture == other.bedrockTextureData->clientTexture; + } + + bool operator!=(const BedrockTexture& other) const { + if(bedrockTextureData != other.bedrockTextureData) return true; + return bedrockTextureData->clientTexture != other.bedrockTextureData->clientTexture; + } +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/BedrockTextureData.hpp b/src/SDK/Client/Render/BedrockTextureData.hpp new file mode 100644 index 00000000..8b6cb122 --- /dev/null +++ b/src/SDK/Client/Render/BedrockTextureData.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "TexturePtr.hpp" +#include "Textures/mceTextureDescription.hpp" +#include "Textures/ClientTexture.hpp" +#include "Textures/IsMissingTexture.hpp" +#include "Textures/TextureLoadState.hpp" +#include "Textures/TextureSetImageDescription.hpp" + +struct BedrockTextureData { +public: + mce::ClientTexture clientTexture; + mce::TextureDescription textureDescription; + IsMissingTexture isMissingTexture; + TextureLoadState textureLoadState; + cg::TextureSetImageDescription textureSetDescription; + + ~BedrockTextureData() { + clientTexture.resourcePointerBlock.reset(); + textureSetDescription.layerInfo.clear(); + }; +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/MinecraftUIRenderContext.hpp b/src/SDK/Client/Render/MinecraftUIRenderContext.hpp index 4ddf86d1..7ce5e455 100644 --- a/src/SDK/Client/Render/MinecraftUIRenderContext.hpp +++ b/src/SDK/Client/Render/MinecraftUIRenderContext.hpp @@ -11,10 +11,77 @@ #include "../Container/Inventory.hpp" #include "../../../Utils/Utils.hpp" #include "../../../Client/GUI/D2D.hpp" -#include "Texture2D.hpp" +#include "TexturePtr.hpp" +#include "TextureGroup.hpp" +#include "../../../Client/Module/Manager.hpp" class MinecraftUIRenderContext { public: - BUILD_ACCESS(this, ClientInstance*, clientInstance, GET_OFFSET("MinecraftUIRenderContext::clientInstance")); - BUILD_ACCESS(this, class ScreenContext*, screenContext, GET_OFFSET("MinecraftUIRenderContext::screenContext")); + ClientInstance* getClientInstance() { + return hat::member_at(this, GET_OFFSET("MinecraftUIRenderContext::clientInstance")); + } + + class ScreenContext* getScreenContext() { + return hat::member_at(this, GET_OFFSET("MinecraftUIRenderContext::screenContext")); + } + + std::shared_ptr& getTextureGroup() { + return hat::member_at>(this, GET_OFFSET("MinecraftUIRenderContext::textures")); + } + + std::map& getTextures() { + return getTextureGroup()->getLoadedTextures(); + } + + TexturePtr* getTexture(TexturePtr* ptr, const ResourceLocation& location, bool forceReload) { + using getTextureFunc = TexturePtr*(__fastcall*)(MinecraftUIRenderContext*, TexturePtr*, const ResourceLocation&, bool); + static auto getTextureOriginal = reinterpret_cast(Memory::findSig(GET_SIG("MinecraftUIRenderContext::getTexture"))); + return getTextureOriginal(this, ptr, location, forceReload); + } + + TexturePtr* createTexture(const std::string& path, bool external, bool forceReload) { + const auto resource = ResourceLocation(path, external); + TexturePtr texture = TexturePtr(); + return getTexture(&texture, resource, forceReload); + } + + TexturePtr* createTexture(const ResourceLocation& location, bool forceReload) { + TexturePtr texture = TexturePtr(); + return getTexture(&texture, location, forceReload); + } + + void reloadTexture(const ResourceLocation& location) { + this->createTexture(location, true); + } + + void reloadAllTextures() { + auto& textures = this->getTextures(); + + for (auto& [resourceLocation, texture] : textures) { + texture.unload(); + reloadTexture(resourceLocation); + } + } + + void swapTextures(ResourceLocation& from, ResourceLocation& to) { + auto& textures = this->getTextures(); + + // only reload if texture is not loaded + if(!textures.contains(from)) { + reloadTexture(from); + } + + if(!textures.contains(to)) { + reloadTexture(to); + } + + if(textures.contains(from) && textures.contains(to) && textures[from] != textures[to]) { + if(textures[to].bedrockTextureData->textureLoadState == TextureLoadState::LoadedBit) { + textures[from] = textures[to]; + } else { + auto texture = createTexture(to, false); + textures[from] = *texture->clientTexture; + } + } + } }; \ No newline at end of file diff --git a/src/SDK/Client/Render/ResourceLocation.hpp b/src/SDK/Client/Render/ResourceLocation.hpp new file mode 100644 index 00000000..3bbf789b --- /dev/null +++ b/src/SDK/Client/Render/ResourceLocation.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include + +enum ResourceFileSystem : int32_t { + UserPackage = 0x0000, + AppPackage = 0x0001, + Raw = 0x0002, + RawPersistent = 0x0003, + SettingsDir = 0x0004, + ExternalDir = 0x0005, + ServerPackage = 0x0006, + DataDir = 0x0007, + UserDir = 0x0008, + ScreenshotsDir = 0x0009, + StoreCache = 0x000a, + Invalid = 0x000b, +}; + +class ResourceLocation { +public: + ResourceFileSystem fileSystem; + std::string filePath; + uint64_t pathHash{}; + uint64_t fullHash{}; + + ResourceLocation(const std::string& filePath, bool external) { + this->filePath = filePath; + if (external) + this->fileSystem = ResourceFileSystem::Raw; + else this->fileSystem = ResourceFileSystem::UserPackage; + + _computeHashes(); + }; + + bool operator==(const ResourceLocation& other) const { + if(this->fileSystem != other.fileSystem || this->pathHash != other.pathHash) return false; + return this->filePath == other.filePath; + } + + bool operator<(const ResourceLocation& other) const { + return this->filePath < other.filePath; + } + +private: + void _computeHashes() + { + const uint64_t FNV_OFFSET_BASIS = 0xCBF29CE484222325u; + const uint64_t FNV_PRIME = 0x100000001B3u; + + uint64_t _pathHash = FNV_OFFSET_BASIS; + if (!this->filePath.empty()) { + for (char c : this->filePath) { + _pathHash *= FNV_PRIME; + _pathHash ^= c; + } + } else { + _pathHash = 0; + } + + uint64_t fileSystemHash = FNV_OFFSET_BASIS ^ static_cast(this->fileSystem); + fileSystemHash *= FNV_PRIME; + + this->pathHash = _pathHash; + this->fullHash = _pathHash ^ fileSystemHash; + } +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/Texture2D.hpp b/src/SDK/Client/Render/Texture2D.hpp deleted file mode 100644 index e03439b7..00000000 --- a/src/SDK/Client/Render/Texture2D.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include -#include - -class TextureData { -private: - char pad_0x0[0x18]; - struct PathStruct { - char pad_0x0[0x18]; - std::string filePath; - } *ptrToPath; - char pad_0x0038[0x20]; - -public: - [[nodiscard]] std::string GetFilePath() const { - return ptrToPath->filePath; - } -}; \ No newline at end of file diff --git a/src/SDK/Client/Render/TextureGroup.hpp b/src/SDK/Client/Render/TextureGroup.hpp new file mode 100644 index 00000000..d86c49f8 --- /dev/null +++ b/src/SDK/Client/Render/TextureGroup.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include +#include "ResourceLocation.hpp" +#include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" +#include "libhat/Access.hpp" +#include "BedrockTexture.hpp" + +class TextureGroup { +public: + std::map& getLoadedTextures() { + return hat::member_at>(this, GET_OFFSET("TextureGroup::base") + GET_OFFSET("TextureGroup::loadedTextures")); + } +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/TexturePtr.hpp b/src/SDK/Client/Render/TexturePtr.hpp new file mode 100644 index 00000000..955037ac --- /dev/null +++ b/src/SDK/Client/Render/TexturePtr.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include +#include "ResourceLocation.hpp" +#include "BedrockTextureData.hpp" + + +class TexturePtr { +public: + std::shared_ptr clientTexture; + std::shared_ptr resourceLocation; + + TexturePtr() = default; + + [[nodiscard]] std::string GetFilePath() const { + return resourceLocation->filePath; + } +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/BindFlagsBit.hpp b/src/SDK/Client/Render/Textures/BindFlagsBit.hpp new file mode 100644 index 00000000..1be6f672 --- /dev/null +++ b/src/SDK/Client/Render/Textures/BindFlagsBit.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace mce { + enum BindFlagsBit : uint32_t { + NoBindFlags = 0x0000, + VertexBufferBit = 0x0001, + IndexBufferBit = 0x0002, + ConstantBufferBit = 0x0004, + ShaderResourceBit = 0x0008, + StreamOutputBit = 0x0010, + RenderTargetBit = 0x0020, + DepthStencilBit = 0x0040, + UnorderedAccessBit = 0x0080, + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/ClientTexture.hpp b/src/SDK/Client/Render/Textures/ClientTexture.hpp new file mode 100644 index 00000000..d633ba06 --- /dev/null +++ b/src/SDK/Client/Render/Textures/ClientTexture.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include +#include +#include + +namespace mce { + class ClientTexture { + public: + std::shared_ptr resourcePointerBlock; + public: + virtual ~ClientTexture() = default; + + bool operator==(const ClientTexture& other) const { + return resourcePointerBlock == other.resourcePointerBlock; + } + + bool operator!=(const ClientTexture& other) const { + return resourcePointerBlock != other.resourcePointerBlock; + } + }; +}; + diff --git a/src/SDK/Client/Render/Textures/Color.hpp b/src/SDK/Client/Render/Textures/Color.hpp new file mode 100644 index 00000000..965ab63e --- /dev/null +++ b/src/SDK/Client/Render/Textures/Color.hpp @@ -0,0 +1,10 @@ +#pragma once + +namespace mce { + class Color { // MCCColor + float r; + float g; + float b; + float a; + }; +} diff --git a/src/SDK/Client/Render/Textures/ColorChannel.hpp b/src/SDK/Client/Render/Textures/ColorChannel.hpp new file mode 100644 index 00000000..61cb2dd6 --- /dev/null +++ b/src/SDK/Client/Render/Textures/ColorChannel.hpp @@ -0,0 +1,5 @@ +#pragma once + +class ColorChannel { + float value; +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/ImageDescription.hpp b/src/SDK/Client/Render/Textures/ImageDescription.hpp new file mode 100644 index 00000000..6305bd86 --- /dev/null +++ b/src/SDK/Client/Render/Textures/ImageDescription.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include +#include "TextureFormat.hpp" + +namespace cg { + struct ImageDescription { + uint32_t width; + uint32_t height; + mce::TextureFormat textureFormat; + uint32_t arraySize; + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/IsMissingTexture.hpp b/src/SDK/Client/Render/Textures/IsMissingTexture.hpp new file mode 100644 index 00000000..5fa37c6f --- /dev/null +++ b/src/SDK/Client/Render/Textures/IsMissingTexture.hpp @@ -0,0 +1,6 @@ +#pragma once + +enum IsMissingTexture : unsigned char { + Yes = 0x0000, + No = 0x0001, +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/SampleDescription.hpp b/src/SDK/Client/Render/Textures/SampleDescription.hpp new file mode 100644 index 00000000..ffb04d4c --- /dev/null +++ b/src/SDK/Client/Render/Textures/SampleDescription.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace mce { + class SampleDescription { + int32_t count; + int32_t quality; + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/TextureDescription.hpp b/src/SDK/Client/Render/Textures/TextureDescription.hpp new file mode 100644 index 00000000..6ae1cc23 --- /dev/null +++ b/src/SDK/Client/Render/Textures/TextureDescription.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include +#include "ImageDescription.hpp" + +namespace cg { + class TextureDescription : public cg::ImageDescription { + uint32_t mipCount; + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/TextureFormat.hpp b/src/SDK/Client/Render/Textures/TextureFormat.hpp new file mode 100644 index 00000000..e39736ab --- /dev/null +++ b/src/SDK/Client/Render/Textures/TextureFormat.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include + +namespace mce { + enum TextureFormat : uint32_t { + UNKNOWN_TEXTURE_FORMAT = 0x0000, + R32G32B32A32_FLOAT = 0x0002, + R16G16B16A16_FLOAT = 0x000a, + R16G16B16A16_UNORM = 0x000b, + R32G32_FLOAT = 0x0010, + R10G10B10A2_UNORM = 0x0018, + R11G11B10_FLOAT = 0x001a, + R8G8B8A8_UNORM = 0x001c, + R8G8B8A8_UNORM_SRGB = 0x001d, + R16G16_FLOAT = 0x0022, + R16G16_UNORM = 0x0023, + R16G16_UINT = 0x0024, + R16G16_SNORM = 0x0025, + D32_FLOAT = 0x0028, + R32_FLOAT = 0x0029, + R32_UINT = 0x002a, + R24G8_TYPELESS = 0x002c, + D24_UNORM_S8_UINT = 0x002d, + R24_UNORM_X8_TYPELESS = 0x002e, + R8G8_UNORM = 0x0031, + R8G8_SNORM = 0x0033, + R16_FLOAT = 0x0036, + D16_UNORM = 0x0037, + R8_UNORM = 0x003d, + R8_UINT = 0x003e, + A8_UNORM = 0x0041, + BC3_UNORM = 0x004d, + R5G6B5_UNORM = 0x0055, + R5G5B5A1_UNORM = 0x0056, + B8G8R8A8_UNORM = 0x0057, + B8G8R8A8_UNORM_SRGB = 0x005b, + BC7_UNORM = 0x0062, + R4G4B4A4_UNORM = 0x0073, + S8_UINT = 0x0074, + R8G8B8_UNORM = 0x0075, + COMPRESSED = 0x0076, + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/TextureLoadState.hpp b/src/SDK/Client/Render/Textures/TextureLoadState.hpp new file mode 100644 index 00000000..81175ac6 --- /dev/null +++ b/src/SDK/Client/Render/Textures/TextureLoadState.hpp @@ -0,0 +1,9 @@ +#pragma once + +enum TextureLoadState : int { + UnloadedBit = 0x0000, + PendingBit = 0x0001, + LoadedBit = 0x0002, + PendingMetadata = 0x0004, + LoadedMetadata = 0x0008, +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/TextureSetImageDescription.hpp b/src/SDK/Client/Render/Textures/TextureSetImageDescription.hpp new file mode 100644 index 00000000..b97e5eb5 --- /dev/null +++ b/src/SDK/Client/Render/Textures/TextureSetImageDescription.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include "TextureSetLayerType.hpp" +#include "ImageDescription.hpp" +#include "ColorChannel.hpp" +#include "Color.hpp" + +namespace cg { + class TextureSetImageDescription { + public: + class LayerInfoVar { + cg::TextureSetLayerType layerType; + std::variant data; + }; + + std::vector > layerInfo; + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/TextureSetLayerType.hpp b/src/SDK/Client/Render/Textures/TextureSetLayerType.hpp new file mode 100644 index 00000000..5991b8c4 --- /dev/null +++ b/src/SDK/Client/Render/Textures/TextureSetLayerType.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace cg { + enum TextureSetLayerType : int32_t { + Color = 0x0000, + ColorUnlit = 0x0001, + MER = 0x0002, + Metalness = 0x0003, + Emissive = 0x0004, + Roughness = 0x0005, + Normal = 0x0006, + Heightmap = 0x0007, + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Render/Textures/mceTextureDescription.hpp b/src/SDK/Client/Render/Textures/mceTextureDescription.hpp new file mode 100644 index 00000000..27f297ec --- /dev/null +++ b/src/SDK/Client/Render/Textures/mceTextureDescription.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "TextureDescription.hpp" +#include "SampleDescription.hpp" +#include "Color.hpp" +#include "BindFlagsBit.hpp" + +namespace mce { + class TextureDescription : public cg::TextureDescription { + mce::SampleDescription sampleDescription; + mce::Color clearColor; + float optimizedClearDepth; + unsigned char optimizedClearStencil; + mce::BindFlagsBit bindFlags; + bool isStaging; + }; +} \ No newline at end of file diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index d2c75b5c..db00079f 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -203,6 +203,10 @@ void SigInit::init2030() { ADD_SIG("Tessellator::resetTransform", "80 B9 ? ? ? ? ? 4C 8B C1 75"); ADD_SIG("MeshHelper::renderImmediately", "48 89 5C 24 ? 48 89 74 24 ? 57 48 81 EC ? ? ? ? 49 8B F8 48 8B DA 48 8B F1 80 BA"); + ADD_SIG("MinecraftUIRenderContext::getTexture", "40 53 56 57 48 83 EC 70 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 60 48 8B DA 48 89"); + + ADD_SIG("mce::TextureGroup::getTexture", "40 53 56 57 48 83 EC 70 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 60 48 8B DA 48 89"); + ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 41 0F B6 F0"); ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); From 0d82e6915526f547da758f669dc5e992c433a403 Mon Sep 17 00:00:00 2001 From: St0neHunter <161620876+St0neHunter@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:30:01 +0200 Subject: [PATCH 079/240] Option to use /hub instead of /q + better explanation for solo mode (#19) --- src/Client/Module/Modules/AutoRQ/AutoRQ.hpp | 28 +++++++++ .../Module/Modules/AutoRQ/AutoRQListener.hpp | 58 +++++++++++++------ 2 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp b/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp index 7f1a6a01..c12cc437 100644 --- a/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp +++ b/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp @@ -32,6 +32,8 @@ class AutoRQ : public Module { settings.addSetting("command", (std::string)""); if (settings.getSettingByName("solo") == nullptr) settings.addSetting("solo", false); + if (settings.getSettingByName("hub") == nullptr) + settings.addSetting("hub", false); if (settings.getSettingByName("murderer") == nullptr) settings.addSetting("murderer", false); if (settings.getSettingByName("sheriff") == nullptr) @@ -64,6 +66,13 @@ class AutoRQ : public Module { Constraints::RelativeConstraint(1.0, "width"), Constraints::RelativeConstraint(1.0f, "height")); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, + L"Re-Q when you finish or die in a game\npls dont use while in a party", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Solo mode", textWidth * 6.9f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), @@ -76,6 +85,25 @@ class AutoRQ : public Module { toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, + L"Use /hub instead of /q", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"use /hub", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(11, toggleX, toggleY, this->settings.getSettingByName( + "hub")->value)) + this->settings.getSettingByName("hub")->value = !this->settings.getSettingByName( + "hub")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, L"Re-Q when you get a specific role (Hive)", textWidth * 6.9f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), diff --git a/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp b/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp index 3f3ba970..46e8e472 100644 --- a/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp +++ b/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp @@ -103,7 +103,7 @@ class AutoRQListener : public Listener { command_packet->InternalSource = true; SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - + } //std::cout << pkt->mName << std::endl; } } @@ -291,28 +291,48 @@ class AutoRQListener : public Listener { std::string textToCheckToSilence = "You are connected"; if (pkt->message.find(textToCheck) != std::string::npos && triggered) { - std::string server = pkt->message.replace(0, textToCheck.length(), ""); - std::regex pattern("\\d+"); - std::string name = std::regex_replace(server, pattern, ""); - FlarialGUI::Notify("Preparing Q: " + name); - std::thread t([name]() { - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + if(!module->settings.getSettingByName("hub")->value){ + std::string server = pkt->message.replace(0, textToCheck.length(), ""); + std::regex pattern("\\d+"); + std::string name = std::regex_replace(server, pattern, ""); + FlarialGUI::Notify("Preparing Q: " + name); + std::thread t([name]() { + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + + FlarialGUI::Notify("Executing command /q " + name); + + std::shared_ptr packet = SDK::createPacket(77); + auto* command_packet = reinterpret_cast(packet.get()); + command_packet->command = "/q " + name; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + }); + t.detach(); + triggered = false; + pkt->message = ""; + } + else{ + std::thread h([]() { + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + FlarialGUI::Notify("Executing command /hub"); + std::shared_ptr packet = SDK::createPacket(77); + auto* command_packet = reinterpret_cast(packet.get()); - FlarialGUI::Notify("Executing command /q " + name); + command_packet->command = "/hub"; - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - command_packet->command = "/q " + name; + command_packet->origin.type = CommandOriginType::Player; - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - }); - t.detach(); - triggered = false; - pkt->message = ""; + command_packet->InternalSource = true; + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + }); + h.detach(); + triggered = false; + pkt->message = ""; + } } else if (pkt->message.find(textToCheckToSilence) != std::string::npos) { event.cancel(); From 5720eeecf1a50e9f5b19153c82f48072158d965e Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Wed, 7 Aug 2024 20:30:50 +0300 Subject: [PATCH 080/240] Small fix after merge --- src/Client/Module/Modules/Zoom/Zoom.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/Zoom/Zoom.hpp b/src/Client/Module/Modules/Zoom/Zoom.hpp index 626b2d19..7976a444 100644 --- a/src/Client/Module/Modules/Zoom/Zoom.hpp +++ b/src/Client/Module/Modules/Zoom/Zoom.hpp @@ -9,7 +9,7 @@ class Zoom : public Module { public: - Zoom() : Module("Zoom", "Allows you to see distant places.", R"(\Flarial\assets\magnify.png)", "C") { + Zoom() : Module("Zoom", "Allows you to see distant places.", IDR_MAGNIFY_PNG, "C") { Module::setup(); From 8a92b8fff80d85bdbfd32678cc3a20f061b5b244 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 8 Aug 2024 00:38:10 +0300 Subject: [PATCH 081/240] Remove workflow --- .github/workflows/build.yml | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index d73a06e2..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Build Flarial - -on: - push: - branches: - - main - workflow_dispatch: - -jobs: - build: - runs-on: windows-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Run build.bat - run: | - call .\build.bat - shell: cmd - - - name: Upload DLL - uses: actions/upload-artifact@v2 - with: - name: FlarialDLL - path: "Release/Flarial.dll" From b42d44b10b9926095d596158af08421f90c61d50 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 8 Aug 2024 00:57:21 +0300 Subject: [PATCH 082/240] getTexture hook and event --- src/Client/Events/EventHandler.cpp | 8 +++++++ src/Client/Events/EventHandler.hpp | 4 +++- src/Client/Events/Listener.hpp | 4 +++- src/Client/Events/Render/GetTextureEvent.hpp | 16 ++++++++++++++ .../Render/TextureGroup_getTextureHook.cpp | 20 ++++++++++++++++++ .../Render/TextureGroup_getTextureHook.hpp | 21 +++++++++++++++++++ src/Client/Hook/Manager.cpp | 2 ++ src/SDK/Client/Render/BedrockTextureData.hpp | 1 - src/SDK/Client/Render/ResourceLocation.hpp | 2 ++ src/Utils/Memory/Game/Sig/SigInit.cpp | 4 ++-- 10 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 src/Client/Events/Render/GetTextureEvent.hpp create mode 100644 src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp create mode 100644 src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.hpp diff --git a/src/Client/Events/EventHandler.cpp b/src/Client/Events/EventHandler.cpp index 14dd1018..8d5ce902 100644 --- a/src/Client/Events/EventHandler.cpp +++ b/src/Client/Events/EventHandler.cpp @@ -239,3 +239,11 @@ void EventHandler::onRaknetTick(RaknetTickEvent &event) { listener->onRaknetTick(event); } } + +void EventHandler::onGetTexture(GetTextureEvent &event) { + if (Client::disable) return; + if (!ModuleManager::initialized) return; + for (Listener *&listener: listeners) { + listener->onGetTexture(event); + } +} \ No newline at end of file diff --git a/src/Client/Events/EventHandler.hpp b/src/Client/Events/EventHandler.hpp index 81a62057..533efbdb 100644 --- a/src/Client/Events/EventHandler.hpp +++ b/src/Client/Events/EventHandler.hpp @@ -14,6 +14,7 @@ #include "Render/FogColorEvent.hpp" #include "Render/HurtColorEvent.hpp" #include "Render/GammaEvent.hpp" +#include "Render/GetTextureEvent.hpp" class EventHandler { @@ -66,6 +67,7 @@ class EventHandler { static void onRaknetTick(RaknetTickEvent &event); - static void unregisterAll(); + static void onGetTexture(GetTextureEvent &event); + static void unregisterAll(); }; \ No newline at end of file diff --git a/src/Client/Events/Listener.hpp b/src/Client/Events/Listener.hpp index 5bf85ad5..71274913 100644 --- a/src/Client/Events/Listener.hpp +++ b/src/Client/Events/Listener.hpp @@ -17,6 +17,7 @@ #include "Render/DrawImageEvent.hpp" #include "Render/SetTopScreenNameEvent.hpp" #include "Game/RaknetTickEvent.hpp" +#include "Render/GetTextureEvent.hpp" class Listener { public: @@ -58,6 +59,7 @@ class Listener { virtual void onRaknetTick(RaknetTickEvent &event) {}; - virtual void onUnregister() {}; + virtual void onGetTexture(GetTextureEvent &event) {}; + virtual void onUnregister() {}; }; diff --git a/src/Client/Events/Render/GetTextureEvent.hpp b/src/Client/Events/Render/GetTextureEvent.hpp new file mode 100644 index 00000000..2442515f --- /dev/null +++ b/src/Client/Events/Render/GetTextureEvent.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include + +#include "../../../SDK/Client/Render/ResourceLocation.hpp" +#include "../Cancellable.hpp" +#include "../Event.hpp" + +class GetTextureEvent : public Event, Cancellable { +private: + ResourceLocation* location; +public: + explicit GetTextureEvent(ResourceLocation* resourceLocation) { + location = resourceLocation; + } +}; \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp b/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp new file mode 100644 index 00000000..9536ff16 --- /dev/null +++ b/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp @@ -0,0 +1,20 @@ +#include "TextureGroup_getTextureHook.hpp" +#include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" +#include "../../../Events/Render/GetTextureEvent.hpp" +#include "../../../Events/EventHandler.hpp" + +TextureGroup_getTextureHook::TextureGroup_getTextureHook() : Hook("TextureGroup_getTexture", GET_SIG("mce::TextureGroup::getTexture")) {} + +void TextureGroup_getTextureHook::enableHook() { + this->autoHook((void *) TextureGroup_getTextureCallback, (void **) &funcOriginal); +} + +TexturePtr* TextureGroup_getTextureHook::TextureGroup_getTextureCallback(TextureGroup *_this, TexturePtr *result, + ResourceLocation *location, bool forceReload, + void *a5, int a6, void *a7) { + + auto event = GetTextureEvent(location); + EventHandler::onGetTexture(event); + + return funcOriginal(_this, result, location, forceReload, a5, a6, a7); +} \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.hpp b/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.hpp new file mode 100644 index 00000000..5670c0a3 --- /dev/null +++ b/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include +#include "../Hook.hpp" +#include "../../../../SDK/Client/Render/TextureGroup.hpp" +#include "../../../../SDK/Client/Render/ResourceLocation.hpp" +#include "../../../../SDK/Client/Render/TexturePtr.hpp" + +class TextureGroup_getTextureHook : public Hook { +private: + static TexturePtr *TextureGroup_getTextureCallback(TextureGroup* _this, TexturePtr* result, ResourceLocation* location, bool forceReload, void* a5, int a6, void* a7); + +public: + typedef TexturePtr *(__thiscall *original)(TextureGroup* _this, TexturePtr* result, ResourceLocation* location, bool forceReload, void* a5, int a6, void* a7); + + static inline original funcOriginal = nullptr; + + TextureGroup_getTextureHook(); + + void enableHook() override; +}; diff --git a/src/Client/Hook/Manager.cpp b/src/Client/Hook/Manager.cpp index 61dfe51a..549b98da 100644 --- a/src/Client/Hook/Manager.cpp +++ b/src/Client/Hook/Manager.cpp @@ -15,6 +15,7 @@ #include "Hooks/Visual/OverworldFogColorHook.hpp" #include "Hooks/Visual/TimeChangerHook.hpp" #include "Hooks/Game/getSensHook.hpp" +#include "Hooks/Render/TextureGroup_getTextureHook.hpp" //#include "Hooks/Game/RenderItemGroup.hpp" //#include "Hooks/Game/getCurrentSwingDuration.hpp" @@ -45,6 +46,7 @@ void HookManager::initialize() { if (!Client::settings.getSettingByName("killdx")->value) hooks.push_back(new CommandListHook()); + hooks.push_back(new TextureGroup_getTextureHook()); hooks.push_back(new getViewPerspectiveHook()); // hooks.push_back(new RenderActorHook()); hooks.push_back(new RaknetTickHook()); diff --git a/src/SDK/Client/Render/BedrockTextureData.hpp b/src/SDK/Client/Render/BedrockTextureData.hpp index 8b6cb122..dfabeb4d 100644 --- a/src/SDK/Client/Render/BedrockTextureData.hpp +++ b/src/SDK/Client/Render/BedrockTextureData.hpp @@ -1,6 +1,5 @@ #pragma once -#include "TexturePtr.hpp" #include "Textures/mceTextureDescription.hpp" #include "Textures/ClientTexture.hpp" #include "Textures/IsMissingTexture.hpp" diff --git a/src/SDK/Client/Render/ResourceLocation.hpp b/src/SDK/Client/Render/ResourceLocation.hpp index 3bbf789b..7339d77f 100644 --- a/src/SDK/Client/Render/ResourceLocation.hpp +++ b/src/SDK/Client/Render/ResourceLocation.hpp @@ -24,6 +24,8 @@ class ResourceLocation { uint64_t pathHash{}; uint64_t fullHash{}; + ResourceLocation() = default; + ResourceLocation(const std::string& filePath, bool external) { this->filePath = filePath; if (external) diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index db00079f..614046ee 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -203,9 +203,9 @@ void SigInit::init2030() { ADD_SIG("Tessellator::resetTransform", "80 B9 ? ? ? ? ? 4C 8B C1 75"); ADD_SIG("MeshHelper::renderImmediately", "48 89 5C 24 ? 48 89 74 24 ? 57 48 81 EC ? ? ? ? 49 8B F8 48 8B DA 48 8B F1 80 BA"); - ADD_SIG("MinecraftUIRenderContext::getTexture", "40 53 56 57 48 83 EC 70 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 60 48 8B DA 48 89"); + ADD_SIG("MinecraftUIRenderContext::getTexture", "40 53 56 57 48 83 EC 70 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 60 48 8B DA 48 89"); - ADD_SIG("mce::TextureGroup::getTexture", "40 53 56 57 48 83 EC 70 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 60 48 8B DA 48 89"); + ADD_SIG("mce::TextureGroup::getTexture", "40 55 53 56 57 41 54 41 56 41 57 48 8D 6C 24 E9 48 81 EC 00 01 00 00 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 07"); ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 41 0F B6 F0"); From bcaca40bd54ea3def44c3d419a32af93e17f339a Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Thu, 8 Aug 2024 01:07:30 +0300 Subject: [PATCH 083/240] getLocalPlayer vtable index through stable sig --- src/SDK/Client/Core/ClientInstance.cpp | 12 ++++++++++-- src/Utils/Memory/Game/Offset/OffsetInit.cpp | 3 --- src/Utils/Memory/Game/Sig/SigInit.cpp | 2 ++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/SDK/Client/Core/ClientInstance.cpp b/src/SDK/Client/Core/ClientInstance.cpp index e4fccaee..3e969418 100644 --- a/src/SDK/Client/Core/ClientInstance.cpp +++ b/src/SDK/Client/Core/ClientInstance.cpp @@ -3,8 +3,16 @@ #include LocalPlayer *ClientInstance::getLocalPlayer() { - static int off = GET_OFFSET("ClientInstance::getLocalPlayer"); - return Memory::CallVFuncI(off, this); + // Indig0r + static uintptr_t indexRef; + + if (indexRef == 0) { + indexRef = Memory::findSig(GET_SIG("ClientInstance::getLocalPlayerIndex")); + } + + int index = *reinterpret_cast(indexRef + 9) / 8; + + return Memory::CallVFuncI(index, this); } BlockSource *ClientInstance::getBlockSource() { diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index 89dee8fa..d2e7ee8b 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -46,7 +46,6 @@ void OffsetInit::init2070() { Logger::debug("[Offsets] Loading offsets for 1.20.7X"); ADD_OFFSET("ClientInstance::getBlockSource", 28); - ADD_OFFSET("ClientInstance::getLocalPlayer", 29); ADD_OFFSET("Actor::hurtTime", 0x214); ADD_OFFSET("Actor::level", 0x258); @@ -93,7 +92,6 @@ void OffsetInit::init2050() { Logger::debug("[Offsets] Loading offsets for 1.20.5X"); ADD_OFFSET("ClientInstance::getBlockSource", 27); - ADD_OFFSET("ClientInstance::getLocalPlayer", 28); ADD_OFFSET("Actor::hurtTime", 0x22C); ADD_OFFSET("Actor::level", 0x288); @@ -151,7 +149,6 @@ void OffsetInit::init2030() { ADD_OFFSET("Inventory::getItem", 5); ADD_OFFSET("ClientInstance::getBlockSource", 26); - ADD_OFFSET("ClientInstance::getLocalPlayer", 27); ADD_OFFSET("ClientInstance::levelRenderer", 0xE0); ADD_OFFSET("ClientInstance::getFovX", 0x6F8); diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 614046ee..47673971 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -210,4 +210,6 @@ void SigInit::init2030() { ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 41 0F B6 F0"); ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); + + ADD_SIG("ClientInstance::getLocalPlayerIndex", "49 8B 00 49 8B C8 48 8B 80 ? ? ? ? FF 15 ? ? ? ? 48 85 C0 0F 84 ? ? ? ? 0F"); } From 62e7724d524f6fd8c3f9bf48baacd7a6395f4651 Mon Sep 17 00:00:00 2001 From: EpiclyRaspberry Date: Thu, 8 Aug 2024 06:21:11 +0800 Subject: [PATCH 084/240] removed build.yml, it fails anyway --- .github/workflows/build.yml | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index d73a06e2..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Build Flarial - -on: - push: - branches: - - main - workflow_dispatch: - -jobs: - build: - runs-on: windows-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Run build.bat - run: | - call .\build.bat - shell: cmd - - - name: Upload DLL - uses: actions/upload-artifact@v2 - with: - name: FlarialDLL - path: "Release/Flarial.dll" From c0a6b70b7bb1e1c3918cbfdc423998f6f134b50b Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 9 Aug 2024 14:52:31 +0300 Subject: [PATCH 085/240] Break Indicator improvements --- .../BlockBreakIndicator.hpp | 20 +++++++++---------- .../BlockBreakIndicatorListener.hpp | 19 ++++++++++++++++-- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicator.hpp b/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicator.hpp index ce2d5a53..6d7faf10 100644 --- a/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicator.hpp +++ b/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicator.hpp @@ -9,8 +9,6 @@ class BlockBreakIndicator : public Module { public: - - BlockBreakIndicator() : Module("Break Progress", "Visual indicator to show the progress\nof breaking a block.", IDR_BLOCK_BREAK_INDICATOR_PNG, "") { Module::setup(); @@ -358,10 +356,6 @@ class BlockBreakIndicator : public Module { void normalRender(int index, std::string& value) override { if(SDK::getCurrentScreen() != "hud_screen") return; - // TODO: needs a logic where if you stopped holding left button it wont show progress if its higher than 0% (if u resetted mining you start at 0%) - if (!CPSListener::GetLeftHeld()) { - value = "0%"; - } if (settings.getSettingByName("pbmode")->value) { if (settings.getSettingByName("onlyShowWhileBreaking")->value && value == "0%") return; @@ -444,11 +438,15 @@ class BlockBreakIndicator : public Module { rounde.x, rounde.x)); FlarialGUI::RoundedRect(coord.x, coord.y, bgColor, pbwidth, pbheight, rounde.x, rounde.y); - if (orientation == "Horizontal") - FlarialGUI::RoundedRect(coord.x, coord.y, barFill, currentHeight, pbheight, rounde.x, rounde.y); - else - FlarialGUI::RoundedRect(coord.x, coord.y + pbheight - currentHeight, barFill, pbwidth, currentHeight, - rounde.x, rounde.y); + + if(currentHeight > 0.5f) { + if (orientation == "Horizontal") + FlarialGUI::RoundedRect(coord.x, coord.y, barFill, currentHeight, pbheight, rounde.x, rounde.y); + else + FlarialGUI::RoundedRect(coord.x, coord.y + pbheight - currentHeight, barFill, pbwidth, + currentHeight, + rounde.x, rounde.y); + } if (this->settings.getSettingByName("border")->value) FlarialGUI::RoundedHollowRect( diff --git a/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp b/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp index 02ac0acc..c4a099e5 100644 --- a/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp +++ b/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp @@ -16,14 +16,29 @@ class BlockBreakIndicatorListener : public Listener { Module *module; + float lastProgress = 0.0f; + float currentProgress = 0.0f; + void onRender(RenderEvent &event) override { if ( SDK::hasInstanced && SDK::clientInstance != nullptr && SDK::clientInstance->getLocalPlayer() != nullptr && SDK::clientInstance->getLocalPlayer()->getGamemode() != nullptr ) { - auto progress_value = (*SDK::clientInstance->getLocalPlayer()->getGamemode()).getLastBreakProgress() *100; - std::string progress = std::format("{:.0f}%", progress_value); + + if (CPSListener::GetLeftHeld()) { + auto progress= (*SDK::clientInstance->getLocalPlayer()->getGamemode()).getLastBreakProgress() * 100; + if(lastProgress != progress) { + if(lastProgress < progress || progress == 0.f) { + currentProgress = progress; + } + lastProgress = progress; + } + } else { + currentProgress = 0.0f; + } + + std::string progress = std::format("{:.0f}%", currentProgress); this->module->normalRender(16, progress); } } From a41f97cad9a2decc2a7c9a162b71d4ab355c3345 Mon Sep 17 00:00:00 2001 From: Ashank Sundaram Date: Sat, 10 Aug 2024 14:32:47 +0800 Subject: [PATCH 086/240] Update README.md --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index ca5d97b1..abe042b0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,32 @@ +# Flarial Client + +Welcome to **Flarial Client**, the ultimate modded client designed specifically for Minecraft Bedrock Edition (MCBE). Flarial Client enhances your gameplay with a suite of tools and features that optimize performance, improve visual quality, and provide a smoother gaming experience. + +## Installation Options + +Flarial Client is available in two forms: + +### Flarial Launcher (Recommended) +- A user-friendly launcher that manages Flarial and other MCBE clients. +- Includes Discord integration for community and support. +- Offers additional Minecraft management features. + +### Standalone DLL +- A minimal, lightweight version for advanced users. +- Requires an external injector to set up and run. + +## Supported Platforms + +- **Operating System:** Windows 10/11 (64-bit processors only) +- **Minecraft Version:** Compatible with MCBE versions 1.20 and above. + +## Troubleshooting + +If you encounter issues, check out our [FAQ](https://discord.gg/flarial-community-1049946152092586054) or join our community on [Discord](https://discord.gg/flarial-community-1049946152092586054). We’re here to help! + +--- +## Build Guide + ### Prerequisites: 1. **CMake**: Ensure CMake is installed on your system. You can download it from [cmake.org](https://cmake.org/download/) and follow the installation instructions for your operating system. From 220031dc8730857e770eb19fd6dd20eacdb4dcdf Mon Sep 17 00:00:00 2001 From: Ashank Sundaram Date: Sat, 10 Aug 2024 14:35:30 +0800 Subject: [PATCH 087/240] Create FUNDING.yml --- .github/FUNDING.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..db693f9e --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: flarialmc +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From 0c78d32050370bb0c46f0f11b2ffb909ecf073c0 Mon Sep 17 00:00:00 2001 From: Ashank Sundaram Date: Sat, 10 Aug 2024 14:39:51 +0800 Subject: [PATCH 088/240] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index abe042b0..d1a2444c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Flarial Client - Welcome to **Flarial Client**, the ultimate modded client designed specifically for Minecraft Bedrock Edition (MCBE). Flarial Client enhances your gameplay with a suite of tools and features that optimize performance, improve visual quality, and provide a smoother gaming experience. +## Support us on Ko-Fi! https://ko-fi.com/flarialmc + ## Installation Options From 26bad72306a22f2a8bb977da9ab329e93781efd3 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 9 Aug 2024 14:55:43 +0300 Subject: [PATCH 089/240] Some more texture stuff --- src/Client/Events/Render/GetTextureEvent.hpp | 4 ++-- src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp | 2 +- src/SDK/Client/Render/BedrockTexture.hpp | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Client/Events/Render/GetTextureEvent.hpp b/src/Client/Events/Render/GetTextureEvent.hpp index 2442515f..b028dace 100644 --- a/src/Client/Events/Render/GetTextureEvent.hpp +++ b/src/Client/Events/Render/GetTextureEvent.hpp @@ -7,9 +7,9 @@ #include "../Event.hpp" class GetTextureEvent : public Event, Cancellable { -private: - ResourceLocation* location; public: + ResourceLocation* location; + explicit GetTextureEvent(ResourceLocation* resourceLocation) { location = resourceLocation; } diff --git a/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp b/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp index 9536ff16..3ebd37fc 100644 --- a/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp +++ b/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp @@ -16,5 +16,5 @@ TexturePtr* TextureGroup_getTextureHook::TextureGroup_getTextureCallback(Texture auto event = GetTextureEvent(location); EventHandler::onGetTexture(event); - return funcOriginal(_this, result, location, forceReload, a5, a6, a7); + return funcOriginal(_this, result, event.location, forceReload, a5, a6, a7); } \ No newline at end of file diff --git a/src/SDK/Client/Render/BedrockTexture.hpp b/src/SDK/Client/Render/BedrockTexture.hpp index 4338f873..71edce3e 100644 --- a/src/SDK/Client/Render/BedrockTexture.hpp +++ b/src/SDK/Client/Render/BedrockTexture.hpp @@ -15,12 +15,11 @@ struct BedrockTexture { void unload() { if(bedrockTextureData != nullptr) { - bedrockTextureData.reset(); - int newState = bedrockTextureData->textureLoadState & ~TextureLoadState::LoadedBit; bedrockTextureData->textureLoadState = static_cast(newState); bedrockTextureData->isMissingTexture = IsMissingTexture::No; + bedrockTextureData.reset(); } } From 83fb21b9926ff386fa7e846301c1e11b536022ac Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Mon, 12 Aug 2024 20:57:24 +0300 Subject: [PATCH 090/240] Small changes --- .../Modules/ArmorHUD/ArmorHUDListener.hpp | 19 +++++++++---------- .../Modules/ArrowCounter/ArrowListener.hpp | 2 +- .../InventoryHUD/InventoryHUDListener.hpp | 4 ++-- .../Module/Modules/PotCounter/PotListener.hpp | 2 +- src/SDK/Client/Actor/Player.hpp | 2 +- src/SDK/Client/Container/PlayerInventory.hpp | 10 ++++++++-- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp index 1617f0c0..26d9e7a8 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp @@ -28,7 +28,7 @@ class ArmorHUDListener : public Listener { {0,0} }; // TODO: delete testing variables (or adjust and delete) - Vec2 testOffset = Vec2{4,0}; + Vec2 testOffset = Vec2{0,0}; float testSpacing = 15; // TODO: Make it look better @@ -55,13 +55,12 @@ class ArmorHUDListener : public Listener { auto vertical = module->settings.getSettingByName("vertical")->value; float spacing = testSpacing; - spacing = PositionUtils::getScaledPos(Vec2{spacing, spacing}).x; if (SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory->getItem( SDK::clientInstance->getLocalPlayer()->getSupplies()->SelectedSlot)->getItem() != nullptr) { - auto currentItem = SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory->getItem( - SDK::clientInstance->getLocalPlayer()->getSupplies()->SelectedSlot); + auto currentItem = SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->getSelectedSlot()); std::string text; @@ -105,12 +104,12 @@ class ArmorHUDListener : public Listener { float xoffset = 0.0f; float yoffset = 0.0f; - if (module->settings.getSettingByName("vertical")->value) xoffset += spacing; + if (vertical) xoffset += spacing; else yoffset += spacing; for (int i = 1; i < 5; i++) { - if (module->settings.getSettingByName("vertical")->value) ymodifier += spacing; + if (vertical) ymodifier += spacing; else xmodifier += spacing; @@ -226,11 +225,11 @@ class ArmorHUDListener : public Listener { if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { - if (SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory->getItem( - SDK::clientInstance->getLocalPlayer()->getSupplies()->SelectedSlot)->getItem() != + if (SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->getSelectedSlot())->getItem() != nullptr) { - auto item = SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory->getItem( - SDK::clientInstance->getLocalPlayer()->getSupplies()->SelectedSlot); + auto item = SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->getSelectedSlot()); auto maxDamage = item->getMaxDamage(); auto durabilityLeft = maxDamage - item->getDamageValue(); diff --git a/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp b/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp index 8ebe862c..4f00e2d7 100644 --- a/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp +++ b/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp @@ -24,7 +24,7 @@ class ArrowListener : public Listener { if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { auto arrowsCount = 0; - auto inventory = SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory; + auto inventory = SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory(); if(inventory == nullptr) return; auto offhandItem = SDK::clientInstance->getLocalPlayer()->getOffhandSlot(); diff --git a/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp b/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp index c5301739..1c4e37ed 100644 --- a/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp +++ b/src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp @@ -96,11 +96,11 @@ class InventoryHUDListener : public Listener { int counter = 0; for (int i = 9; i < 36; i++) { - if (SDK::clientInstance->getLocalPlayer()->getSupplies()->getinventory()->getItem(i)->getItem() != nullptr) { + if (SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem(i)->getItem() != nullptr) { //durabilities[i][1] = SDK::clientInstance->getLocalPlayer()->getArmor(i)->getMaxDamage(); //durabilities[i][0] = durabilities[i][1] - SDK::clientInstance->getLocalPlayer()->getArmor(i)->getDamageValue(); barc.itemRenderer->renderGuiItemNew(&barc, - SDK::clientInstance->getLocalPlayer()->getSupplies()->getinventory()->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( i), 0, scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, module->settings.getSettingByName( diff --git a/src/Client/Module/Modules/PotCounter/PotListener.hpp b/src/Client/Module/Modules/PotCounter/PotListener.hpp index cd419b17..a644b028 100644 --- a/src/Client/Module/Modules/PotCounter/PotListener.hpp +++ b/src/Client/Module/Modules/PotCounter/PotListener.hpp @@ -24,7 +24,7 @@ class PotListener : public Listener { if (SDK::clientInstance->getLocalPlayer() != nullptr) { auto potsCount = 0; if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { - auto inventory = SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory; + auto inventory = SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory(); if (inventory != nullptr) { for (int i = 0; i < 36; i++) { diff --git a/src/SDK/Client/Actor/Player.hpp b/src/SDK/Client/Actor/Player.hpp index 67d6418b..7129df96 100644 --- a/src/SDK/Client/Actor/Player.hpp +++ b/src/SDK/Client/Actor/Player.hpp @@ -11,7 +11,7 @@ class Player : public Actor { return hat::member_at(this, GET_OFFSET("Player::playerInventory")); } - std::string getPlayerName() { + std::string& getPlayerName() { return hat::member_at(this, GET_OFFSET("Player::playerName")); } diff --git a/src/SDK/Client/Container/PlayerInventory.hpp b/src/SDK/Client/Container/PlayerInventory.hpp index 6a0ddca1..1ca8c576 100644 --- a/src/SDK/Client/Container/PlayerInventory.hpp +++ b/src/SDK/Client/Container/PlayerInventory.hpp @@ -2,9 +2,15 @@ #include "../../src/Utils/Memory/Memory.hpp" #include "Inventory.hpp" +#include class PlayerInventory { public: - BUILD_ACCESS(this, int, SelectedSlot, GET_OFFSET("PlayerInventory::SelectedSlot")); - BUILD_ACCESS(this, Inventory*, inventory, GET_OFFSET("PlayerInventory::inventory")); + int getSelectedSlot() { + return hat::member_at(this, GET_OFFSET("PlayerInventory::SelectedSlot")); + } + + Inventory *getInventory() { + return hat::member_at(this, GET_OFFSET("PlayerInventory::inventory")); + } }; \ No newline at end of file From 940b4058c1a9a9ca43b43801c0c7ea707af243bc Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Mon, 12 Aug 2024 20:58:01 +0300 Subject: [PATCH 091/240] Multiversion fix --- src/Utils/Memory/Game/Offset/OffsetInit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index d2e7ee8b..779d7209 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -157,7 +157,7 @@ void OffsetInit::init2030() { ADD_OFFSET("Packet::getId", 1); - ADD_OFFSET("Actor::hurtTime", 0x22C); // ?hurtEffects@Mob@@UEAAXAEBVActorDamageSource@@M_N1@Z Mob::hurtEffects 2nd after Actor::getHealth(void) + ADD_OFFSET("Actor::hurtTime", 0x204); // ?hurtEffects@Mob@@UEAAXAEBVActorDamageSource@@M_N1@Z Mob::hurtEffects 2nd after Actor::getHealth(void) ADD_OFFSET("Actor::level", 0x260); ADD_OFFSET("Actor::categories", 0x298); ADD_OFFSET("Actor::baseTickVft", 44); From 4108a0add717aacbdd579d2a714d13fc359bac5a Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Mon, 12 Aug 2024 21:02:25 +0300 Subject: [PATCH 092/240] Some positioning fixes --- src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp | 9 +++++++-- src/Utils/Render/PositionUtils.cpp | 9 +++++++-- src/Utils/Render/PositionUtils.hpp | 4 +++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp index 26d9e7a8..36dfef2e 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp @@ -56,8 +56,13 @@ class ArmorHUDListener : public Listener { float spacing = testSpacing; - if (SDK::clientInstance->getLocalPlayer()->getSupplies()->inventory->getItem( - SDK::clientInstance->getLocalPlayer()->getSupplies()->SelectedSlot)->getItem() != + auto scaledPos = PositionUtils::getCustomScreenScaledPos(Vec2{spacing, spacing}, + module->settings.getSettingByName( + "uiscale")->value); + spacing = vertical ? scaledPos.y : scaledPos.x; + + if (SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->getSelectedSlot())->getItem() != nullptr) { auto currentItem = SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( SDK::clientInstance->getLocalPlayer()->getSupplies()->getSelectedSlot()); diff --git a/src/Utils/Render/PositionUtils.cpp b/src/Utils/Render/PositionUtils.cpp index 65aed11c..3bacd6f8 100644 --- a/src/Utils/Render/PositionUtils.cpp +++ b/src/Utils/Render/PositionUtils.cpp @@ -12,6 +12,11 @@ Vec2 PositionUtils::getScaledPos(Vec2 pos) { return pos.mul(uiScale); } -Vec2 PositionUtils::getCustomScaledPos(Vec2 pos, float scale) { - return getScaledPos(pos).mul(scale); +Vec2 PositionUtils::getScreenScaledPos(Vec2 pos) { + Vec2 uiScale = getUIScale(); + return pos.div(uiScale); +} + +Vec2 PositionUtils::getCustomScreenScaledPos(Vec2 pos, float scale) { + return getScreenScaledPos(pos).mul(scale); } diff --git a/src/Utils/Render/PositionUtils.hpp b/src/Utils/Render/PositionUtils.hpp index 0b39ac30..30a51f28 100644 --- a/src/Utils/Render/PositionUtils.hpp +++ b/src/Utils/Render/PositionUtils.hpp @@ -5,7 +5,9 @@ class PositionUtils { public: static Vec2 getUIScale(); + static Vec2 getScreenScale(); static Vec2 getScaledPos(Vec2 pos); - static Vec2 getCustomScaledPos(Vec2 pos, float scale); + static Vec2 getScreenScaledPos(Vec2 pos); + static Vec2 getCustomScreenScaledPos(Vec2 pos, float scale); }; From 67ef676c0c9b1ae5d61f75c6cc8f4be3b73f3242 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 15 Aug 2024 17:19:21 +0600 Subject: [PATCH 093/240] ok --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 351a3578..d6136f1b 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -344,6 +344,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI RenderEvent event{}; event.RTV = mainRenderTargetView; + Blur::RenderBlur(event.RTV, 3, 10.35f); EventHandler::onRender(event); @@ -674,10 +675,11 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() ID3D11Texture2D* buffer2D = nullptr; + HRESULT hr; D3D11Resources[currentBitmap]->QueryInterface(IID_PPV_ARGS(&buffer2D)); + if (FAILED(hr)) std::cout << "Failed to create stage texture: " << std::hex << hr << std::endl; ID3D11DeviceContext* deviceContext = context; - HRESULT hr; D3D11_TEXTURE2D_DESC desc; buffer2D->GetDesc(&desc); From 9cde48f88a56e0f39d80edd0ac283b6d6fcc2c49 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 12:57:05 +0300 Subject: [PATCH 094/240] Crash fixes --- src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp | 1 + .../Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp b/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp index 4f00e2d7..acd236d4 100644 --- a/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp +++ b/src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp @@ -22,6 +22,7 @@ class ArrowListener : public Listener { if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { + if(SDK::getCurrentScreen() != "hud_screen") return; auto arrowsCount = 0; auto inventory = SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory(); diff --git a/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp b/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp index c4a099e5..6d7cade8 100644 --- a/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp +++ b/src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp @@ -26,6 +26,8 @@ class BlockBreakIndicatorListener : public Listener { SDK::clientInstance->getLocalPlayer()->getGamemode() != nullptr ) { + if(SDK::getCurrentScreen() != "hud_screen") return; + if (CPSListener::GetLeftHeld()) { auto progress= (*SDK::clientInstance->getLocalPlayer()->getGamemode()).getLastBreakProgress() * 100; if(lastProgress != progress) { From 2dadf4d32bd2076f3224e8ee8c1bd90099871da0 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 13:00:50 +0300 Subject: [PATCH 095/240] ActorDataFlagComponent --- .../Module/Modules/Sprint/SprintListener.hpp | 12 +++---- src/SDK/Client/Actor/Actor.cpp | 36 +++++++++++++++++-- src/SDK/Client/Actor/Actor.hpp | 9 ++++- .../Components/ActorDataFlagComponent.hpp | 7 ++++ 4 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 src/SDK/Client/Actor/Components/ActorDataFlagComponent.hpp diff --git a/src/Client/Module/Modules/Sprint/SprintListener.hpp b/src/Client/Module/Modules/Sprint/SprintListener.hpp index fecd3618..f372da44 100644 --- a/src/Client/Module/Modules/Sprint/SprintListener.hpp +++ b/src/Client/Module/Modules/Sprint/SprintListener.hpp @@ -28,22 +28,22 @@ class SprintListener : public Listener { if (SDK::clientInstance->getLocalPlayer() != nullptr) { std::string text = "Standing"; - if (SDK::clientInstance->getLocalPlayer()->getActorFlag(1)) { + if (SDK::clientInstance->getLocalPlayer()->getActorFlag(ActorFlags::FLAG_SNEAKING)) { text = "Sneaking"; this->module->normalRender(5, text); - } else if (SDK::clientInstance->getLocalPlayer()->getActorFlag(57)) { + } else if (SDK::clientInstance->getLocalPlayer()->getActorFlag(ActorFlags::FLAG_SWIMMING)) { text = "Swimming"; this->module->normalRender(5, text); - } else if (SDK::clientInstance->getLocalPlayer()->getActorFlag(32)) { + } else if (SDK::clientInstance->getLocalPlayer()->getActorFlag(ActorFlags::FLAG_GLIDING)) { text = "Gliding"; this->module->normalRender(5, text); - } else if (SDK::clientInstance->getLocalPlayer()->getActorFlag(76)) { + } else if (SDK::clientInstance->getLocalPlayer()->getActorFlag(ActorFlags::FLAG_SLEEPING)) { text = "Sleeping"; this->module->normalRender(5, text); - } else if (SDK::clientInstance->getLocalPlayer()->getActorFlag(3)) { + } else if (SDK::clientInstance->getLocalPlayer()->getActorFlag(ActorFlags::FLAG_SPRINTING)) { text = "Sprinting"; this->module->normalRender(5, text); - } else if (SDK::clientInstance->getLocalPlayer()->getActorFlag(34)) { + } else if (SDK::clientInstance->getLocalPlayer()->getActorFlag(FLAG_MOVING)) { text = "Walking"; this->module->normalRender(5, text); } else { diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index 4573a947..9c689c21 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -2,6 +2,7 @@ #include "Components/ActorGameTypeComponent.hpp" #include "Components/AABBShapeComponent.hpp" #include "Components/RuntimeIDComponent.hpp" +#include "Components/ActorDataFlagComponent.hpp" // TODO add comments to all components, replace their sigs with simpler ones ? marioCST: use entt's try_get func in EntityContext instead of using sigs, there are no simpler sigs @@ -32,6 +33,11 @@ int16_t Actor::getHurtTime() { return hat::member_at(this, GET_OFFSET("Actor::hurtTime")); } +void Actor::setHurtTime(int16_t hurtTime) { + int16_t& hurttime = hat::member_at(this, GET_OFFSET("Actor::hurtTime")); + hurttime = hurtTime; +} + Level *Actor::getLevel() { return hat::member_at(this, GET_OFFSET("Actor::level")); } @@ -54,7 +60,31 @@ bool Actor::canSee(const Actor& actor) { return canSee(this, actor); } -bool Actor::getActorFlag(int flag) { +uint64_t Actor::getRuntimeID() { + return this->GetEntityContextV1_20_50()->id; +} + +ActorDataFlagComponent* Actor::getActorDataFlagComponent() { + if(!WinrtUtils::check(20, 80)) return nullptr; + static uintptr_t sig; + + if (sig == NULL) { + sig = Memory::findSig(GET_SIG("Actor::getActorDataFlagComponent")); + auto size = Utils::CountBytes(GET_SIG("tryGetPrefix2")); + sig = sig - size; + } + + return tryGet(sig); +} + +bool Actor::getActorFlag(ActorFlags flag) { + if(WinrtUtils::check(21, 20)) { + auto actorDataFlagComponent = Actor::getActorDataFlagComponent(); + + if(!actorDataFlagComponent) return false; + + return actorDataFlagComponent->flags[flag]; + } static int off = GET_OFFSET("Actor::getActorFlag"); return Memory::CallVFuncI(off, this, flag); } @@ -68,7 +98,7 @@ SimpleContainer* Actor::getArmorContainer() { static uintptr_t sig; if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getActorEquipmentComponent")); // 8B DA BA 2E CD 8B 46 + sig = Memory::findSig(GET_SIG("Actor::getActorEquipmentComponent")); auto size = Utils::CountBytes(GET_SIG("tryGetPrefix2")); sig = sig - size; } @@ -81,7 +111,7 @@ SimpleContainer* Actor::getOffhandContainer() { static uintptr_t sig; if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getActorEquipmentComponent")); // 8B DA BA 2E CD 8B 46 + sig = Memory::findSig(GET_SIG("Actor::getActorEquipmentComponent")); auto size = Utils::CountBytes(GET_SIG("tryGetPrefix2")); sig = sig - size; } diff --git a/src/SDK/Client/Actor/Actor.hpp b/src/SDK/Client/Actor/Actor.hpp index f4f383ab..6da3f40b 100644 --- a/src/SDK/Client/Actor/Actor.hpp +++ b/src/SDK/Client/Actor/Actor.hpp @@ -15,6 +15,7 @@ #include "Components/ActorGameTypeComponent.hpp" #include "Components/AABBShapeComponent.hpp" #include "Components/RuntimeIDComponent.hpp" +#include "Components/ActorDataFlagComponent.hpp" enum ActorFlags { @@ -185,7 +186,7 @@ class Actor { MoveInputComponent *getMoveInputHandler(); - bool getActorFlag(int flag); + bool getActorFlag(ActorFlags flag); bool canSee(const Actor& actor); @@ -216,4 +217,10 @@ class Actor { RuntimeIDComponent *getRuntimeIDComponent(); bool isValidAABB(); + + uint64_t getRuntimeID(); + + ActorDataFlagComponent *getActorDataFlagComponent(); + + void setHurtTime(int16_t hurtTime); }; diff --git a/src/SDK/Client/Actor/Components/ActorDataFlagComponent.hpp b/src/SDK/Client/Actor/Components/ActorDataFlagComponent.hpp new file mode 100644 index 00000000..56bb8680 --- /dev/null +++ b/src/SDK/Client/Actor/Components/ActorDataFlagComponent.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include + +struct ActorDataFlagComponent { + std::bitset<0x77> flags; +}; \ No newline at end of file From 378fc5d75390656212c92a278e820b529ad02f20 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 13:01:10 +0300 Subject: [PATCH 096/240] Version not supported message --- src/Client/Client.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 229b1712..4ec2e69f 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -61,6 +61,8 @@ void Client::initialize() { if (!VersionUtils::isSupported(Client::version)) { Logger::debug("[INFO] Version not supported!"); + MessageBox(NULL, "Flarial: this version is not supported!", "", MB_OK); + ModuleManager::terminate(); Client::disable = true; return; } From c8945a2a7b084a5a50c6960301a5cf113209aa93 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 13:02:16 +0300 Subject: [PATCH 097/240] Formatting --- src/Client/Events/EventHandler.cpp | 1 - src/Client/Module/Modules/ComboCounter/ComboListener.hpp | 9 ++++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Client/Events/EventHandler.cpp b/src/Client/Events/EventHandler.cpp index 8d5ce902..274ea893 100644 --- a/src/Client/Events/EventHandler.cpp +++ b/src/Client/Events/EventHandler.cpp @@ -149,7 +149,6 @@ void EventHandler::onSetupAndRender(SetupAndRenderEvent &event) { for (Listener *&listener: listeners) { listener->onSetupAndRender(event); } - } void EventHandler::onGetViewPerspective(PerspectiveEvent &event) { diff --git a/src/Client/Module/Modules/ComboCounter/ComboListener.hpp b/src/Client/Module/Modules/ComboCounter/ComboListener.hpp index 5f80e72b..cc88806b 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboListener.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboListener.hpp @@ -35,12 +35,11 @@ class ComboListener : public Listener { } void onRender(RenderEvent &event) override { - if (module->isEnabled()) { - auto comboStr = std::to_string(Combo); - this->module->normalRender(8, comboStr); - - } + if (module->isEnabled()) { + auto comboStr = std::to_string(Combo); + this->module->normalRender(8, comboStr); + } } public: From 72a526713c087025f571cb0e38ca2a27028e41f4 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 13:02:58 +0300 Subject: [PATCH 098/240] Hitbox flicker fix --- src/Client/Module/Modules/Hitbox/HitboxListener.cpp | 4 ++++ src/Client/Module/Modules/Hitbox/HitboxListener.hpp | 1 + 2 files changed, 5 insertions(+) diff --git a/src/Client/Module/Modules/Hitbox/HitboxListener.cpp b/src/Client/Module/Modules/Hitbox/HitboxListener.cpp index ae1fb4c4..7463a273 100644 --- a/src/Client/Module/Modules/Hitbox/HitboxListener.cpp +++ b/src/Client/Module/Modules/Hitbox/HitboxListener.cpp @@ -2,6 +2,7 @@ #include "../../../../Utils/Render/DrawUtils.hpp" void HitboxListener::onSetupAndRender(SetupAndRenderEvent &event) { + std::lock_guard guard(renderMtx); aabbsToRender.clear(); if (!SDK::clientInstance || !SDK::clientInstance->getLocalPlayer() || !SDK::clientInstance->getMinecraftGame()->mouseGrabbed || !SDK::clientInstance->getLocalPlayer()->getLevel()) @@ -37,12 +38,15 @@ void HitboxListener::onRender(RenderEvent &event) { auto player = SDK::clientInstance->getLocalPlayer(); + if(FlarialGUI::inMenu || SDK::getCurrentScreen() != "hud_screen") return; + if (player != nullptr) { D2D1_COLOR_F color2; // TODO: optimize getting colors if (module->settings.getSettingByName("color_rgb")->value) color2 = FlarialGUI::rgbColor; else color2 = FlarialGUI::HexToColorF(module->settings.getSettingByName("color")->value); + std::lock_guard guard(renderMtx); for (const auto &aabb: aabbsToRender) { // Retrieve the thickness setting value from the module settings float thickness = module->settings.getSettingByName("thickness")->value; diff --git a/src/Client/Module/Modules/Hitbox/HitboxListener.hpp b/src/Client/Module/Modules/Hitbox/HitboxListener.hpp index e6251731..f20b6869 100644 --- a/src/Client/Module/Modules/Hitbox/HitboxListener.hpp +++ b/src/Client/Module/Modules/Hitbox/HitboxListener.hpp @@ -13,6 +13,7 @@ class HitboxListener : public Listener { Module *module; static inline std::vector aabbsToRender; + static inline std::mutex renderMtx; public: void onRender(RenderEvent &event) override; From 369728f4624d205b920826fca4e3e932b33c5475 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 13:04:50 +0300 Subject: [PATCH 099/240] Support for 1.21.2X --- .../Hook/Hooks/Render/SetupAndRenderHook.hpp | 6 ++- src/Client/Hook/Manager.cpp | 4 +- src/Client/Module/Manager.cpp | 4 +- .../Module/Modules/PaperDoll/DollListener.hpp | 2 +- .../Client/Render/ScreenView/UIControl.hpp | 9 +++-- src/Utils/Memory/Game/Offset/OffsetInit.cpp | 39 ++++++++++++++++++- src/Utils/Memory/Game/Offset/OffsetInit.hpp | 1 + src/Utils/Memory/Game/Sig/SigInit.cpp | 22 ++++++++++- src/Utils/Memory/Game/Sig/SigInit.hpp | 1 + src/Utils/Versions/VersionUtils.cpp | 5 ++- src/Utils/Versions/WinrtUtils.cpp | 7 ++++ 11 files changed, 88 insertions(+), 12 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp index 2e74e100..187d5fb0 100644 --- a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp +++ b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp @@ -59,8 +59,10 @@ class SetUpAndRenderHook : public Hook "drawText"); } - if (oDrawImage == nullptr) { - Memory::hookFunc((void *) vTable[7], (void *) drawImageDetour, (void **) &oDrawImage, "DrawImage"); + if(!WinrtUtils::check(21,20)) { // TODO + if (oDrawImage == nullptr) { + Memory::hookFunc((void *) vTable[7], (void *) drawImageDetour, (void **) &oDrawImage, "DrawImage"); + } } } diff --git a/src/Client/Hook/Manager.cpp b/src/Client/Hook/Manager.cpp index 549b98da..d28d8bec 100644 --- a/src/Client/Hook/Manager.cpp +++ b/src/Client/Hook/Manager.cpp @@ -59,7 +59,9 @@ void HookManager::initialize() { hooks.push_back(new OnSuspendHook()); hooks.push_back(new getGammaHook()); hooks.push_back(new FontDrawTransformedHook()); - hooks.push_back(new HurtColorHook()); + if(!WinrtUtils::check(21,20)) { // TODO + hooks.push_back(new HurtColorHook()); + } hooks.push_back(new DimensionFogColorHook()); hooks.push_back(new OverworldFogColorHook()); hooks.push_back(new TimeChangerHook()); diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 861186dc..744a2e94 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -123,7 +123,9 @@ void ModuleManager::initialize() { addModule(new Hitbox()); addModule(new ThirdPerson()); addModule(new SnapLook()); - addModule(new HurtColor()); + if(!WinrtUtils::check(21,20)) { // TODO + addModule(new HurtColor()); + } addModule(new FogColor()); addModule(new ArmorHUD()); diff --git a/src/Client/Module/Modules/PaperDoll/DollListener.hpp b/src/Client/Module/Modules/PaperDoll/DollListener.hpp index 4828c16d..6c8fb1d0 100644 --- a/src/Client/Module/Modules/PaperDoll/DollListener.hpp +++ b/src/Client/Module/Modules/PaperDoll/DollListener.hpp @@ -86,7 +86,7 @@ class DollListener : public Listener { if (module->settings.getSettingByName("alwaysshow")->value || ClickGUIRenderer::editmenu) { - auto component = reinterpret_cast(control->components[4].get()); + auto component = reinterpret_cast(control->getComponents()[4].get()); component->renderer->state = 1.0f; } diff --git a/src/SDK/Client/Render/ScreenView/UIControl.hpp b/src/SDK/Client/Render/ScreenView/UIControl.hpp index f8da4cbf..554f5fe4 100644 --- a/src/SDK/Client/Render/ScreenView/UIControl.hpp +++ b/src/SDK/Client/Render/ScreenView/UIControl.hpp @@ -4,16 +4,17 @@ class UIControl { public: - - char filling[192]; //0x0000 - std::vector> components; //0xC0 - BUILD_ACCESS(this, std::string, LayerName, GET_OFFSET("UIControl::LayerName")); BUILD_ACCESS(this, float, scale, GET_OFFSET("UIControl::scale")); BUILD_ACCESS(this, float, x, GET_OFFSET("UIControl::x")); BUILD_ACCESS(this, float, y, GET_OFFSET("UIControl::y")); BUILD_ACCESS(this, std::vector>, children, GET_OFFSET("UIControl::children")); + + std::vector>& getComponents() { + return hat::member_at>>(this, GET_OFFSET("UIControl::components")); + } + void getAllControls(std::vector>& list) { for (auto& control : this->children) { list.emplace_back(control); diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index 779d7209..6c12e73b 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -3,6 +3,35 @@ #include "../../../Logger/Logger.hpp" #include "../SignatureAndOffsetManager.hpp" +void OffsetInit::init2120() { + Logger::debug("[Offsets] Loading offsets for 1.21.2X"); + + ADD_OFFSET("Actor::hurtTime", 0x1F4); + ADD_OFFSET("Actor::level", 0x230); + ADD_OFFSET("Actor::categories", 0x268); + + ADD_OFFSET("Player::playerInventory", 0x628); + ADD_OFFSET("Player::playerName", 0xC88); + ADD_OFFSET("Player::gamemode", 0xB00); + + ADD_OFFSET("Actor::baseTickVft", 24); + + ADD_OFFSET("PlayerInventory::inventory", 0xB8); + + ADD_OFFSET("UIControl::x", 0x10); + ADD_OFFSET("UIControl::y", 0x14); + ADD_OFFSET("UIControl::LayerName", 0x20); + ADD_OFFSET("UIControl::scale", 0x48); + + ADD_OFFSET("UIControl::children", 0x90); + ADD_OFFSET("UIControl::components", 0xB0); + + ADD_OFFSET("RaknetConnector::JoinedIp", 0x390); + + ADD_OFFSET("Level::hitResult", 0x220); + ADD_OFFSET("Level::getPlayerMap", 0xBF8); +} + void OffsetInit::init2100() { Logger::debug("[Offsets] Loading offsets for 1.21.0X"); @@ -19,7 +48,7 @@ void OffsetInit::init2100() { ADD_OFFSET("Weather::lightingLevel", 0x48); ADD_OFFSET("Level::hitResult", 0xB38); - ADD_OFFSET("Level::getPlayerMap", 0x1BC8); + ADD_OFFSET("Level::getPlayerMap", 0x1BC8); // getRuntimeActorList offset + B8 || Level::getPlayerList } void OffsetInit::init2080() { @@ -228,6 +257,13 @@ void OffsetInit::init2030() { ADD_OFFSET("MinecraftUIRenderContext::screenContext", 0x10); ADD_OFFSET("MinecraftUIRenderContext::textures", 0x48); + ADD_OFFSET("ScreenContext::colorHolder", 0x30); + ADD_OFFSET("ScreenContext::tessellator", 0xC0); + + ADD_OFFSET("Tessellator::transformOffset", 0x184); + + ADD_OFFSET("createMaterial", 1); + ADD_OFFSET("TextureGroup::base", 0x18); ADD_OFFSET("TextureGroup::loadedTextures", 0x178); @@ -242,6 +278,7 @@ void OffsetInit::init2030() { ADD_OFFSET("UIControl::x", 0x78); ADD_OFFSET("UIControl::y", 0x7C); ADD_OFFSET("UIControl::children", 0xA0); + ADD_OFFSET("UIControl::components", 0xC0); ADD_OFFSET("VisualTree::root", 0x8); diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.hpp b/src/Utils/Memory/Game/Offset/OffsetInit.hpp index 46d9df20..4b2cd155 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.hpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.hpp @@ -9,4 +9,5 @@ class OffsetInit { static void init2070(); static void init2080(); static void init2100(); + static void init2120(); }; diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 47673971..81c8c511 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -4,7 +4,22 @@ #include "../SignatureAndOffsetManager.hpp" void SigInit::init2120() { - Logger::debug("[Signatures] Loading sigs for 1.21.2X"); + Logger::debug("[Signatures] Loading sigs for 1.21.20"); + + ADD_SIG("Options::getGamma", "48 83 EC 28 80 B9 80 17 00 00 00 48 8D 54 24 30 48 8B 01 48 8B 40 60 74 38 41 B8 19"); + ADD_SIG("mce::TextureGroup::getTexture", "40 55 53 56 57 41 55 41 56 41 57 48 8D 6C 24 E9 48 81 EC 00"); + ADD_SIG("RaknetTick", "4C 8B DC 49 89 5B 10 49 89 73 18 57 48 81 EC 10 02"); + ADD_SIG("ItemRenderer::renderGuiItemNew", "40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 E8 48 81 EC 18 01 00 00 0F 29 B4 24 00 01 00 00 48"); + + ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 37 00 00 00 8D 50 FA 44 8D 48 FE 44 8D 40 FC 66 89 44 24 20 E8 ?? ?? ?? ?? 48 8B 8B C0 10 00 00"); + + ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 81"); + + ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 40"); +} + +void SigInit::init2102() { + Logger::debug("[Signatures] Loading sigs for 1.21.02"); ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC ? 45 33 C0 48 8B D9 81 FA"); } @@ -23,6 +38,8 @@ void SigInit::init2080() { // 36 48 C4 71 ADD_SIG("Actor::getActorEquipmentComponent", "C8 25 36 48 C4 71"); + // Actor::getActorFlag replacment + ADD_SIG("Actor::getActorDataFlagComponent", "C8 25 76 59 47 33"); ADD_SIG("ClientInstance::grabMouse", "48 8B 80 ? ? ? ? FF 15 ? ? ? ? 90 48 85 DB 74 08 48 8B CB E8 ? ? ? ? 48 8B 8D ? ? ? ? E8"); @@ -196,6 +213,9 @@ void SigInit::init2030() { ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); + ADD_SIG("MinecraftUIRenderContext::getUIMaterial", "4C 8D 05 ? ? ? ? 48 8B D3 48 8B CF 48 8B 5C 24 ? 0F 28 7C 24 ? 44 0F 28 44 24 ? 48 83 C4 40 5F E9 ? ? ? ?"); + + ADD_SIG("Tessellator::createMaterial", "48 8B 05 ? ? ? ? 48 8D 55 ? 48 8D 0D ? ? ? ? 48 8B 40 ? FF 15 ? ? ? ? 48 8B F8"); ADD_SIG("Tessellator::begin", "48 89 5C 24 ? 56 48 83 EC ? 80 B9 ? ? ? ? ? 45 0F B6"); ADD_SIG("Tessellator::vertex", "40 57 48 81 EC ? ? ? ? 0F 29 7C ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 ? 8B 81"); ADD_SIG("Tessellator::colorF", "80 B9 ? ? ? ? ? 4C 8B C1 75"); diff --git a/src/Utils/Memory/Game/Sig/SigInit.hpp b/src/Utils/Memory/Game/Sig/SigInit.hpp index b5fbf7ef..b231b6f3 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.hpp +++ b/src/Utils/Memory/Game/Sig/SigInit.hpp @@ -9,5 +9,6 @@ class SigInit { static void init2070(); static void init2080(); static void init2100(); + static void init2102(); static void init2120(); }; diff --git a/src/Utils/Versions/VersionUtils.cpp b/src/Utils/Versions/VersionUtils.cpp index 19a66f0f..0cf0b2e1 100644 --- a/src/Utils/Versions/VersionUtils.cpp +++ b/src/Utils/Versions/VersionUtils.cpp @@ -11,9 +11,12 @@ std::vector, std::function>>> VersionUtils::versions; void VersionUtils::init() { - std::pair, std::function>> p2120 = {"1.21.2", {SigInit::init2120, OffsetInit::init2100}}; + std::pair, std::function>> p2120 = {"1.21.2", {SigInit::init2120, OffsetInit::init2120}}; versions.push_back(p2120); + std::pair, std::function>> p2102 = {"1.21.02", {SigInit::init2102, OffsetInit::init2100}}; + versions.push_back(p2102); + std::pair, std::function>> p2110 = {"1.21.1", {SigInit::init2100, OffsetInit::init2100}}; versions.push_back(p2110); diff --git a/src/Utils/Versions/WinrtUtils.cpp b/src/Utils/Versions/WinrtUtils.cpp index 720ac130..9043cc71 100644 --- a/src/Utils/Versions/WinrtUtils.cpp +++ b/src/Utils/Versions/WinrtUtils.cpp @@ -45,6 +45,13 @@ std::string WinrtUtils::getVersion() { std::string WinrtUtils::getFormattedVersion() { const std::string& version = getVersion(); + + if(version == "1.21.202") { // i cba for now + // 1.21.202.0 - 1.21.2 + // 1.21.2003.0 - 1.21.20 + return "1.21.02"; + } + // Split version string by dots std::vector parts; std::istringstream iss(version); From dd8b1667e8ee4065b72a5f0a98691534bbeda8be Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 13:05:47 +0300 Subject: [PATCH 100/240] Bring back some SDK --- src/SDK/Client/Core/HashedString.hpp | 54 ++++++++++++++++ .../Render/MinecraftUIRenderContext.hpp | 3 +- src/SDK/Client/Render/ScreenContext.hpp | 15 +++++ .../Client/Render/Tessellator/MaterialPtr.h | 25 ++++++++ .../Client/Render/Tessellator/PrimitiveMode.h | 11 ++++ .../Client/Render/Tessellator/Tessellator.h | 64 +++++++++++++++++++ 6 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 src/SDK/Client/Core/HashedString.hpp create mode 100644 src/SDK/Client/Render/ScreenContext.hpp create mode 100644 src/SDK/Client/Render/Tessellator/MaterialPtr.h create mode 100644 src/SDK/Client/Render/Tessellator/PrimitiveMode.h create mode 100644 src/SDK/Client/Render/Tessellator/Tessellator.h diff --git a/src/SDK/Client/Core/HashedString.hpp b/src/SDK/Client/Core/HashedString.hpp new file mode 100644 index 00000000..a41cdb1d --- /dev/null +++ b/src/SDK/Client/Core/HashedString.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include +#include + +class HashedString { +public: + uint64_t hash{}; + std::string text; + const HashedString *lastMatch{}; + + explicit HashedString(const std::string &text) { + this->text = text; + this->computeHash(); + } + + void computeHash() { + const uint64_t FNV_OFFSET_BASIS = 0xCBF29CE484222325u; + const uint64_t FNV_PRIME = 0x100000001B3u; + + uint64_t _hash = FNV_OFFSET_BASIS; + if (!this->text.empty()) { + for (char c : this->text) { + _hash *= FNV_PRIME; + _hash ^= c; + } + } else { + _hash = 0; + } + + this->hash = _hash; + } + + bool operator==(HashedString &other) { + if (this->text == other.text) { + return ((this->lastMatch == &other) && (other.lastMatch == this)); + } + return false; + } + + bool operator!=(HashedString &other) { + return !(*this == other); + } + + bool operator<(HashedString &other) const { + if (this->hash < other.hash) { + return true; + } + if (this->hash <= other.hash) { + return (strcmp(this->text.c_str(), other.text.c_str()) < 0); + } + return false; + } +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/MinecraftUIRenderContext.hpp b/src/SDK/Client/Render/MinecraftUIRenderContext.hpp index 7ce5e455..de02108b 100644 --- a/src/SDK/Client/Render/MinecraftUIRenderContext.hpp +++ b/src/SDK/Client/Render/MinecraftUIRenderContext.hpp @@ -14,6 +14,7 @@ #include "TexturePtr.hpp" #include "TextureGroup.hpp" #include "../../../Client/Module/Manager.hpp" +#include "ScreenContext.hpp" class MinecraftUIRenderContext { public: @@ -21,7 +22,7 @@ class MinecraftUIRenderContext { return hat::member_at(this, GET_OFFSET("MinecraftUIRenderContext::clientInstance")); } - class ScreenContext* getScreenContext() { + ScreenContext* getScreenContext() { return hat::member_at(this, GET_OFFSET("MinecraftUIRenderContext::screenContext")); } diff --git a/src/SDK/Client/Render/ScreenContext.hpp b/src/SDK/Client/Render/ScreenContext.hpp new file mode 100644 index 00000000..0dea5303 --- /dev/null +++ b/src/SDK/Client/Render/ScreenContext.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "Tessellator/Tessellator.h" +#include "libhat/Access.hpp" + +class ScreenContext { +public: + inline MCCColor *getColorHolder() { + return hat::member_at(this, GET_OFFSET("ScreenContext::colorHolder")); + } + + inline Tessellator *getTessellator() { + return hat::member_at(this, GET_OFFSET("ScreenContext::tessellator")); + } +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/Tessellator/MaterialPtr.h b/src/SDK/Client/Render/Tessellator/MaterialPtr.h new file mode 100644 index 00000000..420eece8 --- /dev/null +++ b/src/SDK/Client/Render/Tessellator/MaterialPtr.h @@ -0,0 +1,25 @@ +#pragma once + +#include "../TexturePtr.hpp" +#include "../../../../Utils/Memory/Memory.hpp" +#include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" +#include "../../Core/HashedString.hpp" + +namespace mce { + class MaterialPtr { + public: + static MaterialPtr *createMaterial(HashedString const &materialName) { + static void *materialCreator = nullptr; + + if (materialCreator == nullptr) { + // Sig returns 6 addresses, all of them point to the same offset + uintptr_t sigOffset = Memory::findSig(GET_SIG("Tessellator::createMaterial")); + int offset = *reinterpret_cast(sigOffset + 3); + materialCreator = reinterpret_cast(sigOffset + offset + 7); + } + + static int off = GET_OFFSET("createMaterial"); + return Memory::CallVFuncI(off, materialCreator, materialName); + } + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Render/Tessellator/PrimitiveMode.h b/src/SDK/Client/Render/Tessellator/PrimitiveMode.h new file mode 100644 index 00000000..c82d6a31 --- /dev/null +++ b/src/SDK/Client/Render/Tessellator/PrimitiveMode.h @@ -0,0 +1,11 @@ +#pragma once + +namespace mce { + enum class PrimitiveMode { + QUAD = 1, + TRIANGLE_LIST, + TRIANGLE_STRIP, + LINE_LIST, + LINE_STRIP + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Render/Tessellator/Tessellator.h b/src/SDK/Client/Render/Tessellator/Tessellator.h new file mode 100644 index 00000000..b19c2f35 --- /dev/null +++ b/src/SDK/Client/Render/Tessellator/Tessellator.h @@ -0,0 +1,64 @@ +#pragma once + +#include "PrimitiveMode.h" +#include "MaterialPtr.h" +#include "../../../../Utils/Memory/Memory.hpp" +#include "../../../../Utils/Utils.hpp" +#include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" + +class ScreenContext; + +class HashedString; + +class Tessellator { +private: + +public: + Vec3& getTransformOffset() { + return hat::member_at>(this, GET_OFFSET("Tessellator::transformOffset")); + } + + void addPostTransformOffset(int x, int y, int z) { + addPostTransformOffset((float) x, (float) y, (float) z); + } + + void addPostTransformOffset(float x, float y, float z) { + this->getTransformOffset() = this->getTransformOffset().add(Vec3(x, y, z)); + }; + + inline void begin(mce::PrimitiveMode format, int reservedVerticies = 0) { + using tess_begin_t = void (__fastcall *)(Tessellator *, mce::PrimitiveMode, bool); + static auto tess_begin = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::begin"))); + tess_begin(this, format, reservedVerticies); + } + + inline void vertex(float x, float y, float z) { + using tess_vertex_t = void (__fastcall *)(Tessellator *, float, float, float); + static auto tess_vertex = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::vertex"))); + tess_vertex(this, x, y, z); + } + + inline void color(float r, float g, float b, float a) { + using tess_color_t = void (__fastcall *)(Tessellator *, float, float, float, float); + static auto tess_color = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::colorF"))); + tess_color(this, r, g, b, a); + } + + inline void setRotation(float angle, Vec3 pivot) { + using tess_setRotation_t = void (__fastcall *)(Tessellator *, float, Vec3); + static auto tess_setRotation = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::setRotation"))); + tess_setRotation(this, angle, pivot); + } + + inline void resetTransform(bool a1) { + using tess_resetTransform_t = void (__fastcall *)(Tessellator *, bool); + static auto tess_resetTransform = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::resetTransform"))); + tess_resetTransform(this, a1); + } + + inline void renderMeshImmediately(ScreenContext *ctx, mce::MaterialPtr *material) { + using meshHelper_renderImm_t = void (__fastcall *)(ScreenContext *, Tessellator *, mce::MaterialPtr *); + static auto meshHelper_renderImm = reinterpret_cast(Memory::findSig(GET_SIG("MeshHelper::renderImmediately"))); + meshHelper_renderImm(ctx, this, material); + } +}; From 30c99cb1df30ae45a82b4c768853ace4021fd9ea Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:34:44 +0600 Subject: [PATCH 101/240] i have a lot to do and a lot to change --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 1 + src/Client/GUI/Engine/Effects/Blur/blur.cpp~ | 372 ------------------ .../GUI/Engine/Effects/Blur/blur_dx12.cpp | 220 +++++++++++ src/Client/GUI/Engine/Engine.hpp | 22 ++ .../Hook/Hooks/Render/SwapchainHook.cpp | 11 +- 5 files changed, 249 insertions(+), 377 deletions(-) delete mode 100644 src/Client/GUI/Engine/Effects/Blur/blur.cpp~ create mode 100644 src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 33853888..5daf4cbb 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -356,6 +356,7 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio for (int i = 0; i < iterations; i++) { + if (i != 0) renderTargetViews[i]->Release(); framebuffers[i]->Release(); diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp~ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp~ deleted file mode 100644 index 33853888..00000000 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp~ +++ /dev/null @@ -1,372 +0,0 @@ -#include -#include -#include -#include "../../Engine.hpp" -#include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" -#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" - -// CREDITS @MR CHIPS (@chyves) - -#define BLUR_OFFSET 10 - -static const XMFLOAT4 quadVertices[] = - { - XMFLOAT4(1.0, -1.0, 0.0, 1.0), - XMFLOAT4(-1.0, -1.0, 0.0, 1.0), - XMFLOAT4(-1.0, 1.0, 0.0, 1.0), - XMFLOAT4(-1.0, 1.0, 0.0, 1.0), - XMFLOAT4(1.0, 1.0, 0.0, 1.0), - XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; - -const char *vertexShaderSrc = "struct VS_INPUT {\ - float4 pos : POSITION;\ -};\ -\ -float4 main(VS_INPUT input) : SV_POSITION {\ - return input.pos;\ -}"; - -const char *downsampleShaderSrc = R"( -cbuffer BlurInputBuffer : register(b0) -{ - float2 resolution; - float2 offset; - float2 halfPixel; -}; - -sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); - -float4 main(float4 screenSpace : SV_Position) : SV_TARGET -{ - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; - - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 - }; - - float weightSum = 0.0; - for (int i = 0; i < 9; i++) - { - weightSum += weights[i]; - } - - for (int i = 0; i < 9; i++) - { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); - } - - return colorSum; -} -)"; - -const char *upsampleShaderSrc = R"( -cbuffer BlurInputBuffer : register(b0) -{ - float2 resolution; - float2 offset; - float2 halfPixel; -}; - -sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); - -float4 main(float4 screenSpace : SV_Position) : SV_TARGET -{ - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; - - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 - }; - - float weightSum = 0.0; - for (int i = 0; i < 9; i++) - { - weightSum += weights[i]; - } - - for (int i = 0; i < 9; i++) - { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); - } - - return colorSum; -} -)"; - - - -const char *dbgDrawTextureShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ -{\ - float2 resolution;\ - float2 offset;\ - float2 halfpixel;\ -};\ -struct PS_INPUT {\ - float4 pos : POSITION;\ -};\ -sampler sampler0 : register(s0);\ -Texture2D texture0 : register(t0);\ -\ -float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET {\ - float2 uv = screenSpace.xy / resolution;\ - return texture0.Sample(sampler0, uv);\ -}"; - -ID3DBlob *TryCompileShader(const char *pSrcData, const char *pTarget) -{ - HRESULT hr; - - ID3DBlob *shaderBlob; - ID3DBlob *errorBlob; - hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); - - if (FAILED(hr)) - { - Logger::error("[Blur] Failed to compile shader"); - errorBlob->Release(); - throw std::logic_error("Failed to compile shader!"); - } - return shaderBlob; -} - -ID3D11PixelShader *dbgShader; - -void Blur::InitializePipeline() -{ - - HRESULT hr; - ID3D11DeviceContext* pContext = SwapchainHook::context; - - // byteWidth has to be a multiple of 32, BlurInputBuffer has a size of 24 - CD3D11_BUFFER_DESC cbd( - sizeof(BlurInputBuffer), - D3D11_BIND_CONSTANT_BUFFER); - CD3D11_BUFFER_DESC cbdVertex( - sizeof(quadVertices), - D3D11_BIND_VERTEX_BUFFER); - - SwapchainHook::d3d11Device->CreateBuffer( - &cbd, - nullptr, - &pConstantBuffer); - - D3D11_SUBRESOURCE_DATA vertexBufferData = {quadVertices, 0, 0}; - - SwapchainHook::d3d11Device->CreateBuffer( - &cbdVertex, - &vertexBufferData, - &pVertexBuffer); - - ID3DBlob *shaderBlob = TryCompileShader(upsampleShaderSrc, "ps_4_0"); - SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pUpsampleShader); - - shaderBlob = TryCompileShader(downsampleShaderSrc, "ps_4_0"); - SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pDownsampleShader); - - shaderBlob = TryCompileShader(dbgDrawTextureShaderSrc, "ps_4_0"); - SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &dbgShader); - - shaderBlob = TryCompileShader(vertexShaderSrc, "vs_4_0"); - SwapchainHook::d3d11Device->CreateVertexShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pVertexShader); - - D3D11_INPUT_ELEMENT_DESC ied = - {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, - 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}; - SwapchainHook::d3d11Device->CreateInputLayout(&ied, 1, shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &pInputLayout); - D3D11_SAMPLER_DESC sd{}; - sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - sd.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - SwapchainHook::d3d11Device->CreateSamplerState(&sd, &pSampler); - -} -void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderResourceView *pShaderResourceView, XMFLOAT2 rtvSize) -{ - HRESULT hr; - ID3D11DeviceContext* pContext = SwapchainHook::context; - D3D11_DEPTH_STENCIL_DESC dsd{}; - dsd.DepthEnable = false; - dsd.StencilEnable = false; - ID3D11DepthStencilState *pDepthStencilState; - hr = SwapchainHook::d3d11Device->CreateDepthStencilState(&dsd, &pDepthStencilState); - if (FAILED(hr)) { pContext->Release(); return; } - pContext->OMSetDepthStencilState(pDepthStencilState, 0); - - void *null = nullptr; - pContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView **)&null); - pContext->OMSetRenderTargets(1, &pRenderTargetView, nullptr); - - constantBuffer.resolution = rtvSize; - constantBuffer.halfpixel = XMFLOAT2(0.5 / rtvSize.x, 0.5 / rtvSize.y); - pContext->UpdateSubresource(pConstantBuffer, 0, nullptr, &constantBuffer, 0, 0); - - pContext->IASetInputLayout(pInputLayout); - UINT stride = sizeof(XMFLOAT4); - UINT offset = 0; - - pContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - pContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0); - pContext->VSSetShader(pVertexShader, nullptr, 0); - pContext->PSSetSamplers(0, 1, &pSampler); - pContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); - D3D11_BLEND_DESC bd{}; - ZeroMemory(&bd, sizeof(bd)); - bd.AlphaToCoverageEnable = false; - bd.RenderTarget[0].BlendEnable = true; - bd.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - bd.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; - bd.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - bd.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - bd.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; - bd.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - bd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - ID3D11BlendState *pBlendState; - hr = SwapchainHook::d3d11Device->CreateBlendState(&bd, &pBlendState); - if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); return; } - pContext->OMSetBlendState(pBlendState, NULL, 0xffffffff); - D3D11_RASTERIZER_DESC rd{}; - rd.FillMode = D3D11_FILL_SOLID; - rd.CullMode = D3D11_CULL_NONE; - rd.DepthClipEnable = false; - rd.ScissorEnable = false; - ID3D11RasterizerState *pRasterizerState; - hr = SwapchainHook::d3d11Device->CreateRasterizerState(&rd, &pRasterizerState); - if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); pBlendState->Release(); return; } - pContext->RSSetState(pRasterizerState); - - pContext->PSSetShaderResources(0, 1, &pShaderResourceView); - D3D11_VIEWPORT viewport{}; - viewport.TopLeftX = 0; - viewport.TopLeftY = 0; - viewport.Width = rtvSize.x; - viewport.Height = rtvSize.y; - viewport.MaxDepth = 1.0f; - - FLOAT backgroundColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - pContext->ClearRenderTargetView(pRenderTargetView, backgroundColor); - pContext->RSSetViewports(1, &viewport); - pContext->Draw(sizeof(quadVertices) / sizeof(quadVertices[0]), 0); - ID3D11RenderTargetView* kajgd = nullptr; - pContext->OMSetRenderTargets(1, &kajgd, nullptr); - - pDepthStencilState->Release(); - pBlendState->Release(); - pRasterizerState->Release(); -} - -void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) -{ - - if(intensity < 1) return; - - if (!SwapchainHook::GetBackbuffer()) return; - - ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); - if (!pOrigShaderResourceView) return; - - ID3D11DeviceContext* pContext = SwapchainHook::context; - - std::vector framebuffers; - std::vector renderTargetViews; - std::vector shaderResourceViews; - std::vector fbSizes; - D3D11_TEXTURE2D_DESC desc; - SwapchainHook::GetBackbuffer()->GetDesc(&desc); - - framebuffers.reserve((size_t)iterations); - renderTargetViews.reserve((size_t)iterations); - - D3D11_SHADER_RESOURCE_VIEW_DESC srvd{}; - srvd.Format = desc.Format; - srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvd.Texture2D.MipLevels = 1; - - desc.BindFlags |= D3D11_BIND_RENDER_TARGET; - - for (int i = 0; i <= iterations; i++) - { - ID3D11Texture2D *pFrameBuffer; - ID3D11RenderTargetView *pRenderTargetView; - ID3D11ShaderResourceView *pShaderResourceView; - - SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); - if (i == 0) - pRenderTargetView = pDstRenderTargetView; - else - SwapchainHook::d3d11Device->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); - SwapchainHook::d3d11Device->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); - - framebuffers.push_back(pFrameBuffer); - renderTargetViews.push_back(pRenderTargetView); - shaderResourceViews.push_back(pShaderResourceView); - fbSizes.push_back(XMFLOAT2(desc.Width, desc.Height)); - - desc.Width /= 2; - desc.Height /= 2; - } - - constantBuffer.offset = XMFLOAT2(intensity * 3, intensity * 3); - pContext->PSSetShader(pDownsampleShader, nullptr, 0); - RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); - - for (int i = 1; i < iterations; i++) - { - RenderToRTV(renderTargetViews[i + 1], shaderResourceViews[i], fbSizes[i + 1]); - } - - pContext->PSSetShader(pUpsampleShader, nullptr, 0); - - for (int i = iterations; i > 0; i--) - { - RenderToRTV(renderTargetViews[i - 1], shaderResourceViews[i], fbSizes[i - 1]); - } - - for (int i = 0; i < iterations; i++) - { - if (i != 0) - renderTargetViews[i]->Release(); - framebuffers[i]->Release(); - shaderResourceViews[i]->Release(); - - renderTargetViews.clear(); - framebuffers.clear(); - shaderResourceViews.clear(); - fbSizes.clear(); - } - - pContext->Release(); - pOrigShaderResourceView->Release(); -} \ No newline at end of file diff --git a/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp b/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp new file mode 100644 index 00000000..53a38860 --- /dev/null +++ b/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp @@ -0,0 +1,220 @@ +/*#include +#include +#include +#include +#include +#include +#include "../../Engine.hpp" +#include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" +#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" + +static const XMFLOAT4 quadVertices[] = + { + XMFLOAT4(1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; + +const char *vertexShaderSrc = "struct VS_INPUT {\ + float4 pos : POSITION;\ +};\ +\ +float4 main(VS_INPUT input) : SV_POSITION {\ + return input.pos;\ +}"; + +const char *downsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; + + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } + + return colorSum; +} +)"; + +const char *upsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; + + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } + + return colorSum; +} +)"; + + +ID3DBlob* TryCompileShader(const char* pSrcData, const char* pTarget) +{ + HRESULT hr; + + ID3DBlob* shaderBlob; + ID3DBlob* errorBlob; + hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); + + if (FAILED(hr)) + { + Logger::error("[Blur] Failed to compile shader"); + errorBlob->Release(); + throw std::logic_error("Failed to compile shader!"); + } + return shaderBlob; +} + +ID3D12PipelineState* dbgShader; + +void Blur::InitializePipeline() +{ + HRESULT hr; + ID3D12Device* pDevice = SwapchainHook::d3d12Device5; + ID3D12GraphicsCommandList* pCommandList = SwapchainHook::d3d12CommandList; + + // Create constant buffer + D3D12_HEAP_PROPERTIES heapProps = {}; + heapProps.Type = D3D12_HEAP_TYPE_UPLOAD; + heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + + D3D12_RESOURCE_DESC resourceDesc = {}; + resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + resourceDesc.Width = sizeof(BlurInputBuffer); + resourceDesc.Height = 1; + resourceDesc.DepthOrArraySize = 1; + resourceDesc.MipLevels = 1; + resourceDesc.Format = DXGI_FORMAT_UNKNOWN; + resourceDesc.SampleDesc.Count = 1; + resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + + pDevice->CreateCommittedResource( + &heapProps, + D3D12_HEAP_FLAG_NONE, + &resourceDesc, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&pConstantBuffer)); + + // Create vertex buffer + resourceDesc.Width = sizeof(quadVertices); + pDevice->CreateCommittedResource( + &heapProps, + D3D12_HEAP_FLAG_NONE, + &resourceDesc, + D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER, + nullptr, + IID_PPV_ARGS(&pVertexBuffer)); + + // Compile shaders + ID3DBlob* vertexShaderBlob = TryCompileShader(vertexShaderSrc, "vs_5_0"); + ID3DBlob* pixelShaderBlob = TryCompileShader(upsampleShaderSrc, "ps_5_0"); + + // Create root signature + D3D12_ROOT_SIGNATURE_DESC rootSignatureDesc = {}; + rootSignatureDesc.NumParameters = 0; + rootSignatureDesc.pParameters = nullptr; + rootSignatureDesc.NumStaticSamplers = 0; + rootSignatureDesc.pStaticSamplers = nullptr; + rootSignatureDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; + + ID3DBlob* signature; + ID3DBlob* error; + D3D12SerializeRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error); + pDevice->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&pRootSignature)); + + // Create pipeline state object + D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; + psoDesc.InputLayout = { inputElementDescs, _countof(inputElementDescs) }; + psoDesc.pRootSignature = pRootSignature; + psoDesc.VS = CD3DX12_SHADER_BYTECODE(vertexShaderBlob); + psoDesc.PS = CD3DX12_SHADER_BYTECODE(pixelShaderBlob); + psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); + psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT); + psoDesc.DepthStencilState.DepthEnable = FALSE; + psoDesc.DepthStencilState.StencilEnable = FALSE; + psoDesc.SampleMask = UINT_MAX; + psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + psoDesc.NumRenderTargets = 1; + psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM; + psoDesc.SampleDesc.Count = 1; + + pDevice->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&pUpsampleShader)); +}*/ \ No newline at end of file diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 1b49fd69..cf2e9b21 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -57,6 +57,28 @@ class Blur static void RenderBlur(ID3D11RenderTargetView *, int, float); }; +class BlurDX12 +{ +public: + + static inline ID3D11PixelShader *pUpsampleShader = nullptr; + static inline ID3D11PixelShader *pDownsampleShader = nullptr; + static inline ID3D11VertexShader *pVertexShader = nullptr; + static inline ID3D11InputLayout *pInputLayout = nullptr; + + static inline ID3D11SamplerState *pSampler = nullptr; + static inline ID3D11Buffer *pVertexBuffer = nullptr; + static inline ID3D11Buffer *pConstantBuffer = nullptr; + static inline BlurInputBuffer constantBuffer; + + // RAII + static void InitializePipeline(); + //static void Cleanup(); + + static void RenderBlur(ID3D12GraphicsCommandList* commandList); +}; + + class Dimension { public: diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index d6136f1b..2460757d 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -344,7 +344,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI RenderEvent event{}; event.RTV = mainRenderTargetView; - Blur::RenderBlur(event.RTV, 3, 10.35f); + BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); EventHandler::onRender(event); @@ -539,7 +539,7 @@ void SwapchainHook::DX12Init() { kiero::getRenderType() == kiero::RenderType::D3D12) { D3D11On12CreateDevice(device, D3D11_CREATE_DEVICE_FLAG::D3D11_CREATE_DEVICE_BGRA_SUPPORT, nullptr, 0, - (IUnknown **) &queue, 1, 0, &d3d11Device, &context, + (IUnknown **) &queue, 1, 0, &SwapchainHook::d3d11Device, &context, nullptr); d3d11Device->QueryInterface(IID_PPV_ARGS(&d3d11On12Device)); @@ -616,7 +616,7 @@ void SwapchainHook::DX12Init() { Memory::SafeRelease(dxgiDevice); Memory::SafeRelease(d2dFactory); - Blur::InitializePipeline(); + BlurDX12::InitializePipeline(); init = true; } } @@ -676,13 +676,14 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() ID3D11Texture2D* buffer2D = nullptr; HRESULT hr; - D3D11Resources[currentBitmap]->QueryInterface(IID_PPV_ARGS(&buffer2D)); - if (FAILED(hr)) std::cout << "Failed to create stage texture: " << std::hex << hr << std::endl; + hr = D3D11Resources[currentBitmap]->QueryInterface(IID_PPV_ARGS(&buffer2D)); + if (FAILED(hr)) std::cout << "Failed to query interface: " << std::hex << hr << std::endl; ID3D11DeviceContext* deviceContext = context; D3D11_TEXTURE2D_DESC desc; buffer2D->GetDesc(&desc); + std::cout << desc.Format << std::endl; HRESULT r; if(!stageTex) { From 69881a10242188fc796daef85afcfa2d3adc8ff0 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 14:10:55 +0300 Subject: [PATCH 102/240] Re-q icon update --- src/Assets/Data/re-q.png | Bin 1874 -> 2267 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/Assets/Data/re-q.png b/src/Assets/Data/re-q.png index aec5899aa6283fdc91c1af24f3c553a0c318ce22..d623ea368af83440420afaa97f9339a52c9cc268 100644 GIT binary patch literal 2267 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 From a7d55b1b353c5a727bb0c968d4f2532600388822 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 15:00:28 +0300 Subject: [PATCH 103/240] (Incomplete) tutorial for updating client --- .../Game/Tutorial/HowToGetSigsAndOffsets.md | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 src/Utils/Memory/Game/Tutorial/HowToGetSigsAndOffsets.md diff --git a/src/Utils/Memory/Game/Tutorial/HowToGetSigsAndOffsets.md b/src/Utils/Memory/Game/Tutorial/HowToGetSigsAndOffsets.md new file mode 100644 index 00000000..2ad733ae --- /dev/null +++ b/src/Utils/Memory/Game/Tutorial/HowToGetSigsAndOffsets.md @@ -0,0 +1,171 @@ +# How to get signatures/offsets needed for update + +Requirements: IDA/Ghidra + CheatEngine + +To get some initial understanding, I recommend reading this, even tho it's incomplete as of now: https://frederoxdev.github.io/Bedrock-Modding-Wiki/ + +How to check sigs: +1. Open CheatEngine +2. Open Minecraft and connect CheatEngine to it +3. In CheatEngine's search panel set them as follows: instead of "All", choose Minecraft.Windows.exe, Writable - uncheck, Executable - check, Scan Type - Array of byte +4. Now you're ready to scan! +5. Paste sig in "Array of byte" textbox and scan it, if 1 result found - sig is good + +### Components: +tryGetPrefix - because we're not using entt, I made this "sig" that is only used to offset to start of tryGet function, that is basically bytes before "DA BA" and component hash "DE AB CB AF" +tryGetPrefix2 - same thing but later after a few updates tryGet on some components is a bit bigger, so that is for that case, also that sig is from start to "C8 25" and component hash "36 48 C4 71" + +General idea on sigs used here for components: +1. its unlikely following sigs will change, but "tryGetPrefix"'s might +2. to "find" "tryGetPrefix" - search for any component's tryGet function scanning sigs below and copy bytes before them. +3. Component "sig" rn is 2 bytes from tryGet (usually DA BA) + component hash (DA BA + 2E CD 8B 46 hash) + +Actor::getActorEquipmentComponent - tryGetPrefix2 + C8 25 36 48 C4 71 +Actor::getActorDataFlagComponent - tryGetPrefix2 + C8 25 76 59 47 33 + +Actor::getActorGameTypeComponent - tryGetPrefix + DA BA DE AB CB AF +Actor::getMoveInputHandler - tryGetPrefix + DA BA 2E CD 8B 46 +Actor::getAABBShapeComponent - tryGetPrefix + DA BA F2 C9 10 1B +Actor::getStateVectorComponent - tryGetPrefix + DA BA 91 3C C9 0E +Actor::getRuntimeIDComponent - tryGetPrefix + DA BA 14 14 A1 3C +Actor::getRenderPositionComponent - tryGetPrefix + DA BA 6E F3 E8 D4 + +### Actor::getActorDataFlagComponent +its inside Player::BaseTick, under while(aGameplayemote) loop, above & 0x10000000 +Actor::basicReg offset is offset in first arg + +### GuiData::displayClientMessage: +You can try just searching for this sig that leads to the func call directly that worked from 1.20.3X to 1.21.2: +"E8 ?? ?? ?? ?? 90 48 85 DB 74 09 48 8B CB E8 ?? ?? ?? ?? 90 48 89 7D C7 48 8B 4D CF 48 89 7D CF 48 85 C9 74 09 E8 ?? ?? ?? ?? 48 8B 7D CF 48 85 FF 74 09" + +If it didnt work: +1. Open IDA/Ghidra +2. Search for bytes and input "persona.emote.easter_egg" or "persona.emote.chat_message" there, search +3. When result found, xref to first function +5. Then switch to pseudocode +6. On lines 114-117 find 3 arg function, that if you go into starts with a bunch aXX = 0 at the start + +### mce::TextureGroup::getTexture +Search for textures/ui/heart_background or %sabsorption_heart_half - first ref, at the end - getTexture + +### Player::playerName +First try those sigs (they lead directly to offset): + +If didnt work, this one: +48 89 5C 24 20 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 C0 48 81 EC 40 01 00 00 41 (its sig to function described below) +if didnt work: +1. Open IDA/Ghidra +2. Search for bytes and input "book.defaultAuthor" there, search +3. When result found, xref to first function +5. Then switch to pseudocode +6. Approx on line 278 would be the required offset + +### Player::playerInventory & PlayerInventory::inventory +48 8b 91 (? ? ? ?) Player::playerInventory 80 ba ? ? ? ? ? 75 ? 48 8b 8a (? ? ? ?) PlayerInventory::inventory 8b 52 ? 48 8b 01 48 8b 40 ? 48 ff 25 ? ? ? ? 48 8d 05 +48 8b 91 ? ? ? ? 80 ba ? ? ? ? ? 75 ? 48 8b 8a ? ? ? ? 8b 52 ? 48 8b 01 48 8b 40 ? 48 ff 25 ? ? ? ? 48 8d 05 +Could also be used: +48 8b ? (? ? ? ?) 80 ba ? ? ? ? ? 75 ? 48 8b 8a (? ? ? ?) ? + +Gives a million results but 99% of what it has is correct offsets + +### Player::gamemode +48 8b b5 ? ? ? ? 48 8b 06 48 8b 78 ? 48 8b 01 // 1.20.3X+ +49 8b 9e ? ? ? ? 48 8b 03 4c 8d 4c 24 // 1.20.3X+ +48 8b 8b ? ? ? ? 45 84 f6 74 ? 45 84 e4 +4c 8b b0 ? ? ? ? 49 8b 06 4c 8b b8 +48 8b 88 ? ? ? ? 48 8d 54 24 ? c6 80 + +### Actor::hurtTime +8b 86 ? ? ? ? 85 c0 7e ? ff c8 89 86 ? ? ? ? 48 8b 96 // 1.20.3X+ +44 8b 87 ? ? ? ? b8 ? ? ? ? 41 f7 e8 // 1.20.3X+ +89 86 ? ? ? ? 48 8b 96 ? ? ? ? 48 83 fa // 1.20.3X+ +c7 81 ? ? ? ? 0A 00 00 00 48 8b 81 // 2 results, 1st one is the one, 1.20.3X+ +c7 81 ? ? ? ? 0A 00 00 00 48 8b 81 ? ? ? ? 48 85 c0 0f 84 ? ? ? ? c7 00 // more direct one + + +### Actor::level +48 8b 8f ? ? ? ? 48 8b 11 48 8b 82 ? ? ? ? ff 15 ? ? ? ? 48 8b 8f // 1.20.3X+ +48 8b 8e ? ? ? ? 48 8b 01 48 8b 80 ? ? ? ? ff 15 ? ? ? ? 48 8b 10 // 1.20.3X+ +48 8b 8e ? ? ? ? 48 8b 01 48 8b 80 ? ? ? ? ff 15 ? ? ? ? 48 8b 08 48 89 8b // 1.20.3X+ +49 8b 8f ? ? ? ? 48 8b 01 48 8b 80 ? ? ? ? ff 15 ? ? ? ? 84 c0 75 // 1.20.3X+ + +4d 8b 81 ? ? ? ? 48 8b 42 ? 48 85 c0 +49 83 be ? ? ? ? ? 0f 84 ? ? ? ? 48 8b 86 + +### Actor::categories +f6 87 ? ? ? ? ? 74 ? 41 0f 28 c2 // 1.20.3X+ +f6 83 ? ? ? ? ? 74 ? 48 8b cb // 1.20.3X+ +8b 81 ? ? ? ? d1 e8 a8 ? 48 0f 45 f9 // 1.20.3X+ +8b 87 ? ? ? ? d1 e8 a8 ? 0f 84 ? ? ? ? 48 8b 17 // 1.20.3X+ +8b 83 ? ? ? ? d1 e8 a8 ? 74 ? 80 bb // 1.20.3X+ + +f6 87 ? ? ? ? ? 0f 84 ? ? ? ? 4c 8b b7 +8b 88 ? ? ? ? 0f 29 b4 24 ? ? ? ? 0f 28 35 + +### Level::getPlayerMap +aka Level::getPlayerList +Find getRuntimeActorList using method in sigs section +Add 0xB8 to 1st arg getRuntimeActorList gets called with and you get the offset + +### Level::hitResult +// for newer versions +48 8b 81 ? ? ? ? 48 85 c0 74 ? 48 83 c0 ? 48 83 c4 - gives multiple results, last one is the correct one +48 8b 81 ? ? ? ? 48 85 c0 74 ? 48 83 c0 ? 48 83 c4 ? c3 e8 ? ? ? ? cc cc 48 8d 81 ? ? ? ? c3 cc cc cc cc cc cc cc cc 40 53 +48 8b 81 ? ? ? ? 48 85 c0 74 ? 48 83 c4 ? c3 e8 ? ? ? ? cc cc cc cc cc cc 48 83 ec ? 48 8b 81 ? ? ? ? 48 85 c0 74 ? 48 83 c0 ? 48 83 c4 ? c3 e8 ? ? ? ? cc cc 48 8d 81 + +### Gamemode::player + +### Gamemode::lastBreakProgress +4d 89 66 ? 49 8b 8e // 1.20.3X+ +89 46 ? 80 be + +### ScreenView::VisualTree +4c 8b 43 ? 49 8b 08 48 8b 41 +48 8b 49 ? 48 8b 01 48 8b 40 ? ff 15 ? ? ? ? 84 c0 0f 84 ? ? ? ? 45 32 ff +48 8b 4f ? 48 8b 01 ba ? ? ? ? 48 8b 40 ? ff 15 ? ? ? ? 84 c0 74 ? 48 8b 4f ? 83 61 ? ? 48 8b 4f ? 48 8b 01 48 8b 40 ? ff 15 ? ? ? ? 66 0f 1f 84 00 +48 8b 4f ? 48 8b 01 ba ? ? ? ? 48 8b 40 ? ff 15 ? ? ? ? 84 c0 74 ? 48 8b 4f ? 83 61 ? ? 4c 8b 87 +48 8b 4f ? 48 8b 01 ba ? ? ? ? 48 8b 40 ? ff 15 ? ? ? ? 84 c0 74 ? 48 8b 4f ? 83 61 ? ? 48 8b 4f ? 48 8b 01 48 8b 40 ? ff 15 ? ? ? ? 48 8b 4f +48 8b 4f ? 48 8b 01 ba ? ? ? ? 48 8b 40 ? ff 15 ? ? ? ? 84 c0 74 ? 48 8b b7 +4c 8b 47 ? 49 8b 08 48 8b 41 ? ba +48 8b 4f ? 48 8b 01 ba ? ? ? ? 48 8b 40 ? ff 15 ? ? ? ? 84 c0 75 ? 48 8b 4f ? 48 8b 41 ? 48 39 41 ? 75 ? 48 8b 81 ? ? ? ? 48 39 81 ? ? ? ? 75 ? 48 8b 81 ? ? ? ? 48 39 81 ? ? ? ? 75 ? 80 b9 + +### VisualTree::root + + +### UIControl::LayerName + + +### Actor::runtimeID / EntityContext::id (EntityId) + EntityContext::basicReg +Found near getActorFlag first param is basicReg, second is runtimeID + + +# VTable Indexes +Memory::GetAddressByIndex(vtableAddr, function + + +# Sigs to functions +### ItemRenderer::renderGuiItemNew +textures/entity/shulker/shulker_ +xref out 1 time, then xref to last func and here you go + +### Level::getRuntimeActorList +48 89 5C 24 18 55 56 57 48 83 EC 40 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 38 48 8B F2 48 8B E9 48 89 +xref out and here u go + +### Actor::baseTick +48 89 5C 24 10 48 89 74 24 18 57 48 83 EC 40 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 30 8B +2nd xref is it + +### Player::BaseTick +gamePlayEmote, gamePlayFlying, /gameplay/death +xref out, count to off_, that -1 is func index + +### RaknetTick +Raknet tick calls this in "while" loop, before it could be found by searching for "Nat Punch timed out" +40 56 57 48 83 EC 28 48 8B F9 4C 8B CA 48 8B 49 20 49 B8 00 00 00 00 00 00 00 80 48 8B 57 38 48 8B 47 30 48 2B C2 48 2B C1 49 3B C0 0F 86 D1 00 00 00 BE 01 00 00 00 90 8B CE F0 48 0F C1 4F 30 48 8B 47 20 90 48 2B C8 48 2B CA 49 3B C8 0F 86 AA 00 00 00 48 89 5C 24 50 8B DE 48 89 6C 24 58 4C 89 74 24 20 F0 48 0F C1 5F 28 4C 8B 47 60 90 49 8B 50 08 90 49 8B 40 18 48 8B 0C D0 48 8B 01 48 8B CB 48 83 E1 E0 83 E3 1F 48 2B C8 48 C1 E3 06 + +### HudCursorRenderer::render +look for textures/ui/cross_hair or ui_crosshair, first function should be it + +### ItemRenderer::render +Look for this number 0x80100240C00 From a8e4819d5171ec737ed17dc238a4b71e3bebcf32 Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:58:16 +0200 Subject: [PATCH 104/240] Add ItemPhysics --- main.cpp | 6 +- src/Client/Module/Manager.cpp | 3 + .../Modules/ItemPhysics/ItemPhysics.hpp | 54 ++++ .../ItemPhysics/ItemPhysicsListener.cpp | 262 ++++++++++++++++++ .../ItemPhysics/ItemPhysicsListener.hpp | 34 +++ src/SDK/Client/Actor/Actor.cpp | 22 ++ src/SDK/Client/Actor/Actor.hpp | 2 + src/SDK/Client/Actor/ItemActor.cpp | 6 + src/SDK/Client/Actor/ItemActor.hpp | 8 + src/SDK/Client/Item/ItemStack.hpp | 2 + src/SDK/Client/Render/ActorRenderData.hpp | 23 ++ src/Utils/Memory/Game/Offset/OffsetInit.cpp | 13 + src/Utils/Memory/Game/Sig/SigInit.cpp | 33 +++ src/Utils/Memory/Memory.hpp | 30 +- 14 files changed, 494 insertions(+), 4 deletions(-) create mode 100644 src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp create mode 100644 src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp create mode 100644 src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.hpp create mode 100644 src/SDK/Client/Actor/ItemActor.cpp create mode 100644 src/SDK/Client/Actor/ItemActor.hpp create mode 100644 src/SDK/Client/Render/ActorRenderData.hpp diff --git a/main.cpp b/main.cpp index 64392213..aa1c2607 100644 --- a/main.cpp +++ b/main.cpp @@ -23,8 +23,8 @@ std::string removeColorCodes(const std::string& input); DWORD WINAPI init(HMODULE real) { - #ifndef NDEBUG - bool shouldDebug = true; // Change this bool locally, NEVER push it set to true +#ifndef NDEBUG + bool shouldDebug = false; // Change this bool locally, NEVER push it set to true if (GetConsoleWindow() == nullptr && shouldDebug) { AllocConsole(); @@ -32,7 +32,7 @@ DWORD WINAPI init(HMODULE real) FILE *out; freopen_s(&out, ("CONOUT$"), ("w"), stdout); } - #endif +#endif Client::initialize(); diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 744a2e94..0eba95bc 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -66,6 +66,8 @@ //#include "Modules/MovableChat/MovableChat.hpp" #include +#include "Modules/ItemPhysics/ItemPhysics.hpp" + namespace ModuleManager { std::unordered_map moduleMap; std::vector onlineUsers; @@ -157,6 +159,7 @@ void ModuleManager::initialize() { addModule(new InstantHurtAnimation()); //addModule(new MovableChat()); //addModule(new CompactChat()); + addModule(new ItemPhysics()); EventHandler::registerListener(new GUIKeyListener("GuiKeyListener")); EventHandler::registerListener(new DiscordRPCListener("DiscordRPC")); diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp new file mode 100644 index 00000000..c4d812cf --- /dev/null +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include "ItemPhysicsListener.hpp" +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" + +class ItemPhysics : public Module { +public: + ItemPhysicsListener* listener; + + ItemPhysics() : Module("ItemPhysics", "Changes rotation behavior of dropped items", IDR_BLOCK_PNG, "") { + Module::setup(); + } + + void onEnable() override { + listener = new ItemPhysicsListener("ItemPhysics", this); + + EventHandler::registerListener(listener); + + listener->onEnable(); + + Module::onEnable(); + } + + void onDisable() override { + listener->onDisable(); + + EventHandler::unregisterListener("ItemPhysics"); + + delete listener; + + Module::onDisable(); + } + + void defaultConfig() override { + if (settings.getSettingByName("speed") == nullptr) + settings.addSetting("speed", 8.f); + + if (settings.getSettingByName("xmul") == nullptr) + settings.addSetting("xmul", 18.f); + + if (settings.getSettingByName("ymul") == nullptr) + settings.addSetting("ymul", 16.f); + + if (settings.getSettingByName("zmul") == nullptr) + settings.addSetting("zmul", 18.f); + + if (settings.getSettingByName("preserverots")) + settings.addSetting("preserverots", false); + + if (settings.getSettingByName("smoothrots")) + settings.addSetting("smoothrots", true); + } +}; diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp new file mode 100644 index 00000000..b6a46890 --- /dev/null +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp @@ -0,0 +1,262 @@ +#include "ItemPhysicsListener.hpp" + +#include +#include + +#include "ItemPhysics.hpp" +#include "../../../../SDK/Client/Actor/ItemActor.hpp" +#include "../../../../Utils/Memory/CustomAllocator/Buffer.hpp" + +class INeedADecentHookClassForMemory { +public: + void* pointer = nullptr; + void* trampoline = nullptr; + bool valid = false; + + INeedADecentHookClassForMemory(void* function, void* hook) { + pointer = function; + + if (IsBadReadPtr(pointer, sizeof(pointer))) + return; + + if (const auto status = MH_CreateHook(pointer, hook, &trampoline); status == MH_OK) + valid = true; + } + + ~INeedADecentHookClassForMemory() { + disable(); + } + + void enable() const { + if (valid) + MH_EnableHook(pointer); + } + + void disable() const { + if (valid) + MH_DisableHook(pointer); + } +}; + +std::unique_ptr ItemRenderer_renderHook, glm_rotateHook; + +void ItemPhysicsListener::ItemRenderer_render(ItemRenderer* _this, BaseActorRenderContext* renderCtx, ActorRenderData* renderData) { + using func_t = void(*)(ItemRenderer*, BaseActorRenderContext*, ActorRenderData*); + static auto oFunc = reinterpret_cast(ItemRenderer_renderHook->trampoline); + + static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); + const auto listener = mod->listener; + + listener->renderData = renderData; + + oFunc(_this, renderCtx, renderData); +} + +void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, float y, float z) { + static auto rotateSig = Memory::findSig(GET_SIG("glm_rotate")); + using glm_rotate_t = void(__fastcall*)(glm::mat4x4&, float, float, float, float); + static auto glm_rotate = reinterpret_cast(rotateSig); + + static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); + const auto listener = mod->listener; + const auto renderData = listener->renderData; + + if (renderData == nullptr) + return; + + auto curr = reinterpret_cast(renderData->actor); + + static float height = 0.5f; + + if (!listener->actorData.contains(curr)) { + std::random_device rd; + std::mt19937 gen(rd()); + + std::uniform_int_distribution dist(0, 1); + std::uniform_int_distribution dist2(0, 359); + + const auto vec = Vec3(dist2(gen), dist2(gen), dist2(gen)); + const auto sign = Vec3(dist(gen) * 2 - 1, dist(gen) * 2 - 1, dist(gen) * 2 - 1); + + auto def = std::tuple{curr->isOnGround() ? 0.f : height, vec, sign}; + listener->actorData.emplace(curr, def); + } + + const float deltaTime = 1.f / static_cast(MC::fps); + + float& yMod = std::get<0>(listener->actorData.at(curr)); + + yMod -= height * deltaTime; + + if (yMod <= 0.f) + yMod = 0.f; + + Vec3 pos = renderData->position; + pos.y += yMod; + + auto& vec = std::get<1>(listener->actorData.at(curr)); + auto& sign = std::get<2>(listener->actorData.at(curr)); + + auto& settings = mod->settings; + const auto speed = settings.getSettingByName("speed"); + const auto xMul = settings.getSettingByName("xmul"); + const auto yMul = settings.getSettingByName("ymul"); + const auto zMul = settings.getSettingByName("zmul"); + + if (!curr->isOnGround() || yMod > 0.f) { + vec.x += static_cast(sign.x) * deltaTime * speed->value * xMul->value; + vec.y += static_cast(sign.y) * deltaTime * speed->value * yMul->value; + vec.z += static_cast(sign.z) * deltaTime * speed->value * zMul->value; + + if (vec.x > 360.f) + vec.x -= 360.f; + + if (vec.x < 0.f) + vec.x += 360.f; + + if (vec.y > 360.f) + vec.y -= 360.f; + + if (vec.y < 0.f) + vec.y += 360.f; + + if (vec.z > 360.f) + vec.z -= 360.f; + + if (vec.z < 0.f) + vec.z += 360.f; + } + + Vec3 renderVec = vec; + + const auto smoothRotations = settings.getSettingByName("smoothrots"); + const auto preserveRotations = settings.getSettingByName("preserverots"); + + if (curr->isOnGround() && yMod == 0.f && !preserveRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { + if (smoothRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { + vec.x += static_cast(sign.x) * deltaTime * speed->value * xMul->value; + + if (curr->getStack().block != nullptr) { + vec.z += static_cast(sign.z) * deltaTime * speed->value * zMul->value; + + if (vec.x > 360.f || vec.x < 0.f) { + vec.x = 0.f; + sign.x = 0; + } + + if (vec.z > 360.f || vec.z < 0.f) { + vec.z = 0.f; + sign.z = 0; + } + } + else { + vec.y += static_cast(sign.y) * deltaTime * speed->value * yMul->value; + + if (vec.x - 90.f > 360.f || vec.x - 90.f < 0.f) { + vec.x = 90.f; + sign.x = 0; + } + + if (vec.y > 360.f || vec.y < 0.f) { + vec.y = 0.f; + sign.y = 0; + } + } + } + + if (!smoothRotations) { + if (curr->getStack().block != nullptr) { + renderVec.x = 0.f; + renderVec.z = 0.f; + } + else { + renderVec.x = 90.f; + renderVec.y = 0.f; + } + } + } + + mat = translate(mat, {pos.x, pos.y, pos.z}); + + glm_rotate(mat, renderVec.x, 1.f, 0.f, 0.f); + glm_rotate(mat, renderVec.y, 0.f, 1.f, 0.f); + glm_rotate(mat, renderVec.z, 0.f, 0.f, 1.f); +} + +void ItemPhysicsListener::onSetupAndRender(SetupAndRenderEvent& event) { + if (!mod->isEnabled()) + return; + + const auto player = SDK::clientInstance->getLocalPlayer(); + + static bool playerNull = player == nullptr; + + if (playerNull != (player == nullptr)) { + playerNull = player == nullptr; + + if (playerNull) { + actorData.clear(); + renderData = nullptr; + } + } +} + +static char data[0x5], data2[0x5]; + +void ItemPhysicsListener::onEnable() { + static auto posAddr = Memory::findSig(GET_SIG("ItemPositionConst")) + 4; + origPosRel = *reinterpret_cast(posAddr); + + static auto rotateAddr = reinterpret_cast(Memory::findSig(GET_SIG("glm_rotateRef"))); + + if (glm_rotateHook == nullptr) + glm_rotateHook = std::make_unique(rotateAddr, glm_rotate); + + static auto ItemRenderer_renderAddr = reinterpret_cast(Memory::findSig(GET_SIG("ItemRenderer::render"))); + + if (ItemRenderer_renderHook == nullptr) + ItemRenderer_renderHook = std::make_unique(ItemRenderer_renderAddr, ItemRenderer_render); + + newPosRel = static_cast(AllocateBuffer(reinterpret_cast(posAddr))); + *newPosRel = 0.f; + + const auto newRipRel = Memory::getRipRel(posAddr, reinterpret_cast(newPosRel)); + + Memory::patchBytes(reinterpret_cast(posAddr), newRipRel.data(), 4); + + glm_rotateHook->enable(); + + Memory::patchBytes(rotateAddr, (BYTE*)"\xE8", 1); + + ItemRenderer_renderHook->enable(); + + static auto translateAddr = reinterpret_cast(Memory::findSig(GET_SIG("glm_translateRef"))); + Memory::copyBytes(translateAddr, data, 5); + Memory::nopBytes(translateAddr, 5); + + if (WinrtUtils::check(21, 0)) { + static auto translateAddr2 = reinterpret_cast(Memory::findSig(GET_SIG("glm_translateRef2"))); + Memory::copyBytes(translateAddr2, data2, 5); + Memory::nopBytes(translateAddr2, 5); + } +} + +void ItemPhysicsListener::onDisable() { + static auto posAddr = Memory::findSig(GET_SIG("ItemPositionConst")) + 4; + + Memory::patchBytes(reinterpret_cast(posAddr), &origPosRel, 4); + FreeBuffer(newPosRel); + + glm_rotateHook->disable(); + ItemRenderer_renderHook->disable(); + + static auto translateAddr = reinterpret_cast(Memory::findSig(GET_SIG("glm_translateRef"))); + Memory::patchBytes(translateAddr, data, 5); + + if (WinrtUtils::check(21, 0)) { + static auto translateAddr2 = reinterpret_cast(Memory::findSig(GET_SIG("glm_translateRef2"))); + Memory::patchBytes(translateAddr2, data2, 5); + } + + actorData.clear(); +} diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.hpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.hpp new file mode 100644 index 00000000..a676860b --- /dev/null +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include "../../../../SDK/Client/Render/ActorRenderData.hpp" +#include "../../../../SDK/Client/Render/ItemRenderer.hpp" +#include "../../../Events/Listener.hpp" + +class ItemPhysics; + +class ItemPhysicsListener : public Listener { + ItemPhysics* mod; + uint32_t origPosRel = 0; + float* newPosRel = nullptr; + + std::unordered_map, Vec3>> actorData; + ActorRenderData* renderData = nullptr; + + static void ItemRenderer_render(ItemRenderer* _this, BaseActorRenderContext* renderCtx, ActorRenderData* renderData); + static void glm_rotate(glm::mat4x4& mat, float angle, float x, float y, float z); + +public: + void onSetupAndRender(SetupAndRenderEvent& event) override; + + void onEnable(); + void onDisable(); + + explicit ItemPhysicsListener(const std::string& name, ItemPhysics* mod) { + this->name = name; + this->mod = mod; + } + + ~ItemPhysicsListener() { + onDisable(); + } +}; diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index 9c689c21..af1773a8 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -262,3 +262,25 @@ bool Actor::isValidAABB() { if(size.x < 0.1f || size.y < 0.1f) return false; return true; } + +bool Actor::isOnGround() { + const auto ctx = this->GetEntityContextV1_20_50(); + + if (WinrtUtils::check(20, 60)) { + using isOnGroundFunc = bool(__fastcall *)(uintptr_t&, EntityId&); + static isOnGroundFunc isOnGround = Memory::getOffsetFromSig(Memory::findSig(GET_SIG("ActorCollision::isOnGround")), 1); + + if (isOnGround) + return isOnGround(ctx->basicReg, ctx->id); + + return false; + } + + using isOnGroundFunc = bool(__fastcall *)(V1_20_50::EntityContext*); + static isOnGroundFunc isOnGround = reinterpret_cast(Memory::findSig(GET_SIG("ActorCollision::isOnGround"))); + + if (isOnGround) + return isOnGround(ctx); + + return false; +} diff --git a/src/SDK/Client/Actor/Actor.hpp b/src/SDK/Client/Actor/Actor.hpp index 6da3f40b..c9214ebb 100644 --- a/src/SDK/Client/Actor/Actor.hpp +++ b/src/SDK/Client/Actor/Actor.hpp @@ -223,4 +223,6 @@ class Actor { ActorDataFlagComponent *getActorDataFlagComponent(); void setHurtTime(int16_t hurtTime); + + bool isOnGround(); }; diff --git a/src/SDK/Client/Actor/ItemActor.cpp b/src/SDK/Client/Actor/ItemActor.cpp new file mode 100644 index 00000000..c1adbcfc --- /dev/null +++ b/src/SDK/Client/Actor/ItemActor.cpp @@ -0,0 +1,6 @@ +#include "ItemActor.hpp" + +ItemStack& ItemActor::getStack() { + static auto off = GET_OFFSET("ItemActor::stack"); + return hat::member_at(this, off); +} diff --git a/src/SDK/Client/Actor/ItemActor.hpp b/src/SDK/Client/Actor/ItemActor.hpp new file mode 100644 index 00000000..0d92328d --- /dev/null +++ b/src/SDK/Client/Actor/ItemActor.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include "Actor.hpp" + +class ItemActor : public Actor { +public: + ItemStack& getStack(); +}; diff --git a/src/SDK/Client/Item/ItemStack.hpp b/src/SDK/Client/Item/ItemStack.hpp index c91cabd5..e4f801fb 100644 --- a/src/SDK/Client/Item/ItemStack.hpp +++ b/src/SDK/Client/Item/ItemStack.hpp @@ -10,6 +10,8 @@ class ItemStack { public: uintptr_t** vtable; // 0x0 WeakPtr item; // 0x8 + void* userData; // 0x10, CompoundTag* + class Block* block; // 0x18 BUILD_ACCESS(this, void*, tag, GET_OFFSET("ItemStack::tag")); BUILD_ACCESS(this, unsigned char, count, GET_OFFSET("ItemStack::count")); diff --git a/src/SDK/Client/Render/ActorRenderData.hpp b/src/SDK/Client/Render/ActorRenderData.hpp new file mode 100644 index 00000000..2dbfb8cf --- /dev/null +++ b/src/SDK/Client/Render/ActorRenderData.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include "../Actor/Actor.hpp" +#include "../../../Utils/Utils.hpp" + +struct ActorRenderData { + Actor* actor; + void* extraData; + Vec3 position; + Vec2 rotation; + Vec2 headRot; + bool glint; + bool ignoreLighting; + bool isInUI; + float deltaTime; + int modelObjId; + float modelSize; + //AnimationComponent *animationComponent; + //MolangVariableMap *variables; + +private: + char pad[0x10]; +}; diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index 6c12e73b..b25469b0 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -30,6 +30,8 @@ void OffsetInit::init2120() { ADD_OFFSET("Level::hitResult", 0x220); ADD_OFFSET("Level::getPlayerMap", 0xBF8); + + ADD_OFFSET("ItemActor::stack", 0x408); } void OffsetInit::init2100() { @@ -49,6 +51,8 @@ void OffsetInit::init2100() { ADD_OFFSET("Level::hitResult", 0xB38); ADD_OFFSET("Level::getPlayerMap", 0x1BC8); // getRuntimeActorList offset + B8 || Level::getPlayerList + + ADD_OFFSET("ItemActor::stack", 0x448); } void OffsetInit::init2080() { @@ -69,6 +73,8 @@ void OffsetInit::init2080() { ADD_OFFSET("Level::hitResult", 0xB30); ADD_OFFSET("Level::getPlayerMap", 0x1C88); + + ADD_OFFSET("ItemActor::stack", 0x470); } void OffsetInit::init2070() { @@ -92,6 +98,7 @@ void OffsetInit::init2070() { ADD_OFFSET("Level::hitResult", 0xB18); + ADD_OFFSET("ItemActor::stack", 0x498); } void OffsetInit::init2060() { @@ -115,6 +122,8 @@ void OffsetInit::init2060() { ADD_OFFSET("Level::hitResult", 0xA98); ADD_OFFSET("Level::getPlayerMap", 0x1E98); + + ADD_OFFSET("ItemActor::stack", 0x4D0); } void OffsetInit::init2050() { @@ -139,6 +148,8 @@ void OffsetInit::init2050() { ADD_OFFSET("Level::hitResult", 0xA48); ADD_OFFSET("Level::getPlayerMap", 0x1EA8); + + ADD_OFFSET("ItemActor::stack", 0x4C8); } void OffsetInit::init2040() { @@ -284,4 +295,6 @@ void OffsetInit::init2030() { ADD_OFFSET("Level::hitResult", 0xA48); ADD_OFFSET("Level::getPlayerMap", 0x2608); + + ADD_OFFSET("ItemActor::stack", 0x4A0); } diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 81c8c511..42b2b282 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -16,6 +16,8 @@ void SigInit::init2120() { ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 81"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 40"); + + ADD_SIG("ActorCollision::isOnGround", "E8 ? ? ? ? 84 C0 49 8B 87"); } void SigInit::init2102() { @@ -29,6 +31,17 @@ void SigInit::init2100() { ADD_SIG("BlockSource::getBiome", "48 89 5C 24 18 57 48 83 EC 50 48 8B F9 E8"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 10"); + + ADD_SIG("ActorCollision::isOnGround", "E8 ? ? ? ? 88 45 FF"); + + ADD_SIG("ItemPositionConst", "F3 0F 10 ? ? ? ? ? F3 0F 59 ? F3 0F 58 C7"); + + ADD_SIG("glm_rotateRef", "E8 ? ? ? ? 41 BD ? ? ? ? 41 0F B6 46"); + + ADD_SIG("glm_translateRef", "? ? ? ? ? 4C 8D 05 ? ? ? ? 44 0F 28 05"); + ADD_SIG("glm_translateRef2", "? ? ? ? ? C6 46 ? ? F3 0F 11 74 24 ? F3 0F 10 1D"); + + ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 40 ? 44 0F 29 48 ? 49 8B D8"); } void SigInit::init2080() { @@ -48,6 +61,10 @@ void SigInit::init2080() { ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 48 8D AC 24 F0 FE FF FF 48 81 EC 10 02 00 00 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 85 00 01 00 00 41"); ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); + + ADD_SIG("glm_rotateRef", "E8 ? ? ? ? BA ? ? ? ? 0F B6 43"); + + ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 ? ? 44 0F 29 ? ? 44 0F 29 ? ? ? ? ? 44 0F 29 ? ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 49 8B F8"); } void SigInit::init2070() { @@ -78,6 +95,8 @@ void SigInit::init2060() { ADD_SIG("Actor::getArmor", "48 8B 89 58 04 00 00 48 8B 01 48 8B 40 28 48"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C8 1C 00 00"); + + ADD_SIG("ActorCollision::isOnGround", "E8 ? ? ? ? 84 C0 49 8B 87"); } void SigInit::init2050() { @@ -101,6 +120,8 @@ void SigInit::init2050() { ADD_SIG("Actor::getOffhandSlot", "48 8B 89 ? ? ? ? BA ? ? ? ? 48 8B 01 48 8B 40 ? 48 FF 25"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 D8 1C 00 00"); + + ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 40 ? 44 0F 29 48 ? 44 0F 29 90 ? ? ? ? 44 0F 29 98 ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 49 8B D8"); } void SigInit::init2040() { @@ -134,6 +155,8 @@ void SigInit::init2030() { ADD_SIG("Actor::getAABBShapeComponent", "DA BA F2 C9 10 1B"); ADD_SIG("Actor::getStateVectorComponent", "DA BA 91 3C C9 0E"); + ADD_SIG("ActorCollision::isOnGround", "40 53 48 83 EC ? 48 8B D9 BA E1 2D 1F 21"); + // AutoGG, AutoRQ, DiscordRPC ... ADD_SIG("LoopbackPacketSender::sendPacket", "48 89 5C 24 ? 57 48 83 EC 20 48 8B D9 48 8B FA 48 8B 49 20 E8 ? ? ? ? 4C 8B 03 48 8B D7"); ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 FF CA 81 FA ? ? ? ? 0F 87 ? ? ? ? 48 63 C2 48 8D 0D ? ? ? ? 0F B6 84 01 ? ? ? ? 8B 94 81 ? ? ? ? 48 03 D1"); @@ -232,4 +255,14 @@ void SigInit::init2030() { ADD_SIG("HitResult::getEntity", "E8 ? ? ? ? EB 1A 48 8B CE"); ADD_SIG("ClientInstance::getLocalPlayerIndex", "49 8B 00 49 8B C8 48 8B 80 ? ? ? ? FF 15 ? ? ? ? 48 85 C0 0F 84 ? ? ? ? 0F"); + + // ItemPhysics + ADD_SIG("ItemPositionConst", "F3 0F 59 ? ? ? ? ? F3 41 0F 58 ? ? ? ? ? ? F3 0F 59 ? ? ? ? ? F3 0F 2C"); + + ADD_SIG("glm_rotate", "40 53 48 83 EC ? F3 0F 59 ? ? ? ? ? 4C 8D 4C 24"); + ADD_SIG("glm_rotateRef", "E8 ? ? ? ? B8 ? ? ? ? 41 0F B6"); + + ADD_SIG("glm_translateRef", "? ? ? ? ? 41 C6 ? ? ? F3 0F 11 7C 24 ? 41 0F 28 DA"); + + ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 40 ? 44 0F 29 48 ? 44 0F 29 90 ? ? ? ? 44 0F 29 98 ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 49 8B D8"); } diff --git a/src/Utils/Memory/Memory.hpp b/src/Utils/Memory/Memory.hpp index 32613dfe..e3019527 100644 --- a/src/Utils/Memory/Memory.hpp +++ b/src/Utils/Memory/Memory.hpp @@ -128,7 +128,30 @@ class Memory { return addr; } - static void patchBytes(void *dst, void *src, unsigned int size) { + static void nopBytes(void* dst, const unsigned int size) { + if (dst == nullptr) + return; + + DWORD oldprotect; + VirtualProtect(dst, size, PAGE_EXECUTE_READWRITE, &oldprotect); + memset(dst, 0x90, size); + VirtualProtect(dst, size, oldprotect, &oldprotect); + } + + static void copyBytes(void* src, void* dst, const unsigned int size) { + if (src == nullptr || dst == nullptr) + return; + + DWORD oldprotect; + VirtualProtect(src, size, PAGE_EXECUTE_READWRITE, &oldprotect); + memcpy(dst, src, size); + VirtualProtect(src, size, oldprotect, &oldprotect); + } + + static void patchBytes(void *dst, const void *src, const unsigned int size) { + if (src == nullptr || dst == nullptr) + return; + DWORD oldprotect; VirtualProtect(dst, size, PAGE_EXECUTE_READWRITE, &oldprotect); memcpy(dst, src, size); @@ -143,6 +166,11 @@ class Memory { return sig + offset + 4 + *reinterpret_cast(sig + offset); } + template + static Ret getOffsetFromSig(const uintptr_t sig, const int offset) { + return reinterpret_cast(offsetFromSig(sig, offset)); + } + static inline std::array getRipRel(uintptr_t instructionAddress, uintptr_t targetAddress) { uintptr_t relAddress = targetAddress - (instructionAddress + 4); // 4 bytes for RIP-relative addressing std::array relRipBytes{}; From 24657583657e43f769956fcda16d35ca537428e5 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 16:41:38 +0300 Subject: [PATCH 105/240] item physics icon --- src/Assets/Assets.hpp | 1 + src/Assets/Assets.rc | 1 + src/Assets/Data/item-physics.png | Bin 0 -> 506 bytes .../Module/Modules/ItemPhysics/ItemPhysics.hpp | 2 +- 4 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 src/Assets/Data/item-physics.png diff --git a/src/Assets/Assets.hpp b/src/Assets/Assets.hpp index 45f1c63a..ef6902bb 100644 --- a/src/Assets/Assets.hpp +++ b/src/Assets/Assets.hpp @@ -69,6 +69,7 @@ #define IDR_STYLUS_WHITE_PNG 169 #define IDR_SETTINGS_PNG 170 #define IDR_SETTINGS_WHITE_PNG 171 +#define IDR_ITEM_PHYSICS_PNG 172 // MAKE SURE YOU ALWAYS UPDATE THIS! #define MAX_IMAGE_ID 171 diff --git a/src/Assets/Assets.rc b/src/Assets/Assets.rc index b3f0be8f..72c60d39 100644 --- a/src/Assets/Assets.rc +++ b/src/Assets/Assets.rc @@ -62,6 +62,7 @@ IDR_TEXT_BOX_PNG PNG "Data\\text-box.png" IDR_TIME_PNG PNG "Data\\time.png" IDR_TRANSPARENT_PNG PNG "Data\\transparent.png" IDR_UPSIDE_DOWN_PNG PNG "Data\\upside-down.png" +IDR_ITEM_PHYSICS_PNG PNG "Data\\item-physics.png" IDR_SETTINGS_PNG PNG "Data\\settings.png" IDR_SETTINGS_WHITE_PNG PNG "Data\\settingswhite.png" diff --git a/src/Assets/Data/item-physics.png b/src/Assets/Data/item-physics.png new file mode 100644 index 0000000000000000000000000000000000000000..12b257d8f9086d09533d98ed3a07541baceaf26a GIT binary patch literal 506 zcmV!&RNL&{6!mDMJNeP&a_2abk&b>FJ?b~ynmi7Qb z|6N#Tc!=X8-+te2wR4;TFs)asm}2}f?sox$vn=zAqSza(l(b$7^lC-wy6z?~!q8`d zn)&>OwHeSDs#n8&d{TwiPI;bR@qwoVXLHji%4Flpt&5^)aZSh%-)FkrJUsQh`>LwS zGXUNsN^rMaZf3LDt8Cl^WIX?`@fZX_2mt_i!67*HG~yF4}p>8O}c2%FH}a~Rh>*9KL7v#07*qoM6N<$f~;KEqW}N^ literal 0 HcmV?d00001 diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp index c4d812cf..c438ff29 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp @@ -8,7 +8,7 @@ class ItemPhysics : public Module { public: ItemPhysicsListener* listener; - ItemPhysics() : Module("ItemPhysics", "Changes rotation behavior of dropped items", IDR_BLOCK_PNG, "") { + ItemPhysics() : Module("ItemPhysics", "Changes rotation behavior of dropped items", IDR_ITEM_PHYSICS_PNG, "") { Module::setup(); } From 9e8c349ec92abeed415f6eaf2de7a89ae98b6b3b Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 16:41:51 +0300 Subject: [PATCH 106/240] item physics settings page --- .../Modules/ItemPhysics/ItemPhysics.hpp | 112 +++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp index c438ff29..87cb0311 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp @@ -45,10 +45,118 @@ class ItemPhysics : public Module { if (settings.getSettingByName("zmul") == nullptr) settings.addSetting("zmul", 18.f); - if (settings.getSettingByName("preserverots")) + if (settings.getSettingByName("preserverots") == nullptr) settings.addSetting("preserverots", false); - if (settings.getSettingByName("smoothrots")) + if (settings.getSettingByName("smoothrots") == nullptr) settings.addSetting("smoothrots", true); } + + void settingsRender() override { + /* Border Start */ + + float xPos = Constraints::PercentageConstraint(0.019, "left"); + float yPos = Constraints::PercentageConstraint(0.10, "top"); + + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + /* Speed Start */ + + FlarialGUI::FlarialTextWithFont(xPos, yPos, L"Speed", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + float speed = FlarialGUI::Slider(0, xPos + FlarialGUI::SettingsTextWidth("Speed "), + yPos, + this->settings.getSettingByName("speed")->value, 15.f, 3.f); + + this->settings.getSettingByName("speed")->value = speed; + + /* Speed End */ + + yPos += Constraints::SpacingConstraint(0.35, textWidth); + + /* X Multiplier Start */ + + FlarialGUI::FlarialTextWithFont(xPos, yPos + 0.05f, L"X Multiplier", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + float xmul = FlarialGUI::Slider(1, xPos + FlarialGUI::SettingsTextWidth("X Multiplier "), + yPos, + this->settings.getSettingByName("xmul")->value, 30.f, 7.f); + + this->settings.getSettingByName("xmul")->value = xmul; + + /* X Multiplier End */ + + yPos += Constraints::SpacingConstraint(0.35, textWidth); + + /* Y Multiplier Start */ + + FlarialGUI::FlarialTextWithFont(xPos, yPos + 0.1f, L"Y Multiplier", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + float ymul = FlarialGUI::Slider(1, xPos + FlarialGUI::SettingsTextWidth("Y Multiplier "), + yPos, + this->settings.getSettingByName("ymul")->value, 30.f, 7.f); + + this->settings.getSettingByName("ymul")->value = ymul; + + /* Y Multiplier End */ + + yPos += Constraints::SpacingConstraint(0.35, textWidth); + + /* Z Multiplier Start */ + + FlarialGUI::FlarialTextWithFont(xPos, yPos + 0.15f, L"Z Multiplier", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + float zmul = FlarialGUI::Slider(2, xPos + FlarialGUI::SettingsTextWidth("Z Multiplier "), + yPos, + this->settings.getSettingByName("zmul")->value, 30.f, 7.f); + + this->settings.getSettingByName("zmul")->value = zmul; + + /* Z Multiplier End */ + + yPos += Constraints::SpacingConstraint(0.35, textWidth); + + /* Preserve Rotations Start */ + + FlarialGUI::FlarialTextWithFont(xPos + Constraints::SpacingConstraint(0.60, textWidth), yPos, + L"Preserve Rotations", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(0, xPos, yPos, this->settings.getSettingByName( + "preserverots")->value)) + this->settings.getSettingByName("preserverots")->value = !this->settings.getSettingByName( + "preserverots")->value; + + /* Preserve Rotations End */ + + yPos += Constraints::SpacingConstraint(0.35, textWidth); + + /* Smooth Rotations Start */ + + FlarialGUI::FlarialTextWithFont(xPos + Constraints::SpacingConstraint(0.60, textWidth), yPos, + L"Smooth Rotations", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(1, xPos, yPos, this->settings.getSettingByName( + "smoothrots")->value)) + this->settings.getSettingByName("smoothrots")->value = !this->settings.getSettingByName( + "smoothrots")->value; + + /* Smooth Rotations End */ + } }; From 738240321d391c7bc8ed03ffe477ce27e8b47dcf Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 16 Aug 2024 16:52:49 +0300 Subject: [PATCH 107/240] Update max image ID --- src/Assets/Assets.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Assets/Assets.hpp b/src/Assets/Assets.hpp index ef6902bb..6170ba00 100644 --- a/src/Assets/Assets.hpp +++ b/src/Assets/Assets.hpp @@ -72,5 +72,5 @@ #define IDR_ITEM_PHYSICS_PNG 172 // MAKE SURE YOU ALWAYS UPDATE THIS! -#define MAX_IMAGE_ID 171 +#define MAX_IMAGE_ID 172 From dfacd4c7a2f690780c7f8e5bea166dbb4ed0a1d3 Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:52:05 +0200 Subject: [PATCH 108/240] Enable killdx by default for now --- src/Client/Client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 4ec2e69f..1cefe560 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -102,7 +102,7 @@ void Client::initialize() { Client::settings.addSetting("blurintensity", 18.0f); if (Client::settings.getSettingByName("killdx") == nullptr) - Client::settings.addSetting("killdx", false); + Client::settings.addSetting("killdx", true); // TODO: Fix dx12 stuff and set this to false again if (Client::settings.getSettingByName("disable_alias") == nullptr) Client::settings.addSetting("disable_alias", false); From 7d0d6097b9ff8e6c2fcbda34e5625ae9fcde0f56 Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:52:17 +0200 Subject: [PATCH 109/240] Fix HurtColor on 1.21.2X --- src/Client/Hook/Manager.cpp | 4 +--- src/Client/Module/Manager.cpp | 4 +--- src/Utils/Memory/Game/Sig/SigInit.cpp | 2 ++ 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Client/Hook/Manager.cpp b/src/Client/Hook/Manager.cpp index d28d8bec..549b98da 100644 --- a/src/Client/Hook/Manager.cpp +++ b/src/Client/Hook/Manager.cpp @@ -59,9 +59,7 @@ void HookManager::initialize() { hooks.push_back(new OnSuspendHook()); hooks.push_back(new getGammaHook()); hooks.push_back(new FontDrawTransformedHook()); - if(!WinrtUtils::check(21,20)) { // TODO - hooks.push_back(new HurtColorHook()); - } + hooks.push_back(new HurtColorHook()); hooks.push_back(new DimensionFogColorHook()); hooks.push_back(new OverworldFogColorHook()); hooks.push_back(new TimeChangerHook()); diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 0eba95bc..cee43e8a 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -125,9 +125,7 @@ void ModuleManager::initialize() { addModule(new Hitbox()); addModule(new ThirdPerson()); addModule(new SnapLook()); - if(!WinrtUtils::check(21,20)) { // TODO - addModule(new HurtColor()); - } + addModule(new HurtColor()); addModule(new FogColor()); addModule(new ArmorHUD()); diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 42b2b282..16f3bd7f 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -18,6 +18,8 @@ void SigInit::init2120() { ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 40"); ADD_SIG("ActorCollision::isOnGround", "E8 ? ? ? ? 84 C0 49 8B 87"); + + ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24 ? 48 8B 4B ? 89 44 24 ? E8 ? ? ? ? 4C 8B D8"); } void SigInit::init2102() { From 0dc97855939af86b9b53401ff9ca05e5786d08e3 Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:55:53 +0200 Subject: [PATCH 110/240] Fix MinecraftUIRenderContext::drawImage hook for 1.21.2X --- .../Hook/Hooks/Render/SetupAndRenderHook.hpp | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp index 187d5fb0..e0857342 100644 --- a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp +++ b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp @@ -51,6 +51,31 @@ class SetUpAndRenderHook : public Hook ); } + static void drawImageDetour2120( + MinecraftUIRenderContext* _this, + TexturePtr* texturePtr, + Vec2& imagePos, + Vec2& imageDimension, + Vec2& uvPos, + Vec2& uvSize, + bool unk + ) + { + DrawImageEvent event(texturePtr, imagePos); + EventHandler::onDrawImage(event); + + Memory::CallFunc&, Vec2&, Vec2&, Vec2&>( + oDrawImage, + _this, + texturePtr, + event.getImagePos(), + imageDimension, + uvPos, + uvSize, + unk + ); + } + static void hookDrawTextAndDrawImage(MinecraftUIRenderContext* muirc) { auto vTable = *(uintptr_t **) muirc; @@ -59,11 +84,12 @@ class SetUpAndRenderHook : public Hook "drawText"); } - if(!WinrtUtils::check(21,20)) { // TODO - if (oDrawImage == nullptr) { - Memory::hookFunc((void *) vTable[7], (void *) drawImageDetour, (void **) &oDrawImage, "DrawImage"); - } - } + if (oDrawImage == nullptr) { + if (WinrtUtils::check(21, 20)) + Memory::hookFunc((void *) vTable[7], (void *) drawImageDetour2120, (void **) &oDrawImage, "DrawImage"); + else + Memory::hookFunc((void *) vTable[7], (void *) drawImageDetour, (void **) &oDrawImage, "DrawImage"); + } } static void setUpAndRenderCallback(ScreenView* pScreenView, MinecraftUIRenderContext* muirc) { From 14b57a9b3749d8957b637851a99b2d04a754c7a9 Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:07:38 +0200 Subject: [PATCH 111/240] Fix snow option in WeatherChanger for 1.21.0+ --- .../Modules/WeatherChanger/WeatherChanger.hpp | 26 ++++++++----------- .../WeatherChanger/WeatherListener.hpp | 14 +++++----- src/Utils/Memory/Game/Sig/SigInit.cpp | 2 +- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/Client/Module/Modules/WeatherChanger/WeatherChanger.hpp b/src/Client/Module/Modules/WeatherChanger/WeatherChanger.hpp index 75adc9f6..9ab4b376 100644 --- a/src/Client/Module/Modules/WeatherChanger/WeatherChanger.hpp +++ b/src/Client/Module/Modules/WeatherChanger/WeatherChanger.hpp @@ -66,21 +66,17 @@ class WeatherChanger : public Module { this->settings.getSettingByName("lighting")->value = percent; - if (!WinrtUtils::check(21, 0)) { - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "snow")->value)) - this->settings.getSettingByName("snow")->value = !this->settings.getSettingByName( - "snow")->value; - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth / 2.0f), toggleY, - L"Snow (intensity depends on rain)", - Constraints::SpacingConstraint(4.5, textWidth), textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - } + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( + "snow")->value)) + this->settings.getSettingByName("snow")->value = !this->settings.getSettingByName( + "snow")->value; + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth / 2.0f), toggleY, + L"Snow (intensity depends on rain)", + Constraints::SpacingConstraint(4.5, textWidth), textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(0.95, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); } }; diff --git a/src/Client/Module/Modules/WeatherChanger/WeatherListener.hpp b/src/Client/Module/Modules/WeatherChanger/WeatherListener.hpp index e84bd10b..dcaa3ca4 100644 --- a/src/Client/Module/Modules/WeatherChanger/WeatherListener.hpp +++ b/src/Client/Module/Modules/WeatherChanger/WeatherListener.hpp @@ -26,14 +26,12 @@ class WeatherListener : public Listener { "lighting")->value; else SDK::clientInstance->getBlockSource()->getDimension()->weather->lightingLevel = 0.0f; - if (!WinrtUtils::check(21, 0)) { - // TODO: When you set snow, it will stay even if on until game reload - if (module->settings.getSettingByName("snow")->value) { - Vec3 *pos = event.getActor()->getPosition(); - Vec3 e((int)pos->x, (int)pos->y, (int)pos->z); - - SDK::clientInstance->getBlockSource()->getBiome(e)->temparature = 0.0f; - } + // TODO: When you set snow, it will stay even if on until game reload + if (module->settings.getSettingByName("snow")->value) { + Vec3 *pos = event.getActor()->getPosition(); + Vec3 e((int)pos->x, (int)pos->y, (int)pos->z); + + SDK::clientInstance->getBlockSource()->getBiome(e)->temparature = 0.0f; } } } diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 16f3bd7f..ddf45665 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -31,7 +31,7 @@ void SigInit::init2102() { void SigInit::init2100() { Logger::debug("[Signatures] Loading sigs for 1.21.0X"); - ADD_SIG("BlockSource::getBiome", "48 89 5C 24 18 57 48 83 EC 50 48 8B F9 E8"); + ADD_SIG("BlockSource::getBiome", "40 53 48 83 EC ? 48 8B D9 E8 ? ? ? ? 48 85 C0 75 ? 48 8B 03"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 10"); ADD_SIG("ActorCollision::isOnGround", "E8 ? ? ? ? 88 45 FF"); From a0005cb839138ddd0dee65f12f732ecd6ab6fda1 Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:27:05 +0200 Subject: [PATCH 112/240] Fix ItemPhysics crashing in 1.20.4X --- src/Utils/Memory/Game/Sig/SigInit.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index ddf45665..5437374f 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -123,6 +123,8 @@ void SigInit::init2050() { ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 D8 1C 00 00"); + ADD_SIG("ItemPositionConst", "F3 0F 59 ? ? ? ? ? F3 41 0F 58 ? ? ? ? ? ? F3 0F 59 ? ? ? ? ? F3 0F 2C"); + ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 40 ? 44 0F 29 48 ? 44 0F 29 90 ? ? ? ? 44 0F 29 98 ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 49 8B D8"); } @@ -136,6 +138,8 @@ void SigInit::init2040() { ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 78"); + + ADD_SIG("ItemPositionConst", "F3 0F 59 05 ? ? ? ? F3 41 0F 58 87"); } void SigInit::init2030() { From 1bf8ba72919c253b971feea16a72c4a79c058f0b Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:09:29 +0200 Subject: [PATCH 113/240] Fix RenderOptions for 1.20.4X, fix try_get method being unreliable --- src/Client/Module/Manager.cpp | 4 +- src/SDK/Client/Actor/Actor.cpp | 69 +++------------------ src/SDK/Client/Core/Options.hpp | 7 +-- src/Utils/Memory/Game/Offset/OffsetInit.cpp | 2 + src/Utils/Memory/Game/Sig/SigInit.cpp | 2 +- 5 files changed, 15 insertions(+), 69 deletions(-) diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index cee43e8a..576bb3ed 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -131,9 +131,7 @@ void ModuleManager::initialize() { addModule(new TimeChanger()); - if((WinrtUtils::check(20,30) && !WinrtUtils::check(20,40)) || WinrtUtils::check(20,50)) { // does not work in 1.20.4X - addModule(new RenderOptions()); - } + addModule(new RenderOptions()); addModule(new PaperDoll()); addModule(new GuiScale()); diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index af1773a8..c6629374 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -66,13 +66,8 @@ uint64_t Actor::getRuntimeID() { ActorDataFlagComponent* Actor::getActorDataFlagComponent() { if(!WinrtUtils::check(20, 80)) return nullptr; - static uintptr_t sig; - if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getActorDataFlagComponent")); - auto size = Utils::CountBytes(GET_SIG("tryGetPrefix2")); - sig = sig - size; - } + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix2")) + " " + GET_SIG("Actor::getActorDataFlagComponent")); return tryGet(sig); } @@ -95,26 +90,16 @@ Vec3 *Actor::getPosition() { SimpleContainer* Actor::getArmorContainer() { if(!WinrtUtils::check(20, 80)) return nullptr; - static uintptr_t sig; - if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getActorEquipmentComponent")); - auto size = Utils::CountBytes(GET_SIG("tryGetPrefix2")); - sig = sig - size; - } + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix2")) + " " + GET_SIG("Actor::getActorEquipmentComponent")); return tryGet(sig)->mArmorContainer; } SimpleContainer* Actor::getOffhandContainer() { if(!WinrtUtils::check(20, 80)) return nullptr; - static uintptr_t sig; - if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getActorEquipmentComponent")); - auto size = Utils::CountBytes(GET_SIG("tryGetPrefix2")); - sig = sig - size; - } + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix2")) + " " + GET_SIG("Actor::getActorEquipmentComponent")); return tryGet(sig)->mOffhandContainer; } @@ -136,52 +121,28 @@ ItemStack *Actor::getArmor(int slot) { MoveInputComponent *Actor::getMoveInputHandler() { //??$try_get@UMoveInputComponent - static uintptr_t sig; - - if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getMoveInputHandler")); // 8B DA BA 2E CD 8B 46 - auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); - sig = sig - size; - } + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix")) + " " + GET_SIG("Actor::getMoveInputHandler")); return tryGet(sig); } ActorGameTypeComponent *Actor::getGameModeType() { - static uintptr_t sig; - - if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getActorGameTypeComponent")); // 8B DA BA DE AB CB AF - auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); - sig = sig - size; - } + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix")) + " " + GET_SIG("Actor::getActorGameTypeComponent")); return tryGet(sig); } AABBShapeComponent *Actor::getAABBShapeComponent() { - static uintptr_t sig; - - if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getAABBShapeComponent")); // 8B DA BA F2 C9 10 1B - auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); - sig = sig - size; - } + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix")) + " " + GET_SIG("Actor::getAABBShapeComponent")); return tryGet(sig); } StateVectorComponent *Actor::getStateVectorComponent() { - static uintptr_t sig; - - if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getStateVectorComponent")); // 8B DA BA 91 3C C9 0E - auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); - sig = sig - size; - } + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix")) + " " + GET_SIG("Actor::getStateVectorComponent")); return tryGet(sig); } @@ -202,13 +163,7 @@ ItemStack *Actor::getOffhandSlot() { } RuntimeIDComponent *Actor::getRuntimeIDComponent() { - static uintptr_t sig; - - if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getRuntimeIDComponent")); // 8B DA BA 14 14 A1 3C - auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); - sig = sig - size; - } + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix")) + " " + GET_SIG("Actor::getRuntimeIDComponent")); return tryGet(sig); } @@ -244,13 +199,7 @@ bool Actor::hasCategory(ActorCategory category) { } RenderPositionComponent *Actor::getRenderPositionComponent() { //??$try_get@URenderPositionComponent - static uintptr_t sig; - - if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getRenderPositionComponent")); // 8B DA BA 6E F3 E8 D4 - auto size = Utils::CountBytes(GET_SIG("tryGetPrefix")); - sig = sig - size; - } + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix")) + " " + GET_SIG("Actor::getRenderPositionComponent")); return tryGet(sig); } diff --git a/src/SDK/Client/Core/Options.hpp b/src/SDK/Client/Core/Options.hpp index f341d5dd..b6c41f34 100644 --- a/src/SDK/Client/Core/Options.hpp +++ b/src/SDK/Client/Core/Options.hpp @@ -35,9 +35,7 @@ class Options { static void initialize(const uintptr_t optionsEntryPtr){ optionsBaseEntry = (uintptr_t **) optionsEntryPtr; initialized = true; - if((WinrtUtils::check(20,30) && !WinrtUtils::check(20,40)) || WinrtUtils::check(20,50)) { // does not work in 1.20.4X (crashes) - initVsync(); - } + initVsync(); }; static bool isInitialized() { @@ -77,8 +75,7 @@ class Options { return nullptr; }; static Option* getOption(const std::string& optionName) { - // disable getting settings in 1.20.4X - if(!isInitialized() || !((WinrtUtils::check(20,30) && !WinrtUtils::check(20,40)) || WinrtUtils::check(20,50))) return nullptr; + if(!isInitialized()) return nullptr; std::hash optionNameHash; UINT32 key = optionNameHash(optionName); diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index b25469b0..212e4c5b 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -169,6 +169,8 @@ void OffsetInit::init2040() { ADD_OFFSET("Level::hitResult", 0xA68); ADD_OFFSET("Level::getPlayerMap", 0x25F0); + + ADD_OFFSET("OptionInfo::TranslateName", 0x168); } void OffsetInit::init2030() { diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 5437374f..24fa8953 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -123,7 +123,7 @@ void SigInit::init2050() { ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 D8 1C 00 00"); - ADD_SIG("ItemPositionConst", "F3 0F 59 ? ? ? ? ? F3 41 0F 58 ? ? ? ? ? ? F3 0F 59 ? ? ? ? ? F3 0F 2C"); + ADD_SIG("ItemPositionConst", "F3 0F 59 ? ? ? ? ? F3 41 0F 58 ? ? ? ? ? ? F3 0F 59 ? ? ? ? ? F3 0F 2C"); // Yes this is the same sig as 1.20.30 ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 40 ? 44 0F 29 48 ? 44 0F 29 90 ? ? ? ? 44 0F 29 98 ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 49 8B D8"); } From a7fe375f47c164508a0ebcc6040b42825485205d Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Fri, 16 Aug 2024 22:36:37 +0600 Subject: [PATCH 114/240] future OpenCV stuff --- CMakeLists.txt | 13 +- README.md | 6 + src/Client/GUI/Engine/Effects/Blur/blur.cpp | 405 +++--------------- .../GUI/Engine/Effects/Blur/blur_dx12.cpp | 220 ---------- src/Client/GUI/Engine/Engine.hpp | 45 +- .../Hook/Hooks/Render/SwapchainHook.cpp | 5 +- .../Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- 7 files changed, 88 insertions(+), 608 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 300ccc61..47237d1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,15 +87,22 @@ endif() add_library(MinHook SHARED IMPORTED GLOBAL) set_target_properties(MinHook PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/minhook/minhook.lib") + FetchContent_Declare( libhat GIT_REPOSITORY https://github.com/BasedInc/libhat.git - GIT_TAG 9ef05d6961ce37a4c801f11159de895aa21878a9 + GIT_TAG f4755aea0987e77c0f6f496c49eb9cd08d5f5a06 + GIT_SHALLOW TRUE + GIT_PROGRESS TRUE ) FetchContent_MakeAvailable(libhat) +set(OpenCV_DIR C:/opencv/opencv/build/) +find_package(OpenCV REQUIRED) +target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS} libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) +target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) -target_link_libraries(${PROJECT_NAME} PRIVATE libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) -target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) \ No newline at end of file +set(CPACK_PROJECT_NAME ${PROJECT_NAME}) +set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) \ No newline at end of file diff --git a/README.md b/README.md index d1a2444c..efd337a6 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,12 @@ If you encounter issues, check out our [FAQ](https://discord.gg/flarial-communit 2. **Git**: Install Git if you haven't already. You can download Git from [git-scm.com](https://git-scm.com/downloads) and follow the installation instructions. + + +3. **OpenCV**: Install [OpenCV](https://opencv.org/releases). Click the "Windows" option and follow these instructions: + - When running the installer, make sure you choose the path to be "C:/opencv" + - Add the path C:\opencv\opencv\build\x64\vc16\bin to your Environment Variables (PATH) for it to work properly + - You are good to go! You can now build Flarial. ### Steps to Clone and Build the Project: 1. **Clone the Repository**: diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 5daf4cbb..0ec778db 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -1,373 +1,92 @@ +#pragma once #include #include #include +#include +#include #include "../../Engine.hpp" #include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" #include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" -// CREDITS @MR CHIPS (@chyves) -#define BLUR_OFFSET 10 -static const XMFLOAT4 quadVertices[] = - { - XMFLOAT4(1.0, -1.0, 0.0, 1.0), - XMFLOAT4(-1.0, -1.0, 0.0, 1.0), - XMFLOAT4(-1.0, 1.0, 0.0, 1.0), - XMFLOAT4(-1.0, 1.0, 0.0, 1.0), - XMFLOAT4(1.0, 1.0, 0.0, 1.0), - XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; +void Blur::RenderBlur(ID3D11Texture2D* inputTexture, ID3D11Device* device, ID3D11DeviceContext* deviceContext) { + ID3D11ShaderResourceView* inputSRV = nullptr; + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = 1; + srvDesc.Texture2D.MostDetailedMip = 0; + device->CreateShaderResourceView(inputTexture, &srvDesc, &inputSRV); -const char *vertexShaderSrc = "struct VS_INPUT {\ - float4 pos : POSITION;\ -};\ -\ -float4 main(VS_INPUT input) : SV_POSITION {\ - return input.pos;\ -}"; + D3D11_TEXTURE2D_DESC inputDesc; + inputTexture->GetDesc(&inputDesc); -const char *downsampleShaderSrc = R"( -cbuffer BlurInputBuffer : register(b0) -{ - float2 resolution; - float2 offset; - float2 halfPixel; -}; + D3D11_MAPPED_SUBRESOURCE mappedResource; + deviceContext->Map(inputTexture, 0, D3D11_MAP_READ, 0, &mappedResource); -sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); + cv::Mat src(inputDesc.Height, inputDesc.Width, CV_8UC4, mappedResource.pData, mappedResource.RowPitch); + deviceContext->Unmap(inputTexture, 0); -float4 main(float4 screenSpace : SV_Position) : SV_TARGET -{ - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + cv::Mat dst = ImageProcessor::ApplyGaussianBlur(src, 15); - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; + ID3D11Texture2D* texture_blur = ImageProcessor::LoadTextureFromMat(dst, device, deviceContext); - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 - }; + ID3D11ShaderResourceView* texture_srv = nullptr; + device->CreateShaderResourceView(texture_blur, &srvDesc, &texture_srv); - float weightSum = 0.0; - for (int i = 0; i < 9; i++) - { - weightSum += weights[i]; - } - - for (int i = 0; i < 9; i++) - { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); - } + ImGui::Image(texture_srv, ImVec2(dst.cols, dst.rows)); - return colorSum; + if (inputSRV) inputSRV->Release(); + if (texture_srv) texture_srv->Release(); + if (texture_blur) texture_blur->Release(); } -)"; - -const char *upsampleShaderSrc = R"( -cbuffer BlurInputBuffer : register(b0) -{ - float2 resolution; - float2 offset; - float2 halfPixel; -}; - -sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); - -float4 main(float4 screenSpace : SV_Position) : SV_TARGET -{ - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; - - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 - }; - float weightSum = 0.0; - for (int i = 0; i < 9; i++) - { - weightSum += weights[i]; - } - - for (int i = 0; i < 9; i++) - { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); - } - - return colorSum; +cv::Mat ImageProcessor::ApplyGaussianBlur(const cv::Mat& src, double sigma) { + cv::Mat dst; + GaussianBlur(src, dst, cv::Size(0, 0), sigma); + return dst; } -)"; - - - -const char *dbgDrawTextureShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ -{\ - float2 resolution;\ - float2 offset;\ - float2 halfpixel;\ -};\ -struct PS_INPUT {\ - float4 pos : POSITION;\ -};\ -sampler sampler0 : register(s0);\ -Texture2D texture0 : register(t0);\ -\ -float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET {\ - float2 uv = screenSpace.xy / resolution;\ - return texture0.Sample(sampler0, uv);\ -}"; -ID3DBlob *TryCompileShader(const char *pSrcData, const char *pTarget) -{ - HRESULT hr; +ID3D11Texture2D* ImageProcessor::LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context) { + if (mat.empty() || device == nullptr || context == nullptr) return nullptr; - ID3DBlob *shaderBlob; - ID3DBlob *errorBlob; - hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); - - if (FAILED(hr)) - { - Logger::error("[Blur] Failed to compile shader"); - errorBlob->Release(); - throw std::logic_error("Failed to compile shader!"); + cv::Mat matBGRA; + if (mat.channels() == 3) { + cvtColor(mat, matBGRA, cv::COLOR_BGR2BGRA); } - return shaderBlob; -} - -ID3D11PixelShader *dbgShader; - -void Blur::InitializePipeline() -{ - - HRESULT hr; - ID3D11DeviceContext* pContext = SwapchainHook::context; - - // byteWidth has to be a multiple of 32, BlurInputBuffer has a size of 24 - CD3D11_BUFFER_DESC cbd( - sizeof(BlurInputBuffer), - D3D11_BIND_CONSTANT_BUFFER); - CD3D11_BUFFER_DESC cbdVertex( - sizeof(quadVertices), - D3D11_BIND_VERTEX_BUFFER); - - SwapchainHook::d3d11Device->CreateBuffer( - &cbd, - nullptr, - &pConstantBuffer); - - D3D11_SUBRESOURCE_DATA vertexBufferData = {quadVertices, 0, 0}; - - SwapchainHook::d3d11Device->CreateBuffer( - &cbdVertex, - &vertexBufferData, - &pVertexBuffer); - - ID3DBlob *shaderBlob = TryCompileShader(upsampleShaderSrc, "ps_4_0"); - SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pUpsampleShader); - - shaderBlob = TryCompileShader(downsampleShaderSrc, "ps_4_0"); - SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pDownsampleShader); - - shaderBlob = TryCompileShader(dbgDrawTextureShaderSrc, "ps_4_0"); - SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &dbgShader); - - shaderBlob = TryCompileShader(vertexShaderSrc, "vs_4_0"); - SwapchainHook::d3d11Device->CreateVertexShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pVertexShader); - - D3D11_INPUT_ELEMENT_DESC ied = - {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, - 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}; - SwapchainHook::d3d11Device->CreateInputLayout(&ied, 1, shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &pInputLayout); - D3D11_SAMPLER_DESC sd{}; - sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - sd.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - SwapchainHook::d3d11Device->CreateSamplerState(&sd, &pSampler); - -} -void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderResourceView *pShaderResourceView, XMFLOAT2 rtvSize) -{ - HRESULT hr; - ID3D11DeviceContext* pContext = SwapchainHook::context; - D3D11_DEPTH_STENCIL_DESC dsd{}; - dsd.DepthEnable = false; - dsd.StencilEnable = false; - ID3D11DepthStencilState *pDepthStencilState; - hr = SwapchainHook::d3d11Device->CreateDepthStencilState(&dsd, &pDepthStencilState); - if (FAILED(hr)) { pContext->Release(); return; } - pContext->OMSetDepthStencilState(pDepthStencilState, 0); - - void *null = nullptr; - pContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView **)&null); - pContext->OMSetRenderTargets(1, &pRenderTargetView, nullptr); - - constantBuffer.resolution = rtvSize; - constantBuffer.halfpixel = XMFLOAT2(0.5 / rtvSize.x, 0.5 / rtvSize.y); - pContext->UpdateSubresource(pConstantBuffer, 0, nullptr, &constantBuffer, 0, 0); - - pContext->IASetInputLayout(pInputLayout); - UINT stride = sizeof(XMFLOAT4); - UINT offset = 0; - - pContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - pContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0); - pContext->VSSetShader(pVertexShader, nullptr, 0); - pContext->PSSetSamplers(0, 1, &pSampler); - pContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); - D3D11_BLEND_DESC bd{}; - ZeroMemory(&bd, sizeof(bd)); - bd.AlphaToCoverageEnable = false; - bd.RenderTarget[0].BlendEnable = true; - bd.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - bd.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; - bd.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - bd.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - bd.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; - bd.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - bd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - ID3D11BlendState *pBlendState; - hr = SwapchainHook::d3d11Device->CreateBlendState(&bd, &pBlendState); - if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); return; } - pContext->OMSetBlendState(pBlendState, NULL, 0xffffffff); - D3D11_RASTERIZER_DESC rd{}; - rd.FillMode = D3D11_FILL_SOLID; - rd.CullMode = D3D11_CULL_NONE; - rd.DepthClipEnable = false; - rd.ScissorEnable = false; - ID3D11RasterizerState *pRasterizerState; - hr = SwapchainHook::d3d11Device->CreateRasterizerState(&rd, &pRasterizerState); - if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); pBlendState->Release(); return; } - pContext->RSSetState(pRasterizerState); - - pContext->PSSetShaderResources(0, 1, &pShaderResourceView); - D3D11_VIEWPORT viewport{}; - viewport.TopLeftX = 0; - viewport.TopLeftY = 0; - viewport.Width = rtvSize.x; - viewport.Height = rtvSize.y; - viewport.MaxDepth = 1.0f; - - FLOAT backgroundColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - pContext->ClearRenderTargetView(pRenderTargetView, backgroundColor); - pContext->RSSetViewports(1, &viewport); - pContext->Draw(sizeof(quadVertices) / sizeof(quadVertices[0]), 0); - ID3D11RenderTargetView* kajgd = nullptr; - pContext->OMSetRenderTargets(1, &kajgd, nullptr); - - pDepthStencilState->Release(); - pBlendState->Release(); - pRasterizerState->Release(); -} - -void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) -{ - - if(intensity < 1) return; - - if (!SwapchainHook::GetBackbuffer()) return; - - ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); - if (!pOrigShaderResourceView) return; - - ID3D11DeviceContext* pContext = SwapchainHook::context; - - std::vector framebuffers; - std::vector renderTargetViews; - std::vector shaderResourceViews; - std::vector fbSizes; - D3D11_TEXTURE2D_DESC desc; - SwapchainHook::GetBackbuffer()->GetDesc(&desc); - - framebuffers.reserve((size_t)iterations); - renderTargetViews.reserve((size_t)iterations); - - D3D11_SHADER_RESOURCE_VIEW_DESC srvd{}; - srvd.Format = desc.Format; - srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvd.Texture2D.MipLevels = 1; - - desc.BindFlags |= D3D11_BIND_RENDER_TARGET; - - for (int i = 0; i <= iterations; i++) - { - ID3D11Texture2D *pFrameBuffer; - ID3D11RenderTargetView *pRenderTargetView; - ID3D11ShaderResourceView *pShaderResourceView; - - SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); - if (i == 0) - pRenderTargetView = pDstRenderTargetView; - else - SwapchainHook::d3d11Device->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); - SwapchainHook::d3d11Device->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); - - framebuffers.push_back(pFrameBuffer); - renderTargetViews.push_back(pRenderTargetView); - shaderResourceViews.push_back(pShaderResourceView); - fbSizes.push_back(XMFLOAT2(desc.Width, desc.Height)); - - desc.Width /= 2; - desc.Height /= 2; + else if (mat.channels() == 4) { + matBGRA = mat; } - - constantBuffer.offset = XMFLOAT2(intensity * 3, intensity * 3); - pContext->PSSetShader(pDownsampleShader, nullptr, 0); - RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); - - for (int i = 1; i < iterations; i++) - { - RenderToRTV(renderTargetViews[i + 1], shaderResourceViews[i], fbSizes[i + 1]); + else { + return nullptr; } - pContext->PSSetShader(pUpsampleShader, nullptr, 0); - - for (int i = iterations; i > 0; i--) - { - RenderToRTV(renderTargetViews[i - 1], shaderResourceViews[i], fbSizes[i - 1]); + D3D11_TEXTURE2D_DESC desc = {}; + desc.Width = matBGRA.cols; + desc.Height = matBGRA.rows; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + + ID3D11Texture2D* texture = nullptr; + HRESULT hr = device->CreateTexture2D(&desc, nullptr, &texture); + if (FAILED(hr)) return nullptr; + + D3D11_MAPPED_SUBRESOURCE mappedResource; + hr = context->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (FAILED(hr)) return nullptr; + + for (int y = 0; y < matBGRA.rows; ++y) { + memcpy(static_cast(mappedResource.pData) + y * mappedResource.RowPitch, matBGRA.ptr(y), matBGRA.cols * 4); } - for (int i = 0; i < iterations; i++) - { - - if (i != 0) - renderTargetViews[i]->Release(); - framebuffers[i]->Release(); - shaderResourceViews[i]->Release(); - - renderTargetViews.clear(); - framebuffers.clear(); - shaderResourceViews.clear(); - fbSizes.clear(); - } + context->Unmap(texture, 0); - pContext->Release(); - pOrigShaderResourceView->Release(); + return texture; } \ No newline at end of file diff --git a/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp b/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp index 53a38860..e69de29b 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp @@ -1,220 +0,0 @@ -/*#include -#include -#include -#include -#include -#include -#include "../../Engine.hpp" -#include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" -#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" - -static const XMFLOAT4 quadVertices[] = - { - XMFLOAT4(1.0, -1.0, 0.0, 1.0), - XMFLOAT4(-1.0, -1.0, 0.0, 1.0), - XMFLOAT4(-1.0, 1.0, 0.0, 1.0), - XMFLOAT4(-1.0, 1.0, 0.0, 1.0), - XMFLOAT4(1.0, 1.0, 0.0, 1.0), - XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; - -const char *vertexShaderSrc = "struct VS_INPUT {\ - float4 pos : POSITION;\ -};\ -\ -float4 main(VS_INPUT input) : SV_POSITION {\ - return input.pos;\ -}"; - -const char *downsampleShaderSrc = R"( -cbuffer BlurInputBuffer : register(b0) -{ - float2 resolution; - float2 offset; - float2 halfPixel; -}; - -sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); - -float4 main(float4 screenSpace : SV_Position) : SV_TARGET -{ - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; - - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 - }; - - float weightSum = 0.0; - for (int i = 0; i < 9; i++) - { - weightSum += weights[i]; - } - - for (int i = 0; i < 9; i++) - { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); - } - - return colorSum; -} -)"; - -const char *upsampleShaderSrc = R"( -cbuffer BlurInputBuffer : register(b0) -{ - float2 resolution; - float2 offset; - float2 halfPixel; -}; - -sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); - -float4 main(float4 screenSpace : SV_Position) : SV_TARGET -{ - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; - - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 - }; - - float weightSum = 0.0; - for (int i = 0; i < 9; i++) - { - weightSum += weights[i]; - } - - for (int i = 0; i < 9; i++) - { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); - } - - return colorSum; -} -)"; - - -ID3DBlob* TryCompileShader(const char* pSrcData, const char* pTarget) -{ - HRESULT hr; - - ID3DBlob* shaderBlob; - ID3DBlob* errorBlob; - hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); - - if (FAILED(hr)) - { - Logger::error("[Blur] Failed to compile shader"); - errorBlob->Release(); - throw std::logic_error("Failed to compile shader!"); - } - return shaderBlob; -} - -ID3D12PipelineState* dbgShader; - -void Blur::InitializePipeline() -{ - HRESULT hr; - ID3D12Device* pDevice = SwapchainHook::d3d12Device5; - ID3D12GraphicsCommandList* pCommandList = SwapchainHook::d3d12CommandList; - - // Create constant buffer - D3D12_HEAP_PROPERTIES heapProps = {}; - heapProps.Type = D3D12_HEAP_TYPE_UPLOAD; - heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; - heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; - - D3D12_RESOURCE_DESC resourceDesc = {}; - resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; - resourceDesc.Width = sizeof(BlurInputBuffer); - resourceDesc.Height = 1; - resourceDesc.DepthOrArraySize = 1; - resourceDesc.MipLevels = 1; - resourceDesc.Format = DXGI_FORMAT_UNKNOWN; - resourceDesc.SampleDesc.Count = 1; - resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; - - pDevice->CreateCommittedResource( - &heapProps, - D3D12_HEAP_FLAG_NONE, - &resourceDesc, - D3D12_RESOURCE_STATE_GENERIC_READ, - nullptr, - IID_PPV_ARGS(&pConstantBuffer)); - - // Create vertex buffer - resourceDesc.Width = sizeof(quadVertices); - pDevice->CreateCommittedResource( - &heapProps, - D3D12_HEAP_FLAG_NONE, - &resourceDesc, - D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER, - nullptr, - IID_PPV_ARGS(&pVertexBuffer)); - - // Compile shaders - ID3DBlob* vertexShaderBlob = TryCompileShader(vertexShaderSrc, "vs_5_0"); - ID3DBlob* pixelShaderBlob = TryCompileShader(upsampleShaderSrc, "ps_5_0"); - - // Create root signature - D3D12_ROOT_SIGNATURE_DESC rootSignatureDesc = {}; - rootSignatureDesc.NumParameters = 0; - rootSignatureDesc.pParameters = nullptr; - rootSignatureDesc.NumStaticSamplers = 0; - rootSignatureDesc.pStaticSamplers = nullptr; - rootSignatureDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; - - ID3DBlob* signature; - ID3DBlob* error; - D3D12SerializeRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error); - pDevice->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&pRootSignature)); - - // Create pipeline state object - D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; - psoDesc.InputLayout = { inputElementDescs, _countof(inputElementDescs) }; - psoDesc.pRootSignature = pRootSignature; - psoDesc.VS = CD3DX12_SHADER_BYTECODE(vertexShaderBlob); - psoDesc.PS = CD3DX12_SHADER_BYTECODE(pixelShaderBlob); - psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); - psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT); - psoDesc.DepthStencilState.DepthEnable = FALSE; - psoDesc.DepthStencilState.StencilEnable = FALSE; - psoDesc.SampleMask = UINT_MAX; - psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; - psoDesc.NumRenderTargets = 1; - psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM; - psoDesc.SampleDesc.Count = 1; - - pDevice->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&pUpsampleShader)); -}*/ \ No newline at end of file diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index cf2e9b21..f829e917 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -23,6 +23,7 @@ #include "Elements/Structs/HSV.hpp" #include + using namespace DirectX; struct BlurInputBuffer @@ -37,49 +38,17 @@ struct BlurInputBuffer class Blur { public: - - static inline ID3D11PixelShader *pUpsampleShader = nullptr; - static inline ID3D11PixelShader *pDownsampleShader = nullptr; - static inline ID3D11VertexShader *pVertexShader = nullptr; - static inline ID3D11InputLayout *pInputLayout = nullptr; - - static inline ID3D11SamplerState *pSampler = nullptr; - static inline ID3D11Buffer *pVertexBuffer = nullptr; - static inline ID3D11Buffer *pConstantBuffer = nullptr; - static inline BlurInputBuffer constantBuffer; - - // RAII - static void InitializePipeline(); - //static void Cleanup(); - - static void RenderToRTV(ID3D11RenderTargetView *, ID3D11ShaderResourceView *, XMFLOAT2); - - static void RenderBlur(ID3D11RenderTargetView *, int, float); + static void RenderBlur(ID3D11Texture2D*, ID3D11Device*, ID3D11DeviceContext*); }; -class BlurDX12 -{ -public: - - static inline ID3D11PixelShader *pUpsampleShader = nullptr; - static inline ID3D11PixelShader *pDownsampleShader = nullptr; - static inline ID3D11VertexShader *pVertexShader = nullptr; - static inline ID3D11InputLayout *pInputLayout = nullptr; - - static inline ID3D11SamplerState *pSampler = nullptr; - static inline ID3D11Buffer *pVertexBuffer = nullptr; - static inline ID3D11Buffer *pConstantBuffer = nullptr; - static inline BlurInputBuffer constantBuffer; - - // RAII - static void InitializePipeline(); - //static void Cleanup(); +#include - static void RenderBlur(ID3D12GraphicsCommandList* commandList); +class ImageProcessor { +public: + static cv::Mat ApplyGaussianBlur(const cv::Mat& src, double sigma); + static ID3D11Texture2D* LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context); }; - - class Dimension { public: float x = 0; diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 2460757d..04af3a36 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -344,7 +344,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI RenderEvent event{}; event.RTV = mainRenderTargetView; - BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); + //BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); EventHandler::onRender(event); @@ -523,7 +523,6 @@ void SwapchainHook::DX11Init() { SaveBackbuffer(); - Blur::InitializePipeline(); Memory::SafeRelease(eBackBuffer); init = true; } @@ -616,7 +615,7 @@ void SwapchainHook::DX12Init() { Memory::SafeRelease(dxgiDevice); Memory::SafeRelease(d2dFactory); - BlurDX12::InitializePipeline(); + //BlurDX12::InitializePipeline(); init = true; } } diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index e191b669..ce4231f1 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -128,7 +128,7 @@ class ClickGUIRenderer : public Listener { } - Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); + //Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); From f678d51366d0e4ea704e2f2b0b54e3c6066d7473 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 17 Aug 2024 00:29:27 +0600 Subject: [PATCH 115/240] Revert "future OpenCV stuff" This reverts commit a7fe375f47c164508a0ebcc6040b42825485205d. --- CMakeLists.txt | 13 +- README.md | 6 - src/Client/GUI/Engine/Effects/Blur/blur.cpp | 405 +++++++++++++++--- .../GUI/Engine/Effects/Blur/blur_dx12.cpp | 220 ++++++++++ src/Client/GUI/Engine/Engine.hpp | 45 +- .../Hook/Hooks/Render/SwapchainHook.cpp | 5 +- .../Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- 7 files changed, 608 insertions(+), 88 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 47237d1f..300ccc61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,22 +87,15 @@ endif() add_library(MinHook SHARED IMPORTED GLOBAL) set_target_properties(MinHook PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/minhook/minhook.lib") - FetchContent_Declare( libhat GIT_REPOSITORY https://github.com/BasedInc/libhat.git - GIT_TAG f4755aea0987e77c0f6f496c49eb9cd08d5f5a06 - GIT_SHALLOW TRUE - GIT_PROGRESS TRUE + GIT_TAG 9ef05d6961ce37a4c801f11159de895aa21878a9 ) FetchContent_MakeAvailable(libhat) -set(OpenCV_DIR C:/opencv/opencv/build/) -find_package(OpenCV REQUIRED) -target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS} libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) -target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) -set(CPACK_PROJECT_NAME ${PROJECT_NAME}) -set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) \ No newline at end of file +target_link_libraries(${PROJECT_NAME} PRIVATE libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) +target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) \ No newline at end of file diff --git a/README.md b/README.md index efd337a6..d1a2444c 100644 --- a/README.md +++ b/README.md @@ -33,12 +33,6 @@ If you encounter issues, check out our [FAQ](https://discord.gg/flarial-communit 2. **Git**: Install Git if you haven't already. You can download Git from [git-scm.com](https://git-scm.com/downloads) and follow the installation instructions. - - -3. **OpenCV**: Install [OpenCV](https://opencv.org/releases). Click the "Windows" option and follow these instructions: - - When running the installer, make sure you choose the path to be "C:/opencv" - - Add the path C:\opencv\opencv\build\x64\vc16\bin to your Environment Variables (PATH) for it to work properly - - You are good to go! You can now build Flarial. ### Steps to Clone and Build the Project: 1. **Clone the Repository**: diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 0ec778db..5daf4cbb 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -1,92 +1,373 @@ -#pragma once #include #include #include -#include -#include #include "../../Engine.hpp" #include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" #include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" +// CREDITS @MR CHIPS (@chyves) +#define BLUR_OFFSET 10 -void Blur::RenderBlur(ID3D11Texture2D* inputTexture, ID3D11Device* device, ID3D11DeviceContext* deviceContext) { - ID3D11ShaderResourceView* inputSRV = nullptr; - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - srvDesc.Texture2D.MostDetailedMip = 0; - device->CreateShaderResourceView(inputTexture, &srvDesc, &inputSRV); +static const XMFLOAT4 quadVertices[] = + { + XMFLOAT4(1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; - D3D11_TEXTURE2D_DESC inputDesc; - inputTexture->GetDesc(&inputDesc); +const char *vertexShaderSrc = "struct VS_INPUT {\ + float4 pos : POSITION;\ +};\ +\ +float4 main(VS_INPUT input) : SV_POSITION {\ + return input.pos;\ +}"; - D3D11_MAPPED_SUBRESOURCE mappedResource; - deviceContext->Map(inputTexture, 0, D3D11_MAP_READ, 0, &mappedResource); +const char *downsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; - cv::Mat src(inputDesc.Height, inputDesc.Width, CV_8UC4, mappedResource.pData, mappedResource.RowPitch); - deviceContext->Unmap(inputTexture, 0); +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); - cv::Mat dst = ImageProcessor::ApplyGaussianBlur(src, 15); +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - ID3D11Texture2D* texture_blur = ImageProcessor::LoadTextureFromMat(dst, device, deviceContext); + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; - ID3D11ShaderResourceView* texture_srv = nullptr; - device->CreateShaderResourceView(texture_blur, &srvDesc, &texture_srv); + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; - ImGui::Image(texture_srv, ImVec2(dst.cols, dst.rows)); + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } - if (inputSRV) inputSRV->Release(); - if (texture_srv) texture_srv->Release(); - if (texture_blur) texture_blur->Release(); + return colorSum; } +)"; + +const char *upsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; -cv::Mat ImageProcessor::ApplyGaussianBlur(const cv::Mat& src, double sigma) { - cv::Mat dst; - GaussianBlur(src, dst, cv::Size(0, 0), sigma); - return dst; + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } + + return colorSum; } +)"; + + + +const char *dbgDrawTextureShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ +{\ + float2 resolution;\ + float2 offset;\ + float2 halfpixel;\ +};\ +struct PS_INPUT {\ + float4 pos : POSITION;\ +};\ +sampler sampler0 : register(s0);\ +Texture2D texture0 : register(t0);\ +\ +float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET {\ + float2 uv = screenSpace.xy / resolution;\ + return texture0.Sample(sampler0, uv);\ +}"; -ID3D11Texture2D* ImageProcessor::LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context) { - if (mat.empty() || device == nullptr || context == nullptr) return nullptr; +ID3DBlob *TryCompileShader(const char *pSrcData, const char *pTarget) +{ + HRESULT hr; - cv::Mat matBGRA; - if (mat.channels() == 3) { - cvtColor(mat, matBGRA, cv::COLOR_BGR2BGRA); + ID3DBlob *shaderBlob; + ID3DBlob *errorBlob; + hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); + + if (FAILED(hr)) + { + Logger::error("[Blur] Failed to compile shader"); + errorBlob->Release(); + throw std::logic_error("Failed to compile shader!"); } - else if (mat.channels() == 4) { - matBGRA = mat; + return shaderBlob; +} + +ID3D11PixelShader *dbgShader; + +void Blur::InitializePipeline() +{ + + HRESULT hr; + ID3D11DeviceContext* pContext = SwapchainHook::context; + + // byteWidth has to be a multiple of 32, BlurInputBuffer has a size of 24 + CD3D11_BUFFER_DESC cbd( + sizeof(BlurInputBuffer), + D3D11_BIND_CONSTANT_BUFFER); + CD3D11_BUFFER_DESC cbdVertex( + sizeof(quadVertices), + D3D11_BIND_VERTEX_BUFFER); + + SwapchainHook::d3d11Device->CreateBuffer( + &cbd, + nullptr, + &pConstantBuffer); + + D3D11_SUBRESOURCE_DATA vertexBufferData = {quadVertices, 0, 0}; + + SwapchainHook::d3d11Device->CreateBuffer( + &cbdVertex, + &vertexBufferData, + &pVertexBuffer); + + ID3DBlob *shaderBlob = TryCompileShader(upsampleShaderSrc, "ps_4_0"); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pUpsampleShader); + + shaderBlob = TryCompileShader(downsampleShaderSrc, "ps_4_0"); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pDownsampleShader); + + shaderBlob = TryCompileShader(dbgDrawTextureShaderSrc, "ps_4_0"); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &dbgShader); + + shaderBlob = TryCompileShader(vertexShaderSrc, "vs_4_0"); + SwapchainHook::d3d11Device->CreateVertexShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pVertexShader); + + D3D11_INPUT_ELEMENT_DESC ied = + {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, + 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}; + SwapchainHook::d3d11Device->CreateInputLayout(&ied, 1, shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &pInputLayout); + D3D11_SAMPLER_DESC sd{}; + sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + sd.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; + SwapchainHook::d3d11Device->CreateSamplerState(&sd, &pSampler); + +} +void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderResourceView *pShaderResourceView, XMFLOAT2 rtvSize) +{ + HRESULT hr; + ID3D11DeviceContext* pContext = SwapchainHook::context; + D3D11_DEPTH_STENCIL_DESC dsd{}; + dsd.DepthEnable = false; + dsd.StencilEnable = false; + ID3D11DepthStencilState *pDepthStencilState; + hr = SwapchainHook::d3d11Device->CreateDepthStencilState(&dsd, &pDepthStencilState); + if (FAILED(hr)) { pContext->Release(); return; } + pContext->OMSetDepthStencilState(pDepthStencilState, 0); + + void *null = nullptr; + pContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView **)&null); + pContext->OMSetRenderTargets(1, &pRenderTargetView, nullptr); + + constantBuffer.resolution = rtvSize; + constantBuffer.halfpixel = XMFLOAT2(0.5 / rtvSize.x, 0.5 / rtvSize.y); + pContext->UpdateSubresource(pConstantBuffer, 0, nullptr, &constantBuffer, 0, 0); + + pContext->IASetInputLayout(pInputLayout); + UINT stride = sizeof(XMFLOAT4); + UINT offset = 0; + + pContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset); + pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + pContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0); + pContext->VSSetShader(pVertexShader, nullptr, 0); + pContext->PSSetSamplers(0, 1, &pSampler); + pContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); + D3D11_BLEND_DESC bd{}; + ZeroMemory(&bd, sizeof(bd)); + bd.AlphaToCoverageEnable = false; + bd.RenderTarget[0].BlendEnable = true; + bd.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + bd.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + bd.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; + bd.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; + bd.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + bd.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + bd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + ID3D11BlendState *pBlendState; + hr = SwapchainHook::d3d11Device->CreateBlendState(&bd, &pBlendState); + if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); return; } + pContext->OMSetBlendState(pBlendState, NULL, 0xffffffff); + D3D11_RASTERIZER_DESC rd{}; + rd.FillMode = D3D11_FILL_SOLID; + rd.CullMode = D3D11_CULL_NONE; + rd.DepthClipEnable = false; + rd.ScissorEnable = false; + ID3D11RasterizerState *pRasterizerState; + hr = SwapchainHook::d3d11Device->CreateRasterizerState(&rd, &pRasterizerState); + if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); pBlendState->Release(); return; } + pContext->RSSetState(pRasterizerState); + + pContext->PSSetShaderResources(0, 1, &pShaderResourceView); + D3D11_VIEWPORT viewport{}; + viewport.TopLeftX = 0; + viewport.TopLeftY = 0; + viewport.Width = rtvSize.x; + viewport.Height = rtvSize.y; + viewport.MaxDepth = 1.0f; + + FLOAT backgroundColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + pContext->ClearRenderTargetView(pRenderTargetView, backgroundColor); + pContext->RSSetViewports(1, &viewport); + pContext->Draw(sizeof(quadVertices) / sizeof(quadVertices[0]), 0); + ID3D11RenderTargetView* kajgd = nullptr; + pContext->OMSetRenderTargets(1, &kajgd, nullptr); + + pDepthStencilState->Release(); + pBlendState->Release(); + pRasterizerState->Release(); +} + +void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) +{ + + if(intensity < 1) return; + + if (!SwapchainHook::GetBackbuffer()) return; + + ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); + if (!pOrigShaderResourceView) return; + + ID3D11DeviceContext* pContext = SwapchainHook::context; + + std::vector framebuffers; + std::vector renderTargetViews; + std::vector shaderResourceViews; + std::vector fbSizes; + D3D11_TEXTURE2D_DESC desc; + SwapchainHook::GetBackbuffer()->GetDesc(&desc); + + framebuffers.reserve((size_t)iterations); + renderTargetViews.reserve((size_t)iterations); + + D3D11_SHADER_RESOURCE_VIEW_DESC srvd{}; + srvd.Format = desc.Format; + srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvd.Texture2D.MipLevels = 1; + + desc.BindFlags |= D3D11_BIND_RENDER_TARGET; + + for (int i = 0; i <= iterations; i++) + { + ID3D11Texture2D *pFrameBuffer; + ID3D11RenderTargetView *pRenderTargetView; + ID3D11ShaderResourceView *pShaderResourceView; + + SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); + if (i == 0) + pRenderTargetView = pDstRenderTargetView; + else + SwapchainHook::d3d11Device->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); + SwapchainHook::d3d11Device->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); + + framebuffers.push_back(pFrameBuffer); + renderTargetViews.push_back(pRenderTargetView); + shaderResourceViews.push_back(pShaderResourceView); + fbSizes.push_back(XMFLOAT2(desc.Width, desc.Height)); + + desc.Width /= 2; + desc.Height /= 2; } - else { - return nullptr; + + constantBuffer.offset = XMFLOAT2(intensity * 3, intensity * 3); + pContext->PSSetShader(pDownsampleShader, nullptr, 0); + RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); + + for (int i = 1; i < iterations; i++) + { + RenderToRTV(renderTargetViews[i + 1], shaderResourceViews[i], fbSizes[i + 1]); } - D3D11_TEXTURE2D_DESC desc = {}; - desc.Width = matBGRA.cols; - desc.Height = matBGRA.rows; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - desc.MiscFlags = 0; - - ID3D11Texture2D* texture = nullptr; - HRESULT hr = device->CreateTexture2D(&desc, nullptr, &texture); - if (FAILED(hr)) return nullptr; - - D3D11_MAPPED_SUBRESOURCE mappedResource; - hr = context->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(hr)) return nullptr; - - for (int y = 0; y < matBGRA.rows; ++y) { - memcpy(static_cast(mappedResource.pData) + y * mappedResource.RowPitch, matBGRA.ptr(y), matBGRA.cols * 4); + pContext->PSSetShader(pUpsampleShader, nullptr, 0); + + for (int i = iterations; i > 0; i--) + { + RenderToRTV(renderTargetViews[i - 1], shaderResourceViews[i], fbSizes[i - 1]); } - context->Unmap(texture, 0); + for (int i = 0; i < iterations; i++) + { + + if (i != 0) + renderTargetViews[i]->Release(); + framebuffers[i]->Release(); + shaderResourceViews[i]->Release(); + + renderTargetViews.clear(); + framebuffers.clear(); + shaderResourceViews.clear(); + fbSizes.clear(); + } - return texture; + pContext->Release(); + pOrigShaderResourceView->Release(); } \ No newline at end of file diff --git a/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp b/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp index e69de29b..53a38860 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp @@ -0,0 +1,220 @@ +/*#include +#include +#include +#include +#include +#include +#include "../../Engine.hpp" +#include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" +#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" + +static const XMFLOAT4 quadVertices[] = + { + XMFLOAT4(1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; + +const char *vertexShaderSrc = "struct VS_INPUT {\ + float4 pos : POSITION;\ +};\ +\ +float4 main(VS_INPUT input) : SV_POSITION {\ + return input.pos;\ +}"; + +const char *downsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; + + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } + + return colorSum; +} +)"; + +const char *upsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; + + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } + + return colorSum; +} +)"; + + +ID3DBlob* TryCompileShader(const char* pSrcData, const char* pTarget) +{ + HRESULT hr; + + ID3DBlob* shaderBlob; + ID3DBlob* errorBlob; + hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); + + if (FAILED(hr)) + { + Logger::error("[Blur] Failed to compile shader"); + errorBlob->Release(); + throw std::logic_error("Failed to compile shader!"); + } + return shaderBlob; +} + +ID3D12PipelineState* dbgShader; + +void Blur::InitializePipeline() +{ + HRESULT hr; + ID3D12Device* pDevice = SwapchainHook::d3d12Device5; + ID3D12GraphicsCommandList* pCommandList = SwapchainHook::d3d12CommandList; + + // Create constant buffer + D3D12_HEAP_PROPERTIES heapProps = {}; + heapProps.Type = D3D12_HEAP_TYPE_UPLOAD; + heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + + D3D12_RESOURCE_DESC resourceDesc = {}; + resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + resourceDesc.Width = sizeof(BlurInputBuffer); + resourceDesc.Height = 1; + resourceDesc.DepthOrArraySize = 1; + resourceDesc.MipLevels = 1; + resourceDesc.Format = DXGI_FORMAT_UNKNOWN; + resourceDesc.SampleDesc.Count = 1; + resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + + pDevice->CreateCommittedResource( + &heapProps, + D3D12_HEAP_FLAG_NONE, + &resourceDesc, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&pConstantBuffer)); + + // Create vertex buffer + resourceDesc.Width = sizeof(quadVertices); + pDevice->CreateCommittedResource( + &heapProps, + D3D12_HEAP_FLAG_NONE, + &resourceDesc, + D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER, + nullptr, + IID_PPV_ARGS(&pVertexBuffer)); + + // Compile shaders + ID3DBlob* vertexShaderBlob = TryCompileShader(vertexShaderSrc, "vs_5_0"); + ID3DBlob* pixelShaderBlob = TryCompileShader(upsampleShaderSrc, "ps_5_0"); + + // Create root signature + D3D12_ROOT_SIGNATURE_DESC rootSignatureDesc = {}; + rootSignatureDesc.NumParameters = 0; + rootSignatureDesc.pParameters = nullptr; + rootSignatureDesc.NumStaticSamplers = 0; + rootSignatureDesc.pStaticSamplers = nullptr; + rootSignatureDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; + + ID3DBlob* signature; + ID3DBlob* error; + D3D12SerializeRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error); + pDevice->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&pRootSignature)); + + // Create pipeline state object + D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; + psoDesc.InputLayout = { inputElementDescs, _countof(inputElementDescs) }; + psoDesc.pRootSignature = pRootSignature; + psoDesc.VS = CD3DX12_SHADER_BYTECODE(vertexShaderBlob); + psoDesc.PS = CD3DX12_SHADER_BYTECODE(pixelShaderBlob); + psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); + psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT); + psoDesc.DepthStencilState.DepthEnable = FALSE; + psoDesc.DepthStencilState.StencilEnable = FALSE; + psoDesc.SampleMask = UINT_MAX; + psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + psoDesc.NumRenderTargets = 1; + psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM; + psoDesc.SampleDesc.Count = 1; + + pDevice->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&pUpsampleShader)); +}*/ \ No newline at end of file diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index f829e917..cf2e9b21 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -23,7 +23,6 @@ #include "Elements/Structs/HSV.hpp" #include - using namespace DirectX; struct BlurInputBuffer @@ -38,17 +37,49 @@ struct BlurInputBuffer class Blur { public: - static void RenderBlur(ID3D11Texture2D*, ID3D11Device*, ID3D11DeviceContext*); -}; -#include + static inline ID3D11PixelShader *pUpsampleShader = nullptr; + static inline ID3D11PixelShader *pDownsampleShader = nullptr; + static inline ID3D11VertexShader *pVertexShader = nullptr; + static inline ID3D11InputLayout *pInputLayout = nullptr; + + static inline ID3D11SamplerState *pSampler = nullptr; + static inline ID3D11Buffer *pVertexBuffer = nullptr; + static inline ID3D11Buffer *pConstantBuffer = nullptr; + static inline BlurInputBuffer constantBuffer; + + // RAII + static void InitializePipeline(); + //static void Cleanup(); + + static void RenderToRTV(ID3D11RenderTargetView *, ID3D11ShaderResourceView *, XMFLOAT2); + + static void RenderBlur(ID3D11RenderTargetView *, int, float); +}; -class ImageProcessor { +class BlurDX12 +{ public: - static cv::Mat ApplyGaussianBlur(const cv::Mat& src, double sigma); - static ID3D11Texture2D* LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context); + + static inline ID3D11PixelShader *pUpsampleShader = nullptr; + static inline ID3D11PixelShader *pDownsampleShader = nullptr; + static inline ID3D11VertexShader *pVertexShader = nullptr; + static inline ID3D11InputLayout *pInputLayout = nullptr; + + static inline ID3D11SamplerState *pSampler = nullptr; + static inline ID3D11Buffer *pVertexBuffer = nullptr; + static inline ID3D11Buffer *pConstantBuffer = nullptr; + static inline BlurInputBuffer constantBuffer; + + // RAII + static void InitializePipeline(); + //static void Cleanup(); + + static void RenderBlur(ID3D12GraphicsCommandList* commandList); }; + + class Dimension { public: float x = 0; diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 04af3a36..2460757d 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -344,7 +344,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI RenderEvent event{}; event.RTV = mainRenderTargetView; - //BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); + BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); EventHandler::onRender(event); @@ -523,6 +523,7 @@ void SwapchainHook::DX11Init() { SaveBackbuffer(); + Blur::InitializePipeline(); Memory::SafeRelease(eBackBuffer); init = true; } @@ -615,7 +616,7 @@ void SwapchainHook::DX12Init() { Memory::SafeRelease(dxgiDevice); Memory::SafeRelease(d2dFactory); - //BlurDX12::InitializePipeline(); + BlurDX12::InitializePipeline(); init = true; } } diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index ce4231f1..e191b669 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -128,7 +128,7 @@ class ClickGUIRenderer : public Listener { } - //Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); + Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); From a13b80667a14766f0d2ff01a95802c405c4a89ee Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 17 Aug 2024 13:29:05 +0300 Subject: [PATCH 116/240] Instant hurt animation fix --- .../InstantHurtAnimationListener.hpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp index 6dbdbc7d..224d9e9b 100644 --- a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp +++ b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp @@ -106,10 +106,12 @@ class InstantHurtAnimationListener : public Listener { hitEntities[runtimeID] = now; - SendPacketHook::receivePacketEntityEventOriginal(SendPacketHook::PacketHandlerDispatcher, - SendPacketHook::NetworkIdentifier, - SendPacketHook::NetEventCallback, - packet); + if(SendPacketHook::PacketHandlerDispatcher && SendPacketHook::NetworkIdentifier && SendPacketHook::NetEventCallback) { + SendPacketHook::receivePacketEntityEventOriginal(SendPacketHook::PacketHandlerDispatcher, + SendPacketHook::NetworkIdentifier, + SendPacketHook::NetEventCallback, + packet); + } }; void ClearOldHits() { From 13384f70a243af4daa74dfc5e39f853afc62aff6 Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Sat, 17 Aug 2024 14:17:35 +0200 Subject: [PATCH 117/240] Fix in ItemPhysics --- .../Hook/Hooks/Render/SwapchainHook.cpp | 4 ++-- .../ItemPhysics/ItemPhysicsListener.cpp | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 2460757d..f605fc17 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -344,7 +344,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI RenderEvent event{}; event.RTV = mainRenderTargetView; - BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); + //BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); EventHandler::onRender(event); @@ -616,7 +616,7 @@ void SwapchainHook::DX12Init() { Memory::SafeRelease(dxgiDevice); Memory::SafeRelease(d2dFactory); - BlurDX12::InitializePipeline(); + //BlurDX12::InitializePipeline(); init = true; } } diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp index b6a46890..9025be94 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp @@ -98,15 +98,15 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo auto& sign = std::get<2>(listener->actorData.at(curr)); auto& settings = mod->settings; - const auto speed = settings.getSettingByName("speed"); - const auto xMul = settings.getSettingByName("xmul"); - const auto yMul = settings.getSettingByName("ymul"); - const auto zMul = settings.getSettingByName("zmul"); + const auto speed = settings.getSettingByName("speed")->value; + const auto xMul = settings.getSettingByName("xmul")->value; + const auto yMul = settings.getSettingByName("ymul")->value; + const auto zMul = settings.getSettingByName("zmul")->value; if (!curr->isOnGround() || yMod > 0.f) { - vec.x += static_cast(sign.x) * deltaTime * speed->value * xMul->value; - vec.y += static_cast(sign.y) * deltaTime * speed->value * yMul->value; - vec.z += static_cast(sign.z) * deltaTime * speed->value * zMul->value; + vec.x += static_cast(sign.x) * deltaTime * speed * xMul; + vec.y += static_cast(sign.y) * deltaTime * speed * yMul; + vec.z += static_cast(sign.z) * deltaTime * speed * zMul; if (vec.x > 360.f) vec.x -= 360.f; @@ -129,15 +129,15 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo Vec3 renderVec = vec; - const auto smoothRotations = settings.getSettingByName("smoothrots"); - const auto preserveRotations = settings.getSettingByName("preserverots"); + const auto smoothRotations = settings.getSettingByName("smoothrots")->value; + const auto preserveRotations = settings.getSettingByName("preserverots")->value; if (curr->isOnGround() && yMod == 0.f && !preserveRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { if (smoothRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { - vec.x += static_cast(sign.x) * deltaTime * speed->value * xMul->value; + vec.x += static_cast(sign.x) * deltaTime * speed * xMul; if (curr->getStack().block != nullptr) { - vec.z += static_cast(sign.z) * deltaTime * speed->value * zMul->value; + vec.z += static_cast(sign.z) * deltaTime * speed * zMul; if (vec.x > 360.f || vec.x < 0.f) { vec.x = 0.f; @@ -150,7 +150,7 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo } } else { - vec.y += static_cast(sign.y) * deltaTime * speed->value * yMul->value; + vec.y += static_cast(sign.y) * deltaTime * speed * yMul; if (vec.x - 90.f > 360.f || vec.x - 90.f < 0.f) { vec.x = 90.f; From 31cbd1f92bb8e4a82853a0619769f5798913d0b3 Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Sat, 17 Aug 2024 14:24:48 +0200 Subject: [PATCH 118/240] Fix eject crash in module manager and ItemPhysics, fix GuiData::displayClientMessage for 1.21.2X --- src/Client/Module/Manager.cpp | 3 ++- .../Module/Modules/ItemPhysics/ItemPhysics.hpp | 5 +++-- .../ItemPhysics/ItemPhysicsListener.cpp | 10 +++++++--- .../ItemPhysics/ItemPhysicsListener.hpp | 1 + src/SDK/Client/Render/GuiData.cpp | 18 +++++++++++++++--- src/SDK/Client/Render/GuiData.hpp | 2 +- src/Utils/Memory/Game/Sig/SigInit.cpp | 4 +++- 7 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 576bb3ed..26577772 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -171,7 +171,8 @@ void ModuleManager::initialize() { void ModuleManager::terminate() { initialized = false; for (const auto& pair : moduleMap) { - pair.second->terminate(); + if (pair.second != nullptr) + pair.second->terminate(); } moduleMap.clear(); } diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp index 87cb0311..c0cf5b64 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp @@ -6,7 +6,7 @@ class ItemPhysics : public Module { public: - ItemPhysicsListener* listener; + ItemPhysicsListener* listener = nullptr; ItemPhysics() : Module("ItemPhysics", "Changes rotation behavior of dropped items", IDR_ITEM_PHYSICS_PNG, "") { Module::setup(); @@ -23,7 +23,8 @@ class ItemPhysics : public Module { } void onDisable() override { - listener->onDisable(); + if (listener != nullptr) + listener->onDisable(); EventHandler::unregisterListener("ItemPhysics"); diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp index 9025be94..7e4b13a2 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp @@ -133,6 +133,7 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo const auto preserveRotations = settings.getSettingByName("preserverots")->value; if (curr->isOnGround() && yMod == 0.f && !preserveRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { + SDK::clientInstance->getGuiData()->displayClientMessage("Test"); if (smoothRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { vec.x += static_cast(sign.x) * deltaTime * speed * xMul; @@ -206,6 +207,7 @@ static char data[0x5], data2[0x5]; void ItemPhysicsListener::onEnable() { static auto posAddr = Memory::findSig(GET_SIG("ItemPositionConst")) + 4; origPosRel = *reinterpret_cast(posAddr); + patched = true; static auto rotateAddr = reinterpret_cast(Memory::findSig(GET_SIG("glm_rotateRef"))); @@ -242,10 +244,12 @@ void ItemPhysicsListener::onEnable() { } void ItemPhysicsListener::onDisable() { - static auto posAddr = Memory::findSig(GET_SIG("ItemPositionConst")) + 4; + if (patched) { + static auto posAddr = Memory::findSig(GET_SIG("ItemPositionConst")) + 4; - Memory::patchBytes(reinterpret_cast(posAddr), &origPosRel, 4); - FreeBuffer(newPosRel); + Memory::patchBytes(reinterpret_cast(posAddr), &origPosRel, 4); + FreeBuffer(newPosRel); + } glm_rotateHook->disable(); ItemRenderer_renderHook->disable(); diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.hpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.hpp index a676860b..32a21eb7 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.hpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.hpp @@ -10,6 +10,7 @@ class ItemPhysicsListener : public Listener { ItemPhysics* mod; uint32_t origPosRel = 0; float* newPosRel = nullptr; + bool patched = false; std::unordered_map, Vec3>> actorData; ActorRenderData* renderData = nullptr; diff --git a/src/SDK/Client/Render/GuiData.cpp b/src/SDK/Client/Render/GuiData.cpp index c9ce0f7c..8dcdc608 100644 --- a/src/SDK/Client/Render/GuiData.cpp +++ b/src/SDK/Client/Render/GuiData.cpp @@ -1,7 +1,9 @@ #include "GuiData.hpp" + #include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" +#include "../../../Utils/Versions/WinrtUtils.hpp" -void GuiData::displayClientMessage(std::string &str) { +void GuiData::displayClientMessage(const std::string &str) { if (str.empty()) return; @@ -11,6 +13,16 @@ void GuiData::displayClientMessage(std::string &str) { sig = Memory::findSig(GET_SIG("GuiData::displayClientMessage")); } - auto fn = reinterpret_cast(sig); - return fn(this, str, false); + if (WinrtUtils::check(21, 20)) { + char bruh[0x28]{}; + + using func_t = void(*)(GuiData*, const std::string&, char*, bool); + static auto func = reinterpret_cast(sig); + func(this, str, bruh, true); + } + else { + using func_t = void(*)(GuiData*, const std::string&, bool); + static auto func = reinterpret_cast(sig); + func(this, str, true); + } } diff --git a/src/SDK/Client/Render/GuiData.hpp b/src/SDK/Client/Render/GuiData.hpp index 4e9f54cd..06fdcdf0 100644 --- a/src/SDK/Client/Render/GuiData.hpp +++ b/src/SDK/Client/Render/GuiData.hpp @@ -13,5 +13,5 @@ class GuiData { BUILD_ACCESS(this, float, sliderAmount, GET_OFFSET("GuiData::sliderAmount")); BUILD_ACCESS(this, float, scalingMultiplier, GET_OFFSET("GuiData::scalingMultiplier")); - void displayClientMessage(std::string &str); + void displayClientMessage(const std::string &str); }; \ No newline at end of file diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 24fa8953..3ca0977f 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -20,6 +20,8 @@ void SigInit::init2120() { ADD_SIG("ActorCollision::isOnGround", "E8 ? ? ? ? 84 C0 49 8B 87"); ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24 ? 48 8B 4B ? 89 44 24 ? E8 ? ? ? ? 4C 8B D8"); + + ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 45 0F B6 F1 49 8B D8"); } void SigInit::init2102() { @@ -60,7 +62,7 @@ void SigInit::init2080() { ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C0"); - ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 48 8D AC 24 F0 FE FF FF 48 81 EC 10 02 00 00 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 85 00 01 00 00 41"); + ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 41 0F B6 F0"); ADD_SIG("HitResult::getEntity", "48 83 EC 58 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 40 48 8D"); From 8faf16c080b1ce33023455b2c9fb6363660267f6 Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Sat, 17 Aug 2024 14:25:28 +0200 Subject: [PATCH 119/240] Whoops --- src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp index 7e4b13a2..dbaba0a8 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp @@ -133,7 +133,6 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo const auto preserveRotations = settings.getSettingByName("preserverots")->value; if (curr->isOnGround() && yMod == 0.f && !preserveRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { - SDK::clientInstance->getGuiData()->displayClientMessage("Test"); if (smoothRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { vec.x += static_cast(sign.x) * deltaTime * speed * xMul; From 51f3b42e27bb520e38f08ca0c0b6870de07d5b90 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 17 Aug 2024 15:32:57 +0300 Subject: [PATCH 120/240] Potential crash fix --- src/Client/Module/Manager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 26577772..e9c925ec 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -187,7 +187,10 @@ bool ModuleManager::doesAnyModuleHave(const std::string& settingName) { bool result = false; + if(!ModuleManager::initialized) return false; + for (const auto& pair : moduleMap) { + if(!pair.second) continue; if (pair.second->settings.getSettingByName(settingName) != nullptr) if (pair.second->settings.getSettingByName(settingName)->value && From 4e639be6a9f271530324d8c1367d20535825adf4 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 17 Aug 2024 15:55:11 +0300 Subject: [PATCH 121/240] Arrow counter offhand fix --- src/SDK/Client/Actor/Actor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index c6629374..bc38fa52 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -149,7 +149,7 @@ StateVectorComponent *Actor::getStateVectorComponent() { ItemStack *Actor::getOffhandSlot() { if(WinrtUtils::check(20, 80)) { - return getOffhandContainer()->getItem(0); + return getOffhandContainer()->getItem(1); } else { static uintptr_t sig; From 65d56968f36cdf3424f50fe1312b6c1726768fff Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 17 Aug 2024 16:51:07 +0300 Subject: [PATCH 122/240] AutoSprint - Toggle status fix --- src/Client/Module/Modules/Sprint/Sprint.hpp | 2 +- src/Client/Module/Modules/Sprint/SprintListener.hpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/Sprint/Sprint.hpp b/src/Client/Module/Modules/Sprint/Sprint.hpp index 6cebbf87..cb3d86aa 100644 --- a/src/Client/Module/Modules/Sprint/Sprint.hpp +++ b/src/Client/Module/Modules/Sprint/Sprint.hpp @@ -122,7 +122,7 @@ class Sprint : public Module { toggleY += Constraints::SpacingConstraint(0.35, textWidth); FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"toggle Status", textWidth * 6.9f, textHeight, + L"Toggle Status", textWidth * 6.9f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), DWRITE_FONT_WEIGHT_NORMAL); diff --git a/src/Client/Module/Modules/Sprint/SprintListener.hpp b/src/Client/Module/Modules/Sprint/SprintListener.hpp index f372da44..e4d7cd53 100644 --- a/src/Client/Module/Modules/Sprint/SprintListener.hpp +++ b/src/Client/Module/Modules/Sprint/SprintListener.hpp @@ -24,6 +24,8 @@ class SprintListener : public Listener { void onRender(RenderEvent &event) override { if(!module->isEnabled() || SDK::getCurrentScreen() != "hud_screen") return; + if(!module->settings.getSettingByName("status")->value) return; + if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { From dbd164f2ba68a7f1900be71ac6dbbce2e858b438 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 17 Aug 2024 16:51:21 +0300 Subject: [PATCH 123/240] Better "doesAnyModuleHave" --- src/Client/Module/Manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index e9c925ec..c6dcc6c1 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -194,7 +194,7 @@ bool ModuleManager::doesAnyModuleHave(const std::string& settingName) { if (pair.second->settings.getSettingByName(settingName) != nullptr) if (pair.second->settings.getSettingByName(settingName)->value && - pair.second->isEnabled()) { + pair.second->isEnabled() && pair.second->active) { result = true; break; } From 77cc1513241b47becd4d46e94ff04af60438f7aa Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Sat, 17 Aug 2024 17:32:52 +0200 Subject: [PATCH 124/240] Fix parameter --- src/SDK/Client/Render/GuiData.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/SDK/Client/Render/GuiData.cpp b/src/SDK/Client/Render/GuiData.cpp index 8dcdc608..731a4ed2 100644 --- a/src/SDK/Client/Render/GuiData.cpp +++ b/src/SDK/Client/Render/GuiData.cpp @@ -14,11 +14,9 @@ void GuiData::displayClientMessage(const std::string &str) { } if (WinrtUtils::check(21, 20)) { - char bruh[0x28]{}; - - using func_t = void(*)(GuiData*, const std::string&, char*, bool); + using func_t = void(*)(GuiData*, const std::string&, std::optional, bool); // The new optional seems to be some kind of filtered message for the future. If set, it overwrites the other string static auto func = reinterpret_cast(sig); - func(this, str, bruh, true); + func(this, str, {}, true); } else { using func_t = void(*)(GuiData*, const std::string&, bool); From 5e17244d8a17b2b25ec5bb56df0b1074fdd22eb3 Mon Sep 17 00:00:00 2001 From: TTF-fog <74908128+TTF-fog@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:59:43 +0530 Subject: [PATCH 125/240] incorrect description --- src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp b/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp index c73dacb7..70dacf25 100644 --- a/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp +++ b/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp @@ -8,7 +8,7 @@ class InventoryHUD : public Module { public: - InventoryHUD() : Module("InventoryHUD", "Displays the armor you're\ncurrently wearing.", + InventoryHUD() : Module("InventoryHUD", "Displays your inventory\non your HUD", IDR_CHESTPLATE_PNG, "") { Module::setup(); }; @@ -65,4 +65,4 @@ class InventoryHUD : public Module { FlarialGUI::UnsetScrollView(); } -}; \ No newline at end of file +}; From a5485a3c41b3a0cdf23e6277efe8f62dcb252e71 Mon Sep 17 00:00:00 2001 From: TTF-fog <74908128+TTF-fog@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:03:33 +0530 Subject: [PATCH 126/240] add more info to title raspberryepicly's suggestion --- src/Client/Client.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 1cefe560..e09ac5e4 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "Client.hpp" #include "GUI/Engine/Engine.hpp" @@ -18,6 +18,8 @@ std::string Client::settingspath = Utils::getRoamingPath() + R"(\Flarial\Config\main.flarial)"; Settings Client::settings = Settings(); bool notifiedOfConnectionIssue = false; +// UPDATE THIS TO THE LATEST GITHUB COMMIT AFTER CHANGING ANYHTHING +std::string current_commit = "test"; void DownloadAndSave(const std::string& url, const std::string& path) { @@ -51,7 +53,9 @@ void setWindowTitle(std::wstring title) { } void Client::initialize() { - setWindowTitle(L"Flarial"); + + std::string title = WinrtUtils::getFormattedVersion() + " " + current_commit; + setWindowTitle(L"Flarial " + FlarialGUI::to_wide(title)); Logger::debug("[INIT] Initializing Flarial..."); VersionUtils::init(); @@ -214,4 +218,4 @@ void Client::centerCursor() { InHudScreen = !InHudScreen; } } -} \ No newline at end of file +} From 0bd82d3ca06849c177a7fa85c5e8a3458ed45880 Mon Sep 17 00:00:00 2001 From: TTF-fog <74908128+TTF-fog@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:06:12 +0530 Subject: [PATCH 127/240] oopsie forgot to add the commit number --- src/Client/Client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index e09ac5e4..06b6b8a3 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -19,7 +19,7 @@ std::string Client::settingspath = Utils::getRoamingPath() + R"(\Flarial\Config\ Settings Client::settings = Settings(); bool notifiedOfConnectionIssue = false; // UPDATE THIS TO THE LATEST GITHUB COMMIT AFTER CHANGING ANYHTHING -std::string current_commit = "test"; +std::string current_commit = "b525056"; void DownloadAndSave(const std::string& url, const std::string& path) { From 52ac7825be39c830b25880d640782624d39d0a1e Mon Sep 17 00:00:00 2001 From: TTF-fog <74908128+TTF-fog@users.noreply.github.com> Date: Fri, 16 Aug 2024 19:41:49 +0530 Subject: [PATCH 128/240] ooppps SPACING --- src/Client/Client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 06b6b8a3..856f1189 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -55,7 +55,7 @@ void setWindowTitle(std::wstring title) { void Client::initialize() { std::string title = WinrtUtils::getFormattedVersion() + " " + current_commit; - setWindowTitle(L"Flarial " + FlarialGUI::to_wide(title)); + setWindowTitle(L"Flarial " + L" " + FlarialGUI::to_wide(title)); Logger::debug("[INIT] Initializing Flarial..."); VersionUtils::init(); From 53d4b7fa0fe9b41f18290efed04ea5b200399eda Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Sun, 18 Aug 2024 14:04:19 +0200 Subject: [PATCH 129/240] Fix Tessellator stuff --- src/Client/Client.cpp | 4 +- .../Hook/Hooks/Render/SetupAndRenderHook.hpp | 16 +++-- .../Client/Render/Material/MaterialPtr.hpp | 12 ++++ .../Render/Material/RenderMaterialInfo.hpp | 11 ++++ src/SDK/Client/Render/ScreenContext.hpp | 6 +- .../Client/Render/Tessellator/MaterialPtr.h | 25 -------- .../Client/Render/Tessellator/MeshHelpers.cpp | 19 ++++++ .../Client/Render/Tessellator/MeshHelpers.hpp | 10 +++ .../Client/Render/Tessellator/PrimitiveMode.h | 11 ---- .../Render/Tessellator/PrimitiveMode.hpp | 14 ++++ .../Tessellator/RenderMaterialGroup.cpp | 10 +++ .../Tessellator/RenderMaterialGroup.hpp | 10 +++ .../Client/Render/Tessellator/Tessellator.h | 64 ------------------- .../Client/Render/Tessellator/Tessellator.hpp | 39 +++++++++++ src/Utils/Memory/Game/Offset/OffsetInit.cpp | 2 - src/Utils/Memory/Game/Sig/SigInit.cpp | 8 ++- src/Utils/Memory/Memory.hpp | 12 ++-- src/Utils/Render/MaterialUtils.cpp | 14 ++++ src/Utils/Render/MaterialUtils.hpp | 10 +++ 19 files changed, 174 insertions(+), 123 deletions(-) create mode 100644 src/SDK/Client/Render/Material/MaterialPtr.hpp create mode 100644 src/SDK/Client/Render/Material/RenderMaterialInfo.hpp delete mode 100644 src/SDK/Client/Render/Tessellator/MaterialPtr.h create mode 100644 src/SDK/Client/Render/Tessellator/MeshHelpers.cpp create mode 100644 src/SDK/Client/Render/Tessellator/MeshHelpers.hpp delete mode 100644 src/SDK/Client/Render/Tessellator/PrimitiveMode.h create mode 100644 src/SDK/Client/Render/Tessellator/PrimitiveMode.hpp create mode 100644 src/SDK/Client/Render/Tessellator/RenderMaterialGroup.cpp create mode 100644 src/SDK/Client/Render/Tessellator/RenderMaterialGroup.hpp delete mode 100644 src/SDK/Client/Render/Tessellator/Tessellator.h create mode 100644 src/SDK/Client/Render/Tessellator/Tessellator.hpp create mode 100644 src/Utils/Render/MaterialUtils.cpp create mode 100644 src/Utils/Render/MaterialUtils.hpp diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 856f1189..be6019a5 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "Client.hpp" #include "GUI/Engine/Engine.hpp" @@ -55,7 +55,7 @@ void setWindowTitle(std::wstring title) { void Client::initialize() { std::string title = WinrtUtils::getFormattedVersion() + " " + current_commit; - setWindowTitle(L"Flarial " + L" " + FlarialGUI::to_wide(title)); + setWindowTitle(L"Flarial " + FlarialGUI::to_wide(title)); Logger::debug("[INIT] Initializing Flarial..."); VersionUtils::init(); diff --git a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp index e0857342..2d654677 100644 --- a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp +++ b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp @@ -14,6 +14,8 @@ #include "../../../Module/Modules/Hitbox/HitboxListener.hpp" #include +#include "../../../../Utils/Render/MaterialUtils.hpp" + __int64* oDrawImage = nullptr; class SetUpAndRenderHook : public Hook @@ -93,6 +95,7 @@ class SetUpAndRenderHook : public Hook } static void setUpAndRenderCallback(ScreenView* pScreenView, MinecraftUIRenderContext* muirc) { + MaterialUtils::update(); SDK::screenView = pScreenView; SDK::clientInstance = muirc->getClientInstance(); @@ -126,13 +129,12 @@ class SetUpAndRenderHook : public Hook SwapchainHook::FrameTransforms.push(transform); SwapchainHook::frameTransformsMtx.unlock(); - if(layer == "debug_screen" || layer == "hud_screen" || layer == "start_screen") { - SetupAndRenderEvent event(muirc); - funcOriginal(pScreenView, muirc); - EventHandler::onSetupAndRender(event); - } else { - funcOriginal(pScreenView, muirc); - } + funcOriginal(pScreenView, muirc); + + if (layer != "debug_screen" && layer != "toast_screen") { + SetupAndRenderEvent event(muirc); + EventHandler::onSetupAndRender(event); + } } diff --git a/src/SDK/Client/Render/Material/MaterialPtr.hpp b/src/SDK/Client/Render/Material/MaterialPtr.hpp new file mode 100644 index 00000000..ed694526 --- /dev/null +++ b/src/SDK/Client/Render/Material/MaterialPtr.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include + +#include "RenderMaterialInfo.hpp" + +namespace mce { + class MaterialPtr { + public: + std::shared_ptr renderMaterialInfoPtr; + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Render/Material/RenderMaterialInfo.hpp b/src/SDK/Client/Render/Material/RenderMaterialInfo.hpp new file mode 100644 index 00000000..253e93d1 --- /dev/null +++ b/src/SDK/Client/Render/Material/RenderMaterialInfo.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "../../Core/HashedString.hpp" + +namespace mce { + class RenderMaterialInfo : std::enable_shared_from_this { + public: + HashedString name; + // std::unique_ptr ptr; + }; +} diff --git a/src/SDK/Client/Render/ScreenContext.hpp b/src/SDK/Client/Render/ScreenContext.hpp index 0dea5303..ddd0ebcf 100644 --- a/src/SDK/Client/Render/ScreenContext.hpp +++ b/src/SDK/Client/Render/ScreenContext.hpp @@ -1,15 +1,15 @@ #pragma once -#include "Tessellator/Tessellator.h" +#include "Tessellator/Tessellator.hpp" #include "libhat/Access.hpp" class ScreenContext { public: - inline MCCColor *getColorHolder() { + MCCColor *getColorHolder() { return hat::member_at(this, GET_OFFSET("ScreenContext::colorHolder")); } - inline Tessellator *getTessellator() { + Tessellator *getTessellator() { return hat::member_at(this, GET_OFFSET("ScreenContext::tessellator")); } }; \ No newline at end of file diff --git a/src/SDK/Client/Render/Tessellator/MaterialPtr.h b/src/SDK/Client/Render/Tessellator/MaterialPtr.h deleted file mode 100644 index 420eece8..00000000 --- a/src/SDK/Client/Render/Tessellator/MaterialPtr.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "../TexturePtr.hpp" -#include "../../../../Utils/Memory/Memory.hpp" -#include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" -#include "../../Core/HashedString.hpp" - -namespace mce { - class MaterialPtr { - public: - static MaterialPtr *createMaterial(HashedString const &materialName) { - static void *materialCreator = nullptr; - - if (materialCreator == nullptr) { - // Sig returns 6 addresses, all of them point to the same offset - uintptr_t sigOffset = Memory::findSig(GET_SIG("Tessellator::createMaterial")); - int offset = *reinterpret_cast(sigOffset + 3); - materialCreator = reinterpret_cast(sigOffset + offset + 7); - } - - static int off = GET_OFFSET("createMaterial"); - return Memory::CallVFuncI(off, materialCreator, materialName); - } - }; -} \ No newline at end of file diff --git a/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp b/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp new file mode 100644 index 00000000..1cf97b21 --- /dev/null +++ b/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp @@ -0,0 +1,19 @@ +#include "MeshHelpers.hpp" + +#include "../../../../Utils/Versions/WinrtUtils.hpp" + +void MeshHelpers::renderMeshImmediately(ScreenContext* screenContext, Tessellator* tessellator, mce::MaterialPtr* material) { + if (WinrtUtils::check(21, 20)) { + char pad[0x58]{}; + static auto sig = Memory::offsetFromSig(Memory::findSig(GET_SIG("MeshHelpers::renderMeshImmediately")), 1); + using func_t = void(*)(ScreenContext*, Tessellator*, mce::MaterialPtr*, char*); + static auto func = reinterpret_cast(sig); + func(screenContext, tessellator, material, pad); + } + else { + static auto sig = Memory::findSig(GET_SIG("MeshHelpers::renderMeshImmediately")); + using func_t = void(*)(ScreenContext*, Tessellator*, mce::MaterialPtr*); + static auto func = reinterpret_cast(sig); + func(screenContext, tessellator, material); + } +} diff --git a/src/SDK/Client/Render/Tessellator/MeshHelpers.hpp b/src/SDK/Client/Render/Tessellator/MeshHelpers.hpp new file mode 100644 index 00000000..4c35e1c5 --- /dev/null +++ b/src/SDK/Client/Render/Tessellator/MeshHelpers.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "Tessellator.hpp" +#include "../ScreenContext.hpp" +#include "../Material/MaterialPtr.hpp" + +class MeshHelpers { +public: + static void renderMeshImmediately(ScreenContext* screenContext, Tessellator* tessellator, mce::MaterialPtr* material); +}; diff --git a/src/SDK/Client/Render/Tessellator/PrimitiveMode.h b/src/SDK/Client/Render/Tessellator/PrimitiveMode.h deleted file mode 100644 index c82d6a31..00000000 --- a/src/SDK/Client/Render/Tessellator/PrimitiveMode.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -namespace mce { - enum class PrimitiveMode { - QUAD = 1, - TRIANGLE_LIST, - TRIANGLE_STRIP, - LINE_LIST, - LINE_STRIP - }; -} \ No newline at end of file diff --git a/src/SDK/Client/Render/Tessellator/PrimitiveMode.hpp b/src/SDK/Client/Render/Tessellator/PrimitiveMode.hpp new file mode 100644 index 00000000..fbc38f96 --- /dev/null +++ b/src/SDK/Client/Render/Tessellator/PrimitiveMode.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace mce { + enum class PrimitiveMode : uint8_t { + None, + QuadList, + TriangleList, + TriangleStrip, + LineList, + LineStrip + }; +} diff --git a/src/SDK/Client/Render/Tessellator/RenderMaterialGroup.cpp b/src/SDK/Client/Render/Tessellator/RenderMaterialGroup.cpp new file mode 100644 index 00000000..e7364061 --- /dev/null +++ b/src/SDK/Client/Render/Tessellator/RenderMaterialGroup.cpp @@ -0,0 +1,10 @@ +#include "RenderMaterialGroup.hpp" + +#include "../../../../Utils/Memory/Memory.hpp" +#include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" + +mce::MaterialPtr* mce::RenderMaterialGroup::createUI(const HashedString& materialName) { + static auto uiRenderMaterialGroup = Memory::getOffsetFromSig(Memory::findSig(GET_SIG("mce::RenderMaterialGroup::ui")), 3); + + return Memory::CallVFunc<1, MaterialPtr*, const HashedString&>(uiRenderMaterialGroup, materialName); +} diff --git a/src/SDK/Client/Render/Tessellator/RenderMaterialGroup.hpp b/src/SDK/Client/Render/Tessellator/RenderMaterialGroup.hpp new file mode 100644 index 00000000..9c2dc9c0 --- /dev/null +++ b/src/SDK/Client/Render/Tessellator/RenderMaterialGroup.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "../Material/MaterialPtr.hpp" + +namespace mce { + class RenderMaterialGroup { + public: + static MaterialPtr* createUI(const HashedString& materialName); + }; +} diff --git a/src/SDK/Client/Render/Tessellator/Tessellator.h b/src/SDK/Client/Render/Tessellator/Tessellator.h deleted file mode 100644 index b19c2f35..00000000 --- a/src/SDK/Client/Render/Tessellator/Tessellator.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#include "PrimitiveMode.h" -#include "MaterialPtr.h" -#include "../../../../Utils/Memory/Memory.hpp" -#include "../../../../Utils/Utils.hpp" -#include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" - -class ScreenContext; - -class HashedString; - -class Tessellator { -private: - -public: - Vec3& getTransformOffset() { - return hat::member_at>(this, GET_OFFSET("Tessellator::transformOffset")); - } - - void addPostTransformOffset(int x, int y, int z) { - addPostTransformOffset((float) x, (float) y, (float) z); - } - - void addPostTransformOffset(float x, float y, float z) { - this->getTransformOffset() = this->getTransformOffset().add(Vec3(x, y, z)); - }; - - inline void begin(mce::PrimitiveMode format, int reservedVerticies = 0) { - using tess_begin_t = void (__fastcall *)(Tessellator *, mce::PrimitiveMode, bool); - static auto tess_begin = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::begin"))); - tess_begin(this, format, reservedVerticies); - } - - inline void vertex(float x, float y, float z) { - using tess_vertex_t = void (__fastcall *)(Tessellator *, float, float, float); - static auto tess_vertex = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::vertex"))); - tess_vertex(this, x, y, z); - } - - inline void color(float r, float g, float b, float a) { - using tess_color_t = void (__fastcall *)(Tessellator *, float, float, float, float); - static auto tess_color = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::colorF"))); - tess_color(this, r, g, b, a); - } - - inline void setRotation(float angle, Vec3 pivot) { - using tess_setRotation_t = void (__fastcall *)(Tessellator *, float, Vec3); - static auto tess_setRotation = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::setRotation"))); - tess_setRotation(this, angle, pivot); - } - - inline void resetTransform(bool a1) { - using tess_resetTransform_t = void (__fastcall *)(Tessellator *, bool); - static auto tess_resetTransform = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::resetTransform"))); - tess_resetTransform(this, a1); - } - - inline void renderMeshImmediately(ScreenContext *ctx, mce::MaterialPtr *material) { - using meshHelper_renderImm_t = void (__fastcall *)(ScreenContext *, Tessellator *, mce::MaterialPtr *); - static auto meshHelper_renderImm = reinterpret_cast(Memory::findSig(GET_SIG("MeshHelper::renderImmediately"))); - meshHelper_renderImm(ctx, this, material); - } -}; diff --git a/src/SDK/Client/Render/Tessellator/Tessellator.hpp b/src/SDK/Client/Render/Tessellator/Tessellator.hpp new file mode 100644 index 00000000..1b844354 --- /dev/null +++ b/src/SDK/Client/Render/Tessellator/Tessellator.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include "PrimitiveMode.hpp" +#include "../../../../Utils/Memory/Memory.hpp" +#include "../../../../Utils/Utils.hpp" +#include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" + +class Tessellator { +public: + void begin(mce::PrimitiveMode vertexFormat = mce::PrimitiveMode::TriangleList, const int maxVertices = 0, const bool buildFaceData = false) { + using func_t = void(__fastcall*)(Tessellator*, mce::PrimitiveMode, int, bool); + static auto func = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::begin"))); + func(this, vertexFormat, maxVertices, buildFaceData); + } + + void vertex(float x, float y, float z) { + using func_t = void(__fastcall*)(Tessellator*, float, float, float); + static auto func = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::vertex"))); + func(this, x, y, z); + } + + void color(float r, float g, float b, float a) { + using func_t = void(__fastcall*)(Tessellator*, float, float, float, float); + static auto func = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::colorF"))); + func(this, r, g, b, a); + } + + void setRotation(float angle, Vec3 pivot) { + using func_t = void(__fastcall*)(Tessellator *, float, Vec3); + static auto func = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::setRotation"))); + func(this, angle, pivot); + } + + void resetTransform(bool a1) { + using func_t = void(__fastcall*)(Tessellator *, bool); + static auto func = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::resetTransform"))); + func(this, a1); + } +}; diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index 212e4c5b..667c5681 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -273,8 +273,6 @@ void OffsetInit::init2030() { ADD_OFFSET("ScreenContext::colorHolder", 0x30); ADD_OFFSET("ScreenContext::tessellator", 0xC0); - ADD_OFFSET("Tessellator::transformOffset", 0x184); - ADD_OFFSET("createMaterial", 1); ADD_OFFSET("TextureGroup::base", 0x18); diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 3ca0977f..2766775f 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -22,6 +22,8 @@ void SigInit::init2120() { ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24 ? 48 8B 4B ? 89 44 24 ? E8 ? ? ? ? 4C 8B D8"); ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 45 0F B6 F1 49 8B D8"); + + ADD_SIG("MeshHelpers::renderMeshImmediately", "E8 ? ? ? ? C6 43 ? ? F3 0F 10 1D ? ? ? ? 0F 57 D2 0F 57 C9"); } void SigInit::init2102() { @@ -246,13 +248,13 @@ void SigInit::init2030() { ADD_SIG("MinecraftUIRenderContext::getUIMaterial", "4C 8D 05 ? ? ? ? 48 8B D3 48 8B CF 48 8B 5C 24 ? 0F 28 7C 24 ? 44 0F 28 44 24 ? 48 83 C4 40 5F E9 ? ? ? ?"); - ADD_SIG("Tessellator::createMaterial", "48 8B 05 ? ? ? ? 48 8D 55 ? 48 8D 0D ? ? ? ? 48 8B 40 ? FF 15 ? ? ? ? 48 8B F8"); + ADD_SIG("mce::RenderMaterialGroup::ui", "48 8B 05 ? ? ? ? 48 8D 55 ? 48 8D 0D ? ? ? ? 48 8B 40 ? FF 15 ? ? ? ? 48 8B F8"); ADD_SIG("Tessellator::begin", "48 89 5C 24 ? 56 48 83 EC ? 80 B9 ? ? ? ? ? 45 0F B6"); ADD_SIG("Tessellator::vertex", "40 57 48 81 EC ? ? ? ? 0F 29 7C ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 ? 8B 81"); ADD_SIG("Tessellator::colorF", "80 B9 ? ? ? ? ? 4C 8B C1 75"); ADD_SIG("Tessellator::setRotation", "48 89 5C 24 ? 57 48 81 EC ? ? ? ? F3 41 0F 10"); - ADD_SIG("Tessellator::resetTransform", "80 B9 ? ? ? ? ? 4C 8B C1 75"); - ADD_SIG("MeshHelper::renderImmediately", "48 89 5C 24 ? 48 89 74 24 ? 57 48 81 EC ? ? ? ? 49 8B F8 48 8B DA 48 8B F1 80 BA"); + ADD_SIG("Tessellator::resetTransform", "40 53 48 81 EC ? ? ? ? C6 81 ? ? ? ? ? 48 8B D9 84 D2"); + ADD_SIG("MeshHelpers::renderMeshImmediately", "48 89 5C 24 ? 48 89 74 24 ? 57 48 81 EC ? ? ? ? 49 8B F8 48 8B DA 48 8B F1 80 BA"); ADD_SIG("MinecraftUIRenderContext::getTexture", "40 53 56 57 48 83 EC 70 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 60 48 8B DA 48 89"); diff --git a/src/Utils/Memory/Memory.hpp b/src/Utils/Memory/Memory.hpp index e3019527..24ea3aec 100644 --- a/src/Utils/Memory/Memory.hpp +++ b/src/Utils/Memory/Memory.hpp @@ -52,7 +52,7 @@ class Memory { public: template - static inline auto CallVFunc(void *thisptr, TArgs... argList) -> TRet { + static auto CallVFunc(void *thisptr, TArgs... argList) -> TRet { using Fn = TRet(__thiscall *)(void *, decltype(argList)...); return (*static_cast(thisptr))[IIdx](thisptr, std::forward(argList)...); } @@ -81,7 +81,7 @@ class Memory { } template - static inline R CallFunc(void *func, Args... args) { + static R CallFunc(void *func, Args... args) { return ((R(*)(Args...)) func)(args...); } @@ -158,7 +158,7 @@ class Memory { VirtualProtect(dst, size, oldprotect, &oldprotect); } - static inline uintptr_t offsetFromSig(uintptr_t sig, int offset) { // REL RIP ADDR RESOLVER + static uintptr_t offsetFromSig(uintptr_t sig, int offset) { // REL RIP ADDR RESOLVER // pointer is relative to the code it is in - it is how far to the left in bytes you need to move to get to the value it points to, // this function returns absolute address in memory ("(sig)A B C (+offset)? ? ? ?(+4)(from here + bytes to move to get to value pointer points to) D E F") // offset val = *reinterpret_cast(sig + offset) @@ -171,7 +171,7 @@ class Memory { return reinterpret_cast(offsetFromSig(sig, offset)); } - static inline std::array getRipRel(uintptr_t instructionAddress, uintptr_t targetAddress) { + static std::array getRipRel(uintptr_t instructionAddress, uintptr_t targetAddress) { uintptr_t relAddress = targetAddress - (instructionAddress + 4); // 4 bytes for RIP-relative addressing std::array relRipBytes{}; @@ -182,7 +182,7 @@ class Memory { return relRipBytes; } - static inline uintptr_t GetAddressByIndex(uintptr_t vtable, int index) { - return (*reinterpret_cast(vtable + 8 * index)); + static uintptr_t GetAddressByIndex(uintptr_t vtable, int index) { + return *reinterpret_cast(vtable + 8 * index); } }; diff --git a/src/Utils/Render/MaterialUtils.cpp b/src/Utils/Render/MaterialUtils.cpp new file mode 100644 index 00000000..3a96e55e --- /dev/null +++ b/src/Utils/Render/MaterialUtils.cpp @@ -0,0 +1,14 @@ +#include "MaterialUtils.hpp" + +#include "../../SDK/Client/Render/Tessellator/RenderMaterialGroup.hpp" + +static mce::MaterialPtr* uiFillColor = nullptr; + +void MaterialUtils::update() { + if (uiFillColor == nullptr) + uiFillColor = mce::RenderMaterialGroup::createUI(HashedString("ui_fill_color")); +} + +mce::MaterialPtr* MaterialUtils::getUIFillColor() { + return uiFillColor; +} diff --git a/src/Utils/Render/MaterialUtils.hpp b/src/Utils/Render/MaterialUtils.hpp new file mode 100644 index 00000000..81ee71f8 --- /dev/null +++ b/src/Utils/Render/MaterialUtils.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "../../SDK/Client/Render/Material/MaterialPtr.hpp" + +class MaterialUtils { +public: + static void update(); + + static mce::MaterialPtr* getUIFillColor(); +}; From 4763de0c81109e164ee7c6abc20c953be47c02a4 Mon Sep 17 00:00:00 2001 From: chyves Date: Sun, 18 Aug 2024 21:48:31 -0400 Subject: [PATCH 130/240] better item physics & crosshair mod beginning (i dont want to impl the ui) --- .gitignore | 6 +- Makefile | 2713 +++++++++++++++++ src/Client/Module/Manager.cpp | 2 + .../Module/Modules/Crosshair/Crosshair.hpp | 66 + .../Modules/Crosshair/CrosshairListener.hpp | 32 + .../ItemPhysics/ItemPhysicsListener.cpp | 163 +- 6 files changed, 2866 insertions(+), 116 deletions(-) create mode 100644 Makefile create mode 100644 src/Client/Module/Modules/Crosshair/Crosshair.hpp create mode 100644 src/Client/Module/Modules/Crosshair/CrosshairListener.hpp diff --git a/.gitignore b/.gitignore index 1927de1b..29e257f5 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,8 @@ cmake-build-visual-profile/ clion/ clion-ninja/ *.zip -localextras/ \ No newline at end of file +localextras/ +_deps/ +*.pdb +*.dll +*.ilk \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..d8d06b8f --- /dev/null +++ b/Makefile @@ -0,0 +1,2713 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "NMake Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE +NULL=nul +!ENDIF +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\judah\source\repos\flarial-dll + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\judah\source\repos\flarial-dll + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E echo "No interactive CMake dialog available." +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache\fast: edit_cache +.PHONY : edit_cache\fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache\fast: rebuild_cache +.PHONY : rebuild_cache\fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components\fast: list_install_components +.PHONY : list_install_components\fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install\fast: preinstall\fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -P cmake_install.cmake +.PHONY : install\fast + +# Special rule for the target install/local +install\local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install\local + +# Special rule for the target install/local +install\local\fast: preinstall\fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install\local\fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\judah\source\repos\flarial-dll\CMakeFiles C:\Users\judah\source\repos\flarial-dll\\CMakeFiles\progress.marks + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\judah\source\repos\flarial-dll\CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) clean +.PHONY : clean + +# The main clean target +clean\fast: clean +.PHONY : clean\fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall\fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) preinstall +.PHONY : preinstall\fast + +# clear depends +depend: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named Flarial + +# Build rule for target. +Flarial: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) Flarial +.PHONY : Flarial + +# fast build rule for target. +Flarial\fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\build +.PHONY : Flarial\fast + +#============================================================================= +# Target rules for targets named libhat + +# Build rule for target. +libhat: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) libhat +.PHONY : libhat + +# fast build rule for target. +libhat\fast: + $(MAKE) $(MAKESILENT) -f _deps\libhat-build\CMakeFiles\libhat.dir\build.make /nologo -$(MAKEFLAGS) _deps\libhat-build\CMakeFiles\libhat.dir\build +.PHONY : libhat\fast + +lib\ImGui\imgui.obj: lib\ImGui\imgui.cpp.obj +.PHONY : lib\ImGui\imgui.obj + +# target to build an object file +lib\ImGui\imgui.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui.cpp.obj +.PHONY : lib\ImGui\imgui.cpp.obj + +lib\ImGui\imgui.i: lib\ImGui\imgui.cpp.i +.PHONY : lib\ImGui\imgui.i + +# target to preprocess a source file +lib\ImGui\imgui.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui.cpp.i +.PHONY : lib\ImGui\imgui.cpp.i + +lib\ImGui\imgui.s: lib\ImGui\imgui.cpp.s +.PHONY : lib\ImGui\imgui.s + +# target to generate assembly for a file +lib\ImGui\imgui.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui.cpp.s +.PHONY : lib\ImGui\imgui.cpp.s + +lib\ImGui\imgui_demo.obj: lib\ImGui\imgui_demo.cpp.obj +.PHONY : lib\ImGui\imgui_demo.obj + +# target to build an object file +lib\ImGui\imgui_demo.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_demo.cpp.obj +.PHONY : lib\ImGui\imgui_demo.cpp.obj + +lib\ImGui\imgui_demo.i: lib\ImGui\imgui_demo.cpp.i +.PHONY : lib\ImGui\imgui_demo.i + +# target to preprocess a source file +lib\ImGui\imgui_demo.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_demo.cpp.i +.PHONY : lib\ImGui\imgui_demo.cpp.i + +lib\ImGui\imgui_demo.s: lib\ImGui\imgui_demo.cpp.s +.PHONY : lib\ImGui\imgui_demo.s + +# target to generate assembly for a file +lib\ImGui\imgui_demo.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_demo.cpp.s +.PHONY : lib\ImGui\imgui_demo.cpp.s + +lib\ImGui\imgui_draw.obj: lib\ImGui\imgui_draw.cpp.obj +.PHONY : lib\ImGui\imgui_draw.obj + +# target to build an object file +lib\ImGui\imgui_draw.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_draw.cpp.obj +.PHONY : lib\ImGui\imgui_draw.cpp.obj + +lib\ImGui\imgui_draw.i: lib\ImGui\imgui_draw.cpp.i +.PHONY : lib\ImGui\imgui_draw.i + +# target to preprocess a source file +lib\ImGui\imgui_draw.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_draw.cpp.i +.PHONY : lib\ImGui\imgui_draw.cpp.i + +lib\ImGui\imgui_draw.s: lib\ImGui\imgui_draw.cpp.s +.PHONY : lib\ImGui\imgui_draw.s + +# target to generate assembly for a file +lib\ImGui\imgui_draw.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_draw.cpp.s +.PHONY : lib\ImGui\imgui_draw.cpp.s + +lib\ImGui\imgui_impl_dx11.obj: lib\ImGui\imgui_impl_dx11.cpp.obj +.PHONY : lib\ImGui\imgui_impl_dx11.obj + +# target to build an object file +lib\ImGui\imgui_impl_dx11.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx11.cpp.obj +.PHONY : lib\ImGui\imgui_impl_dx11.cpp.obj + +lib\ImGui\imgui_impl_dx11.i: lib\ImGui\imgui_impl_dx11.cpp.i +.PHONY : lib\ImGui\imgui_impl_dx11.i + +# target to preprocess a source file +lib\ImGui\imgui_impl_dx11.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx11.cpp.i +.PHONY : lib\ImGui\imgui_impl_dx11.cpp.i + +lib\ImGui\imgui_impl_dx11.s: lib\ImGui\imgui_impl_dx11.cpp.s +.PHONY : lib\ImGui\imgui_impl_dx11.s + +# target to generate assembly for a file +lib\ImGui\imgui_impl_dx11.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx11.cpp.s +.PHONY : lib\ImGui\imgui_impl_dx11.cpp.s + +lib\ImGui\imgui_impl_dx12.obj: lib\ImGui\imgui_impl_dx12.cpp.obj +.PHONY : lib\ImGui\imgui_impl_dx12.obj + +# target to build an object file +lib\ImGui\imgui_impl_dx12.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx12.cpp.obj +.PHONY : lib\ImGui\imgui_impl_dx12.cpp.obj + +lib\ImGui\imgui_impl_dx12.i: lib\ImGui\imgui_impl_dx12.cpp.i +.PHONY : lib\ImGui\imgui_impl_dx12.i + +# target to preprocess a source file +lib\ImGui\imgui_impl_dx12.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx12.cpp.i +.PHONY : lib\ImGui\imgui_impl_dx12.cpp.i + +lib\ImGui\imgui_impl_dx12.s: lib\ImGui\imgui_impl_dx12.cpp.s +.PHONY : lib\ImGui\imgui_impl_dx12.s + +# target to generate assembly for a file +lib\ImGui\imgui_impl_dx12.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx12.cpp.s +.PHONY : lib\ImGui\imgui_impl_dx12.cpp.s + +lib\ImGui\imgui_impl_win32.obj: lib\ImGui\imgui_impl_win32.cpp.obj +.PHONY : lib\ImGui\imgui_impl_win32.obj + +# target to build an object file +lib\ImGui\imgui_impl_win32.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_win32.cpp.obj +.PHONY : lib\ImGui\imgui_impl_win32.cpp.obj + +lib\ImGui\imgui_impl_win32.i: lib\ImGui\imgui_impl_win32.cpp.i +.PHONY : lib\ImGui\imgui_impl_win32.i + +# target to preprocess a source file +lib\ImGui\imgui_impl_win32.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_win32.cpp.i +.PHONY : lib\ImGui\imgui_impl_win32.cpp.i + +lib\ImGui\imgui_impl_win32.s: lib\ImGui\imgui_impl_win32.cpp.s +.PHONY : lib\ImGui\imgui_impl_win32.s + +# target to generate assembly for a file +lib\ImGui\imgui_impl_win32.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_win32.cpp.s +.PHONY : lib\ImGui\imgui_impl_win32.cpp.s + +lib\ImGui\imgui_tables.obj: lib\ImGui\imgui_tables.cpp.obj +.PHONY : lib\ImGui\imgui_tables.obj + +# target to build an object file +lib\ImGui\imgui_tables.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_tables.cpp.obj +.PHONY : lib\ImGui\imgui_tables.cpp.obj + +lib\ImGui\imgui_tables.i: lib\ImGui\imgui_tables.cpp.i +.PHONY : lib\ImGui\imgui_tables.i + +# target to preprocess a source file +lib\ImGui\imgui_tables.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_tables.cpp.i +.PHONY : lib\ImGui\imgui_tables.cpp.i + +lib\ImGui\imgui_tables.s: lib\ImGui\imgui_tables.cpp.s +.PHONY : lib\ImGui\imgui_tables.s + +# target to generate assembly for a file +lib\ImGui\imgui_tables.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_tables.cpp.s +.PHONY : lib\ImGui\imgui_tables.cpp.s + +lib\ImGui\imgui_widgets.obj: lib\ImGui\imgui_widgets.cpp.obj +.PHONY : lib\ImGui\imgui_widgets.obj + +# target to build an object file +lib\ImGui\imgui_widgets.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_widgets.cpp.obj +.PHONY : lib\ImGui\imgui_widgets.cpp.obj + +lib\ImGui\imgui_widgets.i: lib\ImGui\imgui_widgets.cpp.i +.PHONY : lib\ImGui\imgui_widgets.i + +# target to preprocess a source file +lib\ImGui\imgui_widgets.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_widgets.cpp.i +.PHONY : lib\ImGui\imgui_widgets.cpp.i + +lib\ImGui\imgui_widgets.s: lib\ImGui\imgui_widgets.cpp.s +.PHONY : lib\ImGui\imgui_widgets.s + +# target to generate assembly for a file +lib\ImGui\imgui_widgets.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_widgets.cpp.s +.PHONY : lib\ImGui\imgui_widgets.cpp.s + +lib\glm\glm.obj: lib\glm\glm.cpp.obj +.PHONY : lib\glm\glm.obj + +# target to build an object file +lib\glm\glm.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\glm\glm.cpp.obj +.PHONY : lib\glm\glm.cpp.obj + +lib\glm\glm.i: lib\glm\glm.cpp.i +.PHONY : lib\glm\glm.i + +# target to preprocess a source file +lib\glm\glm.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\glm\glm.cpp.i +.PHONY : lib\glm\glm.cpp.i + +lib\glm\glm.s: lib\glm\glm.cpp.s +.PHONY : lib\glm\glm.s + +# target to generate assembly for a file +lib\glm\glm.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\glm\glm.cpp.s +.PHONY : lib\glm\glm.cpp.s + +lib\kiero\kiero.obj: lib\kiero\kiero.cpp.obj +.PHONY : lib\kiero\kiero.obj + +# target to build an object file +lib\kiero\kiero.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\kiero\kiero.cpp.obj +.PHONY : lib\kiero\kiero.cpp.obj + +lib\kiero\kiero.i: lib\kiero\kiero.cpp.i +.PHONY : lib\kiero\kiero.i + +# target to preprocess a source file +lib\kiero\kiero.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\kiero\kiero.cpp.i +.PHONY : lib\kiero\kiero.cpp.i + +lib\kiero\kiero.s: lib\kiero\kiero.cpp.s +.PHONY : lib\kiero\kiero.s + +# target to generate assembly for a file +lib\kiero\kiero.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\kiero\kiero.cpp.s +.PHONY : lib\kiero\kiero.cpp.s + +main.obj: main.cpp.obj +.PHONY : main.obj + +# target to build an object file +main.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\main.cpp.obj +.PHONY : main.cpp.obj + +main.i: main.cpp.i +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\main.cpp.s +.PHONY : main.cpp.s + +src\Assets\Assets.res: src\Assets\Assets.rc.res +.PHONY : src\Assets\Assets.res + +# target to build an object file +src\Assets\Assets.rc.res: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Assets\Assets.rc.res +.PHONY : src\Assets\Assets.rc.res + +src\Client\Client.obj: src\Client\Client.cpp.obj +.PHONY : src\Client\Client.obj + +# target to build an object file +src\Client\Client.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Client.cpp.obj +.PHONY : src\Client\Client.cpp.obj + +src\Client\Client.i: src\Client\Client.cpp.i +.PHONY : src\Client\Client.i + +# target to preprocess a source file +src\Client\Client.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Client.cpp.i +.PHONY : src\Client\Client.cpp.i + +src\Client\Client.s: src\Client\Client.cpp.s +.PHONY : src\Client\Client.s + +# target to generate assembly for a file +src\Client\Client.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Client.cpp.s +.PHONY : src\Client\Client.cpp.s + +src\Client\Events\EventHandler.obj: src\Client\Events\EventHandler.cpp.obj +.PHONY : src\Client\Events\EventHandler.obj + +# target to build an object file +src\Client\Events\EventHandler.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Events\EventHandler.cpp.obj +.PHONY : src\Client\Events\EventHandler.cpp.obj + +src\Client\Events\EventHandler.i: src\Client\Events\EventHandler.cpp.i +.PHONY : src\Client\Events\EventHandler.i + +# target to preprocess a source file +src\Client\Events\EventHandler.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Events\EventHandler.cpp.i +.PHONY : src\Client\Events\EventHandler.cpp.i + +src\Client\Events\EventHandler.s: src\Client\Events\EventHandler.cpp.s +.PHONY : src\Client\Events\EventHandler.s + +# target to generate assembly for a file +src\Client\Events\EventHandler.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Events\EventHandler.cpp.s +.PHONY : src\Client\Events\EventHandler.cpp.s + +src\Client\GUI\Engine\Constraints.obj: src\Client\GUI\Engine\Constraints.cpp.obj +.PHONY : src\Client\GUI\Engine\Constraints.obj + +# target to build an object file +src\Client\GUI\Engine\Constraints.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Constraints.cpp.obj +.PHONY : src\Client\GUI\Engine\Constraints.cpp.obj + +src\Client\GUI\Engine\Constraints.i: src\Client\GUI\Engine\Constraints.cpp.i +.PHONY : src\Client\GUI\Engine\Constraints.i + +# target to preprocess a source file +src\Client\GUI\Engine\Constraints.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Constraints.cpp.i +.PHONY : src\Client\GUI\Engine\Constraints.cpp.i + +src\Client\GUI\Engine\Constraints.s: src\Client\GUI\Engine\Constraints.cpp.s +.PHONY : src\Client\GUI\Engine\Constraints.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Constraints.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Constraints.cpp.s +.PHONY : src\Client\GUI\Engine\Constraints.cpp.s + +src\Client\GUI\Engine\Effects\Blur\blur.obj: src\Client\GUI\Engine\Effects\Blur\blur.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.obj + +# target to build an object file +src\Client\GUI\Engine\Effects\Blur\blur.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.cpp.obj + +src\Client\GUI\Engine\Effects\Blur\blur.i: src\Client\GUI\Engine\Effects\Blur\blur.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.i + +# target to preprocess a source file +src\Client\GUI\Engine\Effects\Blur\blur.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.cpp.i + +src\Client\GUI\Engine\Effects\Blur\blur.s: src\Client\GUI\Engine\Effects\Blur\blur.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Effects\Blur\blur.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.cpp.s + +src\Client\GUI\Engine\Effects\Blur\blur_dx12.obj: src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.obj + +# target to build an object file +src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.obj + +src\Client\GUI\Engine\Effects\Blur\blur_dx12.i: src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.i + +# target to preprocess a source file +src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.i + +src\Client\GUI\Engine\Effects\Blur\blur_dx12.s: src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.s + +src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.obj: src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.obj + +# target to build an object file +src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.obj + +src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.i: src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.i + +# target to preprocess a source file +src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.i + +src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.s: src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.s + +src\Client\GUI\Engine\Effects\DeepFry\DeepFry.obj: src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.obj + +# target to build an object file +src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.obj + +src\Client\GUI\Engine\Effects\DeepFry\DeepFry.i: src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.i + +# target to preprocess a source file +src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.i + +src\Client\GUI\Engine\Effects\DeepFry\DeepFry.s: src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.s + +src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.obj: src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.obj + +# target to build an object file +src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.obj + +src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.i: src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.i + +# target to preprocess a source file +src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.i + +src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.s: src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.s + +src\Client\GUI\Engine\Effects\Hue\Hue.obj: src\Client\GUI\Engine\Effects\Hue\Hue.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.obj + +# target to build an object file +src\Client\GUI\Engine\Effects\Hue\Hue.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Hue\Hue.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.cpp.obj + +src\Client\GUI\Engine\Effects\Hue\Hue.i: src\Client\GUI\Engine\Effects\Hue\Hue.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.i + +# target to preprocess a source file +src\Client\GUI\Engine\Effects\Hue\Hue.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Hue\Hue.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.cpp.i + +src\Client\GUI\Engine\Effects\Hue\Hue.s: src\Client\GUI\Engine\Effects\Hue\Hue.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Effects\Hue\Hue.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Hue\Hue.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.cpp.s + +src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.obj: src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.obj + +# target to build an object file +src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.obj +.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.obj + +src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.i: src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.i + +# target to preprocess a source file +src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.i +.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.i + +src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.s: src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.s +.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.s + +src\Client\GUI\Engine\Elements\Control\Button\Button.obj: src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.obj + +src\Client\GUI\Engine\Elements\Control\Button\Button.i: src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.i + +src\Client\GUI\Engine\Elements\Control\Button\Button.s: src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.s + +src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.obj: src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.obj + +src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.i: src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.i + +src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.s: src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.s + +src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.obj: src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.obj + +src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.i: src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.i + +src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.s: src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.s + +src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.obj: src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.obj + +src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.i: src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.i + +src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.s: src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.s + +src\Client\GUI\Engine\Elements\Control\Image\Image.obj: src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.obj + +src\Client\GUI\Engine\Elements\Control\Image\Image.i: src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.i + +src\Client\GUI\Engine\Elements\Control\Image\Image.s: src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.s + +src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.obj: src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.obj + +src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.i: src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.i + +src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.s: src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.s + +src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.obj: src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.obj + +src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.i: src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.i + +src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.s: src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.s + +src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.obj: src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.obj + +src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.i: src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.i + +src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.s: src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.s + +src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.obj: src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.obj + +src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.i: src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.i + +src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.s: src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.s + +src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.obj: src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.obj + +src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.i: src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.i + +src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.s: src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.s + +src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.obj: src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.obj + +src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.i: src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.i + +src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.s: src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.s + +src\Client\GUI\Engine\Elements\Control\Slider\Slider.obj: src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.obj + +src\Client\GUI\Engine\Elements\Control\Slider\Slider.i: src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.i + +src\Client\GUI\Engine\Elements\Control\Slider\Slider.s: src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.s + +src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.obj: src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.obj + +src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.i: src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.i + +src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.s: src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.s + +src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.obj: src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.obj + +src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.i: src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.i + +src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.s: src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.s + +src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.obj: src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.obj + +src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.i: src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.i + +src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.s: src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.s + +src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.obj: src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.obj + +src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.i: src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.i + +src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.s: src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.s + +src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.obj + +src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.i: src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.i + +src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.s: src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.s + +src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.obj + +src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.i: src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.i + +src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.s: src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.s + +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.obj + +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.i: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.i + +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.s: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.s + +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.obj + +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.i: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.i + +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.s: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.s + +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.obj + +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.i: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.i + +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.s: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.s + +src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.obj + +src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.i: src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.i + +src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.s: src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.s + +src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.obj: src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.obj + +src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.i: src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.i + +src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.s: src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.s + +src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.obj: src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.obj + +src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.i: src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.i + +src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.s: src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.s + +src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.obj: src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.obj + +# target to build an object file +src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.obj +.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.obj + +src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.i: src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.i + +# target to preprocess a source file +src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.i +.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.i + +src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.s: src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.s +.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.s + +src\Client\GUI\Engine\Engine.obj: src\Client\GUI\Engine\Engine.cpp.obj +.PHONY : src\Client\GUI\Engine\Engine.obj + +# target to build an object file +src\Client\GUI\Engine\Engine.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Engine.cpp.obj +.PHONY : src\Client\GUI\Engine\Engine.cpp.obj + +src\Client\GUI\Engine\Engine.i: src\Client\GUI\Engine\Engine.cpp.i +.PHONY : src\Client\GUI\Engine\Engine.i + +# target to preprocess a source file +src\Client\GUI\Engine\Engine.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Engine.cpp.i +.PHONY : src\Client\GUI\Engine\Engine.cpp.i + +src\Client\GUI\Engine\Engine.s: src\Client\GUI\Engine\Engine.cpp.s +.PHONY : src\Client\GUI\Engine\Engine.s + +# target to generate assembly for a file +src\Client\GUI\Engine\Engine.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Engine.cpp.s +.PHONY : src\Client\GUI\Engine\Engine.cpp.s + +src\Client\Hook\Hooks\Game\ActorBaseTick.obj: src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.obj + +# target to build an object file +src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.obj + +src\Client\Hook\Hooks\Game\ActorBaseTick.i: src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.i + +src\Client\Hook\Hooks\Game\ActorBaseTick.s: src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.s + +src\Client\Hook\Hooks\Game\GameModeAttack.obj: src\Client\Hook\Hooks\Game\GameModeAttack.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.obj + +# target to build an object file +src\Client\Hook\Hooks\Game\GameModeAttack.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\GameModeAttack.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.cpp.obj + +src\Client\Hook\Hooks\Game\GameModeAttack.i: src\Client\Hook\Hooks\Game\GameModeAttack.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Game\GameModeAttack.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\GameModeAttack.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.cpp.i + +src\Client\Hook\Hooks\Game\GameModeAttack.s: src\Client\Hook\Hooks\Game\GameModeAttack.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Game\GameModeAttack.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\GameModeAttack.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.cpp.s + +src\Client\Hook\Hooks\Game\OnSuspend.obj: src\Client\Hook\Hooks\Game\OnSuspend.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.obj + +# target to build an object file +src\Client\Hook\Hooks\Game\OnSuspend.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\OnSuspend.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.cpp.obj + +src\Client\Hook\Hooks\Game\OnSuspend.i: src\Client\Hook\Hooks\Game\OnSuspend.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Game\OnSuspend.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\OnSuspend.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.cpp.i + +src\Client\Hook\Hooks\Game\OnSuspend.s: src\Client\Hook\Hooks\Game\OnSuspend.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Game\OnSuspend.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\OnSuspend.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.cpp.s + +src\Client\Hook\Hooks\Game\PacketHooks.obj: src\Client\Hook\Hooks\Game\PacketHooks.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.obj + +# target to build an object file +src\Client\Hook\Hooks\Game\PacketHooks.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\PacketHooks.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.cpp.obj + +src\Client\Hook\Hooks\Game\PacketHooks.i: src\Client\Hook\Hooks\Game\PacketHooks.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Game\PacketHooks.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\PacketHooks.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.cpp.i + +src\Client\Hook\Hooks\Game\PacketHooks.s: src\Client\Hook\Hooks\Game\PacketHooks.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Game\PacketHooks.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\PacketHooks.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.cpp.s + +src\Client\Hook\Hooks\Game\RaknetTick.obj: src\Client\Hook\Hooks\Game\RaknetTick.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.obj + +# target to build an object file +src\Client\Hook\Hooks\Game\RaknetTick.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RaknetTick.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.cpp.obj + +src\Client\Hook\Hooks\Game\RaknetTick.i: src\Client\Hook\Hooks\Game\RaknetTick.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Game\RaknetTick.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RaknetTick.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.cpp.i + +src\Client\Hook\Hooks\Game\RaknetTick.s: src\Client\Hook\Hooks\Game\RaknetTick.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Game\RaknetTick.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RaknetTick.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.cpp.s + +src\Client\Hook\Hooks\Game\RenderItemGroup.obj: src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.obj + +# target to build an object file +src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.obj + +src\Client\Hook\Hooks\Game\RenderItemGroup.i: src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.i + +src\Client\Hook\Hooks\Game\RenderItemGroup.s: src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.s + +src\Client\Hook\Hooks\Game\getViewPerspective.obj: src\Client\Hook\Hooks\Game\getViewPerspective.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.obj + +# target to build an object file +src\Client\Hook\Hooks\Game\getViewPerspective.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\getViewPerspective.cpp.obj +.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.cpp.obj + +src\Client\Hook\Hooks\Game\getViewPerspective.i: src\Client\Hook\Hooks\Game\getViewPerspective.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Game\getViewPerspective.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\getViewPerspective.cpp.i +.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.cpp.i + +src\Client\Hook\Hooks\Game\getViewPerspective.s: src\Client\Hook\Hooks\Game\getViewPerspective.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Game\getViewPerspective.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\getViewPerspective.cpp.s +.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.cpp.s + +src\Client\Hook\Hooks\Hook.obj: src\Client\Hook\Hooks\Hook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Hook.obj + +# target to build an object file +src\Client\Hook\Hooks\Hook.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Hook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Hook.cpp.obj + +src\Client\Hook\Hooks\Hook.i: src\Client\Hook\Hooks\Hook.cpp.i +.PHONY : src\Client\Hook\Hooks\Hook.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Hook.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Hook.cpp.i +.PHONY : src\Client\Hook\Hooks\Hook.cpp.i + +src\Client\Hook\Hooks\Hook.s: src\Client\Hook\Hooks\Hook.cpp.s +.PHONY : src\Client\Hook\Hooks\Hook.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Hook.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Hook.cpp.s +.PHONY : src\Client\Hook\Hooks\Hook.cpp.s + +src\Client\Hook\Hooks\Input\KeyHook.obj: src\Client\Hook\Hooks\Input\KeyHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Input\KeyHook.obj + +# target to build an object file +src\Client\Hook\Hooks\Input\KeyHook.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\KeyHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Input\KeyHook.cpp.obj + +src\Client\Hook\Hooks\Input\KeyHook.i: src\Client\Hook\Hooks\Input\KeyHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Input\KeyHook.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Input\KeyHook.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\KeyHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Input\KeyHook.cpp.i + +src\Client\Hook\Hooks\Input\KeyHook.s: src\Client\Hook\Hooks\Input\KeyHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Input\KeyHook.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Input\KeyHook.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\KeyHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Input\KeyHook.cpp.s + +src\Client\Hook\Hooks\Input\MouseHook.obj: src\Client\Hook\Hooks\Input\MouseHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Input\MouseHook.obj + +# target to build an object file +src\Client\Hook\Hooks\Input\MouseHook.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\MouseHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Input\MouseHook.cpp.obj + +src\Client\Hook\Hooks\Input\MouseHook.i: src\Client\Hook\Hooks\Input\MouseHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Input\MouseHook.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Input\MouseHook.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\MouseHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Input\MouseHook.cpp.i + +src\Client\Hook\Hooks\Input\MouseHook.s: src\Client\Hook\Hooks\Input\MouseHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Input\MouseHook.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Input\MouseHook.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\MouseHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Input\MouseHook.cpp.s + +src\Client\Hook\Hooks\Render\CommandListHook.obj: src\Client\Hook\Hooks\Render\CommandListHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.obj + +# target to build an object file +src\Client\Hook\Hooks\Render\CommandListHook.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\CommandListHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.cpp.obj + +src\Client\Hook\Hooks\Render\CommandListHook.i: src\Client\Hook\Hooks\Render\CommandListHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Render\CommandListHook.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\CommandListHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.cpp.i + +src\Client\Hook\Hooks\Render\CommandListHook.s: src\Client\Hook\Hooks\Render\CommandListHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Render\CommandListHook.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\CommandListHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.cpp.s + +src\Client\Hook\Hooks\Render\ResizeHook.obj: src\Client\Hook\Hooks\Render\ResizeHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.obj + +# target to build an object file +src\Client\Hook\Hooks\Render\ResizeHook.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\ResizeHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.cpp.obj + +src\Client\Hook\Hooks\Render\ResizeHook.i: src\Client\Hook\Hooks\Render\ResizeHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Render\ResizeHook.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\ResizeHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.cpp.i + +src\Client\Hook\Hooks\Render\ResizeHook.s: src\Client\Hook\Hooks\Render\ResizeHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Render\ResizeHook.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\ResizeHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.cpp.s + +src\Client\Hook\Hooks\Render\SwapchainHook.obj: src\Client\Hook\Hooks\Render\SwapchainHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.obj + +# target to build an object file +src\Client\Hook\Hooks\Render\SwapchainHook.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\SwapchainHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.cpp.obj + +src\Client\Hook\Hooks\Render\SwapchainHook.i: src\Client\Hook\Hooks\Render\SwapchainHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Render\SwapchainHook.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\SwapchainHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.cpp.i + +src\Client\Hook\Hooks\Render\SwapchainHook.s: src\Client\Hook\Hooks\Render\SwapchainHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Render\SwapchainHook.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\SwapchainHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.cpp.s + +src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.obj: src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.obj + +# target to build an object file +src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.obj +.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.obj + +src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.i: src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.i + +# target to preprocess a source file +src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.i +.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.i + +src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.s: src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.s + +# target to generate assembly for a file +src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.s +.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.s + +src\Client\Hook\Manager.obj: src\Client\Hook\Manager.cpp.obj +.PHONY : src\Client\Hook\Manager.obj + +# target to build an object file +src\Client\Hook\Manager.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Manager.cpp.obj +.PHONY : src\Client\Hook\Manager.cpp.obj + +src\Client\Hook\Manager.i: src\Client\Hook\Manager.cpp.i +.PHONY : src\Client\Hook\Manager.i + +# target to preprocess a source file +src\Client\Hook\Manager.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Manager.cpp.i +.PHONY : src\Client\Hook\Manager.cpp.i + +src\Client\Hook\Manager.s: src\Client\Hook\Manager.cpp.s +.PHONY : src\Client\Hook\Manager.s + +# target to generate assembly for a file +src\Client\Hook\Manager.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Manager.cpp.s +.PHONY : src\Client\Hook\Manager.cpp.s + +src\Client\Module\Manager.obj: src\Client\Module\Manager.cpp.obj +.PHONY : src\Client\Module\Manager.obj + +# target to build an object file +src\Client\Module\Manager.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Manager.cpp.obj +.PHONY : src\Client\Module\Manager.cpp.obj + +src\Client\Module\Manager.i: src\Client\Module\Manager.cpp.i +.PHONY : src\Client\Module\Manager.i + +# target to preprocess a source file +src\Client\Module\Manager.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Manager.cpp.i +.PHONY : src\Client\Module\Manager.cpp.i + +src\Client\Module\Manager.s: src\Client\Module\Manager.cpp.s +.PHONY : src\Client\Module\Manager.s + +# target to generate assembly for a file +src\Client\Module\Manager.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Manager.cpp.s +.PHONY : src\Client\Module\Manager.cpp.s + +src\Client\Module\Modules\Hitbox\HitboxListener.obj: src\Client\Module\Modules\Hitbox\HitboxListener.cpp.obj +.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.obj + +# target to build an object file +src\Client\Module\Modules\Hitbox\HitboxListener.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Hitbox\HitboxListener.cpp.obj +.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.cpp.obj + +src\Client\Module\Modules\Hitbox\HitboxListener.i: src\Client\Module\Modules\Hitbox\HitboxListener.cpp.i +.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.i + +# target to preprocess a source file +src\Client\Module\Modules\Hitbox\HitboxListener.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Hitbox\HitboxListener.cpp.i +.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.cpp.i + +src\Client\Module\Modules\Hitbox\HitboxListener.s: src\Client\Module\Modules\Hitbox\HitboxListener.cpp.s +.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.s + +# target to generate assembly for a file +src\Client\Module\Modules\Hitbox\HitboxListener.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Hitbox\HitboxListener.cpp.s +.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.cpp.s + +src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.obj: src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.obj +.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.obj + +# target to build an object file +src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.obj +.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.obj + +src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.i: src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.i +.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.i + +# target to preprocess a source file +src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.i +.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.i + +src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.s: src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.s +.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.s + +# target to generate assembly for a file +src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.s +.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.s + +src\Client\Module\Modules\Module.obj: src\Client\Module\Modules\Module.cpp.obj +.PHONY : src\Client\Module\Modules\Module.obj + +# target to build an object file +src\Client\Module\Modules\Module.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Module.cpp.obj +.PHONY : src\Client\Module\Modules\Module.cpp.obj + +src\Client\Module\Modules\Module.i: src\Client\Module\Modules\Module.cpp.i +.PHONY : src\Client\Module\Modules\Module.i + +# target to preprocess a source file +src\Client\Module\Modules\Module.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Module.cpp.i +.PHONY : src\Client\Module\Modules\Module.cpp.i + +src\Client\Module\Modules\Module.s: src\Client\Module\Modules\Module.cpp.s +.PHONY : src\Client\Module\Modules\Module.s + +# target to generate assembly for a file +src\Client\Module\Modules\Module.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Module.cpp.s +.PHONY : src\Client\Module\Modules\Module.cpp.s + +src\SDK\Client\Actor\Actor.obj: src\SDK\Client\Actor\Actor.cpp.obj +.PHONY : src\SDK\Client\Actor\Actor.obj + +# target to build an object file +src\SDK\Client\Actor\Actor.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\Actor.cpp.obj +.PHONY : src\SDK\Client\Actor\Actor.cpp.obj + +src\SDK\Client\Actor\Actor.i: src\SDK\Client\Actor\Actor.cpp.i +.PHONY : src\SDK\Client\Actor\Actor.i + +# target to preprocess a source file +src\SDK\Client\Actor\Actor.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\Actor.cpp.i +.PHONY : src\SDK\Client\Actor\Actor.cpp.i + +src\SDK\Client\Actor\Actor.s: src\SDK\Client\Actor\Actor.cpp.s +.PHONY : src\SDK\Client\Actor\Actor.s + +# target to generate assembly for a file +src\SDK\Client\Actor\Actor.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\Actor.cpp.s +.PHONY : src\SDK\Client\Actor\Actor.cpp.s + +src\SDK\Client\Actor\ItemActor.obj: src\SDK\Client\Actor\ItemActor.cpp.obj +.PHONY : src\SDK\Client\Actor\ItemActor.obj + +# target to build an object file +src\SDK\Client\Actor\ItemActor.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\ItemActor.cpp.obj +.PHONY : src\SDK\Client\Actor\ItemActor.cpp.obj + +src\SDK\Client\Actor\ItemActor.i: src\SDK\Client\Actor\ItemActor.cpp.i +.PHONY : src\SDK\Client\Actor\ItemActor.i + +# target to preprocess a source file +src\SDK\Client\Actor\ItemActor.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\ItemActor.cpp.i +.PHONY : src\SDK\Client\Actor\ItemActor.cpp.i + +src\SDK\Client\Actor\ItemActor.s: src\SDK\Client\Actor\ItemActor.cpp.s +.PHONY : src\SDK\Client\Actor\ItemActor.s + +# target to generate assembly for a file +src\SDK\Client\Actor\ItemActor.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\ItemActor.cpp.s +.PHONY : src\SDK\Client\Actor\ItemActor.cpp.s + +src\SDK\Client\Block\BlockSource.obj: src\SDK\Client\Block\BlockSource.cpp.obj +.PHONY : src\SDK\Client\Block\BlockSource.obj + +# target to build an object file +src\SDK\Client\Block\BlockSource.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Block\BlockSource.cpp.obj +.PHONY : src\SDK\Client\Block\BlockSource.cpp.obj + +src\SDK\Client\Block\BlockSource.i: src\SDK\Client\Block\BlockSource.cpp.i +.PHONY : src\SDK\Client\Block\BlockSource.i + +# target to preprocess a source file +src\SDK\Client\Block\BlockSource.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Block\BlockSource.cpp.i +.PHONY : src\SDK\Client\Block\BlockSource.cpp.i + +src\SDK\Client\Block\BlockSource.s: src\SDK\Client\Block\BlockSource.cpp.s +.PHONY : src\SDK\Client\Block\BlockSource.s + +# target to generate assembly for a file +src\SDK\Client\Block\BlockSource.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Block\BlockSource.cpp.s +.PHONY : src\SDK\Client\Block\BlockSource.cpp.s + +src\SDK\Client\Container\Inventory.obj: src\SDK\Client\Container\Inventory.cpp.obj +.PHONY : src\SDK\Client\Container\Inventory.obj + +# target to build an object file +src\SDK\Client\Container\Inventory.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Container\Inventory.cpp.obj +.PHONY : src\SDK\Client\Container\Inventory.cpp.obj + +src\SDK\Client\Container\Inventory.i: src\SDK\Client\Container\Inventory.cpp.i +.PHONY : src\SDK\Client\Container\Inventory.i + +# target to preprocess a source file +src\SDK\Client\Container\Inventory.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Container\Inventory.cpp.i +.PHONY : src\SDK\Client\Container\Inventory.cpp.i + +src\SDK\Client\Container\Inventory.s: src\SDK\Client\Container\Inventory.cpp.s +.PHONY : src\SDK\Client\Container\Inventory.s + +# target to generate assembly for a file +src\SDK\Client\Container\Inventory.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Container\Inventory.cpp.s +.PHONY : src\SDK\Client\Container\Inventory.cpp.s + +src\SDK\Client\Core\ClientInstance.obj: src\SDK\Client\Core\ClientInstance.cpp.obj +.PHONY : src\SDK\Client\Core\ClientInstance.obj + +# target to build an object file +src\SDK\Client\Core\ClientInstance.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Core\ClientInstance.cpp.obj +.PHONY : src\SDK\Client\Core\ClientInstance.cpp.obj + +src\SDK\Client\Core\ClientInstance.i: src\SDK\Client\Core\ClientInstance.cpp.i +.PHONY : src\SDK\Client\Core\ClientInstance.i + +# target to preprocess a source file +src\SDK\Client\Core\ClientInstance.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Core\ClientInstance.cpp.i +.PHONY : src\SDK\Client\Core\ClientInstance.cpp.i + +src\SDK\Client\Core\ClientInstance.s: src\SDK\Client\Core\ClientInstance.cpp.s +.PHONY : src\SDK\Client\Core\ClientInstance.s + +# target to generate assembly for a file +src\SDK\Client\Core\ClientInstance.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Core\ClientInstance.cpp.s +.PHONY : src\SDK\Client\Core\ClientInstance.cpp.s + +src\SDK\Client\Item\ItemStack.obj: src\SDK\Client\Item\ItemStack.cpp.obj +.PHONY : src\SDK\Client\Item\ItemStack.obj + +# target to build an object file +src\SDK\Client\Item\ItemStack.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Item\ItemStack.cpp.obj +.PHONY : src\SDK\Client\Item\ItemStack.cpp.obj + +src\SDK\Client\Item\ItemStack.i: src\SDK\Client\Item\ItemStack.cpp.i +.PHONY : src\SDK\Client\Item\ItemStack.i + +# target to preprocess a source file +src\SDK\Client\Item\ItemStack.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Item\ItemStack.cpp.i +.PHONY : src\SDK\Client\Item\ItemStack.cpp.i + +src\SDK\Client\Item\ItemStack.s: src\SDK\Client\Item\ItemStack.cpp.s +.PHONY : src\SDK\Client\Item\ItemStack.s + +# target to generate assembly for a file +src\SDK\Client\Item\ItemStack.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Item\ItemStack.cpp.s +.PHONY : src\SDK\Client\Item\ItemStack.cpp.s + +src\SDK\Client\Level\HitResult.obj: src\SDK\Client\Level\HitResult.cpp.obj +.PHONY : src\SDK\Client\Level\HitResult.obj + +# target to build an object file +src\SDK\Client\Level\HitResult.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Level\HitResult.cpp.obj +.PHONY : src\SDK\Client\Level\HitResult.cpp.obj + +src\SDK\Client\Level\HitResult.i: src\SDK\Client\Level\HitResult.cpp.i +.PHONY : src\SDK\Client\Level\HitResult.i + +# target to preprocess a source file +src\SDK\Client\Level\HitResult.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Level\HitResult.cpp.i +.PHONY : src\SDK\Client\Level\HitResult.cpp.i + +src\SDK\Client\Level\HitResult.s: src\SDK\Client\Level\HitResult.cpp.s +.PHONY : src\SDK\Client\Level\HitResult.s + +# target to generate assembly for a file +src\SDK\Client\Level\HitResult.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Level\HitResult.cpp.s +.PHONY : src\SDK\Client\Level\HitResult.cpp.s + +src\SDK\Client\Network\Packet\Packet.obj: src\SDK\Client\Network\Packet\Packet.cpp.obj +.PHONY : src\SDK\Client\Network\Packet\Packet.obj + +# target to build an object file +src\SDK\Client\Network\Packet\Packet.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Network\Packet\Packet.cpp.obj +.PHONY : src\SDK\Client\Network\Packet\Packet.cpp.obj + +src\SDK\Client\Network\Packet\Packet.i: src\SDK\Client\Network\Packet\Packet.cpp.i +.PHONY : src\SDK\Client\Network\Packet\Packet.i + +# target to preprocess a source file +src\SDK\Client\Network\Packet\Packet.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Network\Packet\Packet.cpp.i +.PHONY : src\SDK\Client\Network\Packet\Packet.cpp.i + +src\SDK\Client\Network\Packet\Packet.s: src\SDK\Client\Network\Packet\Packet.cpp.s +.PHONY : src\SDK\Client\Network\Packet\Packet.s + +# target to generate assembly for a file +src\SDK\Client\Network\Packet\Packet.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Network\Packet\Packet.cpp.s +.PHONY : src\SDK\Client\Network\Packet\Packet.cpp.s + +src\SDK\Client\Render\BaseActorRenderContext.obj: src\SDK\Client\Render\BaseActorRenderContext.cpp.obj +.PHONY : src\SDK\Client\Render\BaseActorRenderContext.obj + +# target to build an object file +src\SDK\Client\Render\BaseActorRenderContext.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\BaseActorRenderContext.cpp.obj +.PHONY : src\SDK\Client\Render\BaseActorRenderContext.cpp.obj + +src\SDK\Client\Render\BaseActorRenderContext.i: src\SDK\Client\Render\BaseActorRenderContext.cpp.i +.PHONY : src\SDK\Client\Render\BaseActorRenderContext.i + +# target to preprocess a source file +src\SDK\Client\Render\BaseActorRenderContext.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\BaseActorRenderContext.cpp.i +.PHONY : src\SDK\Client\Render\BaseActorRenderContext.cpp.i + +src\SDK\Client\Render\BaseActorRenderContext.s: src\SDK\Client\Render\BaseActorRenderContext.cpp.s +.PHONY : src\SDK\Client\Render\BaseActorRenderContext.s + +# target to generate assembly for a file +src\SDK\Client\Render\BaseActorRenderContext.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\BaseActorRenderContext.cpp.s +.PHONY : src\SDK\Client\Render\BaseActorRenderContext.cpp.s + +src\SDK\Client\Render\GuiData.obj: src\SDK\Client\Render\GuiData.cpp.obj +.PHONY : src\SDK\Client\Render\GuiData.obj + +# target to build an object file +src\SDK\Client\Render\GuiData.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\GuiData.cpp.obj +.PHONY : src\SDK\Client\Render\GuiData.cpp.obj + +src\SDK\Client\Render\GuiData.i: src\SDK\Client\Render\GuiData.cpp.i +.PHONY : src\SDK\Client\Render\GuiData.i + +# target to preprocess a source file +src\SDK\Client\Render\GuiData.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\GuiData.cpp.i +.PHONY : src\SDK\Client\Render\GuiData.cpp.i + +src\SDK\Client\Render\GuiData.s: src\SDK\Client\Render\GuiData.cpp.s +.PHONY : src\SDK\Client\Render\GuiData.s + +# target to generate assembly for a file +src\SDK\Client\Render\GuiData.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\GuiData.cpp.s +.PHONY : src\SDK\Client\Render\GuiData.cpp.s + +src\SDK\Client\Render\ItemRenderer.obj: src\SDK\Client\Render\ItemRenderer.cpp.obj +.PHONY : src\SDK\Client\Render\ItemRenderer.obj + +# target to build an object file +src\SDK\Client\Render\ItemRenderer.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\ItemRenderer.cpp.obj +.PHONY : src\SDK\Client\Render\ItemRenderer.cpp.obj + +src\SDK\Client\Render\ItemRenderer.i: src\SDK\Client\Render\ItemRenderer.cpp.i +.PHONY : src\SDK\Client\Render\ItemRenderer.i + +# target to preprocess a source file +src\SDK\Client\Render\ItemRenderer.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\ItemRenderer.cpp.i +.PHONY : src\SDK\Client\Render\ItemRenderer.cpp.i + +src\SDK\Client\Render\ItemRenderer.s: src\SDK\Client\Render\ItemRenderer.cpp.s +.PHONY : src\SDK\Client\Render\ItemRenderer.s + +# target to generate assembly for a file +src\SDK\Client\Render\ItemRenderer.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\ItemRenderer.cpp.s +.PHONY : src\SDK\Client\Render\ItemRenderer.cpp.s + +src\SDK\Client\Render\Matrix.obj: src\SDK\Client\Render\Matrix.cpp.obj +.PHONY : src\SDK\Client\Render\Matrix.obj + +# target to build an object file +src\SDK\Client\Render\Matrix.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Matrix.cpp.obj +.PHONY : src\SDK\Client\Render\Matrix.cpp.obj + +src\SDK\Client\Render\Matrix.i: src\SDK\Client\Render\Matrix.cpp.i +.PHONY : src\SDK\Client\Render\Matrix.i + +# target to preprocess a source file +src\SDK\Client\Render\Matrix.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Matrix.cpp.i +.PHONY : src\SDK\Client\Render\Matrix.cpp.i + +src\SDK\Client\Render\Matrix.s: src\SDK\Client\Render\Matrix.cpp.s +.PHONY : src\SDK\Client\Render\Matrix.s + +# target to generate assembly for a file +src\SDK\Client\Render\Matrix.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Matrix.cpp.s +.PHONY : src\SDK\Client\Render\Matrix.cpp.s + +src\SDK\Client\Render\Tessellator\MeshHelpers.obj: src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.obj +.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.obj + +# target to build an object file +src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.obj +.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.obj + +src\SDK\Client\Render\Tessellator\MeshHelpers.i: src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.i +.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.i + +# target to preprocess a source file +src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.i +.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.i + +src\SDK\Client\Render\Tessellator\MeshHelpers.s: src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.s +.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.s + +# target to generate assembly for a file +src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.s +.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.s + +src\SDK\Client\Render\Tessellator\RenderMaterialGroup.obj: src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.obj +.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.obj + +# target to build an object file +src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.obj +.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.obj + +src\SDK\Client\Render\Tessellator\RenderMaterialGroup.i: src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.i +.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.i + +# target to preprocess a source file +src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.i +.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.i + +src\SDK\Client\Render\Tessellator\RenderMaterialGroup.s: src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.s +.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.s + +# target to generate assembly for a file +src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.s +.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.s + +src\SDK\SDK.obj: src\SDK\SDK.cpp.obj +.PHONY : src\SDK\SDK.obj + +# target to build an object file +src\SDK\SDK.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\SDK.cpp.obj +.PHONY : src\SDK\SDK.cpp.obj + +src\SDK\SDK.i: src\SDK\SDK.cpp.i +.PHONY : src\SDK\SDK.i + +# target to preprocess a source file +src\SDK\SDK.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\SDK.cpp.i +.PHONY : src\SDK\SDK.cpp.i + +src\SDK\SDK.s: src\SDK\SDK.cpp.s +.PHONY : src\SDK\SDK.s + +# target to generate assembly for a file +src\SDK\SDK.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\SDK.cpp.s +.PHONY : src\SDK\SDK.cpp.s + +src\Utils\Logger\Logger.obj: src\Utils\Logger\Logger.cpp.obj +.PHONY : src\Utils\Logger\Logger.obj + +# target to build an object file +src\Utils\Logger\Logger.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\Logger.cpp.obj +.PHONY : src\Utils\Logger\Logger.cpp.obj + +src\Utils\Logger\Logger.i: src\Utils\Logger\Logger.cpp.i +.PHONY : src\Utils\Logger\Logger.i + +# target to preprocess a source file +src\Utils\Logger\Logger.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\Logger.cpp.i +.PHONY : src\Utils\Logger\Logger.cpp.i + +src\Utils\Logger\Logger.s: src\Utils\Logger\Logger.cpp.s +.PHONY : src\Utils\Logger\Logger.s + +# target to generate assembly for a file +src\Utils\Logger\Logger.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\Logger.cpp.s +.PHONY : src\Utils\Logger\Logger.cpp.s + +src\Utils\Logger\crashlogs.obj: src\Utils\Logger\crashlogs.cpp.obj +.PHONY : src\Utils\Logger\crashlogs.obj + +# target to build an object file +src\Utils\Logger\crashlogs.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\crashlogs.cpp.obj +.PHONY : src\Utils\Logger\crashlogs.cpp.obj + +src\Utils\Logger\crashlogs.i: src\Utils\Logger\crashlogs.cpp.i +.PHONY : src\Utils\Logger\crashlogs.i + +# target to preprocess a source file +src\Utils\Logger\crashlogs.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\crashlogs.cpp.i +.PHONY : src\Utils\Logger\crashlogs.cpp.i + +src\Utils\Logger\crashlogs.s: src\Utils\Logger\crashlogs.cpp.s +.PHONY : src\Utils\Logger\crashlogs.s + +# target to generate assembly for a file +src\Utils\Logger\crashlogs.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\crashlogs.cpp.s +.PHONY : src\Utils\Logger\crashlogs.cpp.s + +src\Utils\Memory\CustomAllocator\Buffer.obj: src\Utils\Memory\CustomAllocator\Buffer.cpp.obj +.PHONY : src\Utils\Memory\CustomAllocator\Buffer.obj + +# target to build an object file +src\Utils\Memory\CustomAllocator\Buffer.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\CustomAllocator\Buffer.cpp.obj +.PHONY : src\Utils\Memory\CustomAllocator\Buffer.cpp.obj + +src\Utils\Memory\CustomAllocator\Buffer.i: src\Utils\Memory\CustomAllocator\Buffer.cpp.i +.PHONY : src\Utils\Memory\CustomAllocator\Buffer.i + +# target to preprocess a source file +src\Utils\Memory\CustomAllocator\Buffer.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\CustomAllocator\Buffer.cpp.i +.PHONY : src\Utils\Memory\CustomAllocator\Buffer.cpp.i + +src\Utils\Memory\CustomAllocator\Buffer.s: src\Utils\Memory\CustomAllocator\Buffer.cpp.s +.PHONY : src\Utils\Memory\CustomAllocator\Buffer.s + +# target to generate assembly for a file +src\Utils\Memory\CustomAllocator\Buffer.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\CustomAllocator\Buffer.cpp.s +.PHONY : src\Utils\Memory\CustomAllocator\Buffer.cpp.s + +src\Utils\Memory\Game\Offset\OffsetInit.obj: src\Utils\Memory\Game\Offset\OffsetInit.cpp.obj +.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.obj + +# target to build an object file +src\Utils\Memory\Game\Offset\OffsetInit.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Offset\OffsetInit.cpp.obj +.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.cpp.obj + +src\Utils\Memory\Game\Offset\OffsetInit.i: src\Utils\Memory\Game\Offset\OffsetInit.cpp.i +.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.i + +# target to preprocess a source file +src\Utils\Memory\Game\Offset\OffsetInit.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Offset\OffsetInit.cpp.i +.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.cpp.i + +src\Utils\Memory\Game\Offset\OffsetInit.s: src\Utils\Memory\Game\Offset\OffsetInit.cpp.s +.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.s + +# target to generate assembly for a file +src\Utils\Memory\Game\Offset\OffsetInit.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Offset\OffsetInit.cpp.s +.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.cpp.s + +src\Utils\Memory\Game\Sig\SigInit.obj: src\Utils\Memory\Game\Sig\SigInit.cpp.obj +.PHONY : src\Utils\Memory\Game\Sig\SigInit.obj + +# target to build an object file +src\Utils\Memory\Game\Sig\SigInit.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Sig\SigInit.cpp.obj +.PHONY : src\Utils\Memory\Game\Sig\SigInit.cpp.obj + +src\Utils\Memory\Game\Sig\SigInit.i: src\Utils\Memory\Game\Sig\SigInit.cpp.i +.PHONY : src\Utils\Memory\Game\Sig\SigInit.i + +# target to preprocess a source file +src\Utils\Memory\Game\Sig\SigInit.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Sig\SigInit.cpp.i +.PHONY : src\Utils\Memory\Game\Sig\SigInit.cpp.i + +src\Utils\Memory\Game\Sig\SigInit.s: src\Utils\Memory\Game\Sig\SigInit.cpp.s +.PHONY : src\Utils\Memory\Game\Sig\SigInit.s + +# target to generate assembly for a file +src\Utils\Memory\Game\Sig\SigInit.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Sig\SigInit.cpp.s +.PHONY : src\Utils\Memory\Game\Sig\SigInit.cpp.s + +src\Utils\Memory\Game\SignatureAndOffsetManager.obj: src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.obj +.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.obj + +# target to build an object file +src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.obj +.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.obj + +src\Utils\Memory\Game\SignatureAndOffsetManager.i: src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.i +.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.i + +# target to preprocess a source file +src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.i +.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.i + +src\Utils\Memory\Game\SignatureAndOffsetManager.s: src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.s +.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.s + +# target to generate assembly for a file +src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.s +.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.s + +src\Utils\Render\DrawUtils.obj: src\Utils\Render\DrawUtils.cpp.obj +.PHONY : src\Utils\Render\DrawUtils.obj + +# target to build an object file +src\Utils\Render\DrawUtils.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\DrawUtils.cpp.obj +.PHONY : src\Utils\Render\DrawUtils.cpp.obj + +src\Utils\Render\DrawUtils.i: src\Utils\Render\DrawUtils.cpp.i +.PHONY : src\Utils\Render\DrawUtils.i + +# target to preprocess a source file +src\Utils\Render\DrawUtils.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\DrawUtils.cpp.i +.PHONY : src\Utils\Render\DrawUtils.cpp.i + +src\Utils\Render\DrawUtils.s: src\Utils\Render\DrawUtils.cpp.s +.PHONY : src\Utils\Render\DrawUtils.s + +# target to generate assembly for a file +src\Utils\Render\DrawUtils.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\DrawUtils.cpp.s +.PHONY : src\Utils\Render\DrawUtils.cpp.s + +src\Utils\Render\MaterialUtils.obj: src\Utils\Render\MaterialUtils.cpp.obj +.PHONY : src\Utils\Render\MaterialUtils.obj + +# target to build an object file +src\Utils\Render\MaterialUtils.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\MaterialUtils.cpp.obj +.PHONY : src\Utils\Render\MaterialUtils.cpp.obj + +src\Utils\Render\MaterialUtils.i: src\Utils\Render\MaterialUtils.cpp.i +.PHONY : src\Utils\Render\MaterialUtils.i + +# target to preprocess a source file +src\Utils\Render\MaterialUtils.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\MaterialUtils.cpp.i +.PHONY : src\Utils\Render\MaterialUtils.cpp.i + +src\Utils\Render\MaterialUtils.s: src\Utils\Render\MaterialUtils.cpp.s +.PHONY : src\Utils\Render\MaterialUtils.s + +# target to generate assembly for a file +src\Utils\Render\MaterialUtils.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\MaterialUtils.cpp.s +.PHONY : src\Utils\Render\MaterialUtils.cpp.s + +src\Utils\Render\PositionUtils.obj: src\Utils\Render\PositionUtils.cpp.obj +.PHONY : src\Utils\Render\PositionUtils.obj + +# target to build an object file +src\Utils\Render\PositionUtils.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\PositionUtils.cpp.obj +.PHONY : src\Utils\Render\PositionUtils.cpp.obj + +src\Utils\Render\PositionUtils.i: src\Utils\Render\PositionUtils.cpp.i +.PHONY : src\Utils\Render\PositionUtils.i + +# target to preprocess a source file +src\Utils\Render\PositionUtils.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\PositionUtils.cpp.i +.PHONY : src\Utils\Render\PositionUtils.cpp.i + +src\Utils\Render\PositionUtils.s: src\Utils\Render\PositionUtils.cpp.s +.PHONY : src\Utils\Render\PositionUtils.s + +# target to generate assembly for a file +src\Utils\Render\PositionUtils.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\PositionUtils.cpp.s +.PHONY : src\Utils\Render\PositionUtils.cpp.s + +src\Utils\Utils.obj: src\Utils\Utils.cpp.obj +.PHONY : src\Utils\Utils.obj + +# target to build an object file +src\Utils\Utils.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Utils.cpp.obj +.PHONY : src\Utils\Utils.cpp.obj + +src\Utils\Utils.i: src\Utils\Utils.cpp.i +.PHONY : src\Utils\Utils.i + +# target to preprocess a source file +src\Utils\Utils.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Utils.cpp.i +.PHONY : src\Utils\Utils.cpp.i + +src\Utils\Utils.s: src\Utils\Utils.cpp.s +.PHONY : src\Utils\Utils.s + +# target to generate assembly for a file +src\Utils\Utils.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Utils.cpp.s +.PHONY : src\Utils\Utils.cpp.s + +src\Utils\Versions\VersionUtils.obj: src\Utils\Versions\VersionUtils.cpp.obj +.PHONY : src\Utils\Versions\VersionUtils.obj + +# target to build an object file +src\Utils\Versions\VersionUtils.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\VersionUtils.cpp.obj +.PHONY : src\Utils\Versions\VersionUtils.cpp.obj + +src\Utils\Versions\VersionUtils.i: src\Utils\Versions\VersionUtils.cpp.i +.PHONY : src\Utils\Versions\VersionUtils.i + +# target to preprocess a source file +src\Utils\Versions\VersionUtils.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\VersionUtils.cpp.i +.PHONY : src\Utils\Versions\VersionUtils.cpp.i + +src\Utils\Versions\VersionUtils.s: src\Utils\Versions\VersionUtils.cpp.s +.PHONY : src\Utils\Versions\VersionUtils.s + +# target to generate assembly for a file +src\Utils\Versions\VersionUtils.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\VersionUtils.cpp.s +.PHONY : src\Utils\Versions\VersionUtils.cpp.s + +src\Utils\Versions\WinrtUtils.obj: src\Utils\Versions\WinrtUtils.cpp.obj +.PHONY : src\Utils\Versions\WinrtUtils.obj + +# target to build an object file +src\Utils\Versions\WinrtUtils.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\WinrtUtils.cpp.obj +.PHONY : src\Utils\Versions\WinrtUtils.cpp.obj + +src\Utils\Versions\WinrtUtils.i: src\Utils\Versions\WinrtUtils.cpp.i +.PHONY : src\Utils\Versions\WinrtUtils.i + +# target to preprocess a source file +src\Utils\Versions\WinrtUtils.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\WinrtUtils.cpp.i +.PHONY : src\Utils\Versions\WinrtUtils.cpp.i + +src\Utils\Versions\WinrtUtils.s: src\Utils\Versions\WinrtUtils.cpp.s +.PHONY : src\Utils\Versions\WinrtUtils.s + +# target to generate assembly for a file +src\Utils\Versions\WinrtUtils.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\WinrtUtils.cpp.s +.PHONY : src\Utils\Versions\WinrtUtils.cpp.s + +# Help Target +help: + @echo The following are some of the valid targets for this Makefile: + @echo ... all (the default if no target is provided) + @echo ... clean + @echo ... depend + @echo ... edit_cache + @echo ... install + @echo ... install/local + @echo ... list_install_components + @echo ... rebuild_cache + @echo ... Flarial + @echo ... libhat + @echo ... lib/ImGui/imgui.obj + @echo ... lib/ImGui/imgui.i + @echo ... lib/ImGui/imgui.s + @echo ... lib/ImGui/imgui_demo.obj + @echo ... lib/ImGui/imgui_demo.i + @echo ... lib/ImGui/imgui_demo.s + @echo ... lib/ImGui/imgui_draw.obj + @echo ... lib/ImGui/imgui_draw.i + @echo ... lib/ImGui/imgui_draw.s + @echo ... lib/ImGui/imgui_impl_dx11.obj + @echo ... lib/ImGui/imgui_impl_dx11.i + @echo ... lib/ImGui/imgui_impl_dx11.s + @echo ... lib/ImGui/imgui_impl_dx12.obj + @echo ... lib/ImGui/imgui_impl_dx12.i + @echo ... lib/ImGui/imgui_impl_dx12.s + @echo ... lib/ImGui/imgui_impl_win32.obj + @echo ... lib/ImGui/imgui_impl_win32.i + @echo ... lib/ImGui/imgui_impl_win32.s + @echo ... lib/ImGui/imgui_tables.obj + @echo ... lib/ImGui/imgui_tables.i + @echo ... lib/ImGui/imgui_tables.s + @echo ... lib/ImGui/imgui_widgets.obj + @echo ... lib/ImGui/imgui_widgets.i + @echo ... lib/ImGui/imgui_widgets.s + @echo ... lib/glm/glm.obj + @echo ... lib/glm/glm.i + @echo ... lib/glm/glm.s + @echo ... lib/kiero/kiero.obj + @echo ... lib/kiero/kiero.i + @echo ... lib/kiero/kiero.s + @echo ... main.obj + @echo ... main.i + @echo ... main.s + @echo ... src/Assets/Assets.res + @echo ... src/Client/Client.obj + @echo ... src/Client/Client.i + @echo ... src/Client/Client.s + @echo ... src/Client/Events/EventHandler.obj + @echo ... src/Client/Events/EventHandler.i + @echo ... src/Client/Events/EventHandler.s + @echo ... src/Client/GUI/Engine/Constraints.obj + @echo ... src/Client/GUI/Engine/Constraints.i + @echo ... src/Client/GUI/Engine/Constraints.s + @echo ... src/Client/GUI/Engine/Effects/Blur/blur.obj + @echo ... src/Client/GUI/Engine/Effects/Blur/blur.i + @echo ... src/Client/GUI/Engine/Effects/Blur/blur.s + @echo ... src/Client/GUI/Engine/Effects/Blur/blur_dx12.obj + @echo ... src/Client/GUI/Engine/Effects/Blur/blur_dx12.i + @echo ... src/Client/GUI/Engine/Effects/Blur/blur_dx12.s + @echo ... src/Client/GUI/Engine/Effects/CombinedDeepFry/CombinedDeepFry.obj + @echo ... src/Client/GUI/Engine/Effects/CombinedDeepFry/CombinedDeepFry.i + @echo ... src/Client/GUI/Engine/Effects/CombinedDeepFry/CombinedDeepFry.s + @echo ... src/Client/GUI/Engine/Effects/DeepFry/DeepFry.obj + @echo ... src/Client/GUI/Engine/Effects/DeepFry/DeepFry.i + @echo ... src/Client/GUI/Engine/Effects/DeepFry/DeepFry.s + @echo ... src/Client/GUI/Engine/Effects/GaussianBlur/GaussianBlur.obj + @echo ... src/Client/GUI/Engine/Effects/GaussianBlur/GaussianBlur.i + @echo ... src/Client/GUI/Engine/Effects/GaussianBlur/GaussianBlur.s + @echo ... src/Client/GUI/Engine/Effects/Hue/Hue.obj + @echo ... src/Client/GUI/Engine/Effects/Hue/Hue.i + @echo ... src/Client/GUI/Engine/Effects/Hue/Hue.s + @echo ... src/Client/GUI/Engine/Effects/PaintEffect/PaintEffect.obj + @echo ... src/Client/GUI/Engine/Effects/PaintEffect/PaintEffect.i + @echo ... src/Client/GUI/Engine/Effects/PaintEffect/PaintEffect.s + @echo ... src/Client/GUI/Engine/Elements/Control/Button/Button.obj + @echo ... src/Client/GUI/Engine/Elements/Control/Button/Button.i + @echo ... src/Client/GUI/Engine/Elements/Control/Button/Button.s + @echo ... src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.obj + @echo ... src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.i + @echo ... src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.s + @echo ... src/Client/GUI/Engine/Elements/Control/ColorWheel/ColorWheel.obj + @echo ... src/Client/GUI/Engine/Elements/Control/ColorWheel/ColorWheel.i + @echo ... src/Client/GUI/Engine/Elements/Control/ColorWheel/ColorWheel.s + @echo ... src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.obj + @echo ... src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.i + @echo ... src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.s + @echo ... src/Client/GUI/Engine/Elements/Control/Image/Image.obj + @echo ... src/Client/GUI/Engine/Elements/Control/Image/Image.i + @echo ... src/Client/GUI/Engine/Elements/Control/Image/Image.s + @echo ... src/Client/GUI/Engine/Elements/Control/KeybindSelector/KeybindSelector.obj + @echo ... src/Client/GUI/Engine/Elements/Control/KeybindSelector/KeybindSelector.i + @echo ... src/Client/GUI/Engine/Elements/Control/KeybindSelector/KeybindSelector.s + @echo ... src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.obj + @echo ... src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.i + @echo ... src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.s + @echo ... src/Client/GUI/Engine/Elements/Control/RoundedButton/RoundedButton.obj + @echo ... src/Client/GUI/Engine/Elements/Control/RoundedButton/RoundedButton.i + @echo ... src/Client/GUI/Engine/Elements/Control/RoundedButton/RoundedButton.s + @echo ... src/Client/GUI/Engine/Elements/Control/RoundedRadioButton/RoundedRadioButton.obj + @echo ... src/Client/GUI/Engine/Elements/Control/RoundedRadioButton/RoundedRadioButton.i + @echo ... src/Client/GUI/Engine/Elements/Control/RoundedRadioButton/RoundedRadioButton.s + @echo ... src/Client/GUI/Engine/Elements/Control/ScrollBar/ScrollBar.obj + @echo ... src/Client/GUI/Engine/Elements/Control/ScrollBar/ScrollBar.i + @echo ... src/Client/GUI/Engine/Elements/Control/ScrollBar/ScrollBar.s + @echo ... src/Client/GUI/Engine/Elements/Control/SearchBar/SearchBar.obj + @echo ... src/Client/GUI/Engine/Elements/Control/SearchBar/SearchBar.i + @echo ... src/Client/GUI/Engine/Elements/Control/SearchBar/SearchBar.s + @echo ... src/Client/GUI/Engine/Elements/Control/Slider/Slider.obj + @echo ... src/Client/GUI/Engine/Elements/Control/Slider/Slider.i + @echo ... src/Client/GUI/Engine/Elements/Control/Slider/Slider.s + @echo ... src/Client/GUI/Engine/Elements/Control/TextBox/TextBox.obj + @echo ... src/Client/GUI/Engine/Elements/Control/TextBox/TextBox.i + @echo ... src/Client/GUI/Engine/Elements/Control/TextBox/TextBox.s + @echo ... src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.obj + @echo ... src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.i + @echo ... src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.s + @echo ... src/Client/GUI/Engine/Elements/Control/Tooltip/Tooltip.obj + @echo ... src/Client/GUI/Engine/Elements/Control/Tooltip/Tooltip.i + @echo ... src/Client/GUI/Engine/Elements/Control/Tooltip/Tooltip.s + @echo ... src/Client/GUI/Engine/Elements/Shapes/Circle/Circle.obj + @echo ... src/Client/GUI/Engine/Elements/Shapes/Circle/Circle.i + @echo ... src/Client/GUI/Engine/Elements/Shapes/Circle/Circle.s + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/BlurRect/BlurRect.obj + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/BlurRect/BlurRect.i + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/BlurRect/BlurRect.s + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/InnerShadowRect/InnerShadowRect.obj + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/InnerShadowRect/InnerShadowRect.i + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/InnerShadowRect/InnerShadowRect.s + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedHollowRect/RoundedHollowRect.obj + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedHollowRect/RoundedHollowRect.i + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedHollowRect/RoundedHollowRect.s + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRect/RoundedRect.obj + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRect/RoundedRect.i + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRect/RoundedRect.s + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRectWithImageAndText/RoundedRectWithImageAndText.obj + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRectWithImageAndText/RoundedRectWithImageAndText.i + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRectWithImageAndText/RoundedRectWithImageAndText.s + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/ShadowRect/ShadowRect.obj + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/ShadowRect/ShadowRect.i + @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/ShadowRect/ShadowRect.s + @echo ... src/Client/GUI/Engine/Elements/Utils/ConvertImageToBitmap.obj + @echo ... src/Client/GUI/Engine/Elements/Utils/ConvertImageToBitmap.i + @echo ... src/Client/GUI/Engine/Elements/Utils/ConvertImageToBitmap.s + @echo ... src/Client/GUI/Engine/Elements/Utils/FontManager/FontManager.obj + @echo ... src/Client/GUI/Engine/Elements/Utils/FontManager/FontManager.i + @echo ... src/Client/GUI/Engine/Elements/Utils/FontManager/FontManager.s + @echo ... src/Client/GUI/Engine/Elements/Windows/ColorPickerWindow/ColorPickerWindow.obj + @echo ... src/Client/GUI/Engine/Elements/Windows/ColorPickerWindow/ColorPickerWindow.i + @echo ... src/Client/GUI/Engine/Elements/Windows/ColorPickerWindow/ColorPickerWindow.s + @echo ... src/Client/GUI/Engine/Engine.obj + @echo ... src/Client/GUI/Engine/Engine.i + @echo ... src/Client/GUI/Engine/Engine.s + @echo ... src/Client/Hook/Hooks/Game/ActorBaseTick.obj + @echo ... src/Client/Hook/Hooks/Game/ActorBaseTick.i + @echo ... src/Client/Hook/Hooks/Game/ActorBaseTick.s + @echo ... src/Client/Hook/Hooks/Game/GameModeAttack.obj + @echo ... src/Client/Hook/Hooks/Game/GameModeAttack.i + @echo ... src/Client/Hook/Hooks/Game/GameModeAttack.s + @echo ... src/Client/Hook/Hooks/Game/OnSuspend.obj + @echo ... src/Client/Hook/Hooks/Game/OnSuspend.i + @echo ... src/Client/Hook/Hooks/Game/OnSuspend.s + @echo ... src/Client/Hook/Hooks/Game/PacketHooks.obj + @echo ... src/Client/Hook/Hooks/Game/PacketHooks.i + @echo ... src/Client/Hook/Hooks/Game/PacketHooks.s + @echo ... src/Client/Hook/Hooks/Game/RaknetTick.obj + @echo ... src/Client/Hook/Hooks/Game/RaknetTick.i + @echo ... src/Client/Hook/Hooks/Game/RaknetTick.s + @echo ... src/Client/Hook/Hooks/Game/RenderItemGroup.obj + @echo ... src/Client/Hook/Hooks/Game/RenderItemGroup.i + @echo ... src/Client/Hook/Hooks/Game/RenderItemGroup.s + @echo ... src/Client/Hook/Hooks/Game/getViewPerspective.obj + @echo ... src/Client/Hook/Hooks/Game/getViewPerspective.i + @echo ... src/Client/Hook/Hooks/Game/getViewPerspective.s + @echo ... src/Client/Hook/Hooks/Hook.obj + @echo ... src/Client/Hook/Hooks/Hook.i + @echo ... src/Client/Hook/Hooks/Hook.s + @echo ... src/Client/Hook/Hooks/Input/KeyHook.obj + @echo ... src/Client/Hook/Hooks/Input/KeyHook.i + @echo ... src/Client/Hook/Hooks/Input/KeyHook.s + @echo ... src/Client/Hook/Hooks/Input/MouseHook.obj + @echo ... src/Client/Hook/Hooks/Input/MouseHook.i + @echo ... src/Client/Hook/Hooks/Input/MouseHook.s + @echo ... src/Client/Hook/Hooks/Render/CommandListHook.obj + @echo ... src/Client/Hook/Hooks/Render/CommandListHook.i + @echo ... src/Client/Hook/Hooks/Render/CommandListHook.s + @echo ... src/Client/Hook/Hooks/Render/ResizeHook.obj + @echo ... src/Client/Hook/Hooks/Render/ResizeHook.i + @echo ... src/Client/Hook/Hooks/Render/ResizeHook.s + @echo ... src/Client/Hook/Hooks/Render/SwapchainHook.obj + @echo ... src/Client/Hook/Hooks/Render/SwapchainHook.i + @echo ... src/Client/Hook/Hooks/Render/SwapchainHook.s + @echo ... src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.obj + @echo ... src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.i + @echo ... src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.s + @echo ... src/Client/Hook/Manager.obj + @echo ... src/Client/Hook/Manager.i + @echo ... src/Client/Hook/Manager.s + @echo ... src/Client/Module/Manager.obj + @echo ... src/Client/Module/Manager.i + @echo ... src/Client/Module/Manager.s + @echo ... src/Client/Module/Modules/Hitbox/HitboxListener.obj + @echo ... src/Client/Module/Modules/Hitbox/HitboxListener.i + @echo ... src/Client/Module/Modules/Hitbox/HitboxListener.s + @echo ... src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.obj + @echo ... src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.i + @echo ... src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.s + @echo ... src/Client/Module/Modules/Module.obj + @echo ... src/Client/Module/Modules/Module.i + @echo ... src/Client/Module/Modules/Module.s + @echo ... src/SDK/Client/Actor/Actor.obj + @echo ... src/SDK/Client/Actor/Actor.i + @echo ... src/SDK/Client/Actor/Actor.s + @echo ... src/SDK/Client/Actor/ItemActor.obj + @echo ... src/SDK/Client/Actor/ItemActor.i + @echo ... src/SDK/Client/Actor/ItemActor.s + @echo ... src/SDK/Client/Block/BlockSource.obj + @echo ... src/SDK/Client/Block/BlockSource.i + @echo ... src/SDK/Client/Block/BlockSource.s + @echo ... src/SDK/Client/Container/Inventory.obj + @echo ... src/SDK/Client/Container/Inventory.i + @echo ... src/SDK/Client/Container/Inventory.s + @echo ... src/SDK/Client/Core/ClientInstance.obj + @echo ... src/SDK/Client/Core/ClientInstance.i + @echo ... src/SDK/Client/Core/ClientInstance.s + @echo ... src/SDK/Client/Item/ItemStack.obj + @echo ... src/SDK/Client/Item/ItemStack.i + @echo ... src/SDK/Client/Item/ItemStack.s + @echo ... src/SDK/Client/Level/HitResult.obj + @echo ... src/SDK/Client/Level/HitResult.i + @echo ... src/SDK/Client/Level/HitResult.s + @echo ... src/SDK/Client/Network/Packet/Packet.obj + @echo ... src/SDK/Client/Network/Packet/Packet.i + @echo ... src/SDK/Client/Network/Packet/Packet.s + @echo ... src/SDK/Client/Render/BaseActorRenderContext.obj + @echo ... src/SDK/Client/Render/BaseActorRenderContext.i + @echo ... src/SDK/Client/Render/BaseActorRenderContext.s + @echo ... src/SDK/Client/Render/GuiData.obj + @echo ... src/SDK/Client/Render/GuiData.i + @echo ... src/SDK/Client/Render/GuiData.s + @echo ... src/SDK/Client/Render/ItemRenderer.obj + @echo ... src/SDK/Client/Render/ItemRenderer.i + @echo ... src/SDK/Client/Render/ItemRenderer.s + @echo ... src/SDK/Client/Render/Matrix.obj + @echo ... src/SDK/Client/Render/Matrix.i + @echo ... src/SDK/Client/Render/Matrix.s + @echo ... src/SDK/Client/Render/Tessellator/MeshHelpers.obj + @echo ... src/SDK/Client/Render/Tessellator/MeshHelpers.i + @echo ... src/SDK/Client/Render/Tessellator/MeshHelpers.s + @echo ... src/SDK/Client/Render/Tessellator/RenderMaterialGroup.obj + @echo ... src/SDK/Client/Render/Tessellator/RenderMaterialGroup.i + @echo ... src/SDK/Client/Render/Tessellator/RenderMaterialGroup.s + @echo ... src/SDK/SDK.obj + @echo ... src/SDK/SDK.i + @echo ... src/SDK/SDK.s + @echo ... src/Utils/Logger/Logger.obj + @echo ... src/Utils/Logger/Logger.i + @echo ... src/Utils/Logger/Logger.s + @echo ... src/Utils/Logger/crashlogs.obj + @echo ... src/Utils/Logger/crashlogs.i + @echo ... src/Utils/Logger/crashlogs.s + @echo ... src/Utils/Memory/CustomAllocator/Buffer.obj + @echo ... src/Utils/Memory/CustomAllocator/Buffer.i + @echo ... src/Utils/Memory/CustomAllocator/Buffer.s + @echo ... src/Utils/Memory/Game/Offset/OffsetInit.obj + @echo ... src/Utils/Memory/Game/Offset/OffsetInit.i + @echo ... src/Utils/Memory/Game/Offset/OffsetInit.s + @echo ... src/Utils/Memory/Game/Sig/SigInit.obj + @echo ... src/Utils/Memory/Game/Sig/SigInit.i + @echo ... src/Utils/Memory/Game/Sig/SigInit.s + @echo ... src/Utils/Memory/Game/SignatureAndOffsetManager.obj + @echo ... src/Utils/Memory/Game/SignatureAndOffsetManager.i + @echo ... src/Utils/Memory/Game/SignatureAndOffsetManager.s + @echo ... src/Utils/Render/DrawUtils.obj + @echo ... src/Utils/Render/DrawUtils.i + @echo ... src/Utils/Render/DrawUtils.s + @echo ... src/Utils/Render/MaterialUtils.obj + @echo ... src/Utils/Render/MaterialUtils.i + @echo ... src/Utils/Render/MaterialUtils.s + @echo ... src/Utils/Render/PositionUtils.obj + @echo ... src/Utils/Render/PositionUtils.i + @echo ... src/Utils/Render/PositionUtils.s + @echo ... src/Utils/Utils.obj + @echo ... src/Utils/Utils.i + @echo ... src/Utils/Utils.s + @echo ... src/Utils/Versions/VersionUtils.obj + @echo ... src/Utils/Versions/VersionUtils.i + @echo ... src/Utils/Versions/VersionUtils.s + @echo ... src/Utils/Versions/WinrtUtils.obj + @echo ... src/Utils/Versions/WinrtUtils.i + @echo ... src/Utils/Versions/WinrtUtils.s +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index c6dcc6c1..6d02d67f 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -67,6 +67,7 @@ #include #include "Modules/ItemPhysics/ItemPhysics.hpp" +#include "Modules/Crosshair/Crosshair.hpp" namespace ModuleManager { std::unordered_map moduleMap; @@ -156,6 +157,7 @@ void ModuleManager::initialize() { //addModule(new MovableChat()); //addModule(new CompactChat()); addModule(new ItemPhysics()); + addModule(new Crosshair()); EventHandler::registerListener(new GUIKeyListener("GuiKeyListener")); EventHandler::registerListener(new DiscordRPCListener("DiscordRPC")); diff --git a/src/Client/Module/Modules/Crosshair/Crosshair.hpp b/src/Client/Module/Modules/Crosshair/Crosshair.hpp new file mode 100644 index 00000000..185c3ae0 --- /dev/null +++ b/src/Client/Module/Modules/Crosshair/Crosshair.hpp @@ -0,0 +1,66 @@ +#pragma once + +#include "CrosshairListener.hpp" +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" + +class Crosshair : public Module { +public: + CrosshairListener* listener = nullptr; + + Crosshair() : Module("Crosshair", "Allows you to change crosshair behavior.", IDR_ITEM_PHYSICS_PNG, "") { + Module::setup(); + } + + void onEnable() override { + listener = new CrosshairListener("Crosshair", this); + + EventHandler::registerListener(listener); + + listener->onEnable(); + + Module::onEnable(); + } + + void onDisable() override { + if (listener != nullptr) + listener->onDisable(); + + EventHandler::unregisterListener("Crosshair"); + + delete listener; + + Module::onDisable(); + } + + void defaultConfig() override { + if (settings.getSettingByName("thirdpersoncrosshair") == nullptr) + settings.addSetting("thirdpersoncrosshair", true); + } + + void settingsRender() override { + /* Border Start */ + + float xPos = Constraints::PercentageConstraint(0.019, "left"); + float yPos = Constraints::PercentageConstraint(0.10, "top"); + + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + yPos += Constraints::SpacingConstraint(0.35, textWidth); + + /* Third Person Crosshair Start */ + + FlarialGUI::FlarialTextWithFont(xPos + Constraints::SpacingConstraint(0.60, textWidth), yPos, + L"Third Person Crosshair", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(0, xPos, yPos, this->settings.getSettingByName( + "thirdpersoncrosshair")->value)) + this->settings.getSettingByName("thirdpersoncrosshair")->value = !this->settings.getSettingByName( + "thirdpersoncrosshair")->value; + + /* Third Person Crosshair End */ + } +}; diff --git a/src/Client/Module/Modules/Crosshair/CrosshairListener.hpp b/src/Client/Module/Modules/Crosshair/CrosshairListener.hpp new file mode 100644 index 00000000..582bca7a --- /dev/null +++ b/src/Client/Module/Modules/Crosshair/CrosshairListener.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include "../../../Events/Listener.hpp" + +class Crosshair; + +class CrosshairListener : public Listener { + Crosshair* mod; + bool drawThirdPersonCrosshair; + +public: + void onEnable() { + }; + void onDisable() { + + }; + + explicit CrosshairListener(const std::string& name, Crosshair* mod) { + this->name = name; + this->mod = mod; + } + + void onGetViewPerspective(PerspectiveEvent &event) override { + //ThirdPersonBack = 1 + //ThirdPersonFront = 2 + } + + + ~CrosshairListener() { + onDisable(); + } +}; diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp index dbaba0a8..1b8fe320 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp @@ -7,6 +7,13 @@ #include "../../../../SDK/Client/Actor/ItemActor.hpp" #include "../../../../Utils/Memory/CustomAllocator/Buffer.hpp" +static char data[0x5], data2[0x5]; + +float lerp(float a, float b, float t) { + return a + t * (b - a); +} + + class INeedADecentHookClassForMemory { public: void* pointer = nullptr; @@ -15,12 +22,11 @@ class INeedADecentHookClassForMemory { INeedADecentHookClassForMemory(void* function, void* hook) { pointer = function; - - if (IsBadReadPtr(pointer, sizeof(pointer))) - return; - - if (const auto status = MH_CreateHook(pointer, hook, &trampoline); status == MH_OK) - valid = true; + if (!IsBadReadPtr(pointer, sizeof(pointer))) { + if (MH_CreateHook(pointer, hook, &trampoline) == MH_OK) { + valid = true; + } + } } ~INeedADecentHookClassForMemory() { @@ -28,13 +34,11 @@ class INeedADecentHookClassForMemory { } void enable() const { - if (valid) - MH_EnableHook(pointer); + if (valid) MH_EnableHook(pointer); } void disable() const { - if (valid) - MH_DisableHook(pointer); + if (valid) MH_DisableHook(pointer); } }; @@ -45,9 +49,7 @@ void ItemPhysicsListener::ItemRenderer_render(ItemRenderer* _this, BaseActorRend static auto oFunc = reinterpret_cast(ItemRenderer_renderHook->trampoline); static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); - const auto listener = mod->listener; - - listener->renderData = renderData; + mod->listener->renderData = renderData; oFunc(_this, renderCtx, renderData); } @@ -58,45 +60,32 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo static auto glm_rotate = reinterpret_cast(rotateSig); static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); - const auto listener = mod->listener; - const auto renderData = listener->renderData; - - if (renderData == nullptr) - return; + const auto renderData = mod->listener->renderData; + if (renderData == nullptr) return; auto curr = reinterpret_cast(renderData->actor); - static float height = 0.5f; - if (!listener->actorData.contains(curr)) { + if (!mod->listener->actorData.contains(curr)) { std::random_device rd; std::mt19937 gen(rd()); - - std::uniform_int_distribution dist(0, 1); - std::uniform_int_distribution dist2(0, 359); + std::uniform_int_distribution dist(0, 1), dist2(0, 359); const auto vec = Vec3(dist2(gen), dist2(gen), dist2(gen)); const auto sign = Vec3(dist(gen) * 2 - 1, dist(gen) * 2 - 1, dist(gen) * 2 - 1); - - auto def = std::tuple{curr->isOnGround() ? 0.f : height, vec, sign}; - listener->actorData.emplace(curr, def); + mod->listener->actorData.emplace(curr, std::tuple{ curr->isOnGround() ? 0.f : height, vec, sign }); } - const float deltaTime = 1.f / static_cast(MC::fps); - - float& yMod = std::get<0>(listener->actorData.at(curr)); + auto& [yMod, vec, sign] = mod->listener->actorData.at(curr); + yMod -= height * (1.f / MC::fps); - yMod -= height * deltaTime; - - if (yMod <= 0.f) + if (yMod <= 0.f && curr->isOnGround()) { yMod = 0.f; + } Vec3 pos = renderData->position; pos.y += yMod; - auto& vec = std::get<1>(listener->actorData.at(curr)); - auto& sign = std::get<2>(listener->actorData.at(curr)); - auto& settings = mod->settings; const auto speed = settings.getSettingByName("speed")->value; const auto xMul = settings.getSettingByName("xmul")->value; @@ -104,91 +93,43 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo const auto zMul = settings.getSettingByName("zmul")->value; if (!curr->isOnGround() || yMod > 0.f) { - vec.x += static_cast(sign.x) * deltaTime * speed * xMul; - vec.y += static_cast(sign.y) * deltaTime * speed * yMul; - vec.z += static_cast(sign.z) * deltaTime * speed * zMul; - - if (vec.x > 360.f) - vec.x -= 360.f; - - if (vec.x < 0.f) - vec.x += 360.f; - - if (vec.y > 360.f) - vec.y -= 360.f; - - if (vec.y < 0.f) - vec.y += 360.f; - - if (vec.z > 360.f) - vec.z -= 360.f; - - if (vec.z < 0.f) - vec.z += 360.f; + vec.x = std::fmod(vec.x + sign.x * (1.f / MC::fps) * speed * xMul, 360.f); + vec.y = std::fmod(vec.y + sign.y * (1.f / MC::fps) * speed * yMul, 360.f); + vec.z = std::fmod(vec.z + sign.z * (1.f / MC::fps) * speed * zMul, 360.f); } - Vec3 renderVec = vec; - - const auto smoothRotations = settings.getSettingByName("smoothrots")->value; - const auto preserveRotations = settings.getSettingByName("preserverots")->value; + const Vec3 targetVec = (yMod < 0.1) ? Vec3(90.f, vec.y, vec.z) : vec; - if (curr->isOnGround() && yMod == 0.f && !preserveRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { - if (smoothRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { - vec.x += static_cast(sign.x) * deltaTime * speed * xMul; + if (curr->isOnGround()) { + if (curr->getStack().block == nullptr) { + const Vec3 targetVec = (yMod < 0.1) ? Vec3(90.f, vec.y - 0.12, vec.z) : vec; + } + } - if (curr->getStack().block != nullptr) { - vec.z += static_cast(sign.z) * deltaTime * speed * zMul; + const Vec3 targetPos = renderData->position; - if (vec.x > 360.f || vec.x < 0.f) { - vec.x = 0.f; - sign.x = 0; - } + const float lerpFactor = 0.1f; - if (vec.z > 360.f || vec.z < 0.f) { - vec.z = 0.f; - sign.z = 0; - } - } - else { - vec.y += static_cast(sign.y) * deltaTime * speed * yMul; - - if (vec.x - 90.f > 360.f || vec.x - 90.f < 0.f) { - vec.x = 90.f; - sign.x = 0; - } - - if (vec.y > 360.f || vec.y < 0.f) { - vec.y = 0.f; - sign.y = 0; - } - } - } - - if (!smoothRotations) { - if (curr->getStack().block != nullptr) { - renderVec.x = 0.f; - renderVec.z = 0.f; - } - else { - renderVec.x = 90.f; - renderVec.y = 0.f; - } - } - } + vec.x = lerp(vec.x, targetVec.x, lerpFactor); + vec.y = lerp(vec.y, targetVec.y, lerpFactor); + vec.z = lerp(vec.z, targetVec.z, lerpFactor); - mat = translate(mat, {pos.x, pos.y, pos.z}); + pos.x = lerp(pos.x, targetPos.x, lerpFactor); + pos.y = lerp(pos.y, targetPos.y, lerpFactor); + pos.z = lerp(pos.z, targetPos.z, lerpFactor); - glm_rotate(mat, renderVec.x, 1.f, 0.f, 0.f); - glm_rotate(mat, renderVec.y, 0.f, 1.f, 0.f); - glm_rotate(mat, renderVec.z, 0.f, 0.f, 1.f); + + mat = translate(mat, { pos.x, pos.y, pos.z }); + glm_rotate(mat, vec.x, 1.f, 0.f, 0.f); + glm_rotate(mat, vec.y, 0.f, 1.f, 0.f); + glm_rotate(mat, vec.z, 0.f, 0.f, 1.f); } void ItemPhysicsListener::onSetupAndRender(SetupAndRenderEvent& event) { - if (!mod->isEnabled()) - return; + static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); + if (!mod->isEnabled()) return; const auto player = SDK::clientInstance->getLocalPlayer(); - static bool playerNull = player == nullptr; if (playerNull != (player == nullptr)) { @@ -201,20 +142,16 @@ void ItemPhysicsListener::onSetupAndRender(SetupAndRenderEvent& event) { } } -static char data[0x5], data2[0x5]; - void ItemPhysicsListener::onEnable() { static auto posAddr = Memory::findSig(GET_SIG("ItemPositionConst")) + 4; origPosRel = *reinterpret_cast(posAddr); patched = true; static auto rotateAddr = reinterpret_cast(Memory::findSig(GET_SIG("glm_rotateRef"))); - if (glm_rotateHook == nullptr) glm_rotateHook = std::make_unique(rotateAddr, glm_rotate); static auto ItemRenderer_renderAddr = reinterpret_cast(Memory::findSig(GET_SIG("ItemRenderer::render"))); - if (ItemRenderer_renderHook == nullptr) ItemRenderer_renderHook = std::make_unique(ItemRenderer_renderAddr, ItemRenderer_render); @@ -222,13 +159,10 @@ void ItemPhysicsListener::onEnable() { *newPosRel = 0.f; const auto newRipRel = Memory::getRipRel(posAddr, reinterpret_cast(newPosRel)); - Memory::patchBytes(reinterpret_cast(posAddr), newRipRel.data(), 4); glm_rotateHook->enable(); - Memory::patchBytes(rotateAddr, (BYTE*)"\xE8", 1); - ItemRenderer_renderHook->enable(); static auto translateAddr = reinterpret_cast(Memory::findSig(GET_SIG("glm_translateRef"))); @@ -245,7 +179,6 @@ void ItemPhysicsListener::onEnable() { void ItemPhysicsListener::onDisable() { if (patched) { static auto posAddr = Memory::findSig(GET_SIG("ItemPositionConst")) + 4; - Memory::patchBytes(reinterpret_cast(posAddr), &origPosRel, 4); FreeBuffer(newPosRel); } From a228189aa98f12819f1f8ef465dbefc025dab94d Mon Sep 17 00:00:00 2001 From: chyves <82107846+notchyves@users.noreply.github.com> Date: Mon, 19 Aug 2024 20:20:00 -0400 Subject: [PATCH 131/240] wtf chyves wtf --- Makefile | 2713 ------------------------------------------------------ 1 file changed, 2713 deletions(-) delete mode 100644 Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index d8d06b8f..00000000 --- a/Makefile +++ /dev/null @@ -1,2713 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "NMake Makefiles" Generator, CMake Version 3.28 - -# Default target executed when no arguments are given to make. -default_target: all -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -SHELL = cmd.exe - -# The CMake executable. -CMAKE_COMMAND = "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" - -# The command to remove a file. -RM = "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = C:\Users\judah\source\repos\flarial-dll - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = C:\Users\judah\source\repos\flarial-dll - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." - echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E echo "No interactive CMake dialog available." -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache\fast: edit_cache -.PHONY : edit_cache\fast - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." - echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache\fast: rebuild_cache -.PHONY : rebuild_cache\fast - -# Special rule for the target list_install_components -list_install_components: - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Unspecified\"" -.PHONY : list_install_components - -# Special rule for the target list_install_components -list_install_components\fast: list_install_components -.PHONY : list_install_components\fast - -# Special rule for the target install -install: preinstall - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." - echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -P cmake_install.cmake -.PHONY : install - -# Special rule for the target install -install\fast: preinstall\fast - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." - echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -P cmake_install.cmake -.PHONY : install\fast - -# Special rule for the target install/local -install\local: preinstall - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." - echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake -.PHONY : install\local - -# Special rule for the target install/local -install\local\fast: preinstall\fast - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." - echo >nul && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake -.PHONY : install\local\fast - -# The main all target -all: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\judah\source\repos\flarial-dll\CMakeFiles C:\Users\judah\source\repos\flarial-dll\\CMakeFiles\progress.marks - $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) all - $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\judah\source\repos\flarial-dll\CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) clean -.PHONY : clean - -# The main clean target -clean\fast: clean -.PHONY : clean\fast - -# Prepare targets for installation. -preinstall: all - $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall\fast: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) preinstall -.PHONY : preinstall\fast - -# clear depends -depend: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 1 -.PHONY : depend - -#============================================================================= -# Target rules for targets named Flarial - -# Build rule for target. -Flarial: cmake_check_build_system - $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) Flarial -.PHONY : Flarial - -# fast build rule for target. -Flarial\fast: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\build -.PHONY : Flarial\fast - -#============================================================================= -# Target rules for targets named libhat - -# Build rule for target. -libhat: cmake_check_build_system - $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 /nologo -$(MAKEFLAGS) libhat -.PHONY : libhat - -# fast build rule for target. -libhat\fast: - $(MAKE) $(MAKESILENT) -f _deps\libhat-build\CMakeFiles\libhat.dir\build.make /nologo -$(MAKEFLAGS) _deps\libhat-build\CMakeFiles\libhat.dir\build -.PHONY : libhat\fast - -lib\ImGui\imgui.obj: lib\ImGui\imgui.cpp.obj -.PHONY : lib\ImGui\imgui.obj - -# target to build an object file -lib\ImGui\imgui.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui.cpp.obj -.PHONY : lib\ImGui\imgui.cpp.obj - -lib\ImGui\imgui.i: lib\ImGui\imgui.cpp.i -.PHONY : lib\ImGui\imgui.i - -# target to preprocess a source file -lib\ImGui\imgui.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui.cpp.i -.PHONY : lib\ImGui\imgui.cpp.i - -lib\ImGui\imgui.s: lib\ImGui\imgui.cpp.s -.PHONY : lib\ImGui\imgui.s - -# target to generate assembly for a file -lib\ImGui\imgui.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui.cpp.s -.PHONY : lib\ImGui\imgui.cpp.s - -lib\ImGui\imgui_demo.obj: lib\ImGui\imgui_demo.cpp.obj -.PHONY : lib\ImGui\imgui_demo.obj - -# target to build an object file -lib\ImGui\imgui_demo.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_demo.cpp.obj -.PHONY : lib\ImGui\imgui_demo.cpp.obj - -lib\ImGui\imgui_demo.i: lib\ImGui\imgui_demo.cpp.i -.PHONY : lib\ImGui\imgui_demo.i - -# target to preprocess a source file -lib\ImGui\imgui_demo.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_demo.cpp.i -.PHONY : lib\ImGui\imgui_demo.cpp.i - -lib\ImGui\imgui_demo.s: lib\ImGui\imgui_demo.cpp.s -.PHONY : lib\ImGui\imgui_demo.s - -# target to generate assembly for a file -lib\ImGui\imgui_demo.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_demo.cpp.s -.PHONY : lib\ImGui\imgui_demo.cpp.s - -lib\ImGui\imgui_draw.obj: lib\ImGui\imgui_draw.cpp.obj -.PHONY : lib\ImGui\imgui_draw.obj - -# target to build an object file -lib\ImGui\imgui_draw.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_draw.cpp.obj -.PHONY : lib\ImGui\imgui_draw.cpp.obj - -lib\ImGui\imgui_draw.i: lib\ImGui\imgui_draw.cpp.i -.PHONY : lib\ImGui\imgui_draw.i - -# target to preprocess a source file -lib\ImGui\imgui_draw.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_draw.cpp.i -.PHONY : lib\ImGui\imgui_draw.cpp.i - -lib\ImGui\imgui_draw.s: lib\ImGui\imgui_draw.cpp.s -.PHONY : lib\ImGui\imgui_draw.s - -# target to generate assembly for a file -lib\ImGui\imgui_draw.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_draw.cpp.s -.PHONY : lib\ImGui\imgui_draw.cpp.s - -lib\ImGui\imgui_impl_dx11.obj: lib\ImGui\imgui_impl_dx11.cpp.obj -.PHONY : lib\ImGui\imgui_impl_dx11.obj - -# target to build an object file -lib\ImGui\imgui_impl_dx11.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx11.cpp.obj -.PHONY : lib\ImGui\imgui_impl_dx11.cpp.obj - -lib\ImGui\imgui_impl_dx11.i: lib\ImGui\imgui_impl_dx11.cpp.i -.PHONY : lib\ImGui\imgui_impl_dx11.i - -# target to preprocess a source file -lib\ImGui\imgui_impl_dx11.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx11.cpp.i -.PHONY : lib\ImGui\imgui_impl_dx11.cpp.i - -lib\ImGui\imgui_impl_dx11.s: lib\ImGui\imgui_impl_dx11.cpp.s -.PHONY : lib\ImGui\imgui_impl_dx11.s - -# target to generate assembly for a file -lib\ImGui\imgui_impl_dx11.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx11.cpp.s -.PHONY : lib\ImGui\imgui_impl_dx11.cpp.s - -lib\ImGui\imgui_impl_dx12.obj: lib\ImGui\imgui_impl_dx12.cpp.obj -.PHONY : lib\ImGui\imgui_impl_dx12.obj - -# target to build an object file -lib\ImGui\imgui_impl_dx12.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx12.cpp.obj -.PHONY : lib\ImGui\imgui_impl_dx12.cpp.obj - -lib\ImGui\imgui_impl_dx12.i: lib\ImGui\imgui_impl_dx12.cpp.i -.PHONY : lib\ImGui\imgui_impl_dx12.i - -# target to preprocess a source file -lib\ImGui\imgui_impl_dx12.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx12.cpp.i -.PHONY : lib\ImGui\imgui_impl_dx12.cpp.i - -lib\ImGui\imgui_impl_dx12.s: lib\ImGui\imgui_impl_dx12.cpp.s -.PHONY : lib\ImGui\imgui_impl_dx12.s - -# target to generate assembly for a file -lib\ImGui\imgui_impl_dx12.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_dx12.cpp.s -.PHONY : lib\ImGui\imgui_impl_dx12.cpp.s - -lib\ImGui\imgui_impl_win32.obj: lib\ImGui\imgui_impl_win32.cpp.obj -.PHONY : lib\ImGui\imgui_impl_win32.obj - -# target to build an object file -lib\ImGui\imgui_impl_win32.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_win32.cpp.obj -.PHONY : lib\ImGui\imgui_impl_win32.cpp.obj - -lib\ImGui\imgui_impl_win32.i: lib\ImGui\imgui_impl_win32.cpp.i -.PHONY : lib\ImGui\imgui_impl_win32.i - -# target to preprocess a source file -lib\ImGui\imgui_impl_win32.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_win32.cpp.i -.PHONY : lib\ImGui\imgui_impl_win32.cpp.i - -lib\ImGui\imgui_impl_win32.s: lib\ImGui\imgui_impl_win32.cpp.s -.PHONY : lib\ImGui\imgui_impl_win32.s - -# target to generate assembly for a file -lib\ImGui\imgui_impl_win32.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_impl_win32.cpp.s -.PHONY : lib\ImGui\imgui_impl_win32.cpp.s - -lib\ImGui\imgui_tables.obj: lib\ImGui\imgui_tables.cpp.obj -.PHONY : lib\ImGui\imgui_tables.obj - -# target to build an object file -lib\ImGui\imgui_tables.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_tables.cpp.obj -.PHONY : lib\ImGui\imgui_tables.cpp.obj - -lib\ImGui\imgui_tables.i: lib\ImGui\imgui_tables.cpp.i -.PHONY : lib\ImGui\imgui_tables.i - -# target to preprocess a source file -lib\ImGui\imgui_tables.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_tables.cpp.i -.PHONY : lib\ImGui\imgui_tables.cpp.i - -lib\ImGui\imgui_tables.s: lib\ImGui\imgui_tables.cpp.s -.PHONY : lib\ImGui\imgui_tables.s - -# target to generate assembly for a file -lib\ImGui\imgui_tables.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_tables.cpp.s -.PHONY : lib\ImGui\imgui_tables.cpp.s - -lib\ImGui\imgui_widgets.obj: lib\ImGui\imgui_widgets.cpp.obj -.PHONY : lib\ImGui\imgui_widgets.obj - -# target to build an object file -lib\ImGui\imgui_widgets.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_widgets.cpp.obj -.PHONY : lib\ImGui\imgui_widgets.cpp.obj - -lib\ImGui\imgui_widgets.i: lib\ImGui\imgui_widgets.cpp.i -.PHONY : lib\ImGui\imgui_widgets.i - -# target to preprocess a source file -lib\ImGui\imgui_widgets.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_widgets.cpp.i -.PHONY : lib\ImGui\imgui_widgets.cpp.i - -lib\ImGui\imgui_widgets.s: lib\ImGui\imgui_widgets.cpp.s -.PHONY : lib\ImGui\imgui_widgets.s - -# target to generate assembly for a file -lib\ImGui\imgui_widgets.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\ImGui\imgui_widgets.cpp.s -.PHONY : lib\ImGui\imgui_widgets.cpp.s - -lib\glm\glm.obj: lib\glm\glm.cpp.obj -.PHONY : lib\glm\glm.obj - -# target to build an object file -lib\glm\glm.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\glm\glm.cpp.obj -.PHONY : lib\glm\glm.cpp.obj - -lib\glm\glm.i: lib\glm\glm.cpp.i -.PHONY : lib\glm\glm.i - -# target to preprocess a source file -lib\glm\glm.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\glm\glm.cpp.i -.PHONY : lib\glm\glm.cpp.i - -lib\glm\glm.s: lib\glm\glm.cpp.s -.PHONY : lib\glm\glm.s - -# target to generate assembly for a file -lib\glm\glm.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\glm\glm.cpp.s -.PHONY : lib\glm\glm.cpp.s - -lib\kiero\kiero.obj: lib\kiero\kiero.cpp.obj -.PHONY : lib\kiero\kiero.obj - -# target to build an object file -lib\kiero\kiero.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\kiero\kiero.cpp.obj -.PHONY : lib\kiero\kiero.cpp.obj - -lib\kiero\kiero.i: lib\kiero\kiero.cpp.i -.PHONY : lib\kiero\kiero.i - -# target to preprocess a source file -lib\kiero\kiero.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\kiero\kiero.cpp.i -.PHONY : lib\kiero\kiero.cpp.i - -lib\kiero\kiero.s: lib\kiero\kiero.cpp.s -.PHONY : lib\kiero\kiero.s - -# target to generate assembly for a file -lib\kiero\kiero.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\lib\kiero\kiero.cpp.s -.PHONY : lib\kiero\kiero.cpp.s - -main.obj: main.cpp.obj -.PHONY : main.obj - -# target to build an object file -main.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\main.cpp.obj -.PHONY : main.cpp.obj - -main.i: main.cpp.i -.PHONY : main.i - -# target to preprocess a source file -main.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\main.cpp.i -.PHONY : main.cpp.i - -main.s: main.cpp.s -.PHONY : main.s - -# target to generate assembly for a file -main.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\main.cpp.s -.PHONY : main.cpp.s - -src\Assets\Assets.res: src\Assets\Assets.rc.res -.PHONY : src\Assets\Assets.res - -# target to build an object file -src\Assets\Assets.rc.res: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Assets\Assets.rc.res -.PHONY : src\Assets\Assets.rc.res - -src\Client\Client.obj: src\Client\Client.cpp.obj -.PHONY : src\Client\Client.obj - -# target to build an object file -src\Client\Client.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Client.cpp.obj -.PHONY : src\Client\Client.cpp.obj - -src\Client\Client.i: src\Client\Client.cpp.i -.PHONY : src\Client\Client.i - -# target to preprocess a source file -src\Client\Client.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Client.cpp.i -.PHONY : src\Client\Client.cpp.i - -src\Client\Client.s: src\Client\Client.cpp.s -.PHONY : src\Client\Client.s - -# target to generate assembly for a file -src\Client\Client.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Client.cpp.s -.PHONY : src\Client\Client.cpp.s - -src\Client\Events\EventHandler.obj: src\Client\Events\EventHandler.cpp.obj -.PHONY : src\Client\Events\EventHandler.obj - -# target to build an object file -src\Client\Events\EventHandler.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Events\EventHandler.cpp.obj -.PHONY : src\Client\Events\EventHandler.cpp.obj - -src\Client\Events\EventHandler.i: src\Client\Events\EventHandler.cpp.i -.PHONY : src\Client\Events\EventHandler.i - -# target to preprocess a source file -src\Client\Events\EventHandler.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Events\EventHandler.cpp.i -.PHONY : src\Client\Events\EventHandler.cpp.i - -src\Client\Events\EventHandler.s: src\Client\Events\EventHandler.cpp.s -.PHONY : src\Client\Events\EventHandler.s - -# target to generate assembly for a file -src\Client\Events\EventHandler.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Events\EventHandler.cpp.s -.PHONY : src\Client\Events\EventHandler.cpp.s - -src\Client\GUI\Engine\Constraints.obj: src\Client\GUI\Engine\Constraints.cpp.obj -.PHONY : src\Client\GUI\Engine\Constraints.obj - -# target to build an object file -src\Client\GUI\Engine\Constraints.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Constraints.cpp.obj -.PHONY : src\Client\GUI\Engine\Constraints.cpp.obj - -src\Client\GUI\Engine\Constraints.i: src\Client\GUI\Engine\Constraints.cpp.i -.PHONY : src\Client\GUI\Engine\Constraints.i - -# target to preprocess a source file -src\Client\GUI\Engine\Constraints.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Constraints.cpp.i -.PHONY : src\Client\GUI\Engine\Constraints.cpp.i - -src\Client\GUI\Engine\Constraints.s: src\Client\GUI\Engine\Constraints.cpp.s -.PHONY : src\Client\GUI\Engine\Constraints.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Constraints.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Constraints.cpp.s -.PHONY : src\Client\GUI\Engine\Constraints.cpp.s - -src\Client\GUI\Engine\Effects\Blur\blur.obj: src\Client\GUI\Engine\Effects\Blur\blur.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.obj - -# target to build an object file -src\Client\GUI\Engine\Effects\Blur\blur.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.cpp.obj - -src\Client\GUI\Engine\Effects\Blur\blur.i: src\Client\GUI\Engine\Effects\Blur\blur.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.i - -# target to preprocess a source file -src\Client\GUI\Engine\Effects\Blur\blur.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.cpp.i - -src\Client\GUI\Engine\Effects\Blur\blur.s: src\Client\GUI\Engine\Effects\Blur\blur.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Effects\Blur\blur.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur.cpp.s - -src\Client\GUI\Engine\Effects\Blur\blur_dx12.obj: src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.obj - -# target to build an object file -src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.obj - -src\Client\GUI\Engine\Effects\Blur\blur_dx12.i: src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.i - -# target to preprocess a source file -src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.i - -src\Client\GUI\Engine\Effects\Blur\blur_dx12.s: src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\Blur\blur_dx12.cpp.s - -src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.obj: src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.obj - -# target to build an object file -src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.obj - -src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.i: src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.i - -# target to preprocess a source file -src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.i - -src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.s: src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\CombinedDeepFry\CombinedDeepFry.cpp.s - -src\Client\GUI\Engine\Effects\DeepFry\DeepFry.obj: src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.obj - -# target to build an object file -src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.obj - -src\Client\GUI\Engine\Effects\DeepFry\DeepFry.i: src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.i - -# target to preprocess a source file -src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.i - -src\Client\GUI\Engine\Effects\DeepFry\DeepFry.s: src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\DeepFry\DeepFry.cpp.s - -src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.obj: src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.obj - -# target to build an object file -src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.obj - -src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.i: src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.i - -# target to preprocess a source file -src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.i - -src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.s: src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\GaussianBlur\GaussianBlur.cpp.s - -src\Client\GUI\Engine\Effects\Hue\Hue.obj: src\Client\GUI\Engine\Effects\Hue\Hue.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.obj - -# target to build an object file -src\Client\GUI\Engine\Effects\Hue\Hue.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Hue\Hue.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.cpp.obj - -src\Client\GUI\Engine\Effects\Hue\Hue.i: src\Client\GUI\Engine\Effects\Hue\Hue.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.i - -# target to preprocess a source file -src\Client\GUI\Engine\Effects\Hue\Hue.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Hue\Hue.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.cpp.i - -src\Client\GUI\Engine\Effects\Hue\Hue.s: src\Client\GUI\Engine\Effects\Hue\Hue.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Effects\Hue\Hue.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\Hue\Hue.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\Hue\Hue.cpp.s - -src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.obj: src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.obj - -# target to build an object file -src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.obj -.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.obj - -src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.i: src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.i - -# target to preprocess a source file -src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.i -.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.i - -src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.s: src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.s -.PHONY : src\Client\GUI\Engine\Effects\PaintEffect\PaintEffect.cpp.s - -src\Client\GUI\Engine\Elements\Control\Button\Button.obj: src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.obj - -src\Client\GUI\Engine\Elements\Control\Button\Button.i: src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.i - -src\Client\GUI\Engine\Elements\Control\Button\Button.s: src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Button\Button.cpp.s - -src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.obj: src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.obj - -src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.i: src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.i - -src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.s: src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorPicker\ColorPicker.cpp.s - -src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.obj: src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.obj - -src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.i: src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.i - -src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.s: src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\ColorWheel\ColorWheel.cpp.s - -src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.obj: src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.obj - -src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.i: src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.i - -src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.s: src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Dropdown\Dropdown.cpp.s - -src\Client\GUI\Engine\Elements\Control\Image\Image.obj: src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.obj - -src\Client\GUI\Engine\Elements\Control\Image\Image.i: src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.i - -src\Client\GUI\Engine\Elements\Control\Image\Image.s: src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Image\Image.cpp.s - -src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.obj: src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.obj - -src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.i: src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.i - -src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.s: src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\KeybindSelector\KeybindSelector.cpp.s - -src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.obj: src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.obj - -src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.i: src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.i - -src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.s: src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\ModCard\ModCard.cpp.s - -src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.obj: src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.obj - -src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.i: src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.i - -src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.s: src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedButton\RoundedButton.cpp.s - -src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.obj: src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.obj - -src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.i: src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.i - -src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.s: src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\RoundedRadioButton\RoundedRadioButton.cpp.s - -src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.obj: src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.obj - -src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.i: src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.i - -src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.s: src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\ScrollBar\ScrollBar.cpp.s - -src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.obj: src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.obj - -src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.i: src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.i - -src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.s: src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\SearchBar\SearchBar.cpp.s - -src\Client\GUI\Engine\Elements\Control\Slider\Slider.obj: src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.obj - -src\Client\GUI\Engine\Elements\Control\Slider\Slider.i: src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.i - -src\Client\GUI\Engine\Elements\Control\Slider\Slider.s: src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Slider\Slider.cpp.s - -src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.obj: src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.obj - -src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.i: src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.i - -src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.s: src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\TextBox\TextBox.cpp.s - -src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.obj: src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.obj - -src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.i: src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.i - -src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.s: src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Toggle\Toggle.cpp.s - -src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.obj: src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.obj - -src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.i: src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.i - -src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.s: src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Control\Tooltip\Tooltip.cpp.s - -src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.obj: src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.obj - -src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.i: src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.i - -src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.s: src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Circle\Circle.cpp.s - -src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.obj - -src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.i: src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.i - -src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.s: src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\BlurRect\BlurRect.cpp.s - -src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.obj - -src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.i: src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.i - -src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.s: src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\InnerShadowRect\InnerShadowRect.cpp.s - -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.obj - -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.i: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.i - -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.s: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedHollowRect\RoundedHollowRect.cpp.s - -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.obj - -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.i: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.i - -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.s: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRect\RoundedRect.cpp.s - -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.obj - -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.i: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.i - -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.s: src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\RoundedRectWithImageAndText\RoundedRectWithImageAndText.cpp.s - -src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.obj: src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.obj - -src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.i: src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.i - -src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.s: src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Shapes\Rect\ShadowRect\ShadowRect.cpp.s - -src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.obj: src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.obj - -src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.i: src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.i - -src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.s: src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Utils\ConvertImageToBitmap.cpp.s - -src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.obj: src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.obj - -src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.i: src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.i - -src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.s: src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Utils\FontManager\FontManager.cpp.s - -src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.obj: src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.obj - -# target to build an object file -src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.obj -.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.obj - -src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.i: src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.i - -# target to preprocess a source file -src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.i -.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.i - -src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.s: src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.s -.PHONY : src\Client\GUI\Engine\Elements\Windows\ColorPickerWindow\ColorPickerWindow.cpp.s - -src\Client\GUI\Engine\Engine.obj: src\Client\GUI\Engine\Engine.cpp.obj -.PHONY : src\Client\GUI\Engine\Engine.obj - -# target to build an object file -src\Client\GUI\Engine\Engine.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Engine.cpp.obj -.PHONY : src\Client\GUI\Engine\Engine.cpp.obj - -src\Client\GUI\Engine\Engine.i: src\Client\GUI\Engine\Engine.cpp.i -.PHONY : src\Client\GUI\Engine\Engine.i - -# target to preprocess a source file -src\Client\GUI\Engine\Engine.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Engine.cpp.i -.PHONY : src\Client\GUI\Engine\Engine.cpp.i - -src\Client\GUI\Engine\Engine.s: src\Client\GUI\Engine\Engine.cpp.s -.PHONY : src\Client\GUI\Engine\Engine.s - -# target to generate assembly for a file -src\Client\GUI\Engine\Engine.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\GUI\Engine\Engine.cpp.s -.PHONY : src\Client\GUI\Engine\Engine.cpp.s - -src\Client\Hook\Hooks\Game\ActorBaseTick.obj: src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.obj - -# target to build an object file -src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.obj - -src\Client\Hook\Hooks\Game\ActorBaseTick.i: src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.i - -src\Client\Hook\Hooks\Game\ActorBaseTick.s: src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\ActorBaseTick.cpp.s - -src\Client\Hook\Hooks\Game\GameModeAttack.obj: src\Client\Hook\Hooks\Game\GameModeAttack.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.obj - -# target to build an object file -src\Client\Hook\Hooks\Game\GameModeAttack.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\GameModeAttack.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.cpp.obj - -src\Client\Hook\Hooks\Game\GameModeAttack.i: src\Client\Hook\Hooks\Game\GameModeAttack.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Game\GameModeAttack.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\GameModeAttack.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.cpp.i - -src\Client\Hook\Hooks\Game\GameModeAttack.s: src\Client\Hook\Hooks\Game\GameModeAttack.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Game\GameModeAttack.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\GameModeAttack.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\GameModeAttack.cpp.s - -src\Client\Hook\Hooks\Game\OnSuspend.obj: src\Client\Hook\Hooks\Game\OnSuspend.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.obj - -# target to build an object file -src\Client\Hook\Hooks\Game\OnSuspend.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\OnSuspend.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.cpp.obj - -src\Client\Hook\Hooks\Game\OnSuspend.i: src\Client\Hook\Hooks\Game\OnSuspend.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Game\OnSuspend.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\OnSuspend.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.cpp.i - -src\Client\Hook\Hooks\Game\OnSuspend.s: src\Client\Hook\Hooks\Game\OnSuspend.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Game\OnSuspend.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\OnSuspend.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\OnSuspend.cpp.s - -src\Client\Hook\Hooks\Game\PacketHooks.obj: src\Client\Hook\Hooks\Game\PacketHooks.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.obj - -# target to build an object file -src\Client\Hook\Hooks\Game\PacketHooks.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\PacketHooks.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.cpp.obj - -src\Client\Hook\Hooks\Game\PacketHooks.i: src\Client\Hook\Hooks\Game\PacketHooks.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Game\PacketHooks.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\PacketHooks.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.cpp.i - -src\Client\Hook\Hooks\Game\PacketHooks.s: src\Client\Hook\Hooks\Game\PacketHooks.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Game\PacketHooks.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\PacketHooks.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\PacketHooks.cpp.s - -src\Client\Hook\Hooks\Game\RaknetTick.obj: src\Client\Hook\Hooks\Game\RaknetTick.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.obj - -# target to build an object file -src\Client\Hook\Hooks\Game\RaknetTick.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RaknetTick.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.cpp.obj - -src\Client\Hook\Hooks\Game\RaknetTick.i: src\Client\Hook\Hooks\Game\RaknetTick.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Game\RaknetTick.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RaknetTick.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.cpp.i - -src\Client\Hook\Hooks\Game\RaknetTick.s: src\Client\Hook\Hooks\Game\RaknetTick.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Game\RaknetTick.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RaknetTick.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\RaknetTick.cpp.s - -src\Client\Hook\Hooks\Game\RenderItemGroup.obj: src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.obj - -# target to build an object file -src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.obj - -src\Client\Hook\Hooks\Game\RenderItemGroup.i: src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.i - -src\Client\Hook\Hooks\Game\RenderItemGroup.s: src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\RenderItemGroup.cpp.s - -src\Client\Hook\Hooks\Game\getViewPerspective.obj: src\Client\Hook\Hooks\Game\getViewPerspective.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.obj - -# target to build an object file -src\Client\Hook\Hooks\Game\getViewPerspective.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\getViewPerspective.cpp.obj -.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.cpp.obj - -src\Client\Hook\Hooks\Game\getViewPerspective.i: src\Client\Hook\Hooks\Game\getViewPerspective.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Game\getViewPerspective.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\getViewPerspective.cpp.i -.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.cpp.i - -src\Client\Hook\Hooks\Game\getViewPerspective.s: src\Client\Hook\Hooks\Game\getViewPerspective.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Game\getViewPerspective.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Game\getViewPerspective.cpp.s -.PHONY : src\Client\Hook\Hooks\Game\getViewPerspective.cpp.s - -src\Client\Hook\Hooks\Hook.obj: src\Client\Hook\Hooks\Hook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Hook.obj - -# target to build an object file -src\Client\Hook\Hooks\Hook.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Hook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Hook.cpp.obj - -src\Client\Hook\Hooks\Hook.i: src\Client\Hook\Hooks\Hook.cpp.i -.PHONY : src\Client\Hook\Hooks\Hook.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Hook.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Hook.cpp.i -.PHONY : src\Client\Hook\Hooks\Hook.cpp.i - -src\Client\Hook\Hooks\Hook.s: src\Client\Hook\Hooks\Hook.cpp.s -.PHONY : src\Client\Hook\Hooks\Hook.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Hook.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Hook.cpp.s -.PHONY : src\Client\Hook\Hooks\Hook.cpp.s - -src\Client\Hook\Hooks\Input\KeyHook.obj: src\Client\Hook\Hooks\Input\KeyHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Input\KeyHook.obj - -# target to build an object file -src\Client\Hook\Hooks\Input\KeyHook.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\KeyHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Input\KeyHook.cpp.obj - -src\Client\Hook\Hooks\Input\KeyHook.i: src\Client\Hook\Hooks\Input\KeyHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Input\KeyHook.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Input\KeyHook.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\KeyHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Input\KeyHook.cpp.i - -src\Client\Hook\Hooks\Input\KeyHook.s: src\Client\Hook\Hooks\Input\KeyHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Input\KeyHook.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Input\KeyHook.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\KeyHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Input\KeyHook.cpp.s - -src\Client\Hook\Hooks\Input\MouseHook.obj: src\Client\Hook\Hooks\Input\MouseHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Input\MouseHook.obj - -# target to build an object file -src\Client\Hook\Hooks\Input\MouseHook.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\MouseHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Input\MouseHook.cpp.obj - -src\Client\Hook\Hooks\Input\MouseHook.i: src\Client\Hook\Hooks\Input\MouseHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Input\MouseHook.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Input\MouseHook.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\MouseHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Input\MouseHook.cpp.i - -src\Client\Hook\Hooks\Input\MouseHook.s: src\Client\Hook\Hooks\Input\MouseHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Input\MouseHook.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Input\MouseHook.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Input\MouseHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Input\MouseHook.cpp.s - -src\Client\Hook\Hooks\Render\CommandListHook.obj: src\Client\Hook\Hooks\Render\CommandListHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.obj - -# target to build an object file -src\Client\Hook\Hooks\Render\CommandListHook.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\CommandListHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.cpp.obj - -src\Client\Hook\Hooks\Render\CommandListHook.i: src\Client\Hook\Hooks\Render\CommandListHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Render\CommandListHook.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\CommandListHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.cpp.i - -src\Client\Hook\Hooks\Render\CommandListHook.s: src\Client\Hook\Hooks\Render\CommandListHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Render\CommandListHook.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\CommandListHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Render\CommandListHook.cpp.s - -src\Client\Hook\Hooks\Render\ResizeHook.obj: src\Client\Hook\Hooks\Render\ResizeHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.obj - -# target to build an object file -src\Client\Hook\Hooks\Render\ResizeHook.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\ResizeHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.cpp.obj - -src\Client\Hook\Hooks\Render\ResizeHook.i: src\Client\Hook\Hooks\Render\ResizeHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Render\ResizeHook.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\ResizeHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.cpp.i - -src\Client\Hook\Hooks\Render\ResizeHook.s: src\Client\Hook\Hooks\Render\ResizeHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Render\ResizeHook.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\ResizeHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Render\ResizeHook.cpp.s - -src\Client\Hook\Hooks\Render\SwapchainHook.obj: src\Client\Hook\Hooks\Render\SwapchainHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.obj - -# target to build an object file -src\Client\Hook\Hooks\Render\SwapchainHook.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\SwapchainHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.cpp.obj - -src\Client\Hook\Hooks\Render\SwapchainHook.i: src\Client\Hook\Hooks\Render\SwapchainHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Render\SwapchainHook.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\SwapchainHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.cpp.i - -src\Client\Hook\Hooks\Render\SwapchainHook.s: src\Client\Hook\Hooks\Render\SwapchainHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Render\SwapchainHook.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\SwapchainHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Render\SwapchainHook.cpp.s - -src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.obj: src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.obj - -# target to build an object file -src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.obj -.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.obj - -src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.i: src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.i - -# target to preprocess a source file -src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.i -.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.i - -src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.s: src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.s - -# target to generate assembly for a file -src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.s -.PHONY : src\Client\Hook\Hooks\Render\TextureGroup_getTextureHook.cpp.s - -src\Client\Hook\Manager.obj: src\Client\Hook\Manager.cpp.obj -.PHONY : src\Client\Hook\Manager.obj - -# target to build an object file -src\Client\Hook\Manager.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Manager.cpp.obj -.PHONY : src\Client\Hook\Manager.cpp.obj - -src\Client\Hook\Manager.i: src\Client\Hook\Manager.cpp.i -.PHONY : src\Client\Hook\Manager.i - -# target to preprocess a source file -src\Client\Hook\Manager.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Manager.cpp.i -.PHONY : src\Client\Hook\Manager.cpp.i - -src\Client\Hook\Manager.s: src\Client\Hook\Manager.cpp.s -.PHONY : src\Client\Hook\Manager.s - -# target to generate assembly for a file -src\Client\Hook\Manager.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Hook\Manager.cpp.s -.PHONY : src\Client\Hook\Manager.cpp.s - -src\Client\Module\Manager.obj: src\Client\Module\Manager.cpp.obj -.PHONY : src\Client\Module\Manager.obj - -# target to build an object file -src\Client\Module\Manager.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Manager.cpp.obj -.PHONY : src\Client\Module\Manager.cpp.obj - -src\Client\Module\Manager.i: src\Client\Module\Manager.cpp.i -.PHONY : src\Client\Module\Manager.i - -# target to preprocess a source file -src\Client\Module\Manager.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Manager.cpp.i -.PHONY : src\Client\Module\Manager.cpp.i - -src\Client\Module\Manager.s: src\Client\Module\Manager.cpp.s -.PHONY : src\Client\Module\Manager.s - -# target to generate assembly for a file -src\Client\Module\Manager.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Manager.cpp.s -.PHONY : src\Client\Module\Manager.cpp.s - -src\Client\Module\Modules\Hitbox\HitboxListener.obj: src\Client\Module\Modules\Hitbox\HitboxListener.cpp.obj -.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.obj - -# target to build an object file -src\Client\Module\Modules\Hitbox\HitboxListener.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Hitbox\HitboxListener.cpp.obj -.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.cpp.obj - -src\Client\Module\Modules\Hitbox\HitboxListener.i: src\Client\Module\Modules\Hitbox\HitboxListener.cpp.i -.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.i - -# target to preprocess a source file -src\Client\Module\Modules\Hitbox\HitboxListener.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Hitbox\HitboxListener.cpp.i -.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.cpp.i - -src\Client\Module\Modules\Hitbox\HitboxListener.s: src\Client\Module\Modules\Hitbox\HitboxListener.cpp.s -.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.s - -# target to generate assembly for a file -src\Client\Module\Modules\Hitbox\HitboxListener.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Hitbox\HitboxListener.cpp.s -.PHONY : src\Client\Module\Modules\Hitbox\HitboxListener.cpp.s - -src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.obj: src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.obj -.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.obj - -# target to build an object file -src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.obj -.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.obj - -src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.i: src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.i -.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.i - -# target to preprocess a source file -src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.i -.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.i - -src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.s: src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.s -.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.s - -# target to generate assembly for a file -src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.s -.PHONY : src\Client\Module\Modules\ItemPhysics\ItemPhysicsListener.cpp.s - -src\Client\Module\Modules\Module.obj: src\Client\Module\Modules\Module.cpp.obj -.PHONY : src\Client\Module\Modules\Module.obj - -# target to build an object file -src\Client\Module\Modules\Module.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Module.cpp.obj -.PHONY : src\Client\Module\Modules\Module.cpp.obj - -src\Client\Module\Modules\Module.i: src\Client\Module\Modules\Module.cpp.i -.PHONY : src\Client\Module\Modules\Module.i - -# target to preprocess a source file -src\Client\Module\Modules\Module.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Module.cpp.i -.PHONY : src\Client\Module\Modules\Module.cpp.i - -src\Client\Module\Modules\Module.s: src\Client\Module\Modules\Module.cpp.s -.PHONY : src\Client\Module\Modules\Module.s - -# target to generate assembly for a file -src\Client\Module\Modules\Module.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Client\Module\Modules\Module.cpp.s -.PHONY : src\Client\Module\Modules\Module.cpp.s - -src\SDK\Client\Actor\Actor.obj: src\SDK\Client\Actor\Actor.cpp.obj -.PHONY : src\SDK\Client\Actor\Actor.obj - -# target to build an object file -src\SDK\Client\Actor\Actor.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\Actor.cpp.obj -.PHONY : src\SDK\Client\Actor\Actor.cpp.obj - -src\SDK\Client\Actor\Actor.i: src\SDK\Client\Actor\Actor.cpp.i -.PHONY : src\SDK\Client\Actor\Actor.i - -# target to preprocess a source file -src\SDK\Client\Actor\Actor.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\Actor.cpp.i -.PHONY : src\SDK\Client\Actor\Actor.cpp.i - -src\SDK\Client\Actor\Actor.s: src\SDK\Client\Actor\Actor.cpp.s -.PHONY : src\SDK\Client\Actor\Actor.s - -# target to generate assembly for a file -src\SDK\Client\Actor\Actor.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\Actor.cpp.s -.PHONY : src\SDK\Client\Actor\Actor.cpp.s - -src\SDK\Client\Actor\ItemActor.obj: src\SDK\Client\Actor\ItemActor.cpp.obj -.PHONY : src\SDK\Client\Actor\ItemActor.obj - -# target to build an object file -src\SDK\Client\Actor\ItemActor.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\ItemActor.cpp.obj -.PHONY : src\SDK\Client\Actor\ItemActor.cpp.obj - -src\SDK\Client\Actor\ItemActor.i: src\SDK\Client\Actor\ItemActor.cpp.i -.PHONY : src\SDK\Client\Actor\ItemActor.i - -# target to preprocess a source file -src\SDK\Client\Actor\ItemActor.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\ItemActor.cpp.i -.PHONY : src\SDK\Client\Actor\ItemActor.cpp.i - -src\SDK\Client\Actor\ItemActor.s: src\SDK\Client\Actor\ItemActor.cpp.s -.PHONY : src\SDK\Client\Actor\ItemActor.s - -# target to generate assembly for a file -src\SDK\Client\Actor\ItemActor.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Actor\ItemActor.cpp.s -.PHONY : src\SDK\Client\Actor\ItemActor.cpp.s - -src\SDK\Client\Block\BlockSource.obj: src\SDK\Client\Block\BlockSource.cpp.obj -.PHONY : src\SDK\Client\Block\BlockSource.obj - -# target to build an object file -src\SDK\Client\Block\BlockSource.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Block\BlockSource.cpp.obj -.PHONY : src\SDK\Client\Block\BlockSource.cpp.obj - -src\SDK\Client\Block\BlockSource.i: src\SDK\Client\Block\BlockSource.cpp.i -.PHONY : src\SDK\Client\Block\BlockSource.i - -# target to preprocess a source file -src\SDK\Client\Block\BlockSource.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Block\BlockSource.cpp.i -.PHONY : src\SDK\Client\Block\BlockSource.cpp.i - -src\SDK\Client\Block\BlockSource.s: src\SDK\Client\Block\BlockSource.cpp.s -.PHONY : src\SDK\Client\Block\BlockSource.s - -# target to generate assembly for a file -src\SDK\Client\Block\BlockSource.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Block\BlockSource.cpp.s -.PHONY : src\SDK\Client\Block\BlockSource.cpp.s - -src\SDK\Client\Container\Inventory.obj: src\SDK\Client\Container\Inventory.cpp.obj -.PHONY : src\SDK\Client\Container\Inventory.obj - -# target to build an object file -src\SDK\Client\Container\Inventory.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Container\Inventory.cpp.obj -.PHONY : src\SDK\Client\Container\Inventory.cpp.obj - -src\SDK\Client\Container\Inventory.i: src\SDK\Client\Container\Inventory.cpp.i -.PHONY : src\SDK\Client\Container\Inventory.i - -# target to preprocess a source file -src\SDK\Client\Container\Inventory.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Container\Inventory.cpp.i -.PHONY : src\SDK\Client\Container\Inventory.cpp.i - -src\SDK\Client\Container\Inventory.s: src\SDK\Client\Container\Inventory.cpp.s -.PHONY : src\SDK\Client\Container\Inventory.s - -# target to generate assembly for a file -src\SDK\Client\Container\Inventory.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Container\Inventory.cpp.s -.PHONY : src\SDK\Client\Container\Inventory.cpp.s - -src\SDK\Client\Core\ClientInstance.obj: src\SDK\Client\Core\ClientInstance.cpp.obj -.PHONY : src\SDK\Client\Core\ClientInstance.obj - -# target to build an object file -src\SDK\Client\Core\ClientInstance.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Core\ClientInstance.cpp.obj -.PHONY : src\SDK\Client\Core\ClientInstance.cpp.obj - -src\SDK\Client\Core\ClientInstance.i: src\SDK\Client\Core\ClientInstance.cpp.i -.PHONY : src\SDK\Client\Core\ClientInstance.i - -# target to preprocess a source file -src\SDK\Client\Core\ClientInstance.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Core\ClientInstance.cpp.i -.PHONY : src\SDK\Client\Core\ClientInstance.cpp.i - -src\SDK\Client\Core\ClientInstance.s: src\SDK\Client\Core\ClientInstance.cpp.s -.PHONY : src\SDK\Client\Core\ClientInstance.s - -# target to generate assembly for a file -src\SDK\Client\Core\ClientInstance.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Core\ClientInstance.cpp.s -.PHONY : src\SDK\Client\Core\ClientInstance.cpp.s - -src\SDK\Client\Item\ItemStack.obj: src\SDK\Client\Item\ItemStack.cpp.obj -.PHONY : src\SDK\Client\Item\ItemStack.obj - -# target to build an object file -src\SDK\Client\Item\ItemStack.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Item\ItemStack.cpp.obj -.PHONY : src\SDK\Client\Item\ItemStack.cpp.obj - -src\SDK\Client\Item\ItemStack.i: src\SDK\Client\Item\ItemStack.cpp.i -.PHONY : src\SDK\Client\Item\ItemStack.i - -# target to preprocess a source file -src\SDK\Client\Item\ItemStack.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Item\ItemStack.cpp.i -.PHONY : src\SDK\Client\Item\ItemStack.cpp.i - -src\SDK\Client\Item\ItemStack.s: src\SDK\Client\Item\ItemStack.cpp.s -.PHONY : src\SDK\Client\Item\ItemStack.s - -# target to generate assembly for a file -src\SDK\Client\Item\ItemStack.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Item\ItemStack.cpp.s -.PHONY : src\SDK\Client\Item\ItemStack.cpp.s - -src\SDK\Client\Level\HitResult.obj: src\SDK\Client\Level\HitResult.cpp.obj -.PHONY : src\SDK\Client\Level\HitResult.obj - -# target to build an object file -src\SDK\Client\Level\HitResult.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Level\HitResult.cpp.obj -.PHONY : src\SDK\Client\Level\HitResult.cpp.obj - -src\SDK\Client\Level\HitResult.i: src\SDK\Client\Level\HitResult.cpp.i -.PHONY : src\SDK\Client\Level\HitResult.i - -# target to preprocess a source file -src\SDK\Client\Level\HitResult.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Level\HitResult.cpp.i -.PHONY : src\SDK\Client\Level\HitResult.cpp.i - -src\SDK\Client\Level\HitResult.s: src\SDK\Client\Level\HitResult.cpp.s -.PHONY : src\SDK\Client\Level\HitResult.s - -# target to generate assembly for a file -src\SDK\Client\Level\HitResult.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Level\HitResult.cpp.s -.PHONY : src\SDK\Client\Level\HitResult.cpp.s - -src\SDK\Client\Network\Packet\Packet.obj: src\SDK\Client\Network\Packet\Packet.cpp.obj -.PHONY : src\SDK\Client\Network\Packet\Packet.obj - -# target to build an object file -src\SDK\Client\Network\Packet\Packet.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Network\Packet\Packet.cpp.obj -.PHONY : src\SDK\Client\Network\Packet\Packet.cpp.obj - -src\SDK\Client\Network\Packet\Packet.i: src\SDK\Client\Network\Packet\Packet.cpp.i -.PHONY : src\SDK\Client\Network\Packet\Packet.i - -# target to preprocess a source file -src\SDK\Client\Network\Packet\Packet.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Network\Packet\Packet.cpp.i -.PHONY : src\SDK\Client\Network\Packet\Packet.cpp.i - -src\SDK\Client\Network\Packet\Packet.s: src\SDK\Client\Network\Packet\Packet.cpp.s -.PHONY : src\SDK\Client\Network\Packet\Packet.s - -# target to generate assembly for a file -src\SDK\Client\Network\Packet\Packet.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Network\Packet\Packet.cpp.s -.PHONY : src\SDK\Client\Network\Packet\Packet.cpp.s - -src\SDK\Client\Render\BaseActorRenderContext.obj: src\SDK\Client\Render\BaseActorRenderContext.cpp.obj -.PHONY : src\SDK\Client\Render\BaseActorRenderContext.obj - -# target to build an object file -src\SDK\Client\Render\BaseActorRenderContext.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\BaseActorRenderContext.cpp.obj -.PHONY : src\SDK\Client\Render\BaseActorRenderContext.cpp.obj - -src\SDK\Client\Render\BaseActorRenderContext.i: src\SDK\Client\Render\BaseActorRenderContext.cpp.i -.PHONY : src\SDK\Client\Render\BaseActorRenderContext.i - -# target to preprocess a source file -src\SDK\Client\Render\BaseActorRenderContext.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\BaseActorRenderContext.cpp.i -.PHONY : src\SDK\Client\Render\BaseActorRenderContext.cpp.i - -src\SDK\Client\Render\BaseActorRenderContext.s: src\SDK\Client\Render\BaseActorRenderContext.cpp.s -.PHONY : src\SDK\Client\Render\BaseActorRenderContext.s - -# target to generate assembly for a file -src\SDK\Client\Render\BaseActorRenderContext.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\BaseActorRenderContext.cpp.s -.PHONY : src\SDK\Client\Render\BaseActorRenderContext.cpp.s - -src\SDK\Client\Render\GuiData.obj: src\SDK\Client\Render\GuiData.cpp.obj -.PHONY : src\SDK\Client\Render\GuiData.obj - -# target to build an object file -src\SDK\Client\Render\GuiData.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\GuiData.cpp.obj -.PHONY : src\SDK\Client\Render\GuiData.cpp.obj - -src\SDK\Client\Render\GuiData.i: src\SDK\Client\Render\GuiData.cpp.i -.PHONY : src\SDK\Client\Render\GuiData.i - -# target to preprocess a source file -src\SDK\Client\Render\GuiData.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\GuiData.cpp.i -.PHONY : src\SDK\Client\Render\GuiData.cpp.i - -src\SDK\Client\Render\GuiData.s: src\SDK\Client\Render\GuiData.cpp.s -.PHONY : src\SDK\Client\Render\GuiData.s - -# target to generate assembly for a file -src\SDK\Client\Render\GuiData.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\GuiData.cpp.s -.PHONY : src\SDK\Client\Render\GuiData.cpp.s - -src\SDK\Client\Render\ItemRenderer.obj: src\SDK\Client\Render\ItemRenderer.cpp.obj -.PHONY : src\SDK\Client\Render\ItemRenderer.obj - -# target to build an object file -src\SDK\Client\Render\ItemRenderer.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\ItemRenderer.cpp.obj -.PHONY : src\SDK\Client\Render\ItemRenderer.cpp.obj - -src\SDK\Client\Render\ItemRenderer.i: src\SDK\Client\Render\ItemRenderer.cpp.i -.PHONY : src\SDK\Client\Render\ItemRenderer.i - -# target to preprocess a source file -src\SDK\Client\Render\ItemRenderer.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\ItemRenderer.cpp.i -.PHONY : src\SDK\Client\Render\ItemRenderer.cpp.i - -src\SDK\Client\Render\ItemRenderer.s: src\SDK\Client\Render\ItemRenderer.cpp.s -.PHONY : src\SDK\Client\Render\ItemRenderer.s - -# target to generate assembly for a file -src\SDK\Client\Render\ItemRenderer.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\ItemRenderer.cpp.s -.PHONY : src\SDK\Client\Render\ItemRenderer.cpp.s - -src\SDK\Client\Render\Matrix.obj: src\SDK\Client\Render\Matrix.cpp.obj -.PHONY : src\SDK\Client\Render\Matrix.obj - -# target to build an object file -src\SDK\Client\Render\Matrix.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Matrix.cpp.obj -.PHONY : src\SDK\Client\Render\Matrix.cpp.obj - -src\SDK\Client\Render\Matrix.i: src\SDK\Client\Render\Matrix.cpp.i -.PHONY : src\SDK\Client\Render\Matrix.i - -# target to preprocess a source file -src\SDK\Client\Render\Matrix.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Matrix.cpp.i -.PHONY : src\SDK\Client\Render\Matrix.cpp.i - -src\SDK\Client\Render\Matrix.s: src\SDK\Client\Render\Matrix.cpp.s -.PHONY : src\SDK\Client\Render\Matrix.s - -# target to generate assembly for a file -src\SDK\Client\Render\Matrix.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Matrix.cpp.s -.PHONY : src\SDK\Client\Render\Matrix.cpp.s - -src\SDK\Client\Render\Tessellator\MeshHelpers.obj: src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.obj -.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.obj - -# target to build an object file -src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.obj -.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.obj - -src\SDK\Client\Render\Tessellator\MeshHelpers.i: src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.i -.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.i - -# target to preprocess a source file -src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.i -.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.i - -src\SDK\Client\Render\Tessellator\MeshHelpers.s: src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.s -.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.s - -# target to generate assembly for a file -src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.s -.PHONY : src\SDK\Client\Render\Tessellator\MeshHelpers.cpp.s - -src\SDK\Client\Render\Tessellator\RenderMaterialGroup.obj: src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.obj -.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.obj - -# target to build an object file -src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.obj -.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.obj - -src\SDK\Client\Render\Tessellator\RenderMaterialGroup.i: src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.i -.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.i - -# target to preprocess a source file -src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.i -.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.i - -src\SDK\Client\Render\Tessellator\RenderMaterialGroup.s: src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.s -.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.s - -# target to generate assembly for a file -src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.s -.PHONY : src\SDK\Client\Render\Tessellator\RenderMaterialGroup.cpp.s - -src\SDK\SDK.obj: src\SDK\SDK.cpp.obj -.PHONY : src\SDK\SDK.obj - -# target to build an object file -src\SDK\SDK.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\SDK.cpp.obj -.PHONY : src\SDK\SDK.cpp.obj - -src\SDK\SDK.i: src\SDK\SDK.cpp.i -.PHONY : src\SDK\SDK.i - -# target to preprocess a source file -src\SDK\SDK.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\SDK.cpp.i -.PHONY : src\SDK\SDK.cpp.i - -src\SDK\SDK.s: src\SDK\SDK.cpp.s -.PHONY : src\SDK\SDK.s - -# target to generate assembly for a file -src\SDK\SDK.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\SDK\SDK.cpp.s -.PHONY : src\SDK\SDK.cpp.s - -src\Utils\Logger\Logger.obj: src\Utils\Logger\Logger.cpp.obj -.PHONY : src\Utils\Logger\Logger.obj - -# target to build an object file -src\Utils\Logger\Logger.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\Logger.cpp.obj -.PHONY : src\Utils\Logger\Logger.cpp.obj - -src\Utils\Logger\Logger.i: src\Utils\Logger\Logger.cpp.i -.PHONY : src\Utils\Logger\Logger.i - -# target to preprocess a source file -src\Utils\Logger\Logger.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\Logger.cpp.i -.PHONY : src\Utils\Logger\Logger.cpp.i - -src\Utils\Logger\Logger.s: src\Utils\Logger\Logger.cpp.s -.PHONY : src\Utils\Logger\Logger.s - -# target to generate assembly for a file -src\Utils\Logger\Logger.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\Logger.cpp.s -.PHONY : src\Utils\Logger\Logger.cpp.s - -src\Utils\Logger\crashlogs.obj: src\Utils\Logger\crashlogs.cpp.obj -.PHONY : src\Utils\Logger\crashlogs.obj - -# target to build an object file -src\Utils\Logger\crashlogs.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\crashlogs.cpp.obj -.PHONY : src\Utils\Logger\crashlogs.cpp.obj - -src\Utils\Logger\crashlogs.i: src\Utils\Logger\crashlogs.cpp.i -.PHONY : src\Utils\Logger\crashlogs.i - -# target to preprocess a source file -src\Utils\Logger\crashlogs.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\crashlogs.cpp.i -.PHONY : src\Utils\Logger\crashlogs.cpp.i - -src\Utils\Logger\crashlogs.s: src\Utils\Logger\crashlogs.cpp.s -.PHONY : src\Utils\Logger\crashlogs.s - -# target to generate assembly for a file -src\Utils\Logger\crashlogs.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Logger\crashlogs.cpp.s -.PHONY : src\Utils\Logger\crashlogs.cpp.s - -src\Utils\Memory\CustomAllocator\Buffer.obj: src\Utils\Memory\CustomAllocator\Buffer.cpp.obj -.PHONY : src\Utils\Memory\CustomAllocator\Buffer.obj - -# target to build an object file -src\Utils\Memory\CustomAllocator\Buffer.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\CustomAllocator\Buffer.cpp.obj -.PHONY : src\Utils\Memory\CustomAllocator\Buffer.cpp.obj - -src\Utils\Memory\CustomAllocator\Buffer.i: src\Utils\Memory\CustomAllocator\Buffer.cpp.i -.PHONY : src\Utils\Memory\CustomAllocator\Buffer.i - -# target to preprocess a source file -src\Utils\Memory\CustomAllocator\Buffer.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\CustomAllocator\Buffer.cpp.i -.PHONY : src\Utils\Memory\CustomAllocator\Buffer.cpp.i - -src\Utils\Memory\CustomAllocator\Buffer.s: src\Utils\Memory\CustomAllocator\Buffer.cpp.s -.PHONY : src\Utils\Memory\CustomAllocator\Buffer.s - -# target to generate assembly for a file -src\Utils\Memory\CustomAllocator\Buffer.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\CustomAllocator\Buffer.cpp.s -.PHONY : src\Utils\Memory\CustomAllocator\Buffer.cpp.s - -src\Utils\Memory\Game\Offset\OffsetInit.obj: src\Utils\Memory\Game\Offset\OffsetInit.cpp.obj -.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.obj - -# target to build an object file -src\Utils\Memory\Game\Offset\OffsetInit.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Offset\OffsetInit.cpp.obj -.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.cpp.obj - -src\Utils\Memory\Game\Offset\OffsetInit.i: src\Utils\Memory\Game\Offset\OffsetInit.cpp.i -.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.i - -# target to preprocess a source file -src\Utils\Memory\Game\Offset\OffsetInit.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Offset\OffsetInit.cpp.i -.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.cpp.i - -src\Utils\Memory\Game\Offset\OffsetInit.s: src\Utils\Memory\Game\Offset\OffsetInit.cpp.s -.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.s - -# target to generate assembly for a file -src\Utils\Memory\Game\Offset\OffsetInit.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Offset\OffsetInit.cpp.s -.PHONY : src\Utils\Memory\Game\Offset\OffsetInit.cpp.s - -src\Utils\Memory\Game\Sig\SigInit.obj: src\Utils\Memory\Game\Sig\SigInit.cpp.obj -.PHONY : src\Utils\Memory\Game\Sig\SigInit.obj - -# target to build an object file -src\Utils\Memory\Game\Sig\SigInit.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Sig\SigInit.cpp.obj -.PHONY : src\Utils\Memory\Game\Sig\SigInit.cpp.obj - -src\Utils\Memory\Game\Sig\SigInit.i: src\Utils\Memory\Game\Sig\SigInit.cpp.i -.PHONY : src\Utils\Memory\Game\Sig\SigInit.i - -# target to preprocess a source file -src\Utils\Memory\Game\Sig\SigInit.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Sig\SigInit.cpp.i -.PHONY : src\Utils\Memory\Game\Sig\SigInit.cpp.i - -src\Utils\Memory\Game\Sig\SigInit.s: src\Utils\Memory\Game\Sig\SigInit.cpp.s -.PHONY : src\Utils\Memory\Game\Sig\SigInit.s - -# target to generate assembly for a file -src\Utils\Memory\Game\Sig\SigInit.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\Sig\SigInit.cpp.s -.PHONY : src\Utils\Memory\Game\Sig\SigInit.cpp.s - -src\Utils\Memory\Game\SignatureAndOffsetManager.obj: src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.obj -.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.obj - -# target to build an object file -src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.obj -.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.obj - -src\Utils\Memory\Game\SignatureAndOffsetManager.i: src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.i -.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.i - -# target to preprocess a source file -src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.i -.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.i - -src\Utils\Memory\Game\SignatureAndOffsetManager.s: src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.s -.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.s - -# target to generate assembly for a file -src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.s -.PHONY : src\Utils\Memory\Game\SignatureAndOffsetManager.cpp.s - -src\Utils\Render\DrawUtils.obj: src\Utils\Render\DrawUtils.cpp.obj -.PHONY : src\Utils\Render\DrawUtils.obj - -# target to build an object file -src\Utils\Render\DrawUtils.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\DrawUtils.cpp.obj -.PHONY : src\Utils\Render\DrawUtils.cpp.obj - -src\Utils\Render\DrawUtils.i: src\Utils\Render\DrawUtils.cpp.i -.PHONY : src\Utils\Render\DrawUtils.i - -# target to preprocess a source file -src\Utils\Render\DrawUtils.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\DrawUtils.cpp.i -.PHONY : src\Utils\Render\DrawUtils.cpp.i - -src\Utils\Render\DrawUtils.s: src\Utils\Render\DrawUtils.cpp.s -.PHONY : src\Utils\Render\DrawUtils.s - -# target to generate assembly for a file -src\Utils\Render\DrawUtils.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\DrawUtils.cpp.s -.PHONY : src\Utils\Render\DrawUtils.cpp.s - -src\Utils\Render\MaterialUtils.obj: src\Utils\Render\MaterialUtils.cpp.obj -.PHONY : src\Utils\Render\MaterialUtils.obj - -# target to build an object file -src\Utils\Render\MaterialUtils.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\MaterialUtils.cpp.obj -.PHONY : src\Utils\Render\MaterialUtils.cpp.obj - -src\Utils\Render\MaterialUtils.i: src\Utils\Render\MaterialUtils.cpp.i -.PHONY : src\Utils\Render\MaterialUtils.i - -# target to preprocess a source file -src\Utils\Render\MaterialUtils.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\MaterialUtils.cpp.i -.PHONY : src\Utils\Render\MaterialUtils.cpp.i - -src\Utils\Render\MaterialUtils.s: src\Utils\Render\MaterialUtils.cpp.s -.PHONY : src\Utils\Render\MaterialUtils.s - -# target to generate assembly for a file -src\Utils\Render\MaterialUtils.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\MaterialUtils.cpp.s -.PHONY : src\Utils\Render\MaterialUtils.cpp.s - -src\Utils\Render\PositionUtils.obj: src\Utils\Render\PositionUtils.cpp.obj -.PHONY : src\Utils\Render\PositionUtils.obj - -# target to build an object file -src\Utils\Render\PositionUtils.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\PositionUtils.cpp.obj -.PHONY : src\Utils\Render\PositionUtils.cpp.obj - -src\Utils\Render\PositionUtils.i: src\Utils\Render\PositionUtils.cpp.i -.PHONY : src\Utils\Render\PositionUtils.i - -# target to preprocess a source file -src\Utils\Render\PositionUtils.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\PositionUtils.cpp.i -.PHONY : src\Utils\Render\PositionUtils.cpp.i - -src\Utils\Render\PositionUtils.s: src\Utils\Render\PositionUtils.cpp.s -.PHONY : src\Utils\Render\PositionUtils.s - -# target to generate assembly for a file -src\Utils\Render\PositionUtils.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Render\PositionUtils.cpp.s -.PHONY : src\Utils\Render\PositionUtils.cpp.s - -src\Utils\Utils.obj: src\Utils\Utils.cpp.obj -.PHONY : src\Utils\Utils.obj - -# target to build an object file -src\Utils\Utils.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Utils.cpp.obj -.PHONY : src\Utils\Utils.cpp.obj - -src\Utils\Utils.i: src\Utils\Utils.cpp.i -.PHONY : src\Utils\Utils.i - -# target to preprocess a source file -src\Utils\Utils.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Utils.cpp.i -.PHONY : src\Utils\Utils.cpp.i - -src\Utils\Utils.s: src\Utils\Utils.cpp.s -.PHONY : src\Utils\Utils.s - -# target to generate assembly for a file -src\Utils\Utils.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Utils.cpp.s -.PHONY : src\Utils\Utils.cpp.s - -src\Utils\Versions\VersionUtils.obj: src\Utils\Versions\VersionUtils.cpp.obj -.PHONY : src\Utils\Versions\VersionUtils.obj - -# target to build an object file -src\Utils\Versions\VersionUtils.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\VersionUtils.cpp.obj -.PHONY : src\Utils\Versions\VersionUtils.cpp.obj - -src\Utils\Versions\VersionUtils.i: src\Utils\Versions\VersionUtils.cpp.i -.PHONY : src\Utils\Versions\VersionUtils.i - -# target to preprocess a source file -src\Utils\Versions\VersionUtils.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\VersionUtils.cpp.i -.PHONY : src\Utils\Versions\VersionUtils.cpp.i - -src\Utils\Versions\VersionUtils.s: src\Utils\Versions\VersionUtils.cpp.s -.PHONY : src\Utils\Versions\VersionUtils.s - -# target to generate assembly for a file -src\Utils\Versions\VersionUtils.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\VersionUtils.cpp.s -.PHONY : src\Utils\Versions\VersionUtils.cpp.s - -src\Utils\Versions\WinrtUtils.obj: src\Utils\Versions\WinrtUtils.cpp.obj -.PHONY : src\Utils\Versions\WinrtUtils.obj - -# target to build an object file -src\Utils\Versions\WinrtUtils.cpp.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\WinrtUtils.cpp.obj -.PHONY : src\Utils\Versions\WinrtUtils.cpp.obj - -src\Utils\Versions\WinrtUtils.i: src\Utils\Versions\WinrtUtils.cpp.i -.PHONY : src\Utils\Versions\WinrtUtils.i - -# target to preprocess a source file -src\Utils\Versions\WinrtUtils.cpp.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\WinrtUtils.cpp.i -.PHONY : src\Utils\Versions\WinrtUtils.cpp.i - -src\Utils\Versions\WinrtUtils.s: src\Utils\Versions\WinrtUtils.cpp.s -.PHONY : src\Utils\Versions\WinrtUtils.s - -# target to generate assembly for a file -src\Utils\Versions\WinrtUtils.cpp.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles\Flarial.dir\build.make /nologo -$(MAKEFLAGS) CMakeFiles\Flarial.dir\src\Utils\Versions\WinrtUtils.cpp.s -.PHONY : src\Utils\Versions\WinrtUtils.cpp.s - -# Help Target -help: - @echo The following are some of the valid targets for this Makefile: - @echo ... all (the default if no target is provided) - @echo ... clean - @echo ... depend - @echo ... edit_cache - @echo ... install - @echo ... install/local - @echo ... list_install_components - @echo ... rebuild_cache - @echo ... Flarial - @echo ... libhat - @echo ... lib/ImGui/imgui.obj - @echo ... lib/ImGui/imgui.i - @echo ... lib/ImGui/imgui.s - @echo ... lib/ImGui/imgui_demo.obj - @echo ... lib/ImGui/imgui_demo.i - @echo ... lib/ImGui/imgui_demo.s - @echo ... lib/ImGui/imgui_draw.obj - @echo ... lib/ImGui/imgui_draw.i - @echo ... lib/ImGui/imgui_draw.s - @echo ... lib/ImGui/imgui_impl_dx11.obj - @echo ... lib/ImGui/imgui_impl_dx11.i - @echo ... lib/ImGui/imgui_impl_dx11.s - @echo ... lib/ImGui/imgui_impl_dx12.obj - @echo ... lib/ImGui/imgui_impl_dx12.i - @echo ... lib/ImGui/imgui_impl_dx12.s - @echo ... lib/ImGui/imgui_impl_win32.obj - @echo ... lib/ImGui/imgui_impl_win32.i - @echo ... lib/ImGui/imgui_impl_win32.s - @echo ... lib/ImGui/imgui_tables.obj - @echo ... lib/ImGui/imgui_tables.i - @echo ... lib/ImGui/imgui_tables.s - @echo ... lib/ImGui/imgui_widgets.obj - @echo ... lib/ImGui/imgui_widgets.i - @echo ... lib/ImGui/imgui_widgets.s - @echo ... lib/glm/glm.obj - @echo ... lib/glm/glm.i - @echo ... lib/glm/glm.s - @echo ... lib/kiero/kiero.obj - @echo ... lib/kiero/kiero.i - @echo ... lib/kiero/kiero.s - @echo ... main.obj - @echo ... main.i - @echo ... main.s - @echo ... src/Assets/Assets.res - @echo ... src/Client/Client.obj - @echo ... src/Client/Client.i - @echo ... src/Client/Client.s - @echo ... src/Client/Events/EventHandler.obj - @echo ... src/Client/Events/EventHandler.i - @echo ... src/Client/Events/EventHandler.s - @echo ... src/Client/GUI/Engine/Constraints.obj - @echo ... src/Client/GUI/Engine/Constraints.i - @echo ... src/Client/GUI/Engine/Constraints.s - @echo ... src/Client/GUI/Engine/Effects/Blur/blur.obj - @echo ... src/Client/GUI/Engine/Effects/Blur/blur.i - @echo ... src/Client/GUI/Engine/Effects/Blur/blur.s - @echo ... src/Client/GUI/Engine/Effects/Blur/blur_dx12.obj - @echo ... src/Client/GUI/Engine/Effects/Blur/blur_dx12.i - @echo ... src/Client/GUI/Engine/Effects/Blur/blur_dx12.s - @echo ... src/Client/GUI/Engine/Effects/CombinedDeepFry/CombinedDeepFry.obj - @echo ... src/Client/GUI/Engine/Effects/CombinedDeepFry/CombinedDeepFry.i - @echo ... src/Client/GUI/Engine/Effects/CombinedDeepFry/CombinedDeepFry.s - @echo ... src/Client/GUI/Engine/Effects/DeepFry/DeepFry.obj - @echo ... src/Client/GUI/Engine/Effects/DeepFry/DeepFry.i - @echo ... src/Client/GUI/Engine/Effects/DeepFry/DeepFry.s - @echo ... src/Client/GUI/Engine/Effects/GaussianBlur/GaussianBlur.obj - @echo ... src/Client/GUI/Engine/Effects/GaussianBlur/GaussianBlur.i - @echo ... src/Client/GUI/Engine/Effects/GaussianBlur/GaussianBlur.s - @echo ... src/Client/GUI/Engine/Effects/Hue/Hue.obj - @echo ... src/Client/GUI/Engine/Effects/Hue/Hue.i - @echo ... src/Client/GUI/Engine/Effects/Hue/Hue.s - @echo ... src/Client/GUI/Engine/Effects/PaintEffect/PaintEffect.obj - @echo ... src/Client/GUI/Engine/Effects/PaintEffect/PaintEffect.i - @echo ... src/Client/GUI/Engine/Effects/PaintEffect/PaintEffect.s - @echo ... src/Client/GUI/Engine/Elements/Control/Button/Button.obj - @echo ... src/Client/GUI/Engine/Elements/Control/Button/Button.i - @echo ... src/Client/GUI/Engine/Elements/Control/Button/Button.s - @echo ... src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.obj - @echo ... src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.i - @echo ... src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.s - @echo ... src/Client/GUI/Engine/Elements/Control/ColorWheel/ColorWheel.obj - @echo ... src/Client/GUI/Engine/Elements/Control/ColorWheel/ColorWheel.i - @echo ... src/Client/GUI/Engine/Elements/Control/ColorWheel/ColorWheel.s - @echo ... src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.obj - @echo ... src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.i - @echo ... src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.s - @echo ... src/Client/GUI/Engine/Elements/Control/Image/Image.obj - @echo ... src/Client/GUI/Engine/Elements/Control/Image/Image.i - @echo ... src/Client/GUI/Engine/Elements/Control/Image/Image.s - @echo ... src/Client/GUI/Engine/Elements/Control/KeybindSelector/KeybindSelector.obj - @echo ... src/Client/GUI/Engine/Elements/Control/KeybindSelector/KeybindSelector.i - @echo ... src/Client/GUI/Engine/Elements/Control/KeybindSelector/KeybindSelector.s - @echo ... src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.obj - @echo ... src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.i - @echo ... src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.s - @echo ... src/Client/GUI/Engine/Elements/Control/RoundedButton/RoundedButton.obj - @echo ... src/Client/GUI/Engine/Elements/Control/RoundedButton/RoundedButton.i - @echo ... src/Client/GUI/Engine/Elements/Control/RoundedButton/RoundedButton.s - @echo ... src/Client/GUI/Engine/Elements/Control/RoundedRadioButton/RoundedRadioButton.obj - @echo ... src/Client/GUI/Engine/Elements/Control/RoundedRadioButton/RoundedRadioButton.i - @echo ... src/Client/GUI/Engine/Elements/Control/RoundedRadioButton/RoundedRadioButton.s - @echo ... src/Client/GUI/Engine/Elements/Control/ScrollBar/ScrollBar.obj - @echo ... src/Client/GUI/Engine/Elements/Control/ScrollBar/ScrollBar.i - @echo ... src/Client/GUI/Engine/Elements/Control/ScrollBar/ScrollBar.s - @echo ... src/Client/GUI/Engine/Elements/Control/SearchBar/SearchBar.obj - @echo ... src/Client/GUI/Engine/Elements/Control/SearchBar/SearchBar.i - @echo ... src/Client/GUI/Engine/Elements/Control/SearchBar/SearchBar.s - @echo ... src/Client/GUI/Engine/Elements/Control/Slider/Slider.obj - @echo ... src/Client/GUI/Engine/Elements/Control/Slider/Slider.i - @echo ... src/Client/GUI/Engine/Elements/Control/Slider/Slider.s - @echo ... src/Client/GUI/Engine/Elements/Control/TextBox/TextBox.obj - @echo ... src/Client/GUI/Engine/Elements/Control/TextBox/TextBox.i - @echo ... src/Client/GUI/Engine/Elements/Control/TextBox/TextBox.s - @echo ... src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.obj - @echo ... src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.i - @echo ... src/Client/GUI/Engine/Elements/Control/Toggle/Toggle.s - @echo ... src/Client/GUI/Engine/Elements/Control/Tooltip/Tooltip.obj - @echo ... src/Client/GUI/Engine/Elements/Control/Tooltip/Tooltip.i - @echo ... src/Client/GUI/Engine/Elements/Control/Tooltip/Tooltip.s - @echo ... src/Client/GUI/Engine/Elements/Shapes/Circle/Circle.obj - @echo ... src/Client/GUI/Engine/Elements/Shapes/Circle/Circle.i - @echo ... src/Client/GUI/Engine/Elements/Shapes/Circle/Circle.s - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/BlurRect/BlurRect.obj - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/BlurRect/BlurRect.i - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/BlurRect/BlurRect.s - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/InnerShadowRect/InnerShadowRect.obj - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/InnerShadowRect/InnerShadowRect.i - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/InnerShadowRect/InnerShadowRect.s - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedHollowRect/RoundedHollowRect.obj - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedHollowRect/RoundedHollowRect.i - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedHollowRect/RoundedHollowRect.s - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRect/RoundedRect.obj - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRect/RoundedRect.i - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRect/RoundedRect.s - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRectWithImageAndText/RoundedRectWithImageAndText.obj - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRectWithImageAndText/RoundedRectWithImageAndText.i - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRectWithImageAndText/RoundedRectWithImageAndText.s - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/ShadowRect/ShadowRect.obj - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/ShadowRect/ShadowRect.i - @echo ... src/Client/GUI/Engine/Elements/Shapes/Rect/ShadowRect/ShadowRect.s - @echo ... src/Client/GUI/Engine/Elements/Utils/ConvertImageToBitmap.obj - @echo ... src/Client/GUI/Engine/Elements/Utils/ConvertImageToBitmap.i - @echo ... src/Client/GUI/Engine/Elements/Utils/ConvertImageToBitmap.s - @echo ... src/Client/GUI/Engine/Elements/Utils/FontManager/FontManager.obj - @echo ... src/Client/GUI/Engine/Elements/Utils/FontManager/FontManager.i - @echo ... src/Client/GUI/Engine/Elements/Utils/FontManager/FontManager.s - @echo ... src/Client/GUI/Engine/Elements/Windows/ColorPickerWindow/ColorPickerWindow.obj - @echo ... src/Client/GUI/Engine/Elements/Windows/ColorPickerWindow/ColorPickerWindow.i - @echo ... src/Client/GUI/Engine/Elements/Windows/ColorPickerWindow/ColorPickerWindow.s - @echo ... src/Client/GUI/Engine/Engine.obj - @echo ... src/Client/GUI/Engine/Engine.i - @echo ... src/Client/GUI/Engine/Engine.s - @echo ... src/Client/Hook/Hooks/Game/ActorBaseTick.obj - @echo ... src/Client/Hook/Hooks/Game/ActorBaseTick.i - @echo ... src/Client/Hook/Hooks/Game/ActorBaseTick.s - @echo ... src/Client/Hook/Hooks/Game/GameModeAttack.obj - @echo ... src/Client/Hook/Hooks/Game/GameModeAttack.i - @echo ... src/Client/Hook/Hooks/Game/GameModeAttack.s - @echo ... src/Client/Hook/Hooks/Game/OnSuspend.obj - @echo ... src/Client/Hook/Hooks/Game/OnSuspend.i - @echo ... src/Client/Hook/Hooks/Game/OnSuspend.s - @echo ... src/Client/Hook/Hooks/Game/PacketHooks.obj - @echo ... src/Client/Hook/Hooks/Game/PacketHooks.i - @echo ... src/Client/Hook/Hooks/Game/PacketHooks.s - @echo ... src/Client/Hook/Hooks/Game/RaknetTick.obj - @echo ... src/Client/Hook/Hooks/Game/RaknetTick.i - @echo ... src/Client/Hook/Hooks/Game/RaknetTick.s - @echo ... src/Client/Hook/Hooks/Game/RenderItemGroup.obj - @echo ... src/Client/Hook/Hooks/Game/RenderItemGroup.i - @echo ... src/Client/Hook/Hooks/Game/RenderItemGroup.s - @echo ... src/Client/Hook/Hooks/Game/getViewPerspective.obj - @echo ... src/Client/Hook/Hooks/Game/getViewPerspective.i - @echo ... src/Client/Hook/Hooks/Game/getViewPerspective.s - @echo ... src/Client/Hook/Hooks/Hook.obj - @echo ... src/Client/Hook/Hooks/Hook.i - @echo ... src/Client/Hook/Hooks/Hook.s - @echo ... src/Client/Hook/Hooks/Input/KeyHook.obj - @echo ... src/Client/Hook/Hooks/Input/KeyHook.i - @echo ... src/Client/Hook/Hooks/Input/KeyHook.s - @echo ... src/Client/Hook/Hooks/Input/MouseHook.obj - @echo ... src/Client/Hook/Hooks/Input/MouseHook.i - @echo ... src/Client/Hook/Hooks/Input/MouseHook.s - @echo ... src/Client/Hook/Hooks/Render/CommandListHook.obj - @echo ... src/Client/Hook/Hooks/Render/CommandListHook.i - @echo ... src/Client/Hook/Hooks/Render/CommandListHook.s - @echo ... src/Client/Hook/Hooks/Render/ResizeHook.obj - @echo ... src/Client/Hook/Hooks/Render/ResizeHook.i - @echo ... src/Client/Hook/Hooks/Render/ResizeHook.s - @echo ... src/Client/Hook/Hooks/Render/SwapchainHook.obj - @echo ... src/Client/Hook/Hooks/Render/SwapchainHook.i - @echo ... src/Client/Hook/Hooks/Render/SwapchainHook.s - @echo ... src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.obj - @echo ... src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.i - @echo ... src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.s - @echo ... src/Client/Hook/Manager.obj - @echo ... src/Client/Hook/Manager.i - @echo ... src/Client/Hook/Manager.s - @echo ... src/Client/Module/Manager.obj - @echo ... src/Client/Module/Manager.i - @echo ... src/Client/Module/Manager.s - @echo ... src/Client/Module/Modules/Hitbox/HitboxListener.obj - @echo ... src/Client/Module/Modules/Hitbox/HitboxListener.i - @echo ... src/Client/Module/Modules/Hitbox/HitboxListener.s - @echo ... src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.obj - @echo ... src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.i - @echo ... src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.s - @echo ... src/Client/Module/Modules/Module.obj - @echo ... src/Client/Module/Modules/Module.i - @echo ... src/Client/Module/Modules/Module.s - @echo ... src/SDK/Client/Actor/Actor.obj - @echo ... src/SDK/Client/Actor/Actor.i - @echo ... src/SDK/Client/Actor/Actor.s - @echo ... src/SDK/Client/Actor/ItemActor.obj - @echo ... src/SDK/Client/Actor/ItemActor.i - @echo ... src/SDK/Client/Actor/ItemActor.s - @echo ... src/SDK/Client/Block/BlockSource.obj - @echo ... src/SDK/Client/Block/BlockSource.i - @echo ... src/SDK/Client/Block/BlockSource.s - @echo ... src/SDK/Client/Container/Inventory.obj - @echo ... src/SDK/Client/Container/Inventory.i - @echo ... src/SDK/Client/Container/Inventory.s - @echo ... src/SDK/Client/Core/ClientInstance.obj - @echo ... src/SDK/Client/Core/ClientInstance.i - @echo ... src/SDK/Client/Core/ClientInstance.s - @echo ... src/SDK/Client/Item/ItemStack.obj - @echo ... src/SDK/Client/Item/ItemStack.i - @echo ... src/SDK/Client/Item/ItemStack.s - @echo ... src/SDK/Client/Level/HitResult.obj - @echo ... src/SDK/Client/Level/HitResult.i - @echo ... src/SDK/Client/Level/HitResult.s - @echo ... src/SDK/Client/Network/Packet/Packet.obj - @echo ... src/SDK/Client/Network/Packet/Packet.i - @echo ... src/SDK/Client/Network/Packet/Packet.s - @echo ... src/SDK/Client/Render/BaseActorRenderContext.obj - @echo ... src/SDK/Client/Render/BaseActorRenderContext.i - @echo ... src/SDK/Client/Render/BaseActorRenderContext.s - @echo ... src/SDK/Client/Render/GuiData.obj - @echo ... src/SDK/Client/Render/GuiData.i - @echo ... src/SDK/Client/Render/GuiData.s - @echo ... src/SDK/Client/Render/ItemRenderer.obj - @echo ... src/SDK/Client/Render/ItemRenderer.i - @echo ... src/SDK/Client/Render/ItemRenderer.s - @echo ... src/SDK/Client/Render/Matrix.obj - @echo ... src/SDK/Client/Render/Matrix.i - @echo ... src/SDK/Client/Render/Matrix.s - @echo ... src/SDK/Client/Render/Tessellator/MeshHelpers.obj - @echo ... src/SDK/Client/Render/Tessellator/MeshHelpers.i - @echo ... src/SDK/Client/Render/Tessellator/MeshHelpers.s - @echo ... src/SDK/Client/Render/Tessellator/RenderMaterialGroup.obj - @echo ... src/SDK/Client/Render/Tessellator/RenderMaterialGroup.i - @echo ... src/SDK/Client/Render/Tessellator/RenderMaterialGroup.s - @echo ... src/SDK/SDK.obj - @echo ... src/SDK/SDK.i - @echo ... src/SDK/SDK.s - @echo ... src/Utils/Logger/Logger.obj - @echo ... src/Utils/Logger/Logger.i - @echo ... src/Utils/Logger/Logger.s - @echo ... src/Utils/Logger/crashlogs.obj - @echo ... src/Utils/Logger/crashlogs.i - @echo ... src/Utils/Logger/crashlogs.s - @echo ... src/Utils/Memory/CustomAllocator/Buffer.obj - @echo ... src/Utils/Memory/CustomAllocator/Buffer.i - @echo ... src/Utils/Memory/CustomAllocator/Buffer.s - @echo ... src/Utils/Memory/Game/Offset/OffsetInit.obj - @echo ... src/Utils/Memory/Game/Offset/OffsetInit.i - @echo ... src/Utils/Memory/Game/Offset/OffsetInit.s - @echo ... src/Utils/Memory/Game/Sig/SigInit.obj - @echo ... src/Utils/Memory/Game/Sig/SigInit.i - @echo ... src/Utils/Memory/Game/Sig/SigInit.s - @echo ... src/Utils/Memory/Game/SignatureAndOffsetManager.obj - @echo ... src/Utils/Memory/Game/SignatureAndOffsetManager.i - @echo ... src/Utils/Memory/Game/SignatureAndOffsetManager.s - @echo ... src/Utils/Render/DrawUtils.obj - @echo ... src/Utils/Render/DrawUtils.i - @echo ... src/Utils/Render/DrawUtils.s - @echo ... src/Utils/Render/MaterialUtils.obj - @echo ... src/Utils/Render/MaterialUtils.i - @echo ... src/Utils/Render/MaterialUtils.s - @echo ... src/Utils/Render/PositionUtils.obj - @echo ... src/Utils/Render/PositionUtils.i - @echo ... src/Utils/Render/PositionUtils.s - @echo ... src/Utils/Utils.obj - @echo ... src/Utils/Utils.i - @echo ... src/Utils/Utils.s - @echo ... src/Utils/Versions/VersionUtils.obj - @echo ... src/Utils/Versions/VersionUtils.i - @echo ... src/Utils/Versions/VersionUtils.s - @echo ... src/Utils/Versions/WinrtUtils.obj - @echo ... src/Utils/Versions/WinrtUtils.i - @echo ... src/Utils/Versions/WinrtUtils.s -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 0 -.PHONY : cmake_check_build_system - From 6ce7ac7dc7b4dd2e1a1a7789f72457206a3de362 Mon Sep 17 00:00:00 2001 From: chyves <82107846+notchyves@users.noreply.github.com> Date: Mon, 19 Aug 2024 20:23:32 -0400 Subject: [PATCH 132/240] #neverforgetwhatchyvesdid smh :( --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 29e257f5..07b93255 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,5 @@ localextras/ _deps/ *.pdb *.dll -*.ilk \ No newline at end of file +*.ilk +Makefile From 93cc37013e07a8ca89fc4b50f01572602004aa72 Mon Sep 17 00:00:00 2001 From: chyves Date: Mon, 19 Aug 2024 21:37:59 -0400 Subject: [PATCH 133/240] item physics slightly reworked --- .../Module/Modules/ItemPhysics/ItemPhysicsListener.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp index 1b8fe320..64e1a8c9 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp @@ -98,7 +98,7 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo vec.z = std::fmod(vec.z + sign.z * (1.f / MC::fps) * speed * zMul, 360.f); } - const Vec3 targetVec = (yMod < 0.1) ? Vec3(90.f, vec.y, vec.z) : vec; + const Vec3 targetVec = (yMod < 0.1f) ? Vec3(90.f, vec.y, vec.z) : vec; if (curr->isOnGround()) { if (curr->getStack().block == nullptr) { @@ -108,7 +108,7 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo const Vec3 targetPos = renderData->position; - const float lerpFactor = 0.1f; + const float lerpFactor = 0.2f; vec.x = lerp(vec.x, targetVec.x, lerpFactor); vec.y = lerp(vec.y, targetVec.y, lerpFactor); @@ -118,13 +118,13 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo pos.y = lerp(pos.y, targetPos.y, lerpFactor); pos.z = lerp(pos.z, targetPos.z, lerpFactor); - mat = translate(mat, { pos.x, pos.y, pos.z }); glm_rotate(mat, vec.x, 1.f, 0.f, 0.f); glm_rotate(mat, vec.y, 0.f, 1.f, 0.f); glm_rotate(mat, vec.z, 0.f, 0.f, 1.f); } + void ItemPhysicsListener::onSetupAndRender(SetupAndRenderEvent& event) { static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); if (!mod->isEnabled()) return; From 90b5b524262295719b460fa17df1d93224c1cc98 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 25 Aug 2024 21:39:49 +0600 Subject: [PATCH 134/240] Reapply "future OpenCV stuff" This reverts commit f678d51366d0e4ea704e2f2b0b54e3c6066d7473. --- CMakeLists.txt | 13 +- README.md | 6 + src/Client/GUI/Engine/Effects/Blur/blur.cpp | 405 +++--------------- .../GUI/Engine/Effects/Blur/blur_dx12.cpp | 220 ---------- src/Client/GUI/Engine/Engine.hpp | 45 +- .../Hook/Hooks/Render/SwapchainHook.cpp | 1 - .../Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- 7 files changed, 86 insertions(+), 606 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 300ccc61..47237d1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,15 +87,22 @@ endif() add_library(MinHook SHARED IMPORTED GLOBAL) set_target_properties(MinHook PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/minhook/minhook.lib") + FetchContent_Declare( libhat GIT_REPOSITORY https://github.com/BasedInc/libhat.git - GIT_TAG 9ef05d6961ce37a4c801f11159de895aa21878a9 + GIT_TAG f4755aea0987e77c0f6f496c49eb9cd08d5f5a06 + GIT_SHALLOW TRUE + GIT_PROGRESS TRUE ) FetchContent_MakeAvailable(libhat) +set(OpenCV_DIR C:/opencv/opencv/build/) +find_package(OpenCV REQUIRED) +target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS} libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) +target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) -target_link_libraries(${PROJECT_NAME} PRIVATE libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) -target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) \ No newline at end of file +set(CPACK_PROJECT_NAME ${PROJECT_NAME}) +set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) \ No newline at end of file diff --git a/README.md b/README.md index d1a2444c..efd337a6 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,12 @@ If you encounter issues, check out our [FAQ](https://discord.gg/flarial-communit 2. **Git**: Install Git if you haven't already. You can download Git from [git-scm.com](https://git-scm.com/downloads) and follow the installation instructions. + + +3. **OpenCV**: Install [OpenCV](https://opencv.org/releases). Click the "Windows" option and follow these instructions: + - When running the installer, make sure you choose the path to be "C:/opencv" + - Add the path C:\opencv\opencv\build\x64\vc16\bin to your Environment Variables (PATH) for it to work properly + - You are good to go! You can now build Flarial. ### Steps to Clone and Build the Project: 1. **Clone the Repository**: diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 5daf4cbb..0ec778db 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -1,373 +1,92 @@ +#pragma once #include #include #include +#include +#include #include "../../Engine.hpp" #include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" #include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" -// CREDITS @MR CHIPS (@chyves) -#define BLUR_OFFSET 10 -static const XMFLOAT4 quadVertices[] = - { - XMFLOAT4(1.0, -1.0, 0.0, 1.0), - XMFLOAT4(-1.0, -1.0, 0.0, 1.0), - XMFLOAT4(-1.0, 1.0, 0.0, 1.0), - XMFLOAT4(-1.0, 1.0, 0.0, 1.0), - XMFLOAT4(1.0, 1.0, 0.0, 1.0), - XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; +void Blur::RenderBlur(ID3D11Texture2D* inputTexture, ID3D11Device* device, ID3D11DeviceContext* deviceContext) { + ID3D11ShaderResourceView* inputSRV = nullptr; + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = 1; + srvDesc.Texture2D.MostDetailedMip = 0; + device->CreateShaderResourceView(inputTexture, &srvDesc, &inputSRV); -const char *vertexShaderSrc = "struct VS_INPUT {\ - float4 pos : POSITION;\ -};\ -\ -float4 main(VS_INPUT input) : SV_POSITION {\ - return input.pos;\ -}"; + D3D11_TEXTURE2D_DESC inputDesc; + inputTexture->GetDesc(&inputDesc); -const char *downsampleShaderSrc = R"( -cbuffer BlurInputBuffer : register(b0) -{ - float2 resolution; - float2 offset; - float2 halfPixel; -}; + D3D11_MAPPED_SUBRESOURCE mappedResource; + deviceContext->Map(inputTexture, 0, D3D11_MAP_READ, 0, &mappedResource); -sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); + cv::Mat src(inputDesc.Height, inputDesc.Width, CV_8UC4, mappedResource.pData, mappedResource.RowPitch); + deviceContext->Unmap(inputTexture, 0); -float4 main(float4 screenSpace : SV_Position) : SV_TARGET -{ - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + cv::Mat dst = ImageProcessor::ApplyGaussianBlur(src, 15); - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; + ID3D11Texture2D* texture_blur = ImageProcessor::LoadTextureFromMat(dst, device, deviceContext); - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 - }; + ID3D11ShaderResourceView* texture_srv = nullptr; + device->CreateShaderResourceView(texture_blur, &srvDesc, &texture_srv); - float weightSum = 0.0; - for (int i = 0; i < 9; i++) - { - weightSum += weights[i]; - } - - for (int i = 0; i < 9; i++) - { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); - } + ImGui::Image(texture_srv, ImVec2(dst.cols, dst.rows)); - return colorSum; + if (inputSRV) inputSRV->Release(); + if (texture_srv) texture_srv->Release(); + if (texture_blur) texture_blur->Release(); } -)"; - -const char *upsampleShaderSrc = R"( -cbuffer BlurInputBuffer : register(b0) -{ - float2 resolution; - float2 offset; - float2 halfPixel; -}; - -sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); - -float4 main(float4 screenSpace : SV_Position) : SV_TARGET -{ - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; - - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 - }; - float weightSum = 0.0; - for (int i = 0; i < 9; i++) - { - weightSum += weights[i]; - } - - for (int i = 0; i < 9; i++) - { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); - } - - return colorSum; +cv::Mat ImageProcessor::ApplyGaussianBlur(const cv::Mat& src, double sigma) { + cv::Mat dst; + GaussianBlur(src, dst, cv::Size(0, 0), sigma); + return dst; } -)"; - - - -const char *dbgDrawTextureShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ -{\ - float2 resolution;\ - float2 offset;\ - float2 halfpixel;\ -};\ -struct PS_INPUT {\ - float4 pos : POSITION;\ -};\ -sampler sampler0 : register(s0);\ -Texture2D texture0 : register(t0);\ -\ -float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET {\ - float2 uv = screenSpace.xy / resolution;\ - return texture0.Sample(sampler0, uv);\ -}"; -ID3DBlob *TryCompileShader(const char *pSrcData, const char *pTarget) -{ - HRESULT hr; +ID3D11Texture2D* ImageProcessor::LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context) { + if (mat.empty() || device == nullptr || context == nullptr) return nullptr; - ID3DBlob *shaderBlob; - ID3DBlob *errorBlob; - hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); - - if (FAILED(hr)) - { - Logger::error("[Blur] Failed to compile shader"); - errorBlob->Release(); - throw std::logic_error("Failed to compile shader!"); + cv::Mat matBGRA; + if (mat.channels() == 3) { + cvtColor(mat, matBGRA, cv::COLOR_BGR2BGRA); } - return shaderBlob; -} - -ID3D11PixelShader *dbgShader; - -void Blur::InitializePipeline() -{ - - HRESULT hr; - ID3D11DeviceContext* pContext = SwapchainHook::context; - - // byteWidth has to be a multiple of 32, BlurInputBuffer has a size of 24 - CD3D11_BUFFER_DESC cbd( - sizeof(BlurInputBuffer), - D3D11_BIND_CONSTANT_BUFFER); - CD3D11_BUFFER_DESC cbdVertex( - sizeof(quadVertices), - D3D11_BIND_VERTEX_BUFFER); - - SwapchainHook::d3d11Device->CreateBuffer( - &cbd, - nullptr, - &pConstantBuffer); - - D3D11_SUBRESOURCE_DATA vertexBufferData = {quadVertices, 0, 0}; - - SwapchainHook::d3d11Device->CreateBuffer( - &cbdVertex, - &vertexBufferData, - &pVertexBuffer); - - ID3DBlob *shaderBlob = TryCompileShader(upsampleShaderSrc, "ps_4_0"); - SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pUpsampleShader); - - shaderBlob = TryCompileShader(downsampleShaderSrc, "ps_4_0"); - SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pDownsampleShader); - - shaderBlob = TryCompileShader(dbgDrawTextureShaderSrc, "ps_4_0"); - SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &dbgShader); - - shaderBlob = TryCompileShader(vertexShaderSrc, "vs_4_0"); - SwapchainHook::d3d11Device->CreateVertexShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pVertexShader); - - D3D11_INPUT_ELEMENT_DESC ied = - {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, - 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}; - SwapchainHook::d3d11Device->CreateInputLayout(&ied, 1, shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &pInputLayout); - D3D11_SAMPLER_DESC sd{}; - sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - sd.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - SwapchainHook::d3d11Device->CreateSamplerState(&sd, &pSampler); - -} -void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderResourceView *pShaderResourceView, XMFLOAT2 rtvSize) -{ - HRESULT hr; - ID3D11DeviceContext* pContext = SwapchainHook::context; - D3D11_DEPTH_STENCIL_DESC dsd{}; - dsd.DepthEnable = false; - dsd.StencilEnable = false; - ID3D11DepthStencilState *pDepthStencilState; - hr = SwapchainHook::d3d11Device->CreateDepthStencilState(&dsd, &pDepthStencilState); - if (FAILED(hr)) { pContext->Release(); return; } - pContext->OMSetDepthStencilState(pDepthStencilState, 0); - - void *null = nullptr; - pContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView **)&null); - pContext->OMSetRenderTargets(1, &pRenderTargetView, nullptr); - - constantBuffer.resolution = rtvSize; - constantBuffer.halfpixel = XMFLOAT2(0.5 / rtvSize.x, 0.5 / rtvSize.y); - pContext->UpdateSubresource(pConstantBuffer, 0, nullptr, &constantBuffer, 0, 0); - - pContext->IASetInputLayout(pInputLayout); - UINT stride = sizeof(XMFLOAT4); - UINT offset = 0; - - pContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - pContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0); - pContext->VSSetShader(pVertexShader, nullptr, 0); - pContext->PSSetSamplers(0, 1, &pSampler); - pContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); - D3D11_BLEND_DESC bd{}; - ZeroMemory(&bd, sizeof(bd)); - bd.AlphaToCoverageEnable = false; - bd.RenderTarget[0].BlendEnable = true; - bd.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - bd.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; - bd.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - bd.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - bd.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; - bd.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - bd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - ID3D11BlendState *pBlendState; - hr = SwapchainHook::d3d11Device->CreateBlendState(&bd, &pBlendState); - if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); return; } - pContext->OMSetBlendState(pBlendState, NULL, 0xffffffff); - D3D11_RASTERIZER_DESC rd{}; - rd.FillMode = D3D11_FILL_SOLID; - rd.CullMode = D3D11_CULL_NONE; - rd.DepthClipEnable = false; - rd.ScissorEnable = false; - ID3D11RasterizerState *pRasterizerState; - hr = SwapchainHook::d3d11Device->CreateRasterizerState(&rd, &pRasterizerState); - if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); pBlendState->Release(); return; } - pContext->RSSetState(pRasterizerState); - - pContext->PSSetShaderResources(0, 1, &pShaderResourceView); - D3D11_VIEWPORT viewport{}; - viewport.TopLeftX = 0; - viewport.TopLeftY = 0; - viewport.Width = rtvSize.x; - viewport.Height = rtvSize.y; - viewport.MaxDepth = 1.0f; - - FLOAT backgroundColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - pContext->ClearRenderTargetView(pRenderTargetView, backgroundColor); - pContext->RSSetViewports(1, &viewport); - pContext->Draw(sizeof(quadVertices) / sizeof(quadVertices[0]), 0); - ID3D11RenderTargetView* kajgd = nullptr; - pContext->OMSetRenderTargets(1, &kajgd, nullptr); - - pDepthStencilState->Release(); - pBlendState->Release(); - pRasterizerState->Release(); -} - -void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) -{ - - if(intensity < 1) return; - - if (!SwapchainHook::GetBackbuffer()) return; - - ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); - if (!pOrigShaderResourceView) return; - - ID3D11DeviceContext* pContext = SwapchainHook::context; - - std::vector framebuffers; - std::vector renderTargetViews; - std::vector shaderResourceViews; - std::vector fbSizes; - D3D11_TEXTURE2D_DESC desc; - SwapchainHook::GetBackbuffer()->GetDesc(&desc); - - framebuffers.reserve((size_t)iterations); - renderTargetViews.reserve((size_t)iterations); - - D3D11_SHADER_RESOURCE_VIEW_DESC srvd{}; - srvd.Format = desc.Format; - srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvd.Texture2D.MipLevels = 1; - - desc.BindFlags |= D3D11_BIND_RENDER_TARGET; - - for (int i = 0; i <= iterations; i++) - { - ID3D11Texture2D *pFrameBuffer; - ID3D11RenderTargetView *pRenderTargetView; - ID3D11ShaderResourceView *pShaderResourceView; - - SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); - if (i == 0) - pRenderTargetView = pDstRenderTargetView; - else - SwapchainHook::d3d11Device->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); - SwapchainHook::d3d11Device->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); - - framebuffers.push_back(pFrameBuffer); - renderTargetViews.push_back(pRenderTargetView); - shaderResourceViews.push_back(pShaderResourceView); - fbSizes.push_back(XMFLOAT2(desc.Width, desc.Height)); - - desc.Width /= 2; - desc.Height /= 2; + else if (mat.channels() == 4) { + matBGRA = mat; } - - constantBuffer.offset = XMFLOAT2(intensity * 3, intensity * 3); - pContext->PSSetShader(pDownsampleShader, nullptr, 0); - RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); - - for (int i = 1; i < iterations; i++) - { - RenderToRTV(renderTargetViews[i + 1], shaderResourceViews[i], fbSizes[i + 1]); + else { + return nullptr; } - pContext->PSSetShader(pUpsampleShader, nullptr, 0); - - for (int i = iterations; i > 0; i--) - { - RenderToRTV(renderTargetViews[i - 1], shaderResourceViews[i], fbSizes[i - 1]); + D3D11_TEXTURE2D_DESC desc = {}; + desc.Width = matBGRA.cols; + desc.Height = matBGRA.rows; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + + ID3D11Texture2D* texture = nullptr; + HRESULT hr = device->CreateTexture2D(&desc, nullptr, &texture); + if (FAILED(hr)) return nullptr; + + D3D11_MAPPED_SUBRESOURCE mappedResource; + hr = context->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (FAILED(hr)) return nullptr; + + for (int y = 0; y < matBGRA.rows; ++y) { + memcpy(static_cast(mappedResource.pData) + y * mappedResource.RowPitch, matBGRA.ptr(y), matBGRA.cols * 4); } - for (int i = 0; i < iterations; i++) - { - - if (i != 0) - renderTargetViews[i]->Release(); - framebuffers[i]->Release(); - shaderResourceViews[i]->Release(); - - renderTargetViews.clear(); - framebuffers.clear(); - shaderResourceViews.clear(); - fbSizes.clear(); - } + context->Unmap(texture, 0); - pContext->Release(); - pOrigShaderResourceView->Release(); + return texture; } \ No newline at end of file diff --git a/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp b/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp index 53a38860..e69de29b 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp @@ -1,220 +0,0 @@ -/*#include -#include -#include -#include -#include -#include -#include "../../Engine.hpp" -#include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" -#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" - -static const XMFLOAT4 quadVertices[] = - { - XMFLOAT4(1.0, -1.0, 0.0, 1.0), - XMFLOAT4(-1.0, -1.0, 0.0, 1.0), - XMFLOAT4(-1.0, 1.0, 0.0, 1.0), - XMFLOAT4(-1.0, 1.0, 0.0, 1.0), - XMFLOAT4(1.0, 1.0, 0.0, 1.0), - XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; - -const char *vertexShaderSrc = "struct VS_INPUT {\ - float4 pos : POSITION;\ -};\ -\ -float4 main(VS_INPUT input) : SV_POSITION {\ - return input.pos;\ -}"; - -const char *downsampleShaderSrc = R"( -cbuffer BlurInputBuffer : register(b0) -{ - float2 resolution; - float2 offset; - float2 halfPixel; -}; - -sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); - -float4 main(float4 screenSpace : SV_Position) : SV_TARGET -{ - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; - - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 - }; - - float weightSum = 0.0; - for (int i = 0; i < 9; i++) - { - weightSum += weights[i]; - } - - for (int i = 0; i < 9; i++) - { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); - } - - return colorSum; -} -)"; - -const char *upsampleShaderSrc = R"( -cbuffer BlurInputBuffer : register(b0) -{ - float2 resolution; - float2 offset; - float2 halfPixel; -}; - -sampler sampler0 : register(s0); -Texture2D texture0 : register(t0); - -float4 main(float4 screenSpace : SV_Position) : SV_TARGET -{ - float2 uv = screenSpace.xy / resolution; - float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - - static const float2 offsets[9] = { - float2(-1.0, -1.0) * halfPixel * offset, - float2(0.0, -1.0) * halfPixel * offset, - float2(1.0, -1.0) * halfPixel * offset, - float2(-1.0, 0.0) * halfPixel * offset, - float2(0.0, 0.0) * halfPixel * offset, - float2(1.0, 0.0) * halfPixel * offset, - float2(-1.0, 1.0) * halfPixel * offset, - float2(0.0, 1.0) * halfPixel * offset, - float2(1.0, 1.0) * halfPixel * offset - }; - - static const float weights[9] = { - 0.06136, 0.12245, 0.06136, - 0.12245, 0.24477, 0.12245, - 0.06136, 0.12245, 0.06136 - }; - - float weightSum = 0.0; - for (int i = 0; i < 9; i++) - { - weightSum += weights[i]; - } - - for (int i = 0; i < 9; i++) - { - colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); - } - - return colorSum; -} -)"; - - -ID3DBlob* TryCompileShader(const char* pSrcData, const char* pTarget) -{ - HRESULT hr; - - ID3DBlob* shaderBlob; - ID3DBlob* errorBlob; - hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); - - if (FAILED(hr)) - { - Logger::error("[Blur] Failed to compile shader"); - errorBlob->Release(); - throw std::logic_error("Failed to compile shader!"); - } - return shaderBlob; -} - -ID3D12PipelineState* dbgShader; - -void Blur::InitializePipeline() -{ - HRESULT hr; - ID3D12Device* pDevice = SwapchainHook::d3d12Device5; - ID3D12GraphicsCommandList* pCommandList = SwapchainHook::d3d12CommandList; - - // Create constant buffer - D3D12_HEAP_PROPERTIES heapProps = {}; - heapProps.Type = D3D12_HEAP_TYPE_UPLOAD; - heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; - heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; - - D3D12_RESOURCE_DESC resourceDesc = {}; - resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; - resourceDesc.Width = sizeof(BlurInputBuffer); - resourceDesc.Height = 1; - resourceDesc.DepthOrArraySize = 1; - resourceDesc.MipLevels = 1; - resourceDesc.Format = DXGI_FORMAT_UNKNOWN; - resourceDesc.SampleDesc.Count = 1; - resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; - - pDevice->CreateCommittedResource( - &heapProps, - D3D12_HEAP_FLAG_NONE, - &resourceDesc, - D3D12_RESOURCE_STATE_GENERIC_READ, - nullptr, - IID_PPV_ARGS(&pConstantBuffer)); - - // Create vertex buffer - resourceDesc.Width = sizeof(quadVertices); - pDevice->CreateCommittedResource( - &heapProps, - D3D12_HEAP_FLAG_NONE, - &resourceDesc, - D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER, - nullptr, - IID_PPV_ARGS(&pVertexBuffer)); - - // Compile shaders - ID3DBlob* vertexShaderBlob = TryCompileShader(vertexShaderSrc, "vs_5_0"); - ID3DBlob* pixelShaderBlob = TryCompileShader(upsampleShaderSrc, "ps_5_0"); - - // Create root signature - D3D12_ROOT_SIGNATURE_DESC rootSignatureDesc = {}; - rootSignatureDesc.NumParameters = 0; - rootSignatureDesc.pParameters = nullptr; - rootSignatureDesc.NumStaticSamplers = 0; - rootSignatureDesc.pStaticSamplers = nullptr; - rootSignatureDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; - - ID3DBlob* signature; - ID3DBlob* error; - D3D12SerializeRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error); - pDevice->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&pRootSignature)); - - // Create pipeline state object - D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; - psoDesc.InputLayout = { inputElementDescs, _countof(inputElementDescs) }; - psoDesc.pRootSignature = pRootSignature; - psoDesc.VS = CD3DX12_SHADER_BYTECODE(vertexShaderBlob); - psoDesc.PS = CD3DX12_SHADER_BYTECODE(pixelShaderBlob); - psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); - psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT); - psoDesc.DepthStencilState.DepthEnable = FALSE; - psoDesc.DepthStencilState.StencilEnable = FALSE; - psoDesc.SampleMask = UINT_MAX; - psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; - psoDesc.NumRenderTargets = 1; - psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM; - psoDesc.SampleDesc.Count = 1; - - pDevice->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&pUpsampleShader)); -}*/ \ No newline at end of file diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index cf2e9b21..f829e917 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -23,6 +23,7 @@ #include "Elements/Structs/HSV.hpp" #include + using namespace DirectX; struct BlurInputBuffer @@ -37,49 +38,17 @@ struct BlurInputBuffer class Blur { public: - - static inline ID3D11PixelShader *pUpsampleShader = nullptr; - static inline ID3D11PixelShader *pDownsampleShader = nullptr; - static inline ID3D11VertexShader *pVertexShader = nullptr; - static inline ID3D11InputLayout *pInputLayout = nullptr; - - static inline ID3D11SamplerState *pSampler = nullptr; - static inline ID3D11Buffer *pVertexBuffer = nullptr; - static inline ID3D11Buffer *pConstantBuffer = nullptr; - static inline BlurInputBuffer constantBuffer; - - // RAII - static void InitializePipeline(); - //static void Cleanup(); - - static void RenderToRTV(ID3D11RenderTargetView *, ID3D11ShaderResourceView *, XMFLOAT2); - - static void RenderBlur(ID3D11RenderTargetView *, int, float); + static void RenderBlur(ID3D11Texture2D*, ID3D11Device*, ID3D11DeviceContext*); }; -class BlurDX12 -{ -public: - - static inline ID3D11PixelShader *pUpsampleShader = nullptr; - static inline ID3D11PixelShader *pDownsampleShader = nullptr; - static inline ID3D11VertexShader *pVertexShader = nullptr; - static inline ID3D11InputLayout *pInputLayout = nullptr; - - static inline ID3D11SamplerState *pSampler = nullptr; - static inline ID3D11Buffer *pVertexBuffer = nullptr; - static inline ID3D11Buffer *pConstantBuffer = nullptr; - static inline BlurInputBuffer constantBuffer; - - // RAII - static void InitializePipeline(); - //static void Cleanup(); +#include - static void RenderBlur(ID3D12GraphicsCommandList* commandList); +class ImageProcessor { +public: + static cv::Mat ApplyGaussianBlur(const cv::Mat& src, double sigma); + static ID3D11Texture2D* LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context); }; - - class Dimension { public: float x = 0; diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index f605fc17..04af3a36 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -523,7 +523,6 @@ void SwapchainHook::DX11Init() { SaveBackbuffer(); - Blur::InitializePipeline(); Memory::SafeRelease(eBackBuffer); init = true; } diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index e191b669..ce4231f1 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -128,7 +128,7 @@ class ClickGUIRenderer : public Listener { } - Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); + //Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); From a22f1835abdc48e6c9bb8b7412425722074466a6 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 31 Aug 2024 21:27:51 +0600 Subject: [PATCH 135/240] opencv works on debug mode! --- CMakeLists.txt | 31 +++++-- lib/opencv-d/opencv_core4100d.lib | Bin 0 -> 919374 bytes lib/opencv-d/opencv_highgui4100d.lib | Bin 0 -> 216960 bytes lib/opencv-d/opencv_imgcodecs4100d.lib | Bin 0 -> 167780 bytes lib/opencv-d/opencv_imgproc4100d.lib | Bin 0 -> 335126 bytes lib/opencv-d/opencv_videoio4100d.lib | Bin 0 -> 210864 bytes lib/opencv-d/opencv_world4100d.lib | Bin 0 -> 3775276 bytes src/Client/GUI/Engine/Effects/Blur/blur.cpp | 92 -------------------- src/Client/GUI/Engine/Effects/Blur/blur.hpp | 55 ++++++++++++ src/Client/GUI/Engine/Engine.hpp | 43 +++++++-- 10 files changed, 117 insertions(+), 104 deletions(-) create mode 100644 lib/opencv-d/opencv_core4100d.lib create mode 100644 lib/opencv-d/opencv_highgui4100d.lib create mode 100644 lib/opencv-d/opencv_imgcodecs4100d.lib create mode 100644 lib/opencv-d/opencv_imgproc4100d.lib create mode 100644 lib/opencv-d/opencv_videoio4100d.lib create mode 100644 lib/opencv-d/opencv_world4100d.lib create mode 100644 src/Client/GUI/Engine/Effects/Blur/blur.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 47237d1f..5321c42f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,7 +73,8 @@ endif() file(GLOB_RECURSE sources "main.cpp" "src/**/*.cpp" "src/**/*.hpp" "lib/**/*.cpp") -add_library(${PROJECT_NAME} SHARED ${sources} src/SDK/Client/Render/Matrix.cpp src/Assets/Assets.rc) +add_library(${PROJECT_NAME} SHARED ${sources} src/SDK/Client/Render/Matrix.cpp src/Assets/Assets.rc + src/Client/GUI/Engine/Effects/Blur/blur.hpp) target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lib/include/" "${CMAKE_CURRENT_LIST_DIR}/lib/glm/" "${CMAKE_CURRENT_LIST_DIR}/lib/ImGui") @@ -88,6 +89,23 @@ add_library(MinHook SHARED IMPORTED GLOBAL) set_target_properties(MinHook PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/minhook/minhook.lib") +add_library(OpenCV SHARED IMPORTED GLOBAL) +set_target_properties(OpenCV PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv-d/opencv_imgcodecs4100d.lib") + +add_library(OpenCV2 SHARED IMPORTED GLOBAL) +set_target_properties(OpenCV2 PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv-d/opencv_imgproc4100d.lib") + +add_library(OpenCV3 SHARED IMPORTED GLOBAL) +set_target_properties(OpenCV3 PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv-d/opencv_videoio4100d.lib") + +add_library(OpenCV4 SHARED IMPORTED GLOBAL) +set_target_properties(OpenCV4 PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv-d/opencv_core4100d.lib") + +add_library(OpenCV5 SHARED IMPORTED GLOBAL) +set_target_properties(OpenCV5 PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv-d/opencv_world4100d.lib") + + + FetchContent_Declare( libhat GIT_REPOSITORY https://github.com/BasedInc/libhat.git @@ -101,8 +119,11 @@ FetchContent_MakeAvailable(libhat) set(OpenCV_DIR C:/opencv/opencv/build/) find_package(OpenCV REQUIRED) -target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS} libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) -target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) +message(${OpenCV_LIBS}) +message(${OpenCV_INCLUDE_DIRS}) -set(CPACK_PROJECT_NAME ${PROJECT_NAME}) -set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) \ No newline at end of file +target_link_options(Flarial PRIVATE /NODEFAULTLIB:MSVCRTD) + +target_link_libraries(${PROJECT_NAME} PUBLIC ${OpenCV_LIBS} libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) +target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) +target_include_directories(Flarial PRIVATE ${OpenCV_INCLUDE_DIRS}) diff --git a/lib/opencv-d/opencv_core4100d.lib b/lib/opencv-d/opencv_core4100d.lib new file mode 100644 index 0000000000000000000000000000000000000000..fe68378ba9062410532fe5c6620cfe92bcc02952 GIT binary patch literal 919374 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

s1zs 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∈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 G1-tXwuTOp;RPnl5MhOvl}*>^dcf6 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

v*se2Dzm-FSqkh?lM> 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 Sad|bU<3$>>_9W60^Zx)pKs90j literal 0 HcmV?d00001 diff --git a/lib/opencv-d/opencv_videoio4100d.lib b/lib/opencv-d/opencv_videoio4100d.lib new file mode 100644 index 0000000000000000000000000000000000000000..f68c85ea4565c9752d3c2c5bbeb336e6d3526df3 GIT binary patch literal 210864 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

Djpfz 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�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

uKl>=5Bq~_DB)?gguEkxeEMjxLlP9QwR zeXCh0dhEz0bw+PXDD;sjL}7X4fwkB4bpQT&*x~vg35ERDCc*^XlVE*%ul&gG`04K$ zKD{;Kc|V<1TYJWr4=lyn+IQtoS7T7Apr3`{U-x~n5)r(|L|`=!Yz(_)YvZxg&~ABO zLco<5XGZExl@9NTv1$vJe{uXGtS$I}qKy~tMl~tL$*jY~$f_Q8?=rI6`$Gv+ZSuwo zFNbV)cTB`d9=ZWL=)QFsNluTnmx1m!HJV__RL3m-0{vg zJ}7P-&9al9{b11^w39z3sBkM^ywInso2j62qhVEFZt1;=%merY`_N0BJzW*uon-}8 zk}0SzyCgc??&_9n(g@Ctg*DG;(%8B&Rlu1~ku#-kP@OOhtIkI~o-(|At<}|JSQxuz zRcjr0N#$Iu*7}U_%iYfjjbhD01@8OBN~9`}2va0Vq=<2q;Fs!qSkpG_g%wYc){bJIdl`;Y}-6B0s+%IDLVGm7mX?vTi%_^Gg}$!N5;DBidAN zzh~h@!1)#4p|a8{SV9f4CX*gLS$nH>Xk9wc^gi}E>I>2If2XZPlY9rcmaSCxTcz^P zWjjhC_OB^*v2o>Wh9Rc%y#5ql&Z~sP!OK zPBd?@SjD>NE~`WB$X9c>VTal;Xor?pmK3=v3#!Vy10J8c(8FG4oo|svi_ldY;lgf? zb$0-U!N`qr7)q1Zy%yS>d}2T@l~F2qFnIuB?=Btc+)(=9f<6sw(#Wsr(!m2$$X!t0 z>w|<=zGMjK%&C0PCDOO8<0q?1w)D$=q)K*(N{cJcbs)&$l~a~Z%-hqr8LN7vIx@y7kOv2N~Un|lV;cod&Sg7vl2` zgND}wHKS!}4!#@D>bzcZ{cB^f^Lh+HT~$^o-}S@-kJfRNh0P^CzaO!UCDt;JsMX9llMg;ybvlOt6(_kY5ZQBZtTTigiUHaAA%Msmp8681p z1?#xcvF6yFd5Cv4&as<-=x(TF=Z%Y@vB5%5frUeOwCi-l@vDS`ojJA`2dhqIa);AM z4faID0p3$u`z@)XqLJ+vdtbH^EviWg<0&mIwahMI^*GM{cIbxd0nucNsJJR!9hcM< z(D0|j)-k_h9nlnu<^cDj{yZRKI&xf3J7(XG)=CHy4EW4APX#=a~791YR+usf7m`Uj1dzvk+Kh7{lt4~~8 zzVZgZHcN}GOvLi-1m9;X5wdKXlh)s|0&Sbw6d{lC5CuP4GVGzQYZ1u;8HwItLnKh?WjPX? z-Kbw4f5Ns}03-`#Bt(aEM@eD=B(^w>yxi}gjp3pG(EkDAp)Mk*F&f$Co)|cCD=V5< zsNcA%ej@tSiwSD64i;Ernzc<;SQewspwFWk4d|2i;g}jgy+lPFzXppyLhlv2jG#UW zBE=3YNH%@K`6Ysp`Too2XN?pAQI`&pC~WC)NE2U3f*S`*kfA&XS5ACM zf{;r5tbX4g?{C?J{l3c(KMWdS3`J7S-$ciIaC4URzKcJPUxx4dazw`Kep{$VZH)JQ z+#9dY$M=1O4%>lx-&x(#bL*F{#ct`9h_IJ6$I5GWusn(P&z?UAJ&9EWS4|pgR9R@| zfARp?m%W;zX)W_=s!Vu!!>U0)sbaxgtU+IcSvr>sI_+UP8CiBk^mV4I%xO|c$@}Rn z+u)^pe%^<+!EeY57wlOitAw24mVieZNQRnA>g%y`w-0siG=9;0hpw7~^D@>Nkw8ee z$rqN=DVAfgWf`lOn@<(D-U(RNAr^O?7{$eGP0$_V#Vi?gxZsX%i8HYBNYdVINLyMa zU#vV|(Y^h)V^nIrL`&EK8S-*zv33olTnT#kRzbgDh}2{_;|?a{mN`b8%yaz@D{;2@ z28u|sOQfDBfM2s5A1hdrs>cq$*oN&i$+i=6g78#uv zxMj-;YsUP5SCd-^UX2aBn?mrg;6FW0g^B+J8JJqeuGx;5e%E1&#$YOvF%_i+Q+w~R z(-G5F4JLyhnhVpA2%k#Rg6Z>4gGVE#Z8}V`XICs^DozWgpKrWn2x8iDNlx!*BT^Vz0G<_p8n5U`w`JjEuvTfFOU%xSdGYL zGj=X)*%?|?2Z(lQ5b=1qsf`NRGK`i**Kf}Fy&4ejCWt*AX!{5eW6#wDbKYG6oUEQ# z-$0sZ9jsoED(tY%H!XDHJ!e*g`l9J`S7C&D55*V;qe1Zc+|qLt?iNJ z1XAF~(8VcpOu@?nXRED|liJ$JbtB^GfDsV~EWeg#pnc$zx*>@6M2fbMxug&cu{5J)#fHE$AnBU_rGQC&S|ffHYnn=m@k9nJtSxZL0qM@NW0Y+X2~`GBVuT zM|WyP8a2D}lxYeFL)OTaP1A8IB|Qs%UVJ}La+ZM-D89<~g~+gymV=cdR<>t*?@1#t z+jF)|QGvHXa6lI@W0`Dmv3XfGzus4duc_SaF{*Il%Ydc5jHSC9mVh|QgoxQl0Bpd6 zInP+-(gukkj~e+bc}Sl<)6&?N(hjRq`tn1s&wL#yJtysy=HguJ+Eh|&j80zh;}N6Y z1ZvOKQd=!ngoNfl{^=@?vU<9YKKtd?{{X$`9UyvBe#VR$6(5u>9oqsl|DQ~Asen2j z#s@_t(M0ARUD#v-kz496H8VK+p>^#$H-dO%DKPJVgJHfqoIcip$<383k( zW;E$ckAs*tWz?psDMwGAv-Sm`t%FQkH5&06PYQzzQq@bF4hZZ6vK&$xwr|6MK5A90 z&0%Gwxs9>4Tkf zeT0y_XVM|-O8HCh*Bmgl!qW%mSm@?EJ7FCRqK3nQjo!8TUt|6bqyR0vdmW9Q%Y$3? zPJ0O`yI4<|yz$oQZ@`&_jZKt9`TI<)Xsfd5GyGdD=ENhESBJBF$58X#bI^CZM5dEu zu+4{FU>T8=<&JAAb0ee5PZOj4AalTuazOSEEiw`!NCaMHR+%>}2Gb>l^;axhuisg@9{F{J z0ayBRCM;b0j^Dfkaa|dM%V1umunwy;4TNa!JB)$>Ybt39gr#G3JLXCz)cuR7F$?W38okY8rknUw|Qn3e0rAV)2o75 z{+=2PIn?CRU?})!ynD!+Qx9p^E|;R~8!i<>pwCQG*tqdl%2!pl1O=~@XR9fL8uxC#08Ext%XAB) z5M`F+-2o#}Ye)#wFG8&ie4*Y0@?}AjFM<``_*bAo`e=S8j58N~xPq7bBLa3X!f%r- zAAYA=42piS!3RC!RbnWDpW+Bgd3Y(8PX4b1xft#qwr(R_In$m4gJGe|Hcqr~ zfrYFWNdHr1<$-^79Qh60tFEodiu9t(Vowg!aI2K>YHw7=!N&!o7KC?d-%r4WZmHq| zy30@_bg=P)m3wSze0~?^9=o^33;9OV3SUcTBV&C`9};fg#n#dIqAzNEaq25TUnviL zdOei}QhDD28^iYe<-6ZjqU~9hAf-e|EqdbOA0#(*jM~3vN>^{f+P`uR>e7CU+!D*m zQ9M87hSiv(sL)Vap4VMA&rl6hyR5bdzOR^M)>&k>9GcKkUykU;KJ%UgR5xf){V}b6 zW3B%A&d-ToQ>oHcCc;D&F&qsEe>}g2v0wD~z6C>Z8f2A1VIH{k&>bU9v}wb1JM)%E z?px2meNW9bI}vxa<+!bj@7o!k@&`v;GjLS-ilE8||uRsNe&Ss-FxWR1G{)N_Z)BUz$+v&}0nxBw=ucM`X0mircqpcTC zyA!xrt8lTT$qnH%*jq37{k{ev5UKL`!eKEKF3oj>g@z{hj^07UM-Ep8A$9Rns1|y( zwrpd6^5|3BFMI@O>7l1ZE_w>5ilz)px3$`hbhVtYd6y69>M7F|68lw%{+9d-p5!$- zotVURnajfL3XF?2_(IM*pID4jn|l%DAy0Q9&;Z>gcwu@u6Iw`NDMH3PHQ#36B9#9d zC4?cduRtcL8Ck34oiS2q!*GZaVT57b(p`@!aWrQ)uO?SY-Zh!M;dg(x6nlGbBD93@ z3WxlHyBQ+SN+L$GZ7@$$1DQ|Lq%gOY#mcRnd(^+iVs7nb2~Pzij@%(LDCUm^KNjka zYIxJ-u)^V(E59WXET(MXJtbQfEvHkhyr(a(8FwEb`KN>=>}v=(T=9jA9vbOYRU&1H zJs|Pj25#Q6D!#9qwP-C?e7o9Ak&+PCzlqAXwU4QVJ}sjIVco-v)?x=j?<8r$XFSex z$Io|0kM2V&zub)zo7_oaBy5cXl2_VUyCa%EyJHR*Q_n5HjvjvLme21k@4H zXo7(i_O&?U(W65|%`P0`Nm^X7F2q#CxH&_^gc=-EesJ!>teRJcBesSq6=;-ZI1QT7 zJ!|%N1~h^WjdJl4V+*%bXEFLa@7yBua}TOveePn7rX4UONaVs1UyGaPe~=9 z4N5X7B+r^@3=8ta;j?3Z{XoXP^_uViW&>p18>g6?_f}*ng?;Ml=sf+IdBfrK8~!|f zgIjqZ#ZWnYa?{8ZW*QYk-_J5lnWY%Es!aTR^-rrNf=o1;$^_BatovUd4S2A^2X3@8 z$Jw)1=;skg$&V`t{VlR>B>mSAg62^fIe)5*s9;DS$_&mi7Z2_iBb%|A;pu7LELaZm z;rmlQ{*Zay90(o3^PRX-;g%X!&GHk0UQ4lN`Bp`0q+up`P^b}+S3s8p>P2-sHX1?J z)lp|>8Z!W|{m?jRA4qZ^1(VB7Dx5ehAX>lirx8S}BlI~c5}Z|M#`2X!D9@nbwTP)p z(V1mD)hqi0y|5KU{>be$#zhRJ<1f_{njq=*-*^IvG zBYJu^oewhB)QXI$7Mf8%{b{5f1eU$Qf=x~cEw%NOfRd`yHea=9V>ZZJ;7@tud%1Kf z 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

s1zs zp0)loHA?Lv^XCXB_~`t8afNdo_dlA>p5CTtgNDMM;1No6hE_I^-~pPDo8UONrY>;7 z^21l^G+s~ObSw2Jgb%@4g0!Bv_10UbHQ^dk%K|E#(}U1&W9hNCG;++XDXeE9mX4#( z{HQ7yjvUb88AqyR2VVxZoej^X=j6YMUBKj>6~2Fho4we)n9KOTYR2FatTr9O^^>JW zQI7EQ!S2Pd>U0NqI- zmmOxINK=CXI@EX7DBH8qq?K(&;IYY3VOxzRt!yg-k2-$yjyIO>q^8(t(#p0PP1@L2 zfQ}nlVO#mj$9XRVRt-ly*yz25WPL9kC7Ima*=_sROdb3@8W#srUSm_{U6%OeSE6vF9CiFs!gs_UD8NcyPP zIuR}HoN1%yJ`OSL|1|1{a-%I;Kj=eo7S6uCmbb8EN350t62&sb>si`DDdy0n!WavVK6p8l*<86UMc2hRfsb}rBJiVg?26AWpg|L%O-~JQGa^x;F3W;9 z7h$B6IrdE8{AhvN!raAG6jFy&#)V5job!)Jt&obHk6$$NGV76VP!LOR6v>M|aOGMw z-}FSv#!nD|Whw4#&8ofa?dW0wpY&e^Fl^JI>L><5)Q~FX5Ubne)(3;y!4|6{#Z0#2 zXZ}*#;IbVJl#mI`yE+H&gpXpoKp(bnuowsDPtMLt%51w^BOOaOE_Dlg`R2JOF$I#U z?%>R^#Z6UZ5X0HF$h|4@*S2iW(UU2H=W7ZLIFgjkHY2d~d3p3Qjz*XarY9$JTQFZKx*5h{DP683#L-TA~yC8!-7cVDf1dWSzg z>)ghMgqfBX?$8035HTYKa=Ng{J6a}`!PzAC0k;DymDIURa5{3n*#O+$FE7fLRLBiM zU1M}$%w%Wu-9L2wb)=3Y$ty&E`lBN3TU9P|@fNwen0qxF3>oZio| zJZ*+M$f!3EYKcRZVm*~3>vs#)YH5|J8)kb#;Z)W>@)sx$ShUbvCm-$el_w>|PDIeT z^>QWhVyc?NvY;3@3c9W}qytcuAq^OgbK!0#TU_YZ${|(>2!@bet}0k)B;=G$uC?Vd zg}`P?AeT}SERf0+P8q}&$tiAzx&r!kt<=!f)gkDeBffOV`vyYZiIbO7ktDlMXDzsW zIvXKreQ!($209H=@$={|MXH!XICeM2R^#2_3y%ErjJ!v^0R|E?_`Emk;Uw9(i^Bk2 zDOTJ$YUih;J!k^DH=UkuP6sdG&KJf3j+gbH;OK;5Kh-VA5=(yspE#1+IejP9yM;n_ z-XD3W#^BSl-e}SgJGR5gBt%9bHsI)(gzTAW$>euBWXmBpWsf5jh!Ws+_)LRH#xb3b z>cyUisgio<6eBwC93puhPRJgj2e{RwNU}euaDrh%`FPSjhQKq}gThj=(G`ER)2CI{ zg|JVFM8=z*PqCkLJl*O+FBVJSm3mO!9(_JN?>_Efn~%I0ZgHW|ue+sFuQK$JO;6t^ zbTfH56Dy06_AS=0a~!O5t;+d1Bsmdm?BlRN8#zLq9vJbjz=lwcQ9on|7It1?roFo% zV(Iffp6mXH4MaaQuy?IujZ9vvU=yp?D%Zg9wTji-zE-IQ=C4((i3NN@=xvYf) z-aI+M2$XL~sLBNPy$i5^axP;9-^Yay;mbw58{<&1Ht4z@PDs0=RXm7r=Mq&&q^My)G}foz+WKLp}d z4i%t`UQ2-@_nz};2oVoF5ePd5#9dXC{!@lvhZTlgBa%N&Fo!Gxi;q;3WJ)PF#8(O= zmpp@@PmDfq?wiJ>ETlR^w=fa{8WhcX4EB32wpre`m9 zPbju`jOfTt#K7zTvc$R(r~?FpIE3fpVRw2SsxHS?^5D!j;(Ya*U}7VsHzx$!Q9a^1m#=U%~EVakaQwi#F3o=}ByMCeM?rz=(C$#j-C=1Su( zD5`E>l$MnCrAj%TDSOz9a;tdjdr2o2tv_;2p>dN{MY{_d{w`Wp43}a`qhcd>gh=Rv zE7(ToZGuF6fjD|1A11;D+60RD0?k83xImj=5iZaoT*Sf0P0k050G>{4&MsDC01&#_ zAYHOqycZ`6aY=}rhy+;)4qpRwCPF<730k!ymi` zSq+V1`}%c?QiWo{Z{Sj(kSB^~b8o}W2~6~hzOkz3>>W2f)ix*ui*md>lsIKWZU`aM z>zq-%4oeMy5KDJniMU;uVFSdcqdB_&p1WQZ=Y5k~Rmme2u2rRs3UUNp;R9shLtx-j zifJkDeIi|o<81Zne>!gyKaV`_oJfEN1zCo1MHuyKbPT+Jn!lLz-T2i(L2W-9d8caz zn{jMbn2MoJ2gQ6_-ocW=m>Qs%AEnh8P?7=?Z(A5(mi3qg(@EIOYK`=3CR}McnV(&9 zBFdP;UWkTmE|IQVwQN7XG*YH3T?AIhoZ$(HTJe8 zOC|(qs5LBRHkIGs6i{g7oPI-tELPOd4ElL0{?5xsF^gcy#kDfE=)1!lO%3F*(E zC|Pp}6de9}7~8csi-_?BwCC zgYBVsq9YvCU{2&Ds0pShQ5o2XmeH?_p%3#jQIz>HSbAT~-wnCEFe zmCX$iOfj22!*w-?$Gn)~R)u1*C6vg z6KL%xBcuvDH8H&HF;M^5<&S&wr)JUps#?2tkve+ki1J|vYO_9a6le=;j{8#*?<&V$ zEb09z=LuI)ZUOqh4ymq6?zNy-N{SGcmPEx`w$VVK&iRz_@e~fNA~RT_hnA`zA6k1y zGA9)rmWM?eDOvkwG>+(D1W;38a}vD#&aMLDNE6sLNggdMZM67FhroO|tOD=89Ru$m zg<_$?XDTU`tNHLFyPRSF2)7XzJ`!>SY+X_wSI#dfwr&7_Fm>+!mx}|#yQRW;FLHaLcPw z0dB2Ar0R(s6wtE?x8c+K6X_1@LZr*-wQv<5Os8Y8|H%l+`Gl_uhbh&_3+M-PxVIE= zgt*42p&_ka0isdZ9-j1YNNS^qpNln^Bc5UpOMqz6Aj>I25wsIu6pv+TCErb}OLxuA z^ZpQ*!6U$AgZyoYCyg3h!bI514|d^)!+@PHNR5usVyK}P#-WW))qMb!IwsVCmJyCQ zNU`edo$c5huw zc=v%5Yt6-7+T;?XL8l28m7Jd58(ty~&~lkm7GikR9RQVmw7#CqQRi~cBcU~aJHn%e zq|W)#TJYeGaG$IuER4F%A?6#2=Qj};JA_IRV#PxNs`IT^V$T7L|U3xN_4Yv@%&js9uW}$V8i0Z`sjuMgz{o~MI;o!)&z@S>-|`* z$NqR~*zaM}_a^x+OSL&#ui6#Gbb9DRbz)_uEuxm|>gv%~wiT!yj*_>( z^P-;$*eV?A#&~cOZe_TDLm{iSRqLsdO5l(c4o2teK^tikUWQmxy)|C)nB&qlU&$OC zALolpYj=`mq}sgLI?o)X5Q{53Ok+5Ay`f-41PeD9d5t^CZie!dF-T(gub_J3f~2<(bQ1owjl&52pBOQD9fI#8;I&z5hzw|)#@UsYkY$R#jdEPO~>#7 zI>p2(KGo!8E-{uW4PitQ#!*P+)ZlE6y#XL*4B@wgx2Prp$I3z_?avgi%0}9PJBS zJr(XQ7ooYEoOi*8#QQtVp*@JXJe4JlThFQHr8Ij{*ZFv~FtSBqg5iHE;o+P>jnq#L zRK<8PXp-=7ld~NHTqita;Pim7L#q-VGNk8AW+BoZ**~pweJ5~r(!d%@F_Mig3Y|B) zC6u6i3+h+c1lE~7%*+o|c5{KY!Q8TEgKn_M;y^|=5-_N1QMtnETQBAdI&OMA>ObA1 zJlx!B*4G60c@P}Q5)%aKQ3S%-RACTNAg0`Pamxzem!1*wxH@9}&ese}FH$ZT%G4E< zM#W&ns9_D%UR3@ptQV?8N)dc-c&$@Z4qFX1ea{e;U0+0HamJL;fYpU$%`YCeiCJdw zID9uBu?+Aw@yZO|JX#sxZDN%H-Xc<&pyP(-DvjdvSgay(T1?PLnxw_u;KZARJ;2j<7wZokQ-T0Z!0Nj)Lp~E+w9xA>Bo4 zBC$xNw1di|EMcX)o@F|9v;l31$2{sVZbGVa=0njxL_slfE^=BWiI_(KELb%Jc4M5< zrnakS0rA}cw_~CYq_#Ez6;3*}5x~q{NPBQZXqU7D87MXxfu>yeqKsp}qd)ii+cTuv z2xoCEUJ=NKXXm(lXEYpekI+BGo1;OlZgPz7QuUZ&~umFr;3i+-c$1qUhx(qj`6M>{H#rbU5!$ri<>}&FF5Q zt`nb)<`AYG@7XQ3R>5sj<5?i?Y;0_c@i>WuPYwYt?0fjX7mgxU00kD2rYAIVl8c= z6uOBHP?jr}lDb`zI*X}5NeiP3+Tk^%f#0Oq!LHcnPSzuJT9YJBO|T+^RJ&*yBypz- z*B}F=s)BOj3K*>-q)>)xkOE2R7LyW2IEW$RyYRBIyDb!vepMzpb&JN>l%$M5Hj|S| zIM-izL4@(07!=AWgwYabou!->*t=djt-h9v$z!^gICAU50r+VBxQFW|;J#5R=EY=m z0wo2(g@}g7W<<#STCLqsDM~gLR%g;kl|RY?*po-mEr5M_0$l(kA&R-G62M%Q31Cz; z-L*^pLVLT6dKb-4?`NaZ^9xh?%#}PB8e5Va^%pun9PQ)&wE~+4{$7kwn9gf z3xxXcz1*pw)q`P`DWzpStdM6BFyHKKR$srQsj)a;4igQ86$Ei1@#<9uEm?xbE8(i4 zvJvk?*?NZ}uex_{+_)i_E{-6OR@w!Bw4w)MsEWve2()R`fVLMwi7!}23>b)uXo2LL zjuePK+ff3Vf=eX#MS_+1U~>cnM;1~owo%Va$4@yvm+diDD{>J+umztDUqeRiq+sfi zknw#8ifnYL7P1Eokjf;aapGk*j3U{a%bNA2ymd7dnM8%VUuk^~jB~#l>gp=Vnawll z-&SAAd(yq!p1mG!(9RF1&|Bd-q7K*_A(FRIfoHwZ!eyJ1i?36@z1(%5l|o0Q5DMw@ zRZ)*88LQOtlfs*|m3&17C<(7U{e>M|4Jd8ZXT6!cNHEnsMK?Zs0+CY2YX|Ly%x6KP zx}GpO(*QXo+&a%@Jp|?=Rv$j)GWZ@$>0iPNC=VJun~iX!QYV+9nag^N+$(cl&84=D zOVL+R>n1J_Ilxh1K2<3XTl!symq>v>6zUFihN`8l=g5}5qWE_y(nR#%%dCbLg2H96 zToeFGmjUz3p~Bd9WDc#D-2<7vXM&r;7a=O9~Z0*O?8FS{x|iA1_KJtf2kf0`ua@t4;hn#dyO8da#tRG)s0 z2&D-r70~x$1WTvgds%ZL4qhGyh?5d8yFX*;LrI%y5BcS+l`>7@m|a_q zi3A^x2!%}3IFE+B%!z6DPN+P_t`wsv*HLatERk7z<1pkuHYO z6)Jp(90`OzQy%ao*MM?lV+*&?O#24gWEE-!y^|Vp+6oE zXJ=ca12~HEh=P$&=#RM6^CLe+j zDPO|7fDMNyqw&D%JN`=HK~aIIKNyVPfvyQM4MyNmUokkpyMrvc3AE})hQ*s4r0m}S zyT5Hi8_dB)6gPx75###TVu0Nng!0UXn&Rnvj;V!gsRH{tX(q~v0NCwOuat)T%rQd}`S$2c7182+{X+qyf%v9?e_2#v!QGn zEqKN2sK~`=bNc*nNI}Czf!zt85{#dZ#EX&R!bo85PDYDV==!&bc%}FIe55mEM^zOR zOP=}l7%h~ERYg(c(!_#=oU4#s!e^1L!!qIbF zdxf=ANG;r?5791hW@FWBo zo`ev?lMrB-DwOH8sE?lgT_*CK7+x<*5t+qd{v{Odcbh?a>4o=@6Q~OyPSqVhD`m^) zjN-wJH7oy3FDmk7G^PC~xt4@isb1v26f;*)88RG`3ZW(?SOB`DfW$#|rcSPAhb~j9 zgrdx;ph}L!a8B7m%Q+?&i=&5|PmdlK2yl|L{EhT~nL<23MS{Ds1gX(j6UrBE$-?Ep(o?En;Vo%DLd^I#y2X*ssNHpTf7m=>k*yyEkDsg&5d*17d(LA z6LvHPXGYyJNM0ru$f)8kXF5PXFbg#V@PQjQOL6fO__NX`y= z12+f#5e^PK&MenPc+cx>c;E$=FmMsI+=iD$ix`BT`~n*wd^7nwey3ku%ft6Vi!RES z%W!z*dz_2lw{uC9AGurI$HEOkUxfn#kIMDXza*yv{)M{%|3Z4>U$_|XZ|PjvCx5AYL?gZ`y(8Q?)V3!-Od%itwB2IU_%Uz-Fz`<@;L8uR zl<<>d2Qtt-Wnvv+fXGDWcfmM!4{nJmeut(WI#axOA1Yw;o8N+0*zgVyDB(?R_l9(N z_sg5v{7@R$?y)efi^tNa#w#*LgE_4q!)OK&GJ8FQTkhC+PTr_u4lpT+7YeMfhC>C# zivmm<#{J7+5*NQn;E(~Ur?fVJ9Rx;HOj^U}bzp_kT$sD=eXw2B>%_z*ST=6^m%*&< zUy?zKe__h@FQpMnPnP*g@2Si2FEy_e>S1--V>1N-0X}Q9(>+Ur)4d73Km};sc7L3CNxw-T?Msuge+grf{vonV0}`*xOU(&r`i%aS z<{~}vfq1v3Iuj8u**N6CEI*t<*uM;>p!*e!Kz@SxM}Ij_c47G8jWYT88MkE-=+K#Y z#V^0``1jFT(GQY!M~NARcaZ_+-mvL~pQX{o58m7oznu}{U-;>PQl)XlpI}E(^}?VE zPtG86Ph>pI0lW9aR{l72}_=zPq-ZGQnFBw1l!7~G1 zVMX;Tj(aFp96V|xhYJ?wje8;^#;rpH9!whk#;XI~s^tgIw2B1!=y#y8SY13!C@=a$ zn{ZAFsWQAOAsk@P9kk zK7aEAqX9MoU%3%JeGz_q9RL3d{>A(7w{z|K$2{C?{`Ixrh994U`T`ui?_7KT$37E( zzwFxQ(&M!+vYPtU*S_%cKN}x^fI+TZ`_0#W*R?PDBVVvL>O;ewo-E$~yAHqR{r7hF z@A~iR&u_#NQAGcL?b@&7U!RYEKZ}1^)q$!$j^=~>FZv^&@frW>U&*p4bdBi!%xj?+ zI@hjo3!a2G++J6shgl~W6uMTxyjs4Y_g_Q*`2Ps|wQHOHiT-@%wE_O^c6avH)-jmq0dP(6-!khfnlM(-NP>}85*0b^E^>xvI@4NP=$KU+%Pof4l{&xRW z%*I!JSMhBAczE!CJJ&j4Hm-+HH0ysNJP5d#*UwG*_^Uuky)bRdtFPbmUH$%V{k&_} zXhsjd?Z^J`SANoU+ONCz)?3$gm>~t^amJVH97Y`;YGrca+B@sr4Lq{f(5SzwurF z;-7p2XnJ2GnpV|2uN%Gd^!Cjkd=r%XI#0=L)_b9^QtiC*3OMEAb%eVi401(%@@m>A zAN!oe_q+~DJ}XZNMTW1Gj@OJH`TKwDlRxtHpySu)>BtR8d)_c+%lm)gqd)!z>i=wC ze|)+VlQxVvB_+_#o4hGx?HgWvI!q?vqvo?--7@8*eUEoSL+YOW(6{|U2NZolo+2HIUC~8t$LUQ&>ipTC{qMi; z9_abPrt~!IthTgSYs1fc#n1f!tqot4r)_m|$l#v8@_&56Kd0IM#j<|mAVkGfYR@w_ zQqAdmzw5{T?(YR1zfICXcbSz3sae+#YC~QqwjGr>437EA*Z;yNH$lyp)KDW5h*YSS zttkrbAF*Qng^%C<^f!W{f323HYW1=$EpH0%Rd zop6L}P{LV-J8TH0j6f{ttRFS1cm|Lrpo39&k^LPIBkAI5v`}bE+Qm0I|l~Au4 z`u*Eq@x?zy`u)FAK?j|TTa7Gw%@~uP-hT6+T?YmKW(5T~rfAy(mgW0*|Lo8H2wA?r z)76g{65Mkga{dRe*@G%aL|ZB>ui5YWqaXYs@|wMprQ&7w!S{XSOMZd+;46LYw~p6- z4f^1R{>1+GQ6GF&mWr3z2cQ1qpZIy|gRd@X|Fz(QFZ|?R`U&cT-<73eRefOT*njRj zcRxWo_Sg8@u{qv%_b&59fQ?3nmscbU45|3n?tI%1QtQ7qSAVwp)^pIXQa|+*pZJO2 zjoN>=U3;$MTWe&NXZG%!fBOF-FUP;->mFXxZQEs*lST_udrAyD=exeN|4+%z`MNwM zbqiB_It+c`Klz-!A18g`19>|93Gx;3V^B+z7g%F;EA;Dz#rgSv@@s#RHrdu{sK|9i+qr4!)UW^U?Y~1h^$kzM^w|Ul zd&j>fI`yAi`|MvJE%IhHE$@L&{qO$jfAfPhN7kz;$qh{Fd1_g2C;#a$eK%QeuX-9@ zOnPUd{=L!T&gkrX+&Ld#ocik)gEAGHZrw*nrq;(zj@`u!dG6+&?jx7q2Y|iuuIopX z3(H-1y{a{6?RpSAr8WB1-}$v4`ykr$nrly#$d8g&kWn1czwJ^RBN&&nYc*2IS}S(` z!Z-XqS}R^RDQxKcX+8F@8*9b4f73U7KdlvSe4BB2J>VdJnv@PW(H6@DsmG z>%^@ZI+j`}`0`0}KwI;?wbC;G3nD8`3}w_VZZM&lE%bFYn_VRmOI}tw1=Pk+i(0N?Hcbj zrfOAvWLYrZ@{4bNFIh1Ani_0A_RbQ;Do03bUa@wi-uR{GKSmbxeMbo{1fg>)(N;RA zpj?gQvi5?$@GHOZducD|pr8SM*NB9b^N6t*^k4p+pZVAh==fj*I$)Yp5~D6$Px+0q z)+1!;b_bs|{%+Fk4x3Pg(`~0iP?S|S+s>u68(}h)R@Hy?AAZG;oq(dF8j9)yut-@h zGCXvuOwzVgzhR8-FC2c}|4pNNTtPJ){LP7KJ-U`8c;A=&m48H%;6W`_E)nc%X5pGR zsSsi{eq{WeKX(jD9#&HV#&-w)x}AM6TJ!E|J%+~W{;PlSXF1yDQ3Z`Jk0P7`^WjM4 zT=;t*_}pJTK(D=1K@oKsj%7Pp(SpHR_n5J}{N=y+>i@G1`rd6rUj?hRrD<&~7>8w_ z{qZmVV?WacO&@AZ)0LU7^&GW)@4xrw&pt`kNQdl$cjgZ{3}%5Mtlw(WU62pr*A`OYu?_J2tSHM^DV$tjI(DX`|l zU;FGo^{X@=zSU81XE5s&2hvMxkHfoG8aHCihr^%R{BfEOy-HdzA683=u{M43AAjmc zNsE14NeRTi%g?3h5Buh1;DS7StEG+1v&;ILg|Ly;f_Mc9x=zD1tS#sg*OaI9Ckz9Dc zh-YdUP||knEbI2S{-NLbNszpBiCPDS^KPL!yo>@SN{}6SDokEmzx5uN8Iw%{?eC!i1)$Q!T+qY7B zto_{Y_~pa@k@j;ha`fZ|q&25nGv$;2+u!1ua_MTnx4lsgh7*q2iQ2mUHw~TecYN?K z{qjCq|14Ag|I6HYz(-Xrj~{GUv49o3Sg?^zLI4|^0wh90NeD$TF3BcY*zCqFKoCSx zEGQuMF4!v;z=|4r3B7j$gwT5r?akb>_ukz(yZ0n#!+ZbF|K}s&dB11QoH=vm%$W)A zz*?;A6cJv1O;8iIbh`4w6Qh@5y_x<59rI|-Ef?zb#N$nNoW$1?CGwZ0u)Wg!DzJTu zn;B9w#$C1$ZRh}kK(uDGAo84+{d3=vR`C6&+25D9BK5X_ouI-!BbHe8_^0ieYrd&l z*#~$AM&ePTGTHKt0ls%L1T%C$SE3qXGY_e_!n>WGo`Z3PLE+hDVvD#tj^@OP>&X4x zw>$_e&#+lwD^#Q;a!!ei%#@_xH(^HRUmSGk!e?tjD6bRk zazUh2EvloTG5gA1JKO`9pQ{No1_VJ5*cYU{_MJM*4qITGg=g6z3{tqX4P2PAg~m&g zKv=u&sXtcW3z6pu5(tT~5|+4itOc>lHTWle0lwLNf&O+BwTIgI+72n*g*)F+ng;cP ztrXnypz=Z|#b+JHERPo{0?*gnfmxnq3TD7$Sf#sh~3zN_Uxm@PZN z%RyPN>vr^$UOtZq$H5W=_gbN};kf&^X{Ze&0|d|x!0U^8mM-PTZ#dUpj(+^>kyy~{ z!`+s>(elfNh^RkfIkXZZ>Z8o_unj&pQA_n;p<6Ex+27op4n%L5C(>dRsUqb?As&8O&JhpvP;iS zTZVU_-?JEmNr1}VNvQwuF3jKgLHRoKIaS0%2Csdf&hEDJa}ML#{l`c&5e^%?EYzv1 z@{+Y>c#K-mx{NJavtSCNb^9 zC1r8X8Kq5|#s#8*upNzO6>N=tPAXaCXV4h62 zPV6)`ZZ0aeSb6LE=@?u5%{&)N;kkJzEh}qvlcZ(8D?Ao) z;WkXD(`)p$lozV75aO7}GHymHCh_O7F{S8t{UI|#Z$Awr;s(c0KzKZp*A}lskLOQ< zAi}1`{e3Fud-TEidpp4Q|6+VUa?X*!U4^ilA5N*>T-qB=*&1v&tPj+L9uxgM6?xR%B z{`=*(R$!E9N;sBC%ZYo&sNHFFie1Y7m>P~mn9fi>#gQkE9YCLAnvp=Njmi1QgGQCfhMPXL=+a;qyajN{hmk$5B&eM4~|-T3FT+WnosV?XnLo%*;q6!nB3TAZs(c zvI;ZEW+@cP`wdP-;kGA4T<_zJcWlSF-s~_WkyM12!xBiE)=pZ#oE}v<95~7%a41h* z1U@XmgJhV8CETl#dR_Ifr~X#F)tVD#bS#DAl`fSX_Feqg16KI{T*LPjAx2s2sMy)$ zoY{vkb~Y~}k8s_KSA&_F?#1sMHFE&a%r`|-qgPBZF)=Lj#yiiJIMqGSM)Iq*)#iRM zk_FKp32PYK>xHt9aRq7n(LOGWI1UWGuuymBTZdC%@g#U5s6XG`5}nTN&PcEManpUau{QxPQH?<{!XD)JwxssF5$_@nMQw!9L6r zNp8)hvVhAXtuOYuJYSdKCq90a&eIf_GyjJ94gzy`OLP<^1M*L!&~_JLlf z@VWuOo`;XnG(APzX?R7-b{4pqEHUczY2Ly`*Ic;2Gcc{^VUi)`!WPm?SJvX<)-Pgh z-F3SE7WA9T!w`znGRnG)*|6aVT9*y-_cOCowAoUFEaLQr%KKP%_Yc!C>b;R5koQ_~ z->0&STW=k>0JDrYF}@!u>MbtjP3?C}a*|fyepf-ziP8%yiZF2ag6$YZ*sOdPqR3u5 z=BftluIRa;yuxeNE!=`$VP#kfIfYi#Dy43XKbSCoFWwq&VRDGAvPAh^J1$P#j(*ox zCW9z_plX6P8u#aHtktnC=w}&}xRUQ#`r%9qKLbJt^&^ z8~z>U*jN+C%|gXVZ>#^&MvRm03}Ok*6A`_lsR|$qCr#Uk6+m`Hq=7)GsR`rVg{d>} zi%`^Fu9y^r0$@S+!b!2!gPd38I4EjqVYXehp z3*R$!R$$y>FU@GO6%N0&RM$!K?fxC|@zicWvM&q?XtdfkNPF_8f4q!x4I?sMPHGSP z=Zj%ea1Yxbo-=H!4=)E5q5Uf5SQUDj2f}cO(r&7XWSy#?q&(+?VZJZ!Bu)7=4?X|Q zLiA}4$pl&LGcoN7qbN4$!z^cBrD3-zmKeD0G385~ez8?0`Vxl~3cIH$+2iopJq~%9 zD}5iCsS4b>paxNO(TwM+s^+2BepXEG&z>JBlNrD%}2X(UxUs)2bqpgg=#FF+EZKFqLs~!@gzP zG2`TTSWc{12}vkLaB9Fj#x#LUME2CTBl?`e_`?YvCN>iHTBkCqRu#7?$BdoXGh3)GbtJ2X4A`&gl%`J5^0Sw)nW$C6TxDQ=glqy2Gc#(y`1GF9CJtI{y2y zNqFX}Q}>)Yty;xoIdc1?+rd<87E09DsZ)gI-OFZRCQM!R>qYQo!(ArYB>AdDWYnMP zWiVp%rF*cK!C49mh9A>yE?WU0g^fwF1jMbsluz-__M@Bd?bO*al~gk@Wb7V<T3zFDF?R8Sfsp%uvek}XTIw?f-Apn7)>6k zw@G*3%Zsvr=OU5^=BZ<%cQKohLu|Z67E9=T&DTwbpL!gKE}@8Y zZjw?vLEjk00-lp;mE&b?N!&_)x&7q)M}f6|WY#E>QI@0p>)Z`!IWDEhqR2v>b_-tF zu@Xhi&|=rT;ls>x)m5MXEC4|1#6{+h}g!8S92&|s{VO1j-oGh zg^?%G?{iC?ZUY_+gh0EXPD>JlnyxGp&u>B1jaz3yyB~-H*%5Xu%(u{HHvs=+;76VQoP%`o|`?%pP!F$4~Pr1gRk6H zhVt33Tl~oa^x1FVX4J1!HYC3s)znZ;pT{0sa;OV1-pI|Es&C80hUAtc^}cN5H&4#M z_hmP6Q=)xf!|_W{4J&FAyl!sOX&r&>=IXFX#r4GTQTa%xzxi|$<|Ez0%_kWoHXQ%V z5-;8dZyr*GFWztEqLV5IupC8hE-F7IY5(~Bc$U45i%XbiMsxvOYMsCKSs-exC+gt$ z75jaO9*?aA!lu3a1v$O^4rg9Yf#2pa^es;WJFWT%>YiyZ-BL+VbakR)!JCDyo3joc zm^B2(b9;@)6WBP70}A{&DkCClHTK^B`mXLUqC2WNqA2Z5MCJHDpE-Y44nxs+M zpDe0@(5&lo?lv191Jb*yNgAzPipmZ?yYPW6m>t}tnyjMtDmARBNppy2a~XO~cUO~8 z^o~IF%(~(7A9ueFjQ3QF5pO0`JEzxDv}{K65d7PySP8<8x6A0Z^;sC-y)_=+|A!s_ zV*R-FXvgoX@pu9T+c;5yA4g?|2s?h&hkq?WJAQvPM^t-uJn@2sYtfE3ttP2{4X_fEvLi(9AS zxg)L`jAH$Js=q{o#f!^RfiAupbi%y+W@;*(wnH}=;9vAAa5Yo7s^#G8m$jIUkNZqz zi4XNYQY|;Hd>Y1})mI@c2g)6B^aLzOdI$ zj8wJYAC0Naj(Z1*36=QeTXT0~q^c!9qkcWGx4CLaQoRJ%*6;ATO&4VY+EGH;`=+ge=-ZdpUM6{a}jcX zUp?UJ?9ja%HZ4TyXG!0;BsvS+kR(_L56j_-rAxTyuDoBT-d6S)z3ni*t?Z(HUCnLN zd&j~_C@V1Z{;N*oD#%ty@DAQfhp@`Py(-o4p-vZ`?KD~H@btLM zknAohvbplw!z*}bw*X1jTCOll6x$bqxqc(QJ8l7m^b1_<@Udq?y>Y0Y;1gweY);y|b z?z$nbZAb0TRle`;=PGnKol(<%>V@&IGuIq>5E$|lh7y;p$dTLL(aY*6Dt20noqp)k z64@AV%Y)jVzg>ULL7We}%+k8A-31Bcrc5IL_X$7g?Z>*$!?lpFe7}FLy%-BAM!`=a zEVBE&yb~C+D3HI7&oiXAK>1#?n-jM^AgtjdyFOWg*04~cP%B7^_tA(s*f672CC-6E z`My*<0viL>%GbxgJ74;GZ{yeH-B744rYeSyn)k&4tQg)$`MTegE2&>P)pk!P4HY{$ z`t8qq&|7rMG~lhv&-S9U9tmB{n%!z1>S9rVK)Qr61;D!&sM-SWAANm4))sK-zn=l+ zF>8&W(d(z@BY|5cNX_$DwF-6-U1nYxP+G7r`@@~61;q-1{s}=u0Dh}XXu(UK+n1si zJS7vP6~TjYtP+%~d(Xz&rnx0RcnQ64TqSiO^~m3E2T$qjPII5 zckPwG-#$gxl}y;UiSIVLJbeMy9relIRqsEAo=hl>yKi5|WvFrfz<0G*xe+%3eu)!1 z@g>dwJbf<^^bHV5k3J%*JGZu}&);>kU6PkD39C)_3w&E?I4jiNQ)lC!#@@UX&&K_g zFLQ4?+_I;9;&%spI~{%E5}6`{(HWDa_}mOspQG0rxvH>|!~mJWOt(p4JX8hX-?}#0 zjw|tLna9wVko93+U8G()KQ!^ih4{*Opz_@?UFD*#orMkh??&w$WMnaPa0?5;tr?VU zy14aYOVKtxqfn5Y$yiguO+c;EOK$p7TBU=H1fe~+gi%m8i;u>ivjF$xXB7&nw-XD1 zS2L;m-M$?^+=FMO=M3Mcdi{u^pkgPlfAPdIJgW?mDTt0GqP|X9sW_rf;c#mvWu<=E*5)8usTX7(Lmhe6hk12@ng!4Am(0gm7^-|Xv`)FOuM^&B8?U1R zSHg?R*Mo}j3iXyKdvMo{r)HvEd`bR3Sl`mF;`V0PUb3Rex0_}3S4k34qK*%f$a@TSBR zZ_Fn^AKZ?jBd{q&)`PO%KNR(&uJ~B8Z4rvsw^m zw8v8iEKLNSF9JLvc~8-_66#}P-Kp{KKIum>qV;8DBHHSn)w9%E*f zqCV2%inPf1HJZqkySsAH4y5^7p)q7?)jCbXfBq~(nr{L$y3DPp(oi|ZyW{R(hdIXI zDl~9enOhjhT2jo8a6gjj^)z-u{0{8(^j$a-(W{%VHalOdUu6Z3?-h>F+&1%zo7>tD zK4kp(U!>fYA0qNZTH4$+gqL*tJ9A1gUiYJ(M!G{WOoEv&Tbx^>!$Jio|1MAo8t zHR9H7Vx@Kc;;BkJkNg^uCz1m3(op%Og&P_#$5_!gg~pImsZ*T@6UD8|)GiT|Hv9zc z660kS%&^4#g5Z530t&BGDDU*zl)jsARZTFGgf!$-b}rFGgm-b>gD-5u{roqLNT2r^ z&6y(X^E3YyEJCgMU7;~#fz~q1@NHj|Bg-E~7VU+Exk=*IV5$m8x6O#Ok)l9TWgaTKTE$V%&jME$mDg0Ud|CzC#A%ULc6Mu2{1GwsE>S+=^1%?E9 z^8(_ZF+!&ox1YTWSN$wAOp%1dPej}wn|je(G6XB^jikrl&dR@X{dQ; zj5-Bv-`8Rqo`TB4v&eE0M?!c%?Kd=?hIu-3WD@<$23cc-XAm?ewB@YNPws3E6mw+? z{W}MRBI2}g>j;g#)U5|qX~CP#!R;ijN+7A{}8L%MsOAC|({c8}%Y@M7KG)2Nt2#vu$?V#7Q*uW)^NULc^3v)j4x9(cRiBga?=ozxkY)4N->78C_n@K zzP!F#iXl*baqOLsRN+Z^ae&D1ZYFxGiP)DiZ@7Lc`o&AavWQ+$lzpj_zUc(om!$y` zUvw)a-ol`SJNUJIewbnT`R5;8*RPS~d*uoW$8#9+m}WN9_5DSkpt!nzsvU zajeiteD-4f#*7F#!s_!-Htw5x$E(oBtqd^q&q>V7GpY$4o(R3Y`lHdu zG0MMI$AaCL?cAc_rXjTEvj^5LK*_Ar)A)NuorUsm@9BSy6y;y9W66p-Nekj_i0@F{ zb=Xg}Tp^)eRO&W?h;AnLOc7o~o5n*c(QDXXjw!+h$xB4-OD%@_7URCOQ6X{{LD>(l z-U6FC8gZ|1Dw<}suh@nA(x$L15ro1`LPgUCPW)mYo~tWll8i)8379^Xa~Dx{_?d{4 z(t?H`9mjL^W>ZYUr9`Z-n;I@#gDb33A;R0d&;kkIc*5=(jf_3&ZqNPO?Pa*awwPj) zw{&($jdz7nL}RX=xE_hNYDCg&90wd1g0Hb6Uls8ZSz^=;L(9D!>AGV{MKk(178tT^Oc>1_ClQ462XZ0u*LB@%TKoJ(L|ZcAi?!N2zq zeoNt-BaWgC+iPSqy#LprM8{t&7FBsP{hr+Of@L{Cv`-@{@>)BXUW~XU#l;7%3Gu(P z0%_b5v{+On)A8naI?)q&_t%V9*|0>?QhU~bg{_w3d>>F~sY(mc+Y_kB=nd0GEV2U8 zK@&uxcY&7b7OKn4+i>L6+%~{-$jB2?2_lM8B0RF+AF5x49@$}&RH7wCWe{{KXmlF= z)*}iNQLVzfkhs?(b;o)6zY7;)WaDULqDTVb=CQ=6>0g>{nAP)%qn&`~n1QFY%jYSv z!aWs~yn=e9`ifg1FUfxC%$GRp)sn~v`#t&UeI01mm!b4J@*h=!;RgHERheR=aL^h)cTbxxgDt>Os|Ssdb47NsjW z{``5UD|G`DIq6xJmM!C&M_($`tDq@cR!&A;IV&QMXz5T9s}sW?T!Im+vlSYftH5xl z6Q$Uh>JIC)rS!v+<*2pigdq_v5lUYk{CDFX)R%J=4!6$+hvCllT>f+m?!A@LmtJ=d zFGYPhFCvd<=}@+1;Ml8X;VjjYY4lZ^WSbiZ4~SdURJOxgtr|>0+j2gWL%1}E-LX;O z%1VqqU!YKg)Q(bQBASJ&{+mAO?NxZAbD;?qOi~e->p*2p7oImq>Na*!5KV377*KI> z&zDJ3mg&VoT&&2r@R=hl-^_bfN^$W^6egkuSTy|^V(0$-WUm=$1M5d7k_E&LSaRDy z>a6We9x7ZY!UlDePkacbiRJgZ)2k}8s@xS7q(b~e#A#;f;EJ{Aaa^eoIdc1?+d+l6 z6^NULy5D{J&4s17$6ghICW88KvrsoDy<7b^2X9WUR#>o3A0{j3*?l&=EAinELhnsD zLbbeFPSyO_R{#0^cyn@1wJ1T33NI_1%*#lV@~&VmQe zS%Z8;f#jl!I(W>(|;`ImpT;*NBi!YNvqyf)Ypqq?dZ zK@99wiP;wXM^bjH#=UG_M{W+} zFX7AElrF6r=N8&LIpDuJAa^ju>hLwXP*&mqRJV&MPvr~`%eT)BO7a@`(#JYl{QLAIl3r%3 z6;T4gG@9gjhrq3xlGq!e5H5xP(*KUHw5#_aOiBnCP=EF=Kw0f}@ zD4I(YiK-=4LT*Wku>Hx$?f)0wg@_xj9X;b9_TFj{b_}WFb|=CTpW8ii1I}j4unZkr zC#A43crCFdUJY7kvw65h)v9NJ;sK39^+V+@aMFYZCRr|Z9~GyRcQjOV>ixf4?8NBQ zgJwq)PQ3j4Es-U7)0n=;Fgo>+Oawa}b+4F|2q3L<9u+myq^~@6N-6g5c{o6#^Vg+L z2B}Pi=bans`+q#XQu_WQ)c2F%6qF?J`-C^R@v6nMu%lTk?fXIRUvt_q1;DKfR8O^p zd0oqqz)BHF5)esXiB;86TkWsj{^oHf5F|FNCDyZ`=vCVoAc@%8kmem#3@#Xy_cdDvXSjB(3E*A}RQ&O~f3H4;@y9gz>(D=-0O}qx zbEwg>C1xvsOUV<4I|ddauZ~b1`jVf&Zwq$ldsHUW;zEgu$Cg5PZy`rX#i z{O+KRKW)VCwh#Son`nObss}Hgj^9lW{chW6es}iNnC1B0jL`2g7oG^cYA|-@N&Iey z(C?;2bG+A%{AUJ!w`1scnH!IY@!s0-t=0J5PNCmrZaLiFRoxWbZaenvW+%{B?Hu@S zNG7znc_zM}@b7PP@cWtU?~9vn;`{IJ%Upxs&tiXH+`JRt->@U;0Div<`}@M?pSrX8 z=O^a|jQ(WH-_H!mGlV_11wM^#os`(ETMyRKWJY4{jRD^JvlXoTKP@bYs#mCx-j`lr+YiHDC!!qr3KfV+=|WMxNW>%V`hehH=wS z9dVyu=bMbZPm#uhaJXzkH@61r>Li?z@38bRHgndj6itpCY7r+cfx(8 zn5*=-OcXZSz*;oi97JsE^r-Z87~AS8b1-7-aK*{I6yv3!-bY;C>-rU#8~j8hifG(N z5mHJ2WW*elN=_smW{{s(D%8El*W-$%$}dlbrNA>(nCanOz0~|%df9>a#nc!hg5kCo`DW6?@{3L2hE|WyMhY2GP5t{P*tv^?xJo3U* z$f_c4W{B8bdi_eN-lAP5q4!|<)*)QV0sq_(zR{S6%1>cLH(z53*#RS?aL*4Rm3ynQ z7owL`Ad$3I_n4slCsDbP5f|H}Jhmkl51EH7g%MaV6adm;Z9e=nM9AguiCJaH;*ePw zyI}3eW&5sMP9RI~2rRa!cV&laRz2o+N@$ zcuA-mqf!6Nmg?pg$s~c2TGTC#c#WZmW;{3dFy3LgOc6y85%+qcvib5ZI7g~X><%L0 zH8kAwMbrZMV#jlPFte~Y5=#WZ@Ul=gZ$X{ShjDE`C9$+QqjqM=t`0Mh#S?)gf>^lq zr8(ifyfN{r3iMvQ5=+}!@cyZHw{Kqll2miu7l}fc=hBkMH0b)U_z6;$&R~t9HqLa!elhBjr;lQ0+Oy$FSi<06&xFl8ul)1fxPLzy&OU3=_8`vL z%O-h@S{2P5EB?+6QcUL+nXLA9EFyZ*=vv<#j9v`WSZZOnpuE#17i28M`Fd3%Nn==Q z<1C>bMSqRO-|?(;%kWxQGSO>{l99LD!p$h7;U-ATZzbGzh}dVx-ZW$z?z1B#vUZHw zi}o#9*{692&<2f+L=jnWxc4(EdeCF;H_{8G*CX*TuVA?6hS($el|DNg_lQwpDMafp zwMX33KVcir&l@I4MDG#QE!pIYE?D`%F$VaKOmar|$a$YWunPCccQuw;*dwX4?x3`FQdjf$B$D=L zR4QB7HQ0tyd0%6x4XF_4%;J~>C-9v4fkcv?0_vGt7AIM6{Ig0Z#TB67}gSvYC?Q?b`$ruwP z(bd&4qq|Eo`HV?YTe^Bh{Gtu0tDnmxXG~XrxaB#?Bl$w(I0L#m^2#fApoV-YQFJ(i zx;oN2XfKj{Wr8HSx;ny}BHfmJ%_ONUUA^eKy^B#-zmZAKn693B^`iA?SHIOb&Va5? zsFO7hHRL;qqT?CV)e9%Rv=m9cH$f6zU9ETDd&`jI2PR2v>FSdszFmU4`lC#8#&mVR z-97_#b*#n_WnFEl7H`tsR6X+P?#eWv_(`JZ+^TVkJ>TYc`cmvpspx2zOWMSzk&S`drj=ra1lWARm^H(-!AU`ZrlKNkXqg0P>8fAH(NflU?a2$&=C#~3-R%Cx6)t@o}?j7pa^+j~l z6(TSiV~Gv5e*6Bachmtie}$(JtA_j$0wQK|o9pp4=r8@vB8RC|luDossh%UJ4_&$w z{iTU4k^qLdj4UdL*p;-h3Ui4632+40NRVGB=fSl0c%M78;M9ZZx(UZ zm&*5f?la4NjKlsHpfS{MfYk?grj7x2+?d#p6}W9^Oz5gBKKb85^f^jp5~43FTL18+ zhe25E(mC8K%tBCJ(dFvZNI9v7l;X}!394hH^Utrjxao{0Ksi~a)K`5-OB1%2Q1vF( zj5&WYzLTFqe3_N1#j8D3MWI3OO__ofg{B6+8}d$Gw%kRN+hUX<-ONNx%}L z9?CQyWP8VH`!nJD)8+3IU7pOWALcgCy?Q9yx3;Wl8QQ)XGNZ18fZ_-%9$w^)o>ylq zv7w%4x554Q^#+=m5opA2^t|Mh)t+g;WCvR9Sxj;>8$CCPDngy5i8(KKF=jl^W|BnS z=tXc?=QvIvN14Qt88&*xGJw1sRE|ykxnJ$X9Gf{3M;3$QOynV5SlM+k`i67El8L@! zq-69%eA68$qj@Gs^eWt;j+l36CxoKcNgvTO8Y)R^TOOYLY3aelZjec4u=r4 z!CaKgTA9UiW+ij1aKcfP%sL%SZAd0TJtXS<^~DFDns*PdtUv2q=~<4Jvk!T~!_@3tOW zUZ&gGSLv9@1mM+9Y7SnX_`?RAgN@4fQ=wHr{FoDzWwElCCBjFo78W&$+Fbe zx3l;9_u;oIv~Nde+(dL{!Lib*IOm(yZ@c@s3LQ>oZO!?}dOgZ;?3K#*Tldek7yBG; zm*_bs*4^6d+fQSS+%3wt(E(KNnDL0iRCextfzr6|i?%Mrk#AMM?)DVfe9)d<^vDTo zmwR&j4E*-Cpl{1l+mqNa%?hpOr9ak!ESfjGYzE3=PY_9a zx4SsWomUbbfm;^DDYW68$)!lJS0Tu1pNZW`Ve^GPye`rEE;SqT5;s<23}v4}&?QV0 zP=U6A$ib-ma_Dl*;@U5Jgl&@i`T2HFqQ`CvYD5erU1^7mcSfiV?PIMUY{d@k2Na5A zr_Jl_3eI3Vdr3dHCl9PtvEAcy*uBxBqP(-)HoIrxPJK|JYTeiFf^-0V%Xnc@p>C39 zuY7SE-XtATz8~zHVtZI70JpWK?AF?mo(;HC4l4wyZm%!h4jy`RWI&w%mp*v?PP{)n zq7bxCNt6tP;IR`mFuIQZ^JqML`Ka>c40oPgYGUkgLF32B5WMT61>q}x*0|A$6ks@} zFm&)Z3LGw*Q(7Mxwj#ULW%r^3%pc3$!6cED7nFyT&8#8{YtO>QYrEYI|qSAi@i^(+bTAuJi9S%?`qmiX@;Tt%n!ERv#{6A1U* z5Dep5bS*=M(=3Jvg5YK#{N6*4-gg>r1?!xx(+^JN5W%r-%KM9uqi#43!SbLgq;#!w zXb)CMIZNVjgGsf)-rCOYaoL@To&u{oSB^nsVx?4z(*7I{3)VR1wHx=^q4EN5m~?nO z<^`OMT&JuPgTQFG5hn)Y3c_5`va zBbgI!jUiUg)pw6xgAC`&3`RSG41%?V>NEA)Iah7OxWRccgJM5S2!LBBsIS+#>53Kj z^?D&+k1%xpuM=n1cW)lJ0=>ZVm9MMOx$c+_8%Y6#5M0$~_yHuifFuwt1B*ospJ*9H z>rULhpeGPqC=+BU3ee3=9#M?+m-Id3<3#3F66ed3)Vjwp%6^eV>xPVhaE2|Xov1tl zsxMUYu5-&e1Ixw8l5PX#vANv69I~(2JyCkJ6fu*LnHbA$Ux=OY*ZLFZb8eY^^0;HFTPeE!oz0^#I_gj~pGKDR^@GY`e#cfl=A`2lgaPMVHc1 zYtRN>+(=XxT^mW}Enh4f1S7dr8%a)b&KVdCxAmcN;D=|uJPmW;FT>G5E^d-7w-3Yv zdc)HTE;A5aJ3#euy=eT@xz7OkKm8VxfsnSV5)YvjAfvMX?nG^nM~FsFupjl_qJX3v6@jX0WywKN*$)bNicRt@@S z_N()Prqk>&nk$vj{Qs?XDlYO@*35Mn7r9EJ&dlhntaEc)tT>5MZ1*&(I*e>rOKd(* zXS*%0gUeYG&M!d=BgIbyp14{P`~T9P(*vQz6(S&U+*75AJ?<{9>eNBva6*L!lH@9&cmc z%S$m6^m?S=RBrY&9o|{8#Hfb>&6Z8@R&MPGWH;!^GThSBrU=mvW$}sQqb$Q7dy_+G z8E#bhc$OX;jej4A3Ec;-FPyTw6R_Q6U=t)fe!|$$bLosB<;x0y@Ma{;%tqHV)8EU> z>6k{>Go|hye_g*|2Hrp3B6Fu0jR%%UfH-vwm<~&-z&WN!-gM8G-U8gJkQfaJl0bYx zIEf`TbfsQ2|IVFxAd}k^5_>MV>)gJ2kehB{hx&P~3$=P*sGnJetG6*S^KMQ8XBHIY zX8Avw<-7mDliP9i-fmz!Q>&MX>%IEv6T304cgNX~ftZuyvwPsRxh;?i6$eGk=qqn- z+d*l5gD+>#!8Ld%$|tA5?n^5wc3Km?C9d2=kH;qGL13r>)_}lUULwMH{K}X;cwcl^ zC<(aUMGmigWEIY0i4V1?|19ZJ`ZTaKK^9vtx8G-lV{?(smDe6pGvKZfG9{!%Dcy6T zkJ_qn4Z<+2&>Qy*Q!l>LZN-Q2#rNIvSiDxazfjVRx?q!Bq=z3#&%m*wL}GTFz=|8x zTlkU-PcOy1*Lzf=katBE>D^pBnlG?x?WPx?q2KGZ-jx4niL9}i}+IA$m-$3LKB5JD;wXFrB zOP?OF8i|_fh(bJuB=i_iM(MRc^v9fx^+*(BAPSzfRD~$D7KpxhspV88vgn9He3>Nl zWl%;LqKVXykS^Ep=hYj^X`uGl@7auNG~UdS#;1u^Dfb9!Hvl z08Q|8M$JwUG@W~8u0WdR3QaBAD1yd+$HzO6rbU1zc=1KeJ`pq%9*bLyG%XdHTC`2- z(Lkp+rH8D?9|oES6q;JJO9ajB^XE@Tng>;yU?q;4O`<%K$5Vbgi95+d3Qc&g5iC$x zw~^N)q3U^j^v)M$SkL2OQ$(^)uDz2N@7Y=`>UO7Da?9dx=H~$8BPyfp*;YS8fL&&c zdoQ%at4gQwHrRaMvJ&8JrSM{AX{O!g$t~dlbv_ zlar;q(j+5Gi1|*0dGVqy0NsjgT4sosr>it=(> zwq|OAwWhm`FS~ZjFc?t^YeWVW{(l`A^`hc*-s4;FMMZ06WL@o!fK3H)Cx;Fnda5;0JsLz+i+&|Rb-|_{$B?RBFjcU!N6o*a@~PS{TecnZ zsoDoo=?!+IjKGYT3^}bK=(^U~ADv?@9L!3p`Z{+=vr-S_@O*@+qi~TaPCKcXcEY<8 zPhm{Evyn-!pfXEX6ke}}@)`erb+T0PDbq+|P!tm={2EK>%%RNtH#P;SWJxTL+^dz! zR-Se+lX|(oPtA(|rbne&>7sn!otp_2rJ*-~+a*7BRm>hn^~GgkQ}w3qd!kCJES()n zl40-10mChqmP96EG&m0R?^>l@Z0LimaXB znsmBj9=>mQtePW2^UO|gAw#gKyes1;(Bl zW0srPP9?Qg_ES-MO5Ib}ySVNiyr+J`z@u%Y0S>4I&L~U3FBifZEls`QBwC{!14ppe z7Y&-`g!lL20qa(LDf6U(Ca~lbtAo?S77MRNQ{LC=<$tb4@5?50K*CCE7d%V1C%gUd zhLiPDQk+Lf#Z&)!y{HW1sl6m7pU;+Ci1j?|{e6LFJ0c>fxCL6o^}wL|2E~2<)q!*v zNv<>!e?g+O?Ih;qg}(?uhYlBrzzhA)@eg}U@2=m-Y15S zN3l&F?~0&m^JgSwZ|DuQ&TzCQ?iuBtQHIk)yh!p;Id4u}vbPY(i&SzsH(l$;pqx@7 zNmrTy{i#PNcj#TN?cHYcFhc2~xijUnRV3<|n9%H;FyP!P%o3+MjGAWOP?UJk4diZ_ z9NKrMIIyxsF4v>aP;Pj!j!A4WsW}4QiK!QSx(Hv-JA2H==zg)pZwIH&s@CXMqO8)w zRDYHRDbqG=fELRP;_$9ODpoOcS(E)3t9VMI3UvmyMj*) zLM7CkkWhnr`jj;TqP_v5EI6_FJ$9%@YY-A^nz%K^5*r#rd3@%e1^GbHPp0togN*+i z$hhaZ5h87tu$PAx;+1fnd)h6-SHk`E)GjyI+pCbB4Gb+4x*D<$-61|)eefhwm*}a% zg4Q@)N!ZGvG-T9~e-EOD4A4{ek0v&+{h?M@zr&8nxVoN}sG*Fc-IE3(0Z*~p3Bhhf ze^ooMria;BxwVn%o_yZ9 zFHKJawn4#ck;t$&tT>xwQ7_LmPwJsHH!RNuvS%bRkK2})YvX)ZNiA++tAx5C?ltcD zLwG|xSYr0)r{yX4DF$1fCQfdF0F5TMSHAk8;um0eR%U>Ei4Ib6Z!ZLp;5_AV^iQ#S zb3G2Z;1Sy!s4$~Hs^Q5&V2oT{s5&pNWKfS%%yM}?%$TqT9G>O@2IG|QybMk=;Q20%YdZDP}8k;d=A69f7 zs&K&@L8Yj!+f%}foePY|5V^?COa9n`vGW%dCb!FhHOun##g@C*xZ)K`IKG)c4_^&< z=%o9^jg~4ajN~PGBpzRuyCZD&9wL)3215DpRE>S0=3Vd9z1rKKHlB?cDO z&%(sj*h|nuRJUq6C^z<#_xT!3TMIB2PU~bJYiMy9ab@E#!cEN@^ zatj;j>1vlSPgi+ol&ZQi?}pe}SnuRjiKNixf_kN1YMW%OGAbi3BVp(Ue9`fSOlHsR!>lS0uB0!&t`KW?VEP|RaP7VsU`d6% zp?)@SK>fwV?tpE}5&D`#b&<5apy642=A$qAR)7Of3Pm<&w)A4Bt0ND*X4OTKip?g0 z^A`Co#-jYEYkY@X<=+JbJ;C`ZD1i{4xc#4s3HAN-$72{>c{?yBE!`07jYsCUSfw)U za1`q3cDQ_Uv-u2hQFm%jnQ-{f3EWfO2~f*ZfR~1v=|~mm8&Ekn36JhAN4`0<$ySn)g3p_4!v6BI5r$!Q8BwD7s9$$L%2dU zEk+F{Ypdr-&&4~lf%1JGN-j)ZyGPxazt>=ZbYuPjMVSI^zY4825F|gL8UokkIQp{@ z$1ywZL(_y@Lac^HhFZ#QH&0uGm5e^37_&->?KKf%H3&l^_^<59m*)9nvxHniJcErPeKT7exEx?fM}*`8jCV*4tPh`k~r0mykt{(28`}gGoy>D>{}8M znohps$2tJrXj61tc--1cNw2cm@f|3=F=qJEc}zX`+!E3|@X;?*P4EVk@!v{tQ3wNSZ z7;D8ih-pz)gH=t>&}``3j2Fs#0P9!WtURc^Ylh0h{JP@j1DJ>TwHZ<<_!CV&$|A0B zV3pSNH|F?w@c3t%s2cmm&T+d?e&3qn%ZRG{sQLZ(g?A?--*+K=`8Fq%3p6^F(z(m@ zQsLDMDlt2zwYN`7zZxznA%_XAd*%ylN=`ynW`SOA^W za*Fd^R%=|x1gX7Cmz-Q@PO z8_#(h#xqtKk91KaCn{-k0a%jMi=g=-GD?5QRUQ~vbJ}51H+&)oQ7mz?4`rRO`Ne4i zfb}Omt5P4cli%*QhY~{-Tdba$^A!G?U{?pD)2Ezvf=5EEfM5TdvmaN$&&H8RFE-jh z(NR2BQG=16bfC)TJPMqk^^&@@PUj&7WiQ#zv@S#T#ts1gr)p21JZhc;9-G1CtvESZMA~81p|n% zDEL=!oa$t17HM$mk6Zh}D8_}1A}&S1D55itW}&OwI<5Dr7hoLYL&j0lQ5a_^4>CX` zOAujlxOWS}y6)Kg*des86ZB(}3*Uzhs*lwEPcu@1jZa?VLai%N&Heg|=kCI4?!Sey zdeg8|x{3W6A4yA#K{u8(_NKtE|II>Ukuh(1PrnS@zw5abT+Dq*f~wY@l2CE$#2d7s zv8)tWUECXBI$EP~if0duTX&kNS0&oI&cFNVs+V9~f3U^{Zj&#~C2Nyc%=l7pT1>pI{#rKN$UiIsOuXx78oPpq4h1+;$~X#Kq+I(cvz)DD+|a61{w=xDrY z6~2j@7{n;QrqwAo)}NLPjNW@dZwMuczmt6EFeZn4Wm-Zb5gXT6RAMCJA3ZHLv6ot; zhiZUb>YN_xIESBnZc@U-@uWRjfgaAkGHGj<281HVTTPbR&uuXRNu9cUkKNaPw;o@b{6~!J^H8=KQEE-sEOcziIz5J=E-B*w_H z+>*1*J2>1#VR+RX7`H}I-TXTB-+%HM7};dT$oPj88++#FX~nYRdvTtogp5X-pDcH< zsb{TmN(tpXK#jW?SAIAJtj0WrMvC_JZ93yw7}->MWW3X)EUQ|YDWY0zS+9#{W3||6 zhVj6ILI{H8=i7DOgQ+RP%^7V(^#;U0Lqt{7w_g8z1=iG=9x|fp*ajR>O^gG-)eAj` z{{72C(m8a7VMLIr96Uv^TF^C;%y!Ubss329=4oik!%Y$V?JzDY_m~nw?|E_uU$t^L z%+k!@F$GN$$B^V{g8xBIyZGu4j$a4kLQjC7^_+CT2cw%6G&&EQLTkgx;hrI)D!|(N zzNtbFcs4NxQ)W(8ImJSY^bA7%_3K6#9C{IG%Z#)R2od<~>Gq-yy|6(s<+led6ust1 zi>12T4fh-nC+@lDA6N%KUGtV$aY=&8F zFI=5D$qPrzSiRwKYbN10yzUrgMiAhhj; zd)6I9ZChj*MHg3*tvF!Y&5uVl5Y=2h{Mtsm@!#~=%z5~Nd$D0e82o7CmZLVDdzJWI zHX$@pdckw<@{vHj#7K?Zp+y_ zCS9RWIsG+*;?@AdkMDJERVDiID`lp(c3-lbf*>U*q`C6lk;MjjjN2Ief2_$YEW#HP zYGGQp?6?W@&sXVar5pn$sFHzT4pE5h9=77jaV6+sX>yb zDqRZ%Cmgg+6nRHL+`4q^nOKUqE^C6RX${a_XP6T$udY&gVmk`+OEFJuZGf>g-c&H= zUfJ@@;qlLWjJm+JbIXONzM9+(_|_Tu;BGhH;e;|GB0zcNNY%)@AoH5dSR-$}#@XLz zcX^?vQX9W37i%j){RxlV>jiJ4qpF~ROgCk%OQ%MI`odn8B5wUtZx-htS-lhAES5(k z*Q}O|E0j#VdeGVS>AgDa$2*@50WxU=WlXtxsxe_UtD%{pck@>?d1gJn(%KlHlh4tK z9+pxDy!xoEpU|k^8#nk5(bdz?{k`GH)r)a|uM7~X=Et~u z!udI{O$M2ua2sVcq!?=Dw-mioidKG0C?maB8UW2LCw?ohnj}qE%g4oR?E{=!HBLDv zO3GhmOn6ArN^NLrs2+UmZ#EV6U|TSIBy4lyt%e?iGTuF9{2pZ79$-{bY8Z@xyqah+ z5*1D}zuj@#4U9W9M)}pcJx|)6V1F;NG2-5e=L|k6t~SYRISeVI@Y66(DZh+~D5<~4 z+Z!=Tx>M$F?{M`2Z_1e1r^1D(u9mk1j){69tkY+7SJV(Gq~XW`V>uxw3i-T5H;f%` z^*w+UvUka&>uh)0ZC6vO^x_Fr=J%4Fj<_y&H<9enV z87>i2Uk=Y)fK(^+R5dbNyi`=pn(I?t2QeCQQl^4RqLPXy+ni49Z$a!m%1)gsz1u`9 zi+KeCZ7WrYIM)7N8CD`b6`+*W9%42Gp}K8Lhl?b@V};?l?S#cb#FN_QY|H_+(*d@C z`a{85c(t1geFnnFQ`*ZVVMalg>gB!8kL~nhyJZ+RtaFa^f){2ykp7+tHJ$xbWL}+f zwkUaZk*X#Y<9lEdR+FkLlXY=9p?EUvp!iBxpI+IGIib81RM)$cH*Q;rXW6s#6l&;& zpb4D0)Zj2aY-S6JTjwaB|F%aTKY%{}*)k*RGF&~;;SGv1g={ch*-_Q%{#e=Y2v(~* z=NzmO3`aPZzu219J~PGUvtfNJ@QCbk#dtV_CUz57;Zc3)q0{rX?mMs*yGWd?vUseC z&H^{wz!w%twaL1KL*SMMvC@9oJEk1<`8@RT;5X0mc;LDqz?Er#N>U9d%!bQ4xi9_z z7IPhUvE7y1Hz(KavByJMiM;#soX$GDv(ti@of)l`AAJZIE|eMExqUiA8YZ)xvbZXk zggmYvTW=~_m5US>mz^pP3+-yK--)65Npx%I9`Cel{{z5vvBpIej8(u`D#JTl)ScVd zo-GdH-g!wdNk)oRnjL$uC@feq97;&qZABvMvr~Fhc6-KQ)T8<)$wWzs+6B_;{&pC5 zflD5m?gLk79ESRs;YGo_dMuXE+oA~z#-8p41PuZNnBfmC#HIMI)kI69 zz_Lopmj5>*yB@@Z`u3OH*-WbF*|4U>tmVe7<1GlgJ?pBkmOlb=y;7nqDz+qet%Xnq zU+K&PvHdnssS0aaw1(yd@+m{mjz-WtSSM~j(p(jw32uZAo!D!QX41~RGm++Mg@&l7 zUyC%$2anr;G}i=Zf@dnV7HKZ~{;SPMbFD%{)b@`S4H<8)Ux6K~uTyAR1dArwBnJ6Mhy4j}RtV%;;bEL&kv(e&-y&woCo?g&d5c+|Y?+wdHj!6X zs2(OuuN{8c3RJfms6rJMiX>}^HJXCyZ;JeedU_9Wq2t4e`;-zSzx->dlGIIKJ zn-hVev4Mh6VKZXk)@I5>{`lH@Gtfi6JrWUHF#H^Z7C(CBC6(wQ-=T0sxjTxQMx&dX zHbbUuYz72(1_5K#~0X<}hut9+jl=$e5sjGPPz(&8%y+MVF#qAc`^&P^+< zz;&;V%ad43{oP~KaDkR5c;v#X%DMy3eJYRB?z3l>6v+W&sn?)7z53}34Pat34wm4! z*C=&M@%Imp9>80Q`&CjuL=D@gBx)-lvL-?$XmN~0Rk|Zj&pBBDj7{~7Y7cjlz0gCJ z3N%8uSj2f(R4!EHQ$)1yU3FCujdqH4ihIEjsFScOE;I+$ynaJl^mv&uZ*~ho?v)fv^h0TSQQn5XfGSR* z>T8EaM(yk+QWqU*IVq~zs&QYbzmQdHv6C+S9{vp1iS+W;*$d}z*t%a zk42h@xRgx4C*PK9Z)qiGCipLz8;{8Nw1uc)dgI2#nNPu(9tav!+xFVzxC;W&b6lj_ zFQ7SB$f^zX{@4n}y<<^%fLH!rxfFBm9t;|R^o${R8AoFU6V)pBzu5RFR;zp{h$%Z! z(GhE3TMo3PgX$Q8YYC{z0;XH*OH#X%rCx&`^nN+JH;m$8-6%4lqp&@(mwdJ~903wN z9$N`?jOgVr$mxZR5ONCq&=3)NMTd+8EIYduAGd8Me5<$5e`X%O2Yy6Hp5-Rv#NALO z(Akr$d*thBew`&E*hydQS&FX#TJi9)MaIoUWo&=zO*oDovz3nt#TNysS%``Rb(S4F z`UDUrnj(awY50u~rd*VNVIevr#DAYY8#^N;38OV9YTor@Azrh_y!qn-e9f9Hj2${c zMM+OWtLSyw+G6jMK%XLxo*BO2mUdjI_gr_}tRpVqZ7q=3oVdB^iP{E--?J>lSFdf1 z^!kehu(1(WW2`lmZQyu0sav97-rTYWZ;9F(IYYBglpO(hSmuG--cm2Z7Iph#J?;Ui zrg%`CVMWBvWFaDcXK!tM5+i*lGe^hNzI0DDgn|*4WvQGpCCV6 z(!w+sgm_rKN~~1cJmeH5Ob;x?NbcXaU>=U7UC2muho72^ME9>@9;mA^C#u_}&B@LN z3r=ITwf4r51Rs2=J(l2q5l$AoXP^V}{39YP^9y6*7NTWNH;gFE*(m&F2OgIajprv8 zKCi{I#D&HYu4tIQ+ynF(2Kw-45HoAUcuo;Df)?r`*TqO@JbKA=%!28l9|3ff0*6y~ zvcu=v5S;;SfFd)3w1L_|((3M?jyp(4vo!4MB7W^8x(oKHm$?eN_jQtaic7H3cw!*- ziYLo1aC0RkZ=(svcL&(;G8OK#pw$`thkY%>t$*?A1+Hcf3a(38{50@&R{5|YSZES8 z+)qZ8H>quaei{*Mb`871LqNIhTrKn*nwVdca;M| zLu%At33cL)zZplDowCJG8mk71G^_LV%!ymDQcn*Nq`D)aVnA7w&CO2bVK=$*+F6)S z`Eph zeNqUiIT7=7ho0fC9F<&#kw2RtZZ$zjK5;i=3!Ps-2#<5y(et;V$Jr}d^yVgle=I}| zs4ibOKGGS+lB*kwwqu*yp2Y3vRA$hvm-k;}2g1A>5eB=QkkTZ~zBMN@CqH`KG8;1| z?K*095Riq!yVfYXKWNgiqiFZ@Ba`673zQ30xuKxxyNB_dP@tosP6_5T4=z_ko)d_Q z&r{AyUxPV+g*slHFKG@_q)drw{X4&VaC$y4I%>wqu|#2{Vu=tQ3P754$jKK@;SeS<8KUCVFG_CX z{12W)xjhwuN|zo3+lxs+Zn;?!)X;^tVt+3kRxt_)Jvu_D;L^LT$Cj7rc0!V@G{u=v z>7Wawa6)uCoA@>C;IO{czn~UWx28L=Cpl*UgHRT_Wr&=q#YxKIT_5P32sSK@v^%zJ}bpYl`kTPsCbzrUVT`p&G%*2 z@AnS?3V#?1oNQ^YK%3pFaW9+Kk(=Z7d7zxXH3cR)w-DlsJ`Z%}fn;tu4Hy2JmKvRc zQ!1xJGcGN7*A~?o!8Y;3)0hd>S2vQBg<%zUvt{0$i7N6ZJ6p->1^2FFO?o@0a6&ClR{|3 zQQqEIO3gbPRAxu38~abj%#NocaTqr=7818zwOB&$;s$kjYk5y#8W_T4EY<_k0V?Hb z2mO{nvRUG+0`h~9>iuFu zhu%_+>%lsvkQa-%RpZ4tu2QAir^u>Hmgb>(Y*YHL-}?^8>RC>%Ot;^YYe%{oZ>6vo zWH(D-x=Os#w-7I+DyKF)nhm3TPB%&|E(aHEacXSv%f?K#PVG&XN&}v zp*ofbC7#4Nn3yMJfvU8Ea$~4i@OSOUPsdpBi`5(-*2BcJhGGQdir3)`7Pob$GNfit zk1xXvsh31kqYV&WldDk^j0?dSuw8qs?P0@>(H47SA-X{PRNedH(S32aml8qk2U*Ds>Zc=gN;}Uf8QTLStZ0${B*h zJCT;0@_2f>o;isX8(!0qPmF*LeINcJbN@>}{O30&ke06t8qC-+RDd z>jw0_M>5I5iHRZ;RlRrAs3uY$kk{Ev(sJOy;+|zH&NFGr`Y9Oa8O7w%DIhpI(d47v zZoNKX_C|cW^@ffw!uzbir4r0CTqbsnPq7#K3e%wlxwNub?hLQySuCM>SGV1G%MlyU zzF8ewY5qBYx#!+ZvYfc71YHbr`u0HxIJUTeNr=VWz< zBe;ARj6!gjU-m@4%;<9-n2h-{?}m=1i|Ge!@kf|H6!!TAE<$YGE`@k8ctc-JkpKfYbD@i6X>A69=ftP3Y@ zX}2V@l2RUfZ%qd9eZ=4+qMt#+X5n#5kBH_x-|4;m*t6hcjSd_^MG;tN7!(s&L&*{w z8gbk@tihx_;QB=4f*wM4DZ4$wHWBbHq%B4FDiHLR84BW+CDmi7YeKud*kkBZnc402 z;qndiT+8Hs?$PAsQwCLKX`T<_E-2qCXou4VQ|Rlv^(2CjL6;( z+FmPe8@R(MEU|FUkLr-=G~@KBs!f==@TJ7kH`(rRTCLp^(N)xE0HJJHYQjG|YQndU zBkhCu&6v6H6@w!m`ZviM%fjH529-;5gz-v>s#|vy&<0- z#0tdU$sB3LPPuXsOci7kFoBq@)98W3}>rHqq@Qg&8@o9Jry@r}Xj2lb5SHnR05o?wnvYHJb^`J)2bbg_|lqJ#7Kn2@FX7-K=4}-f$@%kg}}Q9gs( zaivVuzHRiog%SkP*mZNT{@de~_W{8_8i8(^hEV`+*;99CeI~YDk5Qz5wXcVdaj556 zk$FPIyf{ADUXJtfUw|vi4aaIs^QL6Lrf^VpZ}j1) z6er76K3i^~RLq8KrkjSHY%zl)5Pb%Nk6Eo+?mhlM$-Nhvfe+14LtfLJmwa*tR_U3d zu*0JcNX~JoeuZ>H6n+`79|iI19(Bt;`Lfa~yk(y%^YwMW+^YE|S|&fDGR2VLh1OhJ8LH_NS67De-9LzXPx9SoYAhN4qF!)2q_zl8 zbLG2r4~W8SG2D7XSg&t>p0X6J*DQ@E(_dWd_P`sQK&%$8Wg!6v9>4iLc4+tx*#zPu zgOrqhZ?R^*6{u!wRM~cq7ffoptv3X}lvSl)Y)lp6mJ;CuwYl<-UC2`w%HwcFnTN^^ z8I-wi1!e%uk$Cb|%UJyrm$1E>I&rPNb^J*@am|%z9kv49SxddXVFK`5Bf>hidt%fi z^rYv75GX0bQb<>%R#X1`e^ZwpLW=o%ir@<(yjN#APTaDf-r8LB!AA%1t<3^GMTcU^ zag&PQDS=7}3}A2<6M0uforphg*lRudlM4e(1}9s-;bV%0cZE~0C~vsn*WGv*u_%AuTv?TO&@yUZz(|}@eM2cu;qXp87b?2ay`|c}m3S>)UvLfjUR=PD-_f4h&=GI!u zhK#o+A3z(jH1K_ngCI8n^%8t$x7o+=CHS%cL3kfDAQxeJOVxMsJihcK)^}PiQ+aLh zDjEZ%MK+%!x4om6$L1;N;)08`Jn5BfiOW_b{oLv(Dt20noqouBS8me7guQrmo2qU$ z^7oxP9s$x7GHG9Sm+3aO&}BMzZ|-iSSs9=SZqTcCnQmJPH1*T&org556q?ZRa=Owk zIK38VRyiC8k!E#(Cb*Td+GRSm7HBT`uyQBTtWjv#U8doNKx}t%BCn@|_wlt41I=26 zhS_C0IRXr~O`_@{<*sQq6KU3|G{H(7wJy_?g*@E#x+7>I*DEv*XdVZrE4FU|jVvYK zf>}16+wKr2oWw>QD)59;&Zd$g3P7s3Jfb}wst4#Ro%42M56}%dDmip!%84gifU*ls z@XC?O@U9p$Z82teZww_i6_G)=(vV>WJ#CmOks~iT`yGCN-o<%Bp zQ~CWzl^DILl=-kYQJansZp(K-)eyTBe2YpPz+wrlax%8ZvQv)(%NCiXpX6APscrHq zj?_+vbojJybzGf;>X6u3eyIn zvd|Cp9+`xdg?37e9tV_;QeuJB@`q4CjVcR?y4SV@E|oP+dHb@PD&B*U?2<;}FDlmM zMre0KQr=6A#vtvqx_@_Q-i5fG%@Q!#+BkO&m|Za%#<@FmoE`F|vbM%IKQ*1R+8wVN z9@fS?x&4LHzJT%WF^pGl`=c|v`Y%Lvjsp*jwK2Ci_-W-2Fy_6iF-Li(Yi;a-v~q3i z6AsSW@-d8kpE~wzsjqW~{1mx#qUhNU+{$Jcu4FT!(5W~O8r4R7`o@^eAHZn$2ah%l zZe*i2RJxE7yNCj>#}rG{#~t+4(RIJWNDl;$v@^_a^o9zPiXX^<(-3a9hB*%Uo%k82 zP9~Q&xMdBVOb*I&@IWZh?aIisW;u%Bo>K2@=d=^HUs}|3SxxgAr(C%1N#Hny9Ck;6 zU5-?$k3_?VU+E^Q!d}c-h~5)hOC}t~-V=udyim9Uz^hp?{nLyBnHmRNb7UbAFN_qCWga8x6a%qu4fw^XQm z=+AHa=Aac=j!7&|Td~)khpWKay00DcQPii_nThG>gkWN%u=lXk3yd#gZ#s^7+f_0T z)IW6$uv?;>9jQL{*WCu){L+_G@Lkn$BL|fs$u<$(GeqT?6!%G$UOSwiNP-WGB3aaf zpiU~!-G0qdTtg>~EM(3m8-;f#qi)NdeEG;mye&IrB+y^;vRw(gQXQ?h;gwIc;_PEKIsVB&UUQCo8`KC0FXFgUQJl8;CZn1JpLOs6fbYnxqHK$NR&og|VXQ}d1P&RAQtNoXu&8lah zFu72<=Yh(M`TUPV%P}+Ne3bz9_^u9b@FkX9q6DT#xh`S_zqpyGw-AYq8tuTh5En>H zMa8}nYofCNN~ib=izL4cV{`13MScb~=&jR_1AjH&gKr@&)G>HGwi2&Z>x38%f>%2N zp)(yr_8aqdBEv-*Lr58Zp$tTJ&hF(+XJh`>#To;Z_8aBdSf2mmER@708U=9;!iM0U z4PsZF{Xg>F1H7ptYy2j?hY(UoCkX-4E!(sdkSjLW#=*vvkQiahwm_DIBm;(I(<`KH zdMD*gBfW1bz4zXG@4c7*IdkvadnKKbHF)IYd%isT?z=Hg?r++eGpC+6dIa98=bH?f zF1It!3m#t{_o9%1Sc`EP$zyOW>YD`QWhQJADSt8uEoaKD{nn$Fb3r&o#8sw{gOK2x zDjwN`61;)QL0@D-4C!4#$cfLLzs$S<5CNW-&+nfIAWX*>77EoTc5oB)NN?xXcR%A7iA4G zvk8|*o`r~M8rI9T9(9b%OqTGns?j#7Gy@f1dh)4HjluZR%T0#P4o`V3*NOD^Da*?I z7Gw6KB)`J^K24*ha1|qM@UIigljGgVQ7~$ z6Xj=0^0hyXdSG+LXCYn-r|lTI9bXGKYb<`aMsb7ae#?x3B~VcsGuzc=Slg1g zfx-0rmR~hzy9X$4iJ)NhjB6Dgg#`g@!oXu$EsClLu;ireET{HXgFej*1^-HL;`HR& zINvdpH26>6Yuiy8+{UN|I!hpS!|O?N_#C}mZdVX%F%uV`x~wj$o5&mY&e-b*rrR|p zR{*k(>#iWQ>{?TIjn9=Z4s9L@+6a6^<_-uDb@iYqhBqE*cMKV9Is=g*0}Sf211P!v zV8))kDAyBp23=~zxu+~8*8}bgR-;@`B1yC>m<5MKYi=toOQ~q_r*1kj8KcFMLrG#v z@L(~G)*v^?mJm4_WcM-YeR=4G8R&g!!C5ODyn;$MkeFCaOuUJuXNw|eG^o=eBxp$! zKx?)rTUeUFmc%b&^VWH3=_lI;06{B_An5d9#Q{<*);45Sqs{oQVIti4)38qyzJRYa9xoQsHr6akN-QZMK?TDr4 zkM057cUZVtjnTAD*<2rjQxQw@L6jsX*>g+TtsWg0ScZ11I~i%US;mfKt(#6t(5OY? zLwe7(ChS%(%<8@_6*%syfdc{>@$HDgj!_C7$j%HUPj+;?Wh=^)yE&0zN8<_oO6P>I zdAIoT#)W9LY8#C}B9UKqR*cYm%d6*?8`I}uHdQ+zQ+!s4$~+t0zH$a;p4nq$k(es! zJxx`U`iSNR_&<=UdSe&(U$tm%1pl;Il&^OGD$FZRhW`?5Q`s|OOXfj#rvCTeAs0`4 z2zE(!UCgxBy;(FI=^MdDRpS5 zqGDw}dhfrZaAi7LN7BjP(dqQr<1`-8aO77eG16jq{?C6OFNN{s@bN(EMGvRnt1rqw z{^q891R3)lT!}t{T%Fk!sIZ4S-c@?Rj3&z#eemVy{~CQWFyvVnc<2G#W6IvCZHPC+ z;*%F2$boNn(!M>=S&B~sdq|Op$ScG2SBT(b&j-a8czW|{WXm_$3afqp02@{PZ^Y6s zmfa6*_b@iMORL?co9Lta>*M~G=F4o}0be&Cv%442cILDg8)v!{{!w1adLR7loz++` zrhxH!{gqHOgboF1mlD#IRYK)yxJ;#sX9UWU~i3N2J>?i*B4dMMHXC~H(%yUuIz zCDX+u&vgc{Bd**zDV7GMBuyY$(ul)o8qxsZit?x-IHmyTii3belyID^yu44HDi)saO_DbREmibQ>ZH zrNxiekHRRFZhUOIXDK{fI%HJ(??fpsB7Ksm?m;6y{&Na;59-d@vK*dL(EWvM_?Qw+ zmOK$Rl3MQIlk43&*A7HI!id7$amHjt1Cm`m>cm#^!vqaZ)K^Z(~gD)o-f z{O0P-_>R9HM^^3#Ryh69>cpr1Q+47g8%S!8p7YTLQmnC81p*Mm6=H|TQ)U68B+0Xv zR?J38(u;lHSy@R~#jtE+F8l}1ES7GJvlTw?vLa@McUXu@!W#p{j3j$J?aJhcEg{nHyzHT=N4f)NdF?riJBY49X-&mO%&6_2)bTi@ z6`VAay^kQ^nk_qOC|%k$!FI1jp??BqM*db}@8~F{)}{AnA`dk-@9Xp5TDR2+oGzWy zEN7-A4d#2j;DF}U8*sOp;O6g!CzL7e%}i7mT=Png9T+dtCxSX6nM-TQ1@2vwHVI~! z{hdC+Dr@v{72llUdrL+vCIle;?vw7iq-54O7l;ldXUp!X12w#3Bz%v zcWxVQh_>k1AKqKNE*E&+oEH;VJ39l=_)HUC@a(F@TwneY1v9QisELDxrRgXiTl0^O ztVbVPC8z6Oj%7x2!LQ2YgzVBozx_}22b^R@+f)@d?zxF;;tZ3ODY`x zVrU}eg80bdu38nS5Kj>N5bjd7otcPCfQy=3b-Wjhq@Otwi^(D+e-5sHOFyaf5ZZK| zR4FfIhgk9Z`psyE@N?d(vNAYF^d-RZb#$2zMhKO9sEyE}Y=KKBq7D@}0XCRT9z_G7 zqRp$~CcS)Sze#wL216+E{zQ9;-wXZA{a9Doknl`^Vo?In=8MdUw){4BNKH)_K}*Y1 zTT-NcddJASM+Jep%Aj_+OVPlG)?5@Hn&}i>ZMCwciA=uIGf#9u>v_W$3-e(N{rMQG zvpuEGfncYqtOScyj?3eO2J!*@TF6F?8zLUMCSzCmN{|LBtwc7%b!2J)lP-VY*bBfn zz~IY+Hull*YCYYt4(|l^5I4)2;~UrUixC)`K2RTDT7DP316Ba%Uf)8s_4caTK~x0X z@pfNL!U(u(a|EbMq(Mh;-Z84Ug9t!=4hjGN^#?m`K`-+lP5^BPo#`&jh46x@J1o?{ zwsVPMMQGNRA5V+OJyHD2d*h#k@eC%%15ciGuT~R0B8{Q8V-qcttfZlC$vft^8-usx z1AJ7hxO$aV_mPPc)IL-3%@nG3;e?Arb);uJu?1J$%~RO)@y}*$1-1vHvgL!}lBg;C zZ;ZHMIuA~q9_OL#9;Ce3&AT2rh+gdfM4dfUB??2Awj*2Gjv_eOT}Ro}@4E5bBWP29 zC_0Nd&>ll65LBAEBMNj-Ri~cvtqfT= z=>Ymx9x*84S^#Y#^0_I#B&27nMWi3}vbRdcJqjF;at<)dq_Z;bDLz+*A2JZRyVx+; z)V@TzGM%|KQDNlUr+?hr4o38tWkeYs?95fFx%BiKnA@Mai`$4x%TUVpG3x*BIDoc~ z#|<9HMg$e0hW%K;8rVi__AX6Fb^D#Wq3v?ibDs#M>+CG6J)rFVq@o7Kzi{17j2d`S z=Zo$hL#+$406GjtJ@W`AV(PByOZOX3q)aqN8pk43TFrLsTznWoW zSE>zHT`ep1WXErIcL0_lp)BUZ9bWP5QA604#pX|0GAgRJ-p2gHXdfFIO2(d(k;M*c zd;NyIjg zaXoL0i}hWq;Q~QZH7Yb_V2`S~r*z#@|Mnh6UH64hMt<}os*EuMrHQ6YBcQ5VJ@QS@ zgIL|_#ZWejLZdFvp1L*m^{HH9hwr}>@_qEvY4*r|6XO)V+KI4%=hcNp3_v?wZq^!-3Fe7SePSY&ubXUNRQE(ZD@yG1X)!hzMPvip!W-r8^ z$ggoex1$`qAeM|Fag4Zd14+*uRYB?!|KN#Ox8?N^G8a_T;zd(fgm6wu`vQBEazoNA zR4(P%X30x1m+}pR#p?)arr=I~7c}{GxYOK@K!9CB9%mrvEVaD&aYb`Q2VR8gh(!xp{PCuv=-qsab3jTuC3+wpAj*o==gbJYOAku4NONi839&WRLL>C}=M<;3T_V#wTbG+q+j&i#TjRIId!0j!E zZB%aAHQmw2(?$QiM95iEwu7jg{8tAyo7Mv;-{q9PD%4nG69gcxtkE3mEGsr!g-eLsX3np#OBn<LAbu(I1T8NG%`xj>c(dPtFSXx!g%O}f4y~3w8|8T4w zxW2G*g_;86#zVas4jj626uudTa~=MQ`2)~?x44r1 z33FtMu50O?WlQ45WmAT&&b@cJ7x=z3_N=XjqTl2AJ4PGpC_%{5 z{FL9N-XFWhqu=E#gJ14NCVU7<(^1itL%KHJi#OfZoX+QC-Zmq|(&gic#qlz^N{_=( zUM;8n++KIjL|f7~<~Vqqj@=xBx?D~w(q_=bH*LU3n{Q19jC8IFSP0auCRGP4xTVFe zRzUEbNdPt+sfmzY4OTB=Kz})$t zbV3x?M%gvI+hFDKXP6C=Qc?nG;F(~}!_Z|x0=hI6W#K&K?Ms&7d+28iRrG6uKg4xh zl`*!2{pEsFPu+y}mtRaiNj)9sGzz5rEVhU|**~oMWyKRf`Kw8(^}Rl^r!%|9BTNJQ zr&g1I!o3lBre=-ocMQ+e|IASp$2g#xH;44RQcXSW?fEAwxh(CP5x2JC2gXQ2qD zy%`UfFf~M)#g@#?r>1m&d-yx!9|o4+br$v%~3z{ zweoL@R7_co+?E^}dsJEd+KhoPoUP#O=1)G3s>;F&ztd65 zldy!!hwLm;dDyo)KOL6S61yy==ggKE=>fRt$w5b4KsK5t zGqWHKn@x8XDPaJbzY(4%sgRtq&1Se7u~_giA>?{=8Q6?{PCv9D4Uaa{%@*B+K@`%n z+L~Y0mX}_~>7zGb|DdrUZ0ykr{c+GYWnJ;qbagb8?|$$8dnTdpew;xQbX7Xs>6wMB zikW64R#?k`%5(bTna`(Vp3`{FP!){DL}D!!5a~RJy3AQnl`|GIiL^va=F4j86bZMz zyRsU_FhL&!IIYoFp*S}LO+(2o6uvW(d5E1klD=g>?s@=5GEs6Q(kY%b3`TlYT5y%Z z9E+{G_|VfZmPy7~f)$0{6ra!S(lc=BJhXq6#z$oE96jT)wV1&(nUBlu2$p#(10msI ztdyQ5d$ow0*h79R)Y(V=N-WP9>D3~( zuo04Mp6fXm58XWssHU4#<-~Q)a-sD~baqHYK{owwbq|XE!&*J<@RDiSN+^_NSHVWq zdcOFPC z?YgA(ho9Tk<$AZ`*O!H4%+B*hwgi${oWxb`p<<)d^$cmn%}f@GEuZfnh5dPFhf{>c zMTsG#&k5Dt^N9hEuf^`3b2vq?)KJbb-<>T_TqEVF{;bWuE!&O#S?5wzhM`poOMbS9 zoiqC8z+rqN&f{FwmAxTbvFN!tl`gYz{vIaoNQ2xk5}fSFpDgx zvO=}uMkvdUe_{NsQxbu3fzGIzZnD!uLhaO9aQJi8La=1-9~*83f`uUjc~x8r2|q5q zdnoIbt@{^~vFGt3{`HuX)Ma-F<-2o#-FY_p?iO3V4y_#eRXIH+)w&c`XH}&-mYvi8 zoUs@Qy2K#B(my3oygZ(<;1o%4#<)XBvNVK5vIvp%o}m1hgL7ApMStcp3yEY2B6$wt zcJ6uo%td%RFSl^ussxC&QI{ucC~lTB`rXwzTQkd1A1%b6@?QmYTwzo*m0h~W`SW4SE?vz@p~`$Flp;${O3&=nIX9)y zUdqa4@JJl7K}mL9sR*T>|9SU-9cb2s({yW}T^wf~Y8^kyo;n@Zajnk7R2;5->91M# zvj~TBJbOh^?~LsFkM6{G#yTr$%s0Mp&LE6!qGOmZuFC&e}Md88ljBL+v%jkK02F?6mKOW4qGp#U|A01#q990*VizkDrO?(%`TTNHU)+a2zfJmR z^dO&HM<1hOv`}f3-ObeZ@2R+c34VWb*!Nu?_1~wg|10huv=*)ZTSC9z+1cNPO+$6P zQ8)$iCnYJdvG$j_qaJwr&IvwX*c!^9`$E)2sVlpsiTKW8ef}PW@txar{*nQus?Gi) zeChd5G}L8t{=5AC;<}Sgs#kA2Z1_I7Gbyc$2fDq%Hte%;0A8D476$~3HghqVKlgP2Gp z5ndP4OkDl2ydOVl)n;`HFzt?H67h(Grlofy_1f6i?${bT5bcR1Vl}MeIzxmVZq9;* zJMe|QH-txia%5MFs=}N+b;3-vJM2Ri==xfgnGZ^0nXB9$*ID5PRLj2U-tL@*xJvsq z64oonP@Z|Vm&^4>wfb3o$>fcJ_jh>B!dasOIf7ozJ7CW2l+?}9sY7>FvVX2#SD$wAO$cCb+3LZ!t|1!N9JIJ=^>p1>TKIj07Y6RP=1%C z`5We--{r8*lF_fq;qK&b55bJAI9>c_h>A2D_Cm8G7-@Edq^h&|BD`gP&bnqCk{u<< z@`D5av6WnM=jsKxlE*^HavT{h6-DnJLNC!NI!lGUqq92S3)L~$qmSJ-!ghhu1e8W_a-Zi}AH`D*g3y2r z({`k?b0KB>71g{n%^)f8VI^{_VYaxV!sttG`mksv!_M6~8ngaRkIo>3kUqtP z?7io!>yKlk!WlI%2qEP61tHPqyf|kR%91mqQh=Xbh#@-{)cJ56|7IkfkFzw2{?3%j z(o`roWW=6z2Q@~SHHNYXHe9)$Wg(nxA;>HX#snZe1H_xJ{+YMTM~mb+{QFvvQGC8n z?1R?Lw(hwFzJIRu`$gS!o0NF+rN>UZEr);b?IMgHIFEn3peQ${flHqNDyL$}#`otq z;OpnJua|f|5TVLVaTvH3-3?>2gGmT}$r=<5{nJE>{|OLBM%Q+q{obTrKwSR>iDiIg z*O&6cJ#y~MCFqB{fZzqm!g4xo_Tr8aT#?b`3TKwe5lA|t(O%3EXuwFJ=t-K_SKX<1 z!0Uz@_AD2bCC%{!Pw}ykUT4a}F=6+IW9&e4A*bo$ah188r6G-njf0{+Sw%updL3&Lad{8kwy!$T=Qu#+hk3Lnxqw8 zf%2_01KJJMWg&?MpPq&t0arypi-P3*? z#?)V7aAB;BmJ3-><@0&{BvhQG{H2d9n`;NED-9~x*Q^<8{B6fn-Kw82Y_kO|{a0Ce z^httNAJnp`wDc4DVXJ%G%=d7$L6q+bmQ>WyPNHlJyY6z1N87?R22tJYAFBWF_jg>p z5c~f&W-Ol04o^96FBQ{OmmsCU%F1%8=FXPYlh@$u`&x~-EIdnqHG)-HKb5BqT4X_S z!lD^yg}BbjVCD$agdi=CYzh1tG4-je?t^C+0K@efgDYsyOYv8O9V8o!)ebBxsVSPQ zup$($(==t)o2@8`{XdA4%uuJ5Q2Ey3#yX0OfhRT&_~+D(qzz%^ zT32yodmfDBCgDih=P-0ErJ+67!nVIiL6ny$kta1ct#}dIDQ*_h6{Rq`{tgI}3_1mf zn3$w6(#e*{C(@KDW9v}qW< zR7_CA4ohZZOwjF|#$8a=yWH=s@&!&v^^{#nD$8cYq;s}mmQ8}j)ZfT##OcuLTS03M zKg9kC7fSkurS!=&Tl{wu>XSAL2m7$5J~0+hCxsBQb3u79*1WQ74tg*WIYUU03rt2d z0Qp(qMq!IayRh}heHagtq!SeM^9Pd>%j^*T!_O6{WVvu|a+S>l6_+yMW&330NVaga zOb+K@Wx~~QaOK)EA7`Wu+>HLU78VYv$&gqEEyWbkr$U;7swOaehamUFjX29W%=9nRg=|d`Mc9X=d^crmSa+b2rByJ zDZSIE+w+_;O;_OUd6&kOmZKLyGuo5z@CWoWgXm>oFUa*j$L#B@Vk-39pD9WjKGfd53#DOd1WiaJk1}~fRr`4Kj4s@xtq`4$s<%W5BcYIH>*KeCgwxasOv( zP0;EA}YK)(KdnH*-pvr64igm{TphU7@vw zvVnK{bMYj!fp^fD^lK>Av#mI)= z8Xp)xqsaEi0%RJ%=v3buON(Jk9{!w0QqZQ#7dB zDO7c?pVB+C>Rg=+0yg|olp%i7pV%iGn_oW`Z^7=Ip%R2% zJmo(T@38%c4eS=|p)+_rP8kIG{Xp!?odvf}$9;LP#-K&Grx+G2s|`kU6-skZ?}$Mc zUp)%n5k0LOnO=VhEDLE7Qbt4Bf$qKPylrR)y3eH1w?_elfPiC+S?|$Ct4?ZAS&I7( z_S%QJfcI-0`A&ZsD&L+GXIh1`q;G1q4;nzne};&?`(=;x9jL(-Yh<0B;L(scKGJ)J z(%{^OMlvm-m&SnQR3#8(r8=c040~kFX4DcK0s^&K0%dLatkFrVwrX#kK&zTBF%8ly zL7m>OuARIJPj87%QPsQB0VD%;^I+^IIcXZ|b@9S&o>jOvOT%emGlI!85ckXVzq~L8 z?-yq{LySf++1*L`CC)mKIvM>EW#J65K9hweFj+b(`_X&j3|1w%+@OO(Pta~5&iV-P z0=obB?<3p5JXKI6annkuKBwKscAkvdt4kwcdnMMz5?zS0Yens(R)1VM5qDA_lS`4( zFH1+=*7w{&}B`XGJ$cKYV2FixK~&T8oI9&R*ad#S&+`DqaESbS?^4>9V1#q##EkiJZIYwp!74!O6Wewo4Umm;{lz7 zcm{4*q(@PR(6vF=A@-|bzokq@P!WQ&k`B&6?{EOe=1yb^bQv>@s5E_~tx{0%{WN>LjYI1y_Ace_6@kq4S;rzADD&>g{*Sh>8t*PSbD*p=r(%{<{^~IuW0nUp8eDk3L9t#fi$4on<@7G?nv_5Z+hVA- z?Ft6$>3W^oc1;{^w-?g%LE}ls%92djik4WGoqBT)N&R6wzB#MK?07YCgN?$tIV$_i zkveuiW}gkxXi8XlK#Slp^Z@4BQkNx6u`IrA)+S^b9Kq6&DNS)>;eq8Ad;B%GJ-!pG z-aTMtiF++Ts^URa=O@-;Cc%T8Bm_lva>yAvOJUrYR&3#%mek9##0{mczD7(mpx`P%XWQSXNY?&JRuoZ zE;v3OCF2u1gPsu3E~QJrTNW(!R-s0~BC5M2ic73WuLxHHEoWuH?6)`KS$UEq(F|ZU zf=Hhgs_*lmvlbrg2_#R2k}yRix*d!TJy)fFP`3ZeJ)I7q?f+@cDwEV9JzEq(i%$Dk z1-oZx0>wEDl$5QvztJAtInOczpErOR43HQb2v3&=M_C7vkdvMZO6N(PI%p~CJVTHK zQrA4LU{$G;kSz&OlWml+JiqhsOk^1v!a~RxWXTg6*`--*w#c`BRmI_1CBX7r2#YRj zVmen+r3j>%DSK|ex2J4Cd+zh0%wgv%`a(*}MZ(^A<8|N6LXH=rapXl`L|Km3M847m z^Gh~iWt$f@4(P|B_vX+aj1oo->GiP@`st9SL#LvC`jW=u!$WVjQbb!j%U*)b-NjIK zBHHF zTik69MtHp}PpM3n+7kH2H)rqSxqq)O0B@{t`Am!akIZH;Q6tz{rAbvLuPV}cE&ex@x8{7@;%D$P(d?>+z5 zHl%sSps5O@X|L0?uLGJje{N&7-rm(|2)$FM$*lvL`>y|e8qUpo22J=%W$83obwJ}8 z@!UA1d0(d?^kAJPPc;n@xAskb)75A-9;VZ@4xgGd9VV>?82OV<(EMGrd;`*az-hua zafVKlp_+zzL#^)El)YO%)M*Th1PVQtgs#1^Q3OJbUC|XPJu?(b@3r|0@eTD+Of2ep zSWzrvouBMMmXD*bFwdzrG3w@pmwUC`4TX0dTaLBC|1Xqq1aMWZkiu1dcusW{leg1BY3H*%H zS`2-tb=6ehPF4@3Vj~+*`FuUbMt*K(Fk{?mLXciH>OE^)JzzJ!XTQ)H(!g=p*KE*D zWIzd>^zuA}6mI*==J_avhjSiprLQXJgv!q7;Dr8<&{UWQ!lU~xzBHp=y_iM9e`(Nw zInCjLCPL-$rXk)koh0$maEqMp0>>j2vkRINC>kQ05`dVjd?{}42NFvQ4 zEFuX47VTM05)$DhsOnL}!|$ks!s&i_9Qm_G$iS|X{+f@o^PSEEi36o9fmnKb%gzpEzwUkdsO@OK{$8gk za8&x-PJg`58NbLZ_xd%B@}}WB{lH18{AJL#+?HM^Ha>pEn>TCQ_mW4V1?|Uho*YND z(;p?w(t6fxD$g1fmweTq`TH?0`KM4yNJiJhc63n?4NrD=*@$SsmmcV~7U%Hia5|Ye zR4T8iIh^q4OFM85e+i{bifs;~;mOV+RVAq3y2E4f{`obOF0HD!vl6m`MawL_qGg$E zHeQm!JR2Fm4xiiunEppH$tzZ4!XO+#6qC^JDje)BUs@SuVk#3n6xw@Zi%xSj9PZ`-jXlguGey0*lVYrMIW6t3Zud2Xhi;Ur>$j}GZ?!KwFmjxK1;YG%fp%d8E$pFxs>>|lm)P{qzA5OJ zSj0G8o_{vFX+-XWhmmHnK@+ywQtL9h>8`a|%xAMir}<~2n_Bm=uf(}oYS4tqgw(o> zZhEZezRgIpOsDy0qnmEo{(r0*^KzZ$pN(!h`|(GnqhEamrwQN0bsF7t^SgZxV-(Ly zoyJtd>pr^ak_MSOkY!a&Eb)zQ>M*?CI%HWLg{7{do4T!Py%D3E)`YUuadcCwD~b+a zbkkabqAsJGavm()fzeIt2#$YWbW>upPE#?uX+5X?2cnzS4Bf^mYHqMH#4);w$}?ZJ zY~j-GFb^Ab2Iw4|T{=)kM*}4?596q_5*5CjiP)Zlt<&eDwRe+A3JKCy(gL5uA8=}M zg(j6UeKC(~0i7D^TtWFbFzX$)IT@$^)Qx^PBv+_rlUiKqu@elb| zP*S9=%5i-ABrl9`TRcXH&s&vNO2Sug(zMfA_pj{&e(UQ9b~Fa`f=EcsvWX6#{H!K$ z^Obq}PCsMfD(qdbgHd_=JMG2R#gFXx#S81fj?z+N)MZvtnTNa9Ju?|I4|kprAG^E7 zfYLKaStIv6^ZqJ)5A0%uRqlWG9a%NJWCPOdHfX|C@Vb0Qes}qJ_Ey@X)BLmV$nQJ7 zHx=h*uR-%qz9UO6Z@v_1_USbL>^t(ew(o7im)m}w=AV5>dOv@01=1YgG~t^#ZtqB& zE%N3GzQ1_Ny+CtNr@_=brZZt^IQVngsZuRcod?K#lF%eH#u^2Iq^coViNH^bl#v~We9M@?Id{A`MUsWlk=8|bZS>j}D z>2qmIr<2hvz5?>>vDszoJhWw}9=Z}qHur;S73>gi!4i1dHMTQ6ONB0rarTFhNH zA3Tch=Q9ivx{mX|VJ4~mnP>m$ojU;d&oub+-Hsr3M`3emP1pPP>V`$r-Sp0_yIa8AG}Jh}Wn}?pkQGWY-usHp zVV*A0Xke#w&TFqPR7y&=NSTtJ3F-!2KctdXRk+mp?c&@*TbnjXt>VBy*~S}P{KY7= zjW=QpUd?2oDfFfxBf2%;7T?VHiZ7=yYxHFrp=h&oVfzT|FJc#rv@|9(ua7UcYh(`}Shhg)1WoApyb9 zD*tOo9_KAZo3~it>T8jm}@G8&X*0ib(-INkj%$={X{Fj$y$* zW3WTf)f7cd=A48qq47?djk|;`Gjz+wyH|Gvwrfs=O^l{w^;TTmU=6NbW6qZ4sH}8> zK4jK>#m+_<3CdQFikBZh@{N%g_j7HH6haL7*&uGR+#l~gj(W#+HE<}TAWqb2O+TBC zYjS-}6haKyT}$=&{IT1N{n!b-38%=h6~}Q`a6_5p+??^_#&Jk+15J<%`!ZMIz9ja; zf)Bnui2I?bL6BI`50Zw=!%+i-^sc0$@jG04$pMVUZ+6CMV0{Ba3+v*+4=PIj#IDJC z`p*O4ze%MXTe7=?dT(ZQT{ae9QqB2{K+C^DT2o%#c5W5Gg6p7MgR0oZ&JszHnHp5#P z88i+52O=$xc6n_N+6-^AGQ`nlNZARzzrJ!5>$BgkGqCOhOz%Uhsl^emFi(l{vS<8s z{0Ms46KdpuyFy`h5G5I}UGeJ?l#I5TSRif>vvjeY5wwjIDaG>pmAFA$cm8NL-k^yF zli_S<3k6R-g)2l^a?c*TbPif_lcExIO-8OR0qF0JjTrF`Q#UWfz5Y(|W%E$ZB}buB zyJINNY2VAg9fh9L7Bx{wOpl5?soufB7QB;Min-#nham>1vG$kgd+fjN^Bou&*(z3= zIL;R34;$b3(=q4|Yt8r|poq11;?3{yX6gbR{fgOhxK=Iw#EOWtte~{ayVo8)hFWGD zHV*#@D?a;)AP9!ps-VlQ zg`Y6VR;!s-XR+h~D3(`E`CkXOVLt1fY;66Vem7K8>*%az9pv;oG*^!c6PhKYSDdnZ zO&+{_KU%)-LK4U~fM{~3yBIvV#kvWHMXPsqc*^y5SVdUF5`QVj>-D92ORJ%Fg0dJ6 zDpqVj#Rr?Z0O8#lVX&kk&yhz28P#N56+%kSBc+Axd9Y|7Y9VbIWr+(??6bu+{DjHu z(kxW0--4$-YtgpaPG`~lktc#9dyXlZ|NigNSx95&G~P;w%TpILwxr0LWJ;f`Q68X4 zVKh)|6rCIUX^hw<`&g1b50n+_;-diJ+n1}C`|-eD3_(ltw=?Z zofqmp{c26|GQ3Ya)JTOv0198wM7Egwp;N{oOGk}mfWD^$y+VZ-fV?atB1VF(E;xcQ zj5#EWCe_%*gl$WOD6%U=b$>YE9zN+lAju6Si7C60J%mESD8SCD?6q%8=8I^`ht{nw z9RCQ=<}q3*q3tROcJc*Xl@7Nh(#;5O>7J5h+JnXU2MPLLU6VVN=>MJqXw4pUmV;U> z7I@M-!Il^~qK5Xv>nmYIouZBi@}Ez1P|DV$4dJVOxcQT-&{vzU)0bgc^N{j>to|U> zgNJvK-{W)}qln(ZU3O~e1N3%Y*Bdx?vq+Az&p5`#s%7Z zT2-k-e`R~hy!I0KTdsHtRTJ46qPolfwc+V~b|C3)kYxD%Ug)5a=B=!BcuI4iJT%yA z0#Iz5yT{aZyC8 zZ$F9zr2+yLvzwuefSY+Nb8y2aFD$~iI438t_7B(YIBgn~-Mg&_iVhXu&qsL|ET(J~ji+qt*m$tdR(tj;zx|FGuYMcb50PDc4X>(=1OsNfXDdo3D-?8#_Jye21K ze01w=z~JHxRs$M*JVV(!wB$y4%Q_S-I9J45t zod-%&Y516H6Ut-1LE-n7L&L|IA*9a&<#8Jq4D3aZTYyvCQ{}7*ZJ`=X97{8_CTv1K zJbipCMh^u!LwNkCen)3PsSkir=;5HETCVPywF9GCs%oOC0Y-X{5VG=_ms?FmUqb&H zSZY9#UnRn#xZu$673i5C5S;~2Zw)xoGeg)8uE;DMf%zW;8BJB7f^dcDAu-DC66zFh z80{W`r?@(Vqd3$j2XoR*83h$JG4Z!~i*aoRAw|C`r@uP842(Kp4~HHJ8U3A*Ky6r= zm_g zQ?`R9RV`-V3+Z8vc>rr(74~*dh3%>A1QRdTIeS)awgbZ>i~$;>*;Cx*UTDr#p+!7l zd@5UZgG-@Rhd9AEuPK;~HuOgg9@AtNKN4FKM={Ush|iun&>u)1Gf5)UHYKsU%A^m~ zA;tT6)^Us|ecTv@MeG=Bije`(H%8gbMUhOnqRBxdd7@^L+}ya5Jb8G;93*+NW|BO0 z(V@0ve*DZm_IY;3%m;wvshUY3WU3ZbpHQ?VB@06-q$O}td-JY%OAuN!X`h0$P=IZQL~wN;-8TkK}dLZ=omu&C?2CAGe^pQK8*1I z&&DtceUi0^)hMAhva{QUZx4$#sFm;2-$HpIK9&#aQASQ+5C7^uu=w0bsMGJhhPa%;zj`6~ti+w+{Qvts~DZDB=143{!W zomz=4G)Rbz0J6K%)`FV|&5_(T=HRNQVI(h5BMGaZk&=Qr%X$ggf6=%o+wZ8PhO5!` z_o6;7cjWS@dl?d^ebFK3Vmo~QCGGnqE?*tiTqk%|9o=yVdH!qR2`^Y3x2o#|&+_Ga z*CNl$22UN^tWMj2Jg-=I>a6lQ!E>MQtE0&Cs=-r-wbu!s+IRPVzu=$@aXBg(DL%S$rHYv<5nGj>VJ53cD)Vv1J4^ekJl4`qR;<^*o@X(=v#D=gRfpa z39Ask$!Yzik;XIj+)OFb%~*-z78SDh5Ov#U%v!M*Z~M1&q9A0}xt$R72dPMyiRAU9 zfHh6GY3TW)m?EMzDHc8!bP11f!mmZO4v_QOcyt?o^7q{++i?M(+1Qxm|>jP;$Q2 zWz&P7aRejF-`BXyU62~=&+(QQI?C;CZ#kq9ms=8rA$1P+Y#05{Z3<66C6BHd zUojQs(J(7pKEy{t=dZq4e%=x|iaIF1Le$yeD9iqtjlZ6W_sa)5Q6S&xPjv&0(3Gw& zca`$K^jq=Edi1`0sPVX+nB&OySHSKqce67CiDfFIy|^H>+#3^?_F9G%AB9i^sy!vz zR@YuWN-2n!;pOf6E<=yl#}O3yes85qPyUSmZ2bQG6+3Y@{?E#xMXknbO$g8FW1Cv7 zLeJ?ZkreF8G?V`o&j_Klp4a}<(HL*=sg)(NL~fJ~A}gV(sE4LMX0AYr&#V+^>kThF zAqs;Ea+ zdS6hr=9Y|kZ9mqU``-HfkXJ&am)@{_ik!C6WK`B_!}Qx$VAkpn7P1siX?tf7UaP3c zQqun4({Y2?b9W6+oQZqxN6Ux`-2wf^Dy)FVuhE4`G_|sOj*72&>8oKIF}~&}jRQ-P z@cBgBc9=z2rFWjnc0cA$-G#c%&pHkC{uGpR2Q#_2t(W|sONxwRS=c9GNfogCVzLxN z!5@2BAoST(Yoot1-!GLNz2}GTj$?N8ui7X)r65(gK-0^m=&uUh&L8~+4mI+?!%zs}fsG zvb4ej*0`%E4qNHnM){Do-QIK-`jGzAh#^}PS`UZlit2oG)H~+D992GU)=g{`!7&Se@AV~ANy?$-4=+cVI zFtu6{Rhj06V=K2|RR2hWMo)RO8mUBAwDi8D?&v>`58s1#^eBS>3tT(g@)II^uBlw> zk-NJbumjC#g9Zd$n%Cz*nHd|yQ$F<`x+T0U(CRlk)>8fMc+2vytAVbXpR6lPCYcG-&kH{v<2K?&BSB^n@ z^!s=Ow~!S`GC2V;gS}sE7E7FHDTlP{nB#@R=Joa{=W7&ipzU} z%5a*zEoC`oI88T+vK)bmLPu|+BUqH_kzF0CF4$SNiAS+6*bJQ|2#wV<^V6N!w8DWe zeJGD*FLi>YORv@2T`P>-#qvwJ@C4U>QDqgaHr$bD6sz#v9 zB0;^fhWtHj2fniAauQQy83J4cAiI|+>-QpWzXNFfo@e=f#y}r`+bCzCbk;-8zOztg zozEGlTTC(_E)ecmPLZ~7)tW_S0mQ8x^5>}@hj<%YG7J|h!@F>*jiF^OA%aa$NG+q)yL2Thz zrbT-9P(9N=dg$Bz7$LB(BwC~YdQhfDxC|WTFO}YF%qzY4v2@VMm*`& zq`cT;JRcoEFZODkuh0?bOQPk)IBC*Uly6|_4?8ELZ(xm1RZJtvEvGaY)k`Adj+wJM z1KC<63qYq1mgpMW3D9OxW&E9u$Xz>fqjNjvuC3Du!OR_=1ic`LB%-UboPzhowD30(Y`FPX;87L4l->>D|| z<^4%LQo%HqQU`BTZo0F)VJ0PKY(e?GiIFlNWT6)_u`p(Y8+uVHS{;-&JBDJbyH{+s z$Qk^6{6(WmfNL}7a;B6T&U*xke)OTx0ojp4bbO>`6!i+aba2~Q_zK#>n4zCL_9>6( z72Yjd1R;ALQi<3vFrY;-x9uQO40{=c4UsTMRVC9Tc(< z8ulaKt~-Jn_IA#a;VCsOSb`~1=i?ys%FFiW@5J}w4vnZ^wg=p!!2-9-%sasN@wEO0 z&VF_~CP%2N3q$!z@AZE$6JJ6*b)I~$W~|cV*maI*X&ACQn2J|<`IKKKW4y{PlOod( z(Q8~9S*9c!iu{QtEO-w&nr%kA^lr`qrGs=1_;y+digb5*_3R6w5S<`AN$hYb zt6@NSme=s4seQy%9$yUZ-o~rFYFoR zK_xB&~QR6*SBNMa4hz(=XGekuhEeei4 zgi%I^qtf6tAa+7Y%Njx_d^q**QK&;4(K%A8g5J(fak`Acdz+wn;OuAjAOCc+Yg z4mx4E73sMlw1|p(kB`H1b&Q~)tU^(NM~s`*``Py$g_meJQX9D!DrQ*_>R zXPKkQ9ZWIeG{T)31uVs}$ovJBRu(G9`KK2W_k)V^o-Vlc)%);!{)AjFX3@mX%8!G6rkb>!j5s7`c-OS$+ zPmU}b)n)m)uaD2j2eva}WGixV_+lS~oCSiVc6C}CAv13N*uMy6#+e46FT9_m<__-y zQ3J|Wk*aYvwEFCo=v6)|jKu6J83Ty49Hpe!d%LEuMd@|6PGT`)WtT(9g)P3-q?$t|C^Er=` zKt!nch=6RtlcG-RAl{%Qy{LAMIkMe&l?6hSu`oAvJIdUA8y`kM!W|fDPPr>%& zmDW@xjFd-l$6|g(6C^K-6S#_P%C-+PofGc?vWA?@Tb|?W53LKSvJ>r6x+X)_3GEk< zt!r{}G{x)$2)U!)Bs_BX&^)~1FER#OzH)E7wddA z#rvCQMThL_vt^fikEgx0u>HuY01>KBFjINlAj&=4`}zN_yHzAiWZUQ zrd9LR3m$_}G>Ul?nzy)CrTG+&sU>mm?JatA;w>uF_d*&MT@*xkuG_&7Is}K4yVl&56B4TrDr7nS@E8 zW+=QmiEK;Yk3{o^8`m^>O*bIB=7h*VPl!VuI9pQWO`KJnKgk1}jZcuXCg-}sStjaP zU-A7N3m*XbYvV>Ar!tanZ2pg&&rm`;@La@=~zT!x<9A?bhX`1hKQ< zc%XPQ?(FMLPD|)1KWs6z!xWYgl$ESDTjXv2)Xl5*-wT{gOwN#q|41E;M?pqp5P()J zM3tUX${M)ol@*iF8hC@w+9lx3&d;|#XvCslcCIKp(hohm&PF>@(~$2M=Xrw}107IQ z)AF(sgGkQ=6_avf^CwoK2d9~Zgq8NJgx9Hq87M;x8e$yTd7-SN9}S#19<8L!O&YCw zkUf?nLh9J4{#q})Tr1I+b7KS>Z@UQo6ETAHYEkcw%m3)kIu70x%23pe>z4|@Pgzkm zrd91lE6UB*?+0C#kcnrgxMBp^9YSRz*59~l0@~beF$oHaa*5usQJs6TB(~(p`{T=^ zU-v%*B)6I*eyrpKRWN9rqF}YpS?q$6Bm=eQ6>4*#Pco20!heTdY|ND2TU4g-vDFPn z_Jr}=rjMt{;fD5cV(&yvx1uV00ksR>Ua@`!?tnecU~!BesA-QIkD0>-x67%#I1K!v&*i+_rn6iM$rYCR9!-s=diXCk9A zO3k)Q=@Rgk1xvkEy`i5LGkkV|Ixebq7WG!$ceLkPe5)quBv7O|GhcU<6Rn@s<+kvr zg2nRs@!=7xQQ9VJERgNYtX~>lPKIW((^<44W3!w zg!v8bu+msky;<2jzJ0Ye_Z(NDkE|sRK(UVAvQ|v zAfRqvQI*)XWh~$00Japy=5-sf&zk!nI;PD|CZ`A|Q+~yXjGCK=9oviv5LT4Cb7C8DMgn6%t3i6u25-vVq*SKWjW<3z2KPmVL7eY(^N0b~C8Va!%-$Q;fP!d+H%?$*L}rJ5@xsgF zkvY>~?qM$|N@rUG0{?1$0BLt{i0v?0;Z00+x4HcK!UOjMb9;^1ZzQzTOiQ0Up}3IW z6_F>e?Cu|#e9Pjr*`>8_Dx&PZCp z+ZD963~w6M9&TUwPkVJYFhz2F>itWRB*!30N{r|>rjaP@!b8318@=TpjqmwfgQR70 zI7x8_4W+n)!dcxXnQNVowR zPawL%SRQdv6l04t2PJp!J9+mEl)L#P$BEo+A~7Z_cd6{L()6ZFF?;MDM%&LHBwG5x z`sE6Rzx13@6r29|dIeH+<`hKZJfO%^NWm|8%U(X~k=JKn97O@A&^M5z$xePoxLRjn z`O9|~lY50Uix%0T+-V2Ihy+~)1bI<6vI>GPulaZh5_Dq(K?kUQajgDK*vGDd6SD+`Om&OIv93;e!5`tq5_D@FwhlLW0k;PQlUp}r1pIh>`M zj47l$MqNf96|;Z1+3c~n=3b2%`eZU(&5da+vi>lRdZyIH1W~@u>-xOD8hxEUjnn7z z`hx*spXA~^Ncx2)RM1SZzzJ=f)kWk}RhAn3@xKjNWvQRW<}U;Bl;U=kdoX@i%-B(6 zh?YGgRE|yXhPP&;ZOG4<1~`1g;|qfG@K`9#e57JgKKit9GTtVEFcxddIqRvUo`xS% zi-tDryLYCcH9Ba}5D&r_rbc>|c#wgGCGXkG=HctK%3$Fl%ks*{6;c*&M@8a~X!0eG!(tR($3X@|c)%IVf=K8|&jMv<$z8Q?C)!yCYXl)y4!F{yd|r0^ zl$?9x_YS>jGXRZPBT@?-1VK=BZ#D1(0OR)wdx zBj742h8AwvjyAnZyCx+NoLvlRunTn!Eny&}$VoajBV}byFj-%fjHK+C*Im+TIo=cx zYwQEFOYL-!T()RaN$+s}5VNe~?%Zt)P}6xtr$7a(E;Su0uHk2Iy9F56@Ti3;-xVyW zs12CBG$Ll}o!OMN;;n>A1+DLFIKdu6lDXTFIX@IY3GpwTy)p zg)A49X)v_eeXQ%uvj!KWp#*}Ets}nG)$P*O#5#4@)@LGS8VoUr+Pl5I9qtoDlAa@O z>ay(Hjn4gt(2hFPAOaTFeM0saOVbdV#$~hb-H&ykpR>|<{nd4`UN#$lZkjT<@jK1e z_W+*f84qg``!BGtP!$OOtiE6t)+c(wAjJy9yjdXH0-X^}=(`l+kMZ}wh>)x<+MVJ% zTyNV{5?M-!V3#N>+z=#!R>e82@|XjKv*9 zYOXvX5ryAp!K|Ygx%{$D=n0fT?@C>5iphu?@iK>KYoYl=wEHI&OR?$m6Mrsh(#{Ib&9)-qCB7QfWw$WS1D zErb{q!Pt%H$ZQm)j8eKXo@1k8jP81)d^*M$z0Sr4Y3T9o)5a&)a#MeJS*OKF@PQ?I@6 z)^|CAuf6xI-wrWXs{1}=oh$t;FcYnF?_0lbxh`0~nR#7^gs$|Cr0nm*oBgsD?Y6@V z79tB(-RqO^gOq2qoq7upd|(iSJU)d>A$#XgeIq;VnS2<#z2BMco!f zO#|ytR)55)3cX;OG2&6XLjp-^y3imYOJGan;pL`2dsXY_cUA(y#~}o08MQoMYGE-I z!b|UI8&REe_~<8>Q~~|}h0_=7Pnv(-D5$PRjfXd!iLcpDa1>RZ-cYzETx)=IzOKoI z4u3iLxz&1d`IfLq>`fyRH)G|JPcqrmI+hjYH&NezV9i%dtNC2?{oGt-wLPite;@c@A&&nG(f9N6l)ZeZzC735 zxo1af`2O&)??<%uQ@9Qk$L%+@TZ|lE*2JN3Jt&TZnRC`6$5%CRC|noHs+xG-*j;E< z{aWL2dmW{i*hyE$!Uri&2UQp^L+L)1S8Ujfy3aS9tE8_T-vK#Z_#b8A^}`io_7 zX6?twhJ+*^v77(L|aLkgo;2Ioqppqj6nFwAZecyHbE>DF{Oy<*Wx9UrlCB0 zC*S|YM)d6cY|!8vGhBgTkzeX&h1k#S8jM{?OXsvlkV@rLfe^1H@@_b9zO%%m7K zNLHaF0%gCk_Luo)3x4v`_;MiqLj@@w1YL?oQ3#}0o2pyfwacA*?gj2YBe+AYVobKz zWVTj1$J|kG&hcYSj?8cY>tAYE<2B0(+~{YL-+$Hm&7Fb#Zwq-$7dzM*x?y*j;*N=l zi6T>!>`9|KH#F$oa5~z7Mlizgg3#iCIoWShcG>g1<%iHNJJS3%RSa4TA$=04svUiv z|C;5|kKz-KpH;3u73n?5p4A%o^Peq49X?jVd~hBgj=02|&Cj{kTKLR#J? zM{2GEpSok~AQ;0;>lo^MbIXo|s^)$3if5%{lHJvm$K&C1m#jvQ z$9&FH47U!gmZ|eZ5mvPu_s!qk1~?Yf%%L!jk+P+A_-GO9ako$-@%varv?vu!c%-B? z14?5azxl7(s4*{MEES-tnqAGgEg!=PRP7MTo>zaw-nnScTg(`|{=V(~-YRWUIy(Ix zXw+&|Pt;`_P<2S&U-A5Cj96d7So{v?rOR?OjRV{r^&|aEZk0TlZh@O6?6J${;&zSGuByXh@$7%l_I5<$5xe&K)ipCoISg#3~6d9V?^=Ucztf8t{>51Z<0 z9`GhoXbrZt;7?F2al7^4A$VI@eP(3gES{jyhe|5Ewr4}Njw>K;J0(;&<7mghqJ zJ_N(r;bH(=3>4sSd&|o)puZ~UatHKG2}m=5U(Ip$2U`s$d!xlj9cko_NWOjQx?VuK ziy+MyD9>ukvMJMSs2#lh_>a?Z2k$m`J39uj5Z;2I*N@YyZueq9jzX&x@j^T_>%3j~ zLfm7FMl1QrH$%8xLxJ8Y+Dy_fM9PBidSlfNwBYZJc|5`^NC{8YySbB*XJ5=b!iz)+ zkNwde>yc-F%sj&DK%R#?vn_t0CBH0Njgia;kY}LRAK9fxFV37%Lvdzl8Y(tyt?$`! z7#nsFX$Cp{Uc03yG9GKJ=}rMFy5-7<>IRc$;l@tOe4O=J!|`Z=Jz`}kreQ!{v3v!UHO{GA zfQ%s*tVa*jQO*>=+zBQ%d97!?P;!)HDCylot<>tqtG44x9jloHt`l|Htdy;M>&(~I z<4PT`kpuF)X^|CAfPZefr`I*{rKX!7=LqeG%BTg#&7~yPWQdnPFR@@6sOckAu&Dj zCyS87xAeJWHCi}NjY1ZmeN5H#dFStOtftRtG1J6zz6>*uWhGyDy87@nFkhzwVM+g# z-hp&iSsCq6m0q6~#QJ>j=DLZE;d^ITzgIwiP*#!{sx|d!i>`-noz1`1)#)m)2s)LGkBI--@Lu+k ztKggGXy0_Zy(OwSG7kAF+i%27LV^zDu3 z{)9;%%XeX=nYNbYZtJur8-Lb z>Wx6a$E4`1#IC&k&C6FcgReGVUrlqkOVYgk9e%i!{jP!ZXQfX&B{_e0zq=kK=Y__1 zg~OEp9&zHo>G<+EJn;?n@A-p;Ug&o1@GBZ4CDC3iYQGxK#YNgTd;5d*$5iZ|o(Heo zj=Se#?OPQNPdPM*=$8sormv!}68F)aXE)y57`}Rm{#9p5Ur1I^^F1nyDlhkyU6@66 zsrkJuhre`y1G-^oC4Uutn|QaM^1;^KH^R3YncpsS`YY40nW5k1pg%0XcL|&8;H9UI zz7D>8nf7J3)8TIqv0WAPC#822Ar%^a^vD5}3YVK-#L}mlwU7R+{78v8p6snZ3Z=po z=6CbbReg`xzi0e;-~7h#y(`V{!J(l)C_S&l_ZF>cy#l{?mGygyq(U;Wj>EoPIu~`0 ztM%`BJx+RX@~cPe(}&)kI}`WmHRjh;?o;B6MYp%xg9=k+H2TUDN5p4Za@jOJ>-X#^Wv_RoxSU!94y^KaI^33g~G zr%~Z@m#V*y3F&j{$W{AL`rKmqI(Ao4GhXUteoa=|QqLbMfxl?+BOXy-H4;T-SXuq7nuBL2_5VE@B55FJvJfyn^{grsc5j$ zUpCSKEPJ_U(fa+@!k2B9FAFbE`7aVu>GdJq7Nb;34E>_okrJ=X?OU(dkL#Kg`d!hr zEj`wj#JaxFD`PgUYjXHEm5$aZZEacCi#}h!tvP(Th4srdJQt+pF;6eCe0S`^i#FnZ zYH9hdP<@x4W6DNz+T!k0P&aB7`bCwmY+{@XdL?eaakdWmszB+KA185cZXNf-7Cbj? ztY3sqIsvD`^Gawg3xEA|EZ(qp=->4Q0$>Cyttt@=R(cl^meQNQPuqS2eDhB2oBe~Z zg$li_<^p}qNzX8)@3!3j-V)Sz?_ys~Pb-Y$w+7!lelvdSZtYu{@%+}GRXq;jx7upo zatans$sDF6PF#TBYNvh6B{0rPf2#$d30*z4=|R+l?Ao`yLACpmkmqgIyf+?gAt~&O z8Lo1tr>IELE}?Xh&tG|p-C3#H_dKOt(XypZo>KOSGn-$u2JI7R+Bf}vuRz(7UPDUH z%j~oB zT!behQ~TaPRj+C4Wc*lv;21m^?b)|79f4qqza;4Js2QCRh;F&}A3Xl*7L?do+83d8 zGLN_Nll$qT0A?#Yh)YHBqkda4;OWv@tj?DYfq#_gbe+3gZ6r|iz5G@PIA z&76!HPDlM)Re=f+0ZbIA8X=)?6h1a>3d(^T?W=yLvzVSv>6N7B({a@>W;4iTUu&O{ zn@fL8c0MTy_uWrtGp}!+_AO`7rplg8eQlj*#weV}PW)?$@%-A#Nsit4wS4}yBvoId zJcgx@ymTDz!+ZGG(!6eg$d=wE)c4-~A^#A5uQUH%y33)=+e~N})t?sZMLAkvevdVq zQ?oaz5nlFv#T*=Aq2-IpW|VjpKhyt)x%evX!oQc{c2;6ZDSC+Vt4Pf1p393T;;a@K z-}L*jW)%HN*%MFQhySm)b8(9Ly5hKPrjkith7`0-n>d-wI5D*(<}sOxsSOZYh&%%8 zGeNSrKVWrX*JYQ7+L*=$Ok!%Z(WF{msEHw3jZLD)#)7T_i-->(yhH*bs0cxz83au4 zxxdH$NX~Dkcjj#Wg3sRjJFoja=iYrXYD*Uo=jezrc8kFxg^9?i$y0Zm7fwxcb;Lkd zG^f6Iw0I(8&QqCwWGmq{BDOQ)?YIWEGk+8>A}$L5km9z3FbhKWo&x6cqnHVFO!X3} zuD0pFKdv2SPF_%%h6irZUB&Xnyvbq15W$mF8ks_c)org7o*RL>ZGlE}XPDBNq-~*! zI+!k28eMPRE!o9DOwkj`st$}ekT<;vhzs>Zy2=CD)i&oN)j+i9iFBTVoc)_q z?mP{dS<;C194a5da#rw9O_#t@Q&k?T`5`&u&LJ9k9z!brnuGDppfINChzYy_5pO43 zDYCPB-g&eNb~at(1~vxt?I>t~owaH_cS?dpre`A6K=1hQvrr8zQi*bijdfFfO@!&r zSWpAZ#TwJPaB+m4HArbJ2|!^cdJ zGVIxs@g@te6`L-+cU@iuOcyS}xPCTT^b2FUOX#-bGoZUTzs)w>YEdfo;&=489To86 zcNRkRvtZ%f##TJIHMka5?DDbMS|g=2rv4B`4J4QUKBRj9R_sQoq$@_E) zw#;^0!|k~VlEY3m7mVaP_a7>2Am8P1W>jVZ3^Oyj(pm5eJG| zFjhz87jNo?SdpjjtS){KCGB}*XPJ;|*Q((xvsB}oS`XUya*Z3y8>CTe^x4d&f@!`lHvd#G`?qB<|MW+VtPLajhYMRXmJvFh47~su z;U$f3V$msGdIP}o^)h>w#qU3T~tG<%NSd+FNNQwtiz%L*CB z2Z?A%gbMlC)Cv*mPn`B_jAYKtnu_CuzbV!m8|Y5#gx=UIoHuh;AiLqyuC})VYo*Mx zlj+BZT6HC9Z8=nGf99+hbGq4P&a|gksZLXvcaFRGU=Mibs|s^5^o!+a#GZu-^bCb( zV_iS&ZoWdNs!6e)(eSSECD4N_P+0-YY4#@`?tv)3N@i)3RQ!JmsXPP8E+>Z4yr2fY zrf}Im?^4l_xtr3r*Yv>GdtIhk4I0M6K96Zeg|}j_gM#yh%8D`Pvj60yS{*V)Kfd$f zL9mzADv`=w5YIOqeyAEe|4oIJ8^NxBv4^LrJRggq%Zm>2nWDeQOt+0_FR>Z=d!pvH zLfyPZWhFY8g5q>%7%WgU`(pLo10j#yg!=9+m1%OayyUQFk=+r-sH=)54FPp6r^ZUT zERt(?uuNqgau5hU6cg5m( zTF`J0_~qL&lf7L=!@{D@CwH{AK-5{UvDkk)k#!s}uUxf!@C?M%4GPhqY!kN{AbFF^B!%1eJ{yk2Z? z3ui?R!QTE|Vdmg2D9plgN85*m-$0DnEVGSvQq`72mYu$)eE)EdkT#=+}U5&vD=SiZ#`g@TUA+9B~)(j%UsD~buy=ahH#=8 zQ)=Ff=qm@MX17Xp8x?G#Q3jhAo3!Mi3t+7uC^YsEK^9qkh*;}Y+x|AN)*?O6cz{CK zTCtAEn*TUPpg-`Tp2>@Fzn1}p*;uYxb>;RJ$W?pvY{I!JOl55Di}rxZxc56uf1a^YAr=VB8Ur*MAY#c1Q z$Jp0(T(@3^ulte0g(fO!$Z+i;uo`mFV0|4#rUMGu!7eV-tP_jA8#3-1gy{QEg_b4B zZ6Lx~Jw&-)v2A_@#KVtOYPy+jmK8a14cHG>Kz#T_&to2ARH6u55aOkCs_r}sXOmA= zChPV{zPsm!!#bjDEW6E_@cDVLp@W>AI6HiCVhW87VW*M>Jtz68`u= zS3@K^EVInn|I3z&=NROq5WOg(4Cu1Q5J(1fv~kAlLb3(`wiEaKUaxSnb5Msmngoch{k+i`W_EV zP#hgi^ds9*tkXPw?F~@1{_Ue0HweYoiNw9h8SnK$+$&az@l2nv!vB-vn=8CZWDfhr zp0U*sdrCB>o$A&VQt3v2v$6sz-D5f$%h5*TbK<*-FyC_Z*8}sojv3>&xvco6iZhXn zd3ehHHprMBjmhqpQSlJV8RwnKHOdouo}Y~swj6{x)pNcUto5Xx>1ShwnMmx}9rErl z_++Wdl;`EBb{2^}yMKMhAjF=s(Zm49p5(Df<*?3jm72)j!dpmYK}gYmagY_=uas;s(ghhLHpv0MnDOwR9OL4DI0>l zZ9qG%(gLbdy5oZ{1FcG>k*SneWqkjaTZSMzol$9YwG?8LdC52VtBhw=8leV*)ov@& zrtnv%&Z#^mqXqT`U0K-HI*8flbwtV=beJYE(3yG>G=XZB85KX1Pk6vU9aU!=$@`U? zd#fPt*JxY|`yYC%%V1<)ILcseOZ+%2iNC&Et1;n~#=zd*JCGmR25J(13O5aND!Qy&nUeMFE4scJ?gSGL09EIbj~3xhu^J5W3D@I@ zmy|vpeiOW;-A824##7}=Y(i=7GUo}HP`a!TjU*(|)nQ-nuH+Wp?e36S4x5##{>Lhw zX^pc>pyKJ2X)dPXJne8unHJWcC3|%nIgt-OHG%iluK2j%{&Y+vH-C2g#eT@mSA9(4 z_q4DM;-s?P2B>4NDO3xqoJnW0kd^MUjrG7ZPnXPe8%XrR5e~E0lnL?IA=+G5SqW5g zS=ib5gN>W{e~ol2G=niLl9iQg87YUA^>7v&{4#3f3)8UrCT#sPCm^bQrP4C9jK|DK zi07N``x=P7J|Ya$QdJv>U5>2VcNIMFhC-AilO1}WhHfvuP9)YmV(q>O9@xjJv$7=q r+60^WBeQ)Ir}jE~&B#}}R~<3-kn!q&2REvJyMHw}|CrJ^ZBi5e_wi#H8*>}8o*mDu z=hrgpg_~Grw?)kE9}v*@46_Ng#W#X&?i6rJ6SE0+y3m1b@C*3VW&(CRi`fJ_Y!q;6 zmDvP4oFZWRH<(TE$!7&@cO0_`wtYyzDYtQn&H?5B^dgqo>kba~RD9gW&{96o#|%K+?$P7(0ni_9jt&Viq7$83V@juG&aOY!%mEVJbf0=9XU zWdQaIs|7r_g4uw~jB`2IkE8qq_oM89%!kGa*mGZ&A^6b60``Qx6YPQZLNNY70ef7A zzX9WaB;dniAnzE+Sm2P^?=Z$;-z!j_E13PKiyYVtzkt7@9DqzS+9JVBTR_WdmLV8- zqJR(L-vr}c=V1Rc#{{gyFW`oU1zeA^5Zurv;Adws8<5%ZA_3ciAHaU`3<1xtVm2W2 z(epUiPi$ly{y3l6fXws?2mAI@8HXj~m<_Q0`;r4I@C%)m&lAwU0sRo*^oasK3)>}l zV5xu?kVf#_lN>T1-3Iw?gFIIYxF2N!WTrrm1c#o=!G7vZ*d^?Fw`Vxme>jD4xNlcx z6TH5K1DD|!^|3Q_O0dgX4)&JFlVFP}4%~@fz?R1d*c^33uo`j_Tn#-CdTkNP3_-c|yZ zJplg#ct8Fo7<;;aHEWqou=-^V)|(YZVE4eL2ri#5;G4tD23Y@s9RTbe*c8Fhy#mIe zP6&2`zaTing|YZI;Mo=df4iR91omnH)mPC!18zsT2*yJef;}JOkeRwSBd}NC8^NB- z1?=$<#u0!o0guB%`~p6Boq*jZV*D@>HUaww*jMf#;ED_2j{sLeCW0%^5%7KFO>os2 z0=|DL{w8==!1bq~oe?k&nIm>!0xrNWAUlqOed%S4!x#FQO>pM30?s;<*#uvJeE_U~ zpDy6d4bV4iYZcM}*7|cC*bKj@&(h8U{&+vy=l$>*D+KJ-gz-fav;U4V0Ia`H!n>_#1HaiySgrz}Exp^Y3y1GMx|E-a**_cIPk$ z>+L@<0W%y^Mo>)C%YkeZi}H2zcc}W&!MO@FiG@ya>K= zvjh9$7jWi$0iVAP_5oP2UciLq7+(YSfh+{)LT3bDK3~An+n7zT8SI_leb5!b@WlfD z`zFS{02}R+7>rE;e>qjaW3UxKX4=aFa!;@fhvV@J*nJBD?}OhV*yknzd%pzV z0@&$!0Zq$UhG5co0hvo#hQMwRa4`HXz$W`8c=TZo8LO9ZXgrT)2pTqX;2!(}#=I@y z5bz+74XW7_#5!@0|IulF?Ikf ze@wuxtC&r&%RK@|2=ccG*blro zK=1nj9zj_Fnf;ICU_X2{ubGAncytBNH5W z1iyeeus4E^aRS;FvJ64{6$0Asz~6v5j|rGHhGhs^&lE6gJ^lvF9uP3|e3l_-#kikf z)+qw!U&}HC^U(GQ=1&nY_XxBJzyjbB%sWiLkvE{t+|boEw|(J)MT@&yXLZh8Ge_VrOAyA4F%TK)v;v${4g^6lm=ViE^b@WF|Vt&d2utSOML@f z+5U2+Z}FOeVy-RU*H`NA$#oCsa!t!7cR1e%b4|Gxmd#F<(~p|f+}u2?c}YWKu6b4q z{p41-3=?3QxlNb=)(QE^xY=w&d%n85tGQ5EFu;pIBIcI+Qkl{Xl;L7&8Te=@lSTrw zl9C|1vULuvj4V|+-9YJ!>(suZwg3Yk%`KIR5L2ocWKXv4d~Y$jTpA1`wJ&s_Y(XYI zqF1^AN?iHk&|MkZhk7H+7fv@&`XZ}k3o!7}+>)sXG3AOuc4ccV4M&zLoNl1>#Z^lc zVBn*Rj-ZbNFe*f&sJ6CmsA@ac@{*?e!WMAzAzZC={gBsF(qI_X&{azwpF z3!>w0eQQA~3mD&p0+uPOp3p3IaXnBKMJU<@^ItpcHR(L#W z1V34sp4v?uWn`4I6~4E7m0s_fGz~>to8n!9L?T&B7e~m`v)OiqWlM8c2RSR%(?sDw za|#DO_%}GLI7A~aS*>0j=()+L(97atrEg}XR4rCYd3`+?F^tr0Z5^`T(lZc9+0x+B zd~d0c(;$(qeU}uE2<>RNMCm&jdJJD#p`PxeILid!-Cpi1_E!fz<(r#nET);8oTn$G zfuD?gRAdJA1WL-|U<)05Qcq#;Spzir{H=H-5A5@+JlCC`aG3OpfJ z3u?$tAx@WPcET{~tz60R+-dOwJra8Ga(7<&nj5SZayjS!(y~CpiV~x{nzE{~JY5}1 zLApBXS%Ns`sbp3>WpaHIS*m=N&KVdY6YCx-B`$ObixV6O0L|~Tf54GJkm+fRvxUj7yCw7?O`tIq*yW{=jKzV%hk6w&LLda-sig7 zm&a9cK})^Qfy}Z!#VV;MN!xFs=@ubR%1JZB+8I#ZvwQPBg9&q&W|lQjQf>=Yo|rH% z>U{mtUoE7RU+3C{*+H@Hl0_TTtK>WaCK%r)uUvJwo01MWaT7~sM`~7S2}P-vim^j2 z8KP|Ishtw0Cv*n9LP6=tMQK+jG$d8CC}=7|4h>Nxl5ii|Un9 z(q zKRmK>zXrxSsg*)9)|gky63J7J+VvUYl2Qu4tTLyteuJs?)pL+Lsz6#42&M+|PFdpM z^rj{g2{K73LwI^qlN4b#Ddph9u-c8!Cr_ELZ*`nS*xbC&fx50qO*QA1s#MwqwS*o& zw4#=R&M%$o1J%~!ejT|cY14JMmgT#YdX(FHt;X4+th#V6DWwQD@fu98WoeK}N*Tfp zye28aY*NbMH}snF_sLV{>)V^>5LDy#KG)Z}J+{emqj7%17VA&*Q_;|PH(3sm1Kyfh zq|e{o(@`35+CnHy$aeTXO|nu*D=O&;)8^%lrTylSMpBnLZLZ3Iy0)wp7PaK>H&M5v zQQM6B)!0DOC~AbG^R!t-bVMU&Rg12Jy-Dp=9^_PuG~r&Qc6q|QYLUqAXKI(k=TVCU zerrhCh14!^%~_@|pLU3wt|dq;YRTU(tm{`s)!U3{#G6(zb@Micv2R*=d|k_uh39I) z)H->3S@*##)JhMg1_Y?Z&Vv52*5;|70i>;ouy?Foo-nUk^y7QU+9mOM)FOdzotwzh z%J!HtOK%?_{m9kX4MDlb`ASFMFAFzc;B;lU5V!4fk zQXPH!-@Q6f%F7jPLJ~Z@mMeABsGeD?2P!zhF6oYV#Uf`b<&&vVJBa*{9?mvMiZmmj zkL!)5H6u{I;!2e!b2ax!v?x9_(h?p68z{$j7HVJRnL zdUl{%k@9M8#!zUMUA&z)PivowSvL>G(OJ}Gjl_yX29URnjy`1&wN(rwP$gWn9An& zM>-Z#>Ah~qgcr$)JX1v1rr{Z&@cSeUt~?y}IyVzuB&R^GzW#*p8lC|P%sTQtzOvmr z+k~YY!Hh%8t}Rx|gJDK(a#?ay)+y(=z6{|EA8M*!!v-Y=O;2A`S44V{|H&D<1dB3I(m`@U|}p}1Qt$q ztVSNDg^|2*l<$C!nuS$R%{WSf;ZZkg5?!lx26;LZF%DCtl7>foAQnn=Mq;7wPIh7_ z7E1NUVxc65&>M_}5VC`q_lCrmdQ4+_Hrq8@VuvL=X*#Y+!U}v_p_1zy$m349KRgZG zoiL+d)xwYngT=~;JljlyYUbyzuO#BAAY-jSFQZsKM&FN{T8#a*}xdia1^oVscQ3vfaJtB|}AUhoioc#^QM%K*LPyM1r>M_!^H-V?sto zJmFKq*#sSn9>ei2`b5RW=uvz>qfZYy8$FhIe<++r124aF25Gh2h-Bg+4=W8EIEq+R z53`p9;OpvojBNkf?($H7RU@Bl7BN`amBpS?e~3pjUD);Vor@PV_`?eFgGuQL4SDf4 z;pK(?c(9rx!&vHUvA_@E>`^23O4PZo3SFf(5RJqb!9P}cI*xO6#Rso<>t*dDPnnx)}9O(<9_Ewy1<%i zqEdvYBg;f%Z1q8?h)jHB^q)qJN*fa@=M*H_EWH4w)2dkN@%?i=qS)^-^XfX%UzFlo zi!rF#?9m3<_@)l2Q(>75JDXjRifc0LY<6}WS4ovgaHBY)!$9GsF?&SrK5jNUD}{_n zaHBZ-`MQHTGe;j6ZOG6)X}wnh+yor`=H`kTD}+yi78)akxt*pZ4D=Sp_9MCuk2@C3 zeB)DlrgSV&-yTyPB_GNJEHgPpcCc7HX_h>K(B~mdJ5x}|cHoV9qK!(67R?9a0e>tP z=o&rMh52g8qVw_XFKn`5_CB_3ts%Swh8j;3u+abk^(xMY$x}y!c_yZoEi*vmbryab zkjyv&Ig+REvfK*r4L!uuN2d93b7c+ua0tn){lpaU-1)>gFc688NTz{RLU#FyW8b!1 zMVK)lpGs{ma}1u4gCEAwwqcNm5_L4rpcDl{e@aCGA^zFe*x@`{*on8u^A+)Ip)`D< zGO8J*FIGIbE2pjf8czp6H zngBPT?1Yv1!BThEAWkwM*hK4+>;$X@SGuZ|dApG@4+3rSz zIW)11-jVIBR))H1)=@34uIBJ2c(Kx-?{&6$U4N~A0j5TJ)aIRG)J$a zu^@k#i@6>X;GzXDoZ0M4B-KDD0cB8dHI`^d4^ql@?pd)yD`TM4a+=!#>gSq*wuKGL&Di3!P;W`}iy+hdAO~f!775etMh~vnCKG&2EEy!xbdWwR>(}rdb)7M>A3q?C|5Xlv#t{0N^(`A%cCai>3m6Dy?W)5$bBrSJbrq7 zc_MJJpI^*Za?QOxWlR=U;bCfA{G_X!(l90pC3`Z>F+%h$G-zmEDo?KD;Xpbf#5~9s zLRmmWQj9lslKCema3b#n%dg(%6w!AKIH*}QC2%9vtJz2_)NDB2T(b#qA=lzk_et%z ztLoRk((?4lIJ168+F)4Vfx&9drJwqnK4~%oyG1%yv%sSX(k<-Kvf4TE~K*@Sl3AT0j#0?)DTBorE001!dkrc&YIKkQH;SX&qq_dYoWG0> zFR(CQ!TM9NcYe7%&{8g}(RW*sSdm=(?#UG`B1<0`inM`WIHpE9s;xP1}X1 z4?Vq*3>~!`jToG5Cqz%iS6GJJizgCCB7;T6%P&kzzus9BHA<(ggpjf#v1oT8QB_7_ zMatqgJ+GZ=nFYo#kvwHrlYpy?j@mM2Z*Kp|NfPjv#c`#N6-p+8Zd%JH_pd^)BsITK z%}3y%-ZiPA1{{GCA%mvIHH^abZ97)d)yk$XLsbj>ENuXbB zo}4(Rk}pKnaRd(PSd$v6;|QDx88mgQVHB=o6OvqXS6fB}$jGP%15a}uCnbpGEeqmG z9V3oR0{)oAinG9T`>+K$vy2gw=waP0Zwf0;Ua#*9Oi1O?( z5()Nbq7XDhXxPDL** z6^iAV`GM+C#eeTcd66g$3C*lx`KxOoDJW2BGV-l%X`Mu4 z#hjrT&y_HM5hGw6Hd^Z<++@H;dZAd&m+&G04i|J6b3;}7x9gjfhMN!{cL1B=;f4{d zIxYj%0#egKGmA;+=1NawDI5=rX_ez+@h^XGU}Q|v%fQ&(nawHb4LYp2MQ$%7#%A#oiT4v#qg&9qDZLT|vP=}0;`ZMx1H?ia-3HZz6 zxYEZ8B@=1%-GY@FV+`G(^g3jXCCF&82BAYvB4+~gkXgrDNeElkoU87Tu|!g7>NJR- z+;n0oljo)@S;&wK`N_1JdYXf{%-UWdq`45L#*#doSThP?#>$q!fIO!0)}x}zN-~;` znM6~Q3UYFzi6%>!kFGQ!bJ67_6QVw5&Tnp;r8kan60E`h7^?noQkcJ{f_<`ZjRw+W z*}W=^z=1B+RC6W8;F&n-B+}<8V}je#Vg*Mpb9m0GP#SLX&wfEd~M9IwYadX8V=8(a8-YZd;L*>?OT zpOmVN*wNWscb&|eds5+pS<)Tf#x{9(OjJs0YGbZ`@hGo`M0sgxqH=H_!IHI^ylBWS zhCx)`i_li+0j`?!j$we?$YgV&8o`}0`8;MM5^im2c{pY+HOV+U6DR*Rm+N@+oP50O z0NzB?Naftv@Ghat2iMb(I4wM+x9FxFj~>HUcB`%`xT`U7mI=sT%*FP1ZZ3|9-~>ev zym4oDX>hPy8EkLK4GRCv-H9_m6n6(X4OT!TM_mU_=oJ#n5x8WPk`C=F4TW&y>K1g3 z^eJ<8E35Xr6%Mea6mkp8)o+Q9j7@EFC`IvXy#`4XMzFdibC=;vNcrTJ{9rM+s?@Wp zXQ1rqvThgBv z&sZ~&*onAGdUZ|NvlKITiAt&sBYu*aNJGqPf!6F#T8YEK30q1ce6F)dOif)R!cWLq z(yUY;@i|CzyhdUvqU)pP!M(inG}*4HnC_{8pr*9sm|J^1*?F}<{VrbzAT6k=-bOUn zkea66%+RNa-CH$HJtwcGX^)bsDA5N3Rb1`KG!;d2q)A24oQF{nLYvx}WNAxTO%3iR zY4jXKk#`}YnRyG)Dw@C8s(v>ucc@sgqX<2^w#N#hMta~Na+H4{+$>spu^>j5T&+io z+bJVDV=TQnHCpWPXeAymD6grrSxsPT6thaVEcyC=J4w<-#!Magy#RVtVUFPS^L zg1S4oTsg_9xGcRO-B@c@hX1diCpT@&C-Qaeoe=Kl06x3RLm=`nYG#} zw*35`HqE6lnhUx7EfA^ce78Fj%A_~_k#Ox6T;MclFR0A|Nh`T87o9O>c=5zrC zM?mV_@Z?Gyy$nW2cB(ab#ni8%Q7MTgyKG;1cr^iF7rzvXOVwU+y0ISJXoGJ^UJ2@-11+&?>%e*2Y6KmMG!7WuO#CwNGqALQ;P_;I zUCQ535N&4!Me?h}E72y%k}RwpajS|maqMa(Cen55aTZQ#UXE7~5Zt4Ad2U6cU%XA2 zBh?-+-Lh51VsC4)*NIJwA%SW^5lGo?j3lZ>Z*1%gDMno14NwfULs}9lYVuXIDYGOU zxrJMZeWJRR&o9m>=0NrvmVV?;zCp5&(ab`Yzdi2`JV#Cbx@V!t@2uq1rH9h%A1exV zb5OjBM`N757;pdJE&|RUlzV!yS?xE3Q5aWiGNU?KFi`BD)7x6fpFAp#UFXy{S(bkJ zusFn@@T=D>$*(C-g`ORUJ|13GGIvZbL;Un%0+i032 zJ$0%)pR}p7&E^XQYF4tR5vO@ZTuv0zJ8i+$=IhX}zyGQ1H(9wGBddE;72hBQZDI`c z=GQF1(*gLAjbKD8F!G3EG_!E!@5EWSp}`hxR@TcqYDzFlnPdm^?y3WAN%YZ!J?_YK z>i$@!47|O zvB5h$Dii!Q-$PW+*heOCKe@O|q@fJ(lt2BollCDD({jQO(XMl)h<$)TT(s=!<0*mH zpD|w)jV37_UEFMM&9xSXOSlMH?shNy1b23$kidhVr;6tijRrm)*pn>f;~B-^k^cB` zLruBR?v_LxMNB~9JoBc(l%r;fciv1$bev(ZSaHY5?yp|~>RH7^$VqroR#a_DU?W)m)5>Q!TitjoD@zw#bnXCy2Rf#nOM!8M6E=Q-2pWA;zSy8iwVI(TXZ8WEtIe*q_jPB_gUU+~J z7!D@H$06T@n69lQ#ZM@+GjLQ!n@J>+=o03nv;wy@iS(*aqJ<`qFUlFzMxHKTMP#?I zX#`goIQASXxH=~k^P8kZsKu6{6HdUJqO`L^^I3ALIjmMMo4hz*!F(-8apBcVo{1?8 z+@%vhO}Vrg#SuGeD>;pj%O%=LQpPmzl1nJoOKReft&~q53{$qqC-$OHvfX7o`4o~} zp^rilVZAl<{BVbRQ&qm}M+ek&8HNcQd(SS;=wcu2syP% zC$GdH62}k09xVleeD!0NW2_7>Bz=r9MS8Z^pkrPl7ojmBBO@Mql~9q?{>hYXXs435 zcb%EmTS#~YPKsZPiy1NAp!gaD|N$L?M6%)E#WesV;LORcL%_3L0|` zl7DN;rOzye-1V$_QB~*aWp41Tweb+%RY$8hNbX?GSi;Ae)14~kZq|$?Jgq)G>^mKv z+}S3jar~_wJ?wHL@UYKK;aPHelx(w7TmB*LlvMCPx(os?$c$pPYsta5?a|c8Bvdm$ zrNPE=RFL60^aY4=N{K0Axht}`g2zat&_E~6l}diipgP|3>)e^(%RG(2wJ1{BAd zHK}1!HX*^nLP-JhGNc>IEm@1JO|5<;JOd|1%aObkOw_nW;wWQEh91pV5y2HUN)RnU z*VL#D2YzE}5QCfU>Y@d6ovpHZA2FtSiMs^S)zKs!MEzeR5l(%@YA3#MjmkmfdNK56 ztKTVwB$Y*$pPe8=k<#l%?s0S)MBz^y>BbHOA_xc5M7Z4?&EqCbl8!^T8vcK|6y3vf z`%Bf%HG|b+A9kdrKSa~T?mC@N5F5PP=!>1{l&GZhEVHB@rm<-vKQDZl8}SeRHwBQv+@J{z7jNxWO+WOe(yL z$NzS*W>(~5@<0oG(Bn0Q5SyG^(_9|uXt&5%{@`-NDF^v8KRzLU(BR=5H26t`^g)ML z>JQ-IgM_DCoe-GnCl_~_xLODl_g`)bgjiT94phqB#lb6q{YRlg+jPZ1yReowcLQHtt}v>Zvw61;1}>Z?k7VX|vX>v1-_YBS`$d4}zJG0L~V zW)lEg%(dCTEaWrCX6Lm+hxk3N4Y>Gz#BAuf-DXD~X|r?Z+w8@8Hk*dOKhuHoo9zHtKNGS5_Md_8(`95EGaJ9h zG~4W2d_O2_v&SIgs&CosCdjw<<~HkChC12IX6sJI_c0lE$CIG{E9(2tkm2wQd-Jdi zTewq(P1q4-1ym14oqXM9EnC~H@)Y2wDCcE1n*ligd#H!+*ldqape$>lbKuN|?cDiY zo3#RVz5?}*w8_Zpv2W+@xiR2)|>%w*a1p?U!L! zAfJo=gt`a3i1NMBoMHA%@NLPk6UX8AgBkWZeslkXE&vbTfO1}Mvo`#m^)s7Y1UXJb z-JkIy^z=OH@uL~G@d=yF|08rTJ;P4D9r7%(*-QVm*b2aTWt(m2hkc(8{eBkphO%xz z8J2i;?5bib{DjZEp0Ys3+NJX z4E}uu>Tc<3w3(|>*U84*q4a6Y+QN(J0F}*u`#uGhmy5mS@pk|7Nq*w#{CxA}{D| zE#!M_PuSyBlywE{5C48>4}AL)+9=?<4?>T-+w4T>VuvfCPuS7et88`-{%wEXW@q5v zr{ecrz$vIR2H4?<47&g@E(?3O6gv3={L`5>JM%2)1OGn#-xk{dxzAh$KI<*E8DQrU z{0r)H1#F`U{$lLkk?-Fvw$<^Fdw-if0{PxVT|db(Y{q-23&3Lh`-XqRUe=>s;`hQg z;ji}2u=BnO*#HMZ_KTo{-9Hc9Hz30z=>08=Z3nm<`L*r>|Fj%B*%{>r+;kdz2A}{P z9tYfq-+-?JJbZ%9a)2Y?^By@0?fEr}jR%}pK%I9ZFO>24Z==n?2Df<6Vyid8mk*#l z0@%SB)<^90D0G0xf=@$M1`%pVeDr*j?wtj{uH)$6~{s@Fj0sYzE+o6Cod9r~g=N zBfg*duEm}Q&UU@1^OJzL!D8nuM*G6=<-lp{gC9rQWv`+QK*l}rd*LeUH$;|xI5|zc*8@`-#e%S&>zNNBhbNykHdZd*B*<0;2@L*u=wjJEB?OzBd8O= z^%tQ2j{&a(ZT9*Bup9in;bYJR{=E)$Uilhic^bC*{tTP=8}I_KU%@xt2p@*ujr8wd z;QKAGy_-`!Zw!!FHaSc45)M;-rR1MKBd zv^xv-*O+0OHDuU5fVbh-8xDd0nwVjipgrvSFSN^hq04(vAI~5!zyted*oqx8>^S7R z8a{tB@HwzO!(N=7VN;HT-k3yNS@-!Dx#Y!f(C> zJA4WC`VRc(%czV0pnhIOI@AUojrM<5$?ay59IO+NZH z)E(OP@W)Wk`$A_QhEF*UJiY=sUb5J;sEc#|4xbF3E%^He_>GC+chT|ahkpxQ9|(Cq zl3|Yk3UlC>pv#4A=$D}5JMjA$zKxlMzOXgJ*5h{odOv?=hHZntPr={U&PV;vLtWta z2-L+k3o`65{CxxJ=C(16&9Ro)i|vKz?z482J<0yMb%Axh)o=A#Cs`BO!R#Qm%IdL- z)=t)T))Cf6t!67{9cvw9ea<@F`i%8O>n!U`>nql|);ZQg>_IkURjr>{*INg${n>u( zL)KN+_pKjTS6kn+F1Jo&r?OYrOY9%)W%hTrwY8PCrL~2%ne`=h0sA`Jf^E)rVmq>3 z*v@QwwjJAsZOz`##Fsrh)>|{2?RkHPGtq0hk z^;7G+)~DF}t>dkO?47Mst$nOZtalW)K>lfA{_6gR*+N@>vQoF@&w!dLrXbo6p ztC2OZ6Rnc<0c(3JYqeO%S)aGgu)buSZGF``&)ST=k3G!(#7?$`t)E*rSRb}0*dJjB zvOTPySl3!tSQoQTvsc-+);8AW*4Nni?3-*$_5rpl+ktJ%wqhT|Sh?Gp#-_6OS!1k6 z*q`AW4zb5syIDtD-?A>Y4zs3PGpxg{ec6ZEo@@`cpS7>`4rA73)_1Ha>`=DA?y#3y zORP^@r&+(Verx^4`jvGy+tL1}b&>T6>yy@w))Mwfb_y%8Rjgut+?r;6mA%fs!p>#i zU>C9-tg+U4>>_rM^$}~Lb+FZ79bz?FP1ZHmYwSnX53Tj=-|RmuW7*c5>|g8fvh-TsjML3_Ntx4nnGr@fcGkG;|QuQh@F zjXlc_w||I!_&zq%dX!zle$Fmq-(kOEH?k@A9Q$)@vOUXwpZzcES?e(S8ul0V2lhAX z8SAs`baoRvhds^iw9q}+yIUW$K5Adh9%uKk8TR+tW9)7=+gfB#vp-;OXE)lr*azDC z*$2So?8D~T&#~v(Z`nGw!rEXRX?I$StcBJZ>nLju+sWS6zRud&-q+sW-qoJX-mu!( zmDXI=Zgp4-tohcP*6Y^$?boc&U^er2s}o~}t?W-(SF+!;h3qJ{wf%eRNH(8!ux;$C z*j;QMYiE<$0%qG^U}v#2*~`|`)`8Xw>_zr2v#e*>E$lXSD|^xUvGpT%ExV3g&wk8) z!hXtr#%5X5*<$M-)=Sp6*bVGb_HFh{_6v5XJ=?bI4eV%ph5a#mwe?TyUF#idz4ey$ zZ|fE7RqH5ws=YURiv5+f*?U_@S{eH}>wY%R8e@N+ox!HtKfv7UUUsN8#hPmU$9lnf z-fFde&3?mfW>De(`JMmsJO4lOJNH|UTYs`1vhKC+vHoD)XFXs&Vm)d-W<6ouW!-H( zX#LT8%KEGIr1ckTx&5&9XY2p`l*vzxVgH*v)d_Zw-EFV5SJ?%-Xm4&GW9RMT?BnfT zdrNx@yKMK{C)y|3C3`cw%Rbf~YxmjdDKd=q#Cm(ml~Q$8U(P%4AU4hDjA4>JGXsub z(iFi3dzYZq9Q?>ByH*AqmA{UQ_AH!%n{t9ebFvL&{$q*!q@63HQ@}u~qQXF$C^wFz zYQxqB`5MsF3=Bvjr∈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 G1-tXwuTOp;RPnl5MhOvl}*>^dcf6 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

v*se2Dzm-FSqkh?lM> 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 Sad|bU<3$>>_9W60^Zx)pKs90j diff --git a/lib/opencv-d/opencv_videoio4100d.lib b/lib/opencv-d/opencv_videoio4100d.lib deleted file mode 100644 index f68c85ea4565c9752d3c2c5bbeb336e6d3526df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210864 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

Djpfz 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�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

uKl>=5Bq~_DB)?gguEkxeEMjxLlP9QwR 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 z zo;q;j|0)4kj^!4-keeO_; zRBjn(+AL`&Es}n$0-8p!Fe%HtXo2@6Sb4BZEO0a!wRdrDRya(cU5h^!s&woIZbD) zTwiqKd0TL<$vtf3Rf)|vhY~g-K#4M)_ogY0yBZsM$?0b=!(C4IQsgjxnzj>bx^OY* z3R12gMxAM{1i0T@)-J5ux)<)p%8L7R*eY5gjbfk>Q%dk|1j$$G$O0@V)dGd)6wB&} zSo6Yu+nY<~h25{kSkWTS&-FoLzB}ks#5ZNgs7Pu~_RG%~FTzd94=|C5fk3}BVWSVN z2HS(5-?A5{tUbua)|?(>to>G*;_z9x-|8VPGLPIis=|`CU(40X*imjOWZXBQ6N6u) zuKCYW2cUXbhbkCN1`w~-U~T%F@z7<>+nDXK+#Vr#6zEY&3Ww~ zvS*zW@I0Zzqf<(W1L8k1h6FY4`gt8n(33hu8da1^Jk*fWaH#Ow-&f*3lBcwIVxPMd zVq$e{Eqih4dhFQhuf-IOz+e>EN#2kSS+Zr*qf@P~f86F6{ScsfT7wE^qUb#q8gYXs zSgqaF+cU;eALHN4IYUyjVx7)s^-+x6cj<4~NAZlFDp&$QoiOF<%GTLINEc)G+o&Ng zPQ%@A&q{Q`)}nl0IN}a?xR&o3E#*uYUkp2CGm7IhEAVPkyW*Ux(sud_^G6;6)dBw^ z_yyR!;>h>G>O+%uCFN{f)geJ}dBi|C;_^XH02$Z-vM7DO8K)o7FTyzeMsP)7GENx3 z8+7|ZP}-E&#`O+0h_lx1j|ygBwbHHqvvrcrnyonc_2$ty+4DJ-qlHjGN}9kl*Oq>- zgfh>{&IuN-+r5VjM_m6_ahatUppip4Q%gHKSW~K+#Rb3Ol&a@dT(JeqWMGK$&D3y= z5u?BEof&g6zW0JTGUA>o$RHOHjwAw)_vYH{#-5Ky2L8CN3DCVr&_PTI1<4O$1^*>3 zS{u4Ui!Gh>$?`N;FS%+1`b;me&?`@YWDrOx1q>$ON~3ttc=_6qwwGxvmEy9Vn=%2} z%MvmOAdu)+*daDZ879<$J+0FrEDxz<;FA*^fZ-JdgFLBEhoMJSwHwBg!60}mt7Tc+ zg44?7GpZqr~mo)jt9Ypc!SLY zjfHvuTMYn(I#~)K9f*U#_g`y?$TC63Cpi>ZF<9=pzmb36!s%4@OzN`RC%QMs80#lhJ$m+@WJumVopRpqzq$H_nba zXjyfjgg>Px!^&_+ADOihGu&^{lYuV5*5MN@HHrVOrY~_8|S#j}_A!kp; zxcGaqsNICBj=T|f{*uJzIHeA@q-xD@z`kH$#$l$qsDgb z*5&c-<$&lz4nzrF7j7NH(v3^{xRX0-ZcHrQ zc;gx8twr7VF%PB$51aRP*lbi7RZDZ>1!H%30N*DBpC2>!x%ht}ilM1Zidn0!Eh;dU zrDR(A-q>k6TE%=*{k9EQA@Qk-87Bh4#`;u3=jJwJN4L%9n~giVKU0yDvcz1lJPt1G zH0`HyJ+k!D@i@@Zb={_+=c75bRX8_%UR~T8ueHO_5*ow}sCG#;+ud zVqIZKY?4NcnWQU7{16S%#3qT!GyJj29al<9zohN-%LK0=)4c4SUtcTBOjIc!@m$B% zZvmBGb5NN;A(_kpt>VnibR zBW3lOdZJJL^W9Nz0EIs!M`6-u%YR9EsbzV9>o>moD|&!GQfg&gSmN}$gP1|o#9q<7 zk}FZ&ffi|&zm+wDtlFGuM?5tJYjb{z!50Hdu18Q{#W9n3xn|3vDPdJc>^~3LdM}_F zL{Z^l_-c{7DELRIX;1sMm^@p`5)8UoUK#_NO{c+97LpID1fs(-rCGkQJdM49GA7$hyWZUJR zfIU*~kP8;)#YrV{TfeNVuJ5q&xtP@*LhzIQX=LUoth2&ZagwJOcex@j7nRj4n)q1f z<*q4MZ9Y^&0b6#UAP@!CUhk+BVOFu=#jgk)r6fuc=+by@5H~jJ1Z%KOIefr)tehAY zi>)qeZL`5^P4Od1z)8_-4cuq+q1=6qFL-w)DQU zHbM@(|D~-r0|lenNP(PgGG#aK&9gD4NZzya^riO$*3lByeiqeQ#d#}SaTYFfQC4fW?6ZCrp6p;SL2M!Q>7L zjvAZ{7ZSp-OBU@BXnn^#NCj+q4Y_?0xv3k{rJ4kq_Rn}nbjDbw)?rC3R!)`?=-i%; znP4rLE!O6hJv*a{;_&-_oG}(SG$nZsN$u``aLyRtlb6q(IdU{`W@bNb56g0DQ-}lo(Mk*ec?u-Mfji4CXAPCXpi4_ z4+37yNQ4)#|C{WjJs6q6{aV@?lR?fruEWG(z>S%SaHGN<@CAGav-05QNrtfo`mJxL zFZ~gCGK+&J2chEN=Y@@ioz%GERYx5@#$uRmN1%DZ^`3K<0 zoWwbD5DEu3Cv3*7$VvNmZXF4nn41VEs)A7T^1o+$7;UoWZeG3OXW+^_KCb*v$cRyY z+|ujfHK;%4C&Ud%Knh|*$Q^9-c@D-Wm;crnJ?Z00&ssGKIIJ zmWZvR@!r&(`^ESdfG-R6d~w#-gOe-yz<)4b*4EKj^K`_AtB1Y{R4&p}nWy?@2L-9z zwu7ys@ufWbkySfi16miiLTeF>0MbM(3_0@Tq7*RaD;UKZKu^@`hMGR>ViYz;70JRo zvzK8N$r3(V{{Rsg)?HnA(vIDDSC{Ik#jT8~x~eITJJ}d@r=PBQX(ra4E=wPkB-E?T zQN#_dC2>oQl>_ciis!uuR4zBAG8Oj|jx+HKngpH3_a(gI-c=~GE7D3Q51G8yg{`Bp zyYT31nnt_~RIW^vN=q~l=jBY|JdM3|bIZ1_eF-RCl~zjmE-3ejGOB9FeRtDZtg2ld zLuZRVKR}XThNlynsnudCDQDZ-#8l&1=Gfyro=KdgQEIO^Z{%o{+BJF_6`%2sY7-g# zp~*LH81@QK`deH|Q=xHFtBH)(-_yMh`xULfwLFwsqK#5~M;Y6Z9^bls=Yv4&I)&D9 z*bE4XmO{VSx1uEkgXL&{H>r_`e+L<*3bCbyFdnS9IMcGMo2`@ay&NgX||3}+*O@`0mQEBQ-Vs(|;rfo63%2;VX_k}X8<=MfB+U#|2XaafDz#v~+nIp>mSsWy6kq zsn8XEOf7}Y#~Lez2{7T8h;7_7f1Dyr?w7`H)J?v(=gh%AyNwD5^rD+UAp%=;i!H2u z%`)Qt?2tXn?gZSM6x>z5CK!wr@_rMwLh{J~p zfQdme7&{7oB*uv{))2l)6rwgB!K#^rwMp>1rDc{@b}{O3@BA!xF4p1hzcFrQ4aHh3jfSCa+yA~`x@PH4{${=&l7nAO3x>7E*4+h0Fa9=R`zq{n-$PLqghEgbmaEh8Qm#Q8i!K230L&g~ zy;Yn-K>l}%Q4P9c@jsShHR#^fF+%NX#0SH6HP2|GP`TxnF?VU*uT|r5w#dGCNGshf z>A`1=C$xKX&K5lF{c-ULK}fnL1Cjf*S)G`l-hRy}?8Iz$GI`(q9!Vn0M7>O=1s|*D zu~YrkGwua=hv@NDK~ZX{=oS35L>W6oOYwP!CYVUbQ41+cUm)Kdanm1w+>49M8_;Pe z<3keXdU4CF!f@5UJ9gnWE58DI4yE)IL$x=rl2u-GUUPs%)s){hvj;4FL9>kZ`#A&J z|JnjPIE=*ujZ&tjK|KCM;lOD z@mO&qWOzD*j(T!CdOF8YgqrYcp*s{1aOWM5u9sXomh}vA*W%(h?Rorip%~GsTokUX zTsRQuIhH{W#N@hnrlvySCLJtnzIsCQZWDFvAqN zr2bXxKW}%)Z#!k0lx9;y*ZAu?CgL!A>t07Y!&81a=b@o1fQ!c;2rkO;{PePoTZ=H_ z-{KMbW@G&O1j;oqWj%caZ+RW=%B&E>K5WOT7ONV?zK(n$f*n|50K=JH=_jS}5hY*{ z>$rFOzCE%e`qA)@hG7b~c}pa>?o*1!G?B%_vd>u8 z38*=VQd292#DM5?z#dJnuNkKN9(@N4tz6pB$Aeq+M&aN|IL18y z6rUACF*c3|8f2ZVi4pgLj4@t8B@m_E+M$*vDBsm)xo8wT&hx{6ij17dd2_>CF(-1i zmL?P;QiDMjzbO+w)K|r9-b2htt}-CsS!M@4gf$y-i+>qNriInv*+yI9*X@D1j{{BZ zC7SRl4aX+TWuvhftV&2sKq41^N}f@nIYNM~9+c@%X%EgaE2%RL4QQ;jLw4M{uox&i zN1`l{2U|2Fg46E<0;Lghu$2iGw9 zPH>=iLiWcXBFs!nHv)5@R!X*FP--xpR2JQv517tN5R<$Y$2vaI=RkvL!7u&hz?y>-VTWVCLpHngwCmISX>T{OGALH zEO(T3$S88khYFTvH3@uo$ml2mGF6w{++^)Wy72woQ#`=U%LzB@8=wV2S-A^^tj#{$ zl2p+mdxv5m&`+<<(Y=N37Fpm%*5o@KLJ&&BW+ z)4jGFqYU3P{LD#D12(&ijr0HjdmLJkWGaaoR1(?pFzYs0UKY~FsN`um^-)sElPS}e z?+d%@{4f!vslpwBx`cpw223g?RcN8cW=xeUzP8uqUT_9kGRA@cLdD6QWop3tW%BNE*Kw-7&J;l*=795C@YGv2_{{eJGs}!V6lQ3dSr{DGdW{fRe$90? zpZm_)7`BG@+_A*g=ps{FCWe}zAVljgF|A9^c|GCXj7$d zTT}=~!s>aZ#UEs$>(%k*-H6T^51nYH_AK>Q8Qlck9xWl=1i30YFq8$iH*p6k4n$r{ zlI2h5XZF~M{&b#

Mny6oxYQ-DFuS7c?F68(J&*ZKKbE$MJv6ROUV%TaM8`pK*D= z>Cb@l73faq;4qeXZ&zlvk-iOub#u!=`U=}f-=E?aYb^7gj*ZcYIQO>TDC|fpVw_F| z1YCV#D8*CXIMY|ex{ilTM&0AI+&A}i0~soABTDe1+b%}M2fMdVhn2MI>T~Na*4Z3) z(JxEzY)a&_sqjZ3SO=8{^}dD#1V=Lc+I}kkYhf7fv&mv?w)pVyuD?G3XVX8yfTuN zVeE34Soi$myWlL!sqh9>W7YJ*sE6!4G4jU4@vG!{GdrI-cEAFR_?cH_<3{?U|W zx5AAt=ReK32Vt?UqD>qcUDdVEJKJy~UxkdkCM@Jt)RYJOE$PlgD(f>e=g2Dk2Jbr65~ z^{x@vL0qN7q1^_N0)Ei(dm4V+@b2duu#2HuheK|!&^J_A$dMd|xebpYIw$*LlH z@PwAJSVh!RhamoxB?X#=77weF%h4roGj?+IlCTLdFeSGof>k!q2~-l0Dl{Eon=PQ$ z20)3Ev!{j8SY-^g=G3OXaM;po0oRQxF6aVkf{xYhPy+%bkYT8Wq)f81jy;2xfvGv1 z!SC+dR|8mXQm{Bf4G{7V`I=*TlfaE7i=6aCWSV2AwuT+to!I>?V`IEkKke9??U2(R78s)Ajz z_{zCh1$&Ez4ydZABWUr&X~R=|lrb%!*706xozY0^XVt-Z*yHz41+z3LL=2H)!Q%2F zY@os^;?U%o0;y%ahqtU;JPY4Lmx8Gn&bu#^UspwgL0BG5fFLu?RSfreGAe|}UU=Ph ztPt+4;K1qJFdbdt2)sxz=U5%1l0YYVyx}U`I-514weF%zH()=qTS1M(r68GEON!5X z_`EQmo3^<2aw=nV;|nEB4U+!{^Hn_ZzXduLTJ;)Q;tpBiKM7+c*jC@KgX@8&I)$c6 zcc4MvMHnBy4Q4t*Hwk!0%ARzaqs)A)5ie?%9Iw5vVmZpOM?o!(go&LD1De+|JJ*(J zd#f zRnJb&8Q%j?`glK5qqZwnjw5gIEx=k7X;^c*xLija?q{3p$*s;w;C zG85}m0tSrkXhe)*p_Er^TM1d>N`ad`Wni;Lmw(i)VlPg}789W_)%<7Fl|DDxJpren z2NS}_2as2WS^RtJ!=Aq(|87eJ9~t4Du+rx~U#RH4K>DAmsm__PWiRqCln_2XfL8GD zhCTnCgZv98f)D2^rSN{R_;*Rx5u=fRk%aK^0p#VM&1Tf{jmvzSus0@}2tM#6)B%au z{hc^7`LP;vOvlwPn|2dmZRWJ zGW#Wlkc)-fr_IPH4nEm1YB0go}7siq^ zzVMVghv6CDVL%uOMcW9F`;0Sb(nEb+uD^HU;AX&gC&A|nc_3#j1r0S(CGCI-<3GKycb$9$YytD0NEZPf4RonzRJL(g{<7xKD$z0paSF%V*#QgnMLq z$gsQIXnnm9Qcr^(Mw0*sLBH^bfr!vA;&8aS;f@R#5aR^FF$J3h_l-Wx+P)Wzy93bP zt3@m4PHu<_QNf7WBV|@x(8~aK*odBzqme0BH_K^Z+=G91`{{SQ2lwe|Axtd{iB0G< zvdEFS4ubFM3P?fr$sH)j?MaToabuR{=(CI`argX3m*Gj=&p_WAYAWw|zcp;vl0uFE z?sK-~v@rDQQx0(w>eUCdw8*0#jkK6u0yqVtoFI_iAh_zWI|wcZgv5b_)-DJ4O=jfC zrj#7H0CQvy8mP$3w}6V&(81_D{p!P#bq@g@4;koaD;4?^@kGI;Ek=fG7%X8{9yc>x1=<&1 z2{@1f_)l?G9K!hJC)=3axOdyIrI_7#%#1QHqaq~%Nut8mP?(RD#UYIQ#4?Ss-6cDQ zZ3+QhkDJgX4bbAG2ag57OGjiW1&j%6m3KWk7ALGdp{1b84f!UP2^E(9LcQCnq?LfI zS<7!my~pg;1D9gG$CEm=(YjVmK1h#t!^@BYZAp_}s*f;x)7#5kfbyvrl+yHGjd&}5 zg4T{e%LsW1|F4GF)bZ2~|LwFHecRBR>(*ebrN0(06jO!@nuS2bD7^xHn;`?O2mn7; zhPCtUWo0AL+Id>SS`Z+XaV`vw^9dnTl0DqMNOwr`s<0I<#~9OE<*1T`Y=^>Ib60>@ zZ?JYrKmXLdQ?PRN85R|-BexKpjj@wpZKvoa+)41P4qcuYY?1C+B@|k;4iXuOHZrj| zF+1(*X1BY#!6p%N#$y4Kg+3T#^83-Z-8>a1zyHgGwrY`>&b;K|a|#3|OB%0Cv9?Rk zd+EwyxO43}6Uz8WvfB^jNj02y#0EU6e;eo_CsYl4S@nLt**#|oqVyWjh>ZUB#}z{U zlQPDTUV7`pmG=Q<&$B7xJt+BVrSGha@#S5+-&}^9z+cc&ROs_VfGmka!iO3)MUo_O zpAn;@_53?~t;bCsFB&LHMn51yZBh{YZzsby{j{p<8uU$H($Q4v4#pl5+!!>Ji29Cs zH0igARxd%79`BIgr{fv0{8TX}n>-;-7>QHVUXG~!PPCR4dijlVW!b1 zd@3VnXB4P=C5E~Xc-d(&clgi9#ABWKC_Ym0-mC*$EHMdj#;l zrpN1pU_Pn9mp1UREcux0qLm(UWs-h)_|JjihmRX|!6fvPgxvrzc0Oa@3DWl9z;R8f}O}%XhCv8)AS7eF^Ca)#Jdo zsSPA?OJ%lEi!>kp;xyDEZy6|xd74_gY0_gWT{AeVHju@CQkh2k_3d_h=Jo};-qz7o z4ZQ=2pOIF1Bw>d0)4|xvdve~8T_|z?(a}*8fMFM^890e|^|*1%wN=V3eY%_BP5fo{Tf5Pl zc+ZSJPBD{|Thb&YaeIt0{l%A0n~k=_`$n4Ds@{?&jQ0*HtKKzLuFvdyYZROM<=E!){|M**PvP)6mCwh zAmt3Wr>=Fzfh^;L2LB%$S1pYGWf=1{y?5oW!dm=~GQ z%Ll!=7dJ9|tYDP#1||6{-5vD1Bbcox1W?*jSlUUqr zDbS!xkh%O4%cybw?(#mQM*LF+WdUY0OwM0^{t^Vpefo^O1?>;pI12X`e5S_-S>Spf zPOi5EC_g9d#>j-w>&sPr0O{u{(tZ)xT>|sy3Znr}1pW(aazfA`47NuF6;o}sfD&WU z2{D+t`Bv%yR^NZ`{rgs6-~Sh_VpsK-q@*myMoaWGnttK47f!(3(3c7}@|>C+yyO}r zrb7AU)A;Ily7lvU*uVCbf==?Up`G3Yp=qd--QSu2!y4>o`Z@+>YYirEHR{x;)rs3~*^j#ZJ0nK+o2dhs;B`tu z*HfjWA|3wb;k*5S^m`SlRM|}GpG}V3P?nSqSv5*R=*llPp(Okei@i122{M>p5{wuR zzw(jEi19}Sqg;Yxf>Ei%NfpLS0LEdJ6{sdS?jMV& zhUri#b_s)9#3r#46+_}Lct5xWC4RULl|k_+qNQk_6yw@4%DWqJjnLsT6n-kWlo!WB zTsFowipHbQ8-|wUNQx^0Q&22ZV%%~@izPMEUvS2$({MuWC_Tcqs4#9#!I~HM@V<6y z@I*&zakWu}@$#z^4HIbib;)6uuF3;kW3;%ES76+{VntJXM|zCMXzExkrnV?BOHeI3 zF}xB{jnkrPivr_D#hM8H`qQ0%LwO&sMb$P1W(ls0M<-1}Tobgo+NQv`aj_=+%wD!{ zEk;Owm2kn-DI)B278T5+2durV?(f8Txldh~FoYH`qz3*KC5(8u(mctte zWVxE{8TPDEiRQ7Az=G_{IP;@melidoK>^_Xy}`aaE6)eyx|s#&m7+X>SGoTb)H8?|Lob6?e5r+l|<^zA^; z%ouv=OMU)aQ4B{MFnrL{2R9IF25RAQ@-EKS2HTT)>Ud%}IWG&wJ(`ljdorvkzgM4M zHW;V;&XOpB4V}@Tqq=)lzB}U1gWh?t%9Sy{Fmu?l`HmeK7WY-7`!CA`EVC(=ki+S3 z5TQDxv581`4URoFg}{9SJJN&I==dL&eKau(Fw9Xgy^{d{#)EDkY-z98I2rG67c zRhb`aEq^-FaJq&+-!}|edkx^5&%&2D6n=SO$m|t^n%AJrE>N-P$9TqP2R{Y|KhF5< zt8vJWg(`+ZKTMd+g}9(MmHc4XNV^=JwxAudNX1g@4LM>*&c_pBex5MS<(=o=n~CSL zSjCZ23@lIm#MjSRh@Scq6@x4O;2S!a+FZ$T-)|cY?5VHUoay&Xx)E?KRdD4+Lm{Y+ z0EJ)g^TM!E0h&b|p!7W85J>h0>pde==uOozH&TW*`P`W7p=eDmQ;@>ute_YO3tt!}x3QF2ZdgtD)i1U&wmK+B9Y+Ol-Rz#-XyZ-t6a zxQ$L^Li0PXxeC5v;cR?m39|;p@p)G)#hn~06%@5%NDPR+*dfxEYKG1<1*bvsbn~WB zT>;4|35hR=>kMRmxXQpfBWB@s6Fq$@p?L?4lV+bsz`Sb8 zHon*xoBn2ee&iIKsJvE21EQ5%sDFcVB@eA45^~hCO(=&wp4rc>6<9v-^j$T(&<9?p z!AV*;9b$tte;oG~fwuysi;f;y)$ULOXjuFrjzhwY%*LoSeR$#ceOPO{UPWeR&7_@^ zENk?V8?Tv!*4G9VFKgwI%u3VelACv|dbeqlihsul)y7yXW%>GBAfrJACohsFKU4!>@Q-av6;}py9J!WQL2Kv35RW!^6QLP;tua(2vAojQF*-Pz!Ws8ah zG=?0{kuRaclpWj%82bINsdwzhsrkRF2x6^e>v1r2`S~X~)}qzERmGv3+fPozoE6-1 z%G!SO-%-cS$L%-U6b#sZTPE}+weF5`7{;I1y`Z1qiJ}vXF%q0FNEeZ4v?j)Iq~Edh zZn1I^AAWz_2+T!nZ!2cYq>SYc4cmC{RP={-C@5WG&?Jh`4c{KT1$IYmCeCRw8JEc| z{j}&!W8G{Txz!~OCbdoapz zWMXLW%_x#4e}gSx3XS{J71c|q`atq2bllY=kx$1Yh9-@CD(v_DH00B3E9lfXdV8-H#4KKAn&lnl$oh&zLp4kWVMd$jT0=Jbk*OW)<@3q{Psqh)*4<6Q%Lz ze)-^%ap=#TOpu9wN1S*Zj4d-UYk6N3*5>Om$3}MJ=Ic`^5`1WBl1~a|m;>Opt2;96 z{Nsjo+Kt(tQ#A+*`UTY;xYnbf2}jL|L_c;e!wA=D6a^!yW6lWPljy|A`ka#6VS@t@ zoGv4f_O8Yg4D0Z)s%$?5LQzv4s>s$stxqKj;dSo4QsBo+CzQZSeH*xi$?b@BEK}Hr7mkJTLqev>f zke1g=E0jQ6cj?ef7GOK@PwtS<4KuoHnjn=Ph8kqS0a0lwic^DL9p)Dy7+52FP|BC2 zfKvIYJm`k;+RB%Ou*!&jrT%;Haj<4tgd$W}s+{J}mdaSwV%9DlASxP;;PM%7QOF%^ zbkvlIUV&^dRoPWTSm}W1dyQ0fBmFT*{(}XM?a-y$pW!c+`KFoECoB6#}*JGvpVl#h~aH8=z{}Uj@6~$>#;3q8Cb6++Nu6 zQ;Xk`hL7cmQOF{MG@mb>JpPkTsI_Yra$%A;S*n}TS2XK&YONl(JImO?D z(-c5B{Jz@-iJD?JEX9a~d@#AgBmFz@BP{_>g&Vf#%D(|$7I@*-s$Vujk%sb5$o1RM zJ3#&cnT{?Uih*OW<*OFYK>DVmqq(cjt&Kb8P<5={oHswaa@-oYIsd1*Inp8jd37-Q zuc(1Pug?F_)!}`uZFb|E^Zw{NcKYBoJYT*!&|(AY$l=mUFH8be_BIDDW~|lKGG^Kw zrKJ{D-LvY$o%fYY#_aF~GV-uP8XBl8S%D506Nipp?=bub@t(^E=KzKa6%5so{)GZW zdwzm2c+ZekF;G9SZV~!Z7bz%eeL`PHrPfY2X9O<-mjCiq-$9GefBCC|Abx`hb$a8N zqTJ`hvh{v>;@i<^>vfQDHPvBpUxPd7lf@gO-BJf!1?UB|Q0-9WN79lO#=Ti}LjN3i z&PJ>g`kRcb$rq93*9q$kiNX%cu>nhKAXzmI_VT91SmW?_8A}kX^ETgqbBCGxWIHh; z8IPQB_D;+=U97=e3=3dn+_+}BRxMfq9c3XN8)FVf|EGVRQw4Y~iGwHpov;=o>o#<% z9Ym`9{y{N9H=v`4w&6KcQ(10JqJQND6T&(@n#GuY*z2z1AIp#;i`-*4Tjb2pk z8_$h>0Z!=hKTilea>bw3#W`9%A-((%KVKD7z4*lZrEEht(W;gvX=DM^(&E!3IfC(ab>bK^=mlJOWq&XC+7{CRuRS}=s zy)XAKD5h+&&VVV_n$f0g<<-TuEZWqrV!i+DyI0)@SUW0M!$O5SAVO-&9g7%!#2#7F z2p(urBer;a&s+W(?RjKdna8#D}#P=Nbni1K$)p$t5vmBX^tF zisPEl6xkZvN@PhUC-mN13Mr)b9#Tjljr2~E@0_W3G9(GwHhOxGCiQ%q5U_egH3e>L8)CrlkeePYftpl2CT8v%#mxUtKsYva+ z7T>^3<}C3qNsGx(_MMqZ&_a{8U#?#H`znyOD^s!t`;UWsZv;+tNRY<4oGVV;cr-}w z|47csDI*Z@!EGt#uV_cSS!b%m4Xa6*Zhz`UN%x4{y872T_PbCP)t*zjm>z5fQ^90D zQ`9mtjl0vYY+3&y$YnR~+|@Bo&n(>|lBePtl4qeYi(kIb`EB4rMAc-RSha1L|B~VM`jKe!xh|c^qQhl2eGV6?mPBe@zfiFUQ51T!i zxF+i4$(g_32{*zX1ZHR$2jW;B5$gRo6%m>#w&=2{REgGPyCxq% z*Efj=icXrz2c-P!U($Xf>+jLs_OxH4{;NRuhYD;!u=oc4FX0J**ry(H_X?bTRHe`$b#9fyabOymbUpN#JG7ZmDc48>)vM2ytijGs z)iSDvswTLxG(mnV7KY^b`idQbupcpL6k)81BQE8lNZ`6|RMkx6R*j4+2)ay7Ix8tZ(v0JP>a7;tW1PD08q7j&|TzHj{R*==9I2+i?Ek)hWZzQ@V}#A3bWt_!|KKH75A6 zn;yn$JG>C!9OFre@fP~m%|ETY5h%HKUr=IB3cFOP4KFpRTD0P**)Ibv*U7X*VH7%8 z`mXY}axcWxqb@&DCV`GJwA$bXfD<*)KimP`qnPL!*hdzXRSs4Ua`dCoA~#F!*uD!R zH`gol#+!u*q&v#xomzsXn(z>Z4K+1 z|F}2ciG{3w2}N65{7Dz2YO66CA}do`8wya1@=Mke%$cFI*wCcugrm2wSqjqRk+}== z;9)=0nJZ!ZKfzsow_QrTNZ_q6mSVj~ABAU7D=b$2Nd6&PPDP6ZA!aQ>o0m8LrW3c~ zWIC^cF%k+y%LM5C?6Sz)w=gc5Q8_Y(vmw^I&E5NU>HK4cslkPu@8d)D--!@R<3 zh@ZHDebV##@z^Q0fkYh%H7k|7^+e0joL-*pa6LfFLu{*Jk$%98&5>dBvW)uAJG*WM zY>f%n^3(GjX!a?ExIfq}q9{C?6kc(DHv=DTCai}@eC<3^>{J-D zc-o#H{0r{Rkb#N=lLDiq{KWcI+tI@vHc(I%Iv{DFWDLKvcJi`*Ktq3m2JHVU{TIZ|4C6fVu)3=cciL0?7L)Yj~B4mVV%qXZs@@ykRn+zW(7TWXZkEJpl{`eo~O>D zv4x^zMoQ~J zd+yecHn{-lje4Y7(;5OVI^SKz=1b42d1}W2P-DAVxm=3zTdlI zC{|P6tjDBlv)b|HWJTIl+3194qo)6{Kji_^Tl7e+vPP_!$1GvAx#XWaUAr*$cB>9k zg0mvw#w?oIVlc?eZzR@48GRnyEEO6h{r4O>4=K6LKndZf=m;gmui@MjntrEm??6#DaByCU!>R!@ytW>hGW{M^HMcey()EoqU z@{(z^ydUb+bK)H!FL&sSw)9M9!Dbre~6ima0v zqyjXZH_3EC*mV&lhi!bz9eXf`?JgaDYmbZ_U8MKg@S{O(fkNo`r7u_higSDhk~Bcm zVYqk@zAhM+l@ESvkcfO!III#uvmY+J@0&?3Ky$ZUG#1SmSn>Q1?vt>G+gzabbJV`vXhC8tHFUpLqtPUGoPvDSVz7ff-Lcl*!WGDjkT&Nv zdsKlq=k;*_PwQRMt>2?_asbPN zDwdG9Ut&J2#2qQIJ;TBs#JpCH45P>M$BJuq+ysaoQV^lL*4R~7E}OGHV5CHE*(FmS z_jw`p+wS0Kc5P(zeIB3o$Vl{_Kg@-elp%K*kw07e`J_I8{1F{;?Wk5FLTdeDvW2kN z;>?`RP_8~&)c#*L9JcIM!276zx6Ip5$Q84vlptw)bw3=V$|O^1=9|amh9W19IzkBp z6Q}%yVBUC~F!Go}PmdskU0kaARIcSb^IW=6a17g#u?KNHuHXD$jcqVm}qQTHSS?uY1*Cg zw}V%1!#m|G1Zwjj4nGdk&ZDzur47gP=+)#{q?@iO99GUaC^wl+&)&YO51@ICKtsF7 z*pog8l=HmFq#5tOla4K4Pz88jC-4$>u05C*<~TD?DPFcC-qV*7^YJTYRu0uQ9cU<6ct?W$hMT z{L;pCm}xMCz>FNU*%nBY2QnlM*>yZEd*zZuSoVj^%G~G%#BXbeHMN=7qWxP5+C$a` zOs0tn%CW_dpOkpT8?EC;VZ7oU30)*8L<;D5iXHpJ82B$MXF4;-DKVUJoevs{ zF`N$xT=3Unx-65doAe|$6&B`QO0ypid*@`)e*8$nt^n?qQymR8#C)MRPP!50q1wsQ z_vuJel(Ke;oHu>qm|nogk7X<|b);y1xKi*o7y5%x6r0$!L24Bg)n3Naj$8F4t?uBM z6$2My-N7dkPMDV}21-N^X--W^E$#=He&-BD=30R`jYu&NR%^i>IEz4d}?fIqBZm#PS5?TFeO(%GSN z2ZT1@w}4>*y}m1i24$1MXVOyOXW8&mnc(w#m8hvU*)+H!1_#1tXn2@pSSI?|1KnX?|~I(-0e^GlJNFyatK zbmer7= z$70pk4;n2)_&|zGy(_bFB@Oq%(M*|JD z-bh$B38f*E3do9(G-*_Rf#@#^#BfAQIU6TVpEVcH#-SwIMlTrDQtw#k7b;o>Ms;oW z5TFG8c zJypildhxsMBXPAxCQxO~f8A;US=Mi-oUSa&YF)Ky-lIU*C>>qcJqr5f+TUO?JKsn( zec8&Dhq!HLcU`=?2hcZ~pf9&j@=GZVinM!={)wc)dFpE;|BonJHW_!z7!semwA421 zbCbQCYOXu7j6STce>-&8lR(waBvln9mE8@;XRi9GWUs*WSuSg_7?*z_>M zmBg>ZxTA|PLiNGXvt~aHG>&DXQAwse0IAGYQih2A^MGf?0_g5 zrFCx{wj8z66cSmyp#g4{y3~9K@7gUJVCEPt`taZPzMhEDhp9<$p~o3!_Ikim3Mn;q zAu`{}DR-$obNc^=_Qo^X*SV|wc-;%z}DylrF8a1x}A4t`79aVui164_0PCZqM z@v7;Rg2p$NJpfeAAgOBd27^K%T3#WPR@)}e@UTW+$U!|D(?|-aQ63RSvr!(9hAK#}Oiy@`?pWMPR`b@K;er!5r zD_T+W^b|(zFP-HYvo0F*Zt9{e8ev5}wPVpztlgTgrzs}1#?*>+45fQG=5x_%+0OL6 zx)f{K79_=C8Xjflha=IS^?;(4;=78E z+cOh=SBrJD!o1Ib7B93DViaeD+W1b&*OQW?@OAU3-54cWqNCA%*gJ2(N4=HnswShS z5BDs`JHW4cnyg*!q+kM3)-R`irHprg+6TA(hIfFaBvp}681kPhgecr0Ee|}BJj)kZ zNn<|=C>??p`6o@s4nfNjXtP9`GLo3}B*pgZ``a5!(e_+UQWS5lWJr|BOa40RVlh)j znGD&r=d+t|GUN)9vNjlf?2GszcW(dR1Sq{aqQIN&HODR)Q7QK4wcC1=l zrAKMT#X^$5GD<5(wgaOv+y9HbwR36#<7yIPNo9|44282W5E@{(8RZ)vW4w=_y-2GL z|6*3_7OW0mL*lH82#_LANnFg=Jpo>t8s^N>*u{8nK6Y-!_?H0NS`wQ#=FN#WHbXd= z&G^A4N4CG1a(zb0CA%zh$j_Kd_B%;)9E3qSs)Zj#3zi z1tES0^C2H+XeIwj>ete^`%gaq>J={nh3j<`M(ZQ~FywJ7@uS3yIW4J~d_#>w9~gJe zbYo<2;5*BwhJo4*+^DV1kU5YvMU7q080GPUss(fKF1b;MA9Lg&<3y^nvTXoLxpnrw zmuks`q;5mUjdO;L+WZC3x{0I}iYS`=fdJuVBh^X1@iC*v4t*xpWxXl&>KVE4Uig^# zc-!1eaG`)9dXeniRIesB{BJf zQHI+`LGssA&22}PG1q3*z>~K>2$XFjDGS5~_@nmkzXdklPd#l$yDN}++CuaS!5Byb2~_MyfgT$Cb}g;WVKyud|9EChm?T1u_{<$rs4G1ltu z)lmx#HtM|f{j9tugjUp^ZWv zvv&}AitBVJeYUd7YR5DH5eJi0i0vCp9BWc<2jU@Eli>X;5C?Pu+mZ1=hk2uJX1Q?~ zJ(hz!b-&`=r9*V6Vdi$5u>U>4l#WN9k0$THjz@nX@j_N+5S=zY^4?Eg!RP}ZKu-Ai z-zYZjq~Tff(8fJfj}KYc0n!(Y7d=vJ(r`Kyk$P$WT`hsuY{aa2^^Sil>68 zmpEo$QzlOR{oKkCIC1KTjw1E&oH#|R&-}13un=zzeX<%Hr(zxV2O z>(H0}cakP=tO?q6K{^@44(ulu6xsh;$|;=PzH@{a_1Efl*lq$(T-^UWo;V^{i} z^#UW9U;LKl^*u9i-Wc@y{xca8;`VAaT$J4=H|9NUpIE&U`z#!5z~s(P;18gZ%MR&9 zlhK&ZWf1~rMXM$f5^MQd$ zg4d?b##`X2Ix3-et9`G*{T zO}V~oE9Qp&n?x&DoYSKC-4mYijODB0Dnj?yWxYAJ1n`|s;uFC69!Mw}!cmtPE&-j_ z81Xi{teTv+L+ctV-M<;)9Qq6(JA)CK+=dhINzt7SBv^spyCyTsyqP;Yos=o;H=Xmp z$vExxOoGnRGLx(w-2;$oAW^BX%Yz6PhE-gN?{K`UI4F5ynf~DuFi-5Pl;P*-)1&Cf z$oNYZppHD7#9!gI)O+MnSDNJA)a!kt#X2(vbX(u62WAYZ)Gf@dX5@+HQF9iPR4w%m)Fqc&pR2bqA>W3JA zfWW95|IgH&zHOY&~YWh6~;ylFR&vzNZU3acvqOVX4$ z`?6y$C1&1dDJ61*T*Nm$yvYGLFEGPtbv2zDRx(9{e-aG@yzFw-oYlgxK? zWkVAfPJig9iB|xIi_9<(S97aE7gj6|N}Ob7_E}3YPI9pxOIh50pBeD(CVM^QdxCP- zo&NjZ_u^T1iH@??>R>n&Vj<4XH&RX?WnS34?sskK1N2==(kDcq9Y!d^JH>-t(u@|> z_&t}*M2jko#LMFTD@*or%2&Z@ykoulm1n*HR5?hhLJ{zi(<&FsbWh+E27L$r5!peY zecX^7l+N)Cq*TtI@wtBn`kb8vYPUDiMrJ14shqd_oz$<4v3g}-X4X%AfyQ)_Mrb+c z4djBw8_f%N!EkEuLn{_aK_6PTrZ4ieo*e2SrJd$!pIa6_9a9j z!_K!-zCsjB?6p|iQnbV}b#&Ty2D?Mn@1~q4iY1oQbpJ@S#IgvQdQ{{Z3}59lw0kkD z7+T9!)`ud3QrKl-f-u`bw5Zwz^zC3&Vo&eMVh4%;>Ci$LpeW+^(JT;A zvdM>Fb-20aJW`~5Oz7?9DCONqlrSUCsm?HY`Fxk%a|!~6iq zho`K>C3jsm4Ob$EL<<*JCVgY${gkf+<@Rw;))QOs_K|Bsn^mNnJSNHs`mDZ_avCXl z^n)wnzhEAHo{q)=g8e-D@=&t3Q%)BpkACr`z2{&aeLhK7#2<>VTuaLBd?EGJ8EeZf z?Rn1*l*|GhbyB!CR4;WRk~%;Vfn1K^(wrpWQs#4$vVyK}D)!Bu85$nXGLDfClmzh;r|;OuNt4qQDN1#pYLI}Kb&RoK(c7gD|+l)f6*pZ?<{?6Y2?qYf`3#{IMp?pzcv#BCGqn1)`6s|bV@ zZu{||WbdY$>$L7w8=oBXM=8+Mouon0fOfoA6{TC9y$^^eo$6 zEo`W6{dTH(?x5Uzi=I1SKKi%I66j(g%kt%vQ$^`yJ@$r*rP!0ot)r^m549%Hugwy! zPQ(OTUr9NIlnB^Yk3P2&BVavr6hc<2{VPv}ko5KaLD`5ccTGgf%5{`ALbd?Ix+Q%* z^^_TX``sR?5GV5W)KL~nG7(WPkjdUoIbD?9cF0dBiGAZMbadHj=cXsl)>l$bp%VPo zVjHu&>|Krb+DaXTFbh1)vfYxupK{tLnxx_E`!?f#tJ2fP(!0+_r{L66X54Q(pE+wc zp4rtTWuZ7jvzdydZ>O3r+T5h2mwmkUDxj-|psTW^u*wjwQ9l&(l)w)MFig@CLViL6F#okr@RO6_BwRwd2iy{XSL zi_qfjtw&W^luvW60x;qUPi(ZA?4K^m-GIC2Y7!e*PxdulWzx4(y?bae#7?;jMqv!` z8Y*2@9yy(msI*yqBlYwtqOP4)=ZxR}GoDq~>gj{N9rnF=uyRS?Pd#nMY@Cfl&l-+v zcb$-Ba@tXG8vMf|<(Bm@t9G&aaK?t5_OZm!8&_`prOW6AXyiJ z`4n_yDk;vIZdh`5ukrT)OcC=yZbaX}h4C65?o07iHx@62! zNQtO5P1y7cYV&#>WiW~|AmmA-`Yfd^Wy{8cwqN?K8G*Fz7kbmD9M-7M*(b@&HiPprfie91wB?p*qvPO_hG?D=CavP(0?H zCqF*|J?4!%?AAOcw@;ZIkN?DVhCi~3^fGF#iQ%{xg-v094)3@Nw z!%tEbfJ`>qs;)BW+bO4uqRac{owgJ8U0;%}P(!TQYd<%((#HF#r_HDt`fopcH^!j* znb2m}wjk-V`cCR;G{!tnTzJY-jClqUXbcD9_B)Uvfl0rxKd2jd!hlgoU2_6;(PRga zPDuiFNxzV4>eMC|g#YLJ!5=KfUME44I+z9=6~s1AEiM;kNc4iD2A*|Pw1`{D#wxLg zR>**)ye(4N-Kslor3je%8l0v2`m4mbsyye@JB+n_(;uC<*$ey)>!^YjeFw($E=olA z>nCqsgQrY?9pZrB{{5~pob2sXOFB)y-pngrk2XPsq^o~~fvjXNrDc@c;8@q$X4A?4*Owp;2M0{9FA^v9yl>Pos zsr#DvpNoFQy05qaDfIRTH~H&%Cn2+=PBVJ_{`Y>t+$uobqC@SE)q{GWtUd7ncniaa zAc4wd)$oP+E=$oSFZ;h-iP~fUi7{!{FWu3Z^zBsdJDN6m_oe=;QJb_9bX9qS#kNiH zq%WtQDx)QL<2ygj!Mk9ao+=iiEZKxq@V!(^3T;nceC!Y6p1zr+)z1*vt4j8A%BgZ1Pl?Co zel@cRR`3>*st7bj5+eEDO24NGz6P?-&{9<*~+bF=CkH#p7lPS}g?Rr|**WLXF&c&{;cbj5| zD^W^OWh+~d@DxqW9JjX^P~BsWN^}yj0ArR>%CzxOBgX$!4!G_$#YGrTP@kVte3Xt~ zX=isE>jQlE5%_An5x>~k-y5h98vH?VT7yB2nZE@h$ZsYNW!}&qt<~Fb-q8I7W{)%@ zHYXDCwn5YIx_G0fF76NbJdJVaZ!LoFS&$2^LikUb>lBVPm3gE6L|dBQj&V?Ig-y{V zo6uHxpgnj+sbzu8EVUHPdc!$Ci2Y0+YzJaOo-y--f!VCcvlWLXp$B&Ve*J_p;Ppcq z@|*zp!po|pz8Jlsv4qltQ}@8-5W#Yk1d87Ocwu-B>ivf`bh%*bHbTSrpszAs7X#A( zS}Jvi+H15LNU&D#A$AzE#uK~JP))mQz4rC^9nFCK5o_#aJ&K&Rz^gCvN1tJ|6&9oy z{(1|bf0RHUkHw&wp~UE7>A>ws``Iip5Ruc%b+vR;>t8ME3Di8MQIl7i zQ(RzRy!I(@*-dOs2S+QxL8*X$Yvp4ju>$^a0--nHuZwtNFkQ1wfQb`Eu(TIYI?A}p zHswSqJ@x*jc%nQ(L0b{36C$ywDk+-&$W!p@Ul9@W+>6Gz?LWRcaVlnXJW1dUK`-=R z3?es`VeqgD(JJVAQYpj~o4&Vr_KB9e^-<|`akSbgyp9*n7fvcpVbF={j`QRUuf{g12I=_KnP-)uTO}1{gS7Syy#ILV=|sMxLmU{1K>JD}+F}7VQp6?kPCrjA z7aJGKOobpF08Tzzt){{oY!pD%o0G%NeTpw?-4)l*MPJmb?Wc#EuE(jYxs&`YBaRTss(c-G(fRiZ5XW%GVcp+ zIQ&jU%0#S(HdOtN)05uNaF><|`IY4%e-N(-(Agh)_tVc2vv)vNflS4d0yiOPnu*2h zTq}PloopLl9k3NU*}h3o=?w?G^#Y{ck!CL3gv1pp35Me_GlwCl7i^HEZr>W!JrAD& zwa}3Qt!M3HmpCR-{{L4W6aoXgzQr>j6bbk;9BFC3OMHRALCltM7h^S0x%1cY&jX!r z(dY!tbAXV_yyKjdX*<&|C|o%WXdOb*3L`|6FBQ4YE zz#qjONnXk9??&v z9I~vd?jWtJQj>RJW5Zkw{Lfq|G2^Dy!{40Vwg>Cs-_dYm1gsIOP6$m}T?C)z3(|~p2txZ~L41gN zS#qISo^_%zBA(nHutb#abnA?r0K5^8%MG8IE(sT1@WbJ!%|~7Ekw$Hgpn!AY!90n& z^8L}ivaJ#&k2fj#-xM0FE}-?te}BudtI(?WSVLBk-C z%o~jP&#bUeshwGo;f@j0`9Ybl!PUh85GveHF;o+MR=MN;#R)@n=ugsI7$fkJkD*b=OX&yKu z#&p@4adt7DVVAx3-w`++`Nu?@K55nqZ3~Go5Y)-FNK zF_fUQ0R~S9Q4dbS^F+~{v@7GD?xtXw*Mw5vGPbm62HI%D2&_%uVP=#aQX%su%q?xM2swQ!x5q4wAapx%cn;sVHM>F0-@M91f5UfX<>W4%?}DLvUyvlr?;VO z{?u`#ob{TKtKavl-i%xwNnma9!r{s&oR*4>ovReD`%hD^oPzh`Q3j+eB8oUur`niz zA|(sx;My~H^#M9ZlXQl|o&!U>8BfNF55|fouy<(NT-+~<)Ngw zAniK(zLAJ@su@xqYKjZeX>aV&DI?nZx;?xD(ax|$8|1)TX0#L?@bhKg?L;Y-uLaPDUa#ZF}vMRo#KB zb0nN0!qbUvni|Ye5c3mqYtqFw1cbxb!m-^B9vUl~e!Zw+b`4;gD`SgBU5Ex<%2@FT z=peaMbGn-+JaM!0yDHnA;NUywtr+71l=E~bp~^rCjL1lJY~+R~OG%m`@XV;YY}$o@ zXTFFhUMEz9LK4$@=U4>Zm{*L})$T91JiZsZ+AWa&w$EE0Q<6!w>|EpsUW>VTZ)iwP zyy=5+h~yU%No6bo6&5K((p7Pg66?|BreWKz1SAV3B#{WXk1)It2nc~fJiQ>3PKijO z`^A(k%q!%e%*Os?T%Qp*8+#Ffrn)2%M>mY-bifzOj|R0h4#Ck2KKyEYSD<0BNJC4W z0NLtLQHlY`>L@gP^o8Pe0Xa{ESH7Z}u1MfmJNSo*T>!@t6C4eJkgTpuH$3~AQlZuhHBKVt-|1TA4=e5W`*#g77PF2ZVvjGr z0?_;>p%DikWx;fMsMNYDrTd&Bz2E+D+jx}Tl?0akBfY`+@e@&cSD7J6f%K{=e8lRs zJbukABx5v`LE0UQ98fT#@FrJ~}ANO9j0 zvfaAvml@avXuXUmx2PhsH4_%9s3HMYfu}nFD{zR7S9qeL=%Af{$zPcVs5T^^D#ETX z`t>7VnFo`0C~!EEgGyp6&cqCNvj# zW^Lu5bc5*r``f#)v%)SJQy!E-C>gajiuuHJ`x;#udpedmaO0zcGIi&n4YyCj9xZ>6 zn5$%|lXI(WVNb*RgaJG^>|H4`@LkdDQ78kuW$dVglOI~9keFqFW&=I_?Tt&&2HKN| z$zrQ;L`2cUq5IERgnD?dj0lc}BnA-f6!WdZs_VK^FpXY$q=@OD;|@KjTYU@652)Lx zm}r%LcdcHr2CI7xmNAt0z>BPy;Z${hl?=mtlE2%4~Eu__TikVjweVf+n zi4mx8kCYLCwx|lB(oLpsWp!)bAcYkj&FY!h@Z5T|dXCc2CFhsiT__B z3Q9Mkv8uMP-~+QX+~lf;ehZN1M*JEV)=A}77xjqvp%xmBYg5I^zD5p31!!y3Wzn@$ zFqh>RkxIy}z(|p;ayXNVi78xGDOa1p5I4@~upPskfcBpvT0xczfk+yFiE5@|!Hj?s zLmBKEvN9bI9GieZZLuQOb(=z9Uo*<>EW7dDNq9T^mxKZOMZ07lb3-5wg;;7O8*V1J zrlBKR3iU#Xh!`Kwhvql+P=4xx&N+T8QYW_+zZIl-gIAt<(eD^h?WAEZDv5%d1z@Y) zGeq3{c<7{5(3Bt6JpC)cah!w$i`ZP^mc;3CdGM32`3M3McXtOO=HgA*vX=pLFBM-R zYfG~%QgB%1*-7cV7JmJf(O&`|j@S5*7mu_EK3C5Q3LE5t(gTVO%zG-G65ScJ+%xs` zgAY3B1dR`((Vavnq^6SA^CZM&CEGD6yAd`c^xtxsY{rCh59C1X(xm%X-PrB=RoIJ0 z{GA4=<66hw5(g#$n9(XqhM*-uh-DW}=)y z;B!Mckl6S_8a0SVLp7La#r$kWT4vdUokp+1Oq4SvBmp5N6!;*c3x;3#{4Fr@5OI`< zL!C{RjMZkNainYd+|9_5vosuHHx4Es%xeQHZRku=F!9bY*uU>=2}yG(>h;&7P1Dg^ zBu5XhBi(rGJudy}wGqI5j)XfH@<#RibB#G0?Mc4-3c#S_&E%$Feiao z29)A@;zXMK_xg<)KtX4T0vHIS+yS+@n^qfw8H2L;1cv($n>0TYF#Jcukf<*3;>2@T zDoaVAh+MFIZx*09S3^PVb7&5Ol^0o*d+q4sCJwzAP@JcsP~?L*50t}*;K3!?NA5+h z#QEA^*XRCn#*jsc5A?kMk%gB4hW~092&agZ7_jnRZBjyT;PH7wh9U#zKoN3|{imM2sz5B4LTvyUGNg-z%0#hzEe=?x`*k zKau;lnwl1@D@41meR}1bO?Y3sR7KPyr#p&nj?Wv0(ekd4x1Z+LLsJJP`KZlhGk98H zl*q^Nbw7{9N}Dtloo-i=PztpL&G7{o~*}0hz{!ngFM}q~FI=Rvc8hP#`XSQ+))~LShuup$G79tr}91v6!Tt+vYdjG;7@FFA@ z{M3khNBSozAJQj;3Uaz?YQ$-3FiBZ4(&017#=y_ILI4STt^D*tx>{bXarnn^2haBd zhp#l{u!vC{SG13eC{*BjU(mj@Uhr@0Jx)Zjj4Jg8gt{m4_rWGKO95rp=rnEh@Y_f2 zL2dOv-O7aq5a~W*qfqrCBlRanK}EN+DL7VbMZ+ zQ~8(ummr^VDcDlUr>@E|K=^)kT@e4J8(_)PV~OU$bZi*5+M~7#GHqbsp$!pY-h1g? z6t}3RH4ndU&YU{Xn)xc8C|*Pr(-RMhKh>tn15`N%m8liwOXIOPYNT{Eyriwz#06)s z@xh7}{JCQBm^_`*^q|vB8~r(~T0F^*I9BbLLGec|oHt;~&9G*L`ZY5gaer<%GNo7C zSUMi*7ZG=(?yndT+|v(9u-I)LBt@x)o!Ww}URO#xhTIO^3^qWBdF;~3RNHO6`& z-r#Y_?@dt0{E;2Pgcrz-IS@{BZHZf34JoJx>e zlh+kz-80k==zA#W{ec1)Vibg}E9shcXPoiuTIZzLRvXtnvHc)8r^{vJVEVeG1XE1a zf^5@(*#J&a6D3dG&Jc&&s77_MZk3A3CDJWuneM$Z`Ms|CUk2|e1AL4&s{Wb!3oIDQ zsy&@*A%-RiuiQHL=ba!4Jqdm$-nhi05sJT)q`d3+0i-I|lI}vAl+cbmBdb0#YZ zTCHm??BsgO4MNGH39IyVW=fnCN>7-VxJQxZG7=RchV*QxL?l389>6?X zOU~jaev4bTrGDa}( zb+y5Pw%3oiEBDtSz=s-w50&D;ncP6APAPa0)5%fkl}Wb?Ru!t--8w0#(LJ)a@mc9k zr_2o-xnRo3f5YipOVC{%oOXfg{&YII{msG1(Zxx?9p6##`p#9!qzg2m0$;3P1Rj zWG0$i9jIv4@3xM)Ypg0VInK&Wr}Qb?I`GML7Xja|qwt+`apnQee1}2kGc6oetTIoV z)ZXkqWx}(d1FqM2pBuvI(0Nd#AFmH7wxLV>NxWQOjrt)u=A>Mu57g zD<>tA%<*(~WGG31n(a0%Gi}c;Ku;Y(54M0yVymRUalyJePPI*tM$J#}4qS93==k~s zYA|mQ3d6n8dgxV?7w|@-{szCAtk6zRUVCIyC*O20sx(JjwR}w-9mV){&DD{?)w0b{ z$|N-2jz037ElWXCeE+9;3(fa*Y%^~W#Vn5wB~YXB%-Q|AVLt-TgaegliR>^x9+}S! zCq>(w_V)DMOMo8@RDN*uFm`xvnr=J2^tjy?+m2a+DAUazI(F`_-vh@Q4@8b7_!upj z!7e{)5vI1E3O;I_vK6?|MB_$9j}q5`Btq4y6@HnbKR*cc1?|&U=#MrDZNdSz z8?%g7Ti>#4(@gjx6Ji`r@xUje7#93)`oz+#B=<{rhI~ zvD28TG}zLlvr~SLoeuzw{h4V@>BeKHjbf7xeCmNQj{|KH2HJ4!$i7)VR(r{jX}tM9 zJa_)&`+>qJD}^atJZ8!$c}|~rnuk9Pl*Q~*RvB)BY}*6)>@%M6r@uFU&BH)tyggJN zSZhexe-&j5u3>{AFX=U}u2yt2@a z`@lR2DU)r_8`N)Q6zFWF(V1toI;9H-w~GV&Y2Y-T=CAy5#H@ZmLt7FW_CI#xDgE1- zJ2zqW@(ncX;&cz?%-a9xjk{#Sgq{-xK!2kt`u&cY((SX)rTNRS+viO*)P}QWzf(ZT z8sC=o>I%#nzuA(4{f<1_cxUQ$>XVb-0pzz(kmt7Lh9W))k)*=EAqD~WnSX=g(RuOg zAI76c=T=^nC$kdvF~!EUo^tgC+g}EXZ)*p|#*-(h&9HCj?P9d~t}ht#8~Sx_?-;!Y z*1BdH?0&Zd*u|)2fB5i@IWGZ)_p(!Huwf6hv(soRjnKiG| zX|(-*nfAwsu|V&G8ogMKgOONourVM+T`8~55o5wq@YfjmuStAL7ApCfMh&LKP z+Pn@p^U(iA&gk+2mj73jpCG62cZg6t831J;=W+RIdzi!5M@(HTi=07+R5ex|@m}GvB%@ zs+K@Cx~yWF3s60(p~?$|+j`VRLpWu^g>7xbMgho2%>4Gax%H!_bs(GI`|n2Vto4|N zrz9UL=8+#I!G@4aod;swSf16kP}~0zyxDQWgFCMTERSngV1#6uHw;4*nHa;qQc40l zfoAY`XN<}LG*4(~-0|i*a0Gz^G}ZufNksmTqGaAIjv0~aq#_ViU6B0~_E&jQLsS_L zhar~++L*+BUU~0%+_f2Usad6f4ff27ewkN|!ly6(an?}e(^DF%8VEOtlX3b&zKguK zQp6|P4E9ZD)onmTPa6^WgDFSkpj0}Yw{pZ34YNgGuiQgc^bRR{Fpv=}46 zENN;ml#sMR|2S^76YxGO;`MtQiMgBNd_)i`ewle{+7*G|%;yi;inBfj84y(Bd`9^D zc*5|MZ5oRC&y){C6wi?;3R=Tjb3X|SKVGQCMA0KGZg;iw0Gt~l zFjyEo(b75YdRkYdIb+(UVppXXR7`3^Hfg2;u8lcc*rk-Bc~(DIxE?2rzG%c?S4fy~ z(0YF#^4sFY*!%mXq&R9bkW1B3Z=+Bc@HR%VP@G$h4rTV~39HwRs{&+$C1h}J3F)or zi4B{uEt0gKKx&G`No@LV!Td008l!cQn$b(|1dK0h80CYk-Rd!o%n(IwiMoO$iKp%9 zpv>((vy*pE0BCxJpednCmX7I&Py2vKZ%y%f&~*P@)0Xq=gcv?-Z?xo6Ha%ytl3^|7bgSJ_ z%+qdnq#OO!m!&^GHVF9NO$mN0_{>_5GOKakn$c?_fc`xNJ=|=?LXW7cLCR3KzXFmy zqq{dj&y%z?H#b{`)*JlWcXlo41{Az6QPASZin^M-lCPb6?(w-pbEpG?urj zG>ajz%sX8jMn|BjT^`=v9ngF(qsg;`gSMkQUJh=4T(K#Q6$os{t&6V3$r4}4*eWc* zX{Zn*+(#|IvC5RgsescWf@dG~`fq&!+m|x7$}q&nBJpOmF*L$RcGy$rk{5HVho*Ht zela+86k6V2$;kaa0ljqQej%}s7;@C~2xON;#RMT%`?+sMO++vC*XFpy=n!C)9ag;k zRSt&|4${_n=D?Ao>H*a^1S&M|;Z$z-3R{RKGbbGmW3EN>@dMY@0p@Rwm~F+^M8e3f zKj=9&U3})<VGEI0Tk6+@cD~#739RO2{n-Vp^g{MrWP*gt~a6 zr!MXf_&kkq?1+>O<{CG&>exa;QV*K<dEO;Gzvomvj%gMQPi>bQ7?z zEu~In#*nYJVx7uxPH0h^%QG^pMtiYir^MARzjMfD4`3fb!S2r2f}&arwSCEJ<0&+_ z{?MsdSMw7$yeZ>0rMvI0nnQlC2J|C!=;0iPaT+19$XdLgiy;%QD?VVFQ4oRB32AMK@J_kJWp~*rqMgP z=v42-`+&Zm6X{cXB5Lg(4`j-W_otIyx_9)wK-t(t%9LJ!`++cKiKJBH`Mx=55mw`k zQ|J<>+T^rC%B11iU@d-Bg#jUpGILX$S!XyY6s%ct`tBJ(!FYuN=nfqY`Gc4&WdGtL zsRpGXx~{=A>>#hI_{}@cYYKHxLEy`SStgE1Wxw=q%;7rfRbX8*+hD-Wq zoKY0r(JudU-IEF7 z0kiIo4C6iX<^_lTd?Q$U)1-BWeIAi>)oE_Rj*cPWmwDx+)SBjh_wcZ-K+ANI7U*yn zg$@7S--WVMHAUElL(eLC|N;NlFCi}B{L%MCRXzF;uJ)8b5XW~600 z9r&YYx8jJ%lnDhhHC>GIJ)^8-#2}z%ra}$j^uU!+u6`XQ0*^iGpeR?5it6&$EU2IR zPhRs1P&&&G@Bb>rO1is7@z#<)3*P{WXX_{?Z!@V`Ve&5+?~Gj6Iol}F z5B2%sr}u&CIc8L+c(wN-^_j+a>OBYd8+SKQKUbl?DpcqPJ28ol62nRzN*Cql?aeew za%<@M>GuFt^E9f;>tbLp??1AbZxaqmZ-nWcFIxN(&^2G7OFArjG~|acBFSAJsh$aX zYw!$yHZ*OX?fRp(F2XJ?3lga@@3k4{n*NeVt9XS= z8L?n5;UB;WuIREw^GS2K>YvG0lLaGK?F(8)Lf;GjHx)Ay7D{}GKr($O=&p2C`J3S$ zM~2uv-A&Cl<`tpUpS@Z$WGB|2EkYzhWlRWD@=SX1!=O4`iTsg*J)1XUrqf~(gRfD@ zkH%b;@j9Qs#RzjU!LYd5tnc?g4;7K6~4CC=e6#_;BC``c2e*2u(BjM&tFP(`! z5>{wf#9J^c7*@W}YTJ(eetF>nhjkvEUX~4oeFNtSdv4)rX_EZb4c7U5~(6-pLb(68<41yX&owCuc~Nb1A?eP%LB>J}XWrcKL^gQC9{y?5qL)L&b5IP7j(*0oR@qY`WJUhSme z$cb$_1jgEMp1On9k!0yH_sqnOB-<4nV0+a1qlpD5l4T5{A{TmayZ6wh=dAwmnuSjQ zrX3QdfFDdFrx+%c)19X}y9gSMcNOv` zW%No**DbQSAU!3^R3O<`i{icgTkPif=)L`;LzGyEt=lbLJ;@NAxXz|zG3y{oP3Wax z-|%||P_?{BMq3>(nq8p$8v(FMCraVAw-oz`$Zuci*r8 z!MwgS6ssGj4MP-rH58Ov4^I@d+v$Dd$1cR%#zDuUCrn%qv+>S+*F_0e5bIJu?ZVmE zFY90e3#H|v1xr{Zl*W;3!h1F#M-I_YbaH+f{2RLY*M`|++(xMvU5P{#4A#9vyCL6juYVcdkdH`2VYmQs#6hw79oJmC8ZF(wX*lSYA9EP&lA(m3 z3CRfle$Zarzkksaa73Y|`Vc6bFOJ!E37|MqL!rBXng4lKnV|U`m%jS` zaP&DIrTulwNUh~D!@MfA-o8sGT{aqf`~E{i)FUhe^GXX^g?b3bg@UwBzZS<1Gb-Bc z?8rq!#-Yp}t)Ws{#imSJXg7o zE=!mtm~wNUdH2l=&>}e2fI?1yvw0Y^Vo}HO5PP}#-`_08v-n>cmY#7TE~JVdv<`de z-G`6H4tt$63>DB2-qvBq%ma#cZ+O}92kw;Pw7-wd!ph*h4JdsExu5%#*hOjKNfYq2 zJ6^+qdCBpJ0Co`>y0F+Lto%@iz>qTW{M4nF0*(_j9D28sxq@fbT-g-+u-8=!W)#EU zKT-Sp*6DpVj3QRP&`zGgIg7X9$#as5%OfU`dVFBd%T9rAIn_mCs2FX0@N;mC1ycO7 z&)#?Z7W90btRZR)iTSUIn53-OWT2S2MDd{iu--c@4=|mgVTwvQy9sQPGI^6hVwWh2 z-E=~Jmu)40=~NL@5Zf;n#<3}Q(j+gQwba=ZZvD8eWO*4NJ556->K!P>Z45$K%wHch z%m0P+1fJ*|lp6c7hwfQf4e0)@p{s?a<#1s7T#|aU$W2BUCPaKQxYnc7?s8o-KNyL3 zxzi~qEloq{rOB0plukcq{QBWs?DTVngsmR$a3OC$vVccSf0mSns{s1UV5GcAEbx_n zs4fWN*CKKU5e%Z6y409=i&HfnHJ|5`Ii1(-1B%Ka>WUuC&;K9dhTfEw86O z6pY3^en_FgG56@#mOh7k30Jl9LloPZ3Sydl6h94n{SjB^&Usk9ROgNQ>pfA(3BgXN z@UR{Vbv!ZX-2O5oH%Sc-Ve@F z_=#Dwy4yU6fbv<1!a66}Jp93H$0Mq<6;xs^O^Cc`$s}vW|nUn|Fv~}M4elEFPk(xXut`^oP$t_wrW>C>G3qQZ}jY*hU z_+JTM6s{i_nk<=+e3B@lTLqS@h^CjzK}%G06o2>e4?ZvnB|;u9~f{!={md*TqI)X zANK~TLgIGA(?(TC+I2}v$}=}7STQ*$Q{U2EUpz@j`}!wPglc9#^szl2-S`T&@#}#i{~sfTE=Gc3H`QXj*}w^7HcT1T%kn_ z^G9zLBZf{(B+$M)30qjPIMS4>vnF#-T{w1BC2%EO!UAf9>&O-^`(n(~Uv9>Ik)dMj zsA}oR$QEXPbV@(Nb9a9}uKU3U9h5Di0{>JqOmTAMG&I2F zA{S01UxD-)th!HtD~FVCUjP>lDg90@ovRkFn{wPAd|cYgy4$_^Yvf&CI_2bSIrLRy z%PujxWcqteUXp(+_VvLA0m`q;^Fm3Px7-VnA`7f$Z>hi3^e|g+)2&TzJm`aIGrqp@D7Y4IjYwvf{kbxbGMQ;^0<*6SrN;Q52WPJ90V{L4Ze@x? z&FD%EH?{q_b4>PE3U-c@V&%Md(KI)v08e`}a1>DC1r+Sm6JA{eU{v||@s<@Np0c}^UCQmYtnrk7*8EBSj>-bkYm6Tj`EeaS^> zC?-}KsxEuhUx*T4CW*XmS12KX4*Whf2%!7L@Pl%K%Tb07{0ZG}<_THFZo0Xd?-ZFz zSY6xO!*YtI+yy$W8!1DQ;U=eD_QrNXc#n|lgNb%Mw4`?9oRJLii`6huv|cuqER1|+ znkd=%A0Iq>FJ|YvQc6=Xj5%`i>=W)Z-d4VxwrHmSl;jvGNtdekSyu=A6mG83O-ldH zmu`M_DNcCHwLmT2wye)Jhs!8SSdi{E9}dGVJ&LB&~eA#UCWuRL#u8|cX=>CxRuDr0^v-yCi@u;FVnq``oa zy|_7Z=+l6%K!;B4hF=L`-f$3l7Xlfb02Ree%R0L% zDTW%A7v1*z?jzu&E+nZegn0x3@;sKk-rDJOKwpN@4j?YWDev!-nXV-1X?!g`^sVWC zIpm;&ib%eSlYFRFP+3W7ZV1z7zz(9>HhArYpwOQN5!!N0M&Z7&;gTCf%(rp}rEA}d ze=J?{3TUKaQl{L(07+$nAr$eq7KS3#K_5h`VEQL^Kk_%UwP*aNc)n@M31)wy%SsnF zg)tCrhxviWPO;PI%|H0fYo;^;#U&)g75+xQ4|Y*7N{p3dvjn-?8I-k zsR4gLY}ut6xT!G}+1DV==oz`H>yry>frc`I2JmrHc&{i_?M6;q#6h!}8d+R$-g!^u z2E^&M#0kktx%&{On&hpW=Ocgqe$sn@vxkTiyD5PaLyiXI3o*&hfE!UZm85HFS{mGH zU^gnRw)RW_!F>X4$9Z0o}Nz=TOW8s*q?1 zQ|38?`0$)`Lqjpq`M@GXQ7NOKOijkCImhTBEwf_6%AGqgv!Y5yq28*hiR38BT>~wp zIj#%kUiy0Yn2nfOQBB1nrAQ@*!Yt*KS%|LZ{3CG|VvQb&H2Bc+jFj)6a!M^6?tltp()i$x~PUU@xoe~lI@SvlX zW8Tj-680F(#=u-N$P4#I+H{le;HE%40WT6ZuYqCN_%D9@!;ztE5Y2{of7E}5wF1U# zRg75DLp?l2Z&C*iE^cQpO;`UB9kvT~^>qpzks!E>q;h+PLU-mf)ZsMxSzcSzw9F4! zu9vYuFewJ}4ue=@PMBlK{JDnPEhtN#(%>+9(1#bDu=N^1?jev%B@I1F6zGt*Bk6il zkJDlsJh5gf{3)zL5`+?@X5);Ca!GR;Ky~96otNUYY{3*&s#b|MTl@x(~cy^tpom7E;eZCM+swVwkPq0hzl3rHK(u%o zo>?jO=nN=-y-XYwApd<}Krf!T{0>U4L*qkluftr2W(9#eP$qzbJ6{Nf{80=Fsnu1s z3Q**s&7{=;?)oyRO`}||1qz%SR~@QjL9-c-_|MvDgMg->IZc|otUdOb&Y~y-rK^p1 zkdt;KJHqPlX175p-T7Z$_09(D&L2t@rLb_OOT|t>mhooN_Oy4)gFr#pi~=aL4Z-+9 zK4O?cIi%#=96I5lWtel*KPhb;6UQ>XtCXQQrnDXP)U79OybUOcB%!1%9*FrB?J3@D z+TkiHhLI2!V#jJ5IMl)+jh@?kO#SU;peJfZ4<|x+C<E*g^ zlr9^;9@A$AcG-xFbO>JT_!E^wnilS@grEiA$dY1uYSK0Rv3nLH%9i9Pu@>GWw89l7 zrQgPFSAQ`K`)v#$QNo2r?6R4hnNj7{l=%rMm<#TFej;LSwSk$!+SFrq8a)^dJ#!}Y z1V_EeKx?L3kU!bwhOC^l)a?8tG}qv-zbxBj=n18Co|G$V2u0qOzAO zN;;PbDNt$AoGwI0fzkJp@Q`%D==3Ks8d&c1T{{kN0r1JPr zDb4`5j_(p*pdB2hL<|S@$XGQD^xVxVhrxwu6;+}*XA@L`Zim7TYFZL15e|C7d=wV@ z-G*{I^92rCinp^{RF0q_0!^&<#R0%ffm1E5)ihJ+jy_wChFx>3O2MBxseL=fLCN-d z>xbZQ%p|!@<*s<`$n^$&2dIP?t()>Lzwg4c>voj}cPPoe|IY{y@N0;Vu&W3hJRD`RzzQqcJ)Ok*Y)| z1UMrdJpJtsN_BbXyRKe-JD|TyK@UC7T7*_|ri}*6ngU}n2ZVvmCiGZfme5%0HJ`QZ?587T@0H(n&j{RmkIB^dGJ3|nKInl3U2I{jec0bBD-5~H*G^1Me23I3 zpzmPClpHXNgl^We(&;ePalP=#=QD=_MUN{KnO3hE#Z&Y1>LpA~BGZc|nH!kkVbXs; z;i3Fnr1n=CJUzq?WBj#e@9j%R0Y9El`B8-3kn-X&dQIQ|i(D~E$;tPev2z>m~JLRU`4c2RI$ZyYn?q&s;qc`1wq``KcndCPbV!AYFWv zD#ipItp9$(LzNv^y=s_|5i#h#ZC+; zM`bW>)yCabEPyBMr|LYI*$hUt#c$TJ#m4)3sU`jv{GtwUUR*yN77o7;!?9WVE*mvv zp=RKTbSu*TJ@Sc6C0EPR=&6|b<*I47!0s5N$U&akw?#6@l*^kvTMWq2OfK9DI?K|s zRD{(Iqj@rCE#EvHJ(lbdh4Jdkk-%(_$j+s|T9SNtM zZkNr?9{(iJ^MXo`KT;1af})5Yawb8|^p=}DSYKNbjC-o2!G|WPN<41^X+}HmA9sEA z^A|wli~E;Gq(4vNu9S8rc5j0!{795%Exa0vCH!xX9Q^Gn>~j2)$_4Oi!Qfrgd{(_Z z_{|G(q#GkOQ&)d5egL2vtf30VLUCY+Bz!hbIJ$Qhe2AbdRF9{Hh%ukvj&!5#{6u-( zRrX1)6x|Ykt{1@0Cz!Q=MANXG;f@+cMb67_5YK+X}@4GYZOYS{<89)@tv_tU+r(Rm z=sf|U(OcivVdkgqbfS3OUl|-3i(dC3DWb+UG0c*cPU-tl^UAjQr^1c@ZG{?4oWX%@ zE*NAUQ1(Sf+bQ7ghryr_d(W2w^4f*G15Fx0ofEN_j!iv+lPv=*0kd==)iWtviJzkWsD$OOpnxlJ;Za1BgbrQmQkUo^M};Y9v|N>LiZ6cU$Z z#soID0-hSorbga(575_T+L-Z{)!XP7x#h-}H%*7T_m>nWTvD)+p{ohw?dmqDh3q%d zHjccEeLHYR^zBj87LoiUgUVHl{hskL^U+$eWn9ioSFLPN%6~@4fAE%1{veI(>wu0~ zA`eSrL8#jze^y4r@vtu(Bo8X0KpGF}u;e@4Q1LB4n}|mearI$8@Sr1;A^v1dI0BR> zO#x_xQ4Li3-bDX!$277{BVNg0^rBw-ZcD@#-2h5nG>_7BAZKKXm# zEo~v_TNH1mpMZyWgJm8zLyC?16EovJW4_4K3Vnc|JdQ~?R^bPhw&J+n?9 zh73jH^mudK)tv%ac-=dkbm42hiaRo|o6`uG$Llc{1h9vCr@$5-X-<9C^RLuR!}_cV z3Tg;QOK|iX5?!>649r__GkFX0Wxy==0h3$c$N_JS(W7Ug zRMTvis)HLyTq@2E`rU_zEW#Z$JuRuaXa{j_d3QZ_6zM`dgTb#Hl_^|~_$ja87q`(% z$-6o4yYK2@cypd9qaG^xvAV#eyTBW1RAfsp4-&~uO+Dc?!9zE2(x$nHZkCFUIOcu^ zbUeQM0e^mH4)Wd4Cg{M~7xMTO^S~2F2coaF5ue4Bdu$d=9x!hK>(q4kgzX`Rv8H+S zHGvTxz&A(67l@?298C>n;n`Lxc$u5d+*7Wbe=*>ltK!ukKg!<5g9dyy=2t)Qv7;^} z%>rKj#(O)xfMp)Vg3V+|@kGZrvwfq-i<;h5^pBq~YC2y=91i;-q)k2FjPH*15*T+j zcnP$egA!Pw@JQnnaS(@@=GAw&oK73(fn%4Ox#ZIjK(F8SyvdY$Sub%jGl7y1UupNpKa6~tHysh>@GmKP(~Pv zU#8vrYA=fy!KGihT&I;Qi0)W+c>za^eY=F`4SYKE)@1YsE|TSnw!o;?NJEh}8m@}r zChFBeuHgDC=wOU*a6lNuK26Q(b|#Ivb~AQ6Tg;$R{TXQuFeWZuVOu69udm6X_=xG) z*JO!?-3_hip$CquaHvm;VEG48oz|`);eEwpGkL7r^hN&#EK3zEL%dPHHRX)Li@?NT zSk4kyomxnSeZjmy7Pl!*o$jMXG86maAr4Mn^?7GZnvQwZ%S6WkG8irW&3rNwb76#M z)sbzCL{z+T_0s!5n&qrC<EjW$?kE?QCBz{z1BJ>slGrXL1t_WMqfn=a?H7J$ubiR>CvRUkU5j$Xzdj7x7i ze(Y1QntotLH5bz=TsqE#$Dox#RF=wTh9mIvDUtE|Q=^%0(?% z;%bp51MHf7><5-#;^}Xv&B#Ms@mc?Eh@x)jQ^W{{Z0GAma(QoQ9=!+DK^ll_Vr}s)#j~!py#SwK(sjt zkuo5LMPLa?c>Z{I?&ps^b1&Yxw@^e?-XX47xH0YzCxFtH>=Im)wUA_JXTQi^)KSXJ z*Xrf5grxZJ@KHkYG&X)aT`TaU0GW73*522Iaxr@ z^?qTD3uN0)WJ`c!w=x=Nb>$@*8zJ+iF_-{yA5~#vwx&gBMs$}tvW@I0p@r_f_X3_B zh^Gnie`2n7+UFoBQv0l#_nPO==rLjag7_-yaWPf>!jf@vUqYvhn}NA6J2lBHTAUq8pCmo9O5eaw#@wmqyZh@&`64^6BH`RJP?2E3# z+-~8B6!NuthJ>R*f5&?O@%lEzW^G>D0=RyXM-zM9ko@(UvTFRVK6$JZEqk4F168SR zM2T*dFJsnMGGUFv>&AOuua+eaK)+i?pNPc*-jJ^Igq`tOhm&r6&Bu`Y`4!Wf0l^*? zL0&Ks)pk26!`8>f z!~bAT-Gm_C^mq_P#5t$jQ&;|w4~X_Lh3#+wBc#9>6V2@Wwx;PyrbfhkoG zAazi9*Gm#cZgtYW1f~LrYB2|=s_>iV7H!0;!b8pQYoL`4!UzN=cuGQ8C0B^g0;j6* zlXtJ%Ru57fCQA`_F%C>L_Q>KPP95uP1&c$h12~P5r)wvaF25Xb9&UkCp>1sssEv7C z4u`S2{A$mS+pYklN2HI`)6c#YoMX%^xbuurD<1)*M^dD?K+QvWdAYC-YVkd^va&P7 zBetxXBgT)NhO6c%DxsW4fE>-ZxXHyFcs-!gTAltClDRBDMe^KWznV^kFj8KA-BYK$ zy9e{@j;2Vfec`AC9p8x8tr|`mUpyS;It6iy7MWhegwge)p;6{ev+U;Qw`K#nUsH6% zd7AHyV73MsN(=>9G-(n?K@SWDg?q)`9asZ&j1C3k!fgkHu-4BodL!L`s#tg#U^rI6 z0JS%zA-^=#q6nv?q&`co<0VVU)|JE=rF8|z&%pcVaTK8+rU@3jTk;3IMd))T69#)3 zoXG$`S9u+lxalGi9yw05DKYo@br`$(4aL>i2vs3!v7KT`it!`ZxF@M&g;{TXzPol_ zIUxRRYKUPUf|aF^1i2w6%iMJ=KAy&N=BoWehvPYOJVh653PVL$bBjw}kaEH+J;SxE zS1)~^2h(Gev{>6_J~PJ{13Pc< z5{?0pLyHC(18Af}mWDPHYRSkW<)F6+stBKAysF8grj6NiEuj5fGTLe=mV~5rWOBg0 za5zVpao^OgbbQz`CNZy@M}h>^+)Vv@74`Udv9jFJ=zRlj-lyMc|BLA(g)A!pq^3?ra_(4(n_g5FNW;^6G6zdSo~4{|d9 zQNf~YigGl14ObQ%8?rRgFfeRe@x0vOqgM~!hPlIkGLwe6`gE!=;^&?k!qNPFiJ>=5 zegdR9og+;v=Hdjxo~YCWCm=Zd*{RQBCq1{a6zjxIw`K>VG)9SDo!f8M!ysjM zy_7MRm553lmID{ZAxR|}M8fy5n#jgAX}oo;op38*i2XB_FAyq2vkyxPSZ;0f#i2Eu z#@;fWC{Z2i;INKPzh~YoWF0-DBXW4^;kfiQd!wFs)EfZC8c#jvNQEb1wb>jS# z{P2Uxc(XoJlZ8o;Qd5XfMd&YA1-hkGz%C-w!57~poO;L$7QeP1>mhsS5Z5#V-&J!s z=qGhRvdsqTitwg+3i8Yjc$CX+y6DC6a%_*8d*{rk1H5Occ;lo@EUzstm4U|M$0|rJ z8s3EDh)Wj4R7{6ebWJ-snIJ=?KTKHyLOV_sHK_cK9c-4-HYt^soThOl7&YvhdR!*^XVUloU~*!jNUn^jh?Po z;QxOk=-|YXZtNEz43&S;M$k8i6tP2-Mc<$pMq8y&jQA6ns!G*#(E^mF6WxK`Y>ayh z*_b=L7H0ad6ekIoLedo84(U}fDdvbXth_^xuUZu%3Zvv@h8BD}e?4Y~o=Z{631)mp z47qhHeiuMyRlF&>S9mi$=b~pPV$|@w4q$_AuT8YMLKGfDo%D!vK;x(SK~3V{5KVKAn3=$Yb=4KHJs=k zLbaWSfo10|qt{eTpVqAROu$j+W`D=Q33JWNQTr z-1E?EWfBs!WCf$uVrsOA&jN>Gdi_Tq>_moXhk`P{vbIR_Vqh_bYs99jpnYq-7rhiQ z9+_kMP8j0^8JwC7==&fXz={B#ex?wF=bF=bV7xS9_RWAGlOpf}Nv_Nihs7I>G2QJf z-HSDRs>)yj_^9ikVJT{PD~~}MTA$-(AY>LLcGixon?%#LFTMWc+$TZu9G>LA zNdE}0LgkUiKii2FD!r(b%@7`xpyikuNhh#5+qmL5S@e&ty=64oK)p3YXy-Bkk9IBJ zTIC(gXROR$VSUEQO=>*$mc^Kx)JH`POco7jsMA*6I%`}zzSP@9(ybHt?_{Pp?zK~W zmA!Y`I4>NZ!Yvm(zX*K_7aAlaSElyF(`;x{nBwzb)K|ZiCap!U?L`!25a{lSnFN^| zz+WH5xTI7FVN0-0Ax;bqG2bBMtLI(t($HF_LJDhTUd?0E9|}fd&Ev(Ylt9N1YPdYn z(f|f(p_|gJ@(jxpPRY7`MDTbUVm~?^FFdx-W(Y$`-caCv@Lz!}qC>)jv!Z zsPHc2FdF7OGi#y*>+@2>da(4F7UovhbdlGT=fU`E;T#xQCL2wobKOcy*=^obu*4tTQdvP{lYFls*!v(z5BbA_mWr!`pW14x`ud z+QTmxa~q&9q39uru>k73rD$#>P#BGdqm)ulCBaZKveMAsHhRH%73}7!DWcYu5 z+WcAQx9+b;S0y#t08n_}J2I)eQPZvY6}uON0AZPeu)rH=fj~y36o!_mYW%9Cq8OTi z`J#ac-pg3d1K&1VmUq``n{?O)ylc5t^w4+Bvx zq@<3O!{>sg0&X-r&r+4Xjyb_LX1%fCQb1Ihgvh|>f+xSNJD;Z~w?6#(Y8RlnED23z z&>P3#o0>_}37UwP=Q;n-x-FRJS(SuG-}fj5Fv9z!4-F`-tXNa?NGCw+DJ?@+8U*)?l~eYdO+% z&EYAml{r%U;jyYED210Jg}b`2s`HnYxD-a~*_nCJUd%Ua;7CzXmDl+~i0=>1TzvRt z({!8*A4iJn(xRHq7ejb1I9(<`zG~!L?8xZnNr5C)668`h{Id4?t{D%^!X2MM=&TP68#Tvu1??vJS|Z_t?o`!>iN^&8we;m0AH6t?HoFe6{(QmQJY8 zfODI^4toL;I%PkulH!Eh#OjhOu2mhz+jz;qXZJP$;(<0Iw(nl9wgO@N8m|ty_oo6t zJjj5UGWYE@WN{bielUJ{Oh&h>$FOE9#d(3lk(m0&}9qZk3AL+EOdACn_p$xC2(dMv_dHb$y5s6$@!lm6z?hv#B- zM^u#p`!lo`qm;u`xphi}#cDANpC7zTq03)7a|>n)#q=m?NQJbMptSw!;A-H^j|yRQ zYMLc;Rtze0kI4XZaXmUFv~Qm1DXLR>5xH0VWAiBJaJD7ktO=L;`L$uV z2AKx7a-S<>+cdCB?Tj2dvW(G}JKjEG_AP+@I*MIxw?Rq_m19JsVnf)3dOEEvOY?-( z4(vQ5bIA7#-TP}mqU%+OhCr<}-1s3&QOoje?{G3F`w`xEH1UMdm+$tSJgNvV-as(| z^#M{31tBXP>{q`O2No-GP+~Vv+;+7#+j+g{z%i&Qj<1@L1E_9PP!;;&0$!bH@CRBI z?=D%l7KGNKW5eSfdU)ueJJCOT6N7?qLl}@GrM~s;Q3qT}?j9MLWaM;_VtAl?QHc#( zlZpsS<22q_hJH9={y>oC?^GI+FIEkWZCboTD}h!ISl@h5l7lI<`B)PYXbi|SFzsf^ z*w_z+$K>B3JjF|O#*?VI~W&@&IR78>F7C~fz+IO<| zqVyIFihV~PyBOJXZ%sm>H3zZ=A-bxZ8B~F2HtVjwTb6tb7;aNA6qQv}R$F(K!^o_s zpZ-Ry=CEPYYOl&WS;FoP-7D}w$TF?%-Nx|~M4CR;M3%F3#X0n+U>)!@|IsQW_Uk9cppU=^fm$Wnq`Ct0|54(YQ5>9#+ObHZLQ=Zs~QfaL)d3$*?t7a~_hGyv=Z z-XK|9Bw!Vipvu+HltAHFnNz6=??0+OnXwu<{k>@y0lo(*J}6Woem5i~DUkwA&2q)Z z<i>q+&sW9qvLm-+baoIHOW@#)X@4R34^CB7`uYO7cRv zdk8L7T67?{v-w>Ay5Qxhh~*KA1uD9E=BnJ&(ngz=no7)SIqb{D+b#qwk0xW$8?Eg? z5nZ=Df5X{J-=2>ChQ~A{(7YE}9r%+ZvtRlpXd&gI^~Rq5rLu*pvu+Hps&=S-W6L{* zt~+k#Ts(yy*GVLo0-1_sW1NhaV}API@0yM|=1(Y?ioFfts2t5zH7SW4C58UW@gEy~ z#f~hRFs<26=Y06q7=N^k&7z6n1Hn-PpeYMO(FTqrNm-+2J)Sqo(BCipKom-Ys}5dX7pO_4)%?s#=r?$r(ECKnOgcP)ZAp=z~xt ztUA930Mh~K6lxzr9>>NF*~8W$$HwzX2n)f2Y!9SWYXIRL!MTg9J8bV_yo^hQ_o9X`(oBOGY71|Yl1Ms*Ca^&Z5VOfd1nNHR5*BUM8OK=1M_zZt z5{#|Cq~Z_wNsbd%YVqQrqy#~;GHlcmS@c@0>BC;TCN3BX=w4RPl>m3w5U8?K%5TU8 zl-`a(v!#(GX>Rz5u40~@krtf@hwtPm_gVAv%J*jM3BHKWG?cjJ~cQE(Hon z-e%E-94s8}rqeBa*7l~U`OF@l9)FxXPDaQhO_U@^h(E@shMcQtNm&Ipsr4e3@eK@|e z!n2-STLB2)Wf8U$PU|duJU`0=txHy+pXEIkAI*PLDFr%jzwormH}&~DQLDVK!xRlS zL3_{+KoXxv&dGLWonvJwVEQ))Q#DXWLH-n*D9BEs`DPVH#>>)MBR#zav-Cb-k?Bbo zQlCCyM2-v^4AJ!6pDMaf#$2Hf8AN#Gw!1OmPOP3178_GsbI^nX4P&MI))7^J@uMV+ z?QG3XLYU3T%3tU`W%MDx>elUJiZFzkLwRkL;b`1dERSUq)?8`6$G$yEfV(~jc_bvs z2qJaRdx`v8HW$GDg0NXzMDiC$y>OYR#n2cD>}g+AOF~wdM_wxzrO1Cq$bSmFz=ne_ zk#C}nwq3QQG3YbuC$GSLGamK#n1RP~SsM?aHDe=aD6Aq~OV%Ydnc}rW!ht!MALo(djtIg4HNc{?Q zr9u=kHwy7Uc#A8W5XEUzMZ%NvRAsw7=H!E-tKR7_uKHaArhGpPR{ej}H6_bWuaz-} zBjnQGE&KLJgaQyJP}oOGl@I9O2_}nQB6K|-KQsf6LsX%Z|4!Bqq_bi9_tYG7ni0|Q zaBz5>U3c!7`3Q{1C+c`KN<|-TrS$35Oiej)U7Ta|BHVJswNoDe z2|wja2<;4h$iUQ9(MvbG!@;C z&g3YNYXUWYtK?}RuaGQE)5Rscdz{oL($3JP@z0EC0(_sV_<{kTrN)*uPz?x*voTB+ zi*~yKXNr<%RH*Y97qXhc6t?)D=w;j!b(bH$@F~Fkg^D|ph(kdQWCzDw?HB-h*RVx- z4Ni$FD*u9Rq1?pf%rt8Izkk#;IRbKi$;yct&uZ0%>^+pjEKt{k3fbC2PI@uaDQ5tD z!qj~%yuLX7QjdDPej?^9f2HD&%S8&@6nZ6z?SSyqsmX1OU*ejRj@yD&Azy3K2xY#Q zCwYjDHP2fcd;8?s=&k)mLnoVeSeYXKWpV=I<-*Qf7zf8&`}&;Pb?B`fM$ttggzZ#q z?iq+gSTi_{MPRCWL`PW-O)+aA=dp%Wm}@;;lY@2>a%m!1q%jEV1+~=)gW~w3ez(dA zC`M=~kXke1>$l zBs)lVDC=M9oDBI?!Z-W-?Lt>Vec+!c^%9 z?{^1>b8h`brwv2SxiQRWvK=*)k&v&?anlwlq625A2Zv)FEdHn`sc0IjO4SD5fOgC` z&AVRa#kZTBX|61^g=)344|8Aavvv9yZRx#F{Cmy2Fh}D$O&ZwPX(%yM;l)=dr*7eu z!=9Yl0@9D~9O=zNu;S=B`|Gb$Z`g_ZYXXZNid5TKi|HGzrjsIiHaZ=~v(b6|NaOTNUMy*Rm6|_q-#T(+)8Yipg8uvk@1%QS+@`VP20hN9 z8_X~0T*_2Ss5Qw(ZhvV>=%8-hrt2iLS)rglfyHg2RyuocB`-HcH+A;U$_mbDx-do0 z&@44vto<%pg9CA=Xp~EBG^IO-Uh)yAO4?Gd``SFa77N62Lu6#ogrfwLzd5t1Da< z4O4C8cW`iGzJtb%UwRebnoV(qA-G=ZAL#^f!Ln5-O_ASVZ(gAzgHEufxsI!?--j6^b2V&GJtF`Qn+w{eTl>(oJ!S=Nao@TQ z`ETYa2;JT&w7@NsLQRmYV6g!0tEuH>bNRX-ydSf<=JQaQ<${|-65p%TsANWJ+XeY+ zvAf83I!x74#4ES|baeqPN0xDoy;OC^&g%fz0u@(mP_YE%wWNEoS@k`eH0t)UpUCsZ zB>t!D%pv8i#qKwaU4v_Jp(;t-Md}RYNH8hR$55oxRiBmXL$018sF+6!#O!({YJKo{ z1R@t6vkCJ>7cr=;1D;86?PavhGTQBBi>mkB3*y-FCC6G$tyLP1nY88nOP}h;S+=7+yCM7TQ;C?|9cH(9nhb5 zw3L+UU;PcAKHE83nPbatU46_rv}J$Lr1GR#8wN+R1aT!*1tyZNOnhy!n0lzm6GGQan0!W%AHM=AV z>nX@H3r&)A8~f1m7=zX{f3gZ0gVs>Ak~icAe=E{XV*rkFnH`di1rRx@WW&VJ~EmADtzb%oTP{&q%KI3CCx=ksHZ1P|nTd!#w=+>jkv zCc?LBUc~r{rTJ?yV!YuOGqP5TO;}%WtkB6vR?Wi<){Pw=5hY2W{pchp3_GQ9I*ey> zpL3^-8wt{EvPqgQ*g952(t$N^9FwpAwrVtv$!6V{DA6d(oCiW3tMGnzQGkbp$?c8V zW~wxn+Wola^@k6?7BuV@bxh)3QvRgeg_8@680o!GeFYK9+Lmw#O7+1yBJ_X6jH@jM zlMa2>VDr}&BP*Xbsy-xK@9Lw9h!-lB)Q3e-H%cFA-={lEaVd7;Z?l%CF2{ji1(j`| zS4>T|WNfUd&!4stvy!*c`3fguQhl=|1q-Ag*n8*$yWG|s@7|nB>C@u_wiE)2Z7Pb^ z07*-QG(DiRFd>kzGgsQd$%1;|_LG0O22gERP?fu@HG&w9;a-?qU1Mdsn>)6}&l@_3 z+RhuAcjl^F0PPNn78bs%pe^KW3HZta4K7kH8VM$#xQ)yz+V7o~-Yl+PIeldQHMwZ& zXCTo|Dv<;vEwQ*9+Q<(>Cp9QIvWRW4sc4;j-k4rJIxrG6XrayR8@&k#&QYVI{~<`ccsG*FjO~G%8FwdC}u?bG!jbFS2^sZQq?L!QO%FgREAjuoqcwKERS$%CxAu3$GZbnc@_l^P~D#J)&RPTEQ- z{gPtyG+5zv(T6G`#$LD}^TNp(J>5?wi55u`@)TKxsIcn9yr@VV7u`|}uDSOIXCp^P zx04U)*0)KDmn*p13Cq}wjAz@NJD}$%v~3PbLS_++uo;zuvv>CW_x$n5^Ybee6$v#0 zXF8;;K*~)i{D+hpw>z~~L|&qHO%8`=D(l_PM_vF(52i>HEog;#VbLkZseNZ}4mGQo zm9^jf;u;71{vq1$H%QTnMkt@}1Oz+}a%9Ytv(STlsDhxPIGC4c1h#_I-S*1+!%acB zLD@H6Jl?flD-M~`0B8?OMk^TMNe!~-3gfY@ztrdS4SfLd;S_O29;q;ORnzGqL><3UheuQzdWZBG9Z(Sy@dl#Evs(op#;)S1`;@jqx{Z7{%6JvXfDf)30vJ^beN|1Z2nYkzw_HAQnf8DGeju^HhM^JAjT# ziZ*(IZ!Qr>z7iXe^BA0u`{dPS$l&}N9dd|x0{IMf*^5Zgc$*pJ=K%AIi0FLtxNpxp zW!N~34gXe$jU3y+P=cIZ+Gt|(t$k=zr#EwMXP+EehrOGQSJA`+E#6>3Q4L`|Zr6z_ zIwFp2YA9>^=HuOmExrdZoS?^0E)B^CPhivwYd#vFq(Mr^+>rw9i^G)xs)lkiJ6z=s z+(Ftw%E>4QxV#5fZdk%FW zXh<)(cDAP)*W`l{E?VC`YZ0=XH;M9FUk9xD5+cMgmArB8pk z6>qbru{dL{YK*2x;Ph&c(T1ahu^AOTTJJzLK``>(Xy>WTt0Q>y<8MY|9l`H4#Ml?2 zF{T&|@?n&2cEQA@tBmpzWuQU$fWcqDj685U>-IC^Qm>caW3hf%T(`|>t?9DQ|>fSE!JKBM?1GK z+t{)n>kd!XB#1>YC$m+8i+L#47>>3m-bOLY$wnQ|V_San^kI9DZMnMuZdgw+%4%E; z%sX?C!nQ&-b!us2`@y`$Kivfw|4cCkz469yi%b!z8R>e5M;)ahCq$C;UAoo5e@jYB zMtDE-ZXjoze*8?lft*3*Lh3D7{{r+GQkNm_UATR?OTc8dag;fHkKe5S?-JyDJd;He z+VsMd8)au*q0FRScK3-Sx$RpKyuOZ=OE*nTbG@1f!kwl#%AmiZReiPAP^TX6VU z|1$Q1?a0r17R4KtfCU*ew;ze4pcjuf+UD{`6TYyfH<(wzY_V}Ya9EXU&-6?~R;9B$ zjITbck|Psg47MWw6y96BNWc4)3uj`a{~Qf{Bivo#P%-oYNY{|D&wAuoFx!6Yz7Z{$ zzgWvropvIQ?G_Br^LOXAYi6P6@2{#fc*cXTMeaCY>^p#{EQ_;+HAin6lGe_byRW=> zvTcgn4k-wd*vE_`u}Sw@R$%lJp9Tn`w}S1?x9G-4a& za7(xeYMLR*(3RVW>ayM&1ver~69Mpigd3N+N{PkVeR#Fd+f$5Dh%d61l#TgN9G<7r zFW%pE8%S`0CPBP9(NL*+D^svplG^UFk}6J4*7=m_usD9j*FVQ^5Gi{0Tl5=bs50Sd zXB-!~Xd6)H0b?o1`!uf>qUHJzSZ!HhJ?b=8HgCUk=C^)8>@Y*DJm^nW0+h^zf zh<9qIia8d6f-J17Ln>1Vl7N8QI4V^`&K&pxe1kAB;3sVF>fKtuLx>O4ur=tj?4Gbu ze{ynPm!9*N-L)WDCY22P&*z2X(8om1e6{EdNA7kchHj^p=lK{bvwD4pKE^DHGAuWu zlw%Ff0?qct5hQz*xp2lpG?4s2zcHx2p;aPEVm^5o&J@495BRc3Jrdv?MP|MTRz*0)G^nb^Tnkz{$0E_Vm(`m}_ydpafk!_D)*tuH9m< zJfwMDBOt#d1>{A6ShLh7b@i&}_{{^8PMnH<^Gj1e?Utet=LkpBge`mqIXK=i->3IY zK<`-J6mVC1LxB)fquHWrI)L8j@p$^m%lAuw-jzD~^cHvrP#Yt@@jUIgt(DVniT61t*HbPhxvAdP5~#>AA5PI--HWDAGOIB6jW^d`1USo7oP!I45>04;&~!e;sB80E ztEItMQ(#6XBs{aKql3Y6@$+N9>jhZc6ic8f0d9XZBz*CiZ@{W)ZTxUS@&Pvf|QKguLkKZwo33D{d7a|B)Yg%jHug!7ypAV%%w;95Lh{2wZty~yyeB0` ztLXgl7|TDH=NX?5Qr7FFtPDfEx=VOyoY}_6TTKIfl&6@a*iD14ehD9 zx9@rgq`E>Ul|VK^y7^Kz+J_EK53DJ*|J-*a$akeCU&0594yF!mR?K8q)hHfM5Xgtf z7p?DMBa9{Rntiq`uRiXdwXcrG`nano)CmCLdS57?20+Zi- zAVu{UubalecgOF>O7g2UY;|&oBo%BnjvEbjGPd`uho_80Y}Zh1Z7mJqV0&Cua8DUv z*+xUy?%-LwN3Z>oSi2sI?Ya~T@X5ZS>(I`)JMVs+{n5C!ct5^YK`D21Es-!ufW}eT zF0T+Jva{nNj(z7TmeH^ z!@k2}i3-oX>WI^<#md8v-j7+Ceihx&IH}YuszK(wDoOT@M7={y3>CVSvPq_9Qc|XH zg^zUtzVLiFI9Y7l`+l_*v)H6$iPiIpJ*Uz!tq5mDNx983^`e(*MpHlY)z>>RL8eA3 z6CvIyEzp&c*|^SgXkh?@Vc^a|i+TcvCLM_g4;*8{#m zawkQ3T0Q;j%ll9-U5xZ6t~g<=6MjFy{C-hX8k~?qK6<0HkA=M#4QDV2u6Uq$ zpo*YHatDBC%~b5v42fzCz3S(ESdxpq`QO zqd07}lqB@XQ-&t_NLmMzJXfT6xPy?o4sRU?gA7}R6 znt6SwGs-VnwGbqTvJ$A-!D<$rXtr=t_M!6ejwKzo`{9&aVB#y2<74n$SF##?3^Dy^ zArFmI2vjvKqy?E`3CoztC7B~mHVn6u=~+jhEORbKF5iTCa@zaEKW%`(P`4*&MMO;|O3lZG`M3W1uG{1AyD zNi$%MLn)L$6w30nIy0PE8QD$;K2&dT#M7pnZx-#eO_hk~YI5e##J1O8QaE?SDCf_o5B0BGV5kKh7s&HhZzvAcDhDl zsL&$qr2{LKUZAxZKI+TcHe+w3TPQjpyP*Zk^uLt!gB!Z6wfKOn9O~j=Gk7osYpBac zo+4fx=&ax^+c6Gwt0E0V;{ref5sQ#ao~nvcvb&VXKjm+QP!(*w44^!-?Udtj8*e}U zsGZ1de4C05208&zG^2;u+>s_c=e*8>*MzfnV`stJlab)PLcT>X?rL)|!Wu?(YH925 zca8q(zdEQ}w>u~n5*n*$1gi-GjWJp}WZtak08=HpYl(1KpXiA4Skl|}4I6_j>36Cl z8jS%9f!jL}ssksk*GhI{lFA@vDk31&di+6mv2$_8E)g%DE zSr-rj_yesKeT(uEaBiu%(60_9tMfL)eJhmQrj4jLj`Yt>}z3FCTv~5+@;&Com z=?^M1R8O)Wx~4xcFa9xl#&zQ{{_zmSL-GY6Yp@D>m7q}zwzuj@wABy8W2f7D+>=X? zo$ldeG$y_D%nxT#&B+^^eGB$&z_EEmMH8wHG_`nLB^AY*(o}V&o%du;q`qRq8#^#k z|EPurc%(~P!1ILGIeSWK*1EjA(>OIv&3xhAz{{83dETrAm@oa9P9}E(k51YA!VL{R z(*)RMt&*pOyh84_rpLMH%sV(t(M$7>Tblq}kLz$jshdn5FGEv0p{6mo=9ehp(RFaL zzMp$Bx&*VnpP*8ZJe&U?vc3=BnE4}SeLu;Q{1=(^?aVS(-{0IXuxt@X`II812lCQF zQqU8CCR4@z$={WbtVUY3X+B`~5Km+6CZFGFe3kvaC0>r?iTi%oi}`U+)6r^a9P05w zAl(N8=7JVt5~jYw9>nRX$^1PJQp)k=VEIpDe0&2HFyo@ccW~hRxdjZsU*> zR_z5;|Dvd3aV$UruazejPDEi5=;}Do=}05+R^=XqO_9D)t<^BECsFd))4CK|)`wsP z3sQ&LXEiypX#$ltn$I+xIQ>2t&FAQ7!mV9q`^ErI$W;03u6nh_HS|-&)Y9qm`j3K(qcxOrO zv*ZOG%67Jy2uSgLSf00iK&ot9DGnBdT6CwY_j`_4`wP10(v1I-*IfMHEL^8bgwC z;0|v#46oDlP!b*AOit$N@yGUEa4L-Nt8{#!fEZdPz@RqBj|ch4<1 z{fHLcYjmU`Us-C&_d>>B8Tjf*xe7grd@`dlTAt>vGI3NiG|r$JUvuhkmBO+oYbn+O{PH;82K|X|>JW8cc!X!nk!iFdFDqNN zYzUxvi=YXI{YoxxtR@VWp>Gg9a?onDPKPp~sxB|jaFmpIY~{<%q@^C3W*^ehe`_nq z@pdQ5VJ(KJ{^WTaUwQK8;plOEr!%Fnc`m3L(B|Ur(@y>t`9$9}lOj1cp;&IK2L^;L zQUe|#Tz18B=&_`nxLTD5Rzir*L@!Q+Cj0i1H8~)|dqjq)x533SSCCy%Yn^N)ih{R0 z53T4q0e9#76h(f5y7hTP;5X>Xa+R1@2LS@zv1Fs2`5)zI^jPVMIPW5Jtp8Skc+%?OGu|rh`SOaXxQajSbUDDg0NTkijW^S!dz0BZwo|7WEvN8Zw`}_e zM&v)75%IK0;EN;7gq^j+&4hN~3$y^;P8Ja!JKv_Kf?KeL^Aj9{W^b^us1khNje#a8 zLz2Dvopkr$Fmt@rxc7Us^gmUw#9gFakj&YWheYf;?=qg==1zFwJ;S?uqamHW*dVck6Go{Gp2uw>?NORh@i)|Qg2gS8Us!tzubk% zi-d+v*eO=Eb!;3hUMBL5y~gjsOytisY}N5_ByDiQTAb4n>Vs>pT7NxY`$EPR16Q=CXf7 zF$O}ejtrRSzT#B^{(jn#Bd`*1n1ZDccqM}s(P9V-A~i!tUSejkM^uSR)Y-na$xY)&a7%kmoJlb1Y$L~R&pYbY= z{!$z9aX#dOeVKp|X^hr`_ACOjV0<-}lk`mML-W&?&v))>q|h_4IIS#{-K_Rd8g>g0A% zn8Oer3(mdpg`A#SaFuK<}k!ZgR@IcJ^JZ2xJ#zWI9jFL7JpvQ8&kX7UT#&o zDmoIpDzo8RvnFGe*)#@05j0PryTcNI@EABU>11e;fxGUTG$RHGrc(q;;<^`eEoD#1 z0d?Ep$#CW^qlcjkGjuYL(u4z22Hr|IYe)WCTnRI&3~~eJPFe{$bRjSr>Y?t7mi-M7 z%wiGL4Nw<>X;4^r9rAejihgtG8sz1hO@F<*&Yha@qWjRn>8~5e_~YsZ`1LvD*L~p- z^cGVDPbsPcDJBq%O^WE)X7xB6y}HZ)X#4iFzib=f1;leZh*$`)@C-XRTrSR|ZrqMs zF7r5uLD!RVMu*GO-+;_7H6)rm4T(U|?`eWA2YxFmX3^Eat9JVQ{msL%+G##P8ji*D z!;!X%hFCZV^n}D;NXVE`I}+2uyue5p4QF2#Jhxye`YgYrXlg@&#(?CPxp_MMzLG^D zX>0F4S%X*H2#6LSqJXbeDNn8R#=%8E3zG@;M;cjMxC|g;7s3jqrW>gP>(VGq)*YdR z9*|}sk;bo9Y^AjE4U5&@Uf?{Y-jP#J-i%DWi)6gOVIF8~bD_%+a*VNh*o(cuH9KF8 z(UVwXiNidUD7so54r3(o^WxV=Ukm6K%jm$CQNt}AOjj{C0)_Er(&Qg)Etfv{?9wpc zT|)2%g9%7}C)wKAgr-UEAauE0joaQ8oO=kk&70i|uU=l=>M`q^SGfTHQi30g4xI&V z?@)!jn-lY~xO$3?Cy#6Gmd~$Rh+J#S^mt^tYcV+DO2o5V#gmESQy@iv ze!H{raBg6=7kj7Ue67&q`Pt^HU;eruaeP+l@pQ?2sc9*U75cBzpXOra>Gvug3>4=2 z{n)NKHwgW`NY@6=%$XN}iLPs2RnfBYss&h8^n;2E83gkZjg3;YIuVILLs#x{>Rj94 zt!G{xfwsXa6&0*)lDgFu*^9g$g}?pF4f8PHbTx}e8K%H>5_gPj%r~V660@Spcl`7% zB3h#&stf=PXBVv{p2xEA55oy}(OMNz*Q_8O8*jyo#2#eh{ZYjdBMTdA8%&7Zl;aS+ zXLA1$-Nnafty`2`iSA4Xr$g$j&4bqlL4tL%1U|w?rFbsLWg@M*7#ppR4C5^>wB~|^ z^?-f7j2&uTkw97o4+b<2v693~QU>LuOydYc+ZsDlOI8>Af5oV@3dI&o4gKBi>)$3NDA=twAF#4aXD<{ zQ!Z@YiEQNC3=)w0ep<*4&VbI=)M|>Grm4%$&)obf$hTdSv*l#)mOIuQ9>V%t(wyf!=6{rf+^DV5*6Ua7_!y-7 zNtSL1lK$xIk+f&4J^4^Sb>S(@VNt0+Ja6|MFb2EH7=%hgjbT@1G|=i&NFsoE0`fQ` z!1*GdE9hR=p#}m3;2j{JLn~RQb&_6VEi(H~MV`+qG&`~heJFcmsnBXK&abScoFfPn zX@^k|d=1DY?OSO)pWvgDui5MZJbM{D75Qa6JS6$q3Xrfp?x4va+RDGW-yPri0M9-d zk8B#tmz=|6os(oX~W4yj>+#|D)@p?atS;8p0Y<_&t{VXH5ZHI+`6S^OmOkK4?&$FY+q{^|A| zXeS>mkC-o*0HL|$WeQiRKG99y4{4ofHtug)oXmIyeV&_sz$n@wDa%JMibM%mq=XA= zOioXsXZqc-@@7DHD1$Br&Dr@g02y?hSmGcmkJDlF9~Eyqd(H@u=P+3wWYGsh1PJZD zz#T7la3RNem3%(J>KE!Pt{kiIF;>^r)e#~P|jfG;%&`me4c;)QO9_*@@&F{)kVduzqW}}hhaY8;qr(yx?87WV=?H+LQdK`e5RsdAnaz+Yyys1 z?e}Go@o_FBK(tCqx;6BBLd1z!JlujmN|ZOU=Ht_H0UO*k$Rl73#wN!>h)(&*6L6H5 zhOl)*EZ~#B2j0>a@7;dK{}FK_Z`0KtX)}>VVShH8@Z- z5(n}?A#%RqJ_NPVEL9HjRNJCuxP|1 zJpa7f+$H@kT#B{1zg5v%dsuKml;YV0%_H&#m`=7ZHV3Dd+v?4Ge!yOC$9D)D3?eN^ zw=p`K!>PS^Ci%o9r!%! z>ax-EpgP(ayLJ2xUv0~W`8-J-RU|l*op^NtX$W@{n=2LZy}-%goAk~>lQ4(xcN(S^ z(9xhZqJg1Gj~C*x!P`Y@@$?L4hd97;32jOC6)C2NJG-4839rI(F42x>uxrhU$TKL4jDU`?K)&Z*k71Dben z+h$;+Jb8}Nu+3Pm5vSD^M0n-$vf`ev7`X_u;!dSf767?qBIIr3G_-+9qX)N*-V+{6 zYkc~a70A+h8bwutE%c=S+dIlsMTwrJj%<1X)>d=RUrpbCFU<4r>4=twS|zBU#0iCB z1jvPf8;08(A*WfY>C&=WU$aCYiwT#%E}IO}>Fwi3&B`#wCZY>=?Y{%o${(m?&s9ZDj zgZUni=T9liL(g}@kw{!I$`IiBiOx>jEE=a8g4FcIPY*w`?+Dmcr&GK&ffgtww0%<@ zaK^WtcYIF2ju&1zYy|e}=uXGAHspu)ao{zRH8EWGMRhQ2XL=PBR>0zWRlOo=Yh~iP z=eIrxGX2>~rp5q-*V<^lL<&)3rz<1*e1R~x;e5#g$BgM#5Is40J0WlH#+|qm&Y;rO z4Fcz&{X4-*rFZoe6jMTTY_zX=cc#mF{bLEVy{2dCTU zmwz~8>0_V?dZ=>>R(o!!DJVgJVW6hk++-WKlb5W&!Iv1fKAM*GS*ilXkVp)?12*3E zot#{l_1hLM9Ro6+MP-yD4=y+$;p!BDPy`KD;z3O)5p~lJ>RNRw8?M61FS3521%a5X`!BW3P|I2FP#A6a<=KXcI_@7^^Z`fY}lALEMNpTs0jtR@C+b)N^%iKC<`J1M7h+DH9mWyA#wr?@A zT%2!;uP&G1YxQ~pp}1rM5-&D(-X%Dd`d>c$-neT4>EHB7-QL(B7yheQf(FAR(1{he z`QDfhqS*OBj}$}t37J?&J)h9CZet|L!O2KF_V+g}z>Kt>dc2-UREk8yK3833Wu^RQ zK_C|KLWw7Uhh z!1Cm@p+^bS4j^`VjT~9V`j2z2KVnWBAj-5tqz|^T@OYN2iXC5M&0!nYjguZznl-!q zs)N660ZFnnNsvzjngEM<$hB)u60?-~rWV&k9H038mt8XHazLN0p_h}1DoRD*;~8cr zQYTF>(8hVfc~_2U1f)4K(zpc9d+{Mo8ePlgE5cgSX3CLcnt|#S^SfG&Dt_cTuck1RBDq92^dZ z1+Trg9yuH?p{Sye&PoEJ*gzuYs*WSwh+;6~Fk!!0NHCR>-e+g7H?Ma4lm9q(VD0v$ zD$W?msD()GP`Dn!zm=tyntP2LPDz^6#v6;;q=>Ot?k}G(yEjPCSC*g^t|_vGERQPY zGZqewVEL7OdzF{Fzq;k2?=W}Y#o!=6jLJj70xHBDgz&oSMXw9YXvC&0+=%S8xfF%2 zkqNMeSV9ohS-ec$haZZM!A#ve1wr-TXgt%|=wh@Ms4O=qEVrFwL1|Q&u~@qO`T2+> zpFxt7m5c=2BwJjF#Ak&Tx-dveFaCBrGAtJ`NW=z2cxE^#?q2cZFho&kj-s8x5Jkbu z4*JXOU#-LJpdtkY-Y{T~R>&brB-kLvJhN@lRRg)mrpCD_Djsv{PxIcJ<^@#63@Y5X zm*W-35vXK^$RJY1-NCf#*4FePrx*^c?n6P+++T^fd9iu&XL?!H0l5kp^F4 zr0z%}6=Be@23805s=n57oaYIhm$+jADqfrw^*1|O7M8f$uJmf-)2dXT#3XD;d? zHw0ae2Maf-ur}Z^B))#p2eXhNu}rs4s-z|y3AxbGxP03&&xQ3W$7|4U=n=!vYv7h~ zDPxicw9WC-(9hRziC$!xGy0AH=1jnQM7fMKzf7q=L4Q1{N@MBw@kk<;m96v2vF9fK zwf`DCEh`jM-jGj19*p8#EIy+F3|+@On`f2RPw?QIZ=8#LJSr7bn*YDhO-Qj?q6t0=A-AJ#sp1yfz}1C zokc9HGkJ{eC#;^l1sUCI4R}hR$QYQ^Q-&j|DS7tLnlskSM0=>tfQC$za*4EcH*xL= ze>^c~9^Mh^4JdRMNedXFW8vViB5k;F#_mc$F~ESr+7Q>QM)R#Mj?c&(^2f4Uw$=f@ z%QbvZx~%h;$o7~uTni#dVU$_)@X&0>Gah|o@=!o|g^aR*Bo~B%3%)VN*sxe~hxSV6 z1l&aB;GH%-SFQXBPn#=cISN}M@iv7Z%D@X{u`tDT22K26bl9vp4O_70|0*LEwSZg% zl<4^I^jPkn4x5O2>}m!RQ{pXf42q)Z!_o5BesJvmQb2PJgNDS*D;gV-H^;2d$zDrA zy-G22H}>?)e?lH2PckyhZ0jOi4i5j>%5&#ULH@IA6qXIykbO333o|cW?6CpOyAVtcs z*NE|*wqGcGO2x5b@(=V?GE|zKxx*b=IC>mbmC%^lS z+33p(^Uy$8JQTv5Qhz6+g8T?W&%F54r_IE?n}~)=@(I8H-c>p zQh{Q}nDkt-eLarJ-;GF^rqp(i2`^)E!~8o|Vx;qC7Kz4%!KERx**nLHJS1+sWL`f& zb&HIuQi?X>9*1~mezW8ol-EYsKRbIhJDhZrYku_HL&yF&5Rl!fAPYl%5JdHeRhX`o zXkVOyXC*%S*jF3TO1w=*4lE~d4NlWZAiNhiXUe0W`gh>zdOL$l6(NAJ-g>(sT&*+1_+ zQ$7w)`+F4>iG~(JYp8_v1p?`!JBjBFee~0R&c@w*Uosldke%Z1;oKUAzqV!t+RFDQ zV@Ne@ExdDh*@P#p-uFFb6F!iP!rEJ)-SF(xE}R^vo9=Rr$4KgfDn4jw(E^7;63@Kt zmNUmPTR8u@J!qLd#KY2Q_blEiIsAra=in*%u#BXp89UfjdmG`NBYDw8j8O-W(lJ1r zFZ--$YIZPZ!Mi`j7UA9E5d~Kiihse37D}-a-QT?1*ELsOLT+D=$~ef5N_9b-4v;PT zZOqBXtik>En1;+Qcatza-aY8pM+dA%oBwecAH-&W%DP61w&Y`|fS(5STQXVH;ERe@$-|L3}QS3eHeo|Lh9fEqan?2(u_Cs@7@Ni5+A zCjWv;W9s&G>5(M$1xUj&sKRvmu%NOL-a{Ol>YW#wH>2??4#;{Kh8It%A!) z(2f!oMa7HUT)yw(i5MS$T0xb7dT&oGBKeTa0g_C)&5$foY=kj!Ea0<0-aZC%7N3zZ zHAW@Lby>peC!H0bw9g-CRoI)`86e?(!^=G?d+7d|cw+v8K~o1MD^M5LsaTwxZncj( zUDH1WEYHeVAYj7q;wyC?X=QQs=mG5dz!6zoT0xq3kWLlQ2E~4MgM6PRrGSX%SwpRCzI{^pdAGPQpF(FGMpCx)sEl z+wrA9FMv{WLr)ZwgVOSo~DG)*AG)(@tzM8`>`%4Akx zb+7)D&jnO3o^oinzThZ}17%%BRUX-~&XT-tVQ@2(O*`Z zDKNkM#idX0LtXt6j>jM7IbUBLe63#q){_ubiI1jICl0vy$B;kTyPJxC@-Ju1FD5-y-o&D5#zNNnvj9iAk zrPmDT!VnD5vp}Q{O>{T$x{Kbi?WuVZDC&fbA_7o7~XI*QKkC;|t0^ z?s0N=e%pwx%hwyvKYv2TU5n8_{|<{U>>Xr1qnUP|F&zKz$ee%dLGAIb4i)APcj(<5@bt@wkP=9zkG6lJyjj6dx6GoXsT~iv$5&f?lcR!%~n4oNtydjy}AVua2nL?Y; zZYS~n)ae|Z&_;mEwry&Pipu8XFz%hZaQ&)jAlrW!+4LJm<@o}yhuj4ixV~{BV1X6q zMx)TQ2>Uc@kKivtADHQJxv5V?qXknx#Csc&UwsFDEgI~)Q3CrM=AKM~%oAlndm?P1 zIGyy^&}P5o^V5Eu0weT^{Uemx05R|SxyQ%B;riUxHhRi^Fg~AlV0;vgIKo{+db8tn zQ{p&6%-VHx&+Fgx<)z0hx))^ouidhxwXB8reJ^@wYOA{F?6RHvL9)+?WFcrm1&Qt^ zsXDZwXuCIO?8I9VTd(2C`kIiTX}lLk4o@jPN}_2S*IKEGhclMrX< zi!$6wPxJq+O}T8tsfK8@u`C(WXT`y=Hor8CCBLNPe`6|-CA9<{*+%_&=;|}}+y(3N zD`iZpC2tfIs7&D9h?P3T^ihf4t+#q6v2%1C{IWA$4m|E_fIP`N3(Z5_yX+@*7W z`ok(@Ao&{Q3Oe(#OD!q>HX~>$F})xN>s21l#o$Qaoyc?X4Z-90y2_v#F&-qOVKg42 z)*}l_)IR%JEt%K$*0GbOjXDnY)-Zxk^0rEOfu<%Y7DtK$Cp*G(3qtHvl}CXvJ^$^eYHG89;IHXU-V=hmJkL?O)I{CsY(UEENReZK;?cz8f8zm!y z8Xr_cI`T;NdheGS5>1{4pmFniniAfqA9`fLh^kGf94-fHFX$o&F&`LwxKyJ9z`i)B zBhz@7UG(a|b|pZD(NqR+v=T^{<)$P$QRIs~PY9xOSxKQGm?oGTTY;GiAv_amlT1b@ z{C)7eg)Wd{43#2=%}Lw3L@)6C@CS#+EJQ#2*d#oa(Lig5KnaghHm5I2`7`gY-3lku zI0e-pU=!r9ViNCT2_(v3E*Z%n@@9nECS(W@h95qEkfZ`s69fb~!x# zZPUitoXYR_R=huJ8?2%6bPd72|KB1)x=R;0oonUfKbdJ3ACsy^Nn!9L#(Hgj0@}>B zxTUza=$E*Ngf$WGPI1q+>WO%#m_S#N6wPh*27)AiwbMCAjJ}0gf1B{b1Au2D!GmT~ zZh5)KT~_H*NI9#a*8ptynRcoefoxWI`2iEU1F^4JhH!=Glh+k`WuwHk_nN zmlp=IMxJcC7wnMCzPpwqi-wl9yVkZZP8)FpNH$rO%&e+8w^J!$MD1J$C#IBr&4d*g zQ<|d6QcweVyfNN1>0dd(<|&&d!f5mKyRCPQz8z$ns>)XA=E9O_f?AJ%N zflSj>nMx{(HU1OT*<%A0k@+SP*AKmnyXdFc>o@-cB$=*C!gE@sLeANls!)87(ULc9 z9p;^U_OORQ(iy6x{ma2k2hJJZYD|93jx}j&oQcmQCw6;bpIhg&fP6Dm`KWVDjo74> z!fYRUUXJ>N{0~NBj`}Qf^jI`X=@2Z!yuxcmy;N#z<;lGJM!W)OW@~7|$U+wI0UH@C z8Pe~PV;+>5zRQmFW3CE>Wmc25HJOk7cVOjPAoCnm=5kW&mzd7oWw8NEf4OvqvPId9MGcxWUgq$)(>7vV;}RANx%mB^Ou9U6a+my_h+dTjDTXI-;}X;B*Pyzo%`}6@Y4) zhN=o$-SQe|z-GqCBQ7fsqzmHB0UxW;5Q`=;!bmfWH_{!ed(5l?q|5b4A+|{_Zn&C~ z5R&m@5!z{gaw=D!{CoYzYCyO`k5I?Wkp@KJRj3|Q%qooc+^`zspDPuNgGerOS=cv7 zUpz@}ANJ`98pdLfyf)#s{n+*OdlgAF1TZB(!NTiZZw*O!bW|c^2GjI`-|ut)rXN&H zIC8(F= zvrt^?(+eJ>Z$G-nJsB*)fMY{_~ILCl@F0(4Y=2HbYtCb!yJ6pkWynCcjmRAd zbWO${FCup7?@k(p5wYzQNrw{%MRf=7w!g-`e?Oj_J7hHB81|rt29B|KDR^nUNRCI> zgQuTuw|!oxn*B9rFGI%Port8RIxa<$7#{7uTXW9C!58;gj-JU~1cSFJ6o@DM66Zdf zQCXPlHcx;Rof-8a$=FwGkH2CPV);pjg>$P#EEdVQqF5Z9EYr~|9^T^zEW34BjH%J) z`NX8mQ&;)|3B{(WP82h5$DecmL91}b@6lsUvT)j&NO3ERUdfo59KU78c0{t*3Q2i8 z(%jA`m9`^4-z$y6#!E$&C2A2S0_j7y*R}VKz2!|B*qHQ0(o6$H4MS#<3`}OmDS;rmc3s!5 zYj3NouDzjaTNR{86QrXQL5lPuAX2|`?tAyW`{v#EW^Qs5+;83Q_xmKt5dQbvbI(2Z zl>gyGK-OPp2+U;cFV2IQySKM`G-FG9|H`{4=Si%Occ z&-dnGft|I0?|?*nm7btK=97d zk-nR3q19^loAK{ouvhzFdz@V;N2?y*wS4LV)Wbhn@WF%D7ivNe)8Ej3gCoAzGSU4Pb)YE>~>b9Si7V7NsF({P*= zTg0J*UoHMn9ZNUR97yxjc#|t;HeR?4IXMp%M=33)p(xgUetKNa>IT4dn1%}m(RHQ+ zDQ?FVYv0ttlaE~04=^8|66SUvb#bg|R{4H;#{tvv937E}Ri*>k4y0D89y#&BWjIm( zNC%`{Crh4p@xX^vfM{ej6B~b{rGtk(f2u)kFnj#CyGts)Wt3NvUmg5#T}Q3O^)j*u7UK4z{Jj; z8FtKk| zj@In`h=#+Lp&p);h)<5|C@e$XJHhqS+G+SsI5`2MOxIETOmlSdx#1I0Cr{CE7L_JA zjf5tNl)kD2pxTd>)PsD&^3;>(%(?!<7G)Qn>r*wH#n?uj02RY`;NPNio34i-okOI; z*m#^H#eJ*3N6wMcRBVw!s{5T63b$1Zh=xd@TMv$^c{-r~k;#JCojwT|iCy-mmzU%M zs?*J=prN1)MpnUS2_Z1+*mL$f=lu@S=lxzJ`@(dg0|jzNMzwH9Hy+bGLo z0&N@ACL--89u%FN4ZdglNEWsxO1kw8a^1R9wuWF8=NPN_&En@VT=sh?cN8*Qo@NRgAQwhBDnVoV_N=)-gX|WhpT`rnh@Bt37!CY0trG&riPE_L288 ztLor#g-^VTGf}eg>Wn2@V7(U@>!k#fbZ;5er?%?<*D(?GFO&>xR(1F%hiw}Qa=cKN zBO&V~jcrkPZU~dYo=ChQq!&x2Q1DBx0H_LPS@w_**7gz*T?x;lobqViQuHVPttT$(CHNho*V>|;sA!U z;&N${Q#dm|PTw=Wejs2}bc{8=7MP9#wI(Xc6t-N!TR&mTp$@88p4Cg&%YF>2H@xk( z83DLAT{?1Kl+@1TL?J$p!&4X|AY=L(a~*;$=~xSmaT#~)S7EV87gOU3pI6Sy=A$=r zSK-ShUEe#{uQCt3CQJtwds|Vnh|eJNwDS6ty`wMt68n@hG)yh=02c35gvmi5RXd0U zzEvQ0gJ&TBT&9X@h>{g`n~VJl>wBdsP)}5-6vOntoIbX2 zgl!rR&+&a;9*=mkbUg6{JVhFwqAtNxdg$VXh$maa!>MZ3@RW54o=5vWHx}`9*YPCo zSFwhtxJ&RHe&NHL5Kj*c52w;r!&5FF4|O@1H~RtmygeT4#4pzHbWapdo(3l`8606d z#6ffYC!efDG?!2`iOO7{p(&7#h7((P>CSCGU~J`54UKjKt06jKbkuGtFhSr?$-7;7 zb=t!UPgsOlE=viEJRgOJrM%&}FA>Y-4p_=H+YExSHGrZTqmQ0p^!LRZ&R&uYSbCbV z5HCsF7o>-f+Z)JykKS&Ok)vp(xfI;ej)rpMEXi$l>5{o^D{{ zHOkvPnpkIcZ*c$TW?*+`E=6k|7p6^bLRE4MUJBo&Jbr<5AKE?}JNxq}7N)@zU2j6< zD)o(`m#Q-oX^rePA_Gw5vnbTo(v(1m>X7cpGZ+r29kk937z#8Dc~CArs4(J#lK5al zn_GyoMi>w0R`~dglfS`Rp^)N%!svL+R||bJ(XK}`aru7R5KWPe2HKcB!B|eDsk6~= zPSACqeoE%H7AK%lQ%mijUJ^b_ygG`1UYWiM>nKVzR7DZLm%&1&gfw9N7V0# z2$H*Xt|g+ED}&^nap(SuJ5^4R#3PNK2A`6zL9r^fJ(-v2PVr`*&i$<460Do7NW@bL zw419wC6 zvIOf)Yq+RHHrVl)2xH~l1M9y%W`i5B)@oR5d_!XK$nLW)FW<9lBc6-8L_E^OCTatD zal%Ir9l9CgguN{&NyA(_6i)`KNu%SV5LKTIatOVmXRg2wsjCw46?tM<@}OS$)?2n~?~7aS+qD4CMZZLpBIm-dEU&hpbUqiXEFD1#+dLl1%d*d0h$yc~M49BAuqfqPX5QVKF}-9vo||jUD1S3| zZ{gfn-CG;)JreKU{#;ZdhehrV^Jasd_iBXnn|UbKX6TFeM)UnGDH$Ed zgCcsGdAHmZC7&(A`(%I_U!^aSi_sZdkoNACFe=V{GH>M_-{HAvu%LpPyO{1w z*j?-lw>>;z>%#M>ek$90svGcmHGI88kwHa~P(0ifFKbRDYwMZ!kHpxKkHG^BI4z)N zo&B1nt)R?nw%gy&o0$)28WYfenFxMNKeQ^X(hwKMo2s^JP} z{!q!4=g+te@HA_9>iym!$fXa2UlFWZ@fE;aj}|18C@U!?GqAAI0Vo<81|^g{V6{sL zhO+hYz%uxwQFu_s7N|*!y1R5bJj2Vn_?4VhTVYLpvZjU@L{b2gC*p@Frdv(!V_dGT z3KJ+U92lr_|Ehc_PLv^p`-Bv*lfPz+BZV&^x(8CK@-@;r5cpn2*aJaj{9X_Es?6v0 zdkQ0-79W;T#DVgH#0T@#=%6PO@wB-svvT@CoqSEtZuL0O2La=hUN5=r_z>Y#3|xW!n#M!HxMgs`;(d6Dg=i`zm@hUyQi zr!ByG`awF@gk+0~7etRrs-<3RAqk%?PNnd}$Ic^_!U2k?y4l~TvZ(jX!FlCL=5eD~ zu?Pt1QIH89X2;g}A}x7nGC-M~QjfwCRb14Z8|UcW3$B~f2oi14@yEPy(P?SolnS-T zBH7YBsMAv9Ws()n9L|^a+&s?*sDmnMIC8<j$Dx#KL7%QFQ^+t$U(i|RB8bPM7L(A@&+x(@E zAJ}mj;JHr2Q;C(9wvLy~oCdEKWd7-IF2;O#L_-q_BL`GX2ucBUq4dqEEXd85xJw+X zcjC|sSEJrUDUL{6ZamuC?}gd#;!dfs-f(K|UfecrI@a373`8WsT7@;9;*f+-mtL^W z=uYvUBg-!VOmP)cq{*jbC6wOaUKPRJTI4WRTnd({xo3ZkSXy-~>8^yLB*cQXbxtGB zg|YC?_@(zAL#o*Z8(7><7AMW#bc^HR8Mj+>xc>K6|dWO=(P__?E`p+S@6P1BmTVNuJ2`WR=mCe@uvC#aeu&D-xSC8 z1c}vNybjEsJ%5^rw(|xZXSEM&K>X2xA%8GNzF?}%v7uI~jo`7uJoVtXACML1Mimnb zSku~i8v}8_*EpV9@pLVE*4X?6b>i~gCTX;M(eO?$_~EKG$e{EW9alw8FY?67@p{7G zA-h8!rdt#Xs(}}>h`hgKLla4P5MKP$KA-qg`;R&AzUc7DnsEpAV zZ@XDXSLgQ)c6Z^PrgLUZ-cc7tv-heM?h@mU~ zZ8n$!uf*CCEo|Z3PA_Wv)6=czZtdbfF3o~Hx|QxxRA-v?>h(@&O7%EU7mMb%vMtiA zUpi-^;`#0~w)ccxxQ*Ebl_m_ravJgP@7uwi65H(%wx{XoR*z`Jhu6=!1oq>0V?PXj zWFTSweJ?s`FEZ#e!te~noV9s=KJ3LEiF@(;0YSfvy~0x36wzCQ_tHG>(CAEzCf!N) z#2?(HU=ZyKK6-B;H0e)kN_bl#)k*}Z*bFPwkg6hw0`MU$w^UD{Vx`CfD#_D|iX zq0wRkP|^ZV!!GVC`#k-|uMx}rDPif{zOwm6^S(kX4>(}ys=l&oZyNG5_LV(o#?s|| zWn=2knTK)ohd4O8vahV)_?)TN0*;3{IDUJ5Wyh5J#$XKj5sKC^Xe%$a#_KEF-Y{e_ z_LcpeV%aTyWls#Bw;lV+9%WH(C6ah!lBBu3y;EGYz{x=T7bUi;1rR^3Aub3u1VT}KLHZ*w{!T2Yi>YdTraH-8 zmq|p=i9|ee_ZvS20sRw+=xealqe;h4Y-+MYYzh9#oUFu~2>+PUd(~Bd{z(menP*4| z)ZSoaN?)9?p1e8$0{!L4#8B*#m<6Fq!er0>y2rW|Sbh1FffR;^vq-DM9wb{Qec}cx ziM!8X!RvqS(DBHE_p~jlWLr*=8hVR077oG`juh}Jz@9s)fpo(?qv7t#=~2Ag=sv5j znTL1Dvnrk_9{)N|AnwC5Fn^E?Wp7a{m8x^fNfd zevy|q2;G0v3d|e)!v;T_PlNM?!~|fXa*O5habLC$F~g!gULRrX0=@Wsr2Ot3DW3`Cz(s_*3}aQYW|L)cB88*w z+VD+yuRZp7QPrD@@b6j!gun41W>0}gwYDS*)bU>R5aHK3FsJReIu4l7ebRxtpg1OT zUkCZUCgQP}?7s1B_5#4a=?S)}i9Y&^+Q+}vL!SQjpn-12Gb{P)j)_-*HU6inza)ig zmz^iv+vF3j^bB{g1HHBAJ(t0$!7d%#Z}v#A$S)CO#0op+Lw>ipyVvHD>(AD?6V(VM z)9Tx8XuWmfU7)Kk>l&f87U1Mit>ZwoG`#KtGWyYcr17~y>iF3%15(U`-(?T9v^#`1 z5hU;CE0^FzkXQ6|)rP%TcaYke3~VQ&_QgMp+0p2@Q8tYpTE#skT=z3xYcJ-Wj=}h}RckKg+I9 zBB!O2M$0&j_050hy-heZ>J4>$tvvRk2GyVJn!gu5>s|vn|~fw_r$k|=UolY?#@5g?U_9p@w}(w*}eJa1D-#0 zKH_;_!?U~d&vPeUJR38di4WkjIxABk8vylA)Y z`erBU_(#dHs5iYm9ATTykc-YL80R>@RH;$tf_a1YpLNks*dy`@ zMd{=;rIp*ag9*!wmt81)^6I&6K=Y}F20He1hrgD|%o3l!7NWBbEj^-s1MlALlY96q z)Tz(x@TfW3RNx59hZix~@cz9!F=Fx`4NqP|ExDPJ6_1@(C=QOT{niOfilawQANl2M z)T7T+LMBs>cyd~@W#%fB(-+Cn7y?3ZN$pGJO_1>HKganMcqO-FH=gxY+uYX4g;QC6(6%MqeHb+6??ZxYxdiax5reWXI zsML``p+XKGAlt{L=uYzbi>lZY zXcPk_x_>-w0N<2vmLWI5G%ltRpf>AzIrX13_h*#TbS|dS5KzSlffAMzr&@K$F`trZ z)frq&)y<(uXGq2F^LYw0zJ8Jje4X z2CJf?$Lo+-72O4elevDm?D6H8xn4j}gjDuN)X%QK>wg3gfd_5L8>KZ400?E1=Qlc1t($^`djr6h-aZKo?PVr>J&Um8U!FydWyz?zc+&XulntvgEQnPbyh0JpWf?V729y$(vMb*9C$gZ>{5a!s$oio zwX$vf5jW1g5zsAG(FLJ7#uF$5wp0j7(;-kP1$WgvpXnORaJkE%!U+R|DtiHrk+yxt ziLQn>ad2qkTO+VDbcwo}NDJ9`ZG5yLQ>at2g&}-Sc>GC2|5ZB^`IDCNa5$&@Agkpt z3|br=-E!vkDgAKBF0A@n)*f^Y;AHIJpRdYTi97fc#a8TTX+gGTqn-|m>2eFwB<>)O zBlC;BwtR)Xy~~s0um>V656(?_%*YGp;7z$A2@Z)UC_xOPG0)z2>?+)qmB~=p!w}Y7 z-itf0bkt~kaj&8{AV`*&1Qnu67DvUg@cnz8u>fC^t0}5dr9+^E^@fx4`e1gywdsIq zje)7YQ_m0wL${j;ZAJ`h`54OJ9GA&F$Gm9BrM0JQ$GusnV{mot-f+%z*=O6A;F(@; zV5+_@!fsD8(THkDch2ryx@+h{%-L@^c3;S*K)@L*T;0^%q8se$ol&lRAFE_@_Xvey z$Y^W*;7}ys&45WA-V42fz#dZ0Q1HNaCg48(Ol6`n=BeH|N$s)MH@Xy1{~_^}#_KTu z_mSss#SZh0wwRJ#WMphtq)X}MUkIac?v{~R?6t?pKWWoQGo3R<4ixiCXT znnV=+X<(dy15Z71`MZE(8=?peh(VV+jM#vwU*0@OXh%F`zHAg|YO%>T$2%|{g(qxI zBYuJvR{^c?*PFs?O@E(}tf^_x_ERaf90{KqR~p?2Ljq3?I%md5Ac5`T5&+@EfJ$}u z3qsfy>S1I<4tKx%`G&VZ4m(8TPz7UFn7!RSY9PLPnp7}W|MoN2PQ!DsQ)uuY>z@26wZ+YQK8LEKg99`R~4UjO3Wd6;S2-w{La3`ABN z^)&ek1D+;)SK2!1qPxZO`WC!(`bhNp4sbvvS7&rn&se)*Py5GXrSE~sP>6^}{A6+7 zFi$q`OSnM)V2`Ym^qAM}`eSR$_t@?F$5hdDs=O3Vz20S)tyzTidIu4N5D#%<)nql~ zm_VaRwxJd>?Dd4UtwXhw4&edObHQ83TjM_8f$KO}Uq_wa>kH+<^a&ViE_ET&&bOjp zQid1xhMlqm*h(slSk{hG z(Le;%=OvM5m>gq6&}R(vv7_n(c^b2Y;S0OZu|YZ2jF769-}$C~1AJ5bZOgWI07NZ$ zW)JI`f9TFbbJetu)HM8`)I>yR;Fy9TC{;mkcBS8ogGs*nCA zf3QB(=!Ph5EX1^7k$TG7qKXK9z@RszQ_V@=I)?YiWa~-@3Dl{h?#Q3?dJZH!gfZi_ zGy;krQ)ivky0amSKxUgckZuaEn8)-raR0+MA=B5f;wvUJjxzBnoGEnk4+(6!2k;$d z;PV8^u~$-+z9*0u0QD!|3Hl(p#VE@0WNq=7 zI*z_5ud=#xx{D)LHs3P3`jG9$0)>DCJ5XNI3Jz6WrHo=g$JCG`7HL1WHjO3EsH2GcWW zDATx$JokJ)D;IX+6!T7`c>dtPb>#?5)A{b=e>1NxOy%3fnDS4@>aF=#SXLa=NxJ zs!Iz+L6)l)d-u?@F+QP{f;e4rQZTk{zHA3#>}JK7aQSu(MxJ;0)G6<7MDOqn4I|6} zvG-QY46YKr79O%ypADRk$j&q&OAs8AMC0am8ZxNYJw^SWVWBVl;)S(1hx{yx%-7(g zcq$J7ej)|M6SY}9e4jkJVl(19I{{yU?5NUpDn1v-rmk+ie!`D{?;H(ZeJBjhAD4zi zjo-zg(3->$>#=beHrp=rS4)3X?1?r**(N*g!{vsb`mT$60`>6BcK9XgO%ESPE!vo= z5s%wGDuitbuTEe?^VFGGCvdJNvv53C3e}BKH*pN?CICP)s4XmEP2+GhHB>%6<6%H` zo`DMA$Tgu7sG1$(F0HO9EA_Nt{cJFpQQzuHb7iDuLJ2y2sV7S{?(6nVTX0T-2}@qd zvc6TWIyZaz{jkRKZPxhTw7zWWZZhxHCwIL&^s_7zvcrdho!VnwCbwEGpAa^L}YYhk7gZ*KncLoc#C9)at;tzA& z%hu)qrZmJ9_5?%l%5Q`!gX)1n`2L}AS@-GuU3}+?iTce z6ctef?5ZzN4{S~K1cBDBPz3}0eAo~ozAcfvkH^0-@ek2y$iLvC z7+WwN0U-1|H)@tXBgUcqS=6rbm;}9Vmj8lGg6RyJ$~LXa-S0E&6BHHdxH9B**6V3K z##YQdVb(WTf11I=6$%E2bPX~Z#$b@$_0(0hg5pI!tpQ_!U3TnO6VzqcO{8+yZOL?#eaU8gkL|#@nTPjth}p z>dvgltj?XWPqs^H$1YhlZ}B$&*Qj|t*flW+p)*$0*_wCkwnM%}&AYfO*JQg*!kU+5 z-KAK=if`_P6W{|wn}CmItW)ipO%TU^_3QTBY|WqOl2cP(J7hM z*VT{1PWk3`K-W`8r#>CICqNZ`i45u69%^B|=P?j{asJ1@AmfjlSyf}mNuz9^>B4w; z_uJ%Cu9$*%L5_~6EM#Y9s);?NRU+$8) z7M(K9u&}{5*GzaE){^hImRLNDV|f9pN+g!JD1>YL6nlcyD@q zPzHNygjdVdJ$1{h=uWfN-#hPf|qE1Nqi3d-QO#ye*+cN zaPievVx?$9D1gj>5b@5fg`I0cZV;$71KpF!7pQPp>+gOzI2&2(%QW4I;yfN8JSWp_ zP>~F^f!U{y!`ArPZ=Yrmwjzo`pG1ada_7}`YX$)Ra)Q6v6IDC+QliZPqCs>$OpJ|i zUM2SI@a*2N75n{)cCW%f?8Hcv<^V@rf-YL*Xh?AT=W90m0Z*llCodF<_+SPD6(t0v z^)yYn7S&It3TbITZ)|_L3M1E@QpQ`GJ~_As83L{($o;}J1){c>*LPl$^~H*Gz);0t z5FjZKmV@G=0dr#q%j#;THUfrff+6G&#wtUBwx&?92FjbY^Go`-l5Lu?&1JC74vHr# zIVHndF}(Mp_^e@ox<*GGbytOApmtt-3K87s6_GK%y0ghb)ZP<@@0s{R%@uV{EQ_v% zH(zV>(6k?LzE*9rwZP+*1?kZG-ww^Np6yrmubPHuyH3Rw@I-2$!5Jv@bzdO4QRmu7 z#X&j5ktHpJz`slQP+9R2NI;9u^m{mX3uQb}UjU)Cq(y@SX_$XxH_9>j05 z)mS*)-2MSBz8+2t@uU&K9T-Ers)OqRMhh?=##zJB?1bfl5)-iV*`=;3n?Btc{U~qk z_M;0{)lXejxPE{KiV7%~3`Vs2I1rbMYAA31$flv?Yw`fW)hdFh8!L`1?Az>3kMS9K zkxZV|oL5)64z1=j6cY#p(j*+x^3KD>d$q4PSXqLv_G^>k!ciOc2SRw?IGR(Dx!(rF zQmB$Dc@VRT$c!v=Dq>Fg z<<+0DE}@B8OGP;5Z}9}w>S{6tP9OTzH-{9xI_nCQHfsOtol()C{T^sJfyYi06vR0^ z14Ok(;pqJ6V{RLPI^XQLqB75r_AW}A?bPXF8Qsx({5XU-2y>7T*AWxWk~DcLC;S`X@%@iiH{Eymlj96@fI_4VEgE+&kB z!gstz#mNhsu|Ly(2lT>RC2QUR_q?5O-%qGPkyIoC@M(R7Ob?M)W3~9>I~HJ#Rg}e5 z=<~#&%HD3nQiCU|N4$Qp+Tln4i2YzO7M&BtJyEF6!RP8>&CBm`-+POXfLvsp!AB@( zAfePS$QP-`0B-@LCR=bSSy@SGZYTs_!FVI^h8hOp9~gFTs18dw4YUvv{#zLXwbp)Z zjVIFNi;-W>{YB*DXr&1t4C4Sv_q+<@D;$fj$x=Ih;G{i?a{ihsB|JB7-}1ZeDna%0Dk}^l<+RDR#P$fs+4Ji70!f& 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�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 +#include +#include +#include +#include +#include "../../Engine.hpp" +#include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" +#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" + + + +void Blur::RenderBlur(ID3D11Texture2D* inputTexture, ID3D11Device* device, ID3D11DeviceContext* deviceContext) { + ID3D11ShaderResourceView* inputSRV = nullptr; + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = 1; + srvDesc.Texture2D.MostDetailedMip = 0; + device->CreateShaderResourceView(inputTexture, &srvDesc, &inputSRV); + + D3D11_TEXTURE2D_DESC inputDesc; + inputTexture->GetDesc(&inputDesc); + + D3D11_MAPPED_SUBRESOURCE mappedResource; + deviceContext->Map(inputTexture, 0, D3D11_MAP_READ, 0, &mappedResource); + + cv::Mat src(inputDesc.Height, inputDesc.Width, CV_8UC4, mappedResource.pData, mappedResource.RowPitch); + deviceContext->Unmap(inputTexture, 0); + + cv::Mat dst = ImageProcessor::ApplyGaussianBlur(src, 15); + + ID3D11Texture2D* texture_blur = ImageProcessor::LoadTextureFromMat(dst, device, deviceContext); + + ID3D11ShaderResourceView* texture_srv = nullptr; + device->CreateShaderResourceView(texture_blur, &srvDesc, &texture_srv); + + ImGui::Image(texture_srv, ImVec2(dst.cols, dst.rows)); + + if (inputSRV) inputSRV->Release(); + if (texture_srv) texture_srv->Release(); + if (texture_blur) texture_blur->Release(); +} + +cv::Mat ImageProcessor::ApplyGaussianBlur(const cv::Mat& src, double sigma) { + cv::Mat dst; + GaussianBlur(src, dst, cv::Size(0, 0), sigma); + return dst; +} + +ID3D11Texture2D* ImageProcessor::LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context) { + if (mat.empty() || device == nullptr || context == nullptr) return nullptr; + + cv::Mat matBGRA; + if (mat.channels() == 3) { + cvtColor(mat, matBGRA, cv::COLOR_BGR2BGRA); + } + else if (mat.channels() == 4) { + matBGRA = mat; + } + else { + return nullptr; + } + + D3D11_TEXTURE2D_DESC desc = {}; + desc.Width = matBGRA.cols; + desc.Height = matBGRA.rows; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + + ID3D11Texture2D* texture = nullptr; + HRESULT hr = device->CreateTexture2D(&desc, nullptr, &texture); + if (FAILED(hr)) return nullptr; + + D3D11_MAPPED_SUBRESOURCE mappedResource; + hr = context->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (FAILED(hr)) return nullptr; + + for (int y = 0; y < matBGRA.rows; ++y) { + memcpy(static_cast(mappedResource.pData) + y * mappedResource.RowPitch, matBGRA.ptr(y), matBGRA.cols * 4); + } + + context->Unmap(texture, 0); + + return texture; +} \ No newline at end of file diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.hpp b/src/Client/GUI/Engine/Effects/Blur/blur.hpp deleted file mode 100644 index c4613224..00000000 --- a/src/Client/GUI/Engine/Effects/Blur/blur.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once -#include -#include - -class ImageProcessor { -public: - static cv::Mat ApplyGaussianBlur(const cv::Mat& src, double sigma) { - cv::Mat dst; - cv::GaussianBlur(src, dst, cv::Size(0, 0), sigma); - return dst; - } - static ID3D11Texture2D* LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context) { - - if (mat.empty() || device == nullptr || context == nullptr) return nullptr; - - cv::Mat matBGRA; - if (mat.channels() == 3) { - cvtColor(mat, matBGRA, cv::COLOR_BGR2BGRA); - } - else if (mat.channels() == 4) { - matBGRA = mat; - } - else { - return nullptr; - } - - D3D11_TEXTURE2D_DESC desc = {}; - desc.Width = matBGRA.cols; - desc.Height = matBGRA.rows; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - desc.MiscFlags = 0; - - ID3D11Texture2D* texture = nullptr; - HRESULT hr = device->CreateTexture2D(&desc, nullptr, &texture); - if (FAILED(hr)) return nullptr; - - D3D11_MAPPED_SUBRESOURCE mappedResource; - hr = context->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(hr)) return nullptr; - - for (int y = 0; y < matBGRA.rows; ++y) { - memcpy(static_cast(mappedResource.pData) + y * mappedResource.RowPitch, matBGRA.ptr(y), matBGRA.cols * 4); - } - - context->Unmap(texture, 0); - - return texture; - } -}; diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index 7e7f8fc6..f829e917 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -23,7 +23,6 @@ #include "Elements/Structs/HSV.hpp" #include -#include "Effects/Blur/blur.hpp" using namespace DirectX; @@ -39,45 +38,17 @@ struct BlurInputBuffer class Blur { public: - static void RenderBlur(ID3D11Texture2D* inputTexture, ID3D11Device* device, ID3D11DeviceContext* deviceContext) { - - - ID3D11ShaderResourceView* inputSRV = nullptr; - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - srvDesc.Texture2D.MostDetailedMip = 0; - device->CreateShaderResourceView(inputTexture, &srvDesc, &inputSRV); - - D3D11_TEXTURE2D_DESC inputDesc; - inputTexture->GetDesc(&inputDesc); - - D3D11_MAPPED_SUBRESOURCE mappedResource; - deviceContext->Map(inputTexture, 0, D3D11_MAP_READ, 0, &mappedResource); - - cv::Mat src(inputDesc.Height, inputDesc.Width, CV_8UC4, mappedResource.pData, mappedResource.RowPitch); - deviceContext->Unmap(inputTexture, 0); - - cv::Mat dst = ImageProcessor::ApplyGaussianBlur(src, 15); - - ID3D11Texture2D* texture_blur = ImageProcessor::LoadTextureFromMat(dst, device, deviceContext); - - ID3D11ShaderResourceView* texture_srv = nullptr; - device->CreateShaderResourceView(texture_blur, &srvDesc, &texture_srv); - - ImGui::Image(texture_srv, ImVec2(dst.cols, dst.rows)); - - if (inputSRV) inputSRV->Release(); - if (texture_srv) texture_srv->Release(); - if (texture_blur) texture_blur->Release(); - - } + static void RenderBlur(ID3D11Texture2D*, ID3D11Device*, ID3D11DeviceContext*); +}; +#include +class ImageProcessor { +public: + static cv::Mat ApplyGaussianBlur(const cv::Mat& src, double sigma); + static ID3D11Texture2D* LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context); }; - class Dimension { public: float x = 0; From 76a25f50310aa78087ea287ff5ef03359bc1e875 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Tue, 3 Sep 2024 08:06:13 +0600 Subject: [PATCH 137/240] Revert "Reapply "future OpenCV stuff"" This reverts commit 90b5b524262295719b460fa17df1d93224c1cc98. --- CMakeLists.txt | 13 +- README.md | 6 - src/Client/GUI/Engine/Effects/Blur/blur.cpp | 405 +++++++++++++++--- .../GUI/Engine/Effects/Blur/blur_dx12.cpp | 220 ++++++++++ src/Client/GUI/Engine/Engine.hpp | 45 +- .../Hook/Hooks/Render/SwapchainHook.cpp | 1 + .../Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- 7 files changed, 606 insertions(+), 86 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 47237d1f..300ccc61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,22 +87,15 @@ endif() add_library(MinHook SHARED IMPORTED GLOBAL) set_target_properties(MinHook PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/minhook/minhook.lib") - FetchContent_Declare( libhat GIT_REPOSITORY https://github.com/BasedInc/libhat.git - GIT_TAG f4755aea0987e77c0f6f496c49eb9cd08d5f5a06 - GIT_SHALLOW TRUE - GIT_PROGRESS TRUE + GIT_TAG 9ef05d6961ce37a4c801f11159de895aa21878a9 ) FetchContent_MakeAvailable(libhat) -set(OpenCV_DIR C:/opencv/opencv/build/) -find_package(OpenCV REQUIRED) -target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS} libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) -target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) -set(CPACK_PROJECT_NAME ${PROJECT_NAME}) -set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) \ No newline at end of file +target_link_libraries(${PROJECT_NAME} PRIVATE libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) +target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) \ No newline at end of file diff --git a/README.md b/README.md index efd337a6..d1a2444c 100644 --- a/README.md +++ b/README.md @@ -33,12 +33,6 @@ If you encounter issues, check out our [FAQ](https://discord.gg/flarial-communit 2. **Git**: Install Git if you haven't already. You can download Git from [git-scm.com](https://git-scm.com/downloads) and follow the installation instructions. - - -3. **OpenCV**: Install [OpenCV](https://opencv.org/releases). Click the "Windows" option and follow these instructions: - - When running the installer, make sure you choose the path to be "C:/opencv" - - Add the path C:\opencv\opencv\build\x64\vc16\bin to your Environment Variables (PATH) for it to work properly - - You are good to go! You can now build Flarial. ### Steps to Clone and Build the Project: 1. **Clone the Repository**: diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 0ec778db..5daf4cbb 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -1,92 +1,373 @@ -#pragma once #include #include #include -#include -#include #include "../../Engine.hpp" #include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" #include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" +// CREDITS @MR CHIPS (@chyves) +#define BLUR_OFFSET 10 -void Blur::RenderBlur(ID3D11Texture2D* inputTexture, ID3D11Device* device, ID3D11DeviceContext* deviceContext) { - ID3D11ShaderResourceView* inputSRV = nullptr; - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - srvDesc.Texture2D.MostDetailedMip = 0; - device->CreateShaderResourceView(inputTexture, &srvDesc, &inputSRV); +static const XMFLOAT4 quadVertices[] = + { + XMFLOAT4(1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; - D3D11_TEXTURE2D_DESC inputDesc; - inputTexture->GetDesc(&inputDesc); +const char *vertexShaderSrc = "struct VS_INPUT {\ + float4 pos : POSITION;\ +};\ +\ +float4 main(VS_INPUT input) : SV_POSITION {\ + return input.pos;\ +}"; - D3D11_MAPPED_SUBRESOURCE mappedResource; - deviceContext->Map(inputTexture, 0, D3D11_MAP_READ, 0, &mappedResource); +const char *downsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; - cv::Mat src(inputDesc.Height, inputDesc.Width, CV_8UC4, mappedResource.pData, mappedResource.RowPitch); - deviceContext->Unmap(inputTexture, 0); +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); - cv::Mat dst = ImageProcessor::ApplyGaussianBlur(src, 15); +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); - ID3D11Texture2D* texture_blur = ImageProcessor::LoadTextureFromMat(dst, device, deviceContext); + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; - ID3D11ShaderResourceView* texture_srv = nullptr; - device->CreateShaderResourceView(texture_blur, &srvDesc, &texture_srv); + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; - ImGui::Image(texture_srv, ImVec2(dst.cols, dst.rows)); + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } - if (inputSRV) inputSRV->Release(); - if (texture_srv) texture_srv->Release(); - if (texture_blur) texture_blur->Release(); + return colorSum; } +)"; + +const char *upsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; -cv::Mat ImageProcessor::ApplyGaussianBlur(const cv::Mat& src, double sigma) { - cv::Mat dst; - GaussianBlur(src, dst, cv::Size(0, 0), sigma); - return dst; + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } + + return colorSum; } +)"; + + + +const char *dbgDrawTextureShaderSrc = "cbuffer BlurInputBuffer : register(b0)\ +{\ + float2 resolution;\ + float2 offset;\ + float2 halfpixel;\ +};\ +struct PS_INPUT {\ + float4 pos : POSITION;\ +};\ +sampler sampler0 : register(s0);\ +Texture2D texture0 : register(t0);\ +\ +float4 main(PS_INPUT input, float4 screenSpace : SV_Position) : SV_TARGET {\ + float2 uv = screenSpace.xy / resolution;\ + return texture0.Sample(sampler0, uv);\ +}"; -ID3D11Texture2D* ImageProcessor::LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context) { - if (mat.empty() || device == nullptr || context == nullptr) return nullptr; +ID3DBlob *TryCompileShader(const char *pSrcData, const char *pTarget) +{ + HRESULT hr; - cv::Mat matBGRA; - if (mat.channels() == 3) { - cvtColor(mat, matBGRA, cv::COLOR_BGR2BGRA); + ID3DBlob *shaderBlob; + ID3DBlob *errorBlob; + hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); + + if (FAILED(hr)) + { + Logger::error("[Blur] Failed to compile shader"); + errorBlob->Release(); + throw std::logic_error("Failed to compile shader!"); } - else if (mat.channels() == 4) { - matBGRA = mat; + return shaderBlob; +} + +ID3D11PixelShader *dbgShader; + +void Blur::InitializePipeline() +{ + + HRESULT hr; + ID3D11DeviceContext* pContext = SwapchainHook::context; + + // byteWidth has to be a multiple of 32, BlurInputBuffer has a size of 24 + CD3D11_BUFFER_DESC cbd( + sizeof(BlurInputBuffer), + D3D11_BIND_CONSTANT_BUFFER); + CD3D11_BUFFER_DESC cbdVertex( + sizeof(quadVertices), + D3D11_BIND_VERTEX_BUFFER); + + SwapchainHook::d3d11Device->CreateBuffer( + &cbd, + nullptr, + &pConstantBuffer); + + D3D11_SUBRESOURCE_DATA vertexBufferData = {quadVertices, 0, 0}; + + SwapchainHook::d3d11Device->CreateBuffer( + &cbdVertex, + &vertexBufferData, + &pVertexBuffer); + + ID3DBlob *shaderBlob = TryCompileShader(upsampleShaderSrc, "ps_4_0"); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pUpsampleShader); + + shaderBlob = TryCompileShader(downsampleShaderSrc, "ps_4_0"); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pDownsampleShader); + + shaderBlob = TryCompileShader(dbgDrawTextureShaderSrc, "ps_4_0"); + SwapchainHook::d3d11Device->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &dbgShader); + + shaderBlob = TryCompileShader(vertexShaderSrc, "vs_4_0"); + SwapchainHook::d3d11Device->CreateVertexShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), nullptr, &pVertexShader); + + D3D11_INPUT_ELEMENT_DESC ied = + {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, + 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}; + SwapchainHook::d3d11Device->CreateInputLayout(&ied, 1, shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &pInputLayout); + D3D11_SAMPLER_DESC sd{}; + sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + sd.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; + SwapchainHook::d3d11Device->CreateSamplerState(&sd, &pSampler); + +} +void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderResourceView *pShaderResourceView, XMFLOAT2 rtvSize) +{ + HRESULT hr; + ID3D11DeviceContext* pContext = SwapchainHook::context; + D3D11_DEPTH_STENCIL_DESC dsd{}; + dsd.DepthEnable = false; + dsd.StencilEnable = false; + ID3D11DepthStencilState *pDepthStencilState; + hr = SwapchainHook::d3d11Device->CreateDepthStencilState(&dsd, &pDepthStencilState); + if (FAILED(hr)) { pContext->Release(); return; } + pContext->OMSetDepthStencilState(pDepthStencilState, 0); + + void *null = nullptr; + pContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView **)&null); + pContext->OMSetRenderTargets(1, &pRenderTargetView, nullptr); + + constantBuffer.resolution = rtvSize; + constantBuffer.halfpixel = XMFLOAT2(0.5 / rtvSize.x, 0.5 / rtvSize.y); + pContext->UpdateSubresource(pConstantBuffer, 0, nullptr, &constantBuffer, 0, 0); + + pContext->IASetInputLayout(pInputLayout); + UINT stride = sizeof(XMFLOAT4); + UINT offset = 0; + + pContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset); + pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + pContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0); + pContext->VSSetShader(pVertexShader, nullptr, 0); + pContext->PSSetSamplers(0, 1, &pSampler); + pContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); + D3D11_BLEND_DESC bd{}; + ZeroMemory(&bd, sizeof(bd)); + bd.AlphaToCoverageEnable = false; + bd.RenderTarget[0].BlendEnable = true; + bd.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + bd.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + bd.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; + bd.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; + bd.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + bd.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + bd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + ID3D11BlendState *pBlendState; + hr = SwapchainHook::d3d11Device->CreateBlendState(&bd, &pBlendState); + if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); return; } + pContext->OMSetBlendState(pBlendState, NULL, 0xffffffff); + D3D11_RASTERIZER_DESC rd{}; + rd.FillMode = D3D11_FILL_SOLID; + rd.CullMode = D3D11_CULL_NONE; + rd.DepthClipEnable = false; + rd.ScissorEnable = false; + ID3D11RasterizerState *pRasterizerState; + hr = SwapchainHook::d3d11Device->CreateRasterizerState(&rd, &pRasterizerState); + if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); pBlendState->Release(); return; } + pContext->RSSetState(pRasterizerState); + + pContext->PSSetShaderResources(0, 1, &pShaderResourceView); + D3D11_VIEWPORT viewport{}; + viewport.TopLeftX = 0; + viewport.TopLeftY = 0; + viewport.Width = rtvSize.x; + viewport.Height = rtvSize.y; + viewport.MaxDepth = 1.0f; + + FLOAT backgroundColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + pContext->ClearRenderTargetView(pRenderTargetView, backgroundColor); + pContext->RSSetViewports(1, &viewport); + pContext->Draw(sizeof(quadVertices) / sizeof(quadVertices[0]), 0); + ID3D11RenderTargetView* kajgd = nullptr; + pContext->OMSetRenderTargets(1, &kajgd, nullptr); + + pDepthStencilState->Release(); + pBlendState->Release(); + pRasterizerState->Release(); +} + +void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) +{ + + if(intensity < 1) return; + + if (!SwapchainHook::GetBackbuffer()) return; + + ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); + if (!pOrigShaderResourceView) return; + + ID3D11DeviceContext* pContext = SwapchainHook::context; + + std::vector framebuffers; + std::vector renderTargetViews; + std::vector shaderResourceViews; + std::vector fbSizes; + D3D11_TEXTURE2D_DESC desc; + SwapchainHook::GetBackbuffer()->GetDesc(&desc); + + framebuffers.reserve((size_t)iterations); + renderTargetViews.reserve((size_t)iterations); + + D3D11_SHADER_RESOURCE_VIEW_DESC srvd{}; + srvd.Format = desc.Format; + srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvd.Texture2D.MipLevels = 1; + + desc.BindFlags |= D3D11_BIND_RENDER_TARGET; + + for (int i = 0; i <= iterations; i++) + { + ID3D11Texture2D *pFrameBuffer; + ID3D11RenderTargetView *pRenderTargetView; + ID3D11ShaderResourceView *pShaderResourceView; + + SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); + if (i == 0) + pRenderTargetView = pDstRenderTargetView; + else + SwapchainHook::d3d11Device->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); + SwapchainHook::d3d11Device->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); + + framebuffers.push_back(pFrameBuffer); + renderTargetViews.push_back(pRenderTargetView); + shaderResourceViews.push_back(pShaderResourceView); + fbSizes.push_back(XMFLOAT2(desc.Width, desc.Height)); + + desc.Width /= 2; + desc.Height /= 2; } - else { - return nullptr; + + constantBuffer.offset = XMFLOAT2(intensity * 3, intensity * 3); + pContext->PSSetShader(pDownsampleShader, nullptr, 0); + RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); + + for (int i = 1; i < iterations; i++) + { + RenderToRTV(renderTargetViews[i + 1], shaderResourceViews[i], fbSizes[i + 1]); } - D3D11_TEXTURE2D_DESC desc = {}; - desc.Width = matBGRA.cols; - desc.Height = matBGRA.rows; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - desc.MiscFlags = 0; - - ID3D11Texture2D* texture = nullptr; - HRESULT hr = device->CreateTexture2D(&desc, nullptr, &texture); - if (FAILED(hr)) return nullptr; - - D3D11_MAPPED_SUBRESOURCE mappedResource; - hr = context->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(hr)) return nullptr; - - for (int y = 0; y < matBGRA.rows; ++y) { - memcpy(static_cast(mappedResource.pData) + y * mappedResource.RowPitch, matBGRA.ptr(y), matBGRA.cols * 4); + pContext->PSSetShader(pUpsampleShader, nullptr, 0); + + for (int i = iterations; i > 0; i--) + { + RenderToRTV(renderTargetViews[i - 1], shaderResourceViews[i], fbSizes[i - 1]); } - context->Unmap(texture, 0); + for (int i = 0; i < iterations; i++) + { + + if (i != 0) + renderTargetViews[i]->Release(); + framebuffers[i]->Release(); + shaderResourceViews[i]->Release(); + + renderTargetViews.clear(); + framebuffers.clear(); + shaderResourceViews.clear(); + fbSizes.clear(); + } - return texture; + pContext->Release(); + pOrigShaderResourceView->Release(); } \ No newline at end of file diff --git a/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp b/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp index e69de29b..53a38860 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur_dx12.cpp @@ -0,0 +1,220 @@ +/*#include +#include +#include +#include +#include +#include +#include "../../Engine.hpp" +#include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" +#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" + +static const XMFLOAT4 quadVertices[] = + { + XMFLOAT4(1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, -1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(-1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, 1.0, 0.0, 1.0), + XMFLOAT4(1.0, -1.0, 0.0, 1.0)}; + +const char *vertexShaderSrc = "struct VS_INPUT {\ + float4 pos : POSITION;\ +};\ +\ +float4 main(VS_INPUT input) : SV_POSITION {\ + return input.pos;\ +}"; + +const char *downsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; + + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } + + return colorSum; +} +)"; + +const char *upsampleShaderSrc = R"( +cbuffer BlurInputBuffer : register(b0) +{ + float2 resolution; + float2 offset; + float2 halfPixel; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 main(float4 screenSpace : SV_Position) : SV_TARGET +{ + float2 uv = screenSpace.xy / resolution; + float4 colorSum = float4(0.0, 0.0, 0.0, 0.0); + + static const float2 offsets[9] = { + float2(-1.0, -1.0) * halfPixel * offset, + float2(0.0, -1.0) * halfPixel * offset, + float2(1.0, -1.0) * halfPixel * offset, + float2(-1.0, 0.0) * halfPixel * offset, + float2(0.0, 0.0) * halfPixel * offset, + float2(1.0, 0.0) * halfPixel * offset, + float2(-1.0, 1.0) * halfPixel * offset, + float2(0.0, 1.0) * halfPixel * offset, + float2(1.0, 1.0) * halfPixel * offset + }; + + static const float weights[9] = { + 0.06136, 0.12245, 0.06136, + 0.12245, 0.24477, 0.12245, + 0.06136, 0.12245, 0.06136 + }; + + float weightSum = 0.0; + for (int i = 0; i < 9; i++) + { + weightSum += weights[i]; + } + + for (int i = 0; i < 9; i++) + { + colorSum += texture0.Sample(sampler0, uv + offsets[i]) * (weights[i] / weightSum); + } + + return colorSum; +} +)"; + + +ID3DBlob* TryCompileShader(const char* pSrcData, const char* pTarget) +{ + HRESULT hr; + + ID3DBlob* shaderBlob; + ID3DBlob* errorBlob; + hr = D3DCompile(pSrcData, strlen(pSrcData), nullptr, nullptr, nullptr, "main", pTarget, 0, 0, &shaderBlob, &errorBlob); + + if (FAILED(hr)) + { + Logger::error("[Blur] Failed to compile shader"); + errorBlob->Release(); + throw std::logic_error("Failed to compile shader!"); + } + return shaderBlob; +} + +ID3D12PipelineState* dbgShader; + +void Blur::InitializePipeline() +{ + HRESULT hr; + ID3D12Device* pDevice = SwapchainHook::d3d12Device5; + ID3D12GraphicsCommandList* pCommandList = SwapchainHook::d3d12CommandList; + + // Create constant buffer + D3D12_HEAP_PROPERTIES heapProps = {}; + heapProps.Type = D3D12_HEAP_TYPE_UPLOAD; + heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + + D3D12_RESOURCE_DESC resourceDesc = {}; + resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + resourceDesc.Width = sizeof(BlurInputBuffer); + resourceDesc.Height = 1; + resourceDesc.DepthOrArraySize = 1; + resourceDesc.MipLevels = 1; + resourceDesc.Format = DXGI_FORMAT_UNKNOWN; + resourceDesc.SampleDesc.Count = 1; + resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + + pDevice->CreateCommittedResource( + &heapProps, + D3D12_HEAP_FLAG_NONE, + &resourceDesc, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&pConstantBuffer)); + + // Create vertex buffer + resourceDesc.Width = sizeof(quadVertices); + pDevice->CreateCommittedResource( + &heapProps, + D3D12_HEAP_FLAG_NONE, + &resourceDesc, + D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER, + nullptr, + IID_PPV_ARGS(&pVertexBuffer)); + + // Compile shaders + ID3DBlob* vertexShaderBlob = TryCompileShader(vertexShaderSrc, "vs_5_0"); + ID3DBlob* pixelShaderBlob = TryCompileShader(upsampleShaderSrc, "ps_5_0"); + + // Create root signature + D3D12_ROOT_SIGNATURE_DESC rootSignatureDesc = {}; + rootSignatureDesc.NumParameters = 0; + rootSignatureDesc.pParameters = nullptr; + rootSignatureDesc.NumStaticSamplers = 0; + rootSignatureDesc.pStaticSamplers = nullptr; + rootSignatureDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; + + ID3DBlob* signature; + ID3DBlob* error; + D3D12SerializeRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error); + pDevice->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&pRootSignature)); + + // Create pipeline state object + D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; + psoDesc.InputLayout = { inputElementDescs, _countof(inputElementDescs) }; + psoDesc.pRootSignature = pRootSignature; + psoDesc.VS = CD3DX12_SHADER_BYTECODE(vertexShaderBlob); + psoDesc.PS = CD3DX12_SHADER_BYTECODE(pixelShaderBlob); + psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); + psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT); + psoDesc.DepthStencilState.DepthEnable = FALSE; + psoDesc.DepthStencilState.StencilEnable = FALSE; + psoDesc.SampleMask = UINT_MAX; + psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + psoDesc.NumRenderTargets = 1; + psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM; + psoDesc.SampleDesc.Count = 1; + + pDevice->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&pUpsampleShader)); +}*/ \ No newline at end of file diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index f829e917..cf2e9b21 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -23,7 +23,6 @@ #include "Elements/Structs/HSV.hpp" #include - using namespace DirectX; struct BlurInputBuffer @@ -38,17 +37,49 @@ struct BlurInputBuffer class Blur { public: - static void RenderBlur(ID3D11Texture2D*, ID3D11Device*, ID3D11DeviceContext*); -}; -#include + static inline ID3D11PixelShader *pUpsampleShader = nullptr; + static inline ID3D11PixelShader *pDownsampleShader = nullptr; + static inline ID3D11VertexShader *pVertexShader = nullptr; + static inline ID3D11InputLayout *pInputLayout = nullptr; + + static inline ID3D11SamplerState *pSampler = nullptr; + static inline ID3D11Buffer *pVertexBuffer = nullptr; + static inline ID3D11Buffer *pConstantBuffer = nullptr; + static inline BlurInputBuffer constantBuffer; + + // RAII + static void InitializePipeline(); + //static void Cleanup(); + + static void RenderToRTV(ID3D11RenderTargetView *, ID3D11ShaderResourceView *, XMFLOAT2); + + static void RenderBlur(ID3D11RenderTargetView *, int, float); +}; -class ImageProcessor { +class BlurDX12 +{ public: - static cv::Mat ApplyGaussianBlur(const cv::Mat& src, double sigma); - static ID3D11Texture2D* LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context); + + static inline ID3D11PixelShader *pUpsampleShader = nullptr; + static inline ID3D11PixelShader *pDownsampleShader = nullptr; + static inline ID3D11VertexShader *pVertexShader = nullptr; + static inline ID3D11InputLayout *pInputLayout = nullptr; + + static inline ID3D11SamplerState *pSampler = nullptr; + static inline ID3D11Buffer *pVertexBuffer = nullptr; + static inline ID3D11Buffer *pConstantBuffer = nullptr; + static inline BlurInputBuffer constantBuffer; + + // RAII + static void InitializePipeline(); + //static void Cleanup(); + + static void RenderBlur(ID3D12GraphicsCommandList* commandList); }; + + class Dimension { public: float x = 0; diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 04af3a36..f605fc17 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -523,6 +523,7 @@ void SwapchainHook::DX11Init() { SaveBackbuffer(); + Blur::InitializePipeline(); Memory::SafeRelease(eBackBuffer); init = true; } diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index ce4231f1..e191b669 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -128,7 +128,7 @@ class ClickGUIRenderer : public Listener { } - //Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); + Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); From 0c4a99a26cf710e7ee52f48f36628e776a42ffca Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 12 Sep 2024 16:21:40 +0600 Subject: [PATCH 138/240] BLUR 11ON12 FIX --- main.cpp | 2 +- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 8 ++++---- .../GUI/Engine/Elements/Control/Image/Image.cpp | 15 ++------------- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 12 +++++------- .../Modules/MotionBlur/MotionBlurListener.hpp | 17 ++++++++--------- 5 files changed, 20 insertions(+), 34 deletions(-) diff --git a/main.cpp b/main.cpp index aa1c2607..4d169bab 100644 --- a/main.cpp +++ b/main.cpp @@ -24,7 +24,7 @@ std::string removeColorCodes(const std::string& input); DWORD WINAPI init(HMODULE real) { #ifndef NDEBUG - bool shouldDebug = false; // Change this bool locally, NEVER push it set to true + bool shouldDebug = true; // Change this bool locally, NEVER push it set to true if (GetConsoleWindow() == nullptr && shouldDebug) { AllocConsole(); diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 5daf4cbb..5b551e9a 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -221,7 +221,7 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe dsd.StencilEnable = false; ID3D11DepthStencilState *pDepthStencilState; hr = SwapchainHook::d3d11Device->CreateDepthStencilState(&dsd, &pDepthStencilState); - if (FAILED(hr)) { pContext->Release(); return; } + if (FAILED(hr)) { return; } pContext->OMSetDepthStencilState(pDepthStencilState, 0); void *null = nullptr; @@ -255,7 +255,7 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe bd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; ID3D11BlendState *pBlendState; hr = SwapchainHook::d3d11Device->CreateBlendState(&bd, &pBlendState); - if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); return; } + if (FAILED(hr)) { pDepthStencilState->Release(); return; } pContext->OMSetBlendState(pBlendState, NULL, 0xffffffff); D3D11_RASTERIZER_DESC rd{}; rd.FillMode = D3D11_FILL_SOLID; @@ -264,7 +264,7 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe rd.ScissorEnable = false; ID3D11RasterizerState *pRasterizerState; hr = SwapchainHook::d3d11Device->CreateRasterizerState(&rd, &pRasterizerState); - if (FAILED(hr)) { pContext->Release(); pDepthStencilState->Release(); pBlendState->Release(); return; } + if (FAILED(hr)) { pDepthStencilState->Release(); pBlendState->Release(); return; } pContext->RSSetState(pRasterizerState); pContext->PSSetShaderResources(0, 1, &pShaderResourceView); @@ -368,6 +368,6 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio fbSizes.clear(); } - pContext->Release(); + pOrigShaderResourceView->Release(); } \ No newline at end of file diff --git a/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp b/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp index efa7549a..2b410bfd 100644 --- a/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp @@ -31,15 +31,6 @@ void FlarialGUI::image(const std::string& imageName, D2D1_RECT_F rect) { if (imageName == R"(\Flarial\assets\transparent.png)") interpolationMode = D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR; - - if (isInScrollView) { - if (isRectInRect(ScrollViewRect, rect)) - D2D::context->DrawBitmap(ImagesClass::eimages[imageName], imageRect, 1.0f, - interpolationMode); - } else { - D2D::context->DrawBitmap(ImagesClass::eimages[imageName], imageRect, 1.0f, - interpolationMode); - } } bool FlarialGUI::LoadImageFromResource(int resourceId, ID3D11ShaderResourceView** out_srv, LPCTSTR type) { @@ -289,7 +280,7 @@ void FlarialGUI::image(int resourceId, D2D1_RECT_F rect, LPCTSTR type, bool shou LoadImageFromResource(resourceId, &ImagesClass::images[resourceId], type); */ - if (SwapchainHook::d3d11Device != nullptr) { + if (SwapchainHook::queue == nullptr) { if (ImagesClass::ImguiDX11Images[resourceId] == nullptr) { if (LoadImageFromResource(resourceId, &ImagesClass::ImguiDX11Images[resourceId], type)) { //totalImageLoaded++; @@ -319,7 +310,7 @@ void FlarialGUI::image(int resourceId, D2D1_RECT_F rect, LPCTSTR type, bool shou D3D12_DESCRIPTOR_HEAP_DESC descriptorImGuiRender = {}; descriptorImGuiRender.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; - descriptorImGuiRender.NumDescriptors = 100; // MAY NEED TO CHANGE THIS IS WE GET MORE THAN 100 ASSETS + descriptorImGuiRender.NumDescriptors = 500; // MAY NEED TO CHANGE THIS IS WE GET MORE THAN 100 ASSETS descriptorImGuiRender.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; ImageDevice4Fun->CreateDescriptorHeap(&descriptorImGuiRender, IID_PPV_ARGS(&SwapchainHook::d3d12DescriptorHeapImGuiIMAGE)); @@ -338,7 +329,6 @@ void FlarialGUI::image(int resourceId, D2D1_RECT_F rect, LPCTSTR type, bool shou if (!ret) return; ImagesClass::ImguiDX12Images[resourceId] = (ImTextureID)gpu.ptr; - ImageDevice4Fun->Release(); } else { @@ -379,7 +369,6 @@ void FlarialGUI::LoadAllImages() { } } - ImageDevice4Fun->Release(); } else { for(int i = 100; i <= MAX_IMAGE_ID; i++) { if(i != IDR_PATAR_JPG) LoadImageFromResource(i, &ImagesClass::ImguiDX11Images[i], "PNG"); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index f605fc17..67bae9b3 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -451,8 +451,6 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI if (mainRenderTargetView) mainRenderTargetView->Release(); - if (ppContext) ppContext->Release(); - } Memory::SafeRelease(FlarialGUI::blurbrush); @@ -616,7 +614,7 @@ void SwapchainHook::DX12Init() { Memory::SafeRelease(dxgiDevice); Memory::SafeRelease(d2dFactory); - //BlurDX12::InitializePipeline(); + Blur::InitializePipeline(); init = true; } } @@ -683,14 +681,15 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() D3D11_TEXTURE2D_DESC desc; buffer2D->GetDesc(&desc); - std::cout << desc.Format << std::endl; HRESULT r; if(!stageTex) { - D3D11_TEXTURE2D_DESC stageDesc = desc; + D3D11_TEXTURE2D_DESC stageDesc = {}; + stageDesc = desc; stageDesc.Usage = D3D11_USAGE_STAGING; - stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; stageDesc.BindFlags = 0; + stageDesc.MiscFlags = 0; r = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); if (FAILED(r)) std::cout << "Failed to create stage texture: " << std::hex << r << std::endl; } @@ -710,6 +709,5 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() deviceContext->CopyResource(SavedD3D11BackBuffer, stageTex); Memory::SafeRelease(buffer2D); - Memory::SafeRelease(deviceContext); } } diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index 8800b86a..b5845e6c 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -78,14 +78,16 @@ class MotionBlurListener : public Listener { static ID3D11ShaderResourceView* BackbufferToSRV() { HRESULT hr; - ID3D11ShaderResourceView* outSRV; - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + ID3D11ShaderResourceView* outSRV = nullptr; + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + D3D11_TEXTURE2D_DESC d; + SwapchainHook::GetBackbuffer()->GetDesc(&d); + srvDesc.Format = d.Format; srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; + srvDesc.Texture2D.MipLevels = d.MipLevels; srvDesc.Texture2D.MostDetailedMip = 0; - if (FAILED(hr = SwapchainHook::d3d11Device->CreateShaderResourceView(SwapchainHook::GetBackbuffer(), &srvDesc, &outSRV))) + if (FAILED(hr = SwapchainHook::d3d11Device->CreateShaderResourceView(SwapchainHook::GetBackbuffer(), &srvDesc, &outSRV)) || !outSRV) { std::stringstream ss; ss << "0x" << std::hex << std::setw(8) << std::setfill('0') << hr; @@ -306,8 +308,5 @@ void InitializeRenderResources(ID3D11Device* device) context->Draw(4, 0); //context->OMSetRenderTargets(1, nullptr, nullptr); - - - context->Release(); - } +} }; \ No newline at end of file From 86595b3c51a39590500ad60d4d6a19270e2226fb Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 12 Sep 2024 17:46:47 +0600 Subject: [PATCH 139/240] MB works again --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 2 ++ .../Control/ColorPicker/ColorPicker.cpp | 2 +- .../Hook/Hooks/Render/SwapchainHook.cpp | 4 ++-- .../Modules/ClickGUI/ClickGUIRenderer.hpp | 4 ++-- .../Modules/MotionBlur/MotionBlurListener.hpp | 23 ++++++++++--------- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 5b551e9a..1e8ea06d 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -322,6 +322,8 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio ID3D11RenderTargetView *pRenderTargetView; ID3D11ShaderResourceView *pShaderResourceView; + + // create texture2d for each size and simply reuse to create rtvs & srvs SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); if (i == 0) pRenderTargetView = pDstRenderTargetView; diff --git a/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp b/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp index 998abca4..c69298b0 100644 --- a/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp +++ b/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp @@ -109,7 +109,7 @@ void FlarialGUI::ColorPicker(const int index, float x, float y, std::string &hex cursorCol.a = FlarialGUI::TextBoxes[index].cursorOpac; - sizes[text] = FlarialGUI::FlarialTextWithFont(x + Constraints::SpacingConstraint(1.35f, s), y * 1.006f, + sizes[text] = FlarialGUI::FlarialTextWithFont(x + Constraints::SpacingConstraint(1.35f, s), y * 1.004f, FlarialGUI::to_wide(text).c_str(), s * 4.3f, s * 1.1f, DWRITE_TEXT_ALIGNMENT_LEADING, s * 4.0f, DWRITE_FONT_WEIGHT_NORMAL); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 67bae9b3..07d68dcb 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -627,6 +627,8 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() void SwapchainHook::SaveBackbuffer() { if(!SwapchainHook::queue) { + Memory::SafeRelease(SavedD3D11BackBuffer); + ID3D11DeviceContext* deviceContext = SwapchainHook::context; IDXGISurface1* backBuffer = nullptr; HRESULT hr; @@ -667,8 +669,6 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() Memory::SafeRelease(backBuffer); Memory::SafeRelease(buffer2D); - Memory::SafeRelease(deviceContext); - } else { diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index e191b669..692a58a4 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -61,7 +61,6 @@ struct PageType { }; class ClickGUIRenderer : public Listener { - Module *module; float baseHeightReal = 1.0f; float baseHeightActual = 0.00001f; float realBlurAmount = 0.00001f; @@ -73,6 +72,7 @@ class ClickGUIRenderer : public Listener { std::string searchBarString; public: static inline bool editmenu = false; + static Module *module; static std::pair centerChildRectangle(float parentWidth, float parentHeight, float childWidth, float childHeight) { @@ -128,7 +128,7 @@ class ClickGUIRenderer : public Listener { } - Blur::RenderBlur(event.RTV, 3, realBlurAmount/4); + Blur::RenderBlur(event.RTV, 3, realBlurAmount / 2); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index b5845e6c..181e9da0 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -30,7 +30,7 @@ class MotionBlurListener : public Listener { void onRender(RenderEvent &event) override { int maxFrames = (int)round(module->settings.getSettingByName("intensity2")->value); - if (SDK::getCurrentScreen() == "hud_screen" && !SwapchainHook::queue) { + if (SDK::getCurrentScreen() == "hud_screen" && !SwapchainHook::queue && this->module->isEnabled()) { if (previousFrames.size() >= static_cast(maxFrames)) { // Remove excess frames if maxFrames is reduced int framesToRemove = (int)previousFrames.size() - static_cast(maxFrames); @@ -42,13 +42,14 @@ class MotionBlurListener : public Listener { ID3D11ShaderResourceView* buffer = BackbufferToSRV(); if(buffer) previousFrames.push_back(buffer); + else std::cout << "Couldn't save buffer for Motion Blur."; float alpha = 0.3f; for (ID3D11ShaderResourceView* frame: previousFrames) { - if(SwapchainHook::d3d11Device) { + if(!SwapchainHook::queue) { ImageWithOpacity(frame, {MC::windowSize.x, MC::windowSize.y}, alpha); } alpha *= module->settings.getSettingByName("intensity")->value; @@ -64,40 +65,40 @@ class MotionBlurListener : public Listener { void ImageWithOpacity(ID3D11ShaderResourceView* srv, ImVec2 size, float opacity) { - if (opacity <= 0.0f) + if (opacity <= 0.0f) { + //std::cout << "alpha: " + std::to_string(opacity) << std::endl; return; + } opacity = opacity > 1.0f ? 1.0f : opacity < 0.0f ? 0.0f : opacity; ImDrawList* draw_list = ImGui::GetBackgroundDrawList(); ImVec2 pos = {0, 0}; ImU32 col = IM_COL32(255, 255, 255, static_cast(opacity * 255)); - draw_list->AddImage((void*)srv, pos, ImVec2(pos.x + size.x, pos.y + size.y), ImVec2(0, 0), ImVec2(1, 1), col); + draw_list->AddImage(srv, pos, ImVec2(pos.x + size.x, pos.y + size.y), ImVec2(0, 0), ImVec2(1, 1), col); ImGui::SetCursorScreenPos(ImVec2(pos.x + size.x, pos.y)); } static ID3D11ShaderResourceView* BackbufferToSRV() { HRESULT hr; - ID3D11ShaderResourceView* outSRV = nullptr; - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + D3D11_TEXTURE2D_DESC d; SwapchainHook::GetBackbuffer()->GetDesc(&d); + ID3D11ShaderResourceView* outSRV; + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; srvDesc.Format = d.Format; srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; srvDesc.Texture2D.MipLevels = d.MipLevels; srvDesc.Texture2D.MostDetailedMip = 0; - if (FAILED(hr = SwapchainHook::d3d11Device->CreateShaderResourceView(SwapchainHook::GetBackbuffer(), &srvDesc, &outSRV)) || !outSRV) + if (FAILED(hr = SwapchainHook::d3d11Device->CreateShaderResourceView(SwapchainHook::GetBackbuffer(), &srvDesc, &outSRV))) { - std::stringstream ss; - ss << "0x" << std::hex << std::setw(8) << std::setfill('0') << hr; - Logger::error("Failed to create shader resource view: " + ss.str()); + std::cout << "Failed to create shader resource view: " << std::hex << hr << std::endl; } return outSRV; } - const char* vertexShaderSrc = R"( cbuffer ConstantBuffer : register(b0) { From 8df0f102d39c7e0d3680ce3589152cb6fd191331 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 12 Sep 2024 17:47:05 +0600 Subject: [PATCH 140/240] woops --- src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 692a58a4..acf0d9e7 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -61,6 +61,7 @@ struct PageType { }; class ClickGUIRenderer : public Listener { + Module *module; float baseHeightReal = 1.0f; float baseHeightActual = 0.00001f; float realBlurAmount = 0.00001f; @@ -72,7 +73,6 @@ class ClickGUIRenderer : public Listener { std::string searchBarString; public: static inline bool editmenu = false; - static Module *module; static std::pair centerChildRectangle(float parentWidth, float parentHeight, float childWidth, float childHeight) { From 4acb4c5b3fb89a405f97b70ddb52b0b519688ef8 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 12 Sep 2024 18:09:11 +0600 Subject: [PATCH 141/240] no morefps drops with effects/pixelshaders --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 14 +- .../Hook/Hooks/Render/SwapchainHook.cpp | 2 + .../Modules/MotionBlur/MotionBlurListener.hpp | 212 ------------------ 3 files changed, 12 insertions(+), 216 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 1e8ea06d..3950ea8b 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -287,6 +287,9 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe pRasterizerState->Release(); } +std::vector framebuffers; +bool hasDoneFrames = false; + void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) { @@ -299,13 +302,13 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio ID3D11DeviceContext* pContext = SwapchainHook::context; - std::vector framebuffers; std::vector renderTargetViews; std::vector shaderResourceViews; std::vector fbSizes; D3D11_TEXTURE2D_DESC desc; SwapchainHook::GetBackbuffer()->GetDesc(&desc); + if(!hasDoneFrames) framebuffers.reserve((size_t)iterations); renderTargetViews.reserve((size_t)iterations); @@ -324,13 +327,16 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio // create texture2d for each size and simply reuse to create rtvs & srvs + if(!hasDoneFrames) SwapchainHook::d3d11Device->CreateTexture2D(&desc, nullptr, &pFrameBuffer); + else pFrameBuffer = framebuffers[i]; if (i == 0) pRenderTargetView = pDstRenderTargetView; else SwapchainHook::d3d11Device->CreateRenderTargetView(pFrameBuffer, nullptr, &pRenderTargetView); SwapchainHook::d3d11Device->CreateShaderResourceView(pFrameBuffer, nullptr, &pShaderResourceView); + if(!hasDoneFrames) framebuffers.push_back(pFrameBuffer); renderTargetViews.push_back(pRenderTargetView); shaderResourceViews.push_back(pShaderResourceView); @@ -340,6 +346,8 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio desc.Height /= 2; } + hasDoneFrames = true; + constantBuffer.offset = XMFLOAT2(intensity * 3, intensity * 3); pContext->PSSetShader(pDownsampleShader, nullptr, 0); RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); @@ -361,15 +369,13 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio if (i != 0) renderTargetViews[i]->Release(); - framebuffers[i]->Release(); shaderResourceViews[i]->Release(); renderTargetViews.clear(); - framebuffers.clear(); shaderResourceViews.clear(); fbSizes.clear(); } - + pOrigShaderResourceView->Release(); } \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 07d68dcb..c480214c 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -451,6 +451,8 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI if (mainRenderTargetView) mainRenderTargetView->Release(); + Memory::SafeRelease(ppContext); + } Memory::SafeRelease(FlarialGUI::blurbrush); diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index 181e9da0..465a84cb 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -98,216 +98,4 @@ class MotionBlurListener : public Listener { return outSRV; } - -const char* vertexShaderSrc = R"( -cbuffer ConstantBuffer : register(b0) -{ - float4x4 projectionMatrix; - float2 screenSize; - float opacity; -} - -struct VS_INPUT -{ - float3 pos : POSITION; - float2 tex : TEXCOORD0; -}; - -struct PS_INPUT -{ - float4 pos : SV_POSITION; - float2 tex : TEXCOORD0; -}; - -PS_INPUT main(VS_INPUT input) -{ - PS_INPUT output; - output.pos = mul(float4(input.pos, 1.0f), projectionMatrix); - output.tex = input.tex; - return output; -} -)"; - -const char* pixelShaderSrc = R"( -Texture2D shaderTexture : register(t0); -SamplerState sampleType : register(s0); - -cbuffer ConstantBuffer : register(b0) -{ - float4x4 projectionMatrix; - float2 screenSize; - float opacity; -}; - -struct PS_INPUT -{ - float4 pos : SV_POSITION; - float2 tex : TEXCOORD0; -}; - -float4 main(PS_INPUT input) : SV_TARGET -{ - float4 color = shaderTexture.Sample(sampleType, input.tex); - color.a *= opacity; - return color; -} -)"; - -struct ConstantBuffer -{ - XMMATRIX projectionMatrix; - XMFLOAT2 screenSize; - float opacity; - float padding; // Padding to align float4 -}; - - struct Vertex - { - XMFLOAT3 position; - XMFLOAT2 texcoord; - }; - -ID3D11VertexShader* gVertexShader = nullptr; -ID3D11PixelShader* gPixelShader = nullptr; -ID3D11InputLayout* gInputLayout = nullptr; -ID3D11Buffer* gConstantBuffer = nullptr; -ID3D11Buffer* gVertexBuffer = nullptr; -ID3D11SamplerState* gSamplerState = nullptr; -ID3D11RenderTargetView* gRTV = nullptr; -ID3D11DepthStencilView* gDSV = nullptr; - - -void InitializeRenderResources(ID3D11Device* device) -{ - ID3DBlob* vsBlob = nullptr; - ID3DBlob* psBlob = nullptr; - - // Compile shaders - D3DCompile(vertexShaderSrc, strlen(vertexShaderSrc), nullptr, nullptr, nullptr, "main", "vs_5_0", 0, 0, &vsBlob, nullptr); - D3DCompile(pixelShaderSrc, strlen(pixelShaderSrc), nullptr, nullptr, nullptr, "main", "ps_5_0", 0, 0, &psBlob, nullptr); - - - // Create shaders - device->CreateVertexShader(vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), nullptr, &gVertexShader); - device->CreatePixelShader(psBlob->GetBufferPointer(), psBlob->GetBufferSize(), nullptr, &gPixelShader); - - // Define input layout - D3D11_INPUT_ELEMENT_DESC layout[] = { - {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, - {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0} - }; - device->CreateInputLayout(layout, ARRAYSIZE(layout), vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), &gInputLayout); - - // Release blobs - vsBlob->Release(); - psBlob->Release(); - - // Create constant buffer - D3D11_BUFFER_DESC cbd = {}; - cbd.Usage = D3D11_USAGE_DEFAULT; - cbd.ByteWidth = sizeof(ConstantBuffer); - cbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - device->CreateBuffer(&cbd, nullptr, &gConstantBuffer); - - // Create sampler state - D3D11_SAMPLER_DESC sampDesc = {}; - sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; - sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; - sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; - device->CreateSamplerState(&sampDesc, &gSamplerState); - - Vertex vertices[] = -{ - { XMFLOAT3(-1.0f, -1.0f, 0.0f), XMFLOAT2(0.0f, 1.0f) }, - { XMFLOAT3(-1.0f, 1.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3( 1.0f, -1.0f, 0.0f), XMFLOAT2(1.0f, 1.0f) }, - { XMFLOAT3( 1.0f, 1.0f, 0.0f), XMFLOAT2(1.0f, 0.0f) } -}; - - // Create the vertex buffer - D3D11_BUFFER_DESC vbd = {}; - vbd.Usage = D3D11_USAGE_DEFAULT; - vbd.ByteWidth = sizeof(vertices); - vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; - vbd.CPUAccessFlags = 0; - - D3D11_SUBRESOURCE_DATA initData = {}; - initData.pSysMem = vertices; - - device->CreateBuffer(&vbd, &initData, &gVertexBuffer); - - ID3D11Texture2D* backBuffer = nullptr; - SwapchainHook::swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&backBuffer); - - // Create the render target view - device->CreateRenderTargetView(backBuffer, nullptr, &gRTV); - backBuffer->Release(); - - // Create a depth stencil buffer and view - D3D11_TEXTURE2D_DESC depthStencilDesc = {}; - depthStencilDesc.Width = MC::windowSize.x; // Replace with actual width - depthStencilDesc.Height = MC::windowSize.y; // Replace with actual height - depthStencilDesc.MipLevels = 1; - depthStencilDesc.ArraySize = 1; - depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; - depthStencilDesc.SampleDesc.Count = 1; - depthStencilDesc.SampleDesc.Quality = 0; - depthStencilDesc.Usage = D3D11_USAGE_DEFAULT; - depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; - depthStencilDesc.CPUAccessFlags = 0; - depthStencilDesc.MiscFlags = 0; - - ID3D11Texture2D* depthStencilBuffer = nullptr; - device->CreateTexture2D(&depthStencilDesc, nullptr, &depthStencilBuffer); - device->CreateDepthStencilView(depthStencilBuffer, nullptr, &gDSV); - depthStencilBuffer->Release(); - -} - - void RenderSRV(ID3D11ShaderResourceView* srv, float width, float height, float opacity) -{ - - ID3D11DeviceContext* context = SwapchainHook::context; - - - context->OMSetRenderTargets(1, &gRTV, gDSV); - - D3D11_VIEWPORT viewport = {}; - viewport.TopLeftX = 0.0f; - viewport.TopLeftY = 0.0f; - viewport.Width = width; - viewport.Height = height; - viewport.MinDepth = 0.0f; - viewport.MaxDepth = 1.0f; - context->RSSetViewports(1, &viewport); - - ConstantBuffer cb; - cb.screenSize = XMFLOAT2(width, height); - cb.opacity = opacity; - - XMMATRIX orthoMatrix = XMMatrixOrthographicOffCenterLH(0.0f, width, height, 0.0f, 0.0f, 1.0f); - cb.projectionMatrix = XMMatrixTranspose(orthoMatrix); - - context->UpdateSubresource(gConstantBuffer, 0, nullptr, &cb, 0, 0); - - context->VSSetShader(gVertexShader, nullptr, 0); - context->PSSetShader(gPixelShader, nullptr, 0); - context->IASetInputLayout(gInputLayout); - - context->PSSetShaderResources(0, 1, &srv); - context->PSSetSamplers(0, 1, &gSamplerState); - - UINT stride = sizeof(float) * 5; - UINT offset = 0; - context->IASetVertexBuffers(0, 1, &gVertexBuffer, &stride, &offset); - context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - - context->VSSetConstantBuffers(0, 1, &gConstantBuffer); - context->PSSetConstantBuffers(0, 1, &gConstantBuffer); - - context->Draw(4, 0); - - //context->OMSetRenderTargets(1, nullptr, nullptr); -} }; \ No newline at end of file From ed126b10dd1134c0bece8b4f956fba5ac7599cce Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 14 Sep 2024 10:30:08 +0600 Subject: [PATCH 142/240] Numerous fixes & changes, including start of new notifications --- src/Client/Client.cpp | 5 - src/Client/GUI/Engine/Effects/Blur/blur.cpp | 3 - .../Control/ColorPicker/ColorPicker.cpp | 2 +- src/Client/GUI/Engine/Engine.cpp | 213 ++---------------- src/Client/GUI/Engine/Engine.hpp | 4 + src/Client/Hook/Hooks/Render/ResizeHook.cpp | 3 + .../Hook/Hooks/Render/SwapchainHook.cpp | 12 + .../Modules/ClickGUI/ClickGUIRenderer.hpp | 7 +- src/Client/Module/Modules/Module.cpp | 2 +- src/Client/Module/Modules/Module.hpp | 2 +- 10 files changed, 44 insertions(+), 209 deletions(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index be6019a5..5de202bf 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -164,11 +164,6 @@ void Client::initialize() { HookManager::initialize(); ModuleManager::initialize(); Logger::debug("[Client] Ready."); - - if (!Client::disable) { - FlarialGUI::Notify("Click " + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( - "keybind")->value + " to open the menu in-game."); - } } std::string window = "Minecraft"; diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 3950ea8b..a80e675d 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -287,9 +287,6 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe pRasterizerState->Release(); } -std::vector framebuffers; -bool hasDoneFrames = false; - void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) { diff --git a/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp b/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp index c69298b0..58600723 100644 --- a/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp +++ b/src/Client/GUI/Engine/Elements/Control/ColorPicker/ColorPicker.cpp @@ -109,7 +109,7 @@ void FlarialGUI::ColorPicker(const int index, float x, float y, std::string &hex cursorCol.a = FlarialGUI::TextBoxes[index].cursorOpac; - sizes[text] = FlarialGUI::FlarialTextWithFont(x + Constraints::SpacingConstraint(1.35f, s), y * 1.004f, + sizes[text] = FlarialGUI::FlarialTextWithFont(x + Constraints::SpacingConstraint(1.35f, s), y * 1.0025f, FlarialGUI::to_wide(text).c_str(), s * 4.3f, s * 1.1f, DWRITE_TEXT_ALIGNMENT_LEADING, s * 4.0f, DWRITE_FONT_WEIGHT_NORMAL); diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index 0e375c3c..e1805f98 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -1220,21 +1220,6 @@ void FlarialGUI::ResetShit() { } -void FlarialGUI::Notify(const std::string& text) { - - if (SwapchainHook::init && FlarialGUI::writeFactory != nullptr) { - Notification e; - e.text = text; - e.finished = false; - e.currentPos = Constraints::PercentageConstraint(0.01, "right", true); - e.currentPosY = Constraints::PercentageConstraint(0.25, "bottom", true); - e.width = Constraints::RelativeConstraint(0.12f, "height", true); - - notifications.push_back(e); - } - -} - /* rotation stuff */ static int rotation_start_index; @@ -1290,193 +1275,37 @@ void FlarialGUI::PopImClipRect() { ImGui::GetBackgroundDrawList()->PopClipRect(); } -void FlarialGUI::NotifyHeartbeat() { - - - float rectHeight = Constraints::RelativeConstraint(0.10, "height", true); - - float y = Constraints::PercentageConstraint(0.25, "bottom", true); - - Vec2 rounding = Constraints::RoundingConstraint(20, 20); - - int i = 0; - - for (auto ¬if: FlarialGUI::notifications) { - - float rectWidth = notif.width + notif.textSize; - float x = Constraints::PercentageConstraint(0.01, "right", true) - rectWidth; - - FlarialGUI::lerp(notif.currentPosY, y, 0.20f * FlarialGUI::frameFactor); - - if (!notif.arrived) { - - D2D1_ROUNDED_RECT rect = D2D1::RoundedRect( - D2D1::RectF(notif.currentPos, notif.currentPosY, notif.currentPos + rectWidth, - notif.currentPosY + rectHeight), rounding.x, - rounding.x); - - D2D1_COLOR_F col = FlarialGUI::HexToColorF("110F10"); - col.a = 0.60; - - if (!FlarialGUI::inMenu) - FlarialGUI::BlurRect(rect); - FlarialGUI::RoundedRect(notif.currentPos, notif.currentPosY, - col, rectWidth, - rectHeight, rounding.x, rounding.x); - - D2D1_RECT_F cutoutrect = D2D1::RectF(notif.currentPos, notif.currentPosY, notif.currentPos + - Constraints::SpacingConstraint( - 0.0127, - Constraints::RelativeConstraint( - 0.45, "height", - true)), - notif.currentPosY + rectHeight); - - - PushImClipRect(cutoutrect); - D2D::context->PushAxisAlignedClip(cutoutrect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); - - col = colors_primary1_rgb ? rgbColor : colors_primary1; - col.a = o_colors_primary1; - FlarialGUI::RoundedRect(notif.currentPos, notif.currentPosY, - col, rectWidth, - rectHeight, rounding.x, rounding.x); - - D2D::context->PopAxisAlignedClip(); - PopImClipRect(); - - FlarialGUI::PushSize(notif.currentPos, notif.currentPosY, rectWidth, rectHeight); - - float logoX = - Constraints::PercentageConstraint(0.01, "left") - Constraints::SpacingConstraint(0.18, rectHeight); - float logoY = - Constraints::PercentageConstraint(0.01, "top") - Constraints::SpacingConstraint(0.10, rectHeight); - float logoWidth = Constraints::RelativeConstraint(1.25); - - FlarialGUI::image(IDR_LOGO_PNG, - D2D1::RectF(logoX, logoY, logoX + logoWidth, logoY + logoWidth)); - - logoX += Constraints::SpacingConstraint(0.85, logoWidth); - logoY -= Constraints::SpacingConstraint(0.105, logoWidth); - - FlarialGUI::FlarialTextWithFont(logoX, logoY, L"Notification", rectWidth, - logoWidth, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.45, Constraints::RelativeConstraint(0.45, - "height", - true)), - DWRITE_FONT_WEIGHT_BOLD); - - logoY += Constraints::SpacingConstraint(0.185, logoWidth); - - - std::string finalName = FlarialGUI::FlarialTextWithFont(logoX, logoY, FlarialGUI::to_wide(notif.text).c_str(), rectWidth, logoWidth, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(0.3, - Constraints::RelativeConstraint( - 0.45, - "height", - true)), - DWRITE_FONT_WEIGHT_NORMAL); - - notif.textSize = TextSizes[finalName]; - - FlarialGUI::PopSize(); - - FlarialGUI::lerp(notif.currentPos, x - 3, 0.12f * FlarialGUI::frameFactor); - - if (notif.currentPos < x || notif.currentPos == x) { - notif.arrived = true; - notif.time = std::chrono::steady_clock::now(); - } - - i++; - - } else { - - std::chrono::steady_clock::time_point current = std::chrono::steady_clock::now(); - auto timeDifference = std::chrono::duration_cast(current - notif.time); - - if (timeDifference.count() > 5000) { - - FlarialGUI::lerp(notif.currentPos, Constraints::PercentageConstraint(0.01, "right", true) + 50, - 0.12f * FlarialGUI::frameFactor); - - } - - D2D1_ROUNDED_RECT rect = D2D1::RoundedRect( - D2D1::RectF(notif.currentPos, notif.currentPosY, notif.currentPos + rectWidth, - notif.currentPosY + rectHeight), rounding.x, - rounding.x); - - D2D1_COLOR_F col = FlarialGUI::HexToColorF("110F10"); - col.a = 0.60; - - if (!FlarialGUI::inMenu) - FlarialGUI::BlurRect(rect); - FlarialGUI::RoundedRect(notif.currentPos, notif.currentPosY, - col, rectWidth, - rectHeight, rounding.x, rounding.x); - - D2D1_RECT_F cutoutrect = D2D1::RectF(notif.currentPos, notif.currentPosY, notif.currentPos + - Constraints::SpacingConstraint( - 0.0127, - Constraints::RelativeConstraint( - 0.45, "height", - true)), - notif.currentPosY + rectHeight); - - PushImClipRect(cutoutrect); - D2D::context->PushAxisAlignedClip(cutoutrect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); - - col = colors_primary1_rgb ? rgbColor : colors_primary1; - col.a = o_colors_primary1; - FlarialGUI::RoundedRect(notif.currentPos, notif.currentPosY, - col, rectWidth, - rectHeight, rounding.x, rounding.x); - - D2D::context->PopAxisAlignedClip(); - PopImClipRect(); - - FlarialGUI::PushSize(notif.currentPos, notif.currentPosY, rectWidth, rectHeight); - - float logoX = - Constraints::PercentageConstraint(0.01, "left") - Constraints::SpacingConstraint(0.18, rectHeight); - float logoY = - Constraints::PercentageConstraint(0.01, "top") - Constraints::SpacingConstraint(0.10, rectHeight); - float logoWidth = Constraints::RelativeConstraint(1.25); +void FlarialGUI::Notify(const std::string& text) { - FlarialGUI::image(IDR_LOGO_PNG, - D2D1::RectF(logoX, logoY, logoX + logoWidth, logoY + logoWidth)); + if(SwapchainHook::init) { + Notification e; + e.text = text; + e.finished = false; + e.currentPos = Constraints::CenterConstraint(0, 0).x; + e.currentPosY = Constraints::PercentageConstraint(0.25, "bottom", true); + std::string sizeName = FlarialGUI::FlarialTextWithFont(e.currentPos, e.currentPosY, FlarialGUI::to_wide(e.text).c_str(), 10000, 25, DWRITE_TEXT_ALIGNMENT_CENTER, Constraints::RelativeConstraint(0.15, "height", true), DWRITE_FONT_WEIGHT_NORMAL, D2D1::ColorF(0, 0, 0 ,0)); + e.width = FlarialGUI::TextSizes[sizeName]; - logoX += Constraints::SpacingConstraint(0.85, logoWidth); + notifications.push_back(e); + } - logoY -= Constraints::SpacingConstraint(0.105, logoWidth); +} - FlarialGUI::FlarialTextWithFont(logoX, logoY, L"Notification", rectWidth, - logoWidth, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.45, Constraints::RelativeConstraint(0.45, - "height", - true)), - DWRITE_FONT_WEIGHT_BOLD); +void FlarialGUI::NotifyHeartbeat() { - logoY += Constraints::SpacingConstraint(0.185, logoWidth); - std::string finalName = FlarialGUI::FlarialTextWithFont(logoX, logoY, FlarialGUI::to_wide(notif.text).c_str(), rectWidth, logoWidth, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(0.3, - Constraints::RelativeConstraint( - 0.45, - "height", - true)), - DWRITE_FONT_WEIGHT_NORMAL); + // if i dont do this i get a unresolved externals error???? + float funnyTroll = 1.f; + FlarialGUI::lerp(funnyTroll, 40.f,0.12f * FlarialGUI::frameFactor); + // end of torll - notif.textSize = TextSizes[finalName]; - FlarialGUI::PopSize(); - if (notif.currentPos > Constraints::PercentageConstraint(0.01, "right", true)) notif.finished = true; - } + for(Notification& n : notifications) { - y -= Constraints::SpacingConstraint(1.25, rectHeight); - if (notif.finished) FlarialGUI::notifications.erase(std::next(FlarialGUI::notifications.begin(), i)); + FlarialGUI::RoundedRect(n.currentPos, n.currentPosY, FlarialGUI::HexToColorF("ff2438"), n.width, 25); + FlarialGUI::FlarialTextWithFont(n.currentPos, n.currentPosY, FlarialGUI::to_wide(n.text).c_str(), n.width, 25, DWRITE_TEXT_ALIGNMENT_CENTER, Constraints::RelativeConstraint(0.15, "height", true), DWRITE_FONT_WEIGHT_NORMAL); } + } void FlarialGUI::CopyBitmap(ID2D1Bitmap1 *from, ID2D1Bitmap **to) { diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index cf2e9b21..ff612ce5 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -54,6 +54,10 @@ class Blur static void RenderToRTV(ID3D11RenderTargetView *, ID3D11ShaderResourceView *, XMFLOAT2); + static inline std::vector framebuffers; + + static inline bool hasDoneFrames = false; + static void RenderBlur(ID3D11RenderTargetView *, int, float); }; diff --git a/src/Client/Hook/Hooks/Render/ResizeHook.cpp b/src/Client/Hook/Hooks/Render/ResizeHook.cpp index 55722695..00c32b03 100644 --- a/src/Client/Hook/Hooks/Render/ResizeHook.cpp +++ b/src/Client/Hook/Hooks/Render/ResizeHook.cpp @@ -52,6 +52,9 @@ void ResizeHook::cleanShit(bool isResize) { Memory::SafeRelease(SwapchainHook::stageTex); Memory::SafeRelease(SwapchainHook::SavedD3D11BackBuffer); + Blur::hasDoneFrames = false; + for(ID3D11Texture2D* tex : Blur::framebuffers){ Memory::SafeRelease(tex); Blur::framebuffers.clear();} + for (auto &i: ClickGUIElements::images) { Memory::SafeRelease(i.second); } diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index c480214c..d28bf21b 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -26,6 +26,7 @@ ID3D12CommandQueue *SwapchainHook::queue = nullptr; bool initImgui = false; bool allfontloaded = false; +bool first = false; static std::chrono::high_resolution_clock fpsclock; static std::chrono::steady_clock::time_point start = std::chrono::high_resolution_clock::now(); @@ -157,6 +158,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI } + /* INIT END */ /* RENDERING START */ @@ -347,6 +349,11 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI //BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); EventHandler::onRender(event); + if(!first) + FlarialGUI::Notify("Click " + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( + "keybind")->value + " to open the menu in-game."); + else first = true; + D2D::context->EndDraw(); @@ -437,6 +444,11 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI event.RTV = mainRenderTargetView; EventHandler::onRender(event); + if(!first) + FlarialGUI::Notify("Click " + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( + "keybind")->value + " to open the menu in-game."); + else first = true; + D2D::context->EndDraw(); ImGui::EndFrame(); diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index acf0d9e7..4ea032f2 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -91,11 +91,6 @@ class ClickGUIRenderer : public Listener { D2D1::RectF(allahuakbar.x, allahuakbar.y, allahuakbar.x + allahu, allahuakbar.y + akbar)); - if (ClientInstance::getTopScreenName() != "hud_screen") { - FlarialGUI::NotifyHeartbeat(); - return; - } - if (FlarialGUI::scrollposmodifier == 0) { FlarialGUI::scrollposmodifier = Constraints::RelativeConstraint(0.1f); } @@ -818,8 +813,8 @@ class ClickGUIRenderer : public Listener { } FlarialGUI::PopSize(); // Pops base rect } - FlarialGUI::NotifyHeartbeat(); FlarialGUI::displayToolTips(); + FlarialGUI::NotifyHeartbeat(); } void onKey(KeyEvent &event) override { diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 2a610e8a..128343ba 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -195,7 +195,7 @@ void Module::resetPadding() { toggleIndex = 0; dropdownIndex = 0; sliderIndex = 0; - colorPickerIndex = 0; + colorPickerIndex = 100; keybindIndex = 0; textboxIndex = 0; } diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index 6f4c6399..8ed8ab07 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -48,7 +48,7 @@ class Module { int dropdownIndex = 0; int textboxIndex = 0; int keybindIndex = 0; - int colorPickerIndex = 0; + int colorPickerIndex = 100; void resetPadding(); void extraPadding(); From 3e33081ac72544323b8531839911db4d5c9ad647 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 14 Sep 2024 16:57:15 +0600 Subject: [PATCH 143/240] new notifications done (i am done) --- .../Engine/Elements/Structs/Notification.hpp | 1 + src/Client/GUI/Engine/Engine.cpp | 58 ++++++++++++++++--- .../Hook/Hooks/Render/SwapchainHook.cpp | 17 ++++-- .../Module/Modules/ArmorHUD/ArmorHUD.hpp | 6 +- 4 files changed, 66 insertions(+), 16 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Structs/Notification.hpp b/src/Client/GUI/Engine/Elements/Structs/Notification.hpp index f863e294..d02b5286 100644 --- a/src/Client/GUI/Engine/Elements/Structs/Notification.hpp +++ b/src/Client/GUI/Engine/Elements/Structs/Notification.hpp @@ -11,5 +11,6 @@ class Notification { bool arrived = false; float width = 0; float textSize = 0; + bool firstTime = true; std::chrono::steady_clock::time_point time = std::chrono::steady_clock::now(); }; diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index e1805f98..21521d31 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -1281,10 +1281,9 @@ void FlarialGUI::Notify(const std::string& text) { Notification e; e.text = text; e.finished = false; - e.currentPos = Constraints::CenterConstraint(0, 0).x; - e.currentPosY = Constraints::PercentageConstraint(0.25, "bottom", true); - std::string sizeName = FlarialGUI::FlarialTextWithFont(e.currentPos, e.currentPosY, FlarialGUI::to_wide(e.text).c_str(), 10000, 25, DWRITE_TEXT_ALIGNMENT_CENTER, Constraints::RelativeConstraint(0.15, "height", true), DWRITE_FONT_WEIGHT_NORMAL, D2D1::ColorF(0, 0, 0 ,0)); - e.width = FlarialGUI::TextSizes[sizeName]; + e.currentPosY = MC::windowSize.y; + e.arrived = false; + e.finished = false; notifications.push_back(e); } @@ -1299,13 +1298,58 @@ void FlarialGUI::NotifyHeartbeat() { // end of torll + Vec2 round = Constraints::RoundingConstraint(20, 20); + float height = Constraints::RelativeConstraint(0.035, "height", true); + float posxModif = 0; + float fontSize = Constraints::RelativeConstraint(0.128, "height", true); + float textposyModif = Constraints::RelativeConstraint(0.0045f, "height", true); + int i = 0; for(Notification& n : notifications) { - FlarialGUI::RoundedRect(n.currentPos, n.currentPosY, FlarialGUI::HexToColorF("ff2438"), n.width, 25); - FlarialGUI::FlarialTextWithFont(n.currentPos, n.currentPosY, FlarialGUI::to_wide(n.text).c_str(), n.width, 25, DWRITE_TEXT_ALIGNMENT_CENTER, Constraints::RelativeConstraint(0.15, "height", true), DWRITE_FONT_WEIGHT_NORMAL); - } + float posyModif = -((height + Constraints::RelativeConstraint(0.009f, "height", true)) * i); + + if(n.firstTime) { + float TrollSize = Constraints::RelativeConstraint(0.1385, "height", true); + std::string sizeName = FlarialGUI::FlarialTextWithFont(n.currentPos, n.currentPosY, FlarialGUI::to_wide(n.text).c_str(), 10, 25, DWRITE_TEXT_ALIGNMENT_CENTER, TrollSize, DWRITE_FONT_WEIGHT_NORMAL, D2D1::ColorF(0, 0, 0 ,0)); + n.width = FlarialGUI::TextSizes[sizeName] * 1.003; + n.currentPos = Constraints::CenterConstraint(n.width, 0).x; + n.firstTime = false; + } + + if(!n.finished) { + if(!n.arrived) { + + FlarialGUI::RoundedRect(n.currentPos, n.currentPosY + posyModif, FlarialGUI::HexToColorF("ff2438"), n.width, height, round.x, round.x); + FlarialGUI::FlarialTextWithFont(n.currentPos + posxModif, n.currentPosY + posyModif + textposyModif, FlarialGUI::to_wide(n.text).c_str(), n.width, 25, DWRITE_TEXT_ALIGNMENT_CENTER, fontSize, DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::lerp(n.currentPosY, Constraints::PercentageConstraint(0.1f, "bottom", true), FlarialGUI::frameFactor * 0.067f); + + if(n.currentPosY <= Constraints::PercentageConstraint(0.08f, "bottom", true)) { + n.arrived = true; + n.time = std::chrono::steady_clock::now(); + } + + i++; + } else { + + std::chrono::steady_clock::time_point current = std::chrono::steady_clock::now(); + auto timeDifference = std::chrono::duration_cast(current - n.time); + + FlarialGUI::RoundedRect(n.currentPos, n.currentPosY + posyModif, FlarialGUI::HexToColorF("ff2438"), n.width, height, round.x, round.x); + FlarialGUI::FlarialTextWithFont(n.currentPos + posxModif, n.currentPosY + posyModif + textposyModif, FlarialGUI::to_wide(n.text).c_str(), n.width, 25, DWRITE_TEXT_ALIGNMENT_CENTER, fontSize, DWRITE_FONT_WEIGHT_NORMAL); + + if (timeDifference.count() > 5000) { + FlarialGUI::lerp(n.currentPosY, MC::windowSize.y + 500, FlarialGUI::frameFactor * 0.052f); + if(n.currentPosY >= MC::windowSize.y) { n.finished = true; } + } + + i++; + } + } else { + FlarialGUI::notifications.erase(std::next(FlarialGUI::notifications.begin(), i)); + } + } } void FlarialGUI::CopyBitmap(ID2D1Bitmap1 *from, ID2D1Bitmap **to) { diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index d28bf21b..eab0dbb7 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -349,10 +349,12 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI //BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); EventHandler::onRender(event); - if(!first) - FlarialGUI::Notify("Click " + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( - "keybind")->value + " to open the menu in-game."); - else first = true; + if(!first) { + FlarialGUI::Notify("Click " + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( + "keybind")->value + " to open the menu in-game."); + FlarialGUI::Notify("Join our discord! https://flarial.xyz/discord"); + first = true; + } D2D::context->EndDraw(); @@ -444,10 +446,13 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI event.RTV = mainRenderTargetView; EventHandler::onRender(event); - if(!first) + if(!first && SwapchainHook::init && ModuleManager::getModule("ClickGUI")) { FlarialGUI::Notify("Click " + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( "keybind")->value + " to open the menu in-game."); - else first = true; + + FlarialGUI::Notify("Join our discord! https://flarial.xyz/discord"); + first = true; + } D2D::context->EndDraw(); diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp index 8bcc6e95..94d5fe5d 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp @@ -16,9 +16,9 @@ class ArmorHUD : public Module { void onEnable() override { EventHandler::registerListener(new ArmorHUDListener("ArmorHUD", this)); if(FlarialGUI::inMenu){ - FlarialGUI::Notify("To change the position of ArmorHUD, Please click " + - ModuleManager::getModule("ClickGUI")->settings.getSettingByName( - "editmenubind")->value + " in the settings tab."); + std::string s = "To change the position of ArmorHUD, Please click " + ModuleManager::getModule("ClickGUI")->settings.getSettingByName("editmenubind")->value + " in the settings tab."; + std::cout << s << std::endl; + FlarialGUI::Notify(s); } Module::onEnable(); } From b1350507009a7973893f5812fb63822836a2bf8c Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 14 Sep 2024 17:55:10 +0600 Subject: [PATCH 144/240] base settings page --- .../Modules/ClickGUI/ClickGUIRenderer.hpp | 302 +++--------------- .../Modules/ComboCounter/ComboCounter.hpp | 3 +- 2 files changed, 48 insertions(+), 257 deletions(-) diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 4ea032f2..4b752199 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -62,6 +62,7 @@ struct PageType { class ClickGUIRenderer : public Listener { Module *module; + Module *ghostMainModule; float baseHeightReal = 1.0f; float baseHeightActual = 0.00001f; float realBlurAmount = 0.00001f; @@ -441,38 +442,29 @@ class ClickGUIRenderer : public Listener { //FlarialGUI::ShadowRect(Vec2{center.x, center.y}, Vec2{baseWidth, Constraints::RelativeConstraint(baseHeightReal, "height", true)}, FlarialGUI::HexToColorF("120e0f"), baseRound.x, 100); } else if (e == "settings") { + FlarialGUI::PushSize(center.x, center.y, baseWidth, baseHeight); - float rectX = Constraints::PercentageConstraint(0.01, "left"); - float rectY = Constraints::PercentageConstraint(0.20, "top"); + float rectX = Constraints::PercentageConstraint(0.015, "left"); + float rectY = Constraints::PercentageConstraint(0.167, "top"); float rectWidth = Constraints::RelativeConstraint(0.965, "width"); - float rectHeight = Constraints::RelativeConstraint(0.6); - - float scrollWidth = Constraints::RelativeConstraint(1.12); - float scrollHeight = Constraints::RelativeConstraint(1.3); - Vec2 scrollcenter = Constraints::CenterConstraint(scrollWidth, scrollHeight, "y", 0.0, 1); - - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - round = Constraints::RoundingConstraint(50, 50); + float rectHeight = Constraints::RelativeConstraint(0.85); + round = Constraints::RoundingConstraint(38.f, 38.5f); - float anotherRectHeight = Constraints::RelativeConstraint(0.6); - float anotherRectWidth = Constraints::RelativeConstraint(0.981, "width"); + float anotherRectHeight = Constraints::RelativeConstraint(0.8105); + float anotherRectWidth = Constraints::RelativeConstraint(0.972, "width"); - D2D1_COLOR_F iRanOutOfNamesToCallTheseColors = colors_secondary2_rgb ? FlarialGUI::rgbColor - : colors_secondary2; - iRanOutOfNamesToCallTheseColors.a = o_colors_secondary2; + D2D1_COLOR_F colorThing = colors_secondary2_rgb ? FlarialGUI::rgbColor : colors_secondary2; + colorThing.a = o_colors_secondary2; - FlarialGUI::RoundedRect(rectX, rectY, iRanOutOfNamesToCallTheseColors, anotherRectWidth, - anotherRectHeight, round.x, round.x); + FlarialGUI::RoundedRect(rectX, rectY, colorThing, + anotherRectWidth, anotherRectHeight, round.x, round.x); - D2D1_COLOR_F wtfCol = colors_secondary1_rgb ? FlarialGUI::rgbColor : colors_secondary1; - wtfCol.a = o_colors_secondary1; + D2D1_COLOR_F bruv = colors_secondary1_rgb ? FlarialGUI::rgbColor : colors_secondary1; + bruv.a = o_colors_secondary1; - round = Constraints::RoundingConstraint(45, 45); - FlarialGUI::RoundedRect(rectX + Constraints::SpacingConstraint(0.0085, rectWidth), - rectY + Constraints::SpacingConstraint(0.01, rectWidth), wtfCol, rectWidth, - rectHeight, round.x, round.x); + D2D1_COLOR_F textCol = colors_text_rgb ? FlarialGUI::rgbColor : colors_text; + textCol.a = o_colors_text; FlarialGUI::PopSize(); @@ -480,252 +472,51 @@ class ClickGUIRenderer : public Listener { rectY + Constraints::SpacingConstraint(0.01, rectWidth), rectWidth, rectHeight); - rectX = Constraints::PercentageConstraint(0.019, "left"); - - FlarialGUI::ScrollBar(scrollWidth, scrollHeight, 270, 1000, 2); - FlarialGUI::SetScrollView(rectX, rectY + Constraints::SpacingConstraint(0.01, rectWidth), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0, "height")); - - rectY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::TextBoxVisual(1, Client::settings.getSettingByName("fontname")->value, 26, - rectX, rectY, "Click GUI Font (Anything installed in your system)"); - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::TextBoxVisual(2, Client::settings.getSettingByName("mod_fontname")->value, - 26, rectX, rectY, "Modules Font (Anything installed in your system)"); - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::Dropdown(0, rectX, rectY, - std::vector{"Default", "Cleartype", "Grayscale", "Aliased"}, - Client::settings.getSettingByName("aliasingMode")->value, - "Text Aliasing"); - FlarialGUI::SetIsInAdditionalYMode(); - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(rectX, rectY, L"Eject keybind", - textWidth * 1.69f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::KeybindSelector(0, rectX + FlarialGUI::SettingsTextWidth("Eject keybind "), rectY, - Client::settings.getSettingByName("ejectKeybind")->value); - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(rectX, rectY, L"Blur Intensity", - textWidth * 1.69f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - float percent = FlarialGUI::Slider(7, rectX + FlarialGUI::SettingsTextWidth("Blur Intensity "), - rectY, Client::settings.getSettingByName( - "blurintensity")->value, 25); - - Client::settings.getSettingByName("blurintensity")->value = percent; - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(rectX, rectY, L"Chroma Speed", - textWidth * 1.69f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, rectX + FlarialGUI::SettingsTextWidth("Chroma Speed "), - rectY, Client::settings.getSettingByName( - "rgb_speed")->value, 10); - - Client::settings.getSettingByName("rgb_speed")->value = percent; - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(rectX, rectY, L"Chroma Saturation", - textWidth * 1.69f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(9, rectX + FlarialGUI::SettingsTextWidth("Chroma Saturation "), - rectY, Client::settings.getSettingByName( - "rgb_saturation")->value, 1); - - Client::settings.getSettingByName("rgb_saturation")->value = percent; - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(rectX, rectY, L"Chroma Value", - textWidth * 1.69f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(10, rectX + FlarialGUI::SettingsTextWidth("Chroma Value "), - rectY, Client::settings.getSettingByName( - "rgb_value")->value, 1); + Module* c = this->ghostMainModule; - Client::settings.getSettingByName("rgb_value")->value = percent; - rectY += Constraints::SpacingConstraint(0.35, textWidth); + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - if (FlarialGUI::Toggle(0, rectX, rectY, - Client::settings.getSettingByName("killdx")->value)) { - Client::settings.getSettingByName( - "killdx")->value = !Client::settings.getSettingByName("killdx")->value; - } - - - FlarialGUI::FlarialTextWithFont(rectX + Constraints::SpacingConstraint(1.2f, textWidth / 2.0f), - rectY, - L"Better Frames (No RTX) (Restart required)", - Constraints::SpacingConstraint(4.5, textWidth), textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(1, rectX, rectY, - Client::settings.getSettingByName("vsync")->value)) { - - Client::settings.getSettingByName( - "vsync")->value = !Client::settings.getSettingByName("vsync")->value; - } - - FlarialGUI::FlarialTextWithFont(rectX + Constraints::SpacingConstraint(0.60, textWidth), rectY, - L"Vsync Disabler (Experimental)", - Constraints::SpacingConstraint(4.5, textWidth), textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(9, rectX, rectY, - Client::settings.getSettingByName("disableanims")->value)) { - - Client::settings.getSettingByName( - "disableanims")->value = !Client::settings.getSettingByName( - "disableanims")->value; - } - FlarialGUI::FlarialTextWithFont(rectX + Constraints::SpacingConstraint(0.60, textWidth), rectY, - L"Disable Animations", - Constraints::SpacingConstraint(4.5, textWidth), textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(2, rectX, rectY, - Client::settings.getSettingByName("watermark")->value)) { - - Client::settings.getSettingByName( - "watermark")->value = !Client::settings.getSettingByName("watermark")->value; - } - FlarialGUI::FlarialTextWithFont(rectX + Constraints::SpacingConstraint(0.60, textWidth), rectY, - L"Watermark In Inventories", - Constraints::SpacingConstraint(4.5, textWidth), textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(8, rectX, rectY, - Client::settings.getSettingByName("enabledModulesOnTop")->value)) { - - Client::settings.getSettingByName( - "enabledModulesOnTop")->value = !Client::settings.getSettingByName( - "enabledModulesOnTop")->value; - } - FlarialGUI::FlarialTextWithFont(rectX + Constraints::SpacingConstraint(0.60, textWidth), rectY, - L"Enabled Modules on Top", - Constraints::SpacingConstraint(4.5, textWidth), textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(7, rectX, rectY, - Client::settings.getSettingByName("centreCursor")->value)) { - - Client::settings.getSettingByName( - "centreCursor")->value = !Client::settings.getSettingByName( - "centreCursor")->value; - } - - FlarialGUI::FlarialTextWithFont(rectX + Constraints::SpacingConstraint(0.60, textWidth), rectY, - L"Centre Cursor", - Constraints::SpacingConstraint(4.5, textWidth), textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(3, rectX, rectY, - Client::settings.getSettingByName("dlassets")->value)) { - - Client::settings.getSettingByName( - "dlassets")->value = !Client::settings.getSettingByName("dlassets")->value; - } + FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(rectX + Constraints::SpacingConstraint(0.60, textWidth), rectY, - L"Re-Download Assets Every Restart", - Constraints::SpacingConstraint(4.5, textWidth), textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); + c->addHeader("Fonts"); + c->addTextBox("ClickGUI", "", Client::settings.getSettingByName("fontname")->value); + c->addTextBox("Modules", "", Client::settings.getSettingByName("mod_fontname")->value); - rectY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(4, rectX, rectY, - Client::settings.getSettingByName("noicons")->value)) { + c->extraPadding(); - Client::settings.getSettingByName( - "noicons")->value = !Client::settings.getSettingByName("noicons")->value; - } + c->addHeader("Rendering"); + c->addToggle("Better Frames", "RTX Disabled, Restart Required.", Client::settings.getSettingByName("killdx")->value); + c->addToggle("V-SYNC Disabler", "(Sometimes) Only works with Better Frames.", Client::settings.getSettingByName("vsync")->value); + c->addToggle("Disable Animations", "", Client::settings.getSettingByName("disableanims")->value); + c->addSlider("UI Blur Intensity", "", Client::settings.getSettingByName("blurintensity")->value, 25.f); + c->addSlider("Chroma / RGB Speed", "", Client::settings.getSettingByName("rgb_speed")->value, 10.f); + c->addSlider("Chroma / RGB Saturation", "", Client::settings.getSettingByName("rgb_saturation")->value, 1.f); + c->addSlider("Chroma / RGB Value", "", Client::settings.getSettingByName("rgb_value")->value, 1.f); + c->addToggle("Inventory Watermark", "", Client::settings.getSettingByName("watermark")->value); + c->addToggle("Enabled Modules on Top", "", Client::settings.getSettingByName("enabledModulesOnTop")->value); + c->addToggle("No UI Icons / Images", "Flarial only", Client::settings.getSettingByName("noicons")->value); + c->addToggle("Disable UI Shadows", "Flarial only", Client::settings.getSettingByName("noshadows")->value); - FlarialGUI::FlarialTextWithFont(rectX + Constraints::SpacingConstraint(0.60, textWidth), rectY, - L"No Icons", Constraints::SpacingConstraint(4.5, textWidth), - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); + c->extraPadding(); - rectY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(5, rectX, rectY, - Client::settings.getSettingByName("noshadows")->value)) { + c->addHeader("Misc"); + c->addToggle("Center Cursor", "Centers your cursor everytime you open your inventory, etc.", Client::settings.getSettingByName("centreCursor")->value); + c->addToggle("Anonymous on API", "Stay anonymous on Flarial's API.", Client::settings.getSettingByName("anonymousApi")->value); - Client::settings.getSettingByName( - "noshadows")->value = !Client::settings.getSettingByName("noshadows")->value; - } + c->resetPadding(); - FlarialGUI::FlarialTextWithFont(rectX + Constraints::SpacingConstraint(0.60, textWidth), rectY, - L"No Shadows", Constraints::SpacingConstraint(4.5, textWidth), - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - rectY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(rectX + Constraints::SpacingConstraint(0.60, textWidth), rectY, - L"Anonymous Telemetry", - Constraints::SpacingConstraint(4.5, textWidth), textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(6, rectX, rectY, - Client::settings.getSettingByName("anonymousApi")->value)) { - - Client::settings.getSettingByName( - "anonymousApi")->value = !Client::settings.getSettingByName( - "anonymousApi")->value; - } - - FlarialGUI::UnSetIsInAdditionalYMode(); FlarialGUI::UnsetScrollView(); FlarialGUI::PopSize(); - } + } /* Mod Card End */ } else if (ClickGUIRenderer::page.type == "settings") { @@ -943,6 +734,7 @@ class ClickGUIRenderer : public Listener { explicit ClickGUIRenderer(const char string[5], Module *emodule) { this->name = string; this->module = emodule; + this->ghostMainModule = new Module("main", "troll", IDR_COMBO_PNG, ""); ClickGUIRenderer::curr = "modules"; } diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index 778f471f..491683c3 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -50,7 +50,6 @@ class ComboCounter : public Module { this->addToggle("Border", "", settings.getSettingByName("border")->value); this->addConditionalSlider(settings.getSettingByName("border")->value, "Border Width", "", settings.getSettingByName("borderWidth")->value, 4.f); this->addSlider("Rounding", "", this->settings.getSettingByName("rounding")->value); - this->addToggle("Translucency", "", this->settings.getSettingByName("BlurEffect")->value); this->addToggle("Responsive Rectangle", "Resizes width with text", this->settings.getSettingByName("responsivewidth")->value); this->addSlider("Rotation", "", this->settings.getSettingByName("rotation")->value, 359.f, 0.f, false); this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value, 3.f); @@ -66,7 +65,7 @@ class ComboCounter : public Module { this->addToggle("Reverse Padding Y", "", this->settings.getSettingByName("reversepaddingy")->value); this->addSlider("Padding X", "", this->settings.getSettingByName("padx")->value, 1.f, 0.f, false); this->addSlider("Padding Y", "", this->settings.getSettingByName("pady")->value, 1.f, 0.f, false); - + this->extraPadding(); this->addHeader("Colors"); From 6f1fba2c52543c84343db2ea26e13bdb5dc6cb85 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 14 Sep 2024 20:12:03 +0600 Subject: [PATCH 145/240] simple crash fix --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index eab0dbb7..db24d019 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -349,7 +349,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI //BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); EventHandler::onRender(event); - if(!first) { + if(!first && SwapchainHook::init && ModuleManager::getModule("ClickGUI")) { FlarialGUI::Notify("Click " + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( "keybind")->value + " to open the menu in-game."); FlarialGUI::Notify("Join our discord! https://flarial.xyz/discord"); From bbf98d209005d349565cb9e6e5a97ea50436961b Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 15 Sep 2024 14:23:42 +0600 Subject: [PATCH 146/240] a smoother animation on close --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 2 +- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 1 + src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index a80e675d..a71d851c 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -290,7 +290,7 @@ void Blur::RenderToRTV(ID3D11RenderTargetView *pRenderTargetView, ID3D11ShaderRe void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iterations, float intensity) { - if(intensity < 1) return; + if(intensity < 0) return; if (!SwapchainHook::GetBackbuffer()) return; diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index db24d019..5cbdfb5e 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -644,6 +644,7 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() } void SwapchainHook::SaveBackbuffer() { + if(!SwapchainHook::queue) { Memory::SafeRelease(SavedD3D11BackBuffer); diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 4b752199..fe44ab11 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -63,7 +63,7 @@ struct PageType { class ClickGUIRenderer : public Listener { Module *module; Module *ghostMainModule; - float baseHeightReal = 1.0f; + float baseHeightReal = 0.f; float baseHeightActual = 0.00001f; float realBlurAmount = 0.00001f; float radioPushAmount1 = 0.0000001f; @@ -104,7 +104,7 @@ class ClickGUIRenderer : public Listener { } else { - FlarialGUI::lerp(baseHeightReal, 0.01f, 0.22f * floorf(FlarialGUI::frameFactor * 100.0f) / 100.0f); + FlarialGUI::lerp(baseHeightReal, 0.0001f, 0.22f * floorf(FlarialGUI::frameFactor * 100.0f) / 100.0f); FlarialGUI::lerp(baseHeightActual, 0.00001f, 0.30f * floorf(FlarialGUI::frameFactor * 100.0f) / 100.0f); FlarialGUI::lerp(realBlurAmount, 0.00001f, 0.15f * FlarialGUI::frameFactor); @@ -112,7 +112,7 @@ class ClickGUIRenderer : public Listener { } - if (SwapchainHook::init && baseHeightActual > 0.1) { + if (SwapchainHook::init && baseHeightActual > 0.01) { /* Base Rectangle Start */ From dd6d9584e094b6501189c3919822b5303db7199d Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 15 Sep 2024 14:48:31 +0600 Subject: [PATCH 147/240] addKeybind --- .../Control/KeybindSelector/KeybindSelector.cpp | 9 +++------ .../Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 5 +++++ .../Module/Modules/ItemPhysics/ItemPhysics.hpp | 6 +++--- .../Modules/ItemPhysics/ItemPhysicsListener.cpp | 6 +++--- src/Client/Module/Modules/Module.cpp | 12 ++++++++++++ src/Client/Module/Modules/Module.hpp | 3 +++ 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/KeybindSelector/KeybindSelector.cpp b/src/Client/GUI/Engine/Elements/Control/KeybindSelector/KeybindSelector.cpp index 3ffc31ee..9da50046 100644 --- a/src/Client/GUI/Engine/Elements/Control/KeybindSelector/KeybindSelector.cpp +++ b/src/Client/GUI/Engine/Elements/Control/KeybindSelector/KeybindSelector.cpp @@ -92,16 +92,13 @@ void FlarialGUI::KeybindSelector(const int index, float x, float y, std::string if (isAdditionalY) UnSetIsInAdditionalYMode(); FlarialGUI::RoundedRect(x, y, KeybindSelectors[index].curColor, percWidth, percHeight, round.x, round.x); + if(text != "" & text != " ") FlarialGUI::FlarialTextWithFont(x, y, FlarialGUI::to_wide(text).c_str(), percWidth, percHeight, DWRITE_TEXT_ALIGNMENT_CENTER, textWidth, DWRITE_FONT_WEIGHT_NORMAL); + else FlarialGUI::FlarialTextWithFont(x, y, L"unset", percWidth, percHeight, + DWRITE_TEXT_ALIGNMENT_CENTER, textWidth, DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::FlarialTextWithFont(x + Constraints::SpacingConstraint(1.25, textWidth / 2.0f), y, - L"Keybind (Hold for 2 seconds)", - Constraints::SpacingConstraint(6.9f, textWidth), percHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, textWidth, - DWRITE_FONT_WEIGHT_NORMAL); - if (isAdditionalY) SetIsInAdditionalYMode(); if (isInScrollView) y += scrollpos; diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index fe44ab11..ea8e013e 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -486,6 +486,11 @@ class ClickGUIRenderer : public Listener { Constraints::RelativeConstraint(1.0, "width"), Constraints::RelativeConstraint(0.88f, "height")); + c->addHeader("Keybinds"); + c->addKeybind("Eject Keybind", "When setting, hold the new bind for 2 seconds", Client::settings.getSettingByName("ejectKeybind")->value); + + c->extraPadding(); + c->addHeader("Fonts"); c->addTextBox("ClickGUI", "", Client::settings.getSettingByName("fontname")->value); c->addTextBox("Modules", "", Client::settings.getSettingByName("mod_fontname")->value); diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp index c0cf5b64..9ab6dfc8 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysics.hpp @@ -8,12 +8,12 @@ class ItemPhysics : public Module { public: ItemPhysicsListener* listener = nullptr; - ItemPhysics() : Module("ItemPhysics", "Changes rotation behavior of dropped items", IDR_ITEM_PHYSICS_PNG, "") { + ItemPhysics() : Module("Item Physics", "Changes rotation behavior of dropped items", IDR_ITEM_PHYSICS_PNG, "") { Module::setup(); } void onEnable() override { - listener = new ItemPhysicsListener("ItemPhysics", this); + listener = new ItemPhysicsListener("Item Physics", this); EventHandler::registerListener(listener); @@ -26,7 +26,7 @@ class ItemPhysics : public Module { if (listener != nullptr) listener->onDisable(); - EventHandler::unregisterListener("ItemPhysics"); + EventHandler::unregisterListener("Item Physics"); delete listener; diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp index 64e1a8c9..3c096cb7 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp @@ -48,7 +48,7 @@ void ItemPhysicsListener::ItemRenderer_render(ItemRenderer* _this, BaseActorRend using func_t = void(*)(ItemRenderer*, BaseActorRenderContext*, ActorRenderData*); static auto oFunc = reinterpret_cast(ItemRenderer_renderHook->trampoline); - static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); + static auto mod = reinterpret_cast(ModuleManager::getModule("Item Physics")); mod->listener->renderData = renderData; oFunc(_this, renderCtx, renderData); @@ -59,7 +59,7 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo using glm_rotate_t = void(__fastcall*)(glm::mat4x4&, float, float, float, float); static auto glm_rotate = reinterpret_cast(rotateSig); - static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); + static auto mod = reinterpret_cast(ModuleManager::getModule("Item Physics")); const auto renderData = mod->listener->renderData; if (renderData == nullptr) return; @@ -126,7 +126,7 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo void ItemPhysicsListener::onSetupAndRender(SetupAndRenderEvent& event) { - static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); + static auto mod = reinterpret_cast(ModuleManager::getModule("Item Physics")); if (!mod->isEnabled()) return; const auto player = SDK::clientInstance->getLocalPlayer(); diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 128343ba..30f1fbad 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -319,6 +319,18 @@ void Module::addToggle(std::string text, std::string subtext, bool& value) { toggleIndex++; } +void Module::addKeybind(std::string text, std::string subtext, std::string& keybind) { + float elementX = Constraints::PercentageConstraint(0.13f, "right"); + float y = Constraints::PercentageConstraint(0.10, "top") + padding; + + FlarialGUI::KeybindSelector(keybindIndex, elementX, y, keybind); + + Module::addElementText(text, subtext); + + padding += Constraints::RelativeConstraint(0.05f, "height", true); + keybindIndex++; +} + void Module::loadDefaults() { settings.reset(); setup(); diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index 8ed8ab07..05897ed1 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -57,6 +57,9 @@ class Module { void addConditionalSlider(bool condition, std::string text, std::string subtext, float& value, float maxVal = 100.0f, float minVal = 0.0f, bool zerosafe = true); void addSlider(std::string text, std::string subtext, float& value, float maxVal = 100.0f, float minVal = 0.0f, bool zerosafe = true); void addToggle(std::string text, std::string subtext, bool& value); + + void addKeybind(std::string text, std::string subtext, std::string &keybind); + void addTextBox(std::string text, std::string subtext, std::string& value); void addDropdown(std::string text, std::string subtext, const std::vector& options, std::string& value); void addColorPicker(std::string text, std::string subtext, std::string& value, bool& rgb); From 02283500090ad61ebbbd4aaf1408dc93037c1ec1 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 16 Sep 2024 11:59:42 +0600 Subject: [PATCH 148/240] ColorPicker fix + ArmorHUD + Animations --- .../Module/Modules/Animations/Animations.hpp | 24 +-- .../Module/Modules/ArmorHUD/ArmorHUD.hpp | 145 ++++-------------- .../Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- .../Modules/ComboCounter/ComboCounter.hpp | 12 +- src/Client/Module/Modules/Module.cpp | 11 +- src/Client/Module/Modules/Module.hpp | 12 +- 6 files changed, 66 insertions(+), 140 deletions(-) diff --git a/src/Client/Module/Modules/Animations/Animations.hpp b/src/Client/Module/Modules/Animations/Animations.hpp index 7716d32e..23de117d 100644 --- a/src/Client/Module/Modules/Animations/Animations.hpp +++ b/src/Client/Module/Modules/Animations/Animations.hpp @@ -32,22 +32,22 @@ class Animations : public Module { void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"HotBar", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("HotBar "), - toggleY, this->settings.getSettingByName("hotbarSpeed")->value, 50.0f, - 0, false); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - this->settings.getSettingByName("hotbarSpeed")->value = percent; + this->addHeader("Misc"); + this->extraPadding(); + this->addSlider("Hotbar", "", this->settings.getSettingByName("hotbarSpeed")->value); + + FlarialGUI::UnsetScrollView(); } }; diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp index 94d5fe5d..beaabe82 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp @@ -61,130 +61,37 @@ class ArmorHUD : public Module { void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, - this->settings.getSettingByName("uiscale")->value, 3.0f); - this->settings.getSettingByName("uiscale")->value = percent; + this->addHeader("Main"); + this->extraPadding(); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Vertical", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(2, toggleX, toggleY, this->settings.getSettingByName( - "vertical")->value)) - this->settings.getSettingByName("vertical")->value = !this->settings.getSettingByName( - "vertical")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Show durability", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(3, toggleX, toggleY, this->settings.getSettingByName( - "showdurability")->value)) - this->settings.getSettingByName("showdurability")->value = !this->settings.getSettingByName( - "showdurability")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Use percent %", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "percent")->value)) - this->settings.getSettingByName("percent")->value = !this->settings.getSettingByName( - "percent")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Change color", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(5, toggleX, toggleY, this->settings.getSettingByName( - "color")->value)) - this->settings.getSettingByName("color")->value = !this->settings.getSettingByName( - "color")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text size ", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - float textSize = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Text size "), - toggleY, this->settings.getSettingByName("textSize")->value, 0.25f, - 0.f, false); - - this->settings.getSettingByName("textSize")->value = textSize; - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Main color", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Main color "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("colorMain")->value, - settings.getSettingByName("colorMain_rgb")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"High durability", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("High durability "), toggleY * 0.99f, - settings.getSettingByName("colorFull")->value, - settings.getSettingByName("colorFull_rgb")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Low durability", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Low durability "), toggleY * 0.99f, - settings.getSettingByName("colorLow")->value, - settings.getSettingByName("colorLow_rgb")->value); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("colorMain")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("colorMain_rgb")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("colorFull")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("colorFull_rgb")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("colorLow")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("colorLow_rgb")->value); - /* Color Pickers End */ + this->addSlider("Size", "", this->settings.getSettingByName("uiscale")->value); + this->addToggle("Vertical ArmorHUD", "To switch between a vertical or horizontal layout", this->settings.getSettingByName("vertical")->value); + this->addToggle("Change Color", "", this->settings.getSettingByName("color")->value); + + + this->addHeader("Text"); + this->extraPadding(); + + this->addToggle("Show Durability", "", this->settings.getSettingByName("showdurability")->value); + this->addConditionalSlider(this->settings.getSettingByName("showdurability")->value, "Text Size", "Text size of Durability", this->settings.getSettingByName("textSize")->value, 0.25f, 0.0f, true); + this->addToggle("Show Durability in %", "", this->settings.getSettingByName("percent")->value); + + this->addHeader("Colors"); + this->extraPadding(); + + this->resetPadding(); + FlarialGUI::UnsetScrollView(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index ea8e013e..6527ff23 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -112,7 +112,7 @@ class ClickGUIRenderer : public Listener { } - if (SwapchainHook::init && baseHeightActual > 0.01) { + if (SwapchainHook::init && baseHeightActual > 0.014) { /* Base Rectangle Start */ diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index 491683c3..55aea7ce 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -34,14 +34,14 @@ class ComboCounter : public Module { /* Border Start */ - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), Constraints::RelativeConstraint(0.88f, "height")); @@ -69,11 +69,11 @@ class ComboCounter : public Module { this->extraPadding(); this->addHeader("Colors"); - this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + FlarialGUI::UnsetScrollView(); this->resetPadding(); - FlarialGUI::UnsetScrollView(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 30f1fbad..fefbd6fc 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -195,6 +195,12 @@ void Module::resetPadding() { toggleIndex = 0; dropdownIndex = 0; sliderIndex = 0; + + int i = 100; + for (int i = 100; i < colorPickerIndex; ++i) { + FlarialGUI::ColorPickerWindow(i, *color_pickers[i].value, *color_pickers[i].opacity, *color_pickers[i].rgb); + } + colorPickerIndex = 100; keybindIndex = 0; textboxIndex = 0; @@ -217,7 +223,7 @@ void Module::addHeader(std::string text) { padding += Constraints::RelativeConstraint(0.055f, "height", true); } -void Module::addColorPicker(std::string text, std::string subtext, std::string& value, bool& rgb) { +void Module::addColorPicker(std::string text, std::string subtext, std::string& value, float& opacity, bool& rgb) { float elementX = Constraints::PercentageConstraint(0.285f, "right"); float y = Constraints::PercentageConstraint(0.10, "top") + padding; @@ -226,6 +232,9 @@ void Module::addColorPicker(std::string text, std::string subtext, std::string& Module::addElementText(text, subtext); padding += Constraints::RelativeConstraint(0.05f, "height", true); + + DrDisrespect respect = { &value, &opacity, &rgb }; + color_pickers[colorPickerIndex] = respect; colorPickerIndex++; } diff --git a/src/Client/Module/Modules/Module.hpp b/src/Client/Module/Modules/Module.hpp index 05897ed1..e02c6a12 100644 --- a/src/Client/Module/Modules/Module.hpp +++ b/src/Client/Module/Modules/Module.hpp @@ -50,6 +50,16 @@ class Module { int keybindIndex = 0; int colorPickerIndex = 100; + struct DrDisrespect { + std::string* value; + float* opacity; + bool* rgb; + }; + + std::unordered_map color_pickers; + + + void resetPadding(); void extraPadding(); void addElementText(std::string text, std::string subtext = ""); @@ -62,7 +72,7 @@ class Module { void addTextBox(std::string text, std::string subtext, std::string& value); void addDropdown(std::string text, std::string subtext, const std::vector& options, std::string& value); - void addColorPicker(std::string text, std::string subtext, std::string& value, bool& rgb); + void addColorPicker(std::string text, std::string subtext, std::string& value, float& opacity, bool& rgb); virtual void loadDefaults(); void saveSettings() const; void loadSettings(); From c3d1f8439b452fd7a7cf7e735db50a67009bc070 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 16 Sep 2024 16:10:31 +0600 Subject: [PATCH 149/240] numerous fixes & finish --- .../Elements/Control/Tooltip/Tooltip.cpp | 19 +++++++++++------- src/Client/GUI/Engine/Engine.cpp | 8 +++++--- src/Client/GUI/Engine/Engine.hpp | 2 ++ .../Module/Modules/Animations/Animations.hpp | 4 ++-- .../Module/Modules/ArmorHUD/ArmorHUD.hpp | 20 ++++++++++++++----- .../Modules/ComboCounter/ComboCounter.hpp | 2 ++ src/Client/Module/Modules/Module.cpp | 2 +- 7 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/Tooltip/Tooltip.cpp b/src/Client/GUI/Engine/Elements/Control/Tooltip/Tooltip.cpp index cb19d84c..9a1bb4a9 100644 --- a/src/Client/GUI/Engine/Elements/Control/Tooltip/Tooltip.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Tooltip/Tooltip.cpp @@ -58,9 +58,16 @@ void FlarialGUI::Tooltip(const std::string& id, float x, float y, const std::str D2D1_COLOR_F textCol = colors_text_rgb ? rgbColor : colors_text; textCol.a = o_colors_text * tooltips[id].opac; + float spacing = Constraints::RelativeConstraint(0.01f, "height", true); - float rectWidth = TextSizes[tooltips[id].textName] + spacing * 2; - float rectHeight = spacing * 10; + float offset = Constraints::RelativeConstraint(0.015, "height", true); + + tooltips[id].textName = FlarialTextWithFont(spacing + tooltips[id].hoverX + offset, tooltips[id].hoverY - offset, + FlarialGUI::to_wide(text).c_str(), 100000.f, 100000.f, + DWRITE_TEXT_ALIGNMENT_LEADING, fontSize1, DWRITE_FONT_WEIGHT_REGULAR, D2D1::ColorF(0, 0, 0, 0)); + + float rectWidth = TextSizesXY[tooltips[id].textName].x + spacing * 2; + float rectHeight = TextSizesXY[tooltips[id].textName].y + spacing; if (CursorInRect(x, y, width, height)) { if (!tooltips[id].in) { @@ -93,18 +100,16 @@ void FlarialGUI::Tooltip(const std::string& id, float x, float y, const std::str lerp(tooltips[id].opac, 0.0f, 0.35f * frameFactor); } - if (tooltips[id].opac > 0.1f) { + if (tooltips[id].opac > 0) { Vec2 round = Constraints::RoundingConstraint(10, 10); - float offset = Constraints::RelativeConstraint(0.015, "height", true); - RoundedRect(tooltips[id].hoverX + offset, tooltips[id].hoverY - offset, bgCol, rectWidth, rectHeight, round.x, round.x); RoundedHollowRect(tooltips[id].hoverX + offset, tooltips[id].hoverY - offset, Constraints::RelativeConstraint(0.001, "height", true), outlineCol, rectWidth, rectHeight, round.x, round.x); - tooltips[id].textName = FlarialTextWithFont(spacing + tooltips[id].hoverX + offset, tooltips[id].hoverY - offset, - FlarialGUI::to_wide(text).c_str(), Constraints::RelativeConstraint(1, "height", true) * 6.9f, rectHeight, + FlarialTextWithFont(spacing + tooltips[id].hoverX + offset, tooltips[id].hoverY - offset, + FlarialGUI::to_wide(text).c_str(), rectWidth * 6.9f, rectHeight, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize1, DWRITE_FONT_WEIGHT_REGULAR, textCol); } diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index 21521d31..78b5e901 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -117,6 +117,7 @@ ID2D1Factory *FlarialGUI::factory; IDWriteFactory *FlarialGUI::writeFactory; ID2D1ImageBrush *FlarialGUI::blurbrush; std::unordered_map FlarialGUI::TextSizes; +std::unordered_map> FlarialGUI::TextSizesXY; // todo: all use cache std::unordered_map FlarialGUI::tooltips; @@ -793,6 +794,7 @@ std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *tex } TextSizes[fontedName] = size.x; + TextSizesXY[fontedName] = Vec2(size.x, size.y); y += (height / 2) - (size.y / 2); ImGui::GetBackgroundDrawList()->AddText(ImVec2(x, y), ImColor(color.r, color.g, color.b, color.a), stringText.c_str()); ImGui::PopFont(); @@ -1307,12 +1309,12 @@ void FlarialGUI::NotifyHeartbeat() { int i = 0; for(Notification& n : notifications) { - float posyModif = -((height + Constraints::RelativeConstraint(0.009f, "height", true)) * i); + float posyModif = -((height + Constraints::RelativeConstraint(0.01f, "height", true)) * i); if(n.firstTime) { - float TrollSize = Constraints::RelativeConstraint(0.1385, "height", true); + float TrollSize = Constraints::RelativeConstraint(0.128, "height", true); std::string sizeName = FlarialGUI::FlarialTextWithFont(n.currentPos, n.currentPosY, FlarialGUI::to_wide(n.text).c_str(), 10, 25, DWRITE_TEXT_ALIGNMENT_CENTER, TrollSize, DWRITE_FONT_WEIGHT_NORMAL, D2D1::ColorF(0, 0, 0 ,0)); - n.width = FlarialGUI::TextSizes[sizeName] * 1.003; + n.width = FlarialGUI::TextSizes[sizeName] + Constraints::RelativeConstraint(0.0345f, "height", true); n.currentPos = Constraints::CenterConstraint(n.width, 0).x; n.firstTime = false; } diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index ff612ce5..c82c290e 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -158,6 +158,8 @@ namespace FlarialGUI { extern std::unordered_map tooltips; extern std::unordered_map TextSizes; + extern std::unordered_map> TextSizesXY; + extern LRUCache> brushCache; extern LRUCache> textLayoutCache; extern LRUCache> textFormatCache; diff --git a/src/Client/Module/Modules/Animations/Animations.hpp b/src/Client/Module/Modules/Animations/Animations.hpp index 23de117d..7ec1f27b 100644 --- a/src/Client/Module/Modules/Animations/Animations.hpp +++ b/src/Client/Module/Modules/Animations/Animations.hpp @@ -44,10 +44,10 @@ class Animations : public Module { Constraints::RelativeConstraint(0.88f, "height")); this->addHeader("Misc"); - this->extraPadding(); - this->addSlider("Hotbar", "", this->settings.getSettingByName("hotbarSpeed")->value); FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp index beaabe82..c9f2d40f 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp @@ -74,24 +74,34 @@ class ArmorHUD : public Module { this->addHeader("Main"); - this->extraPadding(); this->addSlider("Size", "", this->settings.getSettingByName("uiscale")->value); this->addToggle("Vertical ArmorHUD", "To switch between a vertical or horizontal layout", this->settings.getSettingByName("vertical")->value); this->addToggle("Change Color", "", this->settings.getSettingByName("color")->value); - - this->addHeader("Text"); this->extraPadding(); + this->addHeader("Text"); this->addToggle("Show Durability", "", this->settings.getSettingByName("showdurability")->value); this->addConditionalSlider(this->settings.getSettingByName("showdurability")->value, "Text Size", "Text size of Durability", this->settings.getSettingByName("textSize")->value, 0.25f, 0.0f, true); this->addToggle("Show Durability in %", "", this->settings.getSettingByName("percent")->value); - this->addHeader("Colors"); this->extraPadding(); + this->addHeader("Colors"); + + this->addColorPicker("Main", "", settings.getSettingByName("colorMain")->value, + settings.getSettingByName("bgOpacity")->value, + settings.getSettingByName("colorMain_rgb")->value); + + this->addColorPicker("Full", "", settings.getSettingByName("colorFull")->value, + settings.getSettingByName("textOpacity")->value, + settings.getSettingByName("colorFull_rgb")->value); + + this->addColorPicker("Low", "", settings.getSettingByName("colorLow")->value, + settings.getSettingByName("borderOpacity")->value, + settings.getSettingByName("colorLow_rgb")->value); - this->resetPadding(); FlarialGUI::UnsetScrollView(); + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp index 55aea7ce..a392a924 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboCounter.hpp @@ -70,6 +70,8 @@ class ComboCounter : public Module { this->addHeader("Colors"); this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Text Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); FlarialGUI::UnsetScrollView(); diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index fefbd6fc..be054b54 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -224,7 +224,7 @@ void Module::addHeader(std::string text) { } void Module::addColorPicker(std::string text, std::string subtext, std::string& value, float& opacity, bool& rgb) { - float elementX = Constraints::PercentageConstraint(0.285f, "right"); + float elementX = Constraints::PercentageConstraint(0.195f, "right"); float y = Constraints::PercentageConstraint(0.10, "top") + padding; FlarialGUI::ColorPicker(colorPickerIndex, elementX, y, value, rgb); From 91b7b68d2e4e926bfcfe8771d5b5fb48b12c91c4 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 16 Sep 2024 16:40:03 +0600 Subject: [PATCH 150/240] new settings page for 18 more modules --- src/Client/Module/Modules/AutoGG/AutoGG.hpp | 19 +++++- .../Modules/BlockOutline/BlockOutline.hpp | 25 ++++---- .../Module/Modules/CPSLimiter/CPSLimiter.hpp | 35 ++++------- .../Modules/CommandHotkey/CommandHotkey.hpp | 20 +++++-- .../Module/Modules/Crosshair/Crosshair.hpp | 27 ++++----- src/Client/Module/Modules/DVD Screen/dvd.hpp | 53 ++++------------ src/Client/Module/Modules/Deepfry/Deepfry.hpp | 27 +++++---- .../Module/Modules/FOVChanger/FOVChanger.hpp | 40 ++++--------- .../Module/Modules/FogColor/FogColor.hpp | 23 +++---- .../Module/Modules/Freelook/Freelook.hpp | 36 ++++------- .../Module/Modules/Fullbright/Fullbright.hpp | 28 ++++----- .../Module/Modules/GuiScale/GuiScale.hpp | 24 ++++---- src/Client/Module/Modules/Hitbox/Hitbox.hpp | 60 +++++-------------- .../Module/Modules/HueChanger/HueChanger.hpp | 22 +++---- .../Module/Modules/HurtColor/HurtColor.hpp | 23 +++---- .../InstantHurtAnimation.hpp | 27 +++++---- .../Modules/InventoryHUD/InventoryHUD.hpp | 29 ++++----- src/Client/Module/Modules/Module.cpp | 2 +- 18 files changed, 223 insertions(+), 297 deletions(-) diff --git a/src/Client/Module/Modules/AutoGG/AutoGG.hpp b/src/Client/Module/Modules/AutoGG/AutoGG.hpp index 9c7f9c1a..560ba853 100644 --- a/src/Client/Module/Modules/AutoGG/AutoGG.hpp +++ b/src/Client/Module/Modules/AutoGG/AutoGG.hpp @@ -33,11 +33,24 @@ class AutoGG : public Module { void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 50, toggleX, toggleY); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); + + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + + this->addHeader("Misc"); + this->addTextBox("Text", "The text to send.", settings.getSettingByName("text")->value); + + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp b/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp index 82ac89d7..6125a058 100644 --- a/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp +++ b/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp @@ -88,23 +88,28 @@ class BlockOutline : public Module { void settingsRender() override { - float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::FlarialTextWithFont(x, y, L"Color", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, x + Constraints::SpacingConstraint(0.95, textWidth), - y - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("color")->value, - settings.getSettingByName("color_rgb")->value); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("color")->value, + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + + this->addHeader("Colors"); + this->addColorPicker("Outline Color", "", settings.getSettingByName("color")->value, settings.getSettingByName("colorOpacity")->value, settings.getSettingByName("color_rgb")->value); + + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); + + if (settings.getSettingByName("enabled")) onColorChange(); } diff --git a/src/Client/Module/Modules/CPSLimiter/CPSLimiter.hpp b/src/Client/Module/Modules/CPSLimiter/CPSLimiter.hpp index bde0dd0e..75919cec 100644 --- a/src/Client/Module/Modules/CPSLimiter/CPSLimiter.hpp +++ b/src/Client/Module/Modules/CPSLimiter/CPSLimiter.hpp @@ -22,36 +22,25 @@ class CPSLimiter : public Module { void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Left", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("Left "), - toggleY, this->settings.getSettingByName("Left")->value, 100.0f, - 1.00f, false); + this->addHeader("Limiter"); + this->addSlider("Left Click", "Limit for your LMB.", this->settings.getSettingByName("Left")->value); + this->addSlider("Right Click", "Right for your RMB.", this->settings.getSettingByName("Right")->value); - this->settings.getSettingByName("Left")->value = percent; - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::UnsetScrollView(); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Right", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(5, toggleX + FlarialGUI::SettingsTextWidth("Right "), - toggleY, this->settings.getSettingByName("Right")->value, 100.0f, 1.00f, false); - - this->settings.getSettingByName("Right")->value = percent; + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/CommandHotkey/CommandHotkey.hpp b/src/Client/Module/Modules/CommandHotkey/CommandHotkey.hpp index deb64f0e..017e2e84 100644 --- a/src/Client/Module/Modules/CommandHotkey/CommandHotkey.hpp +++ b/src/Client/Module/Modules/CommandHotkey/CommandHotkey.hpp @@ -34,17 +34,25 @@ class CommandHotkey : public Module { void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::KeybindSelector(0, toggleX, toggleY, getKeybind()); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("command")->value, 50, toggleX, toggleY); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + this->addHeader("Misc"); + this->addKeybind("Command Keybind", "", getKeybind()); + this->addTextBox("Command to Send", "No need for /", settings.getSettingByName("command")->value); + + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/Crosshair/Crosshair.hpp b/src/Client/Module/Modules/Crosshair/Crosshair.hpp index 185c3ae0..083bf6d0 100644 --- a/src/Client/Module/Modules/Crosshair/Crosshair.hpp +++ b/src/Client/Module/Modules/Crosshair/Crosshair.hpp @@ -39,28 +39,23 @@ class Crosshair : public Module { } void settingsRender() override { - /* Border Start */ - float xPos = Constraints::PercentageConstraint(0.019, "left"); - float yPos = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - yPos += Constraints::SpacingConstraint(0.35, textWidth); - /* Third Person Crosshair Start */ + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(xPos + Constraints::SpacingConstraint(0.60, textWidth), yPos, - L"Third Person Crosshair", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); + this->addHeader("Misc"); + this->addToggle("Third Person Crosshair", "", this->settings.getSettingByName("thirdpersoncrosshair")->value); - if (FlarialGUI::Toggle(0, xPos, yPos, this->settings.getSettingByName( - "thirdpersoncrosshair")->value)) - this->settings.getSettingByName("thirdpersoncrosshair")->value = !this->settings.getSettingByName( - "thirdpersoncrosshair")->value; + FlarialGUI::UnsetScrollView(); - /* Third Person Crosshair End */ + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/DVD Screen/dvd.hpp b/src/Client/Module/Modules/DVD Screen/dvd.hpp index d349aab1..ba98ef16 100644 --- a/src/Client/Module/Modules/DVD Screen/dvd.hpp +++ b/src/Client/Module/Modules/DVD Screen/dvd.hpp @@ -45,52 +45,25 @@ class DVD : public Module { void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(7.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"X Velocity", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - float percent = FlarialGUI::Slider(0, toggleX + FlarialGUI::SettingsTextWidth("X Velocity "), - toggleY, this->settings.getSettingByName("xveloc")->value, 25.0f); - - this->settings.getSettingByName("xveloc")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Y Velocity", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Y Velocity "), - toggleY, this->settings.getSettingByName("yveloc")->value, 25.0f); - - this->settings.getSettingByName("yveloc")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Scale "), - toggleY, this->settings.getSettingByName("scale")->value, 5.0f); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - this->settings.getSettingByName("scale")->value = percent; + this->addHeader("Sizes"); + this->addSlider("Scale", "", this->settings.getSettingByName("scale")->value); + this->addSlider("X Velocity", "", this->settings.getSettingByName("xveloc")->value); + this->addSlider("Y Velocity", "", this->settings.getSettingByName("yveloc")->value); FlarialGUI::UnsetScrollView(); + this->resetPadding(); + } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/Deepfry/Deepfry.hpp b/src/Client/Module/Modules/Deepfry/Deepfry.hpp index e6e928df..4e258691 100644 --- a/src/Client/Module/Modules/Deepfry/Deepfry.hpp +++ b/src/Client/Module/Modules/Deepfry/Deepfry.hpp @@ -35,21 +35,24 @@ class Deepfry : public Module { void settingsRender() override { - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Paint Effect", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - if (FlarialGUI::Toggle(1, toggleX, toggleY, this->settings.getSettingByName( - "paint")->value)) - this->settings.getSettingByName("paint")->value = !this->settings.getSettingByName( - "paint")->value; + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + + this->addHeader("Misc"); + this->addToggle("Paint Effect", "", this->settings.getSettingByName("paint")->value); + + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } diff --git a/src/Client/Module/Modules/FOVChanger/FOVChanger.hpp b/src/Client/Module/Modules/FOVChanger/FOVChanger.hpp index fbfa7e90..7506dee2 100644 --- a/src/Client/Module/Modules/FOVChanger/FOVChanger.hpp +++ b/src/Client/Module/Modules/FOVChanger/FOVChanger.hpp @@ -34,41 +34,25 @@ class FOVChanger : public Module { void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"FOV Value", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - float percent = FlarialGUI::Slider(0, toggleX + FlarialGUI::SettingsTextWidth("FOV Value "), - toggleY, this->settings.getSettingByName("fovvalue")->value, 359.0f, + this->addHeader("Misc"); + this->addSlider("FOV Value", "", this->settings.getSettingByName("fovvalue")->value, 359.0f, 0, false); - - this->settings.getSettingByName("fovvalue")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.25, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Affect hand size", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(1, toggleX, toggleY, this->settings.getSettingByName( - "fovaffectshand")->value)) - this->settings.getSettingByName("fovaffectshand")->value = !this->settings.getSettingByName( - "fovaffectshand")->value; + this->addToggle("Affect Hand Size", "Keep normal hand size or not.", this->settings.getSettingByName("fovaffectshand")->value); FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/FogColor/FogColor.hpp b/src/Client/Module/Modules/FogColor/FogColor.hpp index ed5d7f25..77fd6e1c 100644 --- a/src/Client/Module/Modules/FogColor/FogColor.hpp +++ b/src/Client/Module/Modules/FogColor/FogColor.hpp @@ -35,23 +35,26 @@ class FogColor : public Module { void settingsRender() override { - float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::FlarialTextWithFont(x, y, L"Color", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, x + Constraints::SpacingConstraint(0.95, textWidth), - y - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("color")->value, - settings.getSettingByName("color_rgb")->value); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("color")->value, + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + + this->addHeader("Colors"); + this->addColorPicker("Fog Color", "", settings.getSettingByName("color")->value, settings.getSettingByName("colorOpacity")->value, settings.getSettingByName("color_rgb")->value); + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); + } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/Freelook/Freelook.hpp b/src/Client/Module/Modules/Freelook/Freelook.hpp index c9966bac..82dbecf4 100644 --- a/src/Client/Module/Modules/Freelook/Freelook.hpp +++ b/src/Client/Module/Modules/Freelook/Freelook.hpp @@ -39,41 +39,27 @@ class FreeLook : public Module { void settingsRender() override { - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - - float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(x, y, Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(0.90, "height")); - - FlarialGUI::Dropdown(0, x, y, std::vector{"1st Person", "3rd Person back", "3rd Person front"}, - this->settings.getSettingByName("mode")->value, "Freelook mode"); - FlarialGUI::SetIsInAdditionalYMode(); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - y += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(1, x, y, this->settings.getSettingByName( - "toggle")->value)) - this->settings.getSettingByName("toggle")->value = !this->settings.getSettingByName( - "toggle")->value; + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + this->addHeader("Misc"); + this->addKeybind("Freelook Keybind", "", getKeybind()); - FlarialGUI::FlarialTextWithFont(x + Constraints::SpacingConstraint(0.60, textWidth), y, L"Toggleable", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - y += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::KeybindSelector(2, x, y, getKeybind()); + this->addToggle("Toggleable Mode", "Click to toggle or Hold to keep enabled", this->settings.getSettingByName("toggle")->value); + this->addDropdown("Freelook View Mode", "", std::vector{"1st Person", "3rd Person back", "3rd Person front"}, this->settings.getSettingByName("mode")->value); FlarialGUI::UnsetScrollView(); - FlarialGUI::UnSetIsInAdditionalYMode(); + + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/Fullbright/Fullbright.hpp b/src/Client/Module/Modules/Fullbright/Fullbright.hpp index 09b7c55c..bb940163 100644 --- a/src/Client/Module/Modules/Fullbright/Fullbright.hpp +++ b/src/Client/Module/Modules/Fullbright/Fullbright.hpp @@ -35,30 +35,24 @@ class Fullbright : public Module { void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Gamma", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("Gamma"), - toggleY, this->settings.getSettingByName("gamma")->value, 25.0f, // 3.3 - 0.0f); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - this->settings.getSettingByName("gamma")->value = percent; + this->addHeader("Misc"); + this->addSlider("Brightness", "", this->settings.getSettingByName("gamma")->value, 25.0f); FlarialGUI::UnsetScrollView(); + this->resetPadding(); + } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/GuiScale/GuiScale.hpp b/src/Client/Module/Modules/GuiScale/GuiScale.hpp index 665b2b14..382042cc 100644 --- a/src/Client/Module/Modules/GuiScale/GuiScale.hpp +++ b/src/Client/Module/Modules/GuiScale/GuiScale.hpp @@ -32,22 +32,24 @@ class GuiScale : public Module { void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("guiscale")->value, 4.0f); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - this->settings.getSettingByName("guiscale")->value = percent; + this->addHeader("UI Size"); + this->addSlider("UI Size", "", this->settings.getSettingByName("guiscale")->value); + + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/Hitbox/Hitbox.hpp b/src/Client/Module/Modules/Hitbox/Hitbox.hpp index 667160a9..c41139d9 100644 --- a/src/Client/Module/Modules/Hitbox/Hitbox.hpp +++ b/src/Client/Module/Modules/Hitbox/Hitbox.hpp @@ -38,62 +38,34 @@ class Hitbox : public Module { void settingsRender() override { - float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::FlarialTextWithFont(x + Constraints::SpacingConstraint(0.60, textWidth), y, - L"Outline", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(0, x, y, this->settings.getSettingByName( - "outline")->value)) - this->settings.getSettingByName("outline")->value = !this->settings.getSettingByName( - "outline")->value; - - y += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(x + Constraints::SpacingConstraint(0.60, textWidth), y, - L"Static thickness", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(1, x, y, this->settings.getSettingByName( - "staticThickness")->value)) - this->settings.getSettingByName("staticThickness")->value = !this->settings.getSettingByName( - "staticThickness")->value; + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - y += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(x, y, L"Thickness ", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - float thickness = FlarialGUI::Slider(1, x + FlarialGUI::SettingsTextWidth("Thickness "), - y, this->settings.getSettingByName("thickness")->value, 5.0f, - 0.f, false); + this->addHeader("Main"); - this->settings.getSettingByName("thickness")->value = thickness; + this->addToggle("2D Mode", "", this->settings.getSettingByName("outline")->value); + this->addToggle("Static Thickness", "", this->settings.getSettingByName("staticThickness")->value); - y += Constraints::SpacingConstraint(0.35, textWidth); + this->addSlider("Thickness", "", this->settings.getSettingByName("thickness")->value); - FlarialGUI::FlarialTextWithFont(x, y, L"Color", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - FlarialGUI::ColorPicker(0, x + FlarialGUI::SettingsTextWidth("Color "), - y - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("color")->value, - settings.getSettingByName("color_rgb")->value); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("color")->value, + this->extraPadding(); + this->addHeader("Colors"); + this->addColorPicker("Hitbox Color", "", settings.getSettingByName("color")->value, settings.getSettingByName("colorOpacity")->value, settings.getSettingByName("color_rgb")->value); + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); + } }; diff --git a/src/Client/Module/Modules/HueChanger/HueChanger.hpp b/src/Client/Module/Modules/HueChanger/HueChanger.hpp index 0d4630fc..acc147a0 100644 --- a/src/Client/Module/Modules/HueChanger/HueChanger.hpp +++ b/src/Client/Module/Modules/HueChanger/HueChanger.hpp @@ -33,23 +33,23 @@ class HueChanger : public Module { void settingsRender() override { - const float textWidth = Constraints::RelativeConstraint(0.26, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::FlarialTextWithFont(x, y, L"Saturation Intensity", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); + + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - float percent = FlarialGUI::Slider(3, x + FlarialGUI::SettingsTextWidth("Saturation Intensity "), - y, - this->settings.getSettingByName("intensity")->value, 3.0f); + this->addHeader("Misc"); + this->addSlider("Saturation Intensity", "", this->settings.getSettingByName("intensity")->value); - this->settings.getSettingByName("intensity")->value = percent; + FlarialGUI::UnsetScrollView(); + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/HurtColor/HurtColor.hpp b/src/Client/Module/Modules/HurtColor/HurtColor.hpp index 38684fbb..bcc24d6d 100644 --- a/src/Client/Module/Modules/HurtColor/HurtColor.hpp +++ b/src/Client/Module/Modules/HurtColor/HurtColor.hpp @@ -34,23 +34,26 @@ class HurtColor : public Module { void settingsRender() override { - float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::FlarialTextWithFont(x, y, L"Color", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, x + FlarialGUI::SettingsTextWidth("Color "), - y - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("color")->value, - settings.getSettingByName("color_rgb")->value); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("color")->value, + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + + this->addHeader("Colors"); + this->addColorPicker("Hurt Color", "", settings.getSettingByName("color")->value, settings.getSettingByName("colorOpacity")->value, settings.getSettingByName("color_rgb")->value); + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); + } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp index 55677840..9f05a496 100644 --- a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp +++ b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp @@ -32,20 +32,23 @@ class InstantHurtAnimation : public Module { void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Try to exclude team", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "tryToExcludeTeam")->value)) - this->settings.getSettingByName("tryToExcludeTeam")->value = !this->settings.getSettingByName( - "tryToExcludeTeam")->value; + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + + this->addHeader("Misc"); + this->addToggle("Try to Exclude Team", "E.g. your team in Bedwars", this->settings.getSettingByName("tryToExcludeTeam")->value); + + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp b/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp index 70dacf25..31289964 100644 --- a/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp +++ b/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp @@ -39,30 +39,23 @@ class InventoryHUD : public Module { void settingsRender() override { - /* Border Start */ - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, 40, 2); - FlarialGUI::SetScrollView(toggleX, toggleY, Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(0.90, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, - this->settings.getSettingByName("uiscale")->value, 3.0f); - - this->settings.getSettingByName("uiscale")->value = percent; + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + this->addHeader("Misc"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 3.0f); FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index be054b54..93b243bf 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -330,7 +330,7 @@ void Module::addToggle(std::string text, std::string subtext, bool& value) { void Module::addKeybind(std::string text, std::string subtext, std::string& keybind) { float elementX = Constraints::PercentageConstraint(0.13f, "right"); - float y = Constraints::PercentageConstraint(0.10, "top") + padding; + float y = Constraints::PercentageConstraint(0.08, "top") + padding; FlarialGUI::KeybindSelector(keybindIndex, elementX, y, keybind); From a90f0e0ad4e231937c67f020c9122d40928919ad Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 16 Sep 2024 16:49:23 +0600 Subject: [PATCH 151/240] +8 more modules --- .../Module/Modules/MotionBlur/MotionBlur.hpp | 41 +++----- src/Client/Module/Modules/Nick/NickModule.hpp | 20 +++- .../Module/Modules/PaperDoll/PaperDoll.hpp | 41 +++----- .../Modules/RenderOptions/RenderOptions.hpp | 94 ++++--------------- .../Module/Modules/SnapLook/SnapLook.hpp | 20 +++- src/Client/Module/Modules/Sneak/Sneak.hpp | 18 +++- .../Module/Modules/TextHotkey/TextHotkey.hpp | 19 ++-- .../Modules/WeatherChanger/WeatherChanger.hpp | 46 +++------ 8 files changed, 111 insertions(+), 188 deletions(-) diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlur.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlur.hpp index 964416c4..32f60a61 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlur.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlur.hpp @@ -34,43 +34,24 @@ class MotionBlur : public Module { void settingsRender() override { - float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Bleed Factor", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - float percent = FlarialGUI::Slider(7, toggleX + FlarialGUI::SettingsTextWidth("Bleed Factor "), - toggleY, this->settings.getSettingByName("intensity")->value, 1.0f, 0, - false); - - this->settings.getSettingByName("intensity")->value = percent; + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Intensity", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Intensity "), - toggleY, this->settings.getSettingByName("intensity2")->value, 30); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - this->settings.getSettingByName("intensity2")->value = percent; + this->addHeader("Misc"); + this->addSlider("Bleed Factor", "The scale at which previous frames bleed into the current one.", this->settings.getSettingByName("intensity")->value, 1.0f, 0.f, true); + this->addSlider("Intensity", "Amount of previous frames to render.", this->settings.getSettingByName("intensity2")->value, 30, 0, true); FlarialGUI::UnsetScrollView(); + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/Nick/NickModule.hpp b/src/Client/Module/Modules/Nick/NickModule.hpp index 9fe69d70..0c58af23 100644 --- a/src/Client/Module/Modules/Nick/NickModule.hpp +++ b/src/Client/Module/Modules/Nick/NickModule.hpp @@ -55,12 +55,22 @@ class NickModule : public Module { } void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("nick")->value, 16, toggleX, toggleY); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); + + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + + this->addHeader("Misc"); + this->addTextBox("Nickname", "", settings.getSettingByName("nick")->value); + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/PaperDoll/PaperDoll.hpp b/src/Client/Module/Modules/PaperDoll/PaperDoll.hpp index 1e31f30e..c4bafd33 100644 --- a/src/Client/Module/Modules/PaperDoll/PaperDoll.hpp +++ b/src/Client/Module/Modules/PaperDoll/PaperDoll.hpp @@ -45,43 +45,26 @@ class PaperDoll : public Module { void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, 40, 2); - FlarialGUI::SetScrollView(toggleX, toggleY, Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(0.90, "height")); + this->addHeader("Misc"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addToggle("Always Show", "", this->settings.getSettingByName("alwaysshow")->value); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, - this->settings.getSettingByName("uiscale")->value, 40.0f); - - this->settings.getSettingByName("uiscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Always Show", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::UnsetScrollView(); - if (FlarialGUI::Toggle(2, toggleX, toggleY, this->settings.getSettingByName( - "alwaysshow")->value)) - this->settings.getSettingByName("alwaysshow")->value = !this->settings.getSettingByName( - "alwaysshow")->value; + this->resetPadding(); - FlarialGUI::UnsetScrollView(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/RenderOptions/RenderOptions.hpp b/src/Client/Module/Modules/RenderOptions/RenderOptions.hpp index 058c67ee..27ac3ce3 100644 --- a/src/Client/Module/Modules/RenderOptions/RenderOptions.hpp +++ b/src/Client/Module/Modules/RenderOptions/RenderOptions.hpp @@ -65,90 +65,28 @@ class RenderOptions : public Module { void settingsRender() override { - updateSetings(); - - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Chunk Borders", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(1, toggleX, toggleY, this->settings.getSettingByName( - "chunkborders")->value)) - this->settings.getSettingByName("chunkborders")->value = !this->settings.getSettingByName( - "chunkborders")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Render Sky", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(2, toggleX, toggleY, this->settings.getSettingByName( - "sky")->value)) - this->settings.getSettingByName("sky")->value = !this->settings.getSettingByName("sky")->value; - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Render Entities", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - if (FlarialGUI::Toggle(3, toggleX, toggleY, this->settings.getSettingByName( - "entity")->value)) - this->settings.getSettingByName("entity")->value = !this->settings.getSettingByName( - "entity")->value; - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Render Block Entities", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "blockentity")->value)) - this->settings.getSettingByName("blockentity")->value = !this->settings.getSettingByName( - "blockentity")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Render Particles", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(5, toggleX, toggleY, this->settings.getSettingByName( - "particles")->value)) - this->settings.getSettingByName("particles")->value = !this->settings.getSettingByName( - "particles")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Render Weather", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - if (FlarialGUI::Toggle(6, toggleX, toggleY, this->settings.getSettingByName( - "weather")->value)) - this->settings.getSettingByName("weather")->value = !this->settings.getSettingByName( - "weather")->value; + this->addHeader("Misc"); + this->addToggle("Chunk Borders", "", this->settings.getSettingByName("chunkborders")->value); + this->addToggle("Sky", "", this->settings.getSettingByName("sky")->value); + this->addToggle("Render Entitie", "", this->settings.getSettingByName("entity")->value); + this->addToggle("Render Block Entities", "", this->settings.getSettingByName("blockentity")->value); + this->addToggle("Render Particles", "", this->settings.getSettingByName("particles")->value); + this->addToggle("Render Weather", "", this->settings.getSettingByName("weather")->value); FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/SnapLook/SnapLook.hpp b/src/Client/Module/Modules/SnapLook/SnapLook.hpp index a7bfd6b1..e3604bda 100644 --- a/src/Client/Module/Modules/SnapLook/SnapLook.hpp +++ b/src/Client/Module/Modules/SnapLook/SnapLook.hpp @@ -28,9 +28,23 @@ class SnapLook : public Module { void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::KeybindSelector(0, toggleX, toggleY, getKeybind()); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); + + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); + + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + + this->addHeader("Misc"); + this->addKeybind("Keybind", "", getKeybind()); + + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/Sneak/Sneak.hpp b/src/Client/Module/Modules/Sneak/Sneak.hpp index 090354bd..5f80ae42 100644 --- a/src/Client/Module/Modules/Sneak/Sneak.hpp +++ b/src/Client/Module/Modules/Sneak/Sneak.hpp @@ -38,11 +38,23 @@ class Sneak : public Module { } void settingsRender() override { + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::KeybindSelector(0, toggleX, toggleY, getKeybind()); + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + + this->addHeader("Misc"); + this->addKeybind("Keybind", "", getKeybind()); + + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/TextHotkey/TextHotkey.hpp b/src/Client/Module/Modules/TextHotkey/TextHotkey.hpp index 82b54878..3069d4f0 100644 --- a/src/Client/Module/Modules/TextHotkey/TextHotkey.hpp +++ b/src/Client/Module/Modules/TextHotkey/TextHotkey.hpp @@ -35,17 +35,24 @@ class TextHotkey : public Module { void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::KeybindSelector(0, toggleX, toggleY, getKeybind()); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 50, toggleX, toggleY); + this->addHeader("Misc"); + this->addKeybind("Keybind", "There's a spam limit!", getKeybind()); + this->addTextBox("Text to Send", "", settings.getSettingByName("text")->value); + FlarialGUI::UnsetScrollView(); + + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/WeatherChanger/WeatherChanger.hpp b/src/Client/Module/Modules/WeatherChanger/WeatherChanger.hpp index 9ab4b376..2fc9e988 100644 --- a/src/Client/Module/Modules/WeatherChanger/WeatherChanger.hpp +++ b/src/Client/Module/Modules/WeatherChanger/WeatherChanger.hpp @@ -36,47 +36,25 @@ class WeatherChanger : public Module { void settingsRender() override { - /* Border Start */ - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rain", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("Rain "), - toggleY, this->settings.getSettingByName("rain")->value, 10.0f); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - this->settings.getSettingByName("rain")->value = percent; + this->addHeader("Misc"); + this->addSlider("Rain Intensity", "", this->settings.getSettingByName("rain")->value); + this->addSlider("Snow Intensity", "", this->settings.getSettingByName("snow")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::UnsetScrollView(); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Lightning", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(5, toggleX + FlarialGUI::SettingsTextWidth("Lightning "), - toggleY, this->settings.getSettingByName("lighting")->value, 10.0f); - - this->settings.getSettingByName("lighting")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "snow")->value)) - this->settings.getSettingByName("snow")->value = !this->settings.getSettingByName( - "snow")->value; - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth / 2.0f), toggleY, - L"Snow (intensity depends on rain)", - Constraints::SpacingConstraint(4.5, textWidth), textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(0.95, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); + this->resetPadding(); } }; From d07c8b0058613f9eed7f24bebb3aa52f6a0c643f Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 16 Sep 2024 16:52:53 +0600 Subject: [PATCH 152/240] small inconsistencies --- src/Client/Module/Modules/BlockOutline/BlockOutline.hpp | 2 +- src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp b/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp index 6125a058..262c08bc 100644 --- a/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp +++ b/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp @@ -19,7 +19,7 @@ class BlockOutline : public Module { static inline std::array outlineColorNewRipRel; public: - BlockOutline() : Module("BlockOutline", "Changes the block outline color", IDR_BLOCK_PNG, "") { + BlockOutline() : Module("Block Outline", "Changes the block outline color", IDR_BLOCK_PNG, "") { Module::setup(); }; diff --git a/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp b/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp index 31289964..d48636df 100644 --- a/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp +++ b/src/Client/Module/Modules/InventoryHUD/InventoryHUD.hpp @@ -8,7 +8,7 @@ class InventoryHUD : public Module { public: - InventoryHUD() : Module("InventoryHUD", "Displays your inventory\non your HUD", + InventoryHUD() : Module("Inventory HUD", "Displays your inventory\non your HUD", IDR_CHESTPLATE_PNG, "") { Module::setup(); }; From a209dc0fcd5b3f0376afb927b64dc729f09ca95c Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 16 Sep 2024 17:02:39 +0600 Subject: [PATCH 153/240] fix ui blur not showing when mb is on --- src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 7 ++++++- .../Module/Modules/MotionBlur/MotionBlurListener.hpp | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index 6527ff23..a11744eb 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -112,7 +112,9 @@ class ClickGUIRenderer : public Listener { } - if (SwapchainHook::init && baseHeightActual > 0.014) { + if (SwapchainHook::init && baseHeightActual > 0.0155f) { + + this->module->settings.getSettingByName("enabled")->value = true; /* Base Rectangle Start */ @@ -609,6 +611,9 @@ class ClickGUIRenderer : public Listener { } FlarialGUI::PopSize(); // Pops base rect } + + if(realBlurAmount < 0.5f) this->module->settings.getSettingByName("enabled")->value = false; + FlarialGUI::displayToolTips(); FlarialGUI::NotifyHeartbeat(); } diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index 465a84cb..6f69f9a1 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -28,6 +28,9 @@ class MotionBlurListener : public Listener { void onRender(RenderEvent &event) override { + + if(ModuleManager::getModule("ClickGUI")->isEnabled()) return; + int maxFrames = (int)round(module->settings.getSettingByName("intensity2")->value); if (SDK::getCurrentScreen() == "hud_screen" && !SwapchainHook::queue && this->module->isEnabled()) { From 6cf5a32d7614ee425d01c72d23d27c3203b9d9a9 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 20 Sep 2024 23:48:31 +0300 Subject: [PATCH 154/240] Sync with legacy: contains bug fixes, 1.21.30 update and new modules --- CMakeLists.txt | 20 +- commit_hash.h.in | 6 + src/Client/Events/EventHandler.cpp | 10 + src/Client/Events/EventHandler.hpp | 3 + src/Client/Events/Listener.hpp | 3 + .../Events/Render/RenderPotionHUDEvent.hpp | 7 + .../Shapes/Rect/RoundedRect/RoundedRect.cpp | 2 - .../Hooks/Render/HudMobEffectsRenderer.cpp | 23 ++ .../Hooks/Render/HudMobEffectsRenderer.hpp | 18 ++ src/Client/Hook/Manager.cpp | 2 + src/Client/Module/Manager.cpp | 19 +- .../Module/Modules/ArmorHUD/ArmorHUD.hpp | 6 + .../Modules/ArmorHUD/ArmorHUDListener.hpp | 11 +- .../Modules/BlockOutline/BlockOutline.hpp | 7 +- .../BlockOutline/BlockOutlineListener.hpp | 43 +++ .../Modules/ComboCounter/ComboListener.hpp | 7 +- .../FasterInventory/FasterInventory.hpp | 24 ++ .../FasterInventoryListener.hpp | 149 +++++++++ .../Module/Modules/Freelook/LookListener.hpp | 8 +- .../Module/Modules/GuiScale/GuiScale.hpp | 24 +- .../Modules/HitPing/HitPingListener.hpp | 2 +- .../Module/Modules/HueChanger/HueChanger.hpp | 22 +- .../Module/Modules/HurtColor/HurtColor.hpp | 23 +- .../InstantHurtAnimation.hpp | 38 ++- .../InstantHurtAnimationListener.hpp | 50 +-- .../ItemPhysics/ItemPhysicsListener.cpp | 199 ++++++++---- .../MovableChat/MovableChatListener.hpp | 4 +- .../Modules/NoHurtCam/NoHurtCamListener.hpp | 34 +- .../Modules/OpponentReach/OpponentReach.hpp | 293 ++++++++++++++++++ .../OpponentReach/OpponentReachListener.hpp | 95 ++++++ .../Module/Modules/PotionHUD/PotionHUD.hpp | 116 +++++++ .../Modules/PotionHUD/PotionHUDListener.hpp | 172 ++++++++++ .../Modules/RenderOptions/RenderOptions.hpp | 94 +++++- .../ThirdPersonListener.hpp | 2 +- .../Module/Modules/ViewModel/ViewModel.hpp | 54 ++++ .../Modules/ViewModel/ViewModelListener.hpp | 28 ++ src/SDK/Client/Actor/Actor.cpp | 144 ++++++++- src/SDK/Client/Actor/Actor.hpp | 11 + .../Actor/Components/MobEffectsComponent.hpp | 253 +++++++++++++++ .../Components/OnGroundFlagComponent.hpp | 3 + src/SDK/Client/Block/BlockSource.cpp | 2 +- src/SDK/Client/Core/ClientInstance.cpp | 6 +- src/SDK/Client/Core/Options.hpp | 6 +- src/SDK/Client/Level/HitResult.cpp | 2 +- src/SDK/Client/Level/Level.hpp | 2 +- .../Network/Packet/ContainerClosePacket.hpp | 10 + .../Network/Packet/ContainerOpenPacket.hpp | 14 + .../Client/Network/Packet/InteractPacket.hpp | 28 ++ .../Network/Packet/Types/ContainerID.hpp | 13 + .../Network/Packet/Types/ContainerType.hpp | 41 +++ .../Client/Render/BaseActorRenderContext.cpp | 2 +- src/SDK/Client/Render/FrameTransform.hpp | 1 - src/SDK/Client/Render/GuiData.cpp | 8 +- src/SDK/Client/Render/ItemRenderer.cpp | 2 +- .../Render/MinecraftUIRenderContext.hpp | 32 +- .../Client/Render/ScreenView/UIControl.hpp | 4 +- .../Client/Render/Tessellator/MeshHelpers.cpp | 4 +- .../Tessellator/RenderMaterialGroup.cpp | 2 +- .../Client/Render/Tessellator/Tessellator.hpp | 10 +- src/SDK/Client/Render/Textures/Color.hpp | 8 + src/SDK/SDK.cpp | 2 +- src/Utils/Memory/Game/Offset/OffsetInit.cpp | 27 ++ src/Utils/Memory/Game/Offset/OffsetInit.hpp | 1 + src/Utils/Memory/Game/Sig/SigInit.cpp | 51 ++- src/Utils/Memory/Game/Sig/SigInit.hpp | 1 + .../Memory/Game/SignatureAndOffsetManager.cpp | 18 +- .../Memory/Game/SignatureAndOffsetManager.hpp | 12 +- .../Game/Tutorial/HowToGetSigsAndOffsets.md | 15 +- 68 files changed, 2089 insertions(+), 264 deletions(-) create mode 100644 commit_hash.h.in create mode 100644 src/Client/Events/Render/RenderPotionHUDEvent.hpp create mode 100644 src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.cpp create mode 100644 src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.hpp create mode 100644 src/Client/Module/Modules/BlockOutline/BlockOutlineListener.hpp create mode 100644 src/Client/Module/Modules/FasterInventory/FasterInventory.hpp create mode 100644 src/Client/Module/Modules/FasterInventory/FasterInventoryListener.hpp create mode 100644 src/Client/Module/Modules/OpponentReach/OpponentReach.hpp create mode 100644 src/Client/Module/Modules/OpponentReach/OpponentReachListener.hpp create mode 100644 src/Client/Module/Modules/PotionHUD/PotionHUD.hpp create mode 100644 src/Client/Module/Modules/PotionHUD/PotionHUDListener.hpp create mode 100644 src/Client/Module/Modules/ViewModel/ViewModel.hpp create mode 100644 src/Client/Module/Modules/ViewModel/ViewModelListener.hpp create mode 100644 src/SDK/Client/Actor/Components/MobEffectsComponent.hpp create mode 100644 src/SDK/Client/Actor/Components/OnGroundFlagComponent.hpp create mode 100644 src/SDK/Client/Network/Packet/ContainerClosePacket.hpp create mode 100644 src/SDK/Client/Network/Packet/ContainerOpenPacket.hpp create mode 100644 src/SDK/Client/Network/Packet/InteractPacket.hpp create mode 100644 src/SDK/Client/Network/Packet/Types/ContainerID.hpp create mode 100644 src/SDK/Client/Network/Packet/Types/ContainerType.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 300ccc61..bf17e8dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,20 @@ include(FetchContent) set(CMAKE_CXX_STANDARD 23) +execute_process( + COMMAND git rev-parse --short HEAD + OUTPUT_VARIABLE COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/commit_hash.h.in + ${CMAKE_CURRENT_BINARY_DIR}/commit_hash.h + @ONLY +) + +add_definitions(-DCOMMIT_HASH="${COMMIT_HASH}") + if(MSVC) add_compile_options(/MT) @@ -71,11 +85,11 @@ if("${MSVC_RUNTIME}" STREQUAL "") endif() -file(GLOB_RECURSE sources "main.cpp" "src/**/*.cpp" "src/**/*.hpp" "lib/**/*.cpp") +file(GLOB_RECURSE sources "main.cpp" "src/**/*.cpp" "src/**/*.hpp" "lib/**/*.cpp" "src/Client/GUI/Engine/*.cpp") add_library(${PROJECT_NAME} SHARED ${sources} src/SDK/Client/Render/Matrix.cpp src/Assets/Assets.rc) -target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lib/include/" "${CMAKE_CURRENT_LIST_DIR}/lib/glm/" "${CMAKE_CURRENT_LIST_DIR}/lib/ImGui") +target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lib/include/" "${CMAKE_CURRENT_LIST_DIR}/lib/glm/") # Disable RTTI if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") @@ -95,7 +109,5 @@ FetchContent_Declare( FetchContent_MakeAvailable(libhat) - - target_link_libraries(${PROJECT_NAME} PRIVATE libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) \ No newline at end of file diff --git a/commit_hash.h.in b/commit_hash.h.in new file mode 100644 index 00000000..42c0d3d0 --- /dev/null +++ b/commit_hash.h.in @@ -0,0 +1,6 @@ +#ifndef COMMIT_HASH_H +#define COMMIT_HASH_H + +#define COMMIT_HASH "@COMMIT_HASH@" + +#endif // COMMIT_HASH_H \ No newline at end of file diff --git a/src/Client/Events/EventHandler.cpp b/src/Client/Events/EventHandler.cpp index 274ea893..54cf3319 100644 --- a/src/Client/Events/EventHandler.cpp +++ b/src/Client/Events/EventHandler.cpp @@ -3,7 +3,9 @@ #include "EventHandler.hpp" #include "Render/RenderEvent.hpp" #include "Network/PacketEvent.hpp" +#include "Render/RenderPotionHUDEvent.hpp" #include "../Client.hpp" + // TODO: rewrite event stuff void EventHandler::registerListener(Listener *listener) { Logger::debug("[EventHandler] Added listener: " + listener->name); @@ -245,4 +247,12 @@ void EventHandler::onGetTexture(GetTextureEvent &event) { for (Listener *&listener: listeners) { listener->onGetTexture(event); } +} + +void EventHandler::onRenderPotionHUD(RenderPotionHUDEvent &event) { + if (Client::disable) return; + if (!ModuleManager::initialized) return; + for (Listener *&listener: listeners) { + listener->onRenderPotionHUD(event); + } } \ No newline at end of file diff --git a/src/Client/Events/EventHandler.hpp b/src/Client/Events/EventHandler.hpp index 533efbdb..a4c95126 100644 --- a/src/Client/Events/EventHandler.hpp +++ b/src/Client/Events/EventHandler.hpp @@ -15,6 +15,7 @@ #include "Render/HurtColorEvent.hpp" #include "Render/GammaEvent.hpp" #include "Render/GetTextureEvent.hpp" +#include "Render/RenderPotionHUDEvent.hpp" class EventHandler { @@ -69,5 +70,7 @@ class EventHandler { static void onGetTexture(GetTextureEvent &event); + static void onRenderPotionHUD(RenderPotionHUDEvent &event); + static void unregisterAll(); }; \ No newline at end of file diff --git a/src/Client/Events/Listener.hpp b/src/Client/Events/Listener.hpp index 71274913..f73a6112 100644 --- a/src/Client/Events/Listener.hpp +++ b/src/Client/Events/Listener.hpp @@ -18,6 +18,7 @@ #include "Render/SetTopScreenNameEvent.hpp" #include "Game/RaknetTickEvent.hpp" #include "Render/GetTextureEvent.hpp" +#include "Render/RenderPotionHUDEvent.hpp" class Listener { public: @@ -61,5 +62,7 @@ class Listener { virtual void onGetTexture(GetTextureEvent &event) {}; + virtual void onRenderPotionHUD(RenderPotionHUDEvent &event) {}; + virtual void onUnregister() {}; }; diff --git a/src/Client/Events/Render/RenderPotionHUDEvent.hpp b/src/Client/Events/Render/RenderPotionHUDEvent.hpp new file mode 100644 index 00000000..0f0ad962 --- /dev/null +++ b/src/Client/Events/Render/RenderPotionHUDEvent.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "../Event.hpp" +#include "../Cancellable.hpp" +#include + +class RenderPotionHUDEvent : public Event, public Cancellable {}; \ No newline at end of file diff --git a/src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRect/RoundedRect.cpp b/src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRect/RoundedRect.cpp index 412f578f..63cd4004 100644 --- a/src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRect/RoundedRect.cpp +++ b/src/Client/GUI/Engine/Elements/Shapes/Rect/RoundedRect/RoundedRect.cpp @@ -1,6 +1,4 @@ #include "../../../../Engine.hpp" -#include -#include void FlarialGUI::RoundedRect(float x, float y, const D2D_COLOR_F color, const float width, const float height, float radiusX, float radiusY, ImDrawFlags flags) { diff --git a/src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.cpp b/src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.cpp new file mode 100644 index 00000000..db7ef8f0 --- /dev/null +++ b/src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.cpp @@ -0,0 +1,23 @@ +#include "HudMobEffectsRenderer.hpp" +#include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" +#include "../../../Events/EventHandler.hpp" + +HudMobEffectsRendererHook::HudMobEffectsRendererHook() : Hook("HudMobEffectsRenderer_render", GET_SIG("HudMobEffectsRenderer::render")) {} + +void HudMobEffectsRendererHook::enableHook() { + this->autoHook((void *) HudMobEffectsRenderer_renderCallback, (void **) &funcOriginal); +} + +void *HudMobEffectsRendererHook::HudMobEffectsRenderer_renderCallback(struct HudMobEffectsRenderer *_this, + struct MinecraftUIRenderContext *renderContext, + struct IClientInstance *client, + struct UIControl *owner, int pass, + struct RectangleArea *renderAABB) { + + auto event = RenderPotionHUDEvent(); + EventHandler::onRenderPotionHUD(event); + + if(event.isCancelled()) return nullptr; + + return funcOriginal(_this, renderContext, client, owner, pass, renderAABB); +} \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.hpp b/src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.hpp new file mode 100644 index 00000000..c02fb479 --- /dev/null +++ b/src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include +#include "../Hook.hpp" + +class HudMobEffectsRendererHook : public Hook { +private: + static void *HudMobEffectsRenderer_renderCallback(class HudMobEffectsRenderer *_this, class MinecraftUIRenderContext *renderContext, class IClientInstance *client, class UIControl *owner, int pass, class RectangleArea *renderAABB); + +public: + typedef void *(__thiscall *original)(class HudMobEffectsRenderer *_this, class MinecraftUIRenderContext *renderContext, class IClientInstance *client, class UIControl *owner, int pass, class RectangleArea *renderAABB); + + static inline original funcOriginal = nullptr; + + HudMobEffectsRendererHook(); + + void enableHook() override; +}; diff --git a/src/Client/Hook/Manager.cpp b/src/Client/Hook/Manager.cpp index 549b98da..be7ccc62 100644 --- a/src/Client/Hook/Manager.cpp +++ b/src/Client/Hook/Manager.cpp @@ -16,6 +16,7 @@ #include "Hooks/Visual/TimeChangerHook.hpp" #include "Hooks/Game/getSensHook.hpp" #include "Hooks/Render/TextureGroup_getTextureHook.hpp" +#include "Hooks/Render/HudMobEffectsRenderer.hpp" //#include "Hooks/Game/RenderItemGroup.hpp" //#include "Hooks/Game/getCurrentSwingDuration.hpp" @@ -65,6 +66,7 @@ void HookManager::initialize() { hooks.push_back(new TimeChangerHook()); hooks.push_back(new SendPacketHook()); hooks.push_back(new getSensHook()); + hooks.push_back(new HudMobEffectsRendererHook()); //hooks.push_back(new RenderItemGroupHook()); //hooks.push_back(new getCurrentSwingDuration()); diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 6d02d67f..a36c5495 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -67,7 +67,10 @@ #include #include "Modules/ItemPhysics/ItemPhysics.hpp" -#include "Modules/Crosshair/Crosshair.hpp" +#include "Modules/OpponentReach/OpponentReach.hpp" +#include "Modules/ViewModel/ViewModel.hpp" +#include "Modules/PotionHUD/PotionHUD.hpp" +#include "Modules/FasterInventory/FasterInventory.hpp" namespace ModuleManager { std::unordered_map moduleMap; @@ -129,11 +132,8 @@ void ModuleManager::initialize() { addModule(new HurtColor()); addModule(new FogColor()); addModule(new ArmorHUD()); - addModule(new TimeChanger()); - addModule(new RenderOptions()); - addModule(new PaperDoll()); addModule(new GuiScale()); addModule(new WeatherChanger()); @@ -154,10 +154,15 @@ void ModuleManager::initialize() { addModule(new AutoRQ()); addModule(new HitPing()); addModule(new InstantHurtAnimation()); + addModule(new OpponentReach()); + addModule(new ViewModel()); + addModule(new PotionHUD()); + addModule(new FasterInventory()); + //addModule(new MovableChat()); //addModule(new CompactChat()); addModule(new ItemPhysics()); - addModule(new Crosshair()); + EventHandler::registerListener(new GUIKeyListener("GuiKeyListener")); EventHandler::registerListener(new DiscordRPCListener("DiscordRPC")); @@ -196,7 +201,7 @@ bool ModuleManager::doesAnyModuleHave(const std::string& settingName) { if (pair.second->settings.getSettingByName(settingName) != nullptr) if (pair.second->settings.getSettingByName(settingName)->value && - pair.second->isEnabled() && pair.second->active) { + pair.second->isEnabled() && (pair.second->active || pair.second->defaultKeybind.empty())) { result = true; break; } @@ -210,4 +215,4 @@ Module* ModuleManager::getModule(const std::string& name) { size_t hash = std::hash{}(name); return moduleMap[hash]; -} +} \ No newline at end of file diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp index c9f2d40f..3b2f2090 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp @@ -36,6 +36,7 @@ class ArmorHUD : public Module { settings.addSetting("percentageY", 0.0f); } if (settings.getSettingByName("vertical") == nullptr) settings.addSetting("vertical", false); + if (settings.getSettingByName("durability_left") == nullptr) settings.addSetting("durability_left", false); if (settings.getSettingByName("percent") == nullptr) settings.addSetting("percent", false); if (settings.getSettingByName("color") == nullptr) settings.addSetting("color", false); if (settings.getSettingByName("showdurability") == nullptr) settings.addSetting("showdurability", false); @@ -77,6 +78,8 @@ class ArmorHUD : public Module { this->addSlider("Size", "", this->settings.getSettingByName("uiscale")->value); this->addToggle("Vertical ArmorHUD", "To switch between a vertical or horizontal layout", this->settings.getSettingByName("vertical")->value); + + this->addToggle("Change Color", "", this->settings.getSettingByName("color")->value); this->extraPadding(); @@ -85,6 +88,9 @@ class ArmorHUD : public Module { this->addToggle("Show Durability", "", this->settings.getSettingByName("showdurability")->value); this->addConditionalSlider(this->settings.getSettingByName("showdurability")->value, "Text Size", "Text size of Durability", this->settings.getSettingByName("textSize")->value, 0.25f, 0.0f, true); this->addToggle("Show Durability in %", "", this->settings.getSettingByName("percent")->value); + if(this->settings.getSettingByName("vertical")->value){ + this->addToggle("Durability to the left", "", this->settings.getSettingByName("vertical")->value); + } this->extraPadding(); this->addHeader("Colors"); diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp index 36dfef2e..39e8598d 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp @@ -53,6 +53,7 @@ class ArmorHUDListener : public Listener { if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { auto vertical = module->settings.getSettingByName("vertical")->value; + auto durability_left = module->settings.getSettingByName("durability_left")->value; float spacing = testSpacing; @@ -93,13 +94,15 @@ class ArmorHUDListener : public Listener { } float spacingX = vertical ? (durabilities[0][1] != 0 ? spacing : 0) : 0; + if(durability_left) spacingX *= -1; float spacingY = vertical ? 0: (durabilities[0][1] != 0 ? spacing : 0); - FlarialGUI::FlarialTextWithFont(currentPos.x + testOffset.x + spacingX, currentPos.y + testOffset.y + spacingY, + FlarialGUI::FlarialTextWithFont(currentPos.x + testOffset.x + spacingX, + currentPos.y + testOffset.y + spacingY, widecstr, textWidth * 6.9f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, textWidth, - DWRITE_FONT_WEIGHT_NORMAL, color, false); + DWRITE_FONT_WEIGHT_NORMAL, color, true); } @@ -112,6 +115,8 @@ class ArmorHUDListener : public Listener { if (vertical) xoffset += spacing; else yoffset += spacing; + if(durability_left) xoffset *= -1; + for (int i = 1; i < 5; i++) { if (vertical) ymodifier += spacing; @@ -151,7 +156,7 @@ class ArmorHUDListener : public Listener { currentPos.y + ymodifier + yoffset + testOffset.y, widecstr, textWidth * 6.9f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, textWidth, - DWRITE_FONT_WEIGHT_NORMAL, color, false); + DWRITE_FONT_WEIGHT_NORMAL, color, true); } } } diff --git a/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp b/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp index 262c08bc..bbf38502 100644 --- a/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp +++ b/src/Client/Module/Modules/BlockOutline/BlockOutline.hpp @@ -4,6 +4,7 @@ #include "../../../Client.hpp" #include "../../../../Utils/Utils.hpp" #include "../../../../Utils/Memory/CustomAllocator/Buffer.hpp" // why its not hpp here ??? +#include "BlockOutlineListener.hpp" class BlockOutline : public Module { @@ -24,11 +25,11 @@ class BlockOutline : public Module { }; void onSetup() override { // init color just in case - highlightColorRipRelAddr = Memory::findSig(GET_SIG("blockHighlightColor")); // RIP REL 4BYTE FROM FUNC OFFSET ADDR + highlightColorRipRelAddr = GET_SIG_ADDRESS("blockHighlightColor"); // RIP REL 4BYTE FROM FUNC OFFSET ADDR if(highlightColorRipRelAddr == NULL) return; highlightColorOrigRipRel = *(UINT32*)highlightColorRipRelAddr; - outlineColorRipRelAddr = Memory::findSig(GET_SIG("mce::Color::BLACK")); + outlineColorRipRelAddr = GET_SIG_ADDRESS("mce::Color::BLACK"); if(outlineColorRipRelAddr == NULL) return; outlineColorOrigRipRel = *(UINT32*)outlineColorRipRelAddr; // TODO: make it look better @@ -69,11 +70,13 @@ class BlockOutline : public Module { void onEnable() override { onColorChange(); + EventHandler::registerListener(new BlockOutlineListener("BlockOutline", this, selectionColor)); patch(); Module::onEnable(); } void onDisable() override { + EventHandler::unregisterListener("BlockOutline"); unpatch(); Module::onDisable(); } diff --git a/src/Client/Module/Modules/BlockOutline/BlockOutlineListener.hpp b/src/Client/Module/Modules/BlockOutline/BlockOutlineListener.hpp new file mode 100644 index 00000000..4f28eeac --- /dev/null +++ b/src/Client/Module/Modules/BlockOutline/BlockOutlineListener.hpp @@ -0,0 +1,43 @@ +#pragma once + + +#include "../../../../SDK/SDK.hpp" +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../Module.hpp" +#include "../../../GUI/Engine/Engine.hpp" +#include "../../../../SDK/SDK.hpp" +#include "BlockOutline.hpp" +#include +#include + +class BlockOutlineListener : public Listener { + + Module *module; + MCCColor* selectionColor; + + void onColorChange() { + // change our color + D2D1_COLOR_F color; + if (module->settings.getSettingByName("color_rgb")->value) color = FlarialGUI::rgbColor; + else color = FlarialGUI::HexToColorF(module->settings.getSettingByName("color")->value); + + selectionColor->r = color.r; + selectionColor->g = color.g; + selectionColor->b = color.b; + selectionColor->a = module->settings.getSettingByName("colorOpacity")->value; + } + + void onTick(TickEvent &event) override { + if (module->settings.getSettingByName("color_rgb")->value) + onColorChange(); + } + +public: + explicit BlockOutlineListener(const char string[5], Module *module, MCCColor* color) { + this->name = string; + this->module = module; + this->selectionColor = color; + } +}; \ No newline at end of file diff --git a/src/Client/Module/Modules/ComboCounter/ComboListener.hpp b/src/Client/Module/Modules/ComboCounter/ComboListener.hpp index cc88806b..1098b9a7 100644 --- a/src/Client/Module/Modules/ComboCounter/ComboListener.hpp +++ b/src/Client/Module/Modules/ComboCounter/ComboListener.hpp @@ -19,8 +19,10 @@ class ComboListener : public Listener { Module *module; void onAttack(AttackEvent &event) override { - Combo++; - last_hit = std::chrono::high_resolution_clock::now(); + if(std::chrono::high_resolution_clock::now() - last_hit > std::chrono::milliseconds(480)) { + Combo++; + last_hit = std::chrono::high_resolution_clock::now(); + } } void onTick(TickEvent &event) override { @@ -38,7 +40,6 @@ class ComboListener : public Listener { if (module->isEnabled()) { auto comboStr = std::to_string(Combo); this->module->normalRender(8, comboStr); - } } diff --git a/src/Client/Module/Modules/FasterInventory/FasterInventory.hpp b/src/Client/Module/Modules/FasterInventory/FasterInventory.hpp new file mode 100644 index 00000000..918bd6c3 --- /dev/null +++ b/src/Client/Module/Modules/FasterInventory/FasterInventory.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" +#include "FasterInventoryListener.hpp" + + +class FasterInventory : public Module { +public: + + FasterInventory() : Module("Faster Inventory", "Makes inventory opening ping-independent", IDR_LIKE_PNG, "") { + Module::setup(); + }; + + void onEnable() override { + EventHandler::registerListener(new FasterInventoryListener("FasterInventory", this)); + Module::onEnable(); + } + + void onDisable() override { + EventHandler::unregisterListener("FasterInventory"); + Module::onDisable(); + } +}; \ No newline at end of file diff --git a/src/Client/Module/Modules/FasterInventory/FasterInventoryListener.hpp b/src/Client/Module/Modules/FasterInventory/FasterInventoryListener.hpp new file mode 100644 index 00000000..fa75da68 --- /dev/null +++ b/src/Client/Module/Modules/FasterInventory/FasterInventoryListener.hpp @@ -0,0 +1,149 @@ +#pragma once + +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../../../../Utils/Logger/Logger.hpp" +#include "../Module.hpp" +#include "../../../../SDK/SDK.hpp" +#include "../../../../SDK/Client/Network/Packet/InteractPacket.hpp" +#include "../../../../SDK/Client/Network/Packet/Types/ContainerID.hpp" +#include "../../../../SDK/Client/Network/Packet/ContainerClosePacket.hpp" +#include "../../../../SDK/Client/Network/Packet/ContainerOpenPacket.hpp" +#include "../../../Hook/Hooks/Game/PacketHooks.hpp" +#include + +class FasterInventoryListener : public Listener { + Module* module; + static inline std::queue containerQueue; + static inline std::mutex queueMutex; + static inline bool inventoryOpen; + static inline bool inventoryOpenServerside; + static inline bool sendingClosePacket; + static inline int desyncTicks = 0; + +public: + void onRaknetTick(RaknetTickEvent &event) override { + if (module->isEnabled()) { + std::string serverIP = SDK::getServerIP(); + if (serverIP.find("hive") != std::string::npos) { + if (!module->restricted) { + FlarialGUI::Notify("Can't use Faster Inventory on " + serverIP); // TODO: move restrictions to API + module->restricted = true; + } + } else { + module->restricted = false; // no need with low ping and in local worlds + } + } + + } + + void onPacketSend(PacketEvent &event) override { + if (!SDK::clientInstance->getLocalPlayer()) return; + if(module->restricted || SDK::getServerPing() < 10) return; + auto packet = event.getPacket(); + if(packet->getId() == MinecraftPacketIds::Interact) { + auto ip = (InteractPacket *) packet; + if(ip->Action == InteractPacket::Action::OpenInventory) { + OpenInventory(); + inventoryOpen = true; + return; + } + } + + if(packet->getId() == MinecraftPacketIds::ContainerClose) { + auto ccp = (ContainerClosePacket *) packet; + if(sendingClosePacket) return; + if(!inventoryOpen) return; + if(ccp->ContainerId == ContainerID::None || ccp->ContainerId == ContainerID::Inventory) { + CloseInventory(); + event.cancel(); + } else { + // Only allow valid closes if we have opened containers in queue + std::lock_guard lock(queueMutex); + if (!containerQueue.empty() && ccp->ContainerId == containerQueue.front()) { + containerQueue.pop(); + } + } + } + }; + + void onPacketReceive(PacketEvent &event) override { + if (!SDK::clientInstance->getLocalPlayer()) return; + if(module->restricted || SDK::getServerPing() < 10) return; + auto packet = event.getPacket(); + if(packet->getId() == MinecraftPacketIds::ContainerOpen) { + auto cop = (ContainerOpenPacket *) packet; + if(cop->Type == ContainerType::Inventory) { + inventoryOpenServerside = true; + if (!inventoryOpen) { + // If inventory is not open, immediately send a ContainerClose + SendClosePacket(cop->ContainerId); + } else { + std::lock_guard lock(queueMutex); + containerQueue.push(cop->ContainerId); + } + event.cancel(); + } + } + if(packet->getId() == MinecraftPacketIds::ContainerClose) { + if(inventoryOpenServerside) { + inventoryOpenServerside = false; + } + } + }; + + void onTick(TickEvent &event) override { + if (!SDK::clientInstance->getLocalPlayer()) return; + if(module->restricted || SDK::getServerPing() < 10) return; + if(inventoryOpen != inventoryOpenServerside) { + desyncTicks++; + } else { + desyncTicks = 0; + } + if(desyncTicks > 10) { + CloseInventory(); + } + } + + static void CloseInventory() { + std::lock_guard lock(queueMutex); + inventoryOpen = false; + while (!containerQueue.empty()) { + SendClosePacket(containerQueue.front()); + containerQueue.pop(); + } + }; + + static void OpenInventory() { + inventoryOpen = true; + auto packet = SDK::createPacket((int)MinecraftPacketIds::ContainerOpen); + auto cop = (ContainerOpenPacket *) packet.get(); + cop->ContainerId = ContainerID::Inventory; + cop->Type = ContainerType::Inventory; + cop->Pos = BlockPos(0, 0, 0); + cop->EntityUniqueID = -1; + + if(SendPacketHook::PacketHandlerDispatcher && SendPacketHook::NetworkIdentifier && SendPacketHook::NetEventCallback) { + SendPacketHook::receivePacketContainerOpenOriginal(SendPacketHook::PacketHandlerDispatcher, + SendPacketHook::NetworkIdentifier, + SendPacketHook::NetEventCallback, + packet); + } + } + + static void SendClosePacket(ContainerID containerId) { + auto packet = SDK::createPacket((int)MinecraftPacketIds::ContainerClose); + auto ccp = (ContainerClosePacket *) packet.get(); + ccp->ContainerId = containerId; + ccp->ServerInitiatedClose = false; + sendingClosePacket = true; + SDK::clientInstance->getPacketSender()->sendToServer(ccp); + sendingClosePacket = false; + }; + + FasterInventoryListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + } +}; \ No newline at end of file diff --git a/src/Client/Module/Modules/Freelook/LookListener.hpp b/src/Client/Module/Modules/Freelook/LookListener.hpp index 22db65be..4b87b131 100644 --- a/src/Client/Module/Modules/Freelook/LookListener.hpp +++ b/src/Client/Module/Modules/Freelook/LookListener.hpp @@ -105,10 +105,10 @@ class LookListener : public Listener { this->name = string; this->module = module; - yaw1 = Memory::findSig(GET_SIG("CameraYaw")); - yaw2 = Memory::findSig(GET_SIG("CameraYaw2")); - pitch = Memory::findSig(GET_SIG("CameraPitch")); - movement = Memory::findSig(GET_SIG("CameraMovement")); + yaw1 = GET_SIG_ADDRESS("CameraYaw"); + yaw2 = GET_SIG_ADDRESS("CameraYaw2"); + pitch = GET_SIG_ADDRESS("CameraPitch"); + movement = GET_SIG_ADDRESS("CameraMovement"); originalYaw1 = std::bit_cast>(*(std::byte(*)[4])yaw1); originalYaw2 = std::bit_cast>(*(std::byte(*)[4])yaw2); diff --git a/src/Client/Module/Modules/GuiScale/GuiScale.hpp b/src/Client/Module/Modules/GuiScale/GuiScale.hpp index 382042cc..665b2b14 100644 --- a/src/Client/Module/Modules/GuiScale/GuiScale.hpp +++ b/src/Client/Module/Modules/GuiScale/GuiScale.hpp @@ -32,24 +32,22 @@ class GuiScale : public Module { void settingsRender() override { + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); - float x = Constraints::PercentageConstraint(0.019, "left"); - float y = Constraints::PercentageConstraint(0.10, "top"); + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); - FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(0.88f, "height")); + float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), + toggleY, this->settings.getSettingByName("guiscale")->value, 4.0f); - this->addHeader("UI Size"); - this->addSlider("UI Size", "", this->settings.getSettingByName("guiscale")->value); - - FlarialGUI::UnsetScrollView(); - - this->resetPadding(); + this->settings.getSettingByName("guiscale")->value = percent; } }; diff --git a/src/Client/Module/Modules/HitPing/HitPingListener.hpp b/src/Client/Module/Modules/HitPing/HitPingListener.hpp index 297321f3..06bba630 100644 --- a/src/Client/Module/Modules/HitPing/HitPingListener.hpp +++ b/src/Client/Module/Modules/HitPing/HitPingListener.hpp @@ -54,7 +54,7 @@ class HitPingListener : public Listener { // hitting too fast (*hitActors)[id].second.lastActorTouch = start; return; - } else if (!(*hitActors)[id].first){ + } else if (!(*hitActors)[id].first) { (*hitActors)[id].first = true; (*hitActors)[id].second.lastActorTouch = start; (*hitActors)[id].second.lastActorStableTouch = start; diff --git a/src/Client/Module/Modules/HueChanger/HueChanger.hpp b/src/Client/Module/Modules/HueChanger/HueChanger.hpp index acc147a0..0d4630fc 100644 --- a/src/Client/Module/Modules/HueChanger/HueChanger.hpp +++ b/src/Client/Module/Modules/HueChanger/HueChanger.hpp @@ -33,23 +33,23 @@ class HueChanger : public Module { void settingsRender() override { + const float textWidth = Constraints::RelativeConstraint(0.26, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top"); - const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); - - - FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); - FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(0.88f, "height")); + FlarialGUI::FlarialTextWithFont(x, y, L"Saturation Intensity", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); - this->addHeader("Misc"); - this->addSlider("Saturation Intensity", "", this->settings.getSettingByName("intensity")->value); + float percent = FlarialGUI::Slider(3, x + FlarialGUI::SettingsTextWidth("Saturation Intensity "), + y, + this->settings.getSettingByName("intensity")->value, 3.0f); - FlarialGUI::UnsetScrollView(); + this->settings.getSettingByName("intensity")->value = percent; - this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/HurtColor/HurtColor.hpp b/src/Client/Module/Modules/HurtColor/HurtColor.hpp index bcc24d6d..38684fbb 100644 --- a/src/Client/Module/Modules/HurtColor/HurtColor.hpp +++ b/src/Client/Module/Modules/HurtColor/HurtColor.hpp @@ -34,26 +34,23 @@ class HurtColor : public Module { void settingsRender() override { + float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top"); - const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); + FlarialGUI::FlarialTextWithFont(x, y, L"Color", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(0, x + FlarialGUI::SettingsTextWidth("Color "), + y - Constraints::SpacingConstraint(0.017, textWidth), + settings.getSettingByName("color")->value, + settings.getSettingByName("color_rgb")->value); - - FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); - FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(0.88f, "height")); - - this->addHeader("Colors"); - this->addColorPicker("Hurt Color", "", settings.getSettingByName("color")->value, + FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("color")->value, settings.getSettingByName("colorOpacity")->value, settings.getSettingByName("color_rgb")->value); - FlarialGUI::UnsetScrollView(); - - this->resetPadding(); - } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp index 9f05a496..74d15e13 100644 --- a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp +++ b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimation.hpp @@ -25,30 +25,38 @@ class InstantHurtAnimation : public Module { } void defaultConfig() override { - - if (settings.getSettingByName("tryToExcludeTeam") == nullptr) settings.addSetting("tryToExcludeTeam", false); - + if (settings.getSettingByName("onlyWithArmor") == nullptr) settings.addSetting("onlyWithArmor", true); + if (settings.getSettingByName("tryToExcludeTeam") == nullptr) settings.addSetting("tryToExcludeTeam", true); } void settingsRender() override { + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); - float x = Constraints::PercentageConstraint(0.019, "left"); - float y = Constraints::PercentageConstraint(0.10, "top"); - - const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Try to exclude team", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); - FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(0.88f, "height")); + if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( + "tryToExcludeTeam")->value)) + this->settings.getSettingByName("tryToExcludeTeam")->value = !this->settings.getSettingByName( + "tryToExcludeTeam")->value; - this->addHeader("Misc"); - this->addToggle("Try to Exclude Team", "E.g. your team in Bedwars", this->settings.getSettingByName("tryToExcludeTeam")->value); + toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::UnsetScrollView(); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Only with armor", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); - this->resetPadding(); + if (FlarialGUI::Toggle(1, toggleX, toggleY, this->settings.getSettingByName( + "onlyWithArmor")->value)) + this->settings.getSettingByName("onlyWithArmor")->value = !this->settings.getSettingByName( + "onlyWithArmor")->value; } }; diff --git a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp index 224d9e9b..d95bae40 100644 --- a/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp +++ b/src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp @@ -20,42 +20,6 @@ class InstantHurtAnimationListener : public Listener { Module *module; - static bool IsOnTeam(Actor *actor) { - auto player = SDK::clientInstance->getLocalPlayer(); - if (!player) return false; - - std::string playerName = *player->getNametag(); - std::string actorName = *actor->getNametag(); - - if (playerName.empty() || actorName.empty()) return false; - - auto cleanName = [](std::string &name) { - constexpr std::string tags[] = {"§r", "§l"}; - for (const auto &tag : tags) { - size_t pos; - while ((pos = name.find(tag)) != std::string::npos) { - name.erase(pos, tag.length()); - } - } - }; - - cleanName(playerName); - cleanName(actorName); - - size_t playerTeamPos = playerName.find("§"); - if (playerTeamPos == std::string::npos) return false; - - std::string playerTeam = playerName.substr(playerTeamPos + 2, 1); - - size_t actorTeamPos = actorName.find("§"); - if (actorTeamPos != std::string::npos) { - std::string actorTeam = actorName.substr(actorTeamPos + 2, 1); - return actorTeam == playerTeam; - } - - return false; - } - void onPacketReceive(PacketEvent &event) override { auto player = SDK::clientInstance->getLocalPlayer(); if (!SDK::clientInstance->getLocalPlayer()) return; @@ -82,8 +46,20 @@ class InstantHurtAnimationListener : public Listener { void onAttack(AttackEvent &event) override { + if(!event.getActor()->hasCategory(ActorCategory::Player)) return; + if(module->settings.getSettingByName("onlyWithArmor")->value) { + auto armorContainer = event.getActor()->getArmorContainer(); + if(armorContainer == nullptr) return; + + ItemStack* helmetItem = armorContainer->getItem(0); + ItemStack* chestplateItem = armorContainer->getItem(1); + ItemStack* leggingsItem = armorContainer->getItem(2); + ItemStack* bootsItem = armorContainer->getItem(3); + + if (!helmetItem->item || !chestplateItem->item || !leggingsItem->item || !bootsItem->item) return; + } if(module->settings.getSettingByName("tryToExcludeTeam")->value) - if(IsOnTeam(event.getActor())) return; + if(event.getActor()->IsOnSameTeam(SDK::clientInstance->getLocalPlayer())) return; ClearOldHits(); diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp index 3c096cb7..4264c5ba 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp @@ -7,13 +7,6 @@ #include "../../../../SDK/Client/Actor/ItemActor.hpp" #include "../../../../Utils/Memory/CustomAllocator/Buffer.hpp" -static char data[0x5], data2[0x5]; - -float lerp(float a, float b, float t) { - return a + t * (b - a); -} - - class INeedADecentHookClassForMemory { public: void* pointer = nullptr; @@ -22,11 +15,12 @@ class INeedADecentHookClassForMemory { INeedADecentHookClassForMemory(void* function, void* hook) { pointer = function; - if (!IsBadReadPtr(pointer, sizeof(pointer))) { - if (MH_CreateHook(pointer, hook, &trampoline) == MH_OK) { - valid = true; - } - } + + if (IsBadReadPtr(pointer, sizeof(pointer))) + return; + + if (const auto status = MH_CreateHook(pointer, hook, &trampoline); status == MH_OK) + valid = true; } ~INeedADecentHookClassForMemory() { @@ -34,11 +28,13 @@ class INeedADecentHookClassForMemory { } void enable() const { - if (valid) MH_EnableHook(pointer); + if (valid) + MH_EnableHook(pointer); } void disable() const { - if (valid) MH_DisableHook(pointer); + if (valid) + MH_DisableHook(pointer); } }; @@ -48,88 +44,163 @@ void ItemPhysicsListener::ItemRenderer_render(ItemRenderer* _this, BaseActorRend using func_t = void(*)(ItemRenderer*, BaseActorRenderContext*, ActorRenderData*); static auto oFunc = reinterpret_cast(ItemRenderer_renderHook->trampoline); - static auto mod = reinterpret_cast(ModuleManager::getModule("Item Physics")); - mod->listener->renderData = renderData; + if(!ModuleManager::initialized) return oFunc(_this, renderCtx, renderData); + + static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); + const auto listener = mod->listener; + + listener->renderData = renderData; oFunc(_this, renderCtx, renderData); } void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, float y, float z) { - static auto rotateSig = Memory::findSig(GET_SIG("glm_rotate")); + static auto rotateSig = GET_SIG_ADDRESS("glm_rotate"); using glm_rotate_t = void(__fastcall*)(glm::mat4x4&, float, float, float, float); static auto glm_rotate = reinterpret_cast(rotateSig); - static auto mod = reinterpret_cast(ModuleManager::getModule("Item Physics")); - const auto renderData = mod->listener->renderData; - if (renderData == nullptr) return; + if(!ModuleManager::initialized) return; + + static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); + const auto listener = mod->listener; + const auto renderData = listener->renderData; + + if (renderData == nullptr) + return; auto curr = reinterpret_cast(renderData->actor); + static float height = 0.5f; - if (!mod->listener->actorData.contains(curr)) { + bool isOnGround = curr->isOnGround(); + + if (!listener->actorData.contains(curr)) { std::random_device rd; std::mt19937 gen(rd()); - std::uniform_int_distribution dist(0, 1), dist2(0, 359); + + std::uniform_int_distribution dist(0, 1); + std::uniform_int_distribution dist2(0, 359); const auto vec = Vec3(dist2(gen), dist2(gen), dist2(gen)); const auto sign = Vec3(dist(gen) * 2 - 1, dist(gen) * 2 - 1, dist(gen) * 2 - 1); - mod->listener->actorData.emplace(curr, std::tuple{ curr->isOnGround() ? 0.f : height, vec, sign }); + + auto def = std::tuple{ isOnGround ? 0.f : height, vec, sign}; + listener->actorData.emplace(curr, def); } - auto& [yMod, vec, sign] = mod->listener->actorData.at(curr); - yMod -= height * (1.f / MC::fps); + const float deltaTime = 1.f / static_cast(MC::fps); - if (yMod <= 0.f && curr->isOnGround()) { + float& yMod = std::get<0>(listener->actorData.at(curr)); + + yMod -= height * deltaTime; + + if (yMod <= 0.f) yMod = 0.f; - } Vec3 pos = renderData->position; pos.y += yMod; + auto& vec = std::get<1>(listener->actorData.at(curr)); + auto& sign = std::get<2>(listener->actorData.at(curr)); + auto& settings = mod->settings; const auto speed = settings.getSettingByName("speed")->value; const auto xMul = settings.getSettingByName("xmul")->value; const auto yMul = settings.getSettingByName("ymul")->value; const auto zMul = settings.getSettingByName("zmul")->value; - if (!curr->isOnGround() || yMod > 0.f) { - vec.x = std::fmod(vec.x + sign.x * (1.f / MC::fps) * speed * xMul, 360.f); - vec.y = std::fmod(vec.y + sign.y * (1.f / MC::fps) * speed * yMul, 360.f); - vec.z = std::fmod(vec.z + sign.z * (1.f / MC::fps) * speed * zMul, 360.f); - } + if (!isOnGround || yMod > 0.f) { + vec.x += static_cast(sign.x) * deltaTime * speed * xMul; + vec.y += static_cast(sign.y) * deltaTime * speed * yMul; + vec.z += static_cast(sign.z) * deltaTime * speed * zMul; - const Vec3 targetVec = (yMod < 0.1f) ? Vec3(90.f, vec.y, vec.z) : vec; + if (vec.x > 360.f) + vec.x -= 360.f; - if (curr->isOnGround()) { - if (curr->getStack().block == nullptr) { - const Vec3 targetVec = (yMod < 0.1) ? Vec3(90.f, vec.y - 0.12, vec.z) : vec; - } + if (vec.x < 0.f) + vec.x += 360.f; + + if (vec.y > 360.f) + vec.y -= 360.f; + + if (vec.y < 0.f) + vec.y += 360.f; + + if (vec.z > 360.f) + vec.z -= 360.f; + + if (vec.z < 0.f) + vec.z += 360.f; } - const Vec3 targetPos = renderData->position; + Vec3 renderVec = vec; - const float lerpFactor = 0.2f; + const auto smoothRotations = settings.getSettingByName("smoothrots")->value; + const auto preserveRotations = settings.getSettingByName("preserverots")->value; - vec.x = lerp(vec.x, targetVec.x, lerpFactor); - vec.y = lerp(vec.y, targetVec.y, lerpFactor); - vec.z = lerp(vec.z, targetVec.z, lerpFactor); + if (isOnGround && yMod == 0.f && !preserveRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { + if (smoothRotations && (sign.x != 0 || sign.y != 0 && sign.z != 0)) { + vec.x += static_cast(sign.x) * deltaTime * speed * xMul; - pos.x = lerp(pos.x, targetPos.x, lerpFactor); - pos.y = lerp(pos.y, targetPos.y, lerpFactor); - pos.z = lerp(pos.z, targetPos.z, lerpFactor); + if (curr->getStack().block != nullptr) { + vec.z += static_cast(sign.z) * deltaTime * speed * zMul; - mat = translate(mat, { pos.x, pos.y, pos.z }); - glm_rotate(mat, vec.x, 1.f, 0.f, 0.f); - glm_rotate(mat, vec.y, 0.f, 1.f, 0.f); - glm_rotate(mat, vec.z, 0.f, 0.f, 1.f); -} + if (vec.x > 360.f || vec.x < 0.f) { + vec.x = 0.f; + sign.x = 0; + } + if (vec.z > 360.f || vec.z < 0.f) { + vec.z = 0.f; + sign.z = 0; + } + } + else { + vec.y += static_cast(sign.y) * deltaTime * speed * yMul; + + if (vec.x - 90.f > 360.f || vec.x - 90.f < 0.f) { + vec.x = 90.f; + sign.x = 0; + } + + if (vec.y > 360.f || vec.y < 0.f) { + vec.y = 0.f; + sign.y = 0; + } + } + } + + if (!smoothRotations) { + if (curr->getStack().block != nullptr) { + renderVec.x = 0.f; + renderVec.z = 0.f; + } + else { + renderVec.x = 90.f; + renderVec.y = 0.f; + } + } + } + + if(isOnGround) { + if(curr->getStack().block == nullptr) { + pos.y -= 0.12; + } + } + + mat = translate(mat, {pos.x, pos.y, pos.z}); + + glm_rotate(mat, renderVec.x, 1.f, 0.f, 0.f); + glm_rotate(mat, renderVec.y, 0.f, 1.f, 0.f); + glm_rotate(mat, renderVec.z, 0.f, 0.f, 1.f); +} void ItemPhysicsListener::onSetupAndRender(SetupAndRenderEvent& event) { - static auto mod = reinterpret_cast(ModuleManager::getModule("Item Physics")); - if (!mod->isEnabled()) return; + if (!mod->isEnabled()) + return; const auto player = SDK::clientInstance->getLocalPlayer(); + static bool playerNull = player == nullptr; if (playerNull != (player == nullptr)) { @@ -142,16 +213,20 @@ void ItemPhysicsListener::onSetupAndRender(SetupAndRenderEvent& event) { } } +static char data[0x5], data2[0x5]; + void ItemPhysicsListener::onEnable() { - static auto posAddr = Memory::findSig(GET_SIG("ItemPositionConst")) + 4; + static auto posAddr = GET_SIG_ADDRESS("ItemPositionConst") + 4; origPosRel = *reinterpret_cast(posAddr); patched = true; - static auto rotateAddr = reinterpret_cast(Memory::findSig(GET_SIG("glm_rotateRef"))); + static auto rotateAddr = reinterpret_cast(GET_SIG_ADDRESS("glm_rotateRef")); + if (glm_rotateHook == nullptr) glm_rotateHook = std::make_unique(rotateAddr, glm_rotate); - static auto ItemRenderer_renderAddr = reinterpret_cast(Memory::findSig(GET_SIG("ItemRenderer::render"))); + static auto ItemRenderer_renderAddr = reinterpret_cast(GET_SIG_ADDRESS("ItemRenderer::render")); + if (ItemRenderer_renderHook == nullptr) ItemRenderer_renderHook = std::make_unique(ItemRenderer_renderAddr, ItemRenderer_render); @@ -159,18 +234,21 @@ void ItemPhysicsListener::onEnable() { *newPosRel = 0.f; const auto newRipRel = Memory::getRipRel(posAddr, reinterpret_cast(newPosRel)); + Memory::patchBytes(reinterpret_cast(posAddr), newRipRel.data(), 4); glm_rotateHook->enable(); + Memory::patchBytes(rotateAddr, (BYTE*)"\xE8", 1); + ItemRenderer_renderHook->enable(); - static auto translateAddr = reinterpret_cast(Memory::findSig(GET_SIG("glm_translateRef"))); + static auto translateAddr = reinterpret_cast(GET_SIG_ADDRESS("glm_translateRef")); Memory::copyBytes(translateAddr, data, 5); Memory::nopBytes(translateAddr, 5); if (WinrtUtils::check(21, 0)) { - static auto translateAddr2 = reinterpret_cast(Memory::findSig(GET_SIG("glm_translateRef2"))); + static auto translateAddr2 = reinterpret_cast(GET_SIG_ADDRESS("glm_translateRef2")); Memory::copyBytes(translateAddr2, data2, 5); Memory::nopBytes(translateAddr2, 5); } @@ -178,7 +256,8 @@ void ItemPhysicsListener::onEnable() { void ItemPhysicsListener::onDisable() { if (patched) { - static auto posAddr = Memory::findSig(GET_SIG("ItemPositionConst")) + 4; + static auto posAddr = GET_SIG_ADDRESS("ItemPositionConst") + 4; + Memory::patchBytes(reinterpret_cast(posAddr), &origPosRel, 4); FreeBuffer(newPosRel); } @@ -186,11 +265,11 @@ void ItemPhysicsListener::onDisable() { glm_rotateHook->disable(); ItemRenderer_renderHook->disable(); - static auto translateAddr = reinterpret_cast(Memory::findSig(GET_SIG("glm_translateRef"))); + static auto translateAddr = reinterpret_cast(GET_SIG_ADDRESS("glm_translateRef")); Memory::patchBytes(translateAddr, data, 5); if (WinrtUtils::check(21, 0)) { - static auto translateAddr2 = reinterpret_cast(Memory::findSig(GET_SIG("glm_translateRef2"))); + static auto translateAddr2 = reinterpret_cast(GET_SIG_ADDRESS("glm_translateRef2")); Memory::patchBytes(translateAddr2, data2, 5); } diff --git a/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp b/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp index 7995a92a..346de9dc 100644 --- a/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp +++ b/src/Client/Module/Modules/MovableChat/MovableChatListener.hpp @@ -85,11 +85,11 @@ class MovableChatListener : public Listener { if(this->module->isEnabled()) - if (SDK::screenView->VisualTree->root->LayerName == "hud_screen") { + if (SDK::screenView->VisualTree->root->getLayerName() == "hud_screen") { SDK::screenView->VisualTree->root->forEachControl([this](const std::shared_ptr& control) { - if (control->LayerName == "chat_panel" && module->isEnabled()) { + if (control->getLayerName() == "chat_panel" && module->isEnabled()) { if (MovableChatListener::oriXy.x == 0.0f) { diff --git a/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp b/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp index 53f61141..45f0f2dd 100644 --- a/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp +++ b/src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp @@ -18,20 +18,31 @@ class NoHurtCamListener : public Listener { static inline uintptr_t sigOffset; static inline std::vector originalCameraAngle; - static inline uint8_t newCameraAngle[3] = {0x90, 0x90, 0x90}; public: static void patch() { if(patched) return; patched = true; - Memory::patchBytes((LPVOID) sigOffset, newCameraAngle, 3); + int size; + if (WinrtUtils::check(21, 30)) { + size = 5; + } else { + size = 3; + } + Memory::nopBytes((LPVOID) sigOffset, size); } static void unpatch() { if(!patched) return; patched = false; - Memory::patchBytes((LPVOID) sigOffset, originalCameraAngle.data(), 3); + int size; + if (WinrtUtils::check(21, 30)) { + size = 5; + } else { + size = 3; + } + Memory::patchBytes((LPVOID) sigOffset, originalCameraAngle.data(), size); } void onRaknetTick(RaknetTickEvent &event) override { @@ -64,12 +75,23 @@ class NoHurtCamListener : public Listener { this->name = string; this->module = module; - originalCameraAngle.resize(3); + int size; + if (WinrtUtils::check(21, 30)) { + size = 5; + } else { + size = 3; + } + + originalCameraAngle.resize(size); if(sigOffset == NULL) { - sigOffset = Memory::findSig(GET_SIG("CameraAssignAngle")) + 4; + if (WinrtUtils::check(21, 30)) { + sigOffset = GET_SIG_ADDRESS("CameraAssignAngle"); + } else { + sigOffset = GET_SIG_ADDRESS("CameraAssignAngle") + 4; + } } - Memory::patchBytes( originalCameraAngle.data(), (LPVOID)sigOffset, 3); + Memory::patchBytes( originalCameraAngle.data(), (LPVOID)sigOffset, size); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp b/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp new file mode 100644 index 00000000..78a0abb2 --- /dev/null +++ b/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp @@ -0,0 +1,293 @@ +#pragma once + +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" +#include "OpponentReachListener.hpp" + + +class OpponentReach : public Module { + +public: + + + OpponentReach() : Module("Opponent Reach", "Shows your opponent's last hit range!", + IDR_LIKE_PNG, "") { + Module::setup(); + }; + + void onEnable() override { + EventHandler::registerListener(new OpponentReachListener("OpponentReach", this)); + Module::onEnable(); + } + + void onDisable() override { + EventHandler::unregisterListener("OpponentReach"); + Module::onDisable(); + } + + void defaultConfig() override { + if (settings.getSettingByName("text") == nullptr) + settings.addSetting("text", (std::string) "Distance: {value}"); + + if (settings.getSettingByName("tryToExcludeTeam") == nullptr) + settings.addSetting("tryToExcludeTeam", true); + + if (settings.getSettingByName("textscale") == nullptr) + settings.addSetting("textscale", 0.80f); + } + + void settingsRender() override { + + /* Border Start */ + + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); + + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); + FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(1.0f, "height")); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), + toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + + this->settings.getSettingByName("uiscale")->value = percent; + + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( + "border")->value)) + this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( + "border")->value; + + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", + textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + + percent = FlarialGUI::Slider(1, toggleX + Constraints::SpacingConstraint(0.60, textWidth) + + FlarialGUI::SettingsTextWidth("Border "), + toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + + this->settings.getSettingByName("borderWidth")->value = percent; + + /* Border End */ + + /* Rounding Start */ + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), + toggleY, this->settings.getSettingByName("rounding")->value); + + this->settings.getSettingByName("rounding")->value = percent; + + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Translucency", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( + "BlurEffect")->value)) + this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( + "BlurEffect")->value; + + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), + toggleY, this->settings.getSettingByName("textscale")->value, 2.00); + + + this->settings.getSettingByName("textscale")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + + std::string txtAlignment = FlarialGUI::Dropdown(1, + toggleX, toggleY, + std::vector{"Left", "Center", "Right"}, + this->settings.getSettingByName( + "textalignment")->value, + "Text Alignment" + ); + + this->settings.getSettingByName("textalignment")->value = txtAlignment; + + FlarialGUI::SetIsInAdditionalYMode(); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Reverse Padding X", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( + "reversepaddingx")->value)) + this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( + "reversepaddingx")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Reverse Padding Y", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( + "reversepaddingy")->value)) + this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( + "reversepaddingy")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), + toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, + false); + + this->settings.getSettingByName("padx")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), + toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, + false); + + this->settings.getSettingByName("pady")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), + toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); + + this->settings.getSettingByName("rectwidth")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), + toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); + + this->settings.getSettingByName("rectheight")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Responsive Rectangle (Moves with the Text)", + textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( + "responsivewidth")->value)) + this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( + "responsivewidth")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), + toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, + false); + + this->settings.getSettingByName("rotation")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Try to exclude team", + textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(1, toggleX, toggleY, this->settings.getSettingByName( + "tryToExcludeTeam")->value)) + this->settings.getSettingByName("tryToExcludeTeam")->value = !this->settings.getSettingByName( + "tryToExcludeTeam")->value; + + FlarialGUI::UnSetIsInAdditionalYMode(); + + /* Rounding End */ + + /* Color Pickers Start*/ + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY = Constraints::PercentageConstraint(0.10, "top"); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), + toggleY - Constraints::SpacingConstraint(0.017, textWidth), + settings.getSettingByName("bgColor")->value, + settings.getSettingByName("bgRGB")->value); + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, + settings.getSettingByName("textColor")->value, + settings.getSettingByName("textRGB")->value); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, + settings.getSettingByName("borderColor")->value, + settings.getSettingByName("borderRGB")->value); + + FlarialGUI::UnsetScrollView(); + + FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, + settings.getSettingByName("bgOpacity")->value, + settings.getSettingByName("bgRGB")->value); + FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, + settings.getSettingByName("textOpacity")->value, + settings.getSettingByName("textRGB")->value); + FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, + settings.getSettingByName("borderOpacity")->value, + settings.getSettingByName("borderRGB")->value); + /* Color Pickers End */ + + } +}; + diff --git a/src/Client/Module/Modules/OpponentReach/OpponentReachListener.hpp b/src/Client/Module/Modules/OpponentReach/OpponentReachListener.hpp new file mode 100644 index 00000000..b9242f50 --- /dev/null +++ b/src/Client/Module/Modules/OpponentReach/OpponentReachListener.hpp @@ -0,0 +1,95 @@ +#pragma once + +#include "../../../../SDK/SDK.hpp" +#include "../../../../SDK//Client/Network/Packet/PlaySoundPacket.hpp" +#include "../../../../SDK//Client/Network/Packet/TextPacket.hpp" +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../Module.hpp" +#include "../../../GUI/Engine/Engine.hpp" +#include "../../../Hook/Hooks/Game/PacketHooks.hpp" +#include "../../../../SDK/Client/Network/Packet/EntityEventPacket.hpp" +#include +#include + +using Duration = std::chrono::duration; + +class OpponentReachListener : public Listener { + Module *module; + std::chrono::time_point last_hit; + float opponentReach{}; + + std::map hitActors; + + void onRender(RenderEvent &event) override { + if (module->isEnabled()) { + auto delayStr = std::to_string(opponentReach); + this->module->normalRender(22, delayStr); + } + } + + void onPacketReceive(PacketEvent &event) override { + if (event.getPacket()->getId() == MinecraftPacketIds::ActorEvent) { + auto packet = (EntityEventPacket *) event.getPacket(); + if (packet->EventID == ActorEvent::Hurt) { + + auto id = packet->RuntimeID; + if(id == SDK::clientInstance->getLocalPlayer()->getRuntimeIDComponent()->runtimeID) { + auto excludeTeam = module->settings.getSettingByName("tryToExcludeTeam")->value; + // we got hit + auto player = SDK::clientInstance->getLocalPlayer(); + auto actors = SDK::clientInstance->getLocalPlayer()->getLevel()->getRuntimeActorList(); + // remove non players + std::erase_if(actors, [](Actor* actor) { + return !actor->hasCategory(ActorCategory::Player); + }); + // remove actors that are too far or on our team + std::erase_if(actors, [player, excludeTeam](Actor* actor) { + if(actor == player) return true; + auto distance = actor->getApproximateReach(player); + if(distance > 10.f || distance == 0.f) + return true; + if(excludeTeam) + if(actor->IsOnSameTeam(player)) + return true; + return false; + }); + // Sort the list by distance + std::sort(actors.begin(), actors.end(), [&](Actor* a, Actor* b) { + return a->getApproximateReach(player) < b->getApproximateReach(player); + }); + + // Create a vector to store actors within 5 blocks + std::vector nearbyPlayers; + + // Iterate over the actors and check if they are within 5 blocks + for (auto actor : actors) { + if (actor->getApproximateReach(player) <= 5.5f) { + nearbyPlayers.push_back(actor); + } + } + + if(!nearbyPlayers.empty()) { + auto likelyOpponent = nearbyPlayers[0]; + opponentReach = likelyOpponent->getApproximateReach(player); + last_hit = std::chrono::high_resolution_clock::now(); + } + } + } + } + } + + void onTick(TickEvent &event) override { + std::chrono::duration duration = std::chrono::high_resolution_clock::now() - last_hit; + if (duration.count() >= 15) { + opponentReach = 0; + }; + } + +public: + explicit OpponentReachListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + } +}; diff --git a/src/Client/Module/Modules/PotionHUD/PotionHUD.hpp b/src/Client/Module/Modules/PotionHUD/PotionHUD.hpp new file mode 100644 index 00000000..a502e0b9 --- /dev/null +++ b/src/Client/Module/Modules/PotionHUD/PotionHUD.hpp @@ -0,0 +1,116 @@ +#pragma once + +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" +#include "PotionHUDListener.hpp" + +class PotionHUD : public Module { + +public: + + PotionHUD() : Module("PotionHUD", "Displays your potion effects", + IDR_POTION_PNG, "") { + Module::setup(); + }; + + void onEnable() override { + EventHandler::registerListener(new PotionHUDListener("PotionHUD", this)); + if(FlarialGUI::inMenu){ + FlarialGUI::Notify("To change the position of PotionHUD, Please click " + + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( + "editmenubind")->value + " in the settings tab."); + } + Module::onEnable(); + } + + void onDisable() override { + EventHandler::unregisterListener("PotionHUD"); + Module::onDisable(); + } + + void defaultConfig() override { + + if (settings.getSettingByName("uiscale") == nullptr) settings.addSetting("uiscale", 1.0f); + + if (settings.getSettingByName("colorMain") == nullptr) + settings.addSetting("colorMain", (std::string) "FFFFFF"); + + if (settings.getSettingByName("colorMain_rgb") == nullptr) settings.addSetting("colorMain_rgb", false); + + if (settings.getSettingByName("colorLow") == nullptr) + settings.addSetting("colorLow", (std::string) "FF0000"); + + if (settings.getSettingByName("colorLow_rgb") == nullptr) settings.addSetting("colorLow_rgb", false); + + if (settings.getSettingByName("textSize") == nullptr) settings.addSetting("textSize", 0.14f); + + } + + void settingsRender() override { + + /* Border Start */ + + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); + + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), + toggleY, + this->settings.getSettingByName("uiscale")->value, 3.0f); + + this->settings.getSettingByName("uiscale")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text size ", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + float textSize = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Text size "), + toggleY, this->settings.getSettingByName("textSize")->value, 0.25f, + 0.f, false); + + this->settings.getSettingByName("textSize")->value = textSize; + + /* Color Pickers Start*/ + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY = Constraints::PercentageConstraint(0.10, "top"); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Main color", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Main color "), + toggleY - Constraints::SpacingConstraint(0.017, textWidth), + settings.getSettingByName("colorMain")->value, + settings.getSettingByName("colorMain_rgb")->value); + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Effect about to expire", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Effect about to expire "), toggleY * 0.99f, + settings.getSettingByName("colorLow")->value, + settings.getSettingByName("colorLow_rgb")->value); + + FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("colorMain")->value, + settings.getSettingByName("bgOpacity")->value, + settings.getSettingByName("colorMain_rgb")->value); + FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("colorLow")->value, + settings.getSettingByName("borderOpacity")->value, + settings.getSettingByName("colorLow_rgb")->value); + /* Color Pickers End */ + } +}; \ No newline at end of file diff --git a/src/Client/Module/Modules/PotionHUD/PotionHUDListener.hpp b/src/Client/Module/Modules/PotionHUD/PotionHUDListener.hpp new file mode 100644 index 00000000..93f56b5d --- /dev/null +++ b/src/Client/Module/Modules/PotionHUD/PotionHUDListener.hpp @@ -0,0 +1,172 @@ +#pragma once + + +#include "../../../../SDK/SDK.hpp" +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../Module.hpp" +#include "../../../GUI/Engine/Engine.hpp" +#include "../../../../SDK/SDK.hpp" +#include "../../../../SDK/Client/Render/BaseActorRenderContext.hpp" +#include "../../../../SDK/Client/Render/ItemRenderer.hpp" +#include "../../../../Utils/Render/PositionUtils.hpp" +#include "../ClickGUI/ClickGUIRenderer.hpp" +#include +#include + +class PotionHUDListener : public Listener { +public: + + Module *module; + Vec2 currentPos; + bool enabled = false; + + float testSpacing = 20; + + void renderText() const { + if(FlarialGUI::inMenu && !ClickGUIRenderer::editmenu) return; + + auto rgb1 = module->settings.getSettingByName("colorLow_rgb")->value; + auto rgb2 = module->settings.getSettingByName("colorMain_rgb")->value; + + auto rgbColor = FlarialGUI::rgbColor; + + auto lowColor = rgb1 ? rgbColor : FlarialGUI::HexToColorF(module->settings.getSettingByName("colorLow")->value); + auto mainColor = rgb2 ? rgbColor : FlarialGUI::HexToColorF(module->settings.getSettingByName("colorMain")->value); + + int warning_seconds = 5; + + const float textWidth = Constraints::RelativeConstraint(module->settings.getSettingByName("textSize")->value, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + if (SDK::hasInstanced && SDK::clientInstance != nullptr) { + if (SDK::clientInstance->getLocalPlayer() != nullptr) + if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { + + float spacing = testSpacing; + + auto scaledPos = PositionUtils::getCustomScreenScaledPos(Vec2{spacing, spacing}, + module->settings.getSettingByName( + "uiscale")->value); + spacing = scaledPos.y; + + float xmodifier = 0.0f; + float ymodifier = 0.0f; + + float xoffset = 0.0f; + float yoffset = 0.0f; + + std::vector effects = SDK::clientInstance->getLocalPlayer()->getMobEffects(); + for(const auto& effect : effects) { + if(!effect.isValid()) continue; + std::string text = effect.getNameAndTime(); + std::wstring widestr = std::wstring(text.begin(), text.end()); + const wchar_t *widecstr = widestr.c_str(); + FlarialGUI::FlarialTextWithFont( + currentPos.x + xmodifier + xoffset, + currentPos.y + ymodifier + yoffset, widecstr, textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + textWidth, + DWRITE_FONT_WEIGHT_NORMAL, effect.duration / 20 <= warning_seconds ? lowColor : mainColor,true); + ymodifier += spacing; + } + } + } + } + + void onRender(RenderEvent &event) override { + if (ClientInstance::getTopScreenName() == "hud_screen" && + module->isEnabled()) { + + float s = Constraints::RelativeConstraint(0.04, "height", true) * + module->settings.getSettingByName("uiscale")->value; + + float spacing = Constraints::RelativeConstraint(0.0135, "height", true) * + module->settings.getSettingByName("uiscale")->value; + + Vec2 settingperc = Vec2(module->settings.getSettingByName("percentageX")->value, + module->settings.getSettingByName("percentageY")->value); + + + float width = s * 3 + spacing * 2; + float height = s; + + if (settingperc.x != 0) + currentPos = Vec2(settingperc.x * MC::windowSize.x, + settingperc.y * MC::windowSize.y); + else + currentPos = Constraints::CenterConstraint(width, height); + + if (ClickGUIRenderer::editmenu) { + // bounding boxes + FlarialGUI::SetWindowRect(currentPos.x, currentPos.y, width, height, 23); + } + + Vec2 vec2; + // bounding boxes + vec2 = FlarialGUI::CalculateMovedXY(currentPos.x, currentPos.y, 23, width, height); + + currentPos.x = vec2.x; + currentPos.y = vec2.y; + + Vec2 percentages = Constraints::CalculatePercentage(currentPos.x, currentPos.y); + + module->settings.setValue("percentageX", percentages.x); + module->settings.setValue("percentageY", percentages.y); + + if (ClickGUIRenderer::editmenu) { + FlarialGUI::RoundedRect(currentPos.x, currentPos.y, D2D1::ColorF(D2D1::ColorF::White, 0.4f), width, height); + FlarialGUI::UnsetWindowRect(); + } + + renderText(); + } + + if (SDK::getCurrentScreen() != "hud_screen") ClickGUIRenderer::editmenu = false; + } + + void onRenderPotionHUD(RenderPotionHUDEvent &event) override { + event.cancel(); + } + + void onSetupAndRender(SetupAndRenderEvent &event) override { + if(this->module->isEnabled()) + if (ClientInstance::getTopScreenName() == "hud_screen") { + Vec2 scaledPos = PositionUtils::getScaledPos(currentPos); + + if (SDK::hasInstanced && SDK::clientInstance != nullptr) { + auto ui_scale = module->settings.getSettingByName("uiscale")->value; + auto ui_icon_scale = ui_scale / 2.f; + float spacing = 20 * ui_scale; + + float xmodifier = 0.0f; + float ymodifier = 0.0f; + + auto muirc = event.getMuirc(); + auto effects = SDK::clientInstance->getLocalPlayer()->getMobEffects(); + for(const auto& effect : effects) { + if(!effect.isValid()) continue; + auto location = effect.getTextureLocation(); + auto texture = muirc->createTexture(location, false); + auto position = Vec2(scaledPos.x + xmodifier - 20.0f * ui_scale, scaledPos.y + ymodifier); + auto size = Vec2(18.0f * ui_scale, 18.0f * ui_scale); + static auto uvPos = Vec2(0.f, 0.f); + static auto uvSize = Vec2(1.0f, 1.0f); + muirc->drawImage(texture, position, size,uvPos,uvSize); + static auto color = mce::Color(); + static auto flushLayer = HashedString("ui_flush"); + muirc->flushImages(color, 1.0f, flushLayer); + ymodifier += spacing; + } + } + } + } + +public: + explicit PotionHUDListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + this->currentPos = Vec2(0, 0); + } +}; diff --git a/src/Client/Module/Modules/RenderOptions/RenderOptions.hpp b/src/Client/Module/Modules/RenderOptions/RenderOptions.hpp index 27ac3ce3..058c67ee 100644 --- a/src/Client/Module/Modules/RenderOptions/RenderOptions.hpp +++ b/src/Client/Module/Modules/RenderOptions/RenderOptions.hpp @@ -65,28 +65,90 @@ class RenderOptions : public Module { void settingsRender() override { + updateSetings(); - float x = Constraints::PercentageConstraint(0.019, "left"); - float y = Constraints::PercentageConstraint(0.10, "top"); - - const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); - FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); + FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(0.88f, "height")); + Constraints::RelativeConstraint(1.0f, "height")); - this->addHeader("Misc"); - this->addToggle("Chunk Borders", "", this->settings.getSettingByName("chunkborders")->value); - this->addToggle("Sky", "", this->settings.getSettingByName("sky")->value); - this->addToggle("Render Entitie", "", this->settings.getSettingByName("entity")->value); - this->addToggle("Render Block Entities", "", this->settings.getSettingByName("blockentity")->value); - this->addToggle("Render Particles", "", this->settings.getSettingByName("particles")->value); - this->addToggle("Render Weather", "", this->settings.getSettingByName("weather")->value); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Chunk Borders", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::UnsetScrollView(); + if (FlarialGUI::Toggle(1, toggleX, toggleY, this->settings.getSettingByName( + "chunkborders")->value)) + this->settings.getSettingByName("chunkborders")->value = !this->settings.getSettingByName( + "chunkborders")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Render Sky", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(2, toggleX, toggleY, this->settings.getSettingByName( + "sky")->value)) + this->settings.getSettingByName("sky")->value = !this->settings.getSettingByName("sky")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Render Entities", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(3, toggleX, toggleY, this->settings.getSettingByName( + "entity")->value)) + this->settings.getSettingByName("entity")->value = !this->settings.getSettingByName( + "entity")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); - this->resetPadding(); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Render Block Entities", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( + "blockentity")->value)) + this->settings.getSettingByName("blockentity")->value = !this->settings.getSettingByName( + "blockentity")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Render Particles", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(5, toggleX, toggleY, this->settings.getSettingByName( + "particles")->value)) + this->settings.getSettingByName("particles")->value = !this->settings.getSettingByName( + "particles")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Render Weather", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + if (FlarialGUI::Toggle(6, toggleX, toggleY, this->settings.getSettingByName( + "weather")->value)) + this->settings.getSettingByName("weather")->value = !this->settings.getSettingByName( + "weather")->value; + + FlarialGUI::UnsetScrollView(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/ThirdPersonNametag/ThirdPersonListener.hpp b/src/Client/Module/Modules/ThirdPersonNametag/ThirdPersonListener.hpp index 9688f9c4..aea2af0a 100644 --- a/src/Client/Module/Modules/ThirdPersonNametag/ThirdPersonListener.hpp +++ b/src/Client/Module/Modules/ThirdPersonNametag/ThirdPersonListener.hpp @@ -42,7 +42,7 @@ class ThirdPersonListener : public Listener { this->name = string; this->module = module; - real = Memory::findSig(GET_SIG("ThirdPersonNametag")); + real = GET_SIG_ADDRESS("ThirdPersonNametag"); ThirdPersonListener::Original.resize(6); memcpy(ThirdPersonListener::Original.data(), diff --git a/src/Client/Module/Modules/ViewModel/ViewModel.hpp b/src/Client/Module/Modules/ViewModel/ViewModel.hpp new file mode 100644 index 00000000..b8153aba --- /dev/null +++ b/src/Client/Module/Modules/ViewModel/ViewModel.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include "../Module.hpp" +#include "ViewModelListener.hpp" +#include "../../../Events/EventHandler.hpp" + + +class ViewModel : public Module { + +public: + + ViewModel() : Module("ViewModel", "Allows you to modify how item in hand looks.", IDR_MAGNIFY_PNG, "C") { + + Module::setup(); + + }; + + void onEnable() override { + EventHandler::registerOrderedPriorityListener(new ViewModelListener("ViewModel", this), 2); + Module::onEnable(); + + } + + void onDisable() override { + EventHandler::unregisterListener("ViewModel"); + Module::onDisable(); + } + + void defaultConfig() override { + if (settings.getSettingByName("itemfov") == nullptr) settings.addSetting("itemfov", 70.0f); + } + + void settingsRender() override { + + float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Item FOV", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + + float value = FlarialGUI::Slider(0, toggleX + FlarialGUI::SettingsTextWidth("Item FOV "), + toggleY, this->settings.getSettingByName("itemfov")->value, 180, 0, + false); + + this->settings.getSettingByName("itemfov")->value = value; + + } +}; diff --git a/src/Client/Module/Modules/ViewModel/ViewModelListener.hpp b/src/Client/Module/Modules/ViewModel/ViewModelListener.hpp new file mode 100644 index 00000000..98688133 --- /dev/null +++ b/src/Client/Module/Modules/ViewModel/ViewModelListener.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../../../../Utils/Logger/Logger.hpp" +#include "../Module.hpp" +#include "../../../../SDK/SDK.hpp" +#include +#include "../../Manager.hpp" +#include "../../../../SDK/Client/Core/Options.hpp" + +class ViewModelListener : public Listener { + + Module *module; + + void onGetFOV(FOVEvent &event) override { + auto fov = event.getFOV(); + if (fov != 70) return; + + event.setFOV(module->settings.getSettingByName("itemfov")->value); + } +public: + explicit ViewModelListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + } +}; diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index bc38fa52..bd218e01 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -3,6 +3,9 @@ #include "Components/AABBShapeComponent.hpp" #include "Components/RuntimeIDComponent.hpp" #include "Components/ActorDataFlagComponent.hpp" +#include "../../SDK.hpp" +#include "../../../Client/GUI/Engine/Engine.hpp" +#include "Components/OnGroundFlagComponent.hpp" // TODO add comments to all components, replace their sigs with simpler ones ? marioCST: use entt's try_get func in EntityContext instead of using sigs, there are no simpler sigs @@ -51,9 +54,9 @@ bool Actor::canSee(const Actor& actor) { static uintptr_t sig; if (sig == NULL) { if (!WinrtUtils::check(20, 40)) { - sig = Memory::findSig(GET_SIG("Actor::canSee")); + sig = GET_SIG_ADDRESS("Actor::canSee"); } else { - sig = Memory::offsetFromSig(Memory::findSig(GET_SIG("Actor::canSee")), 1); + sig = Memory::offsetFromSig(GET_SIG_ADDRESS("Actor::canSee"), 1); } } static auto canSee = reinterpret_cast(sig); @@ -111,7 +114,7 @@ ItemStack *Actor::getArmor(int slot) { static uintptr_t sig; if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getArmor")); + sig = GET_SIG_ADDRESS("Actor::getArmor"); } auto fn = reinterpret_cast(sig); @@ -154,7 +157,7 @@ ItemStack *Actor::getOffhandSlot() { static uintptr_t sig; if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getOffhandSlot")); + sig = GET_SIG_ADDRESS("Actor::getOffhandSlot"); } auto fn = reinterpret_cast(sig); @@ -163,8 +166,15 @@ ItemStack *Actor::getOffhandSlot() { } RuntimeIDComponent *Actor::getRuntimeIDComponent() { - static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix")) + " " + GET_SIG("Actor::getRuntimeIDComponent")); - + static uintptr_t sig; + if(sig == NULL) { + if (WinrtUtils::check(20, 50) && !WinrtUtils::check(20, 60)) { + sig = Memory::findSig( + std::string(GET_SIG("tryGetPrefix2")) + " " + GET_SIG("Actor::getRuntimeIDComponent")); + } else { + sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix")) + " " + GET_SIG("Actor::getRuntimeIDComponent")); + } + } return tryGet(sig); } @@ -176,7 +186,7 @@ void Actor::setNametag(std::string *name) { static uintptr_t sig; if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::setNametag")); + sig = GET_SIG_ADDRESS("Actor::setNametag"); } auto fn = reinterpret_cast(sig); @@ -187,7 +197,7 @@ std::string *Actor::getNametag() { static uintptr_t sig; if (sig == NULL) { - sig = Memory::findSig(GET_SIG("Actor::getNametag")); + sig = GET_SIG_ADDRESS("Actor::getNametag"); } auto fn = reinterpret_cast(sig); @@ -204,6 +214,24 @@ RenderPositionComponent *Actor::getRenderPositionComponent() { //??$try_get@URen return tryGet(sig); } +std::vector Actor::getMobEffects() { + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix")) + " " + GET_SIG("Actor::getMobEffectsComponent")); + std::vector unifiedEffects; + if (WinrtUtils::check(21, 30)) { + auto component = tryGet(sig); + for (auto &effect : component->effects) { + unifiedEffects.emplace_back(effect.id, effect.duration, effect.amplifier); + } + } else { + auto component = tryGet(sig); + + for (auto &effect : component->effects) { + unifiedEffects.emplace_back(effect.id, effect.duration, effect.amplifier); + } + } + return unifiedEffects; +} + bool Actor::isValidAABB() { auto AABBShapeComponent = this->getAABBShapeComponent(); if(!AABBShapeComponent) return false; @@ -213,23 +241,105 @@ bool Actor::isValidAABB() { } bool Actor::isOnGround() { - const auto ctx = this->GetEntityContextV1_20_50(); + if (WinrtUtils::check(21, 30)) { + static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix3")) + " " + GET_SIG("Actor::getOnGroundFlagComponent")); + auto component = tryGet(sig); + + return component != nullptr; + } else { + const auto ctx = this->GetEntityContextV1_20_50(); + + if (WinrtUtils::check(20, 60)) { + using isOnGroundFunc = bool (__fastcall *)(uintptr_t &, EntityId &); + static isOnGroundFunc isOnGround = Memory::getOffsetFromSig( + GET_SIG_ADDRESS("ActorCollision::isOnGround"), 1); + + if (isOnGround) + return isOnGround(ctx->basicReg, ctx->id); - if (WinrtUtils::check(20, 60)) { - using isOnGroundFunc = bool(__fastcall *)(uintptr_t&, EntityId&); - static isOnGroundFunc isOnGround = Memory::getOffsetFromSig(Memory::findSig(GET_SIG("ActorCollision::isOnGround")), 1); + return false; + } + + using isOnGroundFunc = bool (__fastcall *)(V1_20_50::EntityContext *); + static isOnGroundFunc isOnGround = reinterpret_cast(GET_SIG_ADDRESS("ActorCollision::isOnGround")); if (isOnGround) - return isOnGround(ctx->basicReg, ctx->id); + return isOnGround(ctx); return false; } +} + +Vec3 Actor::getLerpedPosition() { +// if(SDK::clientInstance->getLocalPlayer() == this) { // only in first person +// return SDK::clientInstance->getLevelRender()->getOrigin(); +// } + return this->getRenderPositionComponent()->renderPos; +} - using isOnGroundFunc = bool(__fastcall *)(V1_20_50::EntityContext*); - static isOnGroundFunc isOnGround = reinterpret_cast(Memory::findSig(GET_SIG("ActorCollision::isOnGround"))); +AABB Actor::getLerpedAABB(bool asHitbox) { + auto renderPos = this->getRenderPositionComponent()->renderPos; + auto aabbSize = this->getAABBShapeComponent()->size; - if (isOnGround) - return isOnGround(ctx); + float mod = 0.f; + + if (this->hasCategory(ActorCategory::Player)) + mod = 1.6f; + + auto lower = renderPos.sub(aabbSize.x / 2.f, mod, aabbSize.x / 2.f), upper = lower.add(aabbSize.x, aabbSize.y, aabbSize.x); + + auto aabb = AABB(lower, upper); + + if(asHitbox) + return aabb.expandedXZ(0.1); + + return aabb; +} + +float Actor::getApproximateReach(Actor *target) { + auto actorHitBox = target->getLerpedAABB(true); + + auto upper = actorHitBox.upper; + auto lower = actorHitBox.lower; + + auto posAtTimeOfHit = this->getLerpedPosition(); + + auto closestPoint = Vec3{ std::clamp(posAtTimeOfHit.x, lower.x, upper.x), + std::clamp(posAtTimeOfHit.y, lower.y, upper.y), + std::clamp(posAtTimeOfHit.z, lower.z, upper.z) }; + + return posAtTimeOfHit.dist(closestPoint); +} + +bool Actor::IsOnSameTeam(Actor *actor) { + std::string playerName = *this->getNametag(); + std::string actorName = *actor->getNametag(); + + if (playerName.empty() || actorName.empty()) return false; + + auto cleanName = [](std::string &name) { + constexpr std::string tags[] = {"§r", "§l"}; + for (const auto &tag : tags) { + size_t pos; + while ((pos = name.find(tag)) != std::string::npos) { + name.erase(pos, tag.length()); + } + } + }; + + cleanName(playerName); + cleanName(actorName); + + size_t playerTeamPos = playerName.find("§"); + if (playerTeamPos == std::string::npos) return false; + + std::string playerTeam = playerName.substr(playerTeamPos + 2, 1); + + size_t actorTeamPos = actorName.find("§"); + if (actorTeamPos != std::string::npos) { + std::string actorTeam = actorName.substr(actorTeamPos + 2, 1); + return actorTeam == playerTeam; + } return false; } diff --git a/src/SDK/Client/Actor/Actor.hpp b/src/SDK/Client/Actor/Actor.hpp index c9214ebb..3be5edee 100644 --- a/src/SDK/Client/Actor/Actor.hpp +++ b/src/SDK/Client/Actor/Actor.hpp @@ -16,6 +16,7 @@ #include "Components/AABBShapeComponent.hpp" #include "Components/RuntimeIDComponent.hpp" #include "Components/ActorDataFlagComponent.hpp" +#include "Components/MobEffectsComponent.hpp" enum ActorFlags { @@ -202,6 +203,8 @@ class Actor { bool hasCategory(ActorCategory category); + float getApproximateReach(Actor* target); + RenderPositionComponent *getRenderPositionComponent(); SimpleContainer *getArmorContainer(); @@ -225,4 +228,12 @@ class Actor { void setHurtTime(int16_t hurtTime); bool isOnGround(); + + bool IsOnSameTeam(Actor *actor); + + Vec3 getLerpedPosition(); + + AABB getLerpedAABB(bool asHitbox = false); + + std::vector getMobEffects(); }; diff --git a/src/SDK/Client/Actor/Components/MobEffectsComponent.hpp b/src/SDK/Client/Actor/Components/MobEffectsComponent.hpp new file mode 100644 index 00000000..c1399044 --- /dev/null +++ b/src/SDK/Client/Actor/Components/MobEffectsComponent.hpp @@ -0,0 +1,253 @@ +#pragma once + +#include +#include +#include +#include "../../Render/TexturePtr.hpp" + +// LeviLamina + +class MobEffect { +public: + enum class EffectType : uint32_t { + Empty = 0, + Speed = 1, + Slowness = 2, + Haste = 3, + MiningFatigue = 4, + Strength = 5, + InstantHealth = 6, + InstantDamage = 7, + JumpBoost = 8, + Nausea = 9, + Regeneration = 10, + Resistance = 11, + FireResistance = 12, + WaterBreathing = 13, + Invisibility = 14, + Blindness = 15, + NightVision = 16, + Hunger = 17, + Weakness = 18, + Poison = 19, + Wither = 20, + HealthBoost = 21, + Absorption = 22, + Saturation = 23, + Levitation = 24, + FatalPoison = 25, + ConduitPower = 26, + SlowFalling = 27, + BadOmen = 28, + VillageHero = 29, + Darkness = 30, + }; + + static std::string effectTypeToPath(EffectType type) { + static const std::map effectToTexture = { + {EffectType::Speed, "speed_effect"}, + {EffectType::Slowness, "slowness_effect"}, + {EffectType::Haste, "haste_effect"}, + {EffectType::MiningFatigue, "mining_fatigue_effect"}, + {EffectType::Strength, "strength_effect"}, + {EffectType::InstantHealth, "instant_health_effect"}, + {EffectType::InstantDamage, "instant_damage_effect"}, + {EffectType::JumpBoost, "jump_boost_effect"}, + {EffectType::Nausea, "nausea_effect"}, + {EffectType::Regeneration, "regeneration_effect"}, + {EffectType::Resistance, "resistance_effect"}, + {EffectType::FireResistance, "fire_resistance_effect"}, + {EffectType::WaterBreathing, "water_breathing_effect"}, + {EffectType::Invisibility, "invisibility_effect"}, + {EffectType::Blindness, "blindness_effect"}, + {EffectType::NightVision, "night_vision_effect"}, + {EffectType::Hunger, "hunger_effect"}, + {EffectType::Weakness, "weakness_effect"}, + {EffectType::Poison, "poison_effect"}, + {EffectType::Wither, "wither_effect"}, + {EffectType::HealthBoost, "health_boost_effect"}, + {EffectType::Absorption, "absorption_effect"}, + {EffectType::Saturation, "saturation_effect"}, + {EffectType::Levitation, "levitation_effect"}, + {EffectType::FatalPoison, "fatal_poison_effect"}, + {EffectType::ConduitPower, "conduit_power_effect"}, + {EffectType::SlowFalling, "slow_falling_effect"}, + {EffectType::BadOmen, "bad_omen_effect"}, + {EffectType::VillageHero, "village_hero_effect"}, + {EffectType::Darkness, "darkness_effect"}, + }; + + auto it = effectToTexture.find(type); + if (it != effectToTexture.end()) { + return "textures/ui/" + it->second; + } else { + return "Unknown Effect"; + } + } + + static std::string effectTypeToString(EffectType type) { + switch (type) { + case EffectType::Speed: + return "Speed"; + case EffectType::Slowness: + return "Slowness"; + case EffectType::Haste: + return "Haste"; + case EffectType::MiningFatigue: + return "Mining Fatigue"; + case EffectType::Strength: + return "Strength"; + case EffectType::InstantHealth: + return "Instant Health"; + case EffectType::InstantDamage: + return "Instant Damage"; + case EffectType::JumpBoost: + return "Jump Boost"; + case EffectType::Nausea: + return "Nausea"; + case EffectType::Regeneration: + return "Regeneration"; + case EffectType::Resistance: + return "Resistance"; + case EffectType::FireResistance: + return "Fire Resistance"; + case EffectType::WaterBreathing: + return "Water Breathing"; + case EffectType::Invisibility: + return "Invisibility"; + case EffectType::Blindness: + return "Blindness"; + case EffectType::NightVision: + return "Night Vision"; + case EffectType::Hunger: + return "Hunger"; + case EffectType::Weakness: + return "Weakness"; + case EffectType::Poison: + return "Poison"; + case EffectType::Wither: + return "Wither"; + case EffectType::HealthBoost: + return "Health Boost"; + case EffectType::Absorption: + return "Absorption"; + case EffectType::Saturation: + return "Saturation"; + case EffectType::Levitation: + return "Levitation"; + case EffectType::FatalPoison: + return "Fatal Poison"; + case EffectType::ConduitPower: + return "Conduit Power"; + case EffectType::SlowFalling: + return "Slow Falling"; + case EffectType::BadOmen: + return "Bad Omen"; + case EffectType::VillageHero: + return "Village Hero"; + case EffectType::Darkness: + return "Darkness"; + default: + return "Unknown Effect"; + } + } + + static std::string amplifierToString(int amplifier) { + switch (amplifier) { + case 0: + return "I"; + case 1: + return "II"; + case 2: + return "III"; + case 3: + return "IV"; + case 4: + return "V"; + default: + return std::to_string(amplifier); + } + } +}; + +class MobEffectInstance { +public: + MobEffectInstance() = delete; + MobEffect::EffectType id; + int duration; + int durationEasy; + int durationNormal; + int durationHard; + int amplifier; + bool displayOnScreenTextureAnimation; + bool ambient; + bool noCounter; + bool effectVisible; + char pad_0064[0x64]; +}; +static_assert(sizeof(MobEffectInstance) == 0x80); + +class MobEffectInstance1_21_30 { +public: + MobEffectInstance1_21_30() = delete; + MobEffect::EffectType id; + int duration; + float idk; + int durationEasy; + int durationNormal; + int durationHard; + char pad_0008[0x8]; + int amplifier; + bool displayOnScreenTextureAnimation; + bool ambient; + bool noCounter; + bool effectVisible; + char pad_0060[0x60]; +}; +static_assert(sizeof(MobEffectInstance1_21_30) == 0x88); + +struct MobEffectsComponent +{ + std::vector effects; +}; + +struct MobEffectsComponent1_21_30 +{ + std::vector effects; +}; + +struct UnifiedMobEffectData { + MobEffect::EffectType id; + int duration; + int amplifier; + + UnifiedMobEffectData(MobEffect::EffectType id, int duration, int amplifier) : id(id), duration(duration), amplifier(amplifier) {} + + [[nodiscard]] bool isValid() const { + return id != MobEffect::EffectType::Empty; + } + + [[nodiscard]] std::string getNameAndTime() const { + std::string name = MobEffect::effectTypeToString(id); + name += " " + MobEffect::amplifierToString(amplifier) + "\n" + getTime(); + return name; + } + + [[nodiscard]] std::string getTime() const { + const int& totalSeconds = duration / 20; + + const int& minutes = totalSeconds / 60; + const int& seconds = totalSeconds % 60; + + return std::format("{}:{:02}", minutes, seconds); + } + + [[nodiscard]] std::string getTexturePath() const { + return MobEffect::effectTypeToPath(id); + } + + [[nodiscard]] ResourceLocation getTextureLocation() const { + auto location = ResourceLocation(getTexturePath(), false); + return location; + } +}; diff --git a/src/SDK/Client/Actor/Components/OnGroundFlagComponent.hpp b/src/SDK/Client/Actor/Components/OnGroundFlagComponent.hpp new file mode 100644 index 00000000..25117af2 --- /dev/null +++ b/src/SDK/Client/Actor/Components/OnGroundFlagComponent.hpp @@ -0,0 +1,3 @@ +#pragma once + +struct OnGroundFlagComponent {}; \ No newline at end of file diff --git a/src/SDK/Client/Block/BlockSource.cpp b/src/SDK/Client/Block/BlockSource.cpp index fe254a38..ded121ad 100644 --- a/src/SDK/Client/Block/BlockSource.cpp +++ b/src/SDK/Client/Block/BlockSource.cpp @@ -8,7 +8,7 @@ Biome *BlockSource::getBiome(const Vec3 &bp) { static uintptr_t sig; - if (sig == NULL) sig = Memory::findSig(GET_SIG("BlockSource::getBiome")); + if (sig == NULL) sig = GET_SIG_ADDRESS("BlockSource::getBiome"); using efunc = Biome *(__cdecl *)(BlockSource *, const Vec3 &); auto func = reinterpret_cast(sig); diff --git a/src/SDK/Client/Core/ClientInstance.cpp b/src/SDK/Client/Core/ClientInstance.cpp index 3e969418..bc6e9beb 100644 --- a/src/SDK/Client/Core/ClientInstance.cpp +++ b/src/SDK/Client/Core/ClientInstance.cpp @@ -7,7 +7,7 @@ LocalPlayer *ClientInstance::getLocalPlayer() { static uintptr_t indexRef; if (indexRef == 0) { - indexRef = Memory::findSig(GET_SIG("ClientInstance::getLocalPlayerIndex")); + indexRef = GET_SIG_ADDRESS("ClientInstance::getLocalPlayerIndex"); } int index = *reinterpret_cast(indexRef + 9) / 8; @@ -25,7 +25,7 @@ void ClientInstance::grabMouse() { static uintptr_t indexRef; if (indexRef == 0) { - indexRef = Memory::findSig(GET_SIG("ClientInstance::grabMouse")); + indexRef = GET_SIG_ADDRESS("ClientInstance::grabMouse"); } int index = *reinterpret_cast(indexRef + 3) / 8; @@ -36,7 +36,7 @@ void ClientInstance::releaseMouse() { static uintptr_t indexRef; if (indexRef == 0) { - indexRef = Memory::findSig(GET_SIG("ClientInstance::grabMouse")); + indexRef = GET_SIG_ADDRESS("ClientInstance::grabMouse"); if(indexRef == NULL) { return; } diff --git a/src/SDK/Client/Core/Options.hpp b/src/SDK/Client/Core/Options.hpp index b6c41f34..7fa76a78 100644 --- a/src/SDK/Client/Core/Options.hpp +++ b/src/SDK/Client/Core/Options.hpp @@ -51,9 +51,9 @@ class Options { if (info == nullptr) continue; auto* optionsPtr = (Option*)optionsBaseEntry[i]; - auto translateName = *(std::string*)((uintptr_t)info + GET_OFFSET("OptionInfo::TranslateName")); + auto translateName = (std::string*)((uintptr_t)info + GET_OFFSET("OptionInfo::TranslateName")); - if(translateName.empty()) continue; + if(translateName->empty()) continue; // if (optionsBaseEntry[i] == nullptr) continue; // @@ -68,7 +68,7 @@ class Options { // if (translateName == nullptr) continue; //Logger::debug(translateName); - if (optionName == translateName) { + if (*translateName == optionName) { return optionsPtr; } } diff --git a/src/SDK/Client/Level/HitResult.cpp b/src/SDK/Client/Level/HitResult.cpp index 0b6e910f..5b5a8bd7 100644 --- a/src/SDK/Client/Level/HitResult.cpp +++ b/src/SDK/Client/Level/HitResult.cpp @@ -2,7 +2,7 @@ #include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" Actor *HitResult::getEntity() { - static auto sig = GET_SIG("HitResult::getEntity"); + static auto sig = GET_SIG_ADDRESS("HitResult::getEntity"); static auto getEntity = *(decltype(&HitResult::getEntity)*)&sig; return (this->*getEntity)(); } diff --git a/src/SDK/Client/Level/Level.hpp b/src/SDK/Client/Level/Level.hpp index 4a94b19c..fcaba6b1 100644 --- a/src/SDK/Client/Level/Level.hpp +++ b/src/SDK/Client/Level/Level.hpp @@ -49,7 +49,7 @@ class Level { std::vector getRuntimeActorList() { // TODO prevent crashing !!! - static uintptr_t sig = Memory::findSig(GET_SIG("Level::getRuntimeActorList")); + static uintptr_t sig = GET_SIG_ADDRESS("Level::getRuntimeActorList"); static auto getRuntimeActorList = *(decltype(&Level::getRuntimeActorList) *) &sig; return (this->*getRuntimeActorList)(); } diff --git a/src/SDK/Client/Network/Packet/ContainerClosePacket.hpp b/src/SDK/Client/Network/Packet/ContainerClosePacket.hpp new file mode 100644 index 00000000..19d6fa7a --- /dev/null +++ b/src/SDK/Client/Network/Packet/ContainerClosePacket.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "Packet.hpp" +#include "Types/ContainerID.hpp" + +class ContainerClosePacket : public Packet { +public: + ContainerID ContainerId; + bool ServerInitiatedClose; +}; \ No newline at end of file diff --git a/src/SDK/Client/Network/Packet/ContainerOpenPacket.hpp b/src/SDK/Client/Network/Packet/ContainerOpenPacket.hpp new file mode 100644 index 00000000..17e805bf --- /dev/null +++ b/src/SDK/Client/Network/Packet/ContainerOpenPacket.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "Packet.hpp" +#include "Types/ContainerID.hpp" +#include "../../Level/HitResult.hpp" +#include "Types/ContainerType.hpp" + +class ContainerOpenPacket : public Packet { +public: + ContainerID ContainerId; + ContainerType Type; + BlockPos Pos; + int64_t EntityUniqueID; +}; \ No newline at end of file diff --git a/src/SDK/Client/Network/Packet/InteractPacket.hpp b/src/SDK/Client/Network/Packet/InteractPacket.hpp new file mode 100644 index 00000000..6e7cc743 --- /dev/null +++ b/src/SDK/Client/Network/Packet/InteractPacket.hpp @@ -0,0 +1,28 @@ +#pragma once +#include +#include "Packet.hpp" +#include "../../../../Utils/Utils.hpp" + +enum class InteractAction +{ + RIGHT_CLICK = 1, + LEFT_CLICK = 2, + LEAVE_VEHICLE = 3, + MOUSEOVER = 4 +}; + +class InteractPacket : public Packet { +public: + enum class Action : unsigned char { + Invalid = 0x0, + StopRiding = 0x3, + InteractUpdate = 0x4, + NpcOpen = 0x5, + OpenInventory = 0x6, + }; + +public: + InteractPacket::Action Action; + uint64_t TargetId; + Vec3 Pos; +}; \ No newline at end of file diff --git a/src/SDK/Client/Network/Packet/Types/ContainerID.hpp b/src/SDK/Client/Network/Packet/Types/ContainerID.hpp new file mode 100644 index 00000000..044b4fe9 --- /dev/null +++ b/src/SDK/Client/Network/Packet/Types/ContainerID.hpp @@ -0,0 +1,13 @@ +#pragma once + +enum class ContainerID : char { + None = -1, + Inventory = 0, + First = 1, + Last = 100, + Offhand = 119, + Armor = 120, + SelectionSlots = 122, + Chest = 123, + PlayerUIOnly = 124 +}; \ No newline at end of file diff --git a/src/SDK/Client/Network/Packet/Types/ContainerType.hpp b/src/SDK/Client/Network/Packet/Types/ContainerType.hpp new file mode 100644 index 00000000..b5853a60 --- /dev/null +++ b/src/SDK/Client/Network/Packet/Types/ContainerType.hpp @@ -0,0 +1,41 @@ +#pragma once + +enum class ContainerType : char { + None = -9, + Inventory = -1, + Container = 0x0, + Workbench = 0x1, + Furnace = 0x2, + Enchantment = 0x3, + BrewingStand = 0x4, + Anvil = 0x5, + Dispenser = 0x6, + Dropper = 0x7, + Hopper = 0x8, + Cauldron = 0x9, + MinecartChest = 0xA, + MinecartHopper = 0xB, + Horse = 0xC, + Beacon = 0xD, + StructureEditor = 0xE, + Trade = 0xF, + CommandBlock = 0x10, + Jukebox = 0x11, + Armor = 0x12, + Hand = 0x13, + CompoundCreator = 0x14, + ElementConstructor = 0x15, + MaterialReducer = 0x16, + LabTable = 0x17, + Loom = 0x18, + Lectern = 0x19, + Grindstone = 0x1A, + BlastFurnace = 0x1B, + Smoker = 0x1C, + Stonecutter = 0x1D, + Cartography = 0x1E, + Hud = 0x1F, + JigsawEditor = 0x20, + SmithingTable = 0x21, + ChestBoat = 0x22, +}; \ No newline at end of file diff --git a/src/SDK/Client/Render/BaseActorRenderContext.cpp b/src/SDK/Client/Render/BaseActorRenderContext.cpp index 26e12984..f6ffdd30 100644 --- a/src/SDK/Client/Render/BaseActorRenderContext.cpp +++ b/src/SDK/Client/Render/BaseActorRenderContext.cpp @@ -4,7 +4,7 @@ BaseActorRenderContext::BaseActorRenderContext(class ScreenContext *screenCtx, C MinecraftGame *game) { memset(this, 0, sizeof(BaseActorRenderContext)); using func = void (__fastcall *)(BaseActorRenderContext *, class ScreenContext *, ClientInstance *, MinecraftGame *); - static func efunc = reinterpret_cast(Memory::findSig(GET_SIG("baseActorRenderContext"))); + static func efunc = reinterpret_cast(GET_SIG_ADDRESS("baseActorRenderContext")); efunc(this, screenCtx, clientInstance, game); } diff --git a/src/SDK/Client/Render/FrameTransform.hpp b/src/SDK/Client/Render/FrameTransform.hpp index a3c47b82..02dd71b3 100644 --- a/src/SDK/Client/Render/FrameTransform.hpp +++ b/src/SDK/Client/Render/FrameTransform.hpp @@ -8,5 +8,4 @@ struct FrameTransform GLMatrix modelView {}; Vec3 origin {}; Vec2 fov {}; - Vec3 playerPos {}; }; \ No newline at end of file diff --git a/src/SDK/Client/Render/GuiData.cpp b/src/SDK/Client/Render/GuiData.cpp index 731a4ed2..23482899 100644 --- a/src/SDK/Client/Render/GuiData.cpp +++ b/src/SDK/Client/Render/GuiData.cpp @@ -10,13 +10,15 @@ void GuiData::displayClientMessage(const std::string &str) { static uintptr_t sig; if (sig == NULL) { - sig = Memory::findSig(GET_SIG("GuiData::displayClientMessage")); + sig = GET_SIG_ADDRESS("GuiData::displayClientMessage"); } if (WinrtUtils::check(21, 20)) { - using func_t = void(*)(GuiData*, const std::string&, std::optional, bool); // The new optional seems to be some kind of filtered message for the future. If set, it overwrites the other string + char bruh[0x28]{}; + + using func_t = void(*)(GuiData*, const std::string&, char*, bool); static auto func = reinterpret_cast(sig); - func(this, str, {}, true); + func(this, str, bruh, true); } else { using func_t = void(*)(GuiData*, const std::string&, bool); diff --git a/src/SDK/Client/Render/ItemRenderer.cpp b/src/SDK/Client/Render/ItemRenderer.cpp index 9d71795e..01dfabe6 100644 --- a/src/SDK/Client/Render/ItemRenderer.cpp +++ b/src/SDK/Client/Render/ItemRenderer.cpp @@ -6,6 +6,6 @@ ItemRenderer::renderGuiItemNew(BaseActorRenderContext *BaseActorRenderCtx, ItemS float opacity, float scale, bool isEnchanted) { using func = void (__fastcall *)(ItemRenderer *, BaseActorRenderContext *, ItemStack *, int, float, float, bool, float, float, float); - static func efunc = reinterpret_cast(Memory::findSig(GET_SIG("ItemRenderer::renderGuiItemNew"))); + static func efunc = reinterpret_cast(GET_SIG_ADDRESS("ItemRenderer::renderGuiItemNew")); efunc(this, BaseActorRenderCtx, item, mode, x, y, isEnchanted, 1, opacity, scale); } \ No newline at end of file diff --git a/src/SDK/Client/Render/MinecraftUIRenderContext.hpp b/src/SDK/Client/Render/MinecraftUIRenderContext.hpp index de02108b..22dd6883 100644 --- a/src/SDK/Client/Render/MinecraftUIRenderContext.hpp +++ b/src/SDK/Client/Render/MinecraftUIRenderContext.hpp @@ -15,6 +15,7 @@ #include "TextureGroup.hpp" #include "../../../Client/Module/Manager.hpp" #include "ScreenContext.hpp" +#include "../Core/HashedString.hpp" class MinecraftUIRenderContext { public: @@ -34,21 +35,30 @@ class MinecraftUIRenderContext { return getTextureGroup()->getLoadedTextures(); } - TexturePtr* getTexture(TexturePtr* ptr, const ResourceLocation& location, bool forceReload) { - using getTextureFunc = TexturePtr*(__fastcall*)(MinecraftUIRenderContext*, TexturePtr*, const ResourceLocation&, bool); - static auto getTextureOriginal = reinterpret_cast(Memory::findSig(GET_SIG("MinecraftUIRenderContext::getTexture"))); - return getTextureOriginal(this, ptr, location, forceReload); + TexturePtr& getTexture(TexturePtr& ptr, const ResourceLocation& location, bool forceReload) { + return Memory::CallVFuncI(29, this, ptr, location, forceReload); } - TexturePtr* createTexture(const std::string& path, bool external, bool forceReload) { + TexturePtr& createTexture(const std::string& path, bool external, bool forceReload) { const auto resource = ResourceLocation(path, external); - TexturePtr texture = TexturePtr(); - return getTexture(&texture, resource, forceReload); + TexturePtr texture; + return getTexture(texture, resource, forceReload); } - TexturePtr* createTexture(const ResourceLocation& location, bool forceReload) { - TexturePtr texture = TexturePtr(); - return getTexture(&texture, location, forceReload); + TexturePtr& createTexture(const ResourceLocation& location, bool forceReload) { + TexturePtr texture; + return getTexture(texture, location, forceReload); + } + + void drawImage(TexturePtr& texture, Vec2& pos, Vec2& size, Vec2& uvPos, Vec2& uvSize) { + if (WinrtUtils::check(21, 20)) + Memory::CallVFunc<7, void, TexturePtr&, Vec2&, Vec2&, Vec2&, Vec2&, bool>(this, texture, pos, size, uvPos, uvSize, false); + else + Memory::CallVFunc<7, void, TexturePtr&, Vec2&, Vec2&, Vec2&, Vec2&>(this, texture, pos, size, uvPos, uvSize); + } + + void flushImages(mce::Color &color, float opacity, HashedString &hashedString) { + Memory::CallVFunc<9, void, mce::Color&, float, HashedString &>(this, color, opacity, hashedString); } void reloadTexture(const ResourceLocation& location) { @@ -81,7 +91,7 @@ class MinecraftUIRenderContext { textures[from] = textures[to]; } else { auto texture = createTexture(to, false); - textures[from] = *texture->clientTexture; + textures[from] = *texture.clientTexture; } } } diff --git a/src/SDK/Client/Render/ScreenView/UIControl.hpp b/src/SDK/Client/Render/ScreenView/UIControl.hpp index 554f5fe4..a56a7ab7 100644 --- a/src/SDK/Client/Render/ScreenView/UIControl.hpp +++ b/src/SDK/Client/Render/ScreenView/UIControl.hpp @@ -4,12 +4,14 @@ class UIControl { public: - BUILD_ACCESS(this, std::string, LayerName, GET_OFFSET("UIControl::LayerName")); BUILD_ACCESS(this, float, scale, GET_OFFSET("UIControl::scale")); BUILD_ACCESS(this, float, x, GET_OFFSET("UIControl::x")); BUILD_ACCESS(this, float, y, GET_OFFSET("UIControl::y")); BUILD_ACCESS(this, std::vector>, children, GET_OFFSET("UIControl::children")); + std::string& getLayerName() { + return hat::member_at(this, GET_OFFSET("UIControl::LayerName")); + } std::vector>& getComponents() { return hat::member_at>>(this, GET_OFFSET("UIControl::components")); diff --git a/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp b/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp index 1cf97b21..c33b9fd0 100644 --- a/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp +++ b/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp @@ -5,13 +5,13 @@ void MeshHelpers::renderMeshImmediately(ScreenContext* screenContext, Tessellator* tessellator, mce::MaterialPtr* material) { if (WinrtUtils::check(21, 20)) { char pad[0x58]{}; - static auto sig = Memory::offsetFromSig(Memory::findSig(GET_SIG("MeshHelpers::renderMeshImmediately")), 1); + static auto sig = Memory::offsetFromSig(GET_SIG_ADDRESS("MeshHelpers::renderMeshImmediately"), 1); using func_t = void(*)(ScreenContext*, Tessellator*, mce::MaterialPtr*, char*); static auto func = reinterpret_cast(sig); func(screenContext, tessellator, material, pad); } else { - static auto sig = Memory::findSig(GET_SIG("MeshHelpers::renderMeshImmediately")); + static auto sig = GET_SIG_ADDRESS("MeshHelpers::renderMeshImmediately"); using func_t = void(*)(ScreenContext*, Tessellator*, mce::MaterialPtr*); static auto func = reinterpret_cast(sig); func(screenContext, tessellator, material); diff --git a/src/SDK/Client/Render/Tessellator/RenderMaterialGroup.cpp b/src/SDK/Client/Render/Tessellator/RenderMaterialGroup.cpp index e7364061..1c549def 100644 --- a/src/SDK/Client/Render/Tessellator/RenderMaterialGroup.cpp +++ b/src/SDK/Client/Render/Tessellator/RenderMaterialGroup.cpp @@ -4,7 +4,7 @@ #include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" mce::MaterialPtr* mce::RenderMaterialGroup::createUI(const HashedString& materialName) { - static auto uiRenderMaterialGroup = Memory::getOffsetFromSig(Memory::findSig(GET_SIG("mce::RenderMaterialGroup::ui")), 3); + static auto uiRenderMaterialGroup = Memory::getOffsetFromSig(GET_SIG_ADDRESS("mce::RenderMaterialGroup::ui"), 3); return Memory::CallVFunc<1, MaterialPtr*, const HashedString&>(uiRenderMaterialGroup, materialName); } diff --git a/src/SDK/Client/Render/Tessellator/Tessellator.hpp b/src/SDK/Client/Render/Tessellator/Tessellator.hpp index 1b844354..5dda45a9 100644 --- a/src/SDK/Client/Render/Tessellator/Tessellator.hpp +++ b/src/SDK/Client/Render/Tessellator/Tessellator.hpp @@ -9,31 +9,31 @@ class Tessellator { public: void begin(mce::PrimitiveMode vertexFormat = mce::PrimitiveMode::TriangleList, const int maxVertices = 0, const bool buildFaceData = false) { using func_t = void(__fastcall*)(Tessellator*, mce::PrimitiveMode, int, bool); - static auto func = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::begin"))); + static auto func = reinterpret_cast(GET_SIG_ADDRESS("Tessellator::begin")); func(this, vertexFormat, maxVertices, buildFaceData); } void vertex(float x, float y, float z) { using func_t = void(__fastcall*)(Tessellator*, float, float, float); - static auto func = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::vertex"))); + static auto func = reinterpret_cast(GET_SIG_ADDRESS("Tessellator::vertex")); func(this, x, y, z); } void color(float r, float g, float b, float a) { using func_t = void(__fastcall*)(Tessellator*, float, float, float, float); - static auto func = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::colorF"))); + static auto func = reinterpret_cast(GET_SIG_ADDRESS("Tessellator::colorF")); func(this, r, g, b, a); } void setRotation(float angle, Vec3 pivot) { using func_t = void(__fastcall*)(Tessellator *, float, Vec3); - static auto func = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::setRotation"))); + static auto func = reinterpret_cast(GET_SIG_ADDRESS("Tessellator::setRotation")); func(this, angle, pivot); } void resetTransform(bool a1) { using func_t = void(__fastcall*)(Tessellator *, bool); - static auto func = reinterpret_cast(Memory::findSig(GET_SIG("Tessellator::resetTransform"))); + static auto func = reinterpret_cast(GET_SIG_ADDRESS("Tessellator::resetTransform")); func(this, a1); } }; diff --git a/src/SDK/Client/Render/Textures/Color.hpp b/src/SDK/Client/Render/Textures/Color.hpp index 965ab63e..f17e44cd 100644 --- a/src/SDK/Client/Render/Textures/Color.hpp +++ b/src/SDK/Client/Render/Textures/Color.hpp @@ -6,5 +6,13 @@ namespace mce { float g; float b; float a; + + public: + Color() { + this->r = 1; + this->g = 1; + this->b = 1; + this->a = 1; + } }; } diff --git a/src/SDK/SDK.cpp b/src/SDK/SDK.cpp index d6661ac5..9655535d 100644 --- a/src/SDK/SDK.cpp +++ b/src/SDK/SDK.cpp @@ -20,7 +20,7 @@ std::shared_ptr SDK::createPacket(int id) { static uintptr_t Address; if (Address == NULL) { - Address = Memory::findSig(GET_SIG("MinecraftPackets::createPacket")); + Address = GET_SIG_ADDRESS("MinecraftPackets::createPacket"); } auto pFunction = reinterpret_cast(__fastcall *)(int)>(Address); diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index 667c5681..14779132 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -3,6 +3,31 @@ #include "../../../Logger/Logger.hpp" #include "../SignatureAndOffsetManager.hpp" +void OffsetInit::init2130() { + Logger::debug("[Offsets] Loading offsets for 1.21.3X"); + + ADD_OFFSET("Player::gamemode", 0xB18); + ADD_OFFSET("Player::playerName", 0xCA0); + + ADD_OFFSET("Level::hitResult", 0x230); + ADD_OFFSET("Level::getPlayerMap", 0xC08); + + ADD_OFFSET("ClientInstance::viewMatrix", 0x360); + ADD_OFFSET("ClientInstance::getFovX", 0x720); + ADD_OFFSET("ClientInstance::getFovY", 0x734); + + ADD_OFFSET("LevelRendererPlayer::cameraPos", 0x614); + + ADD_OFFSET("ClientInstance::guiData", 0x588); + + ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A0); + + ADD_OFFSET("MoveInputComponent::forward", 0x2C); + ADD_OFFSET("MoveInputComponent::backward", 0x2D); + ADD_OFFSET("MoveInputComponent::left", 0x2E); + ADD_OFFSET("MoveInputComponent::right", 0x2F); +} + void OffsetInit::init2120() { Logger::debug("[Offsets] Loading offsets for 1.21.2X"); @@ -150,6 +175,8 @@ void OffsetInit::init2050() { ADD_OFFSET("Level::getPlayerMap", 0x1EA8); ADD_OFFSET("ItemActor::stack", 0x4C8); + + ADD_OFFSET("OptionInfo::TranslateName", 0x158); } void OffsetInit::init2040() { diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.hpp b/src/Utils/Memory/Game/Offset/OffsetInit.hpp index 4b2cd155..f51ffd70 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.hpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.hpp @@ -10,4 +10,5 @@ class OffsetInit { static void init2080(); static void init2100(); static void init2120(); + static void init2130(); }; diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 2766775f..6e591d6d 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -3,15 +3,48 @@ #include "../SignatureAndOffsetManager.hpp" +void SigInit::init2130() { + Logger::debug("[Signatures] Loading sigs for 1.21.30"); + ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 BA 31 00 00 00 44 8D 4A 04 44 8D 42 02 66 C7 44 24 20 37 00 E8 ? ? ? ? 48 8B 8B 70 11 00 00"); + ADD_SIG("ItemRenderer::renderGuiItemNew", "40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 D8 48 81 EC 28 01 00 00 0F 29 B4 24 10 01 00 00 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 45 00 44"); + + //ADD_SIG("MinecraftGame::onAppSuspended", ""); + + ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D4 49 8B CD"); + + + ADD_SIG("tryGetPrefix3", "40 53 48 83 EC 40 48 8B"); + ADD_SIG("Actor::getOnGroundFlagComponent", "DA BA A3 99 E2 C3"); + + ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4B 48"); + + ADD_SIG("HurtColor", "E8 ? ? ? ? E9 FD 02 00 00 8B 46 18"); + + ADD_SIG("CameraAssignAngle", "F3 0F 11 43 08 C6 43 0C 01"); + + ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 50"); + + ADD_SIG("ItemStack::getMaxDamage", "48 83 EC 28 48 8B 41 08 33 D2 48 85 C0 74 08 48 39 10 0F 94 C1 EB 05 B9 01 00 00 00 84 C9 75 20"); + + ADD_SIG("Tessellator::begin", "48 89 5C 24 ? 57 48 83 EC ? 80 B9 ? ? ? ? ? 45 0F B6"); + + ADD_SIG("MeshHelpers::renderMeshImmediately", "E8 ? ? ? ? C6 47 38 ? F3 0F 10 ? ? ? ? ? 0F 57 D2"); + + ADD_SIG("glm_rotateRef", "E8 ? ? ? ? 41 BC ? ? ? ? 0F B6 47"); + ADD_SIG("glm_translateRef", "E8 ? ? ? ? 48 8D 15 ? ? ? ? 44 0F 28 05"); + + ADD_SIG("mce::TextureGroup::getTexture", "40 55 53 56 57 41 54 41 56 41 57 48 8D 6C 24 E9 48 81 EC 00"); +} + void SigInit::init2120() { Logger::debug("[Signatures] Loading sigs for 1.21.20"); - ADD_SIG("Options::getGamma", "48 83 EC 28 80 B9 80 17 00 00 00 48 8D 54 24 30 48 8B 01 48 8B 40 60 74 38 41 B8 19"); + ADD_SIG("Options::getGamma", "48 83 EC 28 80 B9 ? 17 00 00 00 48 8D 54 24 30 48 8B 01 48 8B 40 60 74 38 41 B8 19"); ADD_SIG("mce::TextureGroup::getTexture", "40 55 53 56 57 41 55 41 56 41 57 48 8D 6C 24 E9 48 81 EC 00"); ADD_SIG("RaknetTick", "4C 8B DC 49 89 5B 10 49 89 73 18 57 48 81 EC 10 02"); ADD_SIG("ItemRenderer::renderGuiItemNew", "40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 E8 48 81 EC 18 01 00 00 0F 29 B4 24 00 01 00 00 48"); - ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 37 00 00 00 8D 50 FA 44 8D 48 FE 44 8D 40 FC 66 89 44 24 20 E8 ?? ?? ?? ?? 48 8B 8B C0 10 00 00"); + ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 B8 37 00 00 00 8D 50 FA 44 8D 48 FE 44 8D 40 FC 66 89 44 24 20 E8 ? ? ? ? 48 8B 8B C0 10 00 00"); ADD_SIG("MinecraftPackets::createPacket", "40 53 48 83 EC 30 45 33 C0 48 8B D9 81"); @@ -24,6 +57,8 @@ void SigInit::init2120() { ADD_SIG("GuiData::displayClientMessage", "40 55 53 56 57 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 45 0F B6 F1 49 8B D8"); ADD_SIG("MeshHelpers::renderMeshImmediately", "E8 ? ? ? ? C6 43 ? ? F3 0F 10 1D ? ? ? ? 0F 57 D2 0F 57 C9"); + + ADD_SIG("HudMobEffectsRenderer::render", "48 89 5C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? B8 ? ? ? ? E8 ? ? ? ? 48 2B E0 0F 29 B4 24 ? ? ? ? 0F 29 BC 24 ? ? ? ? 44 0F 29 84 24 ? ? ? ? 44 0F 29 8C 24 ? ? ? ? 44 0F 29 94 24 ? ? ? ? 44 0F 29 9C 24 ? ? ? ? 44 0F 29 A4 24 ? ? ? ? 44 0F 29 AC 24 ? ? ? ? 44 0F 29 B4 24 ? ? ? ? 44 0F 29 BC 24 ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 49 8B F9"); } void SigInit::init2102() { @@ -84,7 +119,7 @@ void SigInit::init2070() { ADD_SIG("TimeChanger", "? ? ? ? ? ? 76 05 F7 EA C1 FA 09 8B C2"); - ADD_SIG("Actor::getArmor", "48 8B 89 20 04 00 00 48 8B 01 48 8B 40 28 48"); + ADD_SIG("Actor::getArmor", "48 8B 89 20 04 00 00 48 8B 01 48 8B 40 28 48"); // depricated ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 E0 1C 00 00"); } @@ -110,6 +145,8 @@ void SigInit::init2050() { ADD_SIG("tryGetPrefix", "48 89 5C 24 ? 57 48 83 EC ? 48 8B"); + ADD_SIG("tryGetPrefix2", "40 53 48 83 EC 20 48 8B"); + ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B F9 4C 8D B1"); ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 18 89 44 24 ? 48 8D 54 24 ? 48 8B 4B ? E8 ? ? ? ? 48 8B F8"); @@ -123,7 +160,7 @@ void SigInit::init2050() { ADD_SIG("ThirdPersonNametag", "? ? ? ? ? ? 49 8B D6 48 8B CE E8 ? ? ? ? 84 C0 0F 84 ? ? ? ? 49 8B 97"); ADD_SIG("Actor::getArmor", "48 8B 89 50 04 00 00 48 8B 01 48 8B 40 28 48"); - ADD_SIG("Actor::getOffhandSlot", "48 8B 89 ? ? ? ? BA ? ? ? ? 48 8B 01 48 8B 40 ? 48 FF 25"); + ADD_SIG("Actor::getOffhandSlot", "48 8B 89 ? ? ? ? BA ? ? ? ? 48 8B 01 48 8B 40 ? 48 FF 25"); // depricated ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 D8 1C 00 00"); @@ -144,6 +181,8 @@ void SigInit::init2040() { ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 78"); ADD_SIG("ItemPositionConst", "F3 0F 59 05 ? ? ? ? F3 41 0F 58 87"); + + ADD_SIG("HudMobEffectsRenderer::render", "48 89 5C 24 08 55 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? EE"); } void SigInit::init2030() { @@ -164,6 +203,7 @@ void SigInit::init2030() { ADD_SIG("Actor::getActorGameTypeComponent", "DA BA DE AB CB AF"); ADD_SIG("Actor::getAABBShapeComponent", "DA BA F2 C9 10 1B"); ADD_SIG("Actor::getStateVectorComponent", "DA BA 91 3C C9 0E"); + ADD_SIG("Actor::getMobEffectsComponent", "DA BA 2F B4 D6 F7"); ADD_SIG("ActorCollision::isOnGround", "40 53 48 83 EC ? 48 8B D9 BA E1 2D 1F 21"); @@ -246,8 +286,6 @@ void SigInit::init2030() { ADD_SIG("baseActorRenderContext", "48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 48 89 ? ? ? 57 48 83 EC ? 49 8B ? 48 8B ? 48 8B ? 48 8D ? ? ? ? ? 48 89 ? 33 ED"); - ADD_SIG("MinecraftUIRenderContext::getUIMaterial", "4C 8D 05 ? ? ? ? 48 8B D3 48 8B CF 48 8B 5C 24 ? 0F 28 7C 24 ? 44 0F 28 44 24 ? 48 83 C4 40 5F E9 ? ? ? ?"); - ADD_SIG("mce::RenderMaterialGroup::ui", "48 8B 05 ? ? ? ? 48 8D 55 ? 48 8D 0D ? ? ? ? 48 8B 40 ? FF 15 ? ? ? ? 48 8B F8"); ADD_SIG("Tessellator::begin", "48 89 5C 24 ? 56 48 83 EC ? 80 B9 ? ? ? ? ? 45 0F B6"); ADD_SIG("Tessellator::vertex", "40 57 48 81 EC ? ? ? ? 0F 29 7C ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 ? 8B 81"); @@ -275,4 +313,5 @@ void SigInit::init2030() { ADD_SIG("glm_translateRef", "? ? ? ? ? 41 C6 ? ? ? F3 0F 11 7C 24 ? 41 0F 28 DA"); ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 40 ? 44 0F 29 48 ? 44 0F 29 90 ? ? ? ? 44 0F 29 98 ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 49 8B D8"); + ADD_SIG("HudMobEffectsRenderer::render", "48 8B C4 48 89 58 08 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 28 F5"); } diff --git a/src/Utils/Memory/Game/Sig/SigInit.hpp b/src/Utils/Memory/Game/Sig/SigInit.hpp index b231b6f3..1d1ad28c 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.hpp +++ b/src/Utils/Memory/Game/Sig/SigInit.hpp @@ -11,4 +11,5 @@ class SigInit { static void init2100(); static void init2102(); static void init2120(); + static void init2130(); }; diff --git a/src/Utils/Memory/Game/SignatureAndOffsetManager.cpp b/src/Utils/Memory/Game/SignatureAndOffsetManager.cpp index d790f320..563642e0 100644 --- a/src/Utils/Memory/Game/SignatureAndOffsetManager.cpp +++ b/src/Utils/Memory/Game/SignatureAndOffsetManager.cpp @@ -1,14 +1,20 @@ #include "SignatureAndOffsetManager.hpp" +#include "../Memory.hpp" SignatureAndOffsetManager Mgr; void SignatureAndOffsetManager::addSignature(unsigned int hash, const char* sig) { - sigs[hash] = sig; + sigs[hash] = { sig, 0 }; } const char* SignatureAndOffsetManager::getSig(unsigned int hash) const { auto it = sigs.find(hash); - return it != sigs.end() ? it->second.c_str() : nullptr; + return it != sigs.end() ? it->second.first.c_str() : nullptr; +} + +uintptr_t SignatureAndOffsetManager::getSigAddress(unsigned int hash) const { + auto it = sigs.find(hash); + return it != sigs.end() ? it->second.second : 0; } void SignatureAndOffsetManager::addOffset(unsigned int hash, int offset) { @@ -23,4 +29,10 @@ int SignatureAndOffsetManager::getOffset(unsigned int hash) const { void SignatureAndOffsetManager::clear() { sigs.clear(); offsets.clear(); -} \ No newline at end of file +} + +void SignatureAndOffsetManager::scanAllSignatures() { + for (auto& pair : sigs) { + pair.second.second = Memory::findSig(pair.second.first); + } +} diff --git a/src/Utils/Memory/Game/SignatureAndOffsetManager.hpp b/src/Utils/Memory/Game/SignatureAndOffsetManager.hpp index f59b19b9..8d85b209 100644 --- a/src/Utils/Memory/Game/SignatureAndOffsetManager.hpp +++ b/src/Utils/Memory/Game/SignatureAndOffsetManager.hpp @@ -17,6 +17,13 @@ return sig; \ }() +#define GET_SIG_ADDRESS(name) \ + []{ \ + constexpr unsigned int hash_val = Utils::hash(name); \ + static auto sig = Mgr.getSigAddress(hash_val);\ + return sig; \ + }() + #define ADD_OFFSET(name, offset) \ []{ \ constexpr unsigned int hash_val = Utils::hash(name); \ @@ -34,14 +41,17 @@ class SignatureAndOffsetManager { public: void addSignature(unsigned int hash, const char* sig); [[nodiscard]] const char* getSig(unsigned int hash) const; + [[nodiscard]] uintptr_t getSigAddress(unsigned int hash) const; void addOffset(unsigned int hash, int offset); [[nodiscard]] int getOffset(unsigned int hash) const; + void scanAllSignatures(); + void clear(); private: - std::unordered_map sigs{}; + std::unordered_map> sigs{}; std::unordered_map offsets{}; }; diff --git a/src/Utils/Memory/Game/Tutorial/HowToGetSigsAndOffsets.md b/src/Utils/Memory/Game/Tutorial/HowToGetSigsAndOffsets.md index 2ad733ae..b406b168 100644 --- a/src/Utils/Memory/Game/Tutorial/HowToGetSigsAndOffsets.md +++ b/src/Utils/Memory/Game/Tutorial/HowToGetSigsAndOffsets.md @@ -142,6 +142,11 @@ Found near getActorFlag first param is basicReg, second is runtimeID # VTable Indexes Memory::GetAddressByIndex(vtableAddr, function +# Bobbing function +0.017453292 find this and compare refs +48 89 5C 24 10 48 89 74 24 20 4C 89 44 24 18 57 48 83 EC 60 0F 29 74 24 50 0F 29 1.21.30 +40 53 56 57 48 81 EC 80 00 00 00 0F 29 74 24 70 0F 29 7C 24 60 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 50 1.21.20 and below a bit + # Sigs to functions ### ItemRenderer::renderGuiItemNew @@ -151,10 +156,12 @@ xref out 1 time, then xref to last func and here you go ### Level::getRuntimeActorList 48 89 5C 24 18 55 56 57 48 83 EC 40 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 38 48 8B F2 48 8B E9 48 89 xref out and here u go +or scan 40 53 48 83 EC 30 48 81 (1.21.30+) first res should be it ### Actor::baseTick 48 89 5C 24 10 48 89 74 24 18 57 48 83 EC 40 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 30 8B -2nd xref is it +2nd xref is it +?? ?? ?? ?? 48 8B 8B C0 10 00 00 or this and first one should be it ### Player::BaseTick gamePlayEmote, gamePlayFlying, /gameplay/death @@ -169,3 +176,9 @@ look for textures/ui/cross_hair or ui_crosshair, first function should be it ### ItemRenderer::render Look for this number 0x80100240C00 + +### HudMobEffectsRenderer::render +textures/ui/hud_mob_effect_background + +### ActorCollision::isOnGround +minecraft:arrow_spell_emitter From 2f4bee9d059cb23e023e95be2ae0d4980d416453 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 21 Sep 2024 10:57:58 +0600 Subject: [PATCH 155/240] fix --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bf17e8dd..1512cd06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,7 +89,7 @@ file(GLOB_RECURSE sources "main.cpp" "src/**/*.cpp" "src/**/*.hpp" "lib/**/*.cpp add_library(${PROJECT_NAME} SHARED ${sources} src/SDK/Client/Render/Matrix.cpp src/Assets/Assets.rc) -target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lib/include/" "${CMAKE_CURRENT_LIST_DIR}/lib/glm/") +target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lib/include/" "${CMAKE_CURRENT_LIST_DIR}/lib/glm/" "${CMAKE_CURRENT_LIST_DIR}/lib/ImGui") # Disable RTTI if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") From 299f5b30c9d7939f3fdd1be08f59ce43325b75f0 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 21 Sep 2024 11:00:52 +0600 Subject: [PATCH 156/240] fix #2 --- src/SDK/Client/Render/ScreenView/UIControl.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SDK/Client/Render/ScreenView/UIControl.hpp b/src/SDK/Client/Render/ScreenView/UIControl.hpp index a56a7ab7..9c801d71 100644 --- a/src/SDK/Client/Render/ScreenView/UIControl.hpp +++ b/src/SDK/Client/Render/ScreenView/UIControl.hpp @@ -7,6 +7,7 @@ class UIControl { BUILD_ACCESS(this, float, scale, GET_OFFSET("UIControl::scale")); BUILD_ACCESS(this, float, x, GET_OFFSET("UIControl::x")); BUILD_ACCESS(this, float, y, GET_OFFSET("UIControl::y")); + BUILD_ACCESS(this, std::string, LayerName, GET_OFFSET("UIControl::LayerName")); BUILD_ACCESS(this, std::vector>, children, GET_OFFSET("UIControl::children")); std::string& getLayerName() { From 69e41e9cb070d25f53b3405cffa4f23c6b656091 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 21 Sep 2024 08:15:51 +0300 Subject: [PATCH 157/240] Sync with legacy #2 --- src/Client/Hook/Hooks/Game/PacketHooks.cpp | 42 ++++++++++++++++++- src/Client/Hook/Hooks/Game/PacketHooks.hpp | 12 ++++++ .../Hook/Hooks/Render/SetupAndRenderHook.hpp | 5 +-- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.cpp b/src/Client/Hook/Hooks/Game/PacketHooks.cpp index be490c7c..5439cc9d 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.cpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.cpp @@ -63,6 +63,34 @@ void SendPacketHook::receiveCallbackEntityEvent(void *packetHandlerDispatcher, v } +void SendPacketHook::receiveCallbackInteract(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, + const std::shared_ptr &packet) { + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); + PacketEvent event(packet.get()); + EventHandler::onPacketReceive(event); + if (!event.isCancelled()) + receivePacketInteractOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); +} + +void SendPacketHook::receiveCallbackContainerOpen(void *packetHandlerDispatcher, void *networkIdentifier, + void *netEventCallback, const std::shared_ptr &packet) { + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); + PacketEvent event(packet.get()); + EventHandler::onPacketReceive(event); + if (!event.isCancelled()) + receivePacketContainerOpenOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); +} + +void SendPacketHook::receiveCallbackContainerClose(void *packetHandlerDispatcher, void *networkIdentifier, + void *netEventCallback, const std::shared_ptr &packet) { + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); + PacketEvent event(packet.get()); + EventHandler::onPacketReceive(event); + if (!event.isCancelled()) + receivePacketContainerCloseOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); +} + + void SendPacketHook::enableHook() { /*for (int num = 1; num <= (int)MinecraftPacketIds::PacketViolationWarning; num++) { @@ -89,6 +117,18 @@ void SendPacketHook::enableHook() { Memory::hookFunc((void *) EntityEventPacket->packetHandler->vTable[1], (void*)receiveCallbackEntityEvent, (void **) &receivePacketEntityEventOriginal, "ReceivePacketHook"); + std::shared_ptr InteractPacket = SDK::createPacket((int) MinecraftPacketIds::Interact); + Memory::hookFunc((void *) InteractPacket->packetHandler->vTable[1], (void*)receiveCallbackInteract, + (void **) &receivePacketInteractOriginal, "ReceivePacketHook"); + + std::shared_ptr ContainerOpenPacket = SDK::createPacket((int) MinecraftPacketIds::ContainerOpen); + Memory::hookFunc((void *) ContainerOpenPacket->packetHandler->vTable[1], (void *)receiveCallbackContainerOpen, + (void **) &receivePacketContainerOpenOriginal, "ReceivePacketHook"); + + std::shared_ptr ContainerClosePacket = SDK::createPacket((int) MinecraftPacketIds::ContainerClose); + Memory::hookFunc((void *) ContainerClosePacket->packetHandler->vTable[1], (void *)receiveCallbackContainerClose, + (void **) &receivePacketContainerCloseOriginal, "ReceivePacketHook"); + this->autoHook((void *) callback, (void **) &sendPacketOriginal); } @@ -96,4 +136,4 @@ void SendPacketHook::setVariables(void *packetHandlerDispatcher, void *networkId SendPacketHook::NetworkIdentifier = networkIdentifier; SendPacketHook::PacketHandlerDispatcher = packetHandlerDispatcher; SendPacketHook::NetEventCallback = netEventCallback; -} +} \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.hpp b/src/Client/Hook/Hooks/Game/PacketHooks.hpp index 4c26782b..ce1c1776 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.hpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.hpp @@ -24,6 +24,15 @@ class SendPacketHook : public Hook { static void receiveCallbackEntityEvent(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet); + static void receiveCallbackInteract(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, + const std::shared_ptr& packet); + + static void receiveCallbackContainerOpen(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, + const std::shared_ptr& packet); + + static void receiveCallbackContainerClose(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, + const std::shared_ptr& packet); + public: static inline void* NetworkIdentifier; @@ -40,6 +49,9 @@ class SendPacketHook : public Hook { static inline receive receiveSetTitlePacketOriginal = nullptr; static inline receive receivePacketPlaySoundOriginal = nullptr; static inline receive receivePacketEntityEventOriginal = nullptr; + static inline receive receivePacketInteractOriginal = nullptr; + static inline receive receivePacketContainerOpenOriginal = nullptr; + static inline receive receivePacketContainerCloseOriginal = nullptr; SendPacketHook() : Hook("sendPacket", GET_SIG("LoopbackPacketSender::sendPacket")) {} diff --git a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp index 2d654677..9badd0b4 100644 --- a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp +++ b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp @@ -104,7 +104,7 @@ class SetUpAndRenderHook : public Hook if(funcOriginalText == nullptr || oDrawImage == nullptr) hookDrawTextAndDrawImage(muirc); - std::string layer = pScreenView->VisualTree->root->LayerName; + std::string layer = pScreenView->VisualTree->root->getLayerName(); if (layer != "debug_screen" && layer != "toast_screen"){ // start_screen, play_screen, world_loading_progress_screen, pause_screen, hud_screen SetTopScreenNameEvent event(layer); @@ -120,10 +120,9 @@ class SetUpAndRenderHook : public Hook if (player && SDK::clientInstance->getLevelRender()) { origin = SDK::clientInstance->getLevelRender()->getOrigin(); - pos = player->getRenderPositionComponent()->renderPos; } - FrameTransform transform = { SDK::clientInstance->getViewMatrix(), origin, SDK::clientInstance->getFov(), pos}; + FrameTransform transform = { SDK::clientInstance->getViewMatrix(), origin, SDK::clientInstance->getFov() }; SwapchainHook::frameTransformsMtx.lock(); SwapchainHook::FrameTransforms.push(transform); From f1be8a52726184a46e85d81e8610250c91ae4b3c Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 21 Sep 2024 08:19:55 +0300 Subject: [PATCH 158/240] Sync with legacy #3 --- src/Utils/Versions/VersionUtils.cpp | 7 ++++++- src/Utils/Versions/WinrtUtils.cpp | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Utils/Versions/VersionUtils.cpp b/src/Utils/Versions/VersionUtils.cpp index 0cf0b2e1..77f4eb9f 100644 --- a/src/Utils/Versions/VersionUtils.cpp +++ b/src/Utils/Versions/VersionUtils.cpp @@ -11,6 +11,9 @@ std::vector, std::function>>> VersionUtils::versions; void VersionUtils::init() { + std::pair, std::function>> p2130 = {"1.21.3", {SigInit::init2130, OffsetInit::init2130}}; + versions.push_back(p2130); + std::pair, std::function>> p2120 = {"1.21.2", {SigInit::init2120, OffsetInit::init2120}}; versions.push_back(p2120); @@ -20,7 +23,7 @@ void VersionUtils::init() { std::pair, std::function>> p2110 = {"1.21.1", {SigInit::init2100, OffsetInit::init2100}}; versions.push_back(p2110); - std::pair, std::function>> p2100 = {"1.21.3", {SigInit::init2100, OffsetInit::init2100}}; + std::pair, std::function>> p2100 = {"1.21.03", {SigInit::init2100, OffsetInit::init2100}}; versions.push_back(p2100); std::pair, std::function>> p2080 = {"1.20.8", {SigInit::init2080, OffsetInit::init2080}}; @@ -75,4 +78,6 @@ void VersionUtils::addData() { t1.join(); t2.join(); + + Mgr.scanAllSignatures(); } diff --git a/src/Utils/Versions/WinrtUtils.cpp b/src/Utils/Versions/WinrtUtils.cpp index 9043cc71..a1611b86 100644 --- a/src/Utils/Versions/WinrtUtils.cpp +++ b/src/Utils/Versions/WinrtUtils.cpp @@ -52,6 +52,12 @@ std::string WinrtUtils::getFormattedVersion() { return "1.21.02"; } + if(version == "1.21.3.0") { // i cba for now #2 + // 1.21.3.0 - 1.21.0 ".3" + // 1.21.3003.0 - 1.21.30 + return "1.21.03"; + } + // Split version string by dots std::vector parts; std::istringstream iss(version); From 287d77033ba286a44540f1dddf66d3da5439f093 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 21 Sep 2024 09:09:15 +0300 Subject: [PATCH 159/240] Sync with legacy #3 --- main.cpp | 31 ++++++++---------- src/Client/Client.cpp | 6 ++-- .../ItemPhysics/ItemPhysicsListener.cpp | 2 +- .../Module/Modules/PaperDoll/DollListener.hpp | 2 +- .../Client/Render/ScreenView/UIControl.hpp | 1 - src/Utils/Logger/crashlogs.cpp | 32 ++++++++++++++++++- src/Utils/Logger/crashlogs.hpp | 1 + src/Utils/Utils.hpp | 8 +++++ 8 files changed, 59 insertions(+), 24 deletions(-) diff --git a/main.cpp b/main.cpp index 4d169bab..ecdf995b 100644 --- a/main.cpp +++ b/main.cpp @@ -11,6 +11,7 @@ #include #include "src/Client/Module/Modules/Nick/NickListener.hpp" +#include "src/Utils/Logger/crashlogs.hpp" std::chrono::steady_clock::time_point lastBeatTime; @@ -34,23 +35,19 @@ DWORD WINAPI init(HMODULE real) } #endif - Client::initialize(); Logger::info("[Client] Initializing"); std::thread statusThread([]() { - while (true) { + while (!Client::disable) { auto now = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast(now - lastBeatTime); if(!Client::disable) { if(SDK::hasInstanced && SDK::clientInstance != nullptr) { - // may crash here cuz accessed on other thread if (SDK::clientInstance->getLocalPlayer() != nullptr) { - - if(elapsed >= std::chrono::seconds(27)) { - ModuleManager::onlineUsers.clear(); + if(elapsed >= std::chrono::seconds(60)) { std::string name = SDK::clientInstance->getLocalPlayer()->getPlayerName(); @@ -119,7 +116,6 @@ DWORD WINAPI init(HMODULE real) }); statusThread.detach(); - while (true) { if (Client::disable) { break; @@ -134,35 +130,36 @@ DWORD WINAPI init(HMODULE real) EventHandler::unregisterAll(); - ModuleManager::terminate(); - HookManager::terminate(); + ResizeHook::cleanShit(); kiero::shutdown(); Logger::debug("[Kiero] Shut down Kiero."); - ResizeHook::cleanShit(); + ModuleManager::terminate(); + HookManager::terminate(); MH_DisableHook(MH_ALL_HOOKS); MH_Uninitialize(); - Logger::debug("[MinHook] Freeing Library."); + glaiel::crashlogs::end_session(); - Sleep(100); + Logger::debug("[MinHook] Freeing Library."); - FreeLibraryAndExitThread(real, 1); + FreeLibraryAndExitThread(Client::currentModule, 0); } BOOL APIENTRY DllMain(HMODULE instance, DWORD ul_reason_for_call, LPVOID lpReserved) { - switch (ul_reason_for_call) - { + + switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(instance); Client::currentModule = instance; - CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)init, instance, 0, nullptr); + CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE) init, instance, 0, nullptr); break; case DLL_PROCESS_DETACH: - ModuleManager::terminate(); + break; } return TRUE; diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 5de202bf..3b3d447b 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -18,8 +18,8 @@ std::string Client::settingspath = Utils::getRoamingPath() + R"(\Flarial\Config\main.flarial)"; Settings Client::settings = Settings(); bool notifiedOfConnectionIssue = false; -// UPDATE THIS TO THE LATEST GITHUB COMMIT AFTER CHANGING ANYHTHING -std::string current_commit = "b525056"; + +std::string current_commit = COMMIT_HASH; void DownloadAndSave(const std::string& url, const std::string& path) { @@ -213,4 +213,4 @@ void Client::centerCursor() { InHudScreen = !InHudScreen; } } -} +} \ No newline at end of file diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp index 4264c5ba..a0d30896 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp @@ -46,7 +46,7 @@ void ItemPhysicsListener::ItemRenderer_render(ItemRenderer* _this, BaseActorRend if(!ModuleManager::initialized) return oFunc(_this, renderCtx, renderData); - static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); + static auto mod = reinterpret_cast(ModuleManager::getModule("Item Physics")); const auto listener = mod->listener; listener->renderData = renderData; diff --git a/src/Client/Module/Modules/PaperDoll/DollListener.hpp b/src/Client/Module/Modules/PaperDoll/DollListener.hpp index 6c8fb1d0..dccc0ad8 100644 --- a/src/Client/Module/Modules/PaperDoll/DollListener.hpp +++ b/src/Client/Module/Modules/PaperDoll/DollListener.hpp @@ -70,7 +70,7 @@ class DollListener : public Listener { if(SDK::getCurrentScreen() == "hud_screen") { SDK::screenView->VisualTree->root->forEachControl([this](std::shared_ptr& control) { - if (control->LayerName == "hud_player") { + if (control->getLayerName() == "hud_player") { if(DollListener::oriXY.x == 0.0f) { DollListener::oriXY.x = control->x; diff --git a/src/SDK/Client/Render/ScreenView/UIControl.hpp b/src/SDK/Client/Render/ScreenView/UIControl.hpp index 9c801d71..a56a7ab7 100644 --- a/src/SDK/Client/Render/ScreenView/UIControl.hpp +++ b/src/SDK/Client/Render/ScreenView/UIControl.hpp @@ -7,7 +7,6 @@ class UIControl { BUILD_ACCESS(this, float, scale, GET_OFFSET("UIControl::scale")); BUILD_ACCESS(this, float, x, GET_OFFSET("UIControl::x")); BUILD_ACCESS(this, float, y, GET_OFFSET("UIControl::y")); - BUILD_ACCESS(this, std::string, LayerName, GET_OFFSET("UIControl::LayerName")); BUILD_ACCESS(this, std::vector>, children, GET_OFFSET("UIControl::children")); std::string& getLayerName() { diff --git a/src/Utils/Logger/crashlogs.cpp b/src/Utils/Logger/crashlogs.cpp index 6394dbde..4dd87d6f 100644 --- a/src/Utils/Logger/crashlogs.cpp +++ b/src/Utils/Logger/crashlogs.cpp @@ -46,6 +46,7 @@ namespace glaiel::crashlogs { crashed = 1, ending = 2, normal_exit = 3, + end_session = 4 }; static std::atomic status = program_status::running; @@ -125,6 +126,9 @@ namespace glaiel::crashlogs { cv.wait(lk, [] { return status != program_status::running; }); lk.unlock(); + if(status == program_status::end_session) + return; + //if it crashed, output the crash log if(status == program_status::crashed) { output_crash_log(); @@ -136,6 +140,8 @@ namespace glaiel::crashlogs { } static inline void crash_handler() { + if(status == program_status::end_session) + return; //if we crashed during a crash... ignore lol if(status != program_status::running) return; @@ -194,7 +200,31 @@ namespace glaiel::crashlogs { static inline void normal_exit() { status = program_status::normal_exit; cv.notify_one(); - output_thread.join(); + if(output_thread.joinable()) + output_thread.join(); + } + + void end_session() { + try { + SetUnhandledExceptionFilter(nullptr); + std::signal(SIGABRT, nullptr); + std::signal(SIGSEGV, nullptr); + std::signal(SIGILL, nullptr); + std::set_terminate(nullptr); + _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT); + _set_purecall_handler(nullptr); + _set_invalid_parameter_handler(nullptr); + + status = program_status::end_session; + cv.notify_all(); + + if (output_thread.joinable()) { + output_thread.join(); + } + } catch (...) { + std::cerr << "Exception occurred during end_session" << std::endl; + throw; + } } //set up all the callbacks needed to get into the crash handler during a crash (borrowed from backward.cpp) diff --git a/src/Utils/Logger/crashlogs.hpp b/src/Utils/Logger/crashlogs.hpp index 04977f18..4d6c40ef 100644 --- a/src/Utils/Logger/crashlogs.hpp +++ b/src/Utils/Logger/crashlogs.hpp @@ -17,4 +17,5 @@ namespace glaiel::crashlogs { //if the folder doesn't exist, it will be created when the program crashes void set_crashlog_folder(std::string folderpath); + void end_session(); } \ No newline at end of file diff --git a/src/Utils/Utils.hpp b/src/Utils/Utils.hpp index ae999f6d..9016908e 100644 --- a/src/Utils/Utils.hpp +++ b/src/Utils/Utils.hpp @@ -108,6 +108,10 @@ class Vec2 { return Vec2(this->x + Vec.x, this->y + Vec.y); } + auto operator==(const Vec2 Vec) { + return this->x == Vec.x && this->y == Vec.y; + } + auto operator-(const Vec2 Vec) { return Vec2(this->x - Vec.x, this->y - Vec.y); } @@ -174,6 +178,10 @@ class Vec3 : public Vec2 { return Vec3(this->x * vec.x, this->y * vec.y, this->z * vec.z); }; + auto lerp(const Vec3 &vec, T t) -> Vec3 { + return Vec3(std::lerp(this->x, vec.x, t), std::lerp(this->y, vec.y, t), std::lerp(this->z, vec.z, t)); + }; + auto mul(T v) -> Vec3 { return Vec3(this->x * v, this->y * v, this->z * v); }; From 994b2d254b148c807407e08617e05863558b177f Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 21 Sep 2024 09:14:41 +0300 Subject: [PATCH 160/240] Crash fix --- src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp index a0d30896..d58283f5 100644 --- a/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp +++ b/src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp @@ -61,7 +61,7 @@ void ItemPhysicsListener::glm_rotate(glm::mat4x4& mat, float angle, float x, flo if(!ModuleManager::initialized) return; - static auto mod = reinterpret_cast(ModuleManager::getModule("ItemPhysics")); + static auto mod = reinterpret_cast(ModuleManager::getModule("Item Physics")); const auto listener = mod->listener; const auto renderData = listener->renderData; From 71b03789efe939481af2a9e8e4a2c2d6c0defc08 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 21 Sep 2024 14:52:06 +0600 Subject: [PATCH 161/240] Minecraftia blurryness fix --- src/Client/GUI/Engine/Elements/Control/Image/Image.cpp | 2 +- src/Client/GUI/Engine/Engine.cpp | 6 ++++-- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp b/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp index 2b410bfd..e33a4617 100644 --- a/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp @@ -310,7 +310,7 @@ void FlarialGUI::image(int resourceId, D2D1_RECT_F rect, LPCTSTR type, bool shou D3D12_DESCRIPTOR_HEAP_DESC descriptorImGuiRender = {}; descriptorImGuiRender.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; - descriptorImGuiRender.NumDescriptors = 500; // MAY NEED TO CHANGE THIS IS WE GET MORE THAN 100 ASSETS + descriptorImGuiRender.NumDescriptors = MAX_IMAGE_ID; // MAY NEED TO CHANGE THIS IS WE GET MORE THAN 100 ASSETS descriptorImGuiRender.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; ImageDevice4Fun->CreateDescriptorHeap(&descriptorImGuiRender, IID_PPV_ARGS(&SwapchainHook::d3d12DescriptorHeapImGuiIMAGE)); diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index 78b5e901..b6d59111 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -749,11 +749,13 @@ std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *tex } } - if(ifFontScale2(fontSize)) weightedName += "-2.0"; - else weightedName += "-1"; + if(weightedName.contains("minecraft")) weightedName = "164"; + if(ifFontScale2(fontSize)) weightedName += "-2.0"; + else weightedName += "-1"; + if(!FontMap[weightedName] && weightedName.contains("Normal")) replace(weightedName, "Normal", "Medium"); if (!FontMap[weightedName] || font == "Space Grotesk") weightedName = "162-1"; diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 5cbdfb5e..1e91f061 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -220,8 +220,10 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI fontLoaded = true; } - if (!FlarialGUI::FontMap["164"]) { - FlarialGUI::FontMap["164"] = ImGui::GetIO().Fonts->AddFontFromFileTTF((Utils::getRoamingPath() + "\\Flarial\\assets\\" + "164" + ".ttf").c_str(), 20); + if (!FlarialGUI::FontMap["164-1"]) { + FlarialGUI::FontMap["164-1"] = ImGui::GetIO().Fonts->AddFontFromFileTTF((Utils::getRoamingPath() + "\\Flarial\\assets\\" + "164" + ".ttf").c_str(), 23); + FlarialGUI::FontMap["164-2.0"] = ImGui::GetIO().Fonts->AddFontFromFileTTF((Utils::getRoamingPath() + "\\Flarial\\assets\\" + "164" + ".ttf").c_str(), 40); + fontLoaded = true; } From 7725d585d95d7c2cadda226d68c0f73b982eeecd Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 21 Sep 2024 15:06:44 +0600 Subject: [PATCH 162/240] Universal Font Scale, Blurry Fix, Font Weight Overrider --- src/Client/Client.cpp | 12 ++++++++++++ src/Client/GUI/Engine/Engine.cpp | 12 ++++++++---- .../Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 6 ++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 3b3d447b..016674f7 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -153,6 +153,18 @@ void Client::initialize() { if (Client::settings.getSettingByName("rgb_value") == nullptr) Client::settings.addSetting("rgb_value", 1.0f); + if (Client::settings.getSettingByName("modules_font_scale") == nullptr) + Client::settings.addSetting("modules_font_scale", 1.0f); + + if (Client::settings.getSettingByName("gui_font_scale") == nullptr) + Client::settings.addSetting("gui_font_scale", 1.0f); + + if (Client::settings.getSettingByName("overrideFontWeight") == nullptr) + Client::settings.addSetting("overrideFontWeight", (bool)false); + + if (Client::settings.getSettingByName("fontWeight") == nullptr) + Client::settings.addSetting("fontWeight", (std::string) "Normal"); + FlarialGUI::LoadFont(IDR_FONT_TTF); FlarialGUI::LoadFont(IDR_FONT_BOLD_TTF); diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index b6d59111..44958ef0 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -675,11 +675,16 @@ bool replace(std::string& str, const std::string& from, const std::string& to) { std::string FlarialGUI::GetWeightedName(std::string name, DWRITE_FONT_WEIGHT weight) { + std::string adder; + if(Client::settings.getSettingByName("overrideFontWeight")->value) { + return name + "-" + Client::settings.getSettingByName("fontWeight")->value; + } + if(!name.contains("-")) { switch (weight) { case DWRITE_FONT_WEIGHT_BOLD: - return name + "-Bold"; + return name + "-Bold"; break; case DWRITE_FONT_WEIGHT_NORMAL: return name + "-Normal"; @@ -700,8 +705,7 @@ std::string FlarialGUI::GetWeightedName(std::string name, DWRITE_FONT_WEIGHT wei return name + "-ExtraLight"; break; } - } - + } return name + "-Normal"; } @@ -772,7 +776,7 @@ std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *tex if(hasEnding(weightedName, "2.0")) sizeMultiplier = 0.6f; ImGui::PushFont(FontMap[weightedName]); - float fSize = (fontSize / 135) * sizeMultiplier; + float fSize = ((fontSize * Client::settings.getSettingByName(moduleFont ? "modules_font_scale" : "gui_font_scale")->value) / 135) * sizeMultiplier; ImGui::SetWindowFontScale(fSize); std::string stringText = WideToNarrow(text).c_str(); diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index a11744eb..de23bf58 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -495,7 +495,13 @@ class ClickGUIRenderer : public Listener { c->addHeader("Fonts"); c->addTextBox("ClickGUI", "", Client::settings.getSettingByName("fontname")->value); + c->addSlider("Universal Font Scale", "", Client::settings.getSettingByName("gui_font_scale")->value, 10.f, 0.f, true); + c->addTextBox("Modules", "", Client::settings.getSettingByName("mod_fontname")->value); + c->addSlider("Universal Font Scale", "", Client::settings.getSettingByName("modules_font_scale")->value, 10.f, 0.f, true); + + c->addToggle("Override Font Weight", "", Client::settings.getSettingByName("overrideFontWeight")->value); + c->addDropdown("Font Weight", "Bold, Thin, etc.", {"Bold", "Normal", "SemiBold", "ExtraBold", "Medium", "Light", "ExtraLight"}, Client::settings.getSettingByName("fontWeight")->value); c->extraPadding(); From 8d7b2d8dc732bb93b21f98871dbce0eccc023a5b Mon Sep 17 00:00:00 2001 From: WhiteOnGitHub <96546467+WhiteOnGitHub@users.noreply.github.com> Date: Sat, 21 Sep 2024 10:40:03 +0100 Subject: [PATCH 163/240] entity counter --- src/Client/Module/Manager.cpp | 2 + .../Modules/EntityCounter/EntityCounter.hpp | 264 ++++++++++++++++++ .../Modules/EntityCounter/EntityListener.hpp | 39 +++ 3 files changed, 305 insertions(+) create mode 100644 src/Client/Module/Modules/EntityCounter/EntityCounter.hpp create mode 100644 src/Client/Module/Modules/EntityCounter/EntityListener.hpp diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index a36c5495..22023db7 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -24,6 +24,7 @@ #include "Modules/PingCounter/PingCounter.hpp" #include "Modules/PotCounter/PotCounter.hpp" #include "Modules/ArrowCounter/ArrowCounter.hpp" +#include "Modules/EntityCounter/EntityCounter.hpp" #include "Modules/SnapLook/SnapLook.hpp" #include "Modules/Freelook/Freelook.hpp" #include "Modules/ThirdPersonNametag/ThirdPerson.hpp" @@ -119,6 +120,7 @@ void ModuleManager::initialize() { addModule(new PingCounter()); addModule(new PotCounter()); addModule(new ArrowCounter()); + addModule(new EntityCounter()); addModule(new Time()); addModule(new MEM()); addModule(new Fullbright()); diff --git a/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp b/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp new file mode 100644 index 00000000..47e2ff4f --- /dev/null +++ b/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp @@ -0,0 +1,264 @@ +#pragma once + +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" +#include "EntityListener.hpp" + +class EntityCounter : public Module { + +public: + + EntityCounter() : Module("Entity Counter", "Counts the entities in the surrounding area", + IDR_ARROW_PNG, "") { + Module::setup(); + }; + + void onEnable() override { + EventHandler::registerListener(new EntityListener("Entity", this)); + Module::onEnable(); + } + + void onDisable() override { + EventHandler::unregisterListener("Entity"); + Module::onDisable(); + } + + void defaultConfig() override { + if (settings.getSettingByName("text") == nullptr) + settings.addSetting("text", (std::string) "{value} Entities"); + + if (settings.getSettingByName("textscale") == nullptr) settings.addSetting("textscale", 0.70f); + } + + void settingsRender() override { + + /* Border Start */ + + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); + + const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + + FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); + FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(1.0f, "height")); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), + toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + + this->settings.getSettingByName("uiscale")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", + textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( + "border")->value)) + this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( + "border")->value; + percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Border ") + + Constraints::SpacingConstraint(0.60, textWidth), + toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + + this->settings.getSettingByName("borderWidth")->value = percent; + + /* Border End */ + + /* Rounding Start */ + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), + toggleY, this->settings.getSettingByName("rounding")->value, 100.0f, 0.0f, + false); + + this->settings.getSettingByName("rounding")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Translucency", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( + "BlurEffect")->value)) + this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( + "BlurEffect")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + + percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), + toggleY, this->settings.getSettingByName("textscale")->value, 2.00); + + this->settings.getSettingByName("textscale")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + std::string txtAlignment = FlarialGUI::Dropdown(1, + toggleX, toggleY, + std::vector{"Left", "Center", "Right"}, + this->settings.getSettingByName( + "textalignment")->value, + "Text Alignment" + ); + + this->settings.getSettingByName("textalignment")->value = txtAlignment; + + FlarialGUI::SetIsInAdditionalYMode(); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Reverse Padding X", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( + "reversepaddingx")->value)) + this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( + "reversepaddingx")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Reverse Padding Y", textWidth * 6.9f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( + "reversepaddingy")->value)) + this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( + "reversepaddingy")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), + toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, + false); + + this->settings.getSettingByName("padx")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), + toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, + false); + + this->settings.getSettingByName("pady")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), + toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); + + this->settings.getSettingByName("rectwidth")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), + toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); + + this->settings.getSettingByName("rectheight")->value = percent; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, + L"Responsive Rectangle (Moves with the Text)", + textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( + "responsivewidth")->value)) + this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( + "responsivewidth")->value; + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, + DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::RelativeConstraint(0.12, "height", true), + DWRITE_FONT_WEIGHT_NORMAL); + percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), + toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, + false); + + this->settings.getSettingByName("rotation")->value = percent; + + FlarialGUI::UnSetIsInAdditionalYMode(); + + /* Rounding End */ + + /* Color Pickers Start*/ + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY = Constraints::PercentageConstraint(0.10, "top"); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), + toggleY - Constraints::SpacingConstraint(0.017, textWidth), + settings.getSettingByName("bgColor")->value, + settings.getSettingByName("bgRGB")->value); + + toggleX = Constraints::PercentageConstraint(0.55, "left"); + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, + settings.getSettingByName("textColor")->value, + settings.getSettingByName("textRGB")->value); + + toggleY += Constraints::SpacingConstraint(0.35, textWidth); + + FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + Constraints::SpacingConstraint(1.05, textWidth), + DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, + settings.getSettingByName("borderColor")->value, + settings.getSettingByName("borderRGB")->value); + + FlarialGUI::UnsetScrollView(); + + FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, + settings.getSettingByName("bgOpacity")->value, + settings.getSettingByName("bgRGB")->value); + FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, + settings.getSettingByName("textOpacity")->value, + settings.getSettingByName("textRGB")->value); + FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, + settings.getSettingByName("borderOpacity")->value, + settings.getSettingByName("borderRGB")->value); + /* Color Pickers End */ + + + } +}; \ No newline at end of file diff --git a/src/Client/Module/Modules/EntityCounter/EntityListener.hpp b/src/Client/Module/Modules/EntityCounter/EntityListener.hpp new file mode 100644 index 00000000..4cb4057c --- /dev/null +++ b/src/Client/Module/Modules/EntityCounter/EntityListener.hpp @@ -0,0 +1,39 @@ +#pragma once + + +#include "../../../../SDK/SDK.hpp" +#include +#include "../../../Events/Listener.hpp" +#include "../Module.hpp" +#include "../../../GUI/Engine/Engine.hpp" + +class EntityListener : public Listener { +public: + + Module *module; + + void onRender(RenderEvent &event) override { + + int entities = 0; + + if (SDK::hasInstanced && SDK::clientInstance != nullptr) { + if (SDK::clientInstance->getLocalPlayer() != nullptr && SDK::getCurrentScreen() == "hud_screen") { + + for(auto& entity : SDK::clientInstance->getLocalPlayer()->getLevel()->getRuntimeActorList()) { + entities++; + } + } + } + + std::string value = std::format("{}", entities); + this->module->normalRender(24, value); + } + +public: + explicit EntityListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + } + +}; + From 497c2ca70cd1001613293bb0101c7ef31a463e45 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 21 Sep 2024 15:40:59 +0600 Subject: [PATCH 164/240] Dropdown fixes --- .../Elements/Control/Dropdown/Dropdown.cpp | 11 ++++++-- src/Client/GUI/Engine/Engine.cpp | 27 ++++++++----------- src/Client/Module/Modules/Module.cpp | 12 +++++++++ 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.cpp b/src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.cpp index 93e396a0..13fb8a76 100644 --- a/src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Dropdown/Dropdown.cpp @@ -279,16 +279,23 @@ std::string FlarialGUI::Dropdown(int index, float x, float y, const std::vector< D2D::context->SetTransform(oldTransform); */ + if (FlarialGUI::isInScrollView) { + iy += FlarialGUI::scrollpos; + } auto rectf = D2D1::RectF(ix, iy, ix + is, iy + is); float rotationAngle = FlarialGUI::DropDownMenus[index].rotation; - ImVec2 rotationCenter(ix + is / 2.0f, iy + is / 2.0f); + ImVec2 rotationCenter(ix + is / 2, iy + is / 2); FlarialGUI::ImRotateStart(); - FlarialGUI::image(IDR_DOWN_PNG, rectf, "PNG", true); + FlarialGUI::image(IDR_DOWN_PNG, rectf, "PNG", false); FlarialGUI::ImRotateEnd(rotationAngle, rotationCenter); + if (FlarialGUI::isInScrollView) { + iy -= FlarialGUI::scrollpos; + } + FlarialGUI::RoundedRect(ix - 8, iy - 5, FlarialGUI::DropDownMenus[index].isActive ? D2D1::ColorF(D2D1::ColorF::White) : D2D1::ColorF(192.0f / 255.0f, 133.0f / 255.0f, diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index 44958ef0..fd0be637 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -624,13 +624,6 @@ void FlarialGUI::FlarialText(float x, float y, const wchar_t *text, float width, color.a = o_colors_text; if (isInScrollView) y += scrollpos; - if (shouldAdditionalY) { - for (int i = 0; i < highestAddIndexes + 1; i++) { - if (FlarialGUI::DropDownMenus[i].isActive && i <= additionalIndex) { - y += additionalY[i]; - } - } - } if (isInScrollView && !isRectInRect(ScrollViewRect, D2D1::RectF(x, y, x + width, y + height))) return; @@ -654,17 +647,8 @@ void FlarialGUI::LoadAllImageToCache() { } -std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *text, const float width, const float height, - const DWRITE_TEXT_ALIGNMENT alignment, const float fontSize, - const DWRITE_FONT_WEIGHT weight, bool moduleFont) { - D2D1_COLOR_F color = colors_text_rgb ? rgbColor : colors_text; - color.a = o_colors_text; - - return FlarialTextWithFont(x, y, text, width, height, alignment, fontSize, weight, color, moduleFont); -} - bool replace(std::string& str, const std::string& from, const std::string& to) { size_t start_pos = str.find(from); if(start_pos == std::string::npos) @@ -721,6 +705,17 @@ bool ifFontScale2(const float fontSize) { return fontSize / 135 > 1; } +std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *text, const float width, const float height, + const DWRITE_TEXT_ALIGNMENT alignment, const float fontSize, + const DWRITE_FONT_WEIGHT weight, bool moduleFont) { + + + D2D1_COLOR_F color = colors_text_rgb ? rgbColor : colors_text; + color.a = o_colors_text; + + return FlarialTextWithFont(x, y, text, width, height, alignment, fontSize, weight, color, moduleFont); +} + std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *text, const float width, const float height, const DWRITE_TEXT_ALIGNMENT alignment, const float fontSize, const DWRITE_FONT_WEIGHT weight, D2D1_COLOR_F color, bool moduleFont) { diff --git a/src/Client/Module/Modules/Module.cpp b/src/Client/Module/Modules/Module.cpp index 93b243bf..ba023b78 100644 --- a/src/Client/Module/Modules/Module.cpp +++ b/src/Client/Module/Modules/Module.cpp @@ -204,6 +204,7 @@ void Module::resetPadding() { colorPickerIndex = 100; keybindIndex = 0; textboxIndex = 0; + FlarialGUI::UnSetIsInAdditionalYMode(); } void Module::extraPadding() { @@ -214,10 +215,18 @@ void Module::addHeader(std::string text) { float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top") + padding; + D2D1_COLOR_F col = colors_secondary6_rgb ? FlarialGUI::rgbColor : colors_secondary6; col.a = o_colors_secondary6; std::string name = FlarialGUI::FlarialTextWithFont(x, y, FlarialGUI::to_wide(text).c_str(), 500, 0, DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::RelativeConstraint(0.215f, "height", true), DWRITE_FONT_WEIGHT_BOLD, false); + + if(FlarialGUI::shouldAdditionalY) + for (int i = 0; i < FlarialGUI::highestAddIndexes + 1; i++) { + if (FlarialGUI::DropDownMenus[i].isActive && i <= FlarialGUI::additionalIndex) { + y += FlarialGUI::additionalY[i]; + } + } FlarialGUI::RoundedRect(x, y + Constraints::RelativeConstraint(0.023f, "width"), col, FlarialGUI::TextSizes[name] + Constraints::RelativeConstraint(0.01f, "width"), 3.0f, 0, 0); padding += Constraints::RelativeConstraint(0.055f, "height", true); @@ -256,8 +265,11 @@ void Module::addDropdown(std::string text, std::string subtext, const std::vecto FlarialGUI::Dropdown(dropdownIndex, elementX, y, options, value, ""); + Module::addElementText(text, subtext); + FlarialGUI::SetIsInAdditionalYMode(); + padding += Constraints::RelativeConstraint(0.05f, "height", true); dropdownIndex++; } From deda4b3ca6d58959f1501385005fc8ce4202f962 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 21 Sep 2024 15:49:13 +0600 Subject: [PATCH 165/240] Fix override font weight --- src/Client/GUI/Engine/Engine.cpp | 22 ++++++++++++++++++- src/Client/GUI/Engine/Engine.hpp | 1 + .../Hook/Hooks/Render/SwapchainHook.cpp | 6 +++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index fd0be637..df7655a8 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -648,7 +648,6 @@ void FlarialGUI::LoadAllImageToCache() { - bool replace(std::string& str, const std::string& from, const std::string& to) { size_t start_pos = str.find(from); if(start_pos == std::string::npos) @@ -657,6 +656,27 @@ bool replace(std::string& str, const std::string& from, const std::string& to) { return true; } +DWRITE_FONT_WEIGHT FlarialGUI::GetFontWeightFromString(const std::string& weightStr) { + if (weightStr == "Bold") { + return DWRITE_FONT_WEIGHT_BOLD; + } else if (weightStr == "Normal") { + return DWRITE_FONT_WEIGHT_NORMAL; + } else if (weightStr == "SemiBold") { + return DWRITE_FONT_WEIGHT_SEMI_BOLD; + } else if (weightStr == "ExtraBold") { + return DWRITE_FONT_WEIGHT_EXTRA_BOLD; + } else if (weightStr == "Medium") { + return DWRITE_FONT_WEIGHT_MEDIUM; + } else if (weightStr == "Light") { + return DWRITE_FONT_WEIGHT_LIGHT; + } else if (weightStr == "ExtraLight") { + return DWRITE_FONT_WEIGHT_EXTRA_LIGHT; + } else { + return DWRITE_FONT_WEIGHT_NORMAL; + } +} + + std::string FlarialGUI::GetWeightedName(std::string name, DWRITE_FONT_WEIGHT weight) { std::string adder; diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index c82c290e..fe2e02a6 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -131,6 +131,7 @@ namespace FlarialGUI { DWRITE_FONT_WEIGHT inline LoadModuleFontLaterWeight = DWRITE_FONT_WEIGHT_NORMAL; std::string GetWeightedName(std::string name, DWRITE_FONT_WEIGHT weight); + DWRITE_FONT_WEIGHT GetFontWeightFromString(const std::string& weightStr); inline WindowRect WindowRects[1000]; inline SliderRect SliderRects[2500]; diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 1e91f061..a29b044b 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -169,6 +169,8 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI bool fontLoaded = false; if(FlarialGUI::DoLoadModuleFontLater) { + if(Client::settings.getSettingByName("overrideFontWeight")->value) FlarialGUI::LoadModuleFontLaterWeight = FlarialGUI::GetFontWeightFromString(Client::settings.getSettingByName("fontWeight")->value); + std::string font1 = FlarialGUI::LoadModuleFontLater; std::transform(font1.begin(), font1.end(), font1.begin(), ::towlower); std::string weightedName = FlarialGUI::GetWeightedName(font1, FlarialGUI::LoadModuleFontLaterWeight); @@ -183,6 +185,10 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI } if(FlarialGUI::DoLoadGUIFontLater) { + + if(Client::settings.getSettingByName("overrideFontWeight")->value) FlarialGUI::LoadGUIFontLaterWeight = FlarialGUI::GetFontWeightFromString(Client::settings.getSettingByName("fontWeight")->value); + + std::string font2 = FlarialGUI::LoadGUIFontLater; std::transform(font2.begin(), font2.end(), font2.begin(), ::towlower); std::string weightedName = FlarialGUI::GetWeightedName(font2, FlarialGUI::LoadGUIFontLaterWeight); From d6e71e7b816369f5b60d6e564c8cf7c70dd41388 Mon Sep 17 00:00:00 2001 From: WhiteOnGitHub <96546467+WhiteOnGitHub@users.noreply.github.com> Date: Sat, 21 Sep 2024 21:47:19 +0100 Subject: [PATCH 166/240] making mario happy --- .../Modules/EntityCounter/EntityListener.hpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/Client/Module/Modules/EntityCounter/EntityListener.hpp b/src/Client/Module/Modules/EntityCounter/EntityListener.hpp index 4cb4057c..c5b46ac5 100644 --- a/src/Client/Module/Modules/EntityCounter/EntityListener.hpp +++ b/src/Client/Module/Modules/EntityCounter/EntityListener.hpp @@ -9,24 +9,18 @@ class EntityListener : public Listener { public: - Module *module; void onRender(RenderEvent &event) override { - - int entities = 0; - if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr && SDK::getCurrentScreen() == "hud_screen") { - for(auto& entity : SDK::clientInstance->getLocalPlayer()->getLevel()->getRuntimeActorList()) { - entities++; - } + int entityCount = SDK::clientInstance->getLocalPlayer()->getLevel()->getRuntimeActorList().size(); + std::string str = std::format("{}", entityCount); + + this->module->normalRender(24, str); } } - - std::string value = std::format("{}", entities); - this->module->normalRender(24, value); } public: From 86d710e91cc7db9138116a5692bbebc34fdf3368 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sun, 22 Sep 2024 22:04:49 +0300 Subject: [PATCH 167/240] onAppSuspended sig --- src/Utils/Memory/Game/Sig/SigInit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 6e591d6d..a7492e0e 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -8,7 +8,7 @@ void SigInit::init2130() { ADD_SIG("Actor::baseTick", "48 8D 05 ? ? ? ? 48 89 01 BA 31 00 00 00 44 8D 4A 04 44 8D 42 02 66 C7 44 24 20 37 00 E8 ? ? ? ? 48 8B 8B 70 11 00 00"); ADD_SIG("ItemRenderer::renderGuiItemNew", "40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 D8 48 81 EC 28 01 00 00 0F 29 B4 24 10 01 00 00 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 45 00 44"); - //ADD_SIG("MinecraftGame::onAppSuspended", ""); + ADD_SIG("MinecraftGame::onAppSuspended", "48 89 5c 24 ? 48 89 74 24 ? 48 89 7c 24 ? 55 41 54 41 55 41 56 41 57 48 8d ac 24 ? ? ? ? 48 81 ec ? ? ? ? ? 8b ? 45 33 f6"); ADD_SIG("ThirdPersonNametag", "0F 84 ? ? ? ? 49 8B D4 49 8B CD"); From 054ede8cd72bd509b7b6b51eed293bfe581a3ae8 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sun, 22 Sep 2024 22:04:59 +0300 Subject: [PATCH 168/240] Fix key handling --- src/Client/Hook/Hooks/Input/KeyHook.cpp | 12 ++++-------- src/Client/Hook/Hooks/Input/KeyHook.hpp | 4 ++-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Client/Hook/Hooks/Input/KeyHook.cpp b/src/Client/Hook/Hooks/Input/KeyHook.cpp index c5ed51b7..f921330b 100644 --- a/src/Client/Hook/Hooks/Input/KeyHook.cpp +++ b/src/Client/Hook/Hooks/Input/KeyHook.cpp @@ -9,16 +9,12 @@ void KeyHook::enableHook() { this->autoHook((void *) keyCallback, (void **) &funcOriginal); } -void KeyHook::keyCallback(unsigned char key, int state) { - if (Client::disable) return; - if (state == (int) ActionType::Pressed) keys[key] = true; - else keys[key] = false; +void KeyHook::keyCallback(int key, bool state) { + keys[key] = state; - KeyEvent event(key, state, keys); + KeyEvent event(key, state ? 1 : 0, keys); EventHandler::onKey(event); - Sleep(0); - if (!event.isCancelled()) - funcOriginal(event.getKey(), event.getAction()); + funcOriginal(event.getKey(), state); } \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Input/KeyHook.hpp b/src/Client/Hook/Hooks/Input/KeyHook.hpp index 5926ac3d..2ff9b738 100644 --- a/src/Client/Hook/Hooks/Input/KeyHook.hpp +++ b/src/Client/Hook/Hooks/Input/KeyHook.hpp @@ -7,10 +7,10 @@ class KeyHook : public Hook { private: static inline std::array keys; - static void keyCallback(unsigned char key, int state); + static void keyCallback(int key, bool state); public: - typedef void(__thiscall *original)(unsigned char keyId, bool held); + typedef void(__thiscall *original)(int keyId, bool held); static inline original funcOriginal = nullptr; From d01e28722cca9dadb7dadc25b5b828f09bfc6759 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Mon, 23 Sep 2024 00:01:59 +0300 Subject: [PATCH 169/240] Tablist unicode support + Better name clearing --- main.cpp | 23 ++++--- src/Client/Module/Modules/TabList/TabList.hpp | 6 +- src/Utils/Utils.cpp | 62 ++++++++++++++----- src/Utils/Utils.hpp | 4 ++ 4 files changed, 70 insertions(+), 25 deletions(-) diff --git a/main.cpp b/main.cpp index ecdf995b..b3ac9612 100644 --- a/main.cpp +++ b/main.cpp @@ -95,17 +95,22 @@ DWORD WINAPI init(HMODULE real) auto module = ModuleManager::getModule("Nick"); if(SDK::clientInstance != nullptr) - if(SDK::clientInstance->getLocalPlayer() != nullptr) - if (module->isEnabled()) { - name = Utils::removeNonAlphanumeric(Utils::removeColorCodes(NickListener::original)); - name = replaceAll(name, "�", ""); + if(SDK::clientInstance->getLocalPlayer() != nullptr) { + if (module->isEnabled()) { + name = Utils::removeNonAlphanumeric( + Utils::removeColorCodes(NickListener::original)); + name = replaceAll(name, "�", ""); - } - - std::cout << std::format("https://api.flarial.synthetix.host/heartbeat/{}/{}",Utils::removeColorCodes(name),ipToSend) << std::endl; - std::cout << DownloadString(std::format("https://api.flarial.synthetix.host/heartbeat/{}/{}",Utils::removeColorCodes(name),ipToSend)) << std::endl; + } + std::string clearedName = Utils::removeNonAlphanumeric(Utils::removeColorCodes(name)); + if (clearedName.empty()) clearedName = Utils::removeColorCodes(name); + // send thing + std::cout << DownloadString( + std::format("https://api.flarial.synthetix.host/heartbeat/{}/{}", clearedName, + ipToSend)) << std::endl; - lastBeatTime = now; + lastBeatTime = now; + } } } } diff --git a/src/Client/Module/Modules/TabList/TabList.hpp b/src/Client/Module/Modules/TabList/TabList.hpp index 9225d714..745081c0 100644 --- a/src/Client/Module/Modules/TabList/TabList.hpp +++ b/src/Client/Module/Modules/TabList/TabList.hpp @@ -333,7 +333,9 @@ class TabList : public Module { for (const auto &pair: vecmap) { i++; - std::string name = Utils::removeNonAlphanumeric(Utils::removeColorCodes(pair.second.name)); // TODO: this does not clear all special symbols? + // std::string name = Utils::removeNonAlphanumeric(Utils::removeColorCodes(pair.second.name)); + std::string name = Utils::removeColorCodes(pair.second.name); + if (name.empty()) continue; auto it = std::find(ModuleManager::onlineUsers.begin(), ModuleManager::onlineUsers.end(), name); @@ -423,7 +425,7 @@ class TabList : public Module { FlarialGUI::FlarialTextWithFont(fakex + xx + Constraints::SpacingConstraint(0.5, keycardSize), realcenter.y + Constraints::SpacingConstraint(0.12, keycardSize), - FlarialGUI::to_wide(name).c_str(), + Utils::StrToWStr(name).c_str(), keycardSize * 5, keycardSize, DWRITE_TEXT_ALIGNMENT_LEADING, fontSize, DWRITE_FONT_WEIGHT_NORMAL, textColor, true); diff --git a/src/Utils/Utils.cpp b/src/Utils/Utils.cpp index 1030ed28..08c58ca1 100644 --- a/src/Utils/Utils.cpp +++ b/src/Utils/Utils.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include std::string Utils::getRoamingPath() { char *path = nullptr; @@ -25,36 +27,68 @@ bool Utils::hasEnding (std::string const &fullString, std::string const &ending) } } - std::string Utils::removeColorCodes(const std::string &input) { std::string result; - std::string newinput = input; bool skipNext = false; - - for (wchar_t c: FlarialGUI::to_wide(newinput)) { + for (size_t i = 0; i < input.size();) { if (skipNext) { skipNext = false; - } else if (c == L'§') { + ++i; + } else if (input[i] == '\xC2' && i + 1 < input.size() && input[i + 1] == '\xA7') { skipNext = true; + i += 2; } else { - result += (char)c; + if ((input[i] & 0xC0) == 0xC0) { // UTF-8 continuation byte + size_t bytesLeft = 0; + while ((input[i + bytesLeft] & 0xC0) == 0x80) { + ++bytesLeft; + } + result.append(input, i, bytesLeft + 1); + i += bytesLeft + 1; + } else { + result += input[i]; + ++i; + } } } - result.erase(std::prev(result.end())); + return result; +} +std::wstring Utils::StrToWStr(std::string const& s) { + // Latite + int slength = static_cast(s.length()) + 1; + int len = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), slength, 0, 0); + wchar_t* buf = new wchar_t[len]; + MultiByteToWideChar(CP_UTF8, 0, s.c_str(), slength, buf, len); + std::wstring r(buf); + delete[] buf; + return r; +} - return result; +std::string Utils::WStrToStr(std::wstring const& ws) { + // Latite + std::string ret; + int len = WideCharToMultiByte(CP_UTF8, 0, ws.c_str(), static_cast(ws.size()), NULL, 0, NULL, NULL); + if (len > 0) { + ret.resize(len); + WideCharToMultiByte(CP_UTF8, 0, ws.c_str(), static_cast(ws.size()), &ret[0], len, NULL, NULL); + } + return ret; } std::string Utils::removeNonAlphanumeric(const std::string &input) { - std::string result; - std::copy_if(input.begin(), input.end(), std::back_inserter(result), [](char c) { - return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == ' '; - - }); - return result; + std::regex pattern("[A-Za-z][A-Za-z0-9 ]{2,16}"); + std::smatch match; + if (std::regex_search(input, match, pattern)) { + std::string nickname = match.str(); + // Remove trailing spaces + nickname.erase(nickname.find_last_not_of(" ") + 1); + return nickname; + } else { + return ""; + } } std::string Utils::remomveNonNumeric(const std::string &input) { diff --git a/src/Utils/Utils.hpp b/src/Utils/Utils.hpp index 9016908e..f58d9567 100644 --- a/src/Utils/Utils.hpp +++ b/src/Utils/Utils.hpp @@ -282,6 +282,10 @@ class Utils { return hash; } + + static std::wstring StrToWStr(const std::string &s); + + static std::string WStrToStr(const std::wstring &ws); }; struct CaretMeasureData { From 08e9b6e219d883f9362ed89b920f8aeff816ffa6 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 13 Oct 2024 19:58:28 +0600 Subject: [PATCH 170/240] wont crash if cant load all images --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index a29b044b..b3d76f4b 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -487,7 +487,9 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI /* EACH FRAME STUFF */ - if(init && initImgui && !FlarialGUI::hasLoadedAll) FlarialGUI::LoadAllImages(); + try { + if(init && initImgui && !FlarialGUI::hasLoadedAll) FlarialGUI::LoadAllImages(); + } catch (const std::exception &ex) {}; //if(init && !FlarialGUI::hasLoadedAll) FlarialGUI::LoadAllImageToCache(); From 2ea875059958a7139f92dac32736db8fbd0efd41 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 13 Oct 2024 20:01:09 +0600 Subject: [PATCH 171/240] t --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index b3d76f4b..05bc77be 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -489,7 +489,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI try { if(init && initImgui && !FlarialGUI::hasLoadedAll) FlarialGUI::LoadAllImages(); - } catch (const std::exception &ex) {}; + } catch (const std::exception &ex) { return 0; } //if(init && !FlarialGUI::hasLoadedAll) FlarialGUI::LoadAllImageToCache(); From 550f423ff1a48c3c9353c39807da20d36fccddd8 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 14 Oct 2024 00:06:44 +0600 Subject: [PATCH 172/240] attempt @ vsync fix --- src/Client/Hook/Hooks/Render/ResizeHook.cpp | 2 +- .../Hook/Hooks/Render/SwapchainHook.cpp | 65 ++++++++++++++++--- .../Hook/Hooks/Render/SwapchainHook.hpp | 10 +++ 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/ResizeHook.cpp b/src/Client/Hook/Hooks/Render/ResizeHook.cpp index 00c32b03..5cd45395 100644 --- a/src/Client/Hook/Hooks/Render/ResizeHook.cpp +++ b/src/Client/Hook/Hooks/Render/ResizeHook.cpp @@ -44,7 +44,7 @@ ResizeHook::resizeCallback(IDXGISwapChain *pSwapChain, UINT bufferCount, UINT wi if(SDK::clientInstance!=nullptr) SDK::clientInstance->releaseMouse(); - return funcOriginal(pSwapChain, bufferCount, width, height, newFormat, flags); + return funcOriginal(pSwapChain, bufferCount, width, height, newFormat, DXGI_PRESENT_ALLOW_TEARING); } // TODO: get back to this to check void ResizeHook::cleanShit(bool isResize) { diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 05bc77be..35f64b71 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -86,6 +86,13 @@ void SwapchainHook::enableHook() { kiero::bind(8, (void**)&funcOriginal, (void*)swapchainCallback); } + // CREDIT @AETOPIA + + IDXGIFactory2 *pFactory = NULL; + CreateDXGIFactory(IID_PPV_ARGS(&pFactory)); + Memory::hookFunc((*(LPVOID **)pFactory)[16], (void*) CreateSwapChainForCoreWindow, (void**) &IDXGIFactory2_CreateSwapChainForCoreWindow, "CreateSwapchainForCoreWindow"); + Memory::SafeRelease(pFactory); + bool isRTSS = containsModule(L"RTSSHooks64.dll"); if(isRTSS) { @@ -100,8 +107,54 @@ void SwapchainHook::enableHook() { bool SwapchainHook::init = false; + +// CREDIT @AETOPIA + +BOOL _ = FALSE, $ = FALSE, fEnabled = FALSE, fD3D11 = FALSE, MADECHAIN = FALSE; + +HRESULT(*IDXGISwapChain_ResizeBuffers) +(IDXGISwapChain *This, UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags) = NULL; + +HRESULT (*IDXGISwapChain_Present)(IDXGISwapChain *, UINT, UINT) = NULL; + +HRESULT(*SwapchainHook::IDXGIFactory2_CreateSwapChainForCoreWindow) +(IDXGIFactory2 *This, IUnknown *pDevice, IUnknown *pWindow, const DXGI_SWAP_CHAIN_DESC1 *pDesc, + IDXGIOutput *pRestrictToOutput, IDXGISwapChain1 **ppSwapChain) = NULL; + +HRESULT SwapchainHook::CreateSwapChainForCoreWindow(IDXGIFactory2 *This, IUnknown *pDevice, IUnknown *pWindow, + DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIOutput *pRestrictToOutput, + IDXGISwapChain1 **ppSwapChain) + +{ + + if (!fEnabled) + fEnabled = TRUE; + + ID3D12CommandQueue *pCommandQueue = NULL; + if (fD3D11 && !pDevice->QueryInterface(IID_PPV_ARGS(&pCommandQueue))) + { + pCommandQueue->Release(); + return DXGI_ERROR_INVALID_CALL; + } + + pDesc->Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; + MADECHAIN = TRUE; + return IDXGIFactory2_CreateSwapChainForCoreWindow(This, pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain); +} + +// CREDIT @AETOPIA + HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncInterval, UINT flags) { + if(!fEnabled) { + return DXGI_ERROR_DEVICE_RESET; + } + + if(!MADECHAIN) { + std::cout << "FOr real" << std::endl; + return funcOriginal(pSwapChain, syncInterval, flags); + } + swapchain = pSwapChain; flagsreal = flags; @@ -113,7 +166,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0); d3d12device3->RemoveDevice(); - return funcOriginal(pSwapChain, syncInterval, flags); + return funcOriginal(pSwapChain, syncInterval, flags | DXGI_PRESENT_ALLOW_TEARING); } } @@ -487,17 +540,11 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI /* EACH FRAME STUFF */ - try { - if(init && initImgui && !FlarialGUI::hasLoadedAll) FlarialGUI::LoadAllImages(); - } catch (const std::exception &ex) { return 0; } - - //if(init && !FlarialGUI::hasLoadedAll) FlarialGUI::LoadAllImageToCache(); - if (Client::settings.getSettingByName("vsync")->value) { - return funcOriginal(pSwapChain, 0, DXGI_PRESENT_DO_NOT_WAIT); + return funcOriginal(pSwapChain, 0, DXGI_PRESENT_ALLOW_TEARING); } - return funcOriginal(pSwapChain, syncInterval, flags); +return funcOriginal(pSwapChain, syncInterval, flags); } diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp index f60f2c15..1d672355 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp @@ -19,6 +19,16 @@ struct FrameContext { class SwapchainHook : public Hook { private: + static HRESULT (*IDXGIFactory2_CreateSwapChainForCoreWindow)(IDXGIFactory2 *This, IUnknown *pDevice, + IUnknown *pWindow, + const DXGI_SWAP_CHAIN_DESC1 *pDesc, + IDXGIOutput *pRestrictToOutput, + IDXGISwapChain1 **ppSwapChain); + + static HRESULT CreateSwapChainForCoreWindow(IDXGIFactory2 *This, IUnknown *pDevice, IUnknown *pWindow, + DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIOutput *pRestrictToOutput, + IDXGISwapChain1 **ppSwapChain); + static HRESULT swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncInterval, UINT flags); From 7676c6f00c82a6ef22e32470480124612b18d2f1 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 14 Oct 2024 00:08:24 +0600 Subject: [PATCH 173/240] add this back --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 35f64b71..667e3091 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -540,6 +540,10 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI /* EACH FRAME STUFF */ + try { + if(init && initImgui && !FlarialGUI::hasLoadedAll) FlarialGUI::LoadAllImages(); + } catch (const std::exception &ex) { return 0; } + if (Client::settings.getSettingByName("vsync")->value) { return funcOriginal(pSwapChain, 0, DXGI_PRESENT_ALLOW_TEARING); } From 8fd47ffeca32ef60ad3c2940b325c7e263646583 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 14 Oct 2024 00:53:34 +0600 Subject: [PATCH 174/240] full fix --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 12 +----------- src/Client/Hook/Manager.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 667e3091..f2d2c797 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -130,13 +130,6 @@ HRESULT SwapchainHook::CreateSwapChainForCoreWindow(IDXGIFactory2 *This, IUnknow if (!fEnabled) fEnabled = TRUE; - ID3D12CommandQueue *pCommandQueue = NULL; - if (fD3D11 && !pDevice->QueryInterface(IID_PPV_ARGS(&pCommandQueue))) - { - pCommandQueue->Release(); - return DXGI_ERROR_INVALID_CALL; - } - pDesc->Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; MADECHAIN = TRUE; return IDXGIFactory2_CreateSwapChainForCoreWindow(This, pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain); @@ -150,8 +143,7 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI return DXGI_ERROR_DEVICE_RESET; } - if(!MADECHAIN) { - std::cout << "FOr real" << std::endl; + if(!MADECHAIN && fEnabled) { return funcOriginal(pSwapChain, syncInterval, flags); } @@ -210,8 +202,6 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI } - - /* INIT END */ /* RENDERING START */ diff --git a/src/Client/Hook/Manager.cpp b/src/Client/Hook/Manager.cpp index be7ccc62..c44b7251 100644 --- a/src/Client/Hook/Manager.cpp +++ b/src/Client/Hook/Manager.cpp @@ -45,6 +45,9 @@ void HookManager::initialize() { hooks.push_back(new KeyHook()); hooks.push_back(new MouseHook()); + hooks.push_back(new SwapchainHook()); + hooks.push_back(new ResizeHook()); + if (!Client::settings.getSettingByName("killdx")->value) hooks.push_back(new CommandListHook()); hooks.push_back(new TextureGroup_getTextureHook()); @@ -53,8 +56,7 @@ void HookManager::initialize() { hooks.push_back(new RaknetTickHook()); hooks.push_back(new SetUpAndRenderHook()); hooks.push_back(new GameModeAttackHook()); - hooks.push_back(new SwapchainHook()); - hooks.push_back(new ResizeHook()); + hooks.push_back(new getFovHook()); hooks.push_back(new ActorBaseTick()); hooks.push_back(new OnSuspendHook()); From e136fdac97fc89cc27ee92db28a46f1533e63722 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 14 Oct 2024 01:17:53 +0600 Subject: [PATCH 175/240] resize fix --- src/Client/Hook/Hooks/Render/ResizeHook.cpp | 4 +++- src/Client/Hook/Manager.cpp | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/ResizeHook.cpp b/src/Client/Hook/Hooks/Render/ResizeHook.cpp index 5cd45395..e0dfd8ed 100644 --- a/src/Client/Hook/Hooks/Render/ResizeHook.cpp +++ b/src/Client/Hook/Hooks/Render/ResizeHook.cpp @@ -33,6 +33,7 @@ void ResizeHook::call() { void ResizeHook::resizeCallback(IDXGISwapChain *pSwapChain, UINT bufferCount, UINT width, UINT height, DXGI_FORMAT newFormat, UINT flags) { + ResizeHook::cleanShit(true); SwapchainHook::init = false; @@ -44,8 +45,9 @@ ResizeHook::resizeCallback(IDXGISwapChain *pSwapChain, UINT bufferCount, UINT wi if(SDK::clientInstance!=nullptr) SDK::clientInstance->releaseMouse(); - return funcOriginal(pSwapChain, bufferCount, width, height, newFormat, DXGI_PRESENT_ALLOW_TEARING); + return funcOriginal(pSwapChain, bufferCount, width, height, newFormat, DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING); } + // TODO: get back to this to check void ResizeHook::cleanShit(bool isResize) { diff --git a/src/Client/Hook/Manager.cpp b/src/Client/Hook/Manager.cpp index c44b7251..565da762 100644 --- a/src/Client/Hook/Manager.cpp +++ b/src/Client/Hook/Manager.cpp @@ -45,10 +45,11 @@ void HookManager::initialize() { hooks.push_back(new KeyHook()); hooks.push_back(new MouseHook()); + if (!Client::settings.getSettingByName("killdx")->value) hooks.push_back(new CommandListHook()); + hooks.push_back(new SwapchainHook()); hooks.push_back(new ResizeHook()); - if (!Client::settings.getSettingByName("killdx")->value) hooks.push_back(new CommandListHook()); hooks.push_back(new TextureGroup_getTextureHook()); hooks.push_back(new getViewPerspectiveHook()); From f24d619ff1291c3ea53657c4d6e969359815b540 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sun, 13 Oct 2024 22:25:01 +0300 Subject: [PATCH 176/240] Fix dx12 crash --- src/Client/GUI/Engine/Elements/Control/Image/Image.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp b/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp index e33a4617..c2e40137 100644 --- a/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp +++ b/src/Client/GUI/Engine/Elements/Control/Image/Image.cpp @@ -238,6 +238,13 @@ bool FlarialGUI::LoadImageFromResource(int resourceId, D3D12_CPU_DESCRIPTOR_HAND fence->SetEventOnCompletion(1, event); WaitForSingleObject(event, INFINITE); + cmdList->Release(); + cmdAlloc->Release(); + cmdQueue->Release(); + CloseHandle(event); + fence->Release(); + uploadBuffer->Release(); + // Create a shader resource view for the texture D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc; ZeroMemory(&srvDesc, sizeof(srvDesc)); From 75a7c8dd2446bdaebd57ef9c31233a1c1031c4b3 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 14 Oct 2024 01:46:22 +0600 Subject: [PATCH 177/240] start of counters settings page --- .../Modules/ArrowCounter/ArrowCounter.hpp | 243 +++--------------- 1 file changed, 31 insertions(+), 212 deletions(-) diff --git a/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp b/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp index f0c26a80..e9521810 100644 --- a/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp +++ b/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp @@ -32,232 +32,51 @@ class ArrowCounter : public Module { void settingsRender() override { - /* Border Start */ + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + this->extraPadding(); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + this->extraPadding(); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), DWRITE_FONT_WEIGHT_NORMAL); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->extraPadding(); - this->settings.getSettingByName("uiscale")->value = percent; + this->addHeader("Misc Customizations"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; - percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Border ") + - Constraints::SpacingConstraint(0.60, textWidth), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); - - this->settings.getSettingByName("borderWidth")->value = percent; - - /* Border End */ - - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value, 100.0f, 0.0f, - false); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - this->settings.getSettingByName("textscale")->value = percent; + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - FlarialGUI::UnsetScrollView(); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ + this->resetPadding(); } From dbfb53b0a83b47f11e9fdfcae716d0b12c2b7008 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 14 Oct 2024 01:49:13 +0600 Subject: [PATCH 178/240] fix --- .../Module/Modules/ArrowCounter/ArrowCounter.hpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp b/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp index e9521810..624ed965 100644 --- a/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp +++ b/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp @@ -32,6 +32,18 @@ class ArrowCounter : public Module { void settingsRender() override { + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); + + const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); + + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + + this->addHeader("Main"); this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); this->addToggle("Border", "", this->settings.getSettingByName( @@ -50,7 +62,6 @@ class ArrowCounter : public Module { this->extraPadding(); - DWRITE_FONT_WEIGHT_NORMAL); this->addHeader("Colors"); this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); @@ -76,8 +87,7 @@ class ArrowCounter : public Module { this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + FlarialGUI::UnsetScrollView(); this->resetPadding(); - - } }; \ No newline at end of file From e9b958986d708ad283d36f20fc5339fca99c5779 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 14 Oct 2024 01:53:50 +0600 Subject: [PATCH 179/240] fix 2 --- src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp b/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp index 624ed965..81e418d0 100644 --- a/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp +++ b/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp @@ -35,7 +35,7 @@ class ArrowCounter : public Module { float x = Constraints::PercentageConstraint(0.019, "left"); float y = Constraints::PercentageConstraint(0.10, "top"); - const float scrollviewWidth = Constraints::RelativeConstraint(0.12, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); From d997418ecaad0686abfceddd2a69bc0e45529493 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 14 Oct 2024 02:00:34 +0600 Subject: [PATCH 180/240] cps counter --- src/Client/Module/Modules/CPS/CPSCounter.hpp | 283 +++---------------- 1 file changed, 39 insertions(+), 244 deletions(-) diff --git a/src/Client/Module/Modules/CPS/CPSCounter.hpp b/src/Client/Module/Modules/CPS/CPSCounter.hpp index b313522d..a2fa1c4a 100644 --- a/src/Client/Module/Modules/CPS/CPSCounter.hpp +++ b/src/Client/Module/Modules/CPS/CPSCounter.hpp @@ -37,269 +37,64 @@ class CPSCounter : public Module { if (settings.getSettingByName("textscale") == nullptr) settings.addSetting("textscale", 0.70f); } - void settingsRender() override { + void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); + this->addToggle("Right Click CPS", "", this->settings.getSettingByName("rightcps")->value); + this->extraPadding(); - this->settings.getSettingByName("uiscale")->value = percent; + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); + this->extraPadding(); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); + this->extraPadding(); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addHeader("Misc Customizations"); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - percent = FlarialGUI::Slider(5, toggleX + Constraints::SpacingConstraint(1.2, textWidth), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - /* Border End */ + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(6, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Right CPS", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(2, toggleX, toggleY, this->settings.getSettingByName( - "rightcps")->value)) - this->settings.getSettingByName("rightcps")->value = !this->settings.getSettingByName( - "rightcps")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(7, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - + this->resetPadding(); } }; \ No newline at end of file From 20c3f293b640387ac70f1b4bf9ed36d1e243637e Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sun, 13 Oct 2024 23:08:01 +0300 Subject: [PATCH 181/240] Armour HUD sync with legacy --- .../Module/Modules/ArmorHUD/ArmorHUD.hpp | 8 +- .../Modules/ArmorHUD/ArmorHUDListener.hpp | 313 +++++++++++------- 2 files changed, 201 insertions(+), 120 deletions(-) diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp index 3b2f2090..2e9cf289 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUD.hpp @@ -35,6 +35,7 @@ class ArmorHUD : public Module { settings.addSetting("percentageX", 0.0f); settings.addSetting("percentageY", 0.0f); } + if (settings.getSettingByName("show_offhand") == nullptr) settings.addSetting("show_offhand", true); if (settings.getSettingByName("vertical") == nullptr) settings.addSetting("vertical", false); if (settings.getSettingByName("durability_left") == nullptr) settings.addSetting("durability_left", false); if (settings.getSettingByName("percent") == nullptr) settings.addSetting("percent", false); @@ -78,7 +79,11 @@ class ArmorHUD : public Module { this->addSlider("Size", "", this->settings.getSettingByName("uiscale")->value); this->addToggle("Vertical ArmorHUD", "To switch between a vertical or horizontal layout", this->settings.getSettingByName("vertical")->value); + if(this->settings.getSettingByName("vertical")->value){ + this->addToggle("Durability to the left", "", this->settings.getSettingByName("durability_left")->value); + } + this->addToggle("Show offhand item", "", this->settings.getSettingByName("show_offhand")->value); this->addToggle("Change Color", "", this->settings.getSettingByName("color")->value); @@ -88,9 +93,6 @@ class ArmorHUD : public Module { this->addToggle("Show Durability", "", this->settings.getSettingByName("showdurability")->value); this->addConditionalSlider(this->settings.getSettingByName("showdurability")->value, "Text Size", "Text size of Durability", this->settings.getSettingByName("textSize")->value, 0.25f, 0.0f, true); this->addToggle("Show Durability in %", "", this->settings.getSettingByName("percent")->value); - if(this->settings.getSettingByName("vertical")->value){ - this->addToggle("Durability to the left", "", this->settings.getSettingByName("vertical")->value); - } this->extraPadding(); this->addHeader("Colors"); diff --git a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp index 39e8598d..90f2bc17 100644 --- a/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp +++ b/src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp @@ -20,13 +20,7 @@ class ArmorHUDListener : public Listener { Module *module; Vec2 currentPos; bool enabled = false; - int durabilities[5][2] = { - {0,0}, - {0,0}, - {0,0}, - {0,0}, - {0,0} - }; + int durabilities[6][2] = {{0,0}}; // TODO: delete testing variables (or adjust and delete) Vec2 testOffset = Vec2{0,0}; float testSpacing = 15; @@ -41,6 +35,8 @@ class ArmorHUDListener : public Listener { auto rgbColor = FlarialGUI::rgbColor; + auto showOffhand = module->settings.getSettingByName("show_offhand")->value; + auto fullColor = rgb ? rgbColor : FlarialGUI::HexToColorF(module->settings.getSettingByName("colorFull")->value); auto lowColor = rgb1 ? rgbColor : FlarialGUI::HexToColorF(module->settings.getSettingByName("colorLow")->value); auto mainColor = rgb2 ? rgbColor : FlarialGUI::HexToColorF(module->settings.getSettingByName("colorMain")->value); @@ -62,6 +58,56 @@ class ArmorHUDListener : public Listener { "uiscale")->value); spacing = vertical ? scaledPos.y : scaledPos.x; + float xmodifier = 0.0f; + float ymodifier = 0.0f; + + for (int i = 2; i < 6; i++) { + + if (vertical) ymodifier += spacing; + else xmodifier += spacing; + + if (SDK::clientInstance->getLocalPlayer()->getArmor(i - 2)->getItem() != nullptr) { + + std::string text; + + if (durabilities[i][1] != 0) { // for some servers with custom items with max durability of 0 + if (module->settings.getSettingByName("percent")->value) + text = std::to_string((int) std::round( + (float) durabilities[i][0] / (float) durabilities[i][1] * 100)) + "%"; + else + text = std::to_string(durabilities[i][0]) + "/" + + std::to_string(durabilities[i][1]); + + + std::wstring widestr = std::wstring(text.begin(), text.end()); + + const wchar_t *widecstr = widestr.c_str(); + + D2D1_COLOR_F color = mainColor; + + if (module->settings.getSettingByName("color")->value) { + if (std::round((float) durabilities[i][0] / (float) durabilities[i][1] * 100) <= + 15) { + color = lowColor; + } else { + color = fullColor; + } + } + + float spacingX = vertical ? (durabilities[i][1] != 0 ? spacing : 0) : 0; + if (durability_left) spacingX *= -1; + float spacingY = vertical ? 0 : (durabilities[i][1] != 0 ? spacing : 0); + + FlarialGUI::FlarialTextWithFont( + currentPos.x + xmodifier + spacingX + testOffset.x, + currentPos.y + ymodifier + spacingY + testOffset.y, widecstr, textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + textWidth, + DWRITE_FONT_WEIGHT_NORMAL, color, true); + } + } + } + if (SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( SDK::clientInstance->getLocalPlayer()->getSupplies()->getSelectedSlot())->getItem() != nullptr) { @@ -70,13 +116,14 @@ class ArmorHUDListener : public Listener { std::string text; - if(durabilities[0][1] != 0) { + if (durabilities[0][1] != 0) { if (module->settings.getSettingByName("percent")->value) - text = std::to_string((int)std::round((float)durabilities[0][0] / (float)durabilities[0][1] * 100))+"%"; + text = std::to_string((int) std::round( + (float) durabilities[0][0] / (float) durabilities[0][1] * 100)) + "%"; else text = std::to_string(durabilities[0][0]) + "/" + std::to_string(durabilities[0][1]); } else { - text =std::to_string(currentItem->getcount()); + text = std::to_string(currentItem->getcount()); } std::wstring widestr = std::wstring(text.begin(), text.end()); @@ -85,79 +132,76 @@ class ArmorHUDListener : public Listener { D2D1_COLOR_F color = mainColor; - if (module->settings.getSettingByName("color")->value && durabilities[0][1] != 0){ - if(std::round((float)durabilities[0][0] / (float)durabilities[0][1] * 100) <= 15){ + if (module->settings.getSettingByName("color")->value && durabilities[0][1] != 0) { + if (std::round((float) durabilities[0][0] / (float) durabilities[0][1] * 100) <= 15) { color = lowColor; } else { color = fullColor; } } + if (vertical) ymodifier += spacing; + else xmodifier += spacing; + float spacingX = vertical ? (durabilities[0][1] != 0 ? spacing : 0) : 0; - if(durability_left) spacingX *= -1; - float spacingY = vertical ? 0: (durabilities[0][1] != 0 ? spacing : 0); + if (durability_left) spacingX *= -1; + float spacingY = vertical ? 0 : (durabilities[0][1] != 0 ? spacing : 0); - FlarialGUI::FlarialTextWithFont(currentPos.x + testOffset.x + spacingX, - currentPos.y + testOffset.y + spacingY, + FlarialGUI::FlarialTextWithFont(currentPos.x + testOffset.x + xmodifier + spacingX, + currentPos.y + testOffset.y + ymodifier + spacingY, widecstr, textWidth * 6.9f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, textWidth, DWRITE_FONT_WEIGHT_NORMAL, color, true); } + if (showOffhand) { + if (SDK::clientInstance->getLocalPlayer()->getOffhandSlot() != nullptr && + SDK::clientInstance->getLocalPlayer()->getOffhandSlot()->getItem() != nullptr) { - float xmodifier = 0.0f; - float ymodifier = 0.0f; - - float xoffset = 0.0f; - float yoffset = 0.0f; - - if (vertical) xoffset += spacing; - else yoffset += spacing; - - if(durability_left) xoffset *= -1; - - for (int i = 1; i < 5; i++) { - - if (vertical) ymodifier += spacing; - else xmodifier += spacing; - - - if (SDK::clientInstance->getLocalPlayer()->getArmor(i-1)->getItem() != nullptr) { + auto offhandItem = SDK::clientInstance->getLocalPlayer()->getOffhandSlot(); std::string text; - if (durabilities[i][1] != 0) { // for some servers with custom items with max durability of 0 + if (durabilities[1][1] != 0) { if (module->settings.getSettingByName("percent")->value) text = std::to_string((int) std::round( - (float) durabilities[i][0] / (float) durabilities[i][1] * 100)) + "%"; + (float) durabilities[1][0] / (float) durabilities[1][1] * 100)) + "%"; else - text = std::to_string(durabilities[i][0]) + "/" + - std::to_string(durabilities[i][1]); - + text = std::to_string(durabilities[1][0]) + "/" + + std::to_string(durabilities[1][1]); + } else { + text = std::to_string(offhandItem->getcount()); + } - std::wstring widestr = std::wstring(text.begin(), text.end()); + std::wstring widestr = std::wstring(text.begin(), text.end()); - const wchar_t *widecstr = widestr.c_str(); + const wchar_t *widecstr = widestr.c_str(); - D2D1_COLOR_F color = mainColor; + D2D1_COLOR_F color = mainColor; - if (module->settings.getSettingByName("color")->value) { - if (std::round((float) durabilities[i][0] / (float) durabilities[i][1] * 100) <= - 15) { - color = lowColor; - } else { - color = fullColor; - } + if (module->settings.getSettingByName("color")->value && durabilities[1][1] != 0) { + if (std::round((float) durabilities[1][0] / (float) durabilities[1][1] * 100) <= 15) { + color = lowColor; + } else { + color = fullColor; } - - FlarialGUI::FlarialTextWithFont( - currentPos.x + xmodifier + xoffset + testOffset.x, - currentPos.y + ymodifier + yoffset + testOffset.y, widecstr, textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - textWidth, - DWRITE_FONT_WEIGHT_NORMAL, color, true); } + + if (vertical) ymodifier += spacing; + else xmodifier += spacing; + + float spacingX = vertical ? (durabilities[1][1] != 0 ? spacing : 0) : 0; + if (durability_left) spacingX *= -1; + float spacingY = vertical ? 0 : (durabilities[1][1] != 0 ? spacing : 0); + + FlarialGUI::FlarialTextWithFont(currentPos.x + testOffset.x + xmodifier + spacingX, + currentPos.y + testOffset.y + ymodifier + spacingY, + widecstr, textWidth * 6.9f, + textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, + textWidth, + DWRITE_FONT_WEIGHT_NORMAL, color, true); + } } } @@ -224,88 +268,123 @@ class ArmorHUDListener : public Listener { } void onSetupAndRender(SetupAndRenderEvent &event) override { - if(this->module->isEnabled()) - if (ClientInstance::getTopScreenName() == "hud_screen") { - auto muirc = event.getMuirc(); - BaseActorRenderContext barc(muirc->getScreenContext(), muirc->getClientInstance(), - muirc->getClientInstance()->getMinecraftGame()); - - Vec2 scaledPos = PositionUtils::getScaledPos(currentPos); - - if (SDK::hasInstanced && SDK::clientInstance != nullptr) { - if (SDK::clientInstance->getLocalPlayer() != nullptr) - if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { - if (SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( - SDK::clientInstance->getLocalPlayer()->getSupplies()->getSelectedSlot())->getItem() != - nullptr) { - auto item = SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( - SDK::clientInstance->getLocalPlayer()->getSupplies()->getSelectedSlot()); - - auto maxDamage = item->getMaxDamage(); - auto durabilityLeft = maxDamage - item->getDamageValue(); - - durabilities[0][1] = maxDamage; - durabilities[0][0] = durabilityLeft; - - barc.itemRenderer->renderGuiItemNew(&barc, - item, - 0, scaledPos.x, scaledPos.y, 1.0f, - module->settings.getSettingByName( - "uiscale")->value, - false); - - if(item->isEnchanted()) { - barc.itemRenderer->renderGuiItemNew(&barc, - item, - 0, scaledPos.x, scaledPos.y, 1.0f, - module->settings.getSettingByName( - "uiscale")->value, - true); - } - } - + if (this->module->isEnabled()) + if (ClientInstance::getTopScreenName() == "hud_screen") { + auto muirc = event.getMuirc(); + BaseActorRenderContext barc(muirc->getScreenContext(), muirc->getClientInstance(), + muirc->getClientInstance()->getMinecraftGame()); - float spacing = 15 * module->settings.getSettingByName("uiscale")->value; + Vec2 scaledPos = PositionUtils::getScaledPos(currentPos); - float xmodifier = 0.0f; - float ymodifier = 0.0f; + float spacing = 15 * module->settings.getSettingByName("uiscale")->value; - for (int i = 1; i < 5; i++) { + float xmodifier = 0.0f; + float ymodifier = 0.0f; - if (module->settings.getSettingByName("vertical")->value) ymodifier += spacing; - else xmodifier += spacing; + if (SDK::hasInstanced && SDK::clientInstance != nullptr) { + if (SDK::clientInstance->getLocalPlayer() != nullptr) + if (SDK::clientInstance->getLocalPlayer()->getSupplies() != nullptr) { + for (int i = 2; i < 6; i++) { - auto armorSlot = SDK::clientInstance->getLocalPlayer()->getArmor(i-1); + if (module->settings.getSettingByName("vertical")->value) ymodifier += spacing; + else xmodifier += spacing; - if (armorSlot->getItem() != nullptr) { + auto armorSlot = SDK::clientInstance->getLocalPlayer()->getArmor(i-2); - auto maxDamage = armorSlot->getMaxDamage(); - auto durabilityLeft = maxDamage - armorSlot->getDamageValue(); + if (armorSlot->getItem() != nullptr) { - durabilities[i][1] = maxDamage; - durabilities[i][0] = durabilityLeft; + auto maxDamage = armorSlot->getMaxDamage(); + auto durabilityLeft = maxDamage - armorSlot->getDamageValue(); - barc.itemRenderer->renderGuiItemNew(&barc, - armorSlot, - 0, - scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, - module->settings.getSettingByName( - "uiscale")->value, false); + durabilities[i][1] = maxDamage; + durabilities[i][0] = durabilityLeft; - if(armorSlot->isEnchanted()) { barc.itemRenderer->renderGuiItemNew(&barc, armorSlot, 0, scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, + module->settings.getSettingByName( + "uiscale")->value, false); + + if(armorSlot->isEnchanted()) { + barc.itemRenderer->renderGuiItemNew(&barc, + armorSlot, + 0, + scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, + module->settings.getSettingByName( + "uiscale")->value, + true); + } + } + } + + if (SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->getSelectedSlot())->getItem() != + nullptr) { + auto item = SDK::clientInstance->getLocalPlayer()->getSupplies()->getInventory()->getItem( + SDK::clientInstance->getLocalPlayer()->getSupplies()->getSelectedSlot()); + + auto maxDamage = item->getMaxDamage(); + auto durabilityLeft = maxDamage - item->getDamageValue(); + + durabilities[0][1] = maxDamage; + durabilities[0][0] = durabilityLeft; + + if (module->settings.getSettingByName("vertical")->value) ymodifier += spacing; + else xmodifier += spacing; + + barc.itemRenderer->renderGuiItemNew(&barc, + item, + 0, scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, + module->settings.getSettingByName( + "uiscale")->value, + false); + + if(item->isEnchanted()) { + barc.itemRenderer->renderGuiItemNew(&barc, + item, + 0, scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, module->settings.getSettingByName( "uiscale")->value, true); } } + + auto showOffhand = module->settings.getSettingByName("show_offhand")->value; + if(showOffhand) { + if (SDK::clientInstance->getLocalPlayer()->getOffhandSlot() != nullptr && + SDK::clientInstance->getLocalPlayer()->getOffhandSlot()->getItem() != nullptr) { + auto item = SDK::clientInstance->getLocalPlayer()->getOffhandSlot(); + + auto maxDamage = item->getMaxDamage(); + auto durabilityLeft = maxDamage - item->getDamageValue(); + + durabilities[1][1] = maxDamage; + durabilities[1][0] = durabilityLeft; + + if (module->settings.getSettingByName("vertical")->value) ymodifier += spacing; + else xmodifier += spacing; + + barc.itemRenderer->renderGuiItemNew(&barc, + item, + 0, scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, + module->settings.getSettingByName( + "uiscale")->value, + false); + + if (item->isEnchanted()) { + barc.itemRenderer->renderGuiItemNew(&barc, + item, + 0, scaledPos.x + xmodifier, scaledPos.y + ymodifier, 1.0f, + module->settings.getSettingByName( + "uiscale")->value, + true); + } + } + } } - } + } } - } } public: From c1c2d9de652334c1bddb7f83743b871e209b9159 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 14 Oct 2024 02:18:06 +0600 Subject: [PATCH 182/240] DONE --- .../Modules/EntityCounter/EntityCounter.hpp | 245 +++------------ src/Client/Module/Modules/FPS/FPSCounter.hpp | 270 +++-------------- src/Client/Module/Modules/HitPing/HitPing.hpp | 256 +++------------- .../Module/Modules/IPDisplay/IPDisplay.hpp | 266 +++-------------- src/Client/Module/Modules/Memory/Memory.hpp | 270 +++-------------- .../Modules/OpponentReach/OpponentReach.hpp | 269 +++-------------- .../Modules/PingCounter/PingCounter.hpp | 272 +++-------------- .../Module/Modules/PotCounter/PotCounter.hpp | 269 +++-------------- .../Modules/ReachCounter/ReachCounter.hpp | 273 +++-------------- .../Modules/SpeedDisplay/SpeedDisplay.hpp | 272 +++-------------- src/Client/Module/Modules/Time/Time.hpp | 282 +++--------------- 11 files changed, 417 insertions(+), 2527 deletions(-) diff --git a/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp b/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp index 47e2ff4f..d1c9a273 100644 --- a/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp +++ b/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp @@ -32,233 +32,62 @@ class EntityCounter : public Module { void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - this->settings.getSettingByName("uiscale")->value = percent; + this->extraPadding(); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; - percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Border ") + - Constraints::SpacingConstraint(0.60, textWidth), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->extraPadding(); - /* Border End */ + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->extraPadding(); - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value, 100.0f, 0.0f, - false); + this->addHeader("Misc Customizations"); - this->settings.getSettingByName("rounding")->value = percent; + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - - + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/FPS/FPSCounter.hpp b/src/Client/Module/Modules/FPS/FPSCounter.hpp index 5ae2ab89..5bf75c51 100644 --- a/src/Client/Module/Modules/FPS/FPSCounter.hpp +++ b/src/Client/Module/Modules/FPS/FPSCounter.hpp @@ -34,258 +34,64 @@ class FPSCounter : public Module { } - void settingsRender() override { + void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - this->settings.getSettingByName("uiscale")->value = percent; + this->extraPadding(); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; + this->extraPadding(); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->extraPadding(); + this->addHeader("Misc Customizations"); - percent = FlarialGUI::Slider(1, toggleX + Constraints::SpacingConstraint(0.60, textWidth) + - FlarialGUI::SettingsTextWidth("Border "), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - /* Border End */ + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"FPS Spoofer", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(69, toggleX + FlarialGUI::SettingsTextWidth("FPS Spoofer "), - toggleY, this->settings.getSettingByName("fpsSpoofer")->value); - - this->settings.getSettingByName("fpsSpoofer")->value = percent; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/HitPing/HitPing.hpp b/src/Client/Module/Modules/HitPing/HitPing.hpp index 0084e28a..cca94d93 100644 --- a/src/Client/Module/Modules/HitPing/HitPing.hpp +++ b/src/Client/Module/Modules/HitPing/HitPing.hpp @@ -34,245 +34,63 @@ class HitPing : public Module { void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - this->settings.getSettingByName("uiscale")->value = percent; + this->extraPadding(); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; + this->extraPadding(); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->extraPadding(); + this->addHeader("Misc Customizations"); - percent = FlarialGUI::Slider(1, toggleX + Constraints::SpacingConstraint(0.60, textWidth) + - FlarialGUI::SettingsTextWidth("Border "), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - /* Border End */ + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/IPDisplay/IPDisplay.hpp b/src/Client/Module/Modules/IPDisplay/IPDisplay.hpp index fe30d670..ccdd9808 100644 --- a/src/Client/Module/Modules/IPDisplay/IPDisplay.hpp +++ b/src/Client/Module/Modules/IPDisplay/IPDisplay.hpp @@ -33,255 +33,65 @@ class IPDisplay : public Module { if (settings.getSettingByName("textscale") == nullptr) settings.addSetting("textscale", 0.80f); } - void settingsRender() override { + void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - this->settings.getSettingByName("uiscale")->value = percent; + this->extraPadding(); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); + this->extraPadding(); - percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Border ") + - Constraints::SpacingConstraint(0.60, textWidth), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->extraPadding(); - /* Border End */ + this->addHeader("Misc Customizations"); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); - this->settings.getSettingByName("rounding")->value = percent; + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(5, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(7, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(6, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(6, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(5, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(10, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(7, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/Memory/Memory.hpp b/src/Client/Module/Modules/Memory/Memory.hpp index 1a4f59e1..4d7d9845 100644 --- a/src/Client/Module/Modules/Memory/Memory.hpp +++ b/src/Client/Module/Modules/Memory/Memory.hpp @@ -32,259 +32,65 @@ class MEM : public Module { settings.addSetting("text", (std::string) "{value}"); } - void settingsRender() override { + void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - this->settings.getSettingByName("uiscale")->value = percent; + this->extraPadding(); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->extraPadding(); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - percent = FlarialGUI::Slider(5, toggleX + Constraints::SpacingConstraint(0.60, textWidth) + - FlarialGUI::SettingsTextWidth("Border "), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->extraPadding(); - this->settings.getSettingByName("borderWidth")->value = percent; + this->addHeader("Misc Customizations"); - /* Border End */ + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); - percent = FlarialGUI::Slider(6, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - /* Rounding End */ - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(7, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - - + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp b/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp index 78a0abb2..2e06c478 100644 --- a/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp +++ b/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp @@ -36,258 +36,65 @@ class OpponentReach : public Module { settings.addSetting("textscale", 0.80f); } - void settingsRender() override { + void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - this->settings.getSettingByName("uiscale")->value = percent; + this->extraPadding(); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; + this->extraPadding(); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->extraPadding(); + this->addHeader("Misc Customizations"); - percent = FlarialGUI::Slider(1, toggleX + Constraints::SpacingConstraint(0.60, textWidth) + - FlarialGUI::SettingsTextWidth("Border "), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - /* Border End */ + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Try to exclude team", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(1, toggleX, toggleY, this->settings.getSettingByName( - "tryToExcludeTeam")->value)) - this->settings.getSettingByName("tryToExcludeTeam")->value = !this->settings.getSettingByName( - "tryToExcludeTeam")->value; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/PingCounter/PingCounter.hpp b/src/Client/Module/Modules/PingCounter/PingCounter.hpp index 1a4b450c..21330baa 100644 --- a/src/Client/Module/Modules/PingCounter/PingCounter.hpp +++ b/src/Client/Module/Modules/PingCounter/PingCounter.hpp @@ -36,260 +36,64 @@ class PingCounter : public Module { } - void settingsRender() override { + void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - this->settings.getSettingByName("uiscale")->value = percent; + this->extraPadding(); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; + this->extraPadding(); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->extraPadding(); + this->addHeader("Misc Customizations"); - percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Border ") + - Constraints::SpacingConstraint(0.60, textWidth), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - /* Border End */ + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/PotCounter/PotCounter.hpp b/src/Client/Module/Modules/PotCounter/PotCounter.hpp index 09714b67..445dd42f 100644 --- a/src/Client/Module/Modules/PotCounter/PotCounter.hpp +++ b/src/Client/Module/Modules/PotCounter/PotCounter.hpp @@ -34,257 +34,62 @@ class PotCounter : public Module { void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - this->settings.getSettingByName("uiscale")->value = percent; + this->extraPadding(); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; + this->extraPadding(); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->extraPadding(); + this->addHeader("Misc Customizations"); - percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Border ") + - Constraints::SpacingConstraint(0.60, textWidth), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - /* Border End */ + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/ReachCounter/ReachCounter.hpp b/src/Client/Module/Modules/ReachCounter/ReachCounter.hpp index 2196672f..86a49369 100644 --- a/src/Client/Module/Modules/ReachCounter/ReachCounter.hpp +++ b/src/Client/Module/Modules/ReachCounter/ReachCounter.hpp @@ -34,261 +34,64 @@ class ReachCounter : public Module { if (settings.getSettingByName("textscale") == nullptr) settings.addSetting("textscale", 0.70f); } - void settingsRender() override { + void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->extraPadding(); - this->settings.getSettingByName("uiscale")->value = percent; + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); + this->extraPadding(); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(1, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); + this->extraPadding(); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->addHeader("Misc Customizations"); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Border ") + - Constraints::SpacingConstraint(0.60, textWidth), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - /* Border End */ + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - + this->resetPadding(); } }; \ No newline at end of file diff --git a/src/Client/Module/Modules/SpeedDisplay/SpeedDisplay.hpp b/src/Client/Module/Modules/SpeedDisplay/SpeedDisplay.hpp index ed9a5f87..a2f86e1e 100644 --- a/src/Client/Module/Modules/SpeedDisplay/SpeedDisplay.hpp +++ b/src/Client/Module/Modules/SpeedDisplay/SpeedDisplay.hpp @@ -37,261 +37,65 @@ class SpeedDisplay : public Module { if (settings.getSettingByName("textscale") == nullptr) settings.addSetting("textscale", 1.00f); } - void settingsRender() override { + void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(3, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - this->settings.getSettingByName("uiscale")->value = percent; + this->extraPadding(); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; + this->extraPadding(); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->extraPadding(); + this->addHeader("Misc Customizations"); - percent = FlarialGUI::Slider(1, toggleX + FlarialGUI::SettingsTextWidth("Border ") + - Constraints::SpacingConstraint(0.60, textWidth), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - /* Border End */ + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(2, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Rounding End */ - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/Time/Time.hpp b/src/Client/Module/Modules/Time/Time.hpp index f4d575a7..301d04a9 100644 --- a/src/Client/Module/Modules/Time/Time.hpp +++ b/src/Client/Module/Modules/Time/Time.hpp @@ -40,269 +40,67 @@ class Time : public Module { if (settings.getSettingByName("textscale") == nullptr) settings.addSetting("textscale", 0.80f); } - void settingsRender() override { + void settingsRender() override { - /* Border Start */ + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); + this->addToggle("24 Hour Clock", "", this->settings.getSettingByName( + "24")->value); - this->settings.getSettingByName("uiscale")->value = percent; + this->extraPadding(); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; + this->extraPadding(); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->extraPadding(); + this->addHeader("Misc Customizations"); - percent = FlarialGUI::Slider(5, toggleX + Constraints::SpacingConstraint(0.60, textWidth) + - FlarialGUI::SettingsTextWidth("Border "), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - this->settings.getSettingByName("borderWidth")->value = percent; + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - /* Border End */ + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(6, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"24 Hour", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(2, toggleX, toggleY, this->settings.getSettingByName( - "24")->value)) - this->settings.getSettingByName("24")->value = !this->settings.getSettingByName("24")->value; - - /* Rounding End */ - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(7, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); - - this->settings.getSettingByName("textalignment")->value = txtAlignment; - - FlarialGUI::SetIsInAdditionalYMode(); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Color Pickers Start*/ - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - + this->resetPadding(); } }; From 3fd13cae385f865dadfb44bf5876519b5efb1da9 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:03:39 +0600 Subject: [PATCH 183/240] numerous changes and fixes --- src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp | 2 +- src/Client/Module/Modules/CPS/CPSCounter.hpp | 2 +- src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- src/Client/Module/Modules/EntityCounter/EntityCounter.hpp | 2 +- src/Client/Module/Modules/FPS/FPSCounter.hpp | 2 +- src/Client/Module/Modules/HitPing/HitPing.hpp | 2 +- src/Client/Module/Modules/IPDisplay/IPDisplay.hpp | 2 +- src/Client/Module/Modules/Memory/Memory.hpp | 2 +- src/Client/Module/Modules/MotionBlur/MotionBlur.hpp | 7 +++++-- src/Client/Module/Modules/OpponentReach/OpponentReach.hpp | 2 +- src/Client/Module/Modules/PingCounter/PingCounter.hpp | 2 +- src/Client/Module/Modules/PotCounter/PotCounter.hpp | 2 +- src/Client/Module/Modules/ReachCounter/ReachCounter.hpp | 2 +- src/Client/Module/Modules/SpeedDisplay/SpeedDisplay.hpp | 2 +- src/Client/Module/Modules/Time/Time.hpp | 2 +- 15 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp b/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp index 81e418d0..9666d26c 100644 --- a/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp +++ b/src/Client/Module/Modules/ArrowCounter/ArrowCounter.hpp @@ -85,7 +85,7 @@ class ArrowCounter : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/CPS/CPSCounter.hpp b/src/Client/Module/Modules/CPS/CPSCounter.hpp index a2fa1c4a..6fce66c0 100644 --- a/src/Client/Module/Modules/CPS/CPSCounter.hpp +++ b/src/Client/Module/Modules/CPS/CPSCounter.hpp @@ -92,7 +92,7 @@ class CPSCounter : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index de23bf58..a3e51296 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -112,7 +112,7 @@ class ClickGUIRenderer : public Listener { } - if (SwapchainHook::init && baseHeightActual > 0.0155f) { + if (SwapchainHook::init && baseHeightActual > 0.1f) { this->module->settings.getSettingByName("enabled")->value = true; diff --git a/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp b/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp index d1c9a273..baf2e9e7 100644 --- a/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp +++ b/src/Client/Module/Modules/EntityCounter/EntityCounter.hpp @@ -85,7 +85,7 @@ class EntityCounter : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/FPS/FPSCounter.hpp b/src/Client/Module/Modules/FPS/FPSCounter.hpp index 5bf75c51..44e0d79b 100644 --- a/src/Client/Module/Modules/FPS/FPSCounter.hpp +++ b/src/Client/Module/Modules/FPS/FPSCounter.hpp @@ -89,7 +89,7 @@ class FPSCounter : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/HitPing/HitPing.hpp b/src/Client/Module/Modules/HitPing/HitPing.hpp index cca94d93..cf449c89 100644 --- a/src/Client/Module/Modules/HitPing/HitPing.hpp +++ b/src/Client/Module/Modules/HitPing/HitPing.hpp @@ -87,7 +87,7 @@ class HitPing : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/IPDisplay/IPDisplay.hpp b/src/Client/Module/Modules/IPDisplay/IPDisplay.hpp index ccdd9808..923afc68 100644 --- a/src/Client/Module/Modules/IPDisplay/IPDisplay.hpp +++ b/src/Client/Module/Modules/IPDisplay/IPDisplay.hpp @@ -88,7 +88,7 @@ class IPDisplay : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/Memory/Memory.hpp b/src/Client/Module/Modules/Memory/Memory.hpp index 4d7d9845..29cfffcc 100644 --- a/src/Client/Module/Modules/Memory/Memory.hpp +++ b/src/Client/Module/Modules/Memory/Memory.hpp @@ -87,7 +87,7 @@ class MEM : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlur.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlur.hpp index 32f60a61..e0d656c1 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlur.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlur.hpp @@ -18,8 +18,11 @@ class MotionBlur : public Module { }; void onEnable() override { - EventHandler::registerPriorityListener(new MotionBlurListener("MotionBlurListener", this)); - Module::onEnable(); + if(SwapchainHook::queue) FlarialGUI::Notify("Please turn on Better Frames in Settings!"); + else { + EventHandler::registerPriorityListener(new MotionBlurListener("MotionBlurListener", this)); + Module::onEnable(); + } } void onDisable() override { diff --git a/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp b/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp index 2e06c478..ec122bc8 100644 --- a/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp +++ b/src/Client/Module/Modules/OpponentReach/OpponentReach.hpp @@ -91,7 +91,7 @@ class OpponentReach : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/PingCounter/PingCounter.hpp b/src/Client/Module/Modules/PingCounter/PingCounter.hpp index 21330baa..e2ba687c 100644 --- a/src/Client/Module/Modules/PingCounter/PingCounter.hpp +++ b/src/Client/Module/Modules/PingCounter/PingCounter.hpp @@ -91,7 +91,7 @@ class PingCounter : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/PotCounter/PotCounter.hpp b/src/Client/Module/Modules/PotCounter/PotCounter.hpp index 445dd42f..82c973e9 100644 --- a/src/Client/Module/Modules/PotCounter/PotCounter.hpp +++ b/src/Client/Module/Modules/PotCounter/PotCounter.hpp @@ -87,7 +87,7 @@ class PotCounter : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/ReachCounter/ReachCounter.hpp b/src/Client/Module/Modules/ReachCounter/ReachCounter.hpp index 86a49369..ed1fed82 100644 --- a/src/Client/Module/Modules/ReachCounter/ReachCounter.hpp +++ b/src/Client/Module/Modules/ReachCounter/ReachCounter.hpp @@ -89,7 +89,7 @@ class ReachCounter : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/SpeedDisplay/SpeedDisplay.hpp b/src/Client/Module/Modules/SpeedDisplay/SpeedDisplay.hpp index a2f86e1e..7e28e6c1 100644 --- a/src/Client/Module/Modules/SpeedDisplay/SpeedDisplay.hpp +++ b/src/Client/Module/Modules/SpeedDisplay/SpeedDisplay.hpp @@ -92,7 +92,7 @@ class SpeedDisplay : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); diff --git a/src/Client/Module/Modules/Time/Time.hpp b/src/Client/Module/Modules/Time/Time.hpp index 301d04a9..b6db9f30 100644 --- a/src/Client/Module/Modules/Time/Time.hpp +++ b/src/Client/Module/Modules/Time/Time.hpp @@ -97,7 +97,7 @@ class Time : public Module { this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( "responsivewidth")->value); - this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); this->resetPadding(); From c4b76d4849799b19f280510cbad53810e2de0bea Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:21:44 +0600 Subject: [PATCH 184/240] tablist fix --- src/Client/Module/Modules/TabList/TabList.hpp | 177 +++--------------- 1 file changed, 25 insertions(+), 152 deletions(-) diff --git a/src/Client/Module/Modules/TabList/TabList.hpp b/src/Client/Module/Modules/TabList/TabList.hpp index 745081c0..74c1603c 100644 --- a/src/Client/Module/Modules/TabList/TabList.hpp +++ b/src/Client/Module/Modules/TabList/TabList.hpp @@ -1,4 +1,4 @@ -#pragma once + #pragma once #include "../Module.hpp" #include "../../../GUI/Engine/Engine.hpp" @@ -76,141 +76,39 @@ class TabList : public Module { } void settingsRender() override { - /* Border Start */ - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, - this->settings.getSettingByName("uiscale")->value, 2.0f); - - this->settings.getSettingByName("uiscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; - - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - - percent = FlarialGUI::Slider(5, toggleX + Constraints::SpacingConstraint(0.60, textWidth) + - FlarialGUI::SettingsTextWidth("Border "), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); - - this->settings.getSettingByName("borderWidth")->value = percent; - - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(6, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, - this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::KeybindSelector(0, toggleX, toggleY, getKeybind()); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Alphabetical Order", - textWidth * 2.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(2, toggleX, toggleY, - this->settings.getSettingByName("alphaOrder")->value)) - this->settings.getSettingByName("alphaOrder")->value = !this->settings.getSettingByName( - "alphaOrder")->value; - - /* Rounding End */ - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); + this->addHeader("Main"); + this->addSlider("UI Scale", "The Size of Tablist", this->settings.getSettingByName("uiscale")->value, 1.25f); + this->addToggle("Border", "", this->settings.getSettingByName("border")->value); + this->addConditionalSlider(this->settings.getSettingByName("border")->value, "Border Width", "", this->settings.getSettingByName("borderWidth")->value, 4); + this->addSlider("Rounding", "", this->settings.getSettingByName("rounding")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->extraPadding(); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); + this->addHeader("Misc"); + this->addToggle("Alphabetical Order", "", this->settings.getSettingByName("alphaOrder")->value); + this->addKeybind("Keybind", "", getKeybind()); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->extraPadding(); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addHeader("Colors"); + this->addColorPicker("Background", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Text", "", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); + this->addColorPicker("Border", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - + this->resetPadding(); } void normalRender(int index, std::string& value) override { @@ -219,8 +117,7 @@ class TabList : public Module { float keycardSize = Constraints::RelativeConstraint( 0.05f * this->settings.getSettingByName("uiscale")->value, "height", true); - Vec2 settingperc = Vec2(this->settings.getSettingByName("percentageX")->value, - this->settings.getSettingByName("percentageY")->value); + Vec2 settingperc{0, 0}; int i3 = 0; float i2 = 0; @@ -247,7 +144,6 @@ class TabList : public Module { int count = 0; float fakex = realcenter.x; - float fixer = 0; for (const auto &pair: SDK::clientInstance->getLocalPlayer()->getLevel()->getPlayerMap()) { @@ -255,11 +151,6 @@ class TabList : public Module { if (i3 % 10 == 1) { i2 += 4.85; count++; - - if (count != 1) { - fakex -= ((5.f * keycardSize) / 2.0f); - fixer += ((5.f * keycardSize) / 2.0f); - } } } @@ -271,23 +162,10 @@ class TabList : public Module { float totalWidth = i2 * keycardSize; - if (ModuleManager::getModule("ClickGUI")->isEnabled() || - ClickGUIRenderer::editmenu) - FlarialGUI::SetWindowRect(fakex, realcenter.y, totalWidth, keycardSize * 7.5f, index, fixer); - - Vec2 vec2 = FlarialGUI::CalculateMovedXY(realcenter.x, realcenter.y, index, totalWidth, - keycardSize * 7.5f); - - realcenter.x = vec2.x; - realcenter.y = vec2.y; + Vec2 vec2 = realcenter; realcenter = realcenter; - Vec2 percentages = Constraints::CalculatePercentage(realcenter.x, realcenter.y); - - this->settings.setValue("percentageX", percentages.x); - this->settings.setValue("percentageY", percentages.y); - float fontSize = Constraints::SpacingConstraint(3, keycardSize); D2D1_COLOR_F disabledColor; @@ -504,11 +382,6 @@ class TabList : public Module { } // TODO ModuleManager::getModule("ClickGUI") FIND ALL AND REPLACE!!! - - if (ModuleManager::getModule("ClickGUI")->active || - ClickGUIRenderer::editmenu) - - FlarialGUI::UnsetWindowRect(); } } } From 9afc3a18d3b1694990975d749678923641757115 Mon Sep 17 00:00:00 2001 From: Withors <162058124+Withors@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:51:18 +0300 Subject: [PATCH 185/240] hive overlay --- main.cpp | 4 + src/Client/Hook/Hooks/Game/PacketHooks.cpp | 13 + src/Client/Hook/Hooks/Game/PacketHooks.hpp | 4 + src/Client/Module/Manager.cpp | 8 +- .../Module/Modules/AutoRQ/AutoRQListener.hpp | 273 +++------ .../HiveModeCatcherListener.hpp | 67 +++ .../Module/Modules/HiveStat/HiveStat.hpp | 48 ++ .../Modules/HiveStat/HiveStatListener.hpp | 284 +++++++++ src/Utils/Hive.hpp | 551 ++++++++++++++++++ src/Utils/Memory/Memory.hpp | 4 + 10 files changed, 1055 insertions(+), 201 deletions(-) create mode 100644 src/Client/Module/Modules/HiveModeCatcher/HiveModeCatcherListener.hpp create mode 100644 src/Client/Module/Modules/HiveStat/HiveStat.hpp create mode 100644 src/Client/Module/Modules/HiveStat/HiveStatListener.hpp create mode 100644 src/Utils/Hive.hpp diff --git a/main.cpp b/main.cpp index b3ac9612..17865b33 100644 --- a/main.cpp +++ b/main.cpp @@ -121,6 +121,10 @@ DWORD WINAPI init(HMODULE real) }); statusThread.detach(); + + + + while (true) { if (Client::disable) { break; diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.cpp b/src/Client/Hook/Hooks/Game/PacketHooks.cpp index 5439cc9d..989f76fa 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.cpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.cpp @@ -90,6 +90,15 @@ void SendPacketHook::receiveCallbackContainerClose(void *packetHandlerDispatcher receivePacketContainerCloseOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } +void SendPacketHook::receiveCallbackChangeDimension(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, + const std::shared_ptr& packet) { + + PacketEvent event(packet.get()); + EventHandler::onPacketReceive(event); + if (!event.isCancelled()) + receivePacketChangeDimensionOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); +} + void SendPacketHook::enableHook() { /*for (int num = 1; num <= (int)MinecraftPacketIds::PacketViolationWarning; num++) { @@ -129,6 +138,10 @@ void SendPacketHook::enableHook() { Memory::hookFunc((void *) ContainerClosePacket->packetHandler->vTable[1], (void *)receiveCallbackContainerClose, (void **) &receivePacketContainerCloseOriginal, "ReceivePacketHook"); + std::shared_ptr changeDimensionPacket = SDK::createPacket((int) MinecraftPacketIds::ChangeDimension); + Memory::hookFunc((void *) changeDimensionPacket->packetHandler->vTable[1], receiveCallbackChangeDimension, + (void **) &receivePacketChangeDimensionOriginal, "ReceivePacketHook"); + this->autoHook((void *) callback, (void **) &sendPacketOriginal); } diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.hpp b/src/Client/Hook/Hooks/Game/PacketHooks.hpp index ce1c1776..d6a40558 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.hpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.hpp @@ -33,6 +33,9 @@ class SendPacketHook : public Hook { static void receiveCallbackContainerClose(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet); + static void receiveCallbackChangeDimension(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, + const std::shared_ptr& packet); + public: static inline void* NetworkIdentifier; @@ -52,6 +55,7 @@ class SendPacketHook : public Hook { static inline receive receivePacketInteractOriginal = nullptr; static inline receive receivePacketContainerOpenOriginal = nullptr; static inline receive receivePacketContainerCloseOriginal = nullptr; + static inline receive receivePacketChangeDimensionOriginal = nullptr; SendPacketHook() : Hook("sendPacket", GET_SIG("LoopbackPacketSender::sendPacket")) {} diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 22023db7..da0d4f53 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -68,11 +68,15 @@ #include #include "Modules/ItemPhysics/ItemPhysics.hpp" +#include "Modules/Crosshair/Crosshair.hpp" +#include "Modules/HiveStat/HiveStat.hpp" #include "Modules/OpponentReach/OpponentReach.hpp" #include "Modules/ViewModel/ViewModel.hpp" #include "Modules/PotionHUD/PotionHUD.hpp" #include "Modules/FasterInventory/FasterInventory.hpp" +#include "Modules/EntityCounter/EntityCounter.hpp" + namespace ModuleManager { std::unordered_map moduleMap; std::vector onlineUsers; @@ -164,7 +168,8 @@ void ModuleManager::initialize() { //addModule(new MovableChat()); //addModule(new CompactChat()); addModule(new ItemPhysics()); - + + addModule(new HiveStat()); EventHandler::registerListener(new GUIKeyListener("GuiKeyListener")); EventHandler::registerListener(new DiscordRPCListener("DiscordRPC")); @@ -173,6 +178,7 @@ void ModuleManager::initialize() { EventHandler::registerListener(new CentreCursorListener("CentreCursor")); EventHandler::registerListener(new rgbListener("RGB Controller")); EventHandler::registerListener(new TextAliasListener("TextAlias")); + EventHandler::registerListener(new HiveModeCatcherListener("HiveModeCatcher")); initialized = true; } diff --git a/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp b/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp index 46e8e472..f01ddc4f 100644 --- a/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp +++ b/src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp @@ -17,6 +17,7 @@ #include "../../../Events/Input/KeyEvent.hpp" #include "../Module.hpp" #include "../../../GUI/Engine/Engine.hpp" +#include "../HiveModeCatcher/HiveModeCatcherListener.hpp" #include #include #include @@ -32,237 +33,142 @@ class AutoRQListener : public Listener { Module *module; - std::string currentGame; bool triggered = false; + inline void ltrim(std::string &s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { - return !std::isspace(ch); + return !std::isspace(ch); })); } + void onPacketReceive(PacketEvent &event) override { MinecraftPacketIds id = event.getPacket()->getId(); if (id == MinecraftPacketIds::SetTitle) { - if(module->settings.getSettingByName("solo")->value){ + if (module->settings.getSettingByName("solo")->value) { auto *pkt = reinterpret_cast(event.getPacket()); if (pkt->text == "§cYou're a spectator!" || pkt->text == "§cYou died!" || pkt->text == "§7You're spectating the §as§eh§6o§cw§7!") { - triggered = true; - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/connection"; - - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; + reQ(); - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - - } //std::cout << pkt->mName << std::endl; + } } } if (id == MinecraftPacketIds::PlaySoundA) { - if(module->settings.getSettingByName("solo")->value){ + if (module->settings.getSettingByName("solo")->value) { auto *pkt = reinterpret_cast(event.getPacket()); if (pkt->mName == "hive.grav.game.portal.reached.final") { - triggered = true; - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/connection"; - - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; + reQ(); - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - - } //std::cout << pkt->mName << std::endl; + } } } if (id == MinecraftPacketIds::Text) { - if(module->settings.getSettingByName("murderer")->value){ + if (module->settings.getSettingByName("murderer")->value) { auto *pkt = reinterpret_cast(event.getPacket()); if (pkt->message == "§c§l» §r§c§lMurderer") { - triggered = true; + reQ(); FlarialGUI::Notify("Found role Murderer"); - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/connection"; - - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - - } //std::cout << pkt->mName << std::endl; + } } } if (id == MinecraftPacketIds::Text) { - if(module->settings.getSettingByName("sheriff")->value){ + if (module->settings.getSettingByName("sheriff")->value) { auto *pkt = reinterpret_cast(event.getPacket()); if (pkt->message == "§9§l» §r§9§lSheriff") { - triggered = true; + reQ(); FlarialGUI::Notify("Found role Sheriff"); - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/connection"; - - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - - } //std::cout << pkt->mName << std::endl; + } } } if (id == MinecraftPacketIds::Text) { - if(module->settings.getSettingByName("innocent")->value){ + if (module->settings.getSettingByName("innocent")->value) { auto *pkt = reinterpret_cast(event.getPacket()); if (pkt->message == "§a§l» §r§a§lInnocent") { - triggered = true; + reQ(); FlarialGUI::Notify("Found role Innocent"); - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/connection"; - - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - - } //std::cout << pkt->mName << std::endl; + } } } if (id == MinecraftPacketIds::Text) { - if(module->settings.getSettingByName("death")->value){ + if (module->settings.getSettingByName("death")->value) { auto *pkt = reinterpret_cast(event.getPacket()); if (pkt->message == "§d§l» §r§bYou are a §cDeath") { - triggered = true; + reQ(); FlarialGUI::Notify("Found role Death"); - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/connection"; - - command_packet->origin.type = CommandOriginType::Player; - command_packet->InternalSource = true; - - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - - } //std::cout << pkt->mName << std::endl; + } } } if (id == MinecraftPacketIds::Text) { - if(module->settings.getSettingByName("runner")->value){ + if (module->settings.getSettingByName("runner")->value) { auto *pkt = reinterpret_cast(event.getPacket()); if (pkt->message == "§d§l» §r§bYou are a §aRunner") { - triggered = true; + reQ(); FlarialGUI::Notify("Found role Runner"); - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/connection"; - - command_packet->origin.type = CommandOriginType::Player; - command_packet->InternalSource = true; - - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - - } //std::cout << pkt->mName << std::endl; + } } } if (id == MinecraftPacketIds::Text) { - if(module->settings.getSettingByName("hider")->value){ + if (module->settings.getSettingByName("hider")->value) { auto *pkt = reinterpret_cast(event.getPacket()); if (pkt->message == "§e§l» §rYou are a §eHIDER") { - triggered = true; + reQ(); FlarialGUI::Notify("Found role Hider"); - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/connection"; - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; - - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - - } //std::cout << pkt->mName << std::endl; + } } } if (id == MinecraftPacketIds::Text) { - if(module->settings.getSettingByName("seeker")->value){ + if (module->settings.getSettingByName("seeker")->value) { auto *pkt = reinterpret_cast(event.getPacket()); if (pkt->message == "§c§l» §rYou are a §cSEEKER") { - triggered = true; + reQ(); FlarialGUI::Notify("Found role Seeker"); - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/connection"; - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; - - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - - } //std::cout << pkt->mName << std::endl; + } } } if (id == MinecraftPacketIds::Text) { - if(module->settings.getSettingByName("AutoMapAvoider")->value){ + if (module->settings.getSettingByName("AutoMapAvoider")->value) { auto *pkt = reinterpret_cast(event.getPacket()); std::string maps_to_avoid = module->settings.getSettingByName("text")->value; std::stringstream ss(maps_to_avoid); - std::string fixed_value ="§b§l» §r§e"; + std::string fixed_value = "§b§l» §r§e"; std::vector vect; std::vector result; - if (pkt->message.substr(0,15)==fixed_value){ - while( ss.good() ) - { + if (pkt->message.substr(0, 15) == fixed_value) { + while (ss.good()) { std::string substr; - getline( ss, substr, ',' ); + getline(ss, substr, ','); ltrim(substr); - result.push_back( substr ); + result.push_back(substr); } for (std::size_t i = 0; i < result.size(); i++) { std::string evaluate_string = fixed_value + result[i]; - std::transform(evaluate_string.begin(), evaluate_string.end(), evaluate_string.begin(), ::tolower); + std::transform(evaluate_string.begin(), evaluate_string.end(), evaluate_string.begin(), + ::tolower); std::transform(pkt->message.begin(), pkt->message.end(), pkt->message.begin(), ::tolower); - if (pkt->message.substr(0, (evaluate_string.length())) == evaluate_string) { - triggered = true; + if (pkt->message.substr(0, (evaluate_string.length())) == evaluate_string) { + reQ(); FlarialGUI::Notify("Found map: " + result[i]); - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - command_packet->command = "/connection"; - command_packet->origin.type = CommandOriginType::Player; - command_packet->InternalSource = true; - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); } } } @@ -271,71 +177,9 @@ class AutoRQListener : public Listener { if (id == MinecraftPacketIds::Text) { auto *pkt = reinterpret_cast(event.getPacket()); //if(!module->settings.getSettingByName("solo")->value) { - if (pkt->message == "§c§l» §r§c§lGame OVER!") { - triggered = true; - std::shared_ptr packet = SDK::createPacket(77); - auto *command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/connection"; - - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; - - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - return; - } //std::cout << pkt->mName << std::endl; - //} - - std::string textToCheck = "You are connected to server name "; - std::string textToCheckToSilence = "You are connected"; - - if (pkt->message.find(textToCheck) != std::string::npos && triggered) { - if(!module->settings.getSettingByName("hub")->value){ - std::string server = pkt->message.replace(0, textToCheck.length(), ""); - std::regex pattern("\\d+"); - std::string name = std::regex_replace(server, pattern, ""); - FlarialGUI::Notify("Preparing Q: " + name); - std::thread t([name]() { - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - - FlarialGUI::Notify("Executing command /q " + name); - - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - command_packet->command = "/q " + name; - - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - }); - t.detach(); - triggered = false; - pkt->message = ""; - } - else{ - std::thread h([]() { - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - FlarialGUI::Notify("Executing command /hub"); - std::shared_ptr packet = SDK::createPacket(77); - auto* command_packet = reinterpret_cast(packet.get()); - - command_packet->command = "/hub"; - - command_packet->origin.type = CommandOriginType::Player; - - command_packet->InternalSource = true; - - SDK::clientInstance->getPacketSender()->sendToServer(command_packet); - }); - h.detach(); - triggered = false; - pkt->message = ""; - } - } - else if (pkt->message.find(textToCheckToSilence) != std::string::npos) { - event.cancel(); + if (pkt->message == "§c§l» §r§c§lGame OVER!") { + reQ(); + return; } } } @@ -349,6 +193,35 @@ class AutoRQListener : public Listener { */ } + void reQ() { + if (!module->settings.getSettingByName("hub")->value) { + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + + FlarialGUI::Notify("Executing command /q " + HiveModeCatcherListener::currentGame); + + std::shared_ptr packet = SDK::createPacket(77); + auto *command_packet = reinterpret_cast(packet.get()); + command_packet->command = "/q " + HiveModeCatcherListener::currentGame; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + } else { + FlarialGUI::Notify("Executing command /hub"); + std::shared_ptr packet = SDK::createPacket(77); + auto *command_packet = reinterpret_cast(packet.get()); + + command_packet->command = "/hub"; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + } + } + public: explicit AutoRQListener(const char string[5], Module * diff --git a/src/Client/Module/Modules/HiveModeCatcher/HiveModeCatcherListener.hpp b/src/Client/Module/Modules/HiveModeCatcher/HiveModeCatcherListener.hpp new file mode 100644 index 00000000..ad1cadf9 --- /dev/null +++ b/src/Client/Module/Modules/HiveModeCatcher/HiveModeCatcherListener.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Network/PacketEvent.hpp" +#include "../../../../SDK/Client/Network/Packet/CommandRequestPacket.hpp" +#include "../../../../SDK/Client/Network/Packet/TextPacket.hpp" + +class HiveModeCatcherListener : public Listener { + bool connectionExecuted = false; + bool listenForServer = false; + + + + + void onPacketReceive(PacketEvent &event) override { + + if (SDK::getServerIP().find("hive") == std::string::npos) return; + MinecraftPacketIds id = event.getPacket()->getId(); + + if (id == MinecraftPacketIds::ChangeDimension) { + if (connectionExecuted) { + listenForServer = true; + connectionExecuted = false; + std::shared_ptr packet = SDK::createPacket(77); + auto *command_packet = reinterpret_cast(packet.get()); + + command_packet->command = "/connection"; + + command_packet->origin.type = CommandOriginType::Player; + + command_packet->InternalSource = true; + + + SDK::clientInstance->getPacketSender()->sendToServer(command_packet); + } else { + connectionExecuted = true; + } + } + + if (id == MinecraftPacketIds::Text) { + auto *pkt = reinterpret_cast(event.getPacket()); + + std::string textToCheck = "You are connected to server name "; + std::string textToCheckToSilence = "You are connected"; + + + if (pkt->message.find(textToCheck) != std::string::npos && listenForServer) { + std::string server = pkt->message.replace(0, textToCheck.length(), ""); + std::regex pattern("\\d+"); + HiveModeCatcherListener::currentGame = std::regex_replace(server, pattern, ""); + event.cancel(); + listenForServer = true; + + } else if (pkt->message.find(textToCheckToSilence) != std::string::npos) { + event.cancel(); + } + + } + } + +public: + explicit HiveModeCatcherListener(const char string[5]) { + this->name = string; + } + static inline std::string currentGame; +}; diff --git a/src/Client/Module/Modules/HiveStat/HiveStat.hpp b/src/Client/Module/Modules/HiveStat/HiveStat.hpp new file mode 100644 index 00000000..d20c83c7 --- /dev/null +++ b/src/Client/Module/Modules/HiveStat/HiveStat.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include "../Module.hpp" +#include "../../../Events/EventHandler.hpp" +#include "HiveStatListener.hpp" + + +class HiveStat : public Module { + +public: + + + HiveStat() : Module("HiveOverlay", "", + IDR_RE_Q_PNG, "O") { + + Module::setup(); + + }; + + void onEnable() override { + EventHandler::registerListener(new HiveStatListener("HiveOverlay", this)); + Module::onEnable(); + FlarialGUI::Notify("Hive Overlay works only in sky, bed, mm, ctf"); + FlarialGUI::Notify("To change the position of Hive Overlay, Please click " + + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( + "editmenubind")->value + " in the settings tab."); + } + + void onDisable() override { + EventHandler::unregisterListener("HiveOverlay"); + Module::onDisable(); + } + + void defaultConfig() override { + if (settings.getSettingByName("Overlay") == nullptr) + settings.addSetting("Overlay", (std::string) "O"); + + } + + void settingsRender() override { + float toggleX = Constraints::PercentageConstraint(0.019, "left"); + float toggleY = Constraints::PercentageConstraint(0.10, "top"); + + FlarialGUI::KeybindSelector(0, toggleX + FlarialGUI::SettingsTextWidth("Overlay"), toggleY, + settings.getSettingByName("Overlay")->value); + } +}; + diff --git a/src/Client/Module/Modules/HiveStat/HiveStatListener.hpp b/src/Client/Module/Modules/HiveStat/HiveStatListener.hpp new file mode 100644 index 00000000..67de5bd4 --- /dev/null +++ b/src/Client/Module/Modules/HiveStat/HiveStatListener.hpp @@ -0,0 +1,284 @@ +#pragma once + +#include "../../../../SDK/SDK.hpp" +#include "../../../../Utils/Hive.hpp" +#include "../../../../SDK//Client/Network/Packet/PlaySoundPacket.hpp" +#include "../../../../SDK//Client/Network/Packet/TextPacket.hpp" +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../Module.hpp" +#include "../../../GUI/Engine/Engine.hpp" +#include +#include +#include "../../../../SDK/SDK.hpp" +#include "../../../../SDK//Client/Network/Packet/CommandRequestPacket.hpp" +#include +#include "../../../Events/Listener.hpp" +#include "../../../Events/Input/KeyEvent.hpp" +#include "../Module.hpp" +#include "../../../GUI/Engine/Engine.hpp" +#include "../HiveModeCatcher/HiveModeCatcherListener.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class HiveStatListener : public Listener { + + + + Module *module; + std::vector> playerStatsList; + std::vector queueList; + std::shared_mutex queueMutex; + std::condition_variable_any queueCondition; + std::thread fetchThread; + bool stopThread = false; + bool renderOverlay = true; + Vec2 currentPos; + + void fetchPlayerStats(const std::string& playerName) { + + std::string cg = HiveModeCatcherListener::currentGame; + + size_t dashPos = cg.find('-'); + + if (dashPos != std::string::npos) { + cg = cg.substr(0, dashPos); + } + + std::transform(cg.begin(), cg.end(), cg.begin(), ::tolower); + Hive::PlayerStats stats = Hive::GetStats(cg, playerName); + std::unique_lock lock(queueMutex); + playerStatsList.emplace_back(playerName, stats); + } + + void workerThread() { + while (!stopThread) { + std::string playerName; + + { + std::unique_lock lock(queueMutex); + queueCondition.wait(lock, [this] { return !queueList.empty() || stopThread; }); + + if (stopThread && queueList.empty()) break; + + playerName = queueList.front(); + queueList.erase(queueList.begin()); + } + + fetchPlayerStats(playerName); + } + } + + void onRender(RenderEvent &event) override { + + + if (ClientInstance::getTopScreenName() == "hud_screen" && + module->isEnabled()) { + + + + Vec2 settingperc = Vec2(module->settings.getSettingByName("percentageX")->value, + module->settings.getSettingByName("percentageY")->value); + + + + if (settingperc.x != 0) + currentPos = Vec2(settingperc.x * MC::windowSize.x, + settingperc.y * MC::windowSize.y); + else + currentPos = Constraints::CenterConstraint(150, 150); + + if (ClickGUIRenderer::editmenu) { + FlarialGUI::SetWindowRect(currentPos.x, currentPos.y, 150, 50, 123); + FlarialGUI::FlarialTextWithFont(currentPos.x, currentPos.y, + L"Overlay", 150, 50, + DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, 150), + DWRITE_FONT_WEIGHT_NORMAL); + } + + Vec2 vec2; + vec2 = FlarialGUI::CalculateMovedXY(currentPos.x, currentPos.y, 123, 150, 50); + + currentPos.x = vec2.x; + currentPos.y = vec2.y; + + Vec2 percentages = Constraints::CalculatePercentage(currentPos.x, currentPos.y); + + module->settings.setValue("percentageX", percentages.x); + module->settings.setValue("percentageY", percentages.y); + + if (ClickGUIRenderer::editmenu) { + FlarialGUI::RoundedRect(currentPos.x, currentPos.y, D2D1::ColorF(D2D1::ColorF::White, 0.4f), 150, 50); + FlarialGUI::UnsetWindowRect(); + } + } + + if (SDK::getCurrentScreen() != "hud_screen") ClickGUIRenderer::editmenu = false; + + + if(!renderOverlay) return; + + + std::string cg = HiveModeCatcherListener::currentGame; + + size_t dashPos = cg.find('-'); + + if (dashPos != std::string::npos) { + cg = cg.substr(0, dashPos); + } + + std::transform(cg.begin(), cg.end(), cg.begin(), ::tolower); + if (cg != "bed" && cg != "sky" && cg != "murder" && cg != "ctf") { + return; + } + + + if (!SDK::clientInstance || !SDK::clientInstance->getLocalPlayer() || + !SDK::clientInstance->getMinecraftGame()->mouseGrabbed || + !SDK::clientInstance->getLocalPlayer()->getLevel()) { + return; + } + + + ImVec2 position(currentPos.x, currentPos.y); + ImGui::SetNextWindowPos(position, ImGuiCond_Always); + ImGui::Begin("Overlay", nullptr, + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar); + + if (ImGui::BeginTable("Player Stats", 5, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersV)) { + ImGui::TableSetupColumn("Player Name"); + ImGui::TableSetupColumn("FKDR"); + ImGui::TableSetupColumn("KD"); + ImGui::TableSetupColumn("Win Rate"); + ImGui::TableSetupColumn("Level"); + ImGui::TableHeadersRow(); + + for (const auto &pair: SDK::clientInstance->getLocalPlayer()->getLevel()->getPlayerMap()) { + std::string name = Utils::removeNonAlphanumeric(Utils::removeColorCodes(pair.second.name)); + + auto it = std::find_if(playerStatsList.begin(), playerStatsList.end(), + [&name](const std::pair &element) { + return element.first == name; + }); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("%s", name.c_str()); + + ImGui::TableSetColumnIndex(1); + if (it != playerStatsList.end()) { + if( it->second.getCode() == 0) { + { + std::ostringstream oss; + oss << std::fixed << std::setprecision(2) << it->second.getFKDR(); + ImGui::Text("%s", oss.str().c_str()); + } + { + ImGui::TableSetColumnIndex(2); + std::ostringstream oss; + oss << std::fixed << std::setprecision(2) << it->second.getKD(); + ImGui::Text("%s", oss.str().c_str()); + } + { + ImGui::TableSetColumnIndex(3); + std::ostringstream oss; + oss << std::fixed << std::setprecision(0) << it->second.getWinRate(); + ImGui::Text("%s", oss.str().c_str()); + } + { + ImGui::TableSetColumnIndex(4); + std::ostringstream oss; + oss << std::fixed << std::setprecision(0) << it->second.getLevel(); + ImGui::Text("%s", oss.str().c_str()); + } + }else{ + switch (it->second.getCode()){ + case 1: + ImGui::Text("err"); + ImGui::TableSetColumnIndex(2); + ImGui::Text("nick?"); + ImGui::TableSetColumnIndex(3); + ImGui::Text("-"); + ImGui::TableSetColumnIndex(4); + ImGui::Text("-"); + case 2: + ImGui::Text("err"); + ImGui::TableSetColumnIndex(2); + ImGui::Text("missing data"); + ImGui::TableSetColumnIndex(3); + ImGui::Text("-"); + ImGui::TableSetColumnIndex(4); + ImGui::Text("-"); + } + } + } else { + std::unique_lock lock(queueMutex); + if (std::find(queueList.begin(), queueList.end(), name) == queueList.end()) { + queueList.push_back(name); + queueCondition.notify_one(); + } + ImGui::Text("Loading stats..."); + ImGui::TableSetColumnIndex(2); + ImGui::Text("-"); + ImGui::TableSetColumnIndex(3); + ImGui::Text("-"); + ImGui::TableSetColumnIndex(4); + ImGui::Text("-"); + } + } + + ImGui::EndTable(); + } + + ImGui::End(); + } + + + bool shoudReset = false; + + void onPacketReceive(PacketEvent &event) override { + if (SDK::getServerIP().find("hive") == std::string::npos) return; + MinecraftPacketIds id = event.getPacket()->getId(); + + if (shoudReset) { + if (id == MinecraftPacketIds::ChangeDimension) { + std::unique_lock lock(queueMutex); + playerStatsList.clear(); + queueList.clear(); + } + } else { + shoudReset = true; + } + } + + void onKey(KeyEvent &event) override { + + if (event.getKey() == Utils::getStringAsKey(module->settings.getSettingByName("Overlay")->value) && + static_cast(event.getAction()) == ActionType::Released) { + renderOverlay = !renderOverlay; + if(renderOverlay){ + playerStatsList.clear(); + queueList.clear(); + } + } + + } + +public: + explicit HiveStatListener(const char string[5], Module *module) { + this->name = string; + this->module = module; + fetchThread = std::thread(&HiveStatListener::workerThread, this); + } +}; \ No newline at end of file diff --git a/src/Utils/Hive.hpp b/src/Utils/Hive.hpp new file mode 100644 index 00000000..f9be9f29 --- /dev/null +++ b/src/Utils/Hive.hpp @@ -0,0 +1,551 @@ +#ifndef HIVE_STATS_HPP +#define HIVE_STATS_HPP + +#include +#include +#include +#include +#include "../Config/json/json.hpp" +#include "Logger/Logger.hpp" + +#pragma comment(lib, "wininet.lib") + + + + +const std::map xpToLevelBedWars = { + {0, 0}, + {150, 1}, + {450, 2}, + {900, 3}, + {1500, 4}, + {2250, 5}, + {3150, 6}, + {4200, 7}, + {5400, 8}, + {6750, 9}, + {8250, 10}, + {9900, 11}, + {11700, 12}, + {13650, 13}, + {15750, 14}, + {18000, 15}, + {20400, 16}, + {22950, 17}, + {25650, 18}, + {28500, 19}, + {31500, 20}, + {34650, 21}, + {37950, 22}, + {41400, 23}, + {45000, 24}, + {48750, 25}, + {52650, 26}, + {56700, 27}, + {60900, 28}, + {65250, 29}, + {69750, 30}, + {74400, 31}, + {79200, 32}, + {84150, 33}, + {89250, 34}, + {94500, 35}, + {99900, 36}, + {105450, 37}, + {111150, 38}, + {117000, 39}, + {123000, 40}, + {129150, 41}, + {135450, 42}, + {141900, 43}, + {148500, 44}, + {155250, 45}, + {162150, 46}, + {169200, 47}, + {176400, 48}, + {183750, 49} +}; + + +const std::map xpToLevelSkyWars = { + {0, 0}, + {150, 1}, + {450, 2}, + {900, 3}, + {1500, 4}, + {2250, 5}, + {3150, 6}, + {4200, 7}, + {5400, 8}, + {6750, 9}, + {8250, 10}, + {9900, 11}, + {11700, 12}, + {13650, 13}, + {15750, 14}, + {18000, 15}, + {20400, 16}, + {22950, 17}, + {25650, 18}, + {28500, 19}, + {31500, 20}, + {34650, 21}, + {37950, 22}, + {41400, 23}, + {45000, 24}, + {48750, 25}, + {52650, 26}, + {56700, 27}, + {60900, 28}, + {65250, 29}, + {69750, 30}, + {74400, 31}, + {79200, 32}, + {84150, 33}, + {89250, 34}, + {94500, 35}, + {99900, 36}, + {105450, 37}, + {111150, 38}, + {117000, 39}, + {123000, 40}, + {129150, 41}, + {135450, 42}, + {141900, 43}, + {148500, 44}, + {155250, 45}, + {162150, 46}, + {169200, 47}, + {176400, 48}, + {183750, 49}, + {191250, 50}, + {198900, 51}, + {206550, 52}, + {214200, 53}, + {221850, 54}, + {229500, 55}, + {237150, 56}, + {244800, 57}, + {252450, 58}, + {260100, 59}, + {267750, 60}, + {275400, 61}, + {283050, 62}, + {290700, 63}, + {298350, 64}, + {306000, 65}, + {313650, 66}, + {321300, 67}, + {328950, 68}, + {336600, 69}, + {344250, 70}, + {351900, 71}, + {359550, 72}, + {367200, 73}, + {374850, 74}, + {382500, 75}, + {390150, 76}, + {397800, 77}, + {405450, 78}, + {413100, 79}, + {420750, 80}, + {428400, 81}, + {436050, 82}, + {443700, 83}, + {451350, 84}, + {459000, 85}, + {466650, 86}, + {474300, 87}, + {481950, 88}, + {489600, 89}, + {497250, 90}, + {504900, 91}, + {512550, 92}, + {520200, 93}, + {527850, 94}, + {535500, 95}, + {543150, 96}, + {550800, 97}, + {558450, 98}, + {566100, 99} +}; + + +const std::map xpToLevelMurderMystery = { + {0, 0}, + {100, 1}, + {300, 2}, + {600, 3}, + {1000, 4}, + {1500, 5}, + {2100, 6}, + {2800, 7}, + {3600, 8}, + {4500, 9}, + {5500, 10}, + {6600, 11}, + {7800, 12}, + {9100, 13}, + {10500, 14}, + {12000, 15}, + {13600, 16}, + {15300, 17}, + {17100, 18}, + {19000, 19}, + {21000, 20}, + {23100, 21}, + {25300, 22}, + {27600, 23}, + {30000, 24}, + {32500, 25}, + {35100, 26}, + {37800, 27}, + {40600, 28}, + {43500, 29}, + {46500, 30}, + {49600, 31}, + {52800, 32}, + {56100, 33}, + {59500, 34}, + {63000, 35}, + {66600, 36}, + {70300, 37}, + {74100, 38}, + {78000, 39}, + {82000, 40}, + {86100, 41}, + {90300, 42}, + {94600, 43}, + {99000, 44}, + {103500, 45}, + {108100, 46}, + {112800, 47}, + {117600, 48}, + {122500, 49}, + {127500, 50}, + {132600, 51}, + {137800, 52}, + {143100, 53}, + {148500, 54}, + {154000, 55}, + {159600, 56}, + {165300, 57}, + {171100, 58}, + {177000, 59}, + {183000, 60}, + {189100, 61}, + {195300, 62}, + {201600, 63}, + {208000, 64}, + {214500, 65}, + {221100, 66}, + {227800, 67}, + {234600, 68}, + {241500, 69}, + {248500, 70}, + {255600, 71}, + {262800, 72}, + {270100, 73}, + {277500, 74}, + {285000, 75}, + {292600, 76}, + {300300, 77}, + {308100, 78}, + {316000, 79}, + {324000, 80}, + {332100, 81}, + {340200, 82}, + {348300, 83}, + {356400, 84}, + {364500, 85}, + {372600, 86}, + {380700, 87}, + {388800, 88}, + {396900, 89}, + {405000, 90}, + {413100, 91}, + {421200, 92}, + {429300, 93}, + {437400, 94}, + {445500, 95}, + {453600, 96}, + {461700, 97}, + {469800, 98}, + {477900, 99} +}; + +const std::map xpToLevelCTF = { + {0, 0}, + {150, 1}, + {450, 2}, + {900, 3}, + {1500, 4}, + {2250, 5}, + {3150, 6}, + {4200, 7}, + {5400, 8}, + {6750, 9}, + {8250, 10}, + {9900, 11}, + {11700, 12}, + {13650, 13}, + {15750, 14}, + {18000, 15}, + {20400, 16}, + {22950, 17}, + {25650, 18}, + {28500, 19}, + {31500, 20}, + {34650, 21}, + {37950, 22}, + {41400, 23}, + {45000, 24}, + {48750, 25}, + {52650, 26}, + {56700, 27}, + {60900, 28}, + {65250, 29}, + {69750, 30}, + {74400, 31}, + {79200, 32}, + {84150, 33}, + {89250, 34}, + {94500, 35}, + {99900, 36}, + {105450, 37}, + {111150, 38}, + {117000, 39}, + {123000, 40}, + {129150, 41}, + {135450, 42}, + {141900, 43}, + {148500, 44}, + {155250, 45}, + {162150, 46}, + {169200, 47}, + {176400, 48}, + {183750, 49} +}; + + + + +namespace Hive { + + class PlayerStats { + private: + float fkdr; + float kd; + float winRate; + int level; + int code = 0; + + public: + PlayerStats(float fkdr = 0.0f, float kd = 0.0f, float winRate = 0.0f) + : fkdr(fkdr), kd(kd), winRate(winRate) {} + + void setFKDR(double fkdrValue) { fkdr = fkdrValue; } + void setKD(double kdValue) { kd = kdValue; } + void setWinRate(double winRateValue) { winRate = winRateValue; } + void setCode(int codeValue){ code = codeValue; } + void setLevel(int levelValue){ level = levelValue; } + + float getFKDR() const { return fkdr; } + float getKD() const { return kd; } + float getWinRate() const { return winRate; } + int getLevel() const { return level; } + int getCode() const { return code; }; + }; + + double roundToSecond(float value) { + return std::round(value * 100.0f) / 100.0f; + } + + + + std::string GetString(const std::string &URL) { + HINTERNET interwebs = InternetOpenA("Samsung Smart Fridge", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL); + HINTERNET urlFile; + std::string rtn; + + if (interwebs) { + urlFile = InternetOpenUrlA(interwebs, URL.c_str(), NULL, NULL, NULL, NULL); + if (urlFile) { + char buffer[2000]; + DWORD bytesRead; + do { + InternetReadFile(urlFile, buffer, 2000, &bytesRead); + rtn.append(buffer, bytesRead); + memset(buffer, 0, 2000); + } while (bytesRead); + InternetCloseHandle(urlFile); + } + InternetCloseHandle(interwebs); + } + + return rtn; + } + + std::string replaceAll(std::string subject, const std::string &search, const std::string &replace) { + size_t pos = 0; + while ((pos = subject.find(search, pos)) != std::string::npos) { + subject.replace(pos, search.length(), replace); + pos += replace.length(); + } + return subject; + } + + + + + + ImVec4 calculateWinRateColor(float winrate){ + if(winrate < 25.0f ){ + return ImVec4(255.0f, 72.0f, 59.0f, 1.0f); + } + else if(winrate < 50.0f ){ + return ImVec4(251.0f, 255.0f, 38.0f, 1.0f); + }else { + return ImVec4(61.0f, 255.0f, 43.0f, 1.0f); + } + + } + + int getLevelForXP(int xp, const std::map& xpToLevel) { + auto it = xpToLevel.lower_bound(xp); + + if (it == xpToLevel.end()) { + return (--it)->second + 1; + } + + if (it == xpToLevel.begin()) { + return it->second + 1; + } + + if (it->first == xp) { + return it->second + 1; + } + + auto prev = std::prev(it); + return prev->second + 1; + } + + + + + + Hive::PlayerStats GetStats(const std::string &gameId, const std::string &username) { + + PlayerStats stats; + + try { + std::string url = "https://api.playhive.com/v0/game/all/" + gameId + "/" + username; + std::string jsonResponse = GetString(url); + + + nlohmann::json jsonData = nlohmann::json::parse(jsonResponse); + + Logger::info(jsonResponse); + if(!jsonData.contains("first_played")){ + stats.setCode(1); + return stats; + } + + if(gameId == "bed") { + if(!jsonData.contains("final_kills") || !jsonData.contains("kills") || !jsonData.contains("deaths") || !jsonData.contains("victories") || !jsonData.contains("played") || !jsonData.contains("xp") || !jsonData.contains("beds_destroyed")){ + stats.setCode(2); + return stats; + } + int finalKills = jsonData["final_kills"].get(); + int xp = jsonData["xp"].get(); + int kills = jsonData["kills"].get(); + int deaths = jsonData["deaths"].get(); + int victories = jsonData["victories"].get(); + int played = jsonData["played"].get(); + + int finalDeaths = played - victories; + + + stats.setFKDR(roundToSecond((float) finalKills / (float) finalDeaths)); + stats.setKD(roundToSecond((float) kills / (float) deaths)); + stats.setWinRate(std::round(((float) victories / (float) played) * 100.0f)); + stats.setLevel(getLevelForXP(xp, xpToLevelBedWars)); + } + + if(gameId == "sky") { + + + if(!jsonData.contains("kills") || !jsonData.contains("deaths") || !jsonData.contains("victories") || !jsonData.contains("played") || !jsonData.contains("xp")){ + stats.setCode(2); + return stats; + } + + int kills = jsonData["kills"].get(); + int deaths = jsonData["deaths"].get(); + int victories = jsonData["victories"].get(); + int played = jsonData["played"].get(); + int xp = jsonData["xp"].get(); + + + stats.setFKDR(roundToSecond((float) -1.f)); + stats.setKD(roundToSecond((float) kills / (float) deaths)); + stats.setWinRate(std::round(((float) victories / (float) played) * 100.0f)); + stats.setLevel(getLevelForXP(xp, xpToLevelSkyWars)); + } + if(gameId == "murder") { + if(!jsonData.contains("murders") || !jsonData.contains("murderer_eliminations") || !jsonData.contains("deaths") || !jsonData.contains("victories") || !jsonData.contains("played") || !jsonData.contains("xp")){ + stats.setCode(2); + return stats; + } + + int murders = jsonData["murders"].get(); + int eliminations = jsonData["murderer_eliminations"].get(); + int deaths = jsonData["deaths"].get(); + int victories = jsonData["victories"].get(); + int played = jsonData["played"].get(); + int xp = jsonData["xp"].get(); + + stats.setFKDR(roundToSecond(-1.0f)); + + stats.setKD(roundToSecond((float) murders / (float) deaths)); + + stats.setWinRate(std::round(((float) victories / (float) played) * 100.0f)); + + stats.setLevel(getLevelForXP(xp, xpToLevelMurderMystery)); + } + + + if(gameId == "ctf") { + if(!jsonData.contains("kills") || !jsonData.contains("deaths") || !jsonData.contains("victories") || !jsonData.contains("played") || !jsonData.contains("xp") || !jsonData.contains("flags_captured") || !jsonData.contains("flags_returned")){ + stats.setCode(2); + return stats; + } + + int kills = jsonData["kills"].get(); + int deaths = jsonData["deaths"].get(); + int victories = jsonData["victories"].get(); + int played = jsonData["played"].get(); + int xp = jsonData["xp"].get(); + int flagsCaptured = jsonData["flags_captured"].get(); + int flagsReturned = jsonData["flags_returned"].get(); + int assists = jsonData["assists"].get(); + + stats.setKD(roundToSecond((float) kills / (float) deaths)); + + stats.setFKDR(roundToSecond(-1.0f)); + + stats.setWinRate(std::round(((float) victories / (float) played) * 100.0f)); + + stats.setLevel(getLevelForXP(xp, xpToLevelCTF)); + } + + + return stats; + } catch (...) { + return stats; + } + } + +} + +#endif \ No newline at end of file diff --git a/src/Utils/Memory/Memory.hpp b/src/Utils/Memory/Memory.hpp index 24ea3aec..bb5c0760 100644 --- a/src/Utils/Memory/Memory.hpp +++ b/src/Utils/Memory/Memory.hpp @@ -185,4 +185,8 @@ class Memory { static uintptr_t GetAddressByIndex(uintptr_t vtable, int index) { return *reinterpret_cast(vtable + 8 * index); } + static void SetProtection(uintptr_t addr, size_t size, DWORD protect) { + DWORD oldProtect; + VirtualProtect((LPVOID)addr, size, protect, &oldProtect); + } }; From ade70817e4133bb58ab9f7055c71395bcf22aefd Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:10:17 +0600 Subject: [PATCH 186/240] keystrokes finished --- .../Module/Modules/Keystrokes/Keystrokes.hpp | 257 +++--------------- 1 file changed, 35 insertions(+), 222 deletions(-) diff --git a/src/Client/Module/Modules/Keystrokes/Keystrokes.hpp b/src/Client/Module/Modules/Keystrokes/Keystrokes.hpp index 721fbe16..7614ae74 100644 --- a/src/Client/Module/Modules/Keystrokes/Keystrokes.hpp +++ b/src/Client/Module/Modules/Keystrokes/Keystrokes.hpp @@ -140,243 +140,56 @@ class Keystrokes : public Module { } void settingsRender() override { - /* Border Start */ - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, - this->settings.getSettingByName("uiscale")->value, 2.0f); - - this->settings.getSettingByName("uiscale")->value = percent; - - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(6, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, - this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Show CPS", - textWidth * 6.9f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(2, toggleX, toggleY, - this->settings.getSettingByName("cps")->value)) - this->settings.getSettingByName("cps")->value = !this->settings.getSettingByName( - "cps")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"WASD Text Scale", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("WASD Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); - - - this->settings.getSettingByName("textscale")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"CPS Text Scale", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(12, toggleX + FlarialGUI::SettingsTextWidth("CPS Text Scale "), - toggleY, this->settings.getSettingByName("textscale2")->value, 2.00); - - - this->settings.getSettingByName("textscale2")->value = percent; - - /* Rounding End */ - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Space bar width", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(9, toggleX + FlarialGUI::SettingsTextWidth("Space bar width "), - toggleY, this->settings.getSettingByName("spacebarWidth")->value, 1.00, 0, - false); - - this->settings.getSettingByName("spacebarWidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Space bar height", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(10, toggleX + FlarialGUI::SettingsTextWidth("Space bar height "), - toggleY, this->settings.getSettingByName("spacebarHeight")->value, 1.00, 0, - false); - - this->settings.getSettingByName("spacebarHeight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Key Spacing", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(11, toggleX + FlarialGUI::SettingsTextWidth("Key Spacing "), - toggleY, this->settings.getSettingByName("keySpacing")->value, 10.00); - - this->settings.getSettingByName("keySpacing")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"\"LMB\" and \"RMB\"", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(10, toggleX, toggleY, this->settings.getSettingByName( - "lmbrmb")->value)) - this->settings.getSettingByName("lmbrmb")->value = !this->settings.getSettingByName( - "lmbrmb")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Hide CPS", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(5, toggleX, toggleY, this->settings.getSettingByName( - "hidecps")->value)) - this->settings.getSettingByName("hidecps")->value = !this->settings.getSettingByName( - "hidecps")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(4, settings.getSettingByName("lmbtext")->value, 16, toggleX, toggleY, - "LMB Text"); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(5, settings.getSettingByName("rmbtext")->value, 16, toggleX, toggleY, - "RMB Text"); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(6, settings.getSettingByName("wText")->value, 1, toggleX, toggleY, - "W Key"); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(7, settings.getSettingByName("aText")->value, 1, toggleX, toggleY, - "A Key"); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(8, settings.getSettingByName("sText")->value, 1, toggleX, toggleY, - "S Key"); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(9, settings.getSettingByName("dText")->value, 1, toggleX, toggleY, - "D Key"); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); - /* Color picker start */ - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); + this->addHeader("Main"); + this->addSlider("UI Scale", "The Size of Tablist", this->settings.getSettingByName("uiscale")->value, 1.25f); + this->addSlider("Rounding", "", this->settings.getSettingByName("rounding")->value); + this->addSlider("Key Spacing", "", this->settings.getSettingByName("keySpacing")->value, 10.00); + this->addSlider("Spacebar Width", "", this->settings.getSettingByName("spacebarWidth")->value, 1.00, 0,false); + this->addSlider("Spacebar Height", "", this->settings.getSettingByName("spacebarHeight")->value, 1.00, 0,false); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); + this->extraPadding(); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addHeader("Mouse Buttons"); + this->addToggle("Show Mouse Buttons", "LMB & RMB", this->settings.getSettingByName("cps")->value); + this->addConditionalSlider(this->settings.getSettingByName("cps")->value, "CPS Text Scale", "", this->settings.getSettingByName("textscale2")->value, 2.00); + this->addToggle("Show LMB & RMB", "", this->settings.getSettingByName("lmbrmb")->value); + this->addToggle("Hide CPS Counter", "", this->settings.getSettingByName("hidecps")->value); + this->addTextBox("LMB Text", "",settings.getSettingByName("lmbtext")->value); + this->addTextBox("RMB Text", "",settings.getSettingByName("rmbtext")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); + this->extraPadding(); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addHeader("WASD"); + this->addSlider("WASD Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.00); + this->addTextBox("W Key", "", settings.getSettingByName("wText")->value); + this->addTextBox("A Key", "", settings.getSettingByName("aText")->value); + this->addTextBox("S Key", "", settings.getSettingByName("sText")->value); + this->addTextBox("D Key", "", settings.getSettingByName("dText")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"BG Pressed", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("BG Pressed "), toggleY * 0.99f, - settings.getSettingByName("enabledColor")->value, - settings.getSettingByName("enabledRGB")->value); + this->extraPadding(); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addHeader("Colors"); + this->addColorPicker("Background Disabled", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Background Enabled", "", settings.getSettingByName("enabledColor")->value, settings.getSettingByName("enabledOpacity")->value, settings.getSettingByName("enabledRGB")->value); + this->addColorPicker("Text Disabled", "", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); + this->addColorPicker("Text Enabled", "", settings.getSettingByName("textEnabledColor")->value, settings.getSettingByName("textEnabledOpacity")->value, settings.getSettingByName("textEnabledRGB")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Pressed", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(3, toggleX + FlarialGUI::SettingsTextWidth("Text Pressed "), toggleY * 0.99f, - settings.getSettingByName("textEnabledColor")->value, - settings.getSettingByName("textEnabledRGB")->value); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("enabledColor")->value, - settings.getSettingByName("enabledOpacity")->value, - settings.getSettingByName("enabledRGB")->value); - FlarialGUI::ColorPickerWindow(3, settings.getSettingByName("textEnabledColor")->value, - settings.getSettingByName("textEnabledOpacity")->value, - settings.getSettingByName("textEnabledRGB")->value); - /* Color Pickers End */ + this->resetPadding(); } From 5f2f4fabf236cae1051532d40094bd568650a177 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:18:02 +0600 Subject: [PATCH 187/240] zoom finished --- .../Modules/CommandHotkey/CommandHotkey.hpp | 2 +- .../Module/Modules/Freelook/Freelook.hpp | 2 +- .../Module/Modules/SnapLook/SnapLook.hpp | 2 +- src/Client/Module/Modules/Sneak/Sneak.hpp | 2 +- src/Client/Module/Modules/TabList/TabList.hpp | 2 +- src/Client/Module/Modules/Zoom/Zoom.hpp | 141 +++--------------- 6 files changed, 28 insertions(+), 123 deletions(-) diff --git a/src/Client/Module/Modules/CommandHotkey/CommandHotkey.hpp b/src/Client/Module/Modules/CommandHotkey/CommandHotkey.hpp index 017e2e84..10783572 100644 --- a/src/Client/Module/Modules/CommandHotkey/CommandHotkey.hpp +++ b/src/Client/Module/Modules/CommandHotkey/CommandHotkey.hpp @@ -47,7 +47,7 @@ class CommandHotkey : public Module { Constraints::RelativeConstraint(0.88f, "height")); this->addHeader("Misc"); - this->addKeybind("Command Keybind", "", getKeybind()); + this->addKeybind("Command Keybind", "Hold for 2 seconds!", getKeybind()); this->addTextBox("Command to Send", "No need for /", settings.getSettingByName("command")->value); FlarialGUI::UnsetScrollView(); diff --git a/src/Client/Module/Modules/Freelook/Freelook.hpp b/src/Client/Module/Modules/Freelook/Freelook.hpp index 82dbecf4..5ab734c0 100644 --- a/src/Client/Module/Modules/Freelook/Freelook.hpp +++ b/src/Client/Module/Modules/Freelook/Freelook.hpp @@ -51,7 +51,7 @@ class FreeLook : public Module { Constraints::RelativeConstraint(0.88f, "height")); this->addHeader("Misc"); - this->addKeybind("Freelook Keybind", "", getKeybind()); + this->addKeybind("Freelook Keybind", "Hold for 2 seconds!", getKeybind()); this->addToggle("Toggleable Mode", "Click to toggle or Hold to keep enabled", this->settings.getSettingByName("toggle")->value); diff --git a/src/Client/Module/Modules/SnapLook/SnapLook.hpp b/src/Client/Module/Modules/SnapLook/SnapLook.hpp index e3604bda..db3a49a1 100644 --- a/src/Client/Module/Modules/SnapLook/SnapLook.hpp +++ b/src/Client/Module/Modules/SnapLook/SnapLook.hpp @@ -41,7 +41,7 @@ class SnapLook : public Module { Constraints::RelativeConstraint(0.88f, "height")); this->addHeader("Misc"); - this->addKeybind("Keybind", "", getKeybind()); + this->addKeybind("Keybind", "Hold for 2 seconds!", getKeybind()); FlarialGUI::UnsetScrollView(); diff --git a/src/Client/Module/Modules/Sneak/Sneak.hpp b/src/Client/Module/Modules/Sneak/Sneak.hpp index 5f80ae42..7386be2d 100644 --- a/src/Client/Module/Modules/Sneak/Sneak.hpp +++ b/src/Client/Module/Modules/Sneak/Sneak.hpp @@ -50,7 +50,7 @@ class Sneak : public Module { Constraints::RelativeConstraint(0.88f, "height")); this->addHeader("Misc"); - this->addKeybind("Keybind", "", getKeybind()); + this->addKeybind("Keybind", "Hold for 2 seconds!", getKeybind()); FlarialGUI::UnsetScrollView(); diff --git a/src/Client/Module/Modules/TabList/TabList.hpp b/src/Client/Module/Modules/TabList/TabList.hpp index 74c1603c..826fb3c3 100644 --- a/src/Client/Module/Modules/TabList/TabList.hpp +++ b/src/Client/Module/Modules/TabList/TabList.hpp @@ -98,7 +98,7 @@ class TabList : public Module { this->addHeader("Misc"); this->addToggle("Alphabetical Order", "", this->settings.getSettingByName("alphaOrder")->value); - this->addKeybind("Keybind", "", getKeybind()); + this->addKeybind("Keybind", "Hold for 2 seconds!", getKeybind()); this->extraPadding(); diff --git a/src/Client/Module/Modules/Zoom/Zoom.hpp b/src/Client/Module/Modules/Zoom/Zoom.hpp index 7976a444..11db713e 100644 --- a/src/Client/Module/Modules/Zoom/Zoom.hpp +++ b/src/Client/Module/Modules/Zoom/Zoom.hpp @@ -41,128 +41,33 @@ class Zoom : public Module { void settingsRender() override { - float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); + + + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); - - FlarialGUI::KeybindSelector(0, toggleX, toggleY, getKeybind()); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Modifier", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - - float percent = FlarialGUI::Slider(7, toggleX + FlarialGUI::SettingsTextWidth("Modifier "), - toggleY, this->settings.getSettingByName("modifier")->value, 30, 0, - false); - - this->settings.getSettingByName("modifier")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - textWidth *= 1.5f; - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Animation Speed", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Animation Speed "), - toggleY, this->settings.getSettingByName("anim")->value, 0.40); - - this->settings.getSettingByName("anim")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.25, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.38, textWidth), toggleY, - L"Save Modifier", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(1, toggleX, toggleY, this->settings.getSettingByName( - "SaveModifier")->value)) - this->settings.getSettingByName("SaveModifier")->value = !this->settings.getSettingByName( - "SaveModifier")->value; - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Hide hand", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(2, toggleX, toggleY, this->settings.getSettingByName( - "hidehand")->value)) - this->settings.getSettingByName("hidehand")->value = !this->settings.getSettingByName( - "hidehand")->value; - -// toggleY += Constraints::SpacingConstraint(0.25, textWidth); -// -// FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, -// L"Hide hud", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, -// Constraints::RelativeConstraint(0.12, "height", true), -// DWRITE_FONT_WEIGHT_NORMAL); -// if (FlarialGUI::Toggle(3, toggleX, toggleY, this->settings.getSettingByName( -// "hidehud")->value)) -// this->settings.getSettingByName("hidehud")->value = !this->settings.getSettingByName( -// "hidehud")->value; - - toggleY += Constraints::SpacingConstraint(0.25, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Hide modules", textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "hidemodules")->value)) - this->settings.getSettingByName("hidemodules")->value = !this->settings.getSettingByName( - "hidemodules")->value; - - toggleY += Constraints::SpacingConstraint(0.25, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Disable animation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(5, toggleX, toggleY, this->settings.getSettingByName( - "disableanim")->value)) - this->settings.getSettingByName("disableanim")->value = !this->settings.getSettingByName( - "disableanim")->value; - - toggleY += Constraints::SpacingConstraint(0.25, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Always animate", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(6, toggleX, toggleY, this->settings.getSettingByName( - "alwaysanim")->value)) - this->settings.getSettingByName("alwaysanim")->value = !this->settings.getSettingByName( - "alwaysanim")->value; - toggleY += Constraints::SpacingConstraint(0.25, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Use Scroll", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(7, toggleX, toggleY, this->settings.getSettingByName( - "UseScroll")->value)) - this->settings.getSettingByName("UseScroll")->value = !this->settings.getSettingByName( - "UseScroll")->value; + Constraints::RelativeConstraint(0.88f, "height")); + + + this->addHeader("Main"); + this->addKeybind("Keybind", "Hold for 2 seconds!", getKeybind()); + this->addToggle("Use Scroll", "Allows to adjust zoom with scroll wheel.", this->settings.getSettingByName("UseScroll")->value); + this->addSlider("Modifier", "How much to Zoom each time you scroll.", this->settings.getSettingByName("modifier")->value, 30, 0,false); + this->addToggle("Disable Animation", "The animation when you zoom", this->settings.getSettingByName("disableanim")->value); + this->addSlider("Animation Speed", "Speed at which scroll zoom acts.", this->settings.getSettingByName("anim")->value, 0.40); + this->addToggle("Save Modifier", "Saves the last zoom amount.", this->settings.getSettingByName("SaveModifier")->value); + this->addToggle("Hide Hand", "Hide hand when zooming.", this->settings.getSettingByName("hidehand")->value); + this->addToggle("Hide Modules", "Hides other modules when zooming.", this->settings.getSettingByName("hidemodules")->value); + this->addToggle("Always Animate", "idk what this does tbh", this->settings.getSettingByName("alwaysanim")->value); + + FlarialGUI::UnsetScrollView(); + this->resetPadding(); } }; From ca78674386609136fa96fab8251749e4d43ab11f Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:21:28 +0600 Subject: [PATCH 188/240] sprint finished --- src/Client/Module/Modules/Sprint/Sprint.hpp | 303 +++----------------- 1 file changed, 42 insertions(+), 261 deletions(-) diff --git a/src/Client/Module/Modules/Sprint/Sprint.hpp b/src/Client/Module/Modules/Sprint/Sprint.hpp index cb3d86aa..35e26098 100644 --- a/src/Client/Module/Modules/Sprint/Sprint.hpp +++ b/src/Client/Module/Modules/Sprint/Sprint.hpp @@ -40,290 +40,71 @@ class Sprint : public Module { } } - void settingsRender() override { - /* Border Start */ + void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"UI Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - float percent = FlarialGUI::Slider(4, toggleX + FlarialGUI::SettingsTextWidth("UI Scale "), - toggleY, this->settings.getSettingByName("uiscale")->value, 2.0f); - - this->settings.getSettingByName("uiscale")->value = percent; - - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "border")->value)) - this->settings.getSettingByName("border")->value = !this->settings.getSettingByName( - "border")->value; - - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, L"Border", - textWidth * 3.0f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - - percent = FlarialGUI::Slider(5, toggleX + Constraints::SpacingConstraint(0.60, textWidth) + - FlarialGUI::SettingsTextWidth("Border "), - toggleY, this->settings.getSettingByName("borderWidth")->value, 4); - - this->settings.getSettingByName("borderWidth")->value = percent; - - - /* Border End */ - - /* Rounding Start */ - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rounding", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(6, toggleX + FlarialGUI::SettingsTextWidth("Rounding "), - toggleY, this->settings.getSettingByName("rounding")->value); - - this->settings.getSettingByName("rounding")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::KeybindSelector(0, toggleX, toggleY, getKeybind()); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Always Sprint", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(2, toggleX, toggleY, this->settings.getSettingByName( - "always")->value)) - this->settings.getSettingByName("always")->value = !this->settings.getSettingByName( - "always")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Toggle Status", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(5, toggleX, toggleY, this->settings.getSettingByName( - "status")->value)) - this->settings.getSettingByName("status")->value = !this->settings.getSettingByName( - "status")->value; - - - - /* Rounding End */ - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Translucency", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "BlurEffect")->value)) - this->settings.getSettingByName("BlurEffect")->value = !this->settings.getSettingByName( - "BlurEffect")->value; + Constraints::RelativeConstraint(0.88f, "height")); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::TextBoxVisual(7, settings.getSettingByName("text")->value, 16, toggleX, toggleY); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addHeader("Sprint Function"); + this->addToggle("Always Sprint", "Also known as auto sprint", this->settings.getSettingByName("always")->value); + this->addToggle("Show Status", "", this->settings.getSettingByName("status")->value); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text Scale", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); + this->extraPadding(); - percent = FlarialGUI::Slider(8, toggleX + FlarialGUI::SettingsTextWidth("Text Scale "), - toggleY, this->settings.getSettingByName("textscale")->value, 2.00); + this->addHeader("Main"); + this->addSlider("UI Scale", "", this->settings.getSettingByName("uiscale")->value, 2.0f); + this->addToggle("Border", "", this->settings.getSettingByName( + "border")->value); + this->addConditionalSlider(this->settings.getSettingByName( + "border")->value, "Border Thickness", "", this->settings.getSettingByName("borderWidth")->value, 4.f); + this->addSlider("Rounding", "Rounding of the rectangle", this->settings.getSettingByName("rounding")->value); - this->settings.getSettingByName("textscale")->value = percent; + this->extraPadding(); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addHeader("Text"); + this->addTextBox("Format", "", settings.getSettingByName("text")->value); + this->addSlider("Text Scale", "", this->settings.getSettingByName("textscale")->value, 2.0f); + this->addDropdown("Text Alignment", "", std::vector{"Left", "Center", "Right"}, this->settings.getSettingByName("textalignment")->value); + this->addColorPicker("Color", "Text Color", settings.getSettingByName("textColor")->value, settings.getSettingByName("textOpacity")->value, settings.getSettingByName("textRGB")->value); + this->extraPadding(); - std::string txtAlignment = FlarialGUI::Dropdown(1, - toggleX, toggleY, - std::vector{"Left", "Center", "Right"}, - this->settings.getSettingByName( - "textalignment")->value, - "Text Alignment" - ); + this->addHeader("Colors"); + this->addColorPicker("Background Color", "", settings.getSettingByName("bgColor")->value, settings.getSettingByName("bgOpacity")->value, settings.getSettingByName("bgRGB")->value); + this->addColorPicker("Border Color", "", settings.getSettingByName("borderColor")->value, settings.getSettingByName("borderOpacity")->value, settings.getSettingByName("borderRGB")->value); - this->settings.getSettingByName("textalignment")->value = txtAlignment; + this->extraPadding(); - FlarialGUI::SetIsInAdditionalYMode(); + this->addHeader("Misc Customizations"); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addToggle("Reverse Padding X", "For Text Position", this->settings.getSettingByName( + "reversepaddingx")->value); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding X", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); + this->addToggle("Reverse Padding Y", "For Text Position", this->settings.getSettingByName( + "reversepaddingy")->value); - if (FlarialGUI::Toggle(15, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingx")->value)) - this->settings.getSettingByName("reversepaddingx")->value = !this->settings.getSettingByName( - "reversepaddingx")->value; + this->addSlider("Padding X", "For Text Position", this->settings.getSettingByName("padx")->value); + this->addSlider("Padding Y", "For Text Position", this->settings.getSettingByName("pady")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addSlider("Rectangle Width", "", this->settings.getSettingByName("rectwidth")->value); + this->addSlider("Rectangle Height", "", this->settings.getSettingByName("rectheight")->value); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Reverse Padding Y", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); + this->addToggle("Responsive Rectangle", "Rectangle resizes with text", this->settings.getSettingByName( +"responsivewidth")->value); - if (FlarialGUI::Toggle(16, toggleX, toggleY, this->settings.getSettingByName( - "reversepaddingy")->value)) - this->settings.getSettingByName("reversepaddingy")->value = !this->settings.getSettingByName( - "reversepaddingy")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding X", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(15, toggleX + FlarialGUI::SettingsTextWidth("Padding X "), - toggleY, this->settings.getSettingByName("padx")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("padx")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Padding Y", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(16, toggleX + FlarialGUI::SettingsTextWidth("Padding Y "), - toggleY, this->settings.getSettingByName("pady")->value, 0.53f, 0.0f, - false); - - this->settings.getSettingByName("pady")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Width", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(17, toggleX + FlarialGUI::SettingsTextWidth("Rect Width "), - toggleY, this->settings.getSettingByName("rectwidth")->value, 3.0f); - - this->settings.getSettingByName("rectwidth")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rect Height", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - - percent = FlarialGUI::Slider(18, toggleX + FlarialGUI::SettingsTextWidth("Rect Height "), - toggleY, this->settings.getSettingByName("rectheight")->value, 3.0f); - - this->settings.getSettingByName("rectheight")->value = percent; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Responsive Rectangle (Moves with the Text)", - textWidth * 5.f, textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(17, toggleX, toggleY, this->settings.getSettingByName( - "responsivewidth")->value)) - this->settings.getSettingByName("responsivewidth")->value = !this->settings.getSettingByName( - "responsivewidth")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Rotation", textWidth * 3.0f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::RelativeConstraint(0.12, "height", true), - DWRITE_FONT_WEIGHT_NORMAL); - percent = FlarialGUI::Slider(19, toggleX + FlarialGUI::SettingsTextWidth("Rotation "), - toggleY, this->settings.getSettingByName("rotation")->value, 359.0f, 0.0f, - false); - - this->settings.getSettingByName("rotation")->value = percent; - - FlarialGUI::UnSetIsInAdditionalYMode(); - - /* Color Pickers Start*/ - - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Background", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(0, toggleX + FlarialGUI::SettingsTextWidth("Background "), - toggleY - Constraints::SpacingConstraint(0.017, textWidth), - settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Text", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(1, toggleX + FlarialGUI::SettingsTextWidth("Text "), toggleY * 0.99f, - settings.getSettingByName("textColor")->value, - settings.getSettingByName("textRGB")->value); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX, toggleY, L"Border", textWidth * 6.9f, - textHeight, DWRITE_TEXT_ALIGNMENT_LEADING, - Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - FlarialGUI::ColorPicker(2, toggleX + FlarialGUI::SettingsTextWidth("Border "), toggleY * 0.99f, - settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderRGB")->value); + this->addSlider("Rotation", "see for yourself!", this->settings.getSettingByName("rotation")->value, 360.f, 0, false); FlarialGUI::UnsetScrollView(); - - FlarialGUI::ColorPickerWindow(0, settings.getSettingByName("bgColor")->value, - settings.getSettingByName("bgOpacity")->value, - settings.getSettingByName("bgRGB")->value); - FlarialGUI::ColorPickerWindow(1, settings.getSettingByName("textColor")->value, - settings.getSettingByName("textOpacity")->value, - settings.getSettingByName("textRGB")->value); - FlarialGUI::ColorPickerWindow(2, settings.getSettingByName("borderColor")->value, - settings.getSettingByName("borderOpacity")->value, - settings.getSettingByName("borderRGB")->value); - /* Color Pickers End */ - + this->resetPadding(); } }; From 06a05c72007028eaba3f68a2e7dc7c15dfd1298c Mon Sep 17 00:00:00 2001 From: marioCST <68396929+marioCST@users.noreply.github.com> Date: Thu, 17 Oct 2024 13:38:22 +0200 Subject: [PATCH 189/240] Logo in Nametag and Tablist stuff With help from FreezeEngine --- main.cpp | 66 ++++----- src/Assets/Assets.hpp | 8 +- src/Assets/Assets.rc | 6 + src/Assets/Data/cyan-logo.png | Bin 0 -> 7249 bytes src/Assets/Data/purple-logo.png | Bin 0 -> 6991 bytes src/Assets/Data/red-logo.png | Bin 0 -> 7132 bytes src/Assets/Data/white-logo.png | Bin 0 -> 1888 bytes src/Assets/Data/yellow-logo.png | Bin 0 -> 6991 bytes src/Client/Client.cpp | 34 ++++- src/Client/Client.hpp | 4 + src/Client/GUI/Engine/Engine.cpp | 32 +++++ src/Client/GUI/Engine/Engine.hpp | 2 + .../BaseActorRendererRenderTextHook.hpp | 136 ++++++++++++++++++ src/Client/Hook/Manager.cpp | 2 + src/Client/Module/Manager.cpp | 5 - src/Client/Module/Manager.hpp | 6 - src/SDK/Client/Actor/Actor.cpp | 8 +- .../Bedrock/EnableNonOwnerReferences.hpp | 17 +++ src/SDK/Client/Core/ClientInstance.hpp | 6 + src/SDK/Client/Core/MinecraftGame.hpp | 5 +- src/SDK/Client/Render/Camera.hpp | 15 ++ src/SDK/Client/Render/Font.cpp | 14 ++ src/SDK/Client/Render/Font.hpp | 9 ++ src/SDK/Client/Render/MatrixStack.cpp | 16 +++ src/SDK/Client/Render/MatrixStack.hpp | 19 +++ src/SDK/Client/Render/NameTagRenderObject.hpp | 9 ++ .../Client/Render/Tessellator/MeshHelpers.cpp | 16 +++ .../Client/Render/Tessellator/MeshHelpers.hpp | 2 + .../Client/Render/Tessellator/Tessellator.hpp | 6 + src/SDK/Client/Render/TextureGroup.hpp | 6 +- src/SDK/Client/Render/TextureGroupBase.hpp | 11 ++ src/SDK/Client/Render/ViewRenderData.hpp | 9 ++ src/SDK/Client/Util/MathUtility.cpp | 9 ++ src/SDK/Client/Util/MathUtility.hpp | 10 ++ src/Utils/Memory/Game/Offset/OffsetInit.cpp | 19 +++ src/Utils/Memory/Game/Sig/SigInit.cpp | 10 ++ src/Utils/Render/MaterialUtils.cpp | 8 ++ src/Utils/Render/MaterialUtils.hpp | 1 + src/Utils/Utils.hpp | 10 +- src/Utils/Versions/WinrtUtils.cpp | 2 +- 40 files changed, 480 insertions(+), 58 deletions(-) create mode 100644 src/Assets/Data/cyan-logo.png create mode 100644 src/Assets/Data/purple-logo.png create mode 100644 src/Assets/Data/red-logo.png create mode 100644 src/Assets/Data/white-logo.png create mode 100644 src/Assets/Data/yellow-logo.png create mode 100644 src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp create mode 100644 src/SDK/Client/Bedrock/EnableNonOwnerReferences.hpp create mode 100644 src/SDK/Client/Render/Camera.hpp create mode 100644 src/SDK/Client/Render/Font.cpp create mode 100644 src/SDK/Client/Render/Font.hpp create mode 100644 src/SDK/Client/Render/MatrixStack.cpp create mode 100644 src/SDK/Client/Render/MatrixStack.hpp create mode 100644 src/SDK/Client/Render/NameTagRenderObject.hpp create mode 100644 src/SDK/Client/Render/TextureGroupBase.hpp create mode 100644 src/SDK/Client/Render/ViewRenderData.hpp create mode 100644 src/SDK/Client/Util/MathUtility.cpp create mode 100644 src/SDK/Client/Util/MathUtility.hpp diff --git a/main.cpp b/main.cpp index b3ac9612..7ab53b77 100644 --- a/main.cpp +++ b/main.cpp @@ -14,6 +14,7 @@ #include "src/Utils/Logger/crashlogs.hpp" std::chrono::steady_clock::time_point lastBeatTime; +std::chrono::steady_clock::time_point lastOnlineUsersFetchTime; std::string replaceAll(std::string subject, const std::string& search, const std::string& replace); @@ -22,6 +23,13 @@ std::string DownloadString(std::string URL); std::string removeColorCodes(const std::string& input); +void printVector(const std::vector& vec) { + for (const auto& str : vec) { + std::cout << str << std::endl; + } +} + + DWORD WINAPI init(HMODULE real) { #ifndef NDEBUG @@ -43,6 +51,7 @@ DWORD WINAPI init(HMODULE real) auto now = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast(now - lastBeatTime); + auto onlineUsersFetchElapsed = std::chrono::duration_cast(now - lastOnlineUsersFetchTime); if(!Client::disable) { if(SDK::hasInstanced && SDK::clientInstance != nullptr) { @@ -50,40 +59,6 @@ DWORD WINAPI init(HMODULE real) if(elapsed >= std::chrono::seconds(60)) { std::string name = SDK::clientInstance->getLocalPlayer()->getPlayerName(); - - ModuleManager::onlineUsers.clear(); - ModuleManager::onlineUsers.push_back(Utils::removeColorCodes(name)); - std::string pp = DownloadString("https://api.flarial.synthetix.host/users"); - - json playersDict; - - try { - playersDict = json::parse(pp); - } catch (const json::parse_error& e) { - Logger::error(e.what()); - lastBeatTime = now; - continue; - } - - int totalPlaytime = 0; - int numberOfPlayers = 0; - - for (const auto& player : playersDict.items()) { - try { - if (!player.value().contains("lastbeat") || !player.value()["lastbeat"].is_number()) { - std::cerr << "Invalid or missing 'lastbeat' for player: " << player.key() << std::endl; - continue; - } - - std::string name2 = Utils::removeNonAlphanumeric(player.key()); - name2 = replaceAll(name2, "�", ""); - ModuleManager::onlineUsers.push_back(name2); - } catch (const std::exception& e) { - std::cerr << "Error processing player: " << player.key() << " - " << e.what() << std::endl; - continue; - } - } - std::string ipToSend = SDK::getServerIP(); if (!Client::settings.getSettingByName("anonymousApi")->value) { @@ -104,14 +79,32 @@ DWORD WINAPI init(HMODULE real) } std::string clearedName = Utils::removeNonAlphanumeric(Utils::removeColorCodes(name)); if (clearedName.empty()) clearedName = Utils::removeColorCodes(name); + if(clearedName == "skinStandardCust") return; // send thing - std::cout << DownloadString( + DownloadString( std::format("https://api.flarial.synthetix.host/heartbeat/{}/{}", clearedName, - ipToSend)) << std::endl; + ipToSend)); lastBeatTime = now; } } + if(onlineUsersFetchElapsed >= std::chrono::minutes(3)) { + + auto onlineUsersRaw = DownloadString("https://api.flarial.synthetix.host/servers"); + + nlohmann::json playersDict; + + try { + playersDict = nlohmann::json::parse(onlineUsersRaw); + Client::onlinePlayers = Client::getPlayersVector(playersDict); + } catch (const json::parse_error& e) { + Logger::error(e.what()); + lastOnlineUsersFetchTime = now; + continue; + } + + lastOnlineUsersFetchTime = now; + } } } Sleep(60); @@ -154,6 +147,7 @@ DWORD WINAPI init(HMODULE real) FreeLibraryAndExitThread(Client::currentModule, 0); } + BOOL APIENTRY DllMain(HMODULE instance, DWORD ul_reason_for_call, LPVOID lpReserved) { diff --git a/src/Assets/Assets.hpp b/src/Assets/Assets.hpp index 6170ba00..f2927fb5 100644 --- a/src/Assets/Assets.hpp +++ b/src/Assets/Assets.hpp @@ -70,7 +70,13 @@ #define IDR_SETTINGS_PNG 170 #define IDR_SETTINGS_WHITE_PNG 171 #define IDR_ITEM_PHYSICS_PNG 172 +#define IDR_CYAN_LOGO_PNG 173 +#define IDR_PURPLE_LOGO_PNG 174 +#define IDR_RED_LOGO_PNG 175 +#define IDR_WHITE_LOGO_PNG 176 +#define IDR_YELLOW_LOGO_PNG 177 + // MAKE SURE YOU ALWAYS UPDATE THIS! -#define MAX_IMAGE_ID 172 +#define MAX_IMAGE_ID IDR_YELLOW_LOGO_PNG diff --git a/src/Assets/Assets.rc b/src/Assets/Assets.rc index 72c60d39..896be1c0 100644 --- a/src/Assets/Assets.rc +++ b/src/Assets/Assets.rc @@ -71,6 +71,12 @@ IDR_STYLUS_WHITE_PNG PNG "Data\\styluswhite.png" IDR_FOLDER_WHITE_PNG PNG "Data\\folderwhite.png" IDR_FOLDER_PNG PNG "Data\\folder.png" +IDR_CYAN_LOGO_PNG PNG "Data\\cyan-logo.png" +IDR_PURPLE_LOGO_PNG PNG "Data\\purple-logo.png" +IDR_RED_LOGO_PNG PNG "Data\\red-logo.png" +IDR_WHITE_LOGO_PNG PNG "Data\\white-logo.png" +IDR_YELLOW_LOGO_PNG PNG "Data\\yellow-logo.png" + // TTF Resources IDR_FONT_TTF RCDATA "Data\\Fonts\\font.ttf" IDR_FONT_BOLD_TTF RCDATA "Data\\Fonts\\font_bold.ttf" diff --git a/src/Assets/Data/cyan-logo.png b/src/Assets/Data/cyan-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..296d80c806264907d6ff689e7d74692ed74bc2a8 GIT binary patch literal 7249 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∓Edh=qbMF+u$J9^|vt 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 literal 0 HcmV?d00001 diff --git a/src/Assets/Data/purple-logo.png b/src/Assets/Data/purple-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..afeeedc0b79e800d28c083e062ba09a0b3676ebb GIT binary patch literal 6991 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 Iq)FI+0e}{Ms{jB1 literal 0 HcmV?d00001 diff --git a/src/Assets/Data/red-logo.png b/src/Assets/Data/red-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c67475db47df480dbea7549620d52c367b826fda GIT binary patch literal 7132 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 literal 0 HcmV?d00001 diff --git a/src/Assets/Data/white-logo.png b/src/Assets/Data/white-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..66a3ef9a4e4c9a05e6afdf44e9058226cd3ad649 GIT binary patch literal 1888 zcmZ`(c~H~W7QVlP00D(agdnsKwix!X1QE1A3qmAe2N4AWNZ3R`V#`ig!lpp2kIEuX z5RGB6?4VE}DvKZ>6qT?^EJaWjLnDg_*!cRUoj3D(@0|O6=bZ1GGjsnqSxyeNdnFVk z004VQcGfOJWPA>B5#bwrsKQbRSbsYg3IMS$cuNJqtN;K^#PwF^ zBf|pt4zXZ<@D_T!0z64H3I%8hxi~;TG5{`QknjRX0U-Xv0XPmR z{>5D&{C_nt;TNF))(f?tkDV}t?mto4Wy2T%#0bgS$}M_g+1vioX&d>YCHO9DajjKS ze3^45c2!#bVwwHE=`6f>E9yZG3X{@om8GQG0;6%iX_Omwx4Q%>$2EIw=|-3ohid8U=rXoL`9>y_G0}Z#$aJE}z4XBrxRE@u zZY{?$5&K@gI7(5;_?6Z69Su(VxglNdtl!hg%pRv`VsXnO9J*tC+wL2NzS;q~$(Kn| zoeL7+de3Vq?1Rj#qrYs`SF;BkN zBuIXl^7ydz7F@6S>OsIqWbIZj?z)Hu6v0m0$Z&FZrDpLb051}@(>aCzt+27Tei0Is zS*W+pq$&HInDAeAf2Ex-hyrjd4A)dRzw5}QmPY~a@EiC@2Xy)gf9J#6Dp zvRb4>L=$@rNiODIwIRh!&i+uba>3|f1Ws#diIoCde=|`e=F>$70S5!gbdx|FuIi=?`{Ly*= z{%#AW(|}bqy0U`|7iqb_&%cATQ_QIqPvE(v{n)(XIMXSr)9tGQF^0WEH8iTQ2A(ma-a~N+Qzdx(kQ2@^7UR z_dwYpoWW>HgYhb|v@K^J)P%h{vXh9d5!H!wwLd!GTXsG@CVO#IOpfO; zy{93R6Bf8jnj|Oc{8Xysn&FcW*v!ZR97C<}p`9c$mZvIT?D-`W6n_W5r8n}JmWbw#Gi8z0!xiunB6S~&JMbk9A-!%!e*tQi)irdw zD8CmrjxiKV{7E{faM5L0*T_zjpS<>2qo6R@O#L{E=XYJF*s4J^=YW#baGzmggyWJ z%V2N7qZ@A}?UmWSw{HQ?N~wp&kmxj4n^Sq*W5OUg@=EOfZt43ZtsqFYnxBh)ATjJ|6S7!RodS-bi?~lE0an)LI9nq4+>#7nFY{^cl`N9Erffjl{Fui>%Uj-AFPr+XX9P``NKc9a%c)LRu zQ7?jTI4Gz`qPP25Xa~Uaa+E}_7kN686SonYU85=O<#W;|`NJ^I6W73+#kDhMU6J~n zdvPs+kD5P8bFI}y@Ez~U4~I+*;#AcD|J;ge+`n!H;yMM+@l;jwzutG1?v)U#~p74xcLXD?1H{lrU(?P@{w4ianctF!F94Aks^ z`ex5|`-6|g&gGXE`?7!%VU<*-%V#4By7k5uU1#%PID5gpEo|q#=-ih Iuc;}20K^9*V*mgE literal 0 HcmV?d00001 diff --git a/src/Assets/Data/yellow-logo.png b/src/Assets/Data/yellow-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..399dc0fd7023fef225cf975e79e9bffb4cd631af GIT binary patch literal 6991 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 Client::onlinePlayers; + bool notifiedOfConnectionIssue = false; std::string current_commit = COMMIT_HASH; + + void DownloadAndSave(const std::string& url, const std::string& path) { if (Client::settings.getSettingByName("dlassets")->value || !std::filesystem::exists(path)) { @@ -40,10 +44,36 @@ void DownloadAndSave(const std::string& url, const std::string& path) { } +std::vector Client::getPlayersVector(const nlohmann::json& data) { + onlinePlayers.clear(); // needs mutex to not cause occasional flicker + // Iterate over each server in the JSON object + for (const auto& server : data.items()) { + if (server.value().contains("players") || !server.value()["players"].is_array()) { + continue; + } + // Get the "players" array for the server + const auto& players = server.value()["players"]; + + // Add each player to the allPlayers vector + for (const auto& player : players) { + onlinePlayers.push_back(player.get()); + } + + } + + std::string name = SDK::clientInstance->getLocalPlayer()->getPlayerName(); + + std::string clearedName = Utils::removeNonAlphanumeric(Utils::removeColorCodes(name)); + if (clearedName.empty()) clearedName = Utils::removeColorCodes(name); + + onlinePlayers.push_back(clearedName); + + return onlinePlayers; +} + bool Client::disable = false; void setWindowTitle(std::wstring title) { - using namespace winrt::Windows::UI::Notifications; using namespace winrt::Windows::UI::ViewManagement; using namespace winrt::Windows::ApplicationModel::Core; @@ -165,6 +195,8 @@ void Client::initialize() { if (Client::settings.getSettingByName("fontWeight") == nullptr) Client::settings.addSetting("fontWeight", (std::string) "Normal"); + FlarialGUI::ExtractImageResource(IDR_RED_LOGO_PNG, "red-logo.png","PNG"); + FlarialGUI::LoadFont(IDR_FONT_TTF); FlarialGUI::LoadFont(IDR_FONT_BOLD_TTF); diff --git a/src/Client/Client.hpp b/src/Client/Client.hpp index 577fa52b..9514ede3 100644 --- a/src/Client/Client.hpp +++ b/src/Client/Client.hpp @@ -6,6 +6,10 @@ class Client { public: + static std::vector onlinePlayers; + + static std::vector getPlayersVector(const nlohmann::json &data); + static void initialize(); static bool disable; diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index df7655a8..cabffd1d 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -823,6 +823,38 @@ std::string FlarialGUI::FlarialTextWithFont(float x, float y, const wchar_t *tex return fontedName; } +void FlarialGUI::ExtractImageResource(int resourceId, std::string fileName, LPCTSTR type) { + LPVOID pFileData = NULL; + DWORD dwFileSize = 0; + + HRSRC hRes = FindResource(Client::currentModule, MAKEINTRESOURCE(resourceId), type); + if (hRes == NULL) + return; + + HGLOBAL hResData = LoadResource(Client::currentModule, hRes); + if (hResData == NULL) + return; + + pFileData = LockResource(hResData); + if (pFileData == NULL) + return; + + dwFileSize = SizeofResource(Client::currentModule, hRes); + + std::string fileType(type); + + std::string lpFileName = Utils::getRoamingPath() + "\\Flarial\\assets\\" + fileName; + + std::ofstream outFile(lpFileName, std::ios::binary); + if (!outFile) { + return; + } + + // Write the file data directly as binary + outFile.write(reinterpret_cast(pFileData), dwFileSize); + outFile.close(); +} + void FlarialGUI::LoadFont(int resourceId) { LPVOID pFontData = NULL; DWORD dwFontSize = 0; diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index fe2e02a6..d9e5f091 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -382,6 +382,8 @@ namespace FlarialGUI { bool LoadImageFromResource(int resourceId, D3D12_CPU_DESCRIPTOR_HANDLE srv_cpu_handle, ID3D12Resource** out_tex_resource, LPCTSTR type); + void ExtractImageResource(int resourceId, std::string fileName, LPCTSTR type); + void LoadFont(int resourceId); bool LoadFontFromFontFamily(std::string name, std::string weightedName, DWRITE_FONT_WEIGHT weight); diff --git a/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp b/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp new file mode 100644 index 00000000..e2ed434f --- /dev/null +++ b/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp @@ -0,0 +1,136 @@ +#pragma once + +#include +#include + +#include "../Hook.hpp" +#include "../../../../SDK/Client/Render/Font.hpp" +#include "../../../../SDK/Client/Render/NameTagRenderObject.hpp" +#include "../../../../SDK/Client/Render/ScreenContext.hpp" +#include "../../../../SDK/Client/Render/ViewRenderData.hpp" +#include "../../../../SDK/Client/Render/Tessellator/MeshHelpers.hpp" +#include "../../../../SDK/Client/Util/MathUtility.hpp" +#include "../../../../Utils/Memory/Memory.hpp" +#include "../../../../Utils/Utils.hpp" + +class BaseActorRendererRenderTextHook : public Hook { +private: + + static void drawLogo(ScreenContext* screenContext, const Vec3& cameraPos, const Vec3& cameraTargetPos, const std::string& nameTag, const Vec3& tagPos, Font* font) { + std::string clearedName = Utils::removeNonAlphanumeric(Utils::removeColorCodes(nameTag)); + if (clearedName.empty()) clearedName = Utils::removeColorCodes(nameTag); // nametag might contain some unclearable stuff + + if(!contains(Client::onlinePlayers, clearedName)) return; + + if (MaterialUtils::getUITextured() == nullptr) + MaterialUtils::update(); + + constexpr float DEG_RAD = 180.0f / 3.1415927f; + + const auto rotPos = cameraPos.sub(tagPos); + const auto rot = mce::MathUtility::getRotationFromNegZToVector(rotPos); + const float yaw = rot.y * -DEG_RAD; + const float pitch = rot.x * DEG_RAD; + const auto pos = tagPos.sub(cameraTargetPos); + + auto& stack = SDK::clientInstance->getCamera().getWorldMatrixStack(); + + stack.push(); + + auto& matrix = stack.top().matrix; + + matrix = translate(matrix, {pos.x, pos.y, pos.z}); + matrix = rotate(matrix, glm::radians(yaw), {0.f, 1.f, 0.f}); + matrix = rotate(matrix, glm::radians(pitch), {1.f, 0.f, 0.f}); + + const auto mScale = 0.026666669f; // 0.16f + matrix = scale(matrix, {mScale * -1, mScale * -1, mScale}); + + const ResourceLocation loc(Utils::getRoamingPath() + R"(\Flarial\assets\red-logo.png)", true); // The logo is the normal transparent Flarial logo, 128x128 + const TexturePtr ptr = SDK::clientInstance->getMinecraftGame()->textureGroup->getTexture(loc, false); + + const float fontHeight = font->getLineHeight(); + float x; + const float size = fontHeight; + const float y = -1.f; + + if (std::ranges::find(nameTag.begin(), nameTag.end(), '\n') != nameTag.end()) { + const auto split = Utils::splitString(nameTag, '\n'); + + float width = 0.f; + + for (const auto& tag : split) { + const auto w = font->getLineLength(tag, 1.f, false); + + if (w > width) + width = w; + } + + x = -(width / 2.f + size + 2.f); + } + else + x = -(font->getLineLength(nameTag, 1.f, false) / 2.f + size + 2.f); + + const auto shaderColor = screenContext->getColorHolder(); + + shaderColor->r = 1.f; + shaderColor->g = 1.f; + shaderColor->b = 1.f; + shaderColor->a = 1.f; + shaderColor->shouldDelete = true; + + const auto tess = screenContext->getTessellator(); + + tess->begin(); + + tess->vertexUV(x, y, 0.f, 0.f, 0.f); + tess->vertexUV(x, y + size, 0.f, 0.f, 1.f); + tess->vertexUV(x + size, y, 0.f, 1.f, 0.f); + + tess->vertexUV(x, y + size, 0.f, 0.f, 1.f); + tess->vertexUV(x + size, y + size, 0.f, 1.f, 1.f); + tess->vertexUV(x + size, y, 0.f, 1.f, 0.f); + + MeshHelpers::renderMeshImmediately2(screenContext, tess, MaterialUtils::getUITextured(), *ptr.clientTexture); + + stack.pop(); + } + + static bool contains(const std::vector& vec, const std::string& str) { + return std::find(vec.begin(), vec.end(), str) != vec.end(); + } + + static void BaseActorRenderer_renderTextCallback(ScreenContext* screenContext, ViewRenderData* viewData, NameTagRenderObject* tagData, Font* font, float size) { + drawLogo(screenContext, viewData->cameraPos, viewData->cameraTargetPos, tagData->nameTag, tagData->pos, font); + + funcOriginal(screenContext, viewData, tagData, font, size); + } + + static void BaseActorRenderer_renderTextCallback40(ScreenContext* screenContext, ViewRenderData* viewData, NameTagRenderObject* tagData, Font* font, void* mesh) { + drawLogo(screenContext, viewData->cameraPos, viewData->cameraTargetPos, tagData->nameTag, tagData->pos, font); + + funcOriginal40(screenContext, viewData, tagData, font, mesh); + } + +public: + typedef void(__fastcall* BaseActorRenderer_renderTextOriginal)(ScreenContext*, ViewRenderData*, NameTagRenderObject*, Font*, float size); + typedef void(__fastcall* BaseActorRenderer_renderTextOriginal40)(ScreenContext*, ViewRenderData*, NameTagRenderObject*, Font*, void* mesh); + + static inline BaseActorRenderer_renderTextOriginal funcOriginal = nullptr; + static inline BaseActorRenderer_renderTextOriginal40 funcOriginal40 = nullptr; + + BaseActorRendererRenderTextHook() : Hook("BaseActorRenderer renderText Hook", GET_SIG("BaseActorRenderer::renderText")) {} + + void enableHook() override { + + static auto sig = Memory::offsetFromSig(Memory::findSig(this->signature), 1); + + if (WinrtUtils::check(20, 40)) + this->manualHook( (void*) sig, (void*) BaseActorRenderer_renderTextCallback40, (void **) &funcOriginal40); + else + this->manualHook( (void*) sig, (void*) BaseActorRenderer_renderTextCallback, (void **) &funcOriginal); + + } +}; + + diff --git a/src/Client/Hook/Manager.cpp b/src/Client/Hook/Manager.cpp index 565da762..aad5f339 100644 --- a/src/Client/Hook/Manager.cpp +++ b/src/Client/Hook/Manager.cpp @@ -17,6 +17,7 @@ #include "Hooks/Game/getSensHook.hpp" #include "Hooks/Render/TextureGroup_getTextureHook.hpp" #include "Hooks/Render/HudMobEffectsRenderer.hpp" +#include "Hooks/Visual/BaseActorRendererRenderTextHook.hpp" //#include "Hooks/Game/RenderItemGroup.hpp" //#include "Hooks/Game/getCurrentSwingDuration.hpp" @@ -72,6 +73,7 @@ void HookManager::initialize() { hooks.push_back(new HudMobEffectsRendererHook()); //hooks.push_back(new RenderItemGroupHook()); //hooks.push_back(new getCurrentSwingDuration()); + hooks.push_back(new BaseActorRendererRenderTextHook()); for (auto hook: hooks) hook->enableHook(); diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 22023db7..00208265 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -75,11 +75,6 @@ namespace ModuleManager { std::unordered_map moduleMap; - std::vector onlineUsers; - std::vector onlineDevs; - std::vector onlineCommites; - std::vector onlinePluses; - std::vector onlineStaff; bool initialized = false; } diff --git a/src/Client/Module/Manager.hpp b/src/Client/Module/Manager.hpp index 9b36aee1..b4616739 100644 --- a/src/Client/Module/Manager.hpp +++ b/src/Client/Module/Manager.hpp @@ -21,11 +21,5 @@ namespace ModuleManager { bool doesAnyModuleHave(const std::string& settingName); Module *getModule(const std::string& name); - - extern std::vector onlineUsers; - extern std::vector onlineDevs; - extern std::vector onlineCommites; - extern std::vector onlinePluses; - extern std::vector onlineStaff; } diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index bd218e01..13d95954 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -23,12 +23,12 @@ Component *Actor::tryGet(uintptr_t addr) { auto func = reinterpret_cast(addr); return func(basicReg, id); }else{ - auto a1 = **(uintptr_t***)(this + 0x8); - auto a2 = *(uintptr_t*)(this + 0x10); + basicReg = **(uintptr_t***)(this + 0x8); + id = *(uintptr_t*)(this + 0x10); - using efunc = Component* (__thiscall*)(uintptr_t, uintptr_t*); + using efunc = Component* (__thiscall*)(uintptr_t, const EntityId &); auto func = reinterpret_cast(addr); - return func(reinterpret_cast(a1), &a2); + return func(reinterpret_cast(basicReg), id); } } diff --git a/src/SDK/Client/Bedrock/EnableNonOwnerReferences.hpp b/src/SDK/Client/Bedrock/EnableNonOwnerReferences.hpp new file mode 100644 index 00000000..a5e7951d --- /dev/null +++ b/src/SDK/Client/Bedrock/EnableNonOwnerReferences.hpp @@ -0,0 +1,17 @@ +#pragma once + +namespace Bedrock { + class EnableNonOwnerReferences { + public: + struct ControlBlock { + EnableNonOwnerReferences* ptr; + }; + + std::shared_ptr controlBlock; // this+0x8 + + // prevent constructor by default + EnableNonOwnerReferences& operator=(EnableNonOwnerReferences const&); + + virtual ~EnableNonOwnerReferences(); + }; +} \ No newline at end of file diff --git a/src/SDK/Client/Core/ClientInstance.hpp b/src/SDK/Client/Core/ClientInstance.hpp index c71d051e..07e5cbaf 100644 --- a/src/SDK/Client/Core/ClientInstance.hpp +++ b/src/SDK/Client/Core/ClientInstance.hpp @@ -11,6 +11,7 @@ #include "../Render/GLMatrix.hpp" #include "../Level/LevelRender/LevelRender.hpp" #include "../Network/Raknet/RaknetConnector.hpp" +#include "../Render/Camera.hpp" class ClientInstance { public: @@ -26,6 +27,11 @@ class ClientInstance { return hat::member_at(this, GET_OFFSET("ClientInstance::viewMatrix")); }; + mce::Camera& getCamera() { + static int off = GET_OFFSET("ClientInstance::camera"); + return hat::member_at(this, off); + } + LocalPlayer *getLocalPlayer(); BlockSource *getBlockSource(); diff --git a/src/SDK/Client/Core/MinecraftGame.hpp b/src/SDK/Client/Core/MinecraftGame.hpp index e748642f..3a16befe 100644 --- a/src/SDK/Client/Core/MinecraftGame.hpp +++ b/src/SDK/Client/Core/MinecraftGame.hpp @@ -1,6 +1,9 @@ #pragma once +#include "../Render/TextureGroup.hpp" + class MinecraftGame { public: BUILD_ACCESS(this, bool, mouseGrabbed, GET_OFFSET("MinecraftGame::mouseGrabbed")); -}; \ No newline at end of file + BUILD_ACCESS(this, std::shared_ptr, textureGroup, GET_OFFSET("MinecraftGame::textureGroup")); +}; diff --git a/src/SDK/Client/Render/Camera.hpp b/src/SDK/Client/Render/Camera.hpp new file mode 100644 index 00000000..455729e8 --- /dev/null +++ b/src/SDK/Client/Render/Camera.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "MatrixStack.hpp" +#include "../../../Utils/Memory/Memory.hpp" +#include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" + +namespace mce { + class Camera { + public: + MatrixStack& getWorldMatrixStack() { + static auto off = GET_OFFSET("mce::Camera::worldMatrixStack"); + return hat::member_at(this, off); + } + }; +} diff --git a/src/SDK/Client/Render/Font.cpp b/src/SDK/Client/Render/Font.cpp new file mode 100644 index 00000000..e48c0629 --- /dev/null +++ b/src/SDK/Client/Render/Font.cpp @@ -0,0 +1,14 @@ +#include "Font.hpp" + +#include "../../../Utils/Memory/Memory.hpp" +#include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" + +float Font::getLineLength(const std::string& text, float fontSize, bool showColorSymbol) { + static int off = GET_OFFSET("Font::getLineLength"); + return Memory::CallVFuncI(off, this, text, fontSize, showColorSymbol); +} + +float Font::getLineHeight() { + static int off = GET_OFFSET("Font::getLineHeight"); + return Memory::CallVFuncI(off, this); +} diff --git a/src/SDK/Client/Render/Font.hpp b/src/SDK/Client/Render/Font.hpp new file mode 100644 index 00000000..e3312eed --- /dev/null +++ b/src/SDK/Client/Render/Font.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include + +class Font { +public: + float getLineLength(const std::string& text, float fontSize, bool showColorSymbol); + float getLineHeight(); +}; diff --git a/src/SDK/Client/Render/MatrixStack.cpp b/src/SDK/Client/Render/MatrixStack.cpp new file mode 100644 index 00000000..0c0009a7 --- /dev/null +++ b/src/SDK/Client/Render/MatrixStack.cpp @@ -0,0 +1,16 @@ +#include "MatrixStack.hpp" + +void MatrixStack::push() { + this->isDirty = true; + + this->stack.push(this->stack.top()); +} + +void MatrixStack::pop() { + this->isDirty = true; + this->stack.pop(); +} + +Matrix& MatrixStack::top() { + return this->stack.top(); +} diff --git a/src/SDK/Client/Render/MatrixStack.hpp b/src/SDK/Client/Render/MatrixStack.hpp new file mode 100644 index 00000000..1059c29b --- /dev/null +++ b/src/SDK/Client/Render/MatrixStack.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include + +#include "Matrix.hpp" + +class MatrixStack { +public: + std::stack stack; +private: + char filling[0x10]; +public: + bool isDirty; + + void push(); + void pop(); + + Matrix& top(); +}; diff --git a/src/SDK/Client/Render/NameTagRenderObject.hpp b/src/SDK/Client/Render/NameTagRenderObject.hpp new file mode 100644 index 00000000..618ef42e --- /dev/null +++ b/src/SDK/Client/Render/NameTagRenderObject.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "../../../Utils/Memory/Memory.hpp" +#include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" + +struct NameTagRenderObject { + BUILD_ACCESS(this, std::string, nameTag, GET_OFFSET("NameTagRenderObject::nameTag")); + BUILD_ACCESS(this, Vec3, pos, GET_OFFSET("NameTagRenderObject::pos")); +}; diff --git a/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp b/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp index c33b9fd0..8e13c302 100644 --- a/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp +++ b/src/SDK/Client/Render/Tessellator/MeshHelpers.cpp @@ -17,3 +17,19 @@ void MeshHelpers::renderMeshImmediately(ScreenContext* screenContext, Tessellato func(screenContext, tessellator, material); } } + +void MeshHelpers::renderMeshImmediately2(ScreenContext* screenContext, Tessellator* tessellator, mce::MaterialPtr* material, BedrockTextureData& texture) { + if (WinrtUtils::check(21, 20)) { + char pad[0x58]{}; + static auto sig = GET_SIG_ADDRESS("MeshHelpers::renderMeshImmediately2"); + using func_t = void(*)(ScreenContext*, Tessellator*, mce::MaterialPtr*, BedrockTextureData&, char*); + static auto func = reinterpret_cast(sig); + func(screenContext, tessellator, material, texture, pad); + } + else { + static auto sig = GET_SIG_ADDRESS("MeshHelpers::renderMeshImmediately2"); + using func_t = void(*)(ScreenContext*, Tessellator*, mce::MaterialPtr*, BedrockTextureData&); + static auto func = reinterpret_cast(sig); + func(screenContext, tessellator, material, texture); + } +} diff --git a/src/SDK/Client/Render/Tessellator/MeshHelpers.hpp b/src/SDK/Client/Render/Tessellator/MeshHelpers.hpp index 4c35e1c5..a02a1f63 100644 --- a/src/SDK/Client/Render/Tessellator/MeshHelpers.hpp +++ b/src/SDK/Client/Render/Tessellator/MeshHelpers.hpp @@ -1,10 +1,12 @@ #pragma once #include "Tessellator.hpp" +#include "../BedrockTextureData.hpp" #include "../ScreenContext.hpp" #include "../Material/MaterialPtr.hpp" class MeshHelpers { public: static void renderMeshImmediately(ScreenContext* screenContext, Tessellator* tessellator, mce::MaterialPtr* material); + static void renderMeshImmediately2(ScreenContext* screenContext, Tessellator* tessellator, mce::MaterialPtr* material, BedrockTextureData& texture); }; diff --git a/src/SDK/Client/Render/Tessellator/Tessellator.hpp b/src/SDK/Client/Render/Tessellator/Tessellator.hpp index 5dda45a9..fca7beba 100644 --- a/src/SDK/Client/Render/Tessellator/Tessellator.hpp +++ b/src/SDK/Client/Render/Tessellator/Tessellator.hpp @@ -19,6 +19,12 @@ class Tessellator { func(this, x, y, z); } + void vertexUV(float x, float y, float z, float u, float v) { + using func_t = void(__fastcall*)(Tessellator*, float, float, float, float, float); + static auto func = reinterpret_cast(GET_SIG_ADDRESS("Tessellator::vertexUV")); + func(this, x, y, z, u, v); + } + void color(float r, float g, float b, float a) { using func_t = void(__fastcall*)(Tessellator*, float, float, float, float); static auto func = reinterpret_cast(GET_SIG_ADDRESS("Tessellator::colorF")); diff --git a/src/SDK/Client/Render/TextureGroup.hpp b/src/SDK/Client/Render/TextureGroup.hpp index d86c49f8..812cf93f 100644 --- a/src/SDK/Client/Render/TextureGroup.hpp +++ b/src/SDK/Client/Render/TextureGroup.hpp @@ -5,10 +5,12 @@ #include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" #include "libhat/Access.hpp" #include "BedrockTexture.hpp" +#include "TextureGroupBase.hpp" +#include "../Bedrock/EnableNonOwnerReferences.hpp" -class TextureGroup { +class TextureGroup : public Bedrock::EnableNonOwnerReferences, public mce::TextureGroupBase { public: std::map& getLoadedTextures() { return hat::member_at>(this, GET_OFFSET("TextureGroup::base") + GET_OFFSET("TextureGroup::loadedTextures")); } -}; \ No newline at end of file +}; diff --git a/src/SDK/Client/Render/TextureGroupBase.hpp b/src/SDK/Client/Render/TextureGroupBase.hpp new file mode 100644 index 00000000..e497a8db --- /dev/null +++ b/src/SDK/Client/Render/TextureGroupBase.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "TexturePtr.hpp" + +namespace mce { + class TextureGroupBase { + public: + virtual void Destructor(); + virtual TexturePtr getTexture(const ResourceLocation& location, bool forceReload); + }; +} diff --git a/src/SDK/Client/Render/ViewRenderData.hpp b/src/SDK/Client/Render/ViewRenderData.hpp new file mode 100644 index 00000000..a551339f --- /dev/null +++ b/src/SDK/Client/Render/ViewRenderData.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "../../../Utils/Memory/Memory.hpp" +#include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" + +struct ViewRenderData { + BUILD_ACCESS(this, Vec3, cameraPos, GET_OFFSET("ViewRenderData::cameraPos")); + BUILD_ACCESS(this, Vec3, cameraTargetPos, GET_OFFSET("ViewRenderData::cameraTargetPos")); +}; diff --git a/src/SDK/Client/Util/MathUtility.cpp b/src/SDK/Client/Util/MathUtility.cpp new file mode 100644 index 00000000..834bfdd1 --- /dev/null +++ b/src/SDK/Client/Util/MathUtility.cpp @@ -0,0 +1,9 @@ +#include "MathUtility.hpp" + +#include "../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" + +Vec2 mce::MathUtility::getRotationFromNegZToVector(const Vec3& vec) { + static auto sig = GET_SIG_ADDRESS("mce::MathUtility::getRotationFromNegZToVector"); + static auto func = *(decltype(&MathUtility::getRotationFromNegZToVector)*)&sig; + return func(vec); +} diff --git a/src/SDK/Client/Util/MathUtility.hpp b/src/SDK/Client/Util/MathUtility.hpp new file mode 100644 index 00000000..6059d360 --- /dev/null +++ b/src/SDK/Client/Util/MathUtility.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "../../../Utils/Utils.hpp" + +namespace mce { + class MathUtility { + public: + static Vec2 getRotationFromNegZToVector(const Vec3& vec); + }; +} diff --git a/src/Utils/Memory/Game/Offset/OffsetInit.cpp b/src/Utils/Memory/Game/Offset/OffsetInit.cpp index 14779132..52b21b40 100644 --- a/src/Utils/Memory/Game/Offset/OffsetInit.cpp +++ b/src/Utils/Memory/Game/Offset/OffsetInit.cpp @@ -12,6 +12,7 @@ void OffsetInit::init2130() { ADD_OFFSET("Level::hitResult", 0x230); ADD_OFFSET("Level::getPlayerMap", 0xC08); + ADD_OFFSET("ClientInstance::camera", 0x2A0); ADD_OFFSET("ClientInstance::viewMatrix", 0x360); ADD_OFFSET("ClientInstance::getFovX", 0x720); ADD_OFFSET("ClientInstance::getFovY", 0x734); @@ -21,6 +22,7 @@ void OffsetInit::init2130() { ADD_OFFSET("ClientInstance::guiData", 0x588); ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A0); + ADD_OFFSET("MinecraftGame::textureGroup", 0x690); ADD_OFFSET("MoveInputComponent::forward", 0x2C); ADD_OFFSET("MoveInputComponent::backward", 0x2D); @@ -57,6 +59,8 @@ void OffsetInit::init2120() { ADD_OFFSET("Level::getPlayerMap", 0xBF8); ADD_OFFSET("ItemActor::stack", 0x408); + + ADD_OFFSET("MinecraftGame::textureGroup", 0x6D0); } void OffsetInit::init2100() { @@ -142,6 +146,7 @@ void OffsetInit::init2060() { ADD_OFFSET("ClientInstance::getFovY", 0x704); ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x1A8); + ADD_OFFSET("MinecraftGame::textureGroup", 0x828); ADD_OFFSET("RakPeer::GetAveragePing", 44); @@ -190,6 +195,7 @@ void OffsetInit::init2040() { ADD_OFFSET("Player::gamemode", 0xEB0); ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x190); + ADD_OFFSET("MinecraftGame::textureGroup", 0x818); ADD_OFFSET("Weather::lightingLevel", 0x48); ADD_OFFSET("Weather::rainLevel", 0x3C); @@ -246,11 +252,13 @@ void OffsetInit::init2030() { ADD_OFFSET("ClientInstance::minecraftGame", 0xC8); ADD_OFFSET("ClientInstance::guiData", 0x560); + ADD_OFFSET("ClientInstance::camera", 0x270); ADD_OFFSET("ClientInstance::viewMatrix", 0x330); ADD_OFFSET("Minecraft::timer", 0xD8); ADD_OFFSET("MinecraftGame::mouseGrabbed", 0x188); + ADD_OFFSET("MinecraftGame::textureGroup", 0x810); ADD_OFFSET("Option::optionInformation", 0x8); ADD_OFFSET("Option::value", 0x10); @@ -324,4 +332,15 @@ void OffsetInit::init2030() { ADD_OFFSET("Level::getPlayerMap", 0x2608); ADD_OFFSET("ItemActor::stack", 0x4A0); + + ADD_OFFSET("NameTagRenderObject::nameTag", 0x0); + ADD_OFFSET("NameTagRenderObject::pos", 0x60); + + ADD_OFFSET("ViewRenderData::cameraPos", 0x0); + ADD_OFFSET("ViewRenderData::cameraTargetPos", 0xC); + + ADD_OFFSET("Font::getLineLength", 6); + ADD_OFFSET("Font::getLineHeight", 7); + + ADD_OFFSET("mce::Camera::worldMatrixStack", 0x40); } diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index a7492e0e..2553efd1 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -59,6 +59,8 @@ void SigInit::init2120() { ADD_SIG("MeshHelpers::renderMeshImmediately", "E8 ? ? ? ? C6 43 ? ? F3 0F 10 1D ? ? ? ? 0F 57 D2 0F 57 C9"); ADD_SIG("HudMobEffectsRenderer::render", "48 89 5C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? B8 ? ? ? ? E8 ? ? ? ? 48 2B E0 0F 29 B4 24 ? ? ? ? 0F 29 BC 24 ? ? ? ? 44 0F 29 84 24 ? ? ? ? 44 0F 29 8C 24 ? ? ? ? 44 0F 29 94 24 ? ? ? ? 44 0F 29 9C 24 ? ? ? ? 44 0F 29 A4 24 ? ? ? ? 44 0F 29 AC 24 ? ? ? ? 44 0F 29 B4 24 ? ? ? ? 44 0F 29 BC 24 ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 49 8B F9"); + + ADD_SIG("MeshHelpers::renderMeshImmediately2", "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 41 56 48 81 EC ? ? ? ? 49 8B F1 49 8B E8 48 8B FA 4C 8B F1"); } void SigInit::init2102() { @@ -167,6 +169,8 @@ void SigInit::init2050() { ADD_SIG("ItemPositionConst", "F3 0F 59 ? ? ? ? ? F3 41 0F 58 ? ? ? ? ? ? F3 0F 59 ? ? ? ? ? F3 0F 2C"); // Yes this is the same sig as 1.20.30 ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 40 ? 44 0F 29 48 ? 44 0F 29 90 ? ? ? ? 44 0F 29 98 ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 49 8B D8"); + + ADD_SIG("Tessellator::vertexUV", "48 83 EC ? 80 B9 ? ? ? ? ? 0F 57 E4"); } void SigInit::init2040() { @@ -289,10 +293,12 @@ void SigInit::init2030() { ADD_SIG("mce::RenderMaterialGroup::ui", "48 8B 05 ? ? ? ? 48 8D 55 ? 48 8D 0D ? ? ? ? 48 8B 40 ? FF 15 ? ? ? ? 48 8B F8"); ADD_SIG("Tessellator::begin", "48 89 5C 24 ? 56 48 83 EC ? 80 B9 ? ? ? ? ? 45 0F B6"); ADD_SIG("Tessellator::vertex", "40 57 48 81 EC ? ? ? ? 0F 29 7C ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 ? 8B 81"); + ADD_SIG("Tessellator::vertexUV", "48 83 EC ? 48 8B 94"); ADD_SIG("Tessellator::colorF", "80 B9 ? ? ? ? ? 4C 8B C1 75"); ADD_SIG("Tessellator::setRotation", "48 89 5C 24 ? 57 48 81 EC ? ? ? ? F3 41 0F 10"); ADD_SIG("Tessellator::resetTransform", "40 53 48 81 EC ? ? ? ? C6 81 ? ? ? ? ? 48 8B D9 84 D2"); ADD_SIG("MeshHelpers::renderMeshImmediately", "48 89 5C 24 ? 48 89 74 24 ? 57 48 81 EC ? ? ? ? 49 8B F8 48 8B DA 48 8B F1 80 BA"); + ADD_SIG("MeshHelpers::renderMeshImmediately2", "40 55 53 56 57 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4D 8B F9"); ADD_SIG("MinecraftUIRenderContext::getTexture", "40 53 56 57 48 83 EC 70 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 60 48 8B DA 48 89"); @@ -314,4 +320,8 @@ void SigInit::init2030() { ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 40 ? 44 0F 29 48 ? 44 0F 29 90 ? ? ? ? 44 0F 29 98 ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 ? 49 8B D8"); ADD_SIG("HudMobEffectsRenderer::render", "48 8B C4 48 89 58 08 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 28 F5"); + + ADD_SIG("BaseActorRenderer::renderText", "E8 ? ? ? ? 48 83 C3 ? 48 3B DF 75 ? 48 8B 74 24 ? 48 8B 5C 24 ? 48 8B 6C 24"); + + ADD_SIG("mce::MathUtility::getRotationFromNegZToVector", "48 8B C4 48 81 EC ? ? ? ? F3 0F 10 2A"); } diff --git a/src/Utils/Render/MaterialUtils.cpp b/src/Utils/Render/MaterialUtils.cpp index 3a96e55e..1a0905e6 100644 --- a/src/Utils/Render/MaterialUtils.cpp +++ b/src/Utils/Render/MaterialUtils.cpp @@ -3,12 +3,20 @@ #include "../../SDK/Client/Render/Tessellator/RenderMaterialGroup.hpp" static mce::MaterialPtr* uiFillColor = nullptr; +static mce::MaterialPtr* uiTextured = nullptr; void MaterialUtils::update() { if (uiFillColor == nullptr) uiFillColor = mce::RenderMaterialGroup::createUI(HashedString("ui_fill_color")); + + if (uiTextured == nullptr) + uiTextured = mce::RenderMaterialGroup::createUI(HashedString("ui_textured")); } mce::MaterialPtr* MaterialUtils::getUIFillColor() { return uiFillColor; } + +mce::MaterialPtr* MaterialUtils::getUITextured() { + return uiTextured; +} diff --git a/src/Utils/Render/MaterialUtils.hpp b/src/Utils/Render/MaterialUtils.hpp index 81ee71f8..75498847 100644 --- a/src/Utils/Render/MaterialUtils.hpp +++ b/src/Utils/Render/MaterialUtils.hpp @@ -7,4 +7,5 @@ class MaterialUtils { static void update(); static mce::MaterialPtr* getUIFillColor(); + static mce::MaterialPtr* getUITextured(); }; diff --git a/src/Utils/Utils.hpp b/src/Utils/Utils.hpp index f58d9567..ffe37e01 100644 --- a/src/Utils/Utils.hpp +++ b/src/Utils/Utils.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -146,7 +147,7 @@ class Vec3 : public Vec2 { return Vec3(this->x - x, this->y - y, this->z - z); }; - auto sub(const Vec3 &vec) -> Vec3 { + auto sub(const Vec3& vec) const -> Vec3 { return Vec3(this->x - vec.x, this->y - vec.y, this->z - vec.z); }; @@ -286,6 +287,13 @@ class Utils { static std::wstring StrToWStr(const std::string &s); static std::string WStrToStr(const std::wstring &ws); + + static std::vector splitString(const std::string& str, char delimiter) { + return str + | std::views::split(delimiter) + | std::views::transform([](auto&& token) { return std::string{token.begin(), token.end()}; }) + | std::ranges::to(); + } }; struct CaretMeasureData { diff --git a/src/Utils/Versions/WinrtUtils.cpp b/src/Utils/Versions/WinrtUtils.cpp index a1611b86..f3557bed 100644 --- a/src/Utils/Versions/WinrtUtils.cpp +++ b/src/Utils/Versions/WinrtUtils.cpp @@ -52,7 +52,7 @@ std::string WinrtUtils::getFormattedVersion() { return "1.21.02"; } - if(version == "1.21.3.0") { // i cba for now #2 + if(version == "1.21.3") { // i cba for now #2 // 1.21.3.0 - 1.21.0 ".3" // 1.21.3003.0 - 1.21.30 return "1.21.03"; From 3a4bce63bcf10b0fce4a63908776507fbd9e5be0 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:40:47 +0600 Subject: [PATCH 190/240] Announcement --- main.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/main.cpp b/main.cpp index b3ac9612..e950e54a 100644 --- a/main.cpp +++ b/main.cpp @@ -121,6 +121,18 @@ DWORD WINAPI init(HMODULE real) }); statusThread.detach(); + std::thread announcementThread([]() { + while (!Client::disable) { + if(Client::disable) break; + + if(SDK::clientInstance) + SDK::clientInstance->getGuiData()->displayClientMessage("§khiii §r §n§l§4FLARIAL §r §khiii §r Donate to Flarial! https://flarial.xyz/donate\n§9Join our discord! https://flarial.xyz/discord"); + Sleep(420000); + } + }); + + announcementThread.detach(); + while (true) { if (Client::disable) { break; From 79e9d680793dcf4c78fce988dba1960aa0f3fdf1 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:49:12 +0600 Subject: [PATCH 191/240] merge fix --- main.cpp | 2 +- src/Client/Module/Modules/TabList/TabList.hpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index ea86ac97..f4503db6 100644 --- a/main.cpp +++ b/main.cpp @@ -119,7 +119,7 @@ DWORD WINAPI init(HMODULE real) if(Client::disable) break; if(SDK::clientInstance) - SDK::clientInstance->getGuiData()->displayClientMessage("§khiii §r §n§l§4FLARIAL §r §khiii §r Donate to Flarial! https://flarial.xyz/donate\n§9Join our discord! https://flarial.xyz/discord"); + SDK::clientInstance->getGuiData()->displayClientMessage("§khiii §r §n§l§4FLARIAL §r§khiii \n§r§cDonate to Flarial! §ehttps://flarial.xyz/donate\n§9Join our discord! §ehttps://flarial.xyz/discord"); Sleep(420000); } }); diff --git a/src/Client/Module/Modules/TabList/TabList.hpp b/src/Client/Module/Modules/TabList/TabList.hpp index 826fb3c3..897e4bbd 100644 --- a/src/Client/Module/Modules/TabList/TabList.hpp +++ b/src/Client/Module/Modules/TabList/TabList.hpp @@ -216,11 +216,13 @@ class TabList : public Module { if (name.empty()) continue; + /* auto it = std::find(ModuleManager::onlineUsers.begin(), ModuleManager::onlineUsers.end(), name); auto it2 = std::find(ModuleManager::onlineDevs.begin(), ModuleManager::onlineDevs.end(), name); auto it3 = std::find(ModuleManager::onlineCommites.begin(), ModuleManager::onlineCommites.end(), name); auto it4 = std::find(ModuleManager::onlinePluses.begin(), ModuleManager::onlinePluses.end(), name); auto it5 = std::find(ModuleManager::onlineStaff.begin(), ModuleManager::onlineStaff.end(), name); + */ // Check if the string was found From d73d0b03f13887b48211d3e047d4d669d402585f Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 18:20:51 +0600 Subject: [PATCH 192/240] fix wtv freeze messed up --- src/Client/Client.cpp | 35 ++++++++++--------- .../BaseActorRendererRenderTextHook.hpp | 9 ++++- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index dfdde259..bbd3d453 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -45,30 +45,31 @@ void DownloadAndSave(const std::string& url, const std::string& path) { } std::vector Client::getPlayersVector(const nlohmann::json& data) { - onlinePlayers.clear(); // needs mutex to not cause occasional flicker - // Iterate over each server in the JSON object - for (const auto& server : data.items()) { - if (server.value().contains("players") || !server.value()["players"].is_array()) { - continue; - } - // Get the "players" array for the server - const auto& players = server.value()["players"]; + std::vector allPlayers; - // Add each player to the allPlayers vector - for (const auto& player : players) { - onlinePlayers.push_back(player.get()); + // Iterate over each server in the JSON object + for (auto it = data.begin(); it != data.end(); ++it) { + if (it->contains("players")) { + // Get the "players" array for the server + const auto& players = it->at("players"); + + // Add each player to the allPlayers vector + for (const auto& player : players) { + allPlayers.push_back(player); + } } - } - std::string name = SDK::clientInstance->getLocalPlayer()->getPlayerName(); + if(SDK::clientInstance && SDK::clientInstance->getLocalPlayer()) { + std::string name = SDK::clientInstance->getLocalPlayer()->getPlayerName(); - std::string clearedName = Utils::removeNonAlphanumeric(Utils::removeColorCodes(name)); - if (clearedName.empty()) clearedName = Utils::removeColorCodes(name); + std::string clearedName = Utils::removeNonAlphanumeric(Utils::removeColorCodes(name)); + if (clearedName.empty()) clearedName = Utils::removeColorCodes(name); - onlinePlayers.push_back(clearedName); + allPlayers.push_back(clearedName); + } - return onlinePlayers; + return allPlayers; } bool Client::disable = false; diff --git a/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp b/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp index e2ed434f..e8621966 100644 --- a/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp +++ b/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp @@ -17,6 +17,7 @@ class BaseActorRendererRenderTextHook : public Hook { private: static void drawLogo(ScreenContext* screenContext, const Vec3& cameraPos, const Vec3& cameraTargetPos, const std::string& nameTag, const Vec3& tagPos, Font* font) { + std::string clearedName = Utils::removeNonAlphanumeric(Utils::removeColorCodes(nameTag)); if (clearedName.empty()) clearedName = Utils::removeColorCodes(nameTag); // nametag might contain some unclearable stuff @@ -100,9 +101,15 @@ class BaseActorRendererRenderTextHook : public Hook { return std::find(vec.begin(), vec.end(), str) != vec.end(); } + static void printVector(const std::vector& vec) { + for (const auto& str : vec) { + std::cout << str << std::endl; + } + } + static void BaseActorRenderer_renderTextCallback(ScreenContext* screenContext, ViewRenderData* viewData, NameTagRenderObject* tagData, Font* font, float size) { - drawLogo(screenContext, viewData->cameraPos, viewData->cameraTargetPos, tagData->nameTag, tagData->pos, font); + drawLogo(screenContext, viewData->cameraPos, viewData->cameraTargetPos, tagData->nameTag, tagData->pos, font); funcOriginal(screenContext, viewData, tagData, font, size); } From 7f6885f2dd741d1944636bbf4bc834de50afedef Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 18:22:45 +0600 Subject: [PATCH 193/240] smth, do somethying for sleep later --- main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.cpp b/main.cpp index f4503db6..03716f45 100644 --- a/main.cpp +++ b/main.cpp @@ -120,6 +120,8 @@ DWORD WINAPI init(HMODULE real) if(SDK::clientInstance) SDK::clientInstance->getGuiData()->displayClientMessage("§khiii §r §n§l§4FLARIAL §r§khiii \n§r§cDonate to Flarial! §ehttps://flarial.xyz/donate\n§9Join our discord! §ehttps://flarial.xyz/discord"); + + if(SDK::clientInstance && SDK::clientInstance->getLocalPlayer()) Sleep(420000); } }); From da4f8dd7305b67c0a4efb91b19c5047caddb4469 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 21:56:24 +0600 Subject: [PATCH 194/240] use elapsed system --- main.cpp | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/main.cpp b/main.cpp index 03716f45..cbee30a6 100644 --- a/main.cpp +++ b/main.cpp @@ -15,6 +15,7 @@ std::chrono::steady_clock::time_point lastBeatTime; std::chrono::steady_clock::time_point lastOnlineUsersFetchTime; +std::chrono::steady_clock::time_point lastAnnouncementTime; std::string replaceAll(std::string subject, const std::string& search, const std::string& replace); @@ -52,6 +53,8 @@ DWORD WINAPI init(HMODULE real) auto now = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast(now - lastBeatTime); auto onlineUsersFetchElapsed = std::chrono::duration_cast(now - lastOnlineUsersFetchTime); + auto onlineAnnouncementElapsed = std::chrono::duration_cast(now - lastAnnouncementTime); + if(!Client::disable) { if(SDK::hasInstanced && SDK::clientInstance != nullptr) { @@ -105,29 +108,17 @@ DWORD WINAPI init(HMODULE real) lastOnlineUsersFetchTime = now; } + + if(SDK::clientInstance && onlineAnnouncementElapsed >= std::chrono::minutes(3)) { + SDK::clientInstance->getGuiData()->displayClientMessage("§khiii §r §n§l§4FLARIAL §r§khiii \n§r§cDonate to Flarial! §ehttps://flarial.xyz/donate\n§9Join our discord! §ehttps://flarial.xyz/discord"); + } } - } + } Sleep(60); - } else break; } }); statusThread.detach(); - - std::thread announcementThread([]() { - while (!Client::disable) { - if(Client::disable) break; - - if(SDK::clientInstance) - SDK::clientInstance->getGuiData()->displayClientMessage("§khiii §r §n§l§4FLARIAL §r§khiii \n§r§cDonate to Flarial! §ehttps://flarial.xyz/donate\n§9Join our discord! §ehttps://flarial.xyz/discord"); - - if(SDK::clientInstance && SDK::clientInstance->getLocalPlayer()) - Sleep(420000); - } - }); - - announcementThread.detach(); - while (true) { if (Client::disable) { break; From 68874f6fd3b7fb639133d788a3b834255462a85e Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:01:54 +0600 Subject: [PATCH 195/240] tablist logo next to nametag --- main.cpp | 1 + src/Client/Module/Modules/TabList/TabList.hpp | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/main.cpp b/main.cpp index cbee30a6..41c65906 100644 --- a/main.cpp +++ b/main.cpp @@ -118,6 +118,7 @@ DWORD WINAPI init(HMODULE real) } else break; } }); + statusThread.detach(); while (true) { if (Client::disable) { diff --git a/src/Client/Module/Modules/TabList/TabList.hpp b/src/Client/Module/Modules/TabList/TabList.hpp index 897e4bbd..c729fa12 100644 --- a/src/Client/Module/Modules/TabList/TabList.hpp +++ b/src/Client/Module/Modules/TabList/TabList.hpp @@ -215,6 +215,11 @@ class TabList : public Module { std::string name = Utils::removeColorCodes(pair.second.name); if (name.empty()) continue; + std::string clearedName = Utils::removeNonAlphanumeric(Utils::removeColorCodes(name)); + if (clearedName.empty()) clearedName = Utils::removeColorCodes(name); + + + auto it = std::find(Client::onlinePlayers.begin(), Client::onlinePlayers.end(), clearedName); /* auto it = std::find(ModuleManager::onlineUsers.begin(), ModuleManager::onlineUsers.end(), name); @@ -236,6 +241,24 @@ class TabList : public Module { float xx = 0; + if (it != Client::onlinePlayers.end()) { + static float p1 = 0.25; + static float p2 = 0.28; + static float p3 = 1; + static float p4 = 1.1; + + FlarialGUI::image(IDR_RED_LOGO_PNG, + D2D1::RectF(fakex + Constraints::SpacingConstraint(p1, keycardSize), + realcenter.y + + Constraints::SpacingConstraint(p2, keycardSize), + fakex + Constraints::SpacingConstraint(p3, keycardSize), + realcenter.y + + Constraints::SpacingConstraint(p4, keycardSize))); + + xx = Constraints::SpacingConstraint(0.5, keycardSize); + + } + /* if (it != ModuleManager::onlineUsers.end()) { From 7afd84523d3749a3d4bab5f14c944deb05f4f1e9 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:02:57 +0600 Subject: [PATCH 196/240] oopsies --- main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index 41c65906..5eec03b4 100644 --- a/main.cpp +++ b/main.cpp @@ -111,7 +111,8 @@ DWORD WINAPI init(HMODULE real) if(SDK::clientInstance && onlineAnnouncementElapsed >= std::chrono::minutes(3)) { SDK::clientInstance->getGuiData()->displayClientMessage("§khiii §r §n§l§4FLARIAL §r§khiii \n§r§cDonate to Flarial! §ehttps://flarial.xyz/donate\n§9Join our discord! §ehttps://flarial.xyz/discord"); - } + onlineAnnouncementElapsed = now; + } } } Sleep(60); From 0ace0bac561a274add70139e1671d68c8e3bc059 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:03:33 +0600 Subject: [PATCH 197/240] whats wrong w me --- main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index 5eec03b4..9874b0bb 100644 --- a/main.cpp +++ b/main.cpp @@ -111,7 +111,7 @@ DWORD WINAPI init(HMODULE real) if(SDK::clientInstance && onlineAnnouncementElapsed >= std::chrono::minutes(3)) { SDK::clientInstance->getGuiData()->displayClientMessage("§khiii §r §n§l§4FLARIAL §r§khiii \n§r§cDonate to Flarial! §ehttps://flarial.xyz/donate\n§9Join our discord! §ehttps://flarial.xyz/discord"); - onlineAnnouncementElapsed = now; + lastAnnouncementTime = now; } } } From a0a54b20d43d5d1eb5b5cffd558db3e614b20045 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:21:12 +0600 Subject: [PATCH 198/240] adjustments --- src/Client/Module/Modules/TabList/TabList.hpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/Client/Module/Modules/TabList/TabList.hpp b/src/Client/Module/Modules/TabList/TabList.hpp index c729fa12..85ee9cd8 100644 --- a/src/Client/Module/Modules/TabList/TabList.hpp +++ b/src/Client/Module/Modules/TabList/TabList.hpp @@ -242,18 +242,17 @@ class TabList : public Module { float xx = 0; if (it != Client::onlinePlayers.end()) { - static float p1 = 0.25; - static float p2 = 0.28; - static float p3 = 1; - static float p4 = 1.1; + static float p1 = 0.175; + static float p2 = 0.196; + static float p3 = 0.7; + static float p4 = 0.77; + float width = Constraints::SpacingConstraint(p2, keycardSize); FlarialGUI::image(IDR_RED_LOGO_PNG, - D2D1::RectF(fakex + Constraints::SpacingConstraint(p1, keycardSize), - realcenter.y + - Constraints::SpacingConstraint(p2, keycardSize), - fakex + Constraints::SpacingConstraint(p3, keycardSize), - realcenter.y + - Constraints::SpacingConstraint(p4, keycardSize))); + D2D1::RectF(fakex + Constraints::SpacingConstraint(p1, keycardSize) + Constraints::SpacingConstraint(0.17f, keycardSize), + realcenter.y + width + Constraints::SpacingConstraint(0.17f, keycardSize), + fakex + Constraints::SpacingConstraint(p3, keycardSize) + Constraints::SpacingConstraint(0.17f, keycardSize), + realcenter.y + Constraints::SpacingConstraint(p4, keycardSize) + Constraints::SpacingConstraint(0.17f, keycardSize))); xx = Constraints::SpacingConstraint(0.5, keycardSize); From e1e998d400b7d912b26602db7819a68cff4b6330 Mon Sep 17 00:00:00 2001 From: Withors <162058124+Withors@users.noreply.github.com> Date: Thu, 17 Oct 2024 20:22:54 +0300 Subject: [PATCH 199/240] settings update --- src/Client/Module/Modules/AutoRQ/AutoRQ.hpp | 193 +++--------------- .../Module/Modules/HiveStat/HiveStat.hpp | 10 +- 2 files changed, 30 insertions(+), 173 deletions(-) diff --git a/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp b/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp index c12cc437..4358c3fb 100644 --- a/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp +++ b/src/Client/Module/Modules/AutoRQ/AutoRQ.hpp @@ -55,186 +55,41 @@ class AutoRQ : public Module { } void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - const float textWidth = Constraints::RelativeConstraint(0.12, "height", true); - const float textHeight = Constraints::RelativeConstraint(0.029, "height", true); + const float scrollviewWidth = Constraints::RelativeConstraint(0.5, "height", true); - FlarialGUI::ScrollBar(toggleX, toggleY, 140, Constraints::SpacingConstraint(5.5, textWidth), 2); - FlarialGUI::SetScrollView(toggleX, Constraints::PercentageConstraint(0.00, "top"), - Constraints::RelativeConstraint(1.0, "width"), - Constraints::RelativeConstraint(1.0f, "height")); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, - L"Re-Q when you finish or die in a game\npls dont use while in a party", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Solo mode", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(5, toggleX, toggleY, this->settings.getSettingByName( - "solo")->value)) - this->settings.getSettingByName("solo")->value = !this->settings.getSettingByName( - "solo")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, - L"Use /hub instead of /q", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"use /hub", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(11, toggleX, toggleY, this->settings.getSettingByName( - "hub")->value)) - this->settings.getSettingByName("hub")->value = !this->settings.getSettingByName( - "hub")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, - L"Re-Q when you get a specific role (Hive)", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, - L"Murder Mystery", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Murderer", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(3, toggleX, toggleY, this->settings.getSettingByName( - "murderer")->value)) - this->settings.getSettingByName("murderer")->value = !this->settings.getSettingByName( - "murderer")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Sheriff", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(4, toggleX, toggleY, this->settings.getSettingByName( - "sheriff")->value)) - this->settings.getSettingByName("sheriff")->value = !this->settings.getSettingByName( - "sheriff")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Innocent", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(6, toggleX, toggleY, this->settings.getSettingByName( - "innocent")->value)) - this->settings.getSettingByName("innocent")->value = !this->settings.getSettingByName( - "innocent")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, - L"Hide and Seek", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Hider", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(7, toggleX, toggleY, this->settings.getSettingByName( - "hider")->value)) - this->settings.getSettingByName("hider")->value = !this->settings.getSettingByName( - "hider")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Seeker", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - if (FlarialGUI::Toggle(8, toggleX, toggleY, this->settings.getSettingByName( - "seeker")->value)) - this->settings.getSettingByName("seeker")->value = !this->settings.getSettingByName( - "seeker")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, - L"Deathrun", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); + FlarialGUI::ScrollBar(x, y, 140, Constraints::SpacingConstraint(5.5, scrollviewWidth), 2); + FlarialGUI::SetScrollView(x, Constraints::PercentageConstraint(0.00, "top"), + Constraints::RelativeConstraint(1.0, "width"), + Constraints::RelativeConstraint(0.88f, "height")); + this->addHeader("General"); + this->addToggle("Solo mode ", "Re-Q when you finish or die in a game. pls dont use while in a party", this->settings.getSettingByName("solo")->value); + this->addToggle("Use /hub instead of /q", "", this->settings.getSettingByName("hub")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addHeader("Murder Mystery"); + this->addToggle("Murder", "re q when you get murder", this->settings.getSettingByName("murderer")->value); + this->addToggle("Sheriff", "re q when you get sheriff", this->settings.getSettingByName("sheriff")->value); + this->addToggle("Innocent", "re q when you get innocent", this->settings.getSettingByName("innocent")->value); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Death", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); + this->addHeader("Hide and Seek"); + this->addToggle("Hider", "re q when you get hider", this->settings.getSettingByName("hider")->value); + this->addToggle("Seeker", "re q when you get seeker", this->settings.getSettingByName("seeker")->value); - if (FlarialGUI::Toggle(9, toggleX, toggleY, this->settings.getSettingByName( - "death")->value)) - this->settings.getSettingByName("death")->value = !this->settings.getSettingByName( - "death")->value; + this->addHeader("Deathrun"); + this->addToggle("Death", "re q when you get death", this->settings.getSettingByName("death")->value); + this->addToggle("Runner", "re q when you get runner", this->settings.getSettingByName("runner")->value); - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addHeader("Map avoider"); - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0.60, textWidth), toggleY, - L"Runner", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - if (FlarialGUI::Toggle(10, toggleX, toggleY, this->settings.getSettingByName( - "runner")->value)) - this->settings.getSettingByName("runner")->value = !this->settings.getSettingByName( - "runner")->value; - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); + this->addToggle("Avoid", "", this->settings.getSettingByName("AutoMapAvoider")->value); + this->addTextBox("Maps", "Avoid Maps (Hive). Input one or more maps using comma's.", settings.getSettingByName("text")->value); - toggleX = Constraints::PercentageConstraint(0.55, "left"); - toggleY = Constraints::PercentageConstraint(0.10, "top"); - - FlarialGUI::FlarialTextWithFont(toggleX + Constraints::SpacingConstraint(0, textWidth), toggleY, - L"Avoid Maps (Hive). Input one or more maps\nusing comma's.", textWidth * 6.9f, textHeight, - DWRITE_TEXT_ALIGNMENT_LEADING, Constraints::SpacingConstraint(1.05, textWidth), - DWRITE_FONT_WEIGHT_NORMAL); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); - if (FlarialGUI::Toggle(0, toggleX, toggleY, this->settings.getSettingByName( - "AutoMapAvoider")->value)) - this->settings.getSettingByName("AutoMapAvoider")->value = !this->settings.getSettingByName( - "AutoMapAvoider")->value; - - FlarialGUI::TextBoxVisual(1, settings.getSettingByName("text")->value, 256, toggleX + - Constraints::SpacingConstraint(0.60, textWidth), toggleY, ""); - - toggleY += Constraints::SpacingConstraint(0.35, textWidth); FlarialGUI::UnsetScrollView(); + this->resetPadding(); } }; diff --git a/src/Client/Module/Modules/HiveStat/HiveStat.hpp b/src/Client/Module/Modules/HiveStat/HiveStat.hpp index d20c83c7..62a757fc 100644 --- a/src/Client/Module/Modules/HiveStat/HiveStat.hpp +++ b/src/Client/Module/Modules/HiveStat/HiveStat.hpp @@ -38,11 +38,13 @@ class HiveStat : public Module { } void settingsRender() override { - float toggleX = Constraints::PercentageConstraint(0.019, "left"); - float toggleY = Constraints::PercentageConstraint(0.10, "top"); + float x = Constraints::PercentageConstraint(0.019, "left"); + float y = Constraints::PercentageConstraint(0.10, "top"); - FlarialGUI::KeybindSelector(0, toggleX + FlarialGUI::SettingsTextWidth("Overlay"), toggleY, - settings.getSettingByName("Overlay")->value); + + this->addHeader("Keybinds"); + this->addKeybind("Toggle Overlay Keybind", "When setting, hold the new bind for 2 seconds", settings.getSettingByName("Overlay")->value); + this->resetPadding(); } }; From eb918e3c4be87c0e78a5c776e18a19b304afecca Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 18 Oct 2024 13:47:27 +0300 Subject: [PATCH 200/240] Small change --- src/Client/Client.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index bbd3d453..0258e4a7 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -48,10 +48,10 @@ std::vector Client::getPlayersVector(const nlohmann::json& data) { std::vector allPlayers; // Iterate over each server in the JSON object - for (auto it = data.begin(); it != data.end(); ++it) { - if (it->contains("players")) { + for (const auto & it : data) { + if (it.contains("players")) { // Get the "players" array for the server - const auto& players = it->at("players"); + const auto& players = it.at("players"); // Add each player to the allPlayers vector for (const auto& player : players) { From 5df1438a7e92b0ce3754369f0ae98c77ee5befe8 Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Fri, 18 Oct 2024 13:47:45 +0300 Subject: [PATCH 201/240] Add sig deprecation --- src/Utils/Memory/Game/Sig/SigInit.cpp | 8 +++++++- src/Utils/Memory/Game/SignatureAndOffsetManager.cpp | 4 ++++ src/Utils/Memory/Game/SignatureAndOffsetManager.hpp | 7 +++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index 2553efd1..ee8dea7b 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -34,6 +34,8 @@ void SigInit::init2130() { ADD_SIG("glm_translateRef", "E8 ? ? ? ? 48 8D 15 ? ? ? ? 44 0F 28 05"); ADD_SIG("mce::TextureGroup::getTexture", "40 55 53 56 57 41 54 41 56 41 57 48 8D 6C 24 E9 48 81 EC 00"); + + DEPRECATE_SIG("ActorCollision::isOnGround"); } void SigInit::init2120() { @@ -50,7 +52,7 @@ void SigInit::init2120() { ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 40"); - ADD_SIG("ActorCollision::isOnGround", "E8 ? ? ? ? 84 C0 49 8B 87"); + ADD_SIG("ActorCollision::isOnGround", "E8 ? ? ? ? 84 C0 49 8B 87"); // depricated ADD_SIG("HurtColor", "E8 ? ? ? ? E9 ? ? ? ? 8B 43 ? 48 8D 54 24 ? 48 8B 4B ? 89 44 24 ? E8 ? ? ? ? 4C 8B D8"); @@ -108,6 +110,8 @@ void SigInit::init2080() { ADD_SIG("glm_rotateRef", "E8 ? ? ? ? BA ? ? ? ? 0F B6 43"); ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 ? ? 44 0F 29 ? ? 44 0F 29 ? ? ? ? ? 44 0F 29 ? ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 49 8B F8"); + + DEPRECATE_SIG("Actor::getArmor"); } void SigInit::init2070() { @@ -140,6 +144,8 @@ void SigInit::init2060() { ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C8 1C 00 00"); ADD_SIG("ActorCollision::isOnGround", "E8 ? ? ? ? 84 C0 49 8B 87"); + + DEPRECATE_SIG("Actor::getOffhandSlot"); } void SigInit::init2050() { diff --git a/src/Utils/Memory/Game/SignatureAndOffsetManager.cpp b/src/Utils/Memory/Game/SignatureAndOffsetManager.cpp index 563642e0..7ac6f0bd 100644 --- a/src/Utils/Memory/Game/SignatureAndOffsetManager.cpp +++ b/src/Utils/Memory/Game/SignatureAndOffsetManager.cpp @@ -7,6 +7,10 @@ void SignatureAndOffsetManager::addSignature(unsigned int hash, const char* sig) sigs[hash] = { sig, 0 }; } +void SignatureAndOffsetManager::removeSignature(unsigned int hash) { + sigs.erase(hash); +} + const char* SignatureAndOffsetManager::getSig(unsigned int hash) const { auto it = sigs.find(hash); return it != sigs.end() ? it->second.first.c_str() : nullptr; diff --git a/src/Utils/Memory/Game/SignatureAndOffsetManager.hpp b/src/Utils/Memory/Game/SignatureAndOffsetManager.hpp index 8d85b209..4d9eda1d 100644 --- a/src/Utils/Memory/Game/SignatureAndOffsetManager.hpp +++ b/src/Utils/Memory/Game/SignatureAndOffsetManager.hpp @@ -4,6 +4,12 @@ #include #include "../../../Utils/Utils.hpp" +#define DEPRECATE_SIG(name) \ + []{ \ + constexpr unsigned int hash_val = Utils::hash(name); \ + Mgr.removeSignature(hash_val); \ + }() + #define ADD_SIG(name, sig) \ []{ \ constexpr unsigned int hash_val = Utils::hash(name); \ @@ -40,6 +46,7 @@ class SignatureAndOffsetManager { public: void addSignature(unsigned int hash, const char* sig); + void removeSignature(unsigned int hash); [[nodiscard]] const char* getSig(unsigned int hash) const; [[nodiscard]] uintptr_t getSigAddress(unsigned int hash) const; From 4174272e32a280e2bc941dd14b77662ea6113b4a Mon Sep 17 00:00:00 2001 From: Raspberry <84133368+EpiclyRaspberry@users.noreply.github.com> Date: Sat, 19 Oct 2024 00:01:40 +0800 Subject: [PATCH 202/240] issue template fixes --- .github/ISSUE_TEMPLATE/bug_report.yaml | 12 ++++++------ .github/ISSUE_TEMPLATE/feature_request.yaml | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 945f13e4..3e79f3df 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -24,7 +24,7 @@ body: - type: textarea id: bug attributes: - render: Markdown + # render: Markdown label: Bug description description: A clear and concise description of what the bug is. placeholder: I was trying to [...] but [...] @@ -32,7 +32,7 @@ body: - type: textarea id: expected attributes: - render: Markdown + # render: Markdown label: Expected behavior description: A clear and concise description of what you expected to happen. placeholder: I expected [...] @@ -40,7 +40,7 @@ body: - type: textarea id: actual attributes: - render: Markdown + # render: Markdown label: Actual behavior description: A clear and concise description of what actually happened. placeholder: Instead [...] @@ -48,7 +48,7 @@ body: - type: textarea id: steps attributes: - render: Markdown + # render: Markdown label: Steps to reproduce description: | Please provide detailed steps for reproducing the issue. @@ -74,7 +74,7 @@ body: - type: textarea id: osversion attributes: - render: Markdown + # render: Markdown label: OS Version description: What version of the operating system are you using? placeholder: 21H1, 21H2, 22H1, etc. @@ -83,7 +83,7 @@ body: id: additional attributes: label: Additional notes - render: Markdown + # render: Markdown description: | Add any other context about the problem here. If applicable, add screenshots to help explain your problem. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index fee87c03..0a93d908 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -15,7 +15,7 @@ body: id: reason attributes: label: Reason - render: Markdown + # render: Markdown description: Why do you think this feature should be added? placeholder: I think this feature should be added because [...] @@ -23,7 +23,7 @@ body: id: usecase attributes: label: Use case - render: Markdown + # render: Markdown description: How would you use this feature? placeholder: I would use this feature to [...] @@ -31,7 +31,7 @@ body: id: alternatives attributes: label: Alternatives - render: Markdown + # render: Markdown description: Have you considered any alternative solutions or features? placeholder: An alternative solution could be [...] @@ -39,7 +39,7 @@ body: id: additional attributes: label: Additional context - render: Markdown + # render: Markdown description: Add any other context or screenshots about the feature request here. placeholder: | Add any other context or screenshots about the feature request here. \ No newline at end of file From 95376a7e8b22f3db8572f3f9b1460d35106102ba Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 19 Oct 2024 17:26:35 +0300 Subject: [PATCH 203/240] Crash fix --- src/Client/Hook/Hooks/Game/PacketHooks.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.cpp b/src/Client/Hook/Hooks/Game/PacketHooks.cpp index 989f76fa..d1067a4e 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.cpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.cpp @@ -8,7 +8,10 @@ // text void SendPacketHook::callback(LoopbackPacketSender *pSender, Packet *pPacket) { PacketEvent event(pPacket); - EventHandler::onPacketSend(event); + + if(SDK::clientInstance) { + EventHandler::onPacketSend(event); + } if (!event.isCancelled()) { sendPacketOriginal(pSender, pPacket); From bb5714801b98e6e3a16642dc4f27a096df861a2f Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Sat, 19 Oct 2024 17:29:16 +0300 Subject: [PATCH 204/240] ENTT --- CMakeLists.txt | 24 +++- src/PCH.cpp | 1 + src/PCH.hpp | 37 ++++++ src/SDK/Client/Actor/Actor.cpp | 78 ++++++------ src/SDK/Client/Actor/Actor.hpp | 12 +- .../Actor/Components/AABBShapeComponent.hpp | 4 +- .../Components/ActorDataFlagComponent.hpp | 6 +- .../Components/ActorEquipmentComponent.h | 6 - .../Components/ActorEquipmentComponent.hpp | 9 ++ .../Components/ActorGameTypeComponent.hpp | 7 +- .../Actor/Components/MobEffectsComponent.hpp | 55 +++++++-- .../Actor/Components/MoveInputComponent.hpp | 9 +- .../Components/OnGroundFlagComponent.hpp | 5 +- .../Components/RenderPositionComponent.hpp | 6 +- .../Actor/Components/RuntimeIDComponent.hpp | 3 +- .../Actor/Components/StateVectorComponent.hpp | 6 +- src/SDK/Client/Actor/EntityContext.hpp | 115 ++++++++++++++++-- src/Utils/Memory/Game/Sig/SigInit.cpp | 8 +- 18 files changed, 304 insertions(+), 87 deletions(-) create mode 100644 src/PCH.cpp create mode 100644 src/PCH.hpp delete mode 100644 src/SDK/Client/Actor/Components/ActorEquipmentComponent.h create mode 100644 src/SDK/Client/Actor/Components/ActorEquipmentComponent.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1512cd06..745f18dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,9 +85,9 @@ if("${MSVC_RUNTIME}" STREQUAL "") endif() -file(GLOB_RECURSE sources "main.cpp" "src/**/*.cpp" "src/**/*.hpp" "lib/**/*.cpp" "src/Client/GUI/Engine/*.cpp") +file(GLOB_RECURSE sources "src/**/*.cpp" "src/**/*.hpp" "lib/**/*.cpp" "src/Client/GUI/Engine/*.cpp") -add_library(${PROJECT_NAME} SHARED ${sources} src/SDK/Client/Render/Matrix.cpp src/Assets/Assets.rc) +add_library(${PROJECT_NAME} SHARED ${sources} main.cpp src/Assets/Assets.rc) target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lib/include/" "${CMAKE_CURRENT_LIST_DIR}/lib/glm/" "${CMAKE_CURRENT_LIST_DIR}/lib/ImGui") @@ -101,13 +101,27 @@ endif() add_library(MinHook SHARED IMPORTED GLOBAL) set_target_properties(MinHook PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/minhook/minhook.lib") +FetchContent_Declare( + entt + GIT_REPOSITORY https://github.com/skypjack/entt.git + GIT_TAG f931687ff04d435871ac9664bb299f71f2a8fafc +) + +FetchContent_Declare( + nes + GIT_REPOSITORY https://github.com/DisabledMallis/NuvolaEventSystem.git + GIT_TAG main +) + FetchContent_Declare( libhat GIT_REPOSITORY https://github.com/BasedInc/libhat.git GIT_TAG 9ef05d6961ce37a4c801f11159de895aa21878a9 ) +set(ENTT_BUILD_TESTING OFF) # Disable building tests +FetchContent_MakeAvailable(libhat entt nes) -FetchContent_MakeAvailable(libhat) +target_link_libraries(${PROJECT_NAME} PRIVATE libhat EnTT::EnTT NES windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) +target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) -target_link_libraries(${PROJECT_NAME} PRIVATE libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) -target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) \ No newline at end of file +target_precompile_headers(Flarial PRIVATE "src/PCH.cpp") \ No newline at end of file diff --git a/src/PCH.cpp b/src/PCH.cpp new file mode 100644 index 00000000..42ecc8cd --- /dev/null +++ b/src/PCH.cpp @@ -0,0 +1 @@ +#include "PCH.hpp" \ No newline at end of file diff --git a/src/PCH.hpp b/src/PCH.hpp new file mode 100644 index 00000000..e9083297 --- /dev/null +++ b/src/PCH.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#include "Utils/Memory/Game/SignatureAndOffsetManager.hpp" +#include "Utils/Logger/Logger.hpp" diff --git a/src/SDK/Client/Actor/Actor.cpp b/src/SDK/Client/Actor/Actor.cpp index 13d95954..8a55c27d 100644 --- a/src/SDK/Client/Actor/Actor.cpp +++ b/src/SDK/Client/Actor/Actor.cpp @@ -7,28 +7,41 @@ #include "../../../Client/GUI/Engine/Engine.hpp" #include "Components/OnGroundFlagComponent.hpp" -// TODO add comments to all components, replace their sigs with simpler ones ? marioCST: use entt's try_get func in EntityContext instead of using sigs, there are no simpler sigs - template Component *Actor::tryGet(uintptr_t addr) { + if(WinrtUtils::check(21, 00) || addr == 0) { + auto& ctx = GetEntityContextV1_20_50(); + Component* component = ctx.tryGetComponent(); + return component; + } else { + return tryGetOld(addr); + } +} - uintptr_t* basicReg; - EntityId id; - +template +Component *Actor::tryGetOld(uintptr_t addr) { if(WinrtUtils::check(20, 50)) { auto ctx = GetEntityContextV1_20_50(); - id = ctx->id; - basicReg = &ctx->basicReg; - using efunc = Component *(__thiscall *)(uintptr_t *, const EntityId &); + EntityId id = ctx.entity; + using efunc = Component *(__thiscall *)(entt::basic_registry&, const EntityId &); auto func = reinterpret_cast(addr); - return func(basicReg, id); - }else{ - basicReg = **(uintptr_t***)(this + 0x8); - id = *(uintptr_t*)(this + 0x10); + return func(ctx.enttRegistry, id); + } else { + uintptr_t* basicReg = **(uintptr_t***)(this + 0x8); + uint32_t id = *(uintptr_t*)(this + 0x10); - using efunc = Component* (__thiscall*)(uintptr_t, const EntityId &); + using efunc = Component* (__thiscall*)(uintptr_t, uint32_t*); auto func = reinterpret_cast(addr); - return func(reinterpret_cast(basicReg), id); + return func(reinterpret_cast(basicReg), &id); + } +} + +template +bool Actor::hasComponent(uintptr_t addr) { + if(WinrtUtils::check(21, 00) || addr == 0) { + return this->GetEntityContextV1_20_50().hasComponent(); + } else { + return tryGetOld(addr) != nullptr; } } @@ -64,7 +77,7 @@ bool Actor::canSee(const Actor& actor) { } uint64_t Actor::getRuntimeID() { - return this->GetEntityContextV1_20_50()->id; + return this->GetEntityContextV1_20_50().entity.mRawId; } ActorDataFlagComponent* Actor::getActorDataFlagComponent() { @@ -178,8 +191,8 @@ RuntimeIDComponent *Actor::getRuntimeIDComponent() { return tryGet(sig); } -V1_20_50::EntityContext *Actor::GetEntityContextV1_20_50() { - return reinterpret_cast((uintptr_t)this + 0x8); +V1_20_50::EntityContext &Actor::GetEntityContextV1_20_50() { + return hat::member_at(this, 0x8); } void Actor::setNametag(std::string *name) { @@ -217,17 +230,9 @@ RenderPositionComponent *Actor::getRenderPositionComponent() { //??$try_get@URen std::vector Actor::getMobEffects() { static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix")) + " " + GET_SIG("Actor::getMobEffectsComponent")); std::vector unifiedEffects; - if (WinrtUtils::check(21, 30)) { - auto component = tryGet(sig); - for (auto &effect : component->effects) { - unifiedEffects.emplace_back(effect.id, effect.duration, effect.amplifier); - } - } else { - auto component = tryGet(sig); - - for (auto &effect : component->effects) { - unifiedEffects.emplace_back(effect.id, effect.duration, effect.amplifier); - } + auto component = tryGet(sig); + if(component) { + unifiedEffects = component->getUnifiedEffects(); } return unifiedEffects; } @@ -241,26 +246,25 @@ bool Actor::isValidAABB() { } bool Actor::isOnGround() { - if (WinrtUtils::check(21, 30)) { - static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix3")) + " " + GET_SIG("Actor::getOnGroundFlagComponent")); - auto component = tryGet(sig); - - return component != nullptr; + if (WinrtUtils::check(21, 0)) { + // might be needed when entt cant be used for .21 + //static uintptr_t sig = Memory::findSig(std::string(GET_SIG("tryGetPrefix3")) + " " + GET_SIG("Actor::getOnGroundFlagComponent")); + return hasComponent(); } else { const auto ctx = this->GetEntityContextV1_20_50(); if (WinrtUtils::check(20, 60)) { - using isOnGroundFunc = bool (__fastcall *)(uintptr_t &, EntityId &); + using isOnGroundFunc = bool (__fastcall *)(entt::basic_registry &, const EntityId &); static isOnGroundFunc isOnGround = Memory::getOffsetFromSig( GET_SIG_ADDRESS("ActorCollision::isOnGround"), 1); if (isOnGround) - return isOnGround(ctx->basicReg, ctx->id); + return isOnGround(ctx.enttRegistry, ctx.entity); return false; } - using isOnGroundFunc = bool (__fastcall *)(V1_20_50::EntityContext *); + using isOnGroundFunc = bool (__fastcall *)(const V1_20_50::EntityContext&); static isOnGroundFunc isOnGround = reinterpret_cast(GET_SIG_ADDRESS("ActorCollision::isOnGround")); if (isOnGround) @@ -342,4 +346,4 @@ bool Actor::IsOnSameTeam(Actor *actor) { } return false; -} +} \ No newline at end of file diff --git a/src/SDK/Client/Actor/Actor.hpp b/src/SDK/Client/Actor/Actor.hpp index 3be5edee..c4ac2f28 100644 --- a/src/SDK/Client/Actor/Actor.hpp +++ b/src/SDK/Client/Actor/Actor.hpp @@ -10,7 +10,7 @@ #include "../../../Utils/Utils.hpp" #include "Components/StateVectorComponent.hpp" #include "Components/RenderPositionComponent.hpp" -#include "Components/ActorEquipmentComponent.h" +#include "Components/ActorEquipmentComponent.hpp" #include "EntityContext.hpp" #include "Components/ActorGameTypeComponent.hpp" #include "Components/AABBShapeComponent.hpp" @@ -181,7 +181,13 @@ class Actor { ActorCategory getCategories(); template - Component *tryGet(uintptr_t addr); + Component *tryGet(uintptr_t addr = 0); + + template + Component *tryGetOld(uintptr_t addr); + + template + bool hasComponent(uintptr_t addr = 0); ItemStack *getArmor(int slot); @@ -195,7 +201,7 @@ class Actor { ItemStack *getOffhandSlot(); - V1_20_50::EntityContext *GetEntityContextV1_20_50(); + V1_20_50::EntityContext &GetEntityContextV1_20_50(); void setNametag(std::string *name); diff --git a/src/SDK/Client/Actor/Components/AABBShapeComponent.hpp b/src/SDK/Client/Actor/Components/AABBShapeComponent.hpp index 54905139..4d5abfc3 100644 --- a/src/SDK/Client/Actor/Components/AABBShapeComponent.hpp +++ b/src/SDK/Client/Actor/Components/AABBShapeComponent.hpp @@ -1,8 +1,10 @@ #pragma once #include "../../../../Utils/Utils.hpp" +#include "../EntityContext.hpp" -struct AABBShapeComponent { +struct AABBShapeComponent : IEntityComponent { AABB aabb; Vec2 size; }; +static_assert(sizeof(AABBShapeComponent) == 0x20); diff --git a/src/SDK/Client/Actor/Components/ActorDataFlagComponent.hpp b/src/SDK/Client/Actor/Components/ActorDataFlagComponent.hpp index 56bb8680..04e59dd8 100644 --- a/src/SDK/Client/Actor/Components/ActorDataFlagComponent.hpp +++ b/src/SDK/Client/Actor/Components/ActorDataFlagComponent.hpp @@ -1,7 +1,9 @@ #pragma once #include +#include "../EntityContext.hpp" -struct ActorDataFlagComponent { +struct ActorDataFlagComponent : IEntityComponent { std::bitset<0x77> flags; -}; \ No newline at end of file +}; +static_assert(sizeof(ActorDataFlagComponent) == 0x10); \ No newline at end of file diff --git a/src/SDK/Client/Actor/Components/ActorEquipmentComponent.h b/src/SDK/Client/Actor/Components/ActorEquipmentComponent.h deleted file mode 100644 index 5f80c9ee..00000000 --- a/src/SDK/Client/Actor/Components/ActorEquipmentComponent.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -struct ActorEquipmentComponent { - class SimpleContainer* mOffhandContainer; - class SimpleContainer* mArmorContainer; -}; \ No newline at end of file diff --git a/src/SDK/Client/Actor/Components/ActorEquipmentComponent.hpp b/src/SDK/Client/Actor/Components/ActorEquipmentComponent.hpp new file mode 100644 index 00000000..2ca4371c --- /dev/null +++ b/src/SDK/Client/Actor/Components/ActorEquipmentComponent.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "../EntityContext.hpp" + +struct ActorEquipmentComponent : IEntityComponent { + class SimpleContainer* mOffhandContainer; + class SimpleContainer* mArmorContainer; +}; +static_assert(sizeof(ActorEquipmentComponent) == 0x10); \ No newline at end of file diff --git a/src/SDK/Client/Actor/Components/ActorGameTypeComponent.hpp b/src/SDK/Client/Actor/Components/ActorGameTypeComponent.hpp index 33a0d518..e875830f 100644 --- a/src/SDK/Client/Actor/Components/ActorGameTypeComponent.hpp +++ b/src/SDK/Client/Actor/Components/ActorGameTypeComponent.hpp @@ -1,5 +1,7 @@ #pragma once +#include "../EntityContext.hpp" + enum class GameType : int { Survival = 0, Creative = 1, @@ -10,6 +12,7 @@ enum class GameType : int { Spectator = 6, }; -struct ActorGameTypeComponent { +struct ActorGameTypeComponent : IEntityComponent { GameType gameType; -}; \ No newline at end of file +}; +static_assert(sizeof(ActorGameTypeComponent) == 0x4); \ No newline at end of file diff --git a/src/SDK/Client/Actor/Components/MobEffectsComponent.hpp b/src/SDK/Client/Actor/Components/MobEffectsComponent.hpp index c1399044..4a5cad1f 100644 --- a/src/SDK/Client/Actor/Components/MobEffectsComponent.hpp +++ b/src/SDK/Client/Actor/Components/MobEffectsComponent.hpp @@ -4,6 +4,8 @@ #include #include #include "../../Render/TexturePtr.hpp" +#include "../EntityContext.hpp" +#include "../../../Utils/Versions/WinrtUtils.hpp" // LeviLamina @@ -170,9 +172,9 @@ class MobEffect { } }; -class MobEffectInstance { +class MobEffectInstance1_21_20 { public: - MobEffectInstance() = delete; + MobEffectInstance1_21_20() = delete; MobEffect::EffectType id; int duration; int durationEasy; @@ -185,7 +187,7 @@ class MobEffectInstance { bool effectVisible; char pad_0064[0x64]; }; -static_assert(sizeof(MobEffectInstance) == 0x80); +static_assert(sizeof(MobEffectInstance1_21_20) == 0x80); class MobEffectInstance1_21_30 { public: @@ -206,16 +208,6 @@ class MobEffectInstance1_21_30 { }; static_assert(sizeof(MobEffectInstance1_21_30) == 0x88); -struct MobEffectsComponent -{ - std::vector effects; -}; - -struct MobEffectsComponent1_21_30 -{ - std::vector effects; -}; - struct UnifiedMobEffectData { MobEffect::EffectType id; int duration; @@ -251,3 +243,40 @@ struct UnifiedMobEffectData { return location; } }; + +struct MobEffectsComponent1_21_20 +{ + std::vector effects; +}; + +struct MobEffectsComponent1_21_30 +{ + std::vector effects; +}; + +class MobEffectInstance {}; + +struct MobEffectsComponent : IEntityComponent { +private: + std::vector effects; +public: + [[nodiscard]] std::vector getUnifiedEffects() const { + std::vector unifiedEffects; + if (WinrtUtils::check(21, 30)) { + auto& _effects = hat::member_at>(this, 0x0); + for (auto &effect : _effects) { + unifiedEffects.emplace_back(effect.id, effect.duration, effect.amplifier); + } + } else { + auto& _effects = hat::member_at>(this, 0x0); + + for (auto &effect : _effects) { + unifiedEffects.emplace_back(effect.id, effect.duration, effect.amplifier); + } + } + return unifiedEffects; + } +}; +static_assert(sizeof(MobEffectsComponent) == 0x18); + + diff --git a/src/SDK/Client/Actor/Components/MoveInputComponent.hpp b/src/SDK/Client/Actor/Components/MoveInputComponent.hpp index 23a25336..d4806d43 100644 --- a/src/SDK/Client/Actor/Components/MoveInputComponent.hpp +++ b/src/SDK/Client/Actor/Components/MoveInputComponent.hpp @@ -1,7 +1,11 @@ #include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" +#include "../EntityContext.hpp" -struct MoveInputComponent { +struct MoveInputComponent : IEntityComponent { +private: + std::byte pad_0000[0x88]; // ? calculateMoveVector@PlayerMovement +public: BUILD_ACCESS(this, bool, forward, GET_OFFSET("MoveInputComponent::forward")); BUILD_ACCESS(this, bool, backward, GET_OFFSET("MoveInputComponent::backward")); BUILD_ACCESS(this, bool, left, GET_OFFSET("MoveInputComponent::left")); @@ -11,4 +15,5 @@ struct MoveInputComponent { BUILD_ACCESS(this, bool, jumping, GET_OFFSET("MoveInputComponent::jumping")); BUILD_ACCESS(this, bool, sprinting, GET_OFFSET("MoveInputComponent::sprinting")); -}; \ No newline at end of file +}; +static_assert(sizeof(MoveInputComponent) == 0x88); \ No newline at end of file diff --git a/src/SDK/Client/Actor/Components/OnGroundFlagComponent.hpp b/src/SDK/Client/Actor/Components/OnGroundFlagComponent.hpp index 25117af2..fc804084 100644 --- a/src/SDK/Client/Actor/Components/OnGroundFlagComponent.hpp +++ b/src/SDK/Client/Actor/Components/OnGroundFlagComponent.hpp @@ -1,3 +1,6 @@ #pragma once -struct OnGroundFlagComponent {}; \ No newline at end of file +#include "../EntityContext.hpp" + +struct OnGroundFlagComponent : IEntityComponent {}; +static_assert(sizeof(OnGroundFlagComponent) == 0x1); \ No newline at end of file diff --git a/src/SDK/Client/Actor/Components/RenderPositionComponent.hpp b/src/SDK/Client/Actor/Components/RenderPositionComponent.hpp index e30a9d44..faf2b887 100644 --- a/src/SDK/Client/Actor/Components/RenderPositionComponent.hpp +++ b/src/SDK/Client/Actor/Components/RenderPositionComponent.hpp @@ -1,7 +1,9 @@ #pragma once #include "../../../../Utils/Utils.hpp" +#include "../EntityContext.hpp" -struct RenderPositionComponent { +struct RenderPositionComponent : IEntityComponent { Vec3 renderPos; -}; \ No newline at end of file +}; +static_assert(sizeof(RenderPositionComponent) == 0xC); \ No newline at end of file diff --git a/src/SDK/Client/Actor/Components/RuntimeIDComponent.hpp b/src/SDK/Client/Actor/Components/RuntimeIDComponent.hpp index 60c9d9c6..eec595b8 100644 --- a/src/SDK/Client/Actor/Components/RuntimeIDComponent.hpp +++ b/src/SDK/Client/Actor/Components/RuntimeIDComponent.hpp @@ -1,6 +1,7 @@ #pragma once #include -struct RuntimeIDComponent { +struct RuntimeIDComponent : IEntityComponent { int64_t runtimeID; }; +static_assert(sizeof(RuntimeIDComponent) == 0x8); diff --git a/src/SDK/Client/Actor/Components/StateVectorComponent.hpp b/src/SDK/Client/Actor/Components/StateVectorComponent.hpp index 5d5ab39f..09cd3158 100644 --- a/src/SDK/Client/Actor/Components/StateVectorComponent.hpp +++ b/src/SDK/Client/Actor/Components/StateVectorComponent.hpp @@ -1,10 +1,12 @@ #pragma once #include "../../../../Utils/Utils.hpp" +#include "../EntityContext.hpp" -class StateVectorComponent { +struct StateVectorComponent : IEntityComponent { public: Vec3 Pos; Vec3 PrevPos; Vec3 velocity; -}; \ No newline at end of file +}; +static_assert(sizeof(StateVectorComponent) == 0x24); \ No newline at end of file diff --git a/src/SDK/Client/Actor/EntityContext.hpp b/src/SDK/Client/Actor/EntityContext.hpp index 9e0676bd..e26b2310 100644 --- a/src/SDK/Client/Actor/EntityContext.hpp +++ b/src/SDK/Client/Actor/EntityContext.hpp @@ -1,18 +1,119 @@ #pragma once -using EntityId = uint32_t; +class EntityId; + +struct EntityIdTraits { + using value_type = EntityId; + + using entity_type = uint32_t; + using version_type = uint16_t; + + static constexpr entity_type entity_mask = 0x3FFFF; + static constexpr entity_type version_mask = 0x3FFF; +}; + +template <> +class entt::entt_traits : public entt::basic_entt_traits { +public: + static constexpr entity_type page_size = 2048; +}; + +struct IEntityComponent {}; + +template Type> +struct entt::component_traits { + using type = Type; + static constexpr bool in_place_delete = true; + static constexpr std::size_t page_size = 128 * !std::is_empty_v; +}; + +template +struct entt::storage_type { + using type = basic_storage; +}; + +class EntityId : public entt::entt_traits { +public: + entity_type mRawId{}; + + template + requires(!std::is_same_v, bool>) + [[nodiscard]] constexpr EntityId(T rawId) : mRawId(static_cast(rawId)) {} // NOLINT + + [[nodiscard]] constexpr bool isNull() const { return *this == entt::null; } + + [[nodiscard]] constexpr operator entity_type() const { return mRawId; } + + constexpr bool operator==(const EntityId& other) const { + return mRawId == other.mRawId; + } +}; namespace V1_20_50 { - class EntityRegistry { - char pad0x0[0x30]; + class EntityRegistry : public std::enable_shared_from_this { public: - uintptr_t ®istry; + std::string name; + entt::basic_registry ownedRegistry; + uint32_t id; }; class EntityContext { public: - EntityRegistry& registry; - uintptr_t &basicReg; - EntityId id; + EntityRegistry ®istry; + entt::basic_registry &enttRegistry; + EntityId entity; + + template T> + [[nodiscard]] T *tryGetComponent(EntityId id) { + return this->enttRegistry.try_get(id); + } + + template T> + [[nodiscard]] T *tryGetComponent() { + return this->enttRegistry.try_get(this->entity); + } + + template T> + [[nodiscard]] const T *tryGetComponent() const { + return this->enttRegistry.try_get(this->entity); + } + + template T> + [[nodiscard]] bool hasComponent() const { + return this->enttRegistry.all_of(this->entity); + } + + template T> + void addComponent() { + return this->enttRegistry.get_or_emplace(this->entity); + } + + template T> + void removeComponent() { + this->enttRegistry.remove(this->entity); + } + }; +} + +namespace V1_20_40 { + struct EntityRegistryBase { + entt::basic_registry& registry; + uint32_t id; + }; + + struct EntityRegistry : EntityRegistryBase, std::enable_shared_from_this { + std::string name; + entt::basic_registry ownedRegistry; + }; + + struct EntityContextBase { + EntityRegistryBase& registry; + EntityId entity; + }; + + struct EntityContext : EntityContextBase { + entt::basic_registry& getEnttRegistry() const { + return static_cast(this->registry).ownedRegistry; + } }; } \ No newline at end of file diff --git a/src/Utils/Memory/Game/Sig/SigInit.cpp b/src/Utils/Memory/Game/Sig/SigInit.cpp index ee8dea7b..6c8d7371 100644 --- a/src/Utils/Memory/Game/Sig/SigInit.cpp +++ b/src/Utils/Memory/Game/Sig/SigInit.cpp @@ -14,7 +14,6 @@ void SigInit::init2130() { ADD_SIG("tryGetPrefix3", "40 53 48 83 EC 40 48 8B"); - ADD_SIG("Actor::getOnGroundFlagComponent", "DA BA A3 99 E2 C3"); ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4B 48"); @@ -83,6 +82,8 @@ void SigInit::init2100() { ADD_SIG("glm_rotateRef", "E8 ? ? ? ? 41 BD ? ? ? ? 41 0F B6 46"); + ADD_SIG("Actor::getOnGroundFlagComponent", "DA BA A3 99 E2 C3"); + ADD_SIG("glm_translateRef", "? ? ? ? ? 4C 8D 05 ? ? ? ? 44 0F 28 05"); ADD_SIG("glm_translateRef2", "? ? ? ? ? C6 46 ? ? F3 0F 11 74 24 ? F3 0F 10 1D"); @@ -112,6 +113,7 @@ void SigInit::init2080() { ADD_SIG("ItemRenderer::render", "48 8B C4 48 89 58 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 ? 0F 29 78 ? 44 0F 29 ? ? 44 0F 29 ? ? 44 0F 29 ? ? ? ? ? 44 0F 29 ? ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 49 8B F8"); DEPRECATE_SIG("Actor::getArmor"); + DEPRECATE_SIG("Actor::getOffhandSlot"); } void SigInit::init2070() { @@ -144,8 +146,6 @@ void SigInit::init2060() { ADD_SIG("Level::getRuntimeActorList", "40 53 48 83 EC 30 48 81 C1 C8 1C 00 00"); ADD_SIG("ActorCollision::isOnGround", "E8 ? ? ? ? 84 C0 49 8B 87"); - - DEPRECATE_SIG("Actor::getOffhandSlot"); } void SigInit::init2050() { @@ -184,6 +184,8 @@ void SigInit::init2040() { ADD_SIG("LoopbackPacketSender::sendPacket", "48 83 EC ? 48 0F BE ? ? 48 83 C0 ? 74 27"); + ADD_SIG("ActorCollision::isOnGround", "?"); + ADD_SIG("Options::getGamma", "? ? ? ? ? ? ? ? ? ? ? 48 8D 54 24 ? 48 8B 01 48 8B 40 ? 74 ? 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42 ? 48 83 C4 ? C3 41 B8 ? ? ? ? FF 15 ? ? ? ? 48 8B 10 48 85 D2 75 ? E8 ? ? ? ? CC E8 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC F3 0F 11 4C 24"); ADD_SIG("Actor::canSee", "E8 ? ? ? ? 84 C0 74 1C 48 8B 4F 48"); From dcc310a61724b20941a4e0f7d2eddd143b56ed50 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 19 Oct 2024 23:27:46 +0600 Subject: [PATCH 205/240] every 10 mins instead --- main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index 66f091c3..67c0c075 100644 --- a/main.cpp +++ b/main.cpp @@ -109,7 +109,7 @@ DWORD WINAPI init(HMODULE real) lastOnlineUsersFetchTime = now; } - if(SDK::clientInstance && onlineAnnouncementElapsed >= std::chrono::minutes(3)) { + if(SDK::clientInstance && onlineAnnouncementElapsed >= std::chrono::minutes(10)) { SDK::clientInstance->getGuiData()->displayClientMessage("§khiii §r §n§l§4FLARIAL §r§khiii \n§r§cDonate to Flarial! §ehttps://flarial.xyz/donate\n§9Join our discord! §ehttps://flarial.xyz/discord"); lastAnnouncementTime = now; } From 009127d5de7c321c5374b0be9f4775f222fbc11b Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 19 Oct 2024 23:31:19 +0600 Subject: [PATCH 206/240] blur intensity, remove textalias --- src/Client/Module/Manager.cpp | 1 - src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index ad0e096f..72282b41 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -172,7 +172,6 @@ void ModuleManager::initialize() { EventHandler::registerListener(new SaveConfigListener("SaveConfig")); EventHandler::registerListener(new CentreCursorListener("CentreCursor")); EventHandler::registerListener(new rgbListener("RGB Controller")); - EventHandler::registerListener(new TextAliasListener("TextAlias")); EventHandler::registerListener(new HiveModeCatcherListener("HiveModeCatcher")); initialized = true; diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index a3e51296..b9ed259a 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -126,6 +126,7 @@ class ClickGUIRenderer : public Listener { } + if(Client::settings.getSettingByName("blurintensity")->value != 0.01) Blur::RenderBlur(event.RTV, 3, realBlurAmount / 2); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); From 47145fe09ae0f3e4f296a24a0876b6ac12627db8 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sat, 19 Oct 2024 23:34:23 +0600 Subject: [PATCH 207/240] .f --- src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index b9ed259a..d1d98b6b 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -126,7 +126,7 @@ class ClickGUIRenderer : public Listener { } - if(Client::settings.getSettingByName("blurintensity")->value != 0.01) + if(Client::settings.getSettingByName("blurintensity")->value != 0.01f) Blur::RenderBlur(event.RTV, 3, realBlurAmount / 2); float baseHeight = Constraints::RelativeConstraint(baseHeightReal); From 8766e39bfc25b7eb2d0304dcaed0c972a9f2fb9a Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 15:55:38 +0600 Subject: [PATCH 208/240] Performance fix? --- src/Client/GUI/Engine/Engine.hpp | 1 + .../Hook/Hooks/Render/SwapchainHook.cpp | 52 +++++++++++++------ 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index d9e5f091..f8664c91 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -150,6 +150,7 @@ namespace FlarialGUI { bool inline isInWindowRect = false; bool inline inMenu = false; bool inline resizing = false; + bool inline needsBackBuffer = false; bool inline hasLoadedAll = false; inline ID2D1Effect *blur = nullptr; diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index f2d2c797..ad9f03be 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -545,13 +545,17 @@ return funcOriginal(pSwapChain, syncInterval, flags); void SwapchainHook::DX12Blur() { /* Blur Stuff */ - + if(FlarialGUI::inMenu) FlarialGUI::needsBackBuffer = true; + else FlarialGUI::needsBackBuffer = false; /* Blur End */ } void SwapchainHook::DX11Blur() { /* Blur Stuff */ + if(FlarialGUI::inMenu || ModuleManager::getModule("Motion Blur")->active) FlarialGUI::needsBackBuffer = true; + else FlarialGUI::needsBackBuffer = false; + /* Blur End */ } @@ -696,6 +700,9 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() void SwapchainHook::SaveBackbuffer() { + if(!FlarialGUI::needsBackBuffer) return; + std::cout << "using" << std::endl; + if(!SwapchainHook::queue) { Memory::SafeRelease(SavedD3D11BackBuffer); @@ -703,43 +710,56 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() ID3D11DeviceContext* deviceContext = SwapchainHook::context; IDXGISurface1* backBuffer = nullptr; HRESULT hr; - SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); + + hr = SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); + if (FAILED(hr)) { + return; // Early exit on failure + } ID3D11Texture2D* buffer2D = nullptr; - if(FAILED(backBuffer->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&buffer2D)))) std::cout << "failed to get 2d" << std::endl; + if (FAILED(backBuffer->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&buffer2D)))) { + Memory::SafeRelease(backBuffer); + return; // Early exit on failure + } D3D11_TEXTURE2D_DESC desc; buffer2D->GetDesc(&desc); - HRESULT r; - if(!stageTex) { + if (!stageTex) { D3D11_TEXTURE2D_DESC stageDesc = desc; stageDesc.Usage = D3D11_USAGE_STAGING; stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; stageDesc.BindFlags = 0; - r = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); - if (FAILED(r)) std::cout << "Failed to create stage texture: " << std::hex << r << std::endl; - } - deviceContext->CopyResource(stageTex, buffer2D); + hr = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); + if (FAILED(hr)) { + Memory::SafeRelease(backBuffer); + Memory::SafeRelease(buffer2D); + return; + } + } + deviceContext->CopySubresourceRegion(stageTex, 0, 0, 0, 0, buffer2D, 0, nullptr); - D3D11_TEXTURE2D_DESC defaultDesc = desc; - defaultDesc.Usage = D3D11_USAGE_DEFAULT; - defaultDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - defaultDesc.CPUAccessFlags = 0; + if (!SavedD3D11BackBuffer) { + D3D11_TEXTURE2D_DESC defaultDesc = desc; + defaultDesc.Usage = D3D11_USAGE_DEFAULT; + defaultDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + defaultDesc.CPUAccessFlags = 0; - if(!SavedD3D11BackBuffer) { hr = SwapchainHook::d3d11Device->CreateTexture2D(&defaultDesc, nullptr, &SavedD3D11BackBuffer); if (FAILED(hr)) { - std::cout << "Failed to create def texture: " << std::hex << r << std::endl; + Memory::SafeRelease(backBuffer); + Memory::SafeRelease(buffer2D); + return; } } - deviceContext->CopyResource(SavedD3D11BackBuffer, stageTex); + deviceContext->CopySubresourceRegion(SavedD3D11BackBuffer, 0, 0, 0, 0, stageTex, 0, nullptr); Memory::SafeRelease(backBuffer); Memory::SafeRelease(buffer2D); + } else { From 738cae2b5f2229e0bc610c112197bd47dc50bea4 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 16:10:14 +0600 Subject: [PATCH 209/240] Update SwapchainHook.cpp --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index ad9f03be..f7587651 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -701,7 +701,6 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() void SwapchainHook::SaveBackbuffer() { if(!FlarialGUI::needsBackBuffer) return; - std::cout << "using" << std::endl; if(!SwapchainHook::queue) { From cf2c237938d4142a8018df174c5ce58ed70639ce Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 16:15:56 +0600 Subject: [PATCH 210/240] no need for backbuffer in ClickGUI --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 2 -- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index a71d851c..39bd7dec 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -292,7 +292,6 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio if(intensity < 0) return; - if (!SwapchainHook::GetBackbuffer()) return; ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); if (!pOrigShaderResourceView) return; @@ -303,7 +302,6 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio std::vector shaderResourceViews; std::vector fbSizes; D3D11_TEXTURE2D_DESC desc; - SwapchainHook::GetBackbuffer()->GetDesc(&desc); if(!hasDoneFrames) framebuffers.reserve((size_t)iterations); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index f7587651..cb81735c 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -545,15 +545,14 @@ return funcOriginal(pSwapChain, syncInterval, flags); void SwapchainHook::DX12Blur() { /* Blur Stuff */ - if(FlarialGUI::inMenu) FlarialGUI::needsBackBuffer = true; - else FlarialGUI::needsBackBuffer = false; + /* Blur End */ } void SwapchainHook::DX11Blur() { /* Blur Stuff */ - if(FlarialGUI::inMenu || ModuleManager::getModule("Motion Blur")->active) FlarialGUI::needsBackBuffer = true; + if(ModuleManager::getModule("Motion Blur")->active) FlarialGUI::needsBackBuffer = true; else FlarialGUI::needsBackBuffer = false; /* Blur End */ From 774a5ef9594d36ea07f9c007578948b9e0819ac6 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 16:23:43 +0600 Subject: [PATCH 211/240] fix --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 2 ++ src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 10 ++++++---- src/Client/Hook/Hooks/Render/SwapchainHook.hpp | 8 +++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 39bd7dec..65d1d69d 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -292,6 +292,7 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio if(intensity < 0) return; + if(!SwapchainHook::GetBackbuffer()) return; ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); if (!pOrigShaderResourceView) return; @@ -302,6 +303,7 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio std::vector shaderResourceViews; std::vector fbSizes; D3D11_TEXTURE2D_DESC desc; + desc = SwapchainHook::avgDesc; if(!hasDoneFrames) framebuffers.reserve((size_t)iterations); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index cb81735c..6a06ca6b 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -592,7 +592,7 @@ void SwapchainHook::DX11Init() { } - SaveBackbuffer(); + SaveBackbuffer(true); Blur::InitializePipeline(); Memory::SafeRelease(eBackBuffer); @@ -687,6 +687,8 @@ void SwapchainHook::DX12Init() { Memory::SafeRelease(dxgiDevice); Memory::SafeRelease(d2dFactory); + SaveBackbuffer(true); + Blur::InitializePipeline(); init = true; } @@ -697,9 +699,9 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() return SavedD3D11BackBuffer; } - void SwapchainHook::SaveBackbuffer() { + void SwapchainHook::SaveBackbuffer(bool smth) { - if(!FlarialGUI::needsBackBuffer) return; + if(!smth) if(!FlarialGUI::needsBackBuffer) return; if(!SwapchainHook::queue) { @@ -754,7 +756,7 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() } deviceContext->CopySubresourceRegion(SavedD3D11BackBuffer, 0, 0, 0, 0, stageTex, 0, nullptr); - + SavedD3D11BackBuffer->GetDesc(&SwapchainHook::avgDesc); Memory::SafeRelease(backBuffer); Memory::SafeRelease(buffer2D); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp index 1d672355..fbbf07ed 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp @@ -25,9 +25,10 @@ class SwapchainHook : public Hook { IDXGIOutput *pRestrictToOutput, IDXGISwapChain1 **ppSwapChain); + static HRESULT CreateSwapChainForCoreWindow(IDXGIFactory2 *This, IUnknown *pDevice, IUnknown *pWindow, - DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIOutput *pRestrictToOutput, - IDXGISwapChain1 **ppSwapChain); + DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIOutput *pRestrictToOutput, + IDXGISwapChain1 **ppSwapChain); static HRESULT swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncInterval, UINT flags); @@ -44,7 +45,7 @@ class SwapchainHook : public Hook { static void DX12Init(); static ID3D11Texture2D* GetBackbuffer(); - static void SaveBackbuffer(); + static void SaveBackbuffer(bool smth = false); typedef HRESULT(__thiscall *SwapchainOriginal)(IDXGISwapChain3 *, UINT, UINT); @@ -55,6 +56,7 @@ class SwapchainHook : public Hook { void enableHook() override; static inline ID3D11Texture2D* SavedD3D11BackBuffer; + static inline D3D11_TEXTURE2D_DESC avgDesc; static ID3D12CommandQueue *queue; static inline std::vector DXGISurfaces; static inline std::vector D2D1Bitmaps; From 6d656a8995ce1318f5231ba8e01793dc71ef09c3 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 16:28:29 +0600 Subject: [PATCH 212/240] Revert "fix" This reverts commit 774a5ef9594d36ea07f9c007578948b9e0819ac6. --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 2 -- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 10 ++++------ src/Client/Hook/Hooks/Render/SwapchainHook.hpp | 8 +++----- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 65d1d69d..39bd7dec 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -292,7 +292,6 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio if(intensity < 0) return; - if(!SwapchainHook::GetBackbuffer()) return; ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); if (!pOrigShaderResourceView) return; @@ -303,7 +302,6 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio std::vector shaderResourceViews; std::vector fbSizes; D3D11_TEXTURE2D_DESC desc; - desc = SwapchainHook::avgDesc; if(!hasDoneFrames) framebuffers.reserve((size_t)iterations); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 6a06ca6b..cb81735c 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -592,7 +592,7 @@ void SwapchainHook::DX11Init() { } - SaveBackbuffer(true); + SaveBackbuffer(); Blur::InitializePipeline(); Memory::SafeRelease(eBackBuffer); @@ -687,8 +687,6 @@ void SwapchainHook::DX12Init() { Memory::SafeRelease(dxgiDevice); Memory::SafeRelease(d2dFactory); - SaveBackbuffer(true); - Blur::InitializePipeline(); init = true; } @@ -699,9 +697,9 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() return SavedD3D11BackBuffer; } - void SwapchainHook::SaveBackbuffer(bool smth) { + void SwapchainHook::SaveBackbuffer() { - if(!smth) if(!FlarialGUI::needsBackBuffer) return; + if(!FlarialGUI::needsBackBuffer) return; if(!SwapchainHook::queue) { @@ -756,7 +754,7 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() } deviceContext->CopySubresourceRegion(SavedD3D11BackBuffer, 0, 0, 0, 0, stageTex, 0, nullptr); - SavedD3D11BackBuffer->GetDesc(&SwapchainHook::avgDesc); + Memory::SafeRelease(backBuffer); Memory::SafeRelease(buffer2D); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp index fbbf07ed..1d672355 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp @@ -25,10 +25,9 @@ class SwapchainHook : public Hook { IDXGIOutput *pRestrictToOutput, IDXGISwapChain1 **ppSwapChain); - static HRESULT CreateSwapChainForCoreWindow(IDXGIFactory2 *This, IUnknown *pDevice, IUnknown *pWindow, - DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIOutput *pRestrictToOutput, - IDXGISwapChain1 **ppSwapChain); + DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIOutput *pRestrictToOutput, + IDXGISwapChain1 **ppSwapChain); static HRESULT swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncInterval, UINT flags); @@ -45,7 +44,7 @@ class SwapchainHook : public Hook { static void DX12Init(); static ID3D11Texture2D* GetBackbuffer(); - static void SaveBackbuffer(bool smth = false); + static void SaveBackbuffer(); typedef HRESULT(__thiscall *SwapchainOriginal)(IDXGISwapChain3 *, UINT, UINT); @@ -56,7 +55,6 @@ class SwapchainHook : public Hook { void enableHook() override; static inline ID3D11Texture2D* SavedD3D11BackBuffer; - static inline D3D11_TEXTURE2D_DESC avgDesc; static ID3D12CommandQueue *queue; static inline std::vector DXGISurfaces; static inline std::vector D2D1Bitmaps; From 1a321482d27aa1dc9a9fd7ce0a6ad32fa6c1cae0 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 16:28:32 +0600 Subject: [PATCH 213/240] Revert "no need for backbuffer in ClickGUI" This reverts commit cf2c237938d4142a8018df174c5ce58ed70639ce. --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 2 ++ src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 39bd7dec..a71d851c 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -292,6 +292,7 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio if(intensity < 0) return; + if (!SwapchainHook::GetBackbuffer()) return; ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); if (!pOrigShaderResourceView) return; @@ -302,6 +303,7 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio std::vector shaderResourceViews; std::vector fbSizes; D3D11_TEXTURE2D_DESC desc; + SwapchainHook::GetBackbuffer()->GetDesc(&desc); if(!hasDoneFrames) framebuffers.reserve((size_t)iterations); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index cb81735c..f7587651 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -545,14 +545,15 @@ return funcOriginal(pSwapChain, syncInterval, flags); void SwapchainHook::DX12Blur() { /* Blur Stuff */ - + if(FlarialGUI::inMenu) FlarialGUI::needsBackBuffer = true; + else FlarialGUI::needsBackBuffer = false; /* Blur End */ } void SwapchainHook::DX11Blur() { /* Blur Stuff */ - if(ModuleManager::getModule("Motion Blur")->active) FlarialGUI::needsBackBuffer = true; + if(FlarialGUI::inMenu || ModuleManager::getModule("Motion Blur")->active) FlarialGUI::needsBackBuffer = true; else FlarialGUI::needsBackBuffer = false; /* Blur End */ From cc6687915028efa1347364bdf5597281d564630f Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 16:36:14 +0600 Subject: [PATCH 214/240] mb fix --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index f7587651..4fdce4a9 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -553,7 +553,7 @@ void SwapchainHook::DX12Blur() { void SwapchainHook::DX11Blur() { /* Blur Stuff */ - if(FlarialGUI::inMenu || ModuleManager::getModule("Motion Blur")->active) FlarialGUI::needsBackBuffer = true; + if(FlarialGUI::inMenu || ModuleManager::getModule("Motion Blur")->isEnabled()) FlarialGUI::needsBackBuffer = true; else FlarialGUI::needsBackBuffer = false; /* Blur End */ From 6856f56ea052decdb69496ea59d912094ffa806a Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 19:58:47 +0600 Subject: [PATCH 215/240] Improved SaveBackbuffer --- .../Hook/Hooks/Render/SwapchainHook.cpp | 96 +------------------ 1 file changed, 5 insertions(+), 91 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 4fdce4a9..38c10019 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -131,6 +131,7 @@ HRESULT SwapchainHook::CreateSwapChainForCoreWindow(IDXGIFactory2 *This, IUnknow fEnabled = TRUE; pDesc->Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; + pDesc->BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT; MADECHAIN = TRUE; return IDXGIFactory2_CreateSwapChainForCoreWindow(This, pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain); } @@ -702,102 +703,15 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() if(!FlarialGUI::needsBackBuffer) return; - if(!SwapchainHook::queue) { - - Memory::SafeRelease(SavedD3D11BackBuffer); - - ID3D11DeviceContext* deviceContext = SwapchainHook::context; - IDXGISurface1* backBuffer = nullptr; - HRESULT hr; - - hr = SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); - if (FAILED(hr)) { - return; // Early exit on failure - } - - ID3D11Texture2D* buffer2D = nullptr; - if (FAILED(backBuffer->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&buffer2D)))) { - Memory::SafeRelease(backBuffer); - return; // Early exit on failure - } - - D3D11_TEXTURE2D_DESC desc; - buffer2D->GetDesc(&desc); - - if (!stageTex) { - D3D11_TEXTURE2D_DESC stageDesc = desc; - stageDesc.Usage = D3D11_USAGE_STAGING; - stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - stageDesc.BindFlags = 0; - - hr = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); - if (FAILED(hr)) { - Memory::SafeRelease(backBuffer); - Memory::SafeRelease(buffer2D); - return; - } - } - - deviceContext->CopySubresourceRegion(stageTex, 0, 0, 0, 0, buffer2D, 0, nullptr); - - if (!SavedD3D11BackBuffer) { - D3D11_TEXTURE2D_DESC defaultDesc = desc; - defaultDesc.Usage = D3D11_USAGE_DEFAULT; - defaultDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - defaultDesc.CPUAccessFlags = 0; + Memory::SafeRelease(SavedD3D11BackBuffer); - hr = SwapchainHook::d3d11Device->CreateTexture2D(&defaultDesc, nullptr, &SavedD3D11BackBuffer); - if (FAILED(hr)) { - Memory::SafeRelease(backBuffer); - Memory::SafeRelease(buffer2D); - return; - } - } - - deviceContext->CopySubresourceRegion(SavedD3D11BackBuffer, 0, 0, 0, 0, stageTex, 0, nullptr); + if(!SwapchainHook::queue) { - Memory::SafeRelease(backBuffer); - Memory::SafeRelease(buffer2D); + SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&SavedD3D11BackBuffer)); } else { + D3D11Resources[currentBitmap]->QueryInterface(IID_PPV_ARGS(&SavedD3D11BackBuffer)); - ID3D11Texture2D* buffer2D = nullptr; - HRESULT hr; - hr = D3D11Resources[currentBitmap]->QueryInterface(IID_PPV_ARGS(&buffer2D)); - if (FAILED(hr)) std::cout << "Failed to query interface: " << std::hex << hr << std::endl; - - ID3D11DeviceContext* deviceContext = context; - - D3D11_TEXTURE2D_DESC desc; - buffer2D->GetDesc(&desc); - HRESULT r; - - if(!stageTex) { - D3D11_TEXTURE2D_DESC stageDesc = {}; - stageDesc = desc; - stageDesc.Usage = D3D11_USAGE_STAGING; - stageDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; - stageDesc.BindFlags = 0; - stageDesc.MiscFlags = 0; - r = SwapchainHook::d3d11Device->CreateTexture2D(&stageDesc, nullptr, &stageTex); - if (FAILED(r)) std::cout << "Failed to create stage texture: " << std::hex << r << std::endl; - } - deviceContext->CopyResource(stageTex, buffer2D); - - D3D11_TEXTURE2D_DESC defaultDesc = desc; - defaultDesc.Usage = D3D11_USAGE_DEFAULT; - defaultDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - defaultDesc.CPUAccessFlags = 0; - - if(!SavedD3D11BackBuffer) { - hr = SwapchainHook::d3d11Device->CreateTexture2D(&defaultDesc, nullptr, &SavedD3D11BackBuffer); - if (FAILED(hr)) { - std::cout << "Failed to create def texture: " << std::hex << r << std::endl; - } - } - - deviceContext->CopyResource(SavedD3D11BackBuffer, stageTex); - Memory::SafeRelease(buffer2D); } } From aa4231f94de5e9cdca83078fc088599ed05bd095 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 20:49:14 +0600 Subject: [PATCH 216/240] most optimal fix --- .../Hook/Hooks/Render/SwapchainHook.cpp | 22 ++++++++++++++++--- .../Hook/Hooks/Render/SwapchainHook.hpp | 2 ++ .../Modules/MotionBlur/MotionBlurListener.hpp | 4 ++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 38c10019..8713b68e 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -554,7 +554,7 @@ void SwapchainHook::DX12Blur() { void SwapchainHook::DX11Blur() { /* Blur Stuff */ - if(FlarialGUI::inMenu || ModuleManager::getModule("Motion Blur")->isEnabled()) FlarialGUI::needsBackBuffer = true; + if(ModuleManager::getModule("Motion Blur")->isEnabled() && !FlarialGUI::inMenu) FlarialGUI::needsBackBuffer = true; else FlarialGUI::needsBackBuffer = false; /* Blur End */ @@ -701,14 +701,30 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() void SwapchainHook::SaveBackbuffer() { - if(!FlarialGUI::needsBackBuffer) return; - Memory::SafeRelease(SavedD3D11BackBuffer); if(!SwapchainHook::queue) { SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&SavedD3D11BackBuffer)); + if(FlarialGUI::needsBackBuffer) { + D3D11_TEXTURE2D_DESC textureDesc = {}; + textureDesc.Width = D2D::context->GetSize().width; + textureDesc.Height = D2D::context->GetSize().height; + textureDesc.MipLevels = 1; + textureDesc.ArraySize = 1; + textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + textureDesc.SampleDesc.Count = 1; + textureDesc.Usage = D3D11_USAGE_DEFAULT; + textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + textureDesc.CPUAccessFlags = 0; + + SwapchainHook::d3d11Device->CreateTexture2D(&textureDesc, nullptr, &ExtraSavedD3D11BackBuffer); + + context->CopyResource(ExtraSavedD3D11BackBuffer, SavedD3D11BackBuffer); + } + + } else { D3D11Resources[currentBitmap]->QueryInterface(IID_PPV_ARGS(&SavedD3D11BackBuffer)); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp index 1d672355..c60873fa 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.hpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.hpp @@ -55,6 +55,8 @@ class SwapchainHook : public Hook { void enableHook() override; static inline ID3D11Texture2D* SavedD3D11BackBuffer; + static inline ID3D11Texture2D* ExtraSavedD3D11BackBuffer; + static ID3D12CommandQueue *queue; static inline std::vector DXGISurfaces; static inline std::vector D2D1Bitmaps; diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index 6f69f9a1..2f370fe0 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -86,7 +86,7 @@ class MotionBlurListener : public Listener { HRESULT hr; D3D11_TEXTURE2D_DESC d; - SwapchainHook::GetBackbuffer()->GetDesc(&d); + SwapchainHook::ExtraSavedD3D11BackBuffer->GetDesc(&d); ID3D11ShaderResourceView* outSRV; D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; srvDesc.Format = d.Format; @@ -94,7 +94,7 @@ class MotionBlurListener : public Listener { srvDesc.Texture2D.MipLevels = d.MipLevels; srvDesc.Texture2D.MostDetailedMip = 0; - if (FAILED(hr = SwapchainHook::d3d11Device->CreateShaderResourceView(SwapchainHook::GetBackbuffer(), &srvDesc, &outSRV))) + if (FAILED(hr = SwapchainHook::d3d11Device->CreateShaderResourceView(SwapchainHook::ExtraSavedD3D11BackBuffer, &srvDesc, &outSRV))) { std::cout << "Failed to create shader resource view: " << std::hex << hr << std::endl; } From e4afd7da8ac6643c05cee81dd011d42bbe65e972 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 20:53:39 +0600 Subject: [PATCH 217/240] nope ig i need to call createtexture2d every frame for now --- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 8713b68e..39c8efa0 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -702,6 +702,7 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() void SwapchainHook::SaveBackbuffer() { Memory::SafeRelease(SavedD3D11BackBuffer); + Memory::SafeRelease(ExtraSavedD3D11BackBuffer); if(!SwapchainHook::queue) { From d1a57c0d5bbfc237fe1aab05d6d304ac812ad30a Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 21:19:45 +0600 Subject: [PATCH 218/240] crash fix --- .../Modules/MotionBlur/MotionBlurListener.hpp | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index 2f370fe0..6cd16fe4 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -43,7 +43,7 @@ class MotionBlurListener : public Listener { previousFrames.erase(previousFrames.begin(), previousFrames.begin() + framesToRemove); } - ID3D11ShaderResourceView* buffer = BackbufferToSRV(); + ID3D11ShaderResourceView* buffer = BackbufferToSRVExtraMode(); if(buffer) previousFrames.push_back(buffer); else std::cout << "Couldn't save buffer for Motion Blur."; @@ -81,7 +81,9 @@ class MotionBlurListener : public Listener { ImGui::SetCursorScreenPos(ImVec2(pos.x + size.x, pos.y)); } - static ID3D11ShaderResourceView* BackbufferToSRV() { + static ID3D11ShaderResourceView* BackbufferToSRVExtraMode() { + + if(!FlarialGUI::needsBackBuffer) return nullptr; HRESULT hr; @@ -101,4 +103,25 @@ class MotionBlurListener : public Listener { return outSRV; } + + static ID3D11ShaderResourceView* BackbufferToSRV() { + + HRESULT hr; + + D3D11_TEXTURE2D_DESC d; + SwapchainHook::SavedD3D11BackBuffer->GetDesc(&d); + ID3D11ShaderResourceView* outSRV; + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; + srvDesc.Format = d.Format; + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = d.MipLevels; + srvDesc.Texture2D.MostDetailedMip = 0; + + if (FAILED(hr = SwapchainHook::d3d11Device->CreateShaderResourceView(SwapchainHook::SavedD3D11BackBuffer, &srvDesc, &outSRV))) + { + std::cout << "Failed to create shader resource view: " << std::hex << hr << std::endl; + } + + return outSRV; + } }; \ No newline at end of file From 49de74ebfea80fcbcedf3765eebcebca34101cf9 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Sun, 20 Oct 2024 21:58:35 +0600 Subject: [PATCH 219/240] 11on12 blur fix --- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 4 +++- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 12 ++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index a71d851c..20c0a7bb 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -295,7 +295,9 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio if (!SwapchainHook::GetBackbuffer()) return; ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); - if (!pOrigShaderResourceView) return; + if (!pOrigShaderResourceView) { + return; + } ID3D11DeviceContext* pContext = SwapchainHook::context; diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 39c8efa0..6d9c5e68 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -580,7 +580,7 @@ void SwapchainHook::DX11Init() { D2D1_BITMAP_PROPERTIES1 props = D2D1::BitmapProperties1( D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW, - D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED), 96.0, 96.0); + D2D1::PixelFormat(DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED), 96.0, 96.0); D2D::context->CreateBitmapFromDxgiSurface(eBackBuffer, props, &D2D1Bitmap); //ImGui Init @@ -646,7 +646,7 @@ void SwapchainHook::DX12Init() { D2D1_BITMAP_PROPERTIES1 props = D2D1::BitmapProperties1( D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW, - D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED), dpi, dpi); + D2D1::PixelFormat(DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED), dpi, dpi); D3D12_DESCRIPTOR_HEAP_DESC heapDescriptorBackBuffers = {}; heapDescriptorBackBuffers.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; @@ -668,7 +668,7 @@ void SwapchainHook::DX12Init() { rtvHandle.ptr += rtvDescriptorSize; - D3D11_RESOURCE_FLAGS d3d11_flags = {D3D11_BIND_RENDER_TARGET}; + D3D11_RESOURCE_FLAGS d3d11_flags = { D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE}; d3d11On12Device->CreateWrappedResource(backBufferPtr, &d3d11_flags, D3D12_RESOURCE_STATE_RENDER_TARGET, @@ -727,8 +727,8 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() } else { - - D3D11Resources[currentBitmap]->QueryInterface(IID_PPV_ARGS(&SavedD3D11BackBuffer)); - + HRESULT hr; + hr = D3D11Resources[currentBitmap]->QueryInterface(IID_PPV_ARGS(&SavedD3D11BackBuffer)); + if (FAILED(hr)) std::cout << "Failed to query interface: " << std::hex << hr << std::endl; } } From 621c963e2fcd166e0e24fd21e3aab190b97b332d Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:32:00 +0600 Subject: [PATCH 220/240] remove (Sometimes) --- src/Client/Hook/Hooks/Render/ResizeHook.cpp | 1 + src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 3 +++ src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp | 2 +- src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp | 4 ++-- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Client/Hook/Hooks/Render/ResizeHook.cpp b/src/Client/Hook/Hooks/Render/ResizeHook.cpp index e0dfd8ed..158a82d3 100644 --- a/src/Client/Hook/Hooks/Render/ResizeHook.cpp +++ b/src/Client/Hook/Hooks/Render/ResizeHook.cpp @@ -53,6 +53,7 @@ void ResizeHook::cleanShit(bool isResize) { Memory::SafeRelease(SwapchainHook::stageTex); Memory::SafeRelease(SwapchainHook::SavedD3D11BackBuffer); + Memory::SafeRelease(SwapchainHook::ExtraSavedD3D11BackBuffer); Blur::hasDoneFrames = false; for(ID3D11Texture2D* tex : Blur::framebuffers){ Memory::SafeRelease(tex); Blur::framebuffers.clear();} diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 6d9c5e68..1cf0eb7e 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -709,6 +709,8 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() SwapchainHook::swapchain->GetBuffer(0, IID_PPV_ARGS(&SavedD3D11BackBuffer)); if(FlarialGUI::needsBackBuffer) { + + if(!ExtraSavedD3D11BackBuffer) { D3D11_TEXTURE2D_DESC textureDesc = {}; textureDesc.Width = D2D::context->GetSize().width; textureDesc.Height = D2D::context->GetSize().height; @@ -721,6 +723,7 @@ ID3D11Texture2D* SwapchainHook::GetBackbuffer() textureDesc.CPUAccessFlags = 0; SwapchainHook::d3d11Device->CreateTexture2D(&textureDesc, nullptr, &ExtraSavedD3D11BackBuffer); + } context->CopyResource(ExtraSavedD3D11BackBuffer, SavedD3D11BackBuffer); } diff --git a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp index d1d98b6b..b3b14d76 100644 --- a/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp +++ b/src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp @@ -508,7 +508,7 @@ class ClickGUIRenderer : public Listener { c->addHeader("Rendering"); c->addToggle("Better Frames", "RTX Disabled, Restart Required.", Client::settings.getSettingByName("killdx")->value); - c->addToggle("V-SYNC Disabler", "(Sometimes) Only works with Better Frames.", Client::settings.getSettingByName("vsync")->value); + c->addToggle("V-SYNC Disabler", "Only works with Better Frames.", Client::settings.getSettingByName("vsync")->value); c->addToggle("Disable Animations", "", Client::settings.getSettingByName("disableanims")->value); c->addSlider("UI Blur Intensity", "", Client::settings.getSettingByName("blurintensity")->value, 25.f); c->addSlider("Chroma / RGB Speed", "", Client::settings.getSettingByName("rgb_speed")->value, 10.f); diff --git a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp index 6cd16fe4..5b59785e 100644 --- a/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp +++ b/src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp @@ -26,7 +26,6 @@ class MotionBlurListener : public Listener { static inline std::vector previousFrames; - void onRender(RenderEvent &event) override { if(ModuleManager::getModule("ClickGUI")->isEnabled()) return; @@ -45,7 +44,7 @@ class MotionBlurListener : public Listener { ID3D11ShaderResourceView* buffer = BackbufferToSRVExtraMode(); if(buffer) previousFrames.push_back(buffer); - else std::cout << "Couldn't save buffer for Motion Blur."; + else std::cout << "Couldn't save buffer for Motion Blur." << std::endl; float alpha = 0.3f; @@ -63,6 +62,7 @@ class MotionBlurListener : public Listener { for (ID3D11ShaderResourceView* bitmap: previousFrames) Memory::SafeRelease(bitmap); previousFrames.clear(); + } } From b61c7781ad7cfcebb6df603c1cf879d0611f2849 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:45:37 +0600 Subject: [PATCH 221/240] crash fix --- src/Client/Client.cpp | 2 +- src/Client/Hook/Hooks/Render/SwapchainHook.cpp | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 0258e4a7..40355c93 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -137,7 +137,7 @@ void Client::initialize() { Client::settings.addSetting("blurintensity", 18.0f); if (Client::settings.getSettingByName("killdx") == nullptr) - Client::settings.addSetting("killdx", true); // TODO: Fix dx12 stuff and set this to false again + Client::settings.addSetting("killdx", false); if (Client::settings.getSettingByName("disable_alias") == nullptr) Client::settings.addSetting("disable_alias", false); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 1cf0eb7e..2feda427 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -554,12 +554,16 @@ void SwapchainHook::DX12Blur() { void SwapchainHook::DX11Blur() { /* Blur Stuff */ - if(ModuleManager::getModule("Motion Blur")->isEnabled() && !FlarialGUI::inMenu) FlarialGUI::needsBackBuffer = true; - else FlarialGUI::needsBackBuffer = false; - + if(ModuleManager::initialized) { + auto* module = ModuleManager::getModule("Motion Blur"); + if(module) { + if(module->isEnabled() && !FlarialGUI::inMenu) FlarialGUI::needsBackBuffer = true; + else FlarialGUI::needsBackBuffer = false; + } + } /* Blur End */ -} +} void SwapchainHook::DX11Init() { Logger::debug("[SwapChain] Not a DX12 device, running dx11 procedures"); From b79c16dbb36a211134b257fdcf168313de526b5e Mon Sep 17 00:00:00 2001 From: FreezeEngine Date: Tue, 22 Oct 2024 01:40:41 +0300 Subject: [PATCH 222/240] Event system refactoring --- CMakeLists.txt | 2 + main.cpp | 11 +- src/Client/Events/EventHandler.cpp | 258 ------ src/Client/Events/EventHandler.hpp | 76 -- src/Client/Events/EventManager.cpp | 7 + src/Client/Events/EventManager.hpp | 22 + src/Client/Events/Events.hpp | 22 + src/Client/Events/Listener.hpp | 67 +- src/Client/Events/Render/DrawImageEvent.hpp | 10 +- src/Client/Events/Render/FogColorEvent.hpp | 4 +- src/Client/GUI/Engine/Effects/Blur/blur.cpp | 6 +- .../Elements/Control/ModCard/ModCard.cpp | 12 +- .../Elements/Control/ScrollBar/ScrollBar.cpp | 12 +- .../Elements/Control/SearchBar/SearchBar.cpp | 4 +- .../Elements/Utils/ConvertImageToBitmap.cpp | 2 +- src/Client/GUI/Engine/Engine.cpp | 6 +- src/Client/Hook/Hooks/Game/ActorBaseTick.cpp | 9 +- src/Client/Hook/Hooks/Game/GameModeAttack.cpp | 10 +- src/Client/Hook/Hooks/Game/OnSuspend.hpp | 4 +- src/Client/Hook/Hooks/Game/PacketHooks.cpp | 70 +- src/Client/Hook/Hooks/Game/PacketHooks.hpp | 2 +- src/Client/Hook/Hooks/Game/RaknetTick.cpp | 18 +- src/Client/Hook/Hooks/Game/RaknetTick.hpp | 2 +- .../Hook/Hooks/Game/RenderItemGroup.cpp | 12 - .../Hook/Hooks/Game/RenderItemGroup.hpp | 21 - .../Hooks/Game/getCurrentSwingDuration.hpp | 30 - src/Client/Hook/Hooks/Game/getSensHook.hpp | 8 +- .../Hook/Hooks/Game/getViewPerspective.cpp | 6 +- .../Hook/Hooks/Game/getViewPerspective.hpp | 3 +- src/Client/Hook/Hooks/Hook.cpp | 7 +- src/Client/Hook/Hooks/Hook.hpp | 5 +- src/Client/Hook/Hooks/Input/KeyHook.cpp | 18 +- src/Client/Hook/Hooks/Input/MouseHook.cpp | 12 +- .../Hook/Hooks/Render/CommandListHook.cpp | 2 +- .../Hooks/Render/HudMobEffectsRenderer.cpp | 10 +- src/Client/Hook/Hooks/Render/ResizeHook.cpp | 3 +- .../Hook/Hooks/Render/SetupAndRenderHook.hpp | 32 +- .../Hook/Hooks/Render/SwapchainHook.cpp | 19 +- .../Render/TextureGroup_getTextureHook.cpp | 9 +- .../BaseActorRendererRenderTextHook.hpp | 5 +- .../Hooks/Visual/DimensionFogColorHook.hpp | 12 +- .../Hooks/Visual/FontDrawTransformedHook.hpp | 3 +- .../Hook/Hooks/Visual/HurtColorHook.hpp | 13 +- .../Hooks/Visual/OverworldFogColorHook.hpp | 10 +- .../Hook/Hooks/Visual/TimeChangerHook.hpp | 3 +- src/Client/Hook/Hooks/Visual/getFovHook.hpp | 10 +- src/Client/Hook/Hooks/Visual/getGammaHook.hpp | 8 +- src/Client/Hook/Manager.cpp | 75 +- src/Client/Hook/Manager.hpp | 8 +- src/Client/Module/Manager.cpp | 181 +++-- src/Client/Module/Manager.hpp | 24 +- .../Module/Modules/Animations/Animations.hpp | 24 +- .../Modules/Animations/AnimationsListener.hpp | 43 - .../Module/Modules/ArmorHUD/ArmorHUD.hpp | 380 ++++++++- .../Modules/ArmorHUD/ArmorHUDListener.hpp | 397 --------- .../Modules/ArrowCounter/ArrowCounter.hpp | 51 +- .../Modules/ArrowCounter/ArrowListener.hpp | 67 -- src/Client/Module/Modules/AutoGG/AutoGG.hpp | 72 +- .../Module/Modules/AutoGG/AutoGGListener.hpp | 93 --- src/Client/Module/Modules/AutoRQ/AutoRQ.hpp | 191 ++++- .../Module/Modules/AutoRQ/AutoRQListener.hpp | 232 ------ .../BlockBreakIndicator.hpp | 43 +- .../BlockBreakIndicatorListener.hpp | 55 -- .../Modules/BlockOutline/BlockOutline.hpp | 13 +- .../BlockOutline/BlockOutlineListener.hpp | 43 - src/Client/Module/Modules/CPS/CPSCounter.hpp | 133 ++- src/Client/Module/Modules/CPS/CPSListener.hpp | 154 ---- .../Module/Modules/CPSLimiter/CPSLimiter.hpp | 2 - .../Module/Modules/ClickGUI/ClickGUI.hpp | 763 +++++++++++++++++- .../Modules/ClickGUI/ClickGUIRenderer.hpp | 761 ----------------- .../Modules/ClickGUI/GUIMouseListener.hpp | 47 -- .../Modules/ComboCounter/ComboCounter.hpp | 37 +- .../Modules/ComboCounter/ComboListener.hpp | 53 -- .../Modules/CommandHotkey/CommandHotkey.hpp | 34 +- .../CommandHotkey/CommandHotkeyListener.hpp | 52 -- .../Modules/CompactChat/CompactChat.hpp | 30 - .../CompactChat/CompactChatListener.hpp | 73 -- .../Module/Modules/Crosshair/Crosshair.hpp | 14 - .../Modules/Crosshair/CrosshairListener.hpp | 32 - src/Client/Module/Modules/DVD Screen/dvd.hpp | 57 +- .../Module/Modules/DVD Screen/dvdListener.hpp | 62 -- src/Client/Module/Modules/Deepfry/Deepfry.hpp | 18 +- .../Modules/Deepfry/DeepfryListener.hpp | 32 - .../Modules/EntityCounter/EntityCounter.hpp | 18 +- .../Modules/EntityCounter/EntityListener.hpp | 33 - .../Module/Modules/FOVChanger/FOVChanger.hpp | 35 +- .../Modules/FOVChanger/FOVChangerListener.hpp | 50 -- src/Client/Module/Modules/FPS/FPSCounter.hpp | 58 +- src/Client/Module/Modules/FPS/FPSListener.hpp | 39 - .../FasterInventory/FasterInventory.hpp | 138 +++- .../FasterInventoryListener.hpp | 149 ---- .../Module/Modules/FogColor/FogColor.hpp | 18 +- .../Modules/FogColor/FogColorListener.hpp | 32 - .../Modules/ForceCoords/ForceCoords.hpp | 86 +- .../ForceCoords/ForceCoordsListener.hpp | 92 --- .../Module/Modules/Freelook/Freelook.hpp | 105 ++- .../Module/Modules/Freelook/LookListener.hpp | 118 --- .../Module/Modules/Fullbright/Fullbright.hpp | 14 +- .../Modules/Fullbright/FullbrightListener.hpp | 22 - .../Module/Modules/GuiScale/GuiScale.hpp | 26 +- .../Modules/GuiScale/GuiScaleListener.hpp | 29 - src/Client/Module/Modules/HitPing/HitPing.hpp | 136 +++- .../Modules/HitPing/HitPingListener.hpp | 146 ---- src/Client/Module/Modules/Hitbox/Hitbox.hpp | 81 +- .../Module/Modules/Hitbox/HitboxListener.cpp | 72 -- .../Module/Modules/Hitbox/HitboxListener.hpp | 27 - .../HiveModeCatcherListener.hpp | 67 -- .../Module/Modules/HiveStat/HiveStat.hpp | 255 +++++- .../Modules/HiveStat/HiveStatListener.hpp | 284 ------- .../Module/Modules/HueChanger/HueChanger.hpp | 14 +- .../Module/Modules/HueChanger/HueListener.hpp | 32 - .../Module/Modules/HurtColor/HurtColor.hpp | 20 +- .../Modules/HurtColor/HurtColorListener.hpp | 31 - .../Module/Modules/IPDisplay/IPDisplay.hpp | 13 +- .../Modules/IPDisplay/IPDisplayListener.hpp | 30 - .../InstantHurtAnimation.hpp | 94 ++- .../InstantHurtAnimationListener.hpp | 110 --- .../Modules/InventoryHUD/InventoryHUD.hpp | 113 ++- .../InventoryHUD/InventoryHUDListener.hpp | 129 --- .../Modules/ItemPhysics/ItemPhysics.hpp | 278 ++++++- .../ItemPhysics/ItemPhysicsListener.cpp | 277 ------- .../ItemPhysics/ItemPhysicsListener.hpp | 35 - .../Module/Modules/Keystrokes/Keystrokes.hpp | 29 +- .../Modules/Keystrokes/KeystrokesListener.hpp | 29 - src/Client/Module/Modules/Memory/Memory.hpp | 30 +- .../Module/Modules/Memory/MemoryListener.hpp | 41 - .../CentreCursor/CentreCursorListener.hpp | 14 +- .../Misc/DiscordRPC/DiscordRPCListener.hpp | 20 +- .../HiveModeCatcherListener.hpp | 241 ++++++ .../{ => Misc}/Input/GUIKeyListener.hpp | 21 +- .../{ => Misc}/Input/GUIMouseListener.hpp | 18 +- .../Module/Modules/Misc/RGB/rgbListener.hpp | 14 +- .../Misc/SaveConfig/SaveConfigListener.hpp | 16 +- .../Misc/TextAlias/TextAliasListener.hpp | 18 +- .../Misc/Uninject/UninjectListener.hpp | 17 +- src/Client/Module/Modules/Module.cpp | 17 +- src/Client/Module/Modules/Module.hpp | 1 + .../Module/Modules/MotionBlur/MotionBlur.hpp | 109 ++- .../Modules/MotionBlur/MotionBlurListener.hpp | 127 --- .../Modules/MovableChat/MovableChat.hpp | 97 ++- .../MovableChat/MovableChatListener.hpp | 120 --- .../Module/Modules/Nick/NickListener.hpp | 99 --- src/Client/Module/Modules/Nick/NickModule.hpp | 108 ++- .../Module/Modules/NoHurtCam/NoHurtCam.hpp | 81 +- .../Modules/NoHurtCam/NoHurtCamListener.hpp | 97 --- .../Modules/OpponentReach/OpponentReach.hpp | 86 +- .../OpponentReach/OpponentReachListener.hpp | 95 --- .../Module/Modules/PaperDoll/DollListener.hpp | 106 --- .../Module/Modules/PaperDoll/PaperDoll.hpp | 91 ++- src/Client/Module/Modules/PatarHD/PatarHD.hpp | 40 +- .../Modules/PatarHD/PatarHDListener.hpp | 51 -- .../Modules/PingCounter/PingCounter.hpp | 20 +- .../Modules/PingCounter/PingListener.hpp | 27 - .../Module/Modules/PotCounter/PotCounter.hpp | 44 +- .../Module/Modules/PotCounter/PotListener.hpp | 59 -- .../Module/Modules/PotionHUD/PotionHUD.hpp | 151 +++- .../Modules/PotionHUD/PotionHUDListener.hpp | 172 ---- .../Modules/ReachCounter/ReachCounter.hpp | 40 +- .../Modules/ReachCounter/ReachListener.hpp | 53 -- .../Modules/RenderOptions/RenderOptions.hpp | 18 +- .../RenderOptions/RenderOptionsListener.hpp | 22 - .../Module/Modules/SnapLook/SnapLook.hpp | 27 +- .../Modules/SnapLook/SnapLookListener.hpp | 36 - src/Client/Module/Modules/Sneak/Sneak.hpp | 34 +- .../Module/Modules/Sneak/SneakListener.hpp | 46 -- .../Modules/SpeedDisplay/SpeedDisplay.hpp | 35 +- .../SpeedDisplay/SpeedDisplayListener.hpp | 42 - src/Client/Module/Modules/Sprint/Sprint.hpp | 77 +- .../Module/Modules/Sprint/SprintListener.hpp | 82 -- src/Client/Module/Modules/TabList/TabList.hpp | 36 +- .../Modules/TabList/TabListListener.hpp | 38 - .../Module/Modules/TextHotkey/TextHotkey.hpp | 40 +- .../Modules/TextHotkey/TextHotkeyListener.hpp | 55 -- .../ThirdPersonNametag/ThirdPerson.hpp | 47 +- .../ThirdPersonListener.hpp | 70 -- src/Client/Module/Modules/Time/Time.hpp | 59 +- .../Module/Modules/Time/Timelistener.hpp | 72 -- .../Modules/TimeChanger/TimeChanger.hpp | 3 - .../Module/Modules/UpsideDown/UpsideDown.hpp | 11 +- .../Modules/UpsideDown/UpsideDownListener.hpp | 29 - .../Module/Modules/ViewModel/ViewModel.hpp | 17 +- .../Modules/ViewModel/ViewModelListener.hpp | 28 - .../Modules/WeatherChanger/WeatherChanger.hpp | 35 +- .../WeatherChanger/WeatherListener.hpp | 45 -- src/Client/Module/Modules/Zoom/Zoom.hpp | 159 +++- .../Module/Modules/Zoom/ZoomListener.hpp | 165 ---- src/SDK/Client/Actor/Actor.cpp | 5 +- src/SDK/Client/Actor/Gamemode.hpp | 3 +- src/SDK/Client/Actor/Player.hpp | 3 +- src/SDK/Client/Core/ClientInstance.cpp | 1 - src/SDK/Client/Item/ItemStack.cpp | 6 +- .../Client/Render/BaseActorRenderContext.hpp | 3 +- src/SDK/Client/Render/ItemRenderer.hpp | 3 +- src/SDK/SDK.cpp | 5 - src/SDK/SDK.hpp | 2 - src/Utils/Hive.hpp | 18 +- src/Utils/Utils.hpp | 4 + 197 files changed, 5093 insertions(+), 7236 deletions(-) delete mode 100644 src/Client/Events/EventHandler.cpp delete mode 100644 src/Client/Events/EventHandler.hpp create mode 100644 src/Client/Events/EventManager.cpp create mode 100644 src/Client/Events/EventManager.hpp create mode 100644 src/Client/Events/Events.hpp delete mode 100644 src/Client/Hook/Hooks/Game/RenderItemGroup.cpp delete mode 100644 src/Client/Hook/Hooks/Game/RenderItemGroup.hpp delete mode 100644 src/Client/Hook/Hooks/Game/getCurrentSwingDuration.hpp delete mode 100644 src/Client/Module/Modules/Animations/AnimationsListener.hpp delete mode 100644 src/Client/Module/Modules/ArmorHUD/ArmorHUDListener.hpp delete mode 100644 src/Client/Module/Modules/ArrowCounter/ArrowListener.hpp delete mode 100644 src/Client/Module/Modules/AutoGG/AutoGGListener.hpp delete mode 100644 src/Client/Module/Modules/AutoRQ/AutoRQListener.hpp delete mode 100644 src/Client/Module/Modules/BlockBreakIndicator/BlockBreakIndicatorListener.hpp delete mode 100644 src/Client/Module/Modules/BlockOutline/BlockOutlineListener.hpp delete mode 100644 src/Client/Module/Modules/CPS/CPSListener.hpp delete mode 100644 src/Client/Module/Modules/ClickGUI/ClickGUIRenderer.hpp delete mode 100644 src/Client/Module/Modules/ClickGUI/GUIMouseListener.hpp delete mode 100644 src/Client/Module/Modules/ComboCounter/ComboListener.hpp delete mode 100644 src/Client/Module/Modules/CommandHotkey/CommandHotkeyListener.hpp delete mode 100644 src/Client/Module/Modules/CompactChat/CompactChat.hpp delete mode 100644 src/Client/Module/Modules/CompactChat/CompactChatListener.hpp delete mode 100644 src/Client/Module/Modules/Crosshair/CrosshairListener.hpp delete mode 100644 src/Client/Module/Modules/DVD Screen/dvdListener.hpp delete mode 100644 src/Client/Module/Modules/Deepfry/DeepfryListener.hpp delete mode 100644 src/Client/Module/Modules/EntityCounter/EntityListener.hpp delete mode 100644 src/Client/Module/Modules/FOVChanger/FOVChangerListener.hpp delete mode 100644 src/Client/Module/Modules/FPS/FPSListener.hpp delete mode 100644 src/Client/Module/Modules/FasterInventory/FasterInventoryListener.hpp delete mode 100644 src/Client/Module/Modules/FogColor/FogColorListener.hpp delete mode 100644 src/Client/Module/Modules/ForceCoords/ForceCoordsListener.hpp delete mode 100644 src/Client/Module/Modules/Freelook/LookListener.hpp delete mode 100644 src/Client/Module/Modules/Fullbright/FullbrightListener.hpp delete mode 100644 src/Client/Module/Modules/GuiScale/GuiScaleListener.hpp delete mode 100644 src/Client/Module/Modules/HitPing/HitPingListener.hpp delete mode 100644 src/Client/Module/Modules/Hitbox/HitboxListener.cpp delete mode 100644 src/Client/Module/Modules/Hitbox/HitboxListener.hpp delete mode 100644 src/Client/Module/Modules/HiveModeCatcher/HiveModeCatcherListener.hpp delete mode 100644 src/Client/Module/Modules/HiveStat/HiveStatListener.hpp delete mode 100644 src/Client/Module/Modules/HueChanger/HueListener.hpp delete mode 100644 src/Client/Module/Modules/HurtColor/HurtColorListener.hpp delete mode 100644 src/Client/Module/Modules/IPDisplay/IPDisplayListener.hpp delete mode 100644 src/Client/Module/Modules/InstantHurtAnimation/InstantHurtAnimationListener.hpp delete mode 100644 src/Client/Module/Modules/InventoryHUD/InventoryHUDListener.hpp delete mode 100644 src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.cpp delete mode 100644 src/Client/Module/Modules/ItemPhysics/ItemPhysicsListener.hpp delete mode 100644 src/Client/Module/Modules/Keystrokes/KeystrokesListener.hpp delete mode 100644 src/Client/Module/Modules/Memory/MemoryListener.hpp create mode 100644 src/Client/Module/Modules/Misc/HiveModeCatcher/HiveModeCatcherListener.hpp rename src/Client/Module/Modules/{ => Misc}/Input/GUIKeyListener.hpp (92%) rename src/Client/Module/Modules/{ => Misc}/Input/GUIMouseListener.hpp (64%) delete mode 100644 src/Client/Module/Modules/MotionBlur/MotionBlurListener.hpp delete mode 100644 src/Client/Module/Modules/MovableChat/MovableChatListener.hpp delete mode 100644 src/Client/Module/Modules/Nick/NickListener.hpp delete mode 100644 src/Client/Module/Modules/NoHurtCam/NoHurtCamListener.hpp delete mode 100644 src/Client/Module/Modules/OpponentReach/OpponentReachListener.hpp delete mode 100644 src/Client/Module/Modules/PaperDoll/DollListener.hpp delete mode 100644 src/Client/Module/Modules/PatarHD/PatarHDListener.hpp delete mode 100644 src/Client/Module/Modules/PingCounter/PingListener.hpp delete mode 100644 src/Client/Module/Modules/PotCounter/PotListener.hpp delete mode 100644 src/Client/Module/Modules/PotionHUD/PotionHUDListener.hpp delete mode 100644 src/Client/Module/Modules/ReachCounter/ReachListener.hpp delete mode 100644 src/Client/Module/Modules/RenderOptions/RenderOptionsListener.hpp delete mode 100644 src/Client/Module/Modules/SnapLook/SnapLookListener.hpp delete mode 100644 src/Client/Module/Modules/Sneak/SneakListener.hpp delete mode 100644 src/Client/Module/Modules/SpeedDisplay/SpeedDisplayListener.hpp delete mode 100644 src/Client/Module/Modules/Sprint/SprintListener.hpp delete mode 100644 src/Client/Module/Modules/TabList/TabListListener.hpp delete mode 100644 src/Client/Module/Modules/TextHotkey/TextHotkeyListener.hpp delete mode 100644 src/Client/Module/Modules/ThirdPersonNametag/ThirdPersonListener.hpp delete mode 100644 src/Client/Module/Modules/Time/Timelistener.hpp delete mode 100644 src/Client/Module/Modules/UpsideDown/UpsideDownListener.hpp delete mode 100644 src/Client/Module/Modules/ViewModel/ViewModelListener.hpp delete mode 100644 src/Client/Module/Modules/WeatherChanger/WeatherListener.hpp delete mode 100644 src/Client/Module/Modules/Zoom/ZoomListener.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 745f18dc..71d008e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,8 @@ add_definitions(-DCOMMIT_HASH="${COMMIT_HASH}") if(MSVC) add_compile_options(/MT) + add_compile_options(/bigobj) + # Optimize for speed add_compile_options($<$:/O2>) add_compile_options($<$:/Ot>) diff --git a/main.cpp b/main.cpp index 67c0c075..9cd8b688 100644 --- a/main.cpp +++ b/main.cpp @@ -4,14 +4,14 @@ #include #include "src/Client/Client.hpp" -#include "src/Client/Events/EventHandler.hpp" +#include "src/Client/Events/EventManager.hpp" #include "src/Client/Hook/Hooks/Render/ResizeHook.hpp" //#include "src/Client/Module/Modules/Nick/NickListener.hpp" #include #include -#include "src/Client/Module/Modules/Nick/NickListener.hpp" #include "src/Utils/Logger/crashlogs.hpp" +#include "src/Client/Module/Modules/Nick/NickModule.hpp" std::chrono::steady_clock::time_point lastBeatTime; std::chrono::steady_clock::time_point lastOnlineUsersFetchTime; @@ -76,7 +76,7 @@ DWORD WINAPI init(HMODULE real) if(SDK::clientInstance->getLocalPlayer() != nullptr) { if (module->isEnabled()) { name = Utils::removeNonAlphanumeric( - Utils::removeColorCodes(NickListener::original)); + Utils::removeColorCodes(NickModule::original)); name = replaceAll(name, "�", ""); } @@ -126,7 +126,8 @@ DWORD WINAPI init(HMODULE real) if (Client::disable) { break; } else { - Sleep(50); + ModuleManager::syncState(); + std::this_thread::sleep_for(std::chrono::milliseconds(20)); } } @@ -134,8 +135,6 @@ DWORD WINAPI init(HMODULE real) Logger::info("Uninitializing Client"); - EventHandler::unregisterAll(); - ResizeHook::cleanShit(); kiero::shutdown(); diff --git a/src/Client/Events/EventHandler.cpp b/src/Client/Events/EventHandler.cpp deleted file mode 100644 index 54cf3319..00000000 --- a/src/Client/Events/EventHandler.cpp +++ /dev/null @@ -1,258 +0,0 @@ -#pragma once - -#include "EventHandler.hpp" -#include "Render/RenderEvent.hpp" -#include "Network/PacketEvent.hpp" -#include "Render/RenderPotionHUDEvent.hpp" -#include "../Client.hpp" - -// TODO: rewrite event stuff - void EventHandler::registerListener(Listener *listener) { - Logger::debug("[EventHandler] Added listener: " + listener->name); - listeners.push_back(listener); -} - -void EventHandler::registerPriorityListener(Listener *listener) { - Logger::debug("[EventHandler] Added listener: " + listener->name); - listeners.insert(listeners.begin(),listener); -} - -void EventHandler::registerOrderedPriorityListener(Listener *listener, int position) { - Logger::debug("[EventHandler] Added listener: " + listener->name); - auto it = listeners.begin(); - std::advance(it, position); - listeners.insert(it, listener); -} - -void EventHandler::unregisterListener(std::string name) { - - auto it = std::find_if(listeners.begin(), listeners.end(), - [&](const auto &listener) { - if(listener->name == name) { - Logger::debug("[EventHandler] Deleted listener: " + name); - listener->onUnregister(); - return true; - } else { return false; } - }); - if (it != listeners.end()) { - listeners.erase(it); - } - -} - -void EventHandler::unregisterAll() { - - for (Listener *&listener: listeners) { - - listener->onUnregister(); - - } - - listeners.clear(); - -} - -void EventHandler::onTick(TickEvent &event) { - - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - - listener->onTick(event); - - } - -} - -void EventHandler::onPacketSend(PacketEvent &event) { - - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - - listener->onPacketSend(event); - - } - -} - -void EventHandler::onPacketReceive(PacketEvent &event) { - - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - - listener->onPacketReceive(event); - - } - -} - -void EventHandler::onKey(KeyEvent &event) { - - if (Client::disable) return; - if (!ModuleManager::initialized) return; - auto currentScreen = SDK::getCurrentScreen(); - if (currentScreen != "hud_screen" && - currentScreen != "f1_screen" && - currentScreen != "zoom_screen"&& - currentScreen != "start_screen"&& - currentScreen != "play_screen") return; - - for (Listener *&listener: listeners) { - listener->onKey(event); - } - -} - -void EventHandler::onAttack(AttackEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - - listener->onAttack(event); - - } - -} - -void EventHandler::onMouse(MouseEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - - listener->onMouse(event); - - } - -} - -void EventHandler::onRender(RenderEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - - listener->onRender(event); - - } - -} - -void EventHandler::onSetupAndRender(SetupAndRenderEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - listener->onSetupAndRender(event); - } -} - -void EventHandler::onGetViewPerspective(PerspectiveEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - listener->onGetViewPerspective(event); - } -} - -void EventHandler::onGetSensitivity(SensitivityEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; -// if (SDK::currentScreen != "hud_screen" && SDK::currentScreen != "zoom_screen" && SDK::currentScreen != "f1_screen") return; - - for (Listener *&listener: listeners) { - listener->onGetSensitivity(event); - } -} - -void EventHandler::onGetFogColor(FogColorEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - listener->onGetFogColor(event); - } -} - -void EventHandler::onGetHurtColor(HurtColorEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - listener->onGetHurtColor(event); - } -} - -void EventHandler::onGetGamma(GammaEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - - for (Listener *&listener: listeners) { - listener->onGetGamma(event); - } -} - -void EventHandler::onGetFOV(FOVEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; -// if (SDK::currentScreen != "hud_screen" && SDK::currentScreen != "zoom_screen" && SDK::currentScreen != "f1_screen") return; - - for (Listener *&listener: listeners) { - listener->onGetFOV(event); - } -} - -void EventHandler::onDrawText(DrawTextEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - for (Listener *&listener: listeners) { - listener->onDrawText(event); - } -} - -void EventHandler::onDrawImage(DrawImageEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - for (Listener *&listener: listeners) { - listener->onDrawImage(event); - } -} - -void EventHandler::onSetTopScreenName(SetTopScreenNameEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - for (Listener *&listener: listeners) { - listener->onSetTopScreenName(event); - } -} - -void EventHandler::onRaknetTick(RaknetTickEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - for (Listener *&listener: listeners) { - listener->onRaknetTick(event); - } -} - -void EventHandler::onGetTexture(GetTextureEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - for (Listener *&listener: listeners) { - listener->onGetTexture(event); - } -} - -void EventHandler::onRenderPotionHUD(RenderPotionHUDEvent &event) { - if (Client::disable) return; - if (!ModuleManager::initialized) return; - for (Listener *&listener: listeners) { - listener->onRenderPotionHUD(event); - } -} \ No newline at end of file diff --git a/src/Client/Events/EventHandler.hpp b/src/Client/Events/EventHandler.hpp deleted file mode 100644 index a4c95126..00000000 --- a/src/Client/Events/EventHandler.hpp +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -#include -#include -#include "Listener.hpp" -#include "Input/KeyEvent.hpp" -#include "Input/MouseEvent.hpp" -#include "Render/RenderEvent.hpp" -#include "Game/TickEvent.hpp" -#include "Game/AttackEvent.hpp" -#include "Game/PerspectiveEvent.hpp" -#include "Network/PacketEvent.hpp" -#include "Input/SensitivityEvent.hpp" -#include "Render/FogColorEvent.hpp" -#include "Render/HurtColorEvent.hpp" -#include "Render/GammaEvent.hpp" -#include "Render/GetTextureEvent.hpp" -#include "Render/RenderPotionHUDEvent.hpp" - -class EventHandler { - -public: - static inline std::list listeners; -public: - static void registerListener(Listener *listener); - - static void registerPriorityListener(Listener *listener); - - static void registerOrderedPriorityListener(Listener *listener, int position); - - static void unregisterListener(std::string name); - -public: - - static void onTick(TickEvent &event); - - static void onKey(KeyEvent &event); - - static void onMouse(MouseEvent &event); - - static void onAttack(AttackEvent &event); - - static void onRender(RenderEvent &event); - - static void onPacketSend(PacketEvent &event); - - static void onPacketReceive(PacketEvent &event); - - static void onSetupAndRender(SetupAndRenderEvent &event); - - static void onGetViewPerspective(PerspectiveEvent &event); - - static void onGetSensitivity(SensitivityEvent &event); - - static void onGetFogColor(FogColorEvent &event); - - static void onGetHurtColor(HurtColorEvent &event); - - static void onGetGamma(GammaEvent &event); - - static void onGetFOV(FOVEvent &event); - - static void onDrawText(DrawTextEvent &event); - - static void onDrawImage(DrawImageEvent &event); - - static void onSetTopScreenName(SetTopScreenNameEvent &event); - - static void onRaknetTick(RaknetTickEvent &event); - - static void onGetTexture(GetTextureEvent &event); - - static void onRenderPotionHUD(RenderPotionHUDEvent &event); - - static void unregisterAll(); -}; \ No newline at end of file diff --git a/src/Client/Events/EventManager.cpp b/src/Client/Events/EventManager.cpp new file mode 100644 index 00000000..03840de3 --- /dev/null +++ b/src/Client/Events/EventManager.cpp @@ -0,0 +1,7 @@ +#include "EventManager.hpp" + +EventManager eventMgr; + +nes::event_dispatcher &EventManager::getDispatcher() { + return dispatcher; +} \ No newline at end of file diff --git a/src/Client/Events/EventManager.hpp b/src/Client/Events/EventManager.hpp new file mode 100644 index 00000000..a397448d --- /dev/null +++ b/src/Client/Events/EventManager.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "Events.hpp" + +#define Listen(mod, type, listener) eventMgr.getDispatcher().listen(mod); +#define Deafen(mod, type, listener) eventMgr.getDispatcher().deafen(mod); + +class EventManager { +private: + nes::event_dispatcher dispatcher; +public: + nes::event_dispatcher& getDispatcher(); + + template + void trigger(EventType& event) { + //if (Client::disable) return; + if (!ModuleManager::initialized) return; + dispatcher.trigger(event); + } +}; + +extern EventManager eventMgr; diff --git a/src/Client/Events/Events.hpp b/src/Client/Events/Events.hpp new file mode 100644 index 00000000..43c6ae0e --- /dev/null +++ b/src/Client/Events/Events.hpp @@ -0,0 +1,22 @@ +#include "Game/AttackEvent.hpp" +#include "Game/FOVEvent.hpp" +#include "Game/PerspectiveEvent.hpp" +#include "Game/RaknetTickEvent.hpp" +#include "Game/TickEvent.hpp" + +#include "Input/KeyEvent.hpp" +#include "Input/MouseEvent.hpp" +#include "Input/SensitivityEvent.hpp" + +#include "Network/PacketEvent.hpp" + +#include "Render/DrawImageEvent.hpp" +#include "Render/DrawTextEvent.hpp" +#include "Render/FogColorEvent.hpp" +#include "Render/GammaEvent.hpp" +#include "Render/GetTextureEvent.hpp" +#include "Render/HurtColorEvent.hpp" +#include "Render/RenderEvent.hpp" +#include "Render/RenderPotionHUDEvent.hpp" +#include "Render/SetTopScreenNameEvent.hpp" +#include "Render/SetupAndRenderEvent.hpp" diff --git a/src/Client/Events/Listener.hpp b/src/Client/Events/Listener.hpp index f73a6112..d59921db 100644 --- a/src/Client/Events/Listener.hpp +++ b/src/Client/Events/Listener.hpp @@ -1,68 +1,3 @@ #pragma once -#include "Input/KeyEvent.hpp" -#include "Input/MouseEvent.hpp" -#include "Render/RenderEvent.hpp" -#include "Game/TickEvent.hpp" -#include "Game/AttackEvent.hpp" -#include "Game/PerspectiveEvent.hpp" -#include "Render/SetupAndRenderEvent.hpp" -#include "Network/PacketEvent.hpp" -#include "Input/SensitivityEvent.hpp" -#include "Render/FogColorEvent.hpp" -#include "Render/HurtColorEvent.hpp" -#include "Render/GammaEvent.hpp" -#include "Game/FOVEvent.hpp" -#include "Render/DrawTextEvent.hpp" -#include "Render/DrawImageEvent.hpp" -#include "Render/SetTopScreenNameEvent.hpp" -#include "Game/RaknetTickEvent.hpp" -#include "Render/GetTextureEvent.hpp" -#include "Render/RenderPotionHUDEvent.hpp" - -class Listener { -public: - std::string name; - - virtual void onTick(TickEvent &event) {}; - - virtual void onKey(KeyEvent &event) {}; - - virtual void onMouse(MouseEvent &event) {}; - - virtual void onAttack(AttackEvent &event) {}; - - virtual void onRender(RenderEvent &event) {}; - - virtual void onPacketSend(PacketEvent &event) {}; - - virtual void onPacketReceive(PacketEvent &event) {}; - - virtual void onSetupAndRender(SetupAndRenderEvent &event) {}; - - virtual void onGetViewPerspective(PerspectiveEvent &event) {}; - - virtual void onGetSensitivity(SensitivityEvent &event) {}; - - virtual void onGetFogColor(FogColorEvent &event) {}; - - virtual void onGetHurtColor(HurtColorEvent &event) {}; - - virtual void onGetGamma(GammaEvent &event) {}; - - virtual void onGetFOV(FOVEvent &event) {}; - - virtual void onDrawText(DrawTextEvent &event) {}; - - virtual void onDrawImage(DrawImageEvent &event) {}; - - virtual void onSetTopScreenName(SetTopScreenNameEvent &event) {}; - - virtual void onRaknetTick(RaknetTickEvent &event) {}; - - virtual void onGetTexture(GetTextureEvent &event) {}; - - virtual void onRenderPotionHUD(RenderPotionHUDEvent &event) {}; - - virtual void onUnregister() {}; -}; +class Listener {}; diff --git a/src/Client/Events/Render/DrawImageEvent.hpp b/src/Client/Events/Render/DrawImageEvent.hpp index 3b2c864f..1e90cca3 100644 --- a/src/Client/Events/Render/DrawImageEvent.hpp +++ b/src/Client/Events/Render/DrawImageEvent.hpp @@ -8,17 +8,21 @@ class DrawImageEvent : public Event, Cancellable { private: TexturePtr *texturePtr; - Vec2 &imagePos; + Vec2 imagePos; public: - [[nodiscard]] Vec2 &getImagePos() const { + [[nodiscard]] Vec2 getImagePos() const { return imagePos; } + void setImagePos(Vec2 newPos) { + this->imagePos = newPos; + } + [[nodiscard]] std::string getTexturePath() { return this->texturePtr->GetFilePath(); } - explicit DrawImageEvent(TexturePtr *texturePtr, Vec2 &imagePos) + explicit DrawImageEvent(TexturePtr *texturePtr, Vec2 imagePos) : texturePtr(texturePtr), imagePos(imagePos) { } }; \ No newline at end of file diff --git a/src/Client/Events/Render/FogColorEvent.hpp b/src/Client/Events/Render/FogColorEvent.hpp index d5965efb..ef1f9222 100644 --- a/src/Client/Events/Render/FogColorEvent.hpp +++ b/src/Client/Events/Render/FogColorEvent.hpp @@ -6,9 +6,9 @@ class FogColorEvent : public Event, Cancellable { private: - MCCColor& fogColor; + MCCColor fogColor; public: - [[nodiscard]] MCCColor& getFogColor() const { + [[nodiscard]] MCCColor& getFogColor() { return this->fogColor; } diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.cpp b/src/Client/GUI/Engine/Effects/Blur/blur.cpp index 20c0a7bb..1b120477 100644 --- a/src/Client/GUI/Engine/Effects/Blur/blur.cpp +++ b/src/Client/GUI/Engine/Effects/Blur/blur.cpp @@ -3,7 +3,7 @@ #include #include "../../Engine.hpp" #include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" -#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" +#include "../../../../Module/Modules/MotionBlur/MotionBlur.hpp" // CREDITS @MR CHIPS (@chyves) @@ -294,7 +294,7 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio if (!SwapchainHook::GetBackbuffer()) return; - ID3D11ShaderResourceView *pOrigShaderResourceView = MotionBlurListener::BackbufferToSRV(); + winrt::com_ptrpOrigShaderResourceView = MotionBlur::BackbufferToSRV(); if (!pOrigShaderResourceView) { return; } @@ -349,7 +349,7 @@ void Blur::RenderBlur(ID3D11RenderTargetView *pDstRenderTargetView, int iteratio constantBuffer.offset = XMFLOAT2(intensity * 3, intensity * 3); pContext->PSSetShader(pDownsampleShader, nullptr, 0); - RenderToRTV(renderTargetViews[1], pOrigShaderResourceView, fbSizes[1]); + RenderToRTV(renderTargetViews[1], pOrigShaderResourceView.get(), fbSizes[1]); for (int i = 1; i < iterations; i++) { diff --git a/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp b/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp index 4d3ae2b5..376b74fd 100644 --- a/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp +++ b/src/Client/GUI/Engine/Elements/Control/ModCard/ModCard.cpp @@ -1,6 +1,6 @@ #include "../../../../../Module/Modules/ClickGUI/Elements/ClickGUIElements.hpp" -#include "../../../../../Module/Modules/ClickGUI/ClickGUIRenderer.hpp" #include "../../../../../../Assets/Assets.hpp" +#include "../../../../../Module/Modules/ClickGUI/ClickGUI.hpp" #define clickgui ModuleManager::getModule("ClickGUI") @@ -254,7 +254,7 @@ void ClickGUIElements::ModCard(float x, float y, Module *mod, int iconId, const L"", buttonWidth, buttonHeight, round.x, round.x)) { mod->toggle(); - } + } FlarialGUI::FlarialTextWithFont((buttonx - buttonWidth) - Constraints::SpacingConstraint(0.15f, paddingwidth), buttony - buttonHeight, FlarialGUI::to_wide(text).c_str(), buttonWidth, buttonHeight, DWRITE_TEXT_ALIGNMENT_CENTER, buttonWidth * 1.08, DWRITE_FONT_WEIGHT_NORMAL, false); @@ -266,13 +266,13 @@ void ClickGUIElements::ModCard(float x, float y, Module *mod, int iconId, const !MC::held) { FlarialGUI::TextBoxes[0].isActive = false; MC::mouseButton = MouseButton::None; - ClickGUIRenderer::page.type = "settings"; - ClickGUIRenderer::page.module = mod->name; + ClickGUI::page.type = "settings"; + ClickGUI::page.module = mod->name; FlarialGUI::TextBoxes[0].isActive = false; FlarialGUI::scrollpos = 0; FlarialGUI::barscrollpos = 0; - GUIMouseListener::accumilatedPos = 0; - GUIMouseListener::accumilatedBarPos = 0; + ClickGUI::accumilatedPos = 0; + ClickGUI::accumilatedBarPos = 0; } FlarialGUI::PopSize(); } diff --git a/src/Client/GUI/Engine/Elements/Control/ScrollBar/ScrollBar.cpp b/src/Client/GUI/Engine/Elements/Control/ScrollBar/ScrollBar.cpp index 5928dd0d..4b2f3ee6 100644 --- a/src/Client/GUI/Engine/Elements/Control/ScrollBar/ScrollBar.cpp +++ b/src/Client/GUI/Engine/Elements/Control/ScrollBar/ScrollBar.cpp @@ -1,18 +1,18 @@ #include "../../../Engine.hpp" -#include "../../../../../Module/Modules/ClickGUI/GUIMouseListener.hpp" +#include "../../../../../Module/Modules/ClickGUI/ClickGUI.hpp" void FlarialGUI::ScrollBar(float x, float y, float width, float height, float radius) { float whiteY; - if (y - GUIMouseListener::accumilatedPos > y + height) { - GUIMouseListener::accumilatedPos += scrollposmodifier; + if (y - ClickGUI::accumilatedPos > y + height) { + ClickGUI::accumilatedPos += scrollposmodifier; } - if (y + GUIMouseListener::accumilatedPos > y) { - GUIMouseListener::accumilatedPos = 0; + if (y + ClickGUI::accumilatedPos > y) { + ClickGUI::accumilatedPos = 0; } - FlarialGUI::lerp(FlarialGUI::scrollpos, GUIMouseListener::accumilatedPos, 0.30f * FlarialGUI::frameFactor); + FlarialGUI::lerp(FlarialGUI::scrollpos, ClickGUI::accumilatedPos, 0.30f * FlarialGUI::frameFactor); /* // Draw the gray bar diff --git a/src/Client/GUI/Engine/Elements/Control/SearchBar/SearchBar.cpp b/src/Client/GUI/Engine/Elements/Control/SearchBar/SearchBar.cpp index c81941cf..40b1daef 100644 --- a/src/Client/GUI/Engine/Elements/Control/SearchBar/SearchBar.cpp +++ b/src/Client/GUI/Engine/Elements/Control/SearchBar/SearchBar.cpp @@ -1,5 +1,5 @@ #include "../../../../../Module/Modules/ClickGUI/Elements/ClickGUIElements.hpp" -#include "../../../../../Module/Modules/ClickGUI/ClickGUIRenderer.hpp" +#include "../../../../../Module/Modules/ClickGUI/ClickGUI.hpp" #define clickgui ModuleManager::getModule("ClickGUI") @@ -45,7 +45,7 @@ static std::string name = ""; std::string ClickGUIElements::SearchBar(int index, std::string &text, int limit, float x, float y) { - if (ClickGUIRenderer::page.type == "normal" && ClickGUIRenderer::curr == "modules") { + if (ClickGUI::page.type == "normal" && ClickGUI::curr == "modules") { D2D1_COLOR_F col; diff --git a/src/Client/GUI/Engine/Elements/Utils/ConvertImageToBitmap.cpp b/src/Client/GUI/Engine/Elements/Utils/ConvertImageToBitmap.cpp index af27921d..b78465d2 100644 --- a/src/Client/GUI/Engine/Elements/Utils/ConvertImageToBitmap.cpp +++ b/src/Client/GUI/Engine/Elements/Utils/ConvertImageToBitmap.cpp @@ -1,6 +1,6 @@ #pragma once -#include "../../../../Module/Modules/ClickGUI/ClickGUIRenderer.hpp" +#include "../../../../Module/Modules/ClickGUI/Elements/ClickGUIElements.hpp" void ClickGUIElements::convertImageToBitmap(ID2D1Image *pImg, D2D1_SIZE_U size) { ID2D1Image *oldTarget = nullptr; diff --git a/src/Client/GUI/Engine/Engine.cpp b/src/Client/GUI/Engine/Engine.cpp index cabffd1d..1197871c 100644 --- a/src/Client/GUI/Engine/Engine.cpp +++ b/src/Client/GUI/Engine/Engine.cpp @@ -272,8 +272,8 @@ uint64_t generateUniqueLinearGradientBrushKey(float x, float hexPreviewSize, flo // Get gradient stops UINT32 stopCount = pGradientStops->GetGradientStopCount(); - auto* gradientStops = new D2D1_GRADIENT_STOP[stopCount]; - pGradientStops->GetGradientStops(gradientStops, stopCount); + auto gradientStops = std::make_shared(stopCount); + pGradientStops->GetGradientStops(gradientStops.get(), stopCount); // Hash for gradient stops' colors std::hash colorHash; @@ -295,7 +295,7 @@ uint64_t generateUniqueLinearGradientBrushKey(float x, float hexPreviewSize, flo stopsHash(stopCount) ^ colorKey; - delete[] gradientStops; + gradientStops.reset(); return combinedHash; } diff --git a/src/Client/Hook/Hooks/Game/ActorBaseTick.cpp b/src/Client/Hook/Hooks/Game/ActorBaseTick.cpp index 4b1b0c31..60be8798 100644 --- a/src/Client/Hook/Hooks/Game/ActorBaseTick.cpp +++ b/src/Client/Hook/Hooks/Game/ActorBaseTick.cpp @@ -1,11 +1,10 @@ #include #include "ActorBaseTick.hpp" -#include "../../../Events/EventHandler.hpp" #include "../../../Client.hpp" void ActorBaseTick::enableHook() { - auto base = Memory::findSig(this->signature); // Player vtable + auto base = address; // Player vtable int offset = *reinterpret_cast(base + 3); auto **vft = reinterpret_cast(base + offset + 7); @@ -15,7 +14,7 @@ void ActorBaseTick::enableHook() { } -ActorBaseTick::ActorBaseTick() : Hook("ActorBaseTick", GET_SIG("Actor::baseTick")) {} +ActorBaseTick::ActorBaseTick() : Hook("ActorBaseTick", GET_SIG_ADDRESS("Actor::baseTick")) {} void ActorBaseTick::callback(Actor *actor) { // TODO: Might be wrong, req checking @@ -25,8 +24,8 @@ void ActorBaseTick::callback(Actor *actor) { if (SDK::hasInstanced && SDK::clientInstance != nullptr) { if (SDK::clientInstance->getLocalPlayer() != nullptr) { if (actor == SDK::clientInstance->getLocalPlayer()) { - TickEvent event(actor); - EventHandler::onTick(event); + auto event = nes::make_holder(actor); + eventMgr.trigger(event); } } } diff --git a/src/Client/Hook/Hooks/Game/GameModeAttack.cpp b/src/Client/Hook/Hooks/Game/GameModeAttack.cpp index ed2cc78e..40eeebdc 100644 --- a/src/Client/Hook/Hooks/Game/GameModeAttack.cpp +++ b/src/Client/Hook/Hooks/Game/GameModeAttack.cpp @@ -1,14 +1,12 @@ #include "GameModeAttack.hpp" -#include "../../../Events/EventHandler.hpp" #include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" void GameModeAttackHook::callback(Gamemode *gamemode, Actor *actor) { // Combo counter and reach counter logic will be done here in the next commit. if (SDK::clientInstance->getLocalPlayer() != nullptr) { if (SDK::clientInstance->getLocalPlayer() == gamemode->getPlayer()) { - - AttackEvent event(actor); - EventHandler::onAttack(event); + auto event = nes::make_holder(actor); + eventMgr.trigger(event); } } @@ -16,11 +14,11 @@ void GameModeAttackHook::callback(Gamemode *gamemode, Actor *actor) { } -GameModeAttackHook::GameModeAttackHook() : Hook("GameModeAttack", GET_SIG("GameMode::attack")) {} +GameModeAttackHook::GameModeAttackHook() : Hook("GameModeAttack", GET_SIG_ADDRESS("GameMode::attack")) {} void GameModeAttackHook::enableHook() { - auto base = Memory::findSig(this->signature); + auto base = address; int offset = *reinterpret_cast(base + 3); auto **vft = reinterpret_cast(base + offset + 7); diff --git a/src/Client/Hook/Hooks/Game/OnSuspend.hpp b/src/Client/Hook/Hooks/Game/OnSuspend.hpp index 3f8f0396..e325d811 100644 --- a/src/Client/Hook/Hooks/Game/OnSuspend.hpp +++ b/src/Client/Hook/Hooks/Game/OnSuspend.hpp @@ -1,7 +1,7 @@ #pragma once #include "../Hook.hpp" -#include "../../../Events/EventHandler.hpp" + #include "../../../../SDK/SDK.hpp" #include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" @@ -15,7 +15,7 @@ class OnSuspendHook : public Hook { static inline original suspendOriginal = nullptr; - OnSuspendHook() : Hook("onSuspendHook", GET_SIG("MinecraftGame::onAppSuspended")) {} + OnSuspendHook() : Hook("onSuspendHook", GET_SIG_ADDRESS("MinecraftGame::onAppSuspended")) {} void enableHook() override; }; \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.cpp b/src/Client/Hook/Hooks/Game/PacketHooks.cpp index d1067a4e..dd36fd58 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.cpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.cpp @@ -2,36 +2,28 @@ #include "../../../../SDK/SDK.hpp" #include "../../../../SDK/Client/Network/Packet/TextPacket.hpp" #include "../../../Events/Network/PacketEvent.hpp" -#include "../../../Events/EventHandler.hpp" -#include "../../../Module/Modules/CompactChat/CompactChatListener.hpp" // text void SendPacketHook::callback(LoopbackPacketSender *pSender, Packet *pPacket) { - PacketEvent event(pPacket); + auto event = nes::make_holder(pPacket); if(SDK::clientInstance) { - EventHandler::onPacketSend(event); + eventMgr.trigger(event); } - if (!event.isCancelled()) { + if (!event->isCancelled()) { sendPacketOriginal(pSender, pPacket); } } void SendPacketHook::receiveCallbackText(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet) { - SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); - if ( - packet.get() && - CompactChatListener::prev == reinterpret_cast(packet.get())->message - ) { - } else { - PacketEvent event(packet.get()); - EventHandler::onPacketReceive(event); - if (!event.isCancelled()) - receiveTextPacketOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); - } + + auto event = nes::make_holder(packet.get()); + eventMgr.trigger(event); + if (!event->isCancelled()) + receiveTextPacketOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } void @@ -40,9 +32,9 @@ SendPacketHook::receiveCallbackSetTitle(void *packetHandlerDispatcher, void *net SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); - PacketEvent event(packet.get()); - EventHandler::onPacketReceive(event); - if (!event.isCancelled()) + auto event = nes::make_holder(packet.get()); + eventMgr.trigger(event); + if (!event->isCancelled()) receiveSetTitlePacketOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } @@ -50,18 +42,18 @@ void SendPacketHook::receiveCallbackPlaySound(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet) { SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); - PacketEvent event(packet.get()); - EventHandler::onPacketReceive(event); - if (!event.isCancelled()) + auto event = nes::make_holder(packet.get()); + eventMgr.trigger(event); + if (!event->isCancelled()) receivePacketPlaySoundOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } void SendPacketHook::receiveCallbackEntityEvent(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr &packet) { SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); - PacketEvent event(packet.get()); - EventHandler::onPacketReceive(event); - if (!event.isCancelled()) + auto event = nes::make_holder(packet.get()); + eventMgr.trigger(event); + if (!event->isCancelled()) receivePacketEntityEventOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } @@ -69,36 +61,36 @@ void SendPacketHook::receiveCallbackEntityEvent(void *packetHandlerDispatcher, v void SendPacketHook::receiveCallbackInteract(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr &packet) { SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); - PacketEvent event(packet.get()); - EventHandler::onPacketReceive(event); - if (!event.isCancelled()) + auto event = nes::make_holder(packet.get()); + eventMgr.trigger(event); + if (!event->isCancelled()) receivePacketInteractOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } void SendPacketHook::receiveCallbackContainerOpen(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr &packet) { SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); - PacketEvent event(packet.get()); - EventHandler::onPacketReceive(event); - if (!event.isCancelled()) + auto event = nes::make_holder(packet.get()); + eventMgr.trigger(event); + if (!event->isCancelled()) receivePacketContainerOpenOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } void SendPacketHook::receiveCallbackContainerClose(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr &packet) { SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); - PacketEvent event(packet.get()); - EventHandler::onPacketReceive(event); - if (!event.isCancelled()) + auto event = nes::make_holder(packet.get()); + eventMgr.trigger(event); + if (!event->isCancelled()) receivePacketContainerCloseOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } void SendPacketHook::receiveCallbackChangeDimension(void *packetHandlerDispatcher, void *networkIdentifier, void *netEventCallback, const std::shared_ptr& packet) { - - PacketEvent event(packet.get()); - EventHandler::onPacketReceive(event); - if (!event.isCancelled()) + SendPacketHook::setVariables(packetHandlerDispatcher, networkIdentifier, netEventCallback); + auto event = nes::make_holder(packet.get()); + eventMgr.trigger(event); + if (!event->isCancelled()) receivePacketChangeDimensionOriginal(packetHandlerDispatcher, networkIdentifier, netEventCallback, packet); } @@ -142,7 +134,7 @@ void SendPacketHook::enableHook() { (void **) &receivePacketContainerCloseOriginal, "ReceivePacketHook"); std::shared_ptr changeDimensionPacket = SDK::createPacket((int) MinecraftPacketIds::ChangeDimension); - Memory::hookFunc((void *) changeDimensionPacket->packetHandler->vTable[1], receiveCallbackChangeDimension, + Memory::hookFunc((void *) changeDimensionPacket->packetHandler->vTable[1], (void *)receiveCallbackChangeDimension, (void **) &receivePacketChangeDimensionOriginal, "ReceivePacketHook"); this->autoHook((void *) callback, (void **) &sendPacketOriginal); diff --git a/src/Client/Hook/Hooks/Game/PacketHooks.hpp b/src/Client/Hook/Hooks/Game/PacketHooks.hpp index d6a40558..1830eba3 100644 --- a/src/Client/Hook/Hooks/Game/PacketHooks.hpp +++ b/src/Client/Hook/Hooks/Game/PacketHooks.hpp @@ -57,7 +57,7 @@ class SendPacketHook : public Hook { static inline receive receivePacketContainerCloseOriginal = nullptr; static inline receive receivePacketChangeDimensionOriginal = nullptr; - SendPacketHook() : Hook("sendPacket", GET_SIG("LoopbackPacketSender::sendPacket")) {} + SendPacketHook() : Hook("sendPacket", GET_SIG_ADDRESS("LoopbackPacketSender::sendPacket")) {} void enableHook() override; diff --git a/src/Client/Hook/Hooks/Game/RaknetTick.cpp b/src/Client/Hook/Hooks/Game/RaknetTick.cpp index c33e5c3a..caf034d5 100644 --- a/src/Client/Hook/Hooks/Game/RaknetTick.cpp +++ b/src/Client/Hook/Hooks/Game/RaknetTick.cpp @@ -1,16 +1,16 @@ #include "RaknetTick.hpp" #include "../../../../SDK/SDK.hpp" #include "ActorBaseTick.hpp" -#include "../../../Events/EventHandler.hpp" #include #include std::string RaknetTickHook::towriteip = ""; void RaknetTickHook::callback(RaknetConnector *raknet) { - if(getAveragePingOriginal == nullptr) { - uintptr_t getAveragePingAddr = Memory::GetAddressByIndex(raknet->peer->vTable, GET_OFFSET("RakPeer::GetAveragePing")); - Memory::hookFunc((void *) getAveragePingAddr, (void*)getAveragePingCallback, + if (getAveragePingOriginal == nullptr) { + uintptr_t getAveragePingAddr = Memory::GetAddressByIndex(raknet->peer->vTable, + GET_OFFSET("RakPeer::GetAveragePing")); + Memory::hookFunc((void *) getAveragePingAddr, (void *) getAveragePingCallback, (void **) &getAveragePingOriginal, "RakPeer::GetAveragePing"); } raknetTickOriginal(raknet); @@ -30,12 +30,12 @@ void RaknetTickHook::callback(RaknetConnector *raknet) { } } - towriteip = ip; - } - - RaknetTickEvent event{}; - EventHandler::onRaknetTick(event); + towriteip = ip; } + + auto event = nes::make_holder(); + eventMgr.trigger(event); + } } __int64 RaknetTickHook::getAveragePingCallback(RakPeer *_this, void *guid) { diff --git a/src/Client/Hook/Hooks/Game/RaknetTick.hpp b/src/Client/Hook/Hooks/Game/RaknetTick.hpp index 77581129..17a2762b 100644 --- a/src/Client/Hook/Hooks/Game/RaknetTick.hpp +++ b/src/Client/Hook/Hooks/Game/RaknetTick.hpp @@ -18,7 +18,7 @@ class RaknetTickHook : public Hook { //RaknetConnector::tick :) static inline original raknetTickOriginal = nullptr; static inline originalRakPeer getAveragePingOriginal = nullptr; - RaknetTickHook() : Hook("RaknetTick", GET_SIG("RaknetTick")) {} + RaknetTickHook() : Hook("RaknetTick", GET_SIG_ADDRESS("RaknetTick")) {} void enableHook() override; }; \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Game/RenderItemGroup.cpp b/src/Client/Hook/Hooks/Game/RenderItemGroup.cpp deleted file mode 100644 index f36a5910..00000000 --- a/src/Client/Hook/Hooks/Game/RenderItemGroup.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "RenderItemGroup.hpp" - -void RenderItemGroupHook::callback(void *thisptr, BaseActorRenderContext *renderContext, Actor *itemEntity, int itemCount, - float scaleValue, float a6) { - funcOriginal(thisptr, renderContext, itemEntity, itemCount, scaleValue, a6); -} - -void RenderItemGroupHook::enableHook() { - this->autoHook((void *) callback, (void **) &funcOriginal); -} \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Game/RenderItemGroup.hpp b/src/Client/Hook/Hooks/Game/RenderItemGroup.hpp deleted file mode 100644 index dce494f3..00000000 --- a/src/Client/Hook/Hooks/Game/RenderItemGroup.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "../Hook.hpp" -#include "../../../../SDK/Client/Network/Raknet/RaknetConnector.hpp" -#include "../../../../SDK/Client/Actor/Actor.hpp" -#include "../../../../SDK/Client/Render/BaseActorRenderContext.hpp" - -class RenderItemGroupHook : public Hook { - -private: - static void callback(void * thisptr, BaseActorRenderContext* renderContext, Actor* itemEntity, int itemCount, float scaleValue, float a6); - -public: - typedef void(__thiscall *original)(void *, void*, Actor*, int, float, float); - - static inline original funcOriginal = nullptr; - - RenderItemGroupHook() : Hook("RenderItemGroup","45 85 C9 0F 8E A9 03") {} - - void enableHook() override; -}; \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Game/getCurrentSwingDuration.hpp b/src/Client/Hook/Hooks/Game/getCurrentSwingDuration.hpp deleted file mode 100644 index 1bd90553..00000000 --- a/src/Client/Hook/Hooks/Game/getCurrentSwingDuration.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "../Hook.hpp" -#include "../../../../Utils/Memory/Memory.hpp" -#include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" - -class getCurrentSwingDuration : public Hook { -private: - - static __int64 getCurrentSwingDurationCallback(__int64 a1) { - - __int64 thing = funcOriginal(a1); - - return thing; - } - -public: - typedef __int64(__thiscall *getCurrentSwingDurationOriginal)(__int64); - - static inline getCurrentSwingDurationOriginal funcOriginal = nullptr; - - getCurrentSwingDuration() : Hook("getCurrentSwingDurationHook", - GET_SIG("getCurrentSwingDuration")) {} - - void enableHook() override { - this->autoHook((void *) getCurrentSwingDurationCallback, (void **) &funcOriginal); - } -}; - - diff --git a/src/Client/Hook/Hooks/Game/getSensHook.hpp b/src/Client/Hook/Hooks/Game/getSensHook.hpp index 9de5610b..aa51e08a 100644 --- a/src/Client/Hook/Hooks/Game/getSensHook.hpp +++ b/src/Client/Hook/Hooks/Game/getSensHook.hpp @@ -14,10 +14,10 @@ class getSensHook : public Hook { float sensitivity = funcOriginal(a1, a2); - SensitivityEvent event(sensitivity); - EventHandler::onGetSensitivity(event); + auto event = nes::make_holder(sensitivity); + eventMgr.trigger(event); - return event.getSensitivity(); + return event->getSensitivity(); } public: @@ -25,7 +25,7 @@ class getSensHook : public Hook { static inline getSensOriginal funcOriginal = nullptr; - getSensHook() : Hook("getSensHook", GET_SIG("Options::getSensitivity")) {} + getSensHook() : Hook("getSensHook", GET_SIG_ADDRESS("Options::getSensitivity")) {} void enableHook() override { this->autoHook((void *) getSensCallback, (void **) &funcOriginal); diff --git a/src/Client/Hook/Hooks/Game/getViewPerspective.cpp b/src/Client/Hook/Hooks/Game/getViewPerspective.cpp index 08659400..5b6d2592 100644 --- a/src/Client/Hook/Hooks/Game/getViewPerspective.cpp +++ b/src/Client/Hook/Hooks/Game/getViewPerspective.cpp @@ -1,9 +1,9 @@ #include "getViewPerspective.hpp" int getViewPerspectiveHook::callback(uintptr_t *a1) { - PerspectiveEvent event((Perspective)getViewPerspectiveOriginal(a1)); - EventHandler::onGetViewPerspective(event); - return (int)event.getPerspective(); + auto event = nes::make_holder((Perspective)getViewPerspectiveOriginal(a1)); + eventMgr.trigger(event); + return (int)event->getPerspective(); } void getViewPerspectiveHook::enableHook() { diff --git a/src/Client/Hook/Hooks/Game/getViewPerspective.hpp b/src/Client/Hook/Hooks/Game/getViewPerspective.hpp index 36b1d45b..198ea533 100644 --- a/src/Client/Hook/Hooks/Game/getViewPerspective.hpp +++ b/src/Client/Hook/Hooks/Game/getViewPerspective.hpp @@ -1,5 +1,4 @@ #include "../Hook.hpp" -#include "../../../Events/EventHandler.hpp" #include "../../../../SDK/SDK.hpp" #include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" @@ -13,7 +12,7 @@ class getViewPerspectiveHook : public Hook { static inline original getViewPerspectiveOriginal = nullptr; - getViewPerspectiveHook() : Hook("getViewPerspective", GET_SIG("getViewPerspective")) {} + getViewPerspectiveHook() : Hook("getViewPerspective", GET_SIG_ADDRESS("getViewPerspective")) {} void enableHook() override; }; \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Hook.cpp b/src/Client/Hook/Hooks/Hook.cpp index a9d8c3c0..bb382152 100644 --- a/src/Client/Hook/Hooks/Hook.cpp +++ b/src/Client/Hook/Hooks/Hook.cpp @@ -2,9 +2,9 @@ #include #include -Hook::Hook(std::string name, std::string signature) { +Hook::Hook(std::string name, uintptr_t address) { this->name = std::move(name); - this->signature = std::move(signature); + this->address = address; } Hook::~Hook() = default; @@ -13,8 +13,7 @@ void Hook::enableHook() { } bool Hook::autoHook(void *callbackPtr, void **funcOriginal) { - uintptr_t hookAddr = Memory::findSig(this->signature); - return this->manualHook((void *) hookAddr, callbackPtr, funcOriginal); + return this->manualHook((void *) address, callbackPtr, funcOriginal); } bool Hook::manualHook(void *hookAddr, void *callbackPtr, void **funcOriginal) { diff --git a/src/Client/Hook/Hooks/Hook.hpp b/src/Client/Hook/Hooks/Hook.hpp index 0592e3f8..c44f5857 100644 --- a/src/Client/Hook/Hooks/Hook.hpp +++ b/src/Client/Hook/Hooks/Hook.hpp @@ -6,13 +6,14 @@ #include "../../../Utils/Logger/Logger.hpp" #include "../../../Utils/Memory/Memory.hpp" +#include "../../Events/EventManager.hpp" class Hook { public: - std::string signature; + uintptr_t address; std::string name; - Hook(std::string name, std::string signature); + Hook(std::string name, uintptr_t address); virtual ~Hook(); diff --git a/src/Client/Hook/Hooks/Input/KeyHook.cpp b/src/Client/Hook/Hooks/Input/KeyHook.cpp index f921330b..1de7d2c8 100644 --- a/src/Client/Hook/Hooks/Input/KeyHook.cpp +++ b/src/Client/Hook/Hooks/Input/KeyHook.cpp @@ -3,7 +3,7 @@ #include "../../../Client.hpp" #include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" -KeyHook::KeyHook() : Hook("key_hook", GET_SIG("Keyboard::feed")) {} +KeyHook::KeyHook() : Hook("key_hook", GET_SIG_ADDRESS("Keyboard::feed")) {} void KeyHook::enableHook() { this->autoHook((void *) keyCallback, (void **) &funcOriginal); @@ -12,9 +12,17 @@ void KeyHook::enableHook() { void KeyHook::keyCallback(int key, bool state) { keys[key] = state; - KeyEvent event(key, state ? 1 : 0, keys); - EventHandler::onKey(event); + auto event = nes::make_holder(key, state ? 1 : 0, keys); - if (!event.isCancelled()) - funcOriginal(event.getKey(), state); + auto currentScreen = SDK::getCurrentScreen(); + if (currentScreen != "hud_screen" && + currentScreen != "f1_screen" && + currentScreen != "zoom_screen"&& + currentScreen != "start_screen"&& + currentScreen != "play_screen" && state) return funcOriginal(key, state); // if were on those screens and key is pressed + + eventMgr.trigger(event); + + if (!event->isCancelled()) + funcOriginal(event->getKey(), state); } \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Input/MouseHook.cpp b/src/Client/Hook/Hooks/Input/MouseHook.cpp index ae4ec19f..2eab1271 100644 --- a/src/Client/Hook/Hooks/Input/MouseHook.cpp +++ b/src/Client/Hook/Hooks/Input/MouseHook.cpp @@ -1,9 +1,8 @@ #include "MouseHook.hpp" -#include "../../../Events/EventHandler.hpp" #include "../../../Client.hpp" #include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" -MouseHook::MouseHook() : Hook("mouse_hook",GET_SIG("MouseDevice::feed")) { +MouseHook::MouseHook() : Hook("mouse_hook",GET_SIG_ADDRESS("MouseDevice::feed")) { } void MouseHook::enableHook() { @@ -22,12 +21,11 @@ void MouseHook::mouseCallback(void *mouseDevice, char button, char action, short // rest -> Mouse button, state // parm_1, parm_8 (might be isScrolling?) -> ??? + auto event = nes::make_holder(button, action, mouseX, mouseY); + eventMgr.trigger(event); - MouseEvent event(button, action, mouseX, mouseY); - EventHandler::onMouse(event); - - if (!event.isCancelled()) { - return funcOriginal(mouseDevice, event.getButton(), event.getActionAsChar(), mouseX, mouseY, movementX, + if (!event->isCancelled()) { + return funcOriginal(mouseDevice, event->getButton(), event->getActionAsChar(), mouseX, mouseY, movementX, movementY, a8); } } \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Render/CommandListHook.cpp b/src/Client/Hook/Hooks/Render/CommandListHook.cpp index 9879b896..06988b18 100644 --- a/src/Client/Hook/Hooks/Render/CommandListHook.cpp +++ b/src/Client/Hook/Hooks/Render/CommandListHook.cpp @@ -24,7 +24,7 @@ void CommandListHook::enableHook() { } -CommandListHook::CommandListHook() : Hook("CommandListHook", "") {} +CommandListHook::CommandListHook() : Hook("CommandListHook", 0) {} void CommandListHook::listCallback(ID3D12CommandQueue *queue, UINT numCommandLists, const ID3D12CommandList **ppCommandLists) { diff --git a/src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.cpp b/src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.cpp index db7ef8f0..c12b688c 100644 --- a/src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.cpp +++ b/src/Client/Hook/Hooks/Render/HudMobEffectsRenderer.cpp @@ -1,8 +1,7 @@ #include "HudMobEffectsRenderer.hpp" #include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" -#include "../../../Events/EventHandler.hpp" -HudMobEffectsRendererHook::HudMobEffectsRendererHook() : Hook("HudMobEffectsRenderer_render", GET_SIG("HudMobEffectsRenderer::render")) {} +HudMobEffectsRendererHook::HudMobEffectsRendererHook() : Hook("HudMobEffectsRenderer_render", GET_SIG_ADDRESS("HudMobEffectsRenderer::render")) {} void HudMobEffectsRendererHook::enableHook() { this->autoHook((void *) HudMobEffectsRenderer_renderCallback, (void **) &funcOriginal); @@ -14,10 +13,11 @@ void *HudMobEffectsRendererHook::HudMobEffectsRenderer_renderCallback(struct Hud struct UIControl *owner, int pass, struct RectangleArea *renderAABB) { - auto event = RenderPotionHUDEvent(); - EventHandler::onRenderPotionHUD(event); - if(event.isCancelled()) return nullptr; + auto event = nes::make_holder(); + eventMgr.trigger(event); + + if(event->isCancelled()) return nullptr; return funcOriginal(_this, renderContext, client, owner, pass, renderAABB); } \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Render/ResizeHook.cpp b/src/Client/Hook/Hooks/Render/ResizeHook.cpp index 158a82d3..12476c09 100644 --- a/src/Client/Hook/Hooks/Render/ResizeHook.cpp +++ b/src/Client/Hook/Hooks/Render/ResizeHook.cpp @@ -6,7 +6,6 @@ #include "../../../GUI/D2D.hpp" #include "SwapchainHook.hpp" #include "../../../Module/Modules/ClickGUI/Elements/ClickGUIElements.hpp" -#include "../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" #include "../../../Module/Manager.hpp" #include "../../../GUI/Engine/Elements/Structs/ImagesClass.hpp" #include "../../../../../lib/ImGui/imgui.h" @@ -24,7 +23,7 @@ void ResizeHook::enableHook() { } -ResizeHook::ResizeHook() : Hook("ResizeHook", "") {} +ResizeHook::ResizeHook() : Hook("ResizeHook", 0) {} void ResizeHook::call() { diff --git a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp index 9badd0b4..9342b16a 100644 --- a/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp +++ b/src/Client/Hook/Hooks/Render/SetupAndRenderHook.hpp @@ -7,11 +7,9 @@ #include "../../../../SDK/SDK.hpp" #include "../Hook.hpp" #include "../../../../SDK/Client/Render/ItemRenderer.hpp" -#include "../../../Module/Modules/CompactChat/CompactChatListener.hpp" #include "../Visual/getGammaHook.hpp" #include "../../../Module/Manager.hpp" #include "../../../../Utils/Render/DrawUtils.hpp" -#include "../../../Module/Modules/Hitbox/HitboxListener.hpp" #include #include "../../../../Utils/Render/MaterialUtils.hpp" @@ -24,8 +22,8 @@ class SetUpAndRenderHook : public Hook static void drawTextCallback(MinecraftUIRenderContext* ctx, void* font, float* pos, std::string* text, float* color, float alpha, unsigned int textAlignment, void* textMeasureData, void* caretMeasureData) { - DrawTextEvent event(text); - EventHandler::onDrawText(event); + auto event = nes::make_holder(text); + eventMgr.trigger(event); funcOriginalText(ctx, font, pos, text, color, alpha, textAlignment, textMeasureData, caretMeasureData); } @@ -39,14 +37,15 @@ class SetUpAndRenderHook : public Hook Vec2& uvSize ) { - DrawImageEvent event(texturePtr, imagePos); - EventHandler::onDrawImage(event); + auto event = nes::make_holder(texturePtr, imagePos); + eventMgr.trigger(event); + auto newPos = event->getImagePos(); Memory::CallFunc&, Vec2&, Vec2&, Vec2&>( oDrawImage, _this, texturePtr, - event.getImagePos(), + newPos, imageDimension, uvPos, uvSize @@ -63,14 +62,15 @@ class SetUpAndRenderHook : public Hook bool unk ) { - DrawImageEvent event(texturePtr, imagePos); - EventHandler::onDrawImage(event); + auto event = nes::make_holder(texturePtr, imagePos); + eventMgr.trigger(event); + auto newPos = event->getImagePos(); Memory::CallFunc&, Vec2&, Vec2&, Vec2&>( oDrawImage, _this, texturePtr, - event.getImagePos(), + newPos, imageDimension, uvPos, uvSize, @@ -107,9 +107,9 @@ class SetUpAndRenderHook : public Hook std::string layer = pScreenView->VisualTree->root->getLayerName(); if (layer != "debug_screen" && layer != "toast_screen"){ // start_screen, play_screen, world_loading_progress_screen, pause_screen, hud_screen - SetTopScreenNameEvent event(layer); - EventHandler::onSetTopScreenName(event); - SDK::setCurrentScreen(event.getLayer()); // updates every 16 ms + auto event = nes::make_holder(layer); + eventMgr.trigger(event); + SDK::setCurrentScreen(event->getLayer()); // updates every 16 ms } Vec3 origin{ 0, 0, 0 }; @@ -131,8 +131,8 @@ class SetUpAndRenderHook : public Hook funcOriginal(pScreenView, muirc); if (layer != "debug_screen" && layer != "toast_screen") { - SetupAndRenderEvent event(muirc); - EventHandler::onSetupAndRender(event); + auto event = nes::make_holder(muirc); + eventMgr.trigger(event); } } @@ -143,7 +143,7 @@ class SetUpAndRenderHook : public Hook typedef void(__thiscall* drawTextOriginal)(MinecraftUIRenderContext*, void*, float*, std::string*, float*, float, unsigned int, const void*, const void*); static inline drawTextOriginal funcOriginalText = nullptr; - SetUpAndRenderHook() : Hook("SetupAndRender", GET_SIG("ScreenView::setupAndRender")) {} + SetUpAndRenderHook() : Hook("SetupAndRender", GET_SIG_ADDRESS("ScreenView::setupAndRender")) {} void enableHook( ) override { this->autoHook((void *) setUpAndRenderCallback, (void**)&funcOriginal); diff --git a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp index 2feda427..2377b278 100644 --- a/src/Client/Hook/Hooks/Render/SwapchainHook.cpp +++ b/src/Client/Hook/Hooks/Render/SwapchainHook.cpp @@ -1,10 +1,8 @@ #include "SwapchainHook.hpp" #include "../../../GUI/D2D.hpp" #include "../../../Events/Render/RenderEvent.hpp" -#include "../../../Events/EventHandler.hpp" #include "d2d1.h" #include "../../../Client.hpp" -#include "../../../Module/Modules/CPS/CPSListener.hpp" #include #include #include @@ -20,7 +18,7 @@ #include "../../../../../lib/ImGui/imgui_impl_dx11.h" #include "../../../../../lib/ImGui/imgui_impl_dx12.h" -SwapchainHook::SwapchainHook() : Hook("swapchain_hook", "") {} +SwapchainHook::SwapchainHook() : Hook("swapchain_hook", 0) {} ID3D12CommandQueue *SwapchainHook::queue = nullptr; @@ -396,10 +394,10 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI ID3D11RenderTargetView* mainRenderTargetView; d3d11Device->CreateRenderTargetView(buffer2D, NULL, &mainRenderTargetView); - RenderEvent event{}; - event.RTV = mainRenderTargetView; + auto event = nes::make_holder(); + event->RTV = mainRenderTargetView; //BlurDX12::RenderBlur(SwapchainHook::d3d12CommandList); - EventHandler::onRender(event); + eventMgr.trigger(event); if(!first && SwapchainHook::init && ModuleManager::getModule("ClickGUI")) { FlarialGUI::Notify("Click " + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( @@ -494,9 +492,10 @@ HRESULT SwapchainHook::swapchainCallback(IDXGISwapChain3 *pSwapChain, UINT syncI ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); - RenderEvent event; - event.RTV = mainRenderTargetView; - EventHandler::onRender(event); + auto event = nes::make_holder(); + event->RTV = mainRenderTargetView; + eventMgr.trigger(event); + if(!first && SwapchainHook::init && ModuleManager::getModule("ClickGUI")) { FlarialGUI::Notify("Click " + ModuleManager::getModule("ClickGUI")->settings.getSettingByName( @@ -555,7 +554,7 @@ void SwapchainHook::DX11Blur() { /* Blur Stuff */ if(ModuleManager::initialized) { - auto* module = ModuleManager::getModule("Motion Blur"); + auto module = ModuleManager::getModule("Motion Blur"); if(module) { if(module->isEnabled() && !FlarialGUI::inMenu) FlarialGUI::needsBackBuffer = true; else FlarialGUI::needsBackBuffer = false; diff --git a/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp b/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp index 3ebd37fc..22a0a7da 100644 --- a/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp +++ b/src/Client/Hook/Hooks/Render/TextureGroup_getTextureHook.cpp @@ -1,9 +1,8 @@ #include "TextureGroup_getTextureHook.hpp" #include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" #include "../../../Events/Render/GetTextureEvent.hpp" -#include "../../../Events/EventHandler.hpp" -TextureGroup_getTextureHook::TextureGroup_getTextureHook() : Hook("TextureGroup_getTexture", GET_SIG("mce::TextureGroup::getTexture")) {} +TextureGroup_getTextureHook::TextureGroup_getTextureHook() : Hook("TextureGroup_getTexture", GET_SIG_ADDRESS("mce::TextureGroup::getTexture")) {} void TextureGroup_getTextureHook::enableHook() { this->autoHook((void *) TextureGroup_getTextureCallback, (void **) &funcOriginal); @@ -13,8 +12,8 @@ TexturePtr* TextureGroup_getTextureHook::TextureGroup_getTextureCallback(Texture ResourceLocation *location, bool forceReload, void *a5, int a6, void *a7) { - auto event = GetTextureEvent(location); - EventHandler::onGetTexture(event); + auto event = nes::make_holder(location); + eventMgr.trigger(event); - return funcOriginal(_this, result, event.location, forceReload, a5, a6, a7); + return funcOriginal(_this, result, event->location, forceReload, a5, a6, a7); } \ No newline at end of file diff --git a/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp b/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp index e8621966..bddc05e2 100644 --- a/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp +++ b/src/Client/Hook/Hooks/Visual/BaseActorRendererRenderTextHook.hpp @@ -126,11 +126,10 @@ class BaseActorRendererRenderTextHook : public Hook { static inline BaseActorRenderer_renderTextOriginal funcOriginal = nullptr; static inline BaseActorRenderer_renderTextOriginal40 funcOriginal40 = nullptr; - BaseActorRendererRenderTextHook() : Hook("BaseActorRenderer renderText Hook", GET_SIG("BaseActorRenderer::renderText")) {} + BaseActorRendererRenderTextHook() : Hook("BaseActorRenderer renderText Hook", GET_SIG_ADDRESS("BaseActorRenderer::renderText")) {} void enableHook() override { - - static auto sig = Memory::offsetFromSig(Memory::findSig(this->signature), 1); + static auto sig = Memory::offsetFromSig(address, 1); if (WinrtUtils::check(20, 40)) this->manualHook( (void*) sig, (void*) BaseActorRenderer_renderTextCallback40, (void **) &funcOriginal40); diff --git a/src/Client/Hook/Hooks/Visual/DimensionFogColorHook.hpp b/src/Client/Hook/Hooks/Visual/DimensionFogColorHook.hpp index 47d248fd..8d6c0cc7 100644 --- a/src/Client/Hook/Hooks/Visual/DimensionFogColorHook.hpp +++ b/src/Client/Hook/Hooks/Visual/DimensionFogColorHook.hpp @@ -9,14 +9,12 @@ class DimensionFogColorHook : public Hook { private: - static MCCColor & - DimensionFogColorCallback(Dimension *_this, MCCColor &result, MCCColor const &baseColor, float brightness) { + static MCCColor &DimensionFogColorCallback(Dimension *_this, MCCColor &result, MCCColor const &baseColor, float brightness) { - FogColorEvent event(funcOriginal(_this, result, baseColor, brightness)); - EventHandler::onGetFogColor(event); - - return event.getFogColor(); + auto event = nes::make_holder(funcOriginal(_this, result, baseColor, brightness)); + eventMgr.trigger(event); + return event->getFogColor(); } public: @@ -24,7 +22,7 @@ class DimensionFogColorHook : public Hook { static inline dimensionFogColorOriginal funcOriginal = nullptr; - DimensionFogColorHook() : Hook("Fog Color Hook", GET_SIG("Dimension::getBrightnessDependentFogColor")) {} + DimensionFogColorHook() : Hook("Fog Color Hook", GET_SIG_ADDRESS("Dimension::getBrightnessDependentFogColor")) {} void enableHook() override { diff --git a/src/Client/Hook/Hooks/Visual/FontDrawTransformedHook.hpp b/src/Client/Hook/Hooks/Visual/FontDrawTransformedHook.hpp index 525ceba0..105a993b 100644 --- a/src/Client/Hook/Hooks/Visual/FontDrawTransformedHook.hpp +++ b/src/Client/Hook/Hooks/Visual/FontDrawTransformedHook.hpp @@ -14,7 +14,6 @@ class FontDrawTransformedHook : public Hook { color->b = 0.227451f; std::string txt("Flarial on top!"); funcOriginal(_this, screenContext, txt, x, y, color, angle, s, centered, maxWidth); - } public: @@ -23,7 +22,7 @@ class FontDrawTransformedHook : public Hook { static inline FontDrawTransformedOriginal funcOriginal = nullptr; - FontDrawTransformedHook() : Hook("Font drawTransformed Hook",GET_SIG("Font::drawTransformed")) {} + FontDrawTransformedHook() : Hook("Font drawTransformed Hook",GET_SIG_ADDRESS("Font::drawTransformed")) {} void enableHook() override { diff --git a/src/Client/Hook/Hooks/Visual/HurtColorHook.hpp b/src/Client/Hook/Hooks/Visual/HurtColorHook.hpp index e6983594..ce834afb 100644 --- a/src/Client/Hook/Hooks/Visual/HurtColorHook.hpp +++ b/src/Client/Hook/Hooks/Visual/HurtColorHook.hpp @@ -9,10 +9,10 @@ class HurtColorHook : public Hook { static MCCColor *HurtColorCallback(void *a1, MCCColor *color, void *a3) { - HurtColorEvent event(funcOriginal(a1, color, a3)); - EventHandler::onGetHurtColor(event); + auto event = nes::make_holder(funcOriginal(a1, color, a3)); + eventMgr.trigger(event); - return event.getHurtColor(); + return event->getHurtColor(); } @@ -21,13 +21,10 @@ class HurtColorHook : public Hook { static inline HurtColorOriginal funcOriginal = nullptr; - HurtColorHook() : Hook("Hurt Color Hook", "") {} + HurtColorHook() : Hook("Hurt Color Hook", GET_SIG_ADDRESS("HurtColor")) {} void enableHook() override { - - auto RefAddr = Memory::findSig(GET_SIG("HurtColor")); - auto RealFunc = Memory::offsetFromSig(RefAddr, 1); - + auto RealFunc = Memory::offsetFromSig(address, 1); this->manualHook((void *) RealFunc, (void*)HurtColorCallback, (void **) &funcOriginal); } diff --git a/src/Client/Hook/Hooks/Visual/OverworldFogColorHook.hpp b/src/Client/Hook/Hooks/Visual/OverworldFogColorHook.hpp index 4927d7da..580f784d 100644 --- a/src/Client/Hook/Hooks/Visual/OverworldFogColorHook.hpp +++ b/src/Client/Hook/Hooks/Visual/OverworldFogColorHook.hpp @@ -10,12 +10,10 @@ class OverworldFogColorHook : public Hook { static MCCColor & OverworldFogColorCallback(Dimension *_this, MCCColor &result, MCCColor const &baseColor, float brightness) { + auto event = nes::make_holder(funcOriginal(_this, result, baseColor, brightness)); + eventMgr.trigger(event); - FogColorEvent event(funcOriginal(_this, result, baseColor, brightness)); - EventHandler::onGetFogColor(event); - - return event.getFogColor(); - + return event->getFogColor(); } public: @@ -23,7 +21,7 @@ class OverworldFogColorHook : public Hook { static inline OverworldFogColorOriginal funcOriginal = nullptr; - OverworldFogColorHook() : Hook("Overworld Fog Color Hook",GET_SIG("OverworldDimension::getBrightnessDependentFogColor")) {} + OverworldFogColorHook() : Hook("Overworld Fog Color Hook",GET_SIG_ADDRESS("OverworldDimension::getBrightnessDependentFogColor")) {} void enableHook() override { diff --git a/src/Client/Hook/Hooks/Visual/TimeChangerHook.hpp b/src/Client/Hook/Hooks/Visual/TimeChangerHook.hpp index 295e5888..2c5f7fdb 100644 --- a/src/Client/Hook/Hooks/Visual/TimeChangerHook.hpp +++ b/src/Client/Hook/Hooks/Visual/TimeChangerHook.hpp @@ -32,10 +32,9 @@ class TimeChangerHook : public Hook { static inline TimeChangerOriginal func_original = nullptr; - TimeChangerHook() : Hook("Time Changer Hook", GET_SIG("TimeChanger")) {} + TimeChangerHook() : Hook("Time Changer Hook", GET_SIG_ADDRESS("TimeChanger")) {} void enableHook() override { - this->autoHook((void *) TimeChangerCallback, (void **) &func_original); } }; diff --git a/src/Client/Hook/Hooks/Visual/getFovHook.hpp b/src/Client/Hook/Hooks/Visual/getFovHook.hpp index ccb24be2..d37ddfd7 100644 --- a/src/Client/Hook/Hooks/Visual/getFovHook.hpp +++ b/src/Client/Hook/Hooks/Visual/getFovHook.hpp @@ -6,8 +6,8 @@ #include "../Game/RaknetTick.hpp" #include "../../../Client.hpp" #include "../../../Events/Game/FOVEvent.hpp" -#include "../../../Events/EventHandler.hpp" #include "../../../../Utils/Memory/Game/SignatureAndOffsetManager.hpp" +#include "../../../Events/EventManager.hpp" class getFovHook : public Hook { private: @@ -16,10 +16,10 @@ class getFovHook : public Hook { float fov = funcOriginal(a1, f, a3, a4); - FOVEvent event(fov); - EventHandler::onGetFOV(event); + auto event = nes::make_holder(fov); + eventMgr.trigger(event); - return event.getFOV(); + return event->getFOV(); } public: @@ -27,7 +27,7 @@ class getFovHook : public Hook { static inline getFovOriginal funcOriginal = nullptr; - getFovHook() : Hook("getFovHook", GET_SIG("LevelRendererPlayer::getFov")) {} + getFovHook() : Hook("getFovHook", GET_SIG_ADDRESS("LevelRendererPlayer::getFov")) {} void enableHook() override { this->autoHook((void *) getFovCallback, (void **) &funcOriginal); diff --git a/src/Client/Hook/Hooks/Visual/getGammaHook.hpp b/src/Client/Hook/Hooks/Visual/getGammaHook.hpp index 849bc421..29e7bc71 100644 --- a/src/Client/Hook/Hooks/Visual/getGammaHook.hpp +++ b/src/Client/Hook/Hooks/Visual/getGammaHook.hpp @@ -15,10 +15,10 @@ class getGammaHook : public Hook { Options::initialize(a1); } - GammaEvent event(funcOriginal(a1)); - EventHandler::onGetGamma(event); + auto event = nes::make_holder(funcOriginal(a1)); + eventMgr.trigger(event); - return event.getGamma(); + return event->getGamma(); } public: @@ -26,7 +26,7 @@ class getGammaHook : public Hook { static inline getGammaOriginal funcOriginal = nullptr; - getGammaHook() : Hook("getGammaHook",GET_SIG("Options::getGamma")) {} + getGammaHook() : Hook("getGammaHook",GET_SIG_ADDRESS("Options::getGamma")) {} void enableHook() override { this->autoHook((void *) getGammaCallback, (void **) &funcOriginal); diff --git a/src/Client/Hook/Manager.cpp b/src/Client/Hook/Manager.cpp index aad5f339..de84ca6d 100644 --- a/src/Client/Hook/Manager.cpp +++ b/src/Client/Hook/Manager.cpp @@ -21,17 +21,13 @@ //#include "Hooks/Game/RenderItemGroup.hpp" //#include "Hooks/Game/getCurrentSwingDuration.hpp" -std::vector HookManager::hooks; +std::vector> HookManager::hooks; std::string dxVersion[5] = {"Couldn't initialize", "DX9", "DX10", "DX11", "DX12"}; void HookManager::initialize() { - - //wouldnt be a bad idea to use a smart pointer for these like std::shared_ptr :) - MH_Initialize(); - kiero::init(kiero::RenderType::D3D12); if (kiero::getRenderType() == 0) kiero::init(kiero::RenderType::D3D11); @@ -43,48 +39,43 @@ void HookManager::initialize() { Logger::debug(std::format("[Kiero] Renderer: {}", dxVersion[kiero::getRenderType()])); - hooks.push_back(new KeyHook()); - hooks.push_back(new MouseHook()); - - if (!Client::settings.getSettingByName("killdx")->value) hooks.push_back(new CommandListHook()); - - hooks.push_back(new SwapchainHook()); - hooks.push_back(new ResizeHook()); - - - hooks.push_back(new TextureGroup_getTextureHook()); - hooks.push_back(new getViewPerspectiveHook()); - // hooks.push_back(new RenderActorHook()); - hooks.push_back(new RaknetTickHook()); - hooks.push_back(new SetUpAndRenderHook()); - hooks.push_back(new GameModeAttackHook()); - - hooks.push_back(new getFovHook()); - hooks.push_back(new ActorBaseTick()); - hooks.push_back(new OnSuspendHook()); - hooks.push_back(new getGammaHook()); - hooks.push_back(new FontDrawTransformedHook()); - hooks.push_back(new HurtColorHook()); - hooks.push_back(new DimensionFogColorHook()); - hooks.push_back(new OverworldFogColorHook()); - hooks.push_back(new TimeChangerHook()); - hooks.push_back(new SendPacketHook()); - hooks.push_back(new getSensHook()); - hooks.push_back(new HudMobEffectsRendererHook()); - //hooks.push_back(new RenderItemGroupHook()); - //hooks.push_back(new getCurrentSwingDuration()); - hooks.push_back(new BaseActorRendererRenderTextHook()); - - for (auto hook: hooks) + addHook(); + + addHook(); + addHook(); + + if (!Client::settings.getSettingByName("killdx")->value) + addHook(); + + addHook(); + addHook(); + + addHook(); + addHook(); + addHook(); + addHook(); + addHook(); + + addHook(); + addHook(); + addHook(); + addHook(); + addHook(); + addHook(); + addHook(); + addHook(); + addHook(); + addHook(); + addHook(); + addHook(); + addHook(); + + for (const auto& hook: hooks) hook->enableHook(); } void HookManager::terminate() { - - for (auto hook: hooks) - delete hook; - hooks.clear(); } diff --git a/src/Client/Hook/Manager.hpp b/src/Client/Hook/Manager.hpp index 2755cddd..411c0530 100644 --- a/src/Client/Hook/Manager.hpp +++ b/src/Client/Hook/Manager.hpp @@ -12,7 +12,13 @@ class HookManager { public: - static std::vector hooks; + static std::vector> hooks; + + template + static void addHook(ArgsT... args) { + auto hookPtr = std::make_shared(args...); + hooks.emplace_back(hookPtr); + } static void initialize(); diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 72282b41..e94e0f14 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -1,8 +1,7 @@ #pragma once #include "Manager.hpp" -#include "../Events/EventHandler.hpp" -#include "Modules/Input/GUIKeyListener.hpp" +#include "Modules/Misc/Input/GUIKeyListener.hpp" #include "Modules/Misc/SaveConfig/SaveConfigListener.hpp" #include "Modules/Misc/RGB/rgbListener.hpp" #include "Modules/Misc/TextAlias/TextAliasListener.hpp" @@ -78,17 +77,13 @@ #include "Modules/EntityCounter/EntityCounter.hpp" namespace ModuleManager { - std::unordered_map moduleMap; + std::unordered_map> moduleMap; + std::vector> services; bool initialized = false; } -void ModuleManager::addModule(Module* module) { - size_t hash = std::hash{}(module->name); - moduleMap[hash] = module; -} - -std::vector ModuleManager::getModules() { - std::vector modulesVector; +std::vector> ModuleManager::getModules() { + std::vector> modulesVector; for (const auto& pair : moduleMap) { modulesVector.push_back(pair.second); } @@ -96,83 +91,83 @@ std::vector ModuleManager::getModules() { } void ModuleManager::initialize() { - addModule(new MotionBlur()); + addModule(); // Screen effects - addModule(new Deepfry()); - addModule(new HueChanger()); - addModule(new PatarHD()); - addModule(new DVD()); + addModule(); + addModule(); + addModule(); + addModule(); // FOV Changers - addModule(new FOVChanger()); //1 - addModule(new Zoom()); //2 - addModule(new UpsideDown()); //3 - - addModule(new ClickGUI()); - - addModule(new FPSCounter()); - addModule(new CPSCounter()); - addModule(new IPDisplay()); - addModule(new ReachCounter()); - addModule(new ComboCounter()); - addModule(new PingCounter()); - addModule(new PotCounter()); - addModule(new ArrowCounter()); - addModule(new EntityCounter()); - addModule(new Time()); - addModule(new MEM()); - addModule(new Fullbright()); - addModule(new ForceCoords()); - addModule(new Keystrokes()); - addModule(new Sneak()); - addModule(new Sprint()); - addModule(new Hitbox()); - addModule(new ThirdPerson()); - addModule(new SnapLook()); - addModule(new HurtColor()); - addModule(new FogColor()); - addModule(new ArmorHUD()); - addModule(new TimeChanger()); - addModule(new RenderOptions()); - addModule(new PaperDoll()); - addModule(new GuiScale()); - addModule(new WeatherChanger()); - addModule(new TabList()); - addModule(new AutoGG()); - addModule(new TextHotkey()); - addModule(new NickModule()); - addModule(new FreeLook()); - addModule(new SpeedDisplay()); - addModule(new CPSLimiter()); - addModule(new BlockBreakIndicator()); - addModule(new Animations()); - addModule(new BlockOutline()); - addModule(new CommandHotkey()); - addModule(new NoHurtCam()); - addModule(new InventoryHUD()); - //addModule(new OverlayModule()); - addModule(new AutoRQ()); - addModule(new HitPing()); - addModule(new InstantHurtAnimation()); - addModule(new OpponentReach()); - addModule(new ViewModel()); - addModule(new PotionHUD()); - addModule(new FasterInventory()); - - //addModule(new MovableChat()); - //addModule(new CompactChat()); - addModule(new ItemPhysics()); - - addModule(new HiveStat()); - - EventHandler::registerListener(new GUIKeyListener("GuiKeyListener")); - EventHandler::registerListener(new DiscordRPCListener("DiscordRPC")); - EventHandler::registerListener(new UninjectListener("Uninject")); - EventHandler::registerListener(new SaveConfigListener("SaveConfig")); - EventHandler::registerListener(new CentreCursorListener("CentreCursor")); - EventHandler::registerListener(new rgbListener("RGB Controller")); - EventHandler::registerListener(new HiveModeCatcherListener("HiveModeCatcher")); + addModule(); //1 + addModule(); //2 + addModule(); //3 + + addModule(); + + addModule(); + addModule(); + addModule(); + addModule(); + addModule(); + addModule(); + addModule(); + addModule(); + addModule(); + addModule

Mny6oxYQ-DFuS7c?F68(J&*ZKKbE$MJv6ROUV%TaM8`pK*D= z>Cb@l73faq;4qeXZ&zlvk-iOub#u!=`U=}f-=E?aYb^7gj*ZcYIQO>TDC|fpVw_F| z1YCV#D8*CXIMY|ex{ilTM&0AI+&A}i0~soABTDe1+b%}M2fMdVhn2MI>T~Na*4Z3) z(JxEzY)a&_sqjZ3SO=8{^}dD#1V=Lc+I}kkYhf7fv&mv?w)pVyuD?G3XVX8yfTuN zVeE34Soi$myWlL!sqh9>W7YJ*sE6!4G4jU4@vG!{GdrI-cEAFR_?cH_<3{?U|W zx5AAt=ReK32Vt?UqD>qcUDdVEJKJy~UxkdkCM@Jt)RYJOE$PlgD(f>e=g2Dk2Jbr65~ z^{x@vL0qN7q1^_N0)Ei(dm4V+@b2duu#2HuheK|!&^J_A$dMd|xebpYIw$*LlH z@PwAJSVh!RhamoxB?X#=77weF%h4roGj?+IlCTLdFeSGof>k!q2~-l0Dl{Eon=PQ$ z20)3Ev!{j8SY-^g=G3OXaM;po0oRQxF6aVkf{xYhPy+%bkYT8Wq)f81jy;2xfvGv1 z!SC+dR|8mXQm{Bf4G{7V`I=*TlfaE7i=6aCWSV2AwuT+to!I>?V`IEkKke9??U2(R78s)Ajz z_{zCh1$&Ez4ydZABWUr&X~R=|lrb%!*706xozY0^XVt-Z*yHz41+z3LL=2H)!Q%2F zY@os^;?U%o0;y%ahqtU;JPY4Lmx8Gn&bu#^UspwgL0BG5fFLu?RSfreGAe|}UU=Ph ztPt+4;K1qJFdbdt2)sxz=U5%1l0YYVyx}U`I-514weF%zH()=qTS1M(r68GEON!5X z_`EQmo3^<2aw=nV;|nEB4U+!{^Hn_ZzXduLTJ;)Q;tpBiKM7+c*jC@KgX@8&I)$c6 zcc4MvMHnBy4Q4t*Hwk!0%ARzaqs)A)5ie?%9Iw5vVmZpOM?o!(go&LD1De+|JJ*(J zd#f zRnJb&8Q%j?`glK5qqZwnjw5gIEx=k7X;^c*xLija?q{3p$*s;w;C zG85}m0tSrkXhe)*p_Er^TM1d>N`ad`Wni;Lmw(i)VlPg}789W_)%<7Fl|DDxJpren z2NS}_2as2WS^RtJ!=Aq(|87eJ9~t4Du+rx~U#RH4K>DAmsm__PWiRqCln_2XfL8GD zhCTnCgZv98f)D2^rSN{R_;*Rx5u=fRk%aK^0p#VM&1Tf{jmvzSus0@}2tM#6)B%au z{hc^7`LP;vOvlwPn|2dmZRWJ zGW#Wlkc)-fr_IPH4nEm1YB0go}7siq^ zzVMVghv6CDVL%uOMcW9F`;0Sb(nEb+uD^HU;AX&gC&A|nc_3#j1r0S(CGCI-<3GKycb$9$YytD0NEZPf4RonzRJL(g{<7xKD$z0paSF%V*#QgnMLq z$gsQIXnnm9Qcr^(Mw0*sLBH^bfr!vA;&8aS;f@R#5aR^FF$J3h_l-Wx+P)Wzy93bP zt3@m4PHu<_QNf7WBV|@x(8~aK*odBzqme0BH_K^Z+=G91`{{SQ2lwe|Axtd{iB0G< zvdEFS4ubFM3P?fr$sH)j?MaToabuR{=(CI`argX3m*Gj=&p_WAYAWw|zcp;vl0uFE z?sK-~v@rDQQx0(w>eUCdw8*0#jkK6u0yqVtoFI_iAh_zWI|wcZgv5b_)-DJ4O=jfC zrj#7H0CQvy8mP$3w}6V&(81_D{p!P#bq@g@4;koaD;4?^@kGI;Ek=fG7%X8{9yc>x1=<&1 z2{@1f_)l?G9K!hJC)=3axOdyIrI_7#%#1QHqaq~%Nut8mP?(RD#UYIQ#4?Ss-6cDQ zZ3+QhkDJgX4bbAG2ag57OGjiW1&j%6m3KWk7ALGdp{1b84f!UP2^E(9LcQCnq?LfI zS<7!my~pg;1D9gG$CEm=(YjVmK1h#t!^@BYZAp_}s*f;x)7#5kfbyvrl+yHGjd&}5 zg4T{e%LsW1|F4GF)bZ2~|LwFHecRBR>(*ebrN0(06jO!@nuS2bD7^xHn;`?O2mn7; zhPCtUWo0AL+Id>SS`Z+XaV`vw^9dnTl0DqMNOwr`s<0I<#~9OE<*1T`Y=^>Ib60>@ zZ?JYrKmXLdQ?PRN85R|-BexKpjj@wpZKvoa+)41P4qcuYY?1C+B@|k;4iXuOHZrj| zF+1(*X1BY#!6p%N#$y4Kg+3T#^83-Z-8>a1zyHgGwrY`>&b;K|a|#3|OB%0Cv9?Rk zd+EwyxO43}6Uz8WvfB^jNj02y#0EU6e;eo_CsYl4S@nLt**#|oqVyWjh>ZUB#}z{U zlQPDTUV7`pmG=Q<&$B7xJt+BVrSGha@#S5+-&}^9z+cc&ROs_VfGmka!iO3)MUo_O zpAn;@_53?~t;bCsFB&LHMn51yZBh{YZzsby{j{p<8uU$H($Q4v4#pl5+!!>Ji29Cs zH0igARxd%79`BIgr{fv0{8TX}n>-;-7>QHVUXG~!PPCR4dijlVW!b1 zd@3VnXB4P=C5E~Xc-d(&clgi9#ABWKC_Ym0-mC*$EHMdj#;l zrpN1pU_Pn9mp1UREcux0qLm(UWs-h)_|JjihmRX|!6fvPgxvrzc0Oa@3DWl9z;R8f}O}%XhCv8)AS7eF^Ca)#Jdo zsSPA?OJ%lEi!>kp;xyDEZy6|xd74_gY0_gWT{AeVHju@CQkh2k_3d_h=Jo};-qz7o z4ZQ=2pOIF1Bw>d0)4|xvdve~8T_|z?(a}*8fMFM^890e|^|*1%wN=V3eY%_BP5fo{Tf5Pl zc+ZSJPBD{|Thb&YaeIt0{l%A0n~k=_`$n4Ds@{?&jQ0*HtKKzLuFvdyYZROM<=E!){|M**PvP)6mCwh zAmt3Wr>=Fzfh^;L2LB%$S1pYGWf=1{y?5oW!dm=~GQ z%Ll!=7dJ9|tYDP#1||6{-5vD1Bbcox1W?*jSlUUqr zDbS!xkh%O4%cybw?(#mQM*LF+WdUY0OwM0^{t^Vpefo^O1?>;pI12X`e5S_-S>Spf zPOi5EC_g9d#>j-w>&sPr0O{u{(tZ)xT>|sy3Znr}1pW(aazfA`47NuF6;o}sfD&WU z2{D+t`Bv%yR^NZ`{rgs6-~Sh_VpsK-q@*myMoaWGnttK47f!(3(3c7}@|>C+yyO}r zrb7AU)A;Ily7lvU*uVCbf==?Up`G3Yp=qd--QSu2!y4>o`Z@+>YYirEHR{x;)rs3~*^j#ZJ0nK+o2dhs;B`tu z*HfjWA|3wb;k*5S^m`SlRM|}GpG}V3P?nSqSv5*R=*llPp(Okei@i122{M>p5{wuR zzw(jEi19}Sqg;Yxf>Ei%NfpLS0LEdJ6{sdS?jMV& zhUri#b_s)9#3r#46+_}Lct5xWC4RULl|k_+qNQk_6yw@4%DWqJjnLsT6n-kWlo!WB zTsFowipHbQ8-|wUNQx^0Q&22ZV%%~@izPMEUvS2$({MuWC_Tcqs4#9#!I~HM@V<6y z@I*&zakWu}@$#z^4HIbib;)6uuF3;kW3;%ES76+{VntJXM|zCMXzExkrnV?BOHeI3 zF}xB{jnkrPivr_D#hM8H`qQ0%LwO&sMb$P1W(ls0M<-1}Tobgo+NQv`aj_=+%wD!{ zEk;Owm2kn-DI)B278T5+2durV?(f8Txldh~FoYH`qz3*KC5(8u(mctte zWVxE{8TPDEiRQ7Az=G_{IP;@melidoK>^_Xy}`aaE6)eyx|s#&m7+X>SGoTb)H8?|Lob6?e5r+l|<^zA^; z%ouv=OMU)aQ4B{MFnrL{2R9IF25RAQ@-EKS2HTT)>Ud%}IWG&wJ(`ljdorvkzgM4M zHW;V;&XOpB4V}@Tqq=)lzB}U1gWh?t%9Sy{Fmu?l`HmeK7WY-7`!CA`EVC(=ki+S3 z5TQDxv581`4URoFg}{9SJJN&I==dL&eKau(Fw9Xgy^{d{#)EDkY-z98I2rG67c zRhb`aEq^-FaJq&+-!}|edkx^5&%&2D6n=SO$m|t^n%AJrE>N-P$9TqP2R{Y|KhF5< zt8vJWg(`+ZKTMd+g}9(MmHc4XNV^=JwxAudNX1g@4LM>*&c_pBex5MS<(=o=n~CSL zSjCZ23@lIm#MjSRh@Scq6@x4O;2S!a+FZ$T-)|cY?5VHUoay&Xx)E?KRdD4+Lm{Y+ z0EJ)g^TM!E0h&b|p!7W85J>h0>pde==uOozH&TW*`P`W7p=eDmQ;@>ute_YO3tt!}x3QF2ZdgtD)i1U&wmK+B9Y+Ol-Rz#-XyZ-t6a zxQ$L^Li0PXxeC5v;cR?m39|;p@p)G)#hn~06%@5%NDPR+*dfxEYKG1<1*bvsbn~WB zT>;4|35hR=>kMRmxXQpfBWB@s6Fq$@p?L?4lV+bsz`Sb8 zHon*xoBn2ee&iIKsJvE21EQ5%sDFcVB@eA45^~hCO(=&wp4rc>6<9v-^j$T(&<9?p z!AV*;9b$tte;oG~fwuysi;f;y)$ULOXjuFrjzhwY%*LoSeR$#ceOPO{UPWeR&7_@^ zENk?V8?Tv!*4G9VFKgwI%u3VelACv|dbeqlihsul)y7yXW%>GBAfrJACohsFKU4!>@Q-av6;}py9J!WQL2Kv35RW!^6QLP;tua(2vAojQF*-Pz!Ws8ah zG=?0{kuRaclpWj%82bINsdwzhsrkRF2x6^e>v1r2`S~X~)}qzERmGv3+fPozoE6-1 z%G!SO-%-cS$L%-U6b#sZTPE}+weF5`7{;I1y`Z1qiJ}vXF%q0FNEeZ4v?j)Iq~Edh zZn1I^AAWz_2+T!nZ!2cYq>SYc4cmC{RP={-C@5WG&?Jh`4c{KT1$IYmCeCRw8JEc| z{j}&!W8G{Txz!~OCbdoapz zWMXLW%_x#4e}gSx3XS{J71c|q`atq2bllY=kx$1Yh9-@CD(v_DH00B3E9lfXdV8-H#4KKAn&lnl$oh&zLp4kWVMd$jT0=Jbk*OW)<@3q{Psqh)*4<6Q%Lz ze)-^%ap=#TOpu9wN1S*Zj4d-UYk6N3*5>Om$3}MJ=Ic`^5`1WBl1~a|m;>Opt2;96 z{Nsjo+Kt(tQ#A+*`UTY;xYnbf2}jL|L_c;e!wA=D6a^!yW6lWPljy|A`ka#6VS@t@ zoGv4f_O8Yg4D0Z)s%$?5LQzv4s>s$stxqKj;dSo4QsBo+CzQZSeH*xi$?b@BEK}Hr7mkJTLqev>f zke1g=E0jQ6cj?ef7GOK@PwtS<4KuoHnjn=Ph8kqS0a0lwic^DL9p)Dy7+52FP|BC2 zfKvIYJm`k;+RB%Ou*!&jrT%;Haj<4tgd$W}s+{J}mdaSwV%9DlASxP;;PM%7QOF%^ zbkvlIUV&^dRoPWTSm}W1dyQ0fBmFT*{(}XM?a-y$pW!c+`KFoECoB6#}*JGvpVl#h~aH8=z{}Uj@6~$>#;3q8Cb6++Nu6 zQ;Xk`hL7cmQOF{MG@mb>JpPkTsI_Yra$%A;S*n}TS2XK&YONl(JImO?D z(-c5B{Jz@-iJD?JEX9a~d@#AgBmFz@BP{_>g&Vf#%D(|$7I@*-s$Vujk%sb5$o1RM zJ3#&cnT{?Uih*OW<*OFYK>DVmqq(cjt&Kb8P<5={oHswaa@-oYIsd1*Inp8jd37-Q zuc(1Pug?F_)!}`uZFb|E^Zw{NcKYBoJYT*!&|(AY$l=mUFH8be_BIDDW~|lKGG^Kw zrKJ{D-LvY$o%fYY#_aF~GV-uP8XBl8S%D506Nipp?=bub@t(^E=KzKa6%5so{)GZW zdwzm2c+ZekF;G9SZV~!Z7bz%eeL`PHrPfY2X9O<-mjCiq-$9GefBCC|Abx`hb$a8N zqTJ`hvh{v>;@i<^>vfQDHPvBpUxPd7lf@gO-BJf!1?UB|Q0-9WN79lO#=Ti}LjN3i z&PJ>g`kRcb$rq93*9q$kiNX%cu>nhKAXzmI_VT91SmW?_8A}kX^ETgqbBCGxWIHh; z8IPQB_D;+=U97=e3=3dn+_+}BRxMfq9c3XN8)FVf|EGVRQw4Y~iGwHpov;=o>o#<% z9Ym`9{y{N9H=v`4w&6KcQ(10JqJQND6T&(@n#GuY*z2z1AIp#;i`-*4Tjb2pk z8_$h>0Z!=hKTilea>bw3#W`9%A-((%KVKD7z4*lZrEEht(W;gvX=DM^(&E!3IfC(ab>bK^=mlJOWq&XC+7{CRuRS}=s zy)XAKD5h+&&VVV_n$f0g<<-TuEZWqrV!i+DyI0)@SUW0M!$O5SAVO-&9g7%!#2#7F z2p(urBer;a&s+W(?RjKdna8#D}#P=Nbni1K$)p$t5vmBX^tF zisPEl6xkZvN@PhUC-mN13Mr)b9#Tjljr2~E@0_W3G9(GwHhOxGCiQ%q5U_egH3e>L8)CrlkeePYftpl2CT8v%#mxUtKsYva+ z7T>^3<}C3qNsGx(_MMqZ&_a{8U#?#H`znyOD^s!t`;UWsZv;+tNRY<4oGVV;cr-}w z|47csDI*Z@!EGt#uV_cSS!b%m4Xa6*Zhz`UN%x4{y872T_PbCP)t*zjm>z5fQ^90D zQ`9mtjl0vYY+3&y$YnR~+|@Bo&n(>|lBePtl4qeYi(kIb`EB4rMAc-RSha1L|B~VM`jKe!xh|c^qQhl2eGV6?mPBe@zfiFUQ51T!i zxF+i4$(g_32{*zX1ZHR$2jW;B5$gRo6%m>#w&=2{REgGPyCxq% z*Efj=icXrz2c-P!U($Xf>+jLs_OxH4{;NRuhYD;!u=oc4FX0J**ry(H_X?bTRHe`$b#9fyabOymbUpN#JG7ZmDc48>)vM2ytijGs z)iSDvswTLxG(mnV7KY^b`idQbupcpL6k)81BQE8lNZ`6|RMkx6R*j4+2)ay7Ix8tZ(v0JP>a7;tW1PD08q7j&|TzHj{R*==9I2+i?Ek)hWZzQ@V}#A3bWt_!|KKH75A6 zn;yn$JG>C!9OFre@fP~m%|ETY5h%HKUr=IB3cFOP4KFpRTD0P**)Ibv*U7X*VH7%8 z`mXY}axcWxqb@&DCV`GJwA$bXfD<*)KimP`qnPL!*hdzXRSs4Ua`dCoA~#F!*uD!R zH`gol#+!u*q&v#xomzsXn(z>Z4K+1 z|F}2ciG{3w2}N65{7Dz2YO66CA}do`8wya1@=Mke%$cFI*wCcugrm2wSqjqRk+}== z;9)=0nJZ!ZKfzsow_QrTNZ_q6mSVj~ABAU7D=b$2Nd6&PPDP6ZA!aQ>o0m8LrW3c~ zWIC^cF%k+y%LM5C?6Sz)w=gc5Q8_Y(vmw^I&E5NU>HK4cslkPu@8d)D--!@R<3 zh@ZHDebV##@z^Q0fkYh%H7k|7^+e0joL-*pa6LfFLu{*Jk$%98&5>dBvW)uAJG*WM zY>f%n^3(GjX!a?ExIfq}q9{C?6kc(DHv=DTCai}@eC<3^>{J-D zc-o#H{0r{Rkb#N=lLDiq{KWcI+tI@vHc(I%Iv{DFWDLKvcJi`*Ktq3m2JHVU{TIZ|4C6fVu)3=cciL0?7L)Yj~B4mVV%qXZs@@ykRn+zW(7TWXZkEJpl{`eo~O>D zv4x^zMoQ~J zd+yecHn{-lje4Y7(;5OVI^SKz=1b42d1}W2P-DAVxm=3zTdlI zC{|P6tjDBlv)b|HWJTIl+3194qo)6{Kji_^Tl7e+vPP_!$1GvAx#XWaUAr*$cB>9k zg0mvw#w?oIVlc?eZzR@48GRnyEEO6h{r4O>4=K6LKndZf=m;gmui@MjntrEm??6#DaByCU!>R!@ytW>hGW{M^HMcey()EoqU z@{(z^ydUb+bK)H!FL&sSw)9M9!Dbre~6ima0v zqyjXZH_3EC*mV&lhi!bz9eXf`?JgaDYmbZ_U8MKg@S{O(fkNo`r7u_higSDhk~Bcm zVYqk@zAhM+l@ESvkcfO!III#uvmY+J@0&?3Ky$ZUG#1SmSn>Q1?vt>G+gzabbJV`vXhC8tHFUpLqtPUGoPvDSVz7ff-Lcl*!WGDjkT&Nv zdsKlq=k;*_PwQRMt>2?_asbPN zDwdG9Ut&J2#2qQIJ;TBs#JpCH45P>M$BJuq+ysaoQV^lL*4R~7E}OGHV5CHE*(FmS z_jw`p+wS0Kc5P(zeIB3o$Vl{_Kg@-elp%K*kw07e`J_I8{1F{;?Wk5FLTdeDvW2kN z;>?`RP_8~&)c#*L9JcIM!276zx6Ip5$Q84vlptw)bw3=V$|O^1=9|amh9W19IzkBp z6Q}%yVBUC~F!Go}PmdskU0kaARIcSb^IW=6a17g#u?KNHuHXD$jcqVm}qQTHSS?uY1*Cg zw}V%1!#m|G1Zwjj4nGdk&ZDzur47gP=+)#{q?@iO99GUaC^wl+&)&YO51@ICKtsF7 z*pog8l=HmFq#5tOla4K4Pz88jC-4$>u05C*<~TD?DPFcC-qV*7^YJTYRu0uQ9cU<6ct?W$hMT z{L;pCm}xMCz>FNU*%nBY2QnlM*>yZEd*zZuSoVj^%G~G%#BXbeHMN=7qWxP5+C$a` zOs0tn%CW_dpOkpT8?EC;VZ7oU30)*8L<;D5iXHpJ82B$MXF4;-DKVUJoevs{ zF`N$xT=3Unx-65doAe|$6&B`QO0ypid*@`)e*8$nt^n?qQymR8#C)MRPP!50q1wsQ z_vuJel(Ke;oHu>qm|nogk7X<|b);y1xKi*o7y5%x6r0$!L24Bg)n3Naj$8F4t?uBM z6$2My-N7dkPMDV}21-N^X--W^E$#=He&-BD=30R`jYu&NR%^i>IEz4d}?fIqBZm#PS5?TFeO(%GSN z2ZT1@w}4>*y}m1i24$1MXVOyOXW8&mnc(w#m8hvU*)+H!1_#1tXn2@pSSI?|1KnX?|~I(-0e^GlJNFyatK zbmer7= z$70pk4;n2)_&|zGy(_bFB@Oq%(M*|JD z-bh$B38f*E3do9(G-*_Rf#@#^#BfAQIU6TVpEVcH#-SwIMlTrDQtw#k7b;o>Ms;oW z5TFG8c zJypildhxsMBXPAxCQxO~f8A;US=Mi-oUSa&YF)Ky-lIU*C>>qcJqr5f+TUO?JKsn( zec8&Dhq!HLcU`=?2hcZ~pf9&j@=GZVinM!={)wc)dFpE;|BonJHW_!z7!semwA421 zbCbQCYOXu7j6STce>-&8lR(waBvln9mE8@;XRi9GWUs*WSuSg_7?*z_>M zmBg>ZxTA|PLiNGXvt~aHG>&DXQAwse0IAGYQih2A^MGf?0_g5 zrFCx{wj8z66cSmyp#g4{y3~9K@7gUJVCEPt`taZPzMhEDhp9<$p~o3!_Ikim3Mn;q zAu`{}DR-$obNc^=_Qo^X*SV|wc-;%z}DylrF8a1x}A4t`79aVui164_0PCZqM z@v7;Rg2p$NJpfeAAgOBd27^K%T3#WPR@)}e@UTW+$U!|D(?|-aQ63RSvr!(9hAK#}Oiy@`?pWMPR`b@K;er!5r zD_T+W^b|(zFP-HYvo0F*Zt9{e8ev5}wPVpztlgTgrzs}1#?*>+45fQG=5x_%+0OL6 zx)f{K79_=C8Xjflha=IS^?;(4;=78E z+cOh=SBrJD!o1Ib7B93DViaeD+W1b&*OQW?@OAU3-54cWqNCA%*gJ2(N4=HnswShS z5BDs`JHW4cnyg*!q+kM3)-R`irHprg+6TA(hIfFaBvp}681kPhgecr0Ee|}BJj)kZ zNn<|=C>??p`6o@s4nfNjXtP9`GLo3}B*pgZ``a5!(e_+UQWS5lWJr|BOa40RVlh)j znGD&r=d+t|GUN)9vNjlf?2GszcW(dR1Sq{aqQIN&HODR)Q7QK4wcC1=l zrAKMT#X^$5GD<5(wgaOv+y9HbwR36#<7yIPNo9|44282W5E@{(8RZ)vW4w=_y-2GL z|6*3_7OW0mL*lH82#_LANnFg=Jpo>t8s^N>*u{8nK6Y-!_?H0NS`wQ#=FN#WHbXd= z&G^A4N4CG1a(zb0CA%zh$j_Kd_B%;)9E3qSs)Zj#3zi z1tES0^C2H+XeIwj>ete^`%gaq>J={nh3j<`M(ZQ~FywJ7@uS3yIW4J~d_#>w9~gJe zbYo<2;5*BwhJo4*+^DV1kU5YvMU7q080GPUss(fKF1b;MA9Lg&<3y^nvTXoLxpnrw zmuks`q;5mUjdO;L+WZC3x{0I}iYS`=fdJuVBh^X1@iC*v4t*xpWxXl&>KVE4Uig^# zc-!1eaG`)9dXeniRIesB{BJf zQHI+`LGssA&22}PG1q3*z>~K>2$XFjDGS5~_@nmkzXdklPd#l$yDN}++CuaS!5Byb2~_MyfgT$Cb}g;WVKyud|9EChm?T1u_{<$rs4G1ltu z)lmx#HtM|f{j9tugjUp^ZWv zvv&}AitBVJeYUd7YR5DH5eJi0i0vCp9BWc<2jU@Eli>X;5C?Pu+mZ1=hk2uJX1Q?~ zJ(hz!b-&`=r9*V6Vdi$5u>U>4l#WN9k0$THjz@nX@j_N+5S=zY^4?Eg!RP}ZKu-Ai z-zYZjq~Tff(8fJfj}KYc0n!(Y7d=vJ(r`Kyk$P$WT`hsuY{aa2^^Sil>68 zmpEo$QzlOR{oKkCIC1KTjw1E&oH#|R&-}13un=zzeX<%Hr(zxV2O z>(H0}cakP=tO?q6K{^@44(ulu6xsh;$|;=PzH@{a_1Efl*lq$(T-^UWo;V^{i} z^#UW9U;LKl^*u9i-Wc@y{xca8;`VAaT$J4=H|9NUpIE&U`z#!5z~s(P;18gZ%MR&9 zlhK&ZWf1~rMXM$f5^MQd$ zg4d?b##`X2Ix3-et9`G*{T zO}V~oE9Qp&n?x&DoYSKC-4mYijODB0Dnj?yWxYAJ1n`|s;uFC69!Mw}!cmtPE&-j_ z81Xi{teTv+L+ctV-M<;)9Qq6(JA)CK+=dhINzt7SBv^spyCyTsyqP;Yos=o;H=Xmp z$vExxOoGnRGLx(w-2;$oAW^BX%Yz6PhE-gN?{K`UI4F5ynf~DuFi-5Pl;P*-)1&Cf z$oNYZppHD7#9!gI)O+MnSDNJA)a!kt#X2(vbX(u62WAYZ)Gf@dX5@+HQF9iPR4w%m)Fqc&pR2bqA>W3JA zfWW95|IgH&zHOY&~YWh6~;ylFR&vzNZU3acvqOVX4$ z`?6y$C1&1dDJ61*T*Nm$yvYGLFEGPtbv2zDRx(9{e-aG@yzFw-oYlgxK? zWkVAfPJig9iB|xIi_9<(S97aE7gj6|N}Ob7_E}3YPI9pxOIh50pBeD(CVM^QdxCP- zo&NjZ_u^T1iH@??>R>n&Vj<4XH&RX?WnS34?sskK1N2==(kDcq9Y!d^JH>-t(u@|> z_&t}*M2jko#LMFTD@*or%2&Z@ykoulm1n*HR5?hhLJ{zi(<&FsbWh+E27L$r5!peY zecX^7l+N)Cq*TtI@wtBn`kb8vYPUDiMrJ14shqd_oz$<4v3g}-X4X%AfyQ)_Mrb+c z4djBw8_f%N!EkEuLn{_aK_6PTrZ4ieo*e2SrJd$!pIa6_9a9j z!_K!-zCsjB?6p|iQnbV}b#&Ty2D?Mn@1~q4iY1oQbpJ@S#IgvQdQ{{Z3}59lw0kkD z7+T9!)`ud3QrKl-f-u`bw5Zwz^zC3&Vo&eMVh4%;>Ci$LpeW+^(JT;A zvdM>Fb-20aJW`~5Oz7?9DCONqlrSUCsm?HY`Fxk%a|!~6iq zho`K>C3jsm4Ob$EL<<*JCVgY${gkf+<@Rw;))QOs_K|Bsn^mNnJSNHs`mDZ_avCXl z^n)wnzhEAHo{q)=g8e-D@=&t3Q%)BpkACr`z2{&aeLhK7#2<>VTuaLBd?EGJ8EeZf z?Rn1*l*|GhbyB!CR4;WRk~%;Vfn1K^(wrpWQs#4$vVyK}D)!Bu85$nXGLDfClmzh;r|;OuNt4qQDN1#pYLI}Kb&RoK(c7gD|+l)f6*pZ?<{?6Y2?qYf`3#{IMp?pzcv#BCGqn1)`6s|bV@ zZu{||WbdY$>$L7w8=oBXM=8+Mouon0fOfoA6{TC9y$^^eo$6 zEo`W6{dTH(?x5Uzi=I1SKKi%I66j(g%kt%vQ$^`yJ@$r*rP!0ot)r^m549%Hugwy! zPQ(OTUr9NIlnB^Yk3P2&BVavr6hc<2{VPv}ko5KaLD`5ccTGgf%5{`ALbd?Ix+Q%* z^^_TX``sR?5GV5W)KL~nG7(WPkjdUoIbD?9cF0dBiGAZMbadHj=cXsl)>l$bp%VPo zVjHu&>|Krb+DaXTFbh1)vfYxupK{tLnxx_E`!?f#tJ2fP(!0+_r{L66X54Q(pE+wc zp4rtTWuZ7jvzdydZ>O3r+T5h2mwmkUDxj-|psTW^u*wjwQ9l&(l)w)MFig@CLViL6F#okr@RO6_BwRwd2iy{XSL zi_qfjtw&W^luvW60x;qUPi(ZA?4K^m-GIC2Y7!e*PxdulWzx4(y?bae#7?;jMqv!` z8Y*2@9yy(msI*yqBlYwtqOP4)=ZxR}GoDq~>gj{N9rnF=uyRS?Pd#nMY@Cfl&l-+v zcb$-Ba@tXG8vMf|<(Bm@t9G&aaK?t5_OZm!8&_`prOW6AXyiJ z`4n_yDk;vIZdh`5ukrT)OcC=yZbaX}h4C65?o07iHx@62! zNQtO5P1y7cYV&#>WiW~|AmmA-`Yfd^Wy{8cwqN?K8G*Fz7kbmD9M-7M*(b@&HiPprfie91wB?p*qvPO_hG?D=CavP(0?H zCqF*|J?4!%?AAOcw@;ZIkN?DVhCi~3^fGF#iQ%{xg-v094)3@Nw z!%tEbfJ`>qs;)BW+bO4uqRac{owgJ8U0;%}P(!TQYd<%((#HF#r_HDt`fopcH^!j* znb2m}wjk-V`cCR;G{!tnTzJY-jClqUXbcD9_B)Uvfl0rxKd2jd!hlgoU2_6;(PRga zPDuiFNxzV4>eMC|g#YLJ!5=KfUME44I+z9=6~s1AEiM;kNc4iD2A*|Pw1`{D#wxLg zR>**)ye(4N-Kslor3je%8l0v2`m4mbsyye@JB+n_(;uC<*$ey)>!^YjeFw($E=olA z>nCqsgQrY?9pZrB{{5~pob2sXOFB)y-pngrk2XPsq^o~~fvjXNrDc@c;8@q$X4A?4*Owp;2M0{9FA^v9yl>Pos zsr#DvpNoFQy05qaDfIRTH~H&%Cn2+=PBVJ_{`Y>t+$uobqC@SE)q{GWtUd7ncniaa zAc4wd)$oP+E=$oSFZ;h-iP~fUi7{!{FWu3Z^zBsdJDN6m_oe=;QJb_9bX9qS#kNiH zq%WtQDx)QL<2ygj!Mk9ao+=iiEZKxq@V!(^3T;nceC!Y6p1zr+)z1*vt4j8A%BgZ1Pl?Co zel@cRR`3>*st7bj5+eEDO24NGz6P?-&{9<*~+bF=CkH#p7lPS}g?Rr|**WLXF&c&{;cbj5| zD^W^OWh+~d@DxqW9JjX^P~BsWN^}yj0ArR>%CzxOBgX$!4!G_$#YGrTP@kVte3Xt~ zX=isE>jQlE5%_An5x>~k-y5h98vH?VT7yB2nZE@h$ZsYNW!}&qt<~Fb-q8I7W{)%@ zHYXDCwn5YIx_G0fF76NbJdJVaZ!LoFS&$2^LikUb>lBVPm3gE6L|dBQj&V?Ig-y{V zo6uHxpgnj+sbzu8EVUHPdc!$Ci2Y0+YzJaOo-y--f!VCcvlWLXp$B&Ve*J_p;Ppcq z@|*zp!po|pz8Jlsv4qltQ}@8-5W#Yk1d87Ocwu-B>ivf`bh%*bHbTSrpszAs7X#A( zS}Jvi+H15LNU&D#A$AzE#uK~JP))mQz4rC^9nFCK5o_#aJ&K&Rz^gCvN1tJ|6&9oy z{(1|bf0RHUkHw&wp~UE7>A>ws``Iip5Ruc%b+vR;>t8ME3Di8MQIl7i zQ(RzRy!I(@*-dOs2S+QxL8*X$Yvp4ju>$^a0--nHuZwtNFkQ1wfQb`Eu(TIYI?A}p zHswSqJ@x*jc%nQ(L0b{36C$ywDk+-&$W!p@Ul9@W+>6Gz?LWRcaVlnXJW1dUK`-=R z3?es`VeqgD(JJVAQYpj~o4&Vr_KB9e^-<|`akSbgyp9*n7fvcpVbF={j`QRUuf{g12I=_KnP-)uTO}1{gS7Syy#ILV=|sMxLmU{1K>JD}+F}7VQp6?kPCrjA z7aJGKOobpF08Tzzt){{oY!pD%o0G%NeTpw?-4)l*MPJmb?Wc#EuE(jYxs&`YBaRTss(c-G(fRiZ5XW%GVcp+ zIQ&jU%0#S(HdOtN)05uNaF><|`IY4%e-N(-(Agh)_tVc2vv)vNflS4d0yiOPnu*2h zTq}PloopLl9k3NU*}h3o=?w?G^#Y{ck!CL3gv1pp35Me_GlwCl7i^HEZr>W!JrAD& zwa}3Qt!M3HmpCR-{{L4W6aoXgzQr>j6bbk;9BFC3OMHRALCltM7h^S0x%1cY&jX!r z(dY!tbAXV_yyKjdX*<&|C|o%WXdOb*3L`|6FBQ4YE zz#qjONnXk9??&v z9I~vd?jWtJQj>RJW5Zkw{Lfq|G2^Dy!{40Vwg>Cs-_dYm1gsIOP6$m}T?C)z3(|~p2txZ~L41gN zS#qISo^_%zBA(nHutb#abnA?r0K5^8%MG8IE(sT1@WbJ!%|~7Ekw$Hgpn!AY!90n& z^8L}ivaJ#&k2fj#-xM0FE}-?te}BudtI(?WSVLBk-C z%o~jP&#bUeshwGo;f@j0`9Ybl!PUh85GveHF;o+MR=MN;#R)@n=ugsI7$fkJkD*b=OX&yKu z#&p@4adt7DVVAx3-w`++`Nu?@K55nqZ3~Go5Y)-FNK zF_fUQ0R~S9Q4dbS^F+~{v@7GD?xtXw*Mw5vGPbm62HI%D2&_%uVP=#aQX%su%q?xM2swQ!x5q4wAapx%cn;sVHM>F0-@M91f5UfX<>W4%?}DLvUyvlr?;VO z{?u`#ob{TKtKavl-i%xwNnma9!r{s&oR*4>ovReD`%hD^oPzh`Q3j+eB8oUur`niz zA|(sx;My~H^#M9ZlXQl|o&!U>8BfNF55|fouy<(NT-+~<)Ngw zAniK(zLAJ@su@xqYKjZeX>aV&DI?nZx;?xD(ax|$8|1)TX0#L?@bhKg?L;Y-uLaPDUa#ZF}vMRo#KB zb0nN0!qbUvni|Ye5c3mqYtqFw1cbxb!m-^B9vUl~e!Zw+b`4;gD`SgBU5Ex<%2@FT z=peaMbGn-+JaM!0yDHnA;NUywtr+71l=E~bp~^rCjL1lJY~+R~OG%m`@XV;YY}$o@ zXTFFhUMEz9LK4$@=U4>Zm{*L})$T91JiZsZ+AWa&w$EE0Q<6!w>|EpsUW>VTZ)iwP zyy=5+h~yU%No6bo6&5K((p7Pg66?|BreWKz1SAV3B#{WXk1)It2nc~fJiQ>3PKijO z`^A(k%q!%e%*Os?T%Qp*8+#Ffrn)2%M>mY-bifzOj|R0h4#Ck2KKyEYSD<0BNJC4W z0NLtLQHlY`>L@gP^o8Pe0Xa{ESH7Z}u1MfmJNSo*T>!@t6C4eJkgTpuH$3~AQlZuhHBKVt-|1TA4=e5W`*#g77PF2ZVvjGr z0?_;>p%DikWx;fMsMNYDrTd&Bz2E+D+jx}Tl?0akBfY`+@e@&cSD7J6f%K{=e8lRs zJbukABx5v`LE0UQ98fT#@FrJ~}ANO9j0 zvfaAvml@avXuXUmx2PhsH4_%9s3HMYfu}nFD{zR7S9qeL=%Af{$zPcVs5T^^D#ETX z`t>7VnFo`0C~!EEgGyp6&cqCNvj# zW^Lu5bc5*r``f#)v%)SJQy!E-C>gajiuuHJ`x;#udpedmaO0zcGIi&n4YyCj9xZ>6 zn5$%|lXI(WVNb*RgaJG^>|H4`@LkdDQ78kuW$dVglOI~9keFqFW&=I_?Tt&&2HKN| z$zrQ;L`2cUq5IERgnD?dj0lc}BnA-f6!WdZs_VK^FpXY$q=@OD;|@KjTYU@652)Lx zm}r%LcdcHr2CI7xmNAt0z>BPy;Z${hl?=mtlE2%4~Eu__TikVjweVf+n zi4mx8kCYLCwx|lB(oLpsWp!)bAcYkj&FY!h@Z5T|dXCc2CFhsiT__B z3Q9Mkv8uMP-~+QX+~lf;ehZN1M*JEV)=A}77xjqvp%xmBYg5I^zD5p31!!y3Wzn@$ zFqh>RkxIy}z(|p;ayXNVi78xGDOa1p5I4@~upPskfcBpvT0xczfk+yFiE5@|!Hj?s zLmBKEvN9bI9GieZZLuQOb(=z9Uo*<>EW7dDNq9T^mxKZOMZ07lb3-5wg;;7O8*V1J zrlBKR3iU#Xh!`Kwhvql+P=4xx&N+T8QYW_+zZIl-gIAt<(eD^h?WAEZDv5%d1z@Y) zGeq3{c<7{5(3Bt6JpC)cah!w$i`ZP^mc;3CdGM32`3M3McXtOO=HgA*vX=pLFBM-R zYfG~%QgB%1*-7cV7JmJf(O&`|j@S5*7mu_EK3C5Q3LE5t(gTVO%zG-G65ScJ+%xs` zgAY3B1dR`((Vavnq^6SA^CZM&CEGD6yAd`c^xtxsY{rCh59C1X(xm%X-PrB=RoIJ0 z{GA4=<66hw5(g#$n9(XqhM*-uh-DW}=)y z;B!Mckl6S_8a0SVLp7La#r$kWT4vdUokp+1Oq4SvBmp5N6!;*c3x;3#{4Fr@5OI`< zL!C{RjMZkNainYd+|9_5vosuHHx4Es%xeQHZRku=F!9bY*uU>=2}yG(>h;&7P1Dg^ zBu5XhBi(rGJudy}wGqI5j)XfH@<#RibB#G0?Mc4-3c#S_&E%$Feiao z29)A@;zXMK_xg<)KtX4T0vHIS+yS+@n^qfw8H2L;1cv($n>0TYF#Jcukf<*3;>2@T zDoaVAh+MFIZx*09S3^PVb7&5Ol^0o*d+q4sCJwzAP@JcsP~?L*50t}*;K3!?NA5+h z#QEA^*XRCn#*jsc5A?kMk%gB4hW~092&agZ7_jnRZBjyT;PH7wh9U#zKoN3|{imM2sz5B4LTvyUGNg-z%0#hzEe=?x`*k zKau;lnwl1@D@41meR}1bO?Y3sR7KPyr#p&nj?Wv0(ekd4x1Z+LLsJJP`KZlhGk98H zl*q^Nbw7{9N}Dtloo-i=PztpL&G7{o~*}0hz{!ngFM}q~FI=Rvc8hP#`XSQ+))~LShuup$G79tr}91v6!Tt+vYdjG;7@FFA@ z{M3khNBSozAJQj;3Uaz?YQ$-3FiBZ4(&017#=y_ILI4STt^D*tx>{bXarnn^2haBd zhp#l{u!vC{SG13eC{*BjU(mj@Uhr@0Jx)Zjj4Jg8gt{m4_rWGKO95rp=rnEh@Y_f2 zL2dOv-O7aq5a~W*qfqrCBlRanK}EN+DL7VbMZ+ zQ~8(ummr^VDcDlUr>@E|K=^)kT@e4J8(_)PV~OU$bZi*5+M~7#GHqbsp$!pY-h1g? z6t}3RH4ndU&YU{Xn)xc8C|*Pr(-RMhKh>tn15`N%m8liwOXIOPYNT{Eyriwz#06)s z@xh7}{JCQBm^_`*^q|vB8~r(~T0F^*I9BbLLGec|oHt;~&9G*L`ZY5gaer<%GNo7C zSUMi*7ZG=(?yndT+|v(9u-I)LBt@x)o!Ww}URO#xhTIO^3^qWBdF;~3RNHO6`& z-r#Y_?@dt0{E;2Pgcrz-IS@{BZHZf34JoJx>e zlh+kz-80k==zA#W{ec1)Vibg}E9shcXPoiuTIZzLRvXtnvHc)8r^{vJVEVeG1XE1a zf^5@(*#J&a6D3dG&Jc&&s77_MZk3A3CDJWuneM$Z`Ms|CUk2|e1AL4&s{Wb!3oIDQ zsy&@*A%-RiuiQHL=ba!4Jqdm$-nhi05sJT)q`d3+0i-I|lI}vAl+cbmBdb0#YZ zTCHm??BsgO4MNGH39IyVW=fnCN>7-VxJQxZG7=RchV*QxL?l389>6?X zOU~jaev4bTrGDa}( zb+y5Pw%3oiEBDtSz=s-w50&D;ncP6APAPa0)5%fkl}Wb?Ru!t--8w0#(LJ)a@mc9k zr_2o-xnRo3f5YipOVC{%oOXfg{&YII{msG1(Zxx?9p6##`p#9!qzg2m0$;3P1Rj zWG0$i9jIv4@3xM)Ypg0VInK&Wr}Qb?I`GML7Xja|qwt+`apnQee1}2kGc6oetTIoV z)ZXkqWx}(d1FqM2pBuvI(0Nd#AFmH7wxLV>NxWQOjrt)u=A>Mu57g zD<>tA%<*(~WGG31n(a0%Gi}c;Ku;Y(54M0yVymRUalyJePPI*tM$J#}4qS93==k~s zYA|mQ3d6n8dgxV?7w|@-{szCAtk6zRUVCIyC*O20sx(JjwR}w-9mV){&DD{?)w0b{ z$|N-2jz037ElWXCeE+9;3(fa*Y%^~W#Vn5wB~YXB%-Q|AVLt-TgaegliR>^x9+}S! zCq>(w_V)DMOMo8@RDN*uFm`xvnr=J2^tjy?+m2a+DAUazI(F`_-vh@Q4@8b7_!upj z!7e{)5vI1E3O;I_vK6?|MB_$9j}q5`Btq4y6@HnbKR*cc1?|&U=#MrDZNdSz z8?%g7Ti>#4(@gjx6Ji`r@xUje7#93)`oz+#B=<{rhI~ zvD28TG}zLlvr~SLoeuzw{h4V@>BeKHjbf7xeCmNQj{|KH2HJ4!$i7)VR(r{jX}tM9 zJa_)&`+>qJD}^atJZ8!$c}|~rnuk9Pl*Q~*RvB)BY}*6)>@%M6r@uFU&BH)tyggJN zSZhexe-&j5u3>{AFX=U}u2yt2@a z`@lR2DU)r_8`N)Q6zFWF(V1toI;9H-w~GV&Y2Y-T=CAy5#H@ZmLt7FW_CI#xDgE1- zJ2zqW@(ncX;&cz?%-a9xjk{#Sgq{-xK!2kt`u&cY((SX)rTNRS+viO*)P}QWzf(ZT z8sC=o>I%#nzuA(4{f<1_cxUQ$>XVb-0pzz(kmt7Lh9W))k)*=EAqD~WnSX=g(RuOg zAI76c=T=^nC$kdvF~!EUo^tgC+g}EXZ)*p|#*-(h&9HCj?P9d~t}ht#8~Sx_?-;!Y z*1BdH?0&Zd*u|)2fB5i@IWGZ)_p(!Huwf6hv(soRjnKiG| zX|(-*nfAwsu|V&G8ogMKgOONourVM+T`8~55o5wq@YfjmuStAL7ApCfMh&LKP z+Pn@p^U(iA&gk+2mj73jpCG62cZg6t831J;=W+RIdzi!5M@(HTi=07+R5ex|@m}GvB%@ zs+K@Cx~yWF3s60(p~?$|+j`VRLpWu^g>7xbMgho2%>4Gax%H!_bs(GI`|n2Vto4|N zrz9UL=8+#I!G@4aod;swSf16kP}~0zyxDQWgFCMTERSngV1#6uHw;4*nHa;qQc40l zfoAY`XN<}LG*4(~-0|i*a0Gz^G}ZufNksmTqGaAIjv0~aq#_ViU6B0~_E&jQLsS_L zhar~++L*+BUU~0%+_f2Usad6f4ff27ewkN|!ly6(an?}e(^DF%8VEOtlX3b&zKguK zQp6|P4E9ZD)onmTPa6^WgDFSkpj0}Yw{pZ34YNgGuiQgc^bRR{Fpv=}46 zENN;ml#sMR|2S^76YxGO;`MtQiMgBNd_)i`ewle{+7*G|%;yi;inBfj84y(Bd`9^D zc*5|MZ5oRC&y){C6wi?;3R=Tjb3X|SKVGQCMA0KGZg;iw0Gt~l zFjyEo(b75YdRkYdIb+(UVppXXR7`3^Hfg2;u8lcc*rk-Bc~(DIxE?2rzG%c?S4fy~ z(0YF#^4sFY*!%mXq&R9bkW1B3Z=+Bc@HR%VP@G$h4rTV~39HwRs{&+$C1h}J3F)or zi4B{uEt0gKKx&G`No@LV!Td008l!cQn$b(|1dK0h80CYk-Rd!o%n(IwiMoO$iKp%9 zpv>((vy*pE0BCxJpednCmX7I&Py2vKZ%y%f&~*P@)0Xq=gcv?-Z?xo6Ha%ytl3^|7bgSJ_ z%+qdnq#OO!m!&^GHVF9NO$mN0_{>_5GOKakn$c?_fc`xNJ=|=?LXW7cLCR3KzXFmy zqq{dj&y%z?H#b{`)*JlWcXlo41{Az6QPASZin^M-lCPb6?(w-pbEpG?urj zG>ajz%sX8jMn|BjT^`=v9ngF(qsg;`gSMkQUJh=4T(K#Q6$os{t&6V3$r4}4*eWc* zX{Zn*+(#|IvC5RgsescWf@dG~`fq&!+m|x7$}q&nBJpOmF*L$RcGy$rk{5HVho*Ht zela+86k6V2$;kaa0ljqQej%}s7;@C~2xON;#RMT%`?+sMO++vC*XFpy=n!C)9ag;k zRSt&|4${_n=D?Ao>H*a^1S&M|;Z$z-3R{RKGbbGmW3EN>@dMY@0p@Rwm~F+^M8e3f zKj=9&U3})<VGEI0Tk6+@cD~#739RO2{n-Vp^g{MrWP*gt~a6 zr!MXf_&kkq?1+>O<{CG&>exa;QV*K<dEO;Gzvomvj%gMQPi>bQ7?z zEu~In#*nYJVx7uxPH0h^%QG^pMtiYir^MARzjMfD4`3fb!S2r2f}&arwSCEJ<0&+_ z{?MsdSMw7$yeZ>0rMvI0nnQlC2J|C!=;0iPaT+19$XdLgiy;%QD?VVFQ4oRB32AMK@J_kJWp~*rqMgP z=v42-`+&Zm6X{cXB5Lg(4`j-W_otIyx_9)wK-t(t%9LJ!`++cKiKJBH`Mx=55mw`k zQ|J<>+T^rC%B11iU@d-Bg#jUpGILX$S!XyY6s%ct`tBJ(!FYuN=nfqY`Gc4&WdGtL zsRpGXx~{=A>>#hI_{}@cYYKHxLEy`SStgE1Wxw=q%;7rfRbX8*+hD-Wq zoKY0r(JudU-IEF7 z0kiIo4C6iX<^_lTd?Q$U)1-BWeIAi>)oE_Rj*cPWmwDx+)SBjh_wcZ-K+ANI7U*yn zg$@7S--WVMHAUElL(eLC|N;NlFCi}B{L%MCRXzF;uJ)8b5XW~600 z9r&YYx8jJ%lnDhhHC>GIJ)^8-#2}z%ra}$j^uU!+u6`XQ0*^iGpeR?5it6&$EU2IR zPhRs1P&&&G@Bb>rO1is7@z#<)3*P{WXX_{?Z!@V`Ve&5+?~Gj6Iol}F z5B2%sr}u&CIc8L+c(wN-^_j+a>OBYd8+SKQKUbl?DpcqPJ28ol62nRzN*Cql?aeew za%<@M>GuFt^E9f;>tbLp??1AbZxaqmZ-nWcFIxN(&^2G7OFArjG~|acBFSAJsh$aX zYw!$yHZ*OX?fRp(F2XJ?3lga@@3k4{n*NeVt9XS= z8L?n5;UB;WuIREw^GS2K>YvG0lLaGK?F(8)Lf;GjHx)Ay7D{}GKr($O=&p2C`J3S$ zM~2uv-A&Cl<`tpUpS@Z$WGB|2EkYzhWlRWD@=SX1!=O4`iTsg*J)1XUrqf~(gRfD@ zkH%b;@j9Qs#RzjU!LYd5tnc?g4;7K6~4CC=e6#_;BC``c2e*2u(BjM&tFP(`! z5>{wf#9J^c7*@W}YTJ(eetF>nhjkvEUX~4oeFNtSdv4)rX_EZb4c7U5~(6-pLb(68<41yX&owCuc~Nb1A?eP%LB>J}XWrcKL^gQC9{y?5qL)L&b5IP7j(*0oR@qY`WJUhSme z$cb$_1jgEMp1On9k!0yH_sqnOB-<4nV0+a1qlpD5l4T5{A{TmayZ6wh=dAwmnuSjQ zrX3QdfFDdFrx+%c)19X}y9gSMcNOv` zW%No**DbQSAU!3^R3O<`i{icgTkPif=)L`;LzGyEt=lbLJ;@NAxXz|zG3y{oP3Wax z-|%||P_?{BMq3>(nq8p$8v(FMCraVAw-oz`$Zuci*r8 z!MwgS6ssGj4MP-rH58Ov4^I@d+v$Dd$1cR%#zDuUCrn%qv+>S+*F_0e5bIJu?ZVmE zFY90e3#H|v1xr{Zl*W;3!h1F#M-I_YbaH+f{2RLY*M`|++(xMvU5P{#4A#9vyCL6juYVcdkdH`2VYmQs#6hw79oJmC8ZF(wX*lSYA9EP&lA(m3 z3CRfle$Zarzkksaa73Y|`Vc6bFOJ!E37|MqL!rBXng4lKnV|U`m%jS` zaP&DIrTulwNUh~D!@MfA-o8sGT{aqf`~E{i)FUhe^GXX^g?b3bg@UwBzZS<1Gb-Bc z?8rq!#-Yp}t)Ws{#imSJXg7o zE=!mtm~wNUdH2l=&>}e2fI?1yvw0Y^Vo}HO5PP}#-`_08v-n>cmY#7TE~JVdv<`de z-G`6H4tt$63>DB2-qvBq%ma#cZ+O}92kw;Pw7-wd!ph*h4JdsExu5%#*hOjKNfYq2 zJ6^+qdCBpJ0Co`>y0F+Lto%@iz>qTW{M4nF0*(_j9D28sxq@fbT-g-+u-8=!W)#EU zKT-Sp*6DpVj3QRP&`zGgIg7X9$#as5%OfU`dVFBd%T9rAIn_mCs2FX0@N;mC1ycO7 z&)#?Z7W90btRZR)iTSUIn53-OWT2S2MDd{iu--c@4=|mgVTwvQy9sQPGI^6hVwWh2 z-E=~Jmu)40=~NL@5Zf;n#<3}Q(j+gQwba=ZZvD8eWO*4NJ556->K!P>Z45$K%wHch z%m0P+1fJ*|lp6c7hwfQf4e0)@p{s?a<#1s7T#|aU$W2BUCPaKQxYnc7?s8o-KNyL3 zxzi~qEloq{rOB0plukcq{QBWs?DTVngsmR$a3OC$vVccSf0mSns{s1UV5GcAEbx_n zs4fWN*CKKU5e%Z6y409=i&HfnHJ|5`Ii1(-1B%Ka>WUuC&;K9dhTfEw86O z6pY3^en_FgG56@#mOh7k30Jl9LloPZ3Sydl6h94n{SjB^&Usk9ROgNQ>pfA(3BgXN z@UR{Vbv!ZX-2O5oH%Sc-Ve@F z_=#Dwy4yU6fbv<1!a66}Jp93H$0Mq<6;xs^O^Cc`$s}vW|nUn|Fv~}M4elEFPk(xXut`^oP$t_wrW>C>G3qQZ}jY*hU z_+JTM6s{i_nk<=+e3B@lTLqS@h^CjzK}%G06o2>e4?ZvnB|;u9~f{!={md*TqI)X zANK~TLgIGA(?(TC+I2}v$}=}7STQ*$Q{U2EUpz@j`}!wPglc9#^szl2-S`T&@#}#i{~sfTE=Gc3H`QXj*}w^7HcT1T%kn_ z^G9zLBZf{(B+$M)30qjPIMS4>vnF#-T{w1BC2%EO!UAf9>&O-^`(n(~Uv9>Ik)dMj zsA}oR$QEXPbV@(Nb9a9}uKU3U9h5Di0{>JqOmTAMG&I2F zA{S01UxD-)th!HtD~FVCUjP>lDg90@ovRkFn{wPAd|cYgy4$_^Yvf&CI_2bSIrLRy z%PujxWcqteUXp(+_VvLA0m`q;^Fm3Px7-VnA`7f$Z>hi3^e|g+)2&TzJm`aIGrqp@D7Y4IjYwvf{kbxbGMQ;^0<*6SrN;Q52WPJ90V{L4Ze@x? z&FD%EH?{q_b4>PE3U-c@V&%Md(KI)v08e`}a1>DC1r+Sm6JA{eU{v||@s<@Np0c}^UCQmYtnrk7*8EBSj>-bkYm6Tj`EeaS^> zC?-}KsxEuhUx*T4CW*XmS12KX4*Whf2%!7L@Pl%K%Tb07{0ZG}<_THFZo0Xd?-ZFz zSY6xO!*YtI+yy$W8!1DQ;U=eD_QrNXc#n|lgNb%Mw4`?9oRJLii`6huv|cuqER1|+ znkd=%A0Iq>FJ|YvQc6=Xj5%`i>=W)Z-d4VxwrHmSl;jvGNtdekSyu=A6mG83O-ldH zmu`M_DNcCHwLmT2wye)Jhs!8SSdi{E9}dGVJ&LB&~eA#UCWuRL#u8|cX=>CxRuDr0^v-yCi@u;FVnq``oa zy|_7Z=+l6%K!;B4hF=L`-f$3l7Xlfb02Ree%R0L% zDTW%A7v1*z?jzu&E+nZegn0x3@;sKk-rDJOKwpN@4j?YWDev!-nXV-1X?!g`^sVWC zIpm;&ib%eSlYFRFP+3W7ZV1z7zz(9>HhArYpwOQN5!!N0M&Z7&;gTCf%(rp}rEA}d ze=J?{3TUKaQl{L(07+$nAr$eq7KS3#K_5h`VEQL^Kk_%UwP*aNc)n@M31)wy%SsnF zg)tCrhxviWPO;PI%|H0fYo;^;#U&)g75+xQ4|Y*7N{p3dvjn-?8I-k zsR4gLY}ut6xT!G}+1DV==oz`H>yry>frc`I2JmrHc&{i_?M6;q#6h!}8d+R$-g!^u z2E^&M#0kktx%&{On&hpW=Ocgqe$sn@vxkTiyD5PaLyiXI3o*&hfE!UZm85HFS{mGH zU^gnRw)RW_!F>X4$9Z0o}Nz=TOW8s*q?1 zQ|38?`0$)`Lqjpq`M@GXQ7NOKOijkCImhTBEwf_6%AGqgv!Y5yq28*hiR38BT>~wp zIj#%kUiy0Yn2nfOQBB1nrAQ@*!Yt*KS%|LZ{3CG|VvQb&H2Bc+jFj)6a!M^6?tltp()i$x~PUU@xoe~lI@SvlX zW8Tj-680F(#=u-N$P4#I+H{le;HE%40WT6ZuYqCN_%D9@!;ztE5Y2{of7E}5wF1U# zRg75DLp?l2Z&C*iE^cQpO;`UB9kvT~^>qpzks!E>q;h+PLU-mf)ZsMxSzcSzw9F4! zu9vYuFewJ}4ue=@PMBlK{JDnPEhtN#(%>+9(1#bDu=N^1?jev%B@I1F6zGt*Bk6il zkJDlsJh5gf{3)zL5`+?@X5);Ca!GR;Ky~96otNUYY{3*&s#b|MTl@x(~cy^tpom7E;eZCM+swVwkPq0hzl3rHK(u%o zo>?jO=nN=-y-XYwApd<}Krf!T{0>U4L*qkluftr2W(9#eP$qzbJ6{Nf{80=Fsnu1s z3Q**s&7{=;?)oyRO`}||1qz%SR~@QjL9-c-_|MvDgMg->IZc|otUdOb&Y~y-rK^p1 zkdt;KJHqPlX175p-T7Z$_09(D&L2t@rLb_OOT|t>mhooN_Oy4)gFr#pi~=aL4Z-+9 zK4O?cIi%#=96I5lWtel*KPhb;6UQ>XtCXQQrnDXP)U79OybUOcB%!1%9*FrB?J3@D z+TkiHhLI2!V#jJ5IMl)+jh@?kO#SU;peJfZ4<|x+C<E*g^ zlr9^;9@A$AcG-xFbO>JT_!E^wnilS@grEiA$dY1uYSK0Rv3nLH%9i9Pu@>GWw89l7 zrQgPFSAQ`K`)v#$QNo2r?6R4hnNj7{l=%rMm<#TFej;LSwSk$!+SFrq8a)^dJ#!}Y z1V_EeKx?L3kU!bwhOC^l)a?8tG}qv-zbxBj=n18Co|G$V2u0qOzAO zN;;PbDNt$AoGwI0fzkJp@Q`%D==3Ks8d&c1T{{kN0r1JPr zDb4`5j_(p*pdB2hL<|S@$XGQD^xVxVhrxwu6;+}*XA@L`Zim7TYFZL15e|C7d=wV@ z-G*{I^92rCinp^{RF0q_0!^&<#R0%ffm1E5)ihJ+jy_wChFx>3O2MBxseL=fLCN-d z>xbZQ%p|!@<*s<`$n^$&2dIP?t()>Lzwg4c>voj}cPPoe|IY{y@N0;Vu&W3hJRD`RzzQqcJ)Ok*Y)| z1UMrdJpJtsN_BbXyRKe-JD|TyK@UC7T7*_|ri}*6ngU}n2ZVvmCiGZfme5%0HJ`QZ?587T@0H(n&j{RmkIB^dGJ3|nKInl3U2I{jec0bBD-5~H*G^1Me23I3 zpzmPClpHXNgl^We(&;ePalP=#=QD=_MUN{KnO3hE#Z&Y1>LpA~BGZc|nH!kkVbXs; z;i3Fnr1n=CJUzq?WBj#e@9j%R0Y9El`B8-3kn-X&dQIQ|i(D~E$;tPev2z>m~JLRU`4c2RI$ZyYn?q&s;qc`1wq``KcndCPbV!AYFWv zD#ipItp9$(LzNv^y=s_|5i#h#ZC+; zM`bW>)yCabEPyBMr|LYI*$hUt#c$TJ#m4)3sU`jv{GtwUUR*yN77o7;!?9WVE*mvv zp=RKTbSu*TJ@Sc6C0EPR=&6|b<*I47!0s5N$U&akw?#6@l*^kvTMWq2OfK9DI?K|s zRD{(Iqj@rCE#EvHJ(lbdh4Jdkk-%(_$j+s|T9SNtM zZkNr?9{(iJ^MXo`KT;1af})5Yawb8|^p=}DSYKNbjC-o2!G|WPN<41^X+}HmA9sEA z^A|wli~E;Gq(4vNu9S8rc5j0!{795%Exa0vCH!xX9Q^Gn>~j2)$_4Oi!Qfrgd{(_Z z_{|G(q#GkOQ&)d5egL2vtf30VLUCY+Bz!hbIJ$Qhe2AbdRF9{Hh%ukvj&!5#{6u-( zRrX1)6x|Ykt{1@0Cz!Q=MANXG;f@+cMb67_5YK+X}@4GYZOYS{<89)@tv_tU+r(Rm z=sf|U(OcivVdkgqbfS3OUl|-3i(dC3DWb+UG0c*cPU-tl^UAjQr^1c@ZG{?4oWX%@ zE*NAUQ1(Sf+bQ7ghryr_d(W2w^4f*G15Fx0ofEN_j!iv+lPv=*0kd==)iWtviJzkWsD$OOpnxlJ;Za1BgbrQmQkUo^M};Y9v|N>LiZ6cU$Z z#soID0-hSorbga(575_T+L-Z{)!XP7x#h-}H%*7T_m>nWTvD)+p{ohw?dmqDh3q%d zHjccEeLHYR^zBj87LoiUgUVHl{hskL^U+$eWn9ioSFLPN%6~@4fAE%1{veI(>wu0~ zA`eSrL8#jze^y4r@vtu(Bo8X0KpGF}u;e@4Q1LB4n}|mearI$8@Sr1;A^v1dI0BR> zO#x_xQ4Li3-bDX!$277{BVNg0^rBw-ZcD@#-2h5nG>_7BAZKKXm# zEo~v_TNH1mpMZyWgJm8zLyC?16EovJW4_4K3Vnc|JdQ~?R^bPhw&J+n?9 zh73jH^mudK)tv%ac-=dkbm42hiaRo|o6`uG$Llc{1h9vCr@$5-X-<9C^RLuR!}_cV z3Tg;QOK|iX5?!>649r__GkFX0Wxy==0h3$c$N_JS(W7Ug zRMTvis)HLyTq@2E`rU_zEW#Z$JuRuaXa{j_d3QZ_6zM`dgTb#Hl_^|~_$ja87q`(% z$-6o4yYK2@cypd9qaG^xvAV#eyTBW1RAfsp4-&~uO+Dc?!9zE2(x$nHZkCFUIOcu^ zbUeQM0e^mH4)Wd4Cg{M~7xMTO^S~2F2coaF5ue4Bdu$d=9x!hK>(q4kgzX`Rv8H+S zHGvTxz&A(67l@?298C>n;n`Lxc$u5d+*7Wbe=*>ltK!ukKg!<5g9dyy=2t)Qv7;^} z%>rKj#(O)xfMp)Vg3V+|@kGZrvwfq-i<;h5^pBq~YC2y=91i;-q)k2FjPH*15*T+j zcnP$egA!Pw@JQnnaS(@@=GAw&oK73(fn%4Ox#ZIjK(F8SyvdY$Sub%jGl7y1UupNpKa6~tHysh>@GmKP(~Pv zU#8vrYA=fy!KGihT&I;Qi0)W+c>za^eY=F`4SYKE)@1YsE|TSnw!o;?NJEh}8m@}r zChFBeuHgDC=wOU*a6lNuK26Q(b|#Ivb~AQ6Tg;$R{TXQuFeWZuVOu69udm6X_=xG) z*JO!?-3_hip$CquaHvm;VEG48oz|`);eEwpGkL7r^hN&#EK3zEL%dPHHRX)Li@?NT zSk4kyomxnSeZjmy7Pl!*o$jMXG86maAr4Mn^?7GZnvQwZ%S6WkG8irW&3rNwb76#M z)sbzCL{z+T_0s!5n&qrC<EjW$?kE?QCBz{z1BJ>slGrXL1t_WMqfn=a?H7J$ubiR>CvRUkU5j$Xzdj7x7i ze(Y1QntotLH5bz=TsqE#$Dox#RF=wTh9mIvDUtE|Q=^%0(?% z;%bp51MHf7><5-#;^}Xv&B#Ms@mc?Eh@x)jQ^W{{Z0GAma(QoQ9=!+DK^ll_Vr}s)#j~!py#SwK(sjt zkuo5LMPLa?c>Z{I?&ps^b1&Yxw@^e?-XX47xH0YzCxFtH>=Im)wUA_JXTQi^)KSXJ z*Xrf5grxZJ@KHkYG&X)aT`TaU0GW73*522Iaxr@ z^?qTD3uN0)WJ`c!w=x=Nb>$@*8zJ+iF_-{yA5~#vwx&gBMs$}tvW@I0p@r_f_X3_B zh^Gnie`2n7+UFoBQv0l#_nPO==rLjag7_-yaWPf>!jf@vUqYvhn}NA6J2lBHTAUq8pCmo9O5eaw#@wmqyZh@&`64^6BH`RJP?2E3# z+-~8B6!NuthJ>R*f5&?O@%lEzW^G>D0=RyXM-zM9ko@(UvTFRVK6$JZEqk4F168SR zM2T*dFJsnMGGUFv>&AOuua+eaK)+i?pNPc*-jJ^Igq`tOhm&r6&Bu`Y`4!Wf0l^*? zL0&Ks)pk26!`8>f z!~bAT-Gm_C^mq_P#5t$jQ&;|w4~X_Lh3#+wBc#9>6V2@Wwx;PyrbfhkoG zAazi9*Gm#cZgtYW1f~LrYB2|=s_>iV7H!0;!b8pQYoL`4!UzN=cuGQ8C0B^g0;j6* zlXtJ%Ru57fCQA`_F%C>L_Q>KPP95uP1&c$h12~P5r)wvaF25Xb9&UkCp>1sssEv7C z4u`S2{A$mS+pYklN2HI`)6c#YoMX%^xbuurD<1)*M^dD?K+QvWdAYC-YVkd^va&P7 zBetxXBgT)NhO6c%DxsW4fE>-ZxXHyFcs-!gTAltClDRBDMe^KWznV^kFj8KA-BYK$ zy9e{@j;2Vfec`AC9p8x8tr|`mUpyS;It6iy7MWhegwge)p;6{ev+U;Qw`K#nUsH6% zd7AHyV73MsN(=>9G-(n?K@SWDg?q)`9asZ&j1C3k!fgkHu-4BodL!L`s#tg#U^rI6 z0JS%zA-^=#q6nv?q&`co<0VVU)|JE=rF8|z&%pcVaTK8+rU@3jTk;3IMd))T69#)3 zoXG$`S9u+lxalGi9yw05DKYo@br`$(4aL>i2vs3!v7KT`it!`ZxF@M&g;{TXzPol_ zIUxRRYKUPUf|aF^1i2w6%iMJ=KAy&N=BoWehvPYOJVh653PVL$bBjw}kaEH+J;SxE zS1)~^2h(Gev{>6_J~PJ{13Pc< z5{?0pLyHC(18Af}mWDPHYRSkW<)F6+stBKAysF8grj6NiEuj5fGTLe=mV~5rWOBg0 za5zVpao^OgbbQz`CNZy@M}h>^+)Vv@74`Udv9jFJ=zRlj-lyMc|BLA(g)A!pq^3?ra_(4(n_g5FNW;^6G6zdSo~4{|d9 zQNf~YigGl14ObQ%8?rRgFfeRe@x0vOqgM~!hPlIkGLwe6`gE!=;^&?k!qNPFiJ>=5 zegdR9og+;v=Hdjxo~YCWCm=Zd*{RQBCq1{a6zjxIw`K>VG)9SDo!f8M!ysjM zy_7MRm553lmID{ZAxR|}M8fy5n#jgAX}oo;op38*i2XB_FAyq2vkyxPSZ;0f#i2Eu z#@;fWC{Z2i;INKPzh~YoWF0-DBXW4^;kfiQd!wFs)EfZC8c#jvNQEb1wb>jS# z{P2Uxc(XoJlZ8o;Qd5XfMd&YA1-hkGz%C-w!57~poO;L$7QeP1>mhsS5Z5#V-&J!s z=qGhRvdsqTitwg+3i8Yjc$CX+y6DC6a%_*8d*{rk1H5Occ;lo@EUzstm4U|M$0|rJ z8s3EDh)Wj4R7{6ebWJ-snIJ=?KTKHyLOV_sHK_cK9c-4-HYt^soThOl7&YvhdR!*^XVUloU~*!jNUn^jh?Po z;QxOk=-|YXZtNEz43&S;M$k8i6tP2-Mc<$pMq8y&jQA6ns!G*#(E^mF6WxK`Y>ayh z*_b=L7H0ad6ekIoLedo84(U}fDdvbXth_^xuUZu%3Zvv@h8BD}e?4Y~o=Z{631)mp z47qhHeiuMyRlF&>S9mi$=b~pPV$|@w4q$_AuT8YMLKGfDo%D!vK;x(SK~3V{5KVKAn3=$Yb=4KHJs=k zLbaWSfo10|qt{eTpVqAROu$j+W`D=Q33JWNQTr z-1E?EWfBs!WCf$uVrsOA&jN>Gdi_Tq>_moXhk`P{vbIR_Vqh_bYs99jpnYq-7rhiQ z9+_kMP8j0^8JwC7==&fXz={B#ex?wF=bF=bV7xS9_RWAGlOpf}Nv_Nihs7I>G2QJf z-HSDRs>)yj_^9ikVJT{PD~~}MTA$-(AY>LLcGixon?%#LFTMWc+$TZu9G>LA zNdE}0LgkUiKii2FD!r(b%@7`xpyikuNhh#5+qmL5S@e&ty=64oK)p3YXy-Bkk9IBJ zTIC(gXROR$VSUEQO=>*$mc^Kx)JH`POco7jsMA*6I%`}zzSP@9(ybHt?_{Pp?zK~W zmA!Y`I4>NZ!Yvm(zX*K_7aAlaSElyF(`;x{nBwzb)K|ZiCap!U?L`!25a{lSnFN^| zz+WH5xTI7FVN0-0Ax;bqG2bBMtLI(t($HF_LJDhTUd?0E9|}fd&Ev(Ylt9N1YPdYn z(f|f(p_|gJ@(jxpPRY7`MDTbUVm~?^FFdx-W(Y$`-caCv@Lz!}qC>)jv!Z zsPHc2FdF7OGi#y*>+@2>da(4F7UovhbdlGT=fU`E;T#xQCL2wobKOcy*=^obu*4tTQdvP{lYFls*!v(z5BbA_mWr!`pW14x`ud z+QTmxa~q&9q39uru>k73rD$#>P#BGdqm)ulCBaZKveMAsHhRH%73}7!DWcYu5 z+WcAQx9+b;S0y#t08n_}J2I)eQPZvY6}uON0AZPeu)rH=fj~y36o!_mYW%9Cq8OTi z`J#ac-pg3d1K&1VmUq``n{?O)ylc5t^w4+Bvx zq@<3O!{>sg0&X-r&r+4Xjyb_LX1%fCQb1Ihgvh|>f+xSNJD;Z~w?6#(Y8RlnED23z z&>P3#o0>_}37UwP=Q;n-x-FRJS(SuG-}fj5Fv9z!4-F`-tXNa?NGCw+DJ?@+8U*)?l~eYdO+% z&EYAml{r%U;jyYED210Jg}b`2s`HnYxD-a~*_nCJUd%Ua;7CzXmDl+~i0=>1TzvRt z({!8*A4iJn(xRHq7ejb1I9(<`zG~!L?8xZnNr5C)668`h{Id4?t{D%^!X2MM=&TP68#Tvu1??vJS|Z_t?o`!>iN^&8we;m0AH6t?HoFe6{(QmQJY8 zfODI^4toL;I%PkulH!Eh#OjhOu2mhz+jz;qXZJP$;(<0Iw(nl9wgO@N8m|ty_oo6t zJjj5UGWYE@WN{bielUJ{Oh&h>$FOE9#d(3lk(m0&}9qZk3AL+EOdACn_p$xC2(dMv_dHb$y5s6$@!lm6z?hv#B- zM^u#p`!lo`qm;u`xphi}#cDANpC7zTq03)7a|>n)#q=m?NQJbMptSw!;A-H^j|yRQ zYMLc;Rtze0kI4XZaXmUFv~Qm1DXLR>5xH0VWAiBJaJD7ktO=L;`L$uV z2AKx7a-S<>+cdCB?Tj2dvW(G}JKjEG_AP+@I*MIxw?Rq_m19JsVnf)3dOEEvOY?-( z4(vQ5bIA7#-TP}mqU%+OhCr<}-1s3&QOoje?{G3F`w`xEH1UMdm+$tSJgNvV-as(| z^#M{31tBXP>{q`O2No-GP+~Vv+;+7#+j+g{z%i&Qj<1@L1E_9PP!;;&0$!bH@CRBI z?=D%l7KGNKW5eSfdU)ueJJCOT6N7?qLl}@GrM~s;Q3qT}?j9MLWaM;_VtAl?QHc#( zlZpsS<22q_hJH9={y>oC?^GI+FIEkWZCboTD}h!ISl@h5l7lI<`B)PYXbi|SFzsf^ z*w_z+$K>B3JjF|O#*?VI~W&@&IR78>F7C~fz+IO<| zqVyIFihV~PyBOJXZ%sm>H3zZ=A-bxZ8B~F2HtVjwTb6tb7;aNA6qQv}R$F(K!^o_s zpZ-Ry=CEPYYOl&WS;FoP-7D}w$TF?%-Nx|~M4CR;M3%F3#X0n+U>)!@|IsQW_Uk9cppU=^fm$Wnq`Ct0|54(YQ5>9#+ObHZLQ=Zs~QfaL)d3$*?t7a~_hGyv=Z z-XK|9Bw!Vipvu+HltAHFnNz6=??0+OnXwu<{k>@y0lo(*J}6Woem5i~DUkwA&2q)Z z<i>q+&sW9qvLm-+baoIHOW@#)X@4R34^CB7`uYO7cRv zdk8L7T67?{v-w>Ay5Qxhh~*KA1uD9E=BnJ&(ngz=no7)SIqb{D+b#qwk0xW$8?Eg? z5nZ=Df5X{J-=2>ChQ~A{(7YE}9r%+ZvtRlpXd&gI^~Rq5rLu*pvu+Hps&=S-W6L{* zt~+k#Ts(yy*GVLo0-1_sW1NhaV}API@0yM|=1(Y?ioFfts2t5zH7SW4C58UW@gEy~ z#f~hRFs<26=Y06q7=N^k&7z6n1Hn-PpeYMO(FTqrNm-+2J)Sqo(BCipKom-Ys}5dX7pO_4)%?s#=r?$r(ECKnOgcP)ZAp=z~xt ztUA930Mh~K6lxzr9>>NF*~8W$$HwzX2n)f2Y!9SWYXIRL!MTg9J8bV_yo^hQ_o9X`(oBOGY71|Yl1Ms*Ca^&Z5VOfd1nNHR5*BUM8OK=1M_zZt z5{#|Cq~Z_wNsbd%YVqQrqy#~;GHlcmS@c@0>BC;TCN3BX=w4RPl>m3w5U8?K%5TU8 zl-`a(v!#(GX>Rz5u40~@krtf@hwtPm_gVAv%J*jM3BHKWG?cjJ~cQE(Hon z-e%E-94s8}rqeBa*7l~U`OF@l9)FxXPDaQhO_U@^h(E@shMcQtNm&Ipsr4e3@eK@|e z!n2-STLB2)Wf8U$PU|duJU`0=txHy+pXEIkAI*PLDFr%jzwormH}&~DQLDVK!xRlS zL3_{+KoXxv&dGLWonvJwVEQ))Q#DXWLH-n*D9BEs`DPVH#>>)MBR#zav-Cb-k?Bbo zQlCCyM2-v^4AJ!6pDMaf#$2Hf8AN#Gw!1OmPOP3178_GsbI^nX4P&MI))7^J@uMV+ z?QG3XLYU3T%3tU`W%MDx>elUJiZFzkLwRkL;b`1dERSUq)?8`6$G$yEfV(~jc_bvs z2qJaRdx`v8HW$GDg0NXzMDiC$y>OYR#n2cD>}g+AOF~wdM_wxzrO1Cq$bSmFz=ne_ zk#C}nwq3QQG3YbuC$GSLGamK#n1RP~SsM?aHDe=aD6Aq~OV%Ydnc}rW!ht!MALo(djtIg4HNc{?Q zr9u=kHwy7Uc#A8W5XEUzMZ%NvRAsw7=H!E-tKR7_uKHaArhGpPR{ej}H6_bWuaz-} zBjnQGE&KLJgaQyJP}oOGl@I9O2_}nQB6K|-KQsf6LsX%Z|4!Bqq_bi9_tYG7ni0|Q zaBz5>U3c!7`3Q{1C+c`KN<|-TrS$35Oiej)U7Ta|BHVJswNoDe z2|wja2<;4h$iUQ9(MvbG!@;C z&g3YNYXUWYtK?}RuaGQE)5Rscdz{oL($3JP@z0EC0(_sV_<{kTrN)*uPz?x*voTB+ zi*~yKXNr<%RH*Y97qXhc6t?)D=w;j!b(bH$@F~Fkg^D|ph(kdQWCzDw?HB-h*RVx- z4Ni$FD*u9Rq1?pf%rt8Izkk#;IRbKi$;yct&uZ0%>^+pjEKt{k3fbC2PI@uaDQ5tD z!qj~%yuLX7QjdDPej?^9f2HD&%S8&@6nZ6z?SSyqsmX1OU*ejRj@yD&Azy3K2xY#Q zCwYjDHP2fcd;8?s=&k)mLnoVeSeYXKWpV=I<-*Qf7zf8&`}&;Pb?B`fM$ttggzZ#q z?iq+gSTi_{MPRCWL`PW-O)+aA=dp%Wm}@;;lY@2>a%m!1q%jEV1+~=)gW~w3ez(dA zC`M=~kXke1>$l zBs)lVDC=M9oDBI?!Z-W-?Lt>Vec+!c^%9 z?{^1>b8h`brwv2SxiQRWvK=*)k&v&?anlwlq625A2Zv)FEdHn`sc0IjO4SD5fOgC` z&AVRa#kZTBX|61^g=)344|8Aavvv9yZRx#F{Cmy2Fh}D$O&ZwPX(%yM;l)=dr*7eu z!=9Yl0@9D~9O=zNu;S=B`|Gb$Z`g_ZYXXZNid5TKi|HGzrjsIiHaZ=~v(b6|NaOTNUMy*Rm6|_q-#T(+)8Yipg8uvk@1%QS+@`VP20hN9 z8_X~0T*_2Ss5Qw(ZhvV>=%8-hrt2iLS)rglfyHg2RyuocB`-HcH+A;U$_mbDx-do0 z&@44vto<%pg9CA=Xp~EBG^IO-Uh)yAO4?Gd``SFa77N62Lu6#ogrfwLzd5t1Da< z4O4C8cW`iGzJtb%UwRebnoV(qA-G=ZAL#^f!Ln5-O_ASVZ(gAzgHEufxsI!?--j6^b2V&GJtF`Qn+w{eTl>(oJ!S=Nao@TQ z`ETYa2;JT&w7@NsLQRmYV6g!0tEuH>bNRX-ydSf<=JQaQ<${|-65p%TsANWJ+XeY+ zvAf83I!x74#4ES|baeqPN0xDoy;OC^&g%fz0u@(mP_YE%wWNEoS@k`eH0t)UpUCsZ zB>t!D%pv8i#qKwaU4v_Jp(;t-Md}RYNH8hR$55oxRiBmXL$018sF+6!#O!({YJKo{ z1R@t6vkCJ>7cr=;1D;86?PavhGTQBBi>mkB3*y-FCC6G$tyLP1nY88nOP}h;S+=7+yCM7TQ;C?|9cH(9nhb5 zw3L+UU;PcAKHE83nPbatU46_rv}J$Lr1GR#8wN+R1aT!*1tyZNOnhy!n0lzm6GGQan0!W%AHM=AV z>nX@H3r&)A8~f1m7=zX{f3gZ0gVs>Ak~icAe=E{XV*rkFnH`di1rRx@WW&VJ~EmADtzb%oTP{&q%KI3CCx=ksHZ1P|nTd!#w=+>jkv zCc?LBUc~r{rTJ?yV!YuOGqP5TO;}%WtkB6vR?Wi<){Pw=5hY2W{pchp3_GQ9I*ey> zpL3^-8wt{EvPqgQ*g952(t$N^9FwpAwrVtv$!6V{DA6d(oCiW3tMGnzQGkbp$?c8V zW~wxn+Wola^@k6?7BuV@bxh)3QvRgeg_8@680o!GeFYK9+Lmw#O7+1yBJ_X6jH@jM zlMa2>VDr}&BP*Xbsy-xK@9Lw9h!-lB)Q3e-H%cFA-={lEaVd7;Z?l%CF2{ji1(j`| zS4>T|WNfUd&!4stvy!*c`3fguQhl=|1q-Ag*n8*$yWG|s@7|nB>C@u_wiE)2Z7Pb^ z07*-QG(DiRFd>kzGgsQd$%1;|_LG0O22gERP?fu@HG&w9;a-?qU1Mdsn>)6}&l@_3 z+RhuAcjl^F0PPNn78bs%pe^KW3HZta4K7kH8VM$#xQ)yz+V7o~-Yl+PIeldQHMwZ& zXCTo|Dv<;vEwQ*9+Q<(>Cp9QIvWRW4sc4;j-k4rJIxrG6XrayR8@&k#&QYVI{~<`ccsG*FjO~G%8FwdC}u?bG!jbFS2^sZQq?L!QO%FgREAjuoqcwKERS$%CxAu3$GZbnc@_l^P~D#J)&RPTEQ- z{gPtyG+5zv(T6G`#$LD}^TNp(J>5?wi55u`@)TKxsIcn9yr@VV7u`|}uDSOIXCp^P zx04U)*0)KDmn*p13Cq}wjAz@NJD}$%v~3PbLS_++uo;zuvv>CW_x$n5^Ybee6$v#0 zXF8;;K*~)i{D+hpw>z~~L|&qHO%8`=D(l_PM_vF(52i>HEog;#VbLkZseNZ}4mGQo zm9^jf;u;71{vq1$H%QTnMkt@}1Oz+}a%9Ytv(STlsDhxPIGC4c1h#_I-S*1+!%acB zLD@H6Jl?flD-M~`0B8?OMk^TMNe!~-3gfY@ztrdS4SfLd;S_O29;q;ORnzGqL><3UheuQzdWZBG9Z(Sy@dl#Evs(op#;)S1`;@jqx{Z7{%6JvXfDf)30vJ^beN|1Z2nYkzw_HAQnf8DGeju^HhM^JAjT# ziZ*(IZ!Qr>z7iXe^BA0u`{dPS$l&}N9dd|x0{IMf*^5Zgc$*pJ=K%AIi0FLtxNpxp zW!N~34gXe$jU3y+P=cIZ+Gt|(t$k=zr#EwMXP+EehrOGQSJA`+E#6>3Q4L`|Zr6z_ zIwFp2YA9>^=HuOmExrdZoS?^0E)B^CPhivwYd#vFq(Mr^+>rw9i^G)xs)lkiJ6z=s z+(Ftw%E>4QxV#5fZdk%FW zXh<)(cDAP)*W`l{E?VC`YZ0=XH;M9FUk9xD5+cMgmArB8pk z6>qbru{dL{YK*2x;Ph&c(T1ahu^AOTTJJzLK``>(Xy>WTt0Q>y<8MY|9l`H4#Ml?2 zF{T&|@?n&2cEQA@tBmpzWuQU$fWcqDj685U>-IC^Qm>caW3hf%T(`|>t?9DQ|>fSE!JKBM?1GK z+t{)n>kd!XB#1>YC$m+8i+L#47>>3m-bOLY$wnQ|V_San^kI9DZMnMuZdgw+%4%E; z%sX?C!nQ&-b!us2`@y`$Kivfw|4cCkz469yi%b!z8R>e5M;)ahCq$C;UAoo5e@jYB zMtDE-ZXjoze*8?lft*3*Lh3D7{{r+GQkNm_UATR?OTc8dag;fHkKe5S?-JyDJd;He z+VsMd8)au*q0FRScK3-Sx$RpKyuOZ=OE*nTbG@1f!kwl#%AmiZReiPAP^TX6VU z|1$Q1?a0r17R4KtfCU*ew;ze4pcjuf+UD{`6TYyfH<(wzY_V}Ya9EXU&-6?~R;9B$ zjITbck|Psg47MWw6y96BNWc4)3uj`a{~Qf{Bivo#P%-oYNY{|D&wAuoFx!6Yz7Z{$ zzgWvropvIQ?G_Br^LOXAYi6P6@2{#fc*cXTMeaCY>^p#{EQ_;+HAin6lGe_byRW=> zvTcgn4k-wd*vE_`u}Sw@R$%lJp9Tn`w}S1?x9G-4a& za7(xeYMLR*(3RVW>ayM&1ver~69Mpigd3N+N{PkVeR#Fd+f$5Dh%d61l#TgN9G<7r zFW%pE8%S`0CPBP9(NL*+D^svplG^UFk}6J4*7=m_usD9j*FVQ^5Gi{0Tl5=bs50Sd zXB-!~Xd6)H0b?o1`!uf>qUHJzSZ!HhJ?b=8HgCUk=C^)8>@Y*DJm^nW0+h^zf zh<9qIia8d6f-J17Ln>1Vl7N8QI4V^`&K&pxe1kAB;3sVF>fKtuLx>O4ur=tj?4Gbu ze{ynPm!9*N-L)WDCY22P&*z2X(8om1e6{EdNA7kchHj^p=lK{bvwD4pKE^DHGAuWu zlw%Ff0?qct5hQz*xp2lpG?4s2zcHx2p;aPEVm^5o&J@495BRc3Jrdv?MP|MTRz*0)G^nb^Tnkz{$0E_Vm(`m}_ydpafk!_D)*tuH9m< zJfwMDBOt#d1>{A6ShLh7b@i&}_{{^8PMnH<^Gj1e?Utet=LkpBge`mqIXK=i->3IY zK<`-J6mVC1LxB)fquHWrI)L8j@p$^m%lAuw-jzD~^cHvrP#Yt@@jUIgt(DVniT61t*HbPhxvAdP5~#>AA5PI--HWDAGOIB6jW^d`1USo7oP!I45>04;&~!e;sB80E ztEItMQ(#6XBs{aKql3Y6@$+N9>jhZc6ic8f0d9XZBz*CiZ@{W)ZTxUS@&Pvf|QKguLkKZwo33D{d7a|B)Yg%jHug!7ypAV%%w;95Lh{2wZty~yyeB0` ztLXgl7|TDH=NX?5Qr7FFtPDfEx=VOyoY}_6TTKIfl&6@a*iD14ehD9 zx9@rgq`E>Ul|VK^y7^Kz+J_EK53DJ*|J-*a$akeCU&0594yF!mR?K8q)hHfM5Xgtf z7p?DMBa9{Rntiq`uRiXdwXcrG`nano)CmCLdS57?20+Zi- zAVu{UubalecgOF>O7g2UY;|&oBo%BnjvEbjGPd`uho_80Y}Zh1Z7mJqV0&Cua8DUv z*+xUy?%-LwN3Z>oSi2sI?Ya~T@X5ZS>(I`)JMVs+{n5C!ct5^YK`D21Es-!ufW}eT zF0T+Jva{nNj(z7TmeH^ z!@k2}i3-oX>WI^<#md8v-j7+Ceihx&IH}YuszK(wDoOT@M7={y3>CVSvPq_9Qc|XH zg^zUtzVLiFI9Y7l`+l_*v)H6$iPiIpJ*Uz!tq5mDNx983^`e(*MpHlY)z>>RL8eA3 z6CvIyEzp&c*|^SgXkh?@Vc^a|i+TcvCLM_g4;*8{#m zawkQ3T0Q;j%ll9-U5xZ6t~g<=6MjFy{C-hX8k~?qK6<0HkA=M#4QDV2u6Uq$ zpo*YHatDBC%~b5v42fzCz3S(ESdxpq`QO zqd07}lqB@XQ-&t_NLmMzJXfT6xPy?o4sRU?gA7}R6 znt6SwGs-VnwGbqTvJ$A-!D<$rXtr=t_M!6ejwKzo`{9&aVB#y2<74n$SF##?3^Dy^ zArFmI2vjvKqy?E`3CoztC7B~mHVn6u=~+jhEORbKF5iTCa@zaEKW%`(P`4*&MMO;|O3lZG`M3W1uG{1AyD zNi$%MLn)L$6w30nIy0PE8QD$;K2&dT#M7pnZx-#eO_hk~YI5e##J1O8QaE?SDCf_o5B0BGV5kKh7s&HhZzvAcDhDl zsL&$qr2{LKUZAxZKI+TcHe+w3TPQjpyP*Zk^uLt!gB!Z6wfKOn9O~j=Gk7osYpBac zo+4fx=&ax^+c6Gwt0E0V;{ref5sQ#ao~nvcvb&VXKjm+QP!(*w44^!-?Udtj8*e}U zsGZ1de4C05208&zG^2;u+>s_c=e*8>*MzfnV`stJlab)PLcT>X?rL)|!Wu?(YH925 zca8q(zdEQ}w>u~n5*n*$1gi-GjWJp}WZtak08=HpYl(1KpXiA4Skl|}4I6_j>36Cl z8jS%9f!jL}ssksk*GhI{lFA@vDk31&di+6mv2$_8E)g%DE zSr-rj_yesKeT(uEaBiu%(60_9tMfL)eJhmQrj4jLj`Yt>}z3FCTv~5+@;&Com z=?^M1R8O)Wx~4xcFa9xl#&zQ{{_zmSL-GY6Yp@D>m7q}zwzuj@wABy8W2f7D+>=X? zo$ldeG$y_D%nxT#&B+^^eGB$&z_EEmMH8wHG_`nLB^AY*(o}V&o%du;q`qRq8#^#k z|EPurc%(~P!1ILGIeSWK*1EjA(>OIv&3xhAz{{83dETrAm@oa9P9}E(k51YA!VL{R z(*)RMt&*pOyh84_rpLMH%sV(t(M$7>Tblq}kLz$jshdn5FGEv0p{6mo=9ehp(RFaL zzMp$Bx&*VnpP*8ZJe&U?vc3=BnE4}SeLu;Q{1=(^?aVS(-{0IXuxt@X`II812lCQF zQqU8CCR4@z$={WbtVUY3X+B`~5Km+6CZFGFe3kvaC0>r?iTi%oi}`U+)6r^a9P05w zAl(N8=7JVt5~jYw9>nRX$^1PJQp)k=VEIpDe0&2HFyo@ccW~hRxdjZsU*> zR_z5;|Dvd3aV$UruazejPDEi5=;}Do=}05+R^=XqO_9D)t<^BECsFd))4CK|)`wsP z3sQ&LXEiypX#$ltn$I+xIQ>2t&FAQ7!mV9q`^ErI$W;03u6nh_HS|-&)Y9qm`j3K(qcxOrO zv*ZOG%67Jy2uSgLSf00iK&ot9DGnBdT6CwY_j`_4`wP10(v1I-*IfMHEL^8bgwC z;0|v#46oDlP!b*AOit$N@yGUEa4L-Nt8{#!fEZdPz@RqBj|ch4<1 z{fHLcYjmU`Us-C&_d>>B8Tjf*xe7grd@`dlTAt>vGI3NiG|r$JUvuhkmBO+oYbn+O{PH;82K|X|>JW8cc!X!nk!iFdFDqNN zYzUxvi=YXI{YoxxtR@VWp>Gg9a?onDPKPp~sxB|jaFmpIY~{<%q@^C3W*^ehe`_nq z@pdQ5VJ(KJ{^WTaUwQK8;plOEr!%Fnc`m3L(B|Ur(@y>t`9$9}lOj1cp;&IK2L^;L zQUe|#Tz18B=&_`nxLTD5Rzir*L@!Q+Cj0i1H8~)|dqjq)x533SSCCy%Yn^N)ih{R0 z53T4q0e9#76h(f5y7hTP;5X>Xa+R1@2LS@zv1Fs2`5)zI^jPVMIPW5Jtp8Skc+%?OGu|rh`SOaXxQajSbUDDg0NTkijW^S!dz0BZwo|7WEvN8Zw`}_e zM&v)75%IK0;EN;7gq^j+&4hN~3$y^;P8Ja!JKv_Kf?KeL^Aj9{W^b^us1khNje#a8 zLz2Dvopkr$Fmt@rxc7Us^gmUw#9gFakj&YWheYf;?=qg==1zFwJ;S?uqamHW*dVck6Go{Gp2uw>?NORh@i)|Qg2gS8Us!tzubk% zi-d+v*eO=Eb!;3hUMBL5y~gjsOytisY}N5_ByDiQTAb4n>Vs>pT7NxY`$EPR16Q=CXf7 zF$O}ejtrRSzT#B^{(jn#Bd`*1n1ZDccqM}s(P9V-A~i!tUSejkM^uSR)Y-na$xY)&a7%kmoJlb1Y$L~R&pYbY= z{!$z9aX#dOeVKp|X^hr`_ACOjV0<-}lk`mML-W&?&v))>q|h_4IIS#{-K_Rd8g>g0A% zn8Oer3(mdpg`A#SaFuK<}k!ZgR@IcJ^JZ2xJ#zWI9jFL7JpvQ8&kX7UT#&o zDmoIpDzo8RvnFGe*)#@05j0PryTcNI@EABU>11e;fxGUTG$RHGrc(q;;<^`eEoD#1 z0d?Ep$#CW^qlcjkGjuYL(u4z22Hr|IYe)WCTnRI&3~~eJPFe{$bRjSr>Y?t7mi-M7 z%wiGL4Nw<>X;4^r9rAejihgtG8sz1hO@F<*&Yha@qWjRn>8~5e_~YsZ`1LvD*L~p- z^cGVDPbsPcDJBq%O^WE)X7xB6y}HZ)X#4iFzib=f1;leZh*$`)@C-XRTrSR|ZrqMs zF7r5uLD!RVMu*GO-+;_7H6)rm4T(U|?`eWA2YxFmX3^Eat9JVQ{msL%+G##P8ji*D z!;!X%hFCZV^n}D;NXVE`I}+2uyue5p4QF2#Jhxye`YgYrXlg@&#(?CPxp_MMzLG^D zX>0F4S%X*H2#6LSqJXbeDNn8R#=%8E3zG@;M;cjMxC|g;7s3jqrW>gP>(VGq)*YdR z9*|}sk;bo9Y^AjE4U5&@Uf?{Y-jP#J-i%DWi)6gOVIF8~bD_%+a*VNh*o(cuH9KF8 z(UVwXiNidUD7so54r3(o^WxV=Ukm6K%jm$CQNt}AOjj{C0)_Er(&Qg)Etfv{?9wpc zT|)2%g9%7}C)wKAgr-UEAauE0joaQ8oO=kk&70i|uU=l=>M`q^SGfTHQi30g4xI&V z?@)!jn-lY~xO$3?Cy#6Gmd~$Rh+J#S^mt^tYcV+DO2o5V#gmESQy@iv ze!H{raBg6=7kj7Ue67&q`Pt^HU;eruaeP+l@pQ?2sc9*U75cBzpXOra>Gvug3>4=2 z{n)NKHwgW`NY@6=%$XN}iLPs2RnfBYss&h8^n;2E83gkZjg3;YIuVILLs#x{>Rj94 zt!G{xfwsXa6&0*)lDgFu*^9g$g}?pF4f8PHbTx}e8K%H>5_gPj%r~V660@Spcl`7% zB3h#&stf=PXBVv{p2xEA55oy}(OMNz*Q_8O8*jyo#2#eh{ZYjdBMTdA8%&7Zl;aS+ zXLA1$-Nnafty`2`iSA4Xr$g$j&4bqlL4tL%1U|w?rFbsLWg@M*7#ppR4C5^>wB~|^ z^?-f7j2&uTkw97o4+b<2v693~QU>LuOydYc+ZsDlOI8>Af5oV@3dI&o4gKBi>)$3NDA=twAF#4aXD<{ zQ!Z@YiEQNC3=)w0ep<*4&VbI=)M|>Grm4%$&)obf$hTdSv*l#)mOIuQ9>V%t(wyf!=6{rf+^DV5*6Ua7_!y-7 zNtSL1lK$xIk+f&4J^4^Sb>S(@VNt0+Ja6|MFb2EH7=%hgjbT@1G|=i&NFsoE0`fQ` z!1*GdE9hR=p#}m3;2j{JLn~RQb&_6VEi(H~MV`+qG&`~heJFcmsnBXK&abScoFfPn zX@^k|d=1DY?OSO)pWvgDui5MZJbM{D75Qa6JS6$q3Xrfp?x4va+RDGW-yPri0M9-d zk8B#tmz=|6os(oX~W4yj>+#|D)@p?atS;8p0Y<_&t{VXH5ZHI+`6S^OmOkK4?&$FY+q{^|A| zXeS>mkC-o*0HL|$WeQiRKG99y4{4ofHtug)oXmIyeV&_sz$n@wDa%JMibM%mq=XA= zOioXsXZqc-@@7DHD1$Br&Dr@g02y?hSmGcmkJDlF9~Eyqd(H@u=P+3wWYGsh1PJZD zz#T7la3RNem3%(J>KE!Pt{kiIF;>^r)e#~P|jfG;%&`me4c;)QO9_*@@&F{)kVduzqW}}hhaY8;qr(yx?87WV=?H+LQdK`e5RsdAnaz+Yyys1 z?e}Go@o_FBK(tCqx;6BBLd1z!JlujmN|ZOU=Ht_H0UO*k$Rl73#wN!>h)(&*6L6H5 zhOl)*EZ~#B2j0>a@7;dK{}FK_Z`0KtX)}>VVShH8@Z- z5(n}?A#%RqJ_NPVEL9HjRNJCuxP|1 zJpa7f+$H@kT#B{1zg5v%dsuKml;YV0%_H&#m`=7ZHV3Dd+v?4Ge!yOC$9D)D3?eN^ zw=p`K!>PS^Ci%o9r!%! z>ax-EpgP(ayLJ2xUv0~W`8-J-RU|l*op^NtX$W@{n=2LZy}-%goAk~>lQ4(xcN(S^ z(9xhZqJg1Gj~C*x!P`Y@@$?L4hd97;32jOC6)C2NJG-4839rI(F42x>uxrhU$TKL4jDU`?K)&Z*k71Dben z+h$;+Jb8}Nu+3Pm5vSD^M0n-$vf`ev7`X_u;!dSf767?qBIIr3G_-+9qX)N*-V+{6 zYkc~a70A+h8bwutE%c=S+dIlsMTwrJj%<1X)>d=RUrpbCFU<4r>4=twS|zBU#0iCB z1jvPf8;08(A*WfY>C&=WU$aCYiwT#%E}IO}>Fwi3&B`#wCZY>=?Y{%o${(m?&s9ZDj zgZUni=T9liL(g}@kw{!I$`IiBiOx>jEE=a8g4FcIPY*w`?+Dmcr&GK&ffgtww0%<@ zaK^WtcYIF2ju&1zYy|e}=uXGAHspu)ao{zRH8EWGMRhQ2XL=PBR>0zWRlOo=Yh~iP z=eIrxGX2>~rp5q-*V<^lL<&)3rz<1*e1R~x;e5#g$BgM#5Is40J0WlH#+|qm&Y;rO z4Fcz&{X4-*rFZoe6jMTTY_zX=cc#mF{bLEVy{2dCTU zmwz~8>0_V?dZ=>>R(o!!DJVgJVW6hk++-WKlb5W&!Iv1fKAM*GS*ilXkVp)?12*3E zot#{l_1hLM9Ro6+MP-yD4=y+$;p!BDPy`KD;z3O)5p~lJ>RNRw8?M61FS3521%a5X`!BW3P|I2FP#A6a<=KXcI_@7^^Z`fY}lALEMNpTs0jtR@C+b)N^%iKC<`J1M7h+DH9mWyA#wr?@A zT%2!;uP&G1YxQ~pp}1rM5-&D(-X%Dd`d>c$-neT4>EHB7-QL(B7yheQf(FAR(1{he z`QDfhqS*OBj}$}t37J?&J)h9CZet|L!O2KF_V+g}z>Kt>dc2-UREk8yK3833Wu^RQ zK_C|KLWw7Uhh z!1Cm@p+^bS4j^`VjT~9V`j2z2KVnWBAj-5tqz|^T@OYN2iXC5M&0!nYjguZznl-!q zs)N660ZFnnNsvzjngEM<$hB)u60?-~rWV&k9H038mt8XHazLN0p_h}1DoRD*;~8cr zQYTF>(8hVfc~_2U1f)4K(zpc9d+{Mo8ePlgE5cgSX3CLcnt|#S^SfG&Dt_cTuck1RBDq92^dZ z1+Trg9yuH?p{Sye&PoEJ*gzuYs*WSwh+;6~Fk!!0NHCR>-e+g7H?Ma4lm9q(VD0v$ zD$W?msD()GP`Dn!zm=tyntP2LPDz^6#v6;;q=>Ot?k}G(yEjPCSC*g^t|_vGERQPY zGZqewVEL7OdzF{Fzq;k2?=W}Y#o!=6jLJj70xHBDgz&oSMXw9YXvC&0+=%S8xfF%2 zkqNMeSV9ohS-ec$haZZM!A#ve1wr-TXgt%|=wh@Ms4O=qEVrFwL1|Q&u~@qO`T2+> zpFxt7m5c=2BwJjF#Ak&Tx-dveFaCBrGAtJ`NW=z2cxE^#?q2cZFho&kj-s8x5Jkbu z4*JXOU#-LJpdtkY-Y{T~R>&brB-kLvJhN@lRRg)mrpCD_Djsv{PxIcJ<^@#63@Y5X zm*W-35vXK^$RJY1-NCf#*4FePrx*^c?n6P+++T^fd9iu&XL?!H0l5kp^F4 zr0z%}6=Be@23805s=n57oaYIhm$+jADqfrw^*1|O7M8f$uJmf-)2dXT#3XD;d? zHw0ae2Maf-ur}Z^B))#p2eXhNu}rs4s-z|y3AxbGxP03&&xQ3W$7|4U=n=!vYv7h~ zDPxicw9WC-(9hRziC$!xGy0AH=1jnQM7fMKzf7q=L4Q1{N@MBw@kk<;m96v2vF9fK zwf`DCEh`jM-jGj19*p8#EIy+F3|+@On`f2RPw?QIZ=8#LJSr7bn*YDhO-Qj?q6t0=A-AJ#sp1yfz}1C zokc9HGkJ{eC#;^l1sUCI4R}hR$QYQ^Q-&j|DS7tLnlskSM0=>tfQC$za*4EcH*xL= ze>^c~9^Mh^4JdRMNedXFW8vViB5k;F#_mc$F~ESr+7Q>QM)R#Mj?c&(^2f4Uw$=f@ z%QbvZx~%h;$o7~uTni#dVU$_)@X&0>Gah|o@=!o|g^aR*Bo~B%3%)VN*sxe~hxSV6 z1l&aB;GH%-SFQXBPn#=cISN}M@iv7Z%D@X{u`tDT22K26bl9vp4O_70|0*LEwSZg% zl<4^I^jPkn4x5O2>}m!RQ{pXf42q)Z!_o5BesJvmQb2PJgNDS*D;gV-H^;2d$zDrA zy-G22H}>?)e?lH2PckyhZ0jOi4i5j>%5&#ULH@IA6qXIykbO333o|cW?6CpOyAVtcs z*NE|*wqGcGO2x5b@(=V?GE|zKxx*b=IC>mbmC%^lS z+33p(^Uy$8JQTv5Qhz6+g8T?W&%F54r_IE?n}~)=@(I8H-c>p zQh{Q}nDkt-eLarJ-;GF^rqp(i2`^)E!~8o|Vx;qC7Kz4%!KERx**nLHJS1+sWL`f& zb&HIuQi?X>9*1~mezW8ol-EYsKRbIhJDhZrYku_HL&yF&5Rl!fAPYl%5JdHeRhX`o zXkVOyXC*%S*jF3TO1w=*4lE~d4NlWZAiNhiXUe0W`gh>zdOL$l6(NAJ-g>(sT&*+1_+ zQ$7w)`+F4>iG~(JYp8_v1p?`!JBjBFee~0R&c@w*Uosldke%Z1;oKUAzqV!t+RFDQ zV@Ne@ExdDh*@P#p-uFFb6F!iP!rEJ)-SF(xE}R^vo9=Rr$4KgfDn4jw(E^7;63@Kt zmNUmPTR8u@J!qLd#KY2Q_blEiIsAra=in*%u#BXp89UfjdmG`NBYDw8j8O-W(lJ1r zFZ--$YIZPZ!Mi`j7UA9E5d~Kiihse37D}-a-QT?1*ELsOLT+D=$~ef5N_9b-4v;PT zZOqBXtik>En1;+Qcatza-aY8pM+dA%oBwecAH-&W%DP61w&Y`|fS(5STQXVH;ERe@$-|L3}QS3eHeo|Lh9fEqan?2(u_Cs@7@Ni5+A zCjWv;W9s&G>5(M$1xUj&sKRvmu%NOL-a{Ol>YW#wH>2??4#;{Kh8It%A!) z(2f!oMa7HUT)yw(i5MS$T0xb7dT&oGBKeTa0g_C)&5$foY=kj!Ea0<0-aZC%7N3zZ zHAW@Lby>peC!H0bw9g-CRoI)`86e?(!^=G?d+7d|cw+v8K~o1MD^M5LsaTwxZncj( zUDH1WEYHeVAYj7q;wyC?X=QQs=mG5dz!6zoT0xq3kWLlQ2E~4MgM6PRrGSX%SwpRCzI{^pdAGPQpF(FGMpCx)sEl z+wrA9FMv{WLr)ZwgVOSo~DG)*AG)(@tzM8`>`%4Akx zb+7)D&jnO3o^oinzThZ}17%%BRUX-~&XT-tVQ@2(O*`Z zDKNkM#idX0LtXt6j>jM7IbUBLe63#q){_ubiI1jICl0vy$B;kTyPJxC@-Ju1FD5-y-o&D5#zNNnvj9iAk zrPmDT!VnD5vp}Q{O>{T$x{Kbi?WuVZDC&fbA_7o7~XI*QKkC;|t0^ z?s0N=e%pwx%hwyvKYv2TU5n8_{|<{U>>Xr1qnUP|F&zKz$ee%dLGAIb4i)APcj(<5@bt@wkP=9zkG6lJyjj6dx6GoXsT~iv$5&f?lcR!%~n4oNtydjy}AVua2nL?Y; zZYS~n)ae|Z&_;mEwry&Pipu8XFz%hZaQ&)jAlrW!+4LJm<@o}yhuj4ixV~{BV1X6q zMx)TQ2>Uc@kKivtADHQJxv5V?qXknx#Csc&UwsFDEgI~)Q3CrM=AKM~%oAlndm?P1 zIGyy^&}P5o^V5Eu0weT^{Uemx05R|SxyQ%B;riUxHhRi^Fg~AlV0;vgIKo{+db8tn zQ{p&6%-VHx&+Fgx<)z0hx))^ouidhxwXB8reJ^@wYOA{F?6RHvL9)+?WFcrm1&Qt^ zsXDZwXuCIO?8I9VTd(2C`kIiTX}lLk4o@jPN}_2S*IKEGhclMrX< zi!$6wPxJq+O}T8tsfK8@u`C(WXT`y=Hor8CCBLNPe`6|-CA9<{*+%_&=;|}}+y(3N zD`iZpC2tfIs7&D9h?P3T^ihf4t+#q6v2%1C{IWA$4m|E_fIP`N3(Z5_yX+@*7W z`ok(@Ao&{Q3Oe(#OD!q>HX~>$F})xN>s21l#o$Qaoyc?X4Z-90y2_v#F&-qOVKg42 z)*}l_)IR%JEt%K$*0GbOjXDnY)-Zxk^0rEOfu<%Y7DtK$Cp*G(3qtHvl}CXvJ^$^eYHG89;IHXU-V=hmJkL?O)I{CsY(UEENReZK;?cz8f8zm!y z8Xr_cI`T;NdheGS5>1{4pmFniniAfqA9`fLh^kGf94-fHFX$o&F&`LwxKyJ9z`i)B zBhz@7UG(a|b|pZD(NqR+v=T^{<)$P$QRIs~PY9xOSxKQGm?oGTTY;GiAv_amlT1b@ z{C)7eg)Wd{43#2=%}Lw3L@)6C@CS#+EJQ#2*d#oa(Lig5KnaghHm5I2`7`gY-3lku zI0e-pU=!r9ViNCT2_(v3E*Z%n@@9nECS(W@h95qEkfZ`s69fb~!x# zZPUitoXYR_R=huJ8?2%6bPd72|KB1)x=R;0oonUfKbdJ3ACsy^Nn!9L#(Hgj0@}>B zxTUza=$E*Ngf$WGPI1q+>WO%#m_S#N6wPh*27)AiwbMCAjJ}0gf1B{b1Au2D!GmT~ zZh5)KT~_H*NI9#a*8ptynRcoefoxWI`2iEU1F^4JhH!=Glh+k`WuwHk_nN zmlp=IMxJcC7wnMCzPpwqi-wl9yVkZZP8)FpNH$rO%&e+8w^J!$MD1J$C#IBr&4d*g zQ<|d6QcweVyfNN1>0dd(<|&&d!f5mKyRCPQz8z$ns>)XA=E9O_f?AJ%N zflSj>nMx{(HU1OT*<%A0k@+SP*AKmnyXdFc>o@-cB$=*C!gE@sLeANls!)87(ULc9 z9p;^U_OORQ(iy6x{ma2k2hJJZYD|93jx}j&oQcmQCw6;bpIhg&fP6Dm`KWVDjo74> z!fYRUUXJ>N{0~NBj`}Qf^jI`X=@2Z!yuxcmy;N#z<;lGJM!W)OW@~7|$U+wI0UH@C z8Pe~PV;+>5zRQmFW3CE>Wmc25HJOk7cVOjPAoCnm=5kW&mzd7oWw8NEf4OvqvPId9MGcxWUgq$)(>7vV;}RANx%mB^Ou9U6a+my_h+dTjDTXI-;}X;B*Pyzo%`}6@Y4) zhN=o$-SQe|z-GqCBQ7fsqzmHB0UxW;5Q`=;!bmfWH_{!ed(5l?q|5b4A+|{_Zn&C~ z5R&m@5!z{gaw=D!{CoYzYCyO`k5I?Wkp@KJRj3|Q%qooc+^`zspDPuNgGerOS=cv7 zUpz@}ANJ`98pdLfyf)#s{n+*OdlgAF1TZB(!NTiZZw*O!bW|c^2GjI`-|ut)rXN&H zIC8(F= zvrt^?(+eJ>Z$G-nJsB*)fMY{_~ILCl@F0(4Y=2HbYtCb!yJ6pkWynCcjmRAd zbWO${FCup7?@k(p5wYzQNrw{%MRf=7w!g-`e?Oj_J7hHB81|rt29B|KDR^nUNRCI> zgQuTuw|!oxn*B9rFGI%Port8RIxa<$7#{7uTXW9C!58;gj-JU~1cSFJ6o@DM66Zdf zQCXPlHcx;Rof-8a$=FwGkH2CPV);pjg>$P#EEdVQqF5Z9EYr~|9^T^zEW34BjH%J) z`NX8mQ&;)|3B{(WP82h5$DecmL91}b@6lsUvT)j&NO3ERUdfo59KU78c0{t*3Q2i8 z(%jA`m9`^4-z$y6#!E$&C2A2S0_j7y*R}VKz2!|B*qHQ0(o6$H4MS#<3`}OmDS;rmc3s!5 zYj3NouDzjaTNR{86QrXQL5lPuAX2|`?tAyW`{v#EW^Qs5+;83Q_xmKt5dQbvbI(2Z zl>gyGK-OPp2+U;cFV2IQySKM`G-FG9|H`{4=Si%Occ z&-dnGft|I0?|?*nm7btK=97d zk-nR3q19^loAK{ouvhzFdz@V;N2?y*wS4LV)Wbhn@WF%D7ivNe)8Ej3gCoAzGSU4Pb)YE>~>b9Si7V7NsF({P*= zTg0J*UoHMn9ZNUR97yxjc#|t;HeR?4IXMp%M=33)p(xgUetKNa>IT4dn1%}m(RHQ+ zDQ?FVYv0ttlaE~04=^8|66SUvb#bg|R{4H;#{tvv937E}Ri*>k4y0D89y#&BWjIm( zNC%`{Crh4p@xX^vfM{ej6B~b{rGtk(f2u)kFnj#CyGts)Wt3NvUmg5#T}Q3O^)j*u7UK4z{Jj; z8FtKk| zj@In`h=#+Lp&p);h)<5|C@e$XJHhqS+G+SsI5`2MOxIETOmlSdx#1I0Cr{CE7L_JA zjf5tNl)kD2pxTd>)PsD&^3;>(%(?!<7G)Qn>r*wH#n?uj02RY`;NPNio34i-okOI; z*m#^H#eJ*3N6wMcRBVw!s{5T63b$1Zh=xd@TMv$^c{-r~k;#JCojwT|iCy-mmzU%M zs?*J=prN1)MpnUS2_Z1+*mL$f=lu@S=lxzJ`@(dg0|jzNMzwH9Hy+bGLo z0&N@ACL--89u%FN4ZdglNEWsxO1kw8a^1R9wuWF8=NPN_&En@VT=sh?cN8*Qo@NRgAQwhBDnVoV_N=)-gX|WhpT`rnh@Bt37!CY0trG&riPE_L288 ztLor#g-^VTGf}eg>Wn2@V7(U@>!k#fbZ;5er?%?<*D(?GFO&>xR(1F%hiw}Qa=cKN zBO&V~jcrkPZU~dYo=ChQq!&x2Q1DBx0H_LPS@w_**7gz*T?x;lobqViQuHVPttT$(CHNho*V>|;sA!U z;&N${Q#dm|PTw=Wejs2}bc{8=7MP9#wI(Xc6t-N!TR&mTp$@88p4Cg&%YF>2H@xk( z83DLAT{?1Kl+@1TL?J$p!&4X|AY=L(a~*;$=~xSmaT#~)S7EV87gOU3pI6Sy=A$=r zSK-ShUEe#{uQCt3CQJtwds|Vnh|eJNwDS6ty`wMt68n@hG)yh=02c35gvmi5RXd0U zzEvQ0gJ&TBT&9X@h>{g`n~VJl>wBdsP)}5-6vOntoIbX2 zgl!rR&+&a;9*=mkbUg6{JVhFwqAtNxdg$VXh$maa!>MZ3@RW54o=5vWHx}`9*YPCo zSFwhtxJ&RHe&NHL5Kj*c52w;r!&5FF4|O@1H~RtmygeT4#4pzHbWapdo(3l`8606d z#6ffYC!efDG?!2`iOO7{p(&7#h7((P>CSCGU~J`54UKjKt06jKbkuGtFhSr?$-7;7 zb=t!UPgsOlE=viEJRgOJrM%&}FA>Y-4p_=H+YExSHGrZTqmQ0p^!LRZ&R&uYSbCbV z5HCsF7o>-f+Z)JykKS&Ok)vp(xfI;ej)rpMEXi$l>5{o^D{{ zHOkvPnpkIcZ*c$TW?*+`E=6k|7p6^bLRE4MUJBo&Jbr<5AKE?}JNxq}7N)@zU2j6< zD)o(`m#Q-oX^rePA_Gw5vnbTo(v(1m>X7cpGZ+r29kk937z#8Dc~CArs4(J#lK5al zn_GyoMi>w0R`~dglfS`Rp^)N%!svL+R||bJ(XK}`aru7R5KWPe2HKcB!B|eDsk6~= zPSACqeoE%H7AK%lQ%mijUJ^b_ygG`1UYWiM>nKVzR7DZLm%&1&gfw9N7V0# z2$H*Xt|g+ED}&^nap(SuJ5^4R#3PNK2A`6zL9r^fJ(-v2PVr`*&i$<460Do7NW@bL zw419wC6 zvIOf)Yq+RHHrVl)2xH~l1M9y%W`i5B)@oR5d_!XK$nLW)FW<9lBc6-8L_E^OCTatD zal%Ir9l9CgguN{&NyA(_6i)`KNu%SV5LKTIatOVmXRg2wsjCw46?tM<@}OS$)?2n~?~7aS+qD4CMZZLpBIm-dEU&hpbUqiXEFD1#+dLl1%d*d0h$yc~M49BAuqfqPX5QVKF}-9vo||jUD1S3| zZ{gfn-CG;)JreKU{#;ZdhehrV^Jasd_iBXnn|UbKX6TFeM)UnGDH$Ed zgCcsGdAHmZC7&(A`(%I_U!^aSi_sZdkoNACFe=V{GH>M_-{HAvu%LpPyO{1w z*j?-lw>>;z>%#M>ek$90svGcmHGI88kwHa~P(0ifFKbRDYwMZ!kHpxKkHG^BI4z)N zo&B1nt)R?nw%gy&o0$)28WYfenFxMNKeQ^X(hwKMo2s^JP} z{!q!4=g+te@HA_9>iym!$fXa2UlFWZ@fE;aj}|18C@U!?GqAAI0Vo<81|^g{V6{sL zhO+hYz%uxwQFu_s7N|*!y1R5bJj2Vn_?4VhTVYLpvZjU@L{b2gC*p@Frdv(!V_dGT z3KJ+U92lr_|Ehc_PLv^p`-Bv*lfPz+BZV&^x(8CK@-@;r5cpn2*aJaj{9X_Es?6v0 zdkQ0-79W;T#DVgH#0T@#=%6PO@wB-svvT@CoqSEtZuL0O2La=hUN5=r_z>Y#3|xW!n#M!HxMgs`;(d6Dg=i`zm@hUyQi zr!ByG`awF@gk+0~7etRrs-<3RAqk%?PNnd}$Ic^_!U2k?y4l~TvZ(jX!FlCL=5eD~ zu?Pt1QIH89X2;g}A}x7nGC-M~QjfwCRb14Z8|UcW3$B~f2oi14@yEPy(P?SolnS-T zBH7YBsMAv9Ws()n9L|^a+&s?*sDmnMIC8<j$Dx#KL7%QFQ^+t$U(i|RB8bPM7L(A@&+x(@E zAJ}mj;JHr2Q;C(9wvLy~oCdEKWd7-IF2;O#L_-q_BL`GX2ucBUq4dqEEXd85xJw+X zcjC|sSEJrUDUL{6ZamuC?}gd#;!dfs-f(K|UfecrI@a373`8WsT7@;9;*f+-mtL^W z=uYvUBg-!VOmP)cq{*jbC6wOaUKPRJTI4WRTnd({xo3ZkSXy-~>8^yLB*cQXbxtGB zg|YC?_@(zAL#o*Z8(7><7AMW#bc^HR8Mj+>xc>K6|dWO=(P__?E`p+S@6P1BmTVNuJ2`WR=mCe@uvC#aeu&D-xSC8 z1c}vNybjEsJ%5^rw(|xZXSEM&K>X2xA%8GNzF?}%v7uI~jo`7uJoVtXACML1Mimnb zSku~i8v}8_*EpV9@pLVE*4X?6b>i~gCTX;M(eO?$_~EKG$e{EW9alw8FY?67@p{7G zA-h8!rdt#Xs(}}>h`hgKLla4P5MKP$KA-qg`;R&AzUc7DnsEpAV zZ@XDXSLgQ)c6Z^PrgLUZ-cc7tv-heM?h@mU~ zZ8n$!uf*CCEo|Z3PA_Wv)6=czZtdbfF3o~Hx|QxxRA-v?>h(@&O7%EU7mMb%vMtiA zUpi-^;`#0~w)ccxxQ*Ebl_m_ravJgP@7uwi65H(%wx{XoR*z`Jhu6=!1oq>0V?PXj zWFTSweJ?s`FEZ#e!te~noV9s=KJ3LEiF@(;0YSfvy~0x36wzCQ_tHG>(CAEzCf!N) z#2?(HU=ZyKK6-B;H0e)kN_bl#)k*}Z*bFPwkg6hw0`MU$w^UD{Vx`CfD#_D|iX zq0wRkP|^ZV!!GVC`#k-|uMx}rDPif{zOwm6^S(kX4>(}ys=l&oZyNG5_LV(o#?s|| zWn=2knTK)ohd4O8vahV)_?)TN0*;3{IDUJ5Wyh5J#$XKj5sKC^Xe%$a#_KEF-Y{e_ z_LcpeV%aTyWls#Bw;lV+9%WH(C6ah!lBBu3y;EGYz{x=T7bUi;1rR^3Aub3u1VT}KLHZ*w{!T2Yi>YdTraH-8 zmq|p=i9|ee_ZvS20sRw+=xealqe;h4Y-+MYYzh9#oUFu~2>+PUd(~Bd{z(menP*4| z)ZSoaN?)9?p1e8$0{!L4#8B*#m<6Fq!er0>y2rW|Sbh1FffR;^vq-DM9wb{Qec}cx ziM!8X!RvqS(DBHE_p~jlWLr*=8hVR077oG`juh}Jz@9s)fpo(?qv7t#=~2Ag=sv5j znTL1Dvnrk_9{)N|AnwC5Fn^E?Wp7a{m8x^fNfd zevy|q2;G0v3d|e)!v;T_PlNM?!~|fXa*O5habLC$F~g!gULRrX0=@Wsr2Ot3DW3`Cz(s_*3}aQYW|L)cB88*w z+VD+yuRZp7QPrD@@b6j!gun41W>0}gwYDS*)bU>R5aHK3FsJReIu4l7ebRxtpg1OT zUkCZUCgQP}?7s1B_5#4a=?S)}i9Y&^+Q+}vL!SQjpn-12Gb{P)j)_-*HU6inza)ig zmz^iv+vF3j^bB{g1HHBAJ(t0$!7d%#Z}v#A$S)CO#0op+Lw>ipyVvHD>(AD?6V(VM z)9Tx8XuWmfU7)Kk>l&f87U1Mit>ZwoG`#KtGWyYcr17~y>iF3%15(U`-(?T9v^#`1 z5hU;CE0^FzkXQ6|)rP%TcaYke3~VQ&_QgMp+0p2@Q8tYpTE#skT=z3xYcJ-Wj=}h}RckKg+I9 zBB!O2M$0&j_050hy-heZ>J4>$tvvRk2GyVJn!gu5>s|vn|~fw_r$k|=UolY?#@5g?U_9p@w}(w*}eJa1D-#0 zKH_;_!?U~d&vPeUJR38di4WkjIxABk8vylA)Y z`erBU_(#dHs5iYm9ATTykc-YL80R>@RH;$tf_a1YpLNks*dy`@ zMd{=;rIp*ag9*!wmt81)^6I&6K=Y}F20He1hrgD|%o3l!7NWBbEj^-s1MlALlY96q z)Tz(x@TfW3RNx59hZix~@cz9!F=Fx`4NqP|ExDPJ6_1@(C=QOT{niOfilawQANl2M z)T7T+LMBs>cyd~@W#%fB(-+Cn7y?3ZN$pGJO_1>HKganMcqO-FH=gxY+uYX4g;QC6(6%MqeHb+6??ZxYxdiax5reWXI zsML``p+XKGAlt{L=uYzbi>lZY zXcPk_x_>-w0N<2vmLWI5G%ltRpf>AzIrX13_h*#TbS|dS5KzSlffAMzr&@K$F`trZ z)frq&)y<(uXGq2F^LYw0zJ8Jje4X z2CJf?$Lo+-72O4elevDm?D6H8xn4j}gjDuN)X%QK>wg3gfd_5L8>KZ400?E1=Qlc1t($^`djr6h-aZKo?PVr>J&Um8U!FydWyz?zc+&XulntvgEQnPbyh0JpWf?V729y$(vMb*9C$gZ>{5a!s$oio zwX$vf5jW1g5zsAG(FLJ7#uF$5wp0j7(;-kP1$WgvpXnORaJkE%!U+R|DtiHrk+yxt ziLQn>ad2qkTO+VDbcwo}NDJ9`ZG5yLQ>at2g&}-Sc>GC2|5ZB^`IDCNa5$&@Agkpt z3|br=-E!vkDgAKBF0A@n)*f^Y;AHIJpRdYTi97fc#a8TTX+gGTqn-|m>2eFwB<>)O zBlC;BwtR)Xy~~s0um>V656(?_%*YGp;7z$A2@Z)UC_xOPG0)z2>?+)qmB~=p!w}Y7 z-itf0bkt~kaj&8{AV`*&1Qnu67DvUg@cnz8u>fC^t0}5dr9+^E^@fx4`e1gywdsIq zje)7YQ_m0wL${j;ZAJ`h`54OJ9GA&F$Gm9BrM0JQ$GusnV{mot-f+%z*=O6A;F(@; zV5+_@!fsD8(THkDch2ryx@+h{%-L@^c3;S*K)@L*T;0^%q8se$ol&lRAFE_@_Xvey z$Y^W*;7}ys&45WA-V42fz#dZ0Q1HNaCg48(Ol6`n=BeH|N$s)MH@Xy1{~_^}#_KTu z_mSss#SZh0wwRJ#WMphtq)X}MUkIac?v{~R?6t?pKWWoQGo3R<4ixiCXT znnV=+X<(dy15Z71`MZE(8=?peh(VV+jM#vwU*0@OXh%F`zHAg|YO%>T$2%|{g(qxI zBYuJvR{^c?*PFs?O@E(}tf^_x_ERaf90{KqR~p?2Ljq3?I%md5Ac5`T5&+@EfJ$}u z3qsfy>S1I<4tKx%`G&VZ4m(8TPz7UFn7!RSY9PLPnp7}W|MoN2PQ!DsQ)uuY>z@26wZ+YQK8LEKg99`R~4UjO3Wd6;S2-w{La3`ABN z^)&ek1D+;)SK2!1qPxZO`WC!(`bhNp4sbvvS7&rn&se)*Py5GXrSE~sP>6^}{A6+7 zFi$q`OSnM)V2`Ym^qAM}`eSR$_t@?F$5hdDs=O3Vz20S)tyzTidIu4N5D#%<)nql~ zm_VaRwxJd>?Dd4UtwXhw4&edObHQ83TjM_8f$KO}Uq_wa>kH+<^a&ViE_ET&&bOjp zQid1xhMlqm*h(slSk{hG z(Le;%=OvM5m>gq6&}R(vv7_n(c^b2Y;S0OZu|YZ2jF769-}$C~1AJ5bZOgWI07NZ$ zW)JI`f9TFbbJetu)HM8`)I>yR;Fy9TC{;mkcBS8ogGs*nCA zf3QB(=!Ph5EX1^7k$TG7qKXK9z@RszQ_V@=I)?YiWa~-@3Dl{h?#Q3?dJZH!gfZi_ zGy;krQ)ivky0amSKxUgckZuaEn8)-raR0+MA=B5f;wvUJjxzBnoGEnk4+(6!2k;$d z;PV8^u~$-+z9*0u0QD!|3Hl(p#VE@0WNq=7 zI*z_5ud=#xx{D)LHs3P3`jG9$0)>DCJ5XNI3Jz6WrHo=g$JCG`7HL1WHjO3EsH2GcWW zDATx$JokJ)D;IX+6!T7`c>dtPb>#?5)A{b=e>1NxOy%3fnDS4@>aF=#SXLa=NxJ zs!Iz+L6)l)d-u?@F+QP{f;e4rQZTk{zHA3#>}JK7aQSu(MxJ;0)G6<7MDOqn4I|6} zvG-QY46YKr79O%ypADRk$j&q&OAs8AMC0am8ZxNYJw^SWVWBVl;)S(1hx{yx%-7(g zcq$J7ej)|M6SY}9e4jkJVl(19I{{yU?5NUpDn1v-rmk+ie!`D{?;H(ZeJBjhAD4zi zjo-zg(3->$>#=beHrp=rS4)3X?1?r**(N*g!{vsb`mT$60`>6BcK9XgO%ESPE!vo= z5s%wGDuitbuTEe?^VFGGCvdJNvv53C3e}BKH*pN?CICP)s4XmEP2+GhHB>%6<6%H` zo`DMA$Tgu7sG1$(F0HO9EA_Nt{cJFpQQzuHb7iDuLJ2y2sV7S{?(6nVTX0T-2}@qd zvc6TWIyZaz{jkRKZPxhTw7zWWZZhxHCwIL&^s_7zvcrdho!VnwCbwEGpAa^L}YYhk7gZ*KncLoc#C9)at;tzA& z%hu)qrZmJ9_5?%l%5Q`!gX)1n`2L}AS@-GuU3}+?iTce z6ctef?5ZzN4{S~K1cBDBPz3}0eAo~ozAcfvkH^0-@ek2y$iLvC z7+WwN0U-1|H)@tXBgUcqS=6rbm;}9Vmj8lGg6RyJ$~LXa-S0E&6BHHdxH9B**6V3K z##YQdVb(WTf11I=6$%E2bPX~Z#$b@$_0(0hg5pI!tpQ_!U3TnO6VzqcO{8+yZOL?#eaU8gkL|#@nTPjth}p z>dvgltj?XWPqs^H$1YhlZ}B$&*Qj|t*flW+p)*$0*_wCkwnM%}&AYfO*JQg*!kU+5 z-KAK=if`_P6W{|wn}CmItW)ipO%TU^_3QTBY|WqOl2cP(J7hM z*VT{1PWk3`K-W`8r#>CICqNZ`i45u69%^B|=P?j{asJ1@AmfjlSyf}mNuz9^>B4w; z_uJ%Cu9$*%L5_~6EM#Y9s);?NRU+$8) z7M(K9u&}{5*GzaE){^hImRLNDV|f9pN+g!JD1>YL6nlcyD@q zPzHNygjdVdJ$1{h=uWfN-#hPf|qE1Nqi3d-QO#ye*+cN zaPievVx?$9D1gj>5b@5fg`I0cZV;$71KpF!7pQPp>+gOzI2&2(%QW4I;yfN8JSWp_ zP>~F^f!U{y!`ArPZ=Yrmwjzo`pG1ada_7}`YX$)Ra)Q6v6IDC+QliZPqCs>$OpJ|i zUM2SI@a*2N75n{)cCW%f?8Hcv<^V@rf-YL*Xh?AT=W90m0Z*llCodF<_+SPD6(t0v z^)yYn7S&It3TbITZ)|_L3M1E@QpQ`GJ~_As83L{($o;}J1){c>*LPl$^~H*Gz);0t z5FjZKmV@G=0dr#q%j#;THUfrff+6G&#wtUBwx&?92FjbY^Go`-l5Lu?&1JC74vHr# zIVHndF}(Mp_^e@ox<*GGbytOApmtt-3K87s6_GK%y0ghb)ZP<@@0s{R%@uV{EQ_v% zH(zV>(6k?LzE*9rwZP+*1?kZG-ww^Np6yrmubPHuyH3Rw@I-2$!5Jv@bzdO4QRmu7 z#X&j5ktHpJz`slQP+9R2NI;9u^m{mX3uQb}UjU)Cq(y@SX_$XxH_9>j05 z)mS*)-2MSBz8+2t@uU&K9T-Ers)OqRMhh?=##zJB?1bfl5)-iV*`=;3n?Btc{U~qk z_M;0{)lXejxPE{KiV7%~3`Vs2I1rbMYAA31$flv?Yw`fW)hdFh8!L`1?Az>3kMS9K zkxZV|oL5)64z1=j6cY#p(j*+x^3KD>d$q4PSXqLv_G^>k!ciOc2SRw?IGR(Dx!(rF zQmB$Dc@VRT$c!v=Dq>Fg z<<+0DE}@B8OGP;5Z}9}w>S{6tP9OTzH-{9xI_nCQHfsOtol()C{T^sJfyYi06vR0^ z14Ok(;pqJ6V{RLPI^XQLqB75r_AW}A?bPXF8Qsx({5XU-2y>7T*AWxWk~DcLC;S`X@%@iiH{Eymlj96@fI_4VEgE+&kB z!gstz#mNhsu|Ly(2lT>RC2QUR_q?5O-%qGPkyIoC@M(R7Ob?M)W3~9>I~HJ#Rg}e5 z=<~#&%HD3nQiCU|N4$Qp+Tln4i2YzO7M&BtJyEF6!RP8>&CBm`-+POXfLvsp!AB@( zAfePS$QP-`0B-@LCR=bSSy@SGZYTs_!FVI^h8hOp9~gFTs18dw4YUvv{#zLXwbp)Z zjVIFNi;-W>{YB*DXr&1t4C4Sv_q+<@D;$fj$x=Ih;G{i?a{ihsB|JB7-}1ZeDna%0Dk}^l<+RDR#P$fs+4Ji70!f& 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�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 -#include -#include -#include -#include -#include "../../Engine.hpp" -#include "../../../../Hook/Hooks/Render/SwapchainHook.hpp" -#include "../../../../Module/Modules/MotionBlur/MotionBlurListener.hpp" - - - -void Blur::RenderBlur(ID3D11Texture2D* inputTexture, ID3D11Device* device, ID3D11DeviceContext* deviceContext) { - ID3D11ShaderResourceView* inputSRV = nullptr; - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - srvDesc.Texture2D.MostDetailedMip = 0; - device->CreateShaderResourceView(inputTexture, &srvDesc, &inputSRV); - - D3D11_TEXTURE2D_DESC inputDesc; - inputTexture->GetDesc(&inputDesc); - - D3D11_MAPPED_SUBRESOURCE mappedResource; - deviceContext->Map(inputTexture, 0, D3D11_MAP_READ, 0, &mappedResource); - - cv::Mat src(inputDesc.Height, inputDesc.Width, CV_8UC4, mappedResource.pData, mappedResource.RowPitch); - deviceContext->Unmap(inputTexture, 0); - - cv::Mat dst = ImageProcessor::ApplyGaussianBlur(src, 15); - - ID3D11Texture2D* texture_blur = ImageProcessor::LoadTextureFromMat(dst, device, deviceContext); - - ID3D11ShaderResourceView* texture_srv = nullptr; - device->CreateShaderResourceView(texture_blur, &srvDesc, &texture_srv); - - ImGui::Image(texture_srv, ImVec2(dst.cols, dst.rows)); - - if (inputSRV) inputSRV->Release(); - if (texture_srv) texture_srv->Release(); - if (texture_blur) texture_blur->Release(); -} - -cv::Mat ImageProcessor::ApplyGaussianBlur(const cv::Mat& src, double sigma) { - cv::Mat dst; - GaussianBlur(src, dst, cv::Size(0, 0), sigma); - return dst; -} - -ID3D11Texture2D* ImageProcessor::LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context) { - if (mat.empty() || device == nullptr || context == nullptr) return nullptr; - - cv::Mat matBGRA; - if (mat.channels() == 3) { - cvtColor(mat, matBGRA, cv::COLOR_BGR2BGRA); - } - else if (mat.channels() == 4) { - matBGRA = mat; - } - else { - return nullptr; - } - - D3D11_TEXTURE2D_DESC desc = {}; - desc.Width = matBGRA.cols; - desc.Height = matBGRA.rows; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - desc.MiscFlags = 0; - - ID3D11Texture2D* texture = nullptr; - HRESULT hr = device->CreateTexture2D(&desc, nullptr, &texture); - if (FAILED(hr)) return nullptr; - - D3D11_MAPPED_SUBRESOURCE mappedResource; - hr = context->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(hr)) return nullptr; - - for (int y = 0; y < matBGRA.rows; ++y) { - memcpy(static_cast(mappedResource.pData) + y * mappedResource.RowPitch, matBGRA.ptr(y), matBGRA.cols * 4); - } - - context->Unmap(texture, 0); - - return texture; -} \ No newline at end of file diff --git a/src/Client/GUI/Engine/Effects/Blur/blur.hpp b/src/Client/GUI/Engine/Effects/Blur/blur.hpp new file mode 100644 index 00000000..c4613224 --- /dev/null +++ b/src/Client/GUI/Engine/Effects/Blur/blur.hpp @@ -0,0 +1,55 @@ +#pragma once +#include +#include + +class ImageProcessor { +public: + static cv::Mat ApplyGaussianBlur(const cv::Mat& src, double sigma) { + cv::Mat dst; + cv::GaussianBlur(src, dst, cv::Size(0, 0), sigma); + return dst; + } + static ID3D11Texture2D* LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context) { + + if (mat.empty() || device == nullptr || context == nullptr) return nullptr; + + cv::Mat matBGRA; + if (mat.channels() == 3) { + cvtColor(mat, matBGRA, cv::COLOR_BGR2BGRA); + } + else if (mat.channels() == 4) { + matBGRA = mat; + } + else { + return nullptr; + } + + D3D11_TEXTURE2D_DESC desc = {}; + desc.Width = matBGRA.cols; + desc.Height = matBGRA.rows; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + + ID3D11Texture2D* texture = nullptr; + HRESULT hr = device->CreateTexture2D(&desc, nullptr, &texture); + if (FAILED(hr)) return nullptr; + + D3D11_MAPPED_SUBRESOURCE mappedResource; + hr = context->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (FAILED(hr)) return nullptr; + + for (int y = 0; y < matBGRA.rows; ++y) { + memcpy(static_cast(mappedResource.pData) + y * mappedResource.RowPitch, matBGRA.ptr(y), matBGRA.cols * 4); + } + + context->Unmap(texture, 0); + + return texture; + } +}; diff --git a/src/Client/GUI/Engine/Engine.hpp b/src/Client/GUI/Engine/Engine.hpp index f829e917..7e7f8fc6 100644 --- a/src/Client/GUI/Engine/Engine.hpp +++ b/src/Client/GUI/Engine/Engine.hpp @@ -23,6 +23,7 @@ #include "Elements/Structs/HSV.hpp" #include +#include "Effects/Blur/blur.hpp" using namespace DirectX; @@ -38,17 +39,45 @@ struct BlurInputBuffer class Blur { public: - static void RenderBlur(ID3D11Texture2D*, ID3D11Device*, ID3D11DeviceContext*); -}; + static void RenderBlur(ID3D11Texture2D* inputTexture, ID3D11Device* device, ID3D11DeviceContext* deviceContext) { + + + ID3D11ShaderResourceView* inputSRV = nullptr; + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = 1; + srvDesc.Texture2D.MostDetailedMip = 0; + device->CreateShaderResourceView(inputTexture, &srvDesc, &inputSRV); + + D3D11_TEXTURE2D_DESC inputDesc; + inputTexture->GetDesc(&inputDesc); + + D3D11_MAPPED_SUBRESOURCE mappedResource; + deviceContext->Map(inputTexture, 0, D3D11_MAP_READ, 0, &mappedResource); + + cv::Mat src(inputDesc.Height, inputDesc.Width, CV_8UC4, mappedResource.pData, mappedResource.RowPitch); + deviceContext->Unmap(inputTexture, 0); + + cv::Mat dst = ImageProcessor::ApplyGaussianBlur(src, 15); + + ID3D11Texture2D* texture_blur = ImageProcessor::LoadTextureFromMat(dst, device, deviceContext); + + ID3D11ShaderResourceView* texture_srv = nullptr; + device->CreateShaderResourceView(texture_blur, &srvDesc, &texture_srv); + + ImGui::Image(texture_srv, ImVec2(dst.cols, dst.rows)); + + if (inputSRV) inputSRV->Release(); + if (texture_srv) texture_srv->Release(); + if (texture_blur) texture_blur->Release(); + + } -#include -class ImageProcessor { -public: - static cv::Mat ApplyGaussianBlur(const cv::Mat& src, double sigma); - static ID3D11Texture2D* LoadTextureFromMat(cv::Mat& mat, ID3D11Device* device, ID3D11DeviceContext* context); }; + class Dimension { public: float x = 0; From 882e3eb4911b65e34c4db31163cc38bce1a2d610 Mon Sep 17 00:00:00 2001 From: Bari <58800830+TheBarii@users.noreply.github.com> Date: Tue, 3 Sep 2024 08:06:10 +0600 Subject: [PATCH 136/240] Revert "opencv works on debug mode!" This reverts commit a22f1835abdc48e6c9bb8b7412425722074466a6. --- CMakeLists.txt | 31 ++----- lib/opencv-d/opencv_core4100d.lib | Bin 919374 -> 0 bytes lib/opencv-d/opencv_highgui4100d.lib | Bin 216960 -> 0 bytes lib/opencv-d/opencv_imgcodecs4100d.lib | Bin 167780 -> 0 bytes lib/opencv-d/opencv_imgproc4100d.lib | Bin 335126 -> 0 bytes lib/opencv-d/opencv_videoio4100d.lib | Bin 210864 -> 0 bytes lib/opencv-d/opencv_world4100d.lib | Bin 3775276 -> 0 bytes src/Client/GUI/Engine/Effects/Blur/blur.cpp | 92 ++++++++++++++++++++ src/Client/GUI/Engine/Effects/Blur/blur.hpp | 55 ------------ src/Client/GUI/Engine/Engine.hpp | 43 ++------- 10 files changed, 104 insertions(+), 117 deletions(-) delete mode 100644 lib/opencv-d/opencv_core4100d.lib delete mode 100644 lib/opencv-d/opencv_highgui4100d.lib delete mode 100644 lib/opencv-d/opencv_imgcodecs4100d.lib delete mode 100644 lib/opencv-d/opencv_imgproc4100d.lib delete mode 100644 lib/opencv-d/opencv_videoio4100d.lib delete mode 100644 lib/opencv-d/opencv_world4100d.lib delete mode 100644 src/Client/GUI/Engine/Effects/Blur/blur.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5321c42f..47237d1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,8 +73,7 @@ endif() file(GLOB_RECURSE sources "main.cpp" "src/**/*.cpp" "src/**/*.hpp" "lib/**/*.cpp") -add_library(${PROJECT_NAME} SHARED ${sources} src/SDK/Client/Render/Matrix.cpp src/Assets/Assets.rc - src/Client/GUI/Engine/Effects/Blur/blur.hpp) +add_library(${PROJECT_NAME} SHARED ${sources} src/SDK/Client/Render/Matrix.cpp src/Assets/Assets.rc) target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lib/include/" "${CMAKE_CURRENT_LIST_DIR}/lib/glm/" "${CMAKE_CURRENT_LIST_DIR}/lib/ImGui") @@ -89,23 +88,6 @@ add_library(MinHook SHARED IMPORTED GLOBAL) set_target_properties(MinHook PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/minhook/minhook.lib") -add_library(OpenCV SHARED IMPORTED GLOBAL) -set_target_properties(OpenCV PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv-d/opencv_imgcodecs4100d.lib") - -add_library(OpenCV2 SHARED IMPORTED GLOBAL) -set_target_properties(OpenCV2 PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv-d/opencv_imgproc4100d.lib") - -add_library(OpenCV3 SHARED IMPORTED GLOBAL) -set_target_properties(OpenCV3 PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv-d/opencv_videoio4100d.lib") - -add_library(OpenCV4 SHARED IMPORTED GLOBAL) -set_target_properties(OpenCV4 PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv-d/opencv_core4100d.lib") - -add_library(OpenCV5 SHARED IMPORTED GLOBAL) -set_target_properties(OpenCV5 PROPERTIES IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv-d/opencv_world4100d.lib") - - - FetchContent_Declare( libhat GIT_REPOSITORY https://github.com/BasedInc/libhat.git @@ -119,11 +101,8 @@ FetchContent_MakeAvailable(libhat) set(OpenCV_DIR C:/opencv/opencv/build/) find_package(OpenCV REQUIRED) -message(${OpenCV_LIBS}) -message(${OpenCV_INCLUDE_DIRS}) - -target_link_options(Flarial PRIVATE /NODEFAULTLIB:MSVCRTD) - -target_link_libraries(${PROJECT_NAME} PUBLIC ${OpenCV_LIBS} libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) +target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS} libhat windowscodecs.lib urlmon.lib dwrite.lib d3d12.lib dxgi.lib d3d11.lib d2d1.lib wininet.lib version) target_link_libraries(${PROJECT_NAME} PUBLIC MinHook) -target_include_directories(Flarial PRIVATE ${OpenCV_INCLUDE_DIRS}) + +set(CPACK_PROJECT_NAME ${PROJECT_NAME}) +set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) \ No newline at end of file diff --git a/lib/opencv-d/opencv_core4100d.lib b/lib/opencv-d/opencv_core4100d.lib deleted file mode 100644 index fe68378ba9062410532fe5c6620cfe92bcc02952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 919374 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