diff --git a/cheat-library/cheat-library.vcxproj b/cheat-library/cheat-library.vcxproj
index 2e06492..0ad98b8 100644
--- a/cheat-library/cheat-library.vcxproj
+++ b/cheat-library/cheat-library.vcxproj
@@ -53,6 +53,7 @@
+
@@ -163,6 +164,7 @@
+
diff --git a/cheat-library/cheat-library.vcxproj.filters b/cheat-library/cheat-library.vcxproj.filters
index e63930a..b5aed26 100644
--- a/cheat-library/cheat-library.vcxproj.filters
+++ b/cheat-library/cheat-library.vcxproj.filters
@@ -225,6 +225,9 @@
Header Files
+
+ Header Files
+
@@ -408,6 +411,9 @@
Source Files
+
+ Source Files
+
diff --git a/cheat-library/src/appdata/il2cpp-functions.h b/cheat-library/src/appdata/il2cpp-functions.h
index c05d4a3..de688df 100644
--- a/cheat-library/src/appdata/il2cpp-functions.h
+++ b/cheat-library/src/appdata/il2cpp-functions.h
@@ -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));
@@ -73,6 +75,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
@@ -145,8 +150,23 @@ DO_APP_FUNC(0x02858180, void, MoleMole_PlayerModule_OnPlayerCookRsp, (MoleMole_P
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));
+// 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 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));
// Utility
+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));
diff --git a/cheat-library/src/appdata/il2cpp-types.h b/cheat-library/src/appdata/il2cpp-types.h
index a39de9a..3393357 100644
--- a/cheat-library/src/appdata/il2cpp-types.h
+++ b/cheat-library/src/appdata/il2cpp-types.h
@@ -3822,6 +3822,12 @@ namespace app {
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 +4496,11 @@ namespace app {
void* m_Corners;
};
+ /*struct MaskableGraphic {
+ struct MaskableGraphic__Class* klass;
+ MonitorData* monitor;
+ struct MaskableGraphic__Fields fields;
+ };*/
struct Text__Fields {
struct MaskableGraphic__Fields _;
@@ -11337,6 +11348,196 @@ 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;
+ };
+
#if !defined(_GHIDRA_) && !defined(_IDA_)
}
#endif
diff --git a/cheat-library/src/framework/helpers.cpp b/cheat-library/src/framework/helpers.cpp
index 03bbc8c..5a48b61 100644
--- a/cheat-library/src/framework/helpers.cpp
+++ b/cheat-library/src/framework/helpers.cpp
@@ -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(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();
diff --git a/cheat-library/src/framework/helpers.h b/cheat-library/src/framework/helpers.h
index 9cbe6b0..febc347 100644
--- a/cheat-library/src/framework/helpers.h
+++ b/cheat-library/src/framework/helpers.h
@@ -46,7 +46,7 @@ struct UniLinkListNode
};
template
-struct UniLinkList
+struct UniLinkList
{
void* klass;
MonitorData* monitor;
@@ -127,15 +127,15 @@ struct __declspec(align(8)) UniDict {
MonitorData* monitor;
void* buckets;
UniArray>* 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> pairs()
+ std::vector> pairs()
{
auto pairs = std::vector>();
@@ -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
T* CastTo(void* pObject, void* pClass)
{
- auto object = reinterpret_cast(pObject);
- if (object == nullptr || object->klass == nullptr || object->klass != pClass)
- return nullptr;
+ auto object = reinterpret_cast(pObject);
+ if (object == nullptr || object->klass == nullptr || object->klass != pClass)
+ return nullptr;
- return reinterpret_cast(object);
+ return reinterpret_cast(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 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
}
diff --git a/cheat-library/src/user/cheat/cheat.cpp b/cheat-library/src/user/cheat/cheat.cpp
index 85afd9e..780c62c 100644
--- a/cheat-library/src/user/cheat/cheat.cpp
+++ b/cheat-library/src/user/cheat/cheat.cpp
@@ -42,6 +42,7 @@
#include
#include
#include
+#include
#include "GenshinCM.h"
@@ -95,7 +96,8 @@ namespace cheat
FEAT_INST(NoFog),
FEAT_INST(FPSUnlock),
FEAT_INST(CameraZoom),
- FEAT_INST(ChestIndicator)
+ FEAT_INST(ChestIndicator),
+ FEAT_INST(ProfileChanger)
});
#undef FEAT_INST
diff --git a/cheat-library/src/user/cheat/visuals/ProfileChanger.cpp b/cheat-library/src/user/cheat/visuals/ProfileChanger.cpp
new file mode 100644
index 0000000..4a30986
--- /dev/null
+++ b/cheat-library/src/user/cheat/visuals/ProfileChanger.cpp
@@ -0,0 +1,244 @@
+#include "pch-il2cpp.h"
+#include "ProfileChanger.h"
+
+#include
+#include
+#include
+#include
+
+
+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", false),
+ NF(f_UID, "UID", "Visuals", false),
+ NF(f_NickName, "NickName", "Visuals", false),
+ NF(f_Level, "Level", "Visuals", false),
+ NF(f_Exp, "Exp", "Visuals", false),
+ NF(f_CurExp, "CurExp", "Visuals", 1),
+ NF(f_MaxExp, "MaxExp", "Visuals", 1),
+ NF(f_ExpBar, "ExpBar", "Visuals", false),
+ NF(f_ExpBarValue, "ExpBarValue", "Visuals", 20.0f),
+ NF(f_WorldLevel, "WorldLevel", "Visuals", false),
+ NF(f_Avatar, "AvatarImage", "Visuals", false),
+ NF(f_Card, "CardImage", "Visuals", 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(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);
+ }
+}
\ No newline at end of file
diff --git a/cheat-library/src/user/cheat/visuals/ProfileChanger.h b/cheat-library/src/user/cheat/visuals/ProfileChanger.h
new file mode 100644
index 0000000..6d157d4
--- /dev/null
+++ b/cheat-library/src/user/cheat/visuals/ProfileChanger.h
@@ -0,0 +1,44 @@
+#pragma once
+#include
+#include
+#include
+
+namespace cheat::feature
+{
+ class ProfileChanger : public Feature
+ {
+ public:
+ config::Field> f_Enabled;
+ config::Field> f_UID;
+ config::Field> f_NickName;
+ config::Field> f_Level;
+ config::Field> f_Exp;
+ config::Field f_CurExp;
+ config::Field f_MaxExp;
+ config::Field> f_ExpBar;
+ config::Field f_ExpBarValue;
+ config::Field> f_WorldLevel;
+
+ config::Field> f_Avatar; // Avatar png size 256x256
+ config::Field> 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 toBeUpdate;
+ SafeValue nextUpdate;
+ int f_DelayUpdate = 100.f;
+
+ void OnGameUpdate();
+ ProfileChanger();
+
+ };
+}
\ No newline at end of file
diff --git a/cheat-library/src/user/cheat/world/DialogSkip.cpp b/cheat-library/src/user/cheat/world/DialogSkip.cpp
index 6449b51..2593fe4 100644
--- a/cheat-library/src/user/cheat/world/DialogSkip.cpp
+++ b/cheat-library/src/user/cheat/world/DialogSkip.cpp
@@ -4,20 +4,23 @@
#include
#include
-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 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);
+ }
}
diff --git a/cheat-library/src/user/cheat/world/DialogSkip.h b/cheat-library/src/user/cheat/world/DialogSkip.h
index 4d3731d..4079bef 100644
--- a/cheat-library/src/user/cheat/world/DialogSkip.h
+++ b/cheat-library/src/user/cheat/world/DialogSkip.h
@@ -2,16 +2,17 @@
#include
#include
-namespace cheat::feature
+namespace cheat::feature
{
class DialogSkip : public Feature
- {
+ {
public:
config::Field> f_Enabled;
config::Field> f_AutoSelectDialog;
config::Field> f_ExcludeImportant;
config::Field> f_FastDialog;
+ config::Field> f_CutsceneUSM;
config::Field f_TimeSpeedup;
static DialogSkip& GetInstance();
@@ -23,7 +24,7 @@ namespace cheat::feature
void DrawStatus() override;
void OnCutScenePageUpdate(app::InLevelCutScenePageContext* context);
-
+
private:
DialogSkip();
};