zone fixed

This commit is contained in:
Milxnor
2023-03-20 18:33:36 -04:00
parent dccaca63d6
commit 6d14b42a4f
14 changed files with 306 additions and 77 deletions

View File

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

View File

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

View File

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

View File

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

View 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;
}

View File

@@ -5,4 +5,5 @@
class AGameState : public AActor class AGameState : public AActor
{ {
public: public:
float GetServerWorldTimeSeconds(); // should be in AGameStateBase
}; };

View File

@@ -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" />

View File

@@ -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" />

View File

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

View File

@@ -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");
LOG_INFO(LogZone, "SafeZonePhase: {}", SafeZonePhase);
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()));
SafeZoneIndicator->Get<float>(SafeZoneStartShrinkTimeOffset) = UGameplayStatics::GetTimeSeconds(GetWorld()); static auto MapInfoOffset = GameState->GetOffset("MapInfo");
SafeZoneIndicator->Get<float>(SafeZoneFinishShrinkTimeOffset) = SafeZoneIndicator->Get<float>(SafeZoneStartShrinkTimeOffset) + 100; 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, "TimeSeconds: {}", UGameplayStatics::GetTimeSeconds(GetWorld()));
for (int i = 0; i < ZoneDurations.Num(); i++)
{
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;
} }

View File

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

View File

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

View File

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

View File

@@ -304,4 +304,40 @@ 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;
} }