Merge branch 'master' into fall_control

This commit is contained in:
Taiga 2022-08-24 01:39:51 -06:00 committed by GitHub
commit 9967b57c85
64 changed files with 121754 additions and 107015 deletions

View File

@ -56,19 +56,18 @@ As well as setting up **`cheat-library`** as startup project.
- Notifications
#### Player
- Invincible
- Attack Modifier
- No Cooldown Skill/Ultimate/Sprint/Bow
- God Mode(Invincible)
- Attack Modifier: Multi-Hit/Target/Animation
- No Cooldown: Skill/Ultimate/Sprint/Bow
- Unlimited Stamina
- No Clip
#### World
- Auto Seelie
- Vacuum Loot
- Dumb Enemies
- Freeze Enemies
- Auto Destroy Objects
- Auto Loot
- Auto Destroy: Ores/Shields/Doodas/Plants
- Auto Loot/Open Chests
- Pickup Range
- Auto Talk
- Auto Tree Farm
@ -77,6 +76,7 @@ As well as setting up **`cheat-library`** as startup project.
- Auto Fish
- Kill Aura
- Mob Vacuum
- Vacuum Loot
#### Teleport
- Chest/Oculi Teleport (Teleports to nearest)
@ -94,16 +94,17 @@ As well as setting up **`cheat-library`** as startup project.
- Hide UI
- In-game Embedded Browser
- Enable Peeking
- Profile Changer
- Profile Changer: UID/Nickname/AR/WorldLevel/Avatar/Namecard
- Custom Weather
- Free Camera
- Texture Changer
- Paimon Follow
- Texture Changer
#### Debugging
- Entities Manager
- Position Info
- FPS Graph
- Packet Sniffer
- [Packet Sniffer](https://github.com/Akebi-Group/Akebi-PacketSniffer)
<h1 align="center">Demo</h1>

View File

@ -431,6 +431,9 @@ namespace cheat
if (settings.f_NotificationsShow)
DrawNotifications();
if (settings.f_ShowStyleEditor)
ImGui::ShowStyleEditor();
if (settings.f_MenuKey.value().IsReleased() && !ImGui::IsAnyItemActive())
ToggleMenuShow();
}

View File

@ -1,45 +1,98 @@
#include <pch.h>
#include "Settings.h"
#include <cheat-base/render/gui-util.h>
#include <cheat-base/render/renderer.h>
#include <cheat-base/cheat/CheatManagerBase.h>
#include <cheat-base/render/renderer.h>
#include <cheat-base/render/gui-util.h>
#include <misc/cpp/imgui_stdlib.h>
#include <cheat-base/util.h>
namespace cheat::feature
#include "shlwapi.h"
#pragma comment(lib, "shlwapi.lib")
namespace cheat::feature
{
Settings::Settings() : Feature(),
Settings::Settings() : Feature(),
NF(f_MenuKey, "Show Cheat Menu Key", "General", Hotkey(VK_F1)),
NF(f_HotkeysEnabled, "Hotkeys Enabled", "General", true),
NF(f_FontSize, "Font size", "General", 16.0f),
NF(f_StatusMove, "Move Status Window", "General::StatusWindow", true),
NF(f_StatusShow, "Show Status Window", "General::StatusWindow", true),
NF(f_InfoMove, "Move Info Window", "General::InfoWindow", true),
NF(f_InfoShow, "Show Info Window", "General::InfoWindow", true),
NF(f_InfoMove, "Move Info Window", "General::InfoWindow", true),
NF(f_InfoShow, "Show Info Window", "General::InfoWindow", true),
NF(f_FpsMove, "Move FPS Indicator", "General::FPS", false),
NF(f_FpsShow, "Show FPS Indicator", "General::FPS", true),
NF(f_NotificationsShow, "Show Notifications", "General::Notify", true),
NF(f_NotificationsShow, "Show Notifications", "General::Notify", true),
NF(f_NotificationsDelay, "Notifications Delay", "General::Notify", 500),
NF(f_FileLogging, "File Logging", "General::Logging", false),
NF(f_FileLogging, "File Logging", "General::Logging", false),
NF(f_ConsoleLogging, "Console Logging", "General::Logging", true),
NF(f_FastExitEnable, "Fast Exit", "General::FastExit", false),
NF(f_HotkeyExit, "Hotkeys", "General::FastExit", Hotkey(VK_F12))
NF(f_HotkeyExit, "Hotkeys", "General::FastExit", Hotkey(VK_F12)),
{
NF(f_FontSize, "Font Size", "General", 16.0f),
NF(f_ShowStyleEditor, "Show Colors Customization", "General", false),
NFS(f_DefaultTheme, "Theme", "General::Colors", "Default"),
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);
const FeatureGUIInfo& Settings::GetGUIInfo() const
{
static const FeatureGUIInfo info{ "", "Settings", false };
return info;
}
}
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
{
static const FeatureGUIInfo info{ "", "Settings", false };
return info;
}
void Settings::Colors_Export(std::string name)
{
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;
}
void Settings::Colors_Import(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];
}
}
void Settings::DrawMain()
{
@ -50,12 +103,7 @@ namespace cheat::feature
"Key to toggle main menu visibility. Cannot be empty.\n"\
"If you forget this key, you can see or set it in your config file.");
ConfigWidget(f_HotkeysEnabled, "Enable hotkeys.");
if (ConfigWidget(f_FontSize, 1, 8, 64, "Font size for cheat interface."))
{
f_FontSize = std::clamp(f_FontSize.value(), 8, 64);
renderer::SetGlobalFontSize(static_cast<float>(f_FontSize));
}
}
}
ImGui::EndGroupPanel();
ImGui::BeginGroupPanel("Logging");
@ -101,7 +149,7 @@ namespace cheat::feature
ImGui::BeginGroupPanel("Show Notifications");
{
ConfigWidget(f_NotificationsShow, "Notifications on the bottom-right corner of the window will be displayed.");
ConfigWidget(f_NotificationsDelay, 1,1,10000, "Delay in milliseconds between notifications.");
ConfigWidget(f_NotificationsDelay, 1, 1, 10000, "Delay in milliseconds between notifications.");
}
ImGui::EndGroupPanel();
@ -109,7 +157,7 @@ namespace cheat::feature
{
ConfigWidget("Enabled",
f_FastExitEnable,
"Enable Fast Exit.\n"
"Enable Fast Exit.\n"
);
if (!f_FastExitEnable)
ImGui::BeginDisabled();
@ -121,13 +169,54 @@ namespace cheat::feature
ImGui::EndDisabled();
}
ImGui::EndGroupPanel();
ImGui::BeginGroupPanel("Interface Customization");
{
if (ConfigWidget(f_FontSize, 1, 8, 64, "Adjust interface font size."))
{
f_FontSize = std::clamp(f_FontSize.value(), 8, 64);
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")))
{
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.");
}
}
ImGui::EndGroupPanel();
}
Settings& Settings::GetInstance()
{
static Settings instance;
return instance;
}
Settings& Settings::GetInstance()
{
static Settings instance;
return instance;
}
void Settings::OnExitKeyPressed()
{
@ -137,4 +226,3 @@ namespace cheat::feature
ExitProcess(0);
}
}

View File

