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>
## 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.

View File

@ -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)。
标题写上你的建议,并且在描述里面,**清晰的**写下你的建议描述,以便我们的开发人员可以理解你的建议。

View File

@ -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))。
在描述中,確保內容**足夠清楚**,以便我們的開發人員能夠理解,你想要什麼以及你想要怎樣。

View File

@ -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)
{

View File

@ -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,35 +50,347 @@ namespace cheat::feature
return info;
}
void Settings::Colors_Export(std::string name)
ImVec4 HexToColor(std::string hexString)
{
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;
}
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();
auto colors = style.Colors;
nlohmann::json data;
if (replace)
for (auto& [colorName, colorValue] : m_Themes[name].colors)
data["Colors"][colorName] = ColorToHex(colorValue);
nlohmann::json json;
else {
auto colors = style.Colors;
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 };
{
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) << json << std::endl;
file << std::setw(4) << data << std::endl;
}
void Settings::Colors_Import(std::string name)
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;
auto& theme = m_Themes[name];
// Applying Colors
if (!theme.colors.empty()) {
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& 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();
bool alreadyExist = m_Themes.count(themeNameBuffer_) > 0;
if (ImGui::Button(alreadyExist ? "Replace Theme" : "Save Theme"))
{
if (themeNameBuffer_.empty())
return;
if (std::filesystem::exists(themesDir / (nameBuffer_ + ".json")))
{
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.");
ThemeExport(themeNameBuffer_);
hasLoaded = false;
f_DefaultTheme = themeNameBuffer_;
Init();
themeNameBuffer_.clear();
}
}
ImGui::EndGroupPanel();

View File

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

View File

@ -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);
}
}

View File

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

View File

@ -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" />

View File

@ -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>

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"
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"
@ -807,6 +811,8 @@ 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"
@ -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"
@ -1189,6 +1203,8 @@ 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"
@ -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"
@ -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,6 +2057,8 @@ 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"

View File

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

View File

@ -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,6 +81,7 @@ 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);

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 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 = {

View File

@ -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

View File

@ -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,15 +96,23 @@ 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_Enabled) {
ImGui::Text("Rapid Fire:");
if (f_MultiHit)
{
if (f_Randomize)
@ -105,9 +124,12 @@ namespace cheat::feature
}
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);
}
}

View File

@ -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
};
}

View File

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

View File

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

View File

@ -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;

View File

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

View File

@ -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;

View File

@ -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;
}
}

View File

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