diff --git a/src/Assets/Assets.hpp b/src/Assets/Assets.hpp index 3220fdc2e..db0d07c06 100644 --- a/src/Assets/Assets.hpp +++ b/src/Assets/Assets.hpp @@ -189,9 +189,10 @@ #define IDR_WIN10_LOGO_PNG 290 #define IDR_CHROMEOS_LOGO_PNG 291 #define IDR_INVENTORYLOCK_PNG 292 +#define IDR_ESCWHENDMG_PNG 293 // MAKE SURE YOU ALWAYS UPDATE THIS! -#define MAX_IMAGE_ID 292 +#define MAX_IMAGE_ID 293 diff --git a/src/Assets/Assets.rc b/src/Assets/Assets.rc index 6f9583e56..bde4e93bf 100644 --- a/src/Assets/Assets.rc +++ b/src/Assets/Assets.rc @@ -202,4 +202,6 @@ IDR_APPLE_LOGO_PNG PNG "Data\\apple.png" IDR_ANDROID_LOGO_PNG PNG "Data\\android.png" IDR_WIN10_LOGO_PNG PNG "Data\\win10.png" IDR_CHROMEOS_LOGO_PNG PNG "Data\\chromeos.png" -IDR_INVENTORYLOCK_PNG PNG "Data\\InventoryLock.png" \ No newline at end of file +IDR_INVENTORYLOCK_PNG PNG "Data\\InventoryLock.png" + +IDR_ESCWHENDMG_PNG PNG "Data\\EscWhenDmg.png" \ No newline at end of file diff --git a/src/Assets/Data/EscWhenDmg.png b/src/Assets/Data/EscWhenDmg.png new file mode 100644 index 000000000..088095bb0 Binary files /dev/null and b/src/Assets/Data/EscWhenDmg.png differ diff --git a/src/Client/Module/Manager.cpp b/src/Client/Module/Manager.cpp index 129c18a9d..171a76b1c 100644 --- a/src/Client/Module/Manager.cpp +++ b/src/Client/Module/Manager.cpp @@ -133,6 +133,7 @@ #include "Modules/Misc/F1Listener/F1Listener.hpp" #include "Modules/TNTTimer/TNTTimer.hpp" #include "Modules/ItemCounter/ItemCounter.hpp" +#include "Modules/EscWhenDmg/EscWhenDmg.hpp" #ifdef COMPILE_DOOM #include "Modules/Doom/Doom.hpp" @@ -319,6 +320,8 @@ void ModuleManager::initialize() { addModule(); + addModule(); + #ifdef COMPILE_DOOM addModule(); #endif diff --git a/src/Client/Module/Modules/EscWhenDmg/EscWhenDmg.cpp b/src/Client/Module/Modules/EscWhenDmg/EscWhenDmg.cpp new file mode 100644 index 000000000..6eba2e346 --- /dev/null +++ b/src/Client/Module/Modules/EscWhenDmg/EscWhenDmg.cpp @@ -0,0 +1,84 @@ +// +// Created by tonyv on 11/20/2025. +// + +#include "EscWhenDmg.hpp" + +#include "Events/Network/PacketEvent.hpp" +#include "SDK/Client/Network/Packet/EntityEventPacket.hpp" + +void EscWhenDmg::onSetup() +{ + if (mAddr == NULL) mAddr = GET_SIG_ADDRESS("Keyboard::feed"); +} + +void EscWhenDmg::onEnable() +{ + Module::onEnable(); + // our code is aids bro + Listen(this, PacketEvent, &EscWhenDmg::onPacketEvent); +} + +void EscWhenDmg::onDisable() +{ + Deafen(this, PacketEvent, &EscWhenDmg::onPacketEvent); + Module::onDisable(); +} + +void EscWhenDmg::defaultConfig() { + Module::defaultConfig("core"); + setDef("chest", true); + setDef("chat", true); + setDef("pause", true); + setDef("inventory", true); +} + +void EscWhenDmg::settingsRender(float settingsOffset) +{ + initSettingsPage(); + addToggle("Chest screen", "Esc when take damage while on chest screen", "chest"); + addToggle("Chat screen", "Esc when take damage while on chat screen", "chat"); + addToggle("Pause screen", "Esc when take damage while on pause screen", "pause"); + addToggle("Inventory screen", "Esc when take damage while on inventory screen", "inventory"); + FlarialGUI::UnsetScrollView(); + this->resetPadding(); +} + +void EscWhenDmg::onPacketEvent(PacketEvent& event) { + const auto currentScreen = SDK::getCurrentScreen(); + + const auto player = SDK::clientInstance->getLocalPlayer(); + if (!player) return; + + if (const auto pkt = event.getPacket(); pkt && pkt->getId() == MinecraftPacketIds::ActorEvent) { + const auto *eep = reinterpret_cast(pkt); + + const auto *rIdComp = player->getRuntimeIDComponent(); + if (!rIdComp) return; + + + std::vector screen_check = { + getOps("chest") && currentScreen == "small_chest_screen", + getOps("chest") && currentScreen == "large_chest_screen", + getOps("chest") && currentScreen == "chest_screen", // just in case + getOps("chat") && currentScreen == "chat_screen", + getOps("pause") && currentScreen == "pause_screen", + getOps("inventory") && currentScreen == "inventory_screen", + }; + + + for (const bool check : screen_check) { + if (eep->RuntimeID == rIdComp->runtimeID && eep->EventID == ActorEvent::Hurt && check) { + Logger::debug(std::format("EscWhenDmg: Closing screen: {}", currentScreen)); + FlarialGUI::Notify("Closing current screen"); + // Leslie, why did you lie to me? + if (mAddr == NULL) mAddr = GET_SIG_ADDRESS("Keyboard::feed"); + Memory::CallFunc(reinterpret_cast(mAddr), 27, true); + Memory::CallFunc(reinterpret_cast(mAddr), 27, false); + break; + } + } + } +} + + diff --git a/src/Client/Module/Modules/EscWhenDmg/EscWhenDmg.hpp b/src/Client/Module/Modules/EscWhenDmg/EscWhenDmg.hpp new file mode 100644 index 000000000..d64ad1633 --- /dev/null +++ b/src/Client/Module/Modules/EscWhenDmg/EscWhenDmg.hpp @@ -0,0 +1,23 @@ +// +// Created by tonyv on 11/20/2025. +// + +#ifndef FLARIAL_ESCWHENDMG_HPP +#define FLARIAL_ESCWHENDMG_HPP + +class EscWhenDmg final : public Module { +public: + EscWhenDmg() : Module("Esc When Damaged", "Automatically presses Esc key when you take damage", IDR_ESCWHENDMG_PNG, "", false, {"esc", "exit", "inventory", "damage"}) {} + + void onSetup() override; + void onEnable() override; + void onDisable() override; + void settingsRender(float settingsOffset) override; + void defaultConfig() override; + void onPacketEvent(PacketEvent& event); + +private: + uintptr_t mAddr{}; +}; + +#endif //FLARIAL_ESCWHENDMG_HPP \ No newline at end of file