@ -2,25 +2,24 @@
#include <cheat-base/cheat/Feature.h>
#include <cheat-base/config/config.h>
namespace cheat::feature
namespace cheat::feature
{
class Settings : public Feature
{
{
public:
config::Field<Hotkey> f_MenuKey;
config::Field<bool> f_HotkeysEnabled;
config::Field<int> f_FontSize;
config::Field<bool> f_StatusMove;
config::Field<bool> f_StatusShow;
config::Field<bool> f_InfoMove;
config::Field<bool> f_InfoShow;
config::Field<bool> f_FpsShow;
config::Field<bool> f_FpsMove;
config::Field<bool> f_NotificationsShow;
config::Field<int> f_NotificationsDelay;
@ -30,11 +29,20 @@ namespace cheat::feature
config::Field<bool> f_FastExitEnable;
config::Field<Hotkey> f_HotkeyExit;
config::Field<int> f_FontSize;
config::Field<bool> f_ShowStyleEditor;
std::filesystem::path themesDir;
config::Field<std::string> f_DefaultTheme;
static Settings& GetInstance();
const FeatureGUIInfo& GetGUIInfo() const override;
void DrawMain() override;
void Init();
void Colors_Export(std::string name);
void Colors_Import(std::string name);
private:
void OnExitKeyPressed();

View File

@ -12,6 +12,7 @@
#include <cheat-base/render/backend/dx12-hook.h>
#include <cheat-base/ResourceLoader.h>
#include <cheat-base/cheat/misc/Settings.h>
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
@ -33,14 +34,14 @@ namespace renderer
static constexpr int _fontsCount = _fontSizeMax / _fontSizeStep;
static std::array<ImFont*, _fontsCount> _fonts;
static Data _customFontData {};
static Data _customFontData{};
static WNDPROC OriginalWndProcHandler;
static ID3D11RenderTargetView* mainRenderTargetView;
static void OnRenderDX11(ID3D11DeviceContext* pContext);
static void OnInitializeDX11(HWND window, ID3D11Device* pDevice, ID3D11DeviceContext* pContext, IDXGISwapChain* pChain);
static void OnPreRenderDX12();
static void OnPostRenderDX12(ID3D12GraphicsCommandList* commandList);
static void OnInitializeDX12(HWND window, ID3D12Device* pDevice, UINT buffersCounts, ID3D12DescriptorHeap* pDescriptorHeapImGuiRender);
@ -106,7 +107,7 @@ namespace renderer
return io.FontDefault;
}
int fontSizeInt = static_cast<int>(fontSize);
int fontIndex = fontSizeInt / _fontSizeStep +
int fontIndex = fontSizeInt / _fontSizeStep +
(fontSizeInt % _fontSizeStep > (_fontSizeStep / 2) ? 1 : 0) - 1;
fontIndex = std::clamp(fontIndex, 0, _fontsCount - 1);
return _fonts[fontIndex];
@ -122,7 +123,7 @@ namespace renderer
int fontSizeInt = static_cast<int>(fontSize);
int fontIndex = fontSizeInt / _fontSizeStep;
int fontAligned = fontIndex * _fontSizeStep +
int fontAligned = fontIndex * _fontSizeStep +
((fontSizeInt % _fontSizeStep) > _fontSizeStep / 2 ? _fontSizeStep : 0);
fontAligned = std::clamp(fontAligned, _fontSizeStep, _fontSizeMax);
@ -138,7 +139,7 @@ namespace renderer
{
return _globalFontSize;
}
static void LoadCustomFont()
{
if (_customFontData.data == nullptr)
@ -195,7 +196,7 @@ namespace renderer
reinterpret_cast<LONG_PTR>(hWndProc)));
ImGui_ImplWin32_Init(window);
ImGui_ImplDX12_Init(pDevice, buffersCounts, DXGI_FORMAT_R8G8B8A8_UNORM,
ImGui_ImplDX12_Init(pDevice, buffersCounts, DXGI_FORMAT_R8G8B8A8_UNORM,
pDescriptorHeapImGuiRender,
pDescriptorHeapImGuiRender->GetCPUDescriptorHandleForHeapStart(),
pDescriptorHeapImGuiRender->GetGPUDescriptorHandleForHeapStart());
@ -253,6 +254,9 @@ 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)

View File

@ -25,6 +25,7 @@
<ClInclude Include="src\user\cheat\player\FallControl.h" />
<ClInclude Include="src\user\cheat\visuals\TextureChanger.h" />
<ClInclude Include="src\user\cheat\visuals\FreeCamera.h" />
<ClInclude Include="src\user\cheat\world\AutoChallenge.h" />
<ClInclude Include="src\user\cheat\world\AutoSeelie.h" />
<ClInclude Include="src\user\cheat\world\CustomWeather.h" />
<ClInclude Include="src\user\cheat\world\FakeTime.h" />
@ -119,6 +120,7 @@
<ClCompile Include="src\user\cheat\player\FallControl.cpp" />
<ClCompile Include="src\user\cheat\visuals\TextureChanger.cpp" />
<ClCompile Include="src\user\cheat\visuals\FreeCamera.cpp" />
<ClCompile Include="src\user\cheat\world\AutoChallenge.cpp" />
<ClCompile Include="src\user\cheat\world\AutoSeelie.cpp" />
<ClCompile Include="src\user\cheat\world\CustomWeather.cpp" />
<ClCompile Include="src\user\cheat\world\FakeTime.cpp" />
@ -224,12 +226,19 @@
<Image Include="res\iconsHD\Azhdaha.png" />
<Image Include="res\iconsHD\Boar.png" />
<Image Include="res\iconsHD\BookPage.png" />
<Image Include="res\iconsHD\BouncyMushroom.png" />
<Image Include="res\iconsHD\Cat.png" />
<Image Include="res\iconsHD\Cicin.png" />
<Image Include="res\iconsHD\ClusterleafOfCultivation.png" />
<Image Include="res\iconsHD\Crane.png" />
<Image Include="res\iconsHD\CryoBathysmalVishap.png" />
<Image Include="res\iconsHD\Dendroculus.png" />
<Image Include="res\iconsHD\DendroGranum.png" />
<Image Include="res\iconsHD\DendroPile.png" />
<Image Include="res\iconsHD\DendroProjector.png" />
<Image Include="res\iconsHD\DendroRock.png" />
<Image Include="res\iconsHD\Dog.png" />
<Image Include="res\iconsHD\DreadfulWithering.png" />
<Image Include="res\iconsHD\DunlinsTooth.png" />
<Image Include="res\iconsHD\Dvalin.png" />
<Image Include="res\iconsHD\Eel.png" />
@ -418,6 +427,7 @@
<Image Include="res\iconsHD\NilotpalaLotus.png" />
<Image Include="res\iconsHD\Nobushi.png" />
<Image Include="res\iconsHD\NoctilucousJade.png" />
<Image Include="res\iconsHD\NurseriesInTheWilds.png" />
<Image Include="res\iconsHD\OceanCrab.png" />
<Image Include="res\iconsHD\Oceanid.png" />
<Image Include="res\iconsHD\OceanidSummons.png" />
@ -427,6 +437,7 @@
<Image Include="res\iconsHD\Padisarah.png" />
<Image Include="res\iconsHD\PaleRedCrab.png" />
<Image Include="res\iconsHD\PerpetualMechanicalArray.png" />
<Image Include="res\iconsHD\PhantasmalGate.png" />
<Image Include="res\iconsHD\PhaseGate.png" />
<Image Include="res\iconsHD\PhilanemoMushroom.png" />
<Image Include="res\iconsHD\Pigeon.png" />
@ -465,6 +476,7 @@
<Image Include="res\iconsHD\RukkhashavaMushrooms.png" />
<Image Include="res\iconsHD\RustyKoi.png" />
<Image Include="res\iconsHD\SacredSakura.png" />
<Image Include="res\iconsHD\SaghiraMachine.png" />
<Image Include="res\iconsHD\SakuraBloom.png" />
<Image Include="res\iconsHD\Salamander.png" />
<Image Include="res\iconsHD\Samachurl.png" />
@ -507,6 +519,7 @@
<Image Include="res\iconsHD\Starshroom.png" />
<Image Include="res\iconsHD\Starsilver.png" />
<Image Include="res\iconsHD\StatueofTheSeven.png" />
<Image Include="res\iconsHD\StonePillarSeal.png" />
<Image Include="res\iconsHD\StormBarrier.png" />
<Image Include="res\iconsHD\Stormstone.png" />
<Image Include="res\iconsHD\StrangeTooth.png" />
@ -530,7 +543,8 @@
<Image Include="res\iconsHD\TorchPuzzle.png" />
<Image Include="res\iconsHD\TreasureHoarder.png" />
<Image Include="res\iconsHD\TriangularMechanism.png" />
<Image Include="res\iconsHD\Tukan.png" />
<Image Include="res\iconsHD\DuskBird.png" />
<Image Include="res\iconsHD\TriYanaSeeds.png" />
<Image Include="res\iconsHD\UnagiMeat.png" />
<Image Include="res\iconsHD\UniqueRocks.png" />
<Image Include="res\iconsHD\UnusualHilichurl.png" />
@ -563,12 +577,19 @@
<Image Include="res\icons\Azhdaha.png" />
<Image Include="res\icons\Boar.png" />
<Image Include="res\icons\BookPage.png" />
<Image Include="res\icons\BouncyMushroom.png" />
<Image Include="res\icons\Cat.png" />
<Image Include="res\icons\Cicin.png" />
<Image Include="res\icons\ClusterleafOfCultivation.png" />
<Image Include="res\icons\Crane.png" />
<Image Include="res\icons\CryoBathysmalVishap.png" />
<Image Include="res\icons\Dendroculus.png" />
<Image Include="res\icons\DendroGranum.png" />
<Image Include="res\icons\DendroPile.png" />
<Image Include="res\icons\DendroProjector.png" />
<Image Include="res\icons\DendroRock.png" />
<Image Include="res\icons\Dog.png" />
<Image Include="res\icons\DreadfulWithering.png" />
<Image Include="res\icons\DunlinsTooth.png" />
<Image Include="res\icons\Dvalin.png" />
<Image Include="res\icons\Eel.png" />
@ -757,6 +778,7 @@
<Image Include="res\icons\NilotpalaLotus.png" />
<Image Include="res\icons\Nobushi.png" />
<Image Include="res\icons\NoctilucousJade.png" />
<Image Include="res\icons\NurseriesInTheWilds.png" />
<Image Include="res\icons\OceanCrab.png" />
<Image Include="res\icons\Oceanid.png" />
<Image Include="res\icons\OceanidSummons.png" />
@ -766,6 +788,7 @@
<Image Include="res\icons\Padisarah.png" />
<Image Include="res\icons\PaleRedCrab.png" />
<Image Include="res\icons\PerpetualMechanicalArray.png" />
<Image Include="res\icons\PhantasmalGate.png" />
<Image Include="res\icons\PhaseGate.png" />
<Image Include="res\icons\PhilanemoMushroom.png" />
<Image Include="res\icons\Pigeon.png" />
@ -804,6 +827,7 @@
<Image Include="res\icons\RukkhashavaMushrooms.png" />
<Image Include="res\icons\RustyKoi.png" />
<Image Include="res\icons\SacredSakura.png" />
<Image Include="res\icons\SaghiraMachine.png" />
<Image Include="res\icons\SakuraBloom.png" />
<Image Include="res\icons\Salamander.png" />
<Image Include="res\icons\Samachurl.png" />
@ -846,6 +870,7 @@
<Image Include="res\icons\Starshroom.png" />
<Image Include="res\icons\Starsilver.png" />
<Image Include="res\icons\StatueofTheSeven.png" />
<Image Include="res\icons\StonePillarSeal.png" />
<Image Include="res\icons\StormBarrier.png" />
<Image Include="res\icons\Stormstone.png" />
<Image Include="res\icons\StrangeTooth.png" />
@ -869,7 +894,8 @@
<Image Include="res\icons\TorchPuzzle.png" />
<Image Include="res\icons\TreasureHoarder.png" />
<Image Include="res\icons\TriangularMechanism.png" />
<Image Include="res\icons\Tukan.png" />
<Image Include="res\icons\DuskBird.png" />
<Image Include="res\icons\TriYanaSeeds.png" />
<Image Include="res\icons\UnagiMeat.png" />
<Image Include="res\icons\UniqueRocks.png" />
<Image Include="res\icons\UnusualHilichurl.png" />
@ -1016,7 +1042,7 @@
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch-il2cpp.h</PrecompiledHeaderFile>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard>stdcpp20</LanguageStandard>
<AdditionalIncludeDirectories>$(ProjectDir)src/appdata;$(ProjectDir)src/framework;$(ProjectDir)res/;$(ProjectDir)src/user;$(SolutionDir)cheat-base/src/;$(SolutionDir)cheat-base/vendor/imgui/;$(SolutionDir)cheat-base/vendor/json/single_include/;$(SolutionDir)cheat-base/vendor/magic_enum/include/;$(SolutionDir)cheat-base/vendor/fmt/include/;$(SolutionDir)cheat-base/vendor/imgui-notify-v2/;$(SolutionDir)cheat-base/vendor/simpleIni/;$(SolutionDir)cheat-base/vendor/imgui-notify-v2/;$(SolutionDir)cheat-base/vendor/detours/</AdditionalIncludeDirectories>
<Optimization>MaxSpeed</Optimization>
<WholeProgramOptimization>true</WholeProgramOptimization>

View File

@ -258,6 +258,9 @@
<ClInclude Include="src\user\cheat\player\FallControl.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\user\cheat\world\AutoChallenge.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Font Include="res\Ruda-Bold.ttf" />
@ -474,6 +477,9 @@
<ClCompile Include="src\user\cheat\player\FallControl.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\user\cheat\world\AutoChallenge.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="res\res.rc">
@ -2409,9 +2415,6 @@
<Image Include="res\iconsHD\SumeruRose.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\Tukan.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\Viparyas.png">
<Filter>Resource Files</Filter>
</Image>
@ -2439,9 +2442,6 @@
<Image Include="res\iconsHD\RukkhashavaMushrooms.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\Tukan.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\Viparyas.png">
<Filter>Resource Files</Filter>
</Image>
@ -2526,5 +2526,83 @@
<Image Include="res\icons\BookPage.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\DuskBird.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\DuskBird.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\TriYanaSeeds.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\BouncyMushroom.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\ClusterleafOfCultivation.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\DendroGranum.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\DendroPile.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\DendroProjector.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\DendroRock.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\DreadfulWithering.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\NurseriesInTheWilds.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\PhantasmalGate.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\SaghiraMachine.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\iconsHD\StonePillarSeal.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\StonePillarSeal.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\TriYanaSeeds.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\BouncyMushroom.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\ClusterleafOfCultivation.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\DendroGranum.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\DendroPile.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\DendroProjector.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\DendroRock.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\DreadfulWithering.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\NurseriesInTheWilds.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\PhantasmalGate.png">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\icons\SaghiraMachine.png">
<Filter>Resource Files</Filter>
</Image>
</ItemGroup>
</Project>

View File

@ -1,12 +1,12 @@
{
"game_version": "2.8",
"game_version": "3.0",
"modules": {
"UnityPlayer.dll": {
"checksum": 4999961552328781053,
"checksum": 18225598526199471527,
"timestamp": 0
},
"UserAssembly.dll": {
"checksum": 807890720029543258,
"checksum": 10799527772725786707,
"timestamp": 0
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

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: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

File diff suppressed because it is too large Load Diff

View File

@ -72,6 +72,8 @@ AssemblyChecksums RCDATA "assembly_checksum.json"
// PNG
//
#pragma region iconsHD
HDABIDINGANGELFISH PNG "iconsHD\\AbidingAngelfish.png"
HDABYSSMAGE PNG "iconsHD\\AbyssMage.png"
@ -144,6 +146,8 @@ HDBOOKPAGE PNG "iconsHD\\BookPage.png"
HDBOOTWEASEL PNG "iconsHD\\BootWeasel.png"
HDBOUNCYMUSHROOM PNG "iconsHD\\BouncyMushroom.png"
HDBRIGHTCROWNPIGEON PNG "iconsHD\\BrightcrownPigeon.png"
HDBROWNSHIRAKODAI PNG "iconsHD\\BrownShirakodai.png"
@ -166,6 +170,10 @@ HDCHILLEDMEAT PNG "iconsHD\\ChilledMeat.png"
HDCICIN PNG "iconsHD\\Cicin.png"
HDCLOUDLEISURESTEPS PNG "iconsHD\\CloudleisureSteps.png"
HDCLUSTERLEAFOFCULTIVATION PNG "iconsHD\\ClusterleafOfCultivation.png"
HDCOMMONCHEST PNG "iconsHD\\CommonChest.png"
HDCOOKINGINGREDIENT PNG "iconsHD\\CookingIngredient.png"
@ -212,7 +220,7 @@ HDDANDY PNG "iconsHD\\Dandy.png"
HDDAWNCATCHER PNG "iconsHD\\Dawncatcher.png"
HDDAYNIGHTSWITCHINGMECHANISM PNG "iconsHD\\DayNightSwitchingMechanism.png"
HDDAYNIGHTSWITCHINGMECHANISM PNG "iconsHD\\DayNightSwitchingMechanism.png"
HDDEEPSEAUNAGI PNG "iconsHD\\DeepSeaUnagi.png"
@ -220,14 +228,28 @@ HDDENDROBIUM PNG "iconsHD\\Dendrobium.png"
HDDENDROCULUS PNG "iconsHD\\Dendroculus.png"
HDDENDROGRANUM PNG "iconsHD\\DendroGranum.png"
HDDENDROPILE PNG "iconsHD\\DendroPile.png"
HDDENDROPROJECTOR PNG "iconsHD\\DendroProjector.png"
HDDENDROROCK PNG "iconsHD\\DendroRock.png"
HDDIVDARAY PNG "iconsHD\\DivdaRay.png"
HDDOG PNG "iconsHD\\Dog.png"
HDDOMAIN PNG "iconsHD\\Domain.png"
HDDREADFULWITHERING PNG "iconsHD\\DreadfulWithering.png"
HDDREAMFORM PNG "iconsHD\\DreamForm.png"
HDDUNLINSTOOTH PNG "iconsHD\\DunlinsTooth.png"
HDDUSKBIRD PNG "iconsHD\\DuskBird.png"
HDDVALIN PNG "iconsHD\\Dvalin.png"
HDECHOINGCONCH PNG "iconsHD\\EchoingConch.png"
@ -240,7 +262,7 @@ HDELECTRICCONDUCTION PNG "iconsHD\\ElectricConduction.png
HDELECTROABYSSLECTOR PNG "iconsHD\\ElectroAbyssLector.png"
HDELECTROBATHYSMALVISHAP PNG "iconsHD\\ElectroBathysmalVishap.png"
HDELECTROBATHYSMALVISHAP PNG "iconsHD\\ElectroBathysmalVishap.png"
HDELECTROCRYSTAL PNG "iconsHD\\ElectroCrystal.png"
@ -260,7 +282,7 @@ HDELEMENTALMONUMENT PNG "iconsHD\\ElementalMonument.png"
HDEMERALDFINCH PNG "iconsHD\\EmeraldFinch.png"
HDENEMIESFIRSTTIMEVICTORY PNG "iconsHD\\EnemiesFirstTimeVictory.png"
HDENEMIESFIRSTTIMEVICTORY PNG "iconsHD\\EnemiesFirstTimeVictory.png"
HDENKANOMIYAPHASEGATE PNG "iconsHD\\EnkanomiyaPhaseGate.png"
@ -362,6 +384,8 @@ HDHORSETAIL PNG "iconsHD\\Horsetail.png"
HDHYDROABYSSHERALD PNG "iconsHD\\HydroAbyssHerald.png"
HDHYDROBATHYSMALVISHAP PNG "iconsHD\\HydroBathysmalVishap.png"
HDHYDROHYPOSTASIS PNG "iconsHD\\HydroHypostasis.png"
HDILLUSION PNG "iconsHD\\Illusion.png"
@ -426,7 +450,7 @@ HDLUMINESCENTSPINE PNG "iconsHD\\LuminescentSpine.png"
HDLUNGEDSTICKLEBACK PNG "iconsHD\\LungedStickleback.png"
HDLUPUSBOREASDOMINATOROFWOLVES PNG "iconsHD\\LupusBoreasDominatorofWolves.png"
HDLUPUSBOREASDOMINATOROFWOLVES PNG "iconsHD\\LupusBoreasDominatorofWolves.png"
HDLUXURIOUSCHEST PNG "iconsHD\\LuxuriousChest.png"
@ -442,6 +466,8 @@ HDMATSUTAKE PNG "iconsHD\\Matsutake.png"
HDMEDAKA PNG "iconsHD\\Medaka.png"
HDMELODICBLOOM PNG "iconsHD\\MelodicBloom.png"
HDMERCHANT PNG "iconsHD\\Merchant.png"
HDMILLELITH PNG "iconsHD\\Millelith.png"
@ -474,6 +500,8 @@ HDNOBUSHI PNG "iconsHD\\Nobushi.png"
HDNOCTILUCOUSJADE PNG "iconsHD\\NoctilucousJade.png"
HDNURSERIESINTHEWILDS PNG "iconsHD\\NurseriesInTheWilds.png"
HDOCEANCRAB PNG "iconsHD\\OceanCrab.png"
HDOCEANID PNG "iconsHD\\Oceanid.png"
@ -506,6 +534,8 @@ HDPALEREDCRAB PNG "iconsHD\\PaleRedCrab.png"
HDPERPETUALMECHANICALARRAY PNG "iconsHD\\PerpetualMechanicalArray.png"
HDPHANTASMALGATE PNG "iconsHD\\PhantasmalGate.png"
HDPHASEGATE PNG "iconsHD\\PhaseGate.png"
HDPHILANEMOMUSHROOM PNG "iconsHD\\PhilanemoMushroom.png"
@ -584,6 +614,8 @@ HDRUSTYKOI PNG "iconsHD\\RustyKoi.png"
HDSACREDSAKURA PNG "iconsHD\\SacredSakura.png"
HDSAGHIRAMACHINE PNG "iconsHD\\SaghiraMachine.png"
HDSAKURABLOOM PNG "iconsHD\\SakuraBloom.png"
HDSALAMANDER PNG "iconsHD\\Salamander.png"
@ -606,8 +638,6 @@ HDSEAGRASS PNG "iconsHD\\Seagrass.png"
HDSEALEDCHEST PNG "iconsHD\\SealedChest.png"
HDSEALLOCATIONS PNG "iconsHD\\SealLocationI.png"
HDSEALLOCATIONI PNG "iconsHD\\SealLocationI.png"
HDSEALLOCATIONII PNG "iconsHD\\SealLocationII.png"
@ -616,6 +646,8 @@ HDSEALLOCATIONIII PNG "iconsHD\\SealLocationIII.png"
HDSEALLOCATIONIV PNG "iconsHD\\SealLocationIV.png"
HDSEALLOCATIONS PNG "iconsHD\\SealLocationI.png"
HDSEALLOCATIONV PNG "iconsHD\\SealLocationV.png"
HDSEELIE PNG "iconsHD\\Seelie.png"
@ -664,12 +696,16 @@ HDSQUIRREL PNG "iconsHD\\Squirrel.png"
HDSTARCONCH PNG "iconsHD\\Starconch.png"
HDSTARLIGHTCOALESCENCE PNG "iconsHD\\StarlightCoalescence.png"
HDSTARSHROOM PNG "iconsHD\\Starshroom.png"
HDSTARSILVER PNG "iconsHD\\Starsilver.png"
HDSTATUEOFTHESEVEN PNG "iconsHD\\StatueofTheSeven.png"
HDSTONEPILLARSEAL PNG "iconsHD\\StonePillarSeal.png"
HDSTORMBARRIER PNG "iconsHD\\StormBarrier.png"
HDSTORMSTONE PNG "iconsHD\\Stormstone.png"
@ -704,6 +740,8 @@ HDTHECRUXTHEALCOR PNG "iconsHD\\TheCruxTheAlcor.png"
HDTHEGREATSNOWBOARKING PNG "iconsHD\\TheGreatSnowboarKing.png"
HDTHERAVENFORUM PNG "iconsHD\\TheRavenForum.png"
HDTHREEBOXES PNG "iconsHD\\ThreeBoxes.png"
HDTHUNDERMANIFESTATION PNG "iconsHD\\ThunderManifestation.png"
@ -716,7 +754,7 @@ HDTREASUREHOARDER PNG "iconsHD\\TreasureHoarder.png"
HDTRIANGULARMECHANISM PNG "iconsHD\\TriangularMechanism.png"
HDTUKAN PNG "iconsHD\\Tukan.png"
HDTRIYANASEEDS PNG "iconsHD\\TriYanaSeeds.png"
HDUNAGIMEAT PNG "iconsHD\\UnagiMeat.png"
@ -771,17 +809,11 @@ HDWORLDQUESTS PNG "iconsHD\\WorldQuests.png"
HDYUMEMIRUWOOD PNG "iconsHD\\YumemiruWood.png"
HDZAYTUNPEACH PNG "iconsHD\\ZaytunPeach.png"
#pragma endregion
HDMELODICBLOOM PNG "iconsHD\\MelodicBloom.png"
HDCLOUDLEISURESTEPS PNG "iconsHD\\CloudleisureSteps.png"
HDDREAMFORM PNG "iconsHD\\DreamForm.png"
HDSTARLIGHTCOALESCENCE PNG "iconsHD\\StarlightCoalescence.png"
HDTHERAVENFORUM PNG "iconsHD\\TheRavenForum.png"
#pragma region icons
ABIDINGANGELFISH PNG "icons\\AbidingAngelfish.png"
ABYSSMAGE PNG "icons\\AbyssMage.png"
@ -858,6 +890,8 @@ BOOKPAGE PNG "icons\\BookPage.png"
BOOTWEASEL PNG "icons\\BootWeasel.png"
BOUNCYMUSHROOM PNG "icons\\BouncyMushroom.png"
BRIGHTCROWNPIGEON PNG "icons\\BrightcrownPigeon.png"
BROWNSHIRAKODAI PNG "icons\\BrownShirakodai.png"
@ -880,6 +914,10 @@ CHILLEDMEAT PNG "icons\\ChilledMeat.png"
CICIN PNG "icons\\Cicin.png"
CLOUDLEISURESTEPS PNG "icons\\CloudleisureSteps.png"
CLUSTERLEAFOFCULTIVATION PNG "icons\\ClusterleafOfCultivation.png"
COMMONCHEST PNG "icons\\CommonChest.png"
COOKINGINGREDIENT PNG "icons\\CookingIngredient.png"
@ -934,14 +972,28 @@ DENDROBIUM PNG "icons\\Dendrobium.png"
DENDROCULUS PNG "icons\\Dendroculus.png"
DENDROGRANUM PNG "icons\\DendroGranum.png"
DENDROPILE PNG "icons\\DendroPile.png"
DENDROPROJECTOR PNG "icons\\DendroProjector.png"
DENDROROCK PNG "icons\\DendroRock.png"
DIVDARAY PNG "icons\\DivdaRay.png"
DOG PNG "icons\\Dog.png"
DOMAIN PNG "icons\\Domain.png"
DREADFULWITHERING PNG "icons\\DreadfulWithering.png"
DREAMFORM PNG "icons\\DreamForm.png"
DUNLINSTOOTH PNG "icons\\DunlinsTooth.png"
DUSKBIRD PNG "icons\\DuskBird.png"
DVALIN PNG "icons\\Dvalin.png"
ECHOINGCONCH PNG "icons\\EchoingConch.png"
@ -1076,6 +1128,8 @@ HORSETAIL PNG "icons\\Horsetail.png"
HYDROABYSSHERALD PNG "icons\\HydroAbyssHerald.png"
HYDROBATHYSMALVISHAP PNG "icons\\HydroBathysmalVishap.png"
HYDROHYPOSTASIS PNG "icons\\HydroHypostasis.png"
ILLUSION PNG "icons\\Illusion.png"
@ -1140,7 +1194,7 @@ LUMINESCENTSPINE PNG "icons\\LuminescentSpine.png"
LUNGEDSTICKLEBACK PNG "icons\\LungedStickleback.png"
LUPUSBOREASDOMINATOROFWOLVES PNG "icons\\LupusBoreasDominatorofWolves.png"
LUPUSBOREASDOMINATOROFWOLVES PNG "icons\\LupusBoreasDominatorofWolves.png"
LUXURIOUSCHEST PNG "icons\\LuxuriousChest.png"
@ -1156,6 +1210,8 @@ MATSUTAKE PNG "icons\\Matsutake.png"
MEDAKA PNG "icons\\Medaka.png"
MELODICBLOOM PNG "icons\\MelodicBloom.png"
MERCHANT PNG "icons\\Merchant.png"
MILLELITH PNG "icons\\Millelith.png"
@ -1182,7 +1238,7 @@ MYSTERIOUSCARVINGS PNG "icons\\MysteriousCarvings.png"
NAKUWEED PNG "icons\\NakuWeed.png"
NILOTPALALOTUS PNG "icons\\NilotpalaLotus.png"
NILOTPALALOTUS PNG "icons\\NilotpalaLotus.png"
NOBUSHI PNG "icons\\Nobushi.png"
@ -1190,6 +1246,8 @@ NOCTILUCOUSJADE PNG "icons\\NoctilucousJade.png"
NPC PNG "icons\\Npc.png"
NURSERIESINTHEWILDS PNG "icons\\NurseriesInTheWilds.png"
OCEANCRAB PNG "icons\\OceanCrab.png"
OCEANID PNG "icons\\Oceanid.png"
@ -1220,7 +1278,9 @@ PADISARAH PNG "icons\\Padisarah.png"
PALEREDCRAB PNG "icons\\PaleRedCrab.png"
PERPETUALMECHANICALARRAY PNG "icons\\PerpetualMechanicalArray.png"
PERPETUALMECHANICALARRAY PNG "icons\\PerpetualMechanicalArray.png"
PHANTASMALGATE PNG "icons\\PhantasmalGate.png"
PHASEGATE PNG "icons\\PhaseGate.png"
@ -1300,6 +1360,8 @@ RUSTYKOI PNG "icons\\RustyKoi.png"
SACREDSAKURA PNG "icons\\SacredSakura.png"
SAGHIRAMACHINE PNG "icons\\SaghiraMachine.png"
SAKURABLOOM PNG "icons\\SakuraBloom.png"
SALAMANDER PNG "icons\\Salamander.png"
@ -1322,8 +1384,6 @@ SEAGRASS PNG "icons\\Seagrass.png"
SEALEDCHEST PNG "icons\\SealedChest.png"
SEALLOCATIONS PNG "icons\\SealLocationI.png"
SEALLOCATIONI PNG "icons\\SealLocationI.png"
SEALLOCATIONII PNG "icons\\SealLocationII.png"
@ -1332,6 +1392,8 @@ SEALLOCATIONIII PNG "icons\\SealLocationIII.png"
SEALLOCATIONIV PNG "icons\\SealLocationIV.png"
SEALLOCATIONS PNG "icons\\SealLocationI.png"
SEALLOCATIONV PNG "icons\\SealLocationV.png"
SEELIE PNG "icons\\Seelie.png"
@ -1380,12 +1442,16 @@ SQUIRREL PNG "icons\\Squirrel.png"
STARCONCH PNG "icons\\Starconch.png"
STARLIGHTCOALESCENCE PNG "icons\\StarlightCoalescence.png"
STARSHROOM PNG "icons\\Starshroom.png"
STARSILVER PNG "icons\\Starsilver.png"
STATUEOFTHESEVEN PNG "icons\\StatueofTheSeven.png"
STONEPILLARSEAL PNG "icons\\StonePillarSeal.png"
STORMBARRIER PNG "icons\\StormBarrier.png"
STORMSTONE PNG "icons\\Stormstone.png"
@ -1420,6 +1486,8 @@ THECRUXTHEALCOR PNG "icons\\TheCruxTheAlcor.png"
THEGREATSNOWBOARKING PNG "icons\\TheGreatSnowboarKing.png"
THERAVENFORUM PNG "icons\\TheRavenForum.png"
THREEBOXES PNG "icons\\ThreeBoxes.png"
THUNDERMANIFESTATION PNG "icons\\ThunderManifestation.png"
@ -1432,7 +1500,7 @@ TREASUREHOARDER PNG "icons\\TreasureHoarder.png"
TRIANGULARMECHANISM PNG "icons\\TriangularMechanism.png"
TUKAN PNG "icons\\Tukan.png"
TRIYANASEEDS PNG "icons\\TriYanaSeeds.png"
UNAGIMEAT PNG "icons\\UnagiMeat.png"
@ -1487,16 +1555,7 @@ WORLDQUESTS PNG "icons\\WorldQuests.png"
YUMEMIRUWOOD PNG "icons\\YumemiruWood.png"
ZAYTUNPEACH PNG "icons\\ZaytunPeach.png"
MELODICBLOOM PNG "icons\\MelodicBloom.png"
CLOUDLEISURESTEPS PNG "icons\\CloudleisureSteps.png"
DREAMFORM PNG "icons\\DreamForm.png"
STARLIGHTCOALESCENCE PNG "icons\\StarlightCoalescence.png"
THERAVENFORUM PNG "icons\\TheRavenForum.png"
#pragma endregion
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////

View File

@ -42,6 +42,7 @@
#include <cheat/world/AutoFish.h>
#include <cheat/world/AutoCook.h>
#include <cheat/world/AutoChallenge.h>
#include <cheat/world/CustomWeather.h>
#include <cheat/visuals/NoFog.h>
@ -99,6 +100,7 @@ namespace cheat
FEAT_INST(FreezeEnemies),
FEAT_INST(ElementalSight),
FEAT_INST(KillAura),
FEAT_INST(AutoChallenge),
FEAT_INST(MobVacuum),
FEAT_INST(FakeTime),

View File

@ -581,27 +581,30 @@ namespace cheat::feature
ADD_FILTER_FIELD(chest, LuxuriousChest);
ADD_FILTER_FIELD(chest, RemarkableChest);
// Other Chests
ADD_FILTER_FIELD(chest, BuriedChest);
//ADD_FILTER_FIELD(chest, BuriedChest); // Shared name, commented for now
ADD_FILTER_FIELD(chest, SearchPoint);
ADD_FILTER_FIELD(featured, Anemoculus);
ADD_FILTER_FIELD(featured, CrimsonAgate);
ADD_FILTER_FIELD(featured, Electroculus);
ADD_FILTER_FIELD(featured, Dendroculus);
ADD_FILTER_FIELD(featured, EchoingConch);
ADD_FILTER_FIELD(featured, Electroculus);
ADD_FILTER_FIELD(featured, Electrogranum);
ADD_FILTER_FIELD(featured, FishingPoint);
ADD_FILTER_FIELD(featured, Geoculus);
ADD_FILTER_FIELD(featured, ImagingConch);
ADD_FILTER_FIELD(featured, ItemDrops);
ADD_FILTER_FIELD(featured, KeySigil);
ADD_FILTER_FIELD(featured, Lumenspar);
ADD_FILTER_FIELD(featured, ShrineOfDepth);
ADD_FILTER_FIELD(featured, TimeTrialChallenge);
ADD_FILTER_FIELD(guide, BouncyMushroom);
ADD_FILTER_FIELD(guide, CampfireTorch);
ADD_FILTER_FIELD(guide, ClusterleafOfCultivation);
ADD_FILTER_FIELD(guide, DayNightSwitchingMechanism);
ADD_FILTER_FIELD(guide, DendroGranum);
ADD_FILTER_FIELD(guide, DendroPile);
ADD_FILTER_FIELD(guide, DendroRock);
ADD_FILTER_FIELD(guide, EnkanomiyaPhaseGate);
ADD_FILTER_FIELD(guide, MysteriousCarvings);
ADD_FILTER_FIELD(guide, PhaseGate);
@ -623,6 +626,7 @@ namespace cheat::feature
ADD_FILTER_FIELD(living, Crow);
ADD_FILTER_FIELD(living, CrystalCore);
ADD_FILTER_FIELD(living, Dog);
ADD_FILTER_FIELD(living, DuskBird);
ADD_FILTER_FIELD(living, Eel);
ADD_FILTER_FIELD(living, Falcon);
ADD_FILTER_FIELD(living, Finch);
@ -640,7 +644,6 @@ namespace cheat::feature
ADD_FILTER_FIELD(living, Salamander);
ADD_FILTER_FIELD(living, Squirrel);
ADD_FILTER_FIELD(living, Starconch);
ADD_FILTER_FIELD(living, Tukan);
ADD_FILTER_FIELD(living, Weasel);
ADD_FILTER_FIELD(living, Wigeon);
@ -710,7 +713,6 @@ namespace cheat::feature
ADD_FILTER_FIELD(monster, Hilichurl);
ADD_FILTER_FIELD(monster, HydroAbyssHerald);
ADD_FILTER_FIELD(monster, HydroBathysmalVishap);
ADD_FILTER_FIELD(monster, HydroHypostasisSummon);
ADD_FILTER_FIELD(monster, Kairagi);
ADD_FILTER_FIELD(monster, Millelith);
ADD_FILTER_FIELD(monster, Mitachurl);
@ -789,7 +791,7 @@ namespace cheat::feature
ADD_FILTER_FIELD(plant, SweetFlower);
ADD_FILTER_FIELD(plant, Valberry);
ADD_FILTER_FIELD(plant, Violetgrass);
//ADD_FILTER_FIELD(plant, Viparyas);
ADD_FILTER_FIELD(plant, Viparyas);
ADD_FILTER_FIELD(plant, WindwheelAster);
ADD_FILTER_FIELD(plant, Wolfhook);
ADD_FILTER_FIELD(plant, ZaytunPeach);
@ -798,39 +800,41 @@ namespace cheat::feature
ADD_FILTER_FIELD(puzzle, BakeDanuki);
ADD_FILTER_FIELD(puzzle, BloattyFloatty);
ADD_FILTER_FIELD(puzzle, CubeDevices);
ADD_FILTER_FIELD(puzzle, DendroProjector);
ADD_FILTER_FIELD(puzzle, DreadfulWithering);
ADD_FILTER_FIELD(puzzle, EightStoneTablets);
ADD_FILTER_FIELD(puzzle, ElectricConduction);
ADD_FILTER_FIELD(puzzle, RelayStone);
ADD_FILTER_FIELD(puzzle, ElectroSeelie);
ADD_FILTER_FIELD(puzzle, ElementalMonument);
ADD_FILTER_FIELD(puzzle, FloatingAnemoSlime);
ADD_FILTER_FIELD(puzzle, Geogranum);
ADD_FILTER_FIELD(puzzle, GeoPuzzle);
ADD_FILTER_FIELD(puzzle, LargeRockPile);
ADD_FILTER_FIELD(puzzle, LightUpTilePuzzle);
ADD_FILTER_FIELD(puzzle, LightningStrikeProbe);
ADD_FILTER_FIELD(puzzle, LightUpTilePuzzle);
ADD_FILTER_FIELD(puzzle, LumenCage);
ADD_FILTER_FIELD(puzzle, LuminousSeelie);
ADD_FILTER_FIELD(puzzle, MistBubble);
ADD_FILTER_FIELD(puzzle, NurseriesInTheWilds);
ADD_FILTER_FIELD(puzzle, OozingConcretions);
ADD_FILTER_FIELD(puzzle, PhantasmalGate);
ADD_FILTER_FIELD(puzzle, PirateHelm);
ADD_FILTER_FIELD(puzzle, PressurePlate);
ADD_FILTER_FIELD(puzzle, RelayStone);
ADD_FILTER_FIELD(puzzle, SaghiraMachine);
ADD_FILTER_FIELD(puzzle, SealLocations);
ADD_FILTER_FIELD(puzzle, Seelie);
ADD_FILTER_FIELD(puzzle, SeelieLamp);
ADD_FILTER_FIELD(puzzle, SmallRockPile);
ADD_FILTER_FIELD(puzzle, StonePillarSeal);
ADD_FILTER_FIELD(puzzle, StormBarrier);
ADD_FILTER_FIELD(puzzle, SwordHilt);
ADD_FILTER_FIELD(puzzle, Temari);
ADD_FILTER_FIELD(puzzle, TorchPuzzle);
ADD_FILTER_FIELD(puzzle, TriYanaSeeds);
ADD_FILTER_FIELD(puzzle, UniqueRocks);
ADD_FILTER_FIELD(puzzle, WarmingSeelie);
ADD_FILTER_FIELD(puzzle, WindmillMechanism);
ADD_FILTER_FIELD(puzzle, MelodicBloom);
ADD_FILTER_FIELD(puzzle, CloudleisureSteps);
ADD_FILTER_FIELD(puzzle, DreamForm);
ADD_FILTER_FIELD(puzzle, StarlightCoalescence);
ADD_FILTER_FIELD(puzzle, TheRavenForum);
}
#undef ADD_FILTER_FIELD
}

View File

@ -24,7 +24,7 @@ namespace cheat::game
entityFilters[filter] = { false, 0 };
auto& entry = entityFilters[filter];
auto timestamp = app::MoleMole_TimeUtil_get_NowTimeStamp(nullptr);
auto timestamp = app::MoleMole_TimeUtil_get_LocalNowMsTimeStamp(nullptr);
if (entry.second + m_LifeTime > timestamp)
return entry.first;

View File

@ -75,6 +75,11 @@ namespace cheat::game::filters
SimpleFilter RuinBrazier = { EntityType__Enum_1::Gadget, "_AncientHeatSource" };
SimpleFilter Stormstone = { EntityType__Enum_1::Gadget, "_ReginLamp" };
SimpleFilter TriangularMechanism = { EntityType__Enum_1::Field, "_TuningFork" };
SimpleFilter DendroGranum = { EntityType__Enum_1::Gadget, "GrassSeedCreate" };
SimpleFilter BouncyMushroom = { EntityType__Enum_1::Gadget, "JumpMushroom" };
SimpleFilter ClusterleafOfCultivation = { EntityType__Enum_1::Field, "RaioFlower" };
SimpleFilter DendroRock = { EntityType__Enum_1::Field, "GrassSealStone" };
SimpleFilter DendroPile = { EntityType__Enum_1::Field, "XuMiPlantinshitou" };
}
namespace living
@ -101,7 +106,7 @@ namespace cheat::game::filters
SimpleFilter Falcon = { EntityType__Enum_1::Monster, "Falcon" };
SimpleFilter LucklightFly = { EntityType__Enum_1::EnvAnimal, "Boltbug_" };
SimpleFilter Salamander = { EntityType__Enum_1::EnvAnimal, "Salamander" };
SimpleFilter Tukan = { EntityType__Enum_1::Monster, "Pigeon_Beak" };
SimpleFilter DuskBird = { EntityType__Enum_1::Monster, "Pigeon_Beak" };
SimpleFilter Pigeon = { EntityType__Enum_1::Monster, "Pigeon_0" };
SimpleFilter Crow = { EntityType__Enum_1::Monster, "Crow" };
SimpleFilter Finch = { EntityType__Enum_1::Monster, "Tit" };
@ -277,7 +282,7 @@ namespace cheat::game::filters
SimpleFilter Padisarah = { EntityType__Enum_1::GatherObject, "_Pasusalan" };
SimpleFilter RukkhashavaMushrooms = { EntityType__Enum_1::GatherObject, "_HolyMushroom" };
SimpleFilter SumeruRose = { EntityType__Enum_1::GatherObject, "_XumiRose" };
//SimpleFilter Viparyas = { EntityType__Enum_1::GatherObject, "_" };
SimpleFilter Viparyas = { EntityType__Enum_1::GatherObject, "_DreamerPlant" };
SimpleFilter ZaytunPeach = { EntityType__Enum_1::GatherObject, "_Olea" };
}
@ -320,7 +325,15 @@ namespace cheat::game::filters
WhitelistFilter DreamForm = { {EntityType__Enum_1::Field, EntityType__Enum_1::Platform }, "_AnimalSeelie" };
SimpleFilter StarlightCoalescence = { EntityType__Enum_1::Field, "_PaperStar" };
SimpleFilter TheRavenForum = { EntityType__Enum_1::Gadget, "_NightCrowStatue" };
WhitelistFilter TimeTrialChallengeCollection = { { EntityType__Enum_1::Field, EntityType__Enum_1::Gadget }, { "SkillObj_EmptyGadget", "_GlideChampOrb" } };
SimpleFilter Bombbarrel = { EntityType__Enum_1::Gadget, "_Bombbarrel" };
SimpleFilter NurseriesInTheWilds = { EntityType__Enum_1::Field, "PlantDrawStart" };
SimpleFilter SaghiraMachine = { EntityType__Enum_1::Gadget, "FatuiMaranaWell" };
SimpleFilter StonePillarSeal = { EntityType__Enum_1::Gadget, "GrassSealRing_" };
SimpleFilter TriYanaSeeds = { EntityType__Enum_1::Gadget, "XuMiVisualizationplant" };
SimpleFilter DendroProjector = { EntityType__Enum_1::Gadget, "AyusProjector" };
SimpleFilter DreadfulWithering = { EntityType__Enum_1::Gadget, "DeathZonePoint" };
SimpleFilter PhantasmalGate = { EntityType__Enum_1::Field, "DreamlandDoor" };
}
namespace combined
@ -394,7 +407,7 @@ namespace cheat::game::filters
living::Squirrel,
living::Boar,
living::Weasel,
living::Tukan
living::DuskBird
};
SimpleFilter AnimalPickUp = {
living::CrystalCore,

View File

@ -76,6 +76,11 @@ namespace cheat::game::filters
extern SimpleFilter RuinBrazier;
extern SimpleFilter Stormstone;
extern SimpleFilter TriangularMechanism;
extern SimpleFilter DendroGranum;
extern SimpleFilter BouncyMushroom;
extern SimpleFilter ClusterleafOfCultivation;
extern SimpleFilter DendroRock;
extern SimpleFilter DendroPile;
}
namespace living
@ -102,7 +107,7 @@ namespace cheat::game::filters
extern SimpleFilter LucklightFly;
extern SimpleFilter Npc;
extern SimpleFilter Salamander;
extern SimpleFilter Tukan;
extern SimpleFilter DuskBird;
extern SimpleFilter Pigeon;
extern SimpleFilter Crow;
extern SimpleFilter Finch;
@ -277,7 +282,7 @@ namespace cheat::game::filters
extern SimpleFilter Padisarah;
extern SimpleFilter RukkhashavaMushrooms;
extern SimpleFilter SumeruRose;
//extern SimpleFilter Viparyas;
extern SimpleFilter Viparyas;
extern SimpleFilter ZaytunPeach;
}
@ -320,6 +325,15 @@ namespace cheat::game::filters
extern WhitelistFilter DreamForm;
extern SimpleFilter StarlightCoalescence;
extern SimpleFilter TheRavenForum;
extern WhitelistFilter TimeTrialChallengeCollection;
extern SimpleFilter Bombbarrel;
extern SimpleFilter NurseriesInTheWilds;
extern SimpleFilter SaghiraMachine;
extern SimpleFilter StonePillarSeal;
extern SimpleFilter TriYanaSeeds;
extern SimpleFilter DendroProjector;
extern SimpleFilter DreadfulWithering;
extern SimpleFilter PhantasmalGate;
}
namespace combined
@ -343,4 +357,4 @@ namespace cheat::game::filters
extern SimpleFilter OrganicTargets;
extern SimpleFilter Lightning;
}
}
}

