marker stuff + vehicle stuff + fix 3.5

This commit is contained in:
Milxnor
2023-03-22 21:57:17 -04:00
parent bfa6df32a9
commit e5b91053b1
16 changed files with 376 additions and 23 deletions

View File

@@ -0,0 +1,145 @@
#include "AthenaMarkerComponent.h"
#include "FortPlayerControllerAthena.h"
void UAthenaMarkerComponent::ServerAddMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FFortClientMarkerRequest MarkerRequest)
{
auto Owner = MarkerComponent->GetOwner();
AFortPlayerControllerAthena* PlayerController = Cast<AFortPlayerControllerAthena>(Owner);
if (!PlayerController)
return;
AFortPlayerStateAthena* PlayerState = Cast<AFortPlayerStateAthena>(PlayerController->GetPlayerState());
if (!PlayerState)
return;
auto MarkerRequestPtr = &MarkerRequest;
static auto FortWorldMarkerDataStruct = FindObject<UStruct>("/Script/FortniteGame.FortWorldMarkerData");
static auto FortWorldMarkerDataSize = FortWorldMarkerDataStruct->GetPropertiesSize();
auto MarkerData = Alloc<FFortWorldMarkerData>(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<UObject>*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.WeakPtr.ObjectIndex = -1;
((TSoftObjectPtr<UObject>*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.TagAtLastTest = -1;
((TSoftObjectPtr<UObject>*)(__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<AFortPickup>(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<UObject*>(PlayerTeamOffset);
if (!PlayerTeam)
return;
static auto TeamMembersOffset = PlayerTeam->GetOffset("TeamMembers");
auto& TeamMembers = PlayerTeam->Get<TArray<AController*>>(TeamMembersOffset);
for (int i = 0; i < TeamMembers.Num(); i++)
{
if (TeamMembers.at(i) == PlayerController)
continue;
auto CurrentTeamMemberPC = Cast<AFortPlayerControllerAthena>(TeamMembers.at(i));
if (!CurrentTeamMemberPC)
continue;
auto CurrentTeamMemberMarkerComponent = CurrentTeamMemberPC->GetMarkerComponent();// (UAthenaMarkerComponent*)CurrentTeamMemberPC->GetComponentByClass(UAthenaMarkerComponent::StaticClass());
if (!CurrentTeamMemberMarkerComponent)
continue;
static auto ClientAddMarkerFn = FindObject<UFunction>("/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<AFortPlayerControllerAthena>(Owner);
if (!PlayerController)
return;
AFortPlayerStateAthena* PlayerState = Cast<AFortPlayerStateAthena>(PlayerController->GetPlayerState());
if (!PlayerState)
return;
static auto PlayerTeamOffset = PlayerState->GetOffset("PlayerTeam");
auto PlayerTeam = PlayerState->Get<UObject*>(PlayerTeamOffset);
if (!PlayerTeam)
return;
static auto TeamMembersOffset = PlayerTeam->GetOffset("TeamMembers");
auto& TeamMembers = PlayerTeam->Get<TArray<AController*>>(TeamMembersOffset);
for (int i = 0; i < TeamMembers.Num(); i++)
{
if (TeamMembers.at(i) == PlayerController)
continue;
auto CurrentTeamMemberPC = Cast<AFortPlayerControllerAthena>(TeamMembers.at(i));
if (!CurrentTeamMemberPC)
continue;
auto CurrentTeamMemberMarkerComponent = CurrentTeamMemberPC->GetMarkerComponent();
if (!CurrentTeamMemberMarkerComponent)
continue;
static auto ClientCancelMarkerFn = FindObject<UFunction>("/Script/FortniteGame.AthenaMarkerComponent.ClientCancelMarker");
CurrentTeamMemberMarkerComponent->ProcessEvent(ClientCancelMarkerFn, &MarkerID);
}
}

View File

@@ -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<AActor>& GetMarkedActor()
{
static auto MarkedActorOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkedActor");
return *(TSoftObjectPtr<AActor>*)(__int64(this) + MarkedActorOffset);
}
uint8_t& GetMarkerType()
{
static auto MarkerTypeOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerType");
return *(uint8_t*)(__int64(this) + MarkerTypeOffset);
}
TSoftObjectPtr<UClass>& GetMarkedActorClass()
{
static auto MarkedActorClassOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkedActorClass");
return *(TSoftObjectPtr<UClass>*)(__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);
};

View File

@@ -154,6 +154,20 @@ FName AFortGameModeAthena::RedirectLootTier(const FName& LootTier)
return LootTier;
}
UClass* AFortGameModeAthena::GetVehicleClassOverride(UClass* DefaultClass)
{
static auto GetVehicleClassOverrideFn = FindObject<UFunction>("/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)
{

View File

@@ -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);

View File

@@ -55,6 +55,10 @@ int AFortGameStateAthena::GetAircraftIndex(AFortPlayerState* PlayerState)
bool AFortGameStateAthena::IsRespawningAllowed(AFortPlayerState* PlayerState) // actually in zone
{
static auto IsRespawningAllowedFn = FindObject<UFunction>("/Script/FortniteGame.FortGameStateZone.IsRespawningAllowed");
if (!IsRespawningAllowedFn)
return false;
struct { AFortPlayerState* PlayerState; bool ReturnValue; } AFortGameStateZone_IsRespawningAllowed_Params{PlayerState};
this->ProcessEvent(IsRespawningAllowedFn, &AFortGameStateZone_IsRespawningAllowed_Params);

View File

@@ -167,6 +167,16 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
LTDTables.push_back(LoadObject<UDataTable>(L"/Game/Items/Datatables/AthenaLootTierData_Client.AthenaLootTierData_Client"));
LPTables.push_back(LoadObject<UDataTable>(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<FFortLootTierData*> TierGroupLTDs;
@@ -193,11 +203,7 @@ std::vector<LootDrop> 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);
}

View File

@@ -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<UAthenaMarkerComponent*>(MarkerComponentOffset);
}
static void ServerRestartPlayerHook(AFortPlayerControllerAthena* Controller);
static void ServerGiveCreativeItemHook(AFortPlayerControllerAthena* Controller, FFortItemEntry CreativeItem);
static void ServerTeleportToPlaygroundLobbyIslandHook(AFortPlayerControllerAthena* Controller);

View File

@@ -0,0 +1,9 @@
#include "PlayerState.h"
#include "reboot.h"
int& APlayerState::GetPlayerID()
{
static auto PlayerIDOffset = FindOffsetStruct("/Script/Engine.PlayerState", "PlayerID");
return Get<int>(PlayerIDOffset);
}

View File

@@ -5,4 +5,5 @@
class APlayerState : public AActor
{
public:
int& GetPlayerID();
};

View File

@@ -168,6 +168,7 @@
<ClCompile Include="Actor.cpp" />
<ClCompile Include="ActorComponent.cpp" />
<ClCompile Include="addresses.cpp" />
<ClCompile Include="AthenaMarkerComponent.cpp" />
<ClCompile Include="BuildingActor.cpp" />
<ClCompile Include="BuildingSMActor.cpp" />
<ClCompile Include="BuildingTrap.cpp" />
@@ -211,6 +212,7 @@
<ClCompile Include="NetDriver.cpp" />
<ClCompile Include="Object.cpp" />
<ClCompile Include="PlayerController.cpp" />
<ClCompile Include="PlayerState.cpp" />
<ClCompile Include="UnrealMath.cpp" />
<ClCompile Include="UnrealNames.cpp" />
<ClCompile Include="UObjectGlobals.cpp" />

View File

@@ -152,6 +152,12 @@
<ClCompile Include="FortGameMode.cpp">
<Filter>FortniteGame\Source\FortniteGame\Private</Filter>
</ClCompile>
<ClCompile Include="AthenaMarkerComponent.cpp">
<Filter>FortniteGame\Source\FortniteGame\Private</Filter>
</ClCompile>
<ClCompile Include="PlayerState.cpp">
<Filter>Engine\Source\Runtime\Engine\Private</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="log.h" />

View File

@@ -75,12 +75,13 @@ DWORD WINAPI Main(LPVOID)
Addresses::Init();
Addresses::Print();
static auto GameModeDefault = FindObject<UClass>(L"/Script/FortniteGame.Default__FortGameModeAthena");
static auto FortPlayerControllerZoneDefault = FindObject<UClass>(L"/Script/FortniteGame.Default__FortPlayerControllerZone");
static auto FortPlayerControllerAthenaDefault = FindObject<UClass>(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject<UClass>(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C");
static auto FortPlayerPawnAthenaDefault = FindObject<UClass>(L"/Game/Athena/PlayerPawn_Athena.Default__PlayerPawn_Athena_C");
static auto FortAbilitySystemComponentAthenaDefault = FindObject<UClass>(L"/Script/FortniteGame.Default__FortAbilitySystemComponentAthena");
static auto FortKismetLibraryDefault = FindObject<UClass>(L"/Script/FortniteGame.Default__FortKismetLibrary");
static auto GameModeDefault = FindObject<AFortGameModeAthena>(L"/Script/FortniteGame.Default__FortGameModeAthena");
static auto FortPlayerControllerZoneDefault = FindObject<AFortPlayerController>(L"/Script/FortniteGame.Default__FortPlayerControllerZone");
static auto FortPlayerControllerAthenaDefault = FindObject<AFortPlayerControllerAthena>(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject<UClass>(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C");
static auto FortPlayerPawnAthenaDefault = FindObject<AFortPlayerPawn>(L"/Game/Athena/PlayerPawn_Athena.Default__PlayerPawn_Athena_C");
static auto FortAbilitySystemComponentAthenaDefault = FindObject<UObject>(L"/Script/FortniteGame.Default__FortAbilitySystemComponentAthena");
static auto FortKismetLibraryDefault = FindObject<UFortKismetLibrary>(L"/Script/FortniteGame.Default__FortKismetLibrary");
static auto AthenaMarkerComponentDefault = FindObject<UAthenaMarkerComponent>(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<UFunction>(L"/Script/FortniteGame.AthenaMarkerComponent.ServerAddMapMarker"),
UAthenaMarkerComponent::ServerAddMapMarkerHook, nullptr, false);
Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject<UFunction>(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,6 +327,8 @@ 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);
if (Fortnite_Version >= 13)
Hooking::MinHook::Hook((PVOID)Addresses::SetZoneToIndex, (PVOID)SetZoneToIndexHook, (PVOID*)&SetZoneToIndexOriginal);
Hooking::MinHook::Hook((PVOID)Addresses::ProcessEvent, ProcessEventHook, (PVOID*)&UObject::ProcessEventOriginal);

View File

@@ -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();

View File

@@ -73,6 +73,7 @@ inline void InitLogger()
MakeLogger("LogCreative");
MakeLogger("LogZone");
MakeLogger("LogReplication");
MakeLogger("LogVehicles");
}
#define LOG_DEBUG(loggerName, ...) \

View File

@@ -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");

View File

@@ -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<UFunction>("/Script/FortniteGame.FortPhysicsPawn.ServerMove") : FindObject<UFunction>("/Script/FortniteGame.FortPhysicsPawn.ServerUpdatePhysicsParams"),
ServerVehicleUpdate, nullptr, false, true);
}
else
{
Hooking::MinHook::Hook(FortAthenaVehicleDefault, FindObject<UFunction>("/Script/FortniteGame.FortAthenaVehicle.ServerUpdatePhysicsParams"),
ServerVehicleUpdate, nullptr, false, true);
}
}
static inline AActor* SpawnVehicleFromSpawner(AActor* VehicleSpawner)
{
auto GameMode = Cast<AFortGameModeAthena>(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<UClass*>(VehicleClassOffset);
auto& SoftVehicleClass = VehicleSpawner->Get<TSoftObjectPtr<UClass>>(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<AActor>(StrongVehicleClass, SpawnTransform);
}
static auto FortVehicleItemDefOffset = VehicleSpawner->GetOffset("FortVehicleItemDef");
if (FortVehicleItemDefOffset == 0)
return nullptr;
return GetWorld()->SpawnActor<AActor>(VehicleClass, SpawnTransform);
auto& SoftFortVehicleItemDef = VehicleSpawner->Get<TSoftObjectPtr<UFortItemDefinition>>(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<TSoftObjectPtr<UClass>>(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<AActor>(StrongVehicleActorClass, SpawnTransform);
}
static inline void SpawnVehicles2()