quite a bit

llamas, fix some ltm specific stuff, add auto bus start for auto restart,  work in progress lategame on 1.11, fix a crash, performance
This commit is contained in:
Milxnor
2023-05-04 20:46:48 -04:00
parent f49f166c2d
commit a4ed589aab
31 changed files with 477 additions and 93 deletions

View File

@@ -0,0 +1,84 @@
#include "FortAthenaMapInfo.h"
#include "GameplayStatics.h"
#include "FortAthenaSupplyDrop.h"
#include "FortGameModeAthena.h"
#include "Vector2D.h"
FVector2D GenerateRandomVector2D(float Radius)
{
float v3;
float v4;
do
{
v3 = (float)((float)rand() * 0.000061037019) - 1.0;
v4 = (float)((float)rand() * 0.000061037019) - 1.0;
} while ((float)((float)(v4 * v4) + (float)(v3 * v3)) > 1.0);
return FVector2D(v3 * Radius, v4 * Radius);
}
FVector AFortAthenaMapInfo::PickSupplyDropLocation(FVector Center, float Radius)
{
static FVector* (*PickSupplyDropLocationOriginal)(AFortAthenaMapInfo* MapInfo, FVector* outLocation, __int64 Center, float Radius) = decltype(PickSupplyDropLocationOriginal)(Addresses::PickSupplyDropLocation);
if (!PickSupplyDropLocationOriginal)
return FVector(0, 0, 0);
// LOG_INFO(LogDev, "GetAircraftDropVolume: {}", __int64(GetAircraftDropVolume()));
FVector Out = FVector(0, 0, 0);
auto ahh = PickSupplyDropLocationOriginal(this, &Out, __int64(&Center), Radius);
return Out;
}
void AFortAthenaMapInfo::SpawnLlamas()
{
if (!GetLlamaClass())
{
// LOG_INFO(LogDev, "No Llama Class, is this intended?");
return;
}
auto AmountOfLlamasToSpawn = CalcuateCurveMinAndMax(GetLlamaQuantityMin(), GetLlamaQuantityMax(), 1);
LOG_INFO(LogDev, "Attempting to spawn {} llamas.", AmountOfLlamasToSpawn);
for (int i = 0; i < AmountOfLlamasToSpawn; i++)
{
FVector Location = PickSupplyDropLocation(FVector(1, 1, 10000), 30000);
// LOG_INFO(LogDev, "Initial Llama at {} {} {}", Location.X, Location.Y, Location.Z);
if (Location == FVector(0, 0, 0))
continue;
FRotator RandomYawRotator = FRotator();
RandomYawRotator.Yaw = (float)rand() * 0.010986663;
FTransform InitialSpawnTransform;
InitialSpawnTransform.Translation = Location;
InitialSpawnTransform.Rotation = RandomYawRotator.Quaternion();
InitialSpawnTransform.Scale3D = FVector(1, 1, 1);
FActorSpawnParameters SpawnParameters{};
SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
SpawnParameters.bDeferConstruction = true;
auto LlamaStart = GetWorld()->SpawnActor<AFortAthenaSupplyDrop>(GetLlamaClass(), InitialSpawnTransform, SpawnParameters);
LOG_INFO(LogDev, "LlamaStart: {}", __int64(LlamaStart));
if (!LlamaStart)
continue;
auto GroundLocation = LlamaStart->FindGroundLocationAt(InitialSpawnTransform.Translation);
FTransform FinalSpawnTransform = InitialSpawnTransform;
FinalSpawnTransform.Translation = GroundLocation;
LOG_INFO(LogDev, "Spawning Llama at {} {} {}", GroundLocation.X, GroundLocation.Y, GroundLocation.Z);
UGameplayStatics::FinishSpawningActor(LlamaStart, FinalSpawnTransform);
}
}

View File

@@ -6,15 +6,16 @@
#include "GameplayAbilityTypes.h"
#include "DataTableFunctionLibrary.h"
#include "SoftObjectPtr.h"
static inline float CalcuateCurveMinAndMax(FScalableFloat* Min, FScalableFloat* Max) // returns 000 not 0.00 (forgot techinal name for this)
static inline float CalcuateCurveMinAndMax(FScalableFloat* Min, FScalableFloat* Max, float Multiplier = 100.f) // returns 000 not 0.00 (forgot techinal name for this)
{
float MinSpawnPercent = UDataTableFunctionLibrary::EvaluateCurveTableRow(Min->GetCurve().CurveTable, Min->GetCurve().RowName, 0);
float MaxSpawnPercent = UDataTableFunctionLibrary::EvaluateCurveTableRow(Max->GetCurve().CurveTable, Max->GetCurve().RowName, 0);
std::random_device MinMaxRd;
std::mt19937 MinMaxGen(MinMaxRd());
std::uniform_int_distribution<> MinMaxDis(MinSpawnPercent * 100, MaxSpawnPercent * 100 + 1); // + 1 ?
std::uniform_int_distribution<> MinMaxDis(MinSpawnPercent * Multiplier, MaxSpawnPercent * Multiplier + 1); // + 1 ?
float SpawnPercent = MinMaxDis(MinMaxGen);
@@ -129,4 +130,35 @@ public:
static auto BuildingGameplayActorSpawnDetailsOffset = GetOffset("BuildingGameplayActorSpawnDetails");
return Get<TArray<FBuildingGameplayActorSpawnDetails>>(BuildingGameplayActorSpawnDetailsOffset);
}
FScalableFloat* GetLlamaQuantityMin()
{
static auto LlamaQuantityMinOffset = GetOffset("LlamaQuantityMin");
return GetPtr<FScalableFloat>(LlamaQuantityMinOffset);
}
FScalableFloat* GetLlamaQuantityMax()
{
static auto LlamaQuantityMaxOffset = GetOffset("LlamaQuantityMax");
return GetPtr<FScalableFloat>(LlamaQuantityMaxOffset);
}
UClass* GetLlamaClass()
{
static auto LlamaClassOffset = GetOffset("LlamaClass", false);
if (LlamaClassOffset == -1)
return nullptr;
return Get<UClass*>(LlamaClassOffset);
}
AActor*& GetAircraftDropVolume() // actually AVolume
{
static auto AircraftDropVolumeOffset = GetOffset("AircraftDropVolume");
return Get<AActor*>(AircraftDropVolumeOffset);
}
FVector PickSupplyDropLocation(FVector Center, float Radius);
void SpawnLlamas();
};