View File

@ -563,13 +563,13 @@ namespace cheat::feature
std::lock_guard _userDataLock(m_UserDataMutex);
LOG_WARNING("Complete point at %.0f.", game::EntityManager::instance().avatar()->distance(pointData->levelPosition));
if (m_CompletedPoints.count(pointData) > 0)
if (std::find_if(m_CompletedPoints.begin(), m_CompletedPoints.end(), [=](PointData* data) { return pointData->id == data->id; }) != std::end(m_CompletedPoints))
return;
pointData->completed = true;
pointData->completeTimestamp = util::GetCurrentTimeMillisec();
m_ScenesData[pointData->sceneID].labels[pointData->labelID].completedCount++;
m_CompletedPoints.insert(pointData);
m_CompletedPoints.push_back(pointData);
SaveCompletedPoints();
}
@ -578,13 +578,14 @@ namespace cheat::feature
{
std::lock_guard _userDataLock(m_UserDataMutex);
if (m_CompletedPoints.count(pointData) == 0)
auto pointDataIterator = std::find_if(m_CompletedPoints.begin(), m_CompletedPoints.end(), [=](PointData* data) { return pointData->id == data->id; });
if (pointDataIterator == m_CompletedPoints.end())
return;
pointData->completed = false;
pointData->completeTimestamp = 0;
m_ScenesData[pointData->sceneID].labels[pointData->labelID].completedCount--;
m_CompletedPoints.erase(pointData);
m_CompletedPoints.erase(pointDataIterator);
SaveCompletedPoints();
}
@ -595,11 +596,12 @@ namespace cheat::feature
if (m_CompletedPoints.empty())
return;
PointData* pointData = *m_CompletedPoints.begin();
auto pointDataIterator = --m_CompletedPoints.end();
PointData* pointData = *pointDataIterator;
pointData->completed = false;
pointData->completeTimestamp = 0;
m_ScenesData[pointData->sceneID].labels[pointData->labelID].completedCount--;
m_CompletedPoints.erase(pointData);
m_CompletedPoints.erase(pointDataIterator);
SaveCompletedPoints();
}
@ -916,7 +918,7 @@ namespace cheat::feature
}
auto& point = points[pointID];
if (m_CompletedPoints.count(&point) > 0)
if (std::find_if(m_CompletedPoints.begin(), m_CompletedPoints.end(), [=](PointData* data) { return point.id == data->id; }) != std::end(m_CompletedPoints))
{
LOG_WARNING("Completed point %u duplicate.", pointID);
return;
@ -926,7 +928,7 @@ namespace cheat::feature
point.completeTimestamp = data["complete_timestamp"];
labelData->completedCount++;
m_CompletedPoints.insert(&point);
m_CompletedPoints.push_back(&point);
}
void InteractiveMap::LoadFixedPointData(LabelData* labelData, const nlohmann::json& data)
@ -1026,6 +1028,7 @@ namespace cheat::feature
void InteractiveMap::LoadCompletedPoints()
{
LoadUserData(f_CompletedPointsJson, &InteractiveMap::LoadCompletedPointData);
ReorderCompletedPointDataByTimestamp();
}
void InteractiveMap::SaveCompletedPoints()
@ -1040,6 +1043,11 @@ namespace cheat::feature
m_CompletedPoints.clear();
}
void InteractiveMap::ReorderCompletedPointDataByTimestamp()
{
m_CompletedPoints.sort([](PointData* a, PointData* b) { return a->completeTimestamp < b->completeTimestamp; });
}
void InteractiveMap::LoadCustomPoints()
{
LoadUserData(f_CustomPointsJson, &InteractiveMap::LoadCustomPointData);
@ -1779,9 +1787,11 @@ namespace cheat::feature
INIT_FILTER(chest, RemarkableChest);
INIT_FILTER(featured, Anemoculus);
INIT_FILTER(featured, CrimsonAgate);
INIT_FILTER(featured, Dendroculus);
INIT_FILTER(featured, Electroculus);
//INIT_FILTER(featured, Electrogranum);
INIT_FILTER(featured, Geoculus);
INIT_FILTER(featured, KeySigil);
INIT_FILTER(featured, Lumenspar);
//INIT_FILTER(featured, KeySigil);
//INIT_FILTER(featured, ShrineOfDepth);
@ -1917,8 +1927,10 @@ namespace cheat::feature
INIT_DETECT_ITEM(Anemoculus);
INIT_DETECT_ITEM(CrimsonAgate);
INIT_DETECT_ITEM(Dendroculus);
INIT_DETECT_ITEM(Electroculus);
INIT_DETECT_ITEM(Geoculus);
INIT_DETECT_ITEM(KeySigil);
INIT_DETECT_ITEM(Lumenspar);
#undef INIT_DETECT_ITEM

View File

@ -146,7 +146,7 @@ namespace cheat::feature
std::unordered_set<PointData*> m_CustomPoints;
std::unordered_set<PointData*> m_FixedPoints;
std::unordered_set<PointData*> m_CompletedPoints;
std::list<PointData*> m_CompletedPoints;
std::mutex m_PointMutex;
// PointData* m_SelectedPoint;
@ -182,6 +182,7 @@ namespace cheat::feature
void LoadCompletedPointData(LabelData* labelData, const nlohmann::json& data);
void SaveCompletedPointData(nlohmann::json& jObject, PointData* point);
bool ResetCompletedPointData(LabelData* label, PointData* point);
void ReorderCompletedPointDataByTimestamp();
void LoadCustomPointData(LabelData* labelData, const nlohmann::json& data);
void SaveCustomPointData(nlohmann::json& jObject, PointData* point);

View File

@ -203,7 +203,8 @@ namespace cheat::feature
for (auto entity : entities) {
auto entityPos = entity->absolutePosition();
std::string baseString = csvFriendly ? "{},{},{},{},{},{}" : "{} {} {} x={} y={} z={}";
auto entityDetails = fmt::format(baseString,
auto entityDetails = fmt::format(
fmt::runtime(baseString),
fmt::ptr(entity),
entity->runtimeID(),
entity->name().c_str(),
@ -222,7 +223,8 @@ namespace cheat::feature
std::string baseString = csvFriendly ? "{},{},{},{},{},{}" : "{} {} {} x={} y={} z={}";
if (csvFriendly && includeHeaders)
baseString = headerString.append(baseString);
auto entityDetails = fmt::format(baseString,
auto entityDetails = fmt::format(
fmt::runtime(baseString),
fmt::ptr(entity),
entity->runtimeID(),
entity->name().c_str(),

View File

@ -13,11 +13,17 @@ namespace cheat::feature
return inst.OnRecordUserData(nType);
}
static int CrashReporter_Hook(__int64 a1, __int64 a2, const char* a3)
{
return 0;
}
ProtectionBypass::ProtectionBypass() : Feature(),
NFEX(f_Enabled, "Disable Protection", "m_DisableMhyProt", "General", true, false),
m_CorrectSignatures({})
{
HookManager::install(app::Unity_RecordUserData, RecordUserData_Hook);
HookManager::install(app::CrashReporter, CrashReporter_Hook);
}
void ProtectionBypass::Init()

View File

@ -79,36 +79,41 @@ namespace cheat::feature
static bool afterDash = false;
auto& manager = game::EntityManager::instance();
if (manager.avatar()->runtimeID() != entityId)
return;
// LOG_DEBUG("Movement packet: %s", magic_enum::enum_name(syncInfo->fields.motionState).data());
if (f_Enabled && f_PacketReplacement)
auto entity = manager.entity(entityId);
if (entity->type() == app::EntityType__Enum_1::Vehicle || entity->isAvatar())
{
auto state = syncInfo->fields.motionState;
switch (state)
// LOG_DEBUG("Movement packet: %s", magic_enum::enum_name(syncInfo->fields.motionState).data());
if (f_Enabled && f_PacketReplacement)
{
case app::MotionState__Enum::MotionDash:
case app::MotionState__Enum::MotionClimb:
case app::MotionState__Enum::MotionClimbJump:
case app::MotionState__Enum::MotionStandbyToClimb:
case app::MotionState__Enum::MotionSwimDash:
case app::MotionState__Enum::MotionSwimIdle:
case app::MotionState__Enum::MotionSwimMove:
case app::MotionState__Enum::MotionSwimJump:
case app::MotionState__Enum::MotionFly:
case app::MotionState__Enum::MotionFight:
case app::MotionState__Enum::MotionDashBeforeShake:
case app::MotionState__Enum::MotionDangerDash:
syncInfo->fields.motionState = app::MotionState__Enum::MotionRun;
break;
case app::MotionState__Enum::MotionJump:
if (afterDash)
auto state = syncInfo->fields.motionState;
switch (state)
{
case app::MotionState__Enum::MotionDash:
case app::MotionState__Enum::MotionClimb:
case app::MotionState__Enum::MotionClimbJump:
case app::MotionState__Enum::MotionStandbyToClimb:
case app::MotionState__Enum::MotionSwimDash:
case app::MotionState__Enum::MotionSwimIdle:
case app::MotionState__Enum::MotionSwimMove:
case app::MotionState__Enum::MotionSwimJump:
case app::MotionState__Enum::MotionFly:
case app::MotionState__Enum::MotionFight:
case app::MotionState__Enum::MotionDashBeforeShake:
case app::MotionState__Enum::MotionDangerDash:
syncInfo->fields.motionState = app::MotionState__Enum::MotionRun;
break;
break;
case app::MotionState__Enum::MotionJump:
if (afterDash)
syncInfo->fields.motionState = app::MotionState__Enum::MotionRun;
break;
case app::MotionState__Enum::MotionSkiffDash:
case app::MotionState__Enum::MotionSkiffPoweredDash:
syncInfo->fields.motionState = app::MotionState__Enum::MotionSkiffNormal;
break;
}
if (state != app::MotionState__Enum::MotionJump && state != app::MotionState__Enum::MotionFallOnGround)
afterDash = state == app::MotionState__Enum::MotionDash;
}
if (state != app::MotionState__Enum::MotionJump && state != app::MotionState__Enum::MotionFallOnGround)
afterDash = state == app::MotionState__Enum::MotionDash;
}
}

View File

@ -6,42 +6,46 @@
#include <cheat/game/util.h>
#include <cheat/game/filters.h>
namespace cheat::feature
namespace cheat::feature
{
static void LCBaseCombat_DoHitEntity_Hook(app::LCBaseCombat* __this, uint32_t targetID, app::AttackResult* attackResult,
bool ignoreCheckCanBeHitInMP, MethodInfo* method);
static void VCAnimatorEvent_HandleProcessItem_Hook(app::MoleMole_VCAnimatorEvent* __this,
app::MoleMole_VCAnimatorEvent_MoleMole_VCAnimatorEvent_AnimatorEventPatternProcessItem* processItem,
app::AnimatorStateInfo processStateInfo, app::MoleMole_VCAnimatorEvent_MoleMole_VCAnimatorEvent_TriggerMode__Enum mode, MethodInfo* method);
RapidFire::RapidFire() : Feature(),
NF(f_Enabled, "Attack Multiplier", "RapidFire", false),
NF(f_MultiHit, "Multi-hit", "RapidFire", false),
NF(f_Multiplier, "Hit Multiplier", "RapidFire", 2),
NF(f_OnePunch, "One Punch Mode", "RapidFire", false),
NF(f_Randomize, "Randomize", "RapidFire", false),
NF(f_minMultiplier, "Min Multiplier", "RapidFire", 1),
NF(f_maxMultiplier, "Max Multiplier", "RapidFire", 3),
NF(f_MultiTarget, "Multi-target", "RapidFire", false),
NF(f_MultiTargetRadius, "Multi-target Radius", "RapidFire", 20.0f)
{
RapidFire::RapidFire() : Feature(),
NF(f_Enabled, "Attack Multiplier", "RapidFire", false),
NF(f_MultiHit, "Multi-hit", "RapidFire", false),
NF(f_Multiplier, "Hit Multiplier", "RapidFire", 2),
NF(f_OnePunch, "One Punch Mode", "RapidFire", false),
NF(f_Randomize, "Randomize", "RapidFire", false),
NF(f_minMultiplier, "Min Multiplier", "RapidFire", 1),
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)
{
HookManager::install(app::MoleMole_LCBaseCombat_DoHitEntity, LCBaseCombat_DoHitEntity_Hook);
}
HookManager::install(app::MoleMole_VCAnimatorEvent_HandleProcessItem, VCAnimatorEvent_HandleProcessItem_Hook);
}
const FeatureGUIInfo& RapidFire::GetGUIInfo() const
{
static const FeatureGUIInfo info{ "Attack Effects", "Player", true };
return info;
}
const FeatureGUIInfo& RapidFire::GetGUIInfo() const
{
static const FeatureGUIInfo info{ "Attack Effects", "Player", true };
return info;
}
void RapidFire::DrawMain()
{
void RapidFire::DrawMain()
{
ConfigWidget("Enabled", f_Enabled, "Enables attack multipliers. Need to choose a mode to work.");
ImGui::SameLine();
ImGui::TextColored(ImColor(255, 165, 0, 255), "Choose any or both modes below.");
ConfigWidget("Multi-hit Mode", f_MultiHit, "Enables multi-hit.\n" \
"Multiplies your attack count.\n" \
"This is not well tested, and can be detected by anticheat.\n" \
"Not recommended to be used with main accounts or used with high values.\n" \
"Known issues with certain multi-hit attacks, e.g. Xiao E, Ayaka CA, etc.");
"Multiplies your attack count.\n" \
"This is not well tested, and can be detected by anticheat.\n" \
"Not recommended to be used with main accounts or used with high values.\n");
ImGui::Indent();
@ -73,20 +77,23 @@ namespace cheat::feature
"If multi-hit is off and there are still multiple numbers on a single target, check the Entity Manager in the Debug section to see if there are invisible entities.\n" \
"This can cause EXTREME lag and quick bans if used with multi-hit. You are warned."
);
ImGui::Indent();
ConfigWidget("Radius (m)", f_MultiTargetRadius, 0.1f, 5.0f, 50.0f, "Radius to check for valid targets.");
ImGui::Unindent();
}
bool RapidFire::NeedStatusDraw() const
{
return f_Enabled && (f_MultiHit || f_MultiTarget);
}
ConfigWidget("Multi-animation", f_MultiAnimation, "Enables multi-animation attacks.\n" \
"Do keep in mind that the character's audio will also be spammed.");
}
void RapidFire::DrawStatus()
{
if (f_MultiHit)
bool RapidFire::NeedStatusDraw() const
{
return f_Enabled && (f_MultiHit || f_MultiTarget || f_MultiAnimation);
}
void RapidFire::DrawStatus()
{
if (f_MultiHit)
{
if (f_Randomize)
ImGui::Text("Multi-Hit Random[%d|%d]", f_minMultiplier.value(), f_maxMultiplier.value());
@ -97,20 +104,23 @@ namespace cheat::feature
}
if (f_MultiTarget)
ImGui::Text("Multi-Target [%.01fm]", f_MultiTargetRadius.value());
}
RapidFire& RapidFire::GetInstance()
{
static RapidFire instance;
return instance;
}
if (f_MultiAnimation)
ImGui::Text("Multi-Animation");
}
RapidFire& RapidFire::GetInstance()
{
static RapidFire instance;
return instance;
}
int RapidFire::CalcCountToKill(float attackDamage, uint32_t targetID)
{
if (attackDamage == 0)
return f_Multiplier;
auto& manager = game::EntityManager::instance();
auto targetEntity = manager.entity(targetID);
if (targetEntity == nullptr)
@ -165,10 +175,10 @@ namespace cheat::feature
entity = game::Entity(app::MoleMole_GadgetEntity_GetOwnerEntity(reinterpret_cast<app::GadgetEntity*>(entity.raw()), nullptr));
if (entity.runtimeID() == avatarID)
return true;
}
}
return false;
}
bool IsAttackByAvatar(game::Entity& attacker)
@ -183,6 +193,20 @@ namespace cheat::feature
return attackerID == avatarID || IsAvatarOwner(attacker);
}
bool IsConfigByAvatar(game::Entity& attacker)
{
if (attacker.raw() == nullptr)
return false;
auto& manager = game::EntityManager::instance();
auto avatarID = manager.avatar()->raw()->fields._configID_k__BackingField;
auto attackerID = attacker.raw()->fields._configID_k__BackingField;
// Taiga#5555: IDs can be found in ConfigAbility_Avatar_*.json or GadgetExcelConfigData.json
bool bulletID = attackerID >= 40000160 && attackerID <= 41069999;
return avatarID == attackerID || bulletID || attacker.type() == app::EntityType__Enum_1::Bullet;
}
bool IsValidByFilter(game::Entity* entity)
{
if (game::filters::combined::OrganicTargets.IsValid(entity) ||
@ -192,7 +216,7 @@ namespace cheat::feature
game::filters::puzzle::LargeRockPile.IsValid(entity) ||
game::filters::puzzle::SmallRockPile.IsValid(entity))
return true;
return false;
return false;
}
// Raises when any entity do hit event.
@ -203,7 +227,7 @@ namespace cheat::feature
{
auto attacker = game::Entity(__this->fields._._._entity);
RapidFire& rapidFire = RapidFire::GetInstance();
if (!IsAttackByAvatar(attacker) || !rapidFire.f_Enabled)
if (!IsConfigByAvatar(attacker) || !IsAttackByAvatar(attacker) || !rapidFire.f_Enabled)
return CALL_ORIGIN(LCBaseCombat_DoHitEntity_Hook, __this, targetID, attackResult, ignoreCheckCanBeHitInMP, method);
auto& manager = game::EntityManager::instance();
@ -242,9 +266,24 @@ namespace cheat::feature
if (rapidFire.f_MultiHit) {
int attackCount = rapidFire.GetAttackCount(__this, entity->runtimeID(), attackResult);
for (int i = 0; i < attackCount; i++)
CALL_ORIGIN(LCBaseCombat_DoHitEntity_Hook, __this, entity->runtimeID(), attackResult, ignoreCheckCanBeHitInMP, method);
} else CALL_ORIGIN(LCBaseCombat_DoHitEntity_Hook, __this, entity->runtimeID(), attackResult, ignoreCheckCanBeHitInMP, method);
app::MoleMole_LCBaseCombat_FireBeingHitEvent(__this, entity->runtimeID(), attackResult, method);
}
}
CALL_ORIGIN(LCBaseCombat_DoHitEntity_Hook, __this, targetID, attackResult, ignoreCheckCanBeHitInMP, method);
}
static void VCAnimatorEvent_HandleProcessItem_Hook(app::MoleMole_VCAnimatorEvent* __this,
app::MoleMole_VCAnimatorEvent_MoleMole_VCAnimatorEvent_AnimatorEventPatternProcessItem* processItem,
app::AnimatorStateInfo processStateInfo, app::MoleMole_VCAnimatorEvent_MoleMole_VCAnimatorEvent_TriggerMode__Enum mode, MethodInfo* method)
{
auto attacker = game::Entity(__this->fields._._._entity);
RapidFire& rapidFire = RapidFire::GetInstance();
if (rapidFire.f_MultiAnimation && IsAttackByAvatar(attacker))
processItem->fields.lastTime = 0;
CALL_ORIGIN(VCAnimatorEvent_HandleProcessItem_Hook, __this, processItem, processStateInfo, mode, method);
}
}

