Merge branch 'Akebi-Group:master' into master

This commit is contained in:
lunatic 2022-07-28 20:44:41 +07:00 committed by GitHub
commit 80068a7d69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 214 additions and 11 deletions

View File

@ -24,6 +24,7 @@
<ClInclude Include="src\user\cheat\visuals\TextureChanger.h" /> <ClInclude Include="src\user\cheat\visuals\TextureChanger.h" />
<ClInclude Include="src\user\cheat\visuals\FreeCamera.h" /> <ClInclude Include="src\user\cheat\visuals\FreeCamera.h" />
<ClInclude Include="src\user\cheat\world\AutoSeelie.h" /> <ClInclude Include="src\user\cheat\world\AutoSeelie.h" />
<ClInclude Include="src\user\cheat\world\CustomWeather.h" />
<ClInclude Include="src\user\cheat\world\FakeTime.h" /> <ClInclude Include="src\user\cheat\world\FakeTime.h" />
<ClInclude Include="src\user\cheat\debugger.h"> <ClInclude Include="src\user\cheat\debugger.h">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WS|x64'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WS|x64'">false</ExcludedFromBuild>
@ -115,6 +116,7 @@
<ClCompile Include="src\user\cheat\visuals\TextureChanger.cpp" /> <ClCompile Include="src\user\cheat\visuals\TextureChanger.cpp" />
<ClCompile Include="src\user\cheat\visuals\FreeCamera.cpp" /> <ClCompile Include="src\user\cheat\visuals\FreeCamera.cpp" />
<ClCompile Include="src\user\cheat\world\AutoSeelie.cpp" /> <ClCompile Include="src\user\cheat\world\AutoSeelie.cpp" />
<ClCompile Include="src\user\cheat\world\CustomWeather.cpp" />
<ClCompile Include="src\user\cheat\world\FakeTime.cpp" /> <ClCompile Include="src\user\cheat\world\FakeTime.cpp" />
<ClCompile Include="src\user\cheat\debugger.cpp"> <ClCompile Include="src\user\cheat\debugger.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>

View File

@ -249,6 +249,9 @@
<ClInclude Include="src\user\cheat\world\FreezeEnemies.h"> <ClInclude Include="src\user\cheat\world\FreezeEnemies.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="src\user\cheat\world\CustomWeather.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Font Include="res\Ruda-Bold.ttf" /> <Font Include="res\Ruda-Bold.ttf" />
@ -456,6 +459,9 @@
<ClCompile Include="src\user\cheat\world\FreezeEnemies.cpp"> <ClCompile Include="src\user\cheat\world\FreezeEnemies.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="src\user\cheat\world\CustomWeather.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="res\res.rc"> <ResourceCompile Include="res\res.rc">

View File

