From a16bb42c01bc8cccecd932e1d03aa6363b3eda42 Mon Sep 17 00:00:00 2001 From: Milxnor Date: Fri, 21 Apr 2023 13:34:13 -0400 Subject: [PATCH] quite a good update Fixed Devourer of Worlds Event, Fixed chapter 2+ editing bug, Fixed all other bugs with editing, Fixed S13+ lategame. --- Project Reboot 3.0/AthenaMarkerComponent.cpp | 47 ++++++++++++++-- Project Reboot 3.0/AthenaMarkerComponent.h | 34 ++++++++++- Project Reboot 3.0/BuildingActor.h | 3 +- Project Reboot 3.0/BuildingFoundation.cpp | 15 +++++ Project Reboot 3.0/BuildingFoundation.h | 3 +- Project Reboot 3.0/BuildingSMActor.h | 12 ++++ Project Reboot 3.0/FortGameModeAthena.cpp | 10 ++-- Project Reboot 3.0/FortGameModeAthena.h | 9 +++ Project Reboot 3.0/FortPlayerController.cpp | 56 ++++++++++++------- Project Reboot 3.0/FortPlayerStateAthena.cpp | 2 +- Project Reboot 3.0/FortSafeZoneIndicator.cpp | 12 ++++ Project Reboot 3.0/FortSafeZoneIndicator.h | 21 +++++++ Project Reboot 3.0/Project Reboot 3.0.vcxproj | 2 + .../Project Reboot 3.0.vcxproj.filters | 6 ++ Project Reboot 3.0/die.h | 13 ++++- Project Reboot 3.0/dllmain.cpp | 3 + 16 files changed, 213 insertions(+), 35 deletions(-) create mode 100644 Project Reboot 3.0/FortSafeZoneIndicator.cpp create mode 100644 Project Reboot 3.0/FortSafeZoneIndicator.h diff --git a/Project Reboot 3.0/AthenaMarkerComponent.cpp b/Project Reboot 3.0/AthenaMarkerComponent.cpp index 3a1dc59..f504425 100644 --- a/Project Reboot 3.0/AthenaMarkerComponent.cpp +++ b/Project Reboot 3.0/AthenaMarkerComponent.cpp @@ -19,14 +19,13 @@ void UAthenaMarkerComponent::ServerAddMapMarkerHook(UAthenaMarkerComponent* Mark auto MarkerRequestPtr = &MarkerRequest; - static auto FortWorldMarkerDataStruct = FindObject("/Script/FortniteGame.FortWorldMarkerData"); - static auto FortWorldMarkerDataSize = FortWorldMarkerDataStruct->GetPropertiesSize(); - - auto MarkerData = Alloc(FortWorldMarkerDataSize); + bool useRealloc = true; + auto MarkerData = Alloc(FFortWorldMarkerData::GetStructSize(), useRealloc); static auto IconOffset = FindOffsetStruct("/Script/FortniteGame.MarkedActorDisplayInfo", "Icon"); static auto DisplayNameOffset = FindOffsetStruct("/Script/FortniteGame.MarkedActorDisplayInfo", "DisplayName"); static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPosition", false); + static auto bIncludeSquadOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "bIncludeSquad", false); static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPositionOffset", false); FMarkerID MarkerID{}; @@ -40,6 +39,9 @@ void UAthenaMarkerComponent::ServerAddMapMarkerHook(UAthenaMarkerComponent* Mark MarkerData->GetWorldPosition() = MarkerRequestPtr->GetWorldPosition(); if (WorldPositionOffset != -1) MarkerData->GetWorldPositionOffset() = MarkerRequestPtr->GetWorldPositionOffset(); + if (bIncludeSquadOffset != -1) + MarkerData->DoesIncludeSquad() = MarkerRequestPtr->DoesIncludeSquad(); + MarkerData->GetMarkerID() = MarkerID; MarkerData->GetMarkedActorClass().SoftObjectPtr.WeakPtr.ObjectIndex = -1; MarkerData->GetMarkedActorClass().SoftObjectPtr.TagAtLastTest = 0; @@ -101,7 +103,32 @@ void UAthenaMarkerComponent::ServerAddMapMarkerHook(UAthenaMarkerComponent* Mark continue; static auto ClientAddMarkerFn = FindObject("/Script/FortniteGame.AthenaMarkerComponent.ClientAddMarker"); - CurrentTeamMemberMarkerComponent->ProcessEvent(ClientAddMarkerFn, MarkerData); + + if (ClientAddMarkerFn) + { + CurrentTeamMemberMarkerComponent->ProcessEvent(ClientAddMarkerFn, MarkerData); + } + else + { + // We are assuming it is not the TArray and it is FFortWorldMarkerContainer + + static auto MarkerStreamOffset = CurrentTeamMemberMarkerComponent->GetOffset("MarkerStream"); + auto MarkerStream = CurrentTeamMemberMarkerComponent->GetPtr(MarkerStreamOffset); + + static auto MarkersOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerContainer", "Markers"); + + if (MarkersOffset != -1) + { + // We are assuming it is a FFastArraySerializerItem + ((FFastArraySerializerItem*)MarkerData)->MostRecentArrayReplicationKey = -1; + ((FFastArraySerializerItem*)MarkerData)->ReplicationID = -1; + ((FFastArraySerializerItem*)MarkerData)->ReplicationKey = -1; + + auto& Markers = *(TArray*)(__int64(MarkerStream) + MarkersOffset); + Markers.AddPtr(MarkerData, FFortWorldMarkerData::GetStructSize()); + MarkerStream->MarkArrayDirty(); + } + } } } @@ -144,6 +171,14 @@ void UAthenaMarkerComponent::ServerRemoveMapMarkerHook(UAthenaMarkerComponent* M continue; static auto ClientCancelMarkerFn = FindObject("/Script/FortniteGame.AthenaMarkerComponent.ClientCancelMarker"); - CurrentTeamMemberMarkerComponent->ProcessEvent(ClientCancelMarkerFn, &MarkerID); + + if (ClientCancelMarkerFn) + { + CurrentTeamMemberMarkerComponent->ProcessEvent(ClientCancelMarkerFn, &MarkerID); + } + else + { + // UnmarkActorOnClient ? + } } } \ No newline at end of file diff --git a/Project Reboot 3.0/AthenaMarkerComponent.h b/Project Reboot 3.0/AthenaMarkerComponent.h index 6b60460..c120b7f 100644 --- a/Project Reboot 3.0/AthenaMarkerComponent.h +++ b/Project Reboot 3.0/AthenaMarkerComponent.h @@ -9,7 +9,7 @@ struct FMarkerID { int PlayerID; int InstanceID; }; struct FFortClientMarkerRequest { - char pad[0x20]; // real + char pad[0x20]; // real idk int& GetInstanceID() { @@ -19,6 +19,18 @@ struct FFortClientMarkerRequest return *(int*)(__int64(this) + InstanceIDOffset); } + bool& DoesIncludeSquad() + { + static auto bIncludeSquadOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "bIncludeSquad"); + return *(bool*)(__int64(this) + bIncludeSquadOffset); + } + + bool& UsesHoveredMarkerDetail() + { + static auto bUseHoveredMarkerDetailOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "bUseHoveredMarkerDetail"); + return *(bool*)(__int64(this) + bUseHoveredMarkerDetailOffset); + } + FVector& GetWorldPosition() { static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "WorldPosition"); @@ -46,18 +58,38 @@ struct FFortClientMarkerRequest struct FFortWorldMarkerData { + static UStruct* GetStruct() + { + static auto Struct = FindObject("/Script/FortniteGame.FortWorldMarkerData"); + return Struct; + } + + static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } + FMarkerID& GetMarkerID() { static auto MarkerIDOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerID"); return *(FMarkerID*)(__int64(this) + MarkerIDOffset); } + UObject*& GetMarkerInstance() + { + static auto MarkerInstanceOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerInstance"); + return *(UObject**)(__int64(this) + MarkerInstanceOffset); + } + FVector& GetWorldPosition() { static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPosition"); return *(FVector*)(__int64(this) + WorldPositionOffset); } + bool& DoesIncludeSquad() + { + static auto bIncludeSquadOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "bIncludeSquad"); + return *(bool*)(__int64(this) + bIncludeSquadOffset); + } + FVector& GetWorldPositionOffset() { static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPositionOffset"); diff --git a/Project Reboot 3.0/BuildingActor.h b/Project Reboot 3.0/BuildingActor.h index 190dfc6..9bc2a56 100644 --- a/Project Reboot 3.0/BuildingActor.h +++ b/Project Reboot 3.0/BuildingActor.h @@ -32,7 +32,8 @@ public: void SilentDie() { static auto SilentDieFn = FindObject("/Script/FortniteGame.BuildingActor.SilentDie"); - this->ProcessEvent(SilentDieFn); + bool bPropagateSilentDeath = false; // idfk + this->ProcessEvent(SilentDieFn, &bPropagateSilentDeath); } float GetMaxHealth() diff --git a/Project Reboot 3.0/BuildingFoundation.cpp b/Project Reboot 3.0/BuildingFoundation.cpp index a383fb0..67dc390 100644 --- a/Project Reboot 3.0/BuildingFoundation.cpp +++ b/Project Reboot 3.0/BuildingFoundation.cpp @@ -1,6 +1,21 @@ #include "BuildingFoundation.h" #include "FortGameModeAthena.h" +void ABuildingFoundation::SetDynamicFoundationTransformHook(UObject* Context, FFrame& Stack, void* Ret) +{ + FTransform NewTransform; + Stack.StepCompiledIn(&NewTransform); + + auto BuildingFoundation = (ABuildingFoundation*)Context; + + LOG_INFO(LogDev, "Bruh: {}", BuildingFoundation->GetName()); + + static auto DynamicFoundationTransformOffset = BuildingFoundation->GetOffset("DynamicFoundationTransform"); + BuildingFoundation->Get(DynamicFoundationTransformOffset) = NewTransform; + + return SetDynamicFoundationTransformOriginal(Context, Stack, Ret); +} + void ABuildingFoundation::SetDynamicFoundationEnabledHook(UObject* Context, FFrame& Stack, void* Ret) { bool bEnabled; diff --git a/Project Reboot 3.0/BuildingFoundation.h b/Project Reboot 3.0/BuildingFoundation.h index f02df91..9711c67 100644 --- a/Project Reboot 3.0/BuildingFoundation.h +++ b/Project Reboot 3.0/BuildingFoundation.h @@ -33,7 +33,8 @@ class ABuildingFoundation : public ABuildingSMActor { public: static inline void (*SetDynamicFoundationEnabledOriginal)(UObject* Context, FFrame& Stack, void* Ret); + static inline void (*SetDynamicFoundationTransformOriginal)(UObject* Context, FFrame& Stack, void* Ret); + static void SetDynamicFoundationTransformHook(UObject* Context, FFrame& Stack, void* Ret); static void SetDynamicFoundationEnabledHook(UObject* Context, FFrame& Stack, void* Ret); - }; \ No newline at end of file diff --git a/Project Reboot 3.0/BuildingSMActor.h b/Project Reboot 3.0/BuildingSMActor.h index db51e77..bcff2be 100644 --- a/Project Reboot 3.0/BuildingSMActor.h +++ b/Project Reboot 3.0/BuildingSMActor.h @@ -48,5 +48,17 @@ public: return Get(ResourceTypeOffset); } + void SetEditingPlayer(APlayerState* NewEditingPlayer) // actually AFortPlayerStateZone + { + if (// AActor::HasAuthority() && + (!GetEditingPlayer() || !NewEditingPlayer) + ) + { + SetNetDormancy((ENetDormancy)(2 - (NewEditingPlayer != 0))); + // they do something here + GetEditingPlayer() = NewEditingPlayer; + } + } + static UClass* StaticClass(); }; \ No newline at end of file diff --git a/Project Reboot 3.0/FortGameModeAthena.cpp b/Project Reboot 3.0/FortGameModeAthena.cpp index afb8567..9afe8cc 100644 --- a/Project Reboot 3.0/FortGameModeAthena.cpp +++ b/Project Reboot 3.0/FortGameModeAthena.cpp @@ -249,11 +249,6 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game auto TheBlock = FindObject("/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.SLAB_2"); // SLAB_3 is blank ShowFoundation(TheBlock); } - - if (Fortnite_Version == 14.60 && Globals::bGoingToPlayEvent) - { - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.Lobby_Foundation3")); // Aircraft Carrier - } if (Fortnite_Version == 17.50) { auto FarmAfter = FindObject(("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.farmbase_2")); @@ -369,6 +364,11 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game } } + if (Fortnite_Version == 14.60 && Globals::bGoingToPlayEvent) + { + ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.Lobby_Foundation3")); // Aircraft Carrier + } + auto TheBlock = FindObject("/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.SLAB_2"); // SLAB_3 is blank if (TheBlock) diff --git a/Project Reboot 3.0/FortGameModeAthena.h b/Project Reboot 3.0/FortGameModeAthena.h index abce503..34865b7 100644 --- a/Project Reboot 3.0/FortGameModeAthena.h +++ b/Project Reboot 3.0/FortGameModeAthena.h @@ -6,6 +6,7 @@ #include "KismetStringLibrary.h" #include "reboot.h" #include "BuildingSMActor.h" +#include "FortSafeZoneIndicator.h" #include "GameplayStatics.h" struct FAircraftFlightInfo @@ -48,6 +49,8 @@ static void ShowFoundation(AActor* BuildingFoundation, bool bShow = true) return; } + LOG_INFO(LogDev, "{} {}", bShow ? "Showing" : "Hiding", BuildingFoundation->GetName()); + bool bServerStreamedInLevelValue = bShow; // ?? static auto bServerStreamedInLevelFieldMask = GetFieldMask(BuildingFoundation->GetProperty("bServerStreamedInLevel")); @@ -173,6 +176,12 @@ public: static inline void (*Athena_HandleStartingNewPlayerOriginal)(AFortGameModeAthena* GameMode, AActor* NewPlayer); static inline void (*SetZoneToIndexOriginal)(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK); + AFortSafeZoneIndicator*& GetSafeZoneIndicator() + { + static auto SafeZoneIndicatorOffset = GetOffset("SafeZoneIndicator"); + return Get(SafeZoneIndicatorOffset); + } + AFortGameStateAthena* GetGameStateAthena() { return (AFortGameStateAthena*)GetGameState(); diff --git a/Project Reboot 3.0/FortPlayerController.cpp b/Project Reboot 3.0/FortPlayerController.cpp index 11a567b..b3c7f49 100644 --- a/Project Reboot 3.0/FortPlayerController.cpp +++ b/Project Reboot 3.0/FortPlayerController.cpp @@ -641,11 +641,18 @@ void AFortPlayerController::ServerAttemptAircraftJumpHook(AFortPlayerController* if (LastNum1 != AmountOfRestarts) { - LastNum1 = AmountOfRestarts; + auto SafeZoneIndicator = GameMode->GetSafeZoneIndicator(); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"skipshrinksafezone", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"skipshrinksafezone", nullptr); + if (SafeZoneIndicator) + { + LastNum1 = AmountOfRestarts; + + SafeZoneIndicator->SkipShrinkSafeZone(); + SafeZoneIndicator->SkipShrinkSafeZone(); + } } + + // return ServerAttemptAircraftJumpOriginal(PC, ClientRotation); } void AFortPlayerController::ServerDropAllItemsHook(AFortPlayerController* PlayerController, UFortItemDefinition* IgnoreItemDef) @@ -1284,11 +1291,7 @@ void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerContr if (!PlayerState) return; - // if (!BuildingActorToEdit->GetEditingPlayer() || !PlayerController->GetPlayerState()) - // SetNetDormancy(BuildingActorToEdit, 1); - BuildingActorToEdit->SetNetDormancy(ENetDormancy::DORM_Awake); - BuildingActorToEdit->GetEditingPlayer() = PlayerState; - // Onrep? + BuildingActorToEdit->SetEditingPlayer(PlayerState); auto WorldInventory = PlayerController->GetWorldInventory(); @@ -1302,16 +1305,15 @@ void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerContr if (!EditToolInstance) return; - if (auto EditTool = Cast(Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()))) - // if (auto EditTool = Cast(Pawn->EquipWeaponDefinition(EditToolDef, FGuid{}))) - { - EditTool->GetEditActor() = BuildingActorToEdit; - EditTool->OnRep_EditActor(); - } - else - { - LOG_INFO(LogDev, "Failed to equip editing tool!"); - } + Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()); + + auto EditTool = Cast(Pawn->GetCurrentWeapon()); + + if (!EditTool) + return; + + EditTool->GetEditActor() = BuildingActorToEdit; + EditTool->OnRep_EditActor(); } void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame& Stack, void* Ret) @@ -1344,7 +1346,7 @@ void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame // if (!PlayerState || PlayerState->GetTeamIndex() != BuildingActorToEdit->GetTeamIndex()) //return ServerEditBuildingActorOriginal(Context, Frame, Ret); - BuildingActorToEdit->GetEditingPlayer() = nullptr; + BuildingActorToEdit->SetEditingPlayer(nullptr); static ABuildingSMActor* (*BuildingSMActorReplaceBuildingActor)(ABuildingSMActor*, __int64, UClass*, int, int, uint8_t, AFortPlayerController*) = decltype(BuildingSMActorReplaceBuildingActor)(Addresses::ReplaceBuildingActor); @@ -1369,6 +1371,22 @@ void AFortPlayerController::ServerEndEditingBuildingActorHook(AFortPlayerControl || BuildingActorToStopEditing->IsDestroyed()) return; + BuildingActorToStopEditing->SetEditingPlayer(nullptr); + + static auto EditToolDef = FindObject("/Game/Items/Weapons/BuildingTools/EditTool.EditTool"); + + auto WorldInventory = PlayerController->GetWorldInventory(); + + if (!WorldInventory) + return; + + auto EditToolInstance = WorldInventory->FindItemInstance(EditToolDef); + + if (!EditToolInstance) + return; + + Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()); + auto EditTool = Cast(Pawn->GetCurrentWeapon()); BuildingActorToStopEditing->GetEditingPlayer() = nullptr; diff --git a/Project Reboot 3.0/FortPlayerStateAthena.cpp b/Project Reboot 3.0/FortPlayerStateAthena.cpp index e3fcc50..8da9fa6 100644 --- a/Project Reboot 3.0/FortPlayerStateAthena.cpp +++ b/Project Reboot 3.0/FortPlayerStateAthena.cpp @@ -26,7 +26,7 @@ void AFortPlayerStateAthena::ServerSetInAircraftHook(UObject* Context, FFrame& S auto& ItemInstances = InventoryList.GetItemInstances(); - if (/* (bNewInAircraft && !PlayerController->IsInAircraft()) || */ /* (Globals::bLateGame ? bNewInAircraft : true)) && */ /* !Globals::bLateGame.load() && */ ItemInstances.Num()) + if (/* (bNewInAircraft && !PlayerController->IsInAircraft()) || */ /* (Globals::bLateGame ? bNewInAircraft : true)) && */ !Globals::bLateGame.load() && ItemInstances.Num()) { // std::cout << "InventoryList.ItemInstances.Num(): " << InventoryList.ItemInstances.Num() << '\n'; diff --git a/Project Reboot 3.0/FortSafeZoneIndicator.cpp b/Project Reboot 3.0/FortSafeZoneIndicator.cpp new file mode 100644 index 0000000..e91b3a3 --- /dev/null +++ b/Project Reboot 3.0/FortSafeZoneIndicator.cpp @@ -0,0 +1,12 @@ +#include "FortSafeZoneIndicator.h" + +#include "FortGameModeAthena.h" +#include "reboot.h" + +void AFortSafeZoneIndicator::SkipShrinkSafeZone() +{ + auto GameState = Cast(((AFortGameMode*)GetWorld()->GetGameMode())->GetGameState()); + + GetSafeZoneStartShrinkTime() = GameState->GetServerWorldTimeSeconds(); + GetSafeZoneFinishShrinkTime() = GameState->GetServerWorldTimeSeconds() + 0.2; +} \ No newline at end of file diff --git a/Project Reboot 3.0/FortSafeZoneIndicator.h b/Project Reboot 3.0/FortSafeZoneIndicator.h new file mode 100644 index 0000000..c5cf5ba --- /dev/null +++ b/Project Reboot 3.0/FortSafeZoneIndicator.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Actor.h" + +class AFortSafeZoneIndicator : public AActor +{ +public: + float& GetSafeZoneStartShrinkTime() + { + static auto SafeZoneStartShrinkTimeOffset = GetOffset("SafeZoneStartShrinkTime"); + return Get(SafeZoneStartShrinkTimeOffset); + } + + float& GetSafeZoneFinishShrinkTime() + { + static auto SafeZoneFinishShrinkTimeOffset = GetOffset("SafeZoneFinishShrinkTime"); + return Get(SafeZoneFinishShrinkTimeOffset); + } + + void SkipShrinkSafeZone(); +}; \ 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 dab9d68..a3ed1a4 100644 --- a/Project Reboot 3.0/Project Reboot 3.0.vcxproj +++ b/Project Reboot 3.0/Project Reboot 3.0.vcxproj @@ -218,6 +218,7 @@ + @@ -319,6 +320,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 1978de7..8ff8b55 100644 --- a/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters +++ b/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters @@ -233,6 +233,9 @@ FortniteGame\Source\FortniteGame\Private\Building + + FortniteGame\Source\FortniteGame\Private + @@ -719,6 +722,9 @@ Engine\Source\Runtime\Engine\Classes\Engine + + FortniteGame\Source\FortniteGame\Public + diff --git a/Project Reboot 3.0/die.h b/Project Reboot 3.0/die.h index 7261606..025e108 100644 --- a/Project Reboot 3.0/die.h +++ b/Project Reboot 3.0/die.h @@ -61,6 +61,12 @@ static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int Override static auto SafeZoneIndicatorOffset = GameModeAthena->GetOffset("SafeZoneIndicator"); auto SafeZoneIndicator = GameModeAthena->Get(SafeZoneIndicatorOffset); + if (!SafeZoneIndicator) + { + LOG_WARN(LogZone, "Invalid SafeZoneIndicator!"); + return SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); + } + static auto SafeZoneFinishShrinkTimeOffset = SafeZoneIndicator->GetOffset("SafeZoneFinishShrinkTime"); static auto SafeZoneStartShrinkTimeOffset = SafeZoneIndicator->GetOffset("SafeZoneStartShrinkTime"); static auto RadiusOffset = SafeZoneIndicator->GetOffset("Radius"); @@ -70,6 +76,12 @@ static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int Override static auto MapInfoOffset = GameState->GetOffset("MapInfo"); auto MapInfo = GameState->Get(MapInfoOffset); + if (!MapInfo) + { + LOG_WARN(LogZone, "Invalid MapInfo!") + return SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); + } + static auto SafeZoneDefinitionOffset = MapInfo->GetOffset("SafeZoneDefinition"); auto SafeZoneDefinition = MapInfo->GetPtr<__int64>(SafeZoneDefinitionOffset); @@ -159,7 +171,6 @@ static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int Override SafeZoneIndicator->Get(SafeZoneFinishShrinkTimeOffset) = SafeZoneIndicator->Get(SafeZoneStartShrinkTimeOffset) + ZoneDuration; } - void ProcessEventHook(UObject* Object, UFunction* Function, void* Parameters) { if (!Object || !Function) diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index 311ef70..77305b7 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -193,6 +193,9 @@ DWORD WINAPI Main(LPVOID) bool bUseRemovePlayer = false; bool bUseSwitchLevel = false; + Hooking::MinHook::Hook(FindObject("/Script/FortniteGame.Default__BuildingFoundation"), + FindObject(L"/Script/FortniteGame.BuildingFoundation.SetDynamicFoundationTransform"), + ABuildingFoundation::SetDynamicFoundationTransformHook, (PVOID*)&ABuildingFoundation::SetDynamicFoundationTransformOriginal, false, true); Hooking::MinHook::Hook(FindObject("/Script/FortniteGame.Default__BuildingFoundation"), FindObject(L"/Script/FortniteGame.BuildingFoundation.SetDynamicFoundationEnabled"),