diff --git a/README.md b/README.md index 79afacd..f553021 100644 --- a/README.md +++ b/README.md @@ -16,20 +16,12 @@

Getting Started

-## Building from source -It is recommended to use [Visual Studio 2022.](https://visualstudio.microsoft.com/) -As well as setting up **`cheat-library`** as startup project. -**The following is a recommended procedure, but others may be used.** -1. Clone repository with `git clone --recurse-submodules https://github.com/Akebi-Group/Akebi-GC.git` -1. Open `Akebi-GC/akebi-gc.sln` -1. Build solution `akebi-gc.sln`. - ## Stable Release -1. Head over to the releases page -1. Download the latest binaries +1. Head over to the [releases page](https://github.com/Akebi-Group/Akebi-GC/releases) +2. Download the latest binaries ## Latest Release -1. Head over to the [action](https://github.com/Akebi-Group/Akebi-GC/actions) page +1. Head over to the [Action](https://github.com/Akebi-Group/Akebi-GC/actions) page 1. Click Publish workflow 1. Select most recent workflow with green checkmark ✔ (Choose your client version **GLOBAL/CN/BETA**)

@@ -40,24 +32,16 @@ As well as setting up **`cheat-library`** as startup project.

- -### Requirements -- [Visual C++ Redistributable packages for Visual Studio 2015-2022](https://aka.ms/vs/17/release/vc_redist.x64.exe) (x64) -- [Visual C++ Redistributable packages for Visual Studio 2015-2022](https://aka.ms/vs/17/release/vc_redist.x86.exe) (x86) +## Building from source +Check our wiki - [Building](https://github.com/Akebi-Group/Akebi-GC/wiki/Building%EF%BD%9C%E5%BB%BA%E7%BD%AE) ### Usage -(1-2 are optional if you didn't build from source) -1. Open `/bin` -1. Open Compiled version (debug, release) - - 1. Ensure that `CLibrary.dll` is in the same folder that `injector.exe`. -1. Run `injector.exe`. -1. After the login page appeared, press F1 to open Akebi GUI. +2. Run `injector.exe`. +3. After the login page appeared, press F1 to open Akebi GUI.

Features

- #### General - Protection Bypass - In-Game GUI @@ -117,7 +101,6 @@ As well as setting up **`cheat-library`** as startup project. - FPS Graph - [Packet Sniffer](https://github.com/Akebi-Group/Akebi-PacketSniffer) -

Demo

@@ -146,37 +129,26 @@ As well as setting up **`cheat-library`** as startup project.

Bugs

+ Welcome to the short explanation for bug reporting 1. You found a bug. 1. Write down what happened, as well as your first thoughts on what you think caused it. 1. Can it be reproduced? Yes or no. If yes: Explain in as much clear as possible. i.e what happens when the bug occurs and why it occurs. 1. Tell us which version you are using. copy the `SHA`/ Version Number of the latest commit when you built the mod. For example: `bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7 - -## Bug reporting template -
- -### Ex. -I found a bug in the feature `enemy vacuum`. -I think it's caused by the filter functions that are defined in `someFeature.cpp`. - -``` -Date Occured: 5/3/2022 -Is it reproducible: Occasionally -Latest Commit used: bd17a00ec388f3b93624280cde9e1c66e740edf9 -Release Version: 0.7 -``` +1. [Open an Issue(there's a template!)](https://github.com/Akebi-Group/Akebi-GC/issues)

Contributing

+ ## Adding a feature 1. Fork the Project 1. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) 1. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) 1. Push to the Branch (`git push origin feature/AmazingFeature`) -1. Open a Pull Request +2. [Open a Pull Request](https://github.com/Akebi-Group/Akebi-GC/pulls) ## Suggestions -Open an issue with the title of the suggestion you want to make. -In the description, make sure it is descriptive enough so our devs can understand what you want and how you want it. +Open an [issue](https://github.com/Akebi-Group/Akebi-GC/issues) with the title of the suggestion you want to make. +In the description, make sure it is **descriptive enough** so our devs can understand what you want and how you want it. \ No newline at end of file diff --git a/README_zh-Hans.md b/README_zh-Hans.md index c2f936d..c5eeda3 100644 --- a/README_zh-Hans.md +++ b/README_zh-Hans.md @@ -16,22 +16,14 @@

入门教程

-## 编译 -推荐使用 [Visual Studio 2022.](https://visualstudio.microsoft.com/),同时以**`cheat-library`**作为启动项目。 -**下面是一种推荐编译方式,当然也可以使用其他任何你喜欢的方式** - -1. 使用 `git clone --recurse-submodules https://github.com/Akebi-Group/Akebi-GC.git` 命令来下载本仓库 -1. 打开 `Akebi-GC/akebi-gc.sln` -1. 编译解决方案(默认Ctrl+Shift+B) `akebi-gc.sln`。 - ## 稳定版本 1. 前往[Releases](https://github.com/Akebi-Group/Akebi-GC/releases)頁面 1. 下载最新的版本 ## 最新版本 -1. 前往 [action](https://github.com/Akebi-Group/Akebi-GC/actions) 介面 +1. 前往[Action](https://github.com/Akebi-Group/Akebi-GC/actions)介面 1. 选择[Publish](https://github.com/Akebi-Group/Akebi-GC/actions/workflows/main.yml)工作流程 -1. 选择最近带有绿色对号(:heavy_check_mark:)的工作流程(注意选择自己所在服务器的版本 **GLOBAL/CN/BETA**)。 +1. 选择最近带有绿色对号(:heavy_check_mark:)的工作流程(注意选择自己客户端的版本 **GLOBAL:国际服/CN:国服/BETA:测试服**)。

@@ -40,22 +32,16 @@

- -### 需要依赖 -- [Visual C++ Redistributable packages for Visual Studio 2015-2022](https://aka.ms/vs/17/release/vc_redist.x64.exe) (x64) -- [Visual C++ Redistributable packages for Visual Studio 2015-2022](https://aka.ms/vs/17/release/vc_redist.x86.exe) (x86) +## 自行编译 +请查看wiki - [Building](https://github.com/Akebi-Group/Akebi-GC/wiki/Building%EF%BD%9C%E5%BB%BA%E7%BD%AE) ### 使用方法 -(如果不是从源码自己构建的话,无视步骤`1`跟`2`。) -1. 打开 `/bin` -1. 打开已经编译好的版本文件夹(debug, release) 1. 确认 `CLibrary.dll` 跟 `injector.exe` 处在同一个文件夹内。 -1. 运行 `injector.exe`. -1. 等到登录界面出现,按`F1`键打开`Akebi GUI`。 +2. 运行 `injector.exe`. +3. 等到登录界面出现,按`F1`键打开`Akebi GUI`。

功能简介

- #### 通用 - 过检测 - 游戏内界面 @@ -115,7 +101,6 @@ - FPS曲线图 - [抓包工具](https://github.com/Akebi-Group/Akebi-PacketSniffer) -

功能演示

@@ -143,28 +128,15 @@
-

Bugs

+ 欢迎阅读如何提交`BUG`报告 1. 发现了一个`bug`。 -1. 记下问题出现时发生了什么,以及你认为这是由于什么造成的。 -1. 可以复现吗?可以或不可以。如果可以:尽可能的描述清楚问题发生时,发生了什么,开启了什么功能以及最可能的原因是什么。 ~~如果不可以:**就别报告了,建议重启**。~~ -1. 告诉我们你使用的是哪一个版本。复制你编译的最新的提交的`SHA`或者版本号。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7 - -## **错误报告模板** - - -### 模板(最好使用英文) -I found a bug in the feature `enemy vacuum`. -I think it's caused by the filter functions that are defined in `someFeature.cpp`. - -``` -Date Occured: 5/3/2022 -Is it reproducible: Occasionally -Latest Commit used: bd17a00ec388f3b93624280cde9e1c66e740edf9 -Release Version: 0.7 -``` +2. 记下问题出现时发生了什么,以及你认为这是由于什么造成的。 +3. 可以复现吗?可以或不可以。如果可以:尽可能的描述清楚问题发生时,发生了什么,开启了什么功能以及最可能的原因是什么。 ~~如果不可以:**就别报告了,建议重启**。~~ +4. 告诉我们你使用的是哪一个版本。复制你编译的最新的提交的`SHA`或者版本号。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7 +5. [使用英文打开一个Issue(有提供模板!)](https://github.com/Akebi-Group/Akebi-GC/issues)

提交贡献

