From e5b91053b11067287cf3e0b070356e71519741df Mon Sep 17 00:00:00 2001 From: Milxnor Date: Wed, 22 Mar 2023 21:57:17 -0400 Subject: [PATCH] marker stuff + vehicle stuff + fix 3.5 --- Project Reboot 3.0/AthenaMarkerComponent.cpp | 145 ++++++++++++++++++ Project Reboot 3.0/AthenaMarkerComponent.h | 98 +++++++++++- Project Reboot 3.0/FortGameModeAthena.cpp | 17 +- Project Reboot 3.0/FortGameModeAthena.h | 1 + Project Reboot 3.0/FortGameStateAthena.cpp | 4 + Project Reboot 3.0/FortLootPackage.cpp | 16 +- .../FortPlayerControllerAthena.h | 7 + Project Reboot 3.0/PlayerState.cpp | 9 ++ Project Reboot 3.0/PlayerState.h | 1 + Project Reboot 3.0/Project Reboot 3.0.vcxproj | 2 + .../Project Reboot 3.0.vcxproj.filters | 6 + Project Reboot 3.0/dllmain.cpp | 22 ++- Project Reboot 3.0/finder.h | 8 +- Project Reboot 3.0/log.h | 1 + Project Reboot 3.0/reboot.h | 2 +- Project Reboot 3.0/vehicles.h | 60 +++++++- 16 files changed, 376 insertions(+), 23 deletions(-) create mode 100644 Project Reboot 3.0/AthenaMarkerComponent.cpp create mode 100644 Project Reboot 3.0/PlayerState.cpp diff --git a/Project Reboot 3.0/AthenaMarkerComponent.cpp b/Project Reboot 3.0/AthenaMarkerComponent.cpp new file mode 100644 index 0000000..6b11564 --- /dev/null +++ b/Project Reboot 3.0/AthenaMarkerComponent.cpp @@ -0,0 +1,145 @@ +#include "AthenaMarkerComponent.h" +#include "FortPlayerControllerAthena.h" + +void UAthenaMarkerComponent::ServerAddMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FFortClientMarkerRequest MarkerRequest) +{ + auto Owner = MarkerComponent->GetOwner(); + + AFortPlayerControllerAthena* PlayerController = Cast(Owner); + + if (!PlayerController) + return; + + AFortPlayerStateAthena* PlayerState = Cast(PlayerController->GetPlayerState()); + + if (!PlayerState) + return; + + auto MarkerRequestPtr = &MarkerRequest; + + static auto FortWorldMarkerDataStruct = FindObject("/Script/FortniteGame.FortWorldMarkerData"); + static auto FortWorldMarkerDataSize = FortWorldMarkerDataStruct->GetPropertiesSize(); + + auto MarkerData = Alloc(FortWorldMarkerDataSize); + + static auto IconOffset = FindOffsetStruct("/Script/FortniteGame.MarkedActorDisplayInfo", "Icon"); + static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPosition", false); + static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPositionOffset", false); + + FMarkerID MarkerID{}; + MarkerID.PlayerID = PlayerState->GetPlayerID(); + MarkerID.InstanceID = MarkerRequestPtr->GetInstanceID(); + + MarkerData->GetMarkerType() = MarkerRequestPtr->GetMarkerType(); + MarkerData->GetOwner() = PlayerState; + MarkerData->GetWorldNormal() = MarkerRequestPtr->GetWorldNormal(); + if (WorldPositionOffset != 0) + MarkerData->GetWorldPosition() = MarkerRequestPtr->GetWorldPosition(); + if (WorldPositionOffset != 0) + MarkerData->GetWorldPositionOffset() = MarkerRequestPtr->GetWorldPositionOffset(); + MarkerData->GetMarkerID() = MarkerID; + MarkerData->GetMarkedActorClass().SoftObjectPtr.WeakPtr.ObjectIndex = -1; + MarkerData->GetMarkedActorClass().SoftObjectPtr.TagAtLastTest = -1; + MarkerData->GetMarkedActorClass().SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0; + MarkerData->GetMarkedActor().SoftObjectPtr.WeakPtr.ObjectIndex = -1; + MarkerData->GetMarkedActor().SoftObjectPtr.TagAtLastTest = -1; + MarkerData->GetMarkedActor().SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0; + ((TSoftObjectPtr*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.WeakPtr.ObjectIndex = -1; + ((TSoftObjectPtr*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.TagAtLastTest = -1; + ((TSoftObjectPtr*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0; + + /* if (MarkerRequest.MarkedActor) + { + MarkerData.MarkedActor.WeakPtr.ObjectIndex = MarkerRequest.MarkedActor->InternalIndex; + MarkerData.MarkedActor.WeakPtr.ObjectSerialNumber = 0; + + MarkerData.MarkedActorClass.WeakPtr.ObjectIndex = MarkerRequest.MarkedActor->Class->InternalIndex; + MarkerData.MarkedActorClass.WeakPtr.ObjectSerialNumber = 0; + + char (*WtfSkidda)(UAthenaMarkerComponent * a1, AActor * a2, FFortWorldMarkerData & MarkerData) = decltype(WtfSkidda)(__int64(GetModuleHandleW(0)) + 0x1297E00); + (int)WtfSkidda(PlayerController->MarkerComponent, MarkerRequest.MarkedActor, MarkerData); + // std::cout << "WtfSkidda: " << (int)WtfSkidda(PlayerController->MarkerComponent, MarkerRequest.MarkedActor, MarkerData) << '\n'; + } + + if (MarkerData.MarkerType == EFortWorldMarkerType::Item) + { + if (auto Pickup = Cast(MarkerRequest.MarkedActor)) + { + MarkerData.ItemDefinition = Pickup->PrimaryPickupItemEntry.ItemDefinition; + MarkerData.ItemCount = Pickup->PrimaryPickupItemEntry.Count; + } + } */ + + // static void (*Idk)(UAthenaMarkerComponent* MarkerComponent, FFortWorldMarkerData MarkerData) = decltype(Idk)(__int64(GetModuleHandleW(0)) + 0x12A8990); + + static auto PlayerTeamOffset = PlayerState->GetOffset("PlayerTeam"); + auto PlayerTeam = PlayerState->Get(PlayerTeamOffset); + + if (!PlayerTeam) + return; + + static auto TeamMembersOffset = PlayerTeam->GetOffset("TeamMembers"); + auto& TeamMembers = PlayerTeam->Get>(TeamMembersOffset); + + for (int i = 0; i < TeamMembers.Num(); i++) + { + if (TeamMembers.at(i) == PlayerController) + continue; + + auto CurrentTeamMemberPC = Cast(TeamMembers.at(i)); + + if (!CurrentTeamMemberPC) + continue; + + auto CurrentTeamMemberMarkerComponent = CurrentTeamMemberPC->GetMarkerComponent();// (UAthenaMarkerComponent*)CurrentTeamMemberPC->GetComponentByClass(UAthenaMarkerComponent::StaticClass()); + + if (!CurrentTeamMemberMarkerComponent) + continue; + + static auto ClientAddMarkerFn = FindObject("/Script/FortniteGame.AthenaMarkerComponent.ClientAddMarker"); + CurrentTeamMemberMarkerComponent->ProcessEvent(ClientAddMarkerFn, MarkerData); + } +} + +void UAthenaMarkerComponent::ServerRemoveMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FMarkerID MarkerID, uint8_t CancelReason) +{ + auto Owner = MarkerComponent->GetOwner(); + + AFortPlayerControllerAthena* PlayerController = Cast(Owner); + + if (!PlayerController) + return; + + AFortPlayerStateAthena* PlayerState = Cast(PlayerController->GetPlayerState()); + + if (!PlayerState) + return; + + static auto PlayerTeamOffset = PlayerState->GetOffset("PlayerTeam"); + auto PlayerTeam = PlayerState->Get(PlayerTeamOffset); + + if (!PlayerTeam) + return; + + static auto TeamMembersOffset = PlayerTeam->GetOffset("TeamMembers"); + auto& TeamMembers = PlayerTeam->Get>(TeamMembersOffset); + + for (int i = 0; i < TeamMembers.Num(); i++) + { + if (TeamMembers.at(i) == PlayerController) + continue; + + auto CurrentTeamMemberPC = Cast(TeamMembers.at(i)); + + if (!CurrentTeamMemberPC) + continue; + + auto CurrentTeamMemberMarkerComponent = CurrentTeamMemberPC->GetMarkerComponent(); + + if (!CurrentTeamMemberMarkerComponent) + continue; + + static auto ClientCancelMarkerFn = FindObject("/Script/FortniteGame.AthenaMarkerComponent.ClientCancelMarker"); + CurrentTeamMemberMarkerComponent->ProcessEvent(ClientCancelMarkerFn, &MarkerID); + } +} \ No newline at end of file diff --git a/Project Reboot 3.0/AthenaMarkerComponent.h b/Project Reboot 3.0/AthenaMarkerComponent.h index 8e01f14..917f659 100644 --- a/Project Reboot 3.0/AthenaMarkerComponent.h +++ b/Project Reboot 3.0/AthenaMarkerComponent.h @@ -1,9 +1,105 @@ #pragma once #include "ActorComponent.h" +#include "Vector.h" +#include "SoftObjectPtr.h" +#include "FortPlayerState.h" + +struct FMarkerID { int PlayerID; int InstanceID; }; + +struct FFortClientMarkerRequest +{ + int& GetInstanceID() + { + static auto InstanceIDOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "InstanceID"); + return *(int*)(__int64(this) + InstanceIDOffset); + } + + FVector& GetWorldPosition() + { + static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "WorldPosition"); + return *(FVector*)(__int64(this) + WorldPositionOffset); + } + + uint8_t& GetMarkerType() + { + static auto MarkerTypeOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "MarkerType"); + return *(uint8_t*)(__int64(this) + MarkerTypeOffset); + } + + FVector& GetWorldPositionOffset() + { + static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "WorldPositionOffset"); + return *(FVector*)(__int64(this) + WorldPositionOffsetOffset); + } + + FVector& GetWorldNormal() + { + static auto WorldNormalOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "WorldNormal"); + return *(FVector*)(__int64(this) + WorldNormalOffset); + } +}; + +struct FFortWorldMarkerData +{ + FMarkerID& GetMarkerID() + { + static auto MarkerIDOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerID"); + return *(FMarkerID*)(__int64(this) + MarkerIDOffset); + } + + FVector& GetWorldPosition() + { + static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPosition"); + return *(FVector*)(__int64(this) + WorldPositionOffset); + } + + FVector& GetWorldPositionOffset() + { + static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPositionOffset"); + return *(FVector*)(__int64(this) + WorldPositionOffsetOffset); + } + + FVector& GetWorldNormal() + { + static auto WorldNormalOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldNormal"); + return *(FVector*)(__int64(this) + WorldNormalOffset); + } + + TSoftObjectPtr& GetMarkedActor() + { + static auto MarkedActorOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkedActor"); + return *(TSoftObjectPtr*)(__int64(this) + MarkedActorOffset); + } + + uint8_t& GetMarkerType() + { + static auto MarkerTypeOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerType"); + return *(uint8_t*)(__int64(this) + MarkerTypeOffset); + } + + TSoftObjectPtr& GetMarkedActorClass() + { + static auto MarkedActorClassOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkedActorClass"); + return *(TSoftObjectPtr*)(__int64(this) + MarkedActorClassOffset); + } + + AFortPlayerState*& GetOwner() + { + static auto OwnerOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "Owner"); + return *(AFortPlayerState**)(__int64(this) + OwnerOffset); + } + + void* GetCustomDisplayInfo() + { + static auto CustomDisplayInfoOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "CustomDisplayInfo"); + return (void*)(__int64(this) + CustomDisplayInfoOffset); + } +}; class UAthenaMarkerComponent : public UActorComponent { public: - + static void ServerAddMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FFortClientMarkerRequest MarkerRequest); + static void ServerRemoveMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FMarkerID MarkerID, uint8_t CancelReason); }; \ No newline at end of file diff --git a/Project Reboot 3.0/FortGameModeAthena.cpp b/Project Reboot 3.0/FortGameModeAthena.cpp index 5a04b3f..14f17dc 100644 --- a/Project Reboot 3.0/FortGameModeAthena.cpp +++ b/Project Reboot 3.0/FortGameModeAthena.cpp @@ -154,6 +154,20 @@ FName AFortGameModeAthena::RedirectLootTier(const FName& LootTier) return LootTier; } +UClass* AFortGameModeAthena::GetVehicleClassOverride(UClass* DefaultClass) +{ + static auto GetVehicleClassOverrideFn = FindObject("/Script/FortniteGame.FortGameModeAthena.GetVehicleClassOverride"); + + if (!GetVehicleClassOverrideFn) + return DefaultClass; + + struct { UClass* DefaultClass; UClass* ReturnValue; } GetVehicleClassOverride_Params{DefaultClass}; + + this->ProcessEvent(GetVehicleClassOverrideFn, &GetVehicleClassOverride_Params); + + return GetVehicleClassOverride_Params.ReturnValue; +} + bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* GameMode) { auto GameState = GameMode->GetGameStateAthena(); @@ -224,7 +238,7 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game } else { - SetPlaylist(PlaylistToUse, true); + // SetPlaylist(PlaylistToUse, true); LOG_INFO(LogDev, "Set playlist!"); } @@ -734,6 +748,7 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena PlayerStateAthena->ProcessEvent(OnRep_bHasStartedPlayingFn); LOG_INFO(LogDev, "Old ID: {}", PlayerStateAthena->GetWorldPlayerId()); + LOG_INFO(LogDev, "PlayerID: {}", PlayerStateAthena->GetPlayerID()); // if (PlayerStateAthena->GetWorldPlayerId() == -1) { diff --git a/Project Reboot 3.0/FortGameModeAthena.h b/Project Reboot 3.0/FortGameModeAthena.h index 2bbbb9d..c83632e 100644 --- a/Project Reboot 3.0/FortGameModeAthena.h +++ b/Project Reboot 3.0/FortGameModeAthena.h @@ -17,6 +17,7 @@ public: } FName RedirectLootTier(const FName& LootTier); + UClass* GetVehicleClassOverride(UClass* DefaultClass); static bool Athena_ReadyToStartMatchHook(AFortGameModeAthena* GameMode); static int Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint8 preferredTeam, AActor* Controller); diff --git a/Project Reboot 3.0/FortGameStateAthena.cpp b/Project Reboot 3.0/FortGameStateAthena.cpp index 4ce1f53..24f6738 100644 --- a/Project Reboot 3.0/FortGameStateAthena.cpp +++ b/Project Reboot 3.0/FortGameStateAthena.cpp @@ -55,6 +55,10 @@ int AFortGameStateAthena::GetAircraftIndex(AFortPlayerState* PlayerState) bool AFortGameStateAthena::IsRespawningAllowed(AFortPlayerState* PlayerState) // actually in zone { static auto IsRespawningAllowedFn = FindObject("/Script/FortniteGame.FortGameStateZone.IsRespawningAllowed"); + + if (!IsRespawningAllowedFn) + return false; + struct { AFortPlayerState* PlayerState; bool ReturnValue; } AFortGameStateZone_IsRespawningAllowed_Params{PlayerState}; this->ProcessEvent(IsRespawningAllowedFn, &AFortGameStateZone_IsRespawningAllowed_Params); diff --git a/Project Reboot 3.0/FortLootPackage.cpp b/Project Reboot 3.0/FortLootPackage.cpp index cce2dca..c0cbcb9 100644 --- a/Project Reboot 3.0/FortLootPackage.cpp +++ b/Project Reboot 3.0/FortLootPackage.cpp @@ -167,6 +167,16 @@ std::vector PickLootDrops(FName TierGroupName, bool bPrint, int recurs LTDTables.push_back(LoadObject(L"/Game/Items/Datatables/AthenaLootTierData_Client.AthenaLootTierData_Client")); LPTables.push_back(LoadObject(L"/Game/Items/Datatables/AthenaLootPackages_Client.AthenaLootPackages_Client")); + + for (int i = 0; i < LTDTables.size(); i++) + { + LOG_INFO(LogDev, "[{}] LTD {}", LTDTables.at(i)->GetFullName()); + } + + for (int i = 0; i < LPTables.size(); i++) + { + LOG_INFO(LogDev, "[{}] LP {}", LPTables.at(i)->GetFullName()); + } } std::vector TierGroupLTDs; @@ -193,11 +203,7 @@ std::vector PickLootDrops(FName TierGroupName, bool bPrint, int recurs if (IsBadReadPtr(TierData, 8)) continue; - // auto TierDataGroupStr = TierData->TierGroup.ToString(); - - // std::cout << "TierData->TierGroup.ToString(): " << TierDataGroupStr << '\n'; - - if (TierGroupName == TierData->GetTierGroup() /* TierDataGroupStr == TierGroupNameStr */ && TierData->GetWeight() != 0) + if (TierGroupName == TierData->GetTierGroup() && TierData->GetWeight() != 0) { TierGroupLTDs.push_back(TierData); } diff --git a/Project Reboot 3.0/FortPlayerControllerAthena.h b/Project Reboot 3.0/FortPlayerControllerAthena.h index 749437b..6332991 100644 --- a/Project Reboot 3.0/FortPlayerControllerAthena.h +++ b/Project Reboot 3.0/FortPlayerControllerAthena.h @@ -5,6 +5,7 @@ #include "FortPlayerPawn.h" #include "SoftObjectPtr.h" #include "FortKismetLibrary.h" +#include "AthenaMarkerComponent.h" static void ApplyCID(AFortPlayerPawn* Pawn, UObject* CID) { @@ -62,6 +63,12 @@ public: return (AFortPlayerStateAthena*)GetPlayerState(); } + UAthenaMarkerComponent* GetMarkerComponent() + { + static auto MarkerComponentOffset = GetOffset("MarkerComponent"); + return Get(MarkerComponentOffset); + } + static void ServerRestartPlayerHook(AFortPlayerControllerAthena* Controller); static void ServerGiveCreativeItemHook(AFortPlayerControllerAthena* Controller, FFortItemEntry CreativeItem); static void ServerTeleportToPlaygroundLobbyIslandHook(AFortPlayerControllerAthena* Controller); diff --git a/Project Reboot 3.0/PlayerState.cpp b/Project Reboot 3.0/PlayerState.cpp new file mode 100644 index 0000000..f4445a7 --- /dev/null +++ b/Project Reboot 3.0/PlayerState.cpp @@ -0,0 +1,9 @@ +#include "PlayerState.h" + +#include "reboot.h" + +int& APlayerState::GetPlayerID() +{ + static auto PlayerIDOffset = FindOffsetStruct("/Script/Engine.PlayerState", "PlayerID"); + return Get(PlayerIDOffset); +} \ No newline at end of file diff --git a/Project Reboot 3.0/PlayerState.h b/Project Reboot 3.0/PlayerState.h index 2a88677..4648b51 100644 --- a/Project Reboot 3.0/PlayerState.h +++ b/Project Reboot 3.0/PlayerState.h @@ -5,4 +5,5 @@ class APlayerState : public AActor { public: + int& GetPlayerID(); }; \ 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 798643b..be3d5ac 100644 --- a/Project Reboot 3.0/Project Reboot 3.0.vcxproj +++ b/Project Reboot 3.0/Project Reboot 3.0.vcxproj @@ -168,6 +168,7 @@ + @@ -211,6 +212,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 398e1a1..8c4c96b 100644 --- a/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters +++ b/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters @@ -152,6 +152,12 @@ FortniteGame\Source\FortniteGame\Private + + FortniteGame\Source\FortniteGame\Private + + + Engine\Source\Runtime\Engine\Private + diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index c39f2c3..65a79fc 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -75,12 +75,13 @@ DWORD WINAPI Main(LPVOID) Addresses::Init(); Addresses::Print(); - static auto GameModeDefault = FindObject(L"/Script/FortniteGame.Default__FortGameModeAthena"); - static auto FortPlayerControllerZoneDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerZone"); - static auto FortPlayerControllerAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C"); - static auto FortPlayerPawnAthenaDefault = FindObject(L"/Game/Athena/PlayerPawn_Athena.Default__PlayerPawn_Athena_C"); - static auto FortAbilitySystemComponentAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortAbilitySystemComponentAthena"); - static auto FortKismetLibraryDefault = FindObject(L"/Script/FortniteGame.Default__FortKismetLibrary"); + static auto GameModeDefault = FindObject(L"/Script/FortniteGame.Default__FortGameModeAthena"); + static auto FortPlayerControllerZoneDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerZone"); + static auto FortPlayerControllerAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C"); + static auto FortPlayerPawnAthenaDefault = FindObject(L"/Game/Athena/PlayerPawn_Athena.Default__PlayerPawn_Athena_C"); + static auto FortAbilitySystemComponentAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortAbilitySystemComponentAthena"); + static auto FortKismetLibraryDefault = FindObject(L"/Script/FortniteGame.Default__FortKismetLibrary"); + static auto AthenaMarkerComponentDefault = FindObject(L"/Script/FortniteGame.Default__AthenaMarkerComponent"); UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogAbilitySystem VeryVerbose", nullptr); UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFort VeryVerbose", nullptr); @@ -308,6 +309,11 @@ DWORD WINAPI Main(LPVOID) AFortPlayerController::ServerAttemptAircraftJumpHook, nullptr, false); } + /* Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject(L"/Script/FortniteGame.AthenaMarkerComponent.ServerAddMapMarker"), + UAthenaMarkerComponent::ServerAddMapMarkerHook, nullptr, false); + Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject(L"/Script/FortniteGame.AthenaMarkerComponent.ServerRemoveMapMarker"), + UAthenaMarkerComponent::ServerRemoveMapMarkerHook, nullptr, false); */ + Hooking::MinHook::Hook((PVOID)Addresses::GetPlayerViewpoint, (PVOID)AFortPlayerControllerAthena::GetPlayerViewPointHook, (PVOID*)&AFortPlayerControllerAthena::GetPlayerViewPointOriginal); Hooking::MinHook::Hook((PVOID)Addresses::TickFlush, (PVOID)UNetDriver::TickFlushHook, (PVOID*)&UNetDriver::TickFlushOriginal); @@ -321,7 +327,9 @@ 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); - Hooking::MinHook::Hook((PVOID)Addresses::SetZoneToIndex, (PVOID)SetZoneToIndexHook, (PVOID*)&SetZoneToIndexOriginal); + + if (Fortnite_Version >= 13) + Hooking::MinHook::Hook((PVOID)Addresses::SetZoneToIndex, (PVOID)SetZoneToIndexHook, (PVOID*)&SetZoneToIndexOriginal); Hooking::MinHook::Hook((PVOID)Addresses::ProcessEvent, ProcessEventHook, (PVOID*)&UObject::ProcessEventOriginal); diff --git a/Project Reboot 3.0/finder.h b/Project Reboot 3.0/finder.h index aac6bc6..d63cf03 100644 --- a/Project Reboot 3.0/finder.h +++ b/Project Reboot 3.0/finder.h @@ -266,10 +266,10 @@ static inline uint64 FindGetMaxTickRate() // Uengine::getmaxtickrate static inline uint64 FindGetPlayerViewpoint() { - // return Memcury::Scanner::FindPattern("40 55 56 57 41 57 48 8B EC 48 83 EC 48 48 8B 81 ? ? ? ? 4D 8B F8 48 8B").Get(); // 12.41 - // return Memcury::Scanner::FindPattern("40 55 53 57 41 56 41 57 48 8B EC 48 83 EC 40 48 8B 81 ? ? ? ? 4D").Get(); // 14.60 + if (Engine_Version == 420) + return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 55 41 56 41 57 48 8B EC 48 83 EC 50").Get(); // idk why finder doesnt work and cba to debug - auto Addr = Memcury::Scanner::FindStringRef(L"APlayerController::GetPlayerViewPoint: out_Location, ViewTarget=%s", true); + auto Addr = Memcury::Scanner::FindStringRef(L"APlayerController::GetPlayerViewPoint: out_Location, ViewTarget=%s"); // return FindBytes(Addr, { 0x48, 0x89 /*, 0x5C */}, 2000, 0, true, 1); auto add = FindBytes(Addr, { 0x40, 0x55 }, 1000, 0, true); return add ? add : FindBytes(Addr, { 0x48, 0x89, 0x5C }, 2000, 0, true); @@ -431,7 +431,7 @@ static inline uint64 FindNoMCP() } */ if (std::floor(Fortnite_Version) == 3) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 83 A7 ? ? ? ? ? 48 8D 4C 24 ?").Get(); + return Memcury::Scanner::FindPattern("E8 ? ? ? ? 83 A7 ? ? ? ? ? 48 8D 4C 24 ?").RelativeOffset(1).Get(); if (std::floor(Fortnite_Version) == 4) return Memcury::Scanner::FindPattern("E8 ? ? ? ? 83 A7 ? ? ? ? ? 83 E0 01").RelativeOffset(1).Get(); diff --git a/Project Reboot 3.0/log.h b/Project Reboot 3.0/log.h index 53f60d6..559d7e6 100644 --- a/Project Reboot 3.0/log.h +++ b/Project Reboot 3.0/log.h @@ -73,6 +73,7 @@ inline void InitLogger() MakeLogger("LogCreative"); MakeLogger("LogZone"); MakeLogger("LogReplication"); + MakeLogger("LogVehicles"); } #define LOG_DEBUG(loggerName, ...) \ diff --git a/Project Reboot 3.0/reboot.h b/Project Reboot 3.0/reboot.h index 2ac1649..a4b035b 100644 --- a/Project Reboot 3.0/reboot.h +++ b/Project Reboot 3.0/reboot.h @@ -340,7 +340,7 @@ static UObject* GetPlaylistToUse() } */ - Playlist = FindObject("/Game/Athena/Playlists/Playground/Playlist_Playground.Playlist_Playground"); + // 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"); diff --git a/Project Reboot 3.0/vehicles.h b/Project Reboot 3.0/vehicles.h index aaf0510..db840ad 100644 --- a/Project Reboot 3.0/vehicles.h +++ b/Project Reboot 3.0/vehicles.h @@ -18,11 +18,16 @@ static inline void ServerVehicleUpdate(UObject* Context, FFrame& Stack, void* Re FTransform Transform{}; - static std::string StateStructName = FindObject("/Script/FortniteGame.ReplicatedPhysicsPawnState") ? "/Script/FortniteGame.ReplicatedPhysicsPawnState" : ""; + static std::string StateStructName = FindObject("/Script/FortniteGame.ReplicatedPhysicsPawnState") ? "/Script/FortniteGame.ReplicatedPhysicsPawnState" : "Script/FortniteGame.ReplicatedAthenaVehiclePhysicsState"; if (StateStructName.empty()) return; + auto StateStruct = FindObject(StateStructName); + + if (!StateStruct) + return; + auto State = (void*)(__int64(Params) + 0); static auto RotationOffset = FindOffsetStruct(StateStructName, "Rotation"); @@ -42,6 +47,12 @@ static inline void ServerVehicleUpdate(UObject* Context, FFrame& Stack, void* Re Transform.Rotation = *Rotation; } + else + { + auto Rotation = (FQuat*)(__int64(State) + RotationOffset); + + Transform.Rotation = *Rotation; + } Transform.Translation = *(FVector*)(__int64(State) + TranslationOffset); Transform.Scale3D = FVector{ 1, 1, 1 }; @@ -91,6 +102,7 @@ static inline void ServerVehicleUpdate(UObject* Context, FFrame& Stack, void* Re static inline void AddVehicleHook() { + static auto FortAthenaVehicleDefault = FindObject("/Script/FortniteGame.Default__FortAthenaVehicle"); static auto FortPhysicsPawnDefault = FindObject("/Script/FortniteGame.Default__FortPhysicsPawn"); if (FortPhysicsPawnDefault) @@ -99,10 +111,17 @@ static inline void AddVehicleHook() FindObject("/Script/FortniteGame.FortPhysicsPawn.ServerMove") : FindObject("/Script/FortniteGame.FortPhysicsPawn.ServerUpdatePhysicsParams"), ServerVehicleUpdate, nullptr, false, true); } + else + { + Hooking::MinHook::Hook(FortAthenaVehicleDefault, FindObject("/Script/FortniteGame.FortAthenaVehicle.ServerUpdatePhysicsParams"), + ServerVehicleUpdate, nullptr, false, true); + } } static inline AActor* SpawnVehicleFromSpawner(AActor* VehicleSpawner) { + auto GameMode = Cast(GetWorld()->GetGameMode()); + FTransform SpawnTransform{}; SpawnTransform.Translation = VehicleSpawner->GetActorLocation(); SpawnTransform.Rotation = VehicleSpawner->GetActorRotation().Quaternion(); @@ -112,13 +131,46 @@ static inline AActor* SpawnVehicleFromSpawner(AActor* VehicleSpawner) if (VehicleClassOffset != 0) // 10.40 and below? { - auto VehicleClass = VehicleSpawner->Get(VehicleClassOffset); + auto& SoftVehicleClass = VehicleSpawner->Get>(VehicleClassOffset); + auto StrongVehicleClass = SoftVehicleClass.Get(); - if (!VehicleClass) + if (!StrongVehicleClass) + { + std::string VehicleClassObjectName = SoftVehicleClass.SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value == 0 ? "InvalidName" : SoftVehicleClass.SoftObjectPtr.ObjectID.AssetPathName.ToString(); + LOG_WARN(LogVehicles, "Failed to load vehicle class: {}", VehicleClassObjectName); return nullptr; + } - return GetWorld()->SpawnActor(VehicleClass, SpawnTransform); + return GetWorld()->SpawnActor(StrongVehicleClass, SpawnTransform); } + + static auto FortVehicleItemDefOffset = VehicleSpawner->GetOffset("FortVehicleItemDef"); + + if (FortVehicleItemDefOffset == 0) + return nullptr; + + auto& SoftFortVehicleItemDef = VehicleSpawner->Get>(FortVehicleItemDefOffset); + auto StrongFortVehicleItemDef = SoftFortVehicleItemDef.Get(); + + if (!StrongFortVehicleItemDef) + { + std::string FortVehicleItemDefObjectName = SoftFortVehicleItemDef.SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value == 0 ? "InvalidName" : SoftFortVehicleItemDef.SoftObjectPtr.ObjectID.AssetPathName.ToString(); + LOG_WARN(LogVehicles, "Failed to load vehicle item definition: {}", FortVehicleItemDefObjectName); + return nullptr; + } + + static auto VehicleActorClassOffset = StrongFortVehicleItemDef->GetOffset("VehicleActorClass"); + auto& SoftVehicleActorClass = StrongFortVehicleItemDef->Get>(VehicleActorClassOffset); + auto StrongVehicleActorClass = SoftVehicleActorClass.Get(); + + if (!StrongVehicleActorClass) + { + std::string VehicleActorClassObjectName = SoftVehicleActorClass.SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value == 0 ? "InvalidName" : SoftVehicleActorClass.SoftObjectPtr.ObjectID.AssetPathName.ToString(); + LOG_WARN(LogVehicles, "Failed to load vehicle actor class: {}", VehicleActorClassObjectName); + return nullptr; + } + + return GetWorld()->SpawnActor(StrongVehicleActorClass, SpawnTransform); } static inline void SpawnVehicles2()