@ -51,8 +51,7 @@ DO_APP_FUNC(0x026F0820, bool, MoleMole_LCAvatarCombat_IsEnergyMax, (void* __this
DO_APP_FUNC(0x026F0500, void, MoleMole_LCAvatarCombat_ChangeEnergy_1, (LCAvatarCombat* __this, ElementType__Enum type, float value, DataPropOp__Enum state, MethodInfo* method)); DO_APP_FUNC(0x026F0500, void, MoleMole_LCAvatarCombat_ChangeEnergy_1, (LCAvatarCombat* __this, ElementType__Enum type, float value, DataPropOp__Enum state, MethodInfo* method));
DO_APP_FUNC(0x026F13C0, bool, MoleMole_LCAvatarCombat_OnSkillStart, (LCAvatarCombat* __this, uint32_t skillID, float cdMultipler, MethodInfo* method)); DO_APP_FUNC(0x026F13C0, bool, MoleMole_LCAvatarCombat_OnSkillStart, (LCAvatarCombat* __this, uint32_t skillID, float cdMultipler, MethodInfo* method));
DO_APP_FUNC(0x026F54A0, bool, MoleMole_LCAvatarCombat_IsSkillInCD_1, (LCAvatarCombat* __this, LCAvatarCombat_LCAvatarCombat_SkillInfo* skillInfo, MethodInfo* method)); DO_APP_FUNC(0x026F54A0, bool, MoleMole_LCAvatarCombat_IsSkillInCD_1, (LCAvatarCombat* __this, LCAvatarCombat_LCAvatarCombat_SkillInfo* skillInfo, MethodInfo* method));
DO_APP_FUNC(0x02DB4680, void, MoleMole_ActorAbilityPlugin_AddDynamicFloatWithRange, (MoleMole_ActorAbilityPlugin* __this, String* key, float value, float min, float max, bool forceDoAtRemote, MethodInfo* method));
DO_APP_FUNC(0x02DB4680, void, MoleMole_ActorAbilityPlugin_AddDynamicFloatWithRange, (void* __this, String* key, float value, float min, float max, bool forceDoAtRemote, MethodInfo* method));
// Rapid fire // Rapid fire
DO_APP_FUNC(0x017B1D50, void, MoleMole_LCBaseCombat_DoHitEntity, (LCBaseCombat* __this, uint32_t targetID, AttackResult* attackResult, bool ignoreCheckCanBeHitInMP, MethodInfo* method)); DO_APP_FUNC(0x017B1D50, void, MoleMole_LCBaseCombat_DoHitEntity, (LCBaseCombat* __this, uint32_t targetID, AttackResult* attackResult, bool ignoreCheckCanBeHitInMP, MethodInfo* method));
@ -155,6 +154,11 @@ DO_APP_FUNC(0x012BC260, void, CookingQtePageContext_CloseItemGotPanel, (CookingQ
DO_APP_FUNC(0x02A37D50, Button_1*, ProfilePage, (MonoInLevelPlayerProfilePage* __this, MethodInfo* method)); // MonoInLevelPlayerProfilePage_get_logoutButton DO_APP_FUNC(0x02A37D50, Button_1*, ProfilePage, (MonoInLevelPlayerProfilePage* __this, MethodInfo* method)); // MonoInLevelPlayerProfilePage_get_logoutButton
DO_APP_FUNC(0x01B101B0, void, ProfileEditPage, (MonoFriendInformationDialog* __this, Sprite* value, MethodInfo* method)); // MonoFriendInformationDialog_set_icon DO_APP_FUNC(0x01B101B0, void, ProfileEditPage, (MonoFriendInformationDialog* __this, Sprite* value, MethodInfo* method)); // MonoFriendInformationDialog_set_icon
// Custom Weather | RyujinZX#6666
DO_APP_FUNC(0x027774F0, bool, EnviroSky_ChangeWeather, (void* /*app::EnviroSky*/ __this, String* weatherPath, float transTime, float ratio, MethodInfo* method));
DO_APP_FUNC(0x014EDB10, void* /*app::EnviroSky*/, EnviroSky_get_Instance, (MethodInfo* method));
// Free Camera // Free Camera
DO_APP_FUNC(0x057E9C00, float, Camera_get_fieldOfView, (Camera* __this, MethodInfo* method)); DO_APP_FUNC(0x057E9C00, float, Camera_get_fieldOfView, (Camera* __this, MethodInfo* method));
DO_APP_FUNC(0x057EA060, void, Camera_set_fieldOfView, (Camera* __this, float value, MethodInfo* method)); DO_APP_FUNC(0x057EA060, void, Camera_set_fieldOfView, (Camera* __this, float value, MethodInfo* method));
@ -245,6 +249,7 @@ DO_APP_FUNC(0x0596AFF0, LCBaseCombat*, MoleMole_BaseEntity_GetLogicCombatCompone
DO_APP_FUNC_METHODINFO(0x099D4410, MoleMole_BaseEntity_GetLogicCombatComponent_1__MethodInfo); DO_APP_FUNC_METHODINFO(0x099D4410, MoleMole_BaseEntity_GetLogicCombatComponent_1__MethodInfo);
DO_APP_FUNC(0x031ACE30, String*, MoleMole_BaseEntity_ToStringRelease, (BaseEntity* __this, MethodInfo* method)); DO_APP_FUNC(0x031ACE30, String*, MoleMole_BaseEntity_ToStringRelease, (BaseEntity* __this, MethodInfo* method));
DO_APP_FUNC(0x03180C10, void, MoleMole_BaseEntity_SetRelativePosition, (BaseEntity* __this, Vector3 position, bool forceSyncToRigidbody, MethodInfo* method)); DO_APP_FUNC(0x03180C10, void, MoleMole_BaseEntity_SetRelativePosition, (BaseEntity* __this, Vector3 position, bool forceSyncToRigidbody, MethodInfo* method));
DO_APP_FUNC(0x0319D8B0, void, MoleMole_BaseEntity_SetAbsolutePosition, (BaseEntity* __this, Vector3 abpos, bool forceSyncToRigidbody, MethodInfo* method)); DO_APP_FUNC(0x0319D8B0, void, MoleMole_BaseEntity_SetAbsolutePosition, (BaseEntity* __this, Vector3 abpos, bool forceSyncToRigidbody, MethodInfo* method));
DO_APP_FUNC(0x031AA160, Vector3, MoleMole_BaseEntity_GetAbsolutePosition, (BaseEntity* __this, MethodInfo* method)); DO_APP_FUNC(0x031AA160, Vector3, MoleMole_BaseEntity_GetAbsolutePosition, (BaseEntity* __this, MethodInfo* method));

View File

@ -11975,6 +11975,29 @@ namespace app {
struct Avatar__Fields fields; struct Avatar__Fields fields;
}; };
struct MoleMole_ActorAbilityPlugin__Fields {
struct BaseComponentPlugin__Fields _;
struct Action_3_MoleMole_BaseEntity_MoleMole_Config_AddGlobalValue_MoleMole_ActorAbility_* _addGlobalValueHandlerClosureDelegate;
struct Action_3_MoleMole_BaseEntity_MoleMole_Config_SetGlobalValue_MoleMole_ActorAbility_* _setGlobalValueHandlerClosureDelegate;
struct Action_3_MoleMole_BaseEntity_MoleMole_Config_MultiplyGlobalValue_MoleMole_ActorAbility_* _multiplyGlobalValueHandlerClosureDelegate;
struct Action_4_MoleMole_BaseEntity_MoleMole_Config_MultiplyGlobalValue_MoleMole_ActorAbility_Single_* MEEAPCINNBE;
struct Action_4_MoleMole_BaseEntity_String_Single_CPKJHKOJDIF_* LLAIOCNHNPM;
struct List_1_MoleMole_MonoEffectProxyHandle_* _effectProxyListCache;
struct List_1_MoleMole_MonoEffectProxyHandle_* _effectProxyListCacheForChangFollowDampTime;
struct List_1_UnityEngine_Vector3_* _pushedPosList;
struct MoleMole_LCAbility* _owner;
struct List_1_MoleMole_ActorAbility_* _appliedAbilities;
struct Dictionary_2_System_UInt32_System_Int32_* _appliedAbilitiesIndex;
struct Dictionary_2_System_String_MoleMole_ActorAbility_* CKDBIBGCPOB;
uint32_t nextValidAbilityID;
};
struct MoleMole_ActorAbilityPlugin {
struct MoleMole_ActorAbilityPlugin__Class* klass;
MonitorData* monitor;
struct MoleMole_ActorAbilityPlugin__Fields fields;
};
#if !defined(_GHIDRA_) && !defined(_IDA_) #if !defined(_GHIDRA_) && !defined(_IDA_)
} }
#endif #endif

View File

@ -42,6 +42,7 @@
#include <cheat/world/AutoFish.h> #include <cheat/world/AutoFish.h>
#include <cheat/world/AutoCook.h> #include <cheat/world/AutoCook.h>
#include <cheat/world/CustomWeather.h>
#include <cheat/visuals/NoFog.h> #include <cheat/visuals/NoFog.h>
#include <cheat/visuals/FPSUnlock.h> #include <cheat/visuals/FPSUnlock.h>
@ -109,6 +110,8 @@ namespace cheat
FEAT_INST(AutoFish), FEAT_INST(AutoFish),
FEAT_INST(AutoCook), FEAT_INST(AutoCook),
FEAT_INST(CustomWeather),
FEAT_INST(NoFog), FEAT_INST(NoFog),
FEAT_INST(FPSUnlock), FEAT_INST(FPSUnlock),
FEAT_INST(CameraZoom), FEAT_INST(CameraZoom),

View File

@ -222,6 +222,7 @@ namespace cheat::game::filters
SimpleFilter RishbolandTiger = { EntityType__Enum_1::Monster, "_Megamoth_" }; SimpleFilter RishbolandTiger = { EntityType__Enum_1::Monster, "_Megamoth_" };
SimpleFilter ShaggySumpterBeast = { EntityType__Enum_1::Monster, "_Panther" }; SimpleFilter ShaggySumpterBeast = { EntityType__Enum_1::Monster, "_Panther" };
SimpleFilter Spincrocodile = { EntityType__Enum_1::Monster, "_Gator" }; SimpleFilter Spincrocodile = { EntityType__Enum_1::Monster, "_Gator" };
SimpleFilter SentryTurrets = { EntityType__Enum_1::Field, "SentryTurrets_" };
} }
namespace plant namespace plant
@ -529,5 +530,7 @@ namespace cheat::game::filters
SimpleFilter OrganicTargets = { Monsters, Animals }; // Solael: Please don't mess around with this filter. SimpleFilter OrganicTargets = { Monsters, Animals }; // Solael: Please don't mess around with this filter.
//m0nkrel: We can choose the entities we need ourselves so as not to magnetize cats, dogs, etc. //m0nkrel: We can choose the entities we need ourselves so as not to magnetize cats, dogs, etc.
//AdvancedFilter Animals = { {EntityType__Enum_1::EnvAnimal, EntityType__Enum_1::Monster }, {"Crane", "Tit", "Boar", "Squirrel", "Fox", "Pigeon", "Wigeon", "Falcon" ,"Marten" } }; //AdvancedFilter Animals = { {EntityType__Enum_1::EnvAnimal, EntityType__Enum_1::Monster }, {"Crane", "Tit", "Boar", "Squirrel", "Fox", "Pigeon", "Wigeon", "Falcon" ,"Marten" } };
SimpleFilter Lightning = { EntityType__Enum_1::Lightning };
} }
} }

