#pragma once #include "reboot.h" #include "GameplayStatics.h" #include "FortGameStateAthena.h" namespace Calendar { static inline bool HasSnowModification() { return Fortnite_Version == 7.10 || Fortnite_Version == 7.30 || Fortnite_Version == 11.31 || Fortnite_Version == 15.10 || Fortnite_Version == 19.01 || Fortnite_Version == 19.10; } static inline UObject* GetSnowSetup() { auto Class = FindObject(L"/Game/Athena/Environments/Landscape/Blueprints/BP_SnowSetup.BP_SnowSetup_C") ? FindObject(L"/Game/Athena/Environments/Landscape/Blueprints/BP_SnowSetup.BP_SnowSetup_C") : FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C"); auto S19Class = FindObject(L"/SpecialSurfaceCoverage/Maps/SpecialSurfaceCoverage_Artemis_Terrain_LS_Parent_Overlay.SpecialSurfaceCoverage_Artemis_Terrain_LS_Parent_Overlay.PersistentLevel.BP_Artemis_S19Progression_C_0"); auto Actors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), Class); return Actors.Num() > 0 ? Actors.at(0) : S19Class ? S19Class : nullptr; } static inline float GetFullSnowMapValue() { if (Fortnite_Version == 7.10 || Fortnite_Version == 7.30) { std::vector> TimeAndValues = { { 0, 1.2f}, { 0.68104035f, 4.6893263f }, { 0.9632137f, 10.13335f }, { 1.0f, 15.0f } }; // 1.2 // 4.6893263 // 10.13335 // 15; return TimeAndValues[3].first; } else if (Fortnite_Version == 11.31 || Fortnite_Version == 15.10) { std::vector> TimeAndValues = { { 0, 0.0f }, { 0.5f, 0.35f }, { 0.75f, 0.5f }, { 1.0f, 1.0f } }; // 0 // 0.35 // 0.5 // 1 return TimeAndValues[3].first; } else if (Fortnite_Version == 19.01 || Fortnite_Version == 19.10) { std::vector Values = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; return Values[6]; } return -1; } static inline void EnableFog() { auto SnowSetup = GetSnowSetup(); if (SnowSetup) { static auto Onready1 = FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.OnReady_E426AA7F4F2319EA06FBA2B9905F0B24"); static auto Onready2 = FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.OnReady_0A511B314AE165C51798519FB84738B8"); static auto refrehsdmap = FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C:RefreshMapLocations"); auto GameState = (AFortGameStateAthena*)GetWorld()->GetGameState(); GET_PLAYLIST(GameState) struct { UObject* GameState; UObject* Playlist; FGameplayTagContainer PlaylistContextTags; } OnReadyParams{ GameState, CurrentPlaylist, FGameplayTagContainer() }; SnowSetup->ProcessEvent(Onready1, &OnReadyParams); SnowSetup->ProcessEvent(Onready2, &OnReadyParams); SnowSetup->ProcessEvent(refrehsdmap); // needed? } } static inline void SetSnowfall(float NewValue) // idk bruh i think setsnow also does this math things who knows { static auto SetSnowfallFn = FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.SetSnowFall"); auto SnowSetup = GetSnowSetup(); if (SetSnowfallFn && SnowSetup) { SnowSetup->ProcessEvent(SetSnowfallFn, &NewValue); } } static inline void SetSnow(float NewValue) { static auto SetSnowFn = FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.SetSnow") ? FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.SetSnow") : FindObject(L"/Game/Athena/Environments/Landscape/Blueprints/BP_SnowSetup.BP_SnowSetup_C.SetSnow") ? FindObject(L"/Game/Athena/Environments/Landscape/Blueprints/BP_SnowSetup.BP_SnowSetup_C.SetSnow") : FindObject("/SpecialSurfaceCoverage/Items/BP_Artemis_S19Progression.BP_Artemis_S19Progression_C.SetSnowProgressionPhase"); auto SnowSetup = GetSnowSetup(); LOG_INFO(LogDev, "SnowSetup: {}", SnowSetup->IsValidLowLevel() ? SnowSetup->GetFullName() : "BadRead"); if (SnowSetup && SetSnowFn) { if (Engine_Version >= 500) NewValue = (int)NewValue; SnowSetup->ProcessEvent(SetSnowFn, &NewValue); LOG_INFO(LogDev, "Called SetSnow!"); if (NewValue != -1 && Engine_Version >= 500 && !Addresses::GIsClient) { auto UpdateSnowVisualsOnClientFn = FindObject("/SpecialSurfaceCoverage/Items/BP_Artemis_S19Progression.BP_Artemis_S19Progression_C.UpdateSnowVisualsOnClient"); SnowSetup->ProcessEvent(UpdateSnowVisualsOnClientFn); LOG_INFO(LogDev, "Called UpdateSnowVisualsOnClientFn!"); } } else { LOG_INFO(LogDev, "Failed TO FIND!"); } } static inline void SetWaterLevel(int WaterLevel) { UObject* WL = FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.Apollo_WaterSetup_2"); if (WL && WaterLevel != -1) { static auto SetWaterLevel = FindObject("/Game/Athena/Apollo/Environments/Blueprints/Apollo_WaterSetup.Apollo_WaterSetup_C.SetWaterLevel"); static auto OnRep_CurrentWaterLevel = FindObject("/Game/Athena/Apollo/Environments/Blueprints/Apollo_WaterSetup.Apollo_WaterSetup_C.OnRep_CurrentWaterLevel"); WL->ProcessEvent(SetWaterLevel, &WaterLevel); WL->ProcessEvent(OnRep_CurrentWaterLevel); } } static inline bool HasNYE() { return Fortnite_Version == 7.10 || Fortnite_Version == 11.31 || Fortnite_Version == 15.10 || Fortnite_Version == 19.00 || Fortnite_Version == 19.01; } static inline void StartNYE() { static auto NewYearTimer = FindObject("/Game/Athena/Maps/Streaming/Athena_NYE_Celebration.Athena_NYE_Celebration.PersistentLevel.BP_NewYearTimer_2") ? FindObject("/Game/Athena/Maps/Streaming/Athena_NYE_Celebration.Athena_NYE_Celebration.PersistentLevel.BP_NewYearTimer_2") : FindObject("/NewYears/Content/Levels/Apollo_NYE_Celebration.Apollo_NYE_Celebration.PersistentLevel.BP_NewYearTimer_2") ? FindObject("/NewYears/Content/Levels/Apollo_NYE_Celebration.Apollo_NYE_Celebration.PersistentLevel.BP_NewYearTimer_2") : FindObject("/NewYears/Content/Levels/Artemis_NYE_Celebration.Artemis_NYE_Celebration.PersistentLevel.BP_NewYearTimer_2"); LOG_INFO(LogDev, "NewYearTimer: {}", NewYearTimer->IsValidLowLevel() ? NewYearTimer->GetFullName() : "BadRead"); static auto StartNYE = FindObject("/Game/Athena/Events/NewYear/BP_NewYearTimer.BP_NewYearTimer_C.startNYE") ? FindObject("/Game/Athena/Events/NewYear/BP_NewYearTimer.BP_NewYearTimer_C.startNYE") : FindObject("/NewYears/Blueprints/BP_NewYearTimer.BP_NewYearTimer_C.startNYE"); LOG_INFO(LogDev, "StartNYE: {}", StartNYE->IsValidLowLevel() ? StartNYE->GetFullName() : "BadRead"); if (NewYearTimer && StartNYE) { NewYearTimer->ProcessEvent(StartNYE, nullptr); } } static void OnDamageServerSleepyHook(UObject* SleepyProp, FFrame& Stack, void* Ret) { static auto DamageOffset = FindOffsetStruct("/Game/Athena/Prototype/Blueprints/Sleepy/BP_Sleepy_M.BP_Sleepy_M_C.OnDamageServer", "Damage"); int Damage = (int)(*(float*)(__int64(Stack.Locals) + DamageOffset)); static UObject* SleepyM = FindObject("/Game/Athena/Maps/Test/S8/SleepyMap.SleepyMap:PersistentLevel.BP_Sleepy_M_2"); static UFunction* RootUpdateDamage = SleepyM->FindFunction("RootUpdateDamage"); SleepyM->ProcessEvent(RootUpdateDamage, &Damage); } }