This commit is contained in:
lunatic 2022-09-14 09:57:57 +07:00
commit d44613c5b0
40 changed files with 756 additions and 339 deletions

View File

@ -16,20 +16,12 @@
<h1 align="center">Getting Started</h1> <h1 align="center">Getting Started</h1>
## 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 ## Stable Release
1. Head over to the releases page 1. Head over to the [releases page](https://github.com/Akebi-Group/Akebi-GC/releases)
1. Download the latest binaries 2. Download the latest binaries
## Latest Release ## 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. Click Publish workflow
1. Select most recent workflow with green checkmark ✔ (Choose your client version **GLOBAL/CN/BETA**) 1. Select most recent workflow with green checkmark ✔ (Choose your client version **GLOBAL/CN/BETA**)
<p align="center"> <p align="center">
@ -40,24 +32,16 @@ As well as setting up **`cheat-library`** as startup project.
<a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429302-7c7be3f6-df2f-4e49-9bb9-4a703c3491df.png"></a> <a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429302-7c7be3f6-df2f-4e49-9bb9-4a703c3491df.png"></a>
</p> </p>
## Building from source
### Requirements Check our wiki - [Building](https://github.com/Akebi-Group/Akebi-GC/wiki/Building%EF%BD%9C%E5%BB%BA%E7%BD%AE)
- [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)
### Usage ### 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. Ensure that `CLibrary.dll` is in the same folder that `injector.exe`.
1. Run `injector.exe`. 2. Run `injector.exe`.
1. After the login page appeared, press F1 to open Akebi GUI. 3. After the login page appeared, press F1 to open Akebi GUI.
<h1 align="center">Features</h1> <h1 align="center">Features</h1>
#### General #### General
- Protection Bypass - Protection Bypass
- In-Game GUI - In-Game GUI
@ -117,7 +101,6 @@ As well as setting up **`cheat-library`** as startup project.
- FPS Graph - FPS Graph
- [Packet Sniffer](https://github.com/Akebi-Group/Akebi-PacketSniffer) - [Packet Sniffer](https://github.com/Akebi-Group/Akebi-PacketSniffer)
<h1 align="center">Demo</h1> <h1 align="center">Demo</h1>
<details> <details>
@ -146,37 +129,26 @@ As well as setting up **`cheat-library`** as startup project.
</details> </details>
<h1 align="center">Bugs</h1> <h1 align="center">Bugs</h1>
Welcome to the short explanation for bug reporting Welcome to the short explanation for bug reporting
1. You found a bug. 1. You found a bug.
1. Write down what happened, as well as your first thoughts on what you think caused it. 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. 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 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
1. [Open an Issue(there's a template!)](https://github.com/Akebi-Group/Akebi-GC/issues)
## Bug reporting template
<br>
### 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
```
<h1 align="center">Contributing</h1> <h1 align="center">Contributing</h1>
## Adding a feature ## Adding a feature
1. Fork the Project 1. Fork the Project
1. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) 1. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
1. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) 1. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
1. Push to the Branch (`git push origin feature/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 ## Suggestions
Open an issue with the title of the suggestion you want to make. 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. In the description, make sure it is **descriptive enough** so our devs can understand what you want and how you want it.

View File

@ -16,22 +16,14 @@
<h1 align="center">入门教程</h1> <h1 align="center">入门教程</h1>
## 编译
推荐使用 [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. 前往[Releases](https://github.com/Akebi-Group/Akebi-GC/releases)頁面
1. 下载最新的版本 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. 选择[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:测试服**)。
<p align="center"> <p align="center">
<a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429274-1e556c58-8027-4ec9-9c1d-3609c75aede4.png"></a> <a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429274-1e556c58-8027-4ec9-9c1d-3609c75aede4.png"></a>
</p> </p>
@ -40,22 +32,16 @@
<a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429302-7c7be3f6-df2f-4e49-9bb9-4a703c3491df.png"></a> <a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429302-7c7be3f6-df2f-4e49-9bb9-4a703c3491df.png"></a>
</p> </p>
## 自行编译
### 需要依赖 请查看wiki - [Building](https://github.com/Akebi-Group/Akebi-GC/wiki/Building%EF%BD%9C%E5%BB%BA%E7%BD%AE)
- [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)
### 使用方法 ### 使用方法
(如果不是从源码自己构建的话,无视步骤`1`跟`2`。)
1. 打开 `/bin`
1. 打开已经编译好的版本文件夹(debug, release)
1. 确认 `CLibrary.dll``injector.exe` 处在同一个文件夹内。 1. 确认 `CLibrary.dll``injector.exe` 处在同一个文件夹内。
1. 运行 `injector.exe`. 2. 运行 `injector.exe`.
1. 等到登录界面出现,按`F1`键打开`Akebi GUI`。 3. 等到登录界面出现,按`F1`键打开`Akebi GUI`。
<h1 align="center">功能简介</h1> <h1 align="center">功能简介</h1>
#### 通用 #### 通用
- 过检测 - 过检测
- 游戏内界面 - 游戏内界面
@ -115,7 +101,6 @@
- FPS曲线图 - FPS曲线图
- [抓包工具](https://github.com/Akebi-Group/Akebi-PacketSniffer) - [抓包工具](https://github.com/Akebi-Group/Akebi-PacketSniffer)
<h1 align="center">功能演示</h1> <h1 align="center">功能演示</h1>
<details> <details>
@ -143,28 +128,15 @@
<img src="https://github.com/CallowBlack/gif-demos/blob/main/genshin-cheat/auto-talk-demo.gif"/> <img src="https://github.com/CallowBlack/gif-demos/blob/main/genshin-cheat/auto-talk-demo.gif"/>
</details> </details>
<h1 align="center">Bugs</h1> <h1 align="center">Bugs</h1>
欢迎阅读如何提交`BUG`报告 欢迎阅读如何提交`BUG`报告
1. 发现了一个`bug`。 1. 发现了一个`bug`。
1. 记下问题出现时发生了什么,以及你认为这是由于什么造成的。 2. 记下问题出现时发生了什么,以及你认为这是由于什么造成的。
1. 可以复现吗?可以或不可以。如果可以:尽可能的描述清楚问题发生时,发生了什么,开启了什么功能以及最可能的原因是什么。 ~~如果不可以:**就别报告了,建议重启**。~~ 3. 可以复现吗?可以或不可以。如果可以:尽可能的描述清楚问题发生时,发生了什么,开启了什么功能以及最可能的原因是什么。 ~~如果不可以:**就别报告了,建议重启**。~~
1. 告诉我们你使用的是哪一个版本。复制你编译的最新的提交的`SHA`或者版本号。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7 4. 告诉我们你使用的是哪一个版本。复制你编译的最新的提交的`SHA`或者版本号。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7
5. [使用英文打开一个Issue(有提供模板!)](https://github.com/Akebi-Group/Akebi-GC/issues)
## **错误报告模板**
### 模板(最好使用英文)
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
```
<h1 align="center">提交贡献</h1> <h1 align="center">提交贡献</h1>
@ -173,8 +145,9 @@ Release Version: 0.7
1. 创建一个新的功能分支(`git checkout -b feature/AmazingFeature` 1. 创建一个新的功能分支(`git checkout -b feature/AmazingFeature`
1. 提交更改(`git commit -m 'Add some AmazingFeature'` 1. 提交更改(`git commit -m 'Add some AmazingFeature'`
1. 推送Push更改到分支`git push origin feature/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)。
标题写上你的建议,并且在描述里面,**清晰的**写下你的建议描述,以便我们的开发人员可以理解你的建议。

View File

@ -16,22 +16,14 @@
<h1 align="center">入門指南</h1> <h1 align="center">入門指南</h1>
## 編譯
建議使用 [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. 前往[Releases](https://github.com/Akebi-Group/Akebi-GC/releases)頁面
1. 下載最新的版本 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. 點選[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:測試服**)。
<p align="center"> <p align="center">
<a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429274-1e556c58-8027-4ec9-9c1d-3609c75aede4.png"></a> <a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429274-1e556c58-8027-4ec9-9c1d-3609c75aede4.png"></a>
</p> </p>
@ -40,24 +32,16 @@
<a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429302-7c7be3f6-df2f-4e49-9bb9-4a703c3491df.png"></a> <a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429302-7c7be3f6-df2f-4e49-9bb9-4a703c3491df.png"></a>
</p> </p>
## 自行編譯
### 依賴 請查看wiki - [Building](https://github.com/Akebi-Group/Akebi-GC/wiki/Building%EF%BD%9C%E5%BB%BA%E7%BD%AE)
- [適用於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)
### 使用方法 ### 使用方法
如果你不是從原始碼構建的話您可以跳過步驟1-2。
1. 開啟 `/bin`
1. 開啟已編譯版本(debug, release)
1. 確保 `CLibrary.dll``injector.exe` 在同一個資料夾裡面。 1. 確保 `CLibrary.dll``injector.exe` 在同一個資料夾裡面。
1. 執行 `injector.exe`. 2. 執行 `injector.exe`.
1. 等到登錄界面出現後按下F1來打開Akebi介面。 3. 等到登錄界面出現後,按下`F1`來打開Akebi介面。
<h1 align="center">功能簡介</h1> <h1 align="center">功能簡介</h1>
#### 一般 #### 一般
- 繞過防作弊機制 - 繞過防作弊機制
- 遊戲內介面 - 遊戲內介面
@ -117,7 +101,6 @@
- FPS曲線圖 - FPS曲線圖
- [抓包工具](https://github.com/Akebi-Group/Akebi-PacketSniffer) - [抓包工具](https://github.com/Akebi-Group/Akebi-PacketSniffer)
<h1 align="center">功能演示</h1> <h1 align="center">功能演示</h1>
<details> <details>
@ -146,37 +129,25 @@
</details> </details>
<h1 align="center">Bugs</h1> <h1 align="center">Bugs</h1>
歡迎閱讀關於錯誤報告Bug reporting的簡短解釋 歡迎閱讀關於錯誤報告Bug reporting的簡短解釋
1. 您發現了一個錯誤。 1. 您發現了一個錯誤。
1. 把接下來發生的事情記錄下來,以及你認為造成這種情況的第一想法。 2. 把接下來發生的事情記錄下來,以及你認為造成這種情況的第一想法。
1. 它可以被重現嗎?可以或不可以。如果可以:盡可能清楚地解釋清楚,當錯誤發生時,會發生什麼,為什麼會發生。 ~~如果不可以:無須報告,建議求佛。~~ 3. 它可以被重現嗎?可以或不可以。如果可以:盡可能清楚地解釋清楚,當錯誤發生時,會發生什麼,為什麼會發生。 ~~如果不可以:無須報告,建議求佛。我們不會通靈。~~
1. 告訴我們你使用的是哪個版本。複製你建立mod時的最新提交的SHA Hash/版本號。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7 4. 告訴我們你使用的是哪個版本。複製你建立mod時的最新提交的SHA Hash/版本號。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7
5. [使用英文開啟一個Issue(有提供模板!)](https://github.com/Akebi-Group/Akebi-GC/issues)
## 錯誤報告範本
<br>
### 範例(建議使用英文)
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
```
<h1 align="center">社群貢獻</h1> <h1 align="center">社群貢獻</h1>
## 增加一個功能 ## 增加一個功能
1. 建立新的分支 1. 建立新的分支(Fork)
1. 創建你的功能分支(`git checkout -b feature/AmazingFeature` 1. 創建你的功能分支(`git checkout -b feature/AmazingFeature`
1. 提交您的更改(`git commit -m 'Add some AmazingFeature'` 1. 提交您的更改(`git commit -m 'Add some AmazingFeature'`
1. 上傳Push到分支`git push origin feature/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))。
在描述中,確保它有足夠的描述性,以便我們的開發人員能夠理解你想要什麼以及你想要怎樣。 在描述中,確保內容**足夠清楚**,以便我們的開發人員能夠理解,你想要什麼以及你想要怎樣。

View File

@ -303,9 +303,9 @@ namespace cheat
feature->DrawStatus(); feature->DrawStatus();
ImU32 row_bg_color = ImGui::GetColorU32( //ImU32 row_bg_color = ImGui::GetColorU32(
ImVec4(0.2f + row * 0.1f, 0.1f + row * 0.05f, 0.1f + row * 0.03f, 0.85f)); // 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); //ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, row_bg_color);
row++; row++;
} }
} }
@ -332,9 +332,9 @@ namespace cheat
if (!showAny && !settings.f_StatusMove) if (!showAny && !settings.f_StatusMove)
return; 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::Begin("Info window", nullptr, flags);
ImGui::PopStyleColor(); //ImGui::PopStyleColor();
if (!showAny) if (!showAny)
{ {
@ -347,14 +347,14 @@ namespace cheat
{ {
auto& sections = m_FeatureMap[moduleName]; auto& sections = m_FeatureMap[moduleName];
bool moduleShowAny = std::any_of(sections.begin(), sections.end(), bool moduleShowAny = std::any_of(sections.begin(), sections.end(),
[](const auto& iter) [](const auto& iter)
{ {
return std::any_of(iter.second.begin(), iter.second.end(), return std::any_of(iter.second.begin(), iter.second.end(),
[](const auto feat) [](const auto feat)
{ {
return feat->NeedInfoDraw(); return feat->NeedInfoDraw();
}); });
} }
); );
if (!moduleShowAny) if (!moduleShowAny)
continue; continue;

View File

@ -34,29 +34,14 @@ namespace cheat::feature
NF(f_FastExitEnable, "Fast Exit", "General::FastExit", false), NF(f_FastExitEnable, "Fast Exit", "General::FastExit", false),
NF(f_HotkeyExit, "Hotkeys", "General::FastExit", Hotkey(VK_F12)), NF(f_HotkeyExit, "Hotkeys", "General::FastExit", Hotkey(VK_F12)),
NF(f_FontSize, "Font Size", "General", 16.0f), NF(f_FontSize, "Font Size", "General::Theme", 16.0f),
NF(f_ShowStyleEditor, "Show Colors Customization", "General", false), NF(f_ShowStyleEditor, "Show Colors Customization", "General::Theme", false),
NFS(f_DefaultTheme, "Theme", "General::Colors", "Default"), NFS(f_DefaultTheme, "Theme", "General::Theme", ""),
themesDir(util::GetCurrentPath() / "themes") themesDir(util::GetCurrentPath() / "themes")
{ {
renderer::SetGlobalFontSize(static_cast<float>(f_FontSize)); renderer::SetGlobalFontSize(static_cast<float>(f_FontSize));
f_HotkeyExit.value().PressedEvent += MY_METHOD_HANDLER(Settings::OnExitKeyPressed); 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 const FeatureGUIInfo& Settings::GetGUIInfo() const
@ -65,33 +50,345 @@ namespace cheat::feature
return info; return info;
} }
void Settings::Colors_Export(std::string name) ImVec4 HexToColor(std::string hexString)
{ {
ImGuiStyle& style = ImGui::GetStyle(); int r, g, b, a;
auto colors = style.Colors; 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) };
nlohmann::json json; return color;
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;
} }
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<int>(ceil(color.x * 255)),
static_cast<int>(ceil(color.y * 255)),
static_cast<int>(ceil(color.z * 255)),
static_cast<int>(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<float>();
color.y = colorValue[1].get<float>();
color.z = colorValue[2].get<float>();
color.w = colorValue[3].get<float>();
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<int>() });
else if(styleValue.is_boolean())
theme.styles.insert({ styleName, styleValue.get<bool>() });
else
theme.styles.insert({ styleName, styleValue.get<float>() });
}
}
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(); ImGuiStyle& style = ImGui::GetStyle();
auto colors = style.Colors; auto colors = style.Colors;
nlohmann::json json; auto& theme = m_Themes[name];
std::ifstream file(themesDir / (name + ".json"));
file >> json; // Applying Colors
for (int i = 0; i < ImGuiCol_COUNT; i++) if (!theme.colors.empty()) {
{ for (int i = 0; i < ImGuiCol_COUNT; i++)
auto color = json[ImGui::GetStyleColorName((ImGuiCol)i)]; {
colors[i].x = color[0]; auto& themeColor = theme.colors[ImGui::GetStyleColorName((ImGuiCol)i)];
colors[i].y = color[1]; colors[i].x = themeColor.x;
colors[i].z = color[2]; colors[i].y = themeColor.y;
colors[i].w = color[3]; colors[i].z = themeColor.z;
colors[i].w = themeColor.w;
}
} }
if (!theme.styles.empty())
{
// Applying Styles
style.Alpha = std::any_cast<float>(theme.styles["Alpha"]);
style.DisabledAlpha = std::any_cast<float>(theme.styles["DisabledAlpha"]);
style.WindowPadding = std::any_cast<ImVec2>(theme.styles["WindowPadding"]);
style.WindowRounding = std::any_cast<float>(theme.styles["WindowRounding"]);
style.WindowBorderSize = std::any_cast<float>(theme.styles["WindowBorderSize"]);
style.WindowMinSize = std::any_cast<ImVec2>(theme.styles["WindowMinSize"]);
style.WindowTitleAlign = std::any_cast<ImVec2>(theme.styles["WindowTitleAlign"]);
style.WindowMenuButtonPosition = ImGuiDir(std::any_cast<int>(theme.styles["WindowMenuButtonPosition"]));
style.ChildRounding = std::any_cast<float>(theme.styles["ChildRounding"]);
style.ChildBorderSize = std::any_cast<float>(theme.styles["ChildBorderSize"]);
style.PopupRounding = std::any_cast<float>(theme.styles["PopupRounding"]);
style.PopupBorderSize = std::any_cast<float>(theme.styles["PopupBorderSize"]);
style.FramePadding = std::any_cast<ImVec2>(theme.styles["FramePadding"]);
style.FrameRounding = std::any_cast<float>(theme.styles["FrameRounding"]);
style.FrameBorderSize = std::any_cast<float>(theme.styles["FrameBorderSize"]);
style.ItemSpacing = std::any_cast<ImVec2>(theme.styles["ItemSpacing"]);
style.ItemInnerSpacing = std::any_cast<ImVec2>(theme.styles["ItemInnerSpacing"]);
style.CellPadding = std::any_cast<ImVec2>(theme.styles["CellPadding"]);
style.TouchExtraPadding = std::any_cast<ImVec2>(theme.styles["TouchExtraPadding"]);
style.IndentSpacing = std::any_cast<float>(theme.styles["IndentSpacing"]);
style.ColumnsMinSpacing = std::any_cast<float>(theme.styles["ColumnsMinSpacing"]);
style.ScrollbarSize = std::any_cast<float>(theme.styles["ScrollbarSize"]);
style.ScrollbarRounding = std::any_cast<float>(theme.styles["ScrollbarRounding"]);
style.GrabMinSize = std::any_cast<float>(theme.styles["GrabMinSize"]);
style.GrabRounding = std::any_cast<float>(theme.styles["GrabRounding"]);
style.LogSliderDeadzone = std::any_cast<float>(theme.styles["LogSliderDeadzone"]);
style.TabRounding = std::any_cast<float>(theme.styles["TabRounding"]);
style.TabBorderSize = std::any_cast<float>(theme.styles["TabBorderSize"]);
style.TabMinWidthForCloseButton = std::any_cast<float>(theme.styles["TabMinWidthForCloseButton"]);
style.ColorButtonPosition = ImGuiDir(std::any_cast<int>(theme.styles["ColorButtonPosition"]));
style.ButtonTextAlign = std::any_cast<ImVec2>(theme.styles["ButtonTextAlign"]);
style.SelectableTextAlign = std::any_cast<ImVec2>(theme.styles["SelectableTextAlign"]);
style.DisplayWindowPadding = std::any_cast<ImVec2>(theme.styles["DisplayWindowPadding"]);
style.DisplaySafeAreaPadding = std::any_cast<ImVec2>(theme.styles["DisplaySafeAreaPadding"]);
style.MouseCursorScale = std::any_cast<float>(theme.styles["MouseCursorScale"]);
style.AntiAliasedLines = std::any_cast<bool>(theme.styles["AntiAliasedLines"]);
style.AntiAliasedLinesUseTex = std::any_cast<bool>(theme.styles["AntiAliasedLinesUseTex"]);
style.AntiAliasedFill = std::any_cast<bool>(theme.styles["AntiAliasedFill"]);
style.CurveTessellationTol = std::any_cast<float>(theme.styles["CurveTessellationTol"]);
style.CircleTessellationMaxError = std::any_cast<float>(theme.styles["CircleTessellationMaxError"]);
}
LOG_INFO("Theme applied: %s", name.c_str());
} }
void Settings::DrawMain() void Settings::DrawMain()
@ -172,41 +469,54 @@ namespace cheat::feature
ImGui::BeginGroupPanel("Interface Customization"); 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); for (auto& [themeName, themeData] : m_Themes)
renderer::SetGlobalFontSize(static_cast<float>(f_FontSize)); {
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<float>(f_FontSize));
ImGui::Spacing(); ImGui::Spacing();
ConfigWidget(f_ShowStyleEditor, "Show colors customization window."); ConfigWidget(f_ShowStyleEditor, "Show colors customization window.");
ImGui::Spacing(); ImGui::SameLine();
bool alreadyExist = m_Themes.count(themeNameBuffer_) > 0;
ImGui::Text("Save Customized Color"); if (ImGui::Button(alreadyExist ? "Replace Theme" : "Save Theme"))
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")))
{ {
if (this->f_DefaultTheme.value() != nameBuffer_) if (themeNameBuffer_.empty())
{ return;
if (ImGui::Button("Set as default"))
{ ThemeExport(themeNameBuffer_);
f_DefaultTheme = nameBuffer_; hasLoaded = false;
} f_DefaultTheme = themeNameBuffer_;
ImGui::SameLine(); Init();
if (ImGui::Button("Load")) themeNameBuffer_.clear();
{
Colors_Import(nameBuffer_);
}
}
}
else
{
ImGui::Text("Color does not exist.");
} }
} }
ImGui::EndGroupPanel(); ImGui::EndGroupPanel();

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <cheat-base/cheat/Feature.h> #include <cheat-base/cheat/Feature.h>
#include <cheat-base/config/config.h> #include <cheat-base/config/config.h>
#include <cheat-base/util.h>
namespace cheat::feature namespace cheat::feature
{ {
@ -40,10 +41,16 @@ namespace cheat::feature
const FeatureGUIInfo& GetGUIInfo() const override; const FeatureGUIInfo& GetGUIInfo() const override;
void DrawMain() override; void DrawMain() override;
void Init(); void Init();
void Colors_Export(std::string name);
void Colors_Import(std::string name);
private: private:
struct Theme{
std::map<std::string, ImVec4> colors;
std::map<std::string, std::any> styles;
};
std::map<std::string, Theme> m_Themes;
void ThemeImport(std::filesystem::directory_entry file);
void ThemeExport(std::string name, bool replace = false);
void ApplyTheme(std::string name);
void OnExitKeyPressed(); void OnExitKeyPressed();
Settings(); Settings();

View File

@ -157,7 +157,12 @@ namespace renderer
_isCustomFontLoaded = true; _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); static LRESULT CALLBACK hWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void OnPreRenderDX12() void OnPreRenderDX12()
@ -189,7 +194,7 @@ namespace renderer
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
LoadCustomFont(); LoadCustomFont();
SetupImGuiStyle(); LoadImGuiStyles();
//Set OriginalWndProcHandler to the Address of the Original WndProc function //Set OriginalWndProcHandler to the Address of the Original WndProc function
OriginalWndProcHandler = reinterpret_cast<WNDPROC>(SetWindowLongPtr(window, GWLP_WNDPROC, OriginalWndProcHandler = reinterpret_cast<WNDPROC>(SetWindowLongPtr(window, GWLP_WNDPROC,
@ -221,7 +226,7 @@ namespace renderer
io.IniFilename = imguiPath.c_str(); io.IniFilename = imguiPath.c_str();
LoadCustomFont(); LoadCustomFont();
SetupImGuiStyle(); LoadImGuiStyles();
//Set OriginalWndProcHandler to the Address of the Original WndProc function //Set OriginalWndProcHandler to the Address of the Original WndProc function
OriginalWndProcHandler = reinterpret_cast<WNDPROC>(SetWindowLongPtr(window, GWLP_WNDPROC, OriginalWndProcHandler = reinterpret_cast<WNDPROC>(SetWindowLongPtr(window, GWLP_WNDPROC,
@ -254,9 +259,6 @@ namespace renderer
pContext->OMSetRenderTargets(1, &mainRenderTargetView, nullptr); pContext->OMSetRenderTargets(1, &mainRenderTargetView, nullptr);
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); 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) 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); 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);
}
} }

View File

@ -17,7 +17,6 @@
namespace util namespace util
{ {
std::string GetLastErrorAsString(DWORD errorId /*= 0*/) std::string GetLastErrorAsString(DWORD errorId /*= 0*/)
{ {
//Get the error message ID, if any. //Get the error message ID, if any.

View File

@ -234,6 +234,8 @@
<Image Include="icons\Cave.png" /> <Image Include="icons\Cave.png" />
<Image Include="res\iconsHD\AbidingAngelfish.png" /> <Image Include="res\iconsHD\AbidingAngelfish.png" />
<Image Include="res\iconsHD\AdhigamaWood.png" /> <Image Include="res\iconsHD\AdhigamaWood.png" />
<Image Include="res\iconsHD\AeonblightDrake.png" />
<Image Include="res\iconsHD\Ajilenakh.png" />
<Image Include="res\iconsHD\Akuoumaru.png" /> <Image Include="res\iconsHD\Akuoumaru.png" />
<Image Include="res\iconsHD\Albedo.png" /> <Image Include="res\iconsHD\Albedo.png" />
<Image Include="res\iconsHD\AlleyHunter.png" /> <Image Include="res\iconsHD\AlleyHunter.png" />
@ -592,6 +594,7 @@
<Image Include="res\iconsHD\PreciousChest.png" /> <Image Include="res\iconsHD\PreciousChest.png" />
<Image Include="res\iconsHD\Predator.png" /> <Image Include="res\iconsHD\Predator.png" />
<Image Include="res\iconsHD\PressurePlate.png" /> <Image Include="res\iconsHD\PressurePlate.png" />
<Image Include="res\iconsHD\PrimalConstruct.png" />
<Image Include="res\iconsHD\PrimoGeovishap.png" /> <Image Include="res\iconsHD\PrimoGeovishap.png" />
<Image Include="res\iconsHD\PrimordialJadeCutter.png" /> <Image Include="res\iconsHD\PrimordialJadeCutter.png" />
<Image Include="res\iconsHD\PrimordialJadeWingedSpear.png" /> <Image Include="res\iconsHD\PrimordialJadeWingedSpear.png" />
@ -619,6 +622,7 @@
<Image Include="res\iconsHD\Razor.png" /> <Image Include="res\iconsHD\Razor.png" />
<Image Include="res\iconsHD\Recipe.png" /> <Image Include="res\iconsHD\Recipe.png" />
<Image Include="res\iconsHD\RecurveBow.png" /> <Image Include="res\iconsHD\RecurveBow.png" />
<Image Include="res\iconsHD\Redcrest.png" />
<Image Include="res\iconsHD\RedFinnedUnagi.png" /> <Image Include="res\iconsHD\RedFinnedUnagi.png" />
<Image Include="res\iconsHD\RedHornedLizard.png" /> <Image Include="res\iconsHD\RedHornedLizard.png" />
<Image Include="res\iconsHD\RedhornStonethresher.png" /> <Image Include="res\iconsHD\RedhornStonethresher.png" />
@ -662,7 +666,9 @@
<Image Include="res\iconsHD\Sapphire.png" /> <Image Include="res\iconsHD\Sapphire.png" />
<Image Include="res\iconsHD\SapwoodBlade.png" /> <Image Include="res\iconsHD\SapwoodBlade.png" />
<Image Include="res\iconsHD\Sayu.png" /> <Image Include="res\iconsHD\Sayu.png" />
<Image Include="res\iconsHD\Scarab.png" />
<Image Include="res\iconsHD\ScarletQuartz.png" /> <Image Include="res\iconsHD\ScarletQuartz.png" />
<Image Include="res\iconsHD\Scorpion.png" />
<Image Include="res\iconsHD\SeaGanoderma.png" /> <Image Include="res\iconsHD\SeaGanoderma.png" />
<Image Include="res\iconsHD\Seagrass.png" /> <Image Include="res\iconsHD\Seagrass.png" />
<Image Include="res\iconsHD\SealedChest.png" /> <Image Include="res\iconsHD\SealedChest.png" />
@ -676,6 +682,7 @@
<Image Include="res\iconsHD\Seelie.png" /> <Image Include="res\iconsHD\Seelie.png" />
<Image Include="res\iconsHD\SeelieCourt.png" /> <Image Include="res\iconsHD\SeelieCourt.png" />
<Image Include="res\iconsHD\SeelieLamp.png" /> <Image Include="res\iconsHD\SeelieLamp.png" />
<Image Include="res\iconsHD\SemiPerpetualControlMatrix.png" />
<Image Include="res\iconsHD\SerpentSpine.png" /> <Image Include="res\iconsHD\SerpentSpine.png" />
<Image Include="res\iconsHD\ShadowyHusk.png" /> <Image Include="res\iconsHD\ShadowyHusk.png" />
<Image Include="res\iconsHD\ShaggySumpterBeast.png" /> <Image Include="res\iconsHD\ShaggySumpterBeast.png" />
@ -783,6 +790,7 @@
<Image Include="res\iconsHD\VioletIbis.png" /> <Image Include="res\iconsHD\VioletIbis.png" />
<Image Include="res\iconsHD\Viparyas.png" /> <Image Include="res\iconsHD\Viparyas.png" />
<Image Include="res\iconsHD\VortexVanquisher.png" /> <Image Include="res\iconsHD\VortexVanquisher.png" />
<Image Include="res\iconsHD\Vulture.png" />
<Image Include="res\iconsHD\WarmingSeelie.png" /> <Image Include="res\iconsHD\WarmingSeelie.png" />
<Image Include="res\iconsHD\WasterGreatsword.png" /> <Image Include="res\iconsHD\WasterGreatsword.png" />
<Image Include="res\iconsHD\WavebreakersFin.png" /> <Image Include="res\iconsHD\WavebreakersFin.png" />
@ -821,6 +829,8 @@
<Image Include="res\iconsHD\Zhongli.png" /> <Image Include="res\iconsHD\Zhongli.png" />
<Image Include="res\icons\AbidingAngelfish.png" /> <Image Include="res\icons\AbidingAngelfish.png" />
<Image Include="res\icons\AdhigamaWood.png" /> <Image Include="res\icons\AdhigamaWood.png" />
<Image Include="res\icons\AeonblightDrake.png" />
<Image Include="res\icons\Ajilenakh.png" />
<Image Include="res\icons\Amber.png" /> <Image Include="res\icons\Amber.png" />
<Image Include="res\icons\Andrius.png" /> <Image Include="res\icons\Andrius.png" />
<Image Include="res\icons\Aranara.png" /> <Image Include="res\icons\Aranara.png" />
@ -1068,6 +1078,7 @@
<Image Include="res\icons\Pot.png" /> <Image Include="res\icons\Pot.png" />
<Image Include="res\icons\PreciousChest.png" /> <Image Include="res\icons\PreciousChest.png" />
<Image Include="res\icons\PressurePlate.png" /> <Image Include="res\icons\PressurePlate.png" />
<Image Include="res\icons\PrimalConstruct.png" />
<Image Include="res\icons\PrimoGeovishap.png" /> <Image Include="res\icons\PrimoGeovishap.png" />
<Image Include="res\icons\Pufferfish.png" /> <Image Include="res\icons\Pufferfish.png" />
<Image Include="res\icons\PurpleShirakodai.png" /> <Image Include="res\icons\PurpleShirakodai.png" />
@ -1082,6 +1093,7 @@
<Image Include="res\icons\RaimeiAngelfish.png" /> <Image Include="res\icons\RaimeiAngelfish.png" />
<Image Include="res\icons\RawMeat.png" /> <Image Include="res\icons\RawMeat.png" />
<Image Include="res\icons\Recipe.png" /> <Image Include="res\icons\Recipe.png" />
<Image Include="res\icons\Redcrest.png" />
<Image Include="res\icons\RedFinnedUnagi.png" /> <Image Include="res\icons\RedFinnedUnagi.png" />
<Image Include="res\icons\RedHornedLizard.png" /> <Image Include="res\icons\RedHornedLizard.png" />
<Image Include="res\icons\RedTailedWeasel.png" /> <Image Include="res\icons\RedTailedWeasel.png" />
@ -1110,7 +1122,9 @@
<Image Include="res\icons\SangonomiyaCohort.png" /> <Image Include="res\icons\SangonomiyaCohort.png" />
<Image Include="res\icons\SangoPearl.png" /> <Image Include="res\icons\SangoPearl.png" />
<Image Include="res\icons\Sapphire.png" /> <Image Include="res\icons\Sapphire.png" />
<Image Include="res\icons\Scarab.png" />
<Image Include="res\icons\ScarletQuartz.png" /> <Image Include="res\icons\ScarletQuartz.png" />
<Image Include="res\icons\Scorpion.png" />
<Image Include="res\icons\SeaGanoderma.png" /> <Image Include="res\icons\SeaGanoderma.png" />
<Image Include="res\icons\Seagrass.png" /> <Image Include="res\icons\Seagrass.png" />
<Image Include="res\icons\SealedChest.png" /> <Image Include="res\icons\SealedChest.png" />
@ -1123,6 +1137,7 @@
<Image Include="res\icons\Seelie.png" /> <Image Include="res\icons\Seelie.png" />
<Image Include="res\icons\SeelieCourt.png" /> <Image Include="res\icons\SeelieCourt.png" />
<Image Include="res\icons\SeelieLamp.png" /> <Image Include="res\icons\SeelieLamp.png" />
<Image Include="res\icons\SemiPerpetualControlMatrix.png" />
<Image Include="res\icons\ShadowyHusk.png" /> <Image Include="res\icons\ShadowyHusk.png" />
<Image Include="res\icons\ShaggySumpterBeast.png" /> <Image Include="res\icons\ShaggySumpterBeast.png" />
<Image Include="res\icons\Shogun.png" /> <Image Include="res\icons\Shogun.png" />
@ -1193,6 +1208,7 @@
<Image Include="res\icons\Violetgrass.png" /> <Image Include="res\icons\Violetgrass.png" />
<Image Include="res\icons\VioletIbis.png" /> <Image Include="res\icons\VioletIbis.png" />
<Image Include="res\icons\Viparyas.png" /> <Image Include="res\icons\Viparyas.png" />
<Image Include="res\icons\Vulture.png" />
<Image Include="res\icons\WarmingSeelie.png" /> <Image Include="res\icons\WarmingSeelie.png" />
<Image Include="res\icons\WaveriderWaypointCannotTeleport.png" /> <Image Include="res\icons\WaveriderWaypointCannotTeleport.png" />
<Image Include="res\icons\Weapon.png" /> <Image Include="res\icons\Weapon.png" />

View File

@ -3466,5 +3466,53 @@
<Image Include="res\iconsHD\Nilou.png"> <Image Include="res\iconsHD\Nilou.png">
<Filter>Resource Files</Filter> <Filter>Resource Files</Filter>
</Image> </Image>
<Image Include="res\iconsHD\Scorpion.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\SemiPerpetualControlMatrix.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\Vulture.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\AeonblightDrake.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\Ajilenakh.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\PrimalConstruct.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\Redcrest.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\Scarab.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\Vulture.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\AeonblightDrake.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\Ajilenakh.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\PrimalConstruct.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\Redcrest.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\Scarab.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\Scorpion.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\SemiPerpetualControlMatrix.png">
<Filter>Resource Files</Filter>
</Image>
</ItemGroup> </ItemGroup>
</Project> </Project>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View File

@ -83,8 +83,12 @@ HDADHIGAMAWOOD PNG "iconsHD\\AdhigamaWood.png"
HDADORNEDUNAGI PNG "iconsHD\\AdornedUnagi.png" HDADORNEDUNAGI PNG "iconsHD\\AdornedUnagi.png"
HDAEONBLIGHTDRAKE PNG "iconsHD\\AeonblightDrake.png"
HDAIZENMEDAKA PNG "iconsHD\\AizenMedaka.png" HDAIZENMEDAKA PNG "iconsHD\\AizenMedaka.png"
HDAJILENAKH PNG "iconsHD\\Ajilenakh.png"
HDAKAIMAOU PNG "iconsHD\\AkaiMaou.png" HDAKAIMAOU PNG "iconsHD\\AkaiMaou.png"
HDAKUOUMARU PNG "iconsHD\\Akuoumaru.png" HDAKUOUMARU PNG "iconsHD\\Akuoumaru.png"
@ -237,7 +241,7 @@ HDCINNABARSPINDLE PNG "iconsHD\\CinnabarSpindle.png"
HDCLOUDLEISURESTEPS PNG "iconsHD\\CloudleisureSteps.png" HDCLOUDLEISURESTEPS PNG "iconsHD\\CloudleisureSteps.png"
HDCLUSTERLEAFOFCULTIVATION PNG "iconsHD\\ClusterleafOfCultivation.png" HDCLUSTERLEAFOFCULTIVATION PNG "iconsHD\\ClusterleafOfCultivation.png"
HDCOLLEI PNG "iconsHD\\Collei.png" HDCOLLEI PNG "iconsHD\\Collei.png"
@ -297,7 +301,7 @@ HDDARKIRONSWORD PNG "iconsHD\\DarkIronSword.png"
HDDAWNCATCHER PNG "iconsHD\\Dawncatcher.png" HDDAWNCATCHER PNG "iconsHD\\Dawncatcher.png"
HDDAYNIGHTSWITCHINGMECHANISM PNG "iconsHD\\DayNightSwitchingMechanism.png" HDDAYNIGHTSWITCHINGMECHANISM PNG "iconsHD\\DayNightSwitchingMechanism.png"
HDDEATHMATCH PNG "iconsHD\\Deathmatch.png" HDDEATHMATCH PNG "iconsHD\\Deathmatch.png"
@ -381,7 +385,7 @@ HDEMERALDORB PNG "iconsHD\\EmeraldOrb.png"
HDENDOFTHELINE PNG "iconsHD\\EndoftheLine.png" HDENDOFTHELINE PNG "iconsHD\\EndoftheLine.png"
HDENEMIESFIRSTTIMEVICTORY PNG "iconsHD\\EnemiesFirstTimeVictory.png" HDENEMIESFIRSTTIMEVICTORY PNG "iconsHD\\EnemiesFirstTimeVictory.png"
HDENGULFINGLIGHTNING PNG "iconsHD\\EngulfingLightning.png" HDENGULFINGLIGHTNING PNG "iconsHD\\EngulfingLightning.png"
@ -641,7 +645,7 @@ HDLIZARDTAIL PNG "iconsHD\\LizardTail.png"
HDLOACHPEARL PNG "iconsHD\\LoachPearl.png" HDLOACHPEARL PNG "iconsHD\\LoachPearl.png"
HDLOSTPRAYERTOTHESACREDWINDS PNG "iconsHD\\LostPrayertotheSacredWinds.png" HDLOSTPRAYERTOTHESACREDWINDS PNG "iconsHD\\LostPrayertotheSacredWinds.png"
HDLOTUSHEAD PNG "iconsHD\\LotusHead.png" HDLOTUSHEAD PNG "iconsHD\\LotusHead.png"
@ -659,7 +663,7 @@ HDLUMINOUSSEELIE PNG "iconsHD\\LuminousSeelie.png"
HDLUNGEDSTICKLEBACK PNG "iconsHD\\LungedStickleback.png" HDLUNGEDSTICKLEBACK PNG "iconsHD\\LungedStickleback.png"
HDLUPUSBOREASDOMINATOROFWOLVES PNG "iconsHD\\LupusBoreasDominatorofWolves.png" HDLUPUSBOREASDOMINATOROFWOLVES PNG "iconsHD\\LupusBoreasDominatorofWolves.png"
HDLUXURIOUSCHEST PNG "iconsHD\\LuxuriousChest.png" HDLUXURIOUSCHEST PNG "iconsHD\\LuxuriousChest.png"
@ -777,7 +781,7 @@ HDPALEREDCRAB PNG "iconsHD\\PaleRedCrab.png"
HDPEACHOFTHEDEEPWAVES PNG "iconsHD\\PeachoftheDeepWaves.png" HDPEACHOFTHEDEEPWAVES PNG "iconsHD\\PeachoftheDeepWaves.png"
HDPERPETUALMECHANICALARRAY PNG "iconsHD\\PerpetualMechanicalArray.png" HDPERPETUALMECHANICALARRAY PNG "iconsHD\\PerpetualMechanicalArray.png"
HDPHANTASMALGATE PNG "iconsHD\\PhantasmalGate.png" HDPHANTASMALGATE PNG "iconsHD\\PhantasmalGate.png"
@ -807,11 +811,13 @@ HDPREDATOR PNG "iconsHD\\Predator.png"
HDPRESSUREPLATE PNG "iconsHD\\PressurePlate.png" HDPRESSUREPLATE PNG "iconsHD\\PressurePlate.png"
HDPRIMALCONSTRUCT PNG "iconsHD\\PrimalConstruct.png"
HDPRIMOGEOVISHAP PNG "iconsHD\\PrimoGeovishap.png" HDPRIMOGEOVISHAP PNG "iconsHD\\PrimoGeovishap.png"
HDPRIMORDIALJADECUTTER PNG "iconsHD\\PrimordialJadeCutter.png" HDPRIMORDIALJADECUTTER PNG "iconsHD\\PrimordialJadeCutter.png"
HDPRIMORDIALJADEWINGEDSPEAR PNG "iconsHD\\PrimordialJadeWingedSpear.png" HDPRIMORDIALJADEWINGEDSPEAR PNG "iconsHD\\PrimordialJadeWingedSpear.png"
HDPROTOTYPEAMBER PNG "iconsHD\\PrototypeAmber.png" HDPROTOTYPEAMBER PNG "iconsHD\\PrototypeAmber.png"
@ -861,6 +867,8 @@ HDRECIPE PNG "iconsHD\\Recipe.png"
HDRECURVEBOW PNG "iconsHD\\RecurveBow.png" HDRECURVEBOW PNG "iconsHD\\RecurveBow.png"
HDREDCREST PNG "iconsHD\\Redcrest.png"
HDREDFINNEDUNAGI PNG "iconsHD\\RedFinnedUnagi.png" HDREDFINNEDUNAGI PNG "iconsHD\\RedFinnedUnagi.png"
HDREDHORNEDLIZARD PNG "iconsHD\\RedHornedLizard.png" HDREDHORNEDLIZARD PNG "iconsHD\\RedHornedLizard.png"
@ -947,8 +955,12 @@ HDSAPWOODBLADE PNG "iconsHD\\SapwoodBlade.png"
HDSAYU PNG "iconsHD\\Sayu.png" HDSAYU PNG "iconsHD\\Sayu.png"
HDSCARAB PNG "iconsHD\\Scarab.png"
HDSCARLETQUARTZ PNG "iconsHD\\ScarletQuartz.png" HDSCARLETQUARTZ PNG "iconsHD\\ScarletQuartz.png"
HDSCORPION PNG "iconsHD\\Scorpion.png"
HDSEAGANODERMA PNG "iconsHD\\SeaGanoderma.png" HDSEAGANODERMA PNG "iconsHD\\SeaGanoderma.png"
HDSEAGRASS PNG "iconsHD\\Seagrass.png" HDSEAGRASS PNG "iconsHD\\Seagrass.png"
@ -977,6 +989,8 @@ HDSEELIECOURT PNG "iconsHD\\SeelieCourt.png"
HDSEELIELAMP PNG "iconsHD\\SeelieLamp.png" HDSEELIELAMP PNG "iconsHD\\SeelieLamp.png"
HDSEMIPERPETUALCONTROLMATRIX PNG "iconsHD\\SemiPerpetualControlMatrix.png"
HDSERPENTSPINE PNG "iconsHD\\SerpentSpine.png" HDSERPENTSPINE PNG "iconsHD\\SerpentSpine.png"
HDSHADOWYHUSK PNG "iconsHD\\ShadowyHusk.png" HDSHADOWYHUSK PNG "iconsHD\\ShadowyHusk.png"
@ -1075,10 +1089,10 @@ HDSTRETCHYFUNGUS PNG "iconsHD\\StretchyFungus.png"
HDSUCROSE PNG "iconsHD\\Sucrose.png" HDSUCROSE PNG "iconsHD\\Sucrose.png"
HDSUMERUROSE PNG "iconsHD\\SumeruRose.png"
HDSUMERUPUZZLES PNG "iconsHD\\SumeruPuzzles.png" HDSUMERUPUZZLES PNG "iconsHD\\SumeruPuzzles.png"
HDSUMERUROSE PNG "iconsHD\\SumeruRose.png"
HDSUMERUSHRINEOFDEPTHS PNG "iconsHD\\SumeruShrineofDepths.png" HDSUMERUSHRINEOFDEPTHS PNG "iconsHD\\SumeruShrineofDepths.png"
HDSUMMITSHAPER PNG "iconsHD\\SummitShaper.png" HDSUMMITSHAPER PNG "iconsHD\\SummitShaper.png"
@ -1139,7 +1153,7 @@ HDTHOMA PNG "iconsHD\\Thoma.png"
HDTHREEBOXES PNG "iconsHD\\ThreeBoxes.png" HDTHREEBOXES PNG "iconsHD\\ThreeBoxes.png"
HDTHRILLINGTALESOFDRAGONSLAYERS PNG "iconsHD\\ThrillingTalesofDragonSlayers.png" HDTHRILLINGTALESOFDRAGONSLAYERS PNG "iconsHD\\ThrillingTalesofDragonSlayers.png"
HDTHUNDERINGPULSE PNG "iconsHD\\ThunderingPulse.png" HDTHUNDERINGPULSE PNG "iconsHD\\ThunderingPulse.png"
@ -1189,13 +1203,15 @@ HDVIPARYAS PNG "iconsHD\\Viparyas.png"
HDVORTEXVANQUISHER PNG "iconsHD\\VortexVanquisher.png" HDVORTEXVANQUISHER PNG "iconsHD\\VortexVanquisher.png"
HDVULTURE PNG "iconsHD\\Vulture.png"
HDWARMINGSEELIE PNG "iconsHD\\WarmingSeelie.png" HDWARMINGSEELIE PNG "iconsHD\\WarmingSeelie.png"
HDWASTERGREATSWORD PNG "iconsHD\\WasterGreatsword.png" HDWASTERGREATSWORD PNG "iconsHD\\WasterGreatsword.png"
HDWAVEBREAKERSFIN PNG "iconsHD\\WavebreakersFin.png" HDWAVEBREAKERSFIN PNG "iconsHD\\WavebreakersFin.png"
HDWAVERIDERWAYPOINTCANNOTTELEPORT PNG "iconsHD\\WaveriderWaypointCannotTeleport.png" HDWAVERIDERWAYPOINTCANNOTTELEPORT PNG "iconsHD\\WaveriderWaypointCannotTeleport.png"
HDWEAPON PNG "iconsHD\\Weapon.png" HDWEAPON PNG "iconsHD\\Weapon.png"
@ -1273,8 +1289,12 @@ ADHIGAMAWOOD PNG "icons\\AdhigamaWood.png"
ADORNEDUNAGI PNG "icons\\AdornedUnagi.png" ADORNEDUNAGI PNG "icons\\AdornedUnagi.png"
AEONBLIGHTDRAKE PNG "icons\\AeonblightDrake.png"
AIZENMEDAKA PNG "icons\\AizenMedaka.png" AIZENMEDAKA PNG "icons\\AizenMedaka.png"
AJILENAKH PNG "icons\\Ajilenakh.png"
AKAIMAOU PNG "icons\\AkaiMaou.png" AKAIMAOU PNG "icons\\AkaiMaou.png"
AMAKUMOFRUIT PNG "icons\\AmakumoFruit.png" AMAKUMOFRUIT PNG "icons\\AmakumoFruit.png"
@ -1377,7 +1397,7 @@ CICIN PNG "icons\\Cicin.png"
CLOUDLEISURESTEPS PNG "icons\\CloudleisureSteps.png" CLOUDLEISURESTEPS PNG "icons\\CloudleisureSteps.png"
CLUSTERLEAFOFCULTIVATION PNG "icons\\ClusterleafOfCultivation.png" CLUSTERLEAFOFCULTIVATION PNG "icons\\ClusterleafOfCultivation.png"
COMMONCHEST PNG "icons\\CommonChest.png" COMMONCHEST PNG "icons\\CommonChest.png"
@ -1425,7 +1445,7 @@ DANDY PNG "icons\\Dandy.png"
DAWNCATCHER PNG "icons\\Dawncatcher.png" DAWNCATCHER PNG "icons\\Dawncatcher.png"
DAYNIGHTSWITCHINGMECHANISM PNG "icons\\DayNightSwitchingMechanism.png" DAYNIGHTSWITCHINGMECHANISM PNG "icons\\DayNightSwitchingMechanism.png"
DEEPSEAUNAGI PNG "icons\\DeepSeaUnagi.png" DEEPSEAUNAGI PNG "icons\\DeepSeaUnagi.png"
@ -1665,7 +1685,7 @@ LUMINOUSSEELIE PNG "icons\\LuminousSeelie.png"
LUNGEDSTICKLEBACK PNG "icons\\LungedStickleback.png" LUNGEDSTICKLEBACK PNG "icons\\LungedStickleback.png"
LUPUSBOREASDOMINATOROFWOLVES PNG "icons\\LupusBoreasDominatorofWolves.png" LUPUSBOREASDOMINATOROFWOLVES PNG "icons\\LupusBoreasDominatorofWolves.png"
LUXURIOUSCHEST PNG "icons\\LuxuriousChest.png" LUXURIOUSCHEST PNG "icons\\LuxuriousChest.png"
@ -1777,6 +1797,8 @@ PRECIOUSCHEST PNG "icons\\PreciousChest.png"
PRESSUREPLATE PNG "icons\\PressurePlate.png" PRESSUREPLATE PNG "icons\\PressurePlate.png"
PRIMALCONSTRUCT PNG "icons\\PrimalConstruct.png"
PRIMOGEOVISHAP PNG "icons\\PrimoGeovishap.png" PRIMOGEOVISHAP PNG "icons\\PrimoGeovishap.png"
PUFFERFISH PNG "icons\\Pufferfish.png" PUFFERFISH PNG "icons\\Pufferfish.png"
@ -1805,6 +1827,8 @@ RAWMEAT PNG "icons\\RawMeat.png"
RECIPE PNG "icons\\Recipe.png" RECIPE PNG "icons\\Recipe.png"
REDCREST PNG "icons\\Redcrest.png"
REDFINNEDUNAGI PNG "icons\\RedFinnedUnagi.png" REDFINNEDUNAGI PNG "icons\\RedFinnedUnagi.png"
REDHORNEDLIZARD PNG "icons\\RedHornedLizard.png" REDHORNEDLIZARD PNG "icons\\RedHornedLizard.png"
@ -1861,8 +1885,12 @@ SANGOPEARL PNG "icons\\SangoPearl.png"
SAPPHIRE PNG "icons\\Sapphire.png" SAPPHIRE PNG "icons\\Sapphire.png"
SCARAB PNG "icons\\Scarab.png"
SCARLETQUARTZ PNG "icons\\ScarletQuartz.png" SCARLETQUARTZ PNG "icons\\ScarletQuartz.png"
SCORPION PNG "icons\\Scorpion.png"
SEAGANODERMA PNG "icons\\SeaGanoderma.png" SEAGANODERMA PNG "icons\\SeaGanoderma.png"
SEAGRASS PNG "icons\\Seagrass.png" SEAGRASS PNG "icons\\Seagrass.png"
@ -1889,6 +1917,8 @@ SEELIECOURT PNG "icons\\SeelieCourt.png"
SEELIELAMP PNG "icons\\SeelieLamp.png" SEELIELAMP PNG "icons\\SeelieLamp.png"
SEMIPERPETUALCONTROLMATRIX PNG "icons\\SemiPerpetualControlMatrix.png"
SHADOWYHUSK PNG "icons\\ShadowyHusk.png" SHADOWYHUSK PNG "icons\\ShadowyHusk.png"
SHAGGYSUMPTERBEAST PNG "icons\\ShaggySumpterBeast.png" SHAGGYSUMPTERBEAST PNG "icons\\ShaggySumpterBeast.png"
@ -1897,8 +1927,6 @@ SHOGUN PNG "icons\\Shogun.png"
SHOGUNATEINFANTRY PNG "icons\\ShogunateInfantry.png" SHOGUNATEINFANTRY PNG "icons\\ShogunateInfantry.png"
SUMERUPUZZLES PNG "icons\\SumeruPuzzles.png"
SHRINEOFDEPTH PNG "icons\\ShrineOfDepth.png" SHRINEOFDEPTH PNG "icons\\ShrineOfDepth.png"
SHROOMBOAR PNG "icons\\Shroomboar.png" SHROOMBOAR PNG "icons\\Shroomboar.png"
@ -1953,6 +1981,8 @@ STRANGETOOTH PNG "icons\\StrangeTooth.png"
STRETCHYFUNGUS PNG "icons\\StretchyFungus.png" STRETCHYFUNGUS PNG "icons\\StretchyFungus.png"
SUMERUPUZZLES PNG "icons\\SumeruPuzzles.png"
SUMERUROSE PNG "icons\\SumeruRose.png" SUMERUROSE PNG "icons\\SumeruRose.png"
SUMERUSHRINEOFDEPTHS PNG "icons\\SumeruShrineofDepths.png" SUMERUSHRINEOFDEPTHS PNG "icons\\SumeruShrineofDepths.png"
@ -1987,10 +2017,10 @@ THEEREMITES PNG "icons\\TheEremites.png"
THEGREATSNOWBOARKING PNG "icons\\TheGreatSnowboarKing.png" THEGREATSNOWBOARKING PNG "icons\\TheGreatSnowboarKing.png"
THEWITHERING PNG "icons\\TheWithering.png"
THERAVENFORUM PNG "icons\\TheRavenForum.png" THERAVENFORUM PNG "icons\\TheRavenForum.png"
THEWITHERING PNG "icons\\TheWithering.png"
THREEBOXES PNG "icons\\ThreeBoxes.png" THREEBOXES PNG "icons\\ThreeBoxes.png"
THUNDERMANIFESTATION PNG "icons\\ThunderManifestation.png" THUNDERMANIFESTATION PNG "icons\\ThunderManifestation.png"
@ -2027,9 +2057,11 @@ VIOLETIBIS PNG "icons\\VioletIbis.png"
VIPARYAS PNG "icons\\Viparyas.png" VIPARYAS PNG "icons\\Viparyas.png"
VULTURE PNG "icons\\Vulture.png"
WARMINGSEELIE PNG "icons\\WarmingSeelie.png" WARMINGSEELIE PNG "icons\\WarmingSeelie.png"
WAVERIDERWAYPOINTCANNOTTELEPORT PNG "icons\\WaveriderWaypointCannotTeleport.png" WAVERIDERWAYPOINTCANNOTTELEPORT PNG "icons\\WaveriderWaypointCannotTeleport.png"
WEAPON PNG "icons\\Weapon.png" WEAPON PNG "icons\\Weapon.png"

View File

@ -146,6 +146,26 @@ namespace cheat::feature
return instance; 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<app::Transform*>(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) void ESP::GetNpcName(std::string& name)
{ {
if (name.find("Avatar") != std::string::npos) if (name.find("Avatar") != std::string::npos)
@ -414,9 +434,18 @@ namespace cheat::feature
auto& entry = field.value(); auto& entry = field.value();
if (!entry.m_Enabled || !m_FilterExecutor.ApplyFilter(entity, filter)) if (!entry.m_Enabled || !m_FilterExecutor.ApplyFilter(entity, filter))
continue; 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 (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) if (entity->type() == app::EntityType__Enum_1::Avatar || entity->type() == app::EntityType__Enum_1::NPC)
{ {
std::string name = entity->name(); std::string name = entity->name();
@ -591,7 +620,7 @@ namespace cheat::feature
ADD_FILTER_FIELD(chest, LuxuriousChest); ADD_FILTER_FIELD(chest, LuxuriousChest);
ADD_FILTER_FIELD(chest, RemarkableChest); ADD_FILTER_FIELD(chest, RemarkableChest);
// Other Chests // Other Chests
//ADD_FILTER_FIELD(chest, BuriedChest); // Shared name, commented for now ADD_FILTER_FIELD(chest, BuriedChest);
ADD_FILTER_FIELD(chest, SearchPoint); ADD_FILTER_FIELD(chest, SearchPoint);
@ -652,6 +681,7 @@ namespace cheat::feature
ADD_FILTER_FIELD(living, Onikabuto); ADD_FILTER_FIELD(living, Onikabuto);
ADD_FILTER_FIELD(living, Pigeon); ADD_FILTER_FIELD(living, Pigeon);
ADD_FILTER_FIELD(living, Salamander); ADD_FILTER_FIELD(living, Salamander);
ADD_FILTER_FIELD(living, Scarab);
ADD_FILTER_FIELD(living, Squirrel); ADD_FILTER_FIELD(living, Squirrel);
ADD_FILTER_FIELD(living, Starconch); ADD_FILTER_FIELD(living, Starconch);
ADD_FILTER_FIELD(living, Weasel); ADD_FILTER_FIELD(living, Weasel);
@ -705,6 +735,7 @@ namespace cheat::feature
ADD_FILTER_FIELD(monster, MaguuKenki); ADD_FILTER_FIELD(monster, MaguuKenki);
// Sumeru // Sumeru
ADD_FILTER_FIELD(monster, JadeplumeTerrorshroom); ADD_FILTER_FIELD(monster, JadeplumeTerrorshroom);
ADD_FILTER_FIELD(monster, AeonblightDrake);
// Regular. Alphabetical. // Regular. Alphabetical.
ADD_FILTER_FIELD(monster, AbyssMage); ADD_FILTER_FIELD(monster, AbyssMage);
ADD_FILTER_FIELD(monster, BlackSerpentKnight); ADD_FILTER_FIELD(monster, BlackSerpentKnight);
@ -735,6 +766,7 @@ namespace cheat::feature
ADD_FILTER_FIELD(monster, OceanidFrog); ADD_FILTER_FIELD(monster, OceanidFrog);
ADD_FILTER_FIELD(monster, OceanidSquirrel); ADD_FILTER_FIELD(monster, OceanidSquirrel);
ADD_FILTER_FIELD(monster, OceanidWigeon); ADD_FILTER_FIELD(monster, OceanidWigeon);
ADD_FILTER_FIELD(monster, PrimalConstruct);
ADD_FILTER_FIELD(monster, PyroAbyssLector); ADD_FILTER_FIELD(monster, PyroAbyssLector);
ADD_FILTER_FIELD(monster, Rifthound); ADD_FILTER_FIELD(monster, Rifthound);
ADD_FILTER_FIELD(monster, RifthoundWhelp); ADD_FILTER_FIELD(monster, RifthoundWhelp);
@ -746,6 +778,8 @@ namespace cheat::feature
ADD_FILTER_FIELD(monster, RuinSentinel); ADD_FILTER_FIELD(monster, RuinSentinel);
ADD_FILTER_FIELD(monster, Samachurl); ADD_FILTER_FIELD(monster, Samachurl);
ADD_FILTER_FIELD(monster, SangonomiyaCohort); ADD_FILTER_FIELD(monster, SangonomiyaCohort);
ADD_FILTER_FIELD(monster, Scorpion);
ADD_FILTER_FIELD(monster, SemiPerpetualControlMatrix);
ADD_FILTER_FIELD(monster, ShadowyHusk); ADD_FILTER_FIELD(monster, ShadowyHusk);
ADD_FILTER_FIELD(monster, ShaggySumpterBeast); ADD_FILTER_FIELD(monster, ShaggySumpterBeast);
ADD_FILTER_FIELD(monster, ShogunateInfantry); ADD_FILTER_FIELD(monster, ShogunateInfantry);
@ -755,10 +789,12 @@ namespace cheat::feature
ADD_FILTER_FIELD(monster, StretchyFungus); ADD_FILTER_FIELD(monster, StretchyFungus);
ADD_FILTER_FIELD(monster, TreasureHoarder); ADD_FILTER_FIELD(monster, TreasureHoarder);
ADD_FILTER_FIELD(monster, UnusualHilichurl); ADD_FILTER_FIELD(monster, UnusualHilichurl);
ADD_FILTER_FIELD(monster, Vulture);
ADD_FILTER_FIELD(monster, WhirlingFungus); ADD_FILTER_FIELD(monster, WhirlingFungus);
ADD_FILTER_FIELD(monster, Whopperflower); ADD_FILTER_FIELD(monster, Whopperflower);
ADD_FILTER_FIELD(monster, WingedShroom); ADD_FILTER_FIELD(monster, WingedShroom);
ADD_FILTER_FIELD(plant, Ajilenakh);
ADD_FILTER_FIELD(plant, AmakumoFruit); ADD_FILTER_FIELD(plant, AmakumoFruit);
ADD_FILTER_FIELD(plant, Apple); ADD_FILTER_FIELD(plant, Apple);
ADD_FILTER_FIELD(plant, BambooShoot); ADD_FILTER_FIELD(plant, BambooShoot);
@ -788,6 +824,7 @@ namespace cheat::feature
ADD_FILTER_FIELD(plant, Pinecone); ADD_FILTER_FIELD(plant, Pinecone);
ADD_FILTER_FIELD(plant, Qingxin); ADD_FILTER_FIELD(plant, Qingxin);
ADD_FILTER_FIELD(plant, Radish); ADD_FILTER_FIELD(plant, Radish);
ADD_FILTER_FIELD(plant, Redcrest);
ADD_FILTER_FIELD(plant, RukkhashavaMushroom); ADD_FILTER_FIELD(plant, RukkhashavaMushroom);
ADD_FILTER_FIELD(plant, SakuraBloom); ADD_FILTER_FIELD(plant, SakuraBloom);
ADD_FILTER_FIELD(plant, SangoPearl); ADD_FILTER_FIELD(plant, SangoPearl);

View File

@ -35,6 +35,7 @@ namespace cheat::feature
config::Field<bool> f_DrawDistance; config::Field<bool> f_DrawDistance;
config::Field<bool> f_DrawName; config::Field<bool> f_DrawName;
//config::Field<bool> f_HideCompleted;
config::Field<float> f_ArrowRadius; config::Field<float> f_ArrowRadius;
config::Field<float> f_OutlineThickness; config::Field<float> f_OutlineThickness;
config::Field<float> f_TracerSize; config::Field<float> f_TracerSize;
@ -80,6 +81,7 @@ namespace cheat::feature
void DrawFilterField(const config::Field<esp::ESPItem>& field); void DrawFilterField(const config::Field<esp::ESPItem>& field);
void GetNpcName(std::string& name); void GetNpcName(std::string& name);
bool isBuriedChest(game::Entity* entity);
void OnKeyUp(short key, bool& cancelled); void OnKeyUp(short key, bool& cancelled);

View File

@ -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 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 Crane = { EntityType__Enum_1::Monster, "Crane" };
SimpleFilter Falcon = { EntityType__Enum_1::Monster, "Falcon" }; 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 Salamander = { EntityType__Enum_1::EnvAnimal, "Salamander" };
SimpleFilter DuskBird = { EntityType__Enum_1::Monster, "Pigeon_Beak" }; SimpleFilter DuskBird = { EntityType__Enum_1::Monster, "Pigeon_Beak" };
SimpleFilter Pigeon = { EntityType__Enum_1::Monster, "Pigeon_0" }; SimpleFilter Pigeon = { EntityType__Enum_1::Monster, "Pigeon_0" };
@ -118,6 +118,7 @@ namespace cheat::game::filters
SimpleFilter Kitsune = { EntityType__Enum_1::EnvAnimal, "Vulpes" }; SimpleFilter Kitsune = { EntityType__Enum_1::EnvAnimal, "Vulpes" };
SimpleFilter BakeDanuki = { EntityType__Enum_1::Monster, "Inu_Tanuki" }; SimpleFilter BakeDanuki = { EntityType__Enum_1::Monster, "Inu_Tanuki" };
SimpleFilter Meat = { EntityType__Enum_1::GatherObject , { "_Food_BirdMeat", "_Food_Meat", "_Fishmeat" } }; SimpleFilter Meat = { EntityType__Enum_1::GatherObject , { "_Food_BirdMeat", "_Food_Meat", "_Fishmeat" } };
SimpleFilter Scarab = { EntityType__Enum_1::EnvAnimal, "Scarab" };
} }
namespace mineral namespace mineral
@ -161,7 +162,7 @@ namespace cheat::game::filters
SimpleFilter Mitachurl = { EntityType__Enum_1::Monster, "_Brute" }; SimpleFilter Mitachurl = { EntityType__Enum_1::Monster, "_Brute" };
SimpleFilter Nobushi = { EntityType__Enum_1::Monster, "_Ronin" }; SimpleFilter Nobushi = { EntityType__Enum_1::Monster, "_Ronin" };
SimpleFilter Kairagi = { EntityType__Enum_1::Monster, "_Kairagi" }; 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 RuinGuard = { EntityType__Enum_1::Monster, "_Defender" };
SimpleFilter RuinHunter = { EntityType__Enum_1::Monster, "_Formathr" }; SimpleFilter RuinHunter = { EntityType__Enum_1::Monster, "_Formathr" };
SimpleFilter RuinGrader = { EntityType__Enum_1::Monster, "_Konungmathr" }; SimpleFilter RuinGrader = { EntityType__Enum_1::Monster, "_Konungmathr" };
@ -229,6 +230,11 @@ namespace cheat::game::filters
SimpleFilter ShaggySumpterBeast = { EntityType__Enum_1::Monster, "_Megamoth_" }; SimpleFilter ShaggySumpterBeast = { EntityType__Enum_1::Monster, "_Megamoth_" };
SimpleFilter Spincrocodile = { EntityType__Enum_1::Monster, "_Gator" }; SimpleFilter Spincrocodile = { EntityType__Enum_1::Monster, "_Gator" };
SimpleFilter SentryTurrets = { EntityType__Enum_1::Field, "SentryTurrets_" }; 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 namespace plant
@ -284,6 +290,8 @@ namespace cheat::game::filters
SimpleFilter SumeruRose = { EntityType__Enum_1::GatherObject, "_XumiRose" }; SimpleFilter SumeruRose = { EntityType__Enum_1::GatherObject, "_XumiRose" };
SimpleFilter Viparyas = { EntityType__Enum_1::GatherObject, "_DreamerPlant" }; SimpleFilter Viparyas = { EntityType__Enum_1::GatherObject, "_DreamerPlant" };
SimpleFilter ZaytunPeach = { EntityType__Enum_1::GatherObject, "_Olea" }; SimpleFilter ZaytunPeach = { EntityType__Enum_1::GatherObject, "_Olea" };
SimpleFilter Redcrest = { EntityType__Enum_1::GatherObject, "RedPearlFruit" };
SimpleFilter Ajilenakh = { EntityType__Enum_1::GatherObject, "DatePalm" };
} }
namespace puzzle namespace puzzle
@ -416,7 +424,9 @@ namespace cheat::game::filters
living::DuskBird, living::DuskBird,
monster::ShaggySumpterBeast, monster::ShaggySumpterBeast,
monster::RishbolandTiger, monster::RishbolandTiger,
monster::Spincrocodile monster::Spincrocodile,
monster::Scorpion,
monster::Vulture
}; };
SimpleFilter AnimalPickUp = { SimpleFilter AnimalPickUp = {
living::CrystalCore, living::CrystalCore,
@ -432,7 +442,8 @@ namespace cheat::game::filters
living::Starconch, living::Starconch,
living::BirdEgg, living::BirdEgg,
living::WeaselThief, living::WeaselThief,
living::Fish living::Fish,
living::Scarab
}; };
SimpleFilter AnimalNPC = { SimpleFilter AnimalNPC = {
living::Dog, living::Dog,
@ -461,7 +472,6 @@ namespace cheat::game::filters
monster::WhirlingFungus, monster::WhirlingFungus,
monster::WingedShroom, monster::WingedShroom,
monster::GroundedShroom, monster::GroundedShroom,
monster::ShaggySumpterBeast
}; };
SimpleFilter MonsterElites = { SimpleFilter MonsterElites = {
monster::Mitachurl, monster::Mitachurl,
@ -485,7 +495,8 @@ namespace cheat::game::filters
monster::Geovishap, monster::Geovishap,
monster::HydroBathysmalVishap, monster::HydroBathysmalVishap,
monster::EyeOfTheStorm, monster::EyeOfTheStorm,
monster::BlackSerpentKnight monster::BlackSerpentKnight,
monster::PrimalConstruct
}; };
SimpleFilter MonsterBosses = { SimpleFilter MonsterBosses = {
// Adding these comments for better tracking. // Adding these comments for better tracking.
@ -528,7 +539,9 @@ namespace cheat::game::filters
monster::ElectroBathysmalVishap, monster::ElectroBathysmalVishap,
// Sumeru // Sumeru
monster::ElectroRegisvine, monster::ElectroRegisvine,
monster::JadeplumeTerrorshroom monster::JadeplumeTerrorshroom,
monster::AeonblightDrake,
monster::SemiPerpetualControlMatrix
}; };
SimpleFilter MonsterShielded = { SimpleFilter MonsterShielded = {

View File

@ -118,6 +118,7 @@ namespace cheat::game::filters
extern SimpleFilter Kitsune; extern SimpleFilter Kitsune;
extern SimpleFilter BakeDanuki; extern SimpleFilter BakeDanuki;
extern SimpleFilter Meat; extern SimpleFilter Meat;
extern SimpleFilter Scarab;
} }
namespace mineral namespace mineral
@ -229,6 +230,11 @@ namespace cheat::game::filters
extern SimpleFilter ShaggySumpterBeast; extern SimpleFilter ShaggySumpterBeast;
extern SimpleFilter Spincrocodile; extern SimpleFilter Spincrocodile;
extern SimpleFilter SentryTurrets; extern SimpleFilter SentryTurrets;
extern SimpleFilter AeonblightDrake;
extern SimpleFilter PrimalConstruct;
extern SimpleFilter SemiPerpetualControlMatrix;
extern SimpleFilter Scorpion;
extern SimpleFilter Vulture;
} }
namespace plant namespace plant
@ -284,6 +290,8 @@ namespace cheat::game::filters
extern SimpleFilter SumeruRose; extern SimpleFilter SumeruRose;
extern SimpleFilter Viparyas; extern SimpleFilter Viparyas;
extern SimpleFilter ZaytunPeach; extern SimpleFilter ZaytunPeach;
extern SimpleFilter Redcrest;
extern SimpleFilter Ajilenakh;
} }
namespace puzzle namespace puzzle