View File

@ -19,6 +19,7 @@ namespace cheat::feature
config::Field<int> f_maxMultiplier;
config::Field<config::Toggle<Hotkey>> f_MultiTarget;
config::Field<float> f_MultiTargetRadius;
config::Field<config::Toggle<Hotkey>> f_MultiAnimation;
static RapidFire& GetInstance();

View File

@ -17,15 +17,19 @@
namespace cheat::feature
{
CustomTeleports::CustomTeleports() : Feature(),
NF(f_Enabled, "Custom Teleport", "CustomTeleports", false),
NF(f_Next, "Teleport Next", "CustomTeleports", Hotkey(VK_OEM_6)),
NF(f_Previous, "Teleport Previous", "CustomTeleports", Hotkey(VK_OEM_4)),
NF(f_Interpolate, "Custom Teleport", "CustomTeleports", false),
NF(f_Speed, "Interpolation Speed", "CustomTeleports", 10.0f),
dir(util::GetCurrentPath() / "teleports")
NF(f_Enabled, "Custom Teleport", "CustomTeleports", false),
NF(f_Next, "Teleport Next", "CustomTeleports", Hotkey(VK_OEM_6)),
NF(f_Previous, "Teleport Previous", "CustomTeleports", Hotkey(VK_OEM_4)),
NF(f_Auto, "Auto Teleport", "CustomTeleports", false),
NF(f_DelayTime, "Delay time (in s)", "CustomTeleports", 20),
NF(f_Interpolate, "Interpolate Teleport", "CustomTeleports", false),
NF(f_Speed, "Interpolation Speed", "CustomTeleports", 10.0f),
dir(util::GetCurrentPath() /= "teleports"),
nextTime(0)
{
f_Next.value().PressedEvent += MY_METHOD_HANDLER(CustomTeleports::OnNext);
f_Previous.value().PressedEvent += MY_METHOD_HANDLER(CustomTeleports::OnPrevious);
events::GameUpdateEvent += MY_METHOD_HANDLER(CustomTeleports::OnGameUpdate);
}
const FeatureGUIInfo& CustomTeleports::GetGUIInfo() const
@ -79,16 +83,19 @@ namespace cheat::feature
}
}
Teleport CustomTeleports::SerializeFromJson(std::string json, bool fromfile)
std::optional<Teleport> CustomTeleports::SerializeFromJson(std::string json, bool fromfile)
{
nlohmann::json j;
try { j = nlohmann::json::parse(json);}
catch (nlohmann::json::parse_error &e)
try { j = nlohmann::json::parse(json); }
catch (nlohmann::json::parse_error& e)
{
LOG_ERROR("Invalid JSON Format");
LOG_ERROR("Failed to parse JSON: %s", e.what());
return std::nullopt;
}
std::string teleportName;
std::string teleportName;
teleportName = j["name"];
if (j["name"].is_null() && fromfile)
{
@ -98,7 +105,8 @@ namespace cheat::feature
std::string description;
if (j["description"].is_null()) description = "";
else description = j["description"];
return Teleport_(teleportName, {j["position"][0], j["position"][1], j["position"][2]}, description);
return Teleport_(teleportName, { j["position"][0], j["position"][1], j["position"][2] }, description);
}
void CustomTeleports::ReloadTeleports()
@ -113,7 +121,8 @@ namespace cheat::feature
std::ifstream ifs(file.path());
std::string json;
std::getline(ifs, json);
SerializeTeleport(SerializeFromJson(json, true));
auto t = SerializeFromJson(json, true);
if(t.has_value()) SerializeTeleport(t.value());
}
}
}
@ -188,13 +197,38 @@ namespace cheat::feature
void CustomTeleports::OnPrevious()
{
if (f_Auto) return;
OnTeleportKeyPressed(false);
}
void CustomTeleports::OnNext()
{
if (f_Auto) return;
OnTeleportKeyPressed(true);
}
void CustomTeleports::OnGameUpdate()
{
if (!f_Enabled || !f_Auto)
return;
auto currentTime = util::GetCurrentTimeMillisec();
if (currentTime < nextTime)
return;
auto loadingManager = GET_SINGLETON(MoleMole_LoadingManager);
if (loadingManager == nullptr || !app::MoleMole_LoadingManager_IsLoaded(loadingManager, nullptr))
return;
auto camera = app::Camera_get_main(nullptr);
if (camera == nullptr) return;
if (!app::Behaviour_get_isActiveAndEnabled(reinterpret_cast<app::Behaviour*>(camera), nullptr))
return;
nextTime = currentTime + (int64_t)f_DelayTime * 1000;
OnTeleportKeyPressed(true);
}
void itr(std::regex exp, std::string name, std::string s)
{
std::sregex_iterator itr(name.begin(), name.end(), exp);
@ -260,26 +294,35 @@ namespace cheat::feature
ImGui::SameLine();
if (ImGui::Button("Load from JSON"))
{
selectedIndex = -1;
UpdateIndexName();
SerializeTeleport(SerializeFromJson(JSONBuffer_, false));
JSONBuffer_ = "";
if (!JSONBuffer_.empty()) {
auto t = SerializeFromJson(JSONBuffer_, false);
if (t.has_value()) {
selectedIndex = -1;
UpdateIndexName();
SerializeTeleport(t.value());
}
JSONBuffer_.clear();
}
}
ImGui::InputTextMultiline("JSON input", &JSONBuffer_, ImVec2(0, 50), ImGuiInputTextFlags_AllowTabInput);
ConfigWidget("Teleport Next", f_Next, true, "Press to teleport next of selected");
ConfigWidget("Teleport Previous", f_Previous, true, "Press to teleport previous of selected");
ConfigWidget("Teleport Next", f_Next, true, "Press to teleport next of selected.");
ConfigWidget("Teleport Previous", f_Previous, true, "Press to teleport previous of selected.");
ConfigWidget("Enable", f_Enabled,
"Enable teleport-through-list functionality\n"
"Enable teleport-through-list functionality.\n"
"Usage:\n"
"1. Put Checkmark to the teleports you want to teleport using hotkey\n"
"2. Single click the teleport (with checkmark) to select where you want to start\n"
"3. You can now press Next or Previous Hotkey to Teleport through the Checklist\n"
"Initially it will teleport the player to the selection made\n"
"Note: Double click or click the arrow to open teleport details");
ConfigWidget("Enable Interpolation", f_Interpolate, "Enable interpolation between teleports when using keybinds");
ConfigWidget("Enable Interpolation", f_Interpolate, "Enable interpolation between teleports when using keybinds."); ImGui::SameLine(); 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("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.");
if (ImGui::Button("Delete Checked"))
{
@ -396,9 +439,12 @@ namespace cheat::feature
if (ImGui::Button(("Select##Button" + stringIndex).c_str()))
{
selectedIndex = index;
selectedByClick = true;
UpdateIndexName();
auto isChecked = checkedIndices.find(index) != checkedIndices.end();
if (isChecked) {
selectedIndex = index;
selectedByClick = true;
UpdateIndexName();
}
}
ImGui::TableNextColumn();
@ -432,7 +478,7 @@ namespace cheat::feature
void CustomTeleports::DrawStatus()
{
ImGui::Text("Custom Teleport\n[%s]", selectedIndexName);
ImGui::Text("Custom Teleport\n[%s|%s]", f_Auto ? "Auto" : "Manual", selectedIndexName);
}
CustomTeleports &CustomTeleports::GetInstance()

View File

@ -4,6 +4,7 @@
#include <cheat-base/cheat/Feature.h>
#include <cheat-base/config/Config.h>
#include <cheat-base/thread-safe.h>
#include <set>
namespace cheat::feature
@ -27,9 +28,11 @@ namespace cheat::feature
public:
config::Field<config::Toggle<Hotkey>> f_Enabled;
config::Field<config::Toggle<Hotkey>> f_Interpolate;
config::Field<config::Toggle<Hotkey>> f_Auto;
config::Field<float> f_Speed;
config::Field<Hotkey> f_Next;
config::Field<Hotkey> f_Previous;
config::Field<int> f_DelayTime;
static CustomTeleports& GetInstance();
const FeatureGUIInfo& GetGUIInfo() const override;
@ -38,12 +41,13 @@ namespace cheat::feature
Teleport Teleport_(std::string name, app::Vector3 position, std::string description);
void SerializeTeleport(Teleport t);
void ReloadTeleports();
Teleport SerializeFromJson(std::string json, bool fromfile);
std::optional<Teleport> SerializeFromJson(std::string json, bool fromfile);
void DrawMain() override;
virtual bool NeedStatusDraw() const override;
void DrawStatus() override;
void OnGameUpdate();
std::vector<Teleport> Teleports;
std::filesystem::path dir;
@ -55,6 +59,7 @@ namespace cheat::feature
int selectedIndex = -1;
std::string selectedName;
std::string selectedIndexName;
SafeValue<int64_t> nextTime;
CustomTeleports();
void TeleportTo(app::Vector3 position, bool interpolate);
void OnTeleportKeyPressed(bool next);

View File

@ -11,6 +11,8 @@ namespace cheat::feature
app::GameObject* mainCam = nullptr;
app::Object_1* freeCamObj = nullptr;
app::Object_1* mainCamObj = nullptr;
app::GameObject* damageOverlay = nullptr;
app::GameObject* hpOverlay = nullptr;
app::Transform* freeCam_Transform;
app::Component_1* freeCam_Camera;
app::Component_1* mainCam_Camera;
@ -22,6 +24,8 @@ 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_DamageOverlay, "Damage Overlay", "Visuals::FreeCamera", false),
NF(f_HpOverlay, "Enemy HP Overlay", "Visuals::FreeCamera", false),
NF(f_Speed, "Speed", "Visuals::FreeCamera", 1.0f),
NF(f_LookSens, "Look Sensitivity", "Visuals::FreeCamera", 1.0f),
NF(f_RollSpeed, "Roll Speed", "Visuals::FreeCamera", 1.0f),
@ -52,7 +56,13 @@ namespace cheat::feature
void FreeCamera::DrawMain()
{
ConfigWidget("Enable", f_Enabled);
ConfigWidget("Freeze Character Animation", f_FreezeAnimation, "Freezes the active character's animation.\nAfter disabling, jump to un-freeze your character.");
ConfigWidget("Freeze Character Animation", f_FreezeAnimation, "Freezes the active character's animation.");
if (f_Enabled)
{
ConfigWidget("Toggle Damage Overlay", f_DamageOverlay, "Remove damage output overlay");
ConfigWidget("Toggle Enemy HP Overlay", f_HpOverlay, "Remove enemy HP overlay");
}
if (ImGui::BeginTable("FreeCameraDrawTable", 1, ImGuiTableFlags_NoBordersInBody))
{
ImGui::TableNextRow();
@ -245,9 +255,23 @@ namespace cheat::feature
}
if (freeCamObj)
EnableFreeCam();
if (damageOverlay == nullptr)
damageOverlay = app::GameObject_Find(string_to_il2cppi("/Canvas/Pages/InLevelMainPage/GrpMainPage/ParticleDamageTextContainer"), nullptr);
else
app::GameObject_SetActive(damageOverlay, !f_DamageOverlay, nullptr);
if (hpOverlay == nullptr)
hpOverlay = app::GameObject_Find(string_to_il2cppi("AvatarBoardCanvasV2(Clone)"), nullptr);
else
app::GameObject_SetActive(hpOverlay, !f_DamageOverlay, nullptr);
}
else
{
DisableFreeCam();
damageOverlay = nullptr;
hpOverlay = nullptr;
}
// 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();
@ -256,17 +280,24 @@ namespace cheat::feature
if (animator == nullptr && rigidBody == nullptr)
return;
static bool changed = false;
if (f_FreezeAnimation)
{
//auto constraints = app::Rigidbody_get_constraints(rigidBody, nullptr);
//LOG_DEBUG("%s", magic_enum::enum_name(constraints).data());
app::Rigidbody_set_constraints(rigidBody, app::RigidbodyConstraints__Enum::FreezePosition, nullptr);
app::Animator_set_speed(animator, 0.f, nullptr);
changed = false;
}
else
{
app::Rigidbody_set_constraints(rigidBody, app::RigidbodyConstraints__Enum::FreezeRotation, nullptr);
app::Animator_set_speed(animator, 1.f, nullptr);
if (!changed)
{
app::Animator_set_speed(animator, 1.f, nullptr);
changed = true;
}
}
}
}

