i havehomework to do

fix issue with teams, add loot, fix building bug, added something properly, fix issue with ai, add end event c2 but doesnt really work
This commit is contained in:
Milxnor
2023-05-14 23:14:36 -04:00
parent ec30c7ecf8
commit 94beb39a4f
28 changed files with 355 additions and 130 deletions

View File

@@ -1,7 +0,0 @@
#include "AthenaDeimosRift.h"
void AAthenaDeimosRift::QueueActorsToSpawnHook(UObject* Context, FFrame* Stack, void* Ret)
{
LOG_INFO(LogDev, "QueueActorsToSpawnHook!");
return QueueActorsToSpawnOriginal(Context, Stack, Ret);
}

View File

@@ -1,12 +0,0 @@
#pragma once
#include "BuildingRift.h"
#include "Stack.h"
class AAthenaDeimosRift : public ABuildingRift
{
public:
static inline void (*QueueActorsToSpawnOriginal)(UObject* Context, FFrame* Stack, void* Ret);
static void QueueActorsToSpawnHook(UObject* Context, FFrame* Stack, void* Ret);
};

View File

@@ -13,6 +13,38 @@ public:
return this->ReadBitfieldValue(bDestroyContainerOnSearchOffset, bDestroyContainerOnSearchFieldMask); return this->ReadBitfieldValue(bDestroyContainerOnSearchOffset, bDestroyContainerOnSearchFieldMask);
} }
bool IsAlreadySearched()
{
static auto bAlreadySearchedOffset = this->GetOffset("bAlreadySearched");
static auto bAlreadySearchedFieldMask = GetFieldMask(this->GetProperty("bAlreadySearched"));
return this->ReadBitfieldValue(bAlreadySearchedOffset, bAlreadySearchedFieldMask);
}
void SetAlreadySearched(bool bNewValue, bool bOnRep = true)
{
static auto bAlreadySearchedOffset = this->GetOffset("bAlreadySearched");
static auto bAlreadySearchedFieldMask = GetFieldMask(this->GetProperty("bAlreadySearched"));
this->SetBitfieldValue(bAlreadySearchedOffset, bAlreadySearchedFieldMask, bNewValue);
if (bOnRep)
{
static auto OnRep_bAlreadySearchedFn = FindObject<UFunction>(L"/Script/FortniteGame.BuildingContainer.OnRep_bAlreadySearched");
this->ProcessEvent(OnRep_bAlreadySearchedFn);
}
}
FVector& GetLootSpawnLocation()
{
static auto LootSpawnLocationOffset = GetOffset("LootSpawnLocation");
return Get<FVector>(LootSpawnLocationOffset);
}
float& GetLootNoiseRange()
{
static auto LootNoiseRangeOffset = GetOffset("LootNoiseRange");
return Get<float>(LootNoiseRangeOffset);
}
bool SpawnLoot(AFortPawn* Pawn); bool SpawnLoot(AFortPawn* Pawn);
static UClass* StaticClass() static UClass* StaticClass()

View File