View File

@ -14,6 +14,12 @@ namespace cheat::feature
app::AnimatorStateInfo processStateInfo, app::MoleMole_VCAnimatorEvent_MoleMole_VCAnimatorEvent_TriggerMode__Enum mode, MethodInfo* method); 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 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(), RapidFire::RapidFire() : Feature(),
NF(f_Enabled, "Attack Multiplier", "RapidFire", false), NF(f_Enabled, "Attack Multiplier", "RapidFire", false),
NF(f_MultiHit, "Multi-hit", "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_maxMultiplier, "Max Multiplier", "RapidFire", 3),
NF(f_MultiTarget, "Multi-target", "RapidFire", false), NF(f_MultiTarget, "Multi-target", "RapidFire", false),
NF(f_MultiTargetRadius, "Multi-target Radius", "RapidFire", 20.0f), 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_LCBaseCombat_DoHitEntity, LCBaseCombat_DoHitEntity_Hook); -- Looks like FireBeingHitEvent is superior to this.
HookManager::install(app::MoleMole_VCAnimatorEvent_HandleProcessItem, VCAnimatorEvent_HandleProcessItem_Hook); 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" \ ConfigWidget("Multi-animation", f_MultiAnimation, "Enables multi-animation attacks.\n" \
"Do keep in mind that the character's audio will also be spammed."); "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 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() void RapidFire::DrawStatus()
{ {
if (f_MultiHit) if (f_Enabled) {
{ ImGui::Text("Rapid Fire:");
if (f_Randomize) if (f_MultiHit)
ImGui::Text("Multi-Hit Random[%d|%d]", f_minMultiplier.value(), f_maxMultiplier.value()); {
else if (f_OnePunch) if (f_Randomize)
ImGui::Text("Multi-Hit [OnePunch]"); ImGui::Text("Multi-Hit Random[%d|%d]", f_minMultiplier.value(), f_maxMultiplier.value());
else else if (f_OnePunch)
ImGui::Text("Multi-Hit [%d]", f_Multiplier.value()); 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) 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() RapidFire& RapidFire::GetInstance()
@ -116,7 +138,6 @@ namespace cheat::feature
return instance; return instance;
} }
int RapidFire::CalcCountToKill(float attackDamage, uint32_t targetID) int RapidFire::CalcCountToKill(float attackDamage, uint32_t targetID)
{ {
if (attackDamage == 0) if (attackDamage == 0)
@ -203,6 +224,7 @@ namespace cheat::feature
return false; return false;
auto& manager = game::EntityManager::instance(); auto& manager = game::EntityManager::instance();
auto patterID = manager.avatar()->combat()->monitor;
auto avatarID = manager.avatar()->raw()->fields._configID_k__BackingField; auto avatarID = manager.avatar()->raw()->fields._configID_k__BackingField;
auto attackerID = attacker.raw()->fields._configID_k__BackingField; auto attackerID = attacker.raw()->fields._configID_k__BackingField;
// LOG_DEBUG("configID = %d", attackerID); // LOG_DEBUG("configID = %d", attackerID);
@ -329,11 +351,38 @@ namespace cheat::feature
{ {
auto attacker = game::Entity(__this->fields._._._entity); auto attacker = game::Entity(__this->fields._._._entity);
RapidFire& rapidFire = RapidFire::GetInstance(); 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)) if (rapidFire.f_MultiAnimation && isAttacking)
processItem->fields.lastTime = 0; {
// 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); CALL_ORIGIN(VCAnimatorEvent_HandleProcessItem_Hook, __this, processItem, processStateInfo, mode, method);
} }
} }

View File

@ -6,7 +6,6 @@
namespace cheat::feature namespace cheat::feature
{ {
class RapidFire : public Feature class RapidFire : public Feature
{ {
public: public:
@ -20,6 +19,11 @@ namespace cheat::feature
config::Field<config::Toggle<Hotkey>> f_MultiTarget; config::Field<config::Toggle<Hotkey>> f_MultiTarget;
config::Field<float> f_MultiTargetRadius; config::Field<float> f_MultiTargetRadius;
config::Field<config::Toggle<Hotkey>> f_MultiAnimation; config::Field<config::Toggle<Hotkey>> f_MultiAnimation;
config::Field<int> f_AnimationMultiplier;
config::Field<float> f_AnimationState;
config::Field<config::Toggle<Hotkey>> f_AttackSpeed;
config::Field<float> f_SpeedMultiplier;
uint32_t animationCounter;
static RapidFire& GetInstance(); static RapidFire& GetInstance();
@ -36,3 +40,4 @@ namespace cheat::feature
}; };
} }

View File

@ -317,10 +317,12 @@ namespace cheat::feature
"3. You can now press Next or Previous Hotkey to Teleport through the Checklist\n" "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" "Initially it will teleport the player to the selection made\n"
"Note: Double click or click the arrow to open teleport details"); "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, ConfigWidget("Interpolation Speed", f_Speed, 0.1f, 0.1f, 99.0f,
"Interpolation speed.\n recommended setting below or equal to 0.1."); "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" 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."); "Note: This is not fully tested detection-wise.\nNot recommended with low values.");
@ -448,7 +450,7 @@ namespace cheat::feature
} }
ImGui::TableNextColumn(); 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::Text("%s", name.c_str());
ImGui::PopStyleColor(); ImGui::PopStyleColor();
if (ImGui::IsItemHovered()) if (ImGui::IsItemHovered())