View File

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

View File

@ -0,0 +1,85 @@
#include "pch-il2cpp.h"
#include "AutoChallenge.h"
#include <cheat/events.h>
#include <cheat/game/EntityManager.h>
#include <cheat/game/filters.h>
namespace cheat::feature
{
AutoChallenge::AutoChallenge() : Feature(),
NF(f_Enabled, "Auto challenge", "AutoChallenge", false),
NF(f_BombDestroy, "Bomb destroy", "AutoChallenge", false),
NF(f_Delay, "Collect delay", "AutoChallenge", 1000),
NF(f_Range, "Collect range", "AutoChallenge", 20.f)
{
events::GameUpdateEvent += MY_METHOD_HANDLER(AutoChallenge::OnGameUpdate);
}
const FeatureGUIInfo& AutoChallenge::GetGUIInfo() const
{
static const FeatureGUIInfo info{ "Auto Challenge", "World", true };
return info;
}
void AutoChallenge::DrawMain()
{
ConfigWidget("Enabled", f_Enabled, "Auto collect time challenge item");
ImGui::SameLine();
ConfigWidget("Destroy Bomb", f_BombDestroy, "Auto destroy bombbarrel");
ImGui::SameLine();
ImGui::TextColored(ImColor(255, 165, 0, 255), "I haven't tested how high the risk is");
ImGui::SetNextItemWidth(200.f);
ConfigWidget("Range", f_Range, 0.1f, 0.f, 300.f, "Collect range.");
ImGui::SameLine();
ImGui::SetNextItemWidth(200.f);
ConfigWidget("Delay", f_Delay, 1, 0, 2000, "Collect delay.");
}
bool AutoChallenge::NeedStatusDraw() const
{
return f_Enabled;
}
void AutoChallenge::DrawStatus()
{
ImGui::Text("Challenge [%.01fm]", f_Range.value());
}
AutoChallenge& AutoChallenge::GetInstance()
{
static AutoChallenge instance;
return instance;
}
void AutoChallenge::OnGameUpdate()
{
static uint64_t lastTime = 0;
auto timestamp = app::MoleMole_TimeUtil_get_LocalNowMsTimeStamp(nullptr);
if (!f_Enabled || lastTime + f_Delay > timestamp)
return;
auto& entityManager = game::EntityManager::instance();
auto avatarEntity = entityManager.avatar();
for (auto& entity : entityManager.entities(game::filters::puzzle::TimeTrialChallengeCollection))
{
if (avatarEntity->distance(entity) > f_Range)
continue;
auto combat = entity->combat();
if (combat != nullptr)
{
auto combatProp = combat->fields._combatProperty_k__BackingField;
auto maxHP = app::MoleMole_SafeFloat_get_Value(combatProp->fields.maxHP, nullptr);
// so many entities named "SkillObj_EmptyGadget", but the collection's hp is 99999.f
if (maxHP > 99998 && maxHP < 99999.9)
{
entity->setRelativePosition(avatarEntity->relativePosition());
}
}
}
}
}

