From 6d14b42a4f0f5d9a3a5ce4b42eb589277916b619 Mon Sep 17 00:00:00 2001 From: Milxnor Date: Mon, 20 Mar 2023 18:33:36 -0400 Subject: [PATCH] zone fixed --- Project Reboot 3.0/FortGameModeAthena.cpp | 45 ++----- Project Reboot 3.0/FortKismetLibrary.cpp | 17 ++- Project Reboot 3.0/FortLootPackage.cpp | 49 ++++++-- Project Reboot 3.0/FortPlayerController.cpp | 7 +- Project Reboot 3.0/GameState.cpp | 17 +++ Project Reboot 3.0/GameState.h | 1 + Project Reboot 3.0/Project Reboot 3.0.vcxproj | 1 + .../Project Reboot 3.0.vcxproj.filters | 3 + Project Reboot 3.0/commands.h | 63 ++++++++++ Project Reboot 3.0/die.h | 114 +++++++++++++++--- Project Reboot 3.0/dllmain.cpp | 5 +- Project Reboot 3.0/finder.h | 23 ++-- Project Reboot 3.0/globals.h | 2 +- Project Reboot 3.0/reboot.h | 36 ++++++ 14 files changed, 306 insertions(+), 77 deletions(-) create mode 100644 Project Reboot 3.0/GameState.cpp diff --git a/Project Reboot 3.0/FortGameModeAthena.cpp b/Project Reboot 3.0/FortGameModeAthena.cpp index 403ed9f..2e211af 100644 --- a/Project Reboot 3.0/FortGameModeAthena.cpp +++ b/Project Reboot 3.0/FortGameModeAthena.cpp @@ -115,39 +115,6 @@ static void StreamLevel(std::string LevelName, FVector Location = {}) ShowFoundation(BuildingFoundation); } -UObject* GetPlaylistToUse() -{ - auto Playlist = FindObject("/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo"); - - if (Globals::bCreative) - Playlist = FindObject("/Game/Athena/Playlists/Creative/Playlist_PlaygroundV2.Playlist_PlaygroundV2"); - - if (Globals::bGoingToPlayEvent) - { - if (Fortnite_Version != 12.61) - { - auto EventPlaylist = GetEventPlaylist(); - - if (!EventPlaylist) - { - LOG_ERROR(LogPlaylist, "No event playlist! Turning off going to play event"); - Globals::bGoingToPlayEvent = false; - } - else - { - Playlist = EventPlaylist; - } - } - } - - Playlist = FindObject("/Game/Athena/Playlists/Playground/Playlist_Playground.Playlist_Playground"); - - // Playlist = FindObject("/MoleGame/Playlists/Playlist_MoleGame.Playlist_MoleGame"); - // Playlist = FindObject("/Game/Athena/Playlists/DADBRO/Playlist_DADBRO_Squads_8.Playlist_DADBRO_Squads_8"); - - return Playlist; -} - FName AFortGameModeAthena::RedirectLootTier(const FName& LootTier) { static auto RedirectAthenaLootTierGroupsOffset = this->GetOffset("RedirectAthenaLootTierGroups", false); @@ -609,7 +576,7 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena // GameState->OnRep_CurrentPlaylistInfo(); } - static bool bSpawnedFloorLoot = false; + static bool bSpawnedFloorLoot = true; if (!bSpawnedFloorLoot) { @@ -683,6 +650,8 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena } } + LOG_INFO(LogDev, "Spawned loot!"); + static bool bSpawnedVehicles = Engine_Version < 424; // todo fix if (!bSpawnedVehicles) @@ -696,6 +665,9 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena auto PlayerStateAthena = NewPlayer->GetPlayerStateAthena(); + if (!PlayerStateAthena) + return Athena_HandleStartingNewPlayerOriginal(GameMode, NewPlayerActor); + if (Globals::bNoMCP) { static auto CharacterPartsOffset = PlayerStateAthena->GetOffset("CharacterParts", false); @@ -740,11 +712,12 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena PlayerStateAthena->ProcessEvent(OnRep_bHasStartedPlayingFn); } - if (PlayerStateAthena->GetWorldPlayerId() == -1) + // LOG_INFO(LogDev, "Old ID: {}", PlayerStateAthena->GetWorldPlayerId()); + + // if (PlayerStateAthena->GetWorldPlayerId() == -1) { static int CurrentPlayerId = 1; // static auto PlayerIdOffset = PlayerStateAthena->GetOffset("PlayerId"); // Unable to find tf - LOG_INFO(LogDev, "Old ID: {}", PlayerStateAthena->GetWorldPlayerId()); PlayerStateAthena->GetWorldPlayerId() = ++CurrentPlayerId; // PlayerStateAthena->Get(PlayerIdOffset); // } diff --git a/Project Reboot 3.0/FortKismetLibrary.cpp b/Project Reboot 3.0/FortKismetLibrary.cpp index 836bcbd..1d65af2 100644 --- a/Project Reboot 3.0/FortKismetLibrary.cpp +++ b/Project Reboot 3.0/FortKismetLibrary.cpp @@ -291,7 +291,22 @@ AFortPickup* UFortKismetLibrary::K2_SpawnPickupInWorldHook(UObject* Context, FFr bool UFortKismetLibrary::PickLootDropsHook(UObject* Context, FFrame& Stack, bool* Ret) { - return PickLootDropsOriginal(Context, Stack, Ret); + UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + TArray<__int64> OutLootToDrop; // (Parm, OutParm, ZeroConstructor, NativeAccessSpecifierPublic) + FName TierGroupName; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + int WorldLevel; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + int ForcedLootTier; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + + Stack.Step(Stack.Object, &WorldContextObject); + Stack.Step(Stack.Object, &OutLootToDrop); + Stack.Step(Stack.Object, &TierGroupName); + Stack.Step(Stack.Object, &WorldLevel); + Stack.Step(Stack.Object, &ForcedLootTier); + + PickLootDropsOriginal(Context, Stack, Ret); + + *Ret = true; + return *Ret; } UClass* UFortKismetLibrary::StaticClass() diff --git a/Project Reboot 3.0/FortLootPackage.cpp b/Project Reboot 3.0/FortLootPackage.cpp index f48981d..13513db 100644 --- a/Project Reboot 3.0/FortLootPackage.cpp +++ b/Project Reboot 3.0/FortLootPackage.cpp @@ -249,10 +249,10 @@ std::vector PickLootDrops(FName TierGroupName, bool bPrint, int recurs if (bPrint) { - std::cout << "NumLootPackageDrops Floored: " << NumLootPackageDrops << '\n'; - std::cout << "NumLootPackageDrops Original: " << ChosenRowLootTierData->GetNumLootPackageDrops() << '\n'; - std::cout << "TierGroupLPs.size(): " << TierGroupLPs.size() << '\n'; - std::cout << "ChosenLootPackageName: " << ChosenLootPackageName << '\n'; + LOG_INFO(LogLoot, "NumLootPackageDrops Floored: {}", NumLootPackageDrops); + LOG_INFO(LogLoot, "NumLootPackageDrops Original: {}", ChosenRowLootTierData->GetNumLootPackageDrops()); + LOG_INFO(LogLoot, "TierGroupLPs.size(): {}", TierGroupLPs.size()); + LOG_INFO(LogLoot, "ChosenLootPackageName: {}", ChosenLootPackageName); /* float t = ChosenRowLootTierData->NumLootPackageDrops; @@ -268,14 +268,34 @@ std::vector PickLootDrops(FName TierGroupName, bool bPrint, int recurs for (float i = 0; i < NumLootPackageDrops; i++) { + FFortLootPackageData* TierGroupLP = nullptr; + if (i >= TierGroupLPs.size()) + { break; + /* auto randomNumberFloat = UKismetMathLibrary::RandomFloatInRange(0, TierGroupLPs.size()); + auto randomNumberFloored = std::floor((int)randomNumberFloat); // idk + + if (bPrint) + LOG_INFO(LogLoot, "randomNumberFloat: {} randomNumberFloored: {}", randomNumberFloat, randomNumberFloored); + + TierGroupLP = TierGroupLPs.at(randomNumberFloored); */ + } + else + { + TierGroupLP = TierGroupLPs.at(i); + } + + if (!TierGroupLP) + continue; - auto TierGroupLP = TierGroupLPs.at(i); auto& LootPackageCallFStr = TierGroupLP->GetLootPackageCall(); - auto TierGroupLPStr = LootPackageCallFStr.IsValid() ? LootPackageCallFStr.ToString() : ".Empty"; + auto TierGroupLPStr = LootPackageCallFStr.IsValid() ? LootPackageCallFStr.ToString() : "InvalidLootPackageCall.Empty"; - if (TierGroupLPStr.contains(".Empty")) + if (bPrint) + LOG_INFO(LogLoot, "TierGroupLPStr: {}", TierGroupLPStr); + + if (!bIsWorldList && TierGroupLPStr.contains(".Empty")) { NumLootPackageDrops++; continue; @@ -297,7 +317,7 @@ std::vector PickLootDrops(FName TierGroupName, bool bPrint, int recurs { for (int p = 0; p < LPTables.size(); p++) { - auto LPRowMap = LPTables[p]->GetRowMap(); + auto& LPRowMap = LPTables[p]->GetRowMap(); for (int j = 0; j < LPRowMap.Pairs.Elements.Num(); j++) { @@ -313,29 +333,36 @@ std::vector PickLootDrops(FName TierGroupName, bool bPrint, int recurs } } + if (bPrint) + LOG_INFO(LogLoot, "lootPackageCalls.size(): {}", lootPackageCalls.size()); + if (lootPackageCalls.size() == 0) { // std::cout << "lootPackageCalls.size() == 0!\n"; - NumLootPackageDrops++; // ?? + NumLootPackageDrops++; continue; } FFortLootPackageData* LootPackageCall = GetLootPackage(lootPackageCalls); if (!LootPackageCall) // Should NEVER happen + { + LOG_ERROR(LogLoot, "Failed to get any loot package call??"); + NumLootPackageDrops++; continue; + } auto ItemDef = LootPackageCall->GetItemDefinition().Get(); if (!ItemDef) { - NumLootPackageDrops++; // ?? + NumLootPackageDrops++; continue; } if (bPrint) { - std::cout << std::format("[{}] {} {} {}\n", i, lootPackageCalls.size(), TierGroupLPStr, ItemDef->GetName()); + LOG_INFO(LogLoot, "[{}] {} {} {}", i, lootPackageCalls.size(), TierGroupLPStr, ItemDef->GetName()); } auto WeaponDef = Cast(ItemDef); diff --git a/Project Reboot 3.0/FortPlayerController.cpp b/Project Reboot 3.0/FortPlayerController.cpp index 9a282b0..20bf73c 100644 --- a/Project Reboot 3.0/FortPlayerController.cpp +++ b/Project Reboot 3.0/FortPlayerController.cpp @@ -130,7 +130,9 @@ void AFortPlayerController::ServerAttemptInteractHook(UObject* Context, FFrame* static auto SearchLootTierGroupOffset = BuildingContainer->GetOffset("SearchLootTierGroup"); auto RedirectedLootTier = Cast(GetWorld()->GetGameMode(), false)->RedirectLootTier(BuildingContainer->Get(SearchLootTierGroupOffset)); - auto LootDrops = PickLootDrops(RedirectedLootTier); + LOG_INFO(LogInteraction, "RedirectedLootTier: {}", RedirectedLootTier.ToString()); + + auto LootDrops = PickLootDrops(RedirectedLootTier, true); LOG_INFO(LogInteraction, "LootDrops.size(): {}", LootDrops.size()); @@ -521,7 +523,8 @@ void AFortPlayerController::ClientOnPawnDiedHook(AFortPlayerController* PlayerCo auto DeathInfo = (void*)(__int64(DeadPlayerState) + MemberOffsets::FortPlayerStateAthena::DeathInfo); // Alloc(DeathInfoStructSize); RtlSecureZeroMemory(DeathInfo, DeathInfoStructSize); - auto& Tags = DeadPawn->Get(MemberOffsets::FortPlayerPawn::CorrectTags); // *(FGameplayTagContainer*)(__int64(DeathReport) + /MemberOffsets::DeathReport::Tags); + auto& Tags = DeadPawn->Get(MemberOffsets::FortPlayerPawn::CorrectTags); + // *(FGameplayTagContainer*)(__int64(DeathReport) + MemberOffsets::DeathReport::Tags); // LOG_INFO(LogDev, "Tags: {}", Tags.ToStringSimple(true)); diff --git a/Project Reboot 3.0/GameState.cpp b/Project Reboot 3.0/GameState.cpp new file mode 100644 index 0000000..7a7970a --- /dev/null +++ b/Project Reboot 3.0/GameState.cpp @@ -0,0 +1,17 @@ +#include "GameState.h" + +#include "GameplayStatics.h" + +#include "reboot.h" + +float AGameState::GetServerWorldTimeSeconds() +{ + UWorld* World = GetWorld(); + if (World) + { + static auto ServerWorldTimeSecondsDeltaOffset = this->GetOffset("ServerWorldTimeSecondsDelta"); + return UGameplayStatics::GetTimeSeconds(World) + Get(ServerWorldTimeSecondsDeltaOffset); + } + + return 0.f; +} \ No newline at end of file diff --git a/Project Reboot 3.0/GameState.h b/Project Reboot 3.0/GameState.h index bf435e0..968b012 100644 --- a/Project Reboot 3.0/GameState.h +++ b/Project Reboot 3.0/GameState.h @@ -5,4 +5,5 @@ class AGameState : public AActor { public: + float GetServerWorldTimeSeconds(); // should be in AGameStateBase }; \ No newline at end of file diff --git a/Project Reboot 3.0/Project Reboot 3.0.vcxproj b/Project Reboot 3.0/Project Reboot 3.0.vcxproj index cfae094..8700b6b 100644 --- a/Project Reboot 3.0/Project Reboot 3.0.vcxproj +++ b/Project Reboot 3.0/Project Reboot 3.0.vcxproj @@ -200,6 +200,7 @@ + diff --git a/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters b/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters index 68221cd..3a472a9 100644 --- a/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters +++ b/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters @@ -140,6 +140,9 @@ FortniteGame\Source\FortniteGame\Private\Creative\Minigame + + Engine\Source\Runtime\Engine\Private + diff --git a/Project Reboot 3.0/commands.h b/Project Reboot 3.0/commands.h index 0e3ffbf..472c20a 100644 --- a/Project Reboot 3.0/commands.h +++ b/Project Reboot 3.0/commands.h @@ -183,6 +183,69 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg) WorldInventory->Update(); SendMessageToConsole(PlayerController, L"Granted item!"); + } + else if (Command == "summon") + { + if (Arguments.size() <= 1) + { + SendMessageToConsole(PlayerController, L"Please provide a class!\n"); + return; + } + + auto& ClassName = Arguments[1]; + + if (ClassName.contains("/Script/")) + { + SendMessageToConsole(PlayerController, L"For now, we don't allow non-blueprint classes.\n"); + return; + } + + auto Pawn = ReceivingController->GetMyFortPawn(); + + if (!Pawn) + { + SendMessageToConsole(PlayerController, L"No pawn to spawn class at!"); + return; + } + + int Count = 1; + + if (Arguments.size() >= 3) + { + try { Count = std::stod(Arguments[2]); } + catch (...) {} + } + + constexpr int Max = 100; + + if (Count > Max) + { + SendMessageToConsole(PlayerController, (std::wstring(L"You went over the limit! Only spawning ") + std::to_wstring(Max) + L".").c_str()); + Count = Max; + } + + static auto BGAClass = FindObject("/Script/Engine.BlueprintGeneratedClass"); + auto ClassObj = LoadObject(ClassName, BGAClass); + + if (ClassObj) + { + for (int i = 0; i < Count; i++) + { + auto Loc = Pawn->GetActorLocation(); + // Loc.Z += 1000; + GetWorld()->SpawnActor(ClassObj, Loc, FQuat()); + } + + SendMessageToConsole(PlayerController, L"Summoned!"); + } + else + { + SendMessageToConsole(PlayerController, L"Not a valid class!"); + } + } + else if (Command == "spawnaidata") + { + } else if (Command == "testspawn") { diff --git a/Project Reboot 3.0/die.h b/Project Reboot 3.0/die.h index 7e814aa..340e522 100644 --- a/Project Reboot 3.0/die.h +++ b/Project Reboot 3.0/die.h @@ -3,11 +3,19 @@ #include "reboot.h" #include "FortGameModeAthena.h" #include "GameplayStatics.h" +#include "CurveTable.h" +#include "KismetStringLibrary.h"s +#include "DataTableFunctionLibrary.h" static inline void (*SetZoneToIndexOriginal)(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK); static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK) { + auto GameState = Cast(GameModeAthena->GetGameState()); + + if (!GameState) + return; + static auto SafeZoneIndicatorOffset = GameModeAthena->GetOffset("SafeZoneIndicator"); auto SafeZoneIndicator = GameModeAthena->Get(SafeZoneIndicatorOffset); @@ -15,24 +23,100 @@ static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int Override static auto SafeZoneStartShrinkTimeOffset = SafeZoneIndicator->GetOffset("SafeZoneStartShrinkTime"); static auto SafeZonePhaseOffset = GameModeAthena->GetOffset("SafeZonePhase"); - auto SafeZonePhase = GameModeAthena->Get(SafeZonePhaseOffset); - - LOG_INFO(LogDev, "aa"); - LOG_INFO(LogZone, "SafeZonePhase: {}", SafeZonePhase); - LOG_INFO(LogZone, "OverridePhaseMaybeIDFK: {}", OverridePhaseMaybeIDFK); - LOG_INFO(LogZone, "SafeZoneFinishShrinkTime Before Call: {}", SafeZoneIndicator->Get(SafeZoneFinishShrinkTimeOffset)); - LOG_INFO(LogZone, "SafeZoneStartShrinkTime Before Call: {}", SafeZoneIndicator->Get(SafeZoneStartShrinkTimeOffset)); - LOG_INFO(LogZone, "TimeSeconds: {}", UGameplayStatics::GetTimeSeconds(GetWorld())); - SafeZoneIndicator->Get(SafeZoneStartShrinkTimeOffset) = UGameplayStatics::GetTimeSeconds(GetWorld()); - SafeZoneIndicator->Get(SafeZoneFinishShrinkTimeOffset) = SafeZoneIndicator->Get(SafeZoneStartShrinkTimeOffset) + 100; + static auto MapInfoOffset = GameState->GetOffset("MapInfo"); + auto MapInfo = GameState->Get(MapInfoOffset); + + static auto SafeZoneDefinitionOffset = MapInfo->GetOffset("SafeZoneDefinition"); + auto SafeZoneDefinition = MapInfo->GetPtr<__int64>(SafeZoneDefinitionOffset); + + static auto ZoneDurationsOffset = 0x1F8; + static auto ZoneHoldDurationsOffset = ZoneDurationsOffset - 0x10; + + auto& ZoneDurations = *(TArray*)(__int64(SafeZoneDefinition) + ZoneDurationsOffset); + auto& ZoneHoldDurations = *(TArray*)(__int64(SafeZoneDefinition) + ZoneHoldDurationsOffset); + + static bool bFilledDurations = false; + + if (!bFilledDurations) + { + bFilledDurations = true; + + auto CurrentPlaylist = GetPlaylistToUse(); + UCurveTable* FortGameData = nullptr; + + static auto GameDataOffset = CurrentPlaylist->GetOffset("GameData"); + FortGameData = CurrentPlaylist ? CurrentPlaylist->Get>(GameDataOffset).Get() : nullptr; + + if (!FortGameData) + FortGameData = FindObject("/Game/Balance/AthenaGameData.AthenaGameData"); + + auto ShrinkTimeFName = UKismetStringLibrary::Conv_StringToName(L"Default.SafeZone.ShrinkTime"); + FString ContextString; + + /* for (float i = 0; i < 1.1; i += 0.1) + { + float res; + UDataTableFunctionLibrary::EvaluateCurveTableRow(FortGameData, ShrinkTimeFName, i, ContextString, nullptr, &res); + LOG_INFO(LogZone, "[{}] {}", i, res); + } */ + + if (ZoneDurations.ArrayNum >= 1) ZoneDurations.at(0) = 0; + if (ZoneDurations.ArrayNum >= 2) ZoneDurations.at(1) = 180; + if (ZoneDurations.ArrayNum >= 3) ZoneDurations.at(2) = 120; + if (ZoneDurations.ArrayNum >= 4) ZoneDurations.at(3) = 90; + if (ZoneDurations.ArrayNum >= 5) ZoneDurations.at(4) = 70; + if (ZoneDurations.ArrayNum >= 6) ZoneDurations.at(5) = 60; + if (ZoneDurations.ArrayNum >= 7) ZoneDurations.at(6) = 60; + if (ZoneDurations.ArrayNum >= 8) ZoneDurations.at(7) = 55; + if (ZoneDurations.ArrayNum >= 9) ZoneDurations.at(8) = 45; + if (ZoneDurations.ArrayNum >= 10) ZoneDurations.at(9) = 75; + if (ZoneDurations.ArrayNum >= 11) ZoneDurations.at(10) = 0; + + if (ZoneHoldDurations.ArrayNum >= 1) ZoneHoldDurations.at(0) = 0; + if (ZoneHoldDurations.ArrayNum >= 2) ZoneHoldDurations.at(1) = 170; + if (ZoneHoldDurations.ArrayNum >= 3) ZoneHoldDurations.at(2) = 120; + if (ZoneHoldDurations.ArrayNum >= 4) ZoneHoldDurations.at(3) = 90; + if (ZoneHoldDurations.ArrayNum >= 5) ZoneHoldDurations.at(4) = 80; + if (ZoneHoldDurations.ArrayNum >= 6) ZoneHoldDurations.at(5) = 50; + if (ZoneHoldDurations.ArrayNum >= 7) ZoneHoldDurations.at(6) = 30; + if (ZoneHoldDurations.ArrayNum >= 8) ZoneHoldDurations.at(7) = 0; + if (ZoneHoldDurations.ArrayNum >= 9) ZoneHoldDurations.at(8) = 0; + if (ZoneHoldDurations.ArrayNum >= 10) ZoneHoldDurations.at(9) = 0; + if (ZoneHoldDurations.ArrayNum >= 11) ZoneHoldDurations.at(10) = 0; + } + + LOG_INFO(LogZone, "SafeZonePhase: {}", GameModeAthena->Get(SafeZonePhaseOffset)); + LOG_INFO(LogZone, "OverridePhaseMaybeIDFK: {}", OverridePhaseMaybeIDFK); + LOG_INFO(LogZone, "TimeSeconds: {}", UGameplayStatics::GetTimeSeconds(GetWorld())); + + for (int i = 0; i < ZoneDurations.Num(); i++) + { + LOG_INFO(LogZone, "Move [{}] {}", i, ZoneDurations.at(i)); + } + + for (int i = 0; i < ZoneHoldDurations.Num(); i++) + { + LOG_INFO(LogZone, "Hold [{}] {}", i, ZoneHoldDurations.at(i)); + } SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); - static auto NextMegaStormGridCellThicknessOffset = SafeZoneIndicator->GetOffset("NextMegaStormGridCellThickness"); - auto NextMegaStormGridCellThickness = SafeZoneIndicator->Get(NextMegaStormGridCellThicknessOffset); + LOG_INFO(LogZone, "SafeZonePhase After: {}", GameModeAthena->Get(SafeZonePhaseOffset)); - LOG_INFO(LogZone, "NextMegaStormGridCellThickness: {}", NextMegaStormGridCellThickness); - LOG_INFO(LogZone, "SafeZoneFinishShrinkTime After Call: {}", SafeZoneIndicator->Get(SafeZoneFinishShrinkTimeOffset)); - LOG_INFO(LogZone, "SafeZoneStartShrinkTime After Call: {}", SafeZoneIndicator->Get(SafeZoneStartShrinkTimeOffset)); + float ZoneHoldDuration = 0; + + if (GameModeAthena->Get(SafeZonePhaseOffset) >= 0 && GameModeAthena->Get(SafeZonePhaseOffset) < ZoneHoldDurations.Num()) + ZoneHoldDuration = ZoneHoldDurations.at(GameModeAthena->Get(SafeZonePhaseOffset)); + + SafeZoneIndicator->Get(SafeZoneStartShrinkTimeOffset) = GameState->GetServerWorldTimeSeconds() + ZoneHoldDuration; + + float ZoneDuration = 0; + + if (GameModeAthena->Get(SafeZonePhaseOffset) >= 0 && GameModeAthena->Get(SafeZonePhaseOffset) < ZoneDurations.Num()) + ZoneDuration = ZoneDurations.at(GameModeAthena->Get(SafeZonePhaseOffset)); + + LOG_INFO(LogZone, "ZoneDuration: {}", ZoneDuration); + + SafeZoneIndicator->Get(SafeZoneFinishShrinkTimeOffset) = SafeZoneIndicator->Get(SafeZoneStartShrinkTimeOffset) + ZoneDuration; } \ No newline at end of file diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index 7484eaa..1ff0e56 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -300,7 +300,7 @@ DWORD WINAPI Main(LPVOID) Hooking::MinHook::Hook((PVOID)Addresses::CompletePickupAnimation, (PVOID)AFortPickup::CompletePickupAnimationHook, (PVOID*)&AFortPickup::CompletePickupAnimationOriginal); Hooking::MinHook::Hook((PVOID)Addresses::CanActivateAbility, ReturnTrueHook); // ahhh wtf // Hooking::MinHook::Hook((PVOID)FindFunctionCall(L"ServerRemoveInventoryItem"), UFortInventoryInterface::RemoveInventoryItemHook); - // LOG_INFO(LogDev, "Hook Res: {}", Hooking::MinHook::Hook((PVOID)Addresses::SetZoneToIndex, (PVOID)SetZoneToIndexHook, (PVOID*)&SetZoneToIndexOriginal)); + Hooking::MinHook::Hook((PVOID)Addresses::SetZoneToIndex, (PVOID)SetZoneToIndexHook, (PVOID*)&SetZoneToIndexOriginal); AddVehicleHook(); @@ -308,7 +308,8 @@ DWORD WINAPI Main(LPVOID) Hooking::MinHook::Hook((PVOID)FindFunctionCall(L"ClientOnPawnDied"), AFortPlayerController::ClientOnPawnDiedHook, (PVOID*)&AFortPlayerController::ClientOnPawnDiedOriginal); { - MemberOffsets::FortPlayerPawn::CorrectTags = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawn", "MoveSoundStimulusBroadcastInterval") + 0x10; + int increaseOffset = 0x18; // 0x10; + MemberOffsets::FortPlayerPawn::CorrectTags = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawn", "MoveSoundStimulusBroadcastInterval") + increaseOffset; MemberOffsets::FortPlayerState::PawnDeathLocation = FindOffsetStruct("/Script/FortniteGame.FortPlayerState", "PawnDeathLocation"); MemberOffsets::FortPlayerPawnAthena::LastFallDistance = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawnAthena", "LastFallDistance"); diff --git a/Project Reboot 3.0/finder.h b/Project Reboot 3.0/finder.h index 9f80825..5d39f32 100644 --- a/Project Reboot 3.0/finder.h +++ b/Project Reboot 3.0/finder.h @@ -190,6 +190,8 @@ static inline uint64 FindPauseBeaconRequests() static inline uint64 FindGetPlayerViewpoint() { + return Memcury::Scanner::FindPattern("40 55 53 57 41 56 41 57 48 8B EC 48 83 EC 40 48 8B 81 ? ? ? ? 4D").Get(); + auto Addr = Memcury::Scanner::FindStringRef(L"APlayerController::GetPlayerViewPoint: out_Location, ViewTarget=%s", true); // return FindBytes(Addr, { 0x48, 0x89 /*, 0x5C */}, 2000, 0, true, 1); return FindBytes(Addr, { 0x48, 0x89, 0x74 }, 2000, 0, true); @@ -322,6 +324,13 @@ static inline uint64 FindCompletePickupAnimation() static inline uint64 FindNoMCP() { + if (Fortnite_Version >= 17) // idk if needed + { + // todo make this relative + // 19.10 + return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC 20 65 48 8B 04 25 ? ? ? ? BA ? ? ? ? 48 8B 08 8B 04 0A 39 05 ? ? ? ? 7F 23 8A 05 ? ? ? ? 48 8B 5C 24 ? 48 8B 6C 24 ? 48 8B 74 24 ? 48 83 C4 20 41 5F 41 5E 41 5D 41 5C 5F C3 48 8D 0D ? ? ? ? E8 ? ? ? ? 83 3D ? ? ? ? ? 75 C8 E8 ? ? ? ? 45 33").Get(); + } + if (std::floor(Fortnite_Version) == 3) return Memcury::Scanner::FindPattern("E8 ? ? ? ? 83 A7 ? ? ? ? ? 48 8D 4C 24 ?").Get(); @@ -337,13 +346,6 @@ static inline uint64 FindNoMCP() auto noMcpIthink = GetFunctionIdxOrPtr(fn); return noMcpIthink; - if (Fortnite_Version >= 17) - { - // todo make this relative - // 19.10 - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC 20 65 48 8B 04 25 ? ? ? ? BA ? ? ? ? 48 8B 08 8B 04 0A 39 05 ? ? ? ? 7F 23 8A 05 ? ? ? ? 48 8B 5C 24 ? 48 8B 6C 24 ? 48 8B 74 24 ? 48 83 C4 20 41 5F 41 5E 41 5D 41 5C 5F C3 48 8D 0D ? ? ? ? E8 ? ? ? ? 83 3D ? ? ? ? ? 75 C8 E8 ? ? ? ? 45 33").Get(); - } - if (Engine_Version == 421 || Engine_Version == 422) return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 CE").RelativeOffset(1).Get(); @@ -364,13 +366,16 @@ static inline uint64 FindNoMCP() // return (uintptr_t)GetModuleHandleW(0) + 0x161d600; // 10.40 } -static inline uint64 FindSetZoneToIndex() +static inline uint64 FindSetZoneToIndex() // actually StartNewSafeZonePhase { - return 0; + // return 0; // if (Fortnite_Version == 14.60) // return __int64(GetModuleHandleW(0)) + 0x207F9B0; + return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D 68 98 48 81 EC ? ? ? ? 0F 29 70 C8 0F 29 78 B8 44 0F 29 40 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 08 44 8B F2 89 54 24 48 48 8B F1 48 89 4C 24 ? E8 ? ? ? ? 45 33 E4 48 89 44 24 ? 4C 8B F8 48 85 C0 74 09").Get(); + return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D 68 88 48 81 EC ? ? ? ? 0F 29 70 C8 0F 29 78 B8 44 0F 29 40 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 10 44 8B F2 89 54 24 48 48 8B F1 48 89 4C 24 ? E8 ? ? ? ? 45 33 E4 48 89 45 80 4C 8B F8 48 85 C0 74 09 48 8B B8").Get(); + return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 C8 0F 29 78 B8 44 0F 29 40 ? 44 0F 29 48 ? 44 0F 29 50 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B B1 ? ? ? ? 45 33 ED 89 54 24 70 44 8B FA 48 89 4C 24").Get(); return Memcury::Scanner::FindPattern("40 55 53 56 41 55 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 18 48 8B").Get(); auto Addr = Memcury::Scanner::FindStringRef(L"FortGameModeAthena: No MegaStorm on SafeZone[%d]. GridCellThickness is less than 1.0."); diff --git a/Project Reboot 3.0/globals.h b/Project Reboot 3.0/globals.h index 9c301c7..142731f 100644 --- a/Project Reboot 3.0/globals.h +++ b/Project Reboot 3.0/globals.h @@ -6,5 +6,5 @@ namespace Globals extern inline bool bGoingToPlayEvent = false; extern inline bool bNoMCP = true; extern inline bool bLateGame = false; - extern inline bool bAbilitiesEnabled = true; + extern inline bool bAbilitiesEnabled = false; } \ No newline at end of file diff --git a/Project Reboot 3.0/reboot.h b/Project Reboot 3.0/reboot.h index e77abff..b798d33 100644 --- a/Project Reboot 3.0/reboot.h +++ b/Project Reboot 3.0/reboot.h @@ -304,4 +304,40 @@ namespace MemberOffsets { extern inline int bDBNO = 0, Downer = 0, FinisherOrDowner = 0, DeathCause = 0, Distance = 0, DeathLocation = 0, bInitialized = 0, DeathTags = 0; } +} + +static UObject* GetPlaylistToUse() +{ + auto Playlist = FindObject("/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo"); + Playlist = FindObject("/BlueCheese/Playlists/Playlist_ShowdownAlt_BlueCheese_Trios.Playlist_ShowdownAlt_BlueCheese_Trios"); + + /* + if (Globals::bCreative) + Playlist = FindObject("/Game/Athena/Playlists/Creative/Playlist_PlaygroundV2.Playlist_PlaygroundV2"); + + if (Globals::bGoingToPlayEvent) + { + if (Fortnite_Version != 12.61) + { + auto EventPlaylist = GetEventPlaylist(); + + if (!EventPlaylist) + { + LOG_ERROR(LogPlaylist, "No event playlist! Turning off going to play event"); + Globals::bGoingToPlayEvent = false; + } + else + { + Playlist = EventPlaylist; + } + } + } + */ + + // Playlist = FindObject("/Game/Athena/Playlists/Playground/Playlist_Playground.Playlist_Playground"); + + // Playlist = FindObject("/MoleGame/Playlists/Playlist_MoleGame.Playlist_MoleGame"); + // Playlist = FindObject("/Game/Athena/Playlists/DADBRO/Playlist_DADBRO_Squads_8.Playlist_DADBRO_Squads_8"); + + return Playlist; } \ No newline at end of file