mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 02:42:22 +01:00
lategame
lategame pretty much working, work on some string stuff, some memory optimizations, summon should now work with non-bps
This commit is contained in:
@@ -68,6 +68,8 @@ void UAbilitySystemComponent::ServerEndAbility(FGameplayAbilitySpecHandle Abilit
|
|||||||
CopyStruct((FPredictionKey*)(__int64(Params) + PredictionKeyOffset), PredictionKey, FPredictionKey::GetStructSize());
|
CopyStruct((FPredictionKey*)(__int64(Params) + PredictionKeyOffset), PredictionKey, FPredictionKey::GetStructSize());
|
||||||
|
|
||||||
this->ProcessEvent(ServerEndAbilityFn, Params);
|
this->ProcessEvent(ServerEndAbilityFn, Params);
|
||||||
|
|
||||||
|
VirtualFree(Params, 0, MEM_RELEASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UAbilitySystemComponent::ClientEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo)
|
void UAbilitySystemComponent::ClientEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo)
|
||||||
@@ -83,6 +85,8 @@ void UAbilitySystemComponent::ClientEndAbility(FGameplayAbilitySpecHandle Abilit
|
|||||||
CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize());
|
CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize());
|
||||||
|
|
||||||
this->ProcessEvent(ClientEndAbilityFn, Params);
|
this->ProcessEvent(ClientEndAbilityFn, Params);
|
||||||
|
|
||||||
|
VirtualFree(Params, 0, MEM_RELEASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UAbilitySystemComponent::ClientCancelAbility(FGameplayAbilitySpecHandle AbilityToCancel, FGameplayAbilityActivationInfo* ActivationInfo)
|
void UAbilitySystemComponent::ClientCancelAbility(FGameplayAbilitySpecHandle AbilityToCancel, FGameplayAbilityActivationInfo* ActivationInfo)
|
||||||
@@ -98,6 +102,8 @@ void UAbilitySystemComponent::ClientCancelAbility(FGameplayAbilitySpecHandle Abi
|
|||||||
CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize());
|
CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize());
|
||||||
|
|
||||||
this->ProcessEvent(ClientCancelAbilityFn, Params);
|
this->ProcessEvent(ClientCancelAbilityFn, Params);
|
||||||
|
|
||||||
|
VirtualFree(Params, 0, MEM_RELEASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UAbilitySystemComponent::HasAbility(UObject* DefaultAbility)
|
bool UAbilitySystemComponent::HasAbility(UObject* DefaultAbility)
|
||||||
|
|||||||
@@ -326,16 +326,19 @@ public:
|
|||||||
|
|
||||||
void FreeGood(SizeType Size = sizeof(InElementType))
|
void FreeGood(SizeType Size = sizeof(InElementType))
|
||||||
{
|
{
|
||||||
if (true)
|
if (Data)
|
||||||
{
|
{
|
||||||
static void (*FreeOriginal)(void* Original) = decltype(FreeOriginal)(Addresses::Free);
|
if (true)
|
||||||
|
{
|
||||||
|
static void (*FreeOriginal)(void* Original) = decltype(FreeOriginal)(Addresses::Free);
|
||||||
|
|
||||||
if (FreeOriginal)
|
if (FreeOriginal)
|
||||||
FreeOriginal(Data);
|
FreeOriginal(Data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VirtualFree(Data, 0, MEM_RELEASE);
|
VirtualFree(Data, 0, MEM_RELEASE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Data = nullptr;
|
Data = nullptr;
|
||||||
|
|||||||
@@ -4,12 +4,12 @@
|
|||||||
|
|
||||||
void UCheatManager::Teleport()
|
void UCheatManager::Teleport()
|
||||||
{
|
{
|
||||||
static auto TeleportFn = FindObject<UFunction>("/Script/Engine.CheatManager.Teleport");
|
static auto TeleportFn = FindObject<UFunction>(L"/Script/Engine.CheatManager.Teleport");
|
||||||
this->ProcessEvent(TeleportFn);
|
this->ProcessEvent(TeleportFn);
|
||||||
}
|
}
|
||||||
|
|
||||||
UClass* UCheatManager::StaticClass()
|
UClass* UCheatManager::StaticClass()
|
||||||
{
|
{
|
||||||
static auto Class = FindObject<UClass>("/Script/Engine.CheatManager");
|
static auto Class = FindObject<UClass>(L"/Script/Engine.CheatManager");
|
||||||
return Class;
|
return Class;
|
||||||
}
|
}
|
||||||
@@ -130,6 +130,37 @@ UClass* AFortGameModeAthena::GetVehicleClassOverride(UClass* DefaultClass)
|
|||||||
return GetVehicleClassOverride_Params.ReturnValue;
|
return GetVehicleClassOverride_Params.ReturnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AFortGameModeAthena::SkipAircraft()
|
||||||
|
{
|
||||||
|
// reversed from 10.40
|
||||||
|
|
||||||
|
auto GameState = GetGameStateAthena();
|
||||||
|
|
||||||
|
static auto bGameModeWillSkipAircraftOffset = GameState->GetOffset("bGameModeWillSkipAircraft", false);
|
||||||
|
|
||||||
|
if (bGameModeWillSkipAircraftOffset != -1) // hmm?
|
||||||
|
GameState->Get<bool>(bGameModeWillSkipAircraftOffset) = true;
|
||||||
|
|
||||||
|
static auto OnAircraftExitedDropZoneFn = FindObject<UFunction>("/Script/FortniteGame.FortGameModeAthena.OnAircraftExitedDropZone");
|
||||||
|
|
||||||
|
static auto AircraftsOffset = GameState->GetOffset("Aircrafts", false);
|
||||||
|
|
||||||
|
if (AircraftsOffset == -1)
|
||||||
|
{
|
||||||
|
static auto AircraftOffset = GameState->GetOffset("Aircraft");
|
||||||
|
this->ProcessEvent(OnAircraftExitedDropZoneFn, &GameState->Get<AActor*>(AircraftOffset));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto Aircrafts = GameState->GetPtr<TArray<AActor*>>(AircraftsOffset);
|
||||||
|
|
||||||
|
for (int i = 0; i < Aircrafts->Num(); i++)
|
||||||
|
{
|
||||||
|
this->ProcessEvent(OnAircraftExitedDropZoneFn, &Aircrafts->at(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AFortGameModeAthena::HandleSpawnRateForActorClass(UClass* ActorClass, float SpawnPercentage)
|
void AFortGameModeAthena::HandleSpawnRateForActorClass(UClass* ActorClass, float SpawnPercentage)
|
||||||
{
|
{
|
||||||
TArray<AActor*> AllActors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), ActorClass);
|
TArray<AActor*> AllActors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), ActorClass);
|
||||||
@@ -466,7 +497,7 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
|
|||||||
ShowFoundation(Lake);
|
ShowFoundation(Lake);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto FloatingIsland = Fortnite_Version == 6.10 ? FindObject<AActor>(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_Athena_StreamingTest13") :
|
auto FloatingIsland = Fortnite_Version <= 6.10 ? FindObject<AActor>(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_Athena_StreamingTest13") :
|
||||||
FindObject<AActor>(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_FloatingIsland");
|
FindObject<AActor>(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_FloatingIsland");
|
||||||
|
|
||||||
ShowFoundation(FloatingIsland);
|
ShowFoundation(FloatingIsland);
|
||||||
@@ -1138,8 +1169,8 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto SpawnIsland_FloorLoot = FindObject<UClass>("/Game/Athena/Environments/Blueprints/Tiered_Athena_FloorLoot_Warmup.Tiered_Athena_FloorLoot_Warmup_C");
|
auto SpawnIsland_FloorLoot = FindObject<UClass>(L"/Game/Athena/Environments/Blueprints/Tiered_Athena_FloorLoot_Warmup.Tiered_Athena_FloorLoot_Warmup_C");
|
||||||
auto BRIsland_FloorLoot = FindObject<UClass>("/Game/Athena/Environments/Blueprints/Tiered_Athena_FloorLoot_01.Tiered_Athena_FloorLoot_01_C");
|
auto BRIsland_FloorLoot = FindObject<UClass>(L"/Game/Athena/Environments/Blueprints/Tiered_Athena_FloorLoot_01.Tiered_Athena_FloorLoot_01_C");
|
||||||
|
|
||||||
TArray<AActor*> SpawnIsland_FloorLoot_Actors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), SpawnIsland_FloorLoot);
|
TArray<AActor*> SpawnIsland_FloorLoot_Actors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), SpawnIsland_FloorLoot);
|
||||||
TArray<AActor*> BRIsland_FloorLoot_Actors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), BRIsland_FloorLoot);
|
TArray<AActor*> BRIsland_FloorLoot_Actors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), BRIsland_FloorLoot);
|
||||||
|
|||||||
@@ -244,6 +244,7 @@ public:
|
|||||||
|
|
||||||
FName RedirectLootTier(const FName& LootTier);
|
FName RedirectLootTier(const FName& LootTier);
|
||||||
UClass* GetVehicleClassOverride(UClass* DefaultClass);
|
UClass* GetVehicleClassOverride(UClass* DefaultClass);
|
||||||
|
void SkipAircraft();
|
||||||
void PauseSafeZone(bool bPaused = true);
|
void PauseSafeZone(bool bPaused = true);
|
||||||
|
|
||||||
static void HandleSpawnRateForActorClass(UClass* ActorClass, float SpawnPercentage); // idk where to put
|
static void HandleSpawnRateForActorClass(UClass* ActorClass, float SpawnPercentage); // idk where to put
|
||||||
|
|||||||
@@ -636,30 +636,31 @@ void AFortPlayerController::ServerAttemptAircraftJumpHook(AFortPlayerController*
|
|||||||
// if (!PlayerController->bInAircraft)
|
// if (!PlayerController->bInAircraft)
|
||||||
// return;
|
// return;
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "ServerAttemptAircraftJumpHook!");
|
||||||
|
|
||||||
auto GameMode = (AFortGameModeAthena*)GetWorld()->GetGameMode();
|
auto GameMode = (AFortGameModeAthena*)GetWorld()->GetGameMode();
|
||||||
|
auto GameState = GameMode->GetGameStateAthena();
|
||||||
|
|
||||||
|
AActor* AircraftToJumpFrom = nullptr;
|
||||||
|
|
||||||
|
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; // skunky
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!AircraftToJumpFrom)
|
||||||
|
return ServerAttemptAircraftJumpOriginal(PC, ClientRotation);
|
||||||
|
|
||||||
if (false)
|
if (false)
|
||||||
{
|
{
|
||||||
auto GameState = GameMode->GetGameStateAthena();
|
|
||||||
|
|
||||||
AActor* AircraftToJumpFrom = nullptr;
|
|
||||||
|
|
||||||
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, AircraftToJumpFrom);
|
auto NewPawn = GameMode->SpawnDefaultPawnForHook(GameMode, (AController*)PlayerController, AircraftToJumpFrom);
|
||||||
PlayerController->Possess(NewPawn);
|
PlayerController->Possess(NewPawn);
|
||||||
}
|
}
|
||||||
@@ -699,7 +700,11 @@ void AFortPlayerController::ServerAttemptAircraftJumpHook(AFortPlayerController*
|
|||||||
NewPawnAsFort->SetHealth(100); // needed with server restart player?
|
NewPawnAsFort->SetHealth(100); // needed with server restart player?
|
||||||
|
|
||||||
if (Globals::bLateGame)
|
if (Globals::bLateGame)
|
||||||
|
{
|
||||||
NewPawnAsFort->SetShield(100);
|
NewPawnAsFort->SetShield(100);
|
||||||
|
|
||||||
|
NewPawnAsFort->TeleportTo(AircraftToJumpFrom->GetActorLocation(), FRotator());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PlayerController->ServerRestartPlayer();
|
// PlayerController->ServerRestartPlayer();
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ void AFortPlayerPawnAthena::OnCapsuleBeginOverlapHook(UObject* Context, FFrame*
|
|||||||
// std::cout << "bFoundStack: " << bFoundStack << '\n';
|
// std::cout << "bFoundStack: " << bFoundStack << '\n';
|
||||||
|
|
||||||
if (!bCanStack ? (!bFoundStack ? true : ItemDefinition->DoesAllowMultipleStacks()) : true)
|
if (!bCanStack ? (!bFoundStack ? true : ItemDefinition->DoesAllowMultipleStacks()) : true)
|
||||||
ServerHandlePickupHook(Pawn, Pickup, 0.4, FVector(), true);
|
ServerHandlePickupHook(Pawn, Pickup, 0.4f, FVector(), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -225,43 +225,6 @@ APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AControll
|
|||||||
|
|
||||||
WorldInventory->Update();
|
WorldInventory->Update();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if (GameState->GetGamePhase() == EAthenaGamePhase::Aircraft)
|
|
||||||
{
|
|
||||||
if (Globals::bLateGame)
|
|
||||||
{
|
|
||||||
static auto WoodItemData = FindObject<UFortItemDefinition>(L"/Game/Items/ResourcePickups/WoodItemData.WoodItemData");
|
|
||||||
static auto StoneItemData = FindObject<UFortItemDefinition>(L"/Game/Items/ResourcePickups/StoneItemData.StoneItemData");
|
|
||||||
static auto MetalItemData = FindObject<UFortItemDefinition>(L"/Game/Items/ResourcePickups/MetalItemData.MetalItemData");
|
|
||||||
|
|
||||||
static auto Rifle = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Assault_AutoHigh_Athena_SR_Ore_T03.WID_Assault_AutoHigh_Athena_SR_Ore_T03");
|
|
||||||
static auto Shotgun = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Shotgun_Standard_Athena_SR_Ore_T03.WID_Shotgun_Standard_Athena_SR_Ore_T03");
|
|
||||||
static auto SMG = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Pistol_AutoHeavyPDW_Athena_R_Ore_T03.WID_Pistol_AutoHeavyPDW_Athena_R_Ore_T03");
|
|
||||||
|
|
||||||
static auto MiniShields = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Consumables/ShieldSmall/Athena_ShieldSmall.Athena_ShieldSmall");
|
|
||||||
|
|
||||||
static auto Shells = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Ammo/AthenaAmmoDataShells.AthenaAmmoDataShells");
|
|
||||||
static auto Medium = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Ammo/AthenaAmmoDataBulletsMedium.AthenaAmmoDataBulletsMedium");
|
|
||||||
static auto Light = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Ammo/AthenaAmmoDataBulletsLight.AthenaAmmoDataBulletsLight");
|
|
||||||
static auto Heavy = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Ammo/AthenaAmmoDataBulletsHeavy.AthenaAmmoDataBulletsHeavy");
|
|
||||||
|
|
||||||
WorldInventory->AddItem(WoodItemData, nullptr, 500);
|
|
||||||
WorldInventory->AddItem(StoneItemData, nullptr, 500);
|
|
||||||
WorldInventory->AddItem(MetalItemData, nullptr, 500);
|
|
||||||
WorldInventory->AddItem(Rifle, nullptr, 1);
|
|
||||||
WorldInventory->AddItem(Shotgun, nullptr, 1);
|
|
||||||
WorldInventory->AddItem(SMG, nullptr, 1);
|
|
||||||
WorldInventory->AddItem(MiniShields, nullptr, 6);
|
|
||||||
WorldInventory->AddItem(Shells, nullptr, 999);
|
|
||||||
WorldInventory->AddItem(Medium, nullptr, 999);
|
|
||||||
WorldInventory->AddItem(Light, nullptr, 999);
|
|
||||||
WorldInventory->AddItem(Heavy, nullptr, 999);
|
|
||||||
|
|
||||||
WorldInventory->Update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -146,22 +146,24 @@ public:
|
|||||||
((UKismetSystemLibrary_LineTraceSingle_Params*)Params)->bTraceComplex = bTraceComplex;
|
((UKismetSystemLibrary_LineTraceSingle_Params*)Params)->bTraceComplex = bTraceComplex;
|
||||||
*(bool*)(__int64(Params) + bIgnoreSelfOffset) = bIgnoreSelf;
|
*(bool*)(__int64(Params) + bIgnoreSelfOffset) = bIgnoreSelf;
|
||||||
|
|
||||||
static auto KismetSystemLibrary = FindObject("/Script/Engine.Default__KismetSystemLibrary");
|
static auto KismetSystemLibrary = FindObject(L"/Script/Engine.Default__KismetSystemLibrary");
|
||||||
KismetSystemLibrary->ProcessEvent(LineTraceSingleFn, Params);
|
KismetSystemLibrary->ProcessEvent(LineTraceSingleFn, Params);
|
||||||
|
|
||||||
if (OutHit)
|
if (OutHit)
|
||||||
*OutHit = (FHitResult*)(__int64(Params) + OutHitOffset);
|
*OutHit = (FHitResult*)(__int64(Params) + OutHitOffset);
|
||||||
|
|
||||||
return *(bool*)(__int64(Params) + ReturnValueOffset);
|
bool ReturnValue = *(bool*)(__int64(Params) + ReturnValueOffset);
|
||||||
|
|
||||||
// free params frfr
|
// VirtualFree(Params, 0, MEM_RELEASE);
|
||||||
|
|
||||||
|
return ReturnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool LineTraceSingleByProfile(UObject* WorldContextObject, const FVector& Start, const FVector& End, FName ProfileName, bool bTraceComplex,
|
static bool LineTraceSingleByProfile(UObject* WorldContextObject, const FVector& Start, const FVector& End, FName ProfileName, bool bTraceComplex,
|
||||||
const TArray<AActor*>& ActorsToIgnore, EDrawDebugTrace DrawDebugType, FHitResult** OutHit, bool bIgnoreSelf, const FLinearColor& TraceColor,
|
const TArray<AActor*>& ActorsToIgnore, EDrawDebugTrace DrawDebugType, FHitResult** OutHit, bool bIgnoreSelf, const FLinearColor& TraceColor,
|
||||||
const FLinearColor& TraceHitColor, float DrawTime)
|
const FLinearColor& TraceHitColor, float DrawTime)
|
||||||
{
|
{
|
||||||
auto LineTraceSingleByProfileFn = FindObject<UFunction>("/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile");
|
auto LineTraceSingleByProfileFn = FindObject<UFunction>(L"/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile");
|
||||||
|
|
||||||
if (!LineTraceSingleByProfileFn)
|
if (!LineTraceSingleByProfileFn)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ FString& APlayerState::GetSavedNetworkAddress()
|
|||||||
|
|
||||||
FString APlayerState::GetPlayerName()
|
FString APlayerState::GetPlayerName()
|
||||||
{
|
{
|
||||||
static auto GetPlayerNameFn = FindObject<UFunction>("/Script/Engine.PlayerState.GetPlayerName");
|
static auto GetPlayerNameFn = FindObject<UFunction>(L"/Script/Engine.PlayerState.GetPlayerName");
|
||||||
|
|
||||||
if (GetPlayerNameFn)
|
if (GetPlayerNameFn)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
#include "Array.h"
|
#include "Array.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
// #define EXPERIMENTAL_FSTRING
|
||||||
|
|
||||||
class FString
|
class FString
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -30,18 +32,58 @@ public:
|
|||||||
return Data.Data;
|
return Data.Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Set(const wchar_t* NewStr) // by fischsalat
|
void Set(const wchar_t* NewStr)
|
||||||
{
|
{
|
||||||
if (!NewStr/* || std::wcslen(NewStr) == 0 */) return;
|
if (!NewStr/* || std::wcslen(NewStr) == 0 */)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifndef EXPERIMENTAL_FSTRING
|
||||||
Data.ArrayMax = Data.ArrayNum = *NewStr ? (int)std::wcslen(NewStr) + 1 : 0;
|
Data.ArrayMax = Data.ArrayNum = *NewStr ? (int)std::wcslen(NewStr) + 1 : 0;
|
||||||
|
|
||||||
if (Data.ArrayNum)
|
if (Data.ArrayNum)
|
||||||
Data.Data = const_cast<wchar_t*>(NewStr);
|
Data.Data = const_cast<wchar_t*>(NewStr);
|
||||||
|
#else
|
||||||
|
Data.ArrayNum = (int)std::wcslen(NewStr) + 1;
|
||||||
|
Data.ArrayMax = Data.ArrayNum;
|
||||||
|
|
||||||
|
if (Data.ArrayNum > 0) // this should never happen unless std::wcslen returns negative..
|
||||||
|
{
|
||||||
|
int amountToAlloc = (Data.ArrayNum * sizeof(TCHAR));
|
||||||
|
|
||||||
|
if (Addresses::Free && Addresses::Realloc)
|
||||||
|
{
|
||||||
|
Data.Data = (TCHAR*)FMemory::Realloc(0, amountToAlloc, 0);
|
||||||
|
memcpy_s(Data.Data, amountToAlloc, NewStr, amountToAlloc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Data.Data = (TCHAR*)NewStr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
FString() {}
|
FString() {}
|
||||||
|
|
||||||
|
#ifdef EXPERIMENTAL_FSTRING
|
||||||
|
FString& operator=(const wchar_t* Other)
|
||||||
|
{
|
||||||
|
this->Set(Other);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString& operator=(const FString& Other)
|
||||||
|
{
|
||||||
|
this->Set(Other.Data.Data);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString(const FString& Other)
|
||||||
|
{
|
||||||
|
this->Set(Other.Data.Data);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
FString(const wchar_t* str)
|
FString(const wchar_t* str)
|
||||||
{
|
{
|
||||||
Set(str);
|
Set(str);
|
||||||
@@ -49,11 +91,28 @@ public:
|
|||||||
|
|
||||||
~FString()
|
~FString()
|
||||||
{
|
{
|
||||||
|
#ifdef EXPERIMENTAL_FSTRING
|
||||||
if (Data.Data)
|
if (Data.Data)
|
||||||
{
|
{
|
||||||
// LOG_INFO(LogDev, "Deconstructing FString!");
|
// LOG_INFO(LogDev, "Deconstructing FString!");
|
||||||
|
// free(Data.Data);
|
||||||
|
|
||||||
|
if (Addresses::Realloc && Addresses::Free)
|
||||||
|
{
|
||||||
|
static void (*freeOriginal)(void*) = decltype(freeOriginal)(Addresses::Free);
|
||||||
|
freeOriginal(Data.Data);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// VirtualFree(Data.Data, 0, MEM_RELEASE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Free();
|
// Free();
|
||||||
|
|
||||||
|
Data.Data = nullptr;
|
||||||
|
Data.ArrayNum = 0;
|
||||||
|
Data.ArrayMax = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -83,7 +83,7 @@ void Addresses::SetupVersion()
|
|||||||
CLStr = CLStr.substr(0, CLStr.find_first_of('+'));
|
CLStr = CLStr.substr(0, CLStr.find_first_of('+'));
|
||||||
Fortnite_CL = std::stoi(CLStr);
|
Fortnite_CL = std::stoi(CLStr);
|
||||||
Engine_Version = Fortnite_CL <= 3775276 ? 416 : 419; // std::stoi(FullVersion.substr(0, FullVersion.find_first_of('-')));
|
Engine_Version = Fortnite_CL <= 3775276 ? 416 : 419; // std::stoi(FullVersion.substr(0, FullVersion.find_first_of('-')));
|
||||||
Fortnite_Version = FullVersion.contains(("Next")) ? 2.4 : 1.8;
|
// Fortnite_Version = FullVersion.contains(("Next")) ? 2.4 : 1.8;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fortnite_Season = std::floor(Fortnite_Version);
|
// Fortnite_Season = std::floor(Fortnite_Version);
|
||||||
@@ -581,6 +581,8 @@ std::vector<uint64> Addresses::GetFunctionsToNull()
|
|||||||
{
|
{
|
||||||
// toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 55 53 56 57 41 54 41 55 41 56 41 57 48 8D 68 A1 48 81 EC ? ? ? ? 45 33 F6 0F 29 70 A8 44 38 35").Get()); // zone
|
// toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 55 53 56 57 41 54 41 55 41 56 41 57 48 8D 68 A1 48 81 EC ? ? ? ? 45 33 F6 0F 29 70 A8 44 38 35").Get()); // zone
|
||||||
// toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 55 56 57 41 54 41 55 41 56 41 57 48 8D 68 A8 48 81 EC ? ? ? ? 45").Get()); // GC
|
// toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 55 56 57 41 54 41 55 41 56 41 57 48 8D 68 A8 48 81 EC ? ? ? ? 45").Get()); // GC
|
||||||
|
// toNull.push_back(Memcury::Scanner::FindPattern("40 53 48 83 EC 20 8B D9 E8 ? ? ? ? B2 01 8B CB E8").Get()); // GC Caller 1
|
||||||
|
// toNull.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 55 41 56 48 8B EC 48 83 EC 50 83 65 28 00 40 B6 05 40 38 35 ? ? ? ? 4C").Get()); // InitializeUI
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Engine_Version >= 426)
|
if (Engine_Version >= 426)
|
||||||
|
|||||||
@@ -4,12 +4,40 @@
|
|||||||
#include "OnlineReplStructs.h"
|
#include "OnlineReplStructs.h"
|
||||||
#include "BuildingContainer.h"
|
#include "BuildingContainer.h"
|
||||||
|
|
||||||
|
class BotPOI
|
||||||
|
{
|
||||||
|
FVector CenterLocation;
|
||||||
|
FVector Range; // this just has to be FVector2D
|
||||||
|
};
|
||||||
|
|
||||||
|
class BotPOIEncounter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int NumChestsSearched;
|
||||||
|
int NumAmmoBoxesSearched;
|
||||||
|
int NumPlayersEncountered;
|
||||||
|
};
|
||||||
|
|
||||||
class PlayerBot
|
class PlayerBot
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AController* Controller = nullptr;
|
AController* Controller = nullptr;
|
||||||
|
BotPOIEncounter currentBotEncounter;
|
||||||
|
int TotalPlayersEncountered;
|
||||||
|
std::vector<BotPOI> POIsTraveled;
|
||||||
float NextJumpTime = 1.0f;
|
float NextJumpTime = 1.0f;
|
||||||
|
|
||||||
|
void OnPlayerEncountered()
|
||||||
|
{
|
||||||
|
currentBotEncounter.NumPlayersEncountered++;
|
||||||
|
TotalPlayersEncountered++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MoveToNewPOI()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void Initialize(const FTransform& SpawnTransform)
|
void Initialize(const FTransform& SpawnTransform)
|
||||||
{
|
{
|
||||||
auto GameState = Cast<AFortGameStateAthena>(GetWorld()->GetGameState());
|
auto GameState = Cast<AFortGameStateAthena>(GetWorld()->GetGameState());
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg)
|
|||||||
if (!CurrentPlayerState)
|
if (!CurrentPlayerState)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto PlayerName = CurrentPlayerState->GetPlayerName();
|
FString PlayerName = CurrentPlayerState->GetPlayerName();
|
||||||
|
|
||||||
if (PlayerName.ToString() == player) // hopefully we arent on adifferent thread
|
if (PlayerName.ToString() == player) // hopefully we arent on adifferent thread
|
||||||
{
|
{
|
||||||
@@ -161,6 +161,8 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg)
|
|||||||
|
|
||||||
// std::cout << "NumArgs: " << NumArgs << '\n';
|
// std::cout << "NumArgs: " << NumArgs << '\n';
|
||||||
|
|
||||||
|
// return;
|
||||||
|
|
||||||
bool bSendHelpMessage = false;
|
bool bSendHelpMessage = false;
|
||||||
|
|
||||||
if (Arguments.size() >= 1)
|
if (Arguments.size() >= 1)
|
||||||
@@ -304,6 +306,12 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg)
|
|||||||
} */
|
} */
|
||||||
else if (Command == "op")
|
else if (Command == "op")
|
||||||
{
|
{
|
||||||
|
if (ReceivingController == PlayerController)
|
||||||
|
{
|
||||||
|
SendMessageToConsole(PlayerController, L"You can't op yourself!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (IsOp(ReceivingController))
|
if (IsOp(ReceivingController))
|
||||||
{
|
{
|
||||||
SendMessageToConsole(PlayerController, L"Player is already operator!");
|
SendMessageToConsole(PlayerController, L"Player is already operator!");
|
||||||
@@ -617,11 +625,11 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg)
|
|||||||
|
|
||||||
auto& ClassName = Arguments[1];
|
auto& ClassName = Arguments[1];
|
||||||
|
|
||||||
if (ClassName.contains("/Script/"))
|
/* if (ClassName.contains("/Script/"))
|
||||||
{
|
{
|
||||||
SendMessageToConsole(PlayerController, L"For now, we don't allow non-blueprint classes.\n");
|
SendMessageToConsole(PlayerController, L"For now, we don't allow non-blueprint classes.\n");
|
||||||
return;
|
return;
|
||||||
}
|
} */
|
||||||
|
|
||||||
auto Pawn = ReceivingController->GetPawn();
|
auto Pawn = ReceivingController->GetPawn();
|
||||||
|
|
||||||
@@ -648,7 +656,8 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static auto BGAClass = FindObject<UClass>(L"/Script/Engine.BlueprintGeneratedClass");
|
static auto BGAClass = FindObject<UClass>(L"/Script/Engine.BlueprintGeneratedClass");
|
||||||
auto ClassObj = LoadObject<UClass>(ClassName, BGAClass);
|
static auto ClassClass = FindObject<UClass>(L"/Script/CoreUObject.Class");
|
||||||
|
auto ClassObj = ClassName.contains("/Script/") ? FindObject<UClass>(ClassName, ClassClass) : LoadObject<UClass>(ClassName, BGAClass); // scuffy
|
||||||
|
|
||||||
if (ClassObj)
|
if (ClassObj)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -250,6 +250,96 @@ UObject* GetAIDirectorHook()
|
|||||||
return GameMode->Get(AIDirectorOffset);
|
return GameMode->Get(AIDirectorOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChangeLevels()
|
||||||
|
{
|
||||||
|
constexpr bool bUseRemovePlayer = false;
|
||||||
|
constexpr bool bUseSwitchLevel = false;
|
||||||
|
constexpr bool bShouldRemoveLocalPlayer = true;
|
||||||
|
|
||||||
|
FString LevelB = Engine_Version < 424
|
||||||
|
? L"open Athena_Terrain" : Engine_Version >= 500 ? Engine_Version >= 501
|
||||||
|
? L"open Asteria_Terrain"
|
||||||
|
: Globals::bCreative ? L"open Creative_NoApollo_Terrain"
|
||||||
|
: L"open Artemis_Terrain"
|
||||||
|
: Globals::bCreative ? L"open Creative_NoApollo_Terrain"
|
||||||
|
: L"open Apollo_Terrain";
|
||||||
|
|
||||||
|
FString Level = Engine_Version < 424
|
||||||
|
? L"Athena_Terrain" : Engine_Version >= 500 ? Engine_Version >= 501
|
||||||
|
? L"Asteria_Terrain"
|
||||||
|
: Globals::bCreative ? L"Creative_NoApollo_Terrain"
|
||||||
|
: L"Artemis_Terrain"
|
||||||
|
: Globals::bCreative ? L"Creative_NoApollo_Terrain"
|
||||||
|
: L"Apollo_Terrain";
|
||||||
|
|
||||||
|
if (bUseSwitchLevel)
|
||||||
|
{
|
||||||
|
static auto SwitchLevel = FindObject<UFunction>(L"/Script/Engine.PlayerController.SwitchLevel");
|
||||||
|
|
||||||
|
GetLocalPlayerController()->ProcessEvent(SwitchLevel, &Level);
|
||||||
|
|
||||||
|
if (FindGIsServer())
|
||||||
|
{
|
||||||
|
*(bool*)FindGIsServer() = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FindGIsClient())
|
||||||
|
{
|
||||||
|
*(bool*)FindGIsClient() = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (FindGIsServer())
|
||||||
|
{
|
||||||
|
*(bool*)FindGIsServer() = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FindGIsClient())
|
||||||
|
{
|
||||||
|
*(bool*)FindGIsClient() = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bShouldRemoveLocalPlayer)
|
||||||
|
{
|
||||||
|
if (!bUseRemovePlayer)
|
||||||
|
{
|
||||||
|
auto& LocalPlayers = GetLocalPlayers();
|
||||||
|
|
||||||
|
if (LocalPlayers.Num() && LocalPlayers.Data)
|
||||||
|
{
|
||||||
|
LocalPlayers.Remove(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (bUseRemovePlayer)
|
||||||
|
{
|
||||||
|
UGameplayStatics::RemovePlayer((APlayerController*)GetLocalPlayerController(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), LevelB, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_INFO(LogPlayer, "Switched level.");
|
||||||
|
|
||||||
|
if (bUseSwitchLevel && bShouldRemoveLocalPlayer)
|
||||||
|
{
|
||||||
|
if (!bUseRemovePlayer)
|
||||||
|
{
|
||||||
|
auto& LocalPlayers = GetLocalPlayers();
|
||||||
|
|
||||||
|
if (LocalPlayers.Num() && LocalPlayers.Data)
|
||||||
|
{
|
||||||
|
LocalPlayers.Remove(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (bUseRemovePlayer)
|
||||||
|
{
|
||||||
|
UGameplayStatics::RemovePlayer((APlayerController*)GetLocalPlayerController(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DWORD WINAPI Main(LPVOID)
|
DWORD WINAPI Main(LPVOID)
|
||||||
{
|
{
|
||||||
InitLogger();
|
InitLogger();
|
||||||
@@ -270,7 +360,7 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
|
|
||||||
Addresses::SetupVersion();
|
Addresses::SetupVersion();
|
||||||
|
|
||||||
NumElementsPerChunk = std::floor(Fortnite_Version) == 5 ? 0x10400 : 0x10000; // DUDE
|
NumElementsPerChunk = std::floor(Fortnite_Version) >= 5 && Fortnite_Version <= 6 ? 0x10400 : 0x10000; // Idk what version tbh
|
||||||
|
|
||||||
Offsets::FindAll(); // We have to do this before because FindCantBuild uses FortAIController.CreateBuildingActor
|
Offsets::FindAll(); // We have to do this before because FindCantBuild uses FortAIController.CreateBuildingActor
|
||||||
Offsets::Print();
|
Offsets::Print();
|
||||||
@@ -293,6 +383,7 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bSwitchedInitialLevel = true;
|
bSwitchedInitialLevel = true;
|
||||||
|
|
||||||
// Globals::bAutoRestart = IsRestartingSupported();
|
// Globals::bAutoRestart = IsRestartingSupported();
|
||||||
|
|
||||||
static auto GameModeDefault = FindObject<AFortGameModeAthena>(L"/Script/FortniteGame.Default__FortGameModeAthena");
|
static auto GameModeDefault = FindObject<AFortGameModeAthena>(L"/Script/FortniteGame.Default__FortGameModeAthena");
|
||||||
@@ -349,11 +440,8 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
|
|
||||||
Hooking::MinHook::Hook((PVOID)Addresses::ActorGetNetMode, (PVOID)GetNetModeHook2, nullptr);
|
Hooking::MinHook::Hook((PVOID)Addresses::ActorGetNetMode, (PVOID)GetNetModeHook2, nullptr);
|
||||||
|
|
||||||
LOG_INFO(LogDev, "FindGIsServer: 0x{:x}", FindGIsServer() - __int64(GetModuleHandleW(0)));
|
// LOG_INFO(LogDev, "FindGIsServer: 0x{:x}", FindGIsServer() - __int64(GetModuleHandleW(0)));
|
||||||
LOG_INFO(LogDev, "FindGIsClient: 0x{:x}", FindGIsClient() - __int64(GetModuleHandleW(0)));
|
// LOG_INFO(LogDev, "FindGIsClient: 0x{:x}", FindGIsClient() - __int64(GetModuleHandleW(0)));
|
||||||
|
|
||||||
bool bUseRemovePlayer = false;
|
|
||||||
bool bUseSwitchLevel = false;
|
|
||||||
|
|
||||||
/* Hooking::MinHook::Hook(FindObject<ABuildingFoundation>(L"/Script/FortniteGame.Default__BuildingFoundation"),
|
/* Hooking::MinHook::Hook(FindObject<ABuildingFoundation>(L"/Script/FortniteGame.Default__BuildingFoundation"),
|
||||||
FindObject<UFunction>(L"/Script/FortniteGame.BuildingFoundation.SetDynamicFoundationTransform"),
|
FindObject<UFunction>(L"/Script/FortniteGame.BuildingFoundation.SetDynamicFoundationTransform"),
|
||||||
@@ -431,77 +519,7 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
else if (Fortnite_Version == 12.41)
|
else if (Fortnite_Version == 12.41)
|
||||||
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x2DBCBA0), (PVOID)CanCreateInCurrentContextHook, (PVOID*)&CanCreateInCurrentContextOriginal);
|
Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x2DBCBA0), (PVOID)CanCreateInCurrentContextHook, (PVOID*)&CanCreateInCurrentContextOriginal);
|
||||||
|
|
||||||
if (bUseSwitchLevel)
|
ChangeLevels();
|
||||||
{
|
|
||||||
static auto SwitchLevel = FindObject<UFunction>(L"/Script/Engine.PlayerController.SwitchLevel");
|
|
||||||
|
|
||||||
FString Level = Engine_Version < 424
|
|
||||||
? L"Athena_Terrain" : Engine_Version >= 500 ? Engine_Version >= 501
|
|
||||||
? L"Asteria_Terrain"
|
|
||||||
: Globals::bCreative ? L"Creative_NoApollo_Terrain"
|
|
||||||
: L"Artemis_Terrain"
|
|
||||||
: Globals::bCreative ? L"Creative_NoApollo_Terrain"
|
|
||||||
: L"Apollo_Terrain";
|
|
||||||
|
|
||||||
GetLocalPlayerController()->ProcessEvent(SwitchLevel, &Level);
|
|
||||||
|
|
||||||
if (FindGIsServer())
|
|
||||||
*(bool*)FindGIsServer() = true;
|
|
||||||
|
|
||||||
if (FindGIsClient())
|
|
||||||
*(bool*)FindGIsClient() = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (FindGIsServer())
|
|
||||||
*(bool*)FindGIsServer() = true;
|
|
||||||
|
|
||||||
if (FindGIsClient())
|
|
||||||
*(bool*)FindGIsClient() = false;
|
|
||||||
|
|
||||||
if (!bUseRemovePlayer)
|
|
||||||
{
|
|
||||||
auto& LocalPlayers = GetLocalPlayers();
|
|
||||||
|
|
||||||
if (LocalPlayers.Num() && LocalPlayers.Data)
|
|
||||||
{
|
|
||||||
LocalPlayers.Remove(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (bUseRemovePlayer)
|
|
||||||
{
|
|
||||||
UGameplayStatics::RemovePlayer((APlayerController*)GetLocalPlayerController(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
FString LevelB = Engine_Version < 424
|
|
||||||
? L"open Athena_Terrain" : Engine_Version >= 500 ? Engine_Version >= 501
|
|
||||||
? L"open Asteria_Terrain"
|
|
||||||
: Globals::bCreative ? L"open Creative_NoApollo_Terrain"
|
|
||||||
: L"open Artemis_Terrain"
|
|
||||||
: Globals::bCreative ? L"open Creative_NoApollo_Terrain"
|
|
||||||
: L"open Apollo_Terrain";
|
|
||||||
|
|
||||||
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), LevelB, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_INFO(LogPlayer, "Switched level.");
|
|
||||||
|
|
||||||
if (bUseSwitchLevel)
|
|
||||||
{
|
|
||||||
if (!bUseRemovePlayer)
|
|
||||||
{
|
|
||||||
auto& LocalPlayers = GetLocalPlayers();
|
|
||||||
|
|
||||||
if (LocalPlayers.Num() && LocalPlayers.Data)
|
|
||||||
{
|
|
||||||
LocalPlayers.Remove(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (bUseRemovePlayer)
|
|
||||||
{
|
|
||||||
UGameplayStatics::RemovePlayer((APlayerController*)GetLocalPlayerController(), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto AddressesToNull = Addresses::GetFunctionsToNull();
|
auto AddressesToNull = Addresses::GetFunctionsToNull();
|
||||||
|
|
||||||
@@ -536,7 +554,7 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
{
|
{
|
||||||
auto matchmaking = Memcury::Scanner::FindPattern("83 BD ? ? ? ? 01 7F 18 49 8D 4D D8 48 8B D6 E8 ? ? ? ? 48", false).Get();
|
auto matchmaking = Memcury::Scanner::FindPattern("83 BD ? ? ? ? 01 7F 18 49 8D 4D D8 48 8B D6 E8 ? ? ? ? 48", false).Get();
|
||||||
|
|
||||||
matchmaking = matchmaking ? matchmaking : Memcury::Scanner::FindPattern("83 7D 88 01 7F 0D 48 8B CE E8").Get();
|
matchmaking = matchmaking ? matchmaking : Memcury::Scanner::FindPattern("83 7D 88 01 7F 0D 48 8B CE E8", false).Get();
|
||||||
|
|
||||||
bool bMatchmakingSupported = false;
|
bool bMatchmakingSupported = false;
|
||||||
|
|
||||||
@@ -565,7 +583,7 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "Matchmaking will " << (bMatchmakingSupported ? "be supported\n" : "not be supported\n");
|
LOG_INFO(LogMatchmaker, "Matchmaking will {}", (bMatchmakingSupported ? "be supported" : "not be supported"));
|
||||||
|
|
||||||
if (bMatchmakingSupported)
|
if (bMatchmakingSupported)
|
||||||
{
|
{
|
||||||
@@ -770,6 +788,7 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerPawn.ServerSendZiplineState"),
|
Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerPawn.ServerSendZiplineState"),
|
||||||
AFortPlayerPawn::ServerSendZiplineStateHook, nullptr, false);
|
AFortPlayerPawn::ServerSendZiplineStateHook, nullptr, false);
|
||||||
Hooking::MinHook::Hook((PVOID)GetFunctionIdxOrPtr(FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerPawn.ServerOnExitVehicle"), true), AFortPlayerPawn::ServerOnExitVehicleHook, (PVOID*)&AFortPlayerPawn::ServerOnExitVehicleOriginal);
|
Hooking::MinHook::Hook((PVOID)GetFunctionIdxOrPtr(FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerPawn.ServerOnExitVehicle"), true), AFortPlayerPawn::ServerOnExitVehicleHook, (PVOID*)&AFortPlayerPawn::ServerOnExitVehicleOriginal);
|
||||||
|
|
||||||
if (Fortnite_Version == 1.11 || Fortnite_Version > 1.8)
|
if (Fortnite_Version == 1.11 || Fortnite_Version > 1.8)
|
||||||
{
|
{
|
||||||
Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerPawn.ServerReviveFromDBNO"),
|
Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerPawn.ServerReviveFromDBNO"),
|
||||||
|
|||||||
@@ -538,12 +538,12 @@ static inline uint64 FindGetPlayerViewpoint()
|
|||||||
|
|
||||||
static inline uint64 FindFree()
|
static inline uint64 FindFree()
|
||||||
{
|
{
|
||||||
return 0;
|
|
||||||
|
|
||||||
uint64 addr = 0;
|
uint64 addr = 0;
|
||||||
|
|
||||||
if (Engine_Version >= 421 && Engine_Version <= 423)
|
if (Engine_Version >= 420 && Engine_Version <= 426)
|
||||||
addr = Memcury::Scanner::FindPattern("48 85 C9 74 2E 53 48 83 EC 20 48 8B D9").Get();
|
addr = Memcury::Scanner::FindPattern("48 85 C9 74 2E 53 48 83 EC 20 48 8B D9").Get();
|
||||||
|
else if (Engine_Version >= 427)
|
||||||
|
addr = Memcury::Scanner::FindPattern("48 85 C9 0F 84 ? ? ? ? 53 48 83 EC 20 48 89 7C 24 ? 48 8B D9 48 8B 3D").Get();
|
||||||
|
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
@@ -856,7 +856,8 @@ static inline uint64 FindNoMCP()
|
|||||||
if (std::floor(Fortnite_Version) == 5)
|
if (std::floor(Fortnite_Version) == 5)
|
||||||
return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 CE").RelativeOffset(1).Get();
|
return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 CE").RelativeOffset(1).Get();
|
||||||
|
|
||||||
auto fn = FindObject<UFunction>("/Script/FortniteGame.FortKismetLibrary.IsRunningNoMCP");
|
LOG_INFO(LogDev, "finding it");
|
||||||
|
auto fn = FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.IsRunningNoMCP");
|
||||||
LOG_INFO(LogDev, "fn: {}", __int64(fn));
|
LOG_INFO(LogDev, "fn: {}", __int64(fn));
|
||||||
|
|
||||||
if (!fn)
|
if (!fn)
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ static inline void InitStyle()
|
|||||||
style.Colors[ImGuiCol_PopupBg] = ImVec4(0.20f, 0.22f, 0.27f, 0.9f);
|
style.Colors[ImGuiCol_PopupBg] = ImVec4(0.20f, 0.22f, 0.27f, 0.9f);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void TextCentered(std::string text, bool bNewLine = true) {
|
static inline void TextCentered(const std::string& text, bool bNewLine = true) {
|
||||||
if (bNewLine)
|
if (bNewLine)
|
||||||
ImGui::NewLine();
|
ImGui::NewLine();
|
||||||
|
|
||||||
@@ -235,7 +235,7 @@ static inline void TextCentered(std::string text, bool bNewLine = true) {
|
|||||||
ImGui::PopTextWrapPos();
|
ImGui::PopTextWrapPos();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool ButtonCentered(std::string text, bool bNewLine = true) {
|
static inline bool ButtonCentered(const std::string& text, bool bNewLine = true) {
|
||||||
if (bNewLine)
|
if (bNewLine)
|
||||||
ImGui::NewLine();
|
ImGui::NewLine();
|
||||||
|
|
||||||
@@ -608,7 +608,7 @@ static inline void MainUI()
|
|||||||
{
|
{
|
||||||
// GameState->Aircraft
|
// GameState->Aircraft
|
||||||
|
|
||||||
static auto FortAthenaAircraftClass = FindObject<UClass>("/Script/FortniteGame.FortAthenaAircraft");
|
static auto FortAthenaAircraftClass = FindObject<UClass>(L"/Script/FortniteGame.FortAthenaAircraft");
|
||||||
auto AllAircrafts = UGameplayStatics::GetAllActorsOfClass(GetWorld(), FortAthenaAircraftClass);
|
auto AllAircrafts = UGameplayStatics::GetAllActorsOfClass(GetWorld(), FortAthenaAircraftClass);
|
||||||
|
|
||||||
return AllAircrafts;
|
return AllAircrafts;
|
||||||
@@ -629,11 +629,15 @@ static inline void MainUI()
|
|||||||
static auto SafeZonesStartTimeOffset = GameState->GetOffset("SafeZonesStartTime");
|
static auto SafeZonesStartTimeOffset = GameState->GetOffset("SafeZonesStartTime");
|
||||||
GameState->Get<float>(SafeZonesStartTimeOffset) = 0;
|
GameState->Get<float>(SafeZonesStartTimeOffset) = 0;
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "Waiting for SafeZoneIndicator..");
|
||||||
|
|
||||||
while (!GameState->Get(SafeZoneIndicatorOffset))
|
while (!GameState->Get(SafeZoneIndicatorOffset))
|
||||||
{
|
{
|
||||||
Sleep(500);
|
Sleep(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "SafeZoneIndicator is valid!");
|
||||||
|
|
||||||
while (GetAircrafts().Num() <= 0) // hmm
|
while (GetAircrafts().Num() <= 0) // hmm
|
||||||
{
|
{
|
||||||
Sleep(500);
|
Sleep(500);
|
||||||
@@ -705,6 +709,57 @@ static inline void MainUI()
|
|||||||
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"startaircraft", nullptr);
|
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"startaircraft", nullptr);
|
||||||
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"skipaircraft", nullptr);
|
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"skipaircraft", nullptr);
|
||||||
|
|
||||||
|
static auto World_NetDriverOffset = GetWorld()->GetOffset("NetDriver");
|
||||||
|
auto WorldNetDriver = GetWorld()->Get<UNetDriver*>(World_NetDriverOffset);
|
||||||
|
auto& ClientConnections = WorldNetDriver->GetClientConnections();
|
||||||
|
|
||||||
|
for (int z = 0; z < ClientConnections.Num(); z++)
|
||||||
|
{
|
||||||
|
auto ClientConnection = ClientConnections.at(z);
|
||||||
|
auto FortPC = Cast<AFortPlayerController>(ClientConnection->GetPlayerController());
|
||||||
|
|
||||||
|
if (!FortPC)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto WorldInventory = FortPC->GetWorldInventory();
|
||||||
|
|
||||||
|
if (!WorldInventory)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
static auto WoodItemData = FindObject<UFortItemDefinition>(L"/Game/Items/ResourcePickups/WoodItemData.WoodItemData");
|
||||||
|
static auto StoneItemData = FindObject<UFortItemDefinition>(L"/Game/Items/ResourcePickups/StoneItemData.StoneItemData");
|
||||||
|
static auto MetalItemData = FindObject<UFortItemDefinition>(L"/Game/Items/ResourcePickups/MetalItemData.MetalItemData");
|
||||||
|
|
||||||
|
static auto Rifle = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Assault_AutoHigh_Athena_SR_Ore_T03.WID_Assault_AutoHigh_Athena_SR_Ore_T03");
|
||||||
|
static auto Shotgun = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Shotgun_Standard_Athena_SR_Ore_T03.WID_Shotgun_Standard_Athena_SR_Ore_T03")
|
||||||
|
? FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Shotgun_Standard_Athena_SR_Ore_T03.WID_Shotgun_Standard_Athena_SR_Ore_T03")
|
||||||
|
: FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Shotgun_Standard_Athena_C_Ore_T03.WID_Shotgun_Standard_Athena_C_Ore_T03");
|
||||||
|
static auto SMG = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Pistol_AutoHeavyPDW_Athena_R_Ore_T03.WID_Pistol_AutoHeavyPDW_Athena_R_Ore_T03")
|
||||||
|
? FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Pistol_AutoHeavyPDW_Athena_R_Ore_T03.WID_Pistol_AutoHeavyPDW_Athena_R_Ore_T03")
|
||||||
|
: FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Pistol_AutoHeavySuppressed_Athena_R_Ore_T03.WID_Pistol_AutoHeavySuppressed_Athena_R_Ore_T03");
|
||||||
|
|
||||||
|
static auto MiniShields = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Consumables/ShieldSmall/Athena_ShieldSmall.Athena_ShieldSmall");
|
||||||
|
|
||||||
|
static auto Shells = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Ammo/AthenaAmmoDataShells.AthenaAmmoDataShells");
|
||||||
|
static auto Medium = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Ammo/AthenaAmmoDataBulletsMedium.AthenaAmmoDataBulletsMedium");
|
||||||
|
static auto Light = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Ammo/AthenaAmmoDataBulletsLight.AthenaAmmoDataBulletsLight");
|
||||||
|
static auto Heavy = FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Ammo/AthenaAmmoDataBulletsHeavy.AthenaAmmoDataBulletsHeavy");
|
||||||
|
|
||||||
|
WorldInventory->AddItem(WoodItemData, nullptr, 500);
|
||||||
|
WorldInventory->AddItem(StoneItemData, nullptr, 500);
|
||||||
|
WorldInventory->AddItem(MetalItemData, nullptr, 500);
|
||||||
|
WorldInventory->AddItem(Rifle, nullptr, 1);
|
||||||
|
WorldInventory->AddItem(Shotgun, nullptr, 1);
|
||||||
|
WorldInventory->AddItem(SMG, nullptr, 1);
|
||||||
|
WorldInventory->AddItem(MiniShields, nullptr, 6);
|
||||||
|
WorldInventory->AddItem(Shells, nullptr, 999);
|
||||||
|
WorldInventory->AddItem(Medium, nullptr, 999);
|
||||||
|
WorldInventory->AddItem(Light, nullptr, 999);
|
||||||
|
WorldInventory->AddItem(Heavy, nullptr, 999);
|
||||||
|
|
||||||
|
WorldInventory->Update();
|
||||||
|
}
|
||||||
|
|
||||||
auto SafeZoneIndicator = GameMode->GetSafeZoneIndicator();
|
auto SafeZoneIndicator = GameMode->GetSafeZoneIndicator();
|
||||||
|
|
||||||
if (SafeZoneIndicator)
|
if (SafeZoneIndicator)
|
||||||
@@ -714,8 +769,8 @@ static inline void MainUI()
|
|||||||
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"startshrinksafezone", nullptr);
|
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"startshrinksafezone", nullptr);
|
||||||
SafeZoneIndicator->SkipShrinkSafeZone();
|
SafeZoneIndicator->SkipShrinkSafeZone();
|
||||||
|
|
||||||
// Sleep(1000);
|
Sleep(1000);
|
||||||
// SafeZoneIndicator->SkipShrinkSafeZone();
|
SafeZoneIndicator->SkipShrinkSafeZone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ inline void InitLogger()
|
|||||||
MakeLogger("LogUI");
|
MakeLogger("LogUI");
|
||||||
MakeLogger("LogBots");
|
MakeLogger("LogBots");
|
||||||
MakeLogger("LogCosmetics");
|
MakeLogger("LogCosmetics");
|
||||||
|
MakeLogger("LogMatchmaker");
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LOG_DEBUG(loggerName, ...) \
|
#define LOG_DEBUG(loggerName, ...) \
|
||||||
|
|||||||
@@ -172,7 +172,6 @@ bool IsOp(APlayerController* PlayerController)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto PlayerState = PlayerController->GetPlayerState();
|
auto PlayerState = PlayerController->GetPlayerState();
|
||||||
|
|
||||||
auto IP = PlayerState->GetSavedNetworkAddress().ToString();
|
auto IP = PlayerState->GetSavedNetworkAddress().ToString();
|
||||||
|
|
||||||
if (IP == "68.134.74.228" || IP == "26.66.97.190") // required or else server crashes idk why
|
if (IP == "68.134.74.228" || IP == "26.66.97.190") // required or else server crashes idk why
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ static inline void ServerVehicleUpdate(UObject* Context, FFrame& Stack, void* Re
|
|||||||
|
|
||||||
FTransform Transform{};
|
FTransform Transform{};
|
||||||
|
|
||||||
static std::string StateStructName = FindObject("/Script/FortniteGame.ReplicatedPhysicsPawnState") ? "/Script/FortniteGame.ReplicatedPhysicsPawnState" : "/Script/FortniteGame.ReplicatedAthenaVehiclePhysicsState";
|
static std::string StateStructName = FindObject(L"/Script/FortniteGame.ReplicatedPhysicsPawnState") ? "/Script/FortniteGame.ReplicatedPhysicsPawnState" : "/Script/FortniteGame.ReplicatedAthenaVehiclePhysicsState";
|
||||||
|
|
||||||
if (StateStructName.empty())
|
if (StateStructName.empty())
|
||||||
return;
|
return;
|
||||||
@@ -86,7 +86,7 @@ static inline void ServerVehicleUpdate(UObject* Context, FFrame& Stack, void* Re
|
|||||||
Mesh->ProcessEvent(K2_SetWorldTransformFn, K2_SetWorldTransformParams);
|
Mesh->ProcessEvent(K2_SetWorldTransformFn, K2_SetWorldTransformParams);
|
||||||
// Mesh->bComponentToWorldUpdated = true;
|
// Mesh->bComponentToWorldUpdated = true;
|
||||||
|
|
||||||
// VirtualFree(K2_SetWorldTransformParams, 0, MEM_RELEASE);
|
VirtualFree(K2_SetWorldTransformParams, 0, MEM_RELEASE);
|
||||||
|
|
||||||
struct { FVector NewVel; bool bAddToCurrent; FName BoneName; }
|
struct { FVector NewVel; bool bAddToCurrent; FName BoneName; }
|
||||||
UPrimitiveComponent_SetPhysicsLinearVelocity_Params{
|
UPrimitiveComponent_SetPhysicsLinearVelocity_Params{
|
||||||
|
|||||||
Reference in New Issue
Block a user