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();