Merge branch 'master' of https://github.com/lunaticwhat/Akebi-GC
54
README.md
@ -16,20 +16,12 @@
|
||||
|
||||
<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
|
||||
1. Head over to the releases page
|
||||
1. Download the latest binaries
|
||||
1. Head over to the [releases page](https://github.com/Akebi-Group/Akebi-GC/releases)
|
||||
2. Download the latest binaries
|
||||
|
||||
## Latest Release
|
||||
1. Head over to the [action](https://github.com/Akebi-Group/Akebi-GC/actions) page
|
||||
1. Head over to the [Action](https://github.com/Akebi-Group/Akebi-GC/actions) page
|
||||
1. Click Publish workflow
|
||||
1. Select most recent workflow with green checkmark ✔ (Choose your client version **GLOBAL/CN/BETA**)
|
||||
<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>
|
||||
</p>
|
||||
|
||||
|
||||
### Requirements
|
||||
- [Visual C++ Redistributable packages for Visual Studio 2015-2022](https://aka.ms/vs/17/release/vc_redist.x64.exe) (x64)
|
||||
- [Visual C++ Redistributable packages for Visual Studio 2015-2022](https://aka.ms/vs/17/release/vc_redist.x86.exe) (x86)
|
||||
## Building from source
|
||||
Check our wiki - [Building](https://github.com/Akebi-Group/Akebi-GC/wiki/Building%EF%BD%9C%E5%BB%BA%E7%BD%AE)
|
||||
|
||||
### Usage
|
||||
(1-2 are optional if you didn't build from source)
|
||||
1. Open `/bin`
|
||||
1. Open Compiled version (debug, release)
|
||||
|
||||
|
||||
1. Ensure that `CLibrary.dll` is in the same folder that `injector.exe`.
|
||||
1. Run `injector.exe`.
|
||||
1. After the login page appeared, press F1 to open Akebi GUI.
|
||||
2. Run `injector.exe`.
|
||||
3. After the login page appeared, press F1 to open Akebi GUI.
|
||||
|
||||
<h1 align="center">Features</h1>
|
||||
|
||||
|
||||
#### General
|
||||
- Protection Bypass
|
||||
- In-Game GUI
|
||||
@ -117,7 +101,6 @@ As well as setting up **`cheat-library`** as startup project.
|
||||
- FPS Graph
|
||||
- [Packet Sniffer](https://github.com/Akebi-Group/Akebi-PacketSniffer)
|
||||
|
||||
|
||||
<h1 align="center">Demo</h1>
|
||||
|
||||
<details>
|
||||
@ -146,37 +129,26 @@ As well as setting up **`cheat-library`** as startup project.
|
||||
</details>
|
||||
|
||||
<h1 align="center">Bugs</h1>
|
||||
|
||||
Welcome to the short explanation for bug reporting
|
||||
|
||||
1. You found a bug.
|
||||
1. Write down what happened, as well as your first thoughts on what you think caused it.
|
||||
1. Can it be reproduced? Yes or no. If yes: Explain in as much clear as possible. i.e what happens when the bug occurs and why it occurs.
|
||||
1. Tell us which version you are using. copy the `SHA`/ Version Number of the latest commit when you built the mod. For example: `bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7
|
||||
|
||||
## Bug reporting template
|
||||
<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
|
||||
```
|
||||
1. [Open an Issue(there's a template!)](https://github.com/Akebi-Group/Akebi-GC/issues)
|
||||
|
||||
<h1 align="center">Contributing</h1>
|
||||
|
||||
|
||||
## Adding a feature
|
||||
1. Fork the Project
|
||||
1. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
|
||||
1. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
|
||||
1. Push to the Branch (`git push origin feature/AmazingFeature`)
|
||||
1. Open a Pull Request
|
||||
2. [Open a Pull Request](https://github.com/Akebi-Group/Akebi-GC/pulls)
|
||||
|
||||
## Suggestions
|
||||
|
||||
Open an issue with the title of the suggestion you want to make.
|
||||
In the description, make sure it is descriptive enough so our devs can understand what you want and how you want it.
|
||||
Open an [issue](https://github.com/Akebi-Group/Akebi-GC/issues) with the title of the suggestion you want to make.
|
||||
In the description, make sure it is **descriptive enough** so our devs can understand what you want and how you want it.
|
@ -16,22 +16,14 @@
|
||||
|
||||
<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. 下载最新的版本
|
||||
|
||||
## 最新版本
|
||||
1. 前往 [action](https://github.com/Akebi-Group/Akebi-GC/actions) 介面
|
||||
1. 前往[Action](https://github.com/Akebi-Group/Akebi-GC/actions)介面
|
||||
1. 选择[Publish](https://github.com/Akebi-Group/Akebi-GC/actions/workflows/main.yml)工作流程
|
||||
1. 选择最近带有绿色对号(:heavy_check_mark:)的工作流程(注意选择自己所在服务器的版本 **GLOBAL/CN/BETA**)。
|
||||
1. 选择最近带有绿色对号(:heavy_check_mark:)的工作流程(注意选择自己客户端的版本 **GLOBAL:国际服/CN:国服/BETA:测试服**)。
|
||||
<p align="center">
|
||||
<a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429274-1e556c58-8027-4ec9-9c1d-3609c75aede4.png"></a>
|
||||
</p>
|
||||
@ -40,22 +32,16 @@
|
||||
<a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429302-7c7be3f6-df2f-4e49-9bb9-4a703c3491df.png"></a>
|
||||
</p>
|
||||
|
||||
|
||||
### 需要依赖
|
||||
- [Visual C++ Redistributable packages for Visual Studio 2015-2022](https://aka.ms/vs/17/release/vc_redist.x64.exe) (x64)
|
||||
- [Visual C++ Redistributable packages for Visual Studio 2015-2022](https://aka.ms/vs/17/release/vc_redist.x86.exe) (x86)
|
||||
## 自行编译
|
||||
请查看wiki - [Building](https://github.com/Akebi-Group/Akebi-GC/wiki/Building%EF%BD%9C%E5%BB%BA%E7%BD%AE)
|
||||
|
||||
### 使用方法
|
||||
(如果不是从源码自己构建的话,无视步骤`1`跟`2`。)
|
||||
1. 打开 `/bin`
|
||||
1. 打开已经编译好的版本文件夹(debug, release)
|
||||
1. 确认 `CLibrary.dll` 跟 `injector.exe` 处在同一个文件夹内。
|
||||
1. 运行 `injector.exe`.
|
||||
1. 等到登录界面出现,按`F1`键打开`Akebi GUI`。
|
||||
2. 运行 `injector.exe`.
|
||||
3. 等到登录界面出现,按`F1`键打开`Akebi GUI`。
|
||||
|
||||
<h1 align="center">功能简介</h1>
|
||||
|
||||
|
||||
#### 通用
|
||||
- 过检测
|
||||
- 游戏内界面
|
||||
@ -115,7 +101,6 @@
|
||||
- FPS曲线图
|
||||
- [抓包工具](https://github.com/Akebi-Group/Akebi-PacketSniffer)
|
||||
|
||||
|
||||
<h1 align="center">功能演示</h1>
|
||||
|
||||
<details>
|
||||
@ -143,28 +128,15 @@
|
||||
<img src="https://github.com/CallowBlack/gif-demos/blob/main/genshin-cheat/auto-talk-demo.gif"/>
|
||||
</details>
|
||||
|
||||
|
||||
<h1 align="center">Bugs</h1>
|
||||
|
||||
欢迎阅读如何提交`BUG`报告
|
||||
|
||||
1. 发现了一个`bug`。
|
||||
1. 记下问题出现时发生了什么,以及你认为这是由于什么造成的。
|
||||
1. 可以复现吗?可以或不可以。如果可以:尽可能的描述清楚问题发生时,发生了什么,开启了什么功能以及最可能的原因是什么。 ~~如果不可以:**就别报告了,建议重启**。~~
|
||||
1. 告诉我们你使用的是哪一个版本。复制你编译的最新的提交的`SHA`或者版本号。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7
|
||||
|
||||
## **错误报告模板**
|
||||
|
||||
|
||||
### 模板(最好使用英文)
|
||||
I found a bug in the feature `enemy vacuum`.
|
||||
I think it's caused by the filter functions that are defined in `someFeature.cpp`.
|
||||
|
||||
```
|
||||
Date Occured: 5/3/2022
|
||||
Is it reproducible: Occasionally
|
||||
Latest Commit used: bd17a00ec388f3b93624280cde9e1c66e740edf9
|
||||
Release Version: 0.7
|
||||
```
|
||||
2. 记下问题出现时发生了什么,以及你认为这是由于什么造成的。
|
||||
3. 可以复现吗?可以或不可以。如果可以:尽可能的描述清楚问题发生时,发生了什么,开启了什么功能以及最可能的原因是什么。 ~~如果不可以:**就别报告了,建议重启**。~~
|
||||
4. 告诉我们你使用的是哪一个版本。复制你编译的最新的提交的`SHA`或者版本号。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7
|
||||
5. [使用英文打开一个Issue(有提供模板!)](https://github.com/Akebi-Group/Akebi-GC/issues)
|
||||
|
||||
<h1 align="center">提交贡献</h1>
|
||||
|
||||
@ -173,8 +145,9 @@ Release Version: 0.7
|
||||
1. 创建一个新的功能分支(`git checkout -b feature/AmazingFeature`)
|
||||
1. 提交更改(`git commit -m 'Add some AmazingFeature'`)
|
||||
1. 推送(Push)更改到分支(`git push origin feature/AmazingFeature`)
|
||||
1. 打开 Pull Request 并提交
|
||||
2. [打开 Pull Request 并提交](https://github.com/Akebi-Group/Akebi-GC/pulls)
|
||||
|
||||
## 建议
|
||||
|
||||
新建一个Issue,标题写上你的建议,并且在描述里面,清晰的写下你的建议描述,以便我们的开发人员可以理解你的建议
|
||||
用英文新建一个[Issue](https://github.com/Akebi-Group/Akebi-GC/issues)。
|
||||
标题写上你的建议,并且在描述里面,**清晰的**写下你的建议描述,以便我们的开发人员可以理解你的建议。
|
@ -16,22 +16,14 @@
|
||||
|
||||
<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. 下載最新的版本
|
||||
|
||||
## 最新版本
|
||||
1. 前往 [action](https://github.com/Akebi-Group/Akebi-GC/actions) 介面
|
||||
1. 前往[Action](https://github.com/Akebi-Group/Akebi-GC/actions)介面
|
||||
1. 點選[Publish](https://github.com/Akebi-Group/Akebi-GC/actions/workflows/main.yml)工作流程
|
||||
1. 選擇帶有綠色複選標記的最新工作流程 :heavy_check_mark: (選擇您的客戶端版本 **GLOBAL/CN/BETA**)。
|
||||
1. 選擇帶有綠色複選標記的最新工作流程 :heavy_check_mark: (選擇您的客戶端版本 **GLOBAL:國際服/CN:國服/BETA:測試服**)。
|
||||
<p align="center">
|
||||
<a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429274-1e556c58-8027-4ec9-9c1d-3609c75aede4.png"></a>
|
||||
</p>
|
||||
@ -40,24 +32,16 @@
|
||||
<a href="#"><img src="https://user-images.githubusercontent.com/96950043/186429302-7c7be3f6-df2f-4e49-9bb9-4a703c3491df.png"></a>
|
||||
</p>
|
||||
|
||||
|
||||
### 依賴
|
||||
- [適用於Visual Studio 的Visual C++ 可轉散發套件2015-2022](https://aka.ms/vs/17/release/vc_redist.x64.exe) (x64)
|
||||
- [適用於Visual Studio 的Visual C++ 可轉散發套件2015-2022](https://aka.ms/vs/17/release/vc_redist.x86.exe) (x86)
|
||||
## 自行編譯
|
||||
請查看wiki - [Building](https://github.com/Akebi-Group/Akebi-GC/wiki/Building%EF%BD%9C%E5%BB%BA%E7%BD%AE)
|
||||
|
||||
### 使用方法
|
||||
(如果你不是從原始碼構建的話,您可以跳過步驟1-2。)
|
||||
1. 開啟 `/bin`
|
||||
1. 開啟已編譯版本(debug, release)
|
||||
|
||||
|
||||
1. 確保 `CLibrary.dll` 跟 `injector.exe` 在同一個資料夾裡面。
|
||||
1. 執行 `injector.exe`.
|
||||
1. 等到登錄界面出現後,按下F1來打開Akebi介面。
|
||||
2. 執行 `injector.exe`.
|
||||
3. 等到登錄界面出現後,按下`F1`來打開Akebi介面。
|
||||
|
||||
<h1 align="center">功能簡介</h1>
|
||||
|
||||
|
||||
#### 一般
|
||||
- 繞過防作弊機制
|
||||
- 遊戲內介面
|
||||
@ -117,7 +101,6 @@
|
||||
- FPS曲線圖
|
||||
- [抓包工具](https://github.com/Akebi-Group/Akebi-PacketSniffer)
|
||||
|
||||
|
||||
<h1 align="center">功能演示</h1>
|
||||
|
||||
<details>
|
||||
@ -146,37 +129,25 @@
|
||||
</details>
|
||||
|
||||
<h1 align="center">Bugs</h1>
|
||||
|
||||
歡迎閱讀關於錯誤報告(Bug reporting)的簡短解釋!
|
||||
|
||||
1. 您發現了一個錯誤。
|
||||
1. 把接下來發生的事情記錄下來,以及你認為造成這種情況的第一想法。
|
||||
1. 它可以被重現嗎?可以或不可以。如果可以:盡可能清楚地解釋清楚,當錯誤發生時,會發生什麼,為什麼會發生。 ~~如果不可以:無須報告,建議求佛。~~
|
||||
1. 告訴我們你使用的是哪個版本。複製你建立mod時的最新提交的SHA Hash/版本號。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7
|
||||
|
||||
## 錯誤報告範本
|
||||
<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
|
||||
```
|
||||
2. 把接下來發生的事情記錄下來,以及你認為造成這種情況的第一想法。
|
||||
3. 它可以被重現嗎?可以或不可以。如果可以:盡可能清楚地解釋清楚,當錯誤發生時,會發生什麼,為什麼會發生。 ~~如果不可以:無須報告,建議求佛。我們不會通靈。~~
|
||||
4. 告訴我們你使用的是哪個版本。複製你建立mod時的最新提交的SHA Hash/版本號。例如:`bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7
|
||||
5. [使用英文開啟一個Issue(有提供模板!)](https://github.com/Akebi-Group/Akebi-GC/issues)
|
||||
|
||||
<h1 align="center">社群貢獻</h1>
|
||||
|
||||
## 增加一個功能
|
||||
1. 建立新的分支
|
||||
1. 建立新的分支(Fork)
|
||||
1. 創建你的功能分支(`git checkout -b feature/AmazingFeature`)
|
||||
1. 提交您的更改(`git commit -m 'Add some AmazingFeature'`)
|
||||
1. 上傳(Push)到分支(`git push origin feature/AmazingFeature`)
|
||||
1. 開啟一個 Pull Request
|
||||
1. [開啟一個 Pull Request](https://github.com/Akebi-Group/Akebi-GC/pulls)
|
||||
|
||||
## 建議
|
||||
|
||||
用你想提出的建議的東西開一個問題(Issues)。
|
||||
在描述中,確保它有足夠的描述性,以便我們的開發人員能夠理解你想要什麼以及你想要怎樣。
|
||||
用英文開一個問題([Issue](https://github.com/Akebi-Group/Akebi-GC/issues))。
|
||||
在描述中,確保內容**足夠清楚**,以便我們的開發人員能夠理解,你想要什麼以及你想要怎樣。
|
@ -303,9 +303,9 @@ namespace cheat
|
||||
|
||||
feature->DrawStatus();
|
||||
|
||||
ImU32 row_bg_color = ImGui::GetColorU32(
|
||||
ImVec4(0.2f + row * 0.1f, 0.1f + row * 0.05f, 0.1f + row * 0.03f, 0.85f));
|
||||
ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, row_bg_color);
|
||||
//ImU32 row_bg_color = ImGui::GetColorU32(
|
||||
// ImVec4(0.2f + row * 0.1f, 0.1f + row * 0.05f, 0.1f + row * 0.03f, 0.85f));
|
||||
//ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, row_bg_color);
|
||||
row++;
|
||||
}
|
||||
}
|
||||
@ -332,9 +332,9 @@ namespace cheat
|
||||
if (!showAny && !settings.f_StatusMove)
|
||||
return;
|
||||
|
||||
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.04f, 0.05f, 0.05f, 0.90f));
|
||||
//ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.04f, 0.05f, 0.05f, 0.90f));
|
||||
ImGui::Begin("Info window", nullptr, flags);
|
||||
ImGui::PopStyleColor();
|
||||
//ImGui::PopStyleColor();
|
||||
|
||||
if (!showAny)
|
||||
{
|
||||
@ -347,14 +347,14 @@ namespace cheat
|
||||
{
|
||||
auto& sections = m_FeatureMap[moduleName];
|
||||
bool moduleShowAny = std::any_of(sections.begin(), sections.end(),
|
||||
[](const auto& iter)
|
||||
{
|
||||
return std::any_of(iter.second.begin(), iter.second.end(),
|
||||
[](const auto feat)
|
||||
{
|
||||
return feat->NeedInfoDraw();
|
||||
});
|
||||
}
|
||||
[](const auto& iter)
|
||||
{
|
||||
return std::any_of(iter.second.begin(), iter.second.end(),
|
||||
[](const auto feat)
|
||||
{
|
||||
return feat->NeedInfoDraw();
|
||||
});
|
||||
}
|
||||
);
|
||||
if (!moduleShowAny)
|
||||
continue;
|
||||
|
@ -34,29 +34,14 @@ namespace cheat::feature
|
||||
NF(f_FastExitEnable, "Fast Exit", "General::FastExit", false),
|
||||
NF(f_HotkeyExit, "Hotkeys", "General::FastExit", Hotkey(VK_F12)),
|
||||
|
||||
NF(f_FontSize, "Font Size", "General", 16.0f),
|
||||
NF(f_ShowStyleEditor, "Show Colors Customization", "General", false),
|
||||
NFS(f_DefaultTheme, "Theme", "General::Colors", "Default"),
|
||||
NF(f_FontSize, "Font Size", "General::Theme", 16.0f),
|
||||
NF(f_ShowStyleEditor, "Show Colors Customization", "General::Theme", false),
|
||||
NFS(f_DefaultTheme, "Theme", "General::Theme", ""),
|
||||
themesDir(util::GetCurrentPath() / "themes")
|
||||
|
||||
{
|
||||
renderer::SetGlobalFontSize(static_cast<float>(f_FontSize));
|
||||
f_HotkeyExit.value().PressedEvent += MY_METHOD_HANDLER(Settings::OnExitKeyPressed);
|
||||
if (!std::filesystem::exists(themesDir))
|
||||
std::filesystem::create_directory(themesDir);
|
||||
|
||||
}
|
||||
|
||||
bool inited = false;
|
||||
void Settings::Init() {
|
||||
if (this->f_DefaultTheme.value() != "Default" && !inited)
|
||||
{
|
||||
LOG_INFO("Loading theme: %s", themesDir / (f_DefaultTheme.value() + ".json").c_str());
|
||||
if (!std::filesystem::exists(themesDir / (f_DefaultTheme.value() + ".json")))
|
||||
f_DefaultTheme = "Default";
|
||||
else Colors_Import(f_DefaultTheme.value());
|
||||
inited = true;
|
||||
}
|
||||
}
|
||||
|
||||
const FeatureGUIInfo& Settings::GetGUIInfo() const
|
||||
@ -65,33 +50,345 @@ namespace cheat::feature
|
||||
return info;
|
||||
}
|
||||
|
||||
void Settings::Colors_Export(std::string name)
|
||||
ImVec4 HexToColor(std::string hexString)
|
||||
{
|
||||
ImGuiStyle& style = ImGui::GetStyle();
|
||||
auto colors = style.Colors;
|
||||
|
||||
nlohmann::json json;
|
||||
for (int i = 0; i < ImGuiCol_COUNT; i++)
|
||||
json[ImGui::GetStyleColorName((ImGuiCol)i)] = { colors[i].x, colors[i].y, colors[i].z, colors[i].w };
|
||||
std::ofstream file(themesDir / (name + ".json"));
|
||||
file << std::setw(4) << json << std::endl;
|
||||
int r, g, b, a;
|
||||
sscanf_s(hexString.c_str(), "%02x%02x%02x%02x", &r, &g, &b, &a);
|
||||
ImVec4 color{ (float(r) / 255), (float(g) / 255), (float(b) / 255), (float(a) / 255) };
|
||||
return color;
|
||||
}
|
||||
|
||||
void Settings::Colors_Import(std::string name)
|
||||
std::string ColorToHex(ImVec4& color)
|
||||
{
|
||||
char hex[16];
|
||||
snprintf(hex, sizeof(hex), "%02x%02x%02x%02x",
|
||||
static_cast<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();
|
||||
auto colors = style.Colors;
|
||||
nlohmann::json json;
|
||||
std::ifstream file(themesDir / (name + ".json"));
|
||||
file >> json;
|
||||
for (int i = 0; i < ImGuiCol_COUNT; i++)
|
||||
{
|
||||
auto color = json[ImGui::GetStyleColorName((ImGuiCol)i)];
|
||||
colors[i].x = color[0];
|
||||
colors[i].y = color[1];
|
||||
colors[i].z = color[2];
|
||||
colors[i].w = color[3];
|
||||
auto& theme = m_Themes[name];
|
||||
|
||||
// Applying Colors
|
||||
if (!theme.colors.empty()) {
|
||||
for (int i = 0; i < ImGuiCol_COUNT; i++)
|
||||
{
|
||||
auto& themeColor = theme.colors[ImGui::GetStyleColorName((ImGuiCol)i)];
|
||||
colors[i].x = themeColor.x;
|
||||
colors[i].y = themeColor.y;
|
||||
colors[i].z = themeColor.z;
|
||||
colors[i].w = themeColor.w;
|
||||
}
|
||||
}
|
||||
|
||||
if (!theme.styles.empty())
|
||||
{
|
||||
// Applying Styles
|
||||
style.Alpha = std::any_cast<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()
|
||||
@ -172,41 +469,54 @@ namespace cheat::feature
|
||||
|
||||
ImGui::BeginGroupPanel("Interface Customization");
|
||||
{
|
||||
if (ConfigWidget(f_FontSize, 1, 8, 64, "Adjust interface font size."))
|
||||
ImGui::SetNextItemWidth(200);
|
||||
if (ImGui::BeginCombo("Themes", f_DefaultTheme.value().c_str()))
|
||||
{
|
||||
f_FontSize = std::clamp(f_FontSize.value(), 8, 64);
|
||||
renderer::SetGlobalFontSize(static_cast<float>(f_FontSize));
|
||||
for (auto& [themeName, themeData] : m_Themes)
|
||||
{
|
||||
bool isSelected = f_DefaultTheme.value() == themeName;
|
||||
if (ImGui::Selectable(themeName.c_str(), isSelected))
|
||||
{
|
||||
ApplyTheme(themeName);
|
||||
f_DefaultTheme = themeName;
|
||||
}
|
||||
|
||||
if (isSelected)
|
||||
ImGui::SetItemDefaultFocus();
|
||||
}
|
||||
ImGui::EndCombo();
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("Delete Theme"))
|
||||
{
|
||||
std::filesystem::remove(themesDir / (f_DefaultTheme.value() + ".json"));
|
||||
LOG_INFO("Deleted theme %s", f_DefaultTheme.value().c_str());
|
||||
f_DefaultTheme = "";
|
||||
hasLoaded = false;
|
||||
Init();
|
||||
}
|
||||
|
||||
static std::string themeNameBuffer_;
|
||||
ImGui::InputText("Theme Name", &themeNameBuffer_);
|
||||
|
||||
if (ConfigWidget(f_FontSize, 1, 8, 64, "Adjust interface font size."))
|
||||
renderer::SetGlobalFontSize(static_cast<float>(f_FontSize));
|
||||
|
||||
ImGui::Spacing();
|
||||
|
||||
ConfigWidget(f_ShowStyleEditor, "Show colors customization window.");
|
||||
ImGui::Spacing();
|
||||
|
||||
ImGui::Text("Save Customized Color");
|
||||
static std::string nameBuffer_;
|
||||
ImGui::InputText("Color Name", &nameBuffer_);
|
||||
if (ImGui::Button("Save"))
|
||||
Colors_Export(nameBuffer_);
|
||||
ImGui::SameLine();
|
||||
|
||||
if (std::filesystem::exists(themesDir / (nameBuffer_ + ".json")))
|
||||
ImGui::SameLine();
|
||||
bool alreadyExist = m_Themes.count(themeNameBuffer_) > 0;
|
||||
if (ImGui::Button(alreadyExist ? "Replace Theme" : "Save Theme"))
|
||||
{
|
||||
if (this->f_DefaultTheme.value() != nameBuffer_)
|
||||
{
|
||||
if (ImGui::Button("Set as default"))
|
||||
{
|
||||
f_DefaultTheme = nameBuffer_;
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("Load"))
|
||||
{
|
||||
Colors_Import(nameBuffer_);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ImGui::Text("Color does not exist.");
|
||||
if (themeNameBuffer_.empty())
|
||||
return;
|
||||
|
||||
ThemeExport(themeNameBuffer_);
|
||||
hasLoaded = false;
|
||||
f_DefaultTheme = themeNameBuffer_;
|
||||
Init();
|
||||
themeNameBuffer_.clear();
|
||||
}
|
||||
}
|
||||
ImGui::EndGroupPanel();
|
||||
|
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include <cheat-base/cheat/Feature.h>
|
||||
#include <cheat-base/config/config.h>
|
||||
#include <cheat-base/util.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
@ -40,10 +41,16 @@ namespace cheat::feature
|
||||
const FeatureGUIInfo& GetGUIInfo() const override;
|
||||
void DrawMain() override;
|
||||
void Init();
|
||||
void Colors_Export(std::string name);
|
||||
void Colors_Import(std::string name);
|
||||
|
||||
private:
|
||||
struct Theme{
|
||||
std::map<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();
|
||||
Settings();
|
||||
|
@ -157,7 +157,12 @@ namespace renderer
|
||||
_isCustomFontLoaded = true;
|
||||
}
|
||||
|
||||
static void SetupImGuiStyle();
|
||||
static void LoadImGuiStyles()
|
||||
{
|
||||
auto& themes = cheat::feature::Settings::GetInstance();
|
||||
themes.Init();
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK hWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
void OnPreRenderDX12()
|
||||
@ -189,7 +194,7 @@ namespace renderer
|
||||
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
|
||||
|
||||
LoadCustomFont();
|
||||
SetupImGuiStyle();
|
||||
LoadImGuiStyles();
|
||||
|
||||
//Set OriginalWndProcHandler to the Address of the Original WndProc function
|
||||
OriginalWndProcHandler = reinterpret_cast<WNDPROC>(SetWindowLongPtr(window, GWLP_WNDPROC,
|
||||
@ -221,7 +226,7 @@ namespace renderer
|
||||
io.IniFilename = imguiPath.c_str();
|
||||
|
||||
LoadCustomFont();
|
||||
SetupImGuiStyle();
|
||||
LoadImGuiStyles();
|
||||
|
||||
//Set OriginalWndProcHandler to the Address of the Original WndProc function
|
||||
OriginalWndProcHandler = reinterpret_cast<WNDPROC>(SetWindowLongPtr(window, GWLP_WNDPROC,
|
||||
@ -254,9 +259,6 @@ namespace renderer
|
||||
|
||||
pContext->OMSetRenderTargets(1, &mainRenderTargetView, nullptr);
|
||||
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
|
||||
|
||||
auto& themes = cheat::feature::Settings::GetInstance();
|
||||
themes.Init();
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK hWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
@ -306,68 +308,4 @@ namespace renderer
|
||||
|
||||
return CallWindowProc(OriginalWndProcHandler, hWnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
|
||||
static void SetupImGuiStyle()
|
||||
{
|
||||
ImGui::GetStyle().FrameRounding = 4.0f;
|
||||
ImGui::GetStyle().GrabRounding = 4.0f;
|
||||
|
||||
ImVec4* colors = ImGui::GetStyle().Colors;
|
||||
colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
|
||||
colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f);
|
||||
colors[ImGuiCol_WindowBg] = ImVec4(0.15f, 0.15f, 0.15f, 1.00f);
|
||||
colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
|
||||
colors[ImGuiCol_PopupBg] = ImVec4(0.08f, 0.08f, 0.08f, 0.94f);
|
||||
colors[ImGuiCol_Border] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f);
|
||||
colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
|
||||
colors[ImGuiCol_FrameBg] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f);
|
||||
colors[ImGuiCol_FrameBgHovered] = ImVec4(0.74f, 0.40f, 0.87f, 0.36f);
|
||||
colors[ImGuiCol_FrameBgActive] = ImVec4(0.60f, 0.33f, 0.71f, 0.36f);
|
||||
colors[ImGuiCol_TitleBg] = ImVec4(0.15f, 0.15f, 0.15f, 1.00f);
|
||||
colors[ImGuiCol_TitleBgActive] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f);
|
||||
colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 0.51f);
|
||||
colors[ImGuiCol_MenuBarBg] = ImVec4(0.15f, 0.15f, 0.15f, 1.00f);
|
||||
colors[ImGuiCol_ScrollbarBg] = ImVec4(0.02f, 0.02f, 0.02f, 0.00f);
|
||||
colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f);
|
||||
colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.74f, 0.40f, 0.87f, 1.00f);
|
||||
colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.52f, 0.30f, 0.60f, 1.00f);
|
||||
colors[ImGuiCol_CheckMark] = ImVec4(0.74f, 0.40f, 0.87f, 1.00f);
|
||||
colors[ImGuiCol_SliderGrab] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f);
|
||||
colors[ImGuiCol_SliderGrabActive] = ImVec4(0.52f, 0.30f, 0.60f, 1.00f);
|
||||
colors[ImGuiCol_Button] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f);
|
||||
colors[ImGuiCol_ButtonHovered] = ImVec4(0.74f, 0.40f, 0.87f, 1.00f);
|
||||
colors[ImGuiCol_ButtonActive] = ImVec4(0.52f, 0.30f, 0.60f, 1.00f);
|
||||
colors[ImGuiCol_Header] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f);
|
||||
colors[ImGuiCol_HeaderHovered] = ImVec4(0.74f, 0.40f, 0.87f, 1.00f);
|
||||
colors[ImGuiCol_HeaderActive] = ImVec4(0.52f, 0.30f, 0.60f, 1.00f);
|
||||
colors[ImGuiCol_Separator] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f);
|
||||
colors[ImGuiCol_SeparatorHovered] = ImVec4(0.28f, 0.28f, 0.28f, 1.00f);
|
||||
colors[ImGuiCol_SeparatorActive] = ImVec4(0.15f, 0.15f, 0.15f, 1.00f);
|
||||
colors[ImGuiCol_ResizeGrip] = ImVec4(0.60f, 0.33f, 0.71f, 0.73f);
|
||||
colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.74f, 0.40f, 0.87f, 0.73f);
|
||||
colors[ImGuiCol_ResizeGripActive] = ImVec4(0.52f, 0.30f, 0.60f, 0.73f);
|
||||
colors[ImGuiCol_Tab] = ImVec4(0.60f, 0.33f, 0.71f, 0.36f);
|
||||
colors[ImGuiCol_TabHovered] = ImVec4(0.74f, 0.40f, 0.87f, 1.00f);
|
||||
colors[ImGuiCol_TabActive] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f);
|
||||
colors[ImGuiCol_TabUnfocused] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f);
|
||||
colors[ImGuiCol_TabUnfocusedActive] = ImVec4(0.52f, 0.30f, 0.60f, 1.00f);
|
||||
colors[ImGuiCol_DockingPreview] = ImVec4(0.74f, 0.40f, 0.87f, 0.67f);
|
||||
colors[ImGuiCol_DockingEmptyBg] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f);
|
||||
colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f);
|
||||
colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.00f, 0.83f, 1.00f);
|
||||
colors[ImGuiCol_PlotHistogram] = ImVec4(0.75f, 0.00f, 0.62f, 1.00f);
|
||||
colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.45f, 0.91f, 1.00f);
|
||||
colors[ImGuiCol_TableHeaderBg] = ImVec4(0.19f, 0.19f, 0.20f, 1.00f);
|
||||
colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.35f, 0.00f);
|
||||
colors[ImGuiCol_TableBorderLight] = ImVec4(0.35f, 0.31f, 0.31f, 0.00f);
|
||||
colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
|
||||
colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f);
|
||||
colors[ImGuiCol_TextSelectedBg] = ImVec4(0.60f, 0.33f, 0.71f, 0.28f);
|
||||
colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f);
|
||||
colors[ImGuiCol_NavHighlight] = ImVec4(0.60f, 0.33f, 0.71f, 1.00f);
|
||||
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f);
|
||||
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f);
|
||||
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.35f);
|
||||
}
|
||||
}
|
@ -17,7 +17,6 @@
|
||||
|
||||
namespace util
|
||||
{
|
||||
|
||||
std::string GetLastErrorAsString(DWORD errorId /*= 0*/)
|
||||
{
|
||||
//Get the error message ID, if any.
|
||||
|
@ -234,6 +234,8 @@
|
||||
<Image Include="icons\Cave.png" />
|
||||
<Image Include="res\iconsHD\AbidingAngelfish.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\Albedo.png" />
|
||||
<Image Include="res\iconsHD\AlleyHunter.png" />
|
||||
@ -592,6 +594,7 @@
|
||||
<Image Include="res\iconsHD\PreciousChest.png" />
|
||||
<Image Include="res\iconsHD\Predator.png" />
|
||||
<Image Include="res\iconsHD\PressurePlate.png" />
|
||||
<Image Include="res\iconsHD\PrimalConstruct.png" />
|
||||
<Image Include="res\iconsHD\PrimoGeovishap.png" />
|
||||
<Image Include="res\iconsHD\PrimordialJadeCutter.png" />
|
||||
<Image Include="res\iconsHD\PrimordialJadeWingedSpear.png" />
|
||||
@ -619,6 +622,7 @@
|
||||
<Image Include="res\iconsHD\Razor.png" />
|
||||
<Image Include="res\iconsHD\Recipe.png" />
|
||||
<Image Include="res\iconsHD\RecurveBow.png" />
|
||||
<Image Include="res\iconsHD\Redcrest.png" />
|
||||
<Image Include="res\iconsHD\RedFinnedUnagi.png" />
|
||||
<Image Include="res\iconsHD\RedHornedLizard.png" />
|
||||
<Image Include="res\iconsHD\RedhornStonethresher.png" />
|
||||
@ -662,7 +666,9 @@
|
||||
<Image Include="res\iconsHD\Sapphire.png" />
|
||||
<Image Include="res\iconsHD\SapwoodBlade.png" />
|
||||
<Image Include="res\iconsHD\Sayu.png" />
|
||||
<Image Include="res\iconsHD\Scarab.png" />
|
||||
<Image Include="res\iconsHD\ScarletQuartz.png" />
|
||||
<Image Include="res\iconsHD\Scorpion.png" />
|
||||
<Image Include="res\iconsHD\SeaGanoderma.png" />
|
||||
<Image Include="res\iconsHD\Seagrass.png" />
|
||||
<Image Include="res\iconsHD\SealedChest.png" />
|
||||
@ -676,6 +682,7 @@
|
||||
<Image Include="res\iconsHD\Seelie.png" />
|
||||
<Image Include="res\iconsHD\SeelieCourt.png" />
|
||||
<Image Include="res\iconsHD\SeelieLamp.png" />
|
||||
<Image Include="res\iconsHD\SemiPerpetualControlMatrix.png" />
|
||||
<Image Include="res\iconsHD\SerpentSpine.png" />
|
||||
<Image Include="res\iconsHD\ShadowyHusk.png" />
|
||||
<Image Include="res\iconsHD\ShaggySumpterBeast.png" />
|
||||
@ -783,6 +790,7 @@
|
||||
<Image Include="res\iconsHD\VioletIbis.png" />
|
||||
<Image Include="res\iconsHD\Viparyas.png" />
|
||||
<Image Include="res\iconsHD\VortexVanquisher.png" />
|
||||
<Image Include="res\iconsHD\Vulture.png" />
|
||||
<Image Include="res\iconsHD\WarmingSeelie.png" />
|
||||
<Image Include="res\iconsHD\WasterGreatsword.png" />
|
||||
<Image Include="res\iconsHD\WavebreakersFin.png" />
|
||||
@ -821,6 +829,8 @@
|
||||
<Image Include="res\iconsHD\Zhongli.png" />
|
||||
<Image Include="res\icons\AbidingAngelfish.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\Andrius.png" />
|
||||
<Image Include="res\icons\Aranara.png" />
|
||||
@ -1068,6 +1078,7 @@
|
||||
<Image Include="res\icons\Pot.png" />
|
||||
<Image Include="res\icons\PreciousChest.png" />
|
||||
<Image Include="res\icons\PressurePlate.png" />
|
||||
<Image Include="res\icons\PrimalConstruct.png" />
|
||||
<Image Include="res\icons\PrimoGeovishap.png" />
|
||||
<Image Include="res\icons\Pufferfish.png" />
|
||||
<Image Include="res\icons\PurpleShirakodai.png" />
|
||||
@ -1082,6 +1093,7 @@
|
||||
<Image Include="res\icons\RaimeiAngelfish.png" />
|
||||
<Image Include="res\icons\RawMeat.png" />
|
||||
<Image Include="res\icons\Recipe.png" />
|
||||
<Image Include="res\icons\Redcrest.png" />
|
||||
<Image Include="res\icons\RedFinnedUnagi.png" />
|
||||
<Image Include="res\icons\RedHornedLizard.png" />
|
||||
<Image Include="res\icons\RedTailedWeasel.png" />
|
||||
@ -1110,7 +1122,9 @@
|
||||
<Image Include="res\icons\SangonomiyaCohort.png" />
|
||||
<Image Include="res\icons\SangoPearl.png" />
|
||||
<Image Include="res\icons\Sapphire.png" />
|
||||
<Image Include="res\icons\Scarab.png" />
|
||||
<Image Include="res\icons\ScarletQuartz.png" />
|
||||
<Image Include="res\icons\Scorpion.png" />
|
||||
<Image Include="res\icons\SeaGanoderma.png" />
|
||||
<Image Include="res\icons\Seagrass.png" />
|
||||
<Image Include="res\icons\SealedChest.png" />
|
||||
@ -1123,6 +1137,7 @@
|
||||
<Image Include="res\icons\Seelie.png" />
|
||||
<Image Include="res\icons\SeelieCourt.png" />
|
||||
<Image Include="res\icons\SeelieLamp.png" />
|
||||
<Image Include="res\icons\SemiPerpetualControlMatrix.png" />
|
||||
<Image Include="res\icons\ShadowyHusk.png" />
|
||||
<Image Include="res\icons\ShaggySumpterBeast.png" />
|
||||
<Image Include="res\icons\Shogun.png" />
|
||||
@ -1193,6 +1208,7 @@
|
||||
<Image Include="res\icons\Violetgrass.png" />
|
||||
<Image Include="res\icons\VioletIbis.png" />
|
||||
<Image Include="res\icons\Viparyas.png" />
|
||||
<Image Include="res\icons\Vulture.png" />
|
||||
<Image Include="res\icons\WarmingSeelie.png" />
|
||||
<Image Include="res\icons\WaveriderWaypointCannotTeleport.png" />
|
||||
<Image Include="res\icons\Weapon.png" />
|
||||
|
@ -3466,5 +3466,53 @@
|
||||
<Image Include="res\iconsHD\Nilou.png">
|
||||
<Filter>Resource Files</Filter>
|
||||
</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>
|
||||
</Project>
|
BIN
cheat-library/res/icons/AeonblightDrake.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
cheat-library/res/icons/Ajilenakh.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
cheat-library/res/icons/PrimalConstruct.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
cheat-library/res/icons/Redcrest.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
cheat-library/res/icons/Scarab.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
cheat-library/res/icons/Scorpion.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
cheat-library/res/icons/SemiPerpetualControlMatrix.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
cheat-library/res/icons/Vulture.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
cheat-library/res/iconsHD/AeonblightDrake.png
Normal file
After Width: | Height: | Size: 120 KiB |
BIN
cheat-library/res/iconsHD/Ajilenakh.png
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
cheat-library/res/iconsHD/PrimalConstruct.png
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
cheat-library/res/iconsHD/Redcrest.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
cheat-library/res/iconsHD/Scarab.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
cheat-library/res/iconsHD/Scorpion.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
cheat-library/res/iconsHD/SemiPerpetualControlMatrix.png
Normal file
After Width: | Height: | Size: 104 KiB |
BIN
cheat-library/res/iconsHD/Vulture.png
Normal file
After Width: | Height: | Size: 60 KiB |
@ -83,8 +83,12 @@ HDADHIGAMAWOOD PNG "iconsHD\\AdhigamaWood.png"
|
||||
|
||||
HDADORNEDUNAGI PNG "iconsHD\\AdornedUnagi.png"
|
||||
|
||||
HDAEONBLIGHTDRAKE PNG "iconsHD\\AeonblightDrake.png"
|
||||
|
||||
HDAIZENMEDAKA PNG "iconsHD\\AizenMedaka.png"
|
||||
|
||||
HDAJILENAKH PNG "iconsHD\\Ajilenakh.png"
|
||||
|
||||
HDAKAIMAOU PNG "iconsHD\\AkaiMaou.png"
|
||||
|
||||
HDAKUOUMARU PNG "iconsHD\\Akuoumaru.png"
|
||||
@ -237,7 +241,7 @@ HDCINNABARSPINDLE PNG "iconsHD\\CinnabarSpindle.png"
|
||||
|
||||
HDCLOUDLEISURESTEPS PNG "iconsHD\\CloudleisureSteps.png"
|
||||
|
||||
HDCLUSTERLEAFOFCULTIVATION PNG "iconsHD\\ClusterleafOfCultivation.png"
|
||||
HDCLUSTERLEAFOFCULTIVATION PNG "iconsHD\\ClusterleafOfCultivation.png"
|
||||
|
||||
HDCOLLEI PNG "iconsHD\\Collei.png"
|
||||
|
||||
@ -297,7 +301,7 @@ HDDARKIRONSWORD PNG "iconsHD\\DarkIronSword.png"
|
||||
|
||||
HDDAWNCATCHER PNG "iconsHD\\Dawncatcher.png"
|
||||
|
||||
HDDAYNIGHTSWITCHINGMECHANISM PNG "iconsHD\\DayNightSwitchingMechanism.png"
|
||||
HDDAYNIGHTSWITCHINGMECHANISM PNG "iconsHD\\DayNightSwitchingMechanism.png"
|
||||
|
||||
HDDEATHMATCH PNG "iconsHD\\Deathmatch.png"
|
||||
|
||||
@ -381,7 +385,7 @@ HDEMERALDORB PNG "iconsHD\\EmeraldOrb.png"
|
||||
|
||||
HDENDOFTHELINE PNG "iconsHD\\EndoftheLine.png"
|
||||
|
||||
HDENEMIESFIRSTTIMEVICTORY PNG "iconsHD\\EnemiesFirstTimeVictory.png"
|
||||
HDENEMIESFIRSTTIMEVICTORY PNG "iconsHD\\EnemiesFirstTimeVictory.png"
|
||||
|
||||
HDENGULFINGLIGHTNING PNG "iconsHD\\EngulfingLightning.png"
|
||||
|
||||
@ -641,7 +645,7 @@ HDLIZARDTAIL PNG "iconsHD\\LizardTail.png"
|
||||
|
||||
HDLOACHPEARL PNG "iconsHD\\LoachPearl.png"
|
||||
|
||||
HDLOSTPRAYERTOTHESACREDWINDS PNG "iconsHD\\LostPrayertotheSacredWinds.png"
|
||||
HDLOSTPRAYERTOTHESACREDWINDS PNG "iconsHD\\LostPrayertotheSacredWinds.png"
|
||||
|
||||
HDLOTUSHEAD PNG "iconsHD\\LotusHead.png"
|
||||
|
||||
@ -659,7 +663,7 @@ HDLUMINOUSSEELIE PNG "iconsHD\\LuminousSeelie.png"
|
||||
|
||||
HDLUNGEDSTICKLEBACK PNG "iconsHD\\LungedStickleback.png"
|
||||
|
||||
HDLUPUSBOREASDOMINATOROFWOLVES PNG "iconsHD\\LupusBoreasDominatorofWolves.png"
|
||||
HDLUPUSBOREASDOMINATOROFWOLVES PNG "iconsHD\\LupusBoreasDominatorofWolves.png"
|
||||
|
||||
HDLUXURIOUSCHEST PNG "iconsHD\\LuxuriousChest.png"
|
||||
|
||||
@ -777,7 +781,7 @@ HDPALEREDCRAB PNG "iconsHD\\PaleRedCrab.png"
|
||||
|
||||
HDPEACHOFTHEDEEPWAVES PNG "iconsHD\\PeachoftheDeepWaves.png"
|
||||
|
||||
HDPERPETUALMECHANICALARRAY PNG "iconsHD\\PerpetualMechanicalArray.png"
|
||||
HDPERPETUALMECHANICALARRAY PNG "iconsHD\\PerpetualMechanicalArray.png"
|
||||
|
||||
HDPHANTASMALGATE PNG "iconsHD\\PhantasmalGate.png"
|
||||
|
||||
@ -807,11 +811,13 @@ HDPREDATOR PNG "iconsHD\\Predator.png"
|
||||
|
||||
HDPRESSUREPLATE PNG "iconsHD\\PressurePlate.png"
|
||||
|
||||
HDPRIMALCONSTRUCT PNG "iconsHD\\PrimalConstruct.png"
|
||||
|
||||
HDPRIMOGEOVISHAP PNG "iconsHD\\PrimoGeovishap.png"
|
||||
|
||||
HDPRIMORDIALJADECUTTER PNG "iconsHD\\PrimordialJadeCutter.png"
|
||||
|
||||
HDPRIMORDIALJADEWINGEDSPEAR PNG "iconsHD\\PrimordialJadeWingedSpear.png"
|
||||
HDPRIMORDIALJADEWINGEDSPEAR PNG "iconsHD\\PrimordialJadeWingedSpear.png"
|
||||
|
||||
HDPROTOTYPEAMBER PNG "iconsHD\\PrototypeAmber.png"
|
||||
|
||||
@ -861,6 +867,8 @@ HDRECIPE PNG "iconsHD\\Recipe.png"
|
||||
|
||||
HDRECURVEBOW PNG "iconsHD\\RecurveBow.png"
|
||||
|
||||
HDREDCREST PNG "iconsHD\\Redcrest.png"
|
||||
|
||||
HDREDFINNEDUNAGI PNG "iconsHD\\RedFinnedUnagi.png"
|
||||
|
||||
HDREDHORNEDLIZARD PNG "iconsHD\\RedHornedLizard.png"
|
||||
@ -947,8 +955,12 @@ HDSAPWOODBLADE PNG "iconsHD\\SapwoodBlade.png"
|
||||
|
||||
HDSAYU PNG "iconsHD\\Sayu.png"
|
||||
|
||||
HDSCARAB PNG "iconsHD\\Scarab.png"
|
||||
|
||||
HDSCARLETQUARTZ PNG "iconsHD\\ScarletQuartz.png"
|
||||
|
||||
HDSCORPION PNG "iconsHD\\Scorpion.png"
|
||||
|
||||
HDSEAGANODERMA PNG "iconsHD\\SeaGanoderma.png"
|
||||
|
||||
HDSEAGRASS PNG "iconsHD\\Seagrass.png"
|
||||
@ -977,6 +989,8 @@ HDSEELIECOURT PNG "iconsHD\\SeelieCourt.png"
|
||||
|
||||
HDSEELIELAMP PNG "iconsHD\\SeelieLamp.png"
|
||||
|
||||
HDSEMIPERPETUALCONTROLMATRIX PNG "iconsHD\\SemiPerpetualControlMatrix.png"
|
||||
|
||||
HDSERPENTSPINE PNG "iconsHD\\SerpentSpine.png"
|
||||
|
||||
HDSHADOWYHUSK PNG "iconsHD\\ShadowyHusk.png"
|
||||
@ -1075,10 +1089,10 @@ HDSTRETCHYFUNGUS PNG "iconsHD\\StretchyFungus.png"
|
||||
|
||||
HDSUCROSE PNG "iconsHD\\Sucrose.png"
|
||||
|
||||
HDSUMERUROSE PNG "iconsHD\\SumeruRose.png"
|
||||
|
||||
HDSUMERUPUZZLES PNG "iconsHD\\SumeruPuzzles.png"
|
||||
|
||||
HDSUMERUROSE PNG "iconsHD\\SumeruRose.png"
|
||||
|
||||
HDSUMERUSHRINEOFDEPTHS PNG "iconsHD\\SumeruShrineofDepths.png"
|
||||
|
||||
HDSUMMITSHAPER PNG "iconsHD\\SummitShaper.png"
|
||||
@ -1139,7 +1153,7 @@ HDTHOMA PNG "iconsHD\\Thoma.png"
|
||||
|
||||
HDTHREEBOXES PNG "iconsHD\\ThreeBoxes.png"
|
||||
|
||||
HDTHRILLINGTALESOFDRAGONSLAYERS PNG "iconsHD\\ThrillingTalesofDragonSlayers.png"
|
||||
HDTHRILLINGTALESOFDRAGONSLAYERS PNG "iconsHD\\ThrillingTalesofDragonSlayers.png"
|
||||
|
||||
HDTHUNDERINGPULSE PNG "iconsHD\\ThunderingPulse.png"
|
||||
|
||||
@ -1189,13 +1203,15 @@ HDVIPARYAS PNG "iconsHD\\Viparyas.png"
|
||||
|
||||
HDVORTEXVANQUISHER PNG "iconsHD\\VortexVanquisher.png"
|
||||
|
||||
HDVULTURE PNG "iconsHD\\Vulture.png"
|
||||
|
||||
HDWARMINGSEELIE PNG "iconsHD\\WarmingSeelie.png"
|
||||
|
||||
HDWASTERGREATSWORD PNG "iconsHD\\WasterGreatsword.png"
|
||||
|
||||
HDWAVEBREAKERSFIN PNG "iconsHD\\WavebreakersFin.png"
|
||||
|
||||
HDWAVERIDERWAYPOINTCANNOTTELEPORT PNG "iconsHD\\WaveriderWaypointCannotTeleport.png"
|
||||
HDWAVERIDERWAYPOINTCANNOTTELEPORT PNG "iconsHD\\WaveriderWaypointCannotTeleport.png"
|
||||
|
||||
HDWEAPON PNG "iconsHD\\Weapon.png"
|
||||
|
||||
@ -1273,8 +1289,12 @@ ADHIGAMAWOOD PNG "icons\\AdhigamaWood.png"
|
||||
|
||||
ADORNEDUNAGI PNG "icons\\AdornedUnagi.png"
|
||||
|
||||
AEONBLIGHTDRAKE PNG "icons\\AeonblightDrake.png"
|
||||
|
||||
AIZENMEDAKA PNG "icons\\AizenMedaka.png"
|
||||
|
||||
AJILENAKH PNG "icons\\Ajilenakh.png"
|
||||
|
||||
AKAIMAOU PNG "icons\\AkaiMaou.png"
|
||||
|
||||
AMAKUMOFRUIT PNG "icons\\AmakumoFruit.png"
|
||||
@ -1377,7 +1397,7 @@ CICIN PNG "icons\\Cicin.png"
|
||||
|
||||
CLOUDLEISURESTEPS PNG "icons\\CloudleisureSteps.png"
|
||||
|
||||
CLUSTERLEAFOFCULTIVATION PNG "icons\\ClusterleafOfCultivation.png"
|
||||
CLUSTERLEAFOFCULTIVATION PNG "icons\\ClusterleafOfCultivation.png"
|
||||
|
||||
COMMONCHEST PNG "icons\\CommonChest.png"
|
||||
|
||||
@ -1425,7 +1445,7 @@ DANDY PNG "icons\\Dandy.png"
|
||||
|
||||
DAWNCATCHER PNG "icons\\Dawncatcher.png"
|
||||
|
||||
DAYNIGHTSWITCHINGMECHANISM PNG "icons\\DayNightSwitchingMechanism.png"
|
||||
DAYNIGHTSWITCHINGMECHANISM PNG "icons\\DayNightSwitchingMechanism.png"
|
||||
|
||||
DEEPSEAUNAGI PNG "icons\\DeepSeaUnagi.png"
|
||||
|
||||
@ -1665,7 +1685,7 @@ LUMINOUSSEELIE PNG "icons\\LuminousSeelie.png"
|
||||
|
||||
LUNGEDSTICKLEBACK PNG "icons\\LungedStickleback.png"
|
||||
|
||||
LUPUSBOREASDOMINATOROFWOLVES PNG "icons\\LupusBoreasDominatorofWolves.png"
|
||||
LUPUSBOREASDOMINATOROFWOLVES PNG "icons\\LupusBoreasDominatorofWolves.png"
|
||||
|
||||
LUXURIOUSCHEST PNG "icons\\LuxuriousChest.png"
|
||||
|
||||
@ -1777,6 +1797,8 @@ PRECIOUSCHEST PNG "icons\\PreciousChest.png"
|
||||
|
||||
PRESSUREPLATE PNG "icons\\PressurePlate.png"
|
||||
|
||||
PRIMALCONSTRUCT PNG "icons\\PrimalConstruct.png"
|
||||
|
||||
PRIMOGEOVISHAP PNG "icons\\PrimoGeovishap.png"
|
||||
|
||||
PUFFERFISH PNG "icons\\Pufferfish.png"
|
||||
@ -1805,6 +1827,8 @@ RAWMEAT PNG "icons\\RawMeat.png"
|
||||
|
||||
RECIPE PNG "icons\\Recipe.png"
|
||||
|
||||
REDCREST PNG "icons\\Redcrest.png"
|
||||
|
||||
REDFINNEDUNAGI PNG "icons\\RedFinnedUnagi.png"
|
||||
|
||||
REDHORNEDLIZARD PNG "icons\\RedHornedLizard.png"
|
||||
@ -1861,8 +1885,12 @@ SANGOPEARL PNG "icons\\SangoPearl.png"
|
||||
|
||||
SAPPHIRE PNG "icons\\Sapphire.png"
|
||||
|
||||
SCARAB PNG "icons\\Scarab.png"
|
||||
|
||||
SCARLETQUARTZ PNG "icons\\ScarletQuartz.png"
|
||||
|
||||
SCORPION PNG "icons\\Scorpion.png"
|
||||
|
||||
SEAGANODERMA PNG "icons\\SeaGanoderma.png"
|
||||
|
||||
SEAGRASS PNG "icons\\Seagrass.png"
|
||||
@ -1889,6 +1917,8 @@ SEELIECOURT PNG "icons\\SeelieCourt.png"
|
||||
|
||||
SEELIELAMP PNG "icons\\SeelieLamp.png"
|
||||
|
||||
SEMIPERPETUALCONTROLMATRIX PNG "icons\\SemiPerpetualControlMatrix.png"
|
||||
|
||||
SHADOWYHUSK PNG "icons\\ShadowyHusk.png"
|
||||
|
||||
SHAGGYSUMPTERBEAST PNG "icons\\ShaggySumpterBeast.png"
|
||||
@ -1897,8 +1927,6 @@ SHOGUN PNG "icons\\Shogun.png"
|
||||
|
||||
SHOGUNATEINFANTRY PNG "icons\\ShogunateInfantry.png"
|
||||
|
||||
SUMERUPUZZLES PNG "icons\\SumeruPuzzles.png"
|
||||
|
||||
SHRINEOFDEPTH PNG "icons\\ShrineOfDepth.png"
|
||||
|
||||
SHROOMBOAR PNG "icons\\Shroomboar.png"
|
||||
@ -1953,6 +1981,8 @@ STRANGETOOTH PNG "icons\\StrangeTooth.png"
|
||||
|
||||
STRETCHYFUNGUS PNG "icons\\StretchyFungus.png"
|
||||
|
||||
SUMERUPUZZLES PNG "icons\\SumeruPuzzles.png"
|
||||
|
||||
SUMERUROSE PNG "icons\\SumeruRose.png"
|
||||
|
||||
SUMERUSHRINEOFDEPTHS PNG "icons\\SumeruShrineofDepths.png"
|
||||
@ -1987,10 +2017,10 @@ THEEREMITES PNG "icons\\TheEremites.png"
|
||||
|
||||
THEGREATSNOWBOARKING PNG "icons\\TheGreatSnowboarKing.png"
|
||||
|
||||
THEWITHERING PNG "icons\\TheWithering.png"
|
||||
|
||||
THERAVENFORUM PNG "icons\\TheRavenForum.png"
|
||||
|
||||
THEWITHERING PNG "icons\\TheWithering.png"
|
||||
|
||||
THREEBOXES PNG "icons\\ThreeBoxes.png"
|
||||
|
||||
THUNDERMANIFESTATION PNG "icons\\ThunderManifestation.png"
|
||||
@ -2027,9 +2057,11 @@ VIOLETIBIS PNG "icons\\VioletIbis.png"
|
||||
|
||||
VIPARYAS PNG "icons\\Viparyas.png"
|
||||
|
||||
VULTURE PNG "icons\\Vulture.png"
|
||||
|
||||
WARMINGSEELIE PNG "icons\\WarmingSeelie.png"
|
||||
|
||||
WAVERIDERWAYPOINTCANNOTTELEPORT PNG "icons\\WaveriderWaypointCannotTeleport.png"
|
||||
WAVERIDERWAYPOINTCANNOTTELEPORT PNG "icons\\WaveriderWaypointCannotTeleport.png"
|
||||
|
||||
WEAPON PNG "icons\\Weapon.png"
|
||||
|
||||
|
@ -146,6 +146,26 @@ namespace cheat::feature
|
||||
return instance;
|
||||
}
|
||||
|
||||
bool ESP::isBuriedChest(game::Entity* entity)
|
||||
{
|
||||
if (entity->name().find("_WorldArea_Operator") != std::string::npos)
|
||||
{
|
||||
auto entityGameObject = app::MoleMole_BaseEntity_get_rootGameObject(entity->raw(), nullptr);
|
||||
auto transform = app::GameObject_GetComponentByName(entityGameObject, string_to_il2cppi("Transform"), nullptr);
|
||||
auto child = app::Transform_FindChild(reinterpret_cast<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)
|
||||
{
|
||||
if (name.find("Avatar") != std::string::npos)
|
||||
@ -414,9 +434,18 @@ namespace cheat::feature
|
||||
auto& entry = field.value();
|
||||
if (!entry.m_Enabled || !m_FilterExecutor.ApplyFilter(entity, filter))
|
||||
continue;
|
||||
|
||||
if (entry.m_Name == "Buried Chest")
|
||||
{
|
||||
if(isBuriedChest(entity))
|
||||
{
|
||||
esp::render::DrawEntity(entry.m_Name, entity, entry.m_Color, entry.m_ContrastColor);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (entry.m_Name == "Npc" || "AvatarOwn" || "AvatarTeammate")
|
||||
{
|
||||
if (isBuriedChest(entity))
|
||||
continue;
|
||||
if (entity->type() == app::EntityType__Enum_1::Avatar || entity->type() == app::EntityType__Enum_1::NPC)
|
||||
{
|
||||
std::string name = entity->name();
|
||||
@ -591,7 +620,7 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(chest, LuxuriousChest);
|
||||
ADD_FILTER_FIELD(chest, RemarkableChest);
|
||||
// Other Chests
|
||||
//ADD_FILTER_FIELD(chest, BuriedChest); // Shared name, commented for now
|
||||
ADD_FILTER_FIELD(chest, BuriedChest);
|
||||
ADD_FILTER_FIELD(chest, SearchPoint);
|
||||
|
||||
|
||||
@ -652,6 +681,7 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(living, Onikabuto);
|
||||
ADD_FILTER_FIELD(living, Pigeon);
|
||||
ADD_FILTER_FIELD(living, Salamander);
|
||||
ADD_FILTER_FIELD(living, Scarab);
|
||||
ADD_FILTER_FIELD(living, Squirrel);
|
||||
ADD_FILTER_FIELD(living, Starconch);
|
||||
ADD_FILTER_FIELD(living, Weasel);
|
||||
@ -705,6 +735,7 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(monster, MaguuKenki);
|
||||
// Sumeru
|
||||
ADD_FILTER_FIELD(monster, JadeplumeTerrorshroom);
|
||||
ADD_FILTER_FIELD(monster, AeonblightDrake);
|
||||
// Regular. Alphabetical.
|
||||
ADD_FILTER_FIELD(monster, AbyssMage);
|
||||
ADD_FILTER_FIELD(monster, BlackSerpentKnight);
|
||||
@ -735,6 +766,7 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(monster, OceanidFrog);
|
||||
ADD_FILTER_FIELD(monster, OceanidSquirrel);
|
||||
ADD_FILTER_FIELD(monster, OceanidWigeon);
|
||||
ADD_FILTER_FIELD(monster, PrimalConstruct);
|
||||
ADD_FILTER_FIELD(monster, PyroAbyssLector);
|
||||
ADD_FILTER_FIELD(monster, Rifthound);
|
||||
ADD_FILTER_FIELD(monster, RifthoundWhelp);
|
||||
@ -746,6 +778,8 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(monster, RuinSentinel);
|
||||
ADD_FILTER_FIELD(monster, Samachurl);
|
||||
ADD_FILTER_FIELD(monster, SangonomiyaCohort);
|
||||
ADD_FILTER_FIELD(monster, Scorpion);
|
||||
ADD_FILTER_FIELD(monster, SemiPerpetualControlMatrix);
|
||||
ADD_FILTER_FIELD(monster, ShadowyHusk);
|
||||
ADD_FILTER_FIELD(monster, ShaggySumpterBeast);
|
||||
ADD_FILTER_FIELD(monster, ShogunateInfantry);
|
||||
@ -755,10 +789,12 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(monster, StretchyFungus);
|
||||
ADD_FILTER_FIELD(monster, TreasureHoarder);
|
||||
ADD_FILTER_FIELD(monster, UnusualHilichurl);
|
||||
ADD_FILTER_FIELD(monster, Vulture);
|
||||
ADD_FILTER_FIELD(monster, WhirlingFungus);
|
||||
ADD_FILTER_FIELD(monster, Whopperflower);
|
||||
ADD_FILTER_FIELD(monster, WingedShroom);
|
||||
|
||||
ADD_FILTER_FIELD(plant, Ajilenakh);
|
||||
ADD_FILTER_FIELD(plant, AmakumoFruit);
|
||||
ADD_FILTER_FIELD(plant, Apple);
|
||||
ADD_FILTER_FIELD(plant, BambooShoot);
|
||||
@ -788,6 +824,7 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(plant, Pinecone);
|
||||
ADD_FILTER_FIELD(plant, Qingxin);
|
||||
ADD_FILTER_FIELD(plant, Radish);
|
||||
ADD_FILTER_FIELD(plant, Redcrest);
|
||||
ADD_FILTER_FIELD(plant, RukkhashavaMushroom);
|
||||
ADD_FILTER_FIELD(plant, SakuraBloom);
|
||||
ADD_FILTER_FIELD(plant, SangoPearl);
|
||||
@ -847,4 +884,4 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(puzzle, WindmillMechanism);
|
||||
}
|
||||
#undef ADD_FILTER_FIELD
|
||||
}
|
||||
}
|
@ -35,6 +35,7 @@ namespace cheat::feature
|
||||
|
||||
config::Field<bool> f_DrawDistance;
|
||||
config::Field<bool> f_DrawName;
|
||||
//config::Field<bool> f_HideCompleted;
|
||||
config::Field<float> f_ArrowRadius;
|
||||
config::Field<float> f_OutlineThickness;
|
||||
config::Field<float> f_TracerSize;
|
||||
@ -80,7 +81,8 @@ namespace cheat::feature
|
||||
void DrawFilterField(const config::Field<esp::ESPItem>& field);
|
||||
|
||||
void GetNpcName(std::string& name);
|
||||
|
||||
bool isBuriedChest(game::Entity* entity);
|
||||
|
||||
void OnKeyUp(short key, bool& cancelled);
|
||||
|
||||
ESP();
|
||||
|
@ -104,7 +104,7 @@ namespace cheat::game::filters
|
||||
SimpleFilter Npc = { EntityType__Enum_1::NPC, { "Liyue", "Mengde", "Inazuma", "Enkanomiya", "Sumeru", "Fontaine", "Aranara", "Natlan", "Snezhnaya", "Coop", "Quest", "Animal", "Guide", "Homeworld", "Avatar", "Kanban", "Monster"} };
|
||||
SimpleFilter Crane = { EntityType__Enum_1::Monster, "Crane" };
|
||||
SimpleFilter Falcon = { EntityType__Enum_1::Monster, "Falcon" };
|
||||
SimpleFilter LucklightFly = { EntityType__Enum_1::EnvAnimal, "Boltbug_" };
|
||||
SimpleFilter LucklightFly = { EntityType__Enum_1::EnvAnimal, "Boltbug_Lightbug" };
|
||||
SimpleFilter Salamander = { EntityType__Enum_1::EnvAnimal, "Salamander" };
|
||||
SimpleFilter DuskBird = { EntityType__Enum_1::Monster, "Pigeon_Beak" };
|
||||
SimpleFilter Pigeon = { EntityType__Enum_1::Monster, "Pigeon_0" };
|
||||
@ -118,6 +118,7 @@ namespace cheat::game::filters
|
||||
SimpleFilter Kitsune = { EntityType__Enum_1::EnvAnimal, "Vulpes" };
|
||||
SimpleFilter BakeDanuki = { EntityType__Enum_1::Monster, "Inu_Tanuki" };
|
||||
SimpleFilter Meat = { EntityType__Enum_1::GatherObject , { "_Food_BirdMeat", "_Food_Meat", "_Fishmeat" } };
|
||||
SimpleFilter Scarab = { EntityType__Enum_1::EnvAnimal, "Scarab" };
|
||||
}
|
||||
|
||||
namespace mineral
|
||||
@ -161,7 +162,7 @@ namespace cheat::game::filters
|
||||
SimpleFilter Mitachurl = { EntityType__Enum_1::Monster, "_Brute" };
|
||||
SimpleFilter Nobushi = { EntityType__Enum_1::Monster, "_Ronin" };
|
||||
SimpleFilter Kairagi = { EntityType__Enum_1::Monster, "_Kairagi" };
|
||||
SimpleFilter RuinDrake = { EntityType__Enum_1::Monster, "_Gargoyle" };
|
||||
SimpleFilter RuinDrake = { EntityType__Enum_1::Monster, { "Gargoyle_Ground", "Gargoyle_Airborne" } };
|
||||
SimpleFilter RuinGuard = { EntityType__Enum_1::Monster, "_Defender" };
|
||||
SimpleFilter RuinHunter = { EntityType__Enum_1::Monster, "_Formathr" };
|
||||
SimpleFilter RuinGrader = { EntityType__Enum_1::Monster, "_Konungmathr" };
|
||||
@ -229,6 +230,11 @@ namespace cheat::game::filters
|
||||
SimpleFilter ShaggySumpterBeast = { EntityType__Enum_1::Monster, "_Megamoth_" };
|
||||
SimpleFilter Spincrocodile = { EntityType__Enum_1::Monster, "_Gator" };
|
||||
SimpleFilter SentryTurrets = { EntityType__Enum_1::Field, "SentryTurrets_" };
|
||||
SimpleFilter AeonblightDrake = { EntityType__Enum_1::Monster, "Gargoyle_Fafnir_" };
|
||||
SimpleFilter PrimalConstruct = { EntityType__Enum_1::Monster, "Monolith_Ordinator_" };
|
||||
SimpleFilter SemiPerpetualControlMatrix = { EntityType__Enum_1::Monster, "Monolith_Starchild" };
|
||||
SimpleFilter Scorpion = { EntityType__Enum_1::Monster, "Scorpion_" };
|
||||
SimpleFilter Vulture = { EntityType__Enum_1::Monster, "Vulture_" };
|
||||
}
|
||||
|
||||
namespace plant
|
||||
@ -284,6 +290,8 @@ namespace cheat::game::filters
|
||||
SimpleFilter SumeruRose = { EntityType__Enum_1::GatherObject, "_XumiRose" };
|
||||
SimpleFilter Viparyas = { EntityType__Enum_1::GatherObject, "_DreamerPlant" };
|
||||
SimpleFilter ZaytunPeach = { EntityType__Enum_1::GatherObject, "_Olea" };
|
||||
SimpleFilter Redcrest = { EntityType__Enum_1::GatherObject, "RedPearlFruit" };
|
||||
SimpleFilter Ajilenakh = { EntityType__Enum_1::GatherObject, "DatePalm" };
|
||||
}
|
||||
|
||||
namespace puzzle
|
||||
@ -416,7 +424,9 @@ namespace cheat::game::filters
|
||||
living::DuskBird,
|
||||
monster::ShaggySumpterBeast,
|
||||
monster::RishbolandTiger,
|
||||
monster::Spincrocodile
|
||||
monster::Spincrocodile,
|
||||
monster::Scorpion,
|
||||
monster::Vulture
|
||||
};
|
||||
SimpleFilter AnimalPickUp = {
|
||||
living::CrystalCore,
|
||||
@ -432,7 +442,8 @@ namespace cheat::game::filters
|
||||
living::Starconch,
|
||||
living::BirdEgg,
|
||||
living::WeaselThief,
|
||||
living::Fish
|
||||
living::Fish,
|
||||
living::Scarab
|
||||
};
|
||||
SimpleFilter AnimalNPC = {
|
||||
living::Dog,
|
||||
@ -461,7 +472,6 @@ namespace cheat::game::filters
|
||||
monster::WhirlingFungus,
|
||||
monster::WingedShroom,
|
||||
monster::GroundedShroom,
|
||||
monster::ShaggySumpterBeast
|
||||
};
|
||||
SimpleFilter MonsterElites = {
|
||||
monster::Mitachurl,
|
||||
@ -485,7 +495,8 @@ namespace cheat::game::filters
|
||||
monster::Geovishap,
|
||||
monster::HydroBathysmalVishap,
|
||||
monster::EyeOfTheStorm,
|
||||
monster::BlackSerpentKnight
|
||||
monster::BlackSerpentKnight,
|
||||
monster::PrimalConstruct
|
||||
};
|
||||
SimpleFilter MonsterBosses = {
|
||||
// Adding these comments for better tracking.
|
||||
@ -528,7 +539,9 @@ namespace cheat::game::filters
|
||||
monster::ElectroBathysmalVishap,
|
||||
// Sumeru
|
||||
monster::ElectroRegisvine,
|
||||
monster::JadeplumeTerrorshroom
|
||||
monster::JadeplumeTerrorshroom,
|
||||
monster::AeonblightDrake,
|
||||
monster::SemiPerpetualControlMatrix
|
||||
|
||||
};
|
||||
SimpleFilter MonsterShielded = {
|
||||
|
@ -118,6 +118,7 @@ namespace cheat::game::filters
|
||||
extern SimpleFilter Kitsune;
|
||||
extern SimpleFilter BakeDanuki;
|
||||
extern SimpleFilter Meat;
|
||||
extern SimpleFilter Scarab;
|
||||
}
|
||||
|
||||
namespace mineral
|
||||
@ -229,6 +230,11 @@ namespace cheat::game::filters
|
||||
extern SimpleFilter ShaggySumpterBeast;
|
||||
extern SimpleFilter Spincrocodile;
|
||||
extern SimpleFilter SentryTurrets;
|
||||
extern SimpleFilter AeonblightDrake;
|
||||
extern SimpleFilter PrimalConstruct;
|
||||
extern SimpleFilter SemiPerpetualControlMatrix;
|
||||
extern SimpleFilter Scorpion;
|
||||
extern SimpleFilter Vulture;
|
||||
}
|
||||
|
||||
namespace plant
|
||||
@ -284,6 +290,8 @@ namespace cheat::game::filters
|
||||
extern SimpleFilter SumeruRose;
|
||||
extern SimpleFilter Viparyas;
|
||||
extern SimpleFilter ZaytunPeach;
|
||||
extern SimpleFilter Redcrest;
|
||||
extern SimpleFilter Ajilenakh;
|
||||
}
|
||||
|
||||
namespace puzzle
|
||||
|
@ -14,6 +14,12 @@ namespace cheat::feature
|
||||
app::AnimatorStateInfo processStateInfo, app::MoleMole_VCAnimatorEvent_MoleMole_VCAnimatorEvent_TriggerMode__Enum mode, MethodInfo* method);
|
||||
static void LCBaseCombat_FireBeingHitEvent_Hook(app::LCBaseCombat* __this, uint32_t attackeeRuntimeID, app::AttackResult* attackResult, MethodInfo* method);
|
||||
|
||||
static int32_t attackTags[] = {
|
||||
1638193991, // Normal and Charged
|
||||
1498431743, // Plunge
|
||||
-584054938, 0, // Skill, Burst and Charged Bow Release
|
||||
};
|
||||
|
||||
RapidFire::RapidFire() : Feature(),
|
||||
NF(f_Enabled, "Attack Multiplier", "RapidFire", false),
|
||||
NF(f_MultiHit, "Multi-hit", "RapidFire", false),
|
||||
@ -24,7 +30,12 @@ namespace cheat::feature
|
||||
NF(f_maxMultiplier, "Max Multiplier", "RapidFire", 3),
|
||||
NF(f_MultiTarget, "Multi-target", "RapidFire", false),
|
||||
NF(f_MultiTargetRadius, "Multi-target Radius", "RapidFire", 20.0f),
|
||||
NF(f_MultiAnimation, "Multi-animation", "RapidFire", false)
|
||||
NF(f_MultiAnimation, "Multi-animation", "RapidFire", false),
|
||||
NF(f_AnimationMultiplier, "Animation Multiplier", "RapidFire", 100),
|
||||
NF(f_AnimationState, "Animation State", "RapidFire", 0.5f),
|
||||
NF(f_AttackSpeed, "Attack Speed", "RapidFire", false),
|
||||
NF(f_SpeedMultiplier, "Speed Multiplier", "RapidFire", 1.5f),
|
||||
animationCounter(1)
|
||||
{
|
||||
// HookManager::install(app::MoleMole_LCBaseCombat_DoHitEntity, LCBaseCombat_DoHitEntity_Hook); -- Looks like FireBeingHitEvent is superior to this.
|
||||
HookManager::install(app::MoleMole_VCAnimatorEvent_HandleProcessItem, VCAnimatorEvent_HandleProcessItem_Hook);
|
||||
@ -85,29 +96,40 @@ namespace cheat::feature
|
||||
|
||||
ConfigWidget("Multi-animation", f_MultiAnimation, "Enables multi-animation attacks.\n" \
|
||||
"Do keep in mind that the character's audio will also be spammed.");
|
||||
ConfigWidget("Animation Multiplier", f_AnimationMultiplier, 1, 1, 150, "Configure to how many times it will update the animation state.\n" \
|
||||
"Results can vary alongside Animation State");
|
||||
ConfigWidget("Animation State", f_AnimationState, 0.01f, 0.f, 2.f, "Animation state to replay.\n"\
|
||||
"Results can vary alongside Animation Multiplier");
|
||||
ConfigWidget("Attack Speed", f_AttackSpeed, "Enables fast animation attacks.\n");
|
||||
ConfigWidget("Speed Multiplier", f_SpeedMultiplier, 0.1f, 1.0f, 5.0f, "Attack speed multiplier.");
|
||||
}
|
||||
|
||||
bool RapidFire::NeedStatusDraw() const
|
||||
{
|
||||
return f_Enabled && (f_MultiHit || f_MultiTarget || f_MultiAnimation);
|
||||
return (f_Enabled && (f_MultiHit || f_MultiTarget)) || f_MultiAnimation || f_AttackSpeed;
|
||||
}
|
||||
|
||||
void RapidFire::DrawStatus()
|
||||
{
|
||||
if (f_MultiHit)
|
||||
{
|
||||
if (f_Randomize)
|
||||
ImGui::Text("Multi-Hit Random[%d|%d]", f_minMultiplier.value(), f_maxMultiplier.value());
|
||||
else if (f_OnePunch)
|
||||
ImGui::Text("Multi-Hit [OnePunch]");
|
||||
else
|
||||
ImGui::Text("Multi-Hit [%d]", f_Multiplier.value());
|
||||
if (f_Enabled) {
|
||||
ImGui::Text("Rapid Fire:");
|
||||
if (f_MultiHit)
|
||||
{
|
||||
if (f_Randomize)
|
||||
ImGui::Text("Multi-Hit Random[%d|%d]", f_minMultiplier.value(), f_maxMultiplier.value());
|
||||
else if (f_OnePunch)
|
||||
ImGui::Text("Multi-Hit [OnePunch]");
|
||||
else
|
||||
ImGui::Text("Multi-Hit [%d]", f_Multiplier.value());
|
||||
}
|
||||
if (f_MultiTarget)
|
||||
ImGui::Text("Multi-Target [%.01fm]", f_MultiTargetRadius.value());
|
||||
}
|
||||
if (f_MultiTarget)
|
||||
ImGui::Text("Multi-Target [%.01fm]", f_MultiTargetRadius.value());
|
||||
|
||||
if (f_MultiAnimation)
|
||||
ImGui::Text("Multi-Animation");
|
||||
ImGui::Text("Multi-Animation [%d|%0.2f]", f_AnimationMultiplier.value(), f_AnimationState.value());
|
||||
if(f_AttackSpeed)
|
||||
ImGui::Text("Attack Speed [%0.1f]", f_SpeedMultiplier.value());
|
||||
}
|
||||
|
||||
RapidFire& RapidFire::GetInstance()
|
||||
@ -116,7 +138,6 @@ namespace cheat::feature
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
int RapidFire::CalcCountToKill(float attackDamage, uint32_t targetID)
|
||||
{
|
||||
if (attackDamage == 0)
|
||||
@ -203,6 +224,7 @@ namespace cheat::feature
|
||||
return false;
|
||||
|
||||
auto& manager = game::EntityManager::instance();
|
||||
auto patterID = manager.avatar()->combat()->monitor;
|
||||
auto avatarID = manager.avatar()->raw()->fields._configID_k__BackingField;
|
||||
auto attackerID = attacker.raw()->fields._configID_k__BackingField;
|
||||
// LOG_DEBUG("configID = %d", attackerID);
|
||||
@ -329,11 +351,38 @@ namespace cheat::feature
|
||||
{
|
||||
auto attacker = game::Entity(__this->fields._._._entity);
|
||||
RapidFire& rapidFire = RapidFire::GetInstance();
|
||||
bool isAttackAnimation = std::any_of(std::begin(attackTags), std::end(attackTags),
|
||||
[&](uint32_t tag) { return processStateInfo.m_Tag == tag; });
|
||||
bool isAttacking = IsAttackByAvatar(attacker) && isAttackAnimation;
|
||||
|
||||
if (rapidFire.f_MultiAnimation && IsAttackByAvatar(attacker))
|
||||
processItem->fields.lastTime = 0;
|
||||
if (rapidFire.f_MultiAnimation && isAttacking)
|
||||
{
|
||||
// Set counter back to 1 when any new attack animation is invoked
|
||||
if (processStateInfo.m_NormalizedTime <= 0.01f)
|
||||
rapidFire.animationCounter = 1;
|
||||
|
||||
if (rapidFire.animationCounter <= rapidFire.f_AnimationMultiplier)
|
||||
{
|
||||
// Can be configured up to 1.0 but 0.1 to 0.9 you can barely notice the difference
|
||||
// So 0 - 0.2 is enough.
|
||||
processItem->fields.lastTime = (rapidFire.f_AnimationState / 10);
|
||||
rapidFire.animationCounter++;
|
||||
}
|
||||
}
|
||||
|
||||
static bool isFastSpeed = false;
|
||||
if (rapidFire.f_AttackSpeed && isAttacking)
|
||||
{
|
||||
if (!isinf(processStateInfo.m_Length))
|
||||
app::Animator_set_speed(attacker.animator(), rapidFire.f_SpeedMultiplier, nullptr);
|
||||
isFastSpeed = true;
|
||||
}
|
||||
else if (IsAttackByAvatar(attacker) && isFastSpeed) {
|
||||
//LOG_DEBUG("Speed Reverted");
|
||||
app::Animator_set_speed(attacker.animator(), processStateInfo.m_SpeedMultiplier, nullptr);
|
||||
isFastSpeed = false;
|
||||
}
|
||||
|
||||
CALL_ORIGIN(VCAnimatorEvent_HandleProcessItem_Hook, __this, processItem, processStateInfo, mode, method);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -6,7 +6,6 @@
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
|
||||
class RapidFire : public Feature
|
||||
{
|
||||
public:
|
||||
@ -20,6 +19,11 @@ namespace cheat::feature
|
||||
config::Field<config::Toggle<Hotkey>> f_MultiTarget;
|
||||
config::Field<float> f_MultiTargetRadius;
|
||||
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();
|
||||
|
||||
@ -36,3 +40,4 @@ namespace cheat::feature
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
@ -317,10 +317,12 @@ namespace cheat::feature
|
||||
"3. You can now press Next or Previous Hotkey to Teleport through the Checklist\n"
|
||||
"Initially it will teleport the player to the selection made\n"
|
||||
"Note: Double click or click the arrow to open teleport details");
|
||||
ConfigWidget("Enable Interpolation", f_Interpolate, "Enable interpolation between teleports when using keybinds."); ImGui::SameLine(); ImGui::SetNextItemWidth(300.0f);
|
||||
ConfigWidget("Enable Interpolation", f_Interpolate, "Enable interpolation between teleports when using keybinds.");
|
||||
ImGui::SetNextItemWidth(300.0f);
|
||||
ConfigWidget("Interpolation Speed", f_Speed, 0.1f, 0.1f, 99.0f,
|
||||
"Interpolation speed.\n recommended setting below or equal to 0.1.");
|
||||
ConfigWidget("Auto Teleport", f_Auto, "Enable automatic forward teleporation between teleports"); ImGui::SameLine(); ImGui::SetNextItemWidth(300.0f);
|
||||
ConfigWidget("Auto Teleport", f_Auto, "Enable automatic forward teleporation between teleports");
|
||||
ImGui::SetNextItemWidth(300.0f);
|
||||
ConfigWidget("Delay Time (s)", f_DelayTime, 1, 0, 60, "Delay (in s) between teleport.\n"
|
||||
"Note: This is not fully tested detection-wise.\nNot recommended with low values.");
|
||||
|
||||
@ -448,7 +450,7 @@ namespace cheat::feature
|
||||
}
|
||||
ImGui::TableNextColumn();
|
||||
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, selected ? IM_COL32(40, 90, 175, 255) : ImGui::ColorConvertFloat4ToU32(ImGui::GetStyle().Colors[ImGuiCol_Text]));
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, selected ? ImGui::GetColorU32(ImGuiCol_CheckMark) : ImGui::GetColorU32(ImGuiCol_Text));
|
||||
ImGui::Text("%s", name.c_str());
|
||||
ImGui::PopStyleColor();
|
||||
if (ImGui::IsItemHovered())
|
||||
|
@ -80,6 +80,7 @@ namespace cheat::feature
|
||||
"Attack03",
|
||||
"Attack04",
|
||||
"Attack05",
|
||||
"Attack06",
|
||||
"Attack01",
|
||||
"Attack02",
|
||||
"ExtraAttack",
|
||||
@ -234,7 +235,8 @@ namespace cheat::feature
|
||||
NF(f_Enabled, "Animation Changer", "Visuals::AnimationChanger", false),
|
||||
NF(f_Animation, "Animation", "Visuals::AnimationChanger", "ExtraAttack"),
|
||||
NF(f_ApplyKey, "Apply Animation", "Visuals::AnimationChanger", Hotkey('Y')),
|
||||
NF(f_ResetKey, "Reset Animation", "Visuals::AnimationChanger", Hotkey('R'))
|
||||
NF(f_ResetKey, "Reset Animation", "Visuals::AnimationChanger", Hotkey('R')),
|
||||
NF(f_Delay, "Repeat Delay", "Visuals::AnimationChanger", 400)
|
||||
{
|
||||
events::GameUpdateEvent += MY_METHOD_HANDLER(AnimationChanger::OnGameUpdate);
|
||||
}
|
||||
@ -268,6 +270,7 @@ namespace cheat::feature
|
||||
|
||||
ConfigWidget("Apply Key", f_ApplyKey, true);
|
||||
ConfigWidget("Reset Key", f_ResetKey, true);
|
||||
ConfigWidget("Delay", f_Delay, 1, 1, 1000000000, "Delay to repeat animation");
|
||||
}
|
||||
}
|
||||
ImGui::EndGroupPanel();
|
||||
@ -294,8 +297,7 @@ namespace cheat::feature
|
||||
if (!f_Enabled)
|
||||
return;
|
||||
|
||||
// Taiga#5555: Maybe need to add separate option to change delay value if user feels like it's too fast or slow.
|
||||
UPDATE_DELAY(400);
|
||||
UPDATE_DELAY(f_Delay);
|
||||
|
||||
auto& manager = game::EntityManager::instance();
|
||||
auto avatar = manager.avatar();
|
||||
|
@ -12,6 +12,7 @@ namespace cheat::feature
|
||||
config::Field<std::string> f_Animation;
|
||||
config::Field<Hotkey> f_ApplyKey;
|
||||
config::Field<Hotkey> f_ResetKey;
|
||||
config::Field<int> f_Delay;
|
||||
|
||||
const FeatureGUIInfo& GetGUIInfo() const override;
|
||||
void DrawMain() override;
|
||||
|
@ -25,6 +25,7 @@ namespace cheat::feature
|
||||
FreeCamera::FreeCamera() : Feature(),
|
||||
NF(f_Enabled, "Free Camera", "Visuals::FreeCamera", false),
|
||||
NF(f_FreezeAnimation, "Freeze Character Animation", "Visuals::FreeCamera", false),
|
||||
NF(f_BlockInput, "Block Input", "Visuals::FreeCamera", false),
|
||||
NF(f_DamageOverlay, "Damage Overlay", "Visuals::FreeCamera", false),
|
||||
NF(f_HpOverlay, "Enemy HP Overlay", "Visuals::FreeCamera", false),
|
||||
NF(f_Speed, "Speed", "Visuals::FreeCamera", 1.0f),
|
||||
@ -61,6 +62,7 @@ namespace cheat::feature
|
||||
{
|
||||
ConfigWidget("Enable", f_Enabled);
|
||||
ConfigWidget("Freeze Character Animation", f_FreezeAnimation, "Freezes the active character's animation.");
|
||||
ConfigWidget("Block User Input", f_BlockInput, "If enabled, any input will be blocked.");
|
||||
if (f_Enabled)
|
||||
{
|
||||
ConfigWidget("Toggle Damage Overlay", f_DamageOverlay, "Remove damage output overlay");
|
||||
@ -189,9 +191,9 @@ namespace cheat::feature
|
||||
targetPosition = targetPosition - app::Transform_get_right(freeCam_Transform, nullptr) * settings.f_Speed;
|
||||
|
||||
if (settings.f_LeftRoll.value().IsPressed())
|
||||
targetRotation.roll += settings.f_Speed;
|
||||
targetRotation.roll += settings.f_RollSpeed;
|
||||
if (settings.f_RightRoll.value().IsPressed())
|
||||
targetRotation.roll -= settings.f_Speed;
|
||||
targetRotation.roll -= settings.f_RollSpeed;
|
||||
if (settings.f_ResetRoll.value().IsPressed())
|
||||
targetRotation.roll = 0.0f;
|
||||
|
||||
@ -242,6 +244,12 @@ namespace cheat::feature
|
||||
|
||||
void FreeCamera::OnGameUpdate()
|
||||
{
|
||||
auto uiManager = GET_SINGLETON(MoleMole_UIManager);
|
||||
if (uiManager == nullptr)
|
||||
return;
|
||||
|
||||
static bool isBlock = false;
|
||||
|
||||
if (f_Enabled)
|
||||
{
|
||||
if (mainCam == nullptr)
|
||||
@ -284,6 +292,23 @@ namespace cheat::feature
|
||||
hpOverlay = nullptr;
|
||||
}
|
||||
|
||||
if (f_BlockInput)
|
||||
{
|
||||
if (!isBlock)
|
||||
{
|
||||
app::MoleMole_UIManager_EnableInput(uiManager, false, false, false, nullptr);
|
||||
isBlock = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isBlock)
|
||||
{
|
||||
app::MoleMole_UIManager_EnableInput(uiManager, true, false, false, nullptr);
|
||||
isBlock = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Taiga#5555: There's probably be a better way of implementing this. But for now, this is just what I came up with.
|
||||
auto& manager = game::EntityManager::instance();
|
||||
auto animator = manager.avatar()->animator();
|
||||
|
@ -9,6 +9,7 @@ namespace cheat::feature
|
||||
public:
|
||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||
config::Field<config::Toggle<Hotkey>> f_FreezeAnimation;
|
||||
config::Field<bool> f_BlockInput;
|
||||
config::Field<bool> f_DamageOverlay;
|
||||
config::Field<bool> f_HpOverlay;
|
||||
config::Field<float> f_Speed;
|
||||
|
@ -23,6 +23,7 @@ namespace cheat::feature
|
||||
NF(f_PickupFilter_Animals, "Animals filter", "AutoLoot", true),
|
||||
NF(f_PickupFilter_DropItems, "Drop items filter", "AutoLoot", true),
|
||||
NF(f_PickupFilter_Resources, "Resources filter", "AutoLoot", true),
|
||||
NF(f_PickupFilter_Oculus, "Oculus filter", "AutoLoot", true),
|
||||
NF(f_Chest, "Chests", "AutoLoot", false),
|
||||
NF(f_Leyline, "Leylines", "AutoLoot", false),
|
||||
NF(f_Investigate, "Search points", "AutoLoot", false),
|
||||
@ -123,7 +124,8 @@ namespace cheat::feature
|
||||
ConfigWidget("Enabled", f_PickupFilter, "Enable pickup filter.\n");
|
||||
ConfigWidget("Animals", f_PickupFilter_Animals, "Fish, Lizard, Frog, Flying animals."); ImGui::SameLine();
|
||||
ConfigWidget("Drop Items", f_PickupFilter_DropItems, "Material, Mineral, Artifact."); ImGui::SameLine();
|
||||
ConfigWidget("Resources", f_PickupFilter_Resources, "Everything beside Animals and Drop Items (Plants, Books, etc).");
|
||||
ConfigWidget("Resources", f_PickupFilter_Resources, "Everything beside Animals and Drop Items (Plants, Books, etc)."); ImGui::SameLine();
|
||||
ConfigWidget("Oculus", f_PickupFilter_Oculus, "Filter Oculus");
|
||||
}
|
||||
ImGui::EndGroupPanel();
|
||||
}
|
||||
@ -248,20 +250,23 @@ namespace cheat::feature
|
||||
|
||||
void AutoLoot::OnCheckIsInPosition(bool& result, app::BaseEntity* entity)
|
||||
{
|
||||
// TODO: Maybe add a list of filter for all GatherObject instead of just using entityType in general.
|
||||
auto& manager = game::EntityManager::instance();
|
||||
|
||||
if (f_AutoPickup || f_UseCustomRange) {
|
||||
float pickupRange = f_UseCustomRange ? f_CustomRange : g_default_range;
|
||||
if (f_PickupFilter)
|
||||
{
|
||||
if (!f_PickupFilter_Animals && entity->fields.entityType == app::EntityType__Enum_1::EnvAnimal ||
|
||||
!f_PickupFilter_DropItems && entity->fields.entityType == app::EntityType__Enum_1::DropItem ||
|
||||
!f_PickupFilter_Resources && entity->fields.entityType == app::EntityType__Enum_1::GatherObject)
|
||||
!f_PickupFilter_Resources && entity->fields.entityType == app::EntityType__Enum_1::GatherObject ||
|
||||
!f_PickupFilter_Oculus && game::filters::combined::Oculies.IsValid(manager.entity(entity->fields._runtimeID_k__BackingField)))
|
||||
{
|
||||
result = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
auto& manager = game::EntityManager::instance();
|
||||
result = manager.avatar()->distance(entity) < pickupRange;
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,7 @@ namespace cheat::feature
|
||||
config::Field<bool> f_PickupFilter_Animals;
|
||||
config::Field<bool> f_PickupFilter_DropItems;
|
||||
config::Field<bool> f_PickupFilter_Resources;
|
||||
config::Field<bool> f_PickupFilter_Oculus;
|
||||
|
||||
static AutoLoot& GetInstance();
|
||||
|
||||
|