@@ -86,13 +86,16 @@ void ABuildingGameplayActorSpawnMachine::RebootingDelegateHook(ABuildingGameplay
auto StrongResurrectionLocation = ResurrectionComponent->GetResurrectionLocation().Get(); auto StrongResurrectionLocation = ResurrectionComponent->GetResurrectionLocation().Get();
LOG_INFO(LogDev, "StrongResurrectionLocation: {} IsClientReady: {}", __int64(StrongResurrectionLocation), PlayerState->GetRespawnData()->IsClientReady()); LOG_INFO(LogDev, "StrongResurrectionLocation: {} IsRespawnDataAvailable: {}", __int64(StrongResurrectionLocation), PlayerState->GetRespawnData()->IsRespawnDataAvailable());
if (!StrongResurrectionLocation) if (!StrongResurrectionLocation)
return; return;
GameMode->RestartPlayerAtPlayerStart(PlayerController, StrongResurrectionLocation); // GameMode->RestartPlayerAtPlayerStart(PlayerController, StrongResurrectionLocation);
// PlayerController->ServerRestartPlayer();
PlayerState->GetRespawnData()->IsRespawnDataAvailable() = false;
PlayerController->SetPlayerIsWaiting(true);
PlayerController->ServerRestartPlayer();
/* static auto PawnClass = FindObject<UClass>("/Game/Athena/PlayerPawn_Athena.PlayerPawn_Athena_C"); /* static auto PawnClass = FindObject<UClass>("/Game/Athena/PlayerPawn_Athena.PlayerPawn_Athena_C");
auto NewPawn = GetWorld()->SpawnActor<AFortPlayerPawnAthena>(PawnClass, StrongResurrectionLocation->GetTransform()); auto NewPawn = GetWorld()->SpawnActor<AFortPlayerPawnAthena>(PawnClass, StrongResurrectionLocation->GetTransform());
@@ -105,6 +108,11 @@ void ABuildingGameplayActorSpawnMachine::RebootingDelegateHook(ABuildingGameplay
if (!NewPawn) // Failed to restart player if (!NewPawn) // Failed to restart player
return; return;
bool bEnterSkydiving = false; // TODO get from like curve table iirc idk or the variable
PlayerController->ClientClearDeathNotification();
// PlayerController->RespawnPlayerAfterDeath(bEnterSkydiving);
NewPawn->SetHealth(100); NewPawn->SetHealth(100);
NewPawn->SetMaxHealth(100); NewPawn->SetMaxHealth(100);

View File

@@ -0,0 +1,32 @@
#pragma once
#include "FortAthenaMutator.h"
class AFortAthenaMutator_Bots : public AFortAthenaMutator // AFortAthenaMutator_SpawningPolicyEQS
{
public:
class AFortPlayerPawnAthena* SpawnBot(UClass* BotPawnClass, AActor* InSpawnLocator, const FVector& InSpawnLocation, const FRotator& InSpawnRotation, bool bSnapToGround)
{
static auto SpawnBotFn = FindObject<UFunction>(L"/Script/FortniteGame.FortAthenaMutator_Bots.SpawnBot");
struct
{
UClass* BotPawnClass; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic)
AActor* InSpawnLocator; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
FVector InSpawnLocation; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
FRotator InSpawnRotation; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic)
bool bSnapToGround; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
AFortPlayerPawnAthena* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
} AFortAthenaMutator_Bots_SpawnBot_Params{ BotPawnClass, InSpawnLocator, InSpawnLocation, InSpawnRotation, bSnapToGround };
this->ProcessEvent(SpawnBotFn, &AFortAthenaMutator_Bots_SpawnBot_Params);
return AFortAthenaMutator_Bots_SpawnBot_Params.ReturnValue;
}
static UClass* StaticClass()
{
static auto Class = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator_Bots");
return Class;
}
};

View File

@@ -23,7 +23,7 @@ public:
static UClass* StaticClass() static UClass* StaticClass()
{ {
static auto Class = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator_Disco"); static auto Class = FindObject<UClass>(L"/Script/FortniteGame.FortAthenaMutator_Disco");
return Class; return Class;
} }

View File

@@ -36,7 +36,7 @@ public:
static UClass* StaticClass() static UClass* StaticClass()
{ {
static auto Class = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator_Heist"); static auto Class = FindObject<UClass>(L"/Script/FortniteGame.FortAthenaMutator_Heist");
return Class; return Class;
} }
}; };

View File

@@ -0,0 +1,23 @@
#pragma once
#include "ActorComponent.h"
#include "FortAthenaPatrolPath.h"
#include "reboot.h"
class UFortAthenaNpcPatrollingComponent : public UActorComponent
{
public:
void SetPatrolPath(AFortAthenaPatrolPath* NewPatrolPath)
{
static auto SetPatrolPathFn = FindObject<UFunction>(L"/Script/FortniteGame.FortAthenaNpcPatrollingComponent:SetPatrolPath");
this->ProcessEvent(SetPatrolPathFn, &NewPatrolPath);
}
static UClass* StaticClass()
{
static auto Class = FindObject<UClass>(L"/Script/FortniteGame.FortAthenaNpcPatrollingComponent");
return Class;
}
};

View File

@@ -0,0 +1,8 @@
#pragma once
#include "Actor.h"
class AFortAthenaPatrolPath : public AActor
{
public:
};

View File

@@ -328,6 +328,24 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
{ {
auto& AdditionalLevels = CurrentPlaylist->Get<TArray<TSoftObjectPtr<UWorld>>>(AdditionalLevelsOffset); auto& AdditionalLevels = CurrentPlaylist->Get<TArray<TSoftObjectPtr<UWorld>>>(AdditionalLevelsOffset);
static auto AdditionalLevelsServerOnlyOffset = CurrentPlaylist->GetOffset("AdditionalLevelsServerOnly", false);
if (AdditionalLevelsServerOnlyOffset != -1)
{
TArray<TSoftObjectPtr<UWorld>>& AdditionalLevelsServerOnly = CurrentPlaylist->Get<TArray<TSoftObjectPtr<UWorld>>>(AdditionalLevelsServerOnlyOffset);
LOG_INFO(LogPlaylist, "Loading {} playlist server levels.", AdditionalLevelsServerOnly.Num());
for (int i = 0; i < AdditionalLevelsServerOnly.Num(); i++)
{
FName LevelFName = AdditionalLevelsServerOnly.at(i).SoftObjectPtr.ObjectID.AssetPathName;
auto LevelNameStr = LevelFName.ToString();
LOG_INFO(LogPlaylist, "Loading server level {}.", LevelNameStr);
auto LevelNameWStr = std::wstring(LevelNameStr.begin(), LevelNameStr.end());
GameState->AddToAdditionalPlaylistLevelsStreamed(LevelFName, true);
}
}
LOG_INFO(LogPlaylist, "Loading {} playlist levels.", AdditionalLevels.Num()); LOG_INFO(LogPlaylist, "Loading {} playlist levels.", AdditionalLevels.Num());
for (int i = 0; i < AdditionalLevels.Num(); i++) for (int i = 0; i < AdditionalLevels.Num(); i++)
@@ -336,25 +354,20 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
auto LevelNameStr = LevelFName.ToString(); auto LevelNameStr = LevelFName.ToString();
LOG_INFO(LogPlaylist, "Loading level {}.", LevelNameStr); LOG_INFO(LogPlaylist, "Loading level {}.", LevelNameStr);
auto LevelNameWStr = std::wstring(LevelNameStr.begin(), LevelNameStr.end()); auto LevelNameWStr = std::wstring(LevelNameStr.begin(), LevelNameStr.end());
// bruh the onrep automatically streams if no levelstreamingdynamci found
// StreamLevel(LevelNameStr); GameState->AddToAdditionalPlaylistLevelsStreamed(LevelFName);
// FLatentActionInfo LatentInfo{};
// UGameplayStatics::LoadStreamLevel(GetWorld(), LevelFName, true, false, LatentInfo);
// ULevelStreamingDynamic::LoadLevelInstance(GetWorld(), LevelNameWStr.c_str(), FVector(), FRotator()); /*
static auto AdditionalPlaylistLevelsStreamedOffset = GameState->GetOffset("AdditionalPlaylistLevelsStreamed", false); Alright so us calling the OnRep for the level to stream I believe is a bit scuffy, but it's fine.
On newer versions there is another array of ULevelStreaming, and this gets used to see if all the playlist levels are visible.
That array doesn't get filled with the OnRep as I think the array is server only.
I am not sure if this array does anything, but theres a function that checks the array and it gets used especially in mutators.
Funny thing, AFortGameModeAthena::ReadyToStartMatch does not return true unless all of the levels in the array is fully streamed in, but since it's empty it passes.
if (AdditionalPlaylistLevelsStreamedOffset != -1) // i think its valid on every version but idgaf */
{
if (Fortnite_Version < 11) // IDK What verison it actually wsa but they chnaged it to a struct // There is another array of the ULevelStreaming, and I don't think this gets filled by the OnRep (since really our way is hacky as the OnRep has the implementation)
{
auto& AdditionalPlaylistLevelsStreamed = GameState->Get<TArray<FName>>(AdditionalPlaylistLevelsStreamedOffset);
AdditionalPlaylistLevelsStreamed.Add(LevelFName);
}
}
} }
static auto OnRep_AdditionalPlaylistLevelsStreamedFn = FindObject<UFunction>(L"/Script/FortniteGame.FortGameState.OnRep_AdditionalPlaylistLevelsStreamed"); static auto OnRep_AdditionalPlaylistLevelsStreamedFn = FindObject<UFunction>(L"/Script/FortniteGame.FortGameState.OnRep_AdditionalPlaylistLevelsStreamed");
@@ -435,7 +448,11 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
} }
static auto bWorldIsReadyOffset = GameMode->GetOffset("bWorldIsReady"); static auto bWorldIsReadyOffset = GameMode->GetOffset("bWorldIsReady");
SetBitfield(GameMode->GetPtr<PlaceholderBitfield>(bWorldIsReadyOffset), 1, true); // idk when we actually set this SetBitfield(GameMode->GetPtr<PlaceholderBitfield>(bWorldIsReadyOffset), 1, true); // idk when we actually set this (probably after we listen)
SetupAIDirector();
SetupServerBotManager();
// SetupNavConfig(UKismetStringLibrary::Conv_StringToName(L"MANG"));
// Calendar::SetSnow(1000); // Calendar::SetSnow(1000);
@@ -536,14 +553,12 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
static auto GameSessionOffset = GameMode->GetOffset("GameSession"); static auto GameSessionOffset = GameMode->GetOffset("GameSession");
auto GameSession = GameMode->Get<AActor*>(GameSessionOffset); auto GameSession = GameMode->Get<AActor*>(GameSessionOffset);
static auto MaxPlayersOffset = GameSession->GetOffset("MaxPlayers");
static auto MaxPlayersOffset = GameSession->GetOffset("MaxPlayers");
GameSession->Get<int>(MaxPlayersOffset) = 100; GameSession->Get<int>(MaxPlayersOffset) = 100;
GameState->OnRep_CurrentPlaylistInfo(); // ? GameState->OnRep_CurrentPlaylistInfo(); // ?
// SetupNavConfig();
static auto bAlwaysDBNOOffset = GameMode->GetOffset("bAlwaysDBNO"); static auto bAlwaysDBNOOffset = GameMode->GetOffset("bAlwaysDBNO");
// GameMode->Get<bool>(bAlwaysDBNOOffset) = true; // GameMode->Get<bool>(bAlwaysDBNOOffset) = true;
@@ -582,10 +597,6 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
GetWorld()->Listen(); GetWorld()->Listen();
SetupAIDirector();
SetupServerBotManager();
// SetupNavConfig(UKismetStringLibrary::Conv_StringToName(L"Deimos"));
if (auto TeamsArrayContainer = GameState->GetTeamsArrayContainer()) if (auto TeamsArrayContainer = GameState->GetTeamsArrayContainer())
{ {
TeamsArrayContainer->TeamIndexesArray.Free(); TeamsArrayContainer->TeamIndexesArray.Free();
@@ -733,6 +744,8 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
if (Ret) if (Ret)
{ {
LOG_INFO(LogDev, "Athena_ReadyToStartMatchOriginal RET!"); // if u dont see this, not good
// We are assuming it successfully became warmup. // We are assuming it successfully became warmup.
std::vector<std::pair<AFortAthenaMutator*, UFunction*>> FunctionsToCall; std::vector<std::pair<AFortAthenaMutator*, UFunction*>> FunctionsToCall;
@@ -1160,7 +1173,7 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
static auto SquadIdOffset = PlayerStateAthena->GetOffset("SquadId", false); static auto SquadIdOffset = PlayerStateAthena->GetOffset("SquadId", false);
if (SquadIdOffset != -1) if (SquadIdOffset != -1)
PlayerStateAthena->GetSquadId() = PlayerStateAthena->GetTeamIndex() - 3; // wrong place to do this PlayerStateAthena->GetSquadId() = PlayerStateAthena->GetTeamIndex() - NumToSubtractFromSquadId; // wrong place to do this
TWeakObjectPtr<AFortPlayerStateAthena> WeakPlayerState{}; TWeakObjectPtr<AFortPlayerStateAthena> WeakPlayerState{};
WeakPlayerState.ObjectIndex = PlayerStateAthena->InternalIndex; WeakPlayerState.ObjectIndex = PlayerStateAthena->InternalIndex;

View File

@@ -4,6 +4,7 @@
#include "FortPlayerControllerAthena.h" #include "FortPlayerControllerAthena.h"
#include "OnlineReplStructs.h" #include "OnlineReplStructs.h"
#include "gui.h"
uint8 AFortGameSessionDedicatedAthena::GetSquadIdForCurrentPlayerHook(AFortGameSessionDedicatedAthena* GameSessionDedicated, __int64 UniqueId) uint8 AFortGameSessionDedicatedAthena::GetSquadIdForCurrentPlayerHook(AFortGameSessionDedicatedAthena* GameSessionDedicated, __int64 UniqueId)
{ {
@@ -23,7 +24,7 @@ uint8 AFortGameSessionDedicatedAthena::GetSquadIdForCurrentPlayerHook(AFortGameS
if (PlayerState->GetPtr<FUniqueNetIdRepl>(UniqueIdOffset)->IsIdentical((FUniqueNetIdRepl*)&UniqueId)) if (PlayerState->GetPtr<FUniqueNetIdRepl>(UniqueIdOffset)->IsIdentical((FUniqueNetIdRepl*)&UniqueId))
{ {
return PlayerState->GetTeamIndex() - 3; return PlayerState->GetTeamIndex() - NumToSubtractFromSquadId;
} }
} }

View File

@@ -50,7 +50,7 @@ void AFortGameStateAthena::SetGamePhaseStep(EAthenaGamePhaseStep NewGamePhaseSte
{ {
// On newer versions there is a second param. // On newer versions there is a second param.
LOG_INFO(LogDev, "A1: {} FunctionToCallPair.second: {}", FunctionToCallPair.first->IsValidLowLevel() ? FunctionToCallPair.first->GetFullName() : "BadRead", __int64(FunctionToCallPair.second)); // LOG_INFO(LogDev, "A1: {} FunctionToCallPair.second: {}", FunctionToCallPair.first->IsValidLowLevel() ? FunctionToCallPair.first->GetFullName() : "BadRead", __int64(FunctionToCallPair.second));
if (FunctionToCallPair.second->IsValidLowLevel() && FunctionToCallPair.first->IsValidLowLevel()) if (FunctionToCallPair.second->IsValidLowLevel() && FunctionToCallPair.first->IsValidLowLevel())
{ {
@@ -272,6 +272,26 @@ TeamsArrayContainer* AFortGameStateAthena::GetTeamsArrayContainer()
return Offset != -1 ? (TeamsArrayContainer*)(__int64(this) + Offset) : nullptr; return Offset != -1 ? (TeamsArrayContainer*)(__int64(this) + Offset) : nullptr;
} }
void AFortGameStateAthena::AddToAdditionalPlaylistLevelsStreamed(const FName& Name, bool bServerOnly)
{
static auto AdditionalPlaylistLevelsStreamedOffset = this->GetOffset("AdditionalPlaylistLevelsStreamed", false);
if (!FAdditionalLevelStreamed::GetStruct())
{
auto& AdditionalPlaylistLevelsStreamed = this->Get<TArray<FName>>(AdditionalPlaylistLevelsStreamedOffset);
AdditionalPlaylistLevelsStreamed.Add(Name);
}
else
{
auto& AdditionalPlaylistLevelsStreamed = this->Get<TArray<FAdditionalLevelStreamed>>(AdditionalPlaylistLevelsStreamedOffset);
auto NewLevelStreamed = Alloc<FAdditionalLevelStreamed>(FAdditionalLevelStreamed::GetStructSize());
NewLevelStreamed->GetLevelName() = Name;
NewLevelStreamed->IsServerOnly() = bServerOnly;
AdditionalPlaylistLevelsStreamed.AddPtr(NewLevelStreamed, FAdditionalLevelStreamed::GetStructSize());
}
}
UClass* AFortGameStateAthena::StaticClass() UClass* AFortGameStateAthena::StaticClass()
{ {
static auto Class = FindObject<UClass>(L"/Script/FortniteGame.FortGameStateAthena"); static auto Class = FindObject<UClass>(L"/Script/FortniteGame.FortGameStateAthena");

View File

@@ -66,6 +66,30 @@ struct FPlayerBuildableClassContainer
TArray<UClass*> BuildingClasses; // 0x0000(0x0010) (ZeroConstructor, Transient, UObjectWrapper, NativeAccessSpecifierPublic) TArray<UClass*> BuildingClasses; // 0x0000(0x0010) (ZeroConstructor, Transient, UObjectWrapper, NativeAccessSpecifierPublic)
}; };
struct FAdditionalLevelStreamed
{
public:
static UStruct* GetStruct()
{
static auto Struct = FindObject<UStruct>(L"/Script/FortniteGame.AdditionalLevelStreamed");
return Struct;
}
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
FName& GetLevelName()
{
static auto LevelNameOffset = FindOffsetStruct("/Script/FortniteGame.AdditionalLevelStreamed", "LevelName");
return *(FName*)(__int64(this) + LevelNameOffset);
}
bool& IsServerOnly()
{
static auto bIsServerOnlyOffset = FindOffsetStruct("/Script/FortniteGame.AdditionalLevelStreamed", "bIsServerOnly");
return *(bool*)(__int64(this) + bIsServerOnlyOffset);
}
};
class AFortGameStateAthena : public AGameState class AFortGameStateAthena : public AGameState
{ {
public: public:
@@ -127,6 +151,7 @@ public:
void OnRep_CurrentPlaylistInfo(); void OnRep_CurrentPlaylistInfo();
void OnRep_PlayersLeft(); void OnRep_PlayersLeft();
TeamsArrayContainer* GetTeamsArrayContainer(); TeamsArrayContainer* GetTeamsArrayContainer();
void AddToAdditionalPlaylistLevelsStreamed(const FName& Name, bool bServerOnly = false);
static UClass* StaticClass(); static UClass* StaticClass();
}; };

View File

@@ -21,7 +21,7 @@ public:
static UClass* StaticClass() static UClass* StaticClass()
{ {
static auto Class = FindObject<UClass>("/Script/FortniteGame.FortItemDefinition"); static auto Class = FindObject<UClass>(L"/Script/FortniteGame.FortItemDefinition");
return Class; return Class;
} }
}; };

View File

@@ -747,6 +747,11 @@ void AFortPlayerController::ServerCreateBuildingActorHook(UObject* Context, FFra
if (!PlayerController) // ?? if (!PlayerController) // ??
return ServerCreateBuildingActorOriginal(Context, Stack, Ret); return ServerCreateBuildingActorOriginal(Context, Stack, Ret);
auto WorldInventory = PlayerController->GetWorldInventory();
if (!WorldInventory)
return ServerCreateBuildingActorOriginal(Context, Stack, Ret);
auto PlayerStateAthena = Cast<AFortPlayerStateAthena>(PlayerController->GetPlayerState()); auto PlayerStateAthena = Cast<AFortPlayerStateAthena>(PlayerController->GetPlayerState());
if (!PlayerStateAthena) if (!PlayerStateAthena)
@@ -816,7 +821,38 @@ void AFortPlayerController::ServerCreateBuildingActorHook(UObject* Context, FFra
if (!bCanBuild) if (!bCanBuild)
{ {
// LOG_INFO(LogDev, "cant build"); ExistingBuildings.Free();
return ServerCreateBuildingActorOriginal(Context, Stack, Ret);
}
FTransform Transform{};
Transform.Translation = BuildLocation;
Transform.Rotation = BuildRotator.Quaternion();
Transform.Scale3D = { 1, 1, 1 };
auto BuildingActor = GetWorld()->SpawnActor<ABuildingSMActor>(BuildingClass, Transform);
if (!BuildingActor)
{
ExistingBuildings.Free();
return ServerCreateBuildingActorOriginal(Context, Stack, Ret);
}
auto MatDefinition = UFortKismetLibrary::K2_GetResourceItemDefinition(BuildingActor->GetResourceType());
auto MatInstance = WorldInventory->FindItemInstance(MatDefinition);
bool bBuildFree = PlayerController->DoesBuildFree();
// LOG_INFO(LogDev, "MatInstance->GetItemEntry()->GetCount(): {}", MatInstance->GetItemEntry()->GetCount());
int MinimumMaterial = 10;
bool bShouldDestroy = MatInstance && MatInstance->GetItemEntry() ? MatInstance->GetItemEntry()->GetCount() < MinimumMaterial : true;
if (bShouldDestroy && !bBuildFree)
{
ExistingBuildings.Free();
BuildingActor->SilentDie();
return ServerCreateBuildingActorOriginal(Context, Stack, Ret); return ServerCreateBuildingActorOriginal(Context, Stack, Ret);
} }
@@ -829,36 +865,6 @@ void AFortPlayerController::ServerCreateBuildingActorHook(UObject* Context, FFra
ExistingBuildings.Free(); ExistingBuildings.Free();
FTransform Transform{};
Transform.Translation = BuildLocation;
Transform.Rotation = BuildRotator.Quaternion();
Transform.Scale3D = { 1, 1, 1 };
auto BuildingActor = GetWorld()->SpawnActor<ABuildingSMActor>(BuildingClass, Transform);
if (!BuildingActor)
return ServerCreateBuildingActorOriginal(Context, Stack, Ret);
auto MatDefinition = UFortKismetLibrary::K2_GetResourceItemDefinition(BuildingActor->GetResourceType());
auto WorldInventory = PlayerController->GetWorldInventory();
if (!WorldInventory)
return ServerCreateBuildingActorOriginal(Context, Stack, Ret);
auto MatInstance = WorldInventory->FindItemInstance(MatDefinition);
bool bBuildFree = PlayerController->DoesBuildFree();
// LOG_INFO(LogDev, "MatInstance->GetItemEntry()->GetCount(): {}", MatInstance->GetItemEntry()->GetCount());
bool bShouldDestroy = MatInstance && MatInstance->GetItemEntry() ? MatInstance->GetItemEntry()->GetCount() < 10 : true;
if (bShouldDestroy && !bBuildFree)
{
BuildingActor->SilentDie();
return ServerCreateBuildingActorOriginal(Context, Stack, Ret);
}
BuildingActor->SetPlayerPlaced(true); BuildingActor->SetPlayerPlaced(true);
BuildingActor->InitializeBuildingActor(PlayerController, BuildingActor, true); BuildingActor->InitializeBuildingActor(PlayerController, BuildingActor, true);
BuildingActor->SetTeam(PlayerStateAthena->GetTeamIndex()); // required? BuildingActor->SetTeam(PlayerStateAthena->GetTeamIndex()); // required?
@@ -1212,7 +1218,7 @@ void AFortPlayerController::ClientOnPawnDiedHook(AFortPlayerController* PlayerCo
if (Fortnite_Version > 1.8 || Fortnite_Version == 1.11) if (Fortnite_Version > 1.8 || Fortnite_Version == 1.11)
{ {
auto DeathInfo = (void*)(__int64(DeadPlayerState) + MemberOffsets::FortPlayerStateAthena::DeathInfo); // Alloc<void>(DeathInfoStructSize); auto DeathInfo = (void*)(__int64(DeadPlayerState) + MemberOffsets::FortPlayerStateAthena::DeathInfo); // Alloc<void>(DeathInfoStructSize);
RtlSecureZeroMemory(DeathInfo, DeathInfoStructSize); RtlSecureZeroMemory(DeathInfo, DeathInfoStructSize); // TODO FREE THE DEATHTAGS
auto/*&*/ Tags = MemberOffsets::FortPlayerPawn::CorrectTags == 0 ? FGameplayTagContainer() auto/*&*/ Tags = MemberOffsets::FortPlayerPawn::CorrectTags == 0 ? FGameplayTagContainer()
: DeadPawn->Get<FGameplayTagContainer>(MemberOffsets::FortPlayerPawn::CorrectTags); : DeadPawn->Get<FGameplayTagContainer>(MemberOffsets::FortPlayerPawn::CorrectTags);

View File

@@ -175,6 +175,28 @@ public:
return Get<AFortVolume*>(CreativePlotLinkedVolumeOffset); return Get<AFortVolume*>(CreativePlotLinkedVolumeOffset);
} }
void ClientClearDeathNotification() // actually in zone
{
auto ClientClearDeathNotificationFn = FindFunction("ClientClearDeathNotification");
if (ClientClearDeathNotificationFn)
this->ProcessEvent(ClientClearDeathNotificationFn);
}
void RespawnPlayerAfterDeath(bool bEnterSkydiving)
{
static auto RespawnPlayerAfterDeathFn = FindObject<UFunction>("/Script/FortniteGame.FortPlayerControllerAthena.RespawnPlayerAfterDeath");
if (RespawnPlayerAfterDeathFn)
{
this->ProcessEvent(RespawnPlayerAfterDeathFn, &bEnterSkydiving);
}
else
{
// techinally we can remake this as all it really does on older versions is clear deathinfo
}
}
static void StartGhostModeHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but eh static void StartGhostModeHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but eh
static void EndGhostModeHook(AFortPlayerControllerAthena* PlayerController); static void EndGhostModeHook(AFortPlayerControllerAthena* PlayerController);
static void EnterAircraftHook(UObject* PC, AActor* Aircraft); static void EnterAircraftHook(UObject* PC, AActor* Aircraft);

View File

@@ -132,6 +132,7 @@ APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AControll
bool bIsRespawning = false; bool bIsRespawning = false;
/*
static auto RespawnDataOffset = PlayerStateAthena->GetOffset("RespawnData", false); static auto RespawnDataOffset = PlayerStateAthena->GetOffset("RespawnData", false);
if (RespawnDataOffset != -1) if (RespawnDataOffset != -1)
@@ -142,7 +143,12 @@ APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AControll
{ {
bIsRespawning = true; bIsRespawning = true;
} }
} } */
/* auto DeathInfo = (void*)(__int64(PlayerStateAthena) + MemberOffsets::FortPlayerStateAthena::DeathInfo);
FVector DeathLocation = MemberOffsets::DeathInfo::DeathLocation != -1 ? *(FVector*)(__int64(DeathInfo) + MemberOffsets::DeathInfo::DeathLocation) : FVector(0, 0, 0);
bIsRespawning = !(DeathLocation == FVector(0, 0, 0)); // bro kms */
auto ASC = PlayerStateAthena->GetAbilitySystemComponent(); auto ASC = PlayerStateAthena->GetAbilitySystemComponent();
auto GameState = ((AFortGameModeAthena*)GameMode)->GetGameStateAthena(); auto GameState = ((AFortGameModeAthena*)GameMode)->GetGameStateAthena();
@@ -225,13 +231,13 @@ APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AControll
} }
else else
{ {
LOG_INFO(LogDev, "Player is respawning!"); // TODO I DONT KNOW WHEN TO DO THIS
auto DeathInfo = (void*)(__int64(PlayerStateAthena) + MemberOffsets::FortPlayerStateAthena::DeathInfo); /*
static auto DeathInfoStruct = FindObject<UStruct>(L"/Script/FortniteGame.DeathInfo"); static auto DeathInfoStruct = FindObject<UStruct>(L"/Script/FortniteGame.DeathInfo");
static auto DeathInfoStructSize = DeathInfoStruct->GetPropertiesSize(); static auto DeathInfoStructSize = DeathInfoStruct->GetPropertiesSize();
RtlSecureZeroMemory(DeathInfo, DeathInfoStructSize); RtlSecureZeroMemory(DeathInfo, DeathInfoStructSize); // TODO FREE THE DEATHTAGS
static auto OnRep_DeathInfoFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerStateAthena.OnRep_DeathInfo"); static auto OnRep_DeathInfoFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerStateAthena.OnRep_DeathInfo");
@@ -239,6 +245,11 @@ APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AControll
{ {
PlayerStateAthena->ProcessEvent(OnRep_DeathInfoFn); PlayerStateAthena->ProcessEvent(OnRep_DeathInfoFn);
} }
*/
// NewPlayerAsAthena->ClientClearDeathNotification();
// NewPlayerAsAthena->RespawnPlayerAfterDeath(true);
} }
return NewPawn; return NewPawn;

View File

@@ -21,6 +21,11 @@ public:
return (A <= B) ? A : B; return (A <= B) ? A : B;
} }
static FORCEINLINE float InvSqrt(float F)
{
return 1.0f / sqrtf(F);
}
static FORCENOINLINE float Fmod(float X, float Y); static FORCENOINLINE float Fmod(float X, float Y);
static FORCEINLINE int32 FloorToInt(float F) static FORCEINLINE int32 FloorToInt(float F)

View File

@@ -9,6 +9,13 @@ void APlayerController::ServerChangeName(FString& S)
this->ProcessEvent(ServerChangeNameFn, &S); this->ProcessEvent(ServerChangeNameFn, &S);
} }
void APlayerController::SetPlayerIsWaiting(bool NewValue)
{
static auto bPlayerIsWaitingOffset = GetOffset("bPlayerIsWaiting");
static auto bPlayerIsWaitingFieldMask = GetFieldMask(this->GetProperty("bPlayerIsWaiting"));
this->SetBitfieldValue(bPlayerIsWaitingOffset, bPlayerIsWaitingFieldMask, NewValue);
}
UCheatManager*& APlayerController::SpawnCheatManager(UClass* CheatManagerClass) UCheatManager*& APlayerController::SpawnCheatManager(UClass* CheatManagerClass)
{ {
GetCheatManager() = UGameplayStatics::SpawnObject<UCheatManager>(CheatManagerClass, this, true); GetCheatManager() = UGameplayStatics::SpawnObject<UCheatManager>(CheatManagerClass, this, true);

View File

@@ -16,6 +16,7 @@ public:
return this->Get<UCheatManager*>(CheatManagerOffset); return this->Get<UCheatManager*>(CheatManagerOffset);
} }
void SetPlayerIsWaiting(bool NewValue);
void ServerChangeName(FString& S); void ServerChangeName(FString& S);
UCheatManager*& SpawnCheatManager(UClass* CheatManagerClass); UCheatManager*& SpawnCheatManager(UClass* CheatManagerClass);
FRotator GetControlRotation(); FRotator GetControlRotation();

View File

@@ -176,7 +176,6 @@
<ClCompile Include="Actor.cpp" /> <ClCompile Include="Actor.cpp" />
<ClCompile Include="ActorComponent.cpp" /> <ClCompile Include="ActorComponent.cpp" />
<ClCompile Include="addresses.cpp" /> <ClCompile Include="addresses.cpp" />
<ClCompile Include="AthenaDeimosRift.cpp" />
<ClCompile Include="AthenaMarkerComponent.cpp" /> <ClCompile Include="AthenaMarkerComponent.cpp" />
<ClCompile Include="BP_IslandScripting.cpp" /> <ClCompile Include="BP_IslandScripting.cpp" />
<ClCompile Include="BuildingActor.cpp" /> <ClCompile Include="BuildingActor.cpp" />
@@ -277,7 +276,6 @@
<ClInclude Include="AthenaBarrierFlag.h" /> <ClInclude Include="AthenaBarrierFlag.h" />
<ClInclude Include="AthenaBarrierObjective.h" /> <ClInclude Include="AthenaBarrierObjective.h" />
<ClInclude Include="AthenaBigBaseWall.h" /> <ClInclude Include="AthenaBigBaseWall.h" />
<ClInclude Include="AthenaDeimosRift.h" />
<ClInclude Include="AthenaMarkerComponent.h" /> <ClInclude Include="AthenaMarkerComponent.h" />
<ClInclude Include="AthenaResurrectionComponent.h" /> <ClInclude Include="AthenaResurrectionComponent.h" />
<ClInclude Include="AttributeSet.h" /> <ClInclude Include="AttributeSet.h" />
@@ -322,6 +320,7 @@
<ClInclude Include="FortAthenaMapInfo.h" /> <ClInclude Include="FortAthenaMapInfo.h" />
<ClInclude Include="FortAthenaMutator.h" /> <ClInclude Include="FortAthenaMutator.h" />
<ClInclude Include="FortAthenaMutator_Barrier.h" /> <ClInclude Include="FortAthenaMutator_Barrier.h" />
<ClInclude Include="FortAthenaMutator_Bots.h" />
<ClInclude Include="FortAthenaMutator_Disco.h" /> <ClInclude Include="FortAthenaMutator_Disco.h" />
<ClInclude Include="FortAthenaMutator_GG.h" /> <ClInclude Include="FortAthenaMutator_GG.h" />
<ClInclude Include="FortAthenaMutator_GiveItemsAtGamePhaseStep.h" /> <ClInclude Include="FortAthenaMutator_GiveItemsAtGamePhaseStep.h" />
@@ -331,6 +330,8 @@
<ClInclude Include="FortAthenaMutator_ItemDropOnDeath.h" /> <ClInclude Include="FortAthenaMutator_ItemDropOnDeath.h" />
<ClInclude Include="FortAthenaMutator_LoadoutSwap.h" /> <ClInclude Include="FortAthenaMutator_LoadoutSwap.h" />
<ClInclude Include="FortAthenaMutator_TDM.h" /> <ClInclude Include="FortAthenaMutator_TDM.h" />
<ClInclude Include="FortAthenaNpcPatrollingComponent.h" />
<ClInclude Include="FortAthenaPatrolPath.h" />
<ClInclude Include="FortAthenaSKPushCannon.h" /> <ClInclude Include="FortAthenaSKPushCannon.h" />
<ClInclude Include="FortAthenaSupplyDrop.h" /> <ClInclude Include="FortAthenaSupplyDrop.h" />
<ClInclude Include="FortAthenaVehicle.h" /> <ClInclude Include="FortAthenaVehicle.h" />

View File

@@ -46,9 +46,6 @@
<ClCompile Include="FortInventory.h"> <ClCompile Include="FortInventory.h">
<Filter>FortniteGame\Source\FortniteGame\Public\Items</Filter> <Filter>FortniteGame\Source\FortniteGame\Public\Items</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="FortPawn.cpp">
<Filter>FortniteGame\Source\FortniteGame\Private\Pawns</Filter>
</ClCompile>
<ClCompile Include="AbilitySystemComponent_Abilities.cpp"> <ClCompile Include="AbilitySystemComponent_Abilities.cpp">
<Filter>Engine\Plugins\Runtime\GameplayAbilities\Source\GameplayAbilities\Private</Filter> <Filter>Engine\Plugins\Runtime\GameplayAbilities\Source\GameplayAbilities\Private</Filter>
</ClCompile> </ClCompile>
@@ -283,15 +280,15 @@
<ClCompile Include="BuildingGameplayActorSpawnMachine.cpp"> <ClCompile Include="BuildingGameplayActorSpawnMachine.cpp">
<Filter>FortniteGame\Source\FortniteGame\Private\Building</Filter> <Filter>FortniteGame\Source\FortniteGame\Private\Building</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="AthenaDeimosRift.cpp">
<Filter>FortniteGame\Source\FortniteGame\Private\Deimos</Filter>
</ClCompile>
<ClCompile Include="BP_IslandScripting.cpp"> <ClCompile Include="BP_IslandScripting.cpp">
<Filter>FortniteGame\Source\FortniteGame\Private\Athena\Island</Filter> <Filter>FortniteGame\Source\FortniteGame\Private\Athena\Island</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="KismetSystemLibrary.cpp"> <ClCompile Include="KismetSystemLibrary.cpp">
<Filter>Engine\Source\Runtime\Engine\Private</Filter> <Filter>Engine\Source\Runtime\Engine\Private</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="FortPawn.cpp">
<Filter>FortniteGame\Source\FortniteGame\Private\Player</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="log.h" /> <ClInclude Include="log.h" />
@@ -741,9 +738,6 @@
<ClInclude Include="FortAthenaSKPushCannon.h"> <ClInclude Include="FortAthenaSKPushCannon.h">
<Filter>FortniteGame\Source\FortniteGame\Public\Athena\Vehicle</Filter> <Filter>FortniteGame\Source\FortniteGame\Public\Athena\Vehicle</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="FortAthenaVehicle.h">
<Filter>FortniteGame\Source\FortniteGame\Public\Athena\Vehicle</Filter>
</ClInclude>
<ClInclude Include="MemoryOps.h"> <ClInclude Include="MemoryOps.h">
<Filter>Engine\Source\Runtime\Core\Public\Templates</Filter> <Filter>Engine\Source\Runtime\Core\Public\Templates</Filter>
</ClInclude> </ClInclude>
@@ -886,9 +880,6 @@
<ClInclude Include="AthenaResurrectionComponent.h"> <ClInclude Include="AthenaResurrectionComponent.h">
<Filter>FortniteGame\Source\FortniteGame\Public</Filter> <Filter>FortniteGame\Source\FortniteGame\Public</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="AthenaDeimosRift.h">
<Filter>FortniteGame\Source\FortniteGame\Public\Deimos</Filter>
</ClInclude>
<ClInclude Include="BuildingRift.h"> <ClInclude Include="BuildingRift.h">
<Filter>FortniteGame\Source\FortniteGame\Public\Building</Filter> <Filter>FortniteGame\Source\FortniteGame\Public\Building</Filter>
</ClInclude> </ClInclude>
@@ -901,6 +892,18 @@
<ClInclude Include="LevelStreaming.h"> <ClInclude Include="LevelStreaming.h">
<Filter>Engine\Source\Runtime\Engine\Classes\Engine</Filter> <Filter>Engine\Source\Runtime\Engine\Classes\Engine</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="FortAthenaMutator_Bots.h">
<Filter>FortniteGame\Source\FortniteGame\Public\Athena\Modifiers</Filter>
</ClInclude>
<ClInclude Include="FortAthenaNpcPatrollingComponent.h">
<Filter>FortniteGame\Source\FortniteGame\Public\AI</Filter>
</ClInclude>
<ClInclude Include="FortAthenaPatrolPath.h">
<Filter>FortniteGame\Source\FortniteGame\Public\AI</Filter>
</ClInclude>
<ClInclude Include="FortAthenaVehicle.h">
<Filter>FortniteGame\Source\FortniteGame\Public\Athena</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Filter Include="Engine"> <Filter Include="Engine">
@@ -1134,18 +1137,18 @@
<Filter Include="FortniteGame\Source\FortniteGame\Private\Athena\Modifiers"> <Filter Include="FortniteGame\Source\FortniteGame\Private\Athena\Modifiers">
<UniqueIdentifier>{ade44d65-f7a4-4fc9-ac38-637c84493b58}</UniqueIdentifier> <UniqueIdentifier>{ade44d65-f7a4-4fc9-ac38-637c84493b58}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="FortniteGame\Source\FortniteGame\Public\Deimos">
<UniqueIdentifier>{ac17e75e-ef4a-44f8-9b69-f55b6cde947d}</UniqueIdentifier>
</Filter>
<Filter Include="FortniteGame\Source\FortniteGame\Private\Deimos">
<UniqueIdentifier>{aadf4f37-b2b9-4ce2-bebb-35719ef0aab1}</UniqueIdentifier>
</Filter>
<Filter Include="FortniteGame\Source\FortniteGame\Public\Athena\Island"> <Filter Include="FortniteGame\Source\FortniteGame\Public\Athena\Island">
<UniqueIdentifier>{7df06629-6271-4cd1-8f2c-ad8d6829b069}</UniqueIdentifier> <UniqueIdentifier>{7df06629-6271-4cd1-8f2c-ad8d6829b069}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="FortniteGame\Source\FortniteGame\Private\Athena\Island"> <Filter Include="FortniteGame\Source\FortniteGame\Private\Athena\Island">
<UniqueIdentifier>{2d9beb55-a616-440e-8861-6a05f0ee2ef3}</UniqueIdentifier> <UniqueIdentifier>{2d9beb55-a616-440e-8861-6a05f0ee2ef3}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="FortniteGame\Source\FortniteGame\Public\AI">
<UniqueIdentifier>{d4816986-6cba-4c02-aab1-19108664cbb1}</UniqueIdentifier>
</Filter>
<Filter Include="FortniteGame\Source\FortniteGame\Public\AI\Navigation">
<UniqueIdentifier>{8953303f-bfb2-4d61-945e-994fb1761cd8}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="UnrealEngine.cpp"> <None Include="UnrealEngine.cpp">

View File

@@ -9,6 +9,7 @@
#include "builder.h" #include "builder.h"
#include "FortLootPackage.h" #include "FortLootPackage.h"
#include "bots.h" #include "bots.h"
#include "FortAthenaMutator_Bots.h"
bool IsOperator(APlayerState* PlayerState, AFortPlayerController* PlayerController) bool IsOperator(APlayerState* PlayerState, AFortPlayerController* PlayerController)
{ {

View File

@@ -108,7 +108,7 @@ static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int Override
FortGameData = CurrentPlaylist ? CurrentPlaylist->Get<TSoftObjectPtr<UCurveTable>>(GameDataOffset).Get() : nullptr; FortGameData = CurrentPlaylist ? CurrentPlaylist->Get<TSoftObjectPtr<UCurveTable>>(GameDataOffset).Get() : nullptr;
if (!FortGameData) if (!FortGameData)
FortGameData = FindObject<UCurveTable>("/Game/Balance/AthenaGameData.AthenaGameData"); FortGameData = FindObject<UCurveTable>(L"/Game/Balance/AthenaGameData.AthenaGameData");
LOG_INFO(LogDev, "FortGameData: {}", FortGameData ? FortGameData->GetFullName() : "InvalidObject"); LOG_INFO(LogDev, "FortGameData: {}", FortGameData ? FortGameData->GetFullName() : "InvalidObject");

View File

@@ -44,7 +44,6 @@
#include "PlaysetLevelStreamComponent.h" #include "PlaysetLevelStreamComponent.h"
#include "FortAthenaVehicleSpawner.h" #include "FortAthenaVehicleSpawner.h"
#include "FortGameSessionDedicatedAthena.h" #include "FortGameSessionDedicatedAthena.h"
#include "AthenaDeimosRift.h"
enum class EMeshNetworkNodeType : uint8_t enum class EMeshNetworkNodeType : uint8_t
{ {
@@ -320,27 +319,31 @@ DWORD WINAPI Main(LPVOID)
FindObject<UFunction>(L"/Script/FortniteGame.BuildingFoundation.SetDynamicFoundationEnabled"), FindObject<UFunction>(L"/Script/FortniteGame.BuildingFoundation.SetDynamicFoundationEnabled"),
ABuildingFoundation::SetDynamicFoundationEnabledHook, (PVOID*)&ABuildingFoundation::SetDynamicFoundationEnabledOriginal, false, true); */ ABuildingFoundation::SetDynamicFoundationEnabledHook, (PVOID*)&ABuildingFoundation::SetDynamicFoundationEnabledOriginal, false, true); */
if (Fortnite_Version == 17.30) if (Fortnite_Version == 17.30) // Rift Tour stuff
{ {
// if (false) Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3E07910), (PVOID)GetMeshNetworkNodeTypeHook, nullptr);
{ Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DED158), (PVOID)ReturnTrueHook, nullptr); // 7FF7E556D158
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3E07910), (PVOID)GetMeshNetworkNodeTypeHook, nullptr);
// Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DED12C), (PVOID)ReturnTrueHook, nullptr); // 7FF7E556D12C
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DED158), (PVOID)ReturnTrueHook, nullptr); // 7FF7E556D158
}
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DECFC8), (PVOID)ReturnTrueHook, nullptr); // 7FF7E556CFC8 Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DECFC8), (PVOID)ReturnTrueHook, nullptr); // 7FF7E556CFC8
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DED050), (PVOID)ReturnTrueHook, nullptr); // 7FF7E556D050 Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DED050), (PVOID)ReturnTrueHook, nullptr); // 7FF7E556D050
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DECF40), (PVOID)ReturnFalseHook, nullptr); // 7FF7E556CF40 Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DECF40), (PVOID)ReturnFalseHook, nullptr); // 7FF7E556CF40
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DE5CE8), (PVOID)ActivatePhaseAtIndexHook, (PVOID*)&ActivatePhaseAtIndexOriginal); // 7FF7E5565CE8 Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DE5CE8), (PVOID)ActivatePhaseAtIndexHook, (PVOID*)&ActivatePhaseAtIndexOriginal); // 7FF7E5565CE8
// Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DE9268), (PVOID)FlowStep_SetPhaseToActiveHook, (PVOID*)&FlowStep_SetPhaseToActiveOriginal); // 7FF7E5569268 }
// Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DE5998), (PVOID)SpecialEventScript_ActivatePhaseHook, (PVOID*)&SpecialEventScript_ActivatePhaseOriginal); // 7FF7E5565998 else if (Fortnite_Version == 18.40)
{
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3E07910), (PVOID)GetMeshNetworkNodeTypeHook, nullptr);
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x416AAB8), (PVOID)ReturnTrueHook, nullptr); // 7FF79E3EAAB8
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x416A840), (PVOID)ReturnTrueHook, nullptr); // 7FF79E3EA840
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x416A93C), (PVOID)ReturnTrueHook, nullptr); // 7FF79E3EA93C
// Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + ), (PVOID)ReturnFalseHook, nullptr); // 7FF7E556CF40
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x41624C8), (PVOID)ActivatePhaseAtIndexHook, (PVOID*)&ActivatePhaseAtIndexOriginal); // 7FF79E3E24C8
} }
if (Fortnite_Version == 6.21) if (Fortnite_Version == 6.21)
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x191D2E0), (PVOID)CanCreateInCurrentContextHook, (PVOID*)&CanCreateInCurrentContextOriginal); Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x191D2E0), (PVOID)CanCreateInCurrentContextHook, (PVOID*)&CanCreateInCurrentContextOriginal);
else if (Fortnite_Version == 10.40) else if (Fortnite_Version == 10.40)
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x22A30C0), (PVOID)CanCreateInCurrentContextHook, (PVOID*)&CanCreateInCurrentContextOriginal); Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x22A30C0), (PVOID)CanCreateInCurrentContextHook, (PVOID*)&CanCreateInCurrentContextOriginal);
else if (Fortnite_Version == 12.41)
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x2DBCBA0), (PVOID)CanCreateInCurrentContextHook, (PVOID*)&CanCreateInCurrentContextOriginal);
if (bUseSwitchLevel) if (bUseSwitchLevel)
{ {
@@ -780,9 +783,6 @@ DWORD WINAPI Main(LPVOID)
Hooking::MinHook::Hook(InventoryManagementLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.InventoryManagementLibrary.SwapItems"), Hooking::MinHook::Hook(InventoryManagementLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.InventoryManagementLibrary.SwapItems"),
UInventoryManagementLibrary::SwapItemsHook, (PVOID*)&UInventoryManagementLibrary::SwapItemsOriginal, false, true); UInventoryManagementLibrary::SwapItemsHook, (PVOID*)&UInventoryManagementLibrary::SwapItemsOriginal, false, true);
Hooking::MinHook::Hook(FindObject<AAthenaDeimosRift>(L"/Script/FortniteGame.Default__AthenaDeimosRift"), FindObject<UFunction>(L"/Script/FortniteGame.AthenaDeimosRift.QueueActorsToSpawn"),
AAthenaDeimosRift::QueueActorsToSpawnHook, (PVOID*)&AAthenaDeimosRift::QueueActorsToSpawnOriginal, false, true);
Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__FortAthenaVehicleSpawner"), FindObject<UFunction>(L"/Script/FortniteGame.FortAthenaVehicleSpawner.SpawnVehicle"), Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__FortAthenaVehicleSpawner"), FindObject<UFunction>(L"/Script/FortniteGame.FortAthenaVehicleSpawner.SpawnVehicle"),
AFortAthenaVehicleSpawner::SpawnVehicleHook, nullptr, false); AFortAthenaVehicleSpawner::SpawnVehicleHook, nullptr, false);