@@ -173,8 +145,9 @@ Release Version: 0.7 1. 创建一个新的功能分支(`git checkout -b feature/AmazingFeature`) 1. 提交更改(`git commit -m 'Add some AmazingFeature'`) 1. 推送(Push)更改到分支(`git push origin feature/AmazingFeature`) -1. 打开 Pull Request 并提交 +2. [打开 Pull Request 并提交](https://github.com/Akebi-Group/Akebi-GC/pulls) ## 建议 -新建一个Issue,标题写上你的建议,并且在描述里面,清晰的写下你的建议描述,以便我们的开发人员可以理解你的建议 +用英文新建一个[Issue](https://github.com/Akebi-Group/Akebi-GC/issues)。 +标题写上你的建议,并且在描述里面,**清晰的**写下你的建议描述,以便我们的开发人员可以理解你的建议。 \ No newline at end of file diff --git a/README_zh-Hant.md b/README_zh-Hant.md index 83e2316..f1b4b6d 100644 --- a/README_zh-Hant.md +++ b/README_zh-Hant.md @@ -16,22 +16,14 @@

入門指南

-## 編譯 -建議使用 [Visual Studio 2022.](https://visualstudio.microsoft.com/) -以及建立**`cheat-library`**作為啟動專案。 -**以下是一個推薦的編譯方式,但也可以使用其他辦法。** -1. 利用 `git clone --recurse-submodules https://github.com/Akebi-Group/Akebi-GC.git` 來下載存儲庫 -1. 開啟 `Akebi-GC/akebi-gc.sln` -1. 編譯解決方案 `akebi-gc.sln`。 - ## 穩定版本 1. 前往[Releases](https://github.com/Akebi-Group/Akebi-GC/releases)頁面 1. 下載最新的版本 ## 最新版本 -1. 前往 [action](https://github.com/Akebi-Group/Akebi-GC/actions) 介面 +1. 前往[Action](https://github.com/Akebi-Group/Akebi-GC/actions)介面 1. 點選[Publish](https://github.com/Akebi-Group/Akebi-GC/actions/workflows/main.yml)工作流程 -1. 選擇帶有綠色複選標記的最新工作流程 :heavy_check_mark: (選擇您的客戶端版本 **GLOBAL/CN/BETA**)。 +1. 選擇帶有綠色複選標記的最新工作流程 :heavy_check_mark: (選擇您的客戶端版本 **GLOBAL:國際服/CN:國服/BETA:測試服**)。

@@ -40,24 +32,16 @@

- -### 依賴 -- [適用於Visual Studio 的Visual C++ 可轉散發套件2015-2022](https://aka.ms/vs/17/release/vc_redist.x64.exe) (x64) -- [適用於Visual Studio 的Visual C++ 可轉散發套件2015-2022](https://aka.ms/vs/17/release/vc_redist.x86.exe) (x86) +## 自行編譯 +請查看wiki - [Building](https://github.com/Akebi-Group/Akebi-GC/wiki/Building%EF%BD%9C%E5%BB%BA%E7%BD%AE) ### 使用方法 -(如果你不是從原始碼構建的話,您可以跳過步驟1-2。) -1. 開啟 `/bin` -1. 開啟已編譯版本(debug, release) - - 1. 確保 `CLibrary.dll` 跟 `injector.exe` 在同一個資料夾裡面。 -1. 執行 `injector.exe`. -1. 等到登錄界面出現後,按下F1來打開Akebi介面。 +2. 執行 `injector.exe`. +3. 等到登錄界面出現後,按下`F1`來打開Akebi介面。

功能簡介

- #### 一般 - 繞過防作弊機制 - 遊戲內介面 @@ -117,7 +101,6 @@ - FPS曲線圖 - [抓包工具](https://github.com/Akebi-Group/Akebi-PacketSniffer) -

功能演示

@@ -146,37 +129,25 @@

Bugs

+ 歡迎閱讀關於錯誤報告(Bug reporting)的簡短解釋! 1. 您發現了一個錯誤。 -1. 把接下來發生的事情記錄下來,以及你認為造成這種情況的第一想法。 -1. 它可以被重現嗎?可以或不可以。如果可以:盡可能清楚地解釋清楚,當錯誤發生時,會發生什麼,為什麼會發生。 ~~如果不可以:無須報告,建議求佛。~~ -1. 告訴我們你使用的是哪個版本。複製你建立mod時的最新提交的SHA Hash/版本號。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7 - -## 錯誤報告範本 -
- -### 範例(建議使用英文) -I found a bug in the feature `enemy vacuum`. -I think it's caused by the filter functions that are defined in `someFeature.cpp`. - -``` -Date Occured: 5/3/2022 -Is it reproducible: Occasionally -Latest Commit used: bd17a00ec388f3b93624280cde9e1c66e740edf9 -Release Version: 0.7 -``` +2. 把接下來發生的事情記錄下來,以及你認為造成這種情況的第一想法。 +3. 它可以被重現嗎?可以或不可以。如果可以:盡可能清楚地解釋清楚,當錯誤發生時,會發生什麼,為什麼會發生。 ~~如果不可以:無須報告,建議求佛。我們不會通靈。~~ +4. 告訴我們你使用的是哪個版本。複製你建立mod時的最新提交的SHA Hash/版本號。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7 +5. [使用英文開啟一個Issue(有提供模板!)](https://github.com/Akebi-Group/Akebi-GC/issues)

社群貢獻

## 增加一個功能 -1. 建立新的分支 +1. 建立新的分支(Fork) 1. 創建你的功能分支(`git checkout -b feature/AmazingFeature`) 1. 提交您的更改(`git commit -m 'Add some AmazingFeature'`) 1. 上傳(Push)到分支(`git push origin feature/AmazingFeature`) -1. 開啟一個 Pull Request +1. [開啟一個 Pull Request](https://github.com/Akebi-Group/Akebi-GC/pulls) ## 建議 -用你想提出的建議的東西開一個問題(Issues)。 -在描述中,確保它有足夠的描述性,以便我們的開發人員能夠理解你想要什麼以及你想要怎樣。 +用英文開一個問題([Issue](https://github.com/Akebi-Group/Akebi-GC/issues))。 +在描述中,確保內容**足夠清楚**,以便我們的開發人員能夠理解,你想要什麼以及你想要怎樣。 \ No newline at end of file diff --git a/cheat-base/src/cheat-base/cheat/CheatManagerBase.cpp b/cheat-base/src/cheat-base/cheat/CheatManagerBase.cpp index 7ac7489..719bb54 100644 --- a/cheat-base/src/cheat-base/cheat/CheatManagerBase.cpp +++ b/cheat-base/src/cheat-base/cheat/CheatManagerBase.cpp @@ -303,9 +303,9 @@ namespace cheat feature->DrawStatus(); - ImU32 row_bg_color = ImGui::GetColorU32( - ImVec4(0.2f + row * 0.1f, 0.1f + row * 0.05f, 0.1f + row * 0.03f, 0.85f)); - ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, row_bg_color); + //ImU32 row_bg_color = ImGui::GetColorU32( + // ImVec4(0.2f + row * 0.1f, 0.1f + row * 0.05f, 0.1f + row * 0.03f, 0.85f)); + //ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, row_bg_color); row++; } } @@ -332,9 +332,9 @@ namespace cheat if (!showAny && !settings.f_StatusMove) return; - ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.04f, 0.05f, 0.05f, 0.90f)); + //ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.04f, 0.05f, 0.05f, 0.90f)); ImGui::Begin("Info window", nullptr, flags); - ImGui::PopStyleColor(); + //ImGui::PopStyleColor(); if (!showAny) { @@ -347,14 +347,14 @@ namespace cheat { auto& sections = m_FeatureMap[moduleName]; bool moduleShowAny = std::any_of(sections.begin(), sections.end(), - [](const auto& iter) - { - return std::any_of(iter.second.begin(), iter.second.end(), - [](const auto feat) - { - return feat->NeedInfoDraw(); - }); - } + [](const auto& iter) + { + return std::any_of(iter.second.begin(), iter.second.end(), + [](const auto feat) + { + return feat->NeedInfoDraw(); + }); + } ); if (!moduleShowAny) continue; diff --git a/cheat-base/src/cheat-base/cheat/misc/Settings.cpp b/cheat-base/src/cheat-base/cheat/misc/Settings.cpp index fff9213..b875a0d 100644 --- a/cheat-base/src/cheat-base/cheat/misc/Settings.cpp +++ b/cheat-base/src/cheat-base/cheat/misc/Settings.cpp @@ -34,29 +34,14 @@ namespace cheat::feature NF(f_FastExitEnable, "Fast Exit", "General::FastExit", false), NF(f_HotkeyExit, "Hotkeys", "General::FastExit", Hotkey(VK_F12)), - NF(f_FontSize, "Font Size", "General", 16.0f), - NF(f_ShowStyleEditor, "Show Colors Customization", "General", false), - NFS(f_DefaultTheme, "Theme", "General::Colors", "Default"), + NF(f_FontSize, "Font Size", "General::Theme", 16.0f), + NF(f_ShowStyleEditor, "Show Colors Customization", "General::Theme", false), + NFS(f_DefaultTheme, "Theme", "General::Theme", ""), themesDir(util::GetCurrentPath() / "themes") { renderer::SetGlobalFontSize(static_cast(f_FontSize)); f_HotkeyExit.value().PressedEvent += MY_METHOD_HANDLER(Settings::OnExitKeyPressed); - if (!std::filesystem::exists(themesDir)) - std::filesystem::create_directory(themesDir); - - } - - bool inited = false; - void Settings::Init() { - if (this->f_DefaultTheme.value() != "Default" && !inited) - { - LOG_INFO("Loading theme: %s", themesDir / (f_DefaultTheme.value() + ".json").c_str()); - if (!std::filesystem::exists(themesDir / (f_DefaultTheme.value() + ".json"))) - f_DefaultTheme = "Default"; - else Colors_Import(f_DefaultTheme.value()); - inited = true; - } } const FeatureGUIInfo& Settings::GetGUIInfo() const @@ -65,33 +50,345 @@ namespace cheat::feature return info; } - void Settings::Colors_Export(std::string name) + ImVec4 HexToColor(std::string hexString) { - ImGuiStyle& style = ImGui::GetStyle(); - auto colors = style.Colors; - - nlohmann::json json; - for (int i = 0; i < ImGuiCol_COUNT; i++) - json[ImGui::GetStyleColorName((ImGuiCol)i)] = { colors[i].x, colors[i].y, colors[i].z, colors[i].w }; - std::ofstream file(themesDir / (name + ".json")); - file << std::setw(4) << json << std::endl; + int r, g, b, a; + sscanf_s(hexString.c_str(), "%02x%02x%02x%02x", &r, &g, &b, &a); + ImVec4 color{ (float(r) / 255), (float(g) / 255), (float(b) / 255), (float(a) / 255) }; + return color; } - void Settings::Colors_Import(std::string name) + std::string ColorToHex(ImVec4& color) + { + char hex[16]; + snprintf(hex, sizeof(hex), "%02x%02x%02x%02x", + static_cast(ceil(color.x * 255)), + static_cast(ceil(color.y * 255)), + static_cast(ceil(color.z * 255)), + static_cast(ceil(color.w * 255)) + ); + for (int i = 0; i < 16; i++) + hex[i] = toupper(hex[i]); + return hex; + } + + static void DefaultTheme() + { + auto& styles = ImGui::GetStyle(); + + // Colors + auto colors = styles.Colors; + colors[ImGuiCol_Border] = HexToColor("26383FFF"); + colors[ImGuiCol_BorderShadow] = HexToColor("33333300"); + colors[ImGuiCol_Button] = HexToColor("23303DFF"); + colors[ImGuiCol_ButtonActive] = HexToColor("474968FF"); + colors[ImGuiCol_ButtonHovered] = HexToColor("444C70FF"); + colors[ImGuiCol_CheckMark] = HexToColor("A5BCDBFF"); + colors[ImGuiCol_ChildBg] = HexToColor("1E262BFF"); + colors[ImGuiCol_DockingEmptyBg] = HexToColor("333333FF"); + colors[ImGuiCol_DockingPreview] = HexToColor("4296F9B2"); + colors[ImGuiCol_DragDropTarget] = HexToColor("FFFF00E5"); + colors[ImGuiCol_FrameBg] = HexToColor("2D3F44FF"); + colors[ImGuiCol_FrameBgActive] = HexToColor("30383DFF"); + colors[ImGuiCol_FrameBgHovered] = HexToColor("26303DFF"); + colors[ImGuiCol_Header] = HexToColor("0000003D"); + colors[ImGuiCol_HeaderActive] = HexToColor("0070EAFF"); + colors[ImGuiCol_HeaderHovered] = HexToColor("1E2833CC"); + colors[ImGuiCol_MenuBarBg] = HexToColor("1E232DFF"); + colors[ImGuiCol_ModalWindowDimBg] = HexToColor("CCCCCC59"); + colors[ImGuiCol_NavHighlight] = HexToColor("4296F9FF"); + colors[ImGuiCol_NavWindowingDimBg] = HexToColor("CCCCCC33"); + colors[ImGuiCol_NavWindowingHighlight] = HexToColor("FFFFFFB2"); + colors[ImGuiCol_PlotHistogram] = HexToColor("E5B200FF"); + colors[ImGuiCol_PlotHistogramHovered] = HexToColor("FF9900FF"); + colors[ImGuiCol_PlotLines] = HexToColor("9B9B9BFF"); + colors[ImGuiCol_PlotLinesHovered] = HexToColor("FF6D59FF"); + colors[ImGuiCol_PopupBg] = HexToColor("14161CEF"); + colors[ImGuiCol_ResizeGrip] = HexToColor("A3C9F93F"); + colors[ImGuiCol_ResizeGripActive] = HexToColor("6D8CB2F2"); + colors[ImGuiCol_ResizeGripHovered] = HexToColor("A5BFDDAA"); + colors[ImGuiCol_ScrollbarBg] = HexToColor("1C1C1C63"); + colors[ImGuiCol_ScrollbarGrab] = HexToColor("875E5EFF"); + colors[ImGuiCol_ScrollbarGrabActive] = HexToColor("8E1919FF"); + colors[ImGuiCol_ScrollbarGrabHovered] = HexToColor("7C3A3AFF"); + colors[ImGuiCol_Separator] = HexToColor("333F49FF"); + colors[ImGuiCol_SeparatorActive] = HexToColor("6B91BFFF"); + colors[ImGuiCol_SeparatorHovered] = HexToColor("4F7299C6"); + colors[ImGuiCol_SliderGrab] = HexToColor("5977ADFF"); + colors[ImGuiCol_SliderGrabActive] = HexToColor("ADCCFFFF"); + colors[ImGuiCol_Tab] = HexToColor("1C262BFF"); + colors[ImGuiCol_TabActive] = HexToColor("333F49FF"); + colors[ImGuiCol_TabHovered] = HexToColor("969696CC"); + colors[ImGuiCol_TabUnfocused] = HexToColor("1C262BFF"); + colors[ImGuiCol_TabUnfocusedActive] = HexToColor("1C262BFF"); + colors[ImGuiCol_TableBorderLight] = HexToColor("3A3A3FFF"); + colors[ImGuiCol_TableBorderStrong] = HexToColor("4F4F59FF"); + colors[ImGuiCol_TableHeaderBg] = HexToColor("303033FF"); + colors[ImGuiCol_TableRowBg] = HexToColor("333F49FF"); + colors[ImGuiCol_TableRowBgAlt] = HexToColor("1C262BFF"); + colors[ImGuiCol_Text] = HexToColor("F2F4F9FF"); + colors[ImGuiCol_TextDisabled] = HexToColor("2B353DFF"); + colors[ImGuiCol_TextSelectedBg] = HexToColor("4296F959"); + colors[ImGuiCol_TitleBg] = HexToColor("232D38A5"); + colors[ImGuiCol_TitleBgActive] = HexToColor("212830FF"); + colors[ImGuiCol_TitleBgCollapsed] = HexToColor("26262682"); + colors[ImGuiCol_WindowBg] = HexToColor("1E2623FF"); + + //Styles + styles.Alpha = 1.0; + styles.AntiAliasedFill = true; + styles.AntiAliasedLines = true; + styles.AntiAliasedLinesUseTex = true; + styles.ButtonTextAlign = ImVec2(0.5, 0.5); + styles.CellPadding = ImVec2(4.0, 2.0); + styles.ChildBorderSize = 1.0; + styles.ChildRounding = 5.0; + styles.CircleTessellationMaxError = 0.30000001192092896; + styles.ColorButtonPosition = 1; + styles.ColumnsMinSpacing = 6.0; + styles.CurveTessellationTol = 1.25; + styles.DisabledAlpha = 0.6000000238418579; + styles.DisplaySafeAreaPadding = ImVec2(3.0, 3.0); + styles.DisplayWindowPadding = ImVec2(19.0, 19.0); + styles.FrameBorderSize = 0.0; + styles.FramePadding = ImVec2(4.0, 3.0); + styles.FrameRounding = 4.0; + styles.GrabMinSize = 10.0; + styles.GrabRounding = 4.0; + styles.IndentSpacing = 21.0; + styles.ItemInnerSpacing = ImVec2(4.0, 4.0); + styles.ItemSpacing = ImVec2(8.0, 4.0); + styles.LogSliderDeadzone = 4.0; + styles.MouseCursorScale = 1.0; + styles.PopupBorderSize = 1.0; + styles.PopupRounding = 0.0; + styles.ScrollbarRounding = 9.0; + styles.ScrollbarSize = 14.0; + styles.SelectableTextAlign = ImVec2(0.0, 0.0); + styles.TabBorderSize = 0.0; + styles.TabMinWidthForCloseButton = 0.0; + styles.TabRounding = 4.0; + styles.TouchExtraPadding = ImVec2(0.0, 0.0); + styles.WindowBorderSize = 1.0; + styles.WindowMenuButtonPosition = 0; + styles.WindowMinSize = ImVec2(32.0, 32.0); + styles.WindowPadding = ImVec2(8.0, 8.0); + styles.WindowRounding = 0.0; + styles.WindowTitleAlign = ImVec2(0.0, 0.5); + } + + bool hasLoaded = false; + void Settings::Init() { + if (hasLoaded) + return; + + if (!std::filesystem::exists(themesDir)) + std::filesystem::create_directory(themesDir); + else + { + m_Themes.clear(); + for (const auto& file : std::filesystem::directory_iterator(themesDir)) + if (std::filesystem::path(file).extension() == ".json") + ThemeImport(file); + } + + if (m_Themes.count(f_DefaultTheme.value()) > 0) + ApplyTheme(f_DefaultTheme.value()); + else + DefaultTheme(); + + hasLoaded = true; + } + + bool IsThemeOldFormat(nlohmann::json data) + { + if (data.count("Colors") > 0 && data.count("Styles") > 0) + return false; + + return true; + } + + void Settings::ThemeImport(std::filesystem::directory_entry file) + { + nlohmann::json data; + std::ifstream fs(file.path()); + fs >> data; + + Theme theme; + auto themeName = std::filesystem::path(file).stem().string(); + bool isOldFormat = IsThemeOldFormat(data); + + if (isOldFormat) + { + for (auto& [colorName, colorValue] : data.items()) + { + ImVec4 color{}; + color.x = colorValue[0].get(); + color.y = colorValue[1].get(); + color.z = colorValue[2].get(); + color.w = colorValue[3].get(); + + theme.colors.insert({ colorName, color }); + } + } + else + { + for (auto& [colorName, colorValue] : data["Colors"].items()) + theme.colors.insert({ colorName, HexToColor(colorValue) }); + + for (auto& [styleName, styleValue] : data["Styles"].items()) + { + if(styleValue.is_array()) + theme.styles.insert({ styleName, ImVec2(styleValue.at(0), styleValue.at(1)) }); + else if (styleValue.is_number_integer()) + theme.styles.insert({ styleName, styleValue.get() }); + else if(styleValue.is_boolean()) + theme.styles.insert({ styleName, styleValue.get() }); + else + theme.styles.insert({ styleName, styleValue.get() }); + } + } + + m_Themes.insert({ themeName, theme }); + + // Convert old format to new format + if(isOldFormat) + ThemeExport(themeName, true); + } + + nlohmann::json GetCurrentStyles(ImGuiStyle& style) + { + nlohmann::json stylesData; + stylesData["Alpha"] = style.Alpha; + stylesData["DisabledAlpha"] = style.DisabledAlpha; + stylesData["WindowPadding"] = { style.WindowPadding.x, style.WindowPadding.y }; + stylesData["WindowRounding"] = style.WindowRounding; + stylesData["WindowBorderSize"] = style.WindowBorderSize; + stylesData["WindowMinSize"] = { style.WindowMinSize.x, style.WindowMinSize.y }; + stylesData["WindowTitleAlign"] = { style.WindowTitleAlign.x, style.WindowTitleAlign.y }; + stylesData["WindowMenuButtonPosition"] = style.WindowMenuButtonPosition; + stylesData["ChildRounding"] = style.ChildRounding; + stylesData["ChildBorderSize"] = style.ChildBorderSize; + stylesData["PopupRounding"] = style.PopupRounding; + stylesData["PopupBorderSize"] = style.PopupBorderSize; + stylesData["FramePadding"] = { style.FramePadding.x, style.FramePadding.y }; + stylesData["FrameRounding"] = style.FrameRounding; + stylesData["FrameBorderSize"] = style.FrameBorderSize; + stylesData["ItemSpacing"] = { style.ItemSpacing.x, style.ItemSpacing.y }; + stylesData["ItemInnerSpacing"] = { style.ItemInnerSpacing.x,style.ItemInnerSpacing.y }; + stylesData["CellPadding"] = { style.CellPadding.x, style.CellPadding.y }; + stylesData["TouchExtraPadding"] = { style.TouchExtraPadding.x, style.TouchExtraPadding.y }; + stylesData["IndentSpacing"] = style.IndentSpacing; + stylesData["ColumnsMinSpacing"] = style.ColumnsMinSpacing; + stylesData["ScrollbarSize"] = style.ScrollbarSize; + stylesData["ScrollbarRounding"] = style.ScrollbarRounding; + stylesData["GrabMinSize"] = style.GrabMinSize; + stylesData["GrabRounding"] = style.GrabRounding; + stylesData["LogSliderDeadzone"] = style.LogSliderDeadzone; + stylesData["TabRounding"] = style.TabRounding; + stylesData["TabBorderSize"] = style.TabBorderSize; + stylesData["TabMinWidthForCloseButton"] = style.TabMinWidthForCloseButton; + stylesData["ColorButtonPosition"] = style.ColorButtonPosition; + stylesData["ButtonTextAlign"] = { style.ButtonTextAlign.x, style.ButtonTextAlign.y }; + stylesData["SelectableTextAlign"] = { style.SelectableTextAlign.x, style.SelectableTextAlign.y }; + stylesData["DisplayWindowPadding"] = { style.DisplayWindowPadding.x, style.DisplayWindowPadding.y }; + stylesData["DisplaySafeAreaPadding"] = { style.DisplaySafeAreaPadding.x, style.DisplaySafeAreaPadding.y }; + stylesData["MouseCursorScale"] = style.MouseCursorScale; + stylesData["AntiAliasedLines"] = style.AntiAliasedLines; + stylesData["AntiAliasedLinesUseTex"] = style.AntiAliasedLinesUseTex; + stylesData["AntiAliasedFill"] = style.AntiAliasedFill; + stylesData["CurveTessellationTol"] = style.CurveTessellationTol; + stylesData["CircleTessellationMaxError"] = style.CircleTessellationMaxError; + return stylesData; + } + + void Settings::ThemeExport(std::string name, bool replace) + { + ImGuiStyle& style = ImGui::GetStyle(); + nlohmann::json data; + if (replace) + for (auto& [colorName, colorValue] : m_Themes[name].colors) + data["Colors"][colorName] = ColorToHex(colorValue); + + else { + auto colors = style.Colors; + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + auto colorName = ImGui::GetStyleColorName((ImGuiCol)i); + data["Colors"][colorName] = ColorToHex(colors[i]); + } + } + + data["Styles"] = GetCurrentStyles(style); + + std::ofstream file(themesDir / (name + ".json")); + file << std::setw(4) << data << std::endl; + } + + void Settings::ApplyTheme(std::string name) { ImGuiStyle& style = ImGui::GetStyle(); auto colors = style.Colors; - nlohmann::json json; - std::ifstream file(themesDir / (name + ".json")); - file >> json; - for (int i = 0; i < ImGuiCol_COUNT; i++) - { - auto color = json[ImGui::GetStyleColorName((ImGuiCol)i)]; - colors[i].x = color[0]; - colors[i].y = color[1]; - colors[i].z = color[2]; - colors[i].w = color[3]; + auto& theme = m_Themes[name]; + + // Applying Colors + if (!theme.colors.empty()) { + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + auto& themeColor = theme.colors[ImGui::GetStyleColorName((ImGuiCol)i)]; + colors[i].x = themeColor.x; + colors[i].y = themeColor.y; + colors[i].z = themeColor.z; + colors[i].w = themeColor.w; + } } + + if (!theme.styles.empty()) + { + // Applying Styles + style.Alpha = std::any_cast(theme.styles["Alpha"]); + style.DisabledAlpha = std::any_cast(theme.styles["DisabledAlpha"]); + style.WindowPadding = std::any_cast(theme.styles["WindowPadding"]); + style.WindowRounding = std::any_cast(theme.styles["WindowRounding"]); + style.WindowBorderSize = std::any_cast(theme.styles["WindowBorderSize"]); + style.WindowMinSize = std::any_cast(theme.styles["WindowMinSize"]); + style.WindowTitleAlign = std::any_cast(theme.styles["WindowTitleAlign"]); + style.WindowMenuButtonPosition = ImGuiDir(std::any_cast(theme.styles["WindowMenuButtonPosition"])); + style.ChildRounding = std::any_cast(theme.styles["ChildRounding"]); + style.ChildBorderSize = std::any_cast(theme.styles["ChildBorderSize"]); + style.PopupRounding = std::any_cast(theme.styles["PopupRounding"]); + style.PopupBorderSize = std::any_cast(theme.styles["PopupBorderSize"]); + style.FramePadding = std::any_cast(theme.styles["FramePadding"]); + style.FrameRounding = std::any_cast(theme.styles["FrameRounding"]); + style.FrameBorderSize = std::any_cast(theme.styles["FrameBorderSize"]); + style.ItemSpacing = std::any_cast(theme.styles["ItemSpacing"]); + style.ItemInnerSpacing = std::any_cast(theme.styles["ItemInnerSpacing"]); + style.CellPadding = std::any_cast(theme.styles["CellPadding"]); + style.TouchExtraPadding = std::any_cast(theme.styles["TouchExtraPadding"]); + style.IndentSpacing = std::any_cast(theme.styles["IndentSpacing"]); + style.ColumnsMinSpacing = std::any_cast(theme.styles["ColumnsMinSpacing"]); + style.ScrollbarSize = std::any_cast(theme.styles["ScrollbarSize"]); + style.ScrollbarRounding = std::any_cast(theme.styles["ScrollbarRounding"]); + style.GrabMinSize = std::any_cast(theme.styles["GrabMinSize"]); + style.GrabRounding = std::any_cast(theme.styles["GrabRounding"]); + style.LogSliderDeadzone = std::any_cast(theme.styles["LogSliderDeadzone"]); + style.TabRounding = std::any_cast(theme.styles["TabRounding"]); + style.TabBorderSize = std::any_cast(theme.styles["TabBorderSize"]); + style.TabMinWidthForCloseButton = std::any_cast(theme.styles["TabMinWidthForCloseButton"]); + style.ColorButtonPosition = ImGuiDir(std::any_cast(theme.styles["ColorButtonPosition"])); + style.ButtonTextAlign = std::any_cast(theme.styles["ButtonTextAlign"]); + style.SelectableTextAlign = std::any_cast(theme.styles["SelectableTextAlign"]); + style.DisplayWindowPadding = std::any_cast(theme.styles["DisplayWindowPadding"]); + style.DisplaySafeAreaPadding = std::any_cast(theme.styles["DisplaySafeAreaPadding"]); + style.MouseCursorScale = std::any_cast(theme.styles["MouseCursorScale"]); + style.AntiAliasedLines = std::any_cast(theme.styles["AntiAliasedLines"]); + style.AntiAliasedLinesUseTex = std::any_cast(theme.styles["AntiAliasedLinesUseTex"]); + style.AntiAliasedFill = std::any_cast(theme.styles["AntiAliasedFill"]); + style.CurveTessellationTol = std::any_cast(theme.styles["CurveTessellationTol"]); + style.CircleTessellationMaxError = std::any_cast(theme.styles["CircleTessellationMaxError"]); + } + + LOG_INFO("Theme applied: %s", name.c_str()); } void Settings::DrawMain() @@ -172,41 +469,54 @@ namespace cheat::feature ImGui::BeginGroupPanel("Interface Customization"); { - if (ConfigWidget(f_FontSize, 1, 8, 64, "Adjust interface font size.")) + ImGui::SetNextItemWidth(200); + if (ImGui::BeginCombo("Themes", f_DefaultTheme.value().c_str())) { - f_FontSize = std::clamp(f_FontSize.value(), 8, 64); - renderer::SetGlobalFontSize(static_cast(f_FontSize)); + for (auto& [themeName, themeData] : m_Themes) + { + bool isSelected = f_DefaultTheme.value() == themeName; + if (ImGui::Selectable(themeName.c_str(), isSelected)) + { + ApplyTheme(themeName); + f_DefaultTheme = themeName; + } + + if (isSelected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); } + ImGui::SameLine(); + if (ImGui::Button("Delete Theme")) + { + std::filesystem::remove(themesDir / (f_DefaultTheme.value() + ".json")); + LOG_INFO("Deleted theme %s", f_DefaultTheme.value().c_str()); + f_DefaultTheme = ""; + hasLoaded = false; + Init(); + } + + static std::string themeNameBuffer_; + ImGui::InputText("Theme Name", &themeNameBuffer_); + + if (ConfigWidget(f_FontSize, 1, 8, 64, "Adjust interface font size.")) + renderer::SetGlobalFontSize(static_cast(f_FontSize)); + ImGui::Spacing(); ConfigWidget(f_ShowStyleEditor, "Show colors customization window."); - ImGui::Spacing(); - - ImGui::Text("Save Customized Color"); - static std::string nameBuffer_; - ImGui::InputText("Color Name", &nameBuffer_); - if (ImGui::Button("Save")) - Colors_Export(nameBuffer_); - ImGui::SameLine(); - - if (std::filesystem::exists(themesDir / (nameBuffer_ + ".json"))) + ImGui::SameLine(); + bool alreadyExist = m_Themes.count(themeNameBuffer_) > 0; + if (ImGui::Button(alreadyExist ? "Replace Theme" : "Save Theme")) { - if (this->f_DefaultTheme.value() != nameBuffer_) - { - if (ImGui::Button("Set as default")) - { - f_DefaultTheme = nameBuffer_; - } - ImGui::SameLine(); - if (ImGui::Button("Load")) - { - Colors_Import(nameBuffer_); - } - } - } - else - { - ImGui::Text("Color does not exist."); + if (themeNameBuffer_.empty()) + return; + + ThemeExport(themeNameBuffer_); + hasLoaded = false; + f_DefaultTheme = themeNameBuffer_; + Init(); + themeNameBuffer_.clear(); } } ImGui::EndGroupPanel(); diff --git a/cheat-base/src/cheat-base/cheat/misc/Settings.h b/cheat-base/src/cheat-base/cheat/misc/Settings.h index 7605b43..d96b8ab 100644 --- a/cheat-base/src/cheat-base/cheat/misc/Settings.h +++ b/cheat-base/src/cheat-base/cheat/misc/Settings.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include namespace cheat::feature { @@ -40,10 +41,16 @@ namespace cheat::feature const FeatureGUIInfo& GetGUIInfo() const override; void DrawMain() override; void Init(); - void Colors_Export(std::string name); - void Colors_Import(std::string name); private: + struct Theme{ + std::map colors; + std::map styles; + }; + std::map m_Themes; + void ThemeImport(std::filesystem::directory_entry file); + void ThemeExport(std::string name, bool replace = false); + void ApplyTheme(std::string name); void OnExitKeyPressed(); Settings(); diff --git a/cheat-base/src/cheat-base/render/renderer.cpp b/cheat-base/src/cheat-base/render/renderer.cpp index 4242c65..4233e24 100644 --- a/cheat-base/src/cheat-base/render/renderer.cpp +++ b/cheat-base/src/cheat-base/render/renderer.cpp @@ -157,7 +157,12 @@ namespace renderer _isCustomFontLoaded = true; } - static void SetupImGuiStyle(); + static void LoadImGuiStyles() + { + auto& themes = cheat::feature::Settings::GetInstance(); + themes.Init(); + } + static LRESULT CALLBACK hWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnPreRenderDX12() @@ -189,7 +194,7 @@ namespace renderer io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; LoadCustomFont(); - SetupImGuiStyle(); + LoadImGuiStyles(); //Set OriginalWndProcHandler to the Address of the Original WndProc function OriginalWndProcHandler = reinterpret_cast(SetWindowLongPtr(window, GWLP_WNDPROC, @@ -221,7 +226,7 @@ namespace renderer io.IniFilename = imguiPath.c_str(); LoadCustomFont(); - SetupImGuiStyle(); + LoadImGuiStyles(); //Set OriginalWndProcHandler to the Address of the Original WndProc function OriginalWndProcHandler = reinterpret_cast(SetWindowLongPtr(window, GWLP_WNDPROC, @@ -254,9 +259,6 @@ namespace renderer pContext->OMSetRenderTargets(1, &mainRenderTargetView, nullptr); ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); - - auto& themes = cheat::feature::Settings::GetInstance(); - themes.Init(); } static LRESULT CALLBACK hWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -306,68 +308,4 @@ namespace renderer return CallWindowProc(OriginalWndProcHandler, hWnd, uMsg, wParam, lParam); } - - - static void SetupImGuiStyle() - { - ImGui::GetStyle().FrameRounding = 4.0f; - ImGui::GetStyle().GrabRounding = 4.0f; - - ImVec4* colors = ImGui::GetStyle().Colors; - colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); - colors[ImGuiCol_WindowBg] = ImVec4(0.15f, 0.15f, 0.15f, 1.00f); - colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_PopupBg] = ImVec4(0.08f, 0.08f, 0.08f, 0.94f); - colors[ImGuiCol_Border] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f); - colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_FrameBg] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f); - colors[ImGuiCol_FrameBgHovered] = ImVec4(0.74f, 0.40f, 0.87f, 0.36f); - colors[ImGuiCol_FrameBgActive] = ImVec4(0.60f, 0.33f, 0.71f, 0.36f); - colors[ImGuiCol_TitleBg] = ImVec4(0.15f, 0.15f, 0.15f, 1.00f); - colors[ImGuiCol_TitleBgActive] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f); - colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 0.51f); - colors[ImGuiCol_MenuBarBg] = ImVec4(0.15f, 0.15f, 0.15f, 1.00f); - colors[ImGuiCol_ScrollbarBg] = ImVec4(0.02f, 0.02f, 0.02f, 0.00f); - colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f); - colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.74f, 0.40f, 0.87f, 1.00f); - colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.52f, 0.30f, 0.60f, 1.00f); - colors[ImGuiCol_CheckMark] = ImVec4(0.74f, 0.40f, 0.87f, 1.00f); - colors[ImGuiCol_SliderGrab] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f); - colors[ImGuiCol_SliderGrabActive] = ImVec4(0.52f, 0.30f, 0.60f, 1.00f); - colors[ImGuiCol_Button] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f); - colors[ImGuiCol_ButtonHovered] = ImVec4(0.74f, 0.40f, 0.87f, 1.00f); - colors[ImGuiCol_ButtonActive] = ImVec4(0.52f, 0.30f, 0.60f, 1.00f); - colors[ImGuiCol_Header] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f); - colors[ImGuiCol_HeaderHovered] = ImVec4(0.74f, 0.40f, 0.87f, 1.00f); - colors[ImGuiCol_HeaderActive] = ImVec4(0.52f, 0.30f, 0.60f, 1.00f); - colors[ImGuiCol_Separator] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f); - colors[ImGuiCol_SeparatorHovered] = ImVec4(0.28f, 0.28f, 0.28f, 1.00f); - colors[ImGuiCol_SeparatorActive] = ImVec4(0.15f, 0.15f, 0.15f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(0.60f, 0.33f, 0.71f, 0.73f); - colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.74f, 0.40f, 0.87f, 0.73f); - colors[ImGuiCol_ResizeGripActive] = ImVec4(0.52f, 0.30f, 0.60f, 0.73f); - colors[ImGuiCol_Tab] = ImVec4(0.60f, 0.33f, 0.71f, 0.36f); - colors[ImGuiCol_TabHovered] = ImVec4(0.74f, 0.40f, 0.87f, 1.00f); - colors[ImGuiCol_TabActive] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f); - colors[ImGuiCol_TabUnfocused] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f); - colors[ImGuiCol_TabUnfocusedActive] = ImVec4(0.52f, 0.30f, 0.60f, 1.00f); - colors[ImGuiCol_DockingPreview] = ImVec4(0.74f, 0.40f, 0.87f, 0.67f); - colors[ImGuiCol_DockingEmptyBg] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f); - colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f); - colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.00f, 0.83f, 1.00f); - colors[ImGuiCol_PlotHistogram] = ImVec4(0.75f, 0.00f, 0.62f, 1.00f); - colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.45f, 0.91f, 1.00f); - colors[ImGuiCol_TableHeaderBg] = ImVec4(0.19f, 0.19f, 0.20f, 1.00f); - colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.35f, 0.00f); - colors[ImGuiCol_TableBorderLight] = ImVec4(0.35f, 0.31f, 0.31f, 0.00f); - colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f); - colors[ImGuiCol_TextSelectedBg] = ImVec4(0.60f, 0.33f, 0.71f, 0.28f); - colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); - colors[ImGuiCol_NavHighlight] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f); - colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f); - colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f); - colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.35f); - } } \ No newline at end of file diff --git a/cheat-base/src/cheat-base/util.cpp b/cheat-base/src/cheat-base/util.cpp index e5a2807..99ec8be 100644 --- a/cheat-base/src/cheat-base/util.cpp +++ b/cheat-base/src/cheat-base/util.cpp @@ -17,7 +17,6 @@ namespace util { - std::string GetLastErrorAsString(DWORD errorId /*= 0*/) { //Get the error message ID, if any. diff --git a/cheat-library/cheat-library.vcxproj b/cheat-library/cheat-library.vcxproj index d235bfb..ab35046 100644 --- a/cheat-library/cheat-library.vcxproj +++ b/cheat-library/cheat-library.vcxproj @@ -234,6 +234,8 @@ + + @@ -592,6 +594,7 @@ + @@ -619,6 +622,7 @@ + @@ -662,7 +666,9 @@ + + @@ -676,6 +682,7 @@ + @@ -783,6 +790,7 @@ + @@ -821,6 +829,8 @@ + + @@ -1068,6 +1078,7 @@ + @@ -1082,6 +1093,7 @@ + @@ -1110,7 +1122,9 @@ + + @@ -1123,6 +1137,7 @@ + @@ -1193,6 +1208,7 @@ + diff --git a/cheat-library/cheat-library.vcxproj.filters b/cheat-library/cheat-library.vcxproj.filters index 461f6ab..e150ee1 100644 --- a/cheat-library/cheat-library.vcxproj.filters +++ b/cheat-library/cheat-library.vcxproj.filters @@ -3466,5 +3466,53 @@ Resource Files + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + \ No newline at end of file diff --git a/cheat-library/res/icons/AeonblightDrake.png b/cheat-library/res/icons/AeonblightDrake.png new file mode 100644 index 0000000..ea8012c Binary files /dev/null and b/cheat-library/res/icons/AeonblightDrake.png differ diff --git a/cheat-library/res/icons/Ajilenakh.png b/cheat-library/res/icons/Ajilenakh.png new file mode 100644 index 0000000..8526063 Binary files /dev/null and b/cheat-library/res/icons/Ajilenakh.png differ diff --git a/cheat-library/res/icons/PrimalConstruct.png b/cheat-library/res/icons/PrimalConstruct.png new file mode 100644 index 0000000..4142f2c Binary files /dev/null and b/cheat-library/res/icons/PrimalConstruct.png differ diff --git a/cheat-library/res/icons/Redcrest.png b/cheat-library/res/icons/Redcrest.png new file mode 100644 index 0000000..d4a3c17 Binary files /dev/null and b/cheat-library/res/icons/Redcrest.png differ diff --git a/cheat-library/res/icons/Scarab.png b/cheat-library/res/icons/Scarab.png new file mode 100644 index 0000000..cf90c26 Binary files /dev/null and b/cheat-library/res/icons/Scarab.png differ diff --git a/cheat-library/res/icons/Scorpion.png b/cheat-library/res/icons/Scorpion.png new file mode 100644 index 0000000..f0b181e Binary files /dev/null and b/cheat-library/res/icons/Scorpion.png differ diff --git a/cheat-library/res/icons/SemiPerpetualControlMatrix.png b/cheat-library/res/icons/SemiPerpetualControlMatrix.png new file mode 100644 index 0000000..73326eb Binary files /dev/null and b/cheat-library/res/icons/SemiPerpetualControlMatrix.png differ diff --git a/cheat-library/res/icons/Vulture.png b/cheat-library/res/icons/Vulture.png new file mode 100644 index 0000000..c808706 Binary files /dev/null and b/cheat-library/res/icons/Vulture.png differ diff --git a/cheat-library/res/iconsHD/AeonblightDrake.png b/cheat-library/res/iconsHD/AeonblightDrake.png new file mode 100644 index 0000000..7302b36 Binary files /dev/null and b/cheat-library/res/iconsHD/AeonblightDrake.png differ diff --git a/cheat-library/res/iconsHD/Ajilenakh.png b/cheat-library/res/iconsHD/Ajilenakh.png new file mode 100644 index 0000000..6f48a3b Binary files /dev/null and b/cheat-library/res/iconsHD/Ajilenakh.png differ diff --git a/cheat-library/res/iconsHD/PrimalConstruct.png b/cheat-library/res/iconsHD/PrimalConstruct.png new file mode 100644 index 0000000..463e432 Binary files /dev/null and b/cheat-library/res/iconsHD/PrimalConstruct.png differ diff --git a/cheat-library/res/iconsHD/Redcrest.png b/cheat-library/res/iconsHD/Redcrest.png new file mode 100644 index 0000000..ff837a5 Binary files /dev/null and b/cheat-library/res/iconsHD/Redcrest.png differ diff --git a/cheat-library/res/iconsHD/Scarab.png b/cheat-library/res/iconsHD/Scarab.png new file mode 100644 index 0000000..1308d95 Binary files /dev/null and b/cheat-library/res/iconsHD/Scarab.png differ diff --git a/cheat-library/res/iconsHD/Scorpion.png b/cheat-library/res/iconsHD/Scorpion.png new file mode 100644 index 0000000..4a94bc8 Binary files /dev/null and b/cheat-library/res/iconsHD/Scorpion.png differ diff --git a/cheat-library/res/iconsHD/SemiPerpetualControlMatrix.png b/cheat-library/res/iconsHD/SemiPerpetualControlMatrix.png new file mode 100644 index 0000000..34a1e86 Binary files /dev/null and b/cheat-library/res/iconsHD/SemiPerpetualControlMatrix.png differ diff --git a/cheat-library/res/iconsHD/Vulture.png b/cheat-library/res/iconsHD/Vulture.png new file mode 100644 index 0000000..109b37f Binary files /dev/null and b/cheat-library/res/iconsHD/Vulture.png differ diff --git a/cheat-library/res/res.rc b/cheat-library/res/res.rc index a2d774a..63edfbc 100644 --- a/cheat-library/res/res.rc +++ b/cheat-library/res/res.rc @@ -83,8 +83,12 @@ HDADHIGAMAWOOD PNG "iconsHD\\AdhigamaWood.png" HDADORNEDUNAGI PNG "iconsHD\\AdornedUnagi.png" +HDAEONBLIGHTDRAKE PNG "iconsHD\\AeonblightDrake.png" + HDAIZENMEDAKA PNG "iconsHD\\AizenMedaka.png" +HDAJILENAKH PNG "iconsHD\\Ajilenakh.png" + HDAKAIMAOU PNG "iconsHD\\AkaiMaou.png" HDAKUOUMARU PNG "iconsHD\\Akuoumaru.png" @@ -237,7 +241,7 @@ HDCINNABARSPINDLE PNG "iconsHD\\CinnabarSpindle.png" HDCLOUDLEISURESTEPS PNG "iconsHD\\CloudleisureSteps.png" -HDCLUSTERLEAFOFCULTIVATION PNG "iconsHD\\ClusterleafOfCultivation.png" +HDCLUSTERLEAFOFCULTIVATION PNG "iconsHD\\ClusterleafOfCultivation.png" HDCOLLEI PNG "iconsHD\\Collei.png" @@ -297,7 +301,7 @@ HDDARKIRONSWORD PNG "iconsHD\\DarkIronSword.png" HDDAWNCATCHER PNG "iconsHD\\Dawncatcher.png" -HDDAYNIGHTSWITCHINGMECHANISM PNG "iconsHD\\DayNightSwitchingMechanism.png" +HDDAYNIGHTSWITCHINGMECHANISM PNG "iconsHD\\DayNightSwitchingMechanism.png" HDDEATHMATCH PNG "iconsHD\\Deathmatch.png" @@ -381,7 +385,7 @@ HDEMERALDORB PNG "iconsHD\\EmeraldOrb.png" HDENDOFTHELINE PNG "iconsHD\\EndoftheLine.png" -HDENEMIESFIRSTTIMEVICTORY PNG "iconsHD\\EnemiesFirstTimeVictory.png" +HDENEMIESFIRSTTIMEVICTORY PNG "iconsHD\\EnemiesFirstTimeVictory.png" HDENGULFINGLIGHTNING PNG "iconsHD\\EngulfingLightning.png" @@ -641,7 +645,7 @@ HDLIZARDTAIL PNG "iconsHD\\LizardTail.png" HDLOACHPEARL PNG "iconsHD\\LoachPearl.png" -HDLOSTPRAYERTOTHESACREDWINDS PNG "iconsHD\\LostPrayertotheSacredWinds.png" +HDLOSTPRAYERTOTHESACREDWINDS PNG "iconsHD\\LostPrayertotheSacredWinds.png" HDLOTUSHEAD PNG "iconsHD\\LotusHead.png" @@ -659,7 +663,7 @@ HDLUMINOUSSEELIE PNG "iconsHD\\LuminousSeelie.png" HDLUNGEDSTICKLEBACK PNG "iconsHD\\LungedStickleback.png" -HDLUPUSBOREASDOMINATOROFWOLVES PNG "iconsHD\\LupusBoreasDominatorofWolves.png" +HDLUPUSBOREASDOMINATOROFWOLVES PNG "iconsHD\\LupusBoreasDominatorofWolves.png" HDLUXURIOUSCHEST PNG "iconsHD\\LuxuriousChest.png" @@ -777,7 +781,7 @@ HDPALEREDCRAB PNG "iconsHD\\PaleRedCrab.png" HDPEACHOFTHEDEEPWAVES PNG "iconsHD\\PeachoftheDeepWaves.png" -HDPERPETUALMECHANICALARRAY PNG "iconsHD\\PerpetualMechanicalArray.png" +HDPERPETUALMECHANICALARRAY PNG "iconsHD\\PerpetualMechanicalArray.png" HDPHANTASMALGATE PNG "iconsHD\\PhantasmalGate.png" @@ -807,11 +811,13 @@ HDPREDATOR PNG "iconsHD\\Predator.png" HDPRESSUREPLATE PNG "iconsHD\\PressurePlate.png" +HDPRIMALCONSTRUCT PNG "iconsHD\\PrimalConstruct.png" + HDPRIMOGEOVISHAP PNG "iconsHD\\PrimoGeovishap.png" HDPRIMORDIALJADECUTTER PNG "iconsHD\\PrimordialJadeCutter.png" -HDPRIMORDIALJADEWINGEDSPEAR PNG "iconsHD\\PrimordialJadeWingedSpear.png" +HDPRIMORDIALJADEWINGEDSPEAR PNG "iconsHD\\PrimordialJadeWingedSpear.png" HDPROTOTYPEAMBER PNG "iconsHD\\PrototypeAmber.png" @@ -861,6 +867,8 @@ HDRECIPE PNG "iconsHD\\Recipe.png" HDRECURVEBOW PNG "iconsHD\\RecurveBow.png" +HDREDCREST PNG "iconsHD\\Redcrest.png" + HDREDFINNEDUNAGI PNG "iconsHD\\RedFinnedUnagi.png" HDREDHORNEDLIZARD PNG "iconsHD\\RedHornedLizard.png" @@ -947,8 +955,12 @@ HDSAPWOODBLADE PNG "iconsHD\\SapwoodBlade.png" HDSAYU PNG "iconsHD\\Sayu.png" +HDSCARAB PNG "iconsHD\\Scarab.png" + HDSCARLETQUARTZ PNG "iconsHD\\ScarletQuartz.png" +HDSCORPION PNG "iconsHD\\Scorpion.png" + HDSEAGANODERMA PNG "iconsHD\\SeaGanoderma.png" HDSEAGRASS PNG "iconsHD\\Seagrass.png" @@ -977,6 +989,8 @@ HDSEELIECOURT PNG "iconsHD\\SeelieCourt.png" HDSEELIELAMP PNG "iconsHD\\SeelieLamp.png" +HDSEMIPERPETUALCONTROLMATRIX PNG "iconsHD\\SemiPerpetualControlMatrix.png" + HDSERPENTSPINE PNG "iconsHD\\SerpentSpine.png" HDSHADOWYHUSK PNG "iconsHD\\ShadowyHusk.png" @@ -1075,10 +1089,10 @@ HDSTRETCHYFUNGUS PNG "iconsHD\\StretchyFungus.png" HDSUCROSE PNG "iconsHD\\Sucrose.png" -HDSUMERUROSE PNG "iconsHD\\SumeruRose.png" - HDSUMERUPUZZLES PNG "iconsHD\\SumeruPuzzles.png" +HDSUMERUROSE PNG "iconsHD\\SumeruRose.png" + HDSUMERUSHRINEOFDEPTHS PNG "iconsHD\\SumeruShrineofDepths.png" HDSUMMITSHAPER PNG "iconsHD\\SummitShaper.png" @@ -1139,7 +1153,7 @@ HDTHOMA PNG "iconsHD\\Thoma.png" HDTHREEBOXES PNG "iconsHD\\ThreeBoxes.png" -HDTHRILLINGTALESOFDRAGONSLAYERS PNG "iconsHD\\ThrillingTalesofDragonSlayers.png" +HDTHRILLINGTALESOFDRAGONSLAYERS PNG "iconsHD\\ThrillingTalesofDragonSlayers.png" HDTHUNDERINGPULSE PNG "iconsHD\\ThunderingPulse.png" @@ -1189,13 +1203,15 @@ HDVIPARYAS PNG "iconsHD\\Viparyas.png" HDVORTEXVANQUISHER PNG "iconsHD\\VortexVanquisher.png" +HDVULTURE PNG "iconsHD\\Vulture.png" + HDWARMINGSEELIE PNG "iconsHD\\WarmingSeelie.png" HDWASTERGREATSWORD PNG "iconsHD\\WasterGreatsword.png" HDWAVEBREAKERSFIN PNG "iconsHD\\WavebreakersFin.png" -HDWAVERIDERWAYPOINTCANNOTTELEPORT PNG "iconsHD\\WaveriderWaypointCannotTeleport.png" +HDWAVERIDERWAYPOINTCANNOTTELEPORT PNG "iconsHD\\WaveriderWaypointCannotTeleport.png" HDWEAPON PNG "iconsHD\\Weapon.png" @@ -1273,8 +1289,12 @@ ADHIGAMAWOOD PNG "icons\\AdhigamaWood.png" ADORNEDUNAGI PNG "icons\\AdornedUnagi.png" +AEONBLIGHTDRAKE PNG "icons\\AeonblightDrake.png" + AIZENMEDAKA PNG "icons\\AizenMedaka.png" +AJILENAKH PNG "icons\\Ajilenakh.png" + AKAIMAOU PNG "icons\\AkaiMaou.png" AMAKUMOFRUIT PNG "icons\\AmakumoFruit.png" @@ -1377,7 +1397,7 @@ CICIN PNG "icons\\Cicin.png" CLOUDLEISURESTEPS PNG "icons\\CloudleisureSteps.png" -CLUSTERLEAFOFCULTIVATION PNG "icons\\ClusterleafOfCultivation.png" +CLUSTERLEAFOFCULTIVATION PNG "icons\\ClusterleafOfCultivation.png" COMMONCHEST PNG "icons\\CommonChest.png" @@ -1425,7 +1445,7 @@ DANDY PNG "icons\\Dandy.png" DAWNCATCHER PNG "icons\\Dawncatcher.png" -DAYNIGHTSWITCHINGMECHANISM PNG "icons\\DayNightSwitchingMechanism.png" +DAYNIGHTSWITCHINGMECHANISM PNG "icons\\DayNightSwitchingMechanism.png" DEEPSEAUNAGI PNG "icons\\DeepSeaUnagi.png" @@ -1665,7 +1685,7 @@ LUMINOUSSEELIE PNG "icons\\LuminousSeelie.png" LUNGEDSTICKLEBACK PNG "icons\\LungedStickleback.png" -LUPUSBOREASDOMINATOROFWOLVES PNG "icons\\LupusBoreasDominatorofWolves.png" +LUPUSBOREASDOMINATOROFWOLVES PNG "icons\\LupusBoreasDominatorofWolves.png" LUXURIOUSCHEST PNG "icons\\LuxuriousChest.png" @@ -1777,6 +1797,8 @@ PRECIOUSCHEST PNG "icons\\PreciousChest.png" PRESSUREPLATE PNG "icons\\PressurePlate.png" +PRIMALCONSTRUCT PNG "icons\\PrimalConstruct.png" + PRIMOGEOVISHAP PNG "icons\\PrimoGeovishap.png" PUFFERFISH PNG "icons\\Pufferfish.png" @@ -1805,6 +1827,8 @@ RAWMEAT PNG "icons\\RawMeat.png" RECIPE PNG "icons\\Recipe.png" +REDCREST PNG "icons\\Redcrest.png" + REDFINNEDUNAGI PNG "icons\\RedFinnedUnagi.png" REDHORNEDLIZARD PNG "icons\\RedHornedLizard.png" @@ -1861,8 +1885,12 @@ SANGOPEARL PNG "icons\\SangoPearl.png" SAPPHIRE PNG "icons\\Sapphire.png" +SCARAB PNG "icons\\Scarab.png" + SCARLETQUARTZ PNG "icons\\ScarletQuartz.png" +SCORPION PNG "icons\\Scorpion.png" + SEAGANODERMA PNG "icons\\SeaGanoderma.png" SEAGRASS PNG "icons\\Seagrass.png" @@ -1889,6 +1917,8 @@ SEELIECOURT PNG "icons\\SeelieCourt.png" SEELIELAMP PNG "icons\\SeelieLamp.png" +SEMIPERPETUALCONTROLMATRIX PNG "icons\\SemiPerpetualControlMatrix.png" + SHADOWYHUSK PNG "icons\\ShadowyHusk.png" SHAGGYSUMPTERBEAST PNG "icons\\ShaggySumpterBeast.png" @@ -1897,8 +1927,6 @@ SHOGUN PNG "icons\\Shogun.png" SHOGUNATEINFANTRY PNG "icons\\ShogunateInfantry.png" -SUMERUPUZZLES PNG "icons\\SumeruPuzzles.png" - SHRINEOFDEPTH PNG "icons\\ShrineOfDepth.png" SHROOMBOAR PNG "icons\\Shroomboar.png" @@ -1953,6 +1981,8 @@ STRANGETOOTH PNG "icons\\StrangeTooth.png" STRETCHYFUNGUS PNG "icons\\StretchyFungus.png" +SUMERUPUZZLES PNG "icons\\SumeruPuzzles.png" + SUMERUROSE PNG "icons\\SumeruRose.png" SUMERUSHRINEOFDEPTHS PNG "icons\\SumeruShrineofDepths.png" @@ -1987,10 +2017,10 @@ THEEREMITES PNG "icons\\TheEremites.png" THEGREATSNOWBOARKING PNG "icons\\TheGreatSnowboarKing.png" -THEWITHERING PNG "icons\\TheWithering.png" - THERAVENFORUM PNG "icons\\TheRavenForum.png" +THEWITHERING PNG "icons\\TheWithering.png" + THREEBOXES PNG "icons\\ThreeBoxes.png" THUNDERMANIFESTATION PNG "icons\\ThunderManifestation.png" @@ -2027,9 +2057,11 @@ VIOLETIBIS PNG "icons\\VioletIbis.png" VIPARYAS PNG "icons\\Viparyas.png" +VULTURE PNG "icons\\Vulture.png" + WARMINGSEELIE PNG "icons\\WarmingSeelie.png" -WAVERIDERWAYPOINTCANNOTTELEPORT PNG "icons\\WaveriderWaypointCannotTeleport.png" +WAVERIDERWAYPOINTCANNOTTELEPORT PNG "icons\\WaveriderWaypointCannotTeleport.png" WEAPON PNG "icons\\Weapon.png" diff --git a/cheat-library/src/appdata/il2cpp-functions.h b/cheat-library/src/appdata/il2cpp-functions.h index 7c41d66..d45c91c 100644 --- a/cheat-library/src/appdata/il2cpp-functions.h +++ b/cheat-library/src/appdata/il2cpp-functions.h @@ -174,6 +174,7 @@ DO_APP_FUNC(0x05C3EA50, Component_1*, GameObject_GetComponentByName, (GameObject DO_APP_FUNC(0x05C3EF30, bool, GameObject_get_active, (GameObject* __this, MethodInfo* method)); DO_APP_FUNC(0x05C3EFF0, void, GameObject_set_active, (GameObject* __this, bool value, MethodInfo* method)); DO_APP_FUNC(0x05C3EDF0, void, GameObject_SetActive, (GameObject* __this, bool value, MethodInfo* method)); +DO_APP_FUNC(0x05B6C670, Transform*, Transform_FindChild, (Transform* __this, String* name, MethodInfo* method)); DO_APP_FUNC(0x05B6C6A0, Transform*, Transform_GetChild, (Transform* __this, int32_t index, MethodInfo* method)); DO_APP_FUNC(0x05B4DED0, Component_1*, Component_1_GetComponent_1, (Component_1* __this, String* type, MethodInfo* method)); DO_APP_FUNC(0x05C3E9C0, GameObject*, GameObject_CreatePrimitive, (PrimitiveType__Enum type, MethodInfo* method)); @@ -300,6 +301,7 @@ DO_APP_FUNC(0x0143BF90, void, MoleMole_LCAbilityElement_ReduceModifierDurability DO_APP_FUNC(0x0218C660, BaseEntity*, MoleMole_GadgetEntity_GetOwnerEntity, (GadgetEntity* __this, MethodInfo* method)); DO_APP_FUNC(0x027385E0, bool, MoleMole_UIManager_HasEnableMapCamera, (MoleMole_UIManager* __this, MethodInfo* method)); +DO_APP_FUNC(0x0272BF00, void, MoleMole_UIManager_EnableInput, (MoleMole_UIManager* __this, bool playerInput, bool clearCurInputState, bool ignoreTouch, MethodInfo* method)); DO_APP_FUNC(0x010ED540, void, MonoMiniMap_Update, (MonoMiniMap* __this, MethodInfo* method)); DO_APP_FUNC(0x02DA4B00, MonoMiniMap*, MonoInLevelMainPage_get_miniMap, (void* __this, MethodInfo* method)); diff --git a/cheat-library/src/user/cheat/esp/ESP.cpp b/cheat-library/src/user/cheat/esp/ESP.cpp index e42c5cd..9f7c75b 100644 --- a/cheat-library/src/user/cheat/esp/ESP.cpp +++ b/cheat-library/src/user/cheat/esp/ESP.cpp @@ -146,6 +146,26 @@ namespace cheat::feature return instance; } + bool ESP::isBuriedChest(game::Entity* entity) + { + if (entity->name().find("_WorldArea_Operator") != std::string::npos) + { + auto entityGameObject = app::MoleMole_BaseEntity_get_rootGameObject(entity->raw(), nullptr); + auto transform = app::GameObject_GetComponentByName(entityGameObject, string_to_il2cppi("Transform"), nullptr); + auto child = app::Transform_FindChild(reinterpret_cast(transform), string_to_il2cppi("CircleR2H2"), nullptr); + if (child == nullptr) + return false; + + auto configID = entity->raw()->fields._configID_k__BackingField; + //LOG_DEBUG("%d", configID); + if (configID != 70360001 && configID != 70360286) + return false; + + return true; + } + return false; + } + void ESP::GetNpcName(std::string& name) { if (name.find("Avatar") != std::string::npos) @@ -414,9 +434,18 @@ namespace cheat::feature auto& entry = field.value(); if (!entry.m_Enabled || !m_FilterExecutor.ApplyFilter(entity, filter)) continue; - + if (entry.m_Name == "Buried Chest") + { + if(isBuriedChest(entity)) + { + esp::render::DrawEntity(entry.m_Name, entity, entry.m_Color, entry.m_ContrastColor); + } + break; + } if (entry.m_Name == "Npc" || "AvatarOwn" || "AvatarTeammate") { + if (isBuriedChest(entity)) + continue; if (entity->type() == app::EntityType__Enum_1::Avatar || entity->type() == app::EntityType__Enum_1::NPC) { std::string name = entity->name(); @@ -591,7 +620,7 @@ namespace cheat::feature ADD_FILTER_FIELD(chest, LuxuriousChest); ADD_FILTER_FIELD(chest, RemarkableChest); // Other Chests - //ADD_FILTER_FIELD(chest, BuriedChest); // Shared name, commented for now + ADD_FILTER_FIELD(chest, BuriedChest); ADD_FILTER_FIELD(chest, SearchPoint); @@ -652,6 +681,7 @@ namespace cheat::feature ADD_FILTER_FIELD(living, Onikabuto); ADD_FILTER_FIELD(living, Pigeon); ADD_FILTER_FIELD(living, Salamander); + ADD_FILTER_FIELD(living, Scarab); ADD_FILTER_FIELD(living, Squirrel); ADD_FILTER_FIELD(living, Starconch); ADD_FILTER_FIELD(living, Weasel); @@ -705,6 +735,7 @@ namespace cheat::feature ADD_FILTER_FIELD(monster, MaguuKenki); // Sumeru ADD_FILTER_FIELD(monster, JadeplumeTerrorshroom); + ADD_FILTER_FIELD(monster, AeonblightDrake); // Regular. Alphabetical. ADD_FILTER_FIELD(monster, AbyssMage); ADD_FILTER_FIELD(monster, BlackSerpentKnight); @@ -735,6 +766,7 @@ namespace cheat::feature ADD_FILTER_FIELD(monster, OceanidFrog); ADD_FILTER_FIELD(monster, OceanidSquirrel); ADD_FILTER_FIELD(monster, OceanidWigeon); + ADD_FILTER_FIELD(monster, PrimalConstruct); ADD_FILTER_FIELD(monster, PyroAbyssLector); ADD_FILTER_FIELD(monster, Rifthound); ADD_FILTER_FIELD(monster, RifthoundWhelp); @@ -746,6 +778,8 @@ namespace cheat::feature ADD_FILTER_FIELD(monster, RuinSentinel); ADD_FILTER_FIELD(monster, Samachurl); ADD_FILTER_FIELD(monster, SangonomiyaCohort); + ADD_FILTER_FIELD(monster, Scorpion); + ADD_FILTER_FIELD(monster, SemiPerpetualControlMatrix); ADD_FILTER_FIELD(monster, ShadowyHusk); ADD_FILTER_FIELD(monster, ShaggySumpterBeast); ADD_FILTER_FIELD(monster, ShogunateInfantry); @@ -755,10 +789,12 @@ namespace cheat::feature ADD_FILTER_FIELD(monster, StretchyFungus); ADD_FILTER_FIELD(monster, TreasureHoarder); ADD_FILTER_FIELD(monster, UnusualHilichurl); + ADD_FILTER_FIELD(monster, Vulture); ADD_FILTER_FIELD(monster, WhirlingFungus); ADD_FILTER_FIELD(monster, Whopperflower); ADD_FILTER_FIELD(monster, WingedShroom); + ADD_FILTER_FIELD(plant, Ajilenakh); ADD_FILTER_FIELD(plant, AmakumoFruit); ADD_FILTER_FIELD(plant, Apple); ADD_FILTER_FIELD(plant, BambooShoot); @@ -788,6 +824,7 @@ namespace cheat::feature ADD_FILTER_FIELD(plant, Pinecone); ADD_FILTER_FIELD(plant, Qingxin); ADD_FILTER_FIELD(plant, Radish); + ADD_FILTER_FIELD(plant, Redcrest); ADD_FILTER_FIELD(plant, RukkhashavaMushroom); ADD_FILTER_FIELD(plant, SakuraBloom); ADD_FILTER_FIELD(plant, SangoPearl); @@ -847,4 +884,4 @@ namespace cheat::feature ADD_FILTER_FIELD(puzzle, WindmillMechanism); } #undef ADD_FILTER_FIELD -} +} \ No newline at end of file diff --git a/cheat-library/src/user/cheat/esp/ESP.h b/cheat-library/src/user/cheat/esp/ESP.h index a517605..86fe14e 100644 --- a/cheat-library/src/user/cheat/esp/ESP.h +++ b/cheat-library/src/user/cheat/esp/ESP.h @@ -35,6 +35,7 @@ namespace cheat::feature config::Field f_DrawDistance; config::Field f_DrawName; + //config::Field f_HideCompleted; config::Field f_ArrowRadius; config::Field f_OutlineThickness; config::Field f_TracerSize; @@ -80,7 +81,8 @@ namespace cheat::feature void DrawFilterField(const config::Field& field); void GetNpcName(std::string& name); - + bool isBuriedChest(game::Entity* entity); + void OnKeyUp(short key, bool& cancelled); ESP(); diff --git a/cheat-library/src/user/cheat/game/filters.cpp b/cheat-library/src/user/cheat/game/filters.cpp index ffc1088..522947e 100644 --- a/cheat-library/src/user/cheat/game/filters.cpp +++ b/cheat-library/src/user/cheat/game/filters.cpp @@ -104,7 +104,7 @@ namespace cheat::game::filters SimpleFilter Npc = { EntityType__Enum_1::NPC, { "Liyue", "Mengde", "Inazuma", "Enkanomiya", "Sumeru", "Fontaine", "Aranara", "Natlan", "Snezhnaya", "Coop", "Quest", "Animal", "Guide", "Homeworld", "Avatar", "Kanban", "Monster"} }; SimpleFilter Crane = { EntityType__Enum_1::Monster, "Crane" }; SimpleFilter Falcon = { EntityType__Enum_1::Monster, "Falcon" }; - SimpleFilter LucklightFly = { EntityType__Enum_1::EnvAnimal, "Boltbug_" }; + SimpleFilter LucklightFly = { EntityType__Enum_1::EnvAnimal, "Boltbug_Lightbug" }; SimpleFilter Salamander = { EntityType__Enum_1::EnvAnimal, "Salamander" }; SimpleFilter DuskBird = { EntityType__Enum_1::Monster, "Pigeon_Beak" }; SimpleFilter Pigeon = { EntityType__Enum_1::Monster, "Pigeon_0" }; @@ -118,6 +118,7 @@ namespace cheat::game::filters SimpleFilter Kitsune = { EntityType__Enum_1::EnvAnimal, "Vulpes" }; SimpleFilter BakeDanuki = { EntityType__Enum_1::Monster, "Inu_Tanuki" }; SimpleFilter Meat = { EntityType__Enum_1::GatherObject , { "_Food_BirdMeat", "_Food_Meat", "_Fishmeat" } }; + SimpleFilter Scarab = { EntityType__Enum_1::EnvAnimal, "Scarab" }; } namespace mineral @@ -161,7 +162,7 @@ namespace cheat::game::filters SimpleFilter Mitachurl = { EntityType__Enum_1::Monster, "_Brute" }; SimpleFilter Nobushi = { EntityType__Enum_1::Monster, "_Ronin" }; SimpleFilter Kairagi = { EntityType__Enum_1::Monster, "_Kairagi" }; - SimpleFilter RuinDrake = { EntityType__Enum_1::Monster, "_Gargoyle" }; + SimpleFilter RuinDrake = { EntityType__Enum_1::Monster, { "Gargoyle_Ground", "Gargoyle_Airborne" } }; SimpleFilter RuinGuard = { EntityType__Enum_1::Monster, "_Defender" }; SimpleFilter RuinHunter = { EntityType__Enum_1::Monster, "_Formathr" }; SimpleFilter RuinGrader = { EntityType__Enum_1::Monster, "_Konungmathr" }; @@ -229,6 +230,11 @@ namespace cheat::game::filters SimpleFilter ShaggySumpterBeast = { EntityType__Enum_1::Monster, "_Megamoth_" }; SimpleFilter Spincrocodile = { EntityType__Enum_1::Monster, "_Gator" }; SimpleFilter SentryTurrets = { EntityType__Enum_1::Field, "SentryTurrets_" }; + SimpleFilter AeonblightDrake = { EntityType__Enum_1::Monster, "Gargoyle_Fafnir_" }; + SimpleFilter PrimalConstruct = { EntityType__Enum_1::Monster, "Monolith_Ordinator_" }; + SimpleFilter SemiPerpetualControlMatrix = { EntityType__Enum_1::Monster, "Monolith_Starchild" }; + SimpleFilter Scorpion = { EntityType__Enum_1::Monster, "Scorpion_" }; + SimpleFilter Vulture = { EntityType__Enum_1::Monster, "Vulture_" }; } namespace plant @@ -284,6 +290,8 @@ namespace cheat::game::filters SimpleFilter SumeruRose = { EntityType__Enum_1::GatherObject, "_XumiRose" }; SimpleFilter Viparyas = { EntityType__Enum_1::GatherObject, "_DreamerPlant" }; SimpleFilter ZaytunPeach = { EntityType__Enum_1::GatherObject, "_Olea" }; + SimpleFilter Redcrest = { EntityType__Enum_1::GatherObject, "RedPearlFruit" }; + SimpleFilter Ajilenakh = { EntityType__Enum_1::GatherObject, "DatePalm" }; } namespace puzzle @@ -416,7 +424,9 @@ namespace cheat::game::filters living::DuskBird, monster::ShaggySumpterBeast, monster::RishbolandTiger, - monster::Spincrocodile + monster::Spincrocodile, + monster::Scorpion, + monster::Vulture }; SimpleFilter AnimalPickUp = { living::CrystalCore, @@ -432,7 +442,8 @@ namespace cheat::game::filters living::Starconch, living::BirdEgg, living::WeaselThief, - living::Fish + living::Fish, + living::Scarab }; SimpleFilter AnimalNPC = { living::Dog, @@ -461,7 +472,6 @@ namespace cheat::game::filters monster::WhirlingFungus, monster::WingedShroom, monster::GroundedShroom, - monster::ShaggySumpterBeast }; SimpleFilter MonsterElites = { monster::Mitachurl, @@ -485,7 +495,8 @@ namespace cheat::game::filters monster::Geovishap, monster::HydroBathysmalVishap, monster::EyeOfTheStorm, - monster::BlackSerpentKnight + monster::BlackSerpentKnight, + monster::PrimalConstruct }; SimpleFilter MonsterBosses = { // Adding these comments for better tracking. @@ -528,7 +539,9 @@ namespace cheat::game::filters monster::ElectroBathysmalVishap, // Sumeru monster::ElectroRegisvine, - monster::JadeplumeTerrorshroom + monster::JadeplumeTerrorshroom, + monster::AeonblightDrake, + monster::SemiPerpetualControlMatrix }; SimpleFilter MonsterShielded = { diff --git a/cheat-library/src/user/cheat/game/filters.h b/cheat-library/src/user/cheat/game/filters.h index 7129c7b..a1504cc 100644 --- a/cheat-library/src/user/cheat/game/filters.h +++ b/cheat-library/src/user/cheat/game/filters.h @@ -118,6 +118,7 @@ namespace cheat::game::filters extern SimpleFilter Kitsune; extern SimpleFilter BakeDanuki; extern SimpleFilter Meat; + extern SimpleFilter Scarab; } namespace mineral @@ -229,6 +230,11 @@ namespace cheat::game::filters extern SimpleFilter ShaggySumpterBeast; extern SimpleFilter Spincrocodile; extern SimpleFilter SentryTurrets; + extern SimpleFilter AeonblightDrake; + extern SimpleFilter PrimalConstruct; + extern SimpleFilter SemiPerpetualControlMatrix; + extern SimpleFilter Scorpion; + extern SimpleFilter Vulture; } namespace plant @@ -284,6 +290,8 @@ namespace cheat::game::filters extern SimpleFilter SumeruRose; extern SimpleFilter Viparyas; extern SimpleFilter ZaytunPeach; + extern SimpleFilter Redcrest; + extern SimpleFilter Ajilenakh; } namespace puzzle diff --git a/cheat-library/src/user/cheat/player/RapidFire.cpp b/cheat-library/src/user/cheat/player/RapidFire.cpp index acb9cc5..093729a 100644 --- a/cheat-library/src/user/cheat/player/RapidFire.cpp +++ b/cheat-library/src/user/cheat/player/RapidFire.cpp @@ -14,6 +14,12 @@ namespace cheat::feature app::AnimatorStateInfo processStateInfo, app::MoleMole_VCAnimatorEvent_MoleMole_VCAnimatorEvent_TriggerMode__Enum mode, MethodInfo* method); static void LCBaseCombat_FireBeingHitEvent_Hook(app::LCBaseCombat* __this, uint32_t attackeeRuntimeID, app::AttackResult* attackResult, MethodInfo* method); + static int32_t attackTags[] = { + 1638193991, // Normal and Charged + 1498431743, // Plunge + -584054938, 0, // Skill, Burst and Charged Bow Release + }; + RapidFire::RapidFire() : Feature(), NF(f_Enabled, "Attack Multiplier", "RapidFire", false), NF(f_MultiHit, "Multi-hit", "RapidFire", false), @@ -24,7 +30,12 @@ namespace cheat::feature NF(f_maxMultiplier, "Max Multiplier", "RapidFire", 3), NF(f_MultiTarget, "Multi-target", "RapidFire", false), NF(f_MultiTargetRadius, "Multi-target Radius", "RapidFire", 20.0f), - NF(f_MultiAnimation, "Multi-animation", "RapidFire", false) + NF(f_MultiAnimation, "Multi-animation", "RapidFire", false), + NF(f_AnimationMultiplier, "Animation Multiplier", "RapidFire", 100), + NF(f_AnimationState, "Animation State", "RapidFire", 0.5f), + NF(f_AttackSpeed, "Attack Speed", "RapidFire", false), + NF(f_SpeedMultiplier, "Speed Multiplier", "RapidFire", 1.5f), + animationCounter(1) { // HookManager::install(app::MoleMole_LCBaseCombat_DoHitEntity, LCBaseCombat_DoHitEntity_Hook); -- Looks like FireBeingHitEvent is superior to this. HookManager::install(app::MoleMole_VCAnimatorEvent_HandleProcessItem, VCAnimatorEvent_HandleProcessItem_Hook); @@ -85,29 +96,40 @@ namespace cheat::feature ConfigWidget("Multi-animation", f_MultiAnimation, "Enables multi-animation attacks.\n" \ "Do keep in mind that the character's audio will also be spammed."); + ConfigWidget("Animation Multiplier", f_AnimationMultiplier, 1, 1, 150, "Configure to how many times it will update the animation state.\n" \ + "Results can vary alongside Animation State"); + ConfigWidget("Animation State", f_AnimationState, 0.01f, 0.f, 2.f, "Animation state to replay.\n"\ + "Results can vary alongside Animation Multiplier"); + ConfigWidget("Attack Speed", f_AttackSpeed, "Enables fast animation attacks.\n"); + ConfigWidget("Speed Multiplier", f_SpeedMultiplier, 0.1f, 1.0f, 5.0f, "Attack speed multiplier."); } bool RapidFire::NeedStatusDraw() const { - return f_Enabled && (f_MultiHit || f_MultiTarget || f_MultiAnimation); + return (f_Enabled && (f_MultiHit || f_MultiTarget)) || f_MultiAnimation || f_AttackSpeed; } void RapidFire::DrawStatus() { - if (f_MultiHit) - { - if (f_Randomize) - ImGui::Text("Multi-Hit Random[%d|%d]", f_minMultiplier.value(), f_maxMultiplier.value()); - else if (f_OnePunch) - ImGui::Text("Multi-Hit [OnePunch]"); - else - ImGui::Text("Multi-Hit [%d]", f_Multiplier.value()); + if (f_Enabled) { + ImGui::Text("Rapid Fire:"); + if (f_MultiHit) + { + if (f_Randomize) + ImGui::Text("Multi-Hit Random[%d|%d]", f_minMultiplier.value(), f_maxMultiplier.value()); + else if (f_OnePunch) + ImGui::Text("Multi-Hit [OnePunch]"); + else + ImGui::Text("Multi-Hit [%d]", f_Multiplier.value()); + } + if (f_MultiTarget) + ImGui::Text("Multi-Target [%.01fm]", f_MultiTargetRadius.value()); } - if (f_MultiTarget) - ImGui::Text("Multi-Target [%.01fm]", f_MultiTargetRadius.value()); if (f_MultiAnimation) - ImGui::Text("Multi-Animation"); + ImGui::Text("Multi-Animation [%d|%0.2f]", f_AnimationMultiplier.value(), f_AnimationState.value()); + if(f_AttackSpeed) + ImGui::Text("Attack Speed [%0.1f]", f_SpeedMultiplier.value()); } RapidFire& RapidFire::GetInstance() @@ -116,7 +138,6 @@ namespace cheat::feature return instance; } - int RapidFire::CalcCountToKill(float attackDamage, uint32_t targetID) { if (attackDamage == 0) @@ -203,6 +224,7 @@ namespace cheat::feature return false; auto& manager = game::EntityManager::instance(); + auto patterID = manager.avatar()->combat()->monitor; auto avatarID = manager.avatar()->raw()->fields._configID_k__BackingField; auto attackerID = attacker.raw()->fields._configID_k__BackingField; // LOG_DEBUG("configID = %d", attackerID); @@ -329,11 +351,38 @@ namespace cheat::feature { auto attacker = game::Entity(__this->fields._._._entity); RapidFire& rapidFire = RapidFire::GetInstance(); + bool isAttackAnimation = std::any_of(std::begin(attackTags), std::end(attackTags), + [&](uint32_t tag) { return processStateInfo.m_Tag == tag; }); + bool isAttacking = IsAttackByAvatar(attacker) && isAttackAnimation; - if (rapidFire.f_MultiAnimation && IsAttackByAvatar(attacker)) - processItem->fields.lastTime = 0; + if (rapidFire.f_MultiAnimation && isAttacking) + { + // Set counter back to 1 when any new attack animation is invoked + if (processStateInfo.m_NormalizedTime <= 0.01f) + rapidFire.animationCounter = 1; + + if (rapidFire.animationCounter <= rapidFire.f_AnimationMultiplier) + { + // Can be configured up to 1.0 but 0.1 to 0.9 you can barely notice the difference + // So 0 - 0.2 is enough. + processItem->fields.lastTime = (rapidFire.f_AnimationState / 10); + rapidFire.animationCounter++; + } + } + + static bool isFastSpeed = false; + if (rapidFire.f_AttackSpeed && isAttacking) + { + if (!isinf(processStateInfo.m_Length)) + app::Animator_set_speed(attacker.animator(), rapidFire.f_SpeedMultiplier, nullptr); + isFastSpeed = true; + } + else if (IsAttackByAvatar(attacker) && isFastSpeed) { + //LOG_DEBUG("Speed Reverted"); + app::Animator_set_speed(attacker.animator(), processStateInfo.m_SpeedMultiplier, nullptr); + isFastSpeed = false; + } CALL_ORIGIN(VCAnimatorEvent_HandleProcessItem_Hook, __this, processItem, processStateInfo, mode, method); } -} - +} \ No newline at end of file diff --git a/cheat-library/src/user/cheat/player/RapidFire.h b/cheat-library/src/user/cheat/player/RapidFire.h index 7d9d26f..e337182 100644 --- a/cheat-library/src/user/cheat/player/RapidFire.h +++ b/cheat-library/src/user/cheat/player/RapidFire.h @@ -6,7 +6,6 @@ namespace cheat::feature { - class RapidFire : public Feature { public: @@ -20,6 +19,11 @@ namespace cheat::feature config::Field> f_MultiTarget; config::Field f_MultiTargetRadius; config::Field> f_MultiAnimation; + config::Field f_AnimationMultiplier; + config::Field f_AnimationState; + config::Field> f_AttackSpeed; + config::Field f_SpeedMultiplier; + uint32_t animationCounter; static RapidFire& GetInstance(); @@ -36,3 +40,4 @@ namespace cheat::feature }; } + diff --git a/cheat-library/src/user/cheat/teleport/CustomTeleports.cpp b/cheat-library/src/user/cheat/teleport/CustomTeleports.cpp index 8e85eaa..7cdacec 100644 --- a/cheat-library/src/user/cheat/teleport/CustomTeleports.cpp +++ b/cheat-library/src/user/cheat/teleport/CustomTeleports.cpp @@ -317,10 +317,12 @@ namespace cheat::feature "3. You can now press Next or Previous Hotkey to Teleport through the Checklist\n" "Initially it will teleport the player to the selection made\n" "Note: Double click or click the arrow to open teleport details"); - ConfigWidget("Enable Interpolation", f_Interpolate, "Enable interpolation between teleports when using keybinds."); ImGui::SameLine(); ImGui::SetNextItemWidth(300.0f); + ConfigWidget("Enable Interpolation", f_Interpolate, "Enable interpolation between teleports when using keybinds."); + ImGui::SetNextItemWidth(300.0f); ConfigWidget("Interpolation Speed", f_Speed, 0.1f, 0.1f, 99.0f, "Interpolation speed.\n recommended setting below or equal to 0.1."); - ConfigWidget("Auto Teleport", f_Auto, "Enable automatic forward teleporation between teleports"); ImGui::SameLine(); ImGui::SetNextItemWidth(300.0f); + ConfigWidget("Auto Teleport", f_Auto, "Enable automatic forward teleporation between teleports"); + ImGui::SetNextItemWidth(300.0f); ConfigWidget("Delay Time (s)", f_DelayTime, 1, 0, 60, "Delay (in s) between teleport.\n" "Note: This is not fully tested detection-wise.\nNot recommended with low values."); @@ -448,7 +450,7 @@ namespace cheat::feature } ImGui::TableNextColumn(); - ImGui::PushStyleColor(ImGuiCol_Text, selected ? IM_COL32(40, 90, 175, 255) : ImGui::ColorConvertFloat4ToU32(ImGui::GetStyle().Colors[ImGuiCol_Text])); + ImGui::PushStyleColor(ImGuiCol_Text, selected ? ImGui::GetColorU32(ImGuiCol_CheckMark) : ImGui::GetColorU32(ImGuiCol_Text)); ImGui::Text("%s", name.c_str()); ImGui::PopStyleColor(); if (ImGui::IsItemHovered()) diff --git a/cheat-library/src/user/cheat/visuals/AnimationChanger.cpp b/cheat-library/src/user/cheat/visuals/AnimationChanger.cpp index 3292878..28f0ea3 100644 --- a/cheat-library/src/user/cheat/visuals/AnimationChanger.cpp +++ b/cheat-library/src/user/cheat/visuals/AnimationChanger.cpp @@ -80,6 +80,7 @@ namespace cheat::feature "Attack03", "Attack04", "Attack05", + "Attack06", "Attack01", "Attack02", "ExtraAttack", @@ -234,7 +235,8 @@ namespace cheat::feature NF(f_Enabled, "Animation Changer", "Visuals::AnimationChanger", false), NF(f_Animation, "Animation", "Visuals::AnimationChanger", "ExtraAttack"), NF(f_ApplyKey, "Apply Animation", "Visuals::AnimationChanger", Hotkey('Y')), - NF(f_ResetKey, "Reset Animation", "Visuals::AnimationChanger", Hotkey('R')) + NF(f_ResetKey, "Reset Animation", "Visuals::AnimationChanger", Hotkey('R')), + NF(f_Delay, "Repeat Delay", "Visuals::AnimationChanger", 400) { events::GameUpdateEvent += MY_METHOD_HANDLER(AnimationChanger::OnGameUpdate); } @@ -268,6 +270,7 @@ namespace cheat::feature ConfigWidget("Apply Key", f_ApplyKey, true); ConfigWidget("Reset Key", f_ResetKey, true); + ConfigWidget("Delay", f_Delay, 1, 1, 1000000000, "Delay to repeat animation"); } } ImGui::EndGroupPanel(); @@ -294,8 +297,7 @@ namespace cheat::feature if (!f_Enabled) return; - // Taiga#5555: Maybe need to add separate option to change delay value if user feels like it's too fast or slow. - UPDATE_DELAY(400); + UPDATE_DELAY(f_Delay); auto& manager = game::EntityManager::instance(); auto avatar = manager.avatar(); diff --git a/cheat-library/src/user/cheat/visuals/AnimationChanger.h b/cheat-library/src/user/cheat/visuals/AnimationChanger.h index b8f9d0c..4a7ecaa 100644 --- a/cheat-library/src/user/cheat/visuals/AnimationChanger.h +++ b/cheat-library/src/user/cheat/visuals/AnimationChanger.h @@ -12,6 +12,7 @@ namespace cheat::feature config::Field f_Animation; config::Field f_ApplyKey; config::Field f_ResetKey; + config::Field f_Delay; const FeatureGUIInfo& GetGUIInfo() const override; void DrawMain() override; diff --git a/cheat-library/src/user/cheat/visuals/FreeCamera.cpp b/cheat-library/src/user/cheat/visuals/FreeCamera.cpp index 72bd6ba..04e952d 100644 --- a/cheat-library/src/user/cheat/visuals/FreeCamera.cpp +++ b/cheat-library/src/user/cheat/visuals/FreeCamera.cpp @@ -25,6 +25,7 @@ namespace cheat::feature FreeCamera::FreeCamera() : Feature(), NF(f_Enabled, "Free Camera", "Visuals::FreeCamera", false), NF(f_FreezeAnimation, "Freeze Character Animation", "Visuals::FreeCamera", false), + NF(f_BlockInput, "Block Input", "Visuals::FreeCamera", false), NF(f_DamageOverlay, "Damage Overlay", "Visuals::FreeCamera", false), NF(f_HpOverlay, "Enemy HP Overlay", "Visuals::FreeCamera", false), NF(f_Speed, "Speed", "Visuals::FreeCamera", 1.0f), @@ -61,6 +62,7 @@ namespace cheat::feature { ConfigWidget("Enable", f_Enabled); ConfigWidget("Freeze Character Animation", f_FreezeAnimation, "Freezes the active character's animation."); + ConfigWidget("Block User Input", f_BlockInput, "If enabled, any input will be blocked."); if (f_Enabled) { ConfigWidget("Toggle Damage Overlay", f_DamageOverlay, "Remove damage output overlay"); @@ -189,9 +191,9 @@ namespace cheat::feature targetPosition = targetPosition - app::Transform_get_right(freeCam_Transform, nullptr) * settings.f_Speed; if (settings.f_LeftRoll.value().IsPressed()) - targetRotation.roll += settings.f_Speed; + targetRotation.roll += settings.f_RollSpeed; if (settings.f_RightRoll.value().IsPressed()) - targetRotation.roll -= settings.f_Speed; + targetRotation.roll -= settings.f_RollSpeed; if (settings.f_ResetRoll.value().IsPressed()) targetRotation.roll = 0.0f; @@ -242,6 +244,12 @@ namespace cheat::feature void FreeCamera::OnGameUpdate() { + auto uiManager = GET_SINGLETON(MoleMole_UIManager); + if (uiManager == nullptr) + return; + + static bool isBlock = false; + if (f_Enabled) { if (mainCam == nullptr) @@ -284,6 +292,23 @@ namespace cheat::feature hpOverlay = nullptr; } + if (f_BlockInput) + { + if (!isBlock) + { + app::MoleMole_UIManager_EnableInput(uiManager, false, false, false, nullptr); + isBlock = true; + } + } + else + { + if (isBlock) + { + app::MoleMole_UIManager_EnableInput(uiManager, true, false, false, nullptr); + isBlock = false; + } + } + // Taiga#5555: There's probably be a better way of implementing this. But for now, this is just what I came up with. auto& manager = game::EntityManager::instance(); auto animator = manager.avatar()->animator(); diff --git a/cheat-library/src/user/cheat/visuals/FreeCamera.h b/cheat-library/src/user/cheat/visuals/FreeCamera.h index 09d7d37..525b6ee 100644 --- a/cheat-library/src/user/cheat/visuals/FreeCamera.h +++ b/cheat-library/src/user/cheat/visuals/FreeCamera.h @@ -9,6 +9,7 @@ namespace cheat::feature public: config::Field> f_Enabled; config::Field> f_FreezeAnimation; + config::Field f_BlockInput; config::Field f_DamageOverlay; config::Field f_HpOverlay; config::Field f_Speed; diff --git a/cheat-library/src/user/cheat/world/AutoLoot.cpp b/cheat-library/src/user/cheat/world/AutoLoot.cpp index 602ad44..c1cd036 100644 --- a/cheat-library/src/user/cheat/world/AutoLoot.cpp +++ b/cheat-library/src/user/cheat/world/AutoLoot.cpp @@ -23,6 +23,7 @@ namespace cheat::feature NF(f_PickupFilter_Animals, "Animals filter", "AutoLoot", true), NF(f_PickupFilter_DropItems, "Drop items filter", "AutoLoot", true), NF(f_PickupFilter_Resources, "Resources filter", "AutoLoot", true), + NF(f_PickupFilter_Oculus, "Oculus filter", "AutoLoot", true), NF(f_Chest, "Chests", "AutoLoot", false), NF(f_Leyline, "Leylines", "AutoLoot", false), NF(f_Investigate, "Search points", "AutoLoot", false), @@ -123,7 +124,8 @@ namespace cheat::feature ConfigWidget("Enabled", f_PickupFilter, "Enable pickup filter.\n"); ConfigWidget("Animals", f_PickupFilter_Animals, "Fish, Lizard, Frog, Flying animals."); ImGui::SameLine(); ConfigWidget("Drop Items", f_PickupFilter_DropItems, "Material, Mineral, Artifact."); ImGui::SameLine(); - ConfigWidget("Resources", f_PickupFilter_Resources, "Everything beside Animals and Drop Items (Plants, Books, etc)."); + ConfigWidget("Resources", f_PickupFilter_Resources, "Everything beside Animals and Drop Items (Plants, Books, etc)."); ImGui::SameLine(); + ConfigWidget("Oculus", f_PickupFilter_Oculus, "Filter Oculus"); } ImGui::EndGroupPanel(); } @@ -248,20 +250,23 @@ namespace cheat::feature void AutoLoot::OnCheckIsInPosition(bool& result, app::BaseEntity* entity) { + // TODO: Maybe add a list of filter for all GatherObject instead of just using entityType in general. + auto& manager = game::EntityManager::instance(); + if (f_AutoPickup || f_UseCustomRange) { float pickupRange = f_UseCustomRange ? f_CustomRange : g_default_range; if (f_PickupFilter) { if (!f_PickupFilter_Animals && entity->fields.entityType == app::EntityType__Enum_1::EnvAnimal || !f_PickupFilter_DropItems && entity->fields.entityType == app::EntityType__Enum_1::DropItem || - !f_PickupFilter_Resources && entity->fields.entityType == app::EntityType__Enum_1::GatherObject) + !f_PickupFilter_Resources && entity->fields.entityType == app::EntityType__Enum_1::GatherObject || + !f_PickupFilter_Oculus && game::filters::combined::Oculies.IsValid(manager.entity(entity->fields._runtimeID_k__BackingField))) { result = false; return; } } - auto& manager = game::EntityManager::instance(); result = manager.avatar()->distance(entity) < pickupRange; } } diff --git a/cheat-library/src/user/cheat/world/AutoLoot.h b/cheat-library/src/user/cheat/world/AutoLoot.h index 5b7503f..4b9d5ba 100644 --- a/cheat-library/src/user/cheat/world/AutoLoot.h +++ b/cheat-library/src/user/cheat/world/AutoLoot.h @@ -28,6 +28,7 @@ namespace cheat::feature config::Field f_PickupFilter_Animals; config::Field f_PickupFilter_DropItems; config::Field f_PickupFilter_Resources; + config::Field f_PickupFilter_Oculus; static AutoLoot& GetInstance();