View File

@ -80,6 +80,7 @@ namespace cheat::feature
"Attack03", "Attack03",
"Attack04", "Attack04",
"Attack05", "Attack05",
"Attack06",
"Attack01", "Attack01",
"Attack02", "Attack02",
"ExtraAttack", "ExtraAttack",
@ -234,7 +235,8 @@ namespace cheat::feature
NF(f_Enabled, "Animation Changer", "Visuals::AnimationChanger", false), NF(f_Enabled, "Animation Changer", "Visuals::AnimationChanger", false),
NF(f_Animation, "Animation", "Visuals::AnimationChanger", "ExtraAttack"), NF(f_Animation, "Animation", "Visuals::AnimationChanger", "ExtraAttack"),
NF(f_ApplyKey, "Apply Animation", "Visuals::AnimationChanger", Hotkey('Y')), 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); events::GameUpdateEvent += MY_METHOD_HANDLER(AnimationChanger::OnGameUpdate);
} }
@ -268,6 +270,7 @@ namespace cheat::feature
ConfigWidget("Apply Key", f_ApplyKey, true); ConfigWidget("Apply Key", f_ApplyKey, true);
ConfigWidget("Reset Key", f_ResetKey, true); ConfigWidget("Reset Key", f_ResetKey, true);
ConfigWidget("Delay", f_Delay, 1, 1, 1000000000, "Delay to repeat animation");
} }
} }
ImGui::EndGroupPanel(); ImGui::EndGroupPanel();
@ -294,8 +297,7 @@ namespace cheat::feature
if (!f_Enabled) if (!f_Enabled)
return; 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(f_Delay);
UPDATE_DELAY(400);
auto& manager = game::EntityManager::instance(); auto& manager = game::EntityManager::instance();
auto avatar = manager.avatar(); auto avatar = manager.avatar();