View File

@ -221,6 +221,7 @@ namespace cheat::game::filters
extern SimpleFilter RishbolandTiger; extern SimpleFilter RishbolandTiger;
extern SimpleFilter ShaggySumpterBeast; extern SimpleFilter ShaggySumpterBeast;
extern SimpleFilter Spincrocodile; extern SimpleFilter Spincrocodile;
extern SimpleFilter SentryTurrets;
} }
namespace plant namespace plant
@ -337,5 +338,6 @@ namespace cheat::game::filters
extern SimpleFilter MonsterEquips; extern SimpleFilter MonsterEquips;
extern BlacklistFilter Living; extern BlacklistFilter Living;
extern SimpleFilter OrganicTargets; extern SimpleFilter OrganicTargets;
extern SimpleFilter Lightning;
} }
} }

View File

@ -1358,6 +1358,12 @@ namespace cheat::feature
if (_monoMiniMap == nullptr) if (_monoMiniMap == nullptr)
return false; return false;
// Fix Exception in Console, when loading ptr null | RyujinZX#7832
if (_monoMiniMap->fields._._._._.m_CachedPtr == 0) {
_monoMiniMap = nullptr;
return false;
}
SAFE_BEGIN(); SAFE_BEGIN();
return app::Behaviour_get_isActiveAndEnabled(reinterpret_cast<app::Behaviour*>(_monoMiniMap), nullptr); return app::Behaviour_get_isActiveAndEnabled(reinterpret_cast<app::Behaviour*>(_monoMiniMap), nullptr);
SAFE_ERROR(); SAFE_ERROR();

