diff --git a/cheat-library/cheat-library.vcxproj b/cheat-library/cheat-library.vcxproj
index 12cc502..349d0b9 100644
--- a/cheat-library/cheat-library.vcxproj
+++ b/cheat-library/cheat-library.vcxproj
@@ -24,6 +24,7 @@
+
@@ -117,6 +118,7 @@
+
diff --git a/cheat-library/cheat-library.vcxproj.filters b/cheat-library/cheat-library.vcxproj.filters
index c949b36..0dcfe1c 100644
--- a/cheat-library/cheat-library.vcxproj.filters
+++ b/cheat-library/cheat-library.vcxproj.filters
@@ -255,6 +255,9 @@
Header Files
+
+ Header Files
+
@@ -468,6 +471,9 @@
Source Files
+
+ Source Files
+
diff --git a/cheat-library/src/appdata/il2cpp-unityplayer-functions.h b/cheat-library/src/appdata/il2cpp-unityplayer-functions.h
index 49e1837..a0e8adf 100644
--- a/cheat-library/src/appdata/il2cpp-unityplayer-functions.h
+++ b/cheat-library/src/appdata/il2cpp-unityplayer-functions.h
@@ -2,4 +2,5 @@ using namespace app;
DO_APP_FUNC(0x00B7B980, app::Byte__Array*, Unity_RecordUserData, (int32_t nType));
DO_APP_FUNC(0x00B1B220, Il2CppClass**, GetIl2Classes, ());
+DO_APP_FUNC(0x01093820, int, CrashReporter, (__int64 a1, __int64 a2, const char* a3));
DO_APP_FUNC(0x00DCE2B0, void, Animator_set_avatar, (Animator* __this, Avatar* value, MethodInfo* method));
\ No newline at end of file
diff --git a/cheat-library/src/user/cheat/cheat.cpp b/cheat-library/src/user/cheat/cheat.cpp
index 1dbdcae..234b7f9 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
@@ -97,6 +98,7 @@ namespace cheat
FEAT_INST(FreezeEnemies),
FEAT_INST(ElementalSight),
FEAT_INST(KillAura),
+ FEAT_INST(AutoChallenge),
FEAT_INST(MobVacuum),
FEAT_INST(FakeTime),
diff --git a/cheat-library/src/user/cheat/game/filters.cpp b/cheat-library/src/user/cheat/game/filters.cpp
index 3c23e4f..1c4ce2a 100644
--- a/cheat-library/src/user/cheat/game/filters.cpp
+++ b/cheat-library/src/user/cheat/game/filters.cpp
@@ -320,7 +320,8 @@ namespace cheat::game::filters
WhitelistFilter DreamForm = { {EntityType__Enum_1::Field, EntityType__Enum_1::Platform }, "_AnimalSeelie" };
SimpleFilter StarlightCoalescence = { EntityType__Enum_1::Field, "_PaperStar" };
SimpleFilter TheRavenForum = { EntityType__Enum_1::Gadget, "_NightCrowStatue" };
-
+ WhitelistFilter TimeTrialChallengeCollection = { { EntityType__Enum_1::Field, EntityType__Enum_1::Gadget }, { "SkillObj_EmptyGadget", "_GlideChampOrb" } };
+ SimpleFilter Bombbarrel = { EntityType__Enum_1::Gadget, "_Bombbarrel" };
}
namespace combined
diff --git a/cheat-library/src/user/cheat/game/filters.h b/cheat-library/src/user/cheat/game/filters.h
index 2edd84f..f7d8f05 100644
--- a/cheat-library/src/user/cheat/game/filters.h
+++ b/cheat-library/src/user/cheat/game/filters.h
@@ -320,6 +320,8 @@ namespace cheat::game::filters
extern WhitelistFilter DreamForm;
extern SimpleFilter StarlightCoalescence;
extern SimpleFilter TheRavenForum;
+ extern WhitelistFilter TimeTrialChallengeCollection;
+ extern SimpleFilter Bombbarrel;
}
namespace combined
diff --git a/cheat-library/src/user/cheat/misc/ProtectionBypass.cpp b/cheat-library/src/user/cheat/misc/ProtectionBypass.cpp
index c326a06..c878937 100644
--- a/cheat-library/src/user/cheat/misc/ProtectionBypass.cpp
+++ b/cheat-library/src/user/cheat/misc/ProtectionBypass.cpp
@@ -13,11 +13,17 @@ namespace cheat::feature
return inst.OnRecordUserData(nType);
}
+ static int CrashReporter_Hook(__int64 a1, __int64 a2, const char* a3)
+ {
+ return 0;
+ }
+
ProtectionBypass::ProtectionBypass() : Feature(),
NFEX(f_Enabled, "Disable Protection", "m_DisableMhyProt", "General", true, false),
m_CorrectSignatures({})
{
HookManager::install(app::Unity_RecordUserData, RecordUserData_Hook);
+ HookManager::install(app::CrashReporter, CrashReporter_Hook);
}
void ProtectionBypass::Init()
diff --git a/cheat-library/src/user/cheat/player/InfiniteStamina.cpp b/cheat-library/src/user/cheat/player/InfiniteStamina.cpp
index dd256b2..ce26e8d 100644
--- a/cheat-library/src/user/cheat/player/InfiniteStamina.cpp
+++ b/cheat-library/src/user/cheat/player/InfiniteStamina.cpp
@@ -79,36 +79,41 @@ namespace cheat::feature
static bool afterDash = false;
auto& manager = game::EntityManager::instance();
- if (manager.avatar()->runtimeID() != entityId)
- return;
-
- // LOG_DEBUG("Movement packet: %s", magic_enum::enum_name(syncInfo->fields.motionState).data());
- if (f_Enabled && f_PacketReplacement)
+ auto entity = manager.entity(entityId);
+ if (entity->type() == app::EntityType__Enum_1::Vehicle || entity->isAvatar())
{
- auto state = syncInfo->fields.motionState;
- switch (state)
+ // LOG_DEBUG("Movement packet: %s", magic_enum::enum_name(syncInfo->fields.motionState).data());
+ if (f_Enabled && f_PacketReplacement)
{
- case app::MotionState__Enum::MotionDash:
- case app::MotionState__Enum::MotionClimb:
- case app::MotionState__Enum::MotionClimbJump:
- case app::MotionState__Enum::MotionStandbyToClimb:
- case app::MotionState__Enum::MotionSwimDash:
- case app::MotionState__Enum::MotionSwimIdle:
- case app::MotionState__Enum::MotionSwimMove:
- case app::MotionState__Enum::MotionSwimJump:
- case app::MotionState__Enum::MotionFly:
- case app::MotionState__Enum::MotionFight:
- case app::MotionState__Enum::MotionDashBeforeShake:
- case app::MotionState__Enum::MotionDangerDash:
- syncInfo->fields.motionState = app::MotionState__Enum::MotionRun;
- break;
- case app::MotionState__Enum::MotionJump:
- if (afterDash)
+ auto state = syncInfo->fields.motionState;
+ switch (state)
+ {
+ case app::MotionState__Enum::MotionDash:
+ case app::MotionState__Enum::MotionClimb:
+ case app::MotionState__Enum::MotionClimbJump:
+ case app::MotionState__Enum::MotionStandbyToClimb:
+ case app::MotionState__Enum::MotionSwimDash:
+ case app::MotionState__Enum::MotionSwimIdle:
+ case app::MotionState__Enum::MotionSwimMove:
+ case app::MotionState__Enum::MotionSwimJump:
+ case app::MotionState__Enum::MotionFly:
+ case app::MotionState__Enum::MotionFight:
+ case app::MotionState__Enum::MotionDashBeforeShake:
+ case app::MotionState__Enum::MotionDangerDash:
syncInfo->fields.motionState = app::MotionState__Enum::MotionRun;
- break;
+ break;
+ case app::MotionState__Enum::MotionJump:
+ if (afterDash)
+ syncInfo->fields.motionState = app::MotionState__Enum::MotionRun;
+ break;
+ case app::MotionState__Enum::MotionSkiffDash:
+ case app::MotionState__Enum::MotionSkiffPoweredDash:
+ syncInfo->fields.motionState = app::MotionState__Enum::MotionSkiffNormal;
+ break;
+ }
+ if (state != app::MotionState__Enum::MotionJump && state != app::MotionState__Enum::MotionFallOnGround)
+ afterDash = state == app::MotionState__Enum::MotionDash;
}
- if (state != app::MotionState__Enum::MotionJump && state != app::MotionState__Enum::MotionFallOnGround)
- afterDash = state == app::MotionState__Enum::MotionDash;
}
}
diff --git a/cheat-library/src/user/cheat/visuals/FreeCamera.cpp b/cheat-library/src/user/cheat/visuals/FreeCamera.cpp
index b39819f..9729259 100644
--- a/cheat-library/src/user/cheat/visuals/FreeCamera.cpp
+++ b/cheat-library/src/user/cheat/visuals/FreeCamera.cpp
@@ -11,6 +11,8 @@ namespace cheat::feature
app::GameObject* mainCam = nullptr;
app::Object_1* freeCamObj = nullptr;
app::Object_1* mainCamObj = nullptr;
+ app::GameObject* damageOverlay = nullptr;
+ app::GameObject* hpOverlay = nullptr;
app::Transform* freeCam_Transform;
app::Component_1* freeCam_Camera;
app::Component_1* mainCam_Camera;
@@ -22,6 +24,8 @@ namespace cheat::feature
FreeCamera::FreeCamera() : Feature(),
NF(f_Enabled, "Free Camera", "Visuals::FreeCamera", false),
NF(f_FreezeAnimation, "Freeze Character Animation", "Visuals::FreeCamera", false),
+ NF(f_DamageOverlay, "Damage Overlay", "Visuals::FreeCamera", false),
+ NF(f_HpOverlay, "Enemy HP Overlay", "Visuals::FreeCamera", false),
NF(f_Speed, "Speed", "Visuals::FreeCamera", 1.0f),
NF(f_LookSens, "Look Sensitivity", "Visuals::FreeCamera", 1.0f),
NF(f_RollSpeed, "Roll Speed", "Visuals::FreeCamera", 1.0f),
@@ -52,7 +56,13 @@ namespace cheat::feature
void FreeCamera::DrawMain()
{
ConfigWidget("Enable", f_Enabled);
- ConfigWidget("Freeze Character Animation", f_FreezeAnimation, "Freezes the active character's animation.\nAfter disabling, jump to un-freeze your character.");
+ ConfigWidget("Freeze Character Animation", f_FreezeAnimation, "Freezes the active character's animation.");
+ if (f_Enabled)
+ {
+ ConfigWidget("Toggle Damage Overlay", f_DamageOverlay, "Remove damage output overlay");
+ ConfigWidget("Toggle Enemy HP Overlay", f_HpOverlay, "Remove enemy HP overlay");
+ }
+
if (ImGui::BeginTable("FreeCameraDrawTable", 1, ImGuiTableFlags_NoBordersInBody))
{
ImGui::TableNextRow();
@@ -245,9 +255,23 @@ namespace cheat::feature
}
if (freeCamObj)
EnableFreeCam();
+
+ if (damageOverlay == nullptr)
+ damageOverlay = app::GameObject_Find(string_to_il2cppi("/Canvas/Pages/InLevelMainPage/GrpMainPage/ParticleDamageTextContainer"), nullptr);
+ else
+ app::GameObject_SetActive(damageOverlay, !f_DamageOverlay, nullptr);
+
+ if (hpOverlay == nullptr)
+ hpOverlay = app::GameObject_Find(string_to_il2cppi("AvatarBoardCanvasV2(Clone)"), nullptr);
+ else
+ app::GameObject_SetActive(hpOverlay, !f_DamageOverlay, nullptr);
}
else
+ {
DisableFreeCam();
+ damageOverlay = nullptr;
+ hpOverlay = nullptr;
+ }
// Taiga#5555: There's probably be a better way of implementing this. But for now, this is just what I came up with.
auto& manager = game::EntityManager::instance();
@@ -256,17 +280,24 @@ namespace cheat::feature
if (animator == nullptr && rigidBody == nullptr)
return;
+ static bool changed = false;
+
if (f_FreezeAnimation)
{
//auto constraints = app::Rigidbody_get_constraints(rigidBody, nullptr);
//LOG_DEBUG("%s", magic_enum::enum_name(constraints).data());
app::Rigidbody_set_constraints(rigidBody, app::RigidbodyConstraints__Enum::FreezePosition, nullptr);
app::Animator_set_speed(animator, 0.f, nullptr);
+ changed = false;
}
else
{
app::Rigidbody_set_constraints(rigidBody, app::RigidbodyConstraints__Enum::FreezeRotation, nullptr);
- app::Animator_set_speed(animator, 1.f, nullptr);
+ if (!changed)
+ {
+ app::Animator_set_speed(animator, 1.f, nullptr);
+ changed = true;
+ }
}
}
}
\ No newline at end of file
diff --git a/cheat-library/src/user/cheat/visuals/FreeCamera.h b/cheat-library/src/user/cheat/visuals/FreeCamera.h
index 1084b4a..800affb 100644
--- a/cheat-library/src/user/cheat/visuals/FreeCamera.h
+++ b/cheat-library/src/user/cheat/visuals/FreeCamera.h
@@ -9,6 +9,8 @@ namespace cheat::feature
public:
config::Field> f_Enabled;
config::Field> f_FreezeAnimation;
+ config::Field f_DamageOverlay;
+ config::Field f_HpOverlay;
config::Field f_Speed;
config::Field f_LookSens;
config::Field f_RollSpeed;
diff --git a/cheat-library/src/user/cheat/world/AutoChallenge.cpp b/cheat-library/src/user/cheat/world/AutoChallenge.cpp
new file mode 100644
index 0000000..8c44081
--- /dev/null
+++ b/cheat-library/src/user/cheat/world/AutoChallenge.cpp
@@ -0,0 +1,85 @@
+#include "pch-il2cpp.h"
+#include "AutoChallenge.h"
+
+#include
+#include
+#include
+
+namespace cheat::feature
+{
+
+ AutoChallenge::AutoChallenge() : Feature(),
+ NF(f_Enabled, "Auto challenge", "AutoChallenge", false),
+ NF(f_BombDestroy, "Bomb destroy", "AutoChallenge", false),
+ NF(f_Delay, "Collect delay", "AutoChallenge", 1000),
+ NF(f_Range, "Collect range", "AutoChallenge", 20.f)
+ {
+ events::GameUpdateEvent += MY_METHOD_HANDLER(AutoChallenge::OnGameUpdate);
+ }
+
+ const FeatureGUIInfo& AutoChallenge::GetGUIInfo() const
+ {
+ static const FeatureGUIInfo info{ "Auto Challenge", "World", true };
+ return info;
+ }
+
+ void AutoChallenge::DrawMain()
+ {
+ ConfigWidget("Enabled", f_Enabled, "Auto collect time challenge item");
+ ImGui::SameLine();
+ ConfigWidget("Destroy Bomb", f_BombDestroy, "Auto destroy bombbarrel");
+ ImGui::SameLine();
+ ImGui::TextColored(ImColor(255, 165, 0, 255), "I haven't tested how high the risk is");
+ ImGui::SetNextItemWidth(200.f);
+ ConfigWidget("Range", f_Range, 0.1f, 0.f, 300.f, "Collect range.");
+ ImGui::SameLine();
+ ImGui::SetNextItemWidth(200.f);
+ ConfigWidget("Delay", f_Delay, 1, 0, 2000, "Collect delay.");
+ }
+
+ bool AutoChallenge::NeedStatusDraw() const
+ {
+ return f_Enabled;
+ }
+
+ void AutoChallenge::DrawStatus()
+ {
+ ImGui::Text("Challenge [%.01fm]", f_Range.value());
+ }
+
+ AutoChallenge& AutoChallenge::GetInstance()
+ {
+ static AutoChallenge instance;
+ return instance;
+ }
+
+ void AutoChallenge::OnGameUpdate()
+ {
+ static uint64_t lastTime = 0;
+ auto timestamp = app::MoleMole_TimeUtil_get_NowTimeStamp(nullptr);
+
+ if (!f_Enabled || lastTime + f_Delay > timestamp)
+ return;
+
+ auto& entityManager = game::EntityManager::instance();
+ auto avatarEntity = entityManager.avatar();
+
+ for (auto& entity : entityManager.entities(game::filters::puzzle::TimeTrialChallengeCollection))
+ {
+ if (avatarEntity->distance(entity) > f_Range)
+ continue;
+
+ auto combat = entity->combat();
+ if (combat != nullptr)
+ {
+ auto combatProp = combat->fields._combatProperty_k__BackingField;
+ auto maxHP = app::MoleMole_SafeFloat_get_Value(combatProp->fields.maxHP, nullptr);
+ // so many entities named "SkillObj_EmptyGadget", but the collection's hp is 99999.f
+ if (maxHP > 99998 && maxHP < 99999.9)
+ {
+ entity->setRelativePosition(avatarEntity->relativePosition());
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/cheat-library/src/user/cheat/world/AutoChallenge.h b/cheat-library/src/user/cheat/world/AutoChallenge.h
new file mode 100644
index 0000000..f8bcaf9
--- /dev/null
+++ b/cheat-library/src/user/cheat/world/AutoChallenge.h
@@ -0,0 +1,30 @@
+#pragma once
+#include
+#include
+
+namespace cheat::feature
+{
+
+ class AutoChallenge : public Feature
+ {
+ public:
+ config::Field> f_Enabled;
+ config::Field> f_BombDestroy;
+ config::Field f_Delay;
+ config::Field f_Range;
+
+ static AutoChallenge& GetInstance();
+
+ void OnGameUpdate();
+
+ const FeatureGUIInfo& GetGUIInfo() const override;
+ void DrawMain() override;
+
+ virtual bool NeedStatusDraw() const override;
+ void DrawStatus() override;
+
+ private:
+ AutoChallenge();
+ };
+}
+
diff --git a/cheat-library/src/user/cheat/world/AutoDestroy.cpp b/cheat-library/src/user/cheat/world/AutoDestroy.cpp
index 3f873e2..34ae4b5 100644
--- a/cheat-library/src/user/cheat/world/AutoDestroy.cpp
+++ b/cheat-library/src/user/cheat/world/AutoDestroy.cpp
@@ -7,6 +7,7 @@
#include
#include
#include
+#include
#include
namespace cheat::feature
@@ -81,7 +82,17 @@ namespace cheat::feature
{
auto& manager = game::EntityManager::instance();
auto& autoDestroy = AutoDestroy::GetInstance();
+ auto& autoChallenge = AutoChallenge::GetInstance();
auto entity = __this->fields._._._entity;
+ // call origin ReduceModifierDurability without correct modifierDurabilityIndex will coz game crash.
+ // so use this hook function to destroy challenge's bombbarrel
+ if (autoChallenge.f_Enabled && autoChallenge.f_BombDestroy &&
+ autoChallenge.f_Range > manager.avatar()->distance(entity) &&
+ game::filters::puzzle::Bombbarrel.IsValid(manager.entity(entity))
+ )
+ {
+ reduceDurability = 1000.f;
+ }
if (autoDestroy.f_Enabled &&
autoDestroy.f_Range > manager.avatar()->distance(entity) &&
(