View File

@@ -31,3 +31,14 @@ static inline void LoopMutators(std::function<void(AFortAthenaMutator*)> Callbac
AllMutators.Free();
}
template <typename MutatorType = AFortAthenaMutator>
static inline MutatorType* FindFirstMutator(UClass* MutatorClass = MutatorType::StaticClass())
{
auto AllMutators = UGameplayStatics::GetAllActorsOfClass(GetWorld(), MutatorClass);
auto FirstMutator = AllMutators.Num() >= 1 ? AllMutators.at(0) : nullptr;
AllMutators.Free();
return (MutatorType*)FirstMutator;
}

View File

@@ -1,3 +1,5 @@
// Food Fight
#pragma once
#include "FortAthenaMutator.h"
@@ -5,6 +7,18 @@
#include "AthenaBarrierObjective.h"
#include "AthenaBarrierFlag.h"
/*
EVENT IDS (got on 10.40):
WallComingDown - 1
WallDown - 2
// IDK REST COMPILER WAS TOO SMART
Intro - 9
NoMoreRespawns - 10
*/
struct FBarrierTeamState // Idk if this actually changes
{
static UStruct* GetStruct()

View File

@@ -2,7 +2,7 @@
void AFortAthenaMutator_Disco::OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret)
{
TScriptInterface<UObject> SafeZoneInterface;
/* TScriptInterface<UObject> SafeZoneInterface;
EAthenaGamePhaseStep GamePhaseStep = EAthenaGamePhaseStep::BusFlying;
static auto SafeZoneInterfaceOffset = FindOffsetStruct("/Script/FortniteGame.FortAthenaMutator_Disco.OnGamePhaseStepChanged", "SafeZoneInterface", false);
@@ -10,9 +10,9 @@ void AFortAthenaMutator_Disco::OnGamePhaseStepChangedHook(UObject* Context, FFra
if (SafeZoneInterfaceOffset != -1)
Stack.StepCompiledIn(&SafeZoneInterface);
// Stack.StepCompiledIn(&GamePhaseStep, true);
Stack.StepCompiledIn(&GamePhaseStep, true); */
LOG_INFO(LogDev, "{} GamePhaseStep: {}", __FUNCTION__, (int)GamePhaseStep);
// LOG_INFO(LogDev, "{} GamePhaseStep: {}", __FUNCTION__, (int)GamePhaseStep);
return OnGamePhaseStepChangedOriginal(Context, Stack, Ret);
}

View File

@@ -1,3 +1,5 @@
// Disco Domination
#pragma once
#include "FortAthenaMutator.h"

View File

@@ -1,3 +1,5 @@
// Gun Game
#pragma once
#include "Actor.h"

View File

@@ -22,10 +22,16 @@ struct FHeistExitCraftSpawnData : public FFortPieSliceSpawnData
class AFortAthenaMutator_Heist : public AFortAthenaMutator
{
public:
TArray<FHeistExitCraftSpawnData>& GetHeistExitCraftSpawnData()
/* TArray<FHeistExitCraftSpawnData>& GetHeistExitCraftSpawnData()
{
static auto HeistExitCraftSpawnDataOffset = GetOffset("HeistExitCraftSpawnData");
return Get<TArray<FHeistExitCraftSpawnData>>(HeistExitCraftSpawnDataOffset);
} */
float& GetSpawnExitCraftTime()
{
static auto SpawnExitCraftTimeOffset = GetOffset("SpawnExitCraftTime");
return Get<float>(SpawnExitCraftTimeOffset);
}
static UClass* StaticClass()

View File

@@ -1,5 +1,20 @@
#include "FortAthenaSupplyDrop.h"
FVector AFortAthenaSupplyDrop::FindGroundLocationAt(FVector InLocation)
{
static auto FindGroundLocationAtFn = FindObject<UFunction>("/Script/FortniteGame.FortAthenaSupplyDrop.FindGroundLocationAt");
struct
{
FVector InLocation; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
FVector ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
} AFortAthenaSupplyDrop_FindGroundLocationAt_Params{ InLocation };
this->ProcessEvent(FindGroundLocationAtFn, &AFortAthenaSupplyDrop_FindGroundLocationAt_Params);
return AFortAthenaSupplyDrop_FindGroundLocationAt_Params.ReturnValue;
}
AFortPickup* AFortAthenaSupplyDrop::SpawnPickupFromItemEntryHook(UObject* Context, FFrame& Stack, AFortPickup** Ret)
{
LOG_INFO(LogDev, __FUNCTION__);

View File

@@ -12,6 +12,8 @@ public:
static inline AFortPickup* (*SpawnGameModePickupOriginal)(UObject* Context, FFrame& Stack, AFortPickup** Ret);
static inline AFortPickup* (*SpawnPickupFromItemEntryOriginal)(UObject* Context, FFrame& Stack, AFortPickup** Ret);
FVector FindGroundLocationAt(FVector InLocation);
static AFortPickup* SpawnPickupFromItemEntryHook(UObject* Context, FFrame& Stack, AFortPickup** Ret);
static AFortPickup* SpawnGameModePickupHook(UObject* Context, FFrame& Stack, AFortPickup** Ret);
static AFortPickup* SpawnPickupHook(UObject* Context, FFrame& Stack, AFortPickup** Ret);

View File

@@ -480,11 +480,6 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
{
LastNum = AmountOfRestarts;
float Duration = 10000.f;
float EarlyDuration = Duration;
float TimeSeconds = UGameplayStatics::GetTimeSeconds(GetWorld());
LOG_INFO(LogDev, "Initializing!");
if (std::floor(Fortnite_Version) == 3)
@@ -492,6 +487,11 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
LOG_INFO(LogDev, "GameMode 0x{:x}", __int64(GameMode));
float Duration = 100000.f;
float EarlyDuration = Duration;
float TimeSeconds = UGameplayStatics::GetTimeSeconds(GetWorld());
static auto WarmupCountdownEndTimeOffset = GameState->GetOffset("WarmupCountdownEndTime");
static auto WarmupCountdownStartTimeOffset = GameState->GetOffset("WarmupCountdownStartTime");
static auto WarmupCountdownDurationOffset = GameMode->GetOffset("WarmupCountdownDuration");
@@ -729,6 +729,7 @@ int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint
static int CurrentTeamMembers = 0; // bad
static int Current = DefaultFirstTeam;
static int NextTeamIndex = DefaultFirstTeam;
static int LastNum = 1;
@@ -737,6 +738,7 @@ int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint
LastNum = Globals::AmountOfListens;
Current = DefaultFirstTeam;
NextTeamIndex = DefaultFirstTeam;
CurrentTeamMembers = 0;
}
@@ -781,8 +783,6 @@ int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint
TeamsNum = 100;
}
static int NextTeamIndex = DefaultFirstTeam;
LOG_INFO(LogTeams, "Before team assigning NextTeamIndex: {} CurrentTeamMembers: {}", NextTeamIndex, CurrentTeamMembers);
if (!bShouldSpreadTeams)
@@ -829,6 +829,34 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
LOG_INFO(LogPlayer, "HandleStartingNewPlayer!");
if (Globals::bAutoRestart)
{
static int LastNum123 = 15;
if (GetWorld()->GetNetDriver()->GetClientConnections().Num() >= NumRequiredPlayersToStart && LastNum123 != Globals::AmountOfListens)
{
LastNum123 = Globals::AmountOfListens;
float Duration = AutoBusStartSeconds;
float EarlyDuration = Duration;
float TimeSeconds = UGameplayStatics::GetTimeSeconds(GetWorld());
static auto WarmupCountdownEndTimeOffset = GameState->GetOffset("WarmupCountdownEndTime");
static auto WarmupCountdownStartTimeOffset = GameState->GetOffset("WarmupCountdownStartTime");
static auto WarmupCountdownDurationOffset = GameMode->GetOffset("WarmupCountdownDuration");
static auto WarmupEarlyCountdownDurationOffset = GameMode->GetOffset("WarmupEarlyCountdownDuration");
GameState->Get<float>(WarmupCountdownEndTimeOffset) = TimeSeconds + Duration;
GameMode->Get<float>(WarmupCountdownDurationOffset) = Duration;
GameState->Get<float>(WarmupCountdownStartTimeOffset) = TimeSeconds;
GameMode->Get<float>(WarmupEarlyCountdownDurationOffset) = EarlyDuration;
LOG_INFO(LogDev, "Auto starting bus in {}.", AutoBusStartSeconds);
}
}
// if (Engine_Version < 427)
{
static int LastNum69 = 19451;
@@ -837,11 +865,14 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
{
LastNum69 = Globals::AmountOfListens;
bool bShouldDestroyVendingMachines = Fortnite_Version < 3.4 || Engine_Version >= 424; // This is not how it works, we need to add the spawn percentage.
// is there spawn percentage for vending machines?
if (!bShouldDestroyVendingMachines) // idk how to set the mat count sooooo problem for later me
bool bShouldDestroyVendingMachines = Fortnite_Version < 3.4 || Engine_Version >= 424;
if (!bShouldDestroyVendingMachines)
{
FillVendingMachines();
if (Globals::bFillVendingMachines)
FillVendingMachines();
}
else
{
@@ -861,15 +892,21 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
AllVendingMachines.Free();
}
SpawnBGAs();
if (Fortnite_Version < 19) // fr idk what i did too lazy to debug
SpawnBGAs();
// Handle spawn rate
if (false)
{
auto MapInfo = GameState->GetMapInfo();
auto MapInfo = GameState->GetMapInfo();
if (MapInfo)
if (MapInfo)
{
if (Fortnite_Version >= 3.3)
{
MapInfo->SpawnLlamas();
}
if (false)
{
float AmmoBoxMinSpawnPercent = UDataTableFunctionLibrary::EvaluateCurveTableRow(
MapInfo->GetAmmoBoxMinSpawnPercent()->GetCurve().CurveTable, MapInfo->GetAmmoBoxMinSpawnPercent()->GetCurve().RowName, 0

View File

@@ -3,6 +3,7 @@
#include "reboot.h"
#include "FortPlayerStateAthena.h"
#include "FortGameModeAthena.h"
#include "FortAthenaMutator.h"
/* void AFortGameStateAthena::AddPlayerStateToGameMemberInfo(class AFortPlayerStateAthena* PlayerState)
{
@@ -36,6 +37,33 @@ TScriptInterface<UFortSafeZoneInterface> AFortGameStateAthena::GetSafeZoneInterf
return ScriptInterface;
}
void AFortGameStateAthena::SetGamePhaseStep(EAthenaGamePhaseStep NewGamePhaseStep)
{
this->GetGamePhaseStep() = NewGamePhaseStep;
std::vector<std::pair<AFortAthenaMutator*, UFunction*>> FunctionsToCall;
LoopMutators([&](AFortAthenaMutator* Mutator) { FunctionsToCall.push_back(std::make_pair(Mutator, Mutator->FindFunction("OnGamePhaseStepChanged"))); });
for (auto& FunctionToCallPair : FunctionsToCall)
{
// On newer versions there is a second param.
LOG_INFO(LogDev, "A1: {} FunctionToCallPair.second: {}", FunctionToCallPair.first->IsValidLowLevel() ? FunctionToCallPair.first->GetFullName() : "BadRead", __int64(FunctionToCallPair.second));
if (FunctionToCallPair.second->IsValidLowLevel() && FunctionToCallPair.first->IsValidLowLevel())
{
auto Params = ConstructOnGamePhaseStepChangedParams(NewGamePhaseStep);
if (Params)
{
FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, Params);
VirtualFree(Params, 0, MEM_RELEASE);
}
}
}
}
UFortPlaylist*& AFortGameStateAthena::GetCurrentPlaylist()
{
static auto CurrentPlaylistInfoOffset = GetOffset("CurrentPlaylistInfo", false);

View File

@@ -86,6 +86,14 @@ public:
return Get<AFortAthenaMapInfo*>(MapInfoOffset);
}
EAthenaGamePhaseStep& GetGamePhaseStep()
{
static auto GamePhaseStepOffset = GetOffset("GamePhaseStep");
return Get<EAthenaGamePhaseStep>(GamePhaseStepOffset);
}
void SetGamePhaseStep(EAthenaGamePhaseStep NewGamePhaseStep);
UFortPlaylist*& GetCurrentPlaylist();
TScriptInterface<UFortSafeZoneInterface> GetSafeZoneInterface();

View File

@@ -172,7 +172,7 @@ std::pair<std::vector<UFortItem*>, std::vector<UFortItem*>> AFortInventory::AddI
if (PickaxeInstance)
{
RemoveItem(PickaxeInstance->GetItemEntry()->GetItemGuid(), nullptr, PickaxeInstance->GetItemEntry()->GetCount(), true);
// RemoveItem(PickaxeInstance->GetItemEntry()->GetItemGuid(), nullptr, PickaxeInstance->GetItemEntry()->GetCount(), true);
Update();
}
}
@@ -359,7 +359,7 @@ bool AFortInventory::RemoveItem(const FGuid& ItemGuid, bool* bShouldUpdate, int
if (Fortnite_Version < 7)
{
FortPlayerController->AddPickaxeToInventory();
// FortPlayerController->AddPickaxeToInventory();
}
}
}

View File

@@ -82,7 +82,7 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
{
std::vector<LootDrop> LootDrops;
if (recursive > 10)
if (recursive > 6)
return LootDrops;
auto GameState = ((AFortGameModeAthena*)GetWorld()->GetGameMode())->GetGameStateAthena();
@@ -505,7 +505,7 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
if (ChosenLootPackageName.contains(".Empty")) // I don't think?
{
return PickLootDrops(TierGroupName, bPrint);
return PickLootDrops(TierGroupName, bPrint, ++recursive);
// return LootDrops;
}

View File

@@ -586,8 +586,6 @@ void AFortPlayerController::ServerAttemptAircraftJumpHook(AFortPlayerController*
if (Fortnite_Version == 17.30 && Globals::bGoingToPlayEvent)
return ServerAttemptAircraftJumpOriginal(PC, ClientRotation); // We want to be teleported back to the UFO but we dont use chooseplayerstart
LOG_INFO(LogDev, "PlayerController: {}", __int64(PlayerController));
if (!PlayerController)
return ServerAttemptAircraftJumpOriginal(PC, ClientRotation);
@@ -597,13 +595,25 @@ void AFortPlayerController::ServerAttemptAircraftJumpHook(AFortPlayerController*
auto GameMode = (AFortGameModeAthena*)GetWorld()->GetGameMode();
auto GameState = GameMode->GetGameStateAthena();
static auto AircraftsOffset = GameState->GetOffset("Aircrafts");
auto Aircrafts = GameState->GetPtr<TArray<AActor*>>(AircraftsOffset);
AActor* AircraftToJumpFrom = nullptr;
if (Aircrafts->Num() <= 0)
static auto AircraftsOffset = GameState->GetOffset("Aircrafts", false);
if (AircraftsOffset == -1)
{
static auto AircraftOffset = GameState->GetOffset("Aircraft");
AircraftToJumpFrom = GameState->Get<AActor*>(AircraftOffset);
}
else
{
auto Aircrafts = GameState->GetPtr<TArray<AActor*>>(AircraftsOffset);
AircraftToJumpFrom = Aircrafts->Num() > 0 ? Aircrafts->at(0) : nullptr;
}
if (!AircraftToJumpFrom)
return ServerAttemptAircraftJumpOriginal(PC, ClientRotation);
auto NewPawn = GameMode->SpawnDefaultPawnForHook(GameMode, (AController*)PlayerController, Aircrafts->at(0));
auto NewPawn = GameMode->SpawnDefaultPawnForHook(GameMode, (AController*)PlayerController, AircraftToJumpFrom);
PlayerController->Possess(NewPawn);
auto NewPawnAsFort = Cast<AFortPawn>(NewPawn);

View File

@@ -149,11 +149,7 @@ void AFortPlayerControllerAthena::EnterAircraftHook(UObject* PC, AActor* Aircraf
WorldInventory->RemoveItem(Pair.first, nullptr, Pair.second, true);
}
static auto mutatorClass = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator");
auto AllMutators = UGameplayStatics::GetAllActorsOfClass(GetWorld(), mutatorClass);
std::vector<std::pair<AFortAthenaMutator*, UFunction*>> FunctionsToCall;
LoopMutators([&](AFortAthenaMutator* Mutator) { FunctionsToCall.push_back(std::make_pair(Mutator, Mutator->FindFunction("OnGamePhaseStepChanged"))); });
auto HandleGiveItemsAtGamePhaseStepMutator = [&](AFortAthenaMutator* Mutator) {
@@ -162,7 +158,7 @@ void AFortPlayerControllerAthena::EnterAircraftHook(UObject* PC, AActor* Aircraf
auto PhaseToGive = GiveItemsAtGamePhaseStepMutator->GetPhaseToGiveItems();
auto& ItemsToGive = GiveItemsAtGamePhaseStepMutator->GetItemsToGive();
// LOG_INFO(LogDev, "[{}] PhaseToGiveItems: {} ItemsToGive.Num(): {}", i, (int)PhaseToGive, ItemsToGive.Num());
LOG_INFO(LogDev, "PhaseToGiveItems: {} ItemsToGive.Num(): {}", (int)PhaseToGive, ItemsToGive.Num());
if (PhaseToGive <= 5) // Flying or lower
{

View File

@@ -10,3 +10,21 @@ void AFortSafeZoneIndicator::SkipShrinkSafeZone()
GetSafeZoneStartShrinkTime() = GameState->GetServerWorldTimeSeconds();
GetSafeZoneFinishShrinkTime() = GameState->GetServerWorldTimeSeconds() + 0.2;
}
void AFortSafeZoneIndicator::OnSafeZoneStateChangeHook(AFortSafeZoneIndicator* SafeZoneIndicator, EFortSafeZoneState NewState, bool bInitial)
{
auto GameState = Cast<AFortGameStateAthena>(GetWorld()->GetGameState());
LOG_INFO(LogDev, "OnSafeZoneStateChangeHook!");
if (NewState == EFortSafeZoneState::Shrinking)
{
GameState->SetGamePhaseStep(EAthenaGamePhaseStep::StormShrinking);
}
else if (NewState == EFortSafeZoneState::Holding)
{
GameState->SetGamePhaseStep(EAthenaGamePhaseStep::StormHolding);
}
return OnSafeZoneStateChangeOriginal(SafeZoneIndicator, NewState, bInitial);
}

View File

@@ -2,9 +2,20 @@
#include "Actor.h"
enum class EFortSafeZoneState : uint8_t
{
None = 0,
Starting = 1,
Holding = 2,
Shrinking = 3,
EFortSafeZoneState_MAX = 4
};
class AFortSafeZoneIndicator : public AActor
{
public:
static inline void (*OnSafeZoneStateChangeOriginal)(AFortSafeZoneIndicator* SafeZoneIndicator, EFortSafeZoneState NewState, bool bInitial);
float& GetSafeZoneStartShrinkTime()
{
static auto SafeZoneStartShrinkTimeOffset = GetOffset("SafeZoneStartShrinkTime");
@@ -18,4 +29,6 @@ public:
}
void SkipShrinkSafeZone();
static void OnSafeZoneStateChangeHook(AFortSafeZoneIndicator* SafeZoneIndicator, EFortSafeZoneState NewState, bool bInitial);
};

View File

@@ -194,6 +194,7 @@
<ClCompile Include="EngineTypes.cpp" />
<ClCompile Include="events.cpp" />
<ClCompile Include="FortAthenaCreativePortal.cpp" />
<ClCompile Include="FortAthenaMapInfo.cpp" />
<ClCompile Include="FortAthenaMutator_Barrier.cpp" />
<ClCompile Include="FortAthenaMutator_Disco.cpp" />
<ClCompile Include="FortAthenaMutator_GiveItemsAtGamePhaseStep.cpp" />
@@ -444,6 +445,7 @@
<ClInclude Include="UObjectArray.h" />
<ClInclude Include="UObjectGlobals.h" />
<ClInclude Include="Vector.h" />
<ClInclude Include="Vector2D.h" />
<ClInclude Include="vehicles.h" />
<ClInclude Include="vendingmachine.h" />
<ClInclude Include="WeakObjectPtr.h" />

View File

@@ -107,7 +107,7 @@
<Filter>FortniteGame\Source\FortniteGame\Private\Pawns</Filter>
</ClCompile>
<ClCompile Include="events.cpp">
<Filter>FortniteGame\Source\FortniteGame\Public\Private\Gameplay</Filter>
<Filter>Reboot\Private\Gameplay</Filter>
</ClCompile>
<ClCompile Include="FortPlayerControllerAthena.cpp">
<Filter>FortniteGame\Source\FortniteGame\Private\Player</Filter>
@@ -140,7 +140,7 @@
<Filter>Engine\Source\Runtime\Engine\Private</Filter>
</ClCompile>
<ClCompile Include="addresses.cpp">
<Filter>FortniteGame\Source\FortniteGame\Public\Private</Filter>
<Filter>Reboot\Private</Filter>
</ClCompile>
<ClCompile Include="NetConnection.h">
<Filter>Engine\Source\Runtime\Engine\Classes\Engine</Filter>
@@ -265,6 +265,9 @@
<ClCompile Include="BuildingContainer.cpp">
<Filter>FortniteGame\Source\FortniteGame\Private\Building</Filter>
</ClCompile>
<ClCompile Include="FortAthenaMapInfo.cpp">
<Filter>FortniteGame\Source\FortniteGame\Private</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="log.h" />
@@ -826,9 +829,6 @@
<ClInclude Include="Package.h">
<Filter>Engine\Source\Runtime\CoreUObject\Public\UObject</Filter>
</ClInclude>
<ClInclude Include="Vector.h">
<Filter>Engine\Source\Runtime\Core\Public\Misc</Filter>
</ClInclude>
<ClInclude Include="FortAthenaVehicleSpawner.h">
<Filter>FortniteGame\Source\FortniteGame\Public\Athena\Vehicle</Filter>
</ClInclude>
@@ -842,6 +842,12 @@
<ClInclude Include="FortAthenaSupplyDrop.h">
<Filter>FortniteGame\Source\FortniteGame\Public\Building</Filter>
</ClInclude>
<ClInclude Include="Vector.h">
<Filter>Engine\Source\Runtime\Core\Public\Math</Filter>
</ClInclude>
<ClInclude Include="Vector2D.h">
<Filter>Engine\Source\Runtime\Core\Public\Math</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="Engine">
@@ -1051,12 +1057,6 @@
<Filter Include="Libaries\ImGUI">
<UniqueIdentifier>{2eee3380-ea4b-4137-b058-b57a7b66005e}</UniqueIdentifier>
</Filter>
<Filter Include="FortniteGame\Source\FortniteGame\Public\Private">
<UniqueIdentifier>{563ca89b-be74-42a6-a995-f87ac7a532e4}</UniqueIdentifier>
</Filter>
<Filter Include="FortniteGame\Source\FortniteGame\Public\Private\Gameplay">
<UniqueIdentifier>{52d438db-beaf-44be-bddd-9aeb07c2459f}</UniqueIdentifier>
</Filter>
<Filter Include="FortniteGame\Source\FortniteGame\Public\Athena">
<UniqueIdentifier>{af212a31-57d1-4345-a73f-cd28dc4ebd2f}</UniqueIdentifier>
</Filter>
@@ -1082,7 +1082,10 @@
<UniqueIdentifier>{c04eb59f-e186-49a3-a145-1fd3dc1dcd3d}</UniqueIdentifier>
</Filter>
<Filter Include="Reboot\Private">
<UniqueIdentifier>{00ba0f86-7eef-4ffd-9a9d-47477e5193b2}</UniqueIdentifier>
<UniqueIdentifier>{563ca89b-be74-42a6-a995-f87ac7a532e4}</UniqueIdentifier>
</Filter>
<Filter Include="Reboot\Private\Gameplay">
<UniqueIdentifier>{52d438db-beaf-44be-bddd-9aeb07c2459f}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>

View File

@@ -7,6 +7,9 @@ public:
float Y;
float Z;
FVector() : X(0), Y(0), Z(0) {}
FVector(float x, float y, float z) : X(x), Y(y), Z(z) {}
FVector operator+(const FVector& A)
{
return FVector{ this->X + A.X, this->Y + A.Y, this->Z + A.Z };

View File

@@ -0,0 +1,7 @@
#pragma once
struct FVector2D
{
float X;
float Y;
};

View File

@@ -41,18 +41,24 @@ public:
static inline UObject* (*SpawnActorOriginal)(UWorld* World, UClass* Class, FTransform const* UserTransformPtr, const FActorSpawnParameters& SpawnParameters);
template <typename T = AActor>
T* GetGameMode()
T*& GetGameMode()
{
static auto AuthorityGameModeOffset = GetOffset("AuthorityGameMode");
return this->Get<T*>(AuthorityGameModeOffset);
}
class AGameState* GetGameState()
class AGameState*& GetGameState()
{
static auto GameStateOffset = GetOffset("GameState");
return this->Get<class AGameState*>(GameStateOffset);
}
class UNetDriver*& GetNetDriver()
{
static auto NetDriverOffset = GetOffset("NetDriver");
return this->Get<class UNetDriver*>(NetDriverOffset);
}
UGameInstance* GetOwningGameInstance()
{
static auto OwningGameInstanceOffset = GetOffset("OwningGameInstance");

View File

@@ -288,6 +288,9 @@ void Addresses::FindAll()
LOG_INFO(LogDev, "Finding CreateBuildingActorCallForDeco");
Addresses::CreateBuildingActorCallForDeco = FindCreateBuildingActorCallForDeco();
LOG_INFO(LogDev, "Finding PickSupplyDropLocation");
Addresses::PickSupplyDropLocation = FindPickSupplyDropLocation();
LOG_INFO(LogDev, "Finished finding!");
}
@@ -353,6 +356,7 @@ void Addresses::Print()
LOG_INFO(LogDev, "UpdateTrackedAttributesLea: 0x{:x}", UpdateTrackedAttributesLea - Base);
LOG_INFO(LogDev, "CombinePickupLea: 0x{:x}", CombinePickupLea - Base);
LOG_INFO(LogDev, "CreateBuildingActorCallForDeco: 0x{:x}", CreateBuildingActorCallForDeco - Base);
LOG_INFO(LogDev, "PickSupplyDropLocation: 0x{:x}", PickSupplyDropLocation - Base);
}
void Offsets::FindAll()

View File

@@ -68,6 +68,7 @@ namespace Addresses
extern inline uint64 UpdateTrackedAttributesLea = 0;
extern inline uint64 CombinePickupLea = 0;
extern inline uint64 CreateBuildingActorCallForDeco = 0;
extern inline uint64 PickSupplyDropLocation = 0;
void SetupVersion(); // Finds Engine Version
void FindAll();

View File

@@ -22,6 +22,8 @@ static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int Override
auto GameState = Cast<AFortGameStateAthena>(GameModeAthena->GetGameState());
LOG_INFO(LogDev, "GamePhaseStep: {}", (int)GameState->GetGamePhaseStep());
if (Globals::bLateGame)
{
static auto GameMode_SafeZonePhaseOffset = GameModeAthena->GetOffset("SafeZonePhase");

View File

@@ -778,12 +778,13 @@ DWORD WINAPI Main(LPVOID)
AddVehicleHook();
// if (Fortnite_Version > 1.8 || Fortnite_Version == 1.11)
{
auto ClientOnPawnDiedCallAddr = FindFunctionCall(L"ClientOnPawnDied", Engine_Version == 416 ? std::vector<uint8_t>{ 0x48, 0x89, 0x54 } : std::vector<uint8_t>{ 0x48, 0x89, 0x5C });
LOG_INFO(LogDev, "ClientOnPawnDiedCallAddr: 0x{:x}", ClientOnPawnDiedCallAddr - __int64(GetModuleHandleW(0)));
Hooking::MinHook::Hook((PVOID)ClientOnPawnDiedCallAddr, AFortPlayerController::ClientOnPawnDiedHook, (PVOID*)&AFortPlayerController::ClientOnPawnDiedOriginal);
}
auto ClientOnPawnDiedCallAddr = FindFunctionCall(L"ClientOnPawnDied", Engine_Version == 416 ? std::vector<uint8_t>{ 0x48, 0x89, 0x54 } : std::vector<uint8_t>{ 0x48, 0x89, 0x5C });
LOG_INFO(LogDev, "ClientOnPawnDiedCallAddr: 0x{:x}", ClientOnPawnDiedCallAddr - __int64(GetModuleHandleW(0)));
Hooking::MinHook::Hook((PVOID)ClientOnPawnDiedCallAddr, AFortPlayerController::ClientOnPawnDiedHook, (PVOID*)&AFortPlayerController::ClientOnPawnDiedOriginal);
auto OnSafeZoneStateChangeAddr = FindFunctionCall(L"OnSafeZoneStateChange", Engine_Version == 416 ? std::vector<uint8_t>{ 0x48, 0x89, 0x54 } : std::vector<uint8_t>{ 0x48, 0x89, 0x5C });
LOG_INFO(LogDev, "OnSafeZoneStateChangeAddr: 0x{:x}", OnSafeZoneStateChangeAddr - __int64(GetModuleHandleW(0)));
Hooking::MinHook::Hook((PVOID)OnSafeZoneStateChangeAddr, AFortSafeZoneIndicator::OnSafeZoneStateChangeHook, (PVOID*)&AFortSafeZoneIndicator::OnSafeZoneStateChangeOriginal);
LOG_INFO(LogDev, "PredictionKeySize: 0x{:x} {}", PredictionKeySize, PredictionKeySize);

View File

@@ -147,7 +147,14 @@ static inline uint64 FindPickupInitialize()
if (Engine_Version == 420)
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 41 56 48 83 EC 20 80 B9 ? ? ? ? ? 45 0F B6 F1 49 8B E8").Get(); // 4.1
if (Engine_Version == 421)
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 57 41 57 48 83 EC 30 80 B9 ? ? ? ? ? 41 0F B6").Get(); // 6.21
{
auto addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 57 41 57 48 83 EC 30 80 B9 ? ? ? ? ? 41 0F B6", false).Get(); // 6.21
if (!addr)
addr = Memcury::Scanner::FindPattern("48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 80 B9 ? ? ? ? ? 41 0F B6 E9").Get(); // 5.41
return addr;
}
if (Engine_Version == 422)
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 41 56 41 57 48 83 EC 30 80 B9 ? ? ? ? ? 45 0F B6 F1").Get(); // 7.30
if (Engine_Version == 423)
@@ -235,6 +242,26 @@ static inline uint64 FindInitHost()
return FindBytes(Addr, (Engine_Version == 427 ? std::vector<uint8_t>{ 0x48, 0x8B, 0x5C } : std::vector<uint8_t>{ 0x48, 0x8B, 0xC4 }), 1000, 0, true);
}
static inline uint64 FindPickSupplyDropLocation()
{
auto Addrr = Memcury::Scanner::FindStringRef(L"PickSupplyDropLocation: Failed to find valid location using rejection. Using safe zone location.", true, 0).Get();
if (!Addrr)
return 0;
// Newer versions it is "AFortAthenaMapInfo::PickSupplyDropLocation" (no wide str), but they also changed params so ill add later.
for (int i = 0; i < 1000; i++)
{
if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C)
{
return Addrr - i;
}
}
return 0;
}
static inline uint64 FindPauseBeaconRequests()
{
if (Engine_Version == 500)
@@ -251,6 +278,9 @@ static inline uint64 FindPauseBeaconRequests()
if (Engine_Version == 420)
return Memcury::Scanner::FindPattern("40 53 48 83 EC 30 48 8B D9 84 D2 74 68 80 3D ? ? ? ? ? 72 2C 48 8B 05 ? ? ? ? 4C 8D 44").Get();
if (Fortnite_Version == 6.30 || Fortnite_Version == 6.31) // bro for real! (i think its cuz theres like 3 refs to the same string)
return Memcury::Scanner::FindPattern("40 53 48 83 EC 30 48 8B D9 84 D2 74 68 80 3D").Get();
if (Engine_Version == 419)
{
auto aa = Memcury::Scanner::FindPattern("40 53 48 83 EC 30 48 8B D9 84 D2 74 6F 80 3D", false).Get();
@@ -725,6 +755,8 @@ static inline uint64 FindNoMCP()
static inline uint64 FindSetZoneToIndex() // actually StartNewSafeZonePhase
{
if (Engine_Version == 419)
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 70 48 8B B9 ? ? ? ? 33 DB 0F 29 74 24 ? 48 8B F1 48 85 FF 74 2C E8").Get(); // 1.11
if (Engine_Version == 420)
return Memcury::Scanner::FindPattern("E8 ? ? ? ? EB 31 80 B9 ? ? ? ? ?").RelativeOffset(1).Get(); // 3.5
if (Engine_Version == 422)
@@ -1474,7 +1506,7 @@ static inline uint64 FindPickTeam()
auto testAddr = Memcury::Scanner::FindPattern("88 54 24 10 53 56 41 54 41 55 41 56 48 83 EC 60 4C 8B A1", false).Get(); // 14.60 what is happening lol ????
if (!testAddr)
testAddr = Memcury::Scanner::FindPattern("88 54 24 10 53 55 56 41 55 41 56 48 83 EC 70 48 8B", false).Get(); // 15.10
testAddr = Memcury::Scanner::FindPattern("88 54 24 10 53 55 56 41 55 41 ? 48 83 EC 70 48", false).Get(); // 15.10 & 15.50
if (testAddr)
return testAddr;
@@ -1640,7 +1672,7 @@ static inline uint64 FindCantBuild()
static inline uint64 FindReplaceBuildingActor()
{
auto StringRef = Memcury::Scanner::FindStringRef(L"STAT_Fort_BuildingSMActorReplaceBuildingActor");
auto StringRef = Memcury::Scanner::FindStringRef(L"STAT_Fort_BuildingSMActorReplaceBuildingActor", false);
if (!StringRef.Get()) // we are on a version where stats dont exist
{

View File

@@ -21,6 +21,7 @@ namespace Globals
extern inline bool bInitializedPlaylist = false;
extern inline bool bStartedListening = false;
extern inline bool bAutoRestart = true;
extern inline bool bFillVendingMachines = true;
extern inline int AmountOfListens = 0; // TODO: Switch to this for LastNum
}

View File

@@ -56,9 +56,11 @@
#define LOADOUT_PLAYERTAB 4
#define FUN_PLAYERTAB 5
static inline int SecondsUntilTravel = 5;
static inline bool bSwitchedInitialLevel = false;
extern inline int SecondsUntilTravel = 5;
extern inline bool bSwitchedInitialLevel = false;
extern inline bool bIsInAutoRestart = false;
extern inline float AutoBusStartSeconds = 60;
extern inline int NumRequiredPlayersToStart = 2;
// THE BASE CODE IS FROM IMGUI GITHUB
@@ -264,6 +266,12 @@ static inline void StaticUI()
if (IsRestartingSupported())
{
ImGui::Checkbox("Auto Restart", &Globals::bAutoRestart);
if (Globals::bAutoRestart)
{
ImGui::InputFloat(std::format("How long after {} players join the bus will start", NumRequiredPlayersToStart).c_str(), &AutoBusStartSeconds);
ImGui::InputInt("How many players required to join for bus auto timer to start", &NumRequiredPlayersToStart);
}
}
#ifndef PROD
@@ -548,22 +556,32 @@ static inline void MainUI()
auto GameMode = (AFortGameMode*)GetWorld()->GetGameMode();
auto GameState = GameMode->GetGameState();
static auto AircraftsOffset = GameState->GetOffset("Aircrafts");
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"startaircraft", nullptr);
while (GameState->GetPtr<TArray<AActor*>>(AircraftsOffset)->Num() <= 0) // hmm
auto GetAircrafts = [&]() -> TArray<AActor*>
{
static auto AircraftsOffset = GameState->GetOffset("Aircrafts", false);
if (AircraftsOffset == -1)
{
// GameState->Aircraft
static auto FortAthenaAircraftClass = FindObject<UClass>("/Script/FortniteGame.FortAthenaAircraft");
auto AllAircrafts = UGameplayStatics::GetAllActorsOfClass(GetWorld(), FortAthenaAircraftClass);
return AllAircrafts;
}
return GameState->Get<TArray<AActor*>>(AircraftsOffset);
};
while (GetAircrafts().Num() <= 0) // hmm
{
Sleep(500);
}
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"startsafezone", nullptr);
static auto SafeZoneLocationsOffset = GameMode->GetOffset("SafeZoneLocations");
auto& SafeZoneLocations = GameMode->Get<TArray<FVector>>(SafeZoneLocationsOffset);
LOG_INFO(LogDev, "SafeZoneLocations.Num(): {}", SafeZoneLocations.Num());
static auto SafeZoneIndicatorOffset = GameState->GetOffset("SafeZoneIndicator");
static auto SafeZonesStartTimeOffset = GameState->GetOffset("SafeZonesStartTime");
@@ -574,26 +592,44 @@ static inline void MainUI()
Sleep(500);
}
while (GameState->GetPtr<TArray<AActor*>>(AircraftsOffset)->Num() <= 0) // hmm
while (GetAircrafts().Num() <= 0) // hmm
{
Sleep(500);
}
static auto NextNextCenterOffset = GameState->Get(SafeZoneIndicatorOffset)->GetOffset("NextNextCenter");
static auto NextNextCenterOffset = GameState->Get(SafeZoneIndicatorOffset)->GetOffset("NextNextCenter", false);
static auto NextCenterOffset = GameState->Get(SafeZoneIndicatorOffset)->GetOffset("NextCenter");
FVector LocationToStartAircraft = GameState->Get(SafeZoneIndicatorOffset)->Get<FVector>(NextNextCenterOffset); // SafeZoneLocations.at(4);
FVector LocationToStartAircraft = GameState->Get(SafeZoneIndicatorOffset)->Get<FVector>(NextNextCenterOffset == -1 ? NextCenterOffset : NextNextCenterOffset); // SafeZoneLocations.at(4);
LocationToStartAircraft.Z += 10000;
for (int i = 0; i < GameState->GetPtr<TArray<AActor*>>(AircraftsOffset)->Num(); i++)
for (int i = 0; i < GetAircrafts().Num(); i++)
{
GameState->GetPtr<TArray<AActor*>>(AircraftsOffset)->at(i)->TeleportTo(LocationToStartAircraft, FRotator());
auto CurrentAircraft = GetAircrafts().at(i);
static auto FlightInfoOffset = GameState->GetPtr<TArray<AActor*>>(AircraftsOffset)->at(i)->GetOffset("FlightInfo");
auto FlightInfo = GameState->GetPtr<TArray<AActor*>>(AircraftsOffset)->at(i)->GetPtr<FAircraftFlightInfo>(FlightInfoOffset);
CurrentAircraft->TeleportTo(LocationToStartAircraft, FRotator());
FlightInfo->GetFlightSpeed() = 0;
FlightInfo->GetFlightStartLocation() = LocationToStartAircraft;
FlightInfo->GetTimeTillDropStart() = 0.0f;
static auto FlightInfoOffset = CurrentAircraft->GetOffset("FlightInfo", false);
float FlightSpeed = 0.0f;
if (FlightInfoOffset == -1)
{
static auto FlightStartLocationOffset = CurrentAircraft->GetOffset("FlightStartLocation");
static auto FlightSpeedOffset = CurrentAircraft->GetOffset("FlightSpeed");
static auto DropStartTimeOffset = CurrentAircraft->GetOffset("DropStartTime");
CurrentAircraft->Get<FVector>(FlightStartLocationOffset) = LocationToStartAircraft;
CurrentAircraft->Get<float>(FlightSpeedOffset) = FlightSpeed;
CurrentAircraft->Get<float>(DropStartTimeOffset) = GameState->GetServerWorldTimeSeconds();
}
else
{
auto FlightInfo = CurrentAircraft->GetPtr<FAircraftFlightInfo>(FlightInfoOffset);
FlightInfo->GetFlightSpeed() = FlightSpeed;
FlightInfo->GetFlightStartLocation() = LocationToStartAircraft;
FlightInfo->GetTimeTillDropStart() = 0.0f;
}
}
static auto MapInfoOffset = GameState->GetOffset("MapInfo");
@@ -601,18 +637,22 @@ static inline void MainUI()
if (MapInfo)
{
static auto FlightInfosOffset = MapInfo->GetOffset("FlightInfos");
auto& FlightInfos = MapInfo->Get<TArray<FAircraftFlightInfo>>(FlightInfosOffset);
static auto FlightInfosOffset = MapInfo->GetOffset("FlightInfos", false);
LOG_INFO(LogDev, "FlightInfos.Num(): {}", FlightInfos.Num());
for (int i = 0; i < FlightInfos.Num(); i++)
if (FlightInfosOffset != -1)
{
auto FlightInfo = FlightInfos.AtPtr(i, FAircraftFlightInfo::GetStructSize());
auto& FlightInfos = MapInfo->Get<TArray<FAircraftFlightInfo>>(FlightInfosOffset);
FlightInfo->GetFlightSpeed() = 0;
FlightInfo->GetFlightStartLocation() = LocationToStartAircraft;
FlightInfo->GetTimeTillDropStart() = 0.0f;
LOG_INFO(LogDev, "FlightInfos.Num(): {}", FlightInfos.Num());
for (int i = 0; i < FlightInfos.Num(); i++)
{
auto FlightInfo = FlightInfos.AtPtr(i, FAircraftFlightInfo::GetStructSize());
FlightInfo->GetFlightSpeed() = 0;
FlightInfo->GetFlightStartLocation() = LocationToStartAircraft;
FlightInfo->GetTimeTillDropStart() = 0.0f;
}
}
}
@@ -845,6 +885,7 @@ static inline void MainUI()
static std::string ClassNameToDump;
static std::string FunctionNameToDump;
ImGui::Checkbox("Fill Vending Machines", &Globals::bFillVendingMachines);
ImGui::InputText("Class Name to mess with", &ClassNameToDump);
ImGui::InputText("Function Name to mess with", &FunctionNameToDump);
@@ -864,7 +905,7 @@ static inline void MainUI()
}
}
if (ImGui::Button("Print Function Exec Addy"))
if (ImGui::Button("Print Function Exec Addr"))
{
auto Function = FindObject<UFunction>(FunctionNameToDump);
@@ -929,9 +970,12 @@ static inline void PregameUI()
ImGui::Checkbox("Creative", &Globals::bCreative);
}
bool bWillBeLategame = Globals::bLateGame.load();
ImGui::Checkbox("Lategame", &bWillBeLategame);
Globals::bLateGame.store(bWillBeLategame);
if (Addresses::SetZoneToIndex)
{
bool bWillBeLategame = Globals::bLateGame.load();
ImGui::Checkbox("Lategame", &bWillBeLategame);
Globals::bLateGame.store(bWillBeLategame);
}
if (HasEvent())
{