View File

@ -11,7 +11,7 @@ namespace cheat::feature
static bool LCAvatarCombat_OnSkillStart(app::LCAvatarCombat* __this, uint32_t skillID, float cdMultipler, MethodInfo* method); static bool LCAvatarCombat_OnSkillStart(app::LCAvatarCombat* __this, uint32_t skillID, float cdMultipler, MethodInfo* method);
static bool LCAvatarCombat_IsSkillInCD_1(app::LCAvatarCombat* __this, app::LCAvatarCombat_LCAvatarCombat_SkillInfo* skillInfo, MethodInfo* method); static bool LCAvatarCombat_IsSkillInCD_1(app::LCAvatarCombat* __this, app::LCAvatarCombat_LCAvatarCombat_SkillInfo* skillInfo, MethodInfo* method);
static void ActorAbilityPlugin_AddDynamicFloatWithRange_Hook(void* __this, app::String* key, float value, float minValue, float maxValue, static void ActorAbilityPlugin_AddDynamicFloatWithRange_Hook(app::MoleMole_ActorAbilityPlugin* __this, app::String* key, float value, float minValue, float maxValue,
bool forceDoAtRemote, MethodInfo* method); bool forceDoAtRemote, MethodInfo* method);
static std::list<std::string> abilityLog; static std::list<std::string> abilityLog;
@ -28,6 +28,7 @@ namespace cheat::feature
HookManager::install(app::MoleMole_HumanoidMoveFSM_CheckSprintCooldown, HumanoidMoveFSM_CheckSprintCooldown_Hook); HookManager::install(app::MoleMole_HumanoidMoveFSM_CheckSprintCooldown, HumanoidMoveFSM_CheckSprintCooldown_Hook);
HookManager::install(app::MoleMole_ActorAbilityPlugin_AddDynamicFloatWithRange, ActorAbilityPlugin_AddDynamicFloatWithRange_Hook); HookManager::install(app::MoleMole_ActorAbilityPlugin_AddDynamicFloatWithRange, ActorAbilityPlugin_AddDynamicFloatWithRange_Hook);
} }
const FeatureGUIInfo& NoCD::GetGUIInfo() const const FeatureGUIInfo& NoCD::GetGUIInfo() const
@ -153,11 +154,11 @@ namespace cheat::feature
// value - increase value // value - increase value
// min and max - bounds of charge. // min and max - bounds of charge.
// So, to charge make full charge m_Instantly, just replace value to maxValue. // So, to charge make full charge m_Instantly, just replace value to maxValue.
static void ActorAbilityPlugin_AddDynamicFloatWithRange_Hook(void* __this, app::String* key, float value, float minValue, float maxValue, static void ActorAbilityPlugin_AddDynamicFloatWithRange_Hook(app::MoleMole_ActorAbilityPlugin* __this, app::String* key, float value, float minValue, float maxValue,
bool forceDoAtRemote, MethodInfo* method) bool forceDoAtRemote, MethodInfo* method)
{ {
std::time_t t = std::time(nullptr); std::time_t t = std::time(nullptr);
auto logEntry = fmt::format("{:%H:%M:%S} | Key: {} value {}.", fmt::localtime(t), il2cppi_to_string(key), value); auto logEntry = fmt::format("{:%H:%M:%S} | Key: {} value: {} | min: {} | max: {}.", fmt::localtime(t), il2cppi_to_string(key), value, minValue, maxValue);
abilityLog.push_front(logEntry); abilityLog.push_front(logEntry);
if (abilityLog.size() > 50) if (abilityLog.size() > 50)
abilityLog.pop_back(); abilityLog.pop_back();
@ -166,8 +167,13 @@ namespace cheat::feature
// This function is calling not only for bows, so if don't put key filter it cause various game mechanic bugs. // This function is calling not only for bows, so if don't put key filter it cause various game mechanic bugs.
// For now only "_Enchanted_Time" found for bow charging, maybe there are more. Need to continue research. // For now only "_Enchanted_Time" found for bow charging, maybe there are more. Need to continue research.
if (noCD.f_InstantBow && il2cppi_to_string(key) == "_Enchanted_Time") if (noCD.f_InstantBow && il2cppi_to_string(key) == "_Enchanted_Time")
{
value = maxValue; value = maxValue;
__this->fields.nextValidAbilityID = 36; // HotFix Yelan, Fishl | It's essentially a game bug. | RyujinZX#7832
}
CALL_ORIGIN(ActorAbilityPlugin_AddDynamicFloatWithRange_Hook, __this, key, value, minValue, maxValue, forceDoAtRemote, method); CALL_ORIGIN(ActorAbilityPlugin_AddDynamicFloatWithRange_Hook, __this, key, value, minValue, maxValue, forceDoAtRemote, method);
} }
} }

