InfiniteStamina.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "InfiniteStamina.h"
  2. namespace cheat {
  3. void DataItem_HandleNormalProp_Hook(app::DataItem* __this, uint32_t type, int64_t value, app::DataPropOp__Enum state);
  4. void VCHumanoidMove_Scara_Hook(app::VCHumanoidMove* __this, float val);
  5. void LevelSyncCombatPlugin_RequestSceneEntityMoveReq_Hook(app::LevelSyncCombatPlugin* __this, uint32_t entityId, app::MotionInfo* syncInfo, bool isReliable, uint32_t reliableSeq);
  6. InfiniteStamina::InfiniteStamina() {
  7. f_Enabled = config::getValue("functions:InfiniteStamina", "enabled", false);
  8. f_Hotkey = Hotkey("functions:InfiniteStamina");
  9. HookManager::install(app::MoleMole_DataItem_HandleNormalProp, DataItem_HandleNormalProp_Hook);
  10. HookManager::install(app::VCHumanoidMove_Scara, VCHumanoidMove_Scara_Hook);
  11. HookManager::install(app::MoleMole_LevelSyncCombatPlugin_RequestSceneEntityMoveReq, LevelSyncCombatPlugin_RequestSceneEntityMoveReq_Hook);
  12. }
  13. InfiniteStamina& InfiniteStamina::getInstance() {
  14. static InfiniteStamina instance;
  15. return instance;
  16. }
  17. void InfiniteStamina::GUI() {
  18. ConfigCheckbox(_("INFINITE_STAMINA_TITLE"), f_Enabled, _("INFINITE_STAMINA_DESCRIPTION"));
  19. if (f_Enabled.getValue()) {
  20. ImGui::Indent();
  21. f_Hotkey.Draw();
  22. ImGui::Unindent();
  23. }
  24. }
  25. void InfiniteStamina::Outer() {
  26. if (f_Hotkey.IsPressed())
  27. f_Enabled.setValue(!f_Enabled.getValue());
  28. }
  29. void InfiniteStamina::Status() {
  30. if (f_Enabled.getValue())
  31. ImGui::Text(_("INFINITE_STAMINA_TITLE"));
  32. }
  33. std::string InfiniteStamina::getModule() {
  34. return _("MODULE_PLAYER");
  35. }
  36. bool InfiniteStamina::OnPropertySet(app::PropType__Enum propType) {
  37. using PT = app::PropType__Enum;
  38. static bool override_cheat = true;
  39. if (propType == PT::PROP_CUR_TEMPORARY_STAMINA)
  40. override_cheat = true;
  41. const bool result = !f_Enabled.getValue() || override_cheat ||
  42. (propType != PT::PROP_MAX_STAMINA &&
  43. propType != PT::PROP_CUR_PERSIST_STAMINA &&
  44. propType != PT::PROP_CUR_TEMPORARY_STAMINA);
  45. if (propType == PT::PROP_MAX_STAMINA)
  46. override_cheat = false;
  47. return result;
  48. }
  49. void LevelSyncCombatPlugin_RequestSceneEntityMoveReq_Hook(app::LevelSyncCombatPlugin* __this, uint32_t entityId, app::MotionInfo* syncInfo,
  50. bool isReliable, uint32_t reliableSeq) {
  51. static bool afterDash = false;
  52. auto& infiniteStamina = InfiniteStamina::getInstance();
  53. auto& manager = game::EntityManager::getInstance();
  54. auto entity = manager.entity(entityId);
  55. //LOG_DEBUG("entityType: %s", magic_enum::enum_name(entity->type()).data());
  56. if (entity->type() == app::EntityType__Enum_1::Vehicle || entity->isAvatar()) {
  57. if (infiniteStamina.f_Enabled.getValue()) {
  58. auto state = app::MotionInfo_get_State(syncInfo);
  59. //LOG_DEBUG("state: %s", magic_enum::enum_name(state).data());
  60. switch (state) {
  61. case app::MotionState__Enum::MotionDash:
  62. case app::MotionState__Enum::MotionClimb:
  63. case app::MotionState__Enum::MotionClimbJump:
  64. case app::MotionState__Enum::MotionStandbyToClimb:
  65. case app::MotionState__Enum::MotionSwimDash:
  66. case app::MotionState__Enum::MotionSwimIdle:
  67. case app::MotionState__Enum::MotionSwimMove:
  68. case app::MotionState__Enum::MotionSwimJump:
  69. case app::MotionState__Enum::MotionDiveDash:
  70. case app::MotionState__Enum::MotionDiveIdle:
  71. case app::MotionState__Enum::MotionDiveMove:
  72. case app::MotionState__Enum::MotionDiveSwimDash:
  73. case app::MotionState__Enum::MotionDiveSwimIdle:
  74. case app::MotionState__Enum::MotionDiveSwimMove:
  75. case app::MotionState__Enum::MotionFly:
  76. case app::MotionState__Enum::MotionFight:
  77. case app::MotionState__Enum::MotionDashBeforeShake:
  78. case app::MotionState__Enum::MotionDangerDash:
  79. app::MotionInfo_set_State(syncInfo, app::MotionState__Enum::MotionRun);
  80. break;
  81. case app::MotionState__Enum::MotionJump:
  82. if (afterDash)
  83. app::MotionInfo_set_State(syncInfo, app::MotionState__Enum::MotionRun);
  84. break;
  85. case app::MotionState__Enum::MotionSkiffDash:
  86. case app::MotionState__Enum::MotionSkiffPoweredDash:
  87. app::MotionInfo_set_State(syncInfo, app::MotionState__Enum::MotionSkiffNormal);
  88. break;
  89. }
  90. if (state != app::MotionState__Enum::MotionJump && state != app::MotionState__Enum::MotionFallOnGround)
  91. afterDash = state == app::MotionState__Enum::MotionDash;
  92. }
  93. }
  94. CALL_ORIGIN(LevelSyncCombatPlugin_RequestSceneEntityMoveReq_Hook, __this, entityId, syncInfo, isReliable, reliableSeq);
  95. }
  96. void DataItem_HandleNormalProp_Hook(app::DataItem* __this, uint32_t type, int64_t value, app::DataPropOp__Enum state) {
  97. auto& infiniteStamina = InfiniteStamina::getInstance();
  98. //LOG_DEBUG("type: %d", type);
  99. auto propType = static_cast<app::PropType__Enum>(type);
  100. bool isValid = infiniteStamina.OnPropertySet(propType);
  101. if (isValid)
  102. CALL_ORIGIN(DataItem_HandleNormalProp_Hook, __this, type, value, state);
  103. }
  104. void VCHumanoidMove_Scara_Hook(app::VCHumanoidMove* __this, float val) {
  105. auto& infiniteStamina = InfiniteStamina::getInstance();
  106. if (infiniteStamina.f_Enabled.getValue())
  107. val = 34028234663852885981170418348451692544.0f;
  108. CALL_ORIGIN(VCHumanoidMove_Scara_Hook, __this, val);
  109. }
  110. }