mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 10:52:22 +01:00
spectaterrrr
This commit is contained in:
@@ -9,7 +9,7 @@ struct FGameplayEffectApplicationInfoHard
|
|||||||
public:
|
public:
|
||||||
static UStruct* GetStruct()
|
static UStruct* GetStruct()
|
||||||
{
|
{
|
||||||
static auto GameplayEffectApplicationInfoHardStruct = FindObject<UStruct>("/Script/FortniteGame.GameplayEffectApplicationInfoHard");
|
static auto GameplayEffectApplicationInfoHardStruct = FindObject<UStruct>(L"/Script/FortniteGame.GameplayEffectApplicationInfoHard");
|
||||||
return GameplayEffectApplicationInfoHardStruct;
|
return GameplayEffectApplicationInfoHardStruct;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ public:
|
|||||||
|
|
||||||
auto GrantedGameplayEffects = GetGrantedGameplayEffects();
|
auto GrantedGameplayEffects = GetGrantedGameplayEffects();
|
||||||
|
|
||||||
for (int i = 0; i < GrantedGameplayEffects->Num(); i++)
|
for (int i = 0; i < GrantedGameplayEffects->Num(); ++i)
|
||||||
{
|
{
|
||||||
auto& EffectToGrant = GrantedGameplayEffects->at(i, FGameplayEffectApplicationInfoHard::GetStructSize());
|
auto& EffectToGrant = GrantedGameplayEffects->at(i, FGameplayEffectApplicationInfoHard::GetStructSize());
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ public:
|
|||||||
{
|
{
|
||||||
auto GameplayAbilities = GetGameplayAbilities();
|
auto GameplayAbilities = GetGameplayAbilities();
|
||||||
|
|
||||||
for (int i = 0; i < GameplayAbilities->Num(); i++)
|
for (int i = 0; i < GameplayAbilities->Num(); ++i)
|
||||||
{
|
{
|
||||||
UClass* AbilityClass = GameplayAbilities->At(i);
|
UClass* AbilityClass = GameplayAbilities->At(i);
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ public:
|
|||||||
|
|
||||||
static UClass* StaticClass()
|
static UClass* StaticClass()
|
||||||
{
|
{
|
||||||
static auto Class = FindObject<UClass>("/Script/FortniteGame.FortAbilitySet");
|
static auto Class = FindObject<UClass>(L"/Script/FortniteGame.FortAbilitySet");
|
||||||
return Class;
|
return Class;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1122,13 +1122,15 @@ void AFortPlayerController::ServerPlayEmoteItemHook(AFortPlayerController* Playe
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
UObject* AbilityToUse = nullptr;
|
UObject* AbilityToUse = nullptr;
|
||||||
|
bool bShouldBeAbilityToUse = false;
|
||||||
|
|
||||||
static auto AthenaSprayItemDefinitionClass = FindObject<UClass>(L"/Script/FortniteGame.AthenaSprayItemDefinition");
|
static auto AthenaSprayItemDefinitionClass = FindObject<UClass>(L"/Script/FortniteGame.AthenaSprayItemDefinition");
|
||||||
static auto AthenaToyItemDefinitionClass = FindObject<UClass>(L"/Script/FortniteGame.AthenaToyItemDefinition");
|
static auto AthenaToyItemDefinitionClass = FindObject<UClass>(L"/Script/FortniteGame.AthenaToyItemDefinition");
|
||||||
|
static auto BGAClass = FindObject<UClass>(L"/Script/Engine.BlueprintGeneratedClass");
|
||||||
|
|
||||||
if (EmoteAsset->IsA(AthenaSprayItemDefinitionClass))
|
if (EmoteAsset->IsA(AthenaSprayItemDefinitionClass))
|
||||||
{
|
{
|
||||||
static auto SprayGameplayAbilityDefault = FindObject(L"/Game/Abilities/Sprays/GAB_Spray_Generic.Default__GAB_Spray_Generic_C");
|
auto SprayGameplayAbilityDefault = FindObject(L"/Game/Abilities/Sprays/GAB_Spray_Generic.Default__GAB_Spray_Generic_C");
|
||||||
AbilityToUse = SprayGameplayAbilityDefault;
|
AbilityToUse = SprayGameplayAbilityDefault;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1137,8 +1139,6 @@ void AFortPlayerController::ServerPlayEmoteItemHook(AFortPlayerController* Playe
|
|||||||
static auto ToySpawnAbilityOffset = EmoteAsset->GetOffset("ToySpawnAbility");
|
static auto ToySpawnAbilityOffset = EmoteAsset->GetOffset("ToySpawnAbility");
|
||||||
auto& ToySpawnAbilitySoft = EmoteAsset->Get<TSoftObjectPtr<UClass>>(ToySpawnAbilityOffset);
|
auto& ToySpawnAbilitySoft = EmoteAsset->Get<TSoftObjectPtr<UClass>>(ToySpawnAbilityOffset);
|
||||||
|
|
||||||
static auto BGAClass = FindObject<UClass>(L"/Script/Engine.BlueprintGeneratedClass");
|
|
||||||
|
|
||||||
auto ToySpawnAbility = ToySpawnAbilitySoft.Get(BGAClass, true);
|
auto ToySpawnAbility = ToySpawnAbilitySoft.Get(BGAClass, true);
|
||||||
|
|
||||||
if (ToySpawnAbility)
|
if (ToySpawnAbility)
|
||||||
@@ -1204,6 +1204,11 @@ void AFortPlayerController::ServerPlayEmoteItemHook(AFortPlayerController* Playe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AFortPlayerController::ServerPlaySprayItemHook(AFortPlayerController* PlayerController, UAthenaSprayItemDefinition* SprayAsset)
|
||||||
|
{
|
||||||
|
PlayerController->ServerPlayEmoteItemHook(PlayerController, SprayAsset);
|
||||||
|
}
|
||||||
|
|
||||||
uint8 ToDeathCause(const FGameplayTagContainer& TagContainer, bool bWasDBNO = false, AFortPawn* Pawn = nullptr)
|
uint8 ToDeathCause(const FGameplayTagContainer& TagContainer, bool bWasDBNO = false, AFortPawn* Pawn = nullptr)
|
||||||
{
|
{
|
||||||
static auto ToDeathCauseFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerStateAthena.ToDeathCause");
|
static auto ToDeathCauseFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerStateAthena.ToDeathCause");
|
||||||
@@ -1259,27 +1264,6 @@ uint8 ToDeathCause(const FGameplayTagContainer& TagContainer, bool bWasDBNO = fa
|
|||||||
return sub_7FF7AB499410(TagContainer, bWasDBNO);
|
return sub_7FF7AB499410(TagContainer, bWasDBNO);
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD WINAPI SpectateThread(LPVOID PC)
|
|
||||||
{
|
|
||||||
auto PlayerController = (UObject*)PC;
|
|
||||||
|
|
||||||
if (!PlayerController->IsValidLowLevel())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
auto SpectatingPC = Cast<AFortPlayerControllerAthena>(PlayerController);
|
|
||||||
|
|
||||||
if (!SpectatingPC)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
Sleep(3000);
|
|
||||||
|
|
||||||
LOG_INFO(LogDev, "Spectate!");
|
|
||||||
|
|
||||||
SpectatingPC->SpectateOnDeath();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD WINAPI RestartThread(LPVOID)
|
DWORD WINAPI RestartThread(LPVOID)
|
||||||
{
|
{
|
||||||
// We should probably use unreal engine's timing system for this.
|
// We should probably use unreal engine's timing system for this.
|
||||||
@@ -1602,13 +1586,13 @@ void AFortPlayerController::ClientOnPawnDiedHook(AFortPlayerController* PlayerCo
|
|||||||
|
|
||||||
// LOG_INFO(LogDev, "KillerPlayerState->Place: {}", KillerPlayerState ? KillerPlayerState->GetPlace() : -1);
|
// LOG_INFO(LogDev, "KillerPlayerState->Place: {}", KillerPlayerState ? KillerPlayerState->GetPlace() : -1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (Fortnite_Version < 6) // Spectating (is this the actual build or is it like 6.10 when they added it auto).
|
if (Fortnite_Version < 6) // Spectating (is this the actual build or is it like 6.10 when they added it auto).
|
||||||
{
|
{
|
||||||
if (GameState->GetGamePhase() > EAthenaGamePhase::Warmup)
|
if (GameState->GetGamePhase() > EAthenaGamePhase::Warmup)
|
||||||
{
|
{
|
||||||
static auto bAllowSpectateAfterDeathOffset = GameMode->GetOffset("bAllowSpectateAfterDeath");
|
static auto bAllowSpectateAfterDeathOffset = GameMode->GetOffset("bAllowSpectateAfterDeath");
|
||||||
|
|
||||||
bool bAllowSpectate = GameMode->Get<bool>(bAllowSpectateAfterDeathOffset);
|
bool bAllowSpectate = GameMode->Get<bool>(bAllowSpectateAfterDeathOffset);
|
||||||
|
|
||||||
LOG_INFO(LogDev, "bAllowSpectate: {}", bAllowSpectate);
|
LOG_INFO(LogDev, "bAllowSpectate: {}", bAllowSpectate);
|
||||||
@@ -1620,8 +1604,7 @@ void AFortPlayerController::ClientOnPawnDiedHook(AFortPlayerController* PlayerCo
|
|||||||
static auto PlayerToSpectateOnDeathOffset = PlayerController->GetOffset("PlayerToSpectateOnDeath");
|
static auto PlayerToSpectateOnDeathOffset = PlayerController->GetOffset("PlayerToSpectateOnDeath");
|
||||||
PlayerController->Get<APawn*>(PlayerToSpectateOnDeathOffset) = KillerPawn;
|
PlayerController->Get<APawn*>(PlayerToSpectateOnDeathOffset) = KillerPawn;
|
||||||
|
|
||||||
CreateThread(0, 0, SpectateThread, (LPVOID)PlayerController, 0, 0);
|
UKismetSystemLibrary::K2_SetTimer(PlayerController, L"SpectateOnDeath", 5.f, false); // Soo proper its scary
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,6 +89,8 @@ enum class EInteractionBeingAttempted : uint8
|
|||||||
EInteractionBeingAttempted_MAX = 3,
|
EInteractionBeingAttempted_MAX = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using UAthenaSprayItemDefinition = UObject;
|
||||||
|
|
||||||
class AFortPlayerController : public APlayerController
|
class AFortPlayerController : public APlayerController
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -210,6 +212,7 @@ public:
|
|||||||
static void ServerDropAllItemsHook(AFortPlayerController* PlayerController, UFortItemDefinition* IgnoreItemDef);
|
static void ServerDropAllItemsHook(AFortPlayerController* PlayerController, UFortItemDefinition* IgnoreItemDef);
|
||||||
|
|
||||||
static void ServerAttemptInventoryDropHook(AFortPlayerController* PlayerController, FGuid ItemGuid, int Count);
|
static void ServerAttemptInventoryDropHook(AFortPlayerController* PlayerController, FGuid ItemGuid, int Count);
|
||||||
|
static void ServerPlaySprayItemHook(AFortPlayerController* PlayerController, UAthenaSprayItemDefinition* SprayAsset);
|
||||||
static void ServerPlayEmoteItemHook(AFortPlayerController* PlayerController, UObject* EmoteAsset);
|
static void ServerPlayEmoteItemHook(AFortPlayerController* PlayerController, UObject* EmoteAsset);
|
||||||
static void ClientOnPawnDiedHook(AFortPlayerController* PlayerController, void* DeathReport);
|
static void ClientOnPawnDiedHook(AFortPlayerController* PlayerController, void* DeathReport);
|
||||||
|
|
||||||
|
|||||||
@@ -106,6 +106,24 @@ public:
|
|||||||
KismetSystemLibrary->ProcessEvent(fn, &UKismetSystemLibrary_ExecuteConsoleCommand_Params);
|
KismetSystemLibrary->ProcessEvent(fn, &UKismetSystemLibrary_ExecuteConsoleCommand_Params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FTimerHandle K2_SetTimer(UObject* Object, FString FunctionName, float Time, bool bLooping)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
UObject* Object;
|
||||||
|
FString FunctionName;
|
||||||
|
float Time;
|
||||||
|
bool bLooping;
|
||||||
|
FTimerHandle ret;
|
||||||
|
} K2_SetTimer_Params{Object, FunctionName, Time, bLooping};
|
||||||
|
|
||||||
|
static auto KismetSystemLibrary = FindObject("/Script/Engine.Default__KismetSystemLibrary");
|
||||||
|
static auto K2_SetTimerFn = FindObject<UFunction>("/Script/Engine.KismetSystemLibrary.K2_SetTimer");
|
||||||
|
|
||||||
|
KismetSystemLibrary->ProcessEvent(K2_SetTimerFn, &K2_SetTimer_Params);
|
||||||
|
|
||||||
|
return K2_SetTimer_Params.ret;
|
||||||
|
}
|
||||||
|
|
||||||
static bool LineTraceSingle(UObject* WorldContextObject, FVector Start, FVector End, ETraceTypeQuery TraceChannel, bool bTraceComplex,
|
static bool LineTraceSingle(UObject* WorldContextObject, FVector Start, FVector End, ETraceTypeQuery TraceChannel, bool bTraceComplex,
|
||||||
TArray<AActor*> ActorsToIgnore, EDrawDebugTrace DrawDebugType, bool bIgnoreSelf, FLinearColor TraceColor, FLinearColor TraceHitColor,
|
TArray<AActor*> ActorsToIgnore, EDrawDebugTrace DrawDebugType, bool bIgnoreSelf, FLinearColor TraceColor, FLinearColor TraceHitColor,
|
||||||
float DrawTime, FHitResult** OutHit)
|
float DrawTime, FHitResult** OutHit)
|
||||||
|
|||||||
@@ -79,8 +79,6 @@ void UWorld::Listen()
|
|||||||
|
|
||||||
FString Error;
|
FString Error;
|
||||||
|
|
||||||
LOG_INFO(LogNet, "Calling InitListen!");
|
|
||||||
|
|
||||||
AWorldSettings* WorldSettings = GetWorldSettings();
|
AWorldSettings* WorldSettings = GetWorldSettings();
|
||||||
const bool bReuseAddressAndPort = false; // WorldSettings ? WorldSettings->bReuseAddressAndPort : false;
|
const bool bReuseAddressAndPort = false; // WorldSettings ? WorldSettings->bReuseAddressAndPort : false;
|
||||||
|
|
||||||
@@ -90,8 +88,6 @@ void UWorld::Listen()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO(LogNet, "Called InitListen!");
|
|
||||||
|
|
||||||
const bool bLanSpeed = false;
|
const bool bLanSpeed = false;
|
||||||
|
|
||||||
if (!bLanSpeed && (NewNetDriver->GetMaxInternetClientRate() < NewNetDriver->GetMaxClientRate()) && (NewNetDriver->GetMaxInternetClientRate() > 2500))
|
if (!bLanSpeed && (NewNetDriver->GetMaxInternetClientRate() < NewNetDriver->GetMaxClientRate()) && (NewNetDriver->GetMaxInternetClientRate() > 2500))
|
||||||
|
|||||||
@@ -1265,6 +1265,8 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
AFortPlayerController::ServerExecuteInventoryItemHook, nullptr, false);
|
AFortPlayerController::ServerExecuteInventoryItemHook, nullptr, false);
|
||||||
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerController.ServerPlayEmoteItem"),
|
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerController.ServerPlayEmoteItem"),
|
||||||
AFortPlayerController::ServerPlayEmoteItemHook, nullptr, false);
|
AFortPlayerController::ServerPlayEmoteItemHook, nullptr, false);
|
||||||
|
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerController.ServerPlaySprayItem"),
|
||||||
|
AFortPlayerController::ServerPlaySprayItemHook, nullptr, false); // S4 explain yourself
|
||||||
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerController.ServerRepairBuildingActor"),
|
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerController.ServerRepairBuildingActor"),
|
||||||
AFortPlayerController::ServerRepairBuildingActorHook, nullptr, false);
|
AFortPlayerController::ServerRepairBuildingActorHook, nullptr, false);
|
||||||
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerController.ServerCreateBuildingActor"),
|
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerController.ServerCreateBuildingActor"),
|
||||||
|
|||||||
@@ -95,9 +95,12 @@ uint64 FindGIsClient()
|
|||||||
|
|
||||||
if (bIsScuffedByte)
|
if (bIsScuffedByte)
|
||||||
{
|
{
|
||||||
if (Bytes[2] == 0x74) // DIE 4.5 (todo check length of entire instruction)
|
if (*(Memcury::ASM::MNEMONIC*)(Addr.Get() - i + 2) == 0x74) // DIE 4.5 (todo check length of entire instruction)
|
||||||
|
{
|
||||||
|
LOG_INFO(LogDev, "Found broken byte, skipping!");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!PickedByte)
|
if (!PickedByte)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user