View File

@ -0,0 +1,30 @@
#pragma once
#include <cheat-base/cheat/Feature.h>
#include <cheat-base/config/config.h>
namespace cheat::feature
{
class AutoChallenge : public Feature
{
public:
config::Field<config::Toggle<Hotkey>> f_Enabled;
config::Field<config::Toggle<Hotkey>> f_BombDestroy;
config::Field<int> f_Delay;
config::Field<float> f_Range;
static AutoChallenge& GetInstance();
void OnGameUpdate();
const FeatureGUIInfo& GetGUIInfo() const override;
void DrawMain() override;
virtual bool NeedStatusDraw() const override;
void DrawStatus() override;
private:
AutoChallenge();
};
}

View File

@ -14,7 +14,9 @@ namespace cheat::feature
app::Component_1* Profirency = nullptr;
}
static void PlayerModule_RequestPlayerCook(app::MoleMole_PlayerModule* __this, uint32_t recipeId, uint32_t avatarId, uint32_t qteQuality, uint32_t count, MethodInfo* method);
static std::map<std::string, int> qualities{ {"Suspicious", 1}, {"Normal", 2}, {"Delicious", 3} };
static void PlayerModule_RequestPlayerCook(app::MoleMole_PlayerModule* __this, uint32_t recipeId, uint32_t avatarId, uint32_t qteQuality, uint32_t count, MethodInfo* method);
static void PlayerModule_OnPlayerCookRsp(app::MoleMole_PlayerModule* __this, app::PlayerCookRsp* rsp, MethodInfo* method);
static void CookingQtePageContext_UpdateProficiency(app::CookingQtePageContext* __this, MethodInfo* method);
@ -22,7 +24,7 @@ namespace cheat::feature
NF(f_Enabled, "Standart Cooking", "AutoCook", false),
NF(f_FastProficiency, "Fast Proficiency", "AutoCook", false),
NF(f_CountField, "Count Item", "AutoCook", 1),
NF(f_QualityField, "Quality", "AutoCook", 1)
NF(f_QualityField, "Quality", "AutoCook", "Normal")
{
HookManager::install(app::MoleMole_PlayerModule_RequestPlayerCook, PlayerModule_RequestPlayerCook);
HookManager::install(app::MoleMole_PlayerModule_OnPlayerCookRsp, PlayerModule_OnPlayerCookRsp);
@ -38,12 +40,24 @@ namespace cheat::feature
void AutoCook::DrawMain()
{
ConfigWidget(f_Enabled, "Fast Cooking if the recipe has fast cooking open. \n" \
"If fast cooking is closed, you in addition need to turn on Fast Proficiency.");
"If fast cooking is closed, you in addition need to turn on Fast Proficiency.");
ConfigWidget(f_FastProficiency, "Quickly prepare an unstudied recipe to the maximum possible.");
ConfigWidget("Count Item", f_CountField, 1, 1, 100,
"How much to cook at a time.\n" \
"(For standard mode only.)");
ConfigWidget("Quality Cooking", f_QualityField, 1, 1, 3, "Quality of the cook.");
if (ImGui::BeginCombo("Cooking Quality", f_QualityField.value().c_str()))
{
for (auto& [qualityName, quality] : qualities)
{
bool is_selected = (f_QualityField.value().c_str() == qualityName);
if (ImGui::Selectable(qualityName.c_str(), is_selected))
f_QualityField.value() = qualityName;
if (is_selected)
ImGui::SetItemDefaultFocus();
}
ImGui::EndCombo();
}
}
bool AutoCook::NeedStatusDraw() const
@ -53,7 +67,10 @@ namespace cheat::feature
void AutoCook::DrawStatus()
{
ImGui::Text("Auto Cooking [%s]", f_FastProficiency ? "Proficiency" : "Standart");
if (f_FastProficiency)
ImGui::Text("Auto Cooking [Proficiency]");
else
ImGui::Text("Auto Cooking [Standart, %s]", f_QualityField.value().c_str());
}
AutoCook& AutoCook::GetInstance()
@ -82,9 +99,14 @@ namespace cheat::feature
if (autoCook.f_Enabled || autoCook.f_FastProficiency)
{
autoCook.CookFoodMaxNum = app::MoleMole_Config_CookRecipeExcelConfig_CheckCookFoodMaxNum(recipeId, nullptr);
qteQuality = autoCook.f_QualityField;
if (!autoCook.f_FastProficiency && autoCook.f_Enabled){
// To prevent possible crashes
if (!qualities.count(autoCook.f_QualityField.value()))
autoCook.f_QualityField.value() = "Normal";
qteQuality = qualities.find(autoCook.f_QualityField.value())->second;
if (!autoCook.f_FastProficiency && autoCook.f_Enabled) {
count = autoCook.f_CountField;
if (autoCook.f_CountField > autoCook.CookFoodMaxNum)
count = autoCook.CookFoodMaxNum;
@ -99,7 +121,7 @@ namespace cheat::feature
auto RectTransform = app::GameObject_GetComponentByName(GameObject::Profirency, string_to_il2cppi("RectTransform"), nullptr);
auto TransformChild = app::Transform_GetChild(reinterpret_cast<app::Transform*>(RectTransform), 0, nullptr);
auto TextComponent = app::Component_1_GetComponent_1(reinterpret_cast<app::Component_1*>(TransformChild), string_to_il2cppi("Text"), nullptr);
if (TextComponent != nullptr) {
auto Text_str = app::Text_get_text(reinterpret_cast<app::Text*>(TextComponent), nullptr);
auto ProficiencyStr = il2cppi_to_string(Text_str).erase(0, il2cppi_to_string(Text_str).find_first_of(" ."));
@ -127,7 +149,11 @@ namespace cheat::feature
AutoCook& autoCook = AutoCook::GetInstance();
if (autoCook.f_Enabled || autoCook.f_FastProficiency)
{
rsp->fields.qteQuality_ = autoCook.f_QualityField;
// To prevent possible crashes
if (!qualities.count(autoCook.f_QualityField.value()))
autoCook.f_QualityField.value() = "Normal";
rsp->fields.qteQuality_ = qualities.find(autoCook.f_QualityField.value())->second;
rsp->fields.cookCount_ = autoCook.f_CountField;
if (autoCook.f_FastProficiency)
rsp->fields.cookCount_ = 1;
@ -137,14 +163,14 @@ namespace cheat::feature
return CALL_ORIGIN(PlayerModule_OnPlayerCookRsp, __this, rsp, method);
}
static void CookingQtePageContext_UpdateProficiency(app::CookingQtePageContext* __this, MethodInfo* method) {
AutoCook& autoCook = AutoCook::GetInstance();
if (autoCook.f_Enabled || autoCook.f_FastProficiency)
{
__this->fields._pageMono->fields._qteTime = 0;
__this->fields._pageMono->fields._autoQteTime = 0;
app::CookingQtePageContext_CloseItemGotPanel(__this, nullptr); // Auto Close Panel
app::MoleMole_CookingQtePageContext_CloseItemGotPanel(__this, nullptr); // Auto Close Panel
}
return CALL_ORIGIN(CookingQtePageContext_UpdateProficiency, __this, method);
}

View File

@ -12,10 +12,10 @@ namespace cheat::feature
config::Field<config::Toggle<Hotkey>> f_FastProficiency;
config::Field<int> f_CountField;
config::Field<int> f_QualityField;
config::Field<std::string> f_QualityField;
int CookFoodMaxNum; // Maximum quantity at a time
int CookCount;
int CookCount;
static AutoCook& GetInstance();
@ -26,7 +26,7 @@ namespace cheat::feature
void DrawStatus() override;
private:
AutoCook();
};
}

View File

@ -7,6 +7,7 @@
#include <cheat/events.h>
#include <cheat/game/SimpleFilter.h>
#include <cheat/game/EntityManager.h>
#include <cheat/world/AutoChallenge.h>
#include <cheat/game/filters.h>
namespace cheat::feature
@ -81,7 +82,17 @@ namespace cheat::feature
{
auto& manager = game::EntityManager::instance();
auto& autoDestroy = AutoDestroy::GetInstance();
auto& autoChallenge = AutoChallenge::GetInstance();
auto entity = __this->fields._._._entity;
// call origin ReduceModifierDurability without correct modifierDurabilityIndex will coz game crash.
// so use this hook function to destroy challenge's bombbarrel
if (autoChallenge.f_Enabled && autoChallenge.f_BombDestroy &&
autoChallenge.f_Range > manager.avatar()->distance(entity) &&
game::filters::puzzle::Bombbarrel.IsValid(manager.entity(entity))
)
{
reduceDurability = 1000.f;
}
if (autoDestroy.f_Enabled &&
autoDestroy.f_Range > manager.avatar()->distance(entity) &&
(

View File

@ -91,7 +91,7 @@ namespace cheat::feature
}
std::lock_guard<std::mutex> catchLock(autoFish.m_BattleFinishTimestampMutex);
autoFish.m_BattleFinishTimestamp = app::MoleMole_TimeUtil_get_NowTimeStamp(nullptr) + autoFish.f_DelayBeforeCatch;
autoFish.m_BattleFinishTimestamp = app::MoleMole_TimeUtil_get_LocalNowMsTimeStamp(nullptr) + autoFish.f_DelayBeforeCatch;
}
void AutoFish::FishingModule_OnFishBattleEndRsp_Hook(void* __this, app::FishBattleEndRsp* rsp, MethodInfo* method)
@ -115,7 +115,7 @@ namespace cheat::feature
{
LOG_WARNING("Failed to catch fish, retrying in %u ms", autoFish.f_DelayBeforeCatch);
std::lock_guard<std::mutex> catchLock(autoFish.m_BattleFinishTimestampMutex);
autoFish.m_BattleFinishTimestamp = app::MoleMole_TimeUtil_get_NowTimeStamp(nullptr) + autoFish.f_DelayBeforeCatch;
autoFish.m_BattleFinishTimestamp = app::MoleMole_TimeUtil_get_LocalNowMsTimeStamp(nullptr) + autoFish.f_DelayBeforeCatch;
return;
}
@ -123,7 +123,7 @@ namespace cheat::feature
return;
std::lock_guard<std::mutex> _lock(autoFish.m_RecastTimestampMutex);
autoFish.m_RecastTimestamp = app::MoleMole_TimeUtil_get_NowTimeStamp(nullptr) + autoFish.f_DelayBeforeRecast;
autoFish.m_RecastTimestamp = app::MoleMole_TimeUtil_get_LocalNowMsTimeStamp(nullptr) + autoFish.f_DelayBeforeRecast;
}
void AutoFish::FishingModule_OnExitFishingRsp_Hook(void* __this, void* rsp, MethodInfo* method)
@ -154,7 +154,7 @@ namespace cheat::feature
void AutoFish::OnGameUpdate()
{
auto timestamp = app::MoleMole_TimeUtil_get_NowTimeStamp(nullptr);
auto timestamp = app::MoleMole_TimeUtil_get_LocalNowMsTimeStamp(nullptr);
std::lock_guard<std::mutex> _lock(m_BattleFinishTimestampMutex);
std::lock_guard<std::mutex> _lock2(m_RecastTimestampMutex);

View File

@ -13,6 +13,8 @@ namespace cheat::feature
static bool LCSelectPickup_IsInPosition_Hook(void* __this, app::BaseEntity* entity, MethodInfo* method);
static bool LCSelectPickup_IsOutPosition_Hook(void* __this, app::BaseEntity* entity, MethodInfo* method);
float g_default_range = 3.0f;
AutoLoot::AutoLoot() : Feature(),
NF(f_AutoPickup, "Auto-pickup drops", "AutoLoot", false),
NF(f_AutoTreasure, "Auto-open treasures", "AutoLoot", false),
@ -26,7 +28,9 @@ namespace cheat::feature
NF(f_Investigate, "Search points", "AutoLoot", false),
NF(f_QuestInteract, "Quest interacts", "AutoLoot", false),
NF(f_Others, "Other treasures", "AutoLoot", false),
NF(f_DelayTime, "Delay time (in ms)", "AutoLoot", 150),
NF(f_DelayTime, "Delay time (in ms)", "AutoLoot", 200),
NF(f_UseDelayTimeFluctuation, "Use delay fluctuation", "AutoLoot", false),
NF(f_DelayTimeFluctuation, "Delay fluctuation +(in ms)", "AutoLoot", 200),
NF(f_CustomRange, "Pickup Range", "AutoLoot", 5.0f),
toBeLootedItems(), nextLootTime(0)
{
@ -81,6 +85,17 @@ namespace cheat::feature
"Values under 200ms are unsafe.\nNot used if no auto-functions are on.");
}
ImGui::EndGroupPanel();
ImGui::BeginGroupPanel("Looting delay fluctuation");
{
ConfigWidget("Enabled", f_UseDelayTimeFluctuation, "Enable delay fluctuation.\n" \
"Simulates human clicking delay as manual clickling never consistent.");
ImGui::SameLine();
ImGui::TextColored(ImColor(255, 165, 0, 255), "Read the note!");
ImGui::SetNextItemWidth(100.0f);
ConfigWidget("Delay range +(ms)", f_DelayTimeFluctuation, 1, 0, 1000, "Delay randomly fluctuates between 'Delay Time'+'Delay Time+range'");
}
ImGui::EndGroupPanel();
ImGui::TableSetColumnIndex(1);
ImGui::BeginGroupPanel("Auto-Treasure");
@ -120,12 +135,13 @@ namespace cheat::feature
void AutoLoot::DrawStatus()
{
ImGui::Text("Auto Loot\n[%s%s%s%s%s]",
ImGui::Text("Auto Loot\n[%s%s%s%s%s%s]",
f_AutoPickup ? "AP" : "",
f_AutoTreasure ? fmt::format("{}AT", f_AutoPickup ? "|" : "").c_str() : "",
f_UseCustomRange ? fmt::format("{}CR{:.1f}m", f_AutoPickup || f_AutoTreasure ? "|" : "", f_CustomRange.value()).c_str() : "",
f_PickupFilter ? fmt::format("{}PF", f_AutoPickup || f_AutoTreasure || f_UseCustomRange ? "|" : "").c_str() : "",
f_AutoPickup || f_AutoTreasure ? fmt::format("|{}ms", f_DelayTime.value()).c_str() : ""
f_AutoPickup || f_AutoTreasure ? fmt::format("|{}ms", f_DelayTime.value()).c_str() : "",
f_UseDelayTimeFluctuation ? fmt::format("|FL+{}ms", f_DelayTimeFluctuation.value()).c_str() : ""
);
}
@ -171,7 +187,7 @@ namespace cheat::feature
auto& manager = game::EntityManager::instance();
for (auto& entity : manager.entities(game::filters::combined::Chests))
{
float range = f_UseCustomRange ? f_CustomRange : 3.5f;
float range = f_UseCustomRange ? f_CustomRange : g_default_range;
if (manager.avatar()->distance(entity) >= range)
continue;
@ -220,13 +236,20 @@ namespace cheat::feature
return;
app::MoleMole_ItemModule_PickItem(itemModule, *entityId, nullptr);
nextLootTime = currentTime + (int)f_DelayTime;
int fluctuation = 0;
if (f_UseDelayTimeFluctuation)
{
fluctuation = std::rand() % (f_DelayTimeFluctuation + 1);
}
nextLootTime = currentTime + (int)f_DelayTime + fluctuation;
}
void AutoLoot::OnCheckIsInPosition(bool& result, app::BaseEntity* entity)
{
if (f_AutoPickup || f_UseCustomRange) {
float pickupRange = f_UseCustomRange ? f_CustomRange : 3.5f;
float pickupRange = f_UseCustomRange ? f_CustomRange : g_default_range;
if (f_PickupFilter)
{
if (!f_PickupFilter_Animals && entity->fields.entityType == app::EntityType__Enum_1::EnvAnimal ||

View File

@ -12,9 +12,11 @@ namespace cheat::feature
config::Field<config::Toggle<Hotkey>> f_AutoPickup;
config::Field<config::Toggle<Hotkey>> f_AutoTreasure;
config::Field<config::Toggle<Hotkey>> f_UseCustomRange;
config::Field<config::Toggle<Hotkey>> f_UseDelayTimeFluctuation;
config::Field<config::Toggle<Hotkey>> f_PickupFilter;
config::Field<int> f_DelayTime;
config::Field<int> f_DelayTimeFluctuation;
config::Field<float> f_CustomRange;
config::Field<bool> f_Chest;

View File

@ -162,7 +162,7 @@ namespace cheat::feature
static std::unordered_set<app::SceneTreeObject*> s_AttackQueueSet;
static uint64_t s_LastAttackTimestamp = 0;
uint64_t timestamp = app::MoleMole_TimeUtil_get_NowTimeStamp(nullptr);
uint64_t timestamp = app::MoleMole_TimeUtil_get_LocalNowMsTimeStamp(nullptr);
if (!m_Enabled || s_LastAttackTimestamp + m_AttackDelay > timestamp)
return;

View File

@ -20,7 +20,8 @@ namespace cheat::feature
NF(f_OnlyTargeted, "Only targeted", "KillAura", true),
NF(f_Range, "Range", "KillAura", 15.0f),
NF(f_AttackDelay, "Attack delay time (in ms)", "KillAura", 100),
NF(f_RepeatDelay, "Repeat delay time (in ms)", "KillAura", 1000)
NF(f_RepeatDelay, "Repeat delay time (in ms)", "KillAura", 1000),
NF(f_DamageValue, "Crash damage value", "Damage mode", 233.0f)
{
events::GameUpdateEvent += MY_METHOD_HANDLER(KillAura::OnGameUpdate);
HookManager::install(app::MoleMole_BaseMoveSyncPlugin_ConvertSyncTaskToMotionInfo, BaseMoveSyncPlugin_ConvertSyncTaskToMotionInfo_Hook);
@ -39,6 +40,9 @@ namespace cheat::feature
ImGui::TextColored(ImColor(255, 165, 0, 255), "Choose any or both modes below.");
ConfigWidget("Crash Damage Mode", f_DamageMode, "Kill aura causes crash damage for monster around you.");
if (f_DamageMode) {
ConfigWidget("Damage Value", f_DamageValue, 1, 0, 10000000, "Crash damage value");
}
ConfigWidget("Instant Death Mode", f_InstantDeathMode, "Kill aura will attempt to instagib any valid target.");
ImGui::SameLine();
ImGui::TextColored(ImColor(255, 165, 0, 255), "Can get buggy with bosses like PMA and Hydro Hypo.");
@ -94,7 +98,7 @@ namespace cheat::feature
auto& manager = game::EntityManager::instance();
for (const auto& monster : manager.entities(game::filters::combined::Monsters))
for (const auto& monster : manager.entities(game::filters::combined::Monsters))
{
auto monsterID = monster->runtimeID();
@ -149,14 +153,27 @@ namespace cheat::feature
}
attackSet.erase(monster->runtimeID());
auto combat = monster->combat();
auto maxHP = app::MoleMole_SafeFloat_get_Value(combat->fields._combatProperty_k__BackingField->fields.maxHP, nullptr);
auto crashEvt = app::MoleMole_EventHelper_Allocate_103(*app::MoleMole_EventHelper_Allocate_103__MethodInfo);
app::MoleMole_EvtCrash_Init(crashEvt, monster->runtimeID(), nullptr);
crashEvt->fields.maxHp = maxHP;
crashEvt->fields.velChange = 1000;
//Migita^Rin#1762: Fixed inaccurate damage caused by floating point precision(Maybe)
float FPValue;
if (f_DamageValue <= 10000000) FPValue = 27.0f;
if (f_DamageValue <= 9000000) FPValue = 22.5f;
if (f_DamageValue <= 8000000) FPValue = 20.0f;
if (f_DamageValue <= 7000000) FPValue = 17.5f;
if (f_DamageValue <= 6000000) FPValue = 15.0f;
if (f_DamageValue <= 5000000) FPValue = 12.5f;
if (f_DamageValue <= 4000000) FPValue = 10.0f;
if (f_DamageValue <= 3000000) FPValue = 7.5f;
if (f_DamageValue <= 2000000) FPValue = 5.0f;
if (f_DamageValue <= 1000000) FPValue = 2.5f;
crashEvt->fields.maxHp = f_DamageValue /0.4f + FPValue;
crashEvt->fields.velChange = 10000000;
crashEvt->fields.hitPos = monster->absolutePosition();
app::MoleMole_EventManager_FireEvent(eventManager, reinterpret_cast<app::BaseEvent*>(crashEvt), false, nullptr);

View File

@ -15,6 +15,8 @@ namespace cheat::feature
config::Field<float> f_Range;
config::Field<int> f_AttackDelay;
config::Field<int> f_RepeatDelay;
config::Field<float> f_DamageValue;
static KillAura& GetInstance();

View File

@ -127,7 +127,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard>stdcpp20</LanguageStandard>
<AdditionalIncludeDirectories>$(ProjectDir)include/;$(SolutionDir)cheat-base/src;$(SolutionDir)cheat-base/vendor/simpleIni/</AdditionalIncludeDirectories>
<LanguageStandard_C>stdc17</LanguageStandard_C>
</ClCompile>