View File

@ -12,6 +12,7 @@ namespace cheat::feature
config::Field<std::string> f_Animation; config::Field<std::string> f_Animation;
config::Field<Hotkey> f_ApplyKey; config::Field<Hotkey> f_ApplyKey;
config::Field<Hotkey> f_ResetKey; config::Field<Hotkey> f_ResetKey;
config::Field<int> f_Delay;
const FeatureGUIInfo& GetGUIInfo() const override; const FeatureGUIInfo& GetGUIInfo() const override;
void DrawMain() override; void DrawMain() override;

View File

@ -25,6 +25,7 @@ namespace cheat::feature
FreeCamera::FreeCamera() : Feature(), FreeCamera::FreeCamera() : Feature(),
NF(f_Enabled, "Free Camera", "Visuals::FreeCamera", false), NF(f_Enabled, "Free Camera", "Visuals::FreeCamera", false),
NF(f_FreezeAnimation, "Freeze Character Animation", "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_DamageOverlay, "Damage Overlay", "Visuals::FreeCamera", false),
NF(f_HpOverlay, "Enemy HP Overlay", "Visuals::FreeCamera", false), NF(f_HpOverlay, "Enemy HP Overlay", "Visuals::FreeCamera", false),
NF(f_Speed, "Speed", "Visuals::FreeCamera", 1.0f), NF(f_Speed, "Speed", "Visuals::FreeCamera", 1.0f),
@ -61,6 +62,7 @@ namespace cheat::feature
{ {
ConfigWidget("Enable", f_Enabled); ConfigWidget("Enable", f_Enabled);
ConfigWidget("Freeze Character Animation", f_FreezeAnimation, "Freezes the active character's animation."); 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) if (f_Enabled)
{ {
ConfigWidget("Toggle Damage Overlay", f_DamageOverlay, "Remove damage output overlay"); 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; targetPosition = targetPosition - app::Transform_get_right(freeCam_Transform, nullptr) * settings.f_Speed;
if (settings.f_LeftRoll.value().IsPressed()) if (settings.f_LeftRoll.value().IsPressed())
targetRotation.roll += settings.f_Speed; targetRotation.roll += settings.f_RollSpeed;
if (settings.f_RightRoll.value().IsPressed()) if (settings.f_RightRoll.value().IsPressed())
targetRotation.roll -= settings.f_Speed; targetRotation.roll -= settings.f_RollSpeed;
if (settings.f_ResetRoll.value().IsPressed()) if (settings.f_ResetRoll.value().IsPressed())
targetRotation.roll = 0.0f; targetRotation.roll = 0.0f;
@ -242,6 +244,12 @@ namespace cheat::feature
void FreeCamera::OnGameUpdate() void FreeCamera::OnGameUpdate()
{ {
auto uiManager = GET_SINGLETON(MoleMole_UIManager);
if (uiManager == nullptr)
return;
static bool isBlock = false;
if (f_Enabled) if (f_Enabled)
{ {
if (mainCam == nullptr) if (mainCam == nullptr)
@ -284,6 +292,23 @@ namespace cheat::feature
hpOverlay = nullptr; 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. // 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& manager = game::EntityManager::instance();
auto animator = manager.avatar()->animator(); auto animator = manager.avatar()->animator();

View File

@ -9,6 +9,7 @@ namespace cheat::feature
public: public:
config::Field<config::Toggle<Hotkey>> f_Enabled; config::Field<config::Toggle<Hotkey>> f_Enabled;
config::Field<config::Toggle<Hotkey>> f_FreezeAnimation; config::Field<config::Toggle<Hotkey>> f_FreezeAnimation;
config::Field<bool> f_BlockInput;
config::Field<bool> f_DamageOverlay; config::Field<bool> f_DamageOverlay;
config::Field<bool> f_HpOverlay; config::Field<bool> f_HpOverlay;
config::Field<float> f_Speed; config::Field<float> f_Speed;

View File

@ -23,6 +23,7 @@ namespace cheat::feature
NF(f_PickupFilter_Animals, "Animals filter", "AutoLoot", true), NF(f_PickupFilter_Animals, "Animals filter", "AutoLoot", true),
NF(f_PickupFilter_DropItems, "Drop items filter", "AutoLoot", true), NF(f_PickupFilter_DropItems, "Drop items filter", "AutoLoot", true),
NF(f_PickupFilter_Resources, "Resources 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_Chest, "Chests", "AutoLoot", false),
NF(f_Leyline, "Leylines", "AutoLoot", false), NF(f_Leyline, "Leylines", "AutoLoot", false),
NF(f_Investigate, "Search points", "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("Enabled", f_PickupFilter, "Enable pickup filter.\n");
ConfigWidget("Animals", f_PickupFilter_Animals, "Fish, Lizard, Frog, Flying animals."); ImGui::SameLine(); ConfigWidget("Animals", f_PickupFilter_Animals, "Fish, Lizard, Frog, Flying animals."); ImGui::SameLine();
ConfigWidget("Drop Items", f_PickupFilter_DropItems, "Material, Mineral, Artifact."); 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(); ImGui::EndGroupPanel();
} }
@ -248,20 +250,23 @@ namespace cheat::feature
void AutoLoot::OnCheckIsInPosition(bool& result, app::BaseEntity* entity) 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) { if (f_AutoPickup || f_UseCustomRange) {
float pickupRange = f_UseCustomRange ? f_CustomRange : g_default_range; float pickupRange = f_UseCustomRange ? f_CustomRange : g_default_range;
if (f_PickupFilter) if (f_PickupFilter)
{ {
if (!f_PickupFilter_Animals && entity->fields.entityType == app::EntityType__Enum_1::EnvAnimal || 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_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; result = false;
return; return;
} }
} }
auto& manager = game::EntityManager::instance();
result = manager.avatar()->distance(entity) < pickupRange; result = manager.avatar()->distance(entity) < pickupRange;
} }
} }

View File

@ -28,6 +28,7 @@ namespace cheat::feature
config::Field<bool> f_PickupFilter_Animals; config::Field<bool> f_PickupFilter_Animals;
config::Field<bool> f_PickupFilter_DropItems; config::Field<bool> f_PickupFilter_DropItems;
config::Field<bool> f_PickupFilter_Resources; config::Field<bool> f_PickupFilter_Resources;
config::Field<bool> f_PickupFilter_Oculus;
static AutoLoot& GetInstance(); static AutoLoot& GetInstance();