Merge branch 'master' into faketime
This commit is contained in:
commit
01cde9f4c5
77
README.md
77
README.md
@ -1,12 +1,10 @@
|
||||
<h1 align="center">Akebi GC</h1>
|
||||
The great software for some game that exploiting anime girls (and boys).
|
||||
|
||||
In first week after 2.7 update cheat can be unstable. Please create issue, if you catch a crash after updating to 2.7.
|
||||
<hr>
|
||||
The great software for some anime game which is for exploiting with girls (and boys).
|
||||
|
||||
We opened a [Discord server](https://discord.gg/MmV8hNZB9S)
|
||||
<h1 align="center">Getting Started</h1>
|
||||
|
||||
### Building from source
|
||||
## Building from source
|
||||
It is reccomended 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.**
|
||||
@ -14,7 +12,7 @@ As well as setting up **`cheat-library`** as startup project.
|
||||
1. Open `Akebi-GC/akebi-gc.sln`
|
||||
1. Build solution `akebi-gc.sln`.
|
||||
|
||||
### Release
|
||||
## Release
|
||||
1. Head over to the releases page
|
||||
1. Download the latest binaries
|
||||
|
||||
@ -33,15 +31,14 @@ As well as setting up **`cheat-library`** as startup project.
|
||||
- Protection Bypass
|
||||
- In-Game GUI
|
||||
- Hotkeys
|
||||
- Notifications
|
||||
|
||||
#### Player
|
||||
- God Mode
|
||||
- Invincible
|
||||
- Unlimited Stamina
|
||||
- Dumb Enemies (Enemies don't attack)
|
||||
- Player
|
||||
- Multiply Attacks
|
||||
- No Cooldown Skill/Ultimate
|
||||
- No Cooldown Sprint
|
||||
- Dumb Enemies
|
||||
- Attack Modifier
|
||||
- No Cooldown Skill/Ultimate/Sprint
|
||||
|
||||
#### World
|
||||
- Auto Loot
|
||||
@ -50,6 +47,7 @@ As well as setting up **`cheat-library`** as startup project.
|
||||
- Auto Tree Farm
|
||||
- Mob Vacuum
|
||||
- Auto Fish
|
||||
- Music Event (temporary)
|
||||
|
||||
#### Teleport
|
||||
- Chest/Oculi Teleport (Teleports to nearest)
|
||||
@ -59,9 +57,14 @@ As well as setting up **`cheat-library`** as startup project.
|
||||
- ESP
|
||||
- Interactive Map
|
||||
- Elemental Sight
|
||||
- Profile Changer
|
||||
- Ingame Embedded Browser
|
||||
- Hide UI
|
||||
- Camera Zoom
|
||||
- No Fog
|
||||
|
||||
#### Debugging
|
||||
- Entity List
|
||||
- Entities Manager
|
||||
- Position Info
|
||||
- FPS Graph
|
||||
- Packet Sniffer
|
||||
@ -94,10 +97,27 @@ As well as setting up **`cheat-library`** as startup project.
|
||||
<img src="https://github.com/CallowBlack/gif-demos/blob/main/genshin-cheat/auto-talk-demo.gif"/>
|
||||
</details>
|
||||
|
||||
<h1 align="center">Roadmap</h1>
|
||||
# Bugs
|
||||
Welcome to the short explanation for bug reporting
|
||||
|
||||
- [ ] Cutscene Skipping
|
||||
- [ ] Create database for chests, oculi, etc.
|
||||
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
|
||||
```
|
||||
|
||||
<h1 align="center">Contributing</h1>
|
||||
|
||||
@ -112,28 +132,3 @@ As well as setting up **`cheat-library`** as startup project.
|
||||
|
||||
Open an issue with the title of the suggesstion 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.
|
||||
|
||||
## Bugs
|
||||
Welcome to the short explanation for bug reporting, as well as the bug report template.
|
||||
|
||||
1. Find a bug and write down what happened, as well as your first thoughts on what you think caused it.
|
||||
|
||||
2. Try to reproduce the bug. For this you need to understand what actually happened, leading up to the bug and when the actual bug happened. To make sure you get all this information correctly taking various forms of documentations, such as video, screenshots etc is essential. These steps makes it a lot easier to try and figure out what actually happened. Try to replicate the scenario where the bug appeared, as close to the original as possible. What we would recommend for this step is using the bug reporting template which can be found on page 2 and simply adding the information you have / find in there.
|
||||
|
||||
3. can it be reproduced? Yes or no. If yes: Explain in as much detail as possible what happens when the bug occurs and why it occurs. Try and explain it as cleanly and as concise as possible to make sure that the coders don’t have to read an essay to understand what could be a simple bug with a simple fix. For this, remember that information is very subjective so it is much better to over communicate than to risk confusion. If no: Try to provide as much information about the bug as possible, so that the testers will be able to replicate the scenario in which the bug occurred more easily so we can try to reproduce the bug.
|
||||
|
||||
4. Tell us which version you are using. Otherwise we would be getting bug reports on the same issue, that has been infact fixed in the latest commits. copy the SHA / Version Number of the latest commit when you built the mod. For example: `bd17a00ec388f3b93624280cde9e1c66e740edf9` / Release 0.7
|
||||
|
||||
Notes: Please remember to always record your testing sessions on your local hard drive and then upload them unlisted to youtube to conserve memory space on your computer and to give us easy access to your replays. This is to ensure that the optimal amount of documentation is available for the bug testers and coders to use as a guideline for either replicating scenarios, reproducing bugs or fixing them.
|
||||
|
||||
TL:DR Record all your stuff while playing the mod and report any bugs to the issues section of this repository.
|
||||
|
||||
### Bug reporting template
|
||||
Title: e.g. “Instantly kill enemy with Shackles“
|
||||
Description: “Game crashed if x, y, z“
|
||||
|
||||
-- Footer --
|
||||
Date Occured: 5 / 3 / 2022
|
||||
Is it reproducible: Yes / Occasionally / No
|
||||
Latest Commit used: `bd17a00ec388f3b93624280cde9e1c66e740edf9`
|
||||
Release Version: 0.7
|
||||
|
@ -45,7 +45,7 @@ namespace cheat
|
||||
|
||||
ImGui::SetNextWindowSize(ImVec2(600, 300), ImGuiCond_FirstUseEver);
|
||||
|
||||
if (!ImGui::Begin("CCGenshin (By Callow)"))
|
||||
if (!ImGui::Begin("Akebi-GC"))
|
||||
{
|
||||
ImGui::End();
|
||||
return;
|
||||
|
@ -207,7 +207,7 @@ namespace renderer
|
||||
key = VK_MBUTTON;
|
||||
break;
|
||||
case WM_XBUTTONUP:
|
||||
key = GET_XBUTTON_WPARAM(wParam);
|
||||
key = GET_XBUTTON_WPARAM(wParam) == XBUTTON1 ? VK_XBUTTON1 : VK_XBUTTON2;
|
||||
break;
|
||||
case WM_KEYUP:
|
||||
key = static_cast<short>(wParam);
|
||||
|
@ -51,9 +51,14 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\user\cheat\teleport\CustomTeleports.h" />
|
||||
<ClInclude Include="src\user\cheat\visuals\Browser.h" />
|
||||
<ClInclude Include="src\user\cheat\visuals\CameraZoom.h" />
|
||||
<ClInclude Include="src\user\cheat\visuals\EnablePeaking.h" />
|
||||
<ClInclude Include="src\user\cheat\visuals\FPSUnlock.h" />
|
||||
<ClInclude Include="src\user\cheat\visuals\HideUI.h" />
|
||||
<ClInclude Include="src\user\cheat\visuals\NoFog.h" />
|
||||
<ClInclude Include="src\user\cheat\visuals\PaimonFollow.h" />
|
||||
<ClInclude Include="src\user\cheat\visuals\ProfileChanger.h" />
|
||||
<ClInclude Include="src\user\cheat\visuals\ShowChestIndicator.h" />
|
||||
<ClInclude Include="src\user\cheat\world\AutoCook.h" />
|
||||
<ClInclude Include="src\user\cheat\world\AutoFish.h" />
|
||||
@ -119,6 +124,7 @@
|
||||
<ClInclude Include="src\user\cheat\world\DumbEnemies.h" />
|
||||
<ClInclude Include="src\user\cheat\world\KillAura.h" />
|
||||
<ClInclude Include="src\user\cheat\world\MobVacuum.h" />
|
||||
<ClInclude Include="src\user\cheat\world\MusicEvent.h" />
|
||||
<ClInclude Include="src\user\main.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@ -162,9 +168,14 @@
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\user\cheat\teleport\CustomTeleports.cpp" />
|
||||
<ClCompile Include="src\user\cheat\GenshinCM.cpp" />
|
||||
<ClCompile Include="src\user\cheat\visuals\Browser.cpp" />
|
||||
<ClCompile Include="src\user\cheat\visuals\CameraZoom.cpp" />
|
||||
<ClCompile Include="src\user\cheat\visuals\EnablePeaking.cpp" />
|
||||
<ClCompile Include="src\user\cheat\visuals\FPSUnlock.cpp" />
|
||||
<ClCompile Include="src\user\cheat\visuals\HideUI.cpp" />
|
||||
<ClCompile Include="src\user\cheat\visuals\NoFog.cpp" />
|
||||
<ClCompile Include="src\user\cheat\visuals\PaimonFollow.cpp" />
|
||||
<ClCompile Include="src\user\cheat\visuals\ProfileChanger.cpp" />
|
||||
<ClCompile Include="src\user\cheat\visuals\ShowChestIndicator.cpp" />
|
||||
<ClCompile Include="src\user\cheat\world\AutoCook.cpp" />
|
||||
<ClCompile Include="src\user\cheat\world\AutoFish.cpp" />
|
||||
@ -227,6 +238,7 @@
|
||||
<ClCompile Include="src\user\cheat\world\DumbEnemies.cpp" />
|
||||
<ClCompile Include="src\user\cheat\world\KillAura.cpp" />
|
||||
<ClCompile Include="src\user\cheat\world\MobVacuum.cpp" />
|
||||
<ClCompile Include="src\user\cheat\world\MusicEvent.cpp" />
|
||||
<ClCompile Include="src\user\main.cpp" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
@ -919,8 +931,7 @@
|
||||
</Command>
|
||||
</PostBuildEvent>
|
||||
<CustomBuildStep>
|
||||
<Command>"$(OutDir)injector.exe"
|
||||
powershell -nop -c "& {sleep 15}"</Command>
|
||||
<Command>"$(OutDir)injector.exe" powershell -nop -c "&amp; {sleep 15}"</Command>
|
||||
<Outputs>$(OutDir)_noexist.nope;%(Outputs)</Outputs>
|
||||
<Inputs>$(TargetPath);%(Inputs)</Inputs>
|
||||
</CustomBuildStep>
|
||||
|
@ -228,6 +228,24 @@
|
||||
<ClInclude Include="src\user\cheat\world\FakeTime.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\user\cheat\visuals\ProfileChanger.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\user\cheat\visuals\PaimonFollow.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\user\cheat\visuals\HideUI.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\user\cheat\visuals\Browser.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\user\cheat\world\MusicEvent.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\user\cheat\visuals\EnablePeaking.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Font Include="res\Ruda-Bold.ttf" />
|
||||
@ -414,6 +432,24 @@
|
||||
<ClCompile Include="src\user\cheat\world\FakeTime.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\user\cheat\visuals\ProfileChanger.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\user\cheat\visuals\PaimonFollow.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\user\cheat\visuals\HideUI.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\user\cheat\visuals\Browser.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\user\cheat\world\MusicEvent.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\user\cheat\visuals\EnablePeaking.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="res\res.rc">
|
||||
|
@ -17,6 +17,8 @@ DO_APP_FUNC(0x00F0DCE0, bool, MoleMole_MapModule_IsAreaUnlock, (MoleMole_MapModu
|
||||
// DBDMOONJALD => op_Implicit
|
||||
DO_APP_FUNC(0x01B0A910, uint16_t, MoleMole_SimpleSafeUInt16_get_Value, (SimpleSafeUInt16 v, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0400F280, uint32_t, MoleMole_SimpleSafeUInt32_get_Value, (SimpleSafeUInt32 v, MethodInfo* method));
|
||||
DO_APP_FUNC(0x05DF4590, String*, Marshal_PtrToStringAnsi, (void* ptr, MethodInfo* method));
|
||||
|
||||
|
||||
// Map utility
|
||||
DO_APP_FUNC(0x00E866B0, Rect, MonoInLevelMapPage_get_mapRect, (MonoInLevelMapPage* __this, MethodInfo* method));
|
||||
@ -40,7 +42,8 @@ DO_APP_FUNC(0x016189E0, void, MoleMole_DataItem_HandleNormalProp, (DataItem* __t
|
||||
// God mode
|
||||
DO_APP_FUNC(0x027DB100, void, VCHumanoidMove_NotifyLandVelocity, (VCHumanoidMove* __this, Vector3 velocity, float reachMaxDownVelocityTime, MethodInfo* method));
|
||||
DO_APP_FUNC(0x036889B0, bool, Miscs_CheckTargetAttackable, (BaseEntity* attackerEntity, BaseEntity* targetEntity, MethodInfo* method));
|
||||
// DO_APP_FUNC(0x00D0CA90, void, MoleMole_LCBaseCombat_FireBeingHitEvent, (LCBaseCombat* __this, uint32_t attackeeRuntimeID, AttackResult* attackResult, MethodInfo* method));
|
||||
DO_APP_FUNC(0x00D0CA90, void, MoleMole_LCBaseCombat_FireBeingHitEvent, (LCBaseCombat* __this, uint32_t attackeeRuntimeID, AttackResult* attackResult, MethodInfo* method));
|
||||
DO_APP_FUNC(0x02383880, bool, MoleMole_ActorAbilityPlugin_HanlderModifierThinkTimerUp, (ActorAbilityPlugin* __this, float delay, Object* arg, MethodInfo* method));
|
||||
|
||||
|
||||
// Cooldown cheats
|
||||
@ -73,6 +76,9 @@ DO_APP_FUNC(0x00F97D70, void, MoleMole_TalkDialogContext_OnDialogSelectItem, (Ta
|
||||
DO_APP_FUNC(0x02BF0040, void, MoleMole_InLevelCutScenePageContext_OnFreeClick, (InLevelCutScenePageContext* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x02BF1AC0, void, MoleMole_InLevelCutScenePageContext_UpdateView, (InLevelCutScenePageContext* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x02BEF110, void, MoleMole_InLevelCutScenePageContext_ClearView, (InLevelCutScenePageContext* __this, MethodInfo* method));
|
||||
// Skip Cutscene | RyujinZX#6666
|
||||
DO_APP_FUNC(0x0363A300, void, CriwareMediaPlayer_Update, (CriwareMediaPlayer* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0363A0D0, void, CriwareMediaPlayer_Skip, (CriwareMediaPlayer* __this, MethodInfo* method));
|
||||
|
||||
|
||||
// Protection bypass
|
||||
@ -133,6 +139,7 @@ DO_APP_FUNC(0x0292C7F0, void, MoleMole_FishingModule_onFishChosenNotify, (void*
|
||||
|
||||
// Visuals
|
||||
DO_APP_FUNC(0x013FC090, void, MoleMole_SCameraModuleInitialize_SetWarningLocateRatio, (SCameraModuleInitialize* __this, double deltaTime, CameraShareData* data, MethodInfo* method));
|
||||
DO_APP_FUNC(0x01B8DC20, void, MoleMole_VCBaseSetDitherValue_set_ManagerDitherAlphaValue, (MoleMole_VCBaseSetDitherValue* __this, float value, MethodInfo* method));
|
||||
|
||||
// Chest Indicator | RyujinZX#6666
|
||||
DO_APP_FUNC(0x04C9B450, bool, MoleMole_LCIndicatorPlugin_DoCheck, (LCIndicatorPlugin* __this, MethodInfo* method));
|
||||
@ -143,10 +150,57 @@ DO_APP_FUNC(0x04C9A750, void, MoleMole_LCIndicatorPlugin_HideIcon, (LCIndicatorP
|
||||
DO_APP_FUNC(0x02854E30, void, MoleMole_PlayerModule_RequestPlayerCook, (MoleMole_PlayerModule* __this, uint32_t recipeId, uint32_t avatarId, uint32_t qteQuality, uint32_t count, MethodInfo* method));
|
||||
DO_APP_FUNC(0x02858180, void, MoleMole_PlayerModule_OnPlayerCookRsp, (MoleMole_PlayerModule* __this, PlayerCookRsp* rsp, MethodInfo* method));
|
||||
DO_APP_FUNC(0x033F5820, void, MoleMole_CookingQtePageContext_UpdateProficiency, (CookingQtePageContext* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0116AA10, uint32_t, CookRecipeExcelConfig_get_maxProficiency, (CookRecipeExcelConfig* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x008ECD70, uint32_t, MoleMole_Config_CookRecipeExcelConfig_CheckCookFoodMaxNum, (uint32_t UpdateCookRecipeDic, MethodInfo* method));
|
||||
DO_APP_FUNC(0x032256C0, void, CookingQtePageContext_CloseItemGotPanel, (CookingQtePageContext* __this, MethodInfo* method));
|
||||
|
||||
// Profile Changer | RyujinZX#6666
|
||||
DO_APP_FUNC(0x027A41A0, Button_1*, ProfilePage, (MonoInLevelPlayerProfilePage* __this, MethodInfo* method)); // MonoInLevelPlayerProfilePage_get_logoutButton
|
||||
DO_APP_FUNC(0x016A77B0, void, ProfileEditPage, (MonoFriendInformationDialog* __this, Sprite* value, MethodInfo* method)); // MonoFriendInformationDialog_set_icon
|
||||
|
||||
// Game Object, Component, Transform Utility
|
||||
DO_APP_FUNC(0x0662F130, GameObject*, GameObject_Find, (String* name, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0662F190, Component_1*, GameObject_GetComponentByName, (GameObject* __this, String* type, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0662F660, bool, GameObject_get_active, (GameObject* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0662F720, void, GameObject_set_active, (GameObject* __this, bool value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x065546E0, Transform*, Transform_GetChild, (Transform* __this, int32_t index, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0652EA10, Component_1*, Component_1_GetComponent_1, (Component_1* __this, String* type, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0662F520, void, GameObject_SetActive, (GameObject* __this, bool value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0662F100, GameObject*, GameObject_CreatePrimitive, (PrimitiveType__Enum type, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0662F700, Transform*, GameObject_get_transform, (GameObject* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x06555EF0, void, Transform_set_localRotation, (Transform* __this, Quaternion value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x065548E0, void, Transform_set_localScale, (Transform* __this, Vector3 value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x06555EE0, void, Transform_set_localPosition, (Transform* __this, Vector3 value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0662F090, Component_1*, GameObject_AddComponentInternal, (GameObject* __this, String* className, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0662F0A0, Component_1*, GameObject_AddComponent, (GameObject* __this, Type* componentType, MethodInfo* method));
|
||||
DO_APP_FUNC(0x065508C0, void, Object_1_DestroyImmediate_1, (Object_1* obj, MethodInfo* method));
|
||||
DO_APP_FUNC(0x06550C00, Object_1*, Object_1_Instantiate_2, (Object_1* original, MethodInfo* method));
|
||||
DO_APP_FUNC(0x041B0BB0, Object*, Object_1_Instantiate_5, (Object* original, MethodInfo* method));
|
||||
DO_APP_FUNC(0x041B0BB0, GameObject*, Object_1_Instantiate_11, (GameObject* original, MethodInfo* method));
|
||||
|
||||
|
||||
// Music game event
|
||||
DO_APP_FUNC(0x00FFE490, void, MusicGamePlayComponent_OnPlayerUpdate, (MusicGamePlayComponent* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x00FFE600, void, MusicGamePlayComponent_OnStart, (MusicGamePlayComponent* __this, BeatMapData* beatMapData, MusicMetaInfo* musicMetaInfo, MethodInfo* method));
|
||||
DO_APP_FUNC(0x00FFE310, void, MusicGamePlayComponent_OnMiss, (MusicGamePlayComponent* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x00FFEE40, void, MusicGamePlayComponent_set_combo, (MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x00FFF050, void, MusicGamePlayComponent_set_score, (MusicGamePlayComponent* __this, float value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x01B5AEB0, void, MusicGamePlayComponent_set_maxCombo, (MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x02C749E0, void, MusicGamePlayComponent_set_perfectCnt, (MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x035C4E50, void, MusicGamePlayComponent_set_greatCnt, (MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x017A31C0, void, MusicGamePlayComponent_set_missCnt, (MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x00FFDE90, void, MusicGamePlayComponent_OnHit, (MusicGamePlayComponent* __this, float score, MethodInfo* method));
|
||||
|
||||
|
||||
// Utility
|
||||
DO_APP_FUNC(0x03551B60, String*, Text_get_text, (Text* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x06568060, void, Text_set_text, (Text* __this, String* value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0658D6B0, void, Slider_1_set_value, (Slider_1* __this, float value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0658D560, void, Slider_1_set_maxValue, (Slider_1* __this, float value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0658D5E0, void, Slider_1_set_minValue, (Slider_1* __this, float value, MethodInfo* method));
|
||||
DO_APP_FUNC(0x065F6470, Rect, Sprite_get_rect, (Sprite* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0667D6A0, Texture2D*, NativeGallery_LoadImageAtPath, (String* imagePath, int32_t maxSize, bool markTextureNonReadable, bool generateMipmaps, bool linearColorSpace, MethodInfo* method));
|
||||
DO_APP_FUNC(0x065F6270, Sprite*, Sprite_Create, (Texture2D* texture, Rect rect, Vector2 pivot, float pixelsPerUnit, MethodInfo* method));
|
||||
|
||||
DO_APP_FUNC(0x036865D0, float, Miscs_CalcCurrentGroundWaterHeight, (float x, float z, MethodInfo* method));
|
||||
DO_APP_FUNC(0x03685E00, float, Miscs_CalcCurrentGroundHeight, (float x, float z, MethodInfo* method));
|
||||
DO_APP_FUNC(0x03685F10, float, Miscs_CalcCurrentGroundHeight_1, (float x, float z, float rayStartHeight, float rayDetectLength, int32_t layer, MethodInfo* method));
|
||||
@ -169,8 +223,6 @@ DO_APP_FUNC(0x01AA5200, Notify, Notify_CreateNotify_1, (MoleMole_NotifyTypes__En
|
||||
DO_APP_FUNC(0x020C7AA0, float, MoleMole_SafeFloat_get_Value, (SafeFloat safeFloat, MethodInfo* method));
|
||||
// DO_APP_FUNC(0x020C7920, MoleMole_SafeFloat, MoleMole_SafeFloat_DBDMOONJALD, (float IGFNEICJINB, MethodInfo * method));
|
||||
DO_APP_FUNC(0x020C7920, SafeFloat, MoleMole_SafeFloat_set_Value, (float value, MethodInfo* method));
|
||||
|
||||
//DO_APP_FUNC(0x039E2290, MoleMole_LCBaseCombat *, MoleMole_BaseEntity_GetLogicCombatComponent_1, (MoleMole_BaseEntity * __this, MethodInfo * method));
|
||||
DO_APP_FUNC(0x039E2290, LCBaseCombat*, MoleMole_BaseEntity_GetLogicCombatComponent_1, (BaseEntity* __this, MethodInfo* method));
|
||||
|
||||
DO_APP_FUNC(0x035CC430, String*, MoleMole_BaseEntity_ToStringRelease, (BaseEntity* __this, MethodInfo* method));
|
||||
@ -184,21 +236,13 @@ DO_APP_FUNC(0x035C08A0, Vector3, MoleMole_BaseEntity_GetRight, (BaseEntity* __th
|
||||
DO_APP_FUNC(0x035CB210, Vector3, MoleMole_BaseEntity_GetUp, (BaseEntity* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x035D5B30, bool, MoleMole_BaseEntity_IsActive, (BaseEntity* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x035C7A50, Rigidbody*, MoleMole_BaseEntity_GetRigidbody, (BaseEntity* __this, MethodInfo* method));
|
||||
|
||||
//DO_APP_FUNC(0x039E22C0, MoleMole_VCBaseMove_1 *, MoleMole_BaseEntity_GetMoveComponent_1, (MoleMole_BaseEntity * __this, MethodInfo * method));
|
||||
DO_APP_FUNC(0x039E22C0, VCBaseMove*, MoleMole_BaseEntity_GetMoveComponent_1, (BaseEntity* __this, MethodInfo* method)); // double check
|
||||
|
||||
DO_APP_FUNC(0x035C3850, List_1_MoleMole_BaseComponent_*, MoleMole_BaseEntity_GetAllLogicComponents, (BaseEntity* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x0187FDC0, GameObject*, MoleMole_BaseEntity_get_gameObject, (BaseEntity* __this, MethodInfo* method));
|
||||
DO_APP_FUNC(0x035ACC70, GameObject*, MoleMole_BaseEntity_get_rootGameObject, (BaseEntity* __this, MethodInfo* method));
|
||||
DO_APP_FUNC_METHODINFO(0x096EAD20, MoleMole_BaseEntity_GetMoveComponent_1__MethodInfo);
|
||||
|
||||
//DO_APP_FUNC_METHODINFO(0x096EF950, MoleMole_BaseEntity_GetLogicCombatComponent_1__MethodInfo); // double check
|
||||
DO_APP_FUNC_METHODINFO(0x096EC0B8, MoleMole_BaseEntity_GetLogicCombatComponent_1__MethodInfo);
|
||||
|
||||
// check comparison from 2.2 & 2.6
|
||||
// function type & name is wrong
|
||||
// DO_APP_FUNC(0, MoleMole_AvatarEntity *, MoleMole_EntityManager_GetLocalAvatarEntity, (MoleMole_EntityManager * __this, MethodInfo * method));
|
||||
DO_APP_FUNC(0x01BF68A0, BaseEntity*, MoleMole_EntityManager_GetLocalAvatarEntity, (MoleMole_EntityManager* __this, MethodInfo* method));
|
||||
|
||||
DO_APP_FUNC(0x01BF4E50, CameraEntity*, MoleMole_EntityManager_GetMainCameraEntity, (MoleMole_EntityManager* __this, MethodInfo* method));
|
||||
@ -206,10 +250,6 @@ DO_APP_FUNC(0x01BEB030, BaseEntity*, MoleMole_EntityManager_GetValidEntity, (Mol
|
||||
DO_APP_FUNC(0x01BF2D60, bool, MoleMole_EntityManager_RemoveEntity, (MoleMole_EntityManager* __this, BaseEntity* entity, uint32_t specifiedRuntimeID, MethodInfo* method));
|
||||
DO_APP_FUNC(0x01C02800, bool, MoleMole_EntityManager_IsCachedEntity, (MoleMole_EntityManager* __this, BaseEntity* entity, MethodInfo* method));
|
||||
DO_APP_FUNC(0x01BF01F0, List_1_MoleMole_BaseEntity_*, MoleMole_EntityManager_GetEntities, (MoleMole_EntityManager* __this, MethodInfo* method));
|
||||
|
||||
// check comparison with 2.6
|
||||
// function name changed to:
|
||||
// DO_APP_FUNC(0, Bounds, Utils_4_GetBounds, (GameObject * go, MethodInfo * method));
|
||||
DO_APP_FUNC(0x044B8970, Bounds, Utils_4_GetBounds, (GameObject* go, MethodInfo* method));
|
||||
|
||||
// Modify | RyujinZX#6666
|
||||
|
@ -3818,10 +3818,22 @@ namespace app {
|
||||
void* m_CachedPtr;
|
||||
};
|
||||
|
||||
struct Object_1 {
|
||||
struct Object_1__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct Object_1__Fields fields;
|
||||
};
|
||||
|
||||
struct Component_1__Fields {
|
||||
struct Object_1__Fields _;
|
||||
};
|
||||
|
||||
struct Component_1 {
|
||||
struct Component_1__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct Component_1__Fields fields;
|
||||
};
|
||||
|
||||
struct Transform__Fields {
|
||||
struct Component_1__Fields _;
|
||||
};
|
||||
@ -4490,6 +4502,11 @@ namespace app {
|
||||
void* m_Corners;
|
||||
};
|
||||
|
||||
/*struct MaskableGraphic {
|
||||
struct MaskableGraphic__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct MaskableGraphic__Fields fields;
|
||||
};*/
|
||||
|
||||
struct Text__Fields {
|
||||
struct MaskableGraphic__Fields _;
|
||||
@ -9197,6 +9214,16 @@ namespace app {
|
||||
Il2CppClass_1 _1;
|
||||
};
|
||||
|
||||
struct Canvas__Fields {
|
||||
struct Behaviour__Fields _;
|
||||
};
|
||||
|
||||
struct Canvas {
|
||||
struct Canvas__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct Canvas__Fields fields;
|
||||
};
|
||||
|
||||
struct __declspec(align(8)) UIManager__Fields {
|
||||
struct LinkedList_1_MoleMole_BaseContext_* _inputContextList;
|
||||
struct HashSet_1_MoleMole_BaseContext_* _inputContextSet;
|
||||
@ -9204,7 +9231,7 @@ namespace app {
|
||||
struct HashSet_1_MoleMole_BaseContext_* BCPDECEFFMF;
|
||||
struct UIPlatformConfig* platformConfig;
|
||||
uint32_t _curProfileHandle;
|
||||
void* _sceneCanvas;
|
||||
struct Canvas* _sceneCanvas;
|
||||
struct Camera* _uiCamera;
|
||||
};
|
||||
|
||||
@ -11337,6 +11364,370 @@ namespace app {
|
||||
struct CookRecipeExcelConfig__Fields fields;
|
||||
};
|
||||
|
||||
struct CriwareMediaPlayer__Fields {
|
||||
struct MonoBehaviour__Fields _;
|
||||
struct FDNEMKPLJJP* _eventCallback_k__BackingField;
|
||||
struct AspectRatioFitter* _parentAspectRatioFitter;
|
||||
struct AspectRatioFitter* _aspectRatioFitter;
|
||||
struct Image_1* _image;
|
||||
struct Text* _text;
|
||||
struct CriManaMovieControllerForUI* _controllerForUI;
|
||||
struct CriWareInitializer* _criwareInitializer;
|
||||
struct CriWareErrorHandler* _criwareErrorHandler;
|
||||
struct VideoSubtitles* _videoSubtitles;
|
||||
int32_t _lastStatus; // Player_Status__Enum
|
||||
struct Action_1_String_* _onStartPlay;
|
||||
struct Action_1_String_* _onFinishPlay;
|
||||
struct Action_1_String_* _onError;
|
||||
struct Action* _onClose;
|
||||
struct String* _videoRuntimePath;
|
||||
bool _useSubtitle;
|
||||
struct String* _subtitleRuntimePath;
|
||||
struct String* _stat;
|
||||
int32_t _audioTrack;
|
||||
int32_t KBIMMFBKMJE; // KIPKAJKIFKJ__Enum
|
||||
uint64_t _encryptKey;
|
||||
bool _audioEncrypted;
|
||||
};
|
||||
|
||||
struct CriwareMediaPlayer {
|
||||
struct CriwareMediaPlayer__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct CriwareMediaPlayer__Fields fields;
|
||||
};
|
||||
|
||||
struct Sprite__Fields {
|
||||
struct Object_1__Fields _;
|
||||
};
|
||||
|
||||
struct Sprite {
|
||||
struct Sprite__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct Sprite__Fields fields;
|
||||
};
|
||||
|
||||
struct Texture__Fields {
|
||||
struct Object_1__Fields _;
|
||||
};
|
||||
|
||||
struct Texture2D__Fields {
|
||||
struct Texture__Fields _;
|
||||
};
|
||||
|
||||
struct Texture2D {
|
||||
struct Texture2D__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct Texture2D__Fields fields;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
struct Image_1__Fields {
|
||||
struct MaskableGraphic__Fields _;
|
||||
struct Sprite* m_CachedSprite;
|
||||
struct Sprite* m_Sprite;
|
||||
struct Sprite* m_OverrideSprite;
|
||||
int32_t m_Type;
|
||||
bool m_PreserveAspect;
|
||||
bool m_FillCenter;
|
||||
int32_t m_FillMethod;
|
||||
float m_FillAmount;
|
||||
bool m_FillClockwise;
|
||||
int32_t m_FillOrigin;
|
||||
float m_AlphaHitTestMinimumThreshold;
|
||||
bool m_Tracked;
|
||||
};
|
||||
|
||||
struct Image_1 {
|
||||
struct Image_1__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct Image_1__Fields fields;
|
||||
};
|
||||
|
||||
struct MonoInLevelPlayerProfilePage__Fields {
|
||||
struct MonoUIProxy__Fields _;
|
||||
struct Text* _playerName;
|
||||
struct Text* _playerLv;
|
||||
struct Text* _playerExp;
|
||||
struct Slider_1* _playerExpSlider;
|
||||
struct Text* _playerID;
|
||||
struct Text* _playerCost;
|
||||
struct Text* _playerInfo;
|
||||
struct Text* _playerNum;
|
||||
struct Image_1* playerIconImage;
|
||||
struct Text* _playerWorldLv;
|
||||
struct Text* _playerBirthday;
|
||||
struct Text* _playerSignature;
|
||||
struct Text* _playerNoSignature;
|
||||
struct RectTransform* _playerSignatureRect;
|
||||
struct Image_1* _nameCardPic;
|
||||
struct Button_1* _closeButton;
|
||||
struct MonoElementSwitch* _elementSwitch;
|
||||
struct MihoyoGridLayoutGroup* _menuEntryLayout;
|
||||
struct MonoReusableList* _entryList;
|
||||
struct List_1_MoleMole_PaimonEntryConfig_* _entryConfigs;
|
||||
struct MonoUIContainer* _playerLevelBtn;
|
||||
struct Vector3 _offsetPos;
|
||||
float transDuration;
|
||||
float transLerpRatio;
|
||||
int32_t lerpPattern;
|
||||
struct MonoUIContainer* _photographBtn;
|
||||
struct MonoUIContainer* _bulletinBtn;
|
||||
struct MonoUIContainer* _mailBtn;
|
||||
struct MonoUIContainer* _timeBtn;
|
||||
struct MonoUIContainer* _settingBtn;
|
||||
struct Button_1* _iconBtn;
|
||||
struct MonoUIContainer* _editBtn;
|
||||
struct RectTransform* _editPanel;
|
||||
struct Button_1* _editReturnBtn;
|
||||
struct MonoUIContainer* _editHeadPortraitBtn;
|
||||
struct MonoUIContainer* _editNameCardBtn;
|
||||
struct MonoUIContainer* _editSignatureBtn;
|
||||
struct MonoUIContainer* _editNameBtn;
|
||||
struct MonoUIContainer* _editCopyUidBtn;
|
||||
struct MonoUIContainer* _editBirthdayBtn;
|
||||
struct MonoUIContainer* _editProfileBtn;
|
||||
struct MonoUIContainer* _worldLvInfoBtn;
|
||||
struct MonoUIContainer* _playerLvInfoBtn;
|
||||
struct Button_1* _copyBtn;
|
||||
struct RectTransform* _copyText;
|
||||
struct RectTransform* _ps4OnlineID;
|
||||
struct Text* _ps4OnlineIDText;
|
||||
struct GameObject* _upArrowIcon;
|
||||
struct GameObject* _downArrowIcon;
|
||||
float _redpointsCheckUpperOffset;
|
||||
float _redpointsCheckLowerOffset;
|
||||
struct String* _animStateAllowPaimonResponsePS5MicBlowEvent;
|
||||
float _thresholdDiscardPS5MicBlowEvent;
|
||||
float _thresholdPaimonResponsePS5MicBlowEventContinuely;
|
||||
struct MonoPS5MicBlowEventHandlerBase* _ps5MicBlowEventHandler;
|
||||
};
|
||||
|
||||
struct MonoInLevelPlayerProfilePage {
|
||||
struct MonoInLevelPlayerProfilePage__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct MonoInLevelPlayerProfilePage__Fields fields;
|
||||
};
|
||||
|
||||
struct MonoFriendInformationDialog__Fields {
|
||||
struct MonoUIProxy__Fields _;
|
||||
struct MonoElementSwitch* _elementSwitch;
|
||||
struct Text* _playerUID;
|
||||
struct Image_1* _icon;
|
||||
struct Text* _nickname;
|
||||
struct Text* _remarkname;
|
||||
struct Text* _playerLevel;
|
||||
struct Text* _worldLevel;
|
||||
struct Text* _signature;
|
||||
struct RectTransform* _signatureRect;
|
||||
struct Button_1* _returnBtn;
|
||||
struct MonoUIContainer* _ps4ID;
|
||||
struct RectTransform* _blockChatImg;
|
||||
struct RectTransform* _joypadBtnGroup;
|
||||
struct Image_1* _cardImg;
|
||||
struct Button_1* _signatureBtn;
|
||||
struct RectTransform* _editPanel;
|
||||
struct Button_1* _editReturnBtn;
|
||||
struct MonoGridScroller* _editScroller;
|
||||
struct Text* _achievementTxt;
|
||||
struct Text* _towerTxt;
|
||||
struct Text* _towerNoDataTxt;
|
||||
struct Text* _toggleTxt;
|
||||
struct GameObject* _iconHide;
|
||||
struct GameObject* _avatarEmptyGrp;
|
||||
struct GameObject* _toggleGrp;
|
||||
struct MonoGridScroller* _avatarScroller;
|
||||
struct MonoUIContainer* _toggle;
|
||||
struct MonoUIContainer* _mainPageBtn;
|
||||
struct GameObject* _achievementGrp;
|
||||
struct GameObject* _avatarGrp;
|
||||
struct MonoUIContainer* _nameCardBtn;
|
||||
struct GameObject* _nameCardGrp;
|
||||
struct MonoGridScroller* _nameCardScroller;
|
||||
struct GameObject* _nameCardEmptyGrp;
|
||||
};
|
||||
|
||||
struct MonoFriendInformationDialog {
|
||||
struct MonoFriendInformationDialog__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct MonoFriendInformationDialog__Fields fields;
|
||||
};
|
||||
|
||||
struct Color32 {
|
||||
int32_t rgba;
|
||||
uint8_t r;
|
||||
uint8_t g;
|
||||
uint8_t b;
|
||||
uint8_t a;
|
||||
};
|
||||
|
||||
enum class PrimitiveType__Enum : int32_t {
|
||||
Sphere = 0x00000000,
|
||||
Capsule = 0x00000001,
|
||||
Cylinder = 0x00000002,
|
||||
Cube = 0x00000003,
|
||||
Plane = 0x00000004,
|
||||
Quad = 0x00000005,
|
||||
};
|
||||
|
||||
enum class BrowserNative_ContextMenuOrigin__Enum : int32_t {
|
||||
Editable = 0x00000002,
|
||||
Image = 0x00000004,
|
||||
Selection = 0x00000008,
|
||||
Other = 0x00000001,
|
||||
};
|
||||
|
||||
enum class Browser_NewWindowAction__Enum : int32_t {
|
||||
Ignore = 0x00000001,
|
||||
Redirect = 0x00000002,
|
||||
NewBrowser = 0x00000003,
|
||||
NewWindow = 0x00000004,
|
||||
};
|
||||
|
||||
struct Browser__Fields {
|
||||
struct MonoBehaviour__Fields _;
|
||||
bool offScreen;
|
||||
struct IBrowserUI* _uiHandler;
|
||||
bool uiHandlerAssigned;
|
||||
struct String* _url;
|
||||
int32_t _width;
|
||||
int32_t _height;
|
||||
bool generateMipmap;
|
||||
struct Color32 baseColor;
|
||||
float _zoom;
|
||||
struct Action_2_String_String_* onConsoleMessage;
|
||||
BrowserNative_ContextMenuOrigin__Enum allowContextMenuOn;
|
||||
Browser_NewWindowAction__Enum newWindowAction;
|
||||
struct INewWindowHandler* _NewWindowHandler_k__BackingField;
|
||||
bool _EnableRendering_k__BackingField;
|
||||
bool _EnableInput_k__BackingField;
|
||||
struct CookieManager* _CookieManager_k__BackingField;
|
||||
int32_t browserId;
|
||||
int32_t unsafeBrowserId;
|
||||
bool browserIdRequested;
|
||||
struct Texture2D* texture;
|
||||
struct Action_1_UnityEngine_Texture2D_* afterResize;
|
||||
bool textureIsOurs;
|
||||
bool forceNextRender;
|
||||
bool isPopup;
|
||||
struct List_1_System_Action_* thingsToDo;
|
||||
struct List_1_System_Action_* onloadActions;
|
||||
struct List_1_System_Object_* thingsToRemember;
|
||||
int32_t nextCallbackId;
|
||||
struct Dictionary_2_System_Int32_ZenFulcrum_EmbeddedBrowser_Browser_JSResultFunc_* registeredCallbacks;
|
||||
struct BrowserNative_ReadyFunc* onNativeReady;
|
||||
struct Action_1_ZenFulcrum_EmbeddedBrowser_JSONNode_* onLoad;
|
||||
struct Action_1_ZenFulcrum_EmbeddedBrowser_JSONNode_* onFetch;
|
||||
struct Action_1_ZenFulcrum_EmbeddedBrowser_JSONNode_* onFetchError;
|
||||
struct Action_1_ZenFulcrum_EmbeddedBrowser_JSONNode_* onCertError;
|
||||
struct Action* onSadTab;
|
||||
struct Action* onTextureUpdated;
|
||||
struct Action* onNavStateChange;
|
||||
struct Action_2_Int32_ZenFulcrum_EmbeddedBrowser_JSONNode_* onDownloadStarted;
|
||||
struct Action_2_Int32_ZenFulcrum_EmbeddedBrowser_JSONNode_* onDownloadStatus;
|
||||
struct Action_3_String_Boolean_String_* onNodeFocus;
|
||||
struct Action_1_ZenFulcrum_EmbeddedBrowser_JSONNode_* onUniWebviewMsgReceive;
|
||||
struct Action_1_ZenFulcrum_EmbeddedBrowser_JSONNode_* onBeforeNavigationMsgReceive;
|
||||
struct Action_2_Boolean_Boolean_* onBrowserFocus;
|
||||
struct BrowserFocusState* focusState;
|
||||
struct BrowserInput* browserInput;
|
||||
struct Browser* overlay;
|
||||
bool skipNextLoad;
|
||||
bool loadPending;
|
||||
struct BrowserNavState* navState;
|
||||
bool newWindowHandlerSet;
|
||||
struct INewWindowHandler* newWindowHandler;
|
||||
struct DialogHandler* dialogHandler;
|
||||
struct Action* pageReplacer;
|
||||
float pageReplacerPriority;
|
||||
struct List_1_System_Action_* thingsToDoClone;
|
||||
struct Color32__Array* colorBuffer;
|
||||
};
|
||||
|
||||
struct Browser {
|
||||
struct Browser__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct Browser__Fields fields;
|
||||
};
|
||||
|
||||
struct __declspec(align(8)) BeatMapData__Fields {
|
||||
struct List_1_MoleMole_MusicGame_TrackData_* trackDatas;
|
||||
struct POLBDGNBFKM* config;
|
||||
};
|
||||
|
||||
struct BeatMapData {
|
||||
struct BeatMapData__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct BeatMapData__Fields fields;
|
||||
};
|
||||
|
||||
struct __declspec(align(8)) MusicMetaInfo__Fields {
|
||||
struct BpmInfo* bpmInfo;
|
||||
struct List_1_System_Single_* simpleBeatHintTimeMsList;
|
||||
struct List_1_System_Single_* complexBeatHintTimeMsList;
|
||||
struct CGDACGGKKNJ* musicConfig;
|
||||
struct PMIELLLMJKA* musicInfoConfig;
|
||||
struct POLBDGNBFKM* beatMapConfig;
|
||||
struct JNEKHDKOKGL* musicInstrumentConfig;
|
||||
};
|
||||
|
||||
struct MusicMetaInfo {
|
||||
struct MusicMetaInfo__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct MusicMetaInfo__Fields fields;
|
||||
};
|
||||
|
||||
struct MusicGamePlayComponent__Fields {
|
||||
void* _;
|
||||
uint32_t _combo;
|
||||
float _score_k__BackingField;
|
||||
uint32_t _maxCombo_k__BackingField;
|
||||
uint32_t _perfectCnt_k__BackingField;
|
||||
uint32_t _greatCnt_k__BackingField;
|
||||
uint32_t _missCnt_k__BackingField;
|
||||
};
|
||||
|
||||
struct MusicGamePlayComponent {
|
||||
struct MusicGamePlayComponent__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct MusicGamePlayComponent__Fields fields;
|
||||
};
|
||||
|
||||
struct MoleMole_VCBaseSetDitherValue__Fields {
|
||||
void* _;
|
||||
bool _usingDitherAlpha;
|
||||
float _ditherAlphaValue;
|
||||
float _managerDitherAlphaValue;
|
||||
float _localDitherAlphaValue;
|
||||
bool IBKAJMBMGAE;
|
||||
struct MoleMole_VCBaseModel* _modelComponent;
|
||||
float _showStartDitherDuration;
|
||||
bool _needStartDitherAction;
|
||||
float _detectDitherRangeBetweenCameraAndAvatar;
|
||||
float _detectDitherRangeNormalBetweenCamera;
|
||||
float _detectDitherRangeNormalBetweenCameraInTimeLine;
|
||||
bool GCEGGKLBFPG;
|
||||
struct List_1_MoleMole_BaseDither_* _dithers;
|
||||
bool _isDitherChangeStarted;
|
||||
float _spd;
|
||||
float _fromValue;
|
||||
float _toValue;
|
||||
struct Action* _changeFinishHandler;
|
||||
bool _triggerUpdateDitherShow;
|
||||
bool _prevUsingDitherAlpha;
|
||||
float _prevDitherAlphaValue;
|
||||
float _prevTextureBias;
|
||||
bool _prevInMotionVectorMode;
|
||||
bool _isVisible;
|
||||
};
|
||||
|
||||
struct MoleMole_VCBaseSetDitherValue {
|
||||
struct MoleMole_VCBaseSetDitherValue__Class* klass;
|
||||
MonitorData* monitor;
|
||||
struct MoleMole_VCBaseSetDitherValue__Fields fields;
|
||||
};
|
||||
|
||||
#if !defined(_GHIDRA_) && !defined(_IDA_)
|
||||
}
|
||||
#endif
|
||||
|
@ -14,32 +14,32 @@
|
||||
|
||||
uintptr_t il2cpp_get_mono_base_address()
|
||||
{
|
||||
static HMODULE hMono = GetModuleHandle("mono.dll");
|
||||
static HMODULE hMono = GetModuleHandle("mono.dll");
|
||||
|
||||
if (hMono != NULL)
|
||||
return (uintptr_t)hMono;
|
||||
if (hMono != NULL)
|
||||
return (uintptr_t)hMono;
|
||||
|
||||
HMODULE hModules[1024] = {};
|
||||
HMODULE hModules[1024] = {};
|
||||
|
||||
DWORD cbNeeded = 0;
|
||||
BOOL result = EnumProcessModules(GetCurrentProcess(), hModules, sizeof(hModules), &cbNeeded);
|
||||
if (result == FALSE)
|
||||
return NULL;
|
||||
DWORD cbNeeded = 0;
|
||||
BOOL result = EnumProcessModules(GetCurrentProcess(), hModules, sizeof(hModules), &cbNeeded);
|
||||
if (result == FALSE)
|
||||
return NULL;
|
||||
|
||||
for (int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
|
||||
{
|
||||
if (hModules[i] == NULL)
|
||||
continue;
|
||||
for (int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
|
||||
{
|
||||
if (hModules[i] == NULL)
|
||||
continue;
|
||||
|
||||
if (GetProcAddress(hModules[i], "il2cpp_thread_attach") != NULL)
|
||||
return (uintptr_t)hModules[i];
|
||||
}
|
||||
if (GetProcAddress(hModules[i], "il2cpp_thread_attach") != NULL)
|
||||
return (uintptr_t)hModules[i];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uintptr_t il2cppi_get_base_address() {
|
||||
return (uintptr_t) GetModuleHandleW(L"UserAssembly.dll");
|
||||
return (uintptr_t)GetModuleHandleW(L"UserAssembly.dll");
|
||||
}
|
||||
|
||||
uintptr_t il2cppi_get_unity_address() {
|
||||
@ -49,13 +49,13 @@ uintptr_t il2cppi_get_unity_address() {
|
||||
// Helper function to open a new console window and redirect stdout there
|
||||
void il2cppi_new_console() {
|
||||
AllocConsole();
|
||||
freopen_s((FILE**) stdout, "CONOUT$", "w", stdout);
|
||||
freopen_s((FILE**) stderr, "CONOUT$", "w", stderr);
|
||||
freopen_s((FILE**)stdout, "CONOUT$", "w", stdout);
|
||||
freopen_s((FILE**)stderr, "CONOUT$", "w", stderr);
|
||||
}
|
||||
|
||||
void il2cppi_close_console() {
|
||||
fclose(stdout);
|
||||
fclose(stderr);
|
||||
fclose(stderr);
|
||||
FreeConsole();
|
||||
}
|
||||
|
||||
@ -85,6 +85,11 @@ std::string il2cppi_to_string(app::String* str) {
|
||||
return il2cppi_to_string(reinterpret_cast<Il2CppString*>(str));
|
||||
}
|
||||
|
||||
app::String* string_to_il2cppi(std::string input) {
|
||||
return app::Marshal_PtrToStringAnsi((void*)input.c_str(), nullptr);
|
||||
}
|
||||
|
||||
|
||||
std::string to_hex_string(app::Byte__Array* barray, int length) {
|
||||
if (barray == nullptr)
|
||||
return std::string();
|
||||
|
@ -46,7 +46,7 @@ struct UniLinkListNode
|
||||
};
|
||||
|
||||
template<class ElementT>
|
||||
struct UniLinkList
|
||||
struct UniLinkList
|
||||
{
|
||||
void* klass;
|
||||
MonitorData* monitor;
|
||||
@ -127,15 +127,15 @@ struct __declspec(align(8)) UniDict {
|
||||
MonitorData* monitor;
|
||||
void* buckets;
|
||||
UniArray<UniDictEntry<KeyT, ValT>>* entries;
|
||||
int32_t count;
|
||||
int32_t version;
|
||||
int32_t freeList;
|
||||
int32_t freeCount;
|
||||
void* comparer;
|
||||
int32_t count;
|
||||
int32_t version;
|
||||
int32_t freeList;
|
||||
int32_t freeCount;
|
||||
void* comparer;
|
||||
void* keys;
|
||||
void* values;
|
||||
|
||||
std::vector<std::pair<KeyT, ValT>> pairs()
|
||||
std::vector<std::pair<KeyT, ValT>> pairs()
|
||||
{
|
||||
auto pairs = std::vector<std::pair<KeyT, ValT>>();
|
||||
|
||||
@ -153,8 +153,8 @@ struct __declspec(align(8)) UniDict {
|
||||
break;
|
||||
|
||||
if (entry.hashCode > 0)
|
||||
pairs.push_back({ entry.key, entry.value });
|
||||
|
||||
pairs.push_back({ entry.key, entry.value });
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@ -165,11 +165,11 @@ struct __declspec(align(8)) UniDict {
|
||||
template<class T>
|
||||
T* CastTo(void* pObject, void* pClass)
|
||||
{
|
||||
auto object = reinterpret_cast<app::Object*>(pObject);
|
||||
if (object == nullptr || object->klass == nullptr || object->klass != pClass)
|
||||
return nullptr;
|
||||
auto object = reinterpret_cast<app::Object*>(pObject);
|
||||
if (object == nullptr || object->klass == nullptr || object->klass != pClass)
|
||||
return nullptr;
|
||||
|
||||
return reinterpret_cast<T*>(object);
|
||||
return reinterpret_cast<T*>(object);
|
||||
}
|
||||
|
||||
inline app::Vector3 operator + (const app::Vector3& A, const app::Vector3& B)
|
||||
@ -204,12 +204,12 @@ inline app::Vector3 operator / (const app::Vector3& A, const float k)
|
||||
|
||||
inline app::Vector3 operator - (const app::Vector3& A)
|
||||
{
|
||||
return { -A.x, -A.y, -A.z};
|
||||
return { -A.x, -A.y, -A.z };
|
||||
}
|
||||
|
||||
inline app::Vector2 operator + (const app::Vector2& A, const float k)
|
||||
{
|
||||
return { A.x + k, A.y + k};
|
||||
return { A.x + k, A.y + k };
|
||||
}
|
||||
|
||||
inline app::Vector2 operator - (const app::Vector2& A, const app::Vector2& B)
|
||||
@ -219,46 +219,46 @@ inline app::Vector2 operator - (const app::Vector2& A, const app::Vector2& B)
|
||||
|
||||
inline app::Vector2 operator - (const app::Vector2& A, const float k)
|
||||
{
|
||||
return { A.x - k, A.y - k};
|
||||
return { A.x - k, A.y - k };
|
||||
}
|
||||
|
||||
inline app::Vector2 operator + (const app::Vector2& A, const app::Vector2& B)
|
||||
{
|
||||
return { A.x + B.x, A.y + B.y };
|
||||
return { A.x + B.x, A.y + B.y };
|
||||
}
|
||||
|
||||
inline app::Vector2 operator * (const app::Vector2& A, const float k)
|
||||
{
|
||||
return { A.x * k, A.y * k };
|
||||
return { A.x * k, A.y * k };
|
||||
}
|
||||
|
||||
inline app::Vector2 operator * (const app::Vector2& A, const app::Vector2& B)
|
||||
{
|
||||
return { A.x * B.x, A.y * B.y };
|
||||
return { A.x * B.x, A.y * B.y };
|
||||
}
|
||||
|
||||
inline app::Vector2 operator / (const app::Vector2& A, const float k)
|
||||
{
|
||||
return { A.x / k, A.y / k };
|
||||
return { A.x / k, A.y / k };
|
||||
}
|
||||
|
||||
inline app::Vector2 operator - (const app::Vector2& A)
|
||||
{
|
||||
return { -A.x, -A.y };
|
||||
return { -A.x, -A.y };
|
||||
}
|
||||
|
||||
inline float GetVectorMagnitude(const app::Vector3& A)
|
||||
inline float GetVectorMagnitude(const app::Vector3& A)
|
||||
{
|
||||
return sqrtf(A.x * A.x + A.y * A.y + A.z * A.z);
|
||||
}
|
||||
|
||||
inline app::Vector3 GetVectorDirection(const app::Vector3& from, const app::Vector3& to)
|
||||
inline app::Vector3 GetVectorDirection(const app::Vector3& from, const app::Vector3& to)
|
||||
{
|
||||
auto dirRaw = to - from;
|
||||
return dirRaw / GetVectorMagnitude(dirRaw);
|
||||
}
|
||||
|
||||
inline bool IsVectorZero(const app::Vector3& vector)
|
||||
inline bool IsVectorZero(const app::Vector3& vector)
|
||||
{
|
||||
return vector.x == 0 && vector.y == 0 && vector.z == 0;
|
||||
}
|
||||
@ -282,7 +282,7 @@ std::string il2cppi_to_string(app::String* str);
|
||||
std::string il2cppi_to_string(app::Vector vec);
|
||||
std::string il2cppi_to_string(app::Vector2 vec);
|
||||
std::string il2cppi_to_string(app::Vector3 vec);
|
||||
|
||||
app::String* string_to_il2cppi(std::string input);
|
||||
std::string to_hex_string(app::Byte__Array* barray, int length);
|
||||
#endif
|
||||
|
||||
@ -292,6 +292,6 @@ template<typename T> bool il2cppi_is_initialized(T* metadataItem) {
|
||||
return *metadataItem != 0;
|
||||
#else
|
||||
// Metadata >=27 (Unity 2020.2)
|
||||
return !((uintptr_t) *metadataItem & 1);
|
||||
return !((uintptr_t)*metadataItem & 1);
|
||||
#endif
|
||||
}
|
||||
|
@ -38,11 +38,17 @@
|
||||
|
||||
#include <cheat/world/AutoFish.h>
|
||||
#include <cheat/world/AutoCook.h>
|
||||
#include <cheat/world/MusicEvent.h>
|
||||
|
||||
#include <cheat/visuals/NoFog.h>
|
||||
#include <cheat/visuals/FPSUnlock.h>
|
||||
#include <cheat/visuals/CameraZoom.h>
|
||||
#include <cheat/visuals/ShowChestIndicator.h>
|
||||
#include <cheat/visuals/ProfileChanger.h>
|
||||
#include <cheat/visuals/PaimonFollow.h>
|
||||
#include <cheat/visuals/HideUI.h>
|
||||
#include <cheat/visuals/Browser.h>
|
||||
#include <cheat/visuals/EnablePeaking.h>
|
||||
|
||||
#include "GenshinCM.h"
|
||||
|
||||
@ -93,12 +99,18 @@ namespace cheat
|
||||
|
||||
FEAT_INST(AutoFish),
|
||||
FEAT_INST(AutoCook),
|
||||
FEAT_INST(MusicEvent),
|
||||
|
||||
FEAT_INST(NoFog),
|
||||
FEAT_INST(FPSUnlock),
|
||||
FEAT_INST(CameraZoom),
|
||||
FEAT_INST(ChestIndicator)
|
||||
|
||||
FEAT_INST(ChestIndicator),
|
||||
FEAT_INST(ProfileChanger),
|
||||
FEAT_INST(PaimonFollow),
|
||||
FEAT_INST(HideUI),
|
||||
FEAT_INST(Browser),
|
||||
FEAT_INST(EnablePeaking)
|
||||
|
||||
});
|
||||
#undef FEAT_INST
|
||||
|
||||
|
@ -29,6 +29,7 @@ namespace cheat::feature
|
||||
NF(f_ArrowRadius, "Arrow Radius", "ESP", 100.0f),
|
||||
NF(f_OutlineThickness, "Outline Thickness", "ESP", 1.0f),
|
||||
NF(f_TracerSize, "Tracer Size", "ESP", 1.0f),
|
||||
NF(f_MiddleScreenTracer, "Middle Screen Tracer", "ESP", false),
|
||||
NF(f_DrawDistance, "Draw Distance", "ESP", false),
|
||||
NF(f_DrawName, "Draw Name", "ESP", false),
|
||||
|
||||
@ -71,6 +72,7 @@ namespace cheat::feature
|
||||
|
||||
ConfigWidget(f_Fill);
|
||||
ConfigWidget(f_FillTransparency, 0.01f, 0.0f, 1.0f, "Transparency of filled part.");
|
||||
ConfigWidget(f_MiddleScreenTracer, "Draw tracer from middle part of the screen.");
|
||||
|
||||
if (f_DrawTracerMode.value() == DrawTracerMode::OffscreenArrows)
|
||||
{
|
||||
@ -460,11 +462,15 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(featured, TimeTrialChallenge);
|
||||
|
||||
ADD_FILTER_FIELD(guide, CampfireTorch);
|
||||
ADD_FILTER_FIELD(guide, DayNightSwitchingMechanism);
|
||||
ADD_FILTER_FIELD(guide, EnkanomiyaPhaseGate);
|
||||
ADD_FILTER_FIELD(guide, MysteriousCarvings);
|
||||
ADD_FILTER_FIELD(guide, PhaseGate);
|
||||
ADD_FILTER_FIELD(guide, PlacesofEssenceWorship);
|
||||
ADD_FILTER_FIELD(guide, Pot);
|
||||
ADD_FILTER_FIELD(guide, RuinBrazier);
|
||||
ADD_FILTER_FIELD(guide, Stormstone);
|
||||
ADD_FILTER_FIELD(guide, TriangularMechanism);
|
||||
|
||||
ADD_FILTER_FIELD(living, BakeDanuki);
|
||||
ADD_FILTER_FIELD(living, BirdEgg);
|
||||
@ -507,6 +513,7 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(mineral, ScarletQuartz);
|
||||
ADD_FILTER_FIELD(mineral, StarSilver);
|
||||
ADD_FILTER_FIELD(mineral, WhiteIronChunk);
|
||||
ADD_FILTER_FIELD(mineral, DunlinsTooth);
|
||||
|
||||
// Trounce. Arranged by appearance in-game.
|
||||
ADD_FILTER_FIELD(monster, Dvalin);
|
||||
@ -576,7 +583,6 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(monster, Samachurl);
|
||||
ADD_FILTER_FIELD(monster, SangonomiyaCohort);
|
||||
ADD_FILTER_FIELD(monster, ShadowyHusk);
|
||||
ADD_FILTER_FIELD(monster, ShadowyHusk);
|
||||
ADD_FILTER_FIELD(monster, ShogunateInfantry);
|
||||
ADD_FILTER_FIELD(monster, Slime);
|
||||
ADD_FILTER_FIELD(monster, Specter);
|
||||
@ -629,6 +635,7 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(puzzle, CubeDevices);
|
||||
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);
|
||||
@ -643,6 +650,7 @@ namespace cheat::feature
|
||||
ADD_FILTER_FIELD(puzzle, OozingConcretions);
|
||||
ADD_FILTER_FIELD(puzzle, PirateHelm);
|
||||
ADD_FILTER_FIELD(puzzle, PressurePlate);
|
||||
ADD_FILTER_FIELD(puzzle, SealLocations);
|
||||
ADD_FILTER_FIELD(puzzle, Seelie);
|
||||
ADD_FILTER_FIELD(puzzle, SeelieLamp);
|
||||
ADD_FILTER_FIELD(puzzle, SmallRockPile);
|
||||
|
@ -38,6 +38,7 @@ namespace cheat::feature
|
||||
config::Field<float> f_ArrowRadius;
|
||||
config::Field<float> f_OutlineThickness;
|
||||
config::Field<float> f_TracerSize;
|
||||
config::Field<bool> f_MiddleScreenTracer;
|
||||
|
||||
config::Field<int> f_FontSize;
|
||||
config::Field<bool> f_FontOutline;
|
||||
|
@ -390,7 +390,19 @@ namespace cheat::feature::esp::render
|
||||
return;
|
||||
|
||||
auto draw = ImGui::GetBackgroundDrawList();
|
||||
draw->AddLine(s_AvatarPosition, *screenPos, color);
|
||||
|
||||
auto& esp = ESP::GetInstance();
|
||||
if (esp.f_MiddleScreenTracer)
|
||||
{
|
||||
ImRect screen_rect = { 0.0f, 0.0f, ImGui::GetIO().DisplaySize.x, ImGui::GetIO().DisplaySize.y };
|
||||
auto screen_center = screen_rect.GetCenter();
|
||||
draw->AddLine(screen_center, *screenPos, color);
|
||||
}
|
||||
else
|
||||
{
|
||||
draw->AddLine(s_AvatarPosition, *screenPos, color);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#define PI 3.14159265358979323846f
|
||||
|
@ -47,11 +47,15 @@ namespace cheat::game::filters
|
||||
namespace guide
|
||||
{
|
||||
SimpleFilter CampfireTorch = { app::EntityType__Enum_1::Gadget, "_FireBasin" };
|
||||
SimpleFilter DayNightSwitchingMechanism = { app::EntityType__Enum_1::Field, "_CircleConsole" };
|
||||
SimpleFilter EnkanomiyaPhaseGate = { app::EntityType__Enum_1::Gadget, "_Singularity" };
|
||||
SimpleFilter MysteriousCarvings = { app::EntityType__Enum_1::Gadget, "_ReginStatue" };
|
||||
SimpleFilter PhaseGate = { app::EntityType__Enum_1::Field, "_TeleportHighway" };
|
||||
SimpleFilter PlacesofEssenceWorship = { app::EntityType__Enum_1::Field, "_EnergySource" };
|
||||
SimpleFilter Pot = { app::EntityType__Enum_1::Gadget, "_Cooking_" };
|
||||
SimpleFilter RuinBrazier = { app::EntityType__Enum_1::Gadget, "_AncientHeatSource" };
|
||||
SimpleFilter Stormstone = { app::EntityType__Enum_1::Gadget, "_ReginLamp" };
|
||||
SimpleFilter TriangularMechanism = { app::EntityType__Enum_1::Field, "_TuningFork" };
|
||||
}
|
||||
|
||||
namespace living
|
||||
@ -60,12 +64,12 @@ namespace cheat::game::filters
|
||||
SimpleFilter ButterflyWings = { app::EntityType__Enum_1::EnvAnimal, "Butterfly" };
|
||||
SimpleFilter Crab = { app::EntityType__Enum_1::EnvAnimal, "Crab" };
|
||||
SimpleFilter CrystalCore = { app::EntityType__Enum_1::EnvAnimal, "Wisp" };
|
||||
SimpleFilter Fish = { app::EntityType__Enum_1::Monster, "Fish" };
|
||||
SimpleFilter Fish = { app::EntityType__Enum_1::EnvAnimal, "Fish" };
|
||||
SimpleFilter Frog = { app::EntityType__Enum_1::EnvAnimal, "Frog" };
|
||||
SimpleFilter LizardTail = { app::EntityType__Enum_1::EnvAnimal, "Lizard" };
|
||||
SimpleFilter LuminescentSpine = { app::EntityType__Enum_1::EnvAnimal, "FireFly" };
|
||||
SimpleFilter Onikabuto = { app::EntityType__Enum_1::GatherObject, "Electrohercules" };
|
||||
SimpleFilter Starconch = { app::EntityType__Enum_1::GatherObject, "Shell" };
|
||||
SimpleFilter Starconch = { app::EntityType__Enum_1::GatherObject, "_Shell" };
|
||||
SimpleFilter Eel = { app::EntityType__Enum_1::EnvAnimal, "Eel_" };
|
||||
SimpleFilter Inu = { app::EntityType__Enum_1::EnvAnimal, "_Inu_Shihandai" };
|
||||
SimpleFilter Boar = { app::EntityType__Enum_1::Monster, "Boar" };
|
||||
@ -103,6 +107,7 @@ namespace cheat::game::filters
|
||||
SimpleFilter ScarletQuartz = { app::EntityType__Enum_1::GatherObject, "_OreDulinsBlood" };
|
||||
SimpleFilter StarSilver = { app::EntityType__Enum_1::GatherObject, "_OreMoonMeteor" };
|
||||
SimpleFilter WhiteIronChunk = { app::EntityType__Enum_1::GatherObject, "_OreMetal" };
|
||||
SimpleFilter DunlinsTooth = { app::EntityType__Enum_1::GatherObject, "_DunlinsTooth" };
|
||||
}
|
||||
|
||||
namespace monster
|
||||
@ -137,7 +142,7 @@ namespace cheat::game::filters
|
||||
SimpleFilter Tartaglia = { app::EntityType__Enum_1::Monster, "_Tartaglia" };
|
||||
SimpleFilter Azhdaha = { app::EntityType__Enum_1::Monster, "_Dahaka" };
|
||||
SimpleFilter Signora = { app::EntityType__Enum_1::Monster, "_LaSignora" };
|
||||
SimpleFilter Shogun = { app::EntityType__Enum_1::Monster, "_Shougan" };
|
||||
SimpleFilter Shogun = { app::EntityType__Enum_1::Monster, "_Shougun" };
|
||||
SimpleFilter EyeOfTheStorm = { app::EntityType__Enum_1::Monster, "_Elemental_Wind" };
|
||||
SimpleFilter ElectroHypostasis = { app::EntityType__Enum_1::Monster, "_Effigy_Electric" };
|
||||
SimpleFilter AnemoHypostasis = { app::EntityType__Enum_1::Monster, "_Effigy_Wind" };
|
||||
@ -227,6 +232,7 @@ namespace cheat::game::filters
|
||||
WhitelistFilter CubeDevices = { std::vector<app::EntityType__Enum_1> {app::EntityType__Enum_1::Gadget, app::EntityType__Enum_1::Platform }, std::vector<std::string> {"_ElecStone", "_ElecSwitch" }};
|
||||
SimpleFilter EightStoneTablets = { app::EntityType__Enum_1::Gadget, "_HistoryBoard" };
|
||||
SimpleFilter ElectricConduction = { app::EntityType__Enum_1::Gear, "_ElectricPowerSource" };
|
||||
SimpleFilter RelayStone = { app::EntityType__Enum_1::Worktop, "_ElectricTransfer_" };
|
||||
WhitelistFilter ElectroSeelie = { std::vector<app::EntityType__Enum_1> {app::EntityType__Enum_1::Field, app::EntityType__Enum_1::Platform }, std::vector<std::string> {"_ElectricSeelie"} };
|
||||
SimpleFilter ElementalMonument = { app::EntityType__Enum_1::Gear, "_ElemTablet" };
|
||||
SimpleFilter FloatingAnemoSlime = { app::EntityType__Enum_1::Platform, "_WindSlime" };
|
||||
@ -241,6 +247,7 @@ namespace cheat::game::filters
|
||||
SimpleFilter OozingConcretions = { app::EntityType__Enum_1::Gadget, "_AbyssCoreLv" };
|
||||
SimpleFilter PirateHelm = { app::EntityType__Enum_1::Field, "_PirateHelm" };
|
||||
WhitelistFilter PressurePlate = { std::vector<app::EntityType__Enum_1> {app::EntityType__Enum_1::Field, app::EntityType__Enum_1::Gadget }, std::vector<std::string> {"Gear_Gravity", "_LitPathPlate" } };
|
||||
SimpleFilter SealLocations = { app::EntityType__Enum_1::Gadget, "_RunesKey" };
|
||||
SimpleFilter SeelieLamp = { app::EntityType__Enum_1::Field, "Gear_SeeliaLamp" };
|
||||
SimpleFilter Seelie = { app::EntityType__Enum_1::Platform, "Gear_Seelie" };
|
||||
SimpleFilter SmallRockPile = { app::EntityType__Enum_1::Gadget, "_StonePile_01" };
|
||||
@ -315,8 +322,7 @@ namespace cheat::game::filters
|
||||
living::Fox +
|
||||
living::Squirrel +
|
||||
living::Boar +
|
||||
living::Weasel +
|
||||
living::Fish
|
||||
living::Weasel
|
||||
};
|
||||
SimpleFilter AnimalPickUp = {
|
||||
living::CrystalCore +
|
||||
@ -331,7 +337,8 @@ namespace cheat::game::filters
|
||||
living::LuminescentSpine +
|
||||
living::Starconch +
|
||||
living::BirdEgg +
|
||||
living::WeaselThief
|
||||
living::WeaselThief +
|
||||
living::Fish
|
||||
};
|
||||
SimpleFilter AnimalNPC = {
|
||||
living::Dog +
|
||||
@ -342,6 +349,7 @@ namespace cheat::game::filters
|
||||
SimpleFilter Monsters = { app::EntityType__Enum_1::Monster };
|
||||
SimpleFilter MonsterCommon = {
|
||||
monster::Slime +
|
||||
monster::FloatingFungus +
|
||||
monster::Specter +
|
||||
monster::Whopperflower +
|
||||
monster::Hilichurl +
|
||||
@ -350,7 +358,10 @@ namespace cheat::game::filters
|
||||
monster::FatuiSkirmisher +
|
||||
monster::TreasureHoarder +
|
||||
monster::Nobushi +
|
||||
monster::Kairagi
|
||||
monster::Kairagi +
|
||||
monster::Millelith +
|
||||
monster::ShogunateInfantry +
|
||||
monster::SangonomiyaCohort
|
||||
};
|
||||
SimpleFilter MonsterElites = {
|
||||
monster::Mitachurl +
|
||||
@ -372,7 +383,8 @@ namespace cheat::game::filters
|
||||
monster::GeovishapHatchling +
|
||||
monster::Geovishap +
|
||||
monster::HydroBathysmalVishap +
|
||||
monster::EyeOfTheStorm
|
||||
monster::EyeOfTheStorm +
|
||||
monster::BlackSerpentKnight
|
||||
};
|
||||
SimpleFilter MonsterBosses = {
|
||||
// Adding these comments for better tracking.
|
||||
@ -391,9 +403,18 @@ namespace cheat::game::filters
|
||||
// Liyue
|
||||
monster::PyroRegisvine +
|
||||
monster::Oceanid +
|
||||
monster::OceanidBoar +
|
||||
monster::OceanidCrab +
|
||||
monster::OceanidCrane +
|
||||
monster::OceanidFalcon +
|
||||
monster::OceanidFinch +
|
||||
monster::OceanidFrog +
|
||||
monster::OceanidSquirrel +
|
||||
monster::OceanidWigeon +
|
||||
monster::GeoHypostasis +
|
||||
monster::RuinSerpent +
|
||||
monster::PrimoGeovishap +
|
||||
monster::Beisht +
|
||||
// Inazuma
|
||||
monster::PerpetualMechanicalArray +
|
||||
monster::PyroHypostasis +
|
||||
@ -401,6 +422,7 @@ namespace cheat::game::filters
|
||||
monster::ThunderManifestation +
|
||||
monster::GoldenWolflord +
|
||||
monster::HydroHypostasis +
|
||||
monster::HydroHypostasisSummon +
|
||||
monster::CryoBathysmalVishap +
|
||||
monster::ElectroBathysmalVishap
|
||||
};
|
||||
|
@ -50,11 +50,15 @@ namespace cheat::game::filters
|
||||
namespace guide
|
||||
{
|
||||
extern SimpleFilter CampfireTorch;
|
||||
extern SimpleFilter DayNightSwitchingMechanism;
|
||||
extern SimpleFilter EnkanomiyaPhaseGate;
|
||||
extern SimpleFilter MysteriousCarvings;
|
||||
extern SimpleFilter PhaseGate;
|
||||
extern SimpleFilter PlacesofEssenceWorship;
|
||||
extern SimpleFilter Pot;
|
||||
extern SimpleFilter RuinBrazier;
|
||||
extern SimpleFilter Stormstone;
|
||||
extern SimpleFilter TriangularMechanism;
|
||||
}
|
||||
|
||||
namespace living
|
||||
@ -103,6 +107,7 @@ namespace cheat::game::filters
|
||||
extern SimpleFilter ScarletQuartz;
|
||||
extern SimpleFilter StarSilver;
|
||||
extern SimpleFilter WhiteIronChunk;
|
||||
extern SimpleFilter DunlinsTooth;
|
||||
}
|
||||
|
||||
namespace monster
|
||||
@ -223,9 +228,10 @@ namespace cheat::game::filters
|
||||
extern SimpleFilter BakeDanuki;
|
||||
extern SimpleFilter BloattyFloatty;
|
||||
extern WhitelistFilter CubeDevices;
|
||||
|
||||
|
||||
extern SimpleFilter EightStoneTablets;
|
||||
extern SimpleFilter ElectricConduction;
|
||||
extern SimpleFilter RelayStone;
|
||||
extern WhitelistFilter ElectroSeelie;
|
||||
extern SimpleFilter ElementalMonument;
|
||||
extern SimpleFilter FloatingAnemoSlime;
|
||||
@ -240,6 +246,7 @@ namespace cheat::game::filters
|
||||
extern SimpleFilter OozingConcretions;
|
||||
extern SimpleFilter PirateHelm;
|
||||
extern WhitelistFilter PressurePlate;
|
||||
extern SimpleFilter SealLocations;
|
||||
extern SimpleFilter SeelieLamp;
|
||||
extern SimpleFilter Seelie;
|
||||
extern SimpleFilter SmallRockPile;
|
||||
|
@ -1544,13 +1544,14 @@ namespace cheat::feature
|
||||
|
||||
static ImCircle GetMinimapCircle()
|
||||
{
|
||||
static app::Rect mapRect = {};
|
||||
if (_monoMiniMap == nullptr)
|
||||
return {};
|
||||
|
||||
UPDATE_DELAY_VAR(ImCircle, _miniMapCircle, 2000);
|
||||
|
||||
auto uiManager = GET_SINGLETON(MoleMole_UIManager);
|
||||
if (uiManager == nullptr || uiManager->fields._sceneCanvas == nullptr)
|
||||
if (uiManager == nullptr || uiManager->fields._sceneCanvas == nullptr || uiManager->fields._uiCamera == nullptr)
|
||||
return {};
|
||||
|
||||
auto back = _monoMiniMap->fields._grpMapBack;
|
||||
@ -1560,13 +1561,16 @@ namespace cheat::feature
|
||||
auto mapPos = app::Transform_get_position(reinterpret_cast<app::Transform*>(back), nullptr);
|
||||
auto center = app::Camera_WorldToScreenPoint(uiManager->fields._uiCamera, mapPos, nullptr);
|
||||
center.y = app::Screen_get_height(nullptr) - center.y;
|
||||
|
||||
if (mapRect.m_Width == 0)
|
||||
mapRect = app::RectTransform_get_rect(back, nullptr);
|
||||
|
||||
auto mapRect = app::RectTransform_get_rect(back, nullptr);
|
||||
float scaleFactor = app::Canvas_get_scaleFactor(uiManager->fields._sceneCanvas, nullptr);
|
||||
_miniMapCircle = {
|
||||
ImVec2(center.x, center.y),
|
||||
(mapRect.m_Width * scaleFactor) / 2
|
||||
};
|
||||
if (scaleFactor != 0)
|
||||
_miniMapCircle = {
|
||||
ImVec2(center.x, center.y),
|
||||
(mapRect.m_Width * scaleFactor) / 2
|
||||
};
|
||||
|
||||
return _miniMapCircle;
|
||||
}
|
||||
|
@ -8,13 +8,17 @@ namespace cheat::feature
|
||||
{
|
||||
static bool Miscs_CheckTargetAttackable_Hook(app::BaseEntity* attacker, app::BaseEntity* target, MethodInfo* method);
|
||||
static void VCHumanoidMove_NotifyLandVelocity_Hook(app::VCHumanoidMove* __this, app::Vector3 velocity, float reachMaxDownVelocityTime, MethodInfo* method);
|
||||
static void LCBaseCombat_FireBeingHitEvent_Hook(app::LCBaseCombat* __this, uint32_t attackeeRuntimeID, app::AttackResult* attackResult, MethodInfo* method);
|
||||
static bool MoleMole_ActorAbilityPlugin_HanlderModifierThinkTimerUp_Hook(app::ActorAbilityPlugin* __this, float delay, app::Object* arg, MethodInfo* method);
|
||||
|
||||
GodMode::GodMode() : Feature(),
|
||||
NFEX(f_Enabled, "God mode", "m_GodMode", "Player", false, false)
|
||||
NFEX(f_Enabled, "God mode", "m_GodMode", "Player", false, false),
|
||||
NF(f_AltGodMode, "Alternative God Mode", "Player", false)
|
||||
{
|
||||
// HookManager::install(app::MoleMole_LCBaseCombat_FireBeingHitEvent, LCBaseCombat_FireBeingHitEvent_Hook);
|
||||
HookManager::install(app::VCHumanoidMove_NotifyLandVelocity, VCHumanoidMove_NotifyLandVelocity_Hook);
|
||||
HookManager::install(app::Miscs_CheckTargetAttackable, Miscs_CheckTargetAttackable_Hook);
|
||||
HookManager::install(app::MoleMole_LCBaseCombat_FireBeingHitEvent, LCBaseCombat_FireBeingHitEvent_Hook);
|
||||
HookManager::install(app::MoleMole_ActorAbilityPlugin_HanlderModifierThinkTimerUp, MoleMole_ActorAbilityPlugin_HanlderModifierThinkTimerUp_Hook);
|
||||
}
|
||||
|
||||
const FeatureGUIInfo& GodMode::GetGUIInfo() const
|
||||
@ -28,16 +32,21 @@ namespace cheat::feature
|
||||
ConfigWidget("God Mode", f_Enabled,
|
||||
"Enables god mode, i.e. no incoming damage.\n" \
|
||||
"May not work with some types of damage.");
|
||||
ImGui::Indent();
|
||||
ConfigWidget("Alternative God Mode", f_AltGodMode,
|
||||
"Alternative god mode that ignores incoming damage\n" \
|
||||
"including environmental damage.");
|
||||
ImGui::Unindent();
|
||||
}
|
||||
|
||||
bool GodMode::NeedStatusDraw() const
|
||||
{
|
||||
return f_Enabled;
|
||||
{
|
||||
return f_Enabled || f_AltGodMode;
|
||||
}
|
||||
|
||||
void GodMode::DrawStatus()
|
||||
{
|
||||
ImGui::Text("God Mode");
|
||||
ImGui::Text("God Mode%s", f_AltGodMode ? "+Alt " : " ");
|
||||
}
|
||||
|
||||
GodMode& GodMode::GetInstance()
|
||||
@ -64,7 +73,7 @@ namespace cheat::feature
|
||||
static void VCHumanoidMove_NotifyLandVelocity_Hook(app::VCHumanoidMove* __this, app::Vector3 velocity, float reachMaxDownVelocityTime, MethodInfo* method)
|
||||
{
|
||||
auto& gm = GodMode::GetInstance();
|
||||
if (gm.f_Enabled && -velocity.y > 13)
|
||||
if ((gm.f_Enabled || gm.f_AltGodMode) && -velocity.y > 13)
|
||||
{
|
||||
float randAdd = (float)(std::rand() % 1000) / 1000;
|
||||
velocity.y = -8 - randAdd;
|
||||
@ -75,13 +84,24 @@ namespace cheat::feature
|
||||
}
|
||||
|
||||
// Analog function for disable attack damage (Thanks to Taiga74164)
|
||||
//void LCBaseCombat_FireBeingHitEvent_Hook(app::LCBaseCombat* __this, uint32_t attackeeRuntimeID, app::AttackResult* attackResult, MethodInfo* method)
|
||||
//{
|
||||
// auto avatarEntity = GetAvatarEntity();
|
||||
// if (avatarEntity != nullptr && Config::cfgGodModEnable.GetValue() && avatarEntity->fields._runtimeID_k__BackingField == attackeeRuntimeID)
|
||||
// return;
|
||||
//
|
||||
// return callOrigin(LCBaseCombat_FireBeingHitEvent_Hook, __this, attackeeRuntimeID, attackResult, method);
|
||||
//}
|
||||
static void LCBaseCombat_FireBeingHitEvent_Hook(app::LCBaseCombat* __this, uint32_t attackeeRuntimeID, app::AttackResult* attackResult, MethodInfo* method)
|
||||
{
|
||||
auto& gm = GodMode::GetInstance();
|
||||
auto& manager = game::EntityManager::instance();
|
||||
if (gm.f_AltGodMode && manager.avatar()->runtimeID() == attackeeRuntimeID)
|
||||
return;
|
||||
|
||||
CALL_ORIGIN(LCBaseCombat_FireBeingHitEvent_Hook, __this, attackeeRuntimeID, attackResult, method);
|
||||
}
|
||||
|
||||
// Environmental damage immunity (Thanks to RELOADED#7236 / GitHub: @34736384)
|
||||
static bool MoleMole_ActorAbilityPlugin_HanlderModifierThinkTimerUp_Hook(app::ActorAbilityPlugin* __this, float delay, app::Object* arg, MethodInfo* method)
|
||||
{
|
||||
auto& gm = GodMode::GetInstance();
|
||||
if (gm.f_AltGodMode/* || gm.f_Enabled*/)
|
||||
return FALSE;
|
||||
|
||||
return CALL_ORIGIN(MoleMole_ActorAbilityPlugin_HanlderModifierThinkTimerUp_Hook, __this, delay, arg, method);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,7 @@ namespace cheat::feature
|
||||
{
|
||||
public:
|
||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||
config::Field<config::Toggle<Hotkey>> f_AltGodMode;
|
||||
|
||||
static GodMode& GetInstance();
|
||||
|
||||
|
@ -183,6 +183,17 @@ namespace cheat::feature
|
||||
return attackerID == avatarID || IsAvatarOwner(attacker);
|
||||
}
|
||||
|
||||
bool IsValidByFilter(game::Entity* entity)
|
||||
{
|
||||
if (game::filters::combined::OrganicTargets.IsValid(entity) ||
|
||||
game::filters::combined::Ores.IsValid(entity) ||
|
||||
game::filters::puzzle::Geogranum.IsValid(entity) ||
|
||||
game::filters::puzzle::LargeRockPile.IsValid(entity) ||
|
||||
game::filters::puzzle::SmallRockPile.IsValid(entity))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Raises when any entity do hit event.
|
||||
// Just recall attack few times (regulating by combatProp)
|
||||
// It's not tested well, so, I think, anticheat can detect it.
|
||||
@ -196,24 +207,30 @@ namespace cheat::feature
|
||||
|
||||
auto& manager = game::EntityManager::instance();
|
||||
auto originalTarget = manager.entity(targetID);
|
||||
if (!game::filters::combined::OrganicTargets.IsValid(originalTarget))
|
||||
if (!IsValidByFilter(originalTarget))
|
||||
return CALL_ORIGIN(LCBaseCombat_DoHitEntity_Hook, __this, targetID, attackResult, ignoreCheckCanBeHitInMP, method);
|
||||
|
||||
std::vector<cheat::game::Entity*> validEntities;
|
||||
validEntities.push_back(originalTarget);
|
||||
|
||||
|
||||
if (rapidFire.f_MultiTarget)
|
||||
{
|
||||
auto filteredEntities = manager.entities(game::filters::combined::Monsters);
|
||||
auto filteredEntities = manager.entities();
|
||||
for (const auto& entity : filteredEntities) {
|
||||
auto distance = originalTarget->distance(entity);
|
||||
|
||||
if (entity->runtimeID() == manager.avatar()->runtimeID())
|
||||
continue;
|
||||
|
||||
if (entity->runtimeID() == targetID)
|
||||
continue;
|
||||
|
||||
if (distance > rapidFire.f_MultiTargetRadius)
|
||||
continue;
|
||||
|
||||
if (!IsValidByFilter(entity))
|
||||
continue;
|
||||
|
||||
validEntities.push_back(entity);
|
||||
}
|
||||
}
|
||||
|
100
cheat-library/src/user/cheat/visuals/Browser.cpp
Normal file
100
cheat-library/src/user/cheat/visuals/Browser.cpp
Normal file
@ -0,0 +1,100 @@
|
||||
#include "pch-il2cpp.h"
|
||||
#include "Browser.h"
|
||||
|
||||
#include <helpers.h>
|
||||
#include <cheat/events.h>
|
||||
#include <misc/cpp/imgui_stdlib.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
app::GameObject* planeObject = nullptr;
|
||||
app::Component_1* BrowserComponents = nullptr;
|
||||
static std::string f_URL;
|
||||
|
||||
Browser::Browser() : Feature(),
|
||||
NFEX(f_Enabled, "Browser", "Browser", "Visuals", false, false),
|
||||
toBeUpdate(), nextUpdate(0)
|
||||
{
|
||||
events::GameUpdateEvent += MY_METHOD_HANDLER(Browser::OnGameUpdate);
|
||||
}
|
||||
|
||||
const FeatureGUIInfo& Browser::GetGUIInfo() const
|
||||
{
|
||||
static const FeatureGUIInfo info{ "Browser", "Visuals", false };
|
||||
return info;
|
||||
}
|
||||
|
||||
void Browser::DrawMain()
|
||||
{
|
||||
ConfigWidget(f_Enabled, "Create in-game Browser");
|
||||
ImGui::InputText("URL", &f_URL);
|
||||
}
|
||||
|
||||
bool Browser::NeedStatusDraw() const
|
||||
{
|
||||
return f_Enabled;
|
||||
}
|
||||
|
||||
void Browser::DrawStatus()
|
||||
{
|
||||
ImGui::Text("Browser");
|
||||
}
|
||||
|
||||
Browser& Browser::GetInstance()
|
||||
{
|
||||
static Browser instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
void Browser::OnGameUpdate()
|
||||
{
|
||||
auto currentTime = util::GetCurrentTimeMillisec();
|
||||
if (currentTime < nextUpdate)
|
||||
return;
|
||||
|
||||
if (f_Enabled) {
|
||||
auto entityRoot = app::GameObject_Find(string_to_il2cppi("EntityRoot/AvatarRoot/"), nullptr);
|
||||
if (!app::GameObject_get_active(entityRoot, nullptr))
|
||||
return;
|
||||
|
||||
if (planeObject == nullptr) {
|
||||
auto PrimitiveType = app::PrimitiveType__Enum::Plane;
|
||||
planeObject = app::GameObject_CreatePrimitive(PrimitiveType, nullptr);
|
||||
|
||||
app::Transform* planeObject_Transform = app::GameObject_get_transform(planeObject, nullptr);
|
||||
app::Quaternion planeObject_Transform_Quaternion = { 0.5, 0.5, -0.5, 0.5 };
|
||||
|
||||
auto avatarPos = app::ActorUtils_GetAvatarPos(nullptr);
|
||||
auto relativePos = app::WorldShiftManager_GetRelativePosition(avatarPos, nullptr);
|
||||
app::Vector3 planeObject_Transform_Vector3 = { relativePos.x, relativePos.y + 3, relativePos.z };
|
||||
app::Vector3 planeObject_Transform_Scale = { 1, 1, 1 };
|
||||
|
||||
app::Transform_set_localPosition(planeObject_Transform, planeObject_Transform_Vector3, nullptr);
|
||||
app::Transform_set_localScale(planeObject_Transform, planeObject_Transform_Scale, nullptr);
|
||||
app::Transform_set_localRotation(planeObject_Transform, planeObject_Transform_Quaternion, nullptr);
|
||||
}
|
||||
|
||||
if (planeObject != nullptr) {
|
||||
if (BrowserComponents == nullptr) {
|
||||
std::string custom_url = f_URL.length() < 2 || f_URL.c_str() == "" ? "https://www.google.com/" : f_URL.c_str();
|
||||
|
||||
BrowserComponents = app::GameObject_AddComponentInternal(planeObject, string_to_il2cppi("Browser"), nullptr);
|
||||
reinterpret_cast<app::Browser*>(BrowserComponents)->fields._url = string_to_il2cppi(custom_url);
|
||||
reinterpret_cast<app::Browser*>(BrowserComponents)->fields._width = 1920;
|
||||
reinterpret_cast<app::Browser*>(BrowserComponents)->fields._height = 1080;
|
||||
reinterpret_cast<app::Browser*>(BrowserComponents)->fields.forceNextRender = true;
|
||||
reinterpret_cast<app::Browser*>(BrowserComponents)->fields._EnableInput_k__BackingField = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (planeObject != nullptr && BrowserComponents != nullptr) {
|
||||
app::Object_1_DestroyImmediate_1(reinterpret_cast<app::Object_1*>(planeObject), nullptr);
|
||||
app::Object_1_DestroyImmediate_1(reinterpret_cast<app::Object_1*>(BrowserComponents), nullptr);
|
||||
planeObject = nullptr;
|
||||
BrowserComponents = nullptr;
|
||||
}
|
||||
}
|
||||
nextUpdate = currentTime + (int)f_DelayUpdate;
|
||||
}
|
||||
}
|
26
cheat-library/src/user/cheat/visuals/Browser.h
Normal file
26
cheat-library/src/user/cheat/visuals/Browser.h
Normal file
@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
#include <cheat-base/cheat/Feature.h>
|
||||
#include <cheat-base/config/config.h>
|
||||
#include <cheat-base/thread-safe.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
class Browser : public Feature
|
||||
{
|
||||
public:
|
||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||
|
||||
static Browser& GetInstance();
|
||||
const FeatureGUIInfo& GetGUIInfo() const override;
|
||||
void DrawMain() override;
|
||||
virtual bool NeedStatusDraw() const override;
|
||||
void DrawStatus() override;
|
||||
|
||||
private:
|
||||
SafeQueue<uint32_t> toBeUpdate;
|
||||
SafeValue<int64_t> nextUpdate;
|
||||
int f_DelayUpdate = 20.f;
|
||||
void OnGameUpdate();
|
||||
Browser();
|
||||
};
|
||||
}
|
@ -9,8 +9,8 @@ namespace cheat::feature
|
||||
static void SCameraModuleInitialize_SetWarningLocateRatio_Hook(app::SCameraModuleInitialize* __this, double deltaTime, app::CameraShareData* data, MethodInfo* method);
|
||||
|
||||
CameraZoom::CameraZoom() : Feature(),
|
||||
NFEX(f_Enabled, "Camera Zoom", "CameraZoom", "Visuals", false, false),
|
||||
NF(f_Zoom, "Zoom", "CameraZoom", 200)
|
||||
NF(f_Enabled, "Camera Zoom", "Visuals::CameraZoom", false),
|
||||
NF(f_Zoom, "Zoom", "Visuals::CameraZoom", 200)
|
||||
{
|
||||
HookManager::install(app::MoleMole_SCameraModuleInitialize_SetWarningLocateRatio, SCameraModuleInitialize_SetWarningLocateRatio_Hook);
|
||||
}
|
||||
|
52
cheat-library/src/user/cheat/visuals/EnablePeaking.cpp
Normal file
52
cheat-library/src/user/cheat/visuals/EnablePeaking.cpp
Normal file
@ -0,0 +1,52 @@
|
||||
#include "pch-il2cpp.h"
|
||||
#include "EnablePeaking.h"
|
||||
|
||||
#include <helpers.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
static void MoleMole_VCBaseSetDitherValue_set_ManagerDitherAlphaValue_Hook(app::MoleMole_VCBaseSetDitherValue* __this, float value, MethodInfo* method);
|
||||
|
||||
EnablePeaking::EnablePeaking() : Feature(),
|
||||
NF(f_Enabled, "Enable Peaking", "Visuals::EnablePeaking", false)
|
||||
{
|
||||
HookManager::install(app::MoleMole_VCBaseSetDitherValue_set_ManagerDitherAlphaValue, MoleMole_VCBaseSetDitherValue_set_ManagerDitherAlphaValue_Hook);
|
||||
}
|
||||
|
||||
const FeatureGUIInfo& EnablePeaking::GetGUIInfo() const
|
||||
{
|
||||
static const FeatureGUIInfo info{ "EnablePeaking", "Visuals", false };
|
||||
return info;
|
||||
}
|
||||
|
||||
void EnablePeaking::DrawMain()
|
||||
{
|
||||
ConfigWidget(f_Enabled, ";)");
|
||||
}
|
||||
|
||||
bool EnablePeaking::NeedStatusDraw() const
|
||||
{
|
||||
return f_Enabled;
|
||||
}
|
||||
|
||||
void EnablePeaking::DrawStatus()
|
||||
{
|
||||
ImGui::Text("Enable Peaking");
|
||||
}
|
||||
|
||||
EnablePeaking& EnablePeaking::GetInstance()
|
||||
{
|
||||
static EnablePeaking instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
static void MoleMole_VCBaseSetDitherValue_set_ManagerDitherAlphaValue_Hook(app::MoleMole_VCBaseSetDitherValue* __this, float value, MethodInfo* method)
|
||||
{
|
||||
EnablePeaking& EnablePeaking = EnablePeaking::GetInstance();
|
||||
if (EnablePeaking.f_Enabled)
|
||||
value = 1;
|
||||
|
||||
CALL_ORIGIN(MoleMole_VCBaseSetDitherValue_set_ManagerDitherAlphaValue_Hook, __this, value, method);
|
||||
}
|
||||
}
|
||||
|
25
cheat-library/src/user/cheat/visuals/EnablePeaking.h
Normal file
25
cheat-library/src/user/cheat/visuals/EnablePeaking.h
Normal file
@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
#include <cheat-base/cheat/Feature.h>
|
||||
#include <cheat-base/config/config.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
|
||||
class EnablePeaking : public Feature
|
||||
{
|
||||
public:
|
||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||
|
||||
static EnablePeaking& GetInstance();
|
||||
|
||||
const FeatureGUIInfo& GetGUIInfo() const override;
|
||||
void DrawMain() override;
|
||||
|
||||
virtual bool NeedStatusDraw() const override;
|
||||
void DrawStatus() override;
|
||||
|
||||
private:
|
||||
EnablePeaking();
|
||||
};
|
||||
}
|
||||
|
61
cheat-library/src/user/cheat/visuals/HideUI.cpp
Normal file
61
cheat-library/src/user/cheat/visuals/HideUI.cpp
Normal file
@ -0,0 +1,61 @@
|
||||
#include "pch-il2cpp.h"
|
||||
#include "HideUI.h"
|
||||
|
||||
#include <helpers.h>
|
||||
#include <cheat/events.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
app::GameObject* ui_camera{};
|
||||
|
||||
HideUI::HideUI() : Feature(),
|
||||
NFEX(f_Enabled, "Hide UI", "HideUI", "Visuals", false, false)
|
||||
{
|
||||
events::GameUpdateEvent += MY_METHOD_HANDLER(HideUI::OnGameUpdate);
|
||||
}
|
||||
|
||||
const FeatureGUIInfo& HideUI::GetGUIInfo() const
|
||||
{
|
||||
static const FeatureGUIInfo info{ "HideUI", "Visuals", false };
|
||||
return info;
|
||||
}
|
||||
|
||||
void HideUI::DrawMain()
|
||||
{
|
||||
ConfigWidget(f_Enabled, "Hide in-game UI.");
|
||||
}
|
||||
|
||||
bool HideUI::NeedStatusDraw() const
|
||||
{
|
||||
return f_Enabled;
|
||||
}
|
||||
|
||||
void HideUI::DrawStatus()
|
||||
{
|
||||
ImGui::Text("HideUI");
|
||||
}
|
||||
|
||||
HideUI& HideUI::GetInstance()
|
||||
{
|
||||
static HideUI instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
void HideUI::OnGameUpdate()
|
||||
{
|
||||
if (f_Enabled)
|
||||
{
|
||||
if (ui_camera == nullptr)
|
||||
ui_camera = app::GameObject_Find(string_to_il2cppi("/UICamera"), nullptr);
|
||||
|
||||
|
||||
if (ui_camera)
|
||||
app::GameObject_SetActive(ui_camera, false, nullptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ui_camera)
|
||||
app::GameObject_SetActive(ui_camera, true, nullptr);
|
||||
}
|
||||
}
|
||||
}
|
26
cheat-library/src/user/cheat/visuals/HideUI.h
Normal file
26
cheat-library/src/user/cheat/visuals/HideUI.h
Normal file
@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
#include <cheat-base/cheat/Feature.h>
|
||||
#include <cheat-base/config/config.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
|
||||
class HideUI : public Feature
|
||||
{
|
||||
public:
|
||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||
|
||||
static HideUI& GetInstance();
|
||||
|
||||
const FeatureGUIInfo& GetGUIInfo() const override;
|
||||
void DrawMain() override;
|
||||
|
||||
virtual bool NeedStatusDraw() const override;
|
||||
void DrawStatus() override;
|
||||
void OnGameUpdate();
|
||||
|
||||
private:
|
||||
HideUI();
|
||||
};
|
||||
}
|
||||
|
78
cheat-library/src/user/cheat/visuals/PaimonFollow.cpp
Normal file
78
cheat-library/src/user/cheat/visuals/PaimonFollow.cpp
Normal file
@ -0,0 +1,78 @@
|
||||
#include "pch-il2cpp.h"
|
||||
#include "PaimonFollow.h"
|
||||
#include <helpers.h>
|
||||
#include <cheat/events.h>
|
||||
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
namespace GameObject {
|
||||
app::GameObject* Paimon = nullptr;
|
||||
app::GameObject* ProfileLayer = nullptr;
|
||||
}
|
||||
|
||||
PaimonFollow::PaimonFollow() : Feature(),
|
||||
NFEX(f_Enabled, "Paimon Follow", "PaimonFollow", "Visuals", false, false),
|
||||
toBeUpdate(), nextUpdate(0)
|
||||
{
|
||||
events::GameUpdateEvent += MY_METHOD_HANDLER(PaimonFollow::OnGameUpdate);
|
||||
}
|
||||
|
||||
const FeatureGUIInfo& PaimonFollow::GetGUIInfo() const
|
||||
{
|
||||
static const FeatureGUIInfo info{ "PaimonFollow", "Visuals", true };
|
||||
return info;
|
||||
}
|
||||
|
||||
void PaimonFollow::DrawMain()
|
||||
{
|
||||
ConfigWidget(f_Enabled, "To display paimon, turn on the function, open the profile (esc) and close it. \n" \
|
||||
"If the paimon disappeared after teleportation, do not disable the function, open and close the profile.");
|
||||
}
|
||||
|
||||
bool PaimonFollow::NeedStatusDraw() const
|
||||
{
|
||||
return f_Enabled;
|
||||
}
|
||||
|
||||
void PaimonFollow::DrawStatus()
|
||||
{
|
||||
ImGui::Text("Paimon Follow");
|
||||
}
|
||||
|
||||
PaimonFollow& PaimonFollow::GetInstance()
|
||||
{
|
||||
static PaimonFollow instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
void PaimonFollow::OnGameUpdate()
|
||||
{
|
||||
if (!f_Enabled)
|
||||
return;
|
||||
|
||||
auto currentTime = util::GetCurrentTimeMillisec();
|
||||
if (currentTime < nextUpdate)
|
||||
return;
|
||||
|
||||
if (GameObject::Paimon == nullptr) {
|
||||
GameObject::Paimon = app::GameObject_Find(string_to_il2cppi("/EntityRoot/OtherGadgetRoot/NPC_Guide_Paimon(Clone)"), nullptr);
|
||||
}
|
||||
|
||||
if (GameObject::ProfileLayer == nullptr) {
|
||||
GameObject::ProfileLayer = app::GameObject_Find(string_to_il2cppi("/Canvas/Pages/PlayerProfilePage"), nullptr);
|
||||
}
|
||||
|
||||
if (GameObject::Paimon != nullptr && GameObject::ProfileLayer != nullptr) {
|
||||
auto ProfileOpen = app::GameObject_get_active(GameObject::ProfileLayer, nullptr);
|
||||
|
||||
if (ProfileOpen) {
|
||||
app::GameObject_set_active(GameObject::Paimon, false, nullptr);
|
||||
}
|
||||
else {
|
||||
app::GameObject_set_active(GameObject::Paimon, true, nullptr);
|
||||
}
|
||||
}
|
||||
nextUpdate = currentTime + (int)f_DelayUpdate;
|
||||
}
|
||||
}
|
26
cheat-library/src/user/cheat/visuals/PaimonFollow.h
Normal file
26
cheat-library/src/user/cheat/visuals/PaimonFollow.h
Normal file
@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
#include <cheat-base/cheat/Feature.h>
|
||||
#include <cheat-base/config/config.h>
|
||||
#include <cheat-base/thread-safe.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
class PaimonFollow : public Feature
|
||||
{
|
||||
public:
|
||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||
static PaimonFollow& GetInstance();
|
||||
const FeatureGUIInfo& GetGUIInfo() const override;
|
||||
void DrawMain() override;
|
||||
|
||||
virtual bool NeedStatusDraw() const override;
|
||||
void DrawStatus() override;
|
||||
private:
|
||||
SafeQueue<uint32_t> toBeUpdate;
|
||||
SafeValue<int64_t> nextUpdate;
|
||||
int f_DelayUpdate = 100.f;
|
||||
|
||||
void OnGameUpdate();
|
||||
PaimonFollow();
|
||||
};
|
||||
}
|
244
cheat-library/src/user/cheat/visuals/ProfileChanger.cpp
Normal file
244
cheat-library/src/user/cheat/visuals/ProfileChanger.cpp
Normal file
@ -0,0 +1,244 @@
|
||||
#include "pch-il2cpp.h"
|
||||
#include "ProfileChanger.h"
|
||||
|
||||
#include <helpers.h>
|
||||
#include <cheat/events.h>
|
||||
#include <misc/cpp/imgui_stdlib.h>
|
||||
#include <fstream>
|
||||
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
namespace GameObject {
|
||||
app::GameObject* WaterMark = nullptr;
|
||||
}
|
||||
|
||||
namespace Components {
|
||||
app::Component_1* WaterMark = nullptr;
|
||||
|
||||
app::Texture2D* CardTexture = nullptr;
|
||||
app::Texture2D* AvatarTexture = nullptr;
|
||||
app::Sprite* CardSprite = nullptr;
|
||||
app::Sprite* AvatarSprite = nullptr;
|
||||
app::Rect RectCard;
|
||||
app::Rect RectAvatar;
|
||||
}
|
||||
|
||||
// Profile Page
|
||||
app::Button_1* ProfilePage(app::MonoInLevelPlayerProfilePage* __this, MethodInfo* method);
|
||||
|
||||
// Edit Player Info Page
|
||||
static void ProfileEditPage(app::MonoFriendInformationDialog* __this, app::Sprite* value, MethodInfo* method);
|
||||
|
||||
ProfileChanger::ProfileChanger() : Feature(),
|
||||
NF(f_Enabled, "Custom Profile", "Visuals::ProfileChanger", false),
|
||||
NF(f_UID, "UID", "Visuals::ProfileChanger", false),
|
||||
NF(f_NickName, "NickName", "Visuals::ProfileChanger", false),
|
||||
NF(f_Level, "Level", "Visuals::ProfileChanger", false),
|
||||
NF(f_Exp, "Exp", "Visuals::ProfileChanger", false),
|
||||
NF(f_CurExp, "CurExp", "Visuals::ProfileChanger", 1),
|
||||
NF(f_MaxExp, "MaxExp", "Visuals::ProfileChanger", 1),
|
||||
NF(f_ExpBar, "ExpBar", "Visuals::ProfileChanger", false),
|
||||
NF(f_ExpBarValue, "ExpBarValue", "Visuals::ProfileChanger", 20.0f),
|
||||
NF(f_WorldLevel, "WorldLevel", "Visuals::ProfileChanger", false),
|
||||
NF(f_Avatar, "AvatarImage", "Visuals::ProfileChanger", false),
|
||||
NF(f_Card, "CardImage", "Visuals::ProfileChanger", false),
|
||||
toBeUpdate(), nextUpdate(0)
|
||||
{
|
||||
HookManager::install(app::ProfilePage, ProfilePage);
|
||||
HookManager::install(app::ProfileEditPage, ProfileEditPage);
|
||||
events::GameUpdateEvent += MY_METHOD_HANDLER(ProfileChanger::OnGameUpdate);
|
||||
}
|
||||
|
||||
const FeatureGUIInfo& ProfileChanger::GetGUIInfo() const
|
||||
{
|
||||
static const FeatureGUIInfo info{ "CustomProfile", "Visuals", true };
|
||||
return info;
|
||||
}
|
||||
|
||||
void ProfileChanger::DrawMain()
|
||||
{
|
||||
ConfigWidget(f_Enabled, "Custom Profile.");
|
||||
ConfigWidget(f_UID, "Changes the uid visually.");
|
||||
ConfigWidget(f_NickName, "Changes the nickname visually.");
|
||||
ConfigWidget(f_Level, "Changes the level visually.");
|
||||
ConfigWidget(f_Exp, "Changes the exp visually.");
|
||||
if (f_Exp) {
|
||||
ConfigWidget("CurExp", f_CurExp, 1, 2, 100000, "Changes the ExpBar visually.");
|
||||
ConfigWidget("MaxExp", f_MaxExp, 1, 2, 100000, "Changes the ExpBar visually.");
|
||||
ConfigWidget(f_ExpBar, "Changes the ExpBar visually.");
|
||||
if (f_ExpBar)
|
||||
ConfigWidget("ExpBarValue", f_ExpBarValue, 1, 2, 100, "Changes the ExpBar visually.");
|
||||
}
|
||||
ConfigWidget(f_WorldLevel, "Changes the world-level visually.");
|
||||
ConfigWidget(f_Avatar, "Changes the Avatar Image visually.\n" \
|
||||
"Note the size of the picture must be: 256x256.\n" \
|
||||
"Example path: C:\\Avatars.png");
|
||||
|
||||
ConfigWidget(f_Card, "Changes the Card visually.\n" \
|
||||
"Note the size of the picture must be: 840x400.\n" \
|
||||
"Example path: C:\\Avatars.png");
|
||||
}
|
||||
|
||||
bool ProfileChanger::NeedStatusDraw() const
|
||||
{
|
||||
return f_Enabled;
|
||||
}
|
||||
|
||||
void ProfileChanger::DrawStatus()
|
||||
{
|
||||
ImGui::Text("Custom Profile");
|
||||
}
|
||||
|
||||
ProfileChanger& ProfileChanger::GetInstance()
|
||||
{
|
||||
static ProfileChanger instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
void ProfileChanger::OnGameUpdate()
|
||||
{
|
||||
if (!f_Enabled || !f_UID)
|
||||
return;
|
||||
|
||||
auto currentTime = util::GetCurrentTimeMillisec();
|
||||
if (currentTime < nextUpdate)
|
||||
return;
|
||||
|
||||
if (f_UID) {
|
||||
if (GameObject::WaterMark == nullptr)
|
||||
GameObject::WaterMark = app::GameObject_Find(string_to_il2cppi("/BetaWatermarkCanvas(Clone)/Panel/TxtUID"), nullptr);
|
||||
|
||||
if (GameObject::WaterMark != nullptr && Components::WaterMark == nullptr)
|
||||
Components::WaterMark = app::GameObject_GetComponentByName(GameObject::WaterMark, string_to_il2cppi("Text"), nullptr);
|
||||
|
||||
if (Components::WaterMark != nullptr)
|
||||
app::Text_set_text(reinterpret_cast<app::Text*>(Components::WaterMark), string_to_il2cppi(f_UID), nullptr);
|
||||
}
|
||||
|
||||
nextUpdate = currentTime + (int)f_DelayUpdate;
|
||||
}
|
||||
|
||||
bool ProfileChanger::CheckFile(const std::string& Filename) {
|
||||
struct stat buffer;
|
||||
return (stat(Filename.c_str(), &buffer) == 0);
|
||||
}
|
||||
|
||||
app::Button_1* ProfilePage(app::MonoInLevelPlayerProfilePage* __this, MethodInfo* method)
|
||||
{
|
||||
auto& profile = ProfileChanger::GetInstance();
|
||||
|
||||
if (profile.f_Enabled) {
|
||||
|
||||
if (profile.f_UID)
|
||||
app::Text_set_text(__this->fields._playerID, string_to_il2cppi(profile.f_UID), nullptr);
|
||||
|
||||
if (profile.f_Level)
|
||||
app::Text_set_text(__this->fields._playerLv, string_to_il2cppi(profile.f_Level), nullptr);
|
||||
|
||||
if (profile.f_Exp) {
|
||||
std::string CurExpStr = std::to_string(profile.f_CurExp);
|
||||
std::string MaxExpStr = std::to_string(profile.f_MaxExp);
|
||||
app::Text_set_text(__this->fields._playerExp, string_to_il2cppi(CurExpStr + "/" + MaxExpStr), nullptr);
|
||||
|
||||
if (profile.f_ExpBar)
|
||||
{
|
||||
app::Slider_1_set_minValue(__this->fields._playerExpSlider, 1, nullptr);
|
||||
app::Slider_1_set_maxValue(__this->fields._playerExpSlider, 100, nullptr);
|
||||
app::Slider_1_set_value(__this->fields._playerExpSlider, profile.f_ExpBarValue, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
if (profile.f_WorldLevel)
|
||||
app::Text_set_text(__this->fields._playerWorldLv, string_to_il2cppi(profile.f_WorldLevel), nullptr);
|
||||
|
||||
if (profile.f_NickName){
|
||||
auto playerModule = GET_SINGLETON(MoleMole_PlayerModule);
|
||||
if (playerModule != nullptr && playerModule->fields._accountData_k__BackingField != nullptr) {
|
||||
auto& accountData = playerModule->fields._accountData_k__BackingField->fields;
|
||||
accountData.nickName = string_to_il2cppi(profile.f_NickName);
|
||||
}
|
||||
}
|
||||
|
||||
// Card Name png size 840x400
|
||||
if (profile.f_Card){
|
||||
if (profile.CheckFile(profile.f_Card)) {
|
||||
Components::CardTexture = app::NativeGallery_LoadImageAtPath(string_to_il2cppi(profile.f_Card), 100, false, false, false, nullptr);
|
||||
// If you don't do this check, then the UI will break after teleportation, I'm just too lazy to set up Rect manually
|
||||
if (Components::RectCard.m_Width == 0)
|
||||
Components::RectCard = app::Sprite_get_rect(__this->fields._nameCardPic->fields.m_Sprite, nullptr);
|
||||
app::Vector2 Vec2 = { 100, 100 };
|
||||
Components::CardSprite = app::Sprite_Create(Components::CardTexture, Components::RectCard, Vec2, 1, nullptr);
|
||||
__this->fields._nameCardPic->fields.m_OverrideSprite = Components::CardSprite;
|
||||
}
|
||||
else {
|
||||
std::cout << "Card Image: \n" << "not found" << std::endl;
|
||||
}
|
||||
}
|
||||
// Avatar png size 256x256
|
||||
if (profile.f_Avatar) {
|
||||
if (profile.CheckFile(profile.f_Avatar)) {
|
||||
Components::AvatarTexture = app::NativeGallery_LoadImageAtPath(string_to_il2cppi(profile.f_Avatar), 100, false, false, false, nullptr);
|
||||
// If you don't do this check, then the UI will break after teleportation, I'm just too lazy to set up Rect manually
|
||||
if (Components::RectAvatar.m_Width == 0)
|
||||
Components::RectAvatar = app::Sprite_get_rect(__this->fields.playerIconImage->fields.m_Sprite, nullptr);
|
||||
app::Vector2 Vec2Avatar = { 128, 128 };
|
||||
Components::AvatarSprite = app::Sprite_Create(Components::AvatarTexture, Components::RectAvatar, Vec2Avatar, 1, nullptr);
|
||||
__this->fields.playerIconImage->fields.m_OverrideSprite = Components::AvatarSprite;
|
||||
}
|
||||
else {
|
||||
std::cout << "Avatar Image: \n" << "not found" << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
return CALL_ORIGIN(ProfilePage, __this, method);
|
||||
}
|
||||
|
||||
static void ProfileEditPage(app::MonoFriendInformationDialog* __this, app::Sprite* value, MethodInfo* method) {
|
||||
auto& profile = ProfileChanger::GetInstance();
|
||||
if (profile.f_Enabled) {
|
||||
if (profile.f_UID)
|
||||
__this->fields._playerUID->fields.m_Text = string_to_il2cppi(profile.f_UID);
|
||||
|
||||
if (profile.f_Level)
|
||||
__this->fields._playerLevel->fields.m_Text = string_to_il2cppi(profile.f_Level);
|
||||
|
||||
if (profile.f_WorldLevel)
|
||||
__this->fields._worldLevel->fields.m_Text = string_to_il2cppi(profile.f_WorldLevel);
|
||||
|
||||
// Card Name png size 840x400
|
||||
|
||||
if (profile.f_Card) {
|
||||
if (profile.CheckFile(profile.f_Card)) {
|
||||
Components::CardTexture = app::NativeGallery_LoadImageAtPath(string_to_il2cppi(profile.f_Card), 100, false, false, false, nullptr);
|
||||
// If you don't do this check, then the UI will break after teleportation, I'm just too lazy to set up Rect manually
|
||||
if (Components::RectCard.m_Width == 0)
|
||||
Components::RectCard = app::Sprite_get_rect(__this->fields._cardImg->fields.m_Sprite, nullptr);
|
||||
app::Vector2 Vec2 = { 100, 100 };
|
||||
Components::CardSprite = app::Sprite_Create(Components::CardTexture, Components::RectCard, Vec2, 1, nullptr);
|
||||
__this->fields._cardImg->fields.m_OverrideSprite = Components::CardSprite;
|
||||
}
|
||||
else {
|
||||
std::cout << "Card Image: \n" << "not found" << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
// Avatar png size 256x256
|
||||
if (profile.f_Avatar) {
|
||||
if (profile.CheckFile(profile.f_Avatar)) {
|
||||
Components::AvatarTexture = app::NativeGallery_LoadImageAtPath(string_to_il2cppi(profile.f_Avatar), 100, false, false, false, nullptr);
|
||||
if (Components::RectAvatar.m_Width == 0)
|
||||
Components::RectAvatar = app::Sprite_get_rect(__this->fields._icon->fields.m_Sprite, nullptr);
|
||||
app::Vector2 Vec2Avatar = { 128, 128 };
|
||||
Components::AvatarSprite = app::Sprite_Create(Components::AvatarTexture, Components::RectAvatar, Vec2Avatar, 1, nullptr);
|
||||
__this->fields._icon->fields.m_OverrideSprite = Components::AvatarSprite;
|
||||
}
|
||||
else {
|
||||
std::cout << "Card Image: \n" << "not found" << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return CALL_ORIGIN(ProfileEditPage, __this, value, method);
|
||||
}
|
||||
}
|
44
cheat-library/src/user/cheat/visuals/ProfileChanger.h
Normal file
44
cheat-library/src/user/cheat/visuals/ProfileChanger.h
Normal file
@ -0,0 +1,44 @@
|
||||
#pragma once
|
||||
#include <cheat-base/cheat/Feature.h>
|
||||
#include <cheat-base/config/config.h>
|
||||
#include <cheat-base/thread-safe.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
class ProfileChanger : public Feature
|
||||
{
|
||||
public:
|
||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||
config::Field<config::Toggle<std::string>> f_UID;
|
||||
config::Field<config::Toggle<std::string>> f_NickName;
|
||||
config::Field<config::Toggle<std::string>> f_Level;
|
||||
config::Field<config::Toggle<Hotkey>> f_Exp;
|
||||
config::Field<int> f_CurExp;
|
||||
config::Field<int> f_MaxExp;
|
||||
config::Field<config::Toggle<Hotkey>> f_ExpBar;
|
||||
config::Field<float> f_ExpBarValue;
|
||||
config::Field<config::Toggle<std::string>> f_WorldLevel;
|
||||
|
||||
config::Field<config::Toggle<std::string>> f_Avatar; // Avatar png size 256x256
|
||||
config::Field<config::Toggle<std::string>> f_Card; // Card Name png size 840x400
|
||||
|
||||
static ProfileChanger& GetInstance();
|
||||
|
||||
const FeatureGUIInfo& GetGUIInfo() const override;
|
||||
void DrawMain() override;
|
||||
|
||||
virtual bool NeedStatusDraw() const override;
|
||||
void DrawStatus() override;
|
||||
|
||||
bool CheckFile(const std::string& name);
|
||||
|
||||
private:
|
||||
SafeQueue<uint32_t> toBeUpdate;
|
||||
SafeValue<int64_t> nextUpdate;
|
||||
int f_DelayUpdate = 100.f;
|
||||
|
||||
void OnGameUpdate();
|
||||
ProfileChanger();
|
||||
|
||||
};
|
||||
}
|
@ -9,7 +9,7 @@ namespace cheat::feature
|
||||
static bool IndicatorPlugin_DoCheck(app::LCIndicatorPlugin* __this, MethodInfo* method);
|
||||
|
||||
ChestIndicator::ChestIndicator() : Feature(),
|
||||
NF(f_Enabled, "Show Chest Indicator", "ShowChest", false)
|
||||
NFEX(f_Enabled, "Show Chest Indicator", "ChestIndicator", "Visuals", false, false)
|
||||
{
|
||||
HookManager::install(app::MoleMole_LCIndicatorPlugin_DoCheck, IndicatorPlugin_DoCheck);
|
||||
}
|
||||
|
@ -6,22 +6,27 @@
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
namespace GameObject {
|
||||
app::GameObject* Profirency = nullptr;
|
||||
}
|
||||
|
||||
namespace Components {
|
||||
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 void PlayerModule_OnPlayerCookRsp(app::MoleMole_PlayerModule* __this, app::PlayerCookRsp* rsp, MethodInfo* method);
|
||||
|
||||
static void CookingQtePageContext_UpdateProficiency(app::CookingQtePageContext* __this, MethodInfo* method);
|
||||
static void CookingQtePageContext_SetProficiencyInfo(app::CookingQtePageContext* __this, MethodInfo* method);
|
||||
static uint32_t CookRecipeExcelConfig_get_maxProficiency(app::CookRecipeExcelConfig* __this, MethodInfo* method);
|
||||
|
||||
AutoCook::AutoCook() : Feature(),
|
||||
NF(f_Enabled, "Auto Cooking", "AutoCook", false),
|
||||
NF(f_Count, "Count Item", "AutoCook", 1),
|
||||
NF(f_Quality, "Quality", "AutoCook", 1)
|
||||
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)
|
||||
{
|
||||
HookManager::install(app::MoleMole_PlayerModule_RequestPlayerCook, PlayerModule_RequestPlayerCook);
|
||||
HookManager::install(app::MoleMole_PlayerModule_OnPlayerCookRsp, PlayerModule_OnPlayerCookRsp);
|
||||
HookManager::install(app::MoleMole_PlayerModule_OnPlayerCookRsp, PlayerModule_OnPlayerCookRsp);
|
||||
HookManager::install(app::MoleMole_CookingQtePageContext_UpdateProficiency, CookingQtePageContext_UpdateProficiency);
|
||||
HookManager::install(app::CookRecipeExcelConfig_get_maxProficiency, CookRecipeExcelConfig_get_maxProficiency);
|
||||
}
|
||||
|
||||
const FeatureGUIInfo& AutoCook::GetGUIInfo() const
|
||||
@ -32,11 +37,13 @@ namespace cheat::feature
|
||||
|
||||
void AutoCook::DrawMain()
|
||||
{
|
||||
ConfigWidget(f_Enabled, "Automatic cooking.");
|
||||
ConfigWidget("Count Item", f_Count, 1, 1, 100,
|
||||
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.");
|
||||
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" \
|
||||
"(If the recipe is not fully explored, set it to 1.)");
|
||||
ConfigWidget("Quality Cooking", f_Quality, 1, 1, 3, "Quality of the cook.");
|
||||
"(For standard mode only.)");
|
||||
ConfigWidget("Quality Cooking", f_QualityField, 1, 1, 3, "Quality of the cook.");
|
||||
}
|
||||
|
||||
bool AutoCook::NeedStatusDraw() const
|
||||
@ -46,7 +53,7 @@ namespace cheat::feature
|
||||
|
||||
void AutoCook::DrawStatus()
|
||||
{
|
||||
ImGui::Text("Auto Cook");
|
||||
ImGui::Text("Auto Cooking [%s]", f_FastProficiency ? "Proficiency" : "Standart");
|
||||
}
|
||||
|
||||
AutoCook& AutoCook::GetInstance()
|
||||
@ -57,51 +64,88 @@ namespace cheat::feature
|
||||
|
||||
// Auto Cooking | RyujinZX#6666
|
||||
|
||||
std::vector<std::string> split(std::string& s, char delimeter)
|
||||
{
|
||||
std::stringstream ss(s);
|
||||
std::string item;
|
||||
std::vector<std::string> tokens;
|
||||
while (std::getline(ss, item, delimeter))
|
||||
{
|
||||
tokens.push_back(item);
|
||||
}
|
||||
return tokens;
|
||||
}
|
||||
|
||||
static void PlayerModule_RequestPlayerCook(app::MoleMole_PlayerModule* __this, uint32_t recipeId, uint32_t avatarId, uint32_t qteQuality, uint32_t count, MethodInfo* method)
|
||||
{
|
||||
AutoCook& autoCook = AutoCook::GetInstance();
|
||||
if (autoCook.f_Enabled)
|
||||
if (autoCook.f_Enabled || autoCook.f_FastProficiency)
|
||||
{
|
||||
qteQuality = autoCook.f_Quality;
|
||||
count = autoCook.f_Count;
|
||||
}
|
||||
autoCook.CookFoodMaxNum = app::MoleMole_Config_CookRecipeExcelConfig_CheckCookFoodMaxNum(recipeId, nullptr);
|
||||
qteQuality = autoCook.f_QualityField;
|
||||
|
||||
return CALL_ORIGIN(PlayerModule_RequestPlayerCook, __this, recipeId, avatarId, qteQuality, count, method);
|
||||
if (!autoCook.f_FastProficiency && autoCook.f_Enabled){
|
||||
count = autoCook.f_CountField;
|
||||
if (autoCook.f_CountField > autoCook.CookFoodMaxNum)
|
||||
count = autoCook.CookFoodMaxNum;
|
||||
|
||||
return CALL_ORIGIN(PlayerModule_RequestPlayerCook, __this, recipeId, avatarId, qteQuality, count, method);
|
||||
}
|
||||
|
||||
if (autoCook.f_Enabled && autoCook.f_FastProficiency) {
|
||||
count = 1;
|
||||
|
||||
GameObject::Profirency = app::GameObject_Find(string_to_il2cppi("/Canvas/Pages/CookingPage/GrpCooking/GrpTab/GrpItemTips/CookingItemTip/Viewport/ItemTips_Cooking(Clone)/Content/GrpProficiency/Level/"), nullptr);
|
||||
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(" ."));
|
||||
std::vector<std::string> FinalProficiency = split(ProficiencyStr, '/');
|
||||
autoCook.CookCount = atoi(FinalProficiency[1].c_str()) - atoi(FinalProficiency[0].c_str());
|
||||
}
|
||||
|
||||
if (autoCook.CookCount == 0)
|
||||
autoCook.CookCount = 1;
|
||||
|
||||
if (autoCook.CookCount > autoCook.CookFoodMaxNum)
|
||||
autoCook.CookCount = autoCook.CookFoodMaxNum;
|
||||
|
||||
for (int i = 1; i <= autoCook.CookCount; i++) {
|
||||
CALL_ORIGIN(PlayerModule_RequestPlayerCook, __this, recipeId, avatarId, qteQuality, count, method);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
return CALL_ORIGIN(PlayerModule_RequestPlayerCook, __this, recipeId, avatarId, qteQuality, count, method);
|
||||
}
|
||||
}
|
||||
|
||||
static void PlayerModule_OnPlayerCookRsp(app::MoleMole_PlayerModule* __this, app::PlayerCookRsp* rsp, MethodInfo* method) {
|
||||
static void PlayerModule_OnPlayerCookRsp(app::MoleMole_PlayerModule* __this, app::PlayerCookRsp* rsp, MethodInfo* method) {
|
||||
AutoCook& autoCook = AutoCook::GetInstance();
|
||||
if (autoCook.f_Enabled)
|
||||
if (autoCook.f_Enabled || autoCook.f_FastProficiency)
|
||||
{
|
||||
rsp->fields.qteQuality_ = autoCook.f_Quality;
|
||||
rsp->fields.cookCount_ = autoCook.f_Count;
|
||||
|
||||
// Unlock Quick Cooking, It will reset after a restart, so it is better to study the recipe in full at once.
|
||||
if (rsp->fields.recipeData_ != nullptr)
|
||||
rsp->fields.recipeData_->fields.proficiency_ = autoCook.CookCount;
|
||||
rsp->fields.qteQuality_ = autoCook.f_QualityField;
|
||||
rsp->fields.cookCount_ = autoCook.f_CountField;
|
||||
if (autoCook.f_FastProficiency)
|
||||
rsp->fields.cookCount_ = 1;
|
||||
// if (rsp->fields.recipeData_ != nullptr)
|
||||
// rsp->fields.recipeData_->fields.proficiency_ = autoCook.CookCount;
|
||||
}
|
||||
|
||||
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)
|
||||
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
|
||||
}
|
||||
|
||||
return CALL_ORIGIN(CookingQtePageContext_UpdateProficiency, __this, method);
|
||||
}
|
||||
|
||||
static uint32_t CookRecipeExcelConfig_get_maxProficiency(app::CookRecipeExcelConfig* __this, MethodInfo* method) {
|
||||
AutoCook& autoCook = AutoCook::GetInstance();
|
||||
if (autoCook.f_Enabled)
|
||||
{
|
||||
uint32_t maxCount = app::MoleMole_SimpleSafeUInt32_get_Value(__this->fields.maxProficiencyRawNum, nullptr);
|
||||
autoCook.CookCount = maxCount;
|
||||
}
|
||||
return CALL_ORIGIN(CookRecipeExcelConfig_get_maxProficiency, __this, method);
|
||||
}
|
||||
}
|
@ -9,10 +9,13 @@ namespace cheat::feature
|
||||
{
|
||||
public:
|
||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||
config::Field<int> f_Count;
|
||||
config::Field<int> f_Quality;
|
||||
config::Field<config::Toggle<Hotkey>> f_FastProficiency;
|
||||
|
||||
uint32_t CookCount;
|
||||
config::Field<int> f_CountField;
|
||||
config::Field<int> f_QualityField;
|
||||
|
||||
int CookFoodMaxNum; // Maximum quantity at a time
|
||||
int CookCount;
|
||||
|
||||
static AutoCook& GetInstance();
|
||||
|
||||
|
@ -116,12 +116,48 @@ namespace cheat::feature
|
||||
}
|
||||
};
|
||||
|
||||
template <typename KeyT, typename ValT, uint32_t Size, class /*forward*/ _Hasher = std::hash<KeyT>>
|
||||
class lra_map {
|
||||
using key_value_pair = std::pair<KeyT, ValT>;
|
||||
using list_iterator = typename std::list<key_value_pair>::iterator;
|
||||
|
||||
public:
|
||||
void put(const KeyT& key, const ValT& val) {
|
||||
auto it = elem_map.find(key);
|
||||
// if element already in the map, don't modify it.
|
||||
if (it != elem_map.end())
|
||||
return;
|
||||
|
||||
items_list.push_front(key_value_pair(key, val));
|
||||
elem_map[key] = items_list.begin();
|
||||
|
||||
if (Size < elem_map.size()) {
|
||||
{
|
||||
const KeyT& last_key = items_list.back().first;
|
||||
elem_map.erase(last_key);
|
||||
}
|
||||
items_list.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
ValT& get(const KeyT& key) {
|
||||
auto it = elem_map.find(key);
|
||||
if (it == elem_map.end())
|
||||
throw std::runtime_error("Tried to access key not present in map");
|
||||
return it->second->second;
|
||||
}
|
||||
|
||||
bool exists(const KeyT& key) const {
|
||||
return elem_map.find(key) != elem_map.end();
|
||||
}
|
||||
protected:
|
||||
std::list<key_value_pair> items_list;
|
||||
std::unordered_map<KeyT, list_iterator, _Hasher> elem_map;
|
||||
};
|
||||
|
||||
void AutoTreeFarm::OnGameUpdate()
|
||||
{
|
||||
static std::unordered_map<Vector3d, uint32_t, hash_fn> s_AttackCountMap;
|
||||
|
||||
static lra_map<Vector3d, uint32_t, 10, hash_fn> s_AttackCountMap;
|
||||
static std::queue<app::SceneTreeObject*> s_AttackQueue;
|
||||
static std::unordered_set<app::SceneTreeObject*> s_AttackQueueSet;
|
||||
static uint64_t s_LastAttackTimestamp = 0;
|
||||
@ -142,7 +178,7 @@ namespace cheat::feature
|
||||
if (s_AttackQueueSet.count(tree) > 0)
|
||||
continue;
|
||||
|
||||
if (tree->fields._lastTreeDropTimeStamp + m_RepeatDelay > timestamp)
|
||||
if (s_LastAttackTimestamp + m_RepeatDelay > timestamp)
|
||||
continue;
|
||||
|
||||
auto position = tree->fields._.realBounds.m_Center;
|
||||
@ -173,22 +209,20 @@ namespace cheat::feature
|
||||
|
||||
if (m_AttackPerTree > 0)
|
||||
{
|
||||
if (s_AttackCountMap.count(position) == 0)
|
||||
s_AttackCountMap[position] = 0;
|
||||
if (!s_AttackCountMap.exists(position))
|
||||
s_AttackCountMap.put(position, 0);
|
||||
|
||||
auto& attackCount = s_AttackCountMap[position];
|
||||
auto& attackCount = s_AttackCountMap.get(position);
|
||||
attackCount++;
|
||||
|
||||
if (attackCount > static_cast<uint32_t>(m_AttackPerTree))
|
||||
continue;
|
||||
}
|
||||
|
||||
tree->fields._lastTreeDropTimeStamp = timestamp;
|
||||
s_LastAttackTimestamp = timestamp;
|
||||
app::MoleMole_NetworkManager_RequestHitTreeDropNotify(networkManager, position, position, treeType, nullptr);
|
||||
break;
|
||||
}
|
||||
|
||||
if (s_AttackCountMap.size() > 1000)
|
||||
s_AttackCountMap.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,20 +4,23 @@
|
||||
#include <helpers.h>
|
||||
#include <cheat/game/EntityManager.h>
|
||||
|
||||
namespace cheat::feature
|
||||
namespace cheat::feature
|
||||
{
|
||||
static void InLevelCutScenePageContext_UpdateView_Hook(app::InLevelCutScenePageContext* __this, MethodInfo* method);
|
||||
static void InLevelCutScenePageContext_ClearView_Hook(app::InLevelCutScenePageContext* __this, MethodInfo* method);
|
||||
static void CriwareMediaPlayer_Update(app::CriwareMediaPlayer* __this, MethodInfo* method);
|
||||
|
||||
DialogSkip::DialogSkip() : Feature(),
|
||||
NF(f_Enabled, "Auto talk", "AutoTalk", false),
|
||||
NF(f_AutoSelectDialog, "Auto select dialog", "AutoTalk", true),
|
||||
NF(f_ExcludeImportant, "Exclude Katheryne/Tubby", "AutoTalk", true),
|
||||
NF(f_FastDialog, "Fast dialog", "AutoTalk", false),
|
||||
NF(f_TimeSpeedup, "Time Speed", "AutoTalk", 5.0f)
|
||||
NF(f_Enabled, "Auto talk", "AutoTalk", false),
|
||||
NF(f_AutoSelectDialog, "Auto select dialog", "AutoTalk", true),
|
||||
NF(f_ExcludeImportant, "Exclude Katheryne/Tubby", "AutoTalk", true),
|
||||
NF(f_FastDialog, "Fast dialog", "AutoTalk", false),
|
||||
NF(f_CutsceneUSM, "Skip Cutscenes", "AutoTalk", false),
|
||||
NF(f_TimeSpeedup, "Time Speed", "AutoTalk", 5.0f)
|
||||
{
|
||||
HookManager::install(app::MoleMole_InLevelCutScenePageContext_UpdateView, InLevelCutScenePageContext_UpdateView_Hook);
|
||||
HookManager::install(app::MoleMole_InLevelCutScenePageContext_ClearView, InLevelCutScenePageContext_ClearView_Hook);
|
||||
HookManager::install(app::CriwareMediaPlayer_Update, CriwareMediaPlayer_Update);
|
||||
}
|
||||
|
||||
const FeatureGUIInfo& DialogSkip::GetGUIInfo() const
|
||||
@ -41,21 +44,25 @@ namespace cheat::feature
|
||||
{
|
||||
ConfigWidget(f_TimeSpeedup, 0.1f, 2.0f, 50.0f, "Time Speedup Multipler \nHigher Values will lead to sync issues with servers \nand is not recommended for Laggy Internet connections.");
|
||||
}
|
||||
ConfigWidget("Skip Cutscenes", f_CutsceneUSM, "Automatically skips game movies.");
|
||||
}
|
||||
|
||||
bool DialogSkip::NeedStatusDraw() const
|
||||
{
|
||||
return f_Enabled;
|
||||
{
|
||||
return f_Enabled || f_CutsceneUSM;
|
||||
}
|
||||
|
||||
void DialogSkip::DrawStatus()
|
||||
void DialogSkip::DrawStatus()
|
||||
{
|
||||
ImGui::Text("Dialog [%s%s%s%s%s]",
|
||||
f_AutoSelectDialog ? "Auto" : "Manual",
|
||||
f_AutoSelectDialog && (f_ExcludeImportant || f_FastDialog) ? "|" : "",
|
||||
f_ExcludeImportant ? "Exc" : "",
|
||||
f_ExcludeImportant && f_FastDialog ? "|" : "",
|
||||
f_FastDialog ? "Fast" : "Normal");
|
||||
if (f_Enabled)
|
||||
ImGui::Text("Dialog [%s%s%s%s%s]",
|
||||
f_AutoSelectDialog ? "Auto" : "Manual",
|
||||
f_AutoSelectDialog && (f_ExcludeImportant || f_FastDialog) ? "|" : "",
|
||||
f_ExcludeImportant ? "Exc" : "",
|
||||
f_ExcludeImportant && f_FastDialog ? "|" : "",
|
||||
f_FastDialog ? "Fast" : "Normal");
|
||||
|
||||
ImGui::Text(f_CutsceneUSM ? "Skip Cutscenes" : "");
|
||||
}
|
||||
|
||||
DialogSkip& DialogSkip::GetInstance()
|
||||
@ -64,10 +71,10 @@ namespace cheat::feature
|
||||
return instance;
|
||||
}
|
||||
|
||||
// Raised when dialog view updating
|
||||
// Raised when dialog view updating
|
||||
// We call free click, if auto talk enabled, that means we just emulate user click
|
||||
// When appear dialog choose we create notify with dialog select first item.
|
||||
void DialogSkip::OnCutScenePageUpdate(app::InLevelCutScenePageContext* context)
|
||||
void DialogSkip::OnCutScenePageUpdate(app::InLevelCutScenePageContext* context)
|
||||
{
|
||||
if (!f_Enabled)
|
||||
return;
|
||||
@ -86,7 +93,7 @@ namespace cheat::feature
|
||||
// add their own name substrings of entities to avoid
|
||||
// speeding up dialog on.
|
||||
std::vector<std::string> impEntitiesNames = {
|
||||
"Djinn",
|
||||
"Djinn",
|
||||
"Katheryne"
|
||||
};
|
||||
auto dialogPartnerID = context->fields._inteeID;
|
||||
@ -103,25 +110,25 @@ namespace cheat::feature
|
||||
}
|
||||
}
|
||||
|
||||
if (talkDialog->fields._inSelect && f_AutoSelectDialog && !isImportant)
|
||||
{
|
||||
int32_t value = 0;
|
||||
auto object = il2cpp_value_box((Il2CppClass*)*app::Int32__TypeInfo, &value);
|
||||
auto notify = app::Notify_CreateNotify_1(app::MoleMole_NotifyTypes__Enum::DialogSelectItemNotify, (app::Object*)object, nullptr);
|
||||
app::MoleMole_TalkDialogContext_OnDialogSelectItem(talkDialog, ¬ify, nullptr);
|
||||
}
|
||||
else if (!talkDialog->fields._inSelect)
|
||||
app::MoleMole_InLevelCutScenePageContext_OnFreeClick(context, nullptr);
|
||||
if (talkDialog->fields._inSelect && f_AutoSelectDialog && !isImportant)
|
||||
{
|
||||
int32_t value = 0;
|
||||
auto object = il2cpp_value_box((Il2CppClass*)*app::Int32__TypeInfo, &value);
|
||||
auto notify = app::Notify_CreateNotify_1(app::MoleMole_NotifyTypes__Enum::DialogSelectItemNotify, (app::Object*)object, nullptr);
|
||||
app::MoleMole_TalkDialogContext_OnDialogSelectItem(talkDialog, ¬ify, nullptr);
|
||||
}
|
||||
else if (!talkDialog->fields._inSelect)
|
||||
app::MoleMole_InLevelCutScenePageContext_OnFreeClick(context, nullptr);
|
||||
}
|
||||
|
||||
static void InLevelCutScenePageContext_UpdateView_Hook(app::InLevelCutScenePageContext* __this, MethodInfo* method)
|
||||
{
|
||||
CALL_ORIGIN(InLevelCutScenePageContext_UpdateView_Hook, __this, method);
|
||||
static void InLevelCutScenePageContext_UpdateView_Hook(app::InLevelCutScenePageContext* __this, MethodInfo* method)
|
||||
{
|
||||
CALL_ORIGIN(InLevelCutScenePageContext_UpdateView_Hook, __this, method);
|
||||
|
||||
DialogSkip& dialogSkip = DialogSkip::GetInstance();
|
||||
dialogSkip.OnCutScenePageUpdate(__this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Raised when exiting a dialog. We try to hackishly return to normal value.
|
||||
// Should be a better way to store the pre-dialog speed using Time_get_timeScale.
|
||||
static void InLevelCutScenePageContext_ClearView_Hook(app::InLevelCutScenePageContext* __this, MethodInfo* method)
|
||||
@ -131,5 +138,14 @@ namespace cheat::feature
|
||||
app::Time_set_timeScale(1.0f, nullptr);
|
||||
CALL_ORIGIN(InLevelCutScenePageContext_ClearView_Hook, __this, method);
|
||||
}
|
||||
|
||||
static void CriwareMediaPlayer_Update(app::CriwareMediaPlayer* __this, MethodInfo* method)
|
||||
{
|
||||
DialogSkip& dialogSkip = DialogSkip::GetInstance();
|
||||
if (dialogSkip.f_CutsceneUSM)
|
||||
app::CriwareMediaPlayer_Skip(__this, nullptr);
|
||||
|
||||
return CALL_ORIGIN(CriwareMediaPlayer_Update, __this, method);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,16 +2,17 @@
|
||||
#include <cheat-base/cheat/Feature.h>
|
||||
#include <cheat-base/config/config.h>
|
||||
|
||||
namespace cheat::feature
|
||||
namespace cheat::feature
|
||||
{
|
||||
|
||||
class DialogSkip : public Feature
|
||||
{
|
||||
{
|
||||
public:
|
||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||
config::Field<config::Toggle<Hotkey>> f_AutoSelectDialog;
|
||||
config::Field<config::Toggle<Hotkey>> f_ExcludeImportant;
|
||||
config::Field<config::Toggle<Hotkey>> f_FastDialog;
|
||||
config::Field<config::Toggle<Hotkey>> f_CutsceneUSM;
|
||||
config::Field<float> f_TimeSpeedup;
|
||||
|
||||
static DialogSkip& GetInstance();
|
||||
@ -23,7 +24,7 @@ namespace cheat::feature
|
||||
void DrawStatus() override;
|
||||
|
||||
void OnCutScenePageUpdate(app::InLevelCutScenePageContext* context);
|
||||
|
||||
|
||||
private:
|
||||
DialogSkip();
|
||||
};
|
||||
|
152
cheat-library/src/user/cheat/world/MusicEvent.cpp
Normal file
152
cheat-library/src/user/cheat/world/MusicEvent.cpp
Normal file
@ -0,0 +1,152 @@
|
||||
#include "pch-il2cpp.h"
|
||||
#include "MusicEvent.h"
|
||||
|
||||
#include <helpers.h>
|
||||
#include <cheat/events.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
|
||||
static void MusicGamePlayComponent_OnStart_Hook(app::MusicGamePlayComponent* __this, app::BeatMapData* beatMapData, app::MusicMetaInfo* musicMetaInfo, MethodInfo* method);
|
||||
static void MusicGamePlayComponent_OnMiss_Hook(app::MusicGamePlayComponent* __this, MethodInfo* method);
|
||||
static void MusicGamePlayComponent_set_combo_Hook(app::MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method);
|
||||
static void MusicGamePlayComponent_set_score_Hook(app::MusicGamePlayComponent* __this, float value, MethodInfo* method);
|
||||
static void MusicGamePlayComponent_set_maxCombo_Hook(app::MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method);
|
||||
static void MusicGamePlayComponent_set_perfectCnt_Hook(app::MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method);
|
||||
static void MusicGamePlayComponent_set_greatCnt_Hook(app::MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method);
|
||||
static void MusicGamePlayComponent_set_missCnt_Hook(app::MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method);
|
||||
static void MusicGamePlayComponent_OnHit_Hook(app::MusicGamePlayComponent* __this, float score, MethodInfo* method);
|
||||
|
||||
MusicEvent::MusicEvent() : Feature(),
|
||||
NF(f_Enabled, "Music Event", "MusicEvent", false)
|
||||
{
|
||||
//HookManager::install(app::MusicGamePlayComponent_OnStart, MusicGamePlayComponent_OnStart_Hook);
|
||||
HookManager::install(app::MusicGamePlayComponent_OnMiss, MusicGamePlayComponent_OnMiss_Hook);
|
||||
HookManager::install(app::MusicGamePlayComponent_set_combo, MusicGamePlayComponent_set_combo_Hook);
|
||||
HookManager::install(app::MusicGamePlayComponent_set_score, MusicGamePlayComponent_set_score_Hook);
|
||||
HookManager::install(app::MusicGamePlayComponent_set_maxCombo, MusicGamePlayComponent_set_maxCombo_Hook);
|
||||
HookManager::install(app::MusicGamePlayComponent_set_perfectCnt, MusicGamePlayComponent_set_perfectCnt_Hook);
|
||||
HookManager::install(app::MusicGamePlayComponent_set_greatCnt, MusicGamePlayComponent_set_greatCnt_Hook);
|
||||
HookManager::install(app::MusicGamePlayComponent_set_missCnt, MusicGamePlayComponent_set_missCnt_Hook);
|
||||
HookManager::install(app::MusicGamePlayComponent_OnHit, MusicGamePlayComponent_OnHit_Hook);
|
||||
}
|
||||
|
||||
const FeatureGUIInfo& MusicEvent::GetGUIInfo() const
|
||||
{
|
||||
static const FeatureGUIInfo info{ "", "World", false };
|
||||
return info;
|
||||
}
|
||||
|
||||
void MusicEvent::DrawMain()
|
||||
{
|
||||
ConfigWidget(f_Enabled, "Enemies don't attack or use abilities against player. \n"
|
||||
"May not work with some enemies or enemy abilites.");
|
||||
}
|
||||
|
||||
bool MusicEvent::NeedStatusDraw() const
|
||||
{
|
||||
return f_Enabled;
|
||||
}
|
||||
|
||||
void MusicEvent::DrawStatus()
|
||||
{
|
||||
ImGui::Text("Music Event");
|
||||
}
|
||||
|
||||
MusicEvent& MusicEvent::GetInstance()
|
||||
{
|
||||
static MusicEvent instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
static void MusicGamePlayComponent_OnStart_Hook(app::MusicGamePlayComponent * __this, app::BeatMapData* beatMapData, app::MusicMetaInfo* musicMetaInfo, MethodInfo* method)
|
||||
{
|
||||
MusicEvent& MusicEvent = MusicEvent::GetInstance();
|
||||
if (MusicEvent.f_Enabled)
|
||||
{
|
||||
__this->fields._combo = 9999999;
|
||||
__this->fields._score_k__BackingField = 9999999;
|
||||
__this->fields._maxCombo_k__BackingField = 9999999;
|
||||
__this->fields._perfectCnt_k__BackingField = 9999999;
|
||||
__this->fields._greatCnt_k__BackingField = 9999999;
|
||||
__this->fields._missCnt_k__BackingField = 0;
|
||||
}
|
||||
CALL_ORIGIN(MusicGamePlayComponent_OnStart_Hook, __this, beatMapData, musicMetaInfo, method);
|
||||
}
|
||||
|
||||
static void MusicGamePlayComponent_OnMiss_Hook(app::MusicGamePlayComponent* __this, MethodInfo* method)
|
||||
{
|
||||
MusicEvent& MusicEvent = MusicEvent::GetInstance();
|
||||
if (MusicEvent.f_Enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
CALL_ORIGIN(MusicGamePlayComponent_OnMiss_Hook, __this, method);
|
||||
}
|
||||
|
||||
static void MusicGamePlayComponent_set_combo_Hook(app::MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method)
|
||||
{
|
||||
MusicEvent& MusicEvent = MusicEvent::GetInstance();
|
||||
if (MusicEvent.f_Enabled)
|
||||
{
|
||||
value = 999999999;
|
||||
}
|
||||
CALL_ORIGIN(MusicGamePlayComponent_set_combo_Hook, __this, value, method);
|
||||
}
|
||||
|
||||
static void MusicGamePlayComponent_set_score_Hook(app::MusicGamePlayComponent* __this, float value, MethodInfo* method)
|
||||
{
|
||||
MusicEvent& MusicEvent = MusicEvent::GetInstance();
|
||||
if (MusicEvent.f_Enabled)
|
||||
{
|
||||
value = 999999999;
|
||||
}
|
||||
CALL_ORIGIN(MusicGamePlayComponent_set_score_Hook, __this, value, method);
|
||||
}
|
||||
static void MusicGamePlayComponent_set_maxCombo_Hook(app::MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method)
|
||||
{
|
||||
MusicEvent& MusicEvent = MusicEvent::GetInstance();
|
||||
if (MusicEvent.f_Enabled)
|
||||
{
|
||||
value = 999999999;
|
||||
}
|
||||
CALL_ORIGIN(MusicGamePlayComponent_set_maxCombo_Hook, __this, value, method);
|
||||
}
|
||||
static void MusicGamePlayComponent_set_perfectCnt_Hook(app::MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method)
|
||||
{
|
||||
MusicEvent& MusicEvent = MusicEvent::GetInstance();
|
||||
if (MusicEvent.f_Enabled)
|
||||
{
|
||||
value = 999999999;
|
||||
}
|
||||
CALL_ORIGIN(MusicGamePlayComponent_set_perfectCnt_Hook, __this, value, method);
|
||||
}
|
||||
static void MusicGamePlayComponent_set_greatCnt_Hook(app::MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method)
|
||||
{
|
||||
MusicEvent& MusicEvent = MusicEvent::GetInstance();
|
||||
if (MusicEvent.f_Enabled)
|
||||
{
|
||||
value = 999999999;
|
||||
}
|
||||
CALL_ORIGIN(MusicGamePlayComponent_set_greatCnt_Hook, __this, value, method);
|
||||
}
|
||||
static void MusicGamePlayComponent_set_missCnt_Hook(app::MusicGamePlayComponent* __this, uint32_t value, MethodInfo* method)
|
||||
{
|
||||
MusicEvent& MusicEvent = MusicEvent::GetInstance();
|
||||
if (MusicEvent.f_Enabled)
|
||||
{
|
||||
value = 0;
|
||||
}
|
||||
CALL_ORIGIN(MusicGamePlayComponent_set_missCnt_Hook, __this, value, method);
|
||||
}
|
||||
static void MusicGamePlayComponent_OnHit_Hook(app::MusicGamePlayComponent* __this, float score, MethodInfo* method)
|
||||
{
|
||||
MusicEvent& MusicEvent = MusicEvent::GetInstance();
|
||||
if (MusicEvent.f_Enabled)
|
||||
{
|
||||
score = 999999999;
|
||||
}
|
||||
CALL_ORIGIN(MusicGamePlayComponent_OnHit_Hook, __this, score, method);
|
||||
}
|
||||
}
|
||||
|
25
cheat-library/src/user/cheat/world/MusicEvent.h
Normal file
25
cheat-library/src/user/cheat/world/MusicEvent.h
Normal file
@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
#include <cheat-base/cheat/Feature.h>
|
||||
#include <cheat-base/config/config.h>
|
||||
|
||||
namespace cheat::feature
|
||||
{
|
||||
|
||||
class MusicEvent : public Feature
|
||||
{
|
||||
public:
|
||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||
|
||||
static MusicEvent& GetInstance();
|
||||
|
||||
const FeatureGUIInfo& GetGUIInfo() const override;
|
||||
void DrawMain() override;
|
||||
|
||||
virtual bool NeedStatusDraw() const override;
|
||||
void DrawStatus() override;
|
||||
|
||||
private:
|
||||
MusicEvent();
|
||||
};
|
||||
}
|
||||
|
@ -81,10 +81,14 @@ static bool LoadLibraryInject(HANDLE hProc, const std::string& dllpath)
|
||||
VirtualFreeEx(hProc, pDLLPath, 0, MEM_RELEASE);
|
||||
return false;
|
||||
}
|
||||
CloseHandle(hThread);
|
||||
|
||||
// TODO: Add waiting for thread end and release unneccessary data.
|
||||
// VirtualFreeEx(hProc, pDLLPath, 0, MEM_RELEASE);
|
||||
// Waiting for thread end and release unnecessary data.
|
||||
if (WaitForSingleObject(hThread, 2000) == WAIT_OBJECT_0) {
|
||||
// ILog("[DLL Injection] Remote thread ended successfully.\n");
|
||||
VirtualFreeEx(hProc, pDLLPath, 0, MEM_RELEASE);
|
||||
}
|
||||
|
||||
CloseHandle(hThread);
|
||||
|
||||
ILog("[DLL Injection] Successfully LoadLibraryA injection.\n");
|
||||
return true;
|
||||
|
Loading…
Reference in New Issue
Block a user