View File

@ -186,6 +186,7 @@ namespace cheat::feature
bool IsValidByFilter(game::Entity* entity) bool IsValidByFilter(game::Entity* entity)
{ {
if (game::filters::combined::OrganicTargets.IsValid(entity) || if (game::filters::combined::OrganicTargets.IsValid(entity) ||
game::filters::monster::SentryTurrets.IsValid(entity) ||
game::filters::combined::Ores.IsValid(entity) || game::filters::combined::Ores.IsValid(entity) ||
game::filters::puzzle::Geogranum.IsValid(entity) || game::filters::puzzle::Geogranum.IsValid(entity) ||
game::filters::puzzle::LargeRockPile.IsValid(entity) || game::filters::puzzle::LargeRockPile.IsValid(entity) ||
@ -207,6 +208,7 @@ namespace cheat::feature
auto& manager = game::EntityManager::instance(); auto& manager = game::EntityManager::instance();
auto originalTarget = manager.entity(targetID); auto originalTarget = manager.entity(targetID);
if (!IsValidByFilter(originalTarget)) if (!IsValidByFilter(originalTarget))
return CALL_ORIGIN(LCBaseCombat_DoHitEntity_Hook, __this, targetID, attackResult, ignoreCheckCanBeHitInMP, method); return CALL_ORIGIN(LCBaseCombat_DoHitEntity_Hook, __this, targetID, attackResult, ignoreCheckCanBeHitInMP, method);
@ -236,6 +238,7 @@ namespace cheat::feature
} }
for (const auto& entity : validEntities) { for (const auto& entity : validEntities) {
if (rapidFire.f_MultiHit) { if (rapidFire.f_MultiHit) {
int attackCount = rapidFire.GetAttackCount(__this, entity->runtimeID(), attackResult); int attackCount = rapidFire.GetAttackCount(__this, entity->runtimeID(), attackResult);
for (int i = 0; i < attackCount; i++) for (int i = 0; i < attackCount; i++)

View File

@ -0,0 +1,114 @@
#include "pch-il2cpp.h"
#include "CustomWeather.h"
#include <helpers.h>
#include <cheat/events.h>
#include <cheat/game/EntityManager.h>
#include <cheat/game/util.h>
#include <cheat/game/filters.h>
namespace cheat::feature
{
const char* WeatherType[]{ "ClearSky", "Cloudy", "Foggy", "Storm", "RainHeavy", "FountainRain", "SnowLight", "EastCoast" };
std::string CustomWeather::GetWeather() {
switch (current_weather)
{
case 0:
return "Data/Environment/Weather/BigWorld/Weather_ClearSky";
case 1:
return "Data/Environment/Weather/BigWorld/Weather_Cloudy";
case 2:
return "Data/Environment/Weather/BigWorld/Weather_Foggy";
case 3:
return "Data/Environment/Weather/BigWorld/Weather_Storm";
case 4:
return "Data/Environment/Weather/BigWorld/Weather_Dq_Tabeisha_Rain_Heavy";
case 5:
return "Data/Environment/Weather/BigWorld/Weather_LY_Fountain_Rain";
case 6:
return "Data/Environment/Weather/BigWorld/Weather_Snowmountain_Snow_Light";
case 7:
return "Data/Environment/Weather/BigWorld/Weather_Snowmountain_EastCoast";
default:
return "Data/Environment/Weather/BigWorld/Weather_ClearSky";
}
}
CustomWeather::CustomWeather() : Feature(),
NF(f_Enabled, "Custom Weather", "World", false),
NF(f_Lightning, "Lightning", "World", false),
toBeUpdate(), nextUpdate(0)
{
events::GameUpdateEvent += MY_METHOD_HANDLER(CustomWeather::OnGameUpdate);
}
const FeatureGUIInfo& CustomWeather::GetGUIInfo() const
{
static const FeatureGUIInfo info{ "CustomWeather", "Visuals", true };
return info;
}
void CustomWeather::DrawMain()
{
ConfigWidget(f_Enabled, "Custom Weather.");
if (f_Enabled) {
ImGui::Combo(("Weather Type"), &current_weather, WeatherType, ARRAYSIZE(WeatherType));
}
ConfigWidget(f_Lightning, "Lightning target enemy, works with RainHeavy weather.");
}
bool CustomWeather::NeedStatusDraw() const
{
return f_Enabled;
}
void CustomWeather::DrawStatus()
{
ImGui::Text("Custom Weather");
if (f_Lightning)
ImGui::Text("Lightning");
}
CustomWeather& CustomWeather::GetInstance()
{
static CustomWeather instance;
return instance;
}
void CustomWeather::OnGameUpdate()
{
if (!f_Enabled)
return;
auto currentTime = util::GetCurrentTimeMillisec();
if (currentTime < nextUpdate)
return;
auto Enviro = app::EnviroSky_get_Instance(nullptr);
if (Enviro != nullptr) {
app::EnviroSky_ChangeWeather(Enviro, string_to_il2cppi(GetWeather()), 1, 1, nullptr);
if (f_Lightning && current_weather == 4) {
auto& manager = game::EntityManager::instance();
for (auto& Monsters : manager.entities(game::filters::combined::Monsters)) {
if (manager.avatar()->distance(Monsters) >= 30)
continue;
for (auto& entity : manager.entities(game::filters::combined::Lightning)) {
entity->setRelativePosition(Monsters->relativePosition());
}
}
}
}
nextUpdate = currentTime + (int)f_DelayUpdate;
}
}

View File

@ -0,0 +1,28 @@
#pragma once
#include <cheat-base/cheat/Feature.h>
#include <cheat-base/config/config.h>
#include <cheat-base/thread-safe.h>
namespace cheat::feature
{
class CustomWeather : public Feature
{
public:
config::Field<config::Toggle<Hotkey>> f_Enabled;
config::Field<config::Toggle<Hotkey>> f_Lightning;
static CustomWeather& GetInstance();
const FeatureGUIInfo& GetGUIInfo() const override;
void DrawMain() override;
bool NeedStatusDraw() const override;
void DrawStatus() override;
private:
int current_weather;
std::string GetWeather();
SafeQueue<uint32_t> toBeUpdate;
SafeValue<int64_t> nextUpdate;
int f_DelayUpdate = 1;
void OnGameUpdate();
CustomWeather();
};
}

View File

@ -85,6 +85,8 @@ namespace cheat::feature
if (f_FastDialog) if (f_FastDialog)
app::Time_set_timeScale(f_TimeSpeedup, nullptr); app::Time_set_timeScale(f_TimeSpeedup, nullptr);
else
app::Time_set_timeScale(1.0f, nullptr);
bool isImportant = false; bool isImportant = false;
if (f_ExcludeImportant) if (f_ExcludeImportant)