View File

@@ -132,6 +132,31 @@ static inline std::vector<Event> Events =
false false
), ),
Event Event
(
"The End Event Chapter 2",
"",
"",
0,
{
},
{
{
{
false,
// "/Buffet/Gameplay/Blueprints/BP_Buffet_Master_Scripting.BP_Buffet_Master_Scripting_C.startevent"
"/Script/SpecialEventGameplayRuntime.SpecialEventScript.StartEventAtIndex"
},
0
}
},
"/Guava/Gameplay/BP_Guava_SpecialEventScript.BP_Guava_SpecialEventScript_C", // what
"/GuavaPlaylist/Playlist/Playlist_Guava.Playlist_Guava",
18.40
),
Event
( (
"The Showdown", "The Showdown",
"/Game/Athena/Prototype/Blueprints/Cattus/BP_CattusDoggus_Scripting.BP_CattusDoggus_Scripting_C", "/Game/Athena/Prototype/Blueprints/Cattus/BP_CattusDoggus_Scripting.BP_CattusDoggus_Scripting_C",
@@ -698,11 +723,8 @@ static inline void StartEvent()
CallOnReadys(); CallOnReadys();
if (Fortnite_Version == 17.30) if (Fortnite_Version >= 17.30)
{ {
static bool (*IsServerOrSomething)(UObject* SpecialEventScript) = decltype(IsServerOrSomething)(__int64(GetModuleHandleW(0)) + 0x3DECFC8);
LOG_INFO(LogDev, "IsServerOrSomething {}", IsServerOrSomething(EventScripting));
static auto OnRep_RootStartTimeFn = FindObject<UFunction>("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor.OnRep_RootStartTime"); static auto OnRep_RootStartTimeFn = FindObject<UFunction>("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor.OnRep_RootStartTime");
static auto MeshRootStartEventFn = FindObject<UFunction>("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor.MeshRootStartEvent"); static auto MeshRootStartEventFn = FindObject<UFunction>("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor.MeshRootStartEvent");
auto SpecialEventScriptMeshActorClass = FindObject<UClass>("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor"); auto SpecialEventScriptMeshActorClass = FindObject<UClass>("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor");
@@ -714,11 +736,9 @@ static inline void StartEvent()
if (SpecialEventScriptMeshActor) if (SpecialEventScriptMeshActor)
{ {
static bool (*sub_7FF7E556D158)(UObject* MeshScriptActor) = decltype(sub_7FF7E556D158)(__int64(GetModuleHandleW(0)) + 0x3DED158);
LOG_INFO(LogDev, "sub_7FF7E556D158 {}", sub_7FF7E556D158(SpecialEventScriptMeshActor));
// if (false) // if (false)
{ {
LOG_INFO(LogDev, "MeshRootStartEventFn!");
SpecialEventScriptMeshActor->ProcessEvent(MeshRootStartEventFn); SpecialEventScriptMeshActor->ProcessEvent(MeshRootStartEventFn);
SpecialEventScriptMeshActor->ProcessEvent(OnRep_RootStartTimeFn); SpecialEventScriptMeshActor->ProcessEvent(OnRep_RootStartTimeFn);

View File

@@ -1225,8 +1225,10 @@ static inline uint64 FindAddNavigationSystemToWorld()
if (Engine_Version == 421) if (Engine_Version == 421)
addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 83 B9 ? ? ? ? ? 41 0F B6 F1 0F B6 FA 48", false).Get(); addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 83 B9 ? ? ? ? ? 41 0F B6 F1 0F B6 FA 48", false).Get();
if (Engine_Version == 423) else if (Engine_Version == 423)
addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 ED 41", false).Get(); addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 ED 41", false).Get();
else if (Engine_Version == 425)
addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 ED 41 0F B6 F1").Get();
return addr; return addr;
} }

View File

@@ -58,6 +58,7 @@
#define LOADOUT_PLAYERTAB 4 #define LOADOUT_PLAYERTAB 4
#define FUN_PLAYERTAB 5 #define FUN_PLAYERTAB 5
extern inline int NumToSubtractFromSquadId = 2;
extern inline int SecondsUntilTravel = 5; extern inline int SecondsUntilTravel = 5;
extern inline bool bSwitchedInitialLevel = false; extern inline bool bSwitchedInitialLevel = false;
extern inline bool bIsInAutoRestart = false; extern inline bool bIsInAutoRestart = false;
@@ -528,6 +529,7 @@ static inline void MainUI()
auto Mission = AllMissions.at(i); auto Mission = AllMissions.at(i);
static auto bCalendarAllowsSpawningOffset = Mission->GetOffset("bCalendarAllowsSpawning"); static auto bCalendarAllowsSpawningOffset = Mission->GetOffset("bCalendarAllowsSpawning");
LOG_INFO(LogDev, "Mission->Get<bool>(bCalendarAllowsSpawningOffset) Original: {}", Mission->Get<bool>(bCalendarAllowsSpawningOffset));
Mission->Get<bool>(bCalendarAllowsSpawningOffset) = true; Mission->Get<bool>(bCalendarAllowsSpawningOffset) = true;
} }
} }
@@ -544,6 +546,7 @@ static inline void MainUI()
LOG_ERROR(LogGame, "Restarting is not supported on chapter 2 and above!"); LOG_ERROR(LogGame, "Restarting is not supported on chapter 2 and above!");
} }
} }
/* /*
if (ImGui::Button("TEST")) if (ImGui::Button("TEST"))
{ {