mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 10:52:22 +01:00
zone fixed
This commit is contained in:
@@ -115,39 +115,6 @@ static void StreamLevel(std::string LevelName, FVector Location = {})
|
|||||||
ShowFoundation(BuildingFoundation);
|
ShowFoundation(BuildingFoundation);
|
||||||
}
|
}
|
||||||
|
|
||||||
UObject* GetPlaylistToUse()
|
|
||||||
{
|
|
||||||
auto Playlist = FindObject("/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo");
|
|
||||||
|
|
||||||
if (Globals::bCreative)
|
|
||||||
Playlist = FindObject("/Game/Athena/Playlists/Creative/Playlist_PlaygroundV2.Playlist_PlaygroundV2");
|
|
||||||
|
|
||||||
if (Globals::bGoingToPlayEvent)
|
|
||||||
{
|
|
||||||
if (Fortnite_Version != 12.61)
|
|
||||||
{
|
|
||||||
auto EventPlaylist = GetEventPlaylist();
|
|
||||||
|
|
||||||
if (!EventPlaylist)
|
|
||||||
{
|
|
||||||
LOG_ERROR(LogPlaylist, "No event playlist! Turning off going to play event");
|
|
||||||
Globals::bGoingToPlayEvent = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Playlist = EventPlaylist;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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");
|
|
||||||
|
|
||||||
return Playlist;
|
|
||||||
}
|
|
||||||
|
|
||||||
FName AFortGameModeAthena::RedirectLootTier(const FName& LootTier)
|
FName AFortGameModeAthena::RedirectLootTier(const FName& LootTier)
|
||||||
{
|
{
|
||||||
static auto RedirectAthenaLootTierGroupsOffset = this->GetOffset("RedirectAthenaLootTierGroups", false);
|
static auto RedirectAthenaLootTierGroupsOffset = this->GetOffset("RedirectAthenaLootTierGroups", false);
|
||||||
@@ -609,7 +576,7 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
// GameState->OnRep_CurrentPlaylistInfo();
|
// GameState->OnRep_CurrentPlaylistInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool bSpawnedFloorLoot = false;
|
static bool bSpawnedFloorLoot = true;
|
||||||
|
|
||||||
if (!bSpawnedFloorLoot)
|
if (!bSpawnedFloorLoot)
|
||||||
{
|
{
|
||||||
@@ -683,6 +650,8 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "Spawned loot!");
|
||||||
|
|
||||||
static bool bSpawnedVehicles = Engine_Version < 424; // todo fix
|
static bool bSpawnedVehicles = Engine_Version < 424; // todo fix
|
||||||
|
|
||||||
if (!bSpawnedVehicles)
|
if (!bSpawnedVehicles)
|
||||||
@@ -696,6 +665,9 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
|
|
||||||
auto PlayerStateAthena = NewPlayer->GetPlayerStateAthena();
|
auto PlayerStateAthena = NewPlayer->GetPlayerStateAthena();
|
||||||
|
|
||||||
|
if (!PlayerStateAthena)
|
||||||
|
return Athena_HandleStartingNewPlayerOriginal(GameMode, NewPlayerActor);
|
||||||
|
|
||||||
if (Globals::bNoMCP)
|
if (Globals::bNoMCP)
|
||||||
{
|
{
|
||||||
static auto CharacterPartsOffset = PlayerStateAthena->GetOffset("CharacterParts", false);
|
static auto CharacterPartsOffset = PlayerStateAthena->GetOffset("CharacterParts", false);
|
||||||
@@ -740,11 +712,12 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
PlayerStateAthena->ProcessEvent(OnRep_bHasStartedPlayingFn);
|
PlayerStateAthena->ProcessEvent(OnRep_bHasStartedPlayingFn);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PlayerStateAthena->GetWorldPlayerId() == -1)
|
// LOG_INFO(LogDev, "Old ID: {}", PlayerStateAthena->GetWorldPlayerId());
|
||||||
|
|
||||||
|
// if (PlayerStateAthena->GetWorldPlayerId() == -1)
|
||||||
{
|
{
|
||||||
static int CurrentPlayerId = 1;
|
static int CurrentPlayerId = 1;
|
||||||
// static auto PlayerIdOffset = PlayerStateAthena->GetOffset("PlayerId"); // Unable to find tf
|
// static auto PlayerIdOffset = PlayerStateAthena->GetOffset("PlayerId"); // Unable to find tf
|
||||||
LOG_INFO(LogDev, "Old ID: {}", PlayerStateAthena->GetWorldPlayerId());
|
|
||||||
PlayerStateAthena->GetWorldPlayerId() = ++CurrentPlayerId; // PlayerStateAthena->Get<int>(PlayerIdOffset); //
|
PlayerStateAthena->GetWorldPlayerId() = ++CurrentPlayerId; // PlayerStateAthena->Get<int>(PlayerIdOffset); //
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -291,7 +291,22 @@ AFortPickup* UFortKismetLibrary::K2_SpawnPickupInWorldHook(UObject* Context, FFr
|
|||||||
|
|
||||||
bool UFortKismetLibrary::PickLootDropsHook(UObject* Context, FFrame& Stack, bool* Ret)
|
bool UFortKismetLibrary::PickLootDropsHook(UObject* Context, FFrame& Stack, bool* Ret)
|
||||||
{
|
{
|
||||||
return PickLootDropsOriginal(Context, Stack, Ret);
|
UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
TArray<__int64> OutLootToDrop; // (Parm, OutParm, ZeroConstructor, NativeAccessSpecifierPublic)
|
||||||
|
FName TierGroupName; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
int WorldLevel; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
int ForcedLootTier; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
|
||||||
|
Stack.Step(Stack.Object, &WorldContextObject);
|
||||||
|
Stack.Step(Stack.Object, &OutLootToDrop);
|
||||||
|
Stack.Step(Stack.Object, &TierGroupName);
|
||||||
|
Stack.Step(Stack.Object, &WorldLevel);
|
||||||
|
Stack.Step(Stack.Object, &ForcedLootTier);
|
||||||
|
|
||||||
|
PickLootDropsOriginal(Context, Stack, Ret);
|
||||||
|
|
||||||
|
*Ret = true;
|
||||||
|
return *Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
UClass* UFortKismetLibrary::StaticClass()
|
UClass* UFortKismetLibrary::StaticClass()
|
||||||
|
|||||||
@@ -249,10 +249,10 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
|
|||||||
|
|
||||||
if (bPrint)
|
if (bPrint)
|
||||||
{
|
{
|
||||||
std::cout << "NumLootPackageDrops Floored: " << NumLootPackageDrops << '\n';
|
LOG_INFO(LogLoot, "NumLootPackageDrops Floored: {}", NumLootPackageDrops);
|
||||||
std::cout << "NumLootPackageDrops Original: " << ChosenRowLootTierData->GetNumLootPackageDrops() << '\n';
|
LOG_INFO(LogLoot, "NumLootPackageDrops Original: {}", ChosenRowLootTierData->GetNumLootPackageDrops());
|
||||||
std::cout << "TierGroupLPs.size(): " << TierGroupLPs.size() << '\n';
|
LOG_INFO(LogLoot, "TierGroupLPs.size(): {}", TierGroupLPs.size());
|
||||||
std::cout << "ChosenLootPackageName: " << ChosenLootPackageName << '\n';
|
LOG_INFO(LogLoot, "ChosenLootPackageName: {}", ChosenLootPackageName);
|
||||||
|
|
||||||
/* float t = ChosenRowLootTierData->NumLootPackageDrops;
|
/* float t = ChosenRowLootTierData->NumLootPackageDrops;
|
||||||
|
|
||||||
@@ -268,14 +268,34 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
|
|||||||
|
|
||||||
for (float i = 0; i < NumLootPackageDrops; i++)
|
for (float i = 0; i < NumLootPackageDrops; i++)
|
||||||
{
|
{
|
||||||
|
FFortLootPackageData* TierGroupLP = nullptr;
|
||||||
|
|
||||||
if (i >= TierGroupLPs.size())
|
if (i >= TierGroupLPs.size())
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
|
/* auto randomNumberFloat = UKismetMathLibrary::RandomFloatInRange(0, TierGroupLPs.size());
|
||||||
|
auto randomNumberFloored = std::floor((int)randomNumberFloat); // idk
|
||||||
|
|
||||||
|
if (bPrint)
|
||||||
|
LOG_INFO(LogLoot, "randomNumberFloat: {} randomNumberFloored: {}", randomNumberFloat, randomNumberFloored);
|
||||||
|
|
||||||
|
TierGroupLP = TierGroupLPs.at(randomNumberFloored); */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TierGroupLP = TierGroupLPs.at(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TierGroupLP)
|
||||||
|
continue;
|
||||||
|
|
||||||
auto TierGroupLP = TierGroupLPs.at(i);
|
|
||||||
auto& LootPackageCallFStr = TierGroupLP->GetLootPackageCall();
|
auto& LootPackageCallFStr = TierGroupLP->GetLootPackageCall();
|
||||||
auto TierGroupLPStr = LootPackageCallFStr.IsValid() ? LootPackageCallFStr.ToString() : ".Empty";
|
auto TierGroupLPStr = LootPackageCallFStr.IsValid() ? LootPackageCallFStr.ToString() : "InvalidLootPackageCall.Empty";
|
||||||
|
|
||||||
if (TierGroupLPStr.contains(".Empty"))
|
if (bPrint)
|
||||||
|
LOG_INFO(LogLoot, "TierGroupLPStr: {}", TierGroupLPStr);
|
||||||
|
|
||||||
|
if (!bIsWorldList && TierGroupLPStr.contains(".Empty"))
|
||||||
{
|
{
|
||||||
NumLootPackageDrops++;
|
NumLootPackageDrops++;
|
||||||
continue;
|
continue;
|
||||||
@@ -297,7 +317,7 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
|
|||||||
{
|
{
|
||||||
for (int p = 0; p < LPTables.size(); p++)
|
for (int p = 0; p < LPTables.size(); p++)
|
||||||
{
|
{
|
||||||
auto LPRowMap = LPTables[p]->GetRowMap();
|
auto& LPRowMap = LPTables[p]->GetRowMap();
|
||||||
|
|
||||||
for (int j = 0; j < LPRowMap.Pairs.Elements.Num(); j++)
|
for (int j = 0; j < LPRowMap.Pairs.Elements.Num(); j++)
|
||||||
{
|
{
|
||||||
@@ -313,29 +333,36 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bPrint)
|
||||||
|
LOG_INFO(LogLoot, "lootPackageCalls.size(): {}", lootPackageCalls.size());
|
||||||
|
|
||||||
if (lootPackageCalls.size() == 0)
|
if (lootPackageCalls.size() == 0)
|
||||||
{
|
{
|
||||||
// std::cout << "lootPackageCalls.size() == 0!\n";
|
// std::cout << "lootPackageCalls.size() == 0!\n";
|
||||||
NumLootPackageDrops++; // ??
|
NumLootPackageDrops++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
FFortLootPackageData* LootPackageCall = GetLootPackage(lootPackageCalls);
|
FFortLootPackageData* LootPackageCall = GetLootPackage(lootPackageCalls);
|
||||||
|
|
||||||
if (!LootPackageCall) // Should NEVER happen
|
if (!LootPackageCall) // Should NEVER happen
|
||||||
|
{
|
||||||
|
LOG_ERROR(LogLoot, "Failed to get any loot package call??");
|
||||||
|
NumLootPackageDrops++;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
auto ItemDef = LootPackageCall->GetItemDefinition().Get();
|
auto ItemDef = LootPackageCall->GetItemDefinition().Get();
|
||||||
|
|
||||||
if (!ItemDef)
|
if (!ItemDef)
|
||||||
{
|
{
|
||||||
NumLootPackageDrops++; // ??
|
NumLootPackageDrops++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bPrint)
|
if (bPrint)
|
||||||
{
|
{
|
||||||
std::cout << std::format("[{}] {} {} {}\n", i, lootPackageCalls.size(), TierGroupLPStr, ItemDef->GetName());
|
LOG_INFO(LogLoot, "[{}] {} {} {}", i, lootPackageCalls.size(), TierGroupLPStr, ItemDef->GetName());
|
||||||
}
|
}
|
||||||
|
|
||||||
auto WeaponDef = Cast<UFortWeaponItemDefinition>(ItemDef);
|
auto WeaponDef = Cast<UFortWeaponItemDefinition>(ItemDef);
|
||||||
|
|||||||
@@ -130,7 +130,9 @@ void AFortPlayerController::ServerAttemptInteractHook(UObject* Context, FFrame*
|
|||||||
static auto SearchLootTierGroupOffset = BuildingContainer->GetOffset("SearchLootTierGroup");
|
static auto SearchLootTierGroupOffset = BuildingContainer->GetOffset("SearchLootTierGroup");
|
||||||
auto RedirectedLootTier = Cast<AFortGameModeAthena>(GetWorld()->GetGameMode(), false)->RedirectLootTier(BuildingContainer->Get<FName>(SearchLootTierGroupOffset));
|
auto RedirectedLootTier = Cast<AFortGameModeAthena>(GetWorld()->GetGameMode(), false)->RedirectLootTier(BuildingContainer->Get<FName>(SearchLootTierGroupOffset));
|
||||||
|
|
||||||
auto LootDrops = PickLootDrops(RedirectedLootTier);
|
LOG_INFO(LogInteraction, "RedirectedLootTier: {}", RedirectedLootTier.ToString());
|
||||||
|
|
||||||
|
auto LootDrops = PickLootDrops(RedirectedLootTier, true);
|
||||||
|
|
||||||
LOG_INFO(LogInteraction, "LootDrops.size(): {}", LootDrops.size());
|
LOG_INFO(LogInteraction, "LootDrops.size(): {}", LootDrops.size());
|
||||||
|
|
||||||
@@ -521,7 +523,8 @@ void AFortPlayerController::ClientOnPawnDiedHook(AFortPlayerController* PlayerCo
|
|||||||
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);
|
||||||
|
|
||||||
auto& Tags = DeadPawn->Get<FGameplayTagContainer>(MemberOffsets::FortPlayerPawn::CorrectTags); // *(FGameplayTagContainer*)(__int64(DeathReport) + /MemberOffsets::DeathReport::Tags);
|
auto& Tags = DeadPawn->Get<FGameplayTagContainer>(MemberOffsets::FortPlayerPawn::CorrectTags);
|
||||||
|
// *(FGameplayTagContainer*)(__int64(DeathReport) + MemberOffsets::DeathReport::Tags);
|
||||||
|
|
||||||
// LOG_INFO(LogDev, "Tags: {}", Tags.ToStringSimple(true));
|
// LOG_INFO(LogDev, "Tags: {}", Tags.ToStringSimple(true));
|
||||||
|
|
||||||
|
|||||||
17
Project Reboot 3.0/GameState.cpp
Normal file
17
Project Reboot 3.0/GameState.cpp
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#include "GameState.h"
|
||||||
|
|
||||||
|
#include "GameplayStatics.h"
|
||||||
|
|
||||||
|
#include "reboot.h"
|
||||||
|
|
||||||
|
float AGameState::GetServerWorldTimeSeconds()
|
||||||
|
{
|
||||||
|
UWorld* World = GetWorld();
|
||||||
|
if (World)
|
||||||
|
{
|
||||||
|
static auto ServerWorldTimeSecondsDeltaOffset = this->GetOffset("ServerWorldTimeSecondsDelta");
|
||||||
|
return UGameplayStatics::GetTimeSeconds(World) + Get<float>(ServerWorldTimeSecondsDeltaOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0.f;
|
||||||
|
}
|
||||||
@@ -5,4 +5,5 @@
|
|||||||
class AGameState : public AActor
|
class AGameState : public AActor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
float GetServerWorldTimeSeconds(); // should be in AGameStateBase
|
||||||
};
|
};
|
||||||
@@ -200,6 +200,7 @@
|
|||||||
<ClCompile Include="FortWeaponItemDefinition.cpp" />
|
<ClCompile Include="FortWeaponItemDefinition.cpp" />
|
||||||
<ClCompile Include="GameModeBase.cpp" />
|
<ClCompile Include="GameModeBase.cpp" />
|
||||||
<ClCompile Include="GameplayStatics.cpp" />
|
<ClCompile Include="GameplayStatics.cpp" />
|
||||||
|
<ClCompile Include="GameState.cpp" />
|
||||||
<ClCompile Include="KismetMathLibrary.cpp" />
|
<ClCompile Include="KismetMathLibrary.cpp" />
|
||||||
<ClCompile Include="KismetStringLibrary.cpp" />
|
<ClCompile Include="KismetStringLibrary.cpp" />
|
||||||
<ClCompile Include="LevelActor.cpp" />
|
<ClCompile Include="LevelActor.cpp" />
|
||||||
|
|||||||
@@ -140,6 +140,9 @@
|
|||||||
<ClCompile Include="FortMinigame.cpp">
|
<ClCompile Include="FortMinigame.cpp">
|
||||||
<Filter>FortniteGame\Source\FortniteGame\Private\Creative\Minigame</Filter>
|
<Filter>FortniteGame\Source\FortniteGame\Private\Creative\Minigame</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="GameState.cpp">
|
||||||
|
<Filter>Engine\Source\Runtime\Engine\Private</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="log.h" />
|
<ClInclude Include="log.h" />
|
||||||
|
|||||||
@@ -183,6 +183,69 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg)
|
|||||||
WorldInventory->Update();
|
WorldInventory->Update();
|
||||||
|
|
||||||
SendMessageToConsole(PlayerController, L"Granted item!");
|
SendMessageToConsole(PlayerController, L"Granted item!");
|
||||||
|
}
|
||||||
|
else if (Command == "summon")
|
||||||
|
{
|
||||||
|
if (Arguments.size() <= 1)
|
||||||
|
{
|
||||||
|
SendMessageToConsole(PlayerController, L"Please provide a class!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& ClassName = Arguments[1];
|
||||||
|
|
||||||
|
if (ClassName.contains("/Script/"))
|
||||||
|
{
|
||||||
|
SendMessageToConsole(PlayerController, L"For now, we don't allow non-blueprint classes.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto Pawn = ReceivingController->GetMyFortPawn();
|
||||||
|
|
||||||
|
if (!Pawn)
|
||||||
|
{
|
||||||
|
SendMessageToConsole(PlayerController, L"No pawn to spawn class at!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Count = 1;
|
||||||
|
|
||||||
|
if (Arguments.size() >= 3)
|
||||||
|
{
|
||||||
|
try { Count = std::stod(Arguments[2]); }
|
||||||
|
catch (...) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr int Max = 100;
|
||||||
|
|
||||||
|
if (Count > Max)
|
||||||
|
{
|
||||||
|
SendMessageToConsole(PlayerController, (std::wstring(L"You went over the limit! Only spawning ") + std::to_wstring(Max) + L".").c_str());
|
||||||
|
Count = Max;
|
||||||
|
}
|
||||||
|
|
||||||
|
static auto BGAClass = FindObject<UClass>("/Script/Engine.BlueprintGeneratedClass");
|
||||||
|
auto ClassObj = LoadObject<UClass>(ClassName, BGAClass);
|
||||||
|
|
||||||
|
if (ClassObj)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
auto Loc = Pawn->GetActorLocation();
|
||||||
|
// Loc.Z += 1000;
|
||||||
|
GetWorld()->SpawnActor<AActor>(ClassObj, Loc, FQuat());
|
||||||
|
}
|
||||||
|
|
||||||
|
SendMessageToConsole(PlayerController, L"Summoned!");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SendMessageToConsole(PlayerController, L"Not a valid class!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Command == "spawnaidata")
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (Command == "testspawn")
|
else if (Command == "testspawn")
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,11 +3,19 @@
|
|||||||
#include "reboot.h"
|
#include "reboot.h"
|
||||||
#include "FortGameModeAthena.h"
|
#include "FortGameModeAthena.h"
|
||||||
#include "GameplayStatics.h"
|
#include "GameplayStatics.h"
|
||||||
|
#include "CurveTable.h"
|
||||||
|
#include "KismetStringLibrary.h"s
|
||||||
|
#include "DataTableFunctionLibrary.h"
|
||||||
|
|
||||||
static inline void (*SetZoneToIndexOriginal)(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK);
|
static inline void (*SetZoneToIndexOriginal)(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK);
|
||||||
|
|
||||||
static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK)
|
static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK)
|
||||||
{
|
{
|
||||||
|
auto GameState = Cast<AFortGameStateAthena>(GameModeAthena->GetGameState());
|
||||||
|
|
||||||
|
if (!GameState)
|
||||||
|
return;
|
||||||
|
|
||||||
static auto SafeZoneIndicatorOffset = GameModeAthena->GetOffset("SafeZoneIndicator");
|
static auto SafeZoneIndicatorOffset = GameModeAthena->GetOffset("SafeZoneIndicator");
|
||||||
auto SafeZoneIndicator = GameModeAthena->Get<AActor*>(SafeZoneIndicatorOffset);
|
auto SafeZoneIndicator = GameModeAthena->Get<AActor*>(SafeZoneIndicatorOffset);
|
||||||
|
|
||||||
@@ -15,24 +23,100 @@ static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int Override
|
|||||||
static auto SafeZoneStartShrinkTimeOffset = SafeZoneIndicator->GetOffset("SafeZoneStartShrinkTime");
|
static auto SafeZoneStartShrinkTimeOffset = SafeZoneIndicator->GetOffset("SafeZoneStartShrinkTime");
|
||||||
|
|
||||||
static auto SafeZonePhaseOffset = GameModeAthena->GetOffset("SafeZonePhase");
|
static auto SafeZonePhaseOffset = GameModeAthena->GetOffset("SafeZonePhase");
|
||||||
auto SafeZonePhase = GameModeAthena->Get<int>(SafeZonePhaseOffset);
|
|
||||||
|
|
||||||
LOG_INFO(LogDev, "aa");
|
static auto MapInfoOffset = GameState->GetOffset("MapInfo");
|
||||||
LOG_INFO(LogZone, "SafeZonePhase: {}", SafeZonePhase);
|
auto MapInfo = GameState->Get<AActor*>(MapInfoOffset);
|
||||||
|
|
||||||
|
static auto SafeZoneDefinitionOffset = MapInfo->GetOffset("SafeZoneDefinition");
|
||||||
|
auto SafeZoneDefinition = MapInfo->GetPtr<__int64>(SafeZoneDefinitionOffset);
|
||||||
|
|
||||||
|
static auto ZoneDurationsOffset = 0x1F8;
|
||||||
|
static auto ZoneHoldDurationsOffset = ZoneDurationsOffset - 0x10;
|
||||||
|
|
||||||
|
auto& ZoneDurations = *(TArray<float>*)(__int64(SafeZoneDefinition) + ZoneDurationsOffset);
|
||||||
|
auto& ZoneHoldDurations = *(TArray<float>*)(__int64(SafeZoneDefinition) + ZoneHoldDurationsOffset);
|
||||||
|
|
||||||
|
static bool bFilledDurations = false;
|
||||||
|
|
||||||
|
if (!bFilledDurations)
|
||||||
|
{
|
||||||
|
bFilledDurations = true;
|
||||||
|
|
||||||
|
auto CurrentPlaylist = GetPlaylistToUse();
|
||||||
|
UCurveTable* FortGameData = nullptr;
|
||||||
|
|
||||||
|
static auto GameDataOffset = CurrentPlaylist->GetOffset("GameData");
|
||||||
|
FortGameData = CurrentPlaylist ? CurrentPlaylist->Get<TSoftObjectPtr<UCurveTable>>(GameDataOffset).Get() : nullptr;
|
||||||
|
|
||||||
|
if (!FortGameData)
|
||||||
|
FortGameData = FindObject<UCurveTable>("/Game/Balance/AthenaGameData.AthenaGameData");
|
||||||
|
|
||||||
|
auto ShrinkTimeFName = UKismetStringLibrary::Conv_StringToName(L"Default.SafeZone.ShrinkTime");
|
||||||
|
FString ContextString;
|
||||||
|
|
||||||
|
/* for (float i = 0; i < 1.1; i += 0.1)
|
||||||
|
{
|
||||||
|
float res;
|
||||||
|
UDataTableFunctionLibrary::EvaluateCurveTableRow(FortGameData, ShrinkTimeFName, i, ContextString, nullptr, &res);
|
||||||
|
LOG_INFO(LogZone, "[{}] {}", i, res);
|
||||||
|
} */
|
||||||
|
|
||||||
|
if (ZoneDurations.ArrayNum >= 1) ZoneDurations.at(0) = 0;
|
||||||
|
if (ZoneDurations.ArrayNum >= 2) ZoneDurations.at(1) = 180;
|
||||||
|
if (ZoneDurations.ArrayNum >= 3) ZoneDurations.at(2) = 120;
|
||||||
|
if (ZoneDurations.ArrayNum >= 4) ZoneDurations.at(3) = 90;
|
||||||
|
if (ZoneDurations.ArrayNum >= 5) ZoneDurations.at(4) = 70;
|
||||||
|
if (ZoneDurations.ArrayNum >= 6) ZoneDurations.at(5) = 60;
|
||||||
|
if (ZoneDurations.ArrayNum >= 7) ZoneDurations.at(6) = 60;
|
||||||
|
if (ZoneDurations.ArrayNum >= 8) ZoneDurations.at(7) = 55;
|
||||||
|
if (ZoneDurations.ArrayNum >= 9) ZoneDurations.at(8) = 45;
|
||||||
|
if (ZoneDurations.ArrayNum >= 10) ZoneDurations.at(9) = 75;
|
||||||
|
if (ZoneDurations.ArrayNum >= 11) ZoneDurations.at(10) = 0;
|
||||||
|
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 1) ZoneHoldDurations.at(0) = 0;
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 2) ZoneHoldDurations.at(1) = 170;
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 3) ZoneHoldDurations.at(2) = 120;
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 4) ZoneHoldDurations.at(3) = 90;
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 5) ZoneHoldDurations.at(4) = 80;
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 6) ZoneHoldDurations.at(5) = 50;
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 7) ZoneHoldDurations.at(6) = 30;
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 8) ZoneHoldDurations.at(7) = 0;
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 9) ZoneHoldDurations.at(8) = 0;
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 10) ZoneHoldDurations.at(9) = 0;
|
||||||
|
if (ZoneHoldDurations.ArrayNum >= 11) ZoneHoldDurations.at(10) = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_INFO(LogZone, "SafeZonePhase: {}", GameModeAthena->Get<int>(SafeZonePhaseOffset));
|
||||||
LOG_INFO(LogZone, "OverridePhaseMaybeIDFK: {}", OverridePhaseMaybeIDFK);
|
LOG_INFO(LogZone, "OverridePhaseMaybeIDFK: {}", OverridePhaseMaybeIDFK);
|
||||||
LOG_INFO(LogZone, "SafeZoneFinishShrinkTime Before Call: {}", SafeZoneIndicator->Get<float>(SafeZoneFinishShrinkTimeOffset));
|
|
||||||
LOG_INFO(LogZone, "SafeZoneStartShrinkTime Before Call: {}", SafeZoneIndicator->Get<float>(SafeZoneStartShrinkTimeOffset));
|
|
||||||
LOG_INFO(LogZone, "TimeSeconds: {}", UGameplayStatics::GetTimeSeconds(GetWorld()));
|
LOG_INFO(LogZone, "TimeSeconds: {}", UGameplayStatics::GetTimeSeconds(GetWorld()));
|
||||||
|
|
||||||
SafeZoneIndicator->Get<float>(SafeZoneStartShrinkTimeOffset) = UGameplayStatics::GetTimeSeconds(GetWorld());
|
for (int i = 0; i < ZoneDurations.Num(); i++)
|
||||||
SafeZoneIndicator->Get<float>(SafeZoneFinishShrinkTimeOffset) = SafeZoneIndicator->Get<float>(SafeZoneStartShrinkTimeOffset) + 100;
|
{
|
||||||
|
LOG_INFO(LogZone, "Move [{}] {}", i, ZoneDurations.at(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < ZoneHoldDurations.Num(); i++)
|
||||||
|
{
|
||||||
|
LOG_INFO(LogZone, "Hold [{}] {}", i, ZoneHoldDurations.at(i));
|
||||||
|
}
|
||||||
|
|
||||||
SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK);
|
SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK);
|
||||||
|
|
||||||
static auto NextMegaStormGridCellThicknessOffset = SafeZoneIndicator->GetOffset("NextMegaStormGridCellThickness");
|
LOG_INFO(LogZone, "SafeZonePhase After: {}", GameModeAthena->Get<int>(SafeZonePhaseOffset));
|
||||||
auto NextMegaStormGridCellThickness = SafeZoneIndicator->Get<float>(NextMegaStormGridCellThicknessOffset);
|
|
||||||
|
|
||||||
LOG_INFO(LogZone, "NextMegaStormGridCellThickness: {}", NextMegaStormGridCellThickness);
|
float ZoneHoldDuration = 0;
|
||||||
LOG_INFO(LogZone, "SafeZoneFinishShrinkTime After Call: {}", SafeZoneIndicator->Get<float>(SafeZoneFinishShrinkTimeOffset));
|
|
||||||
LOG_INFO(LogZone, "SafeZoneStartShrinkTime After Call: {}", SafeZoneIndicator->Get<float>(SafeZoneStartShrinkTimeOffset));
|
if (GameModeAthena->Get<int>(SafeZonePhaseOffset) >= 0 && GameModeAthena->Get<int>(SafeZonePhaseOffset) < ZoneHoldDurations.Num())
|
||||||
|
ZoneHoldDuration = ZoneHoldDurations.at(GameModeAthena->Get<int>(SafeZonePhaseOffset));
|
||||||
|
|
||||||
|
SafeZoneIndicator->Get<float>(SafeZoneStartShrinkTimeOffset) = GameState->GetServerWorldTimeSeconds() + ZoneHoldDuration;
|
||||||
|
|
||||||
|
float ZoneDuration = 0;
|
||||||
|
|
||||||
|
if (GameModeAthena->Get<int>(SafeZonePhaseOffset) >= 0 && GameModeAthena->Get<int>(SafeZonePhaseOffset) < ZoneDurations.Num())
|
||||||
|
ZoneDuration = ZoneDurations.at(GameModeAthena->Get<int>(SafeZonePhaseOffset));
|
||||||
|
|
||||||
|
LOG_INFO(LogZone, "ZoneDuration: {}", ZoneDuration);
|
||||||
|
|
||||||
|
SafeZoneIndicator->Get<float>(SafeZoneFinishShrinkTimeOffset) = SafeZoneIndicator->Get<float>(SafeZoneStartShrinkTimeOffset) + ZoneDuration;
|
||||||
}
|
}
|
||||||
@@ -300,7 +300,7 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
Hooking::MinHook::Hook((PVOID)Addresses::CompletePickupAnimation, (PVOID)AFortPickup::CompletePickupAnimationHook, (PVOID*)&AFortPickup::CompletePickupAnimationOriginal);
|
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)Addresses::CanActivateAbility, ReturnTrueHook); // ahhh wtf
|
||||||
// Hooking::MinHook::Hook((PVOID)FindFunctionCall(L"ServerRemoveInventoryItem"), UFortInventoryInterface::RemoveInventoryItemHook);
|
// Hooking::MinHook::Hook((PVOID)FindFunctionCall(L"ServerRemoveInventoryItem"), UFortInventoryInterface::RemoveInventoryItemHook);
|
||||||
// LOG_INFO(LogDev, "Hook Res: {}", Hooking::MinHook::Hook((PVOID)Addresses::SetZoneToIndex, (PVOID)SetZoneToIndexHook, (PVOID*)&SetZoneToIndexOriginal));
|
Hooking::MinHook::Hook((PVOID)Addresses::SetZoneToIndex, (PVOID)SetZoneToIndexHook, (PVOID*)&SetZoneToIndexOriginal);
|
||||||
|
|
||||||
AddVehicleHook();
|
AddVehicleHook();
|
||||||
|
|
||||||
@@ -308,7 +308,8 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
Hooking::MinHook::Hook((PVOID)FindFunctionCall(L"ClientOnPawnDied"), AFortPlayerController::ClientOnPawnDiedHook, (PVOID*)&AFortPlayerController::ClientOnPawnDiedOriginal);
|
Hooking::MinHook::Hook((PVOID)FindFunctionCall(L"ClientOnPawnDied"), AFortPlayerController::ClientOnPawnDiedHook, (PVOID*)&AFortPlayerController::ClientOnPawnDiedOriginal);
|
||||||
|
|
||||||
{
|
{
|
||||||
MemberOffsets::FortPlayerPawn::CorrectTags = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawn", "MoveSoundStimulusBroadcastInterval") + 0x10;
|
int increaseOffset = 0x18; // 0x10;
|
||||||
|
MemberOffsets::FortPlayerPawn::CorrectTags = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawn", "MoveSoundStimulusBroadcastInterval") + increaseOffset;
|
||||||
MemberOffsets::FortPlayerState::PawnDeathLocation = FindOffsetStruct("/Script/FortniteGame.FortPlayerState", "PawnDeathLocation");
|
MemberOffsets::FortPlayerState::PawnDeathLocation = FindOffsetStruct("/Script/FortniteGame.FortPlayerState", "PawnDeathLocation");
|
||||||
|
|
||||||
MemberOffsets::FortPlayerPawnAthena::LastFallDistance = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawnAthena", "LastFallDistance");
|
MemberOffsets::FortPlayerPawnAthena::LastFallDistance = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawnAthena", "LastFallDistance");
|
||||||
|
|||||||
@@ -190,6 +190,8 @@ static inline uint64 FindPauseBeaconRequests()
|
|||||||
|
|
||||||
static inline uint64 FindGetPlayerViewpoint()
|
static inline uint64 FindGetPlayerViewpoint()
|
||||||
{
|
{
|
||||||
|
return Memcury::Scanner::FindPattern("40 55 53 57 41 56 41 57 48 8B EC 48 83 EC 40 48 8B 81 ? ? ? ? 4D").Get();
|
||||||
|
|
||||||
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", true);
|
||||||
// return FindBytes(Addr, { 0x48, 0x89 /*, 0x5C */}, 2000, 0, true, 1);
|
// return FindBytes(Addr, { 0x48, 0x89 /*, 0x5C */}, 2000, 0, true, 1);
|
||||||
return FindBytes(Addr, { 0x48, 0x89, 0x74 }, 2000, 0, true);
|
return FindBytes(Addr, { 0x48, 0x89, 0x74 }, 2000, 0, true);
|
||||||
@@ -322,6 +324,13 @@ static inline uint64 FindCompletePickupAnimation()
|
|||||||
|
|
||||||
static inline uint64 FindNoMCP()
|
static inline uint64 FindNoMCP()
|
||||||
{
|
{
|
||||||
|
if (Fortnite_Version >= 17) // idk if needed
|
||||||
|
{
|
||||||
|
// todo make this relative
|
||||||
|
// 19.10
|
||||||
|
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC 20 65 48 8B 04 25 ? ? ? ? BA ? ? ? ? 48 8B 08 8B 04 0A 39 05 ? ? ? ? 7F 23 8A 05 ? ? ? ? 48 8B 5C 24 ? 48 8B 6C 24 ? 48 8B 74 24 ? 48 83 C4 20 41 5F 41 5E 41 5D 41 5C 5F C3 48 8D 0D ? ? ? ? E8 ? ? ? ? 83 3D ? ? ? ? ? 75 C8 E8 ? ? ? ? 45 33").Get();
|
||||||
|
}
|
||||||
|
|
||||||
if (std::floor(Fortnite_Version) == 3)
|
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 ?").Get();
|
||||||
|
|
||||||
@@ -337,13 +346,6 @@ static inline uint64 FindNoMCP()
|
|||||||
auto noMcpIthink = GetFunctionIdxOrPtr(fn);
|
auto noMcpIthink = GetFunctionIdxOrPtr(fn);
|
||||||
return noMcpIthink;
|
return noMcpIthink;
|
||||||
|
|
||||||
if (Fortnite_Version >= 17)
|
|
||||||
{
|
|
||||||
// todo make this relative
|
|
||||||
// 19.10
|
|
||||||
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC 20 65 48 8B 04 25 ? ? ? ? BA ? ? ? ? 48 8B 08 8B 04 0A 39 05 ? ? ? ? 7F 23 8A 05 ? ? ? ? 48 8B 5C 24 ? 48 8B 6C 24 ? 48 8B 74 24 ? 48 83 C4 20 41 5F 41 5E 41 5D 41 5C 5F C3 48 8D 0D ? ? ? ? E8 ? ? ? ? 83 3D ? ? ? ? ? 75 C8 E8 ? ? ? ? 45 33").Get();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Engine_Version == 421 || Engine_Version == 422)
|
if (Engine_Version == 421 || Engine_Version == 422)
|
||||||
return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 CE").RelativeOffset(1).Get();
|
return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 CE").RelativeOffset(1).Get();
|
||||||
|
|
||||||
@@ -364,13 +366,16 @@ static inline uint64 FindNoMCP()
|
|||||||
// return (uintptr_t)GetModuleHandleW(0) + 0x161d600; // 10.40
|
// return (uintptr_t)GetModuleHandleW(0) + 0x161d600; // 10.40
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint64 FindSetZoneToIndex()
|
static inline uint64 FindSetZoneToIndex() // actually StartNewSafeZonePhase
|
||||||
{
|
{
|
||||||
return 0;
|
// return 0;
|
||||||
|
|
||||||
// if (Fortnite_Version == 14.60)
|
// if (Fortnite_Version == 14.60)
|
||||||
// return __int64(GetModuleHandleW(0)) + 0x207F9B0;
|
// return __int64(GetModuleHandleW(0)) + 0x207F9B0;
|
||||||
|
|
||||||
|
return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D 68 98 48 81 EC ? ? ? ? 0F 29 70 C8 0F 29 78 B8 44 0F 29 40 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 08 44 8B F2 89 54 24 48 48 8B F1 48 89 4C 24 ? E8 ? ? ? ? 45 33 E4 48 89 44 24 ? 4C 8B F8 48 85 C0 74 09").Get();
|
||||||
|
return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D 68 88 48 81 EC ? ? ? ? 0F 29 70 C8 0F 29 78 B8 44 0F 29 40 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 10 44 8B F2 89 54 24 48 48 8B F1 48 89 4C 24 ? E8 ? ? ? ? 45 33 E4 48 89 45 80 4C 8B F8 48 85 C0 74 09 48 8B B8").Get();
|
||||||
|
return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 C8 0F 29 78 B8 44 0F 29 40 ? 44 0F 29 48 ? 44 0F 29 50 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B B1 ? ? ? ? 45 33 ED 89 54 24 70 44 8B FA 48 89 4C 24").Get();
|
||||||
return Memcury::Scanner::FindPattern("40 55 53 56 41 55 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 18 48 8B").Get();
|
return Memcury::Scanner::FindPattern("40 55 53 56 41 55 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 18 48 8B").Get();
|
||||||
|
|
||||||
auto Addr = Memcury::Scanner::FindStringRef(L"FortGameModeAthena: No MegaStorm on SafeZone[%d]. GridCellThickness is less than 1.0.");
|
auto Addr = Memcury::Scanner::FindStringRef(L"FortGameModeAthena: No MegaStorm on SafeZone[%d]. GridCellThickness is less than 1.0.");
|
||||||
|
|||||||
@@ -6,5 +6,5 @@ namespace Globals
|
|||||||
extern inline bool bGoingToPlayEvent = false;
|
extern inline bool bGoingToPlayEvent = false;
|
||||||
extern inline bool bNoMCP = true;
|
extern inline bool bNoMCP = true;
|
||||||
extern inline bool bLateGame = false;
|
extern inline bool bLateGame = false;
|
||||||
extern inline bool bAbilitiesEnabled = true;
|
extern inline bool bAbilitiesEnabled = false;
|
||||||
}
|
}
|
||||||
@@ -305,3 +305,39 @@ namespace MemberOffsets
|
|||||||
extern inline int bDBNO = 0, Downer = 0, FinisherOrDowner = 0, DeathCause = 0, Distance = 0, DeathLocation = 0, bInitialized = 0, DeathTags = 0;
|
extern inline int bDBNO = 0, Downer = 0, FinisherOrDowner = 0, DeathCause = 0, Distance = 0, DeathLocation = 0, bInitialized = 0, DeathTags = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UObject* GetPlaylistToUse()
|
||||||
|
{
|
||||||
|
auto Playlist = FindObject("/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo");
|
||||||
|
Playlist = FindObject("/BlueCheese/Playlists/Playlist_ShowdownAlt_BlueCheese_Trios.Playlist_ShowdownAlt_BlueCheese_Trios");
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (Globals::bCreative)
|
||||||
|
Playlist = FindObject("/Game/Athena/Playlists/Creative/Playlist_PlaygroundV2.Playlist_PlaygroundV2");
|
||||||
|
|
||||||
|
if (Globals::bGoingToPlayEvent)
|
||||||
|
{
|
||||||
|
if (Fortnite_Version != 12.61)
|
||||||
|
{
|
||||||
|
auto EventPlaylist = GetEventPlaylist();
|
||||||
|
|
||||||
|
if (!EventPlaylist)
|
||||||
|
{
|
||||||
|
LOG_ERROR(LogPlaylist, "No event playlist! Turning off going to play event");
|
||||||
|
Globals::bGoingToPlayEvent = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Playlist = EventPlaylist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 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");
|
||||||
|
|
||||||
|
return Playlist;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user