mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 02:42:22 +01:00
reviving
This commit is contained in:
@@ -15,9 +15,21 @@ struct PadHexB0 { char Pad[0xB0]; };
|
|||||||
// using FPredictionKey = PadHex10;
|
// using FPredictionKey = PadHex10;
|
||||||
using FGameplayEventData = PadHexB0;
|
using FGameplayEventData = PadHexB0;
|
||||||
|
|
||||||
using FPredictionKey = __int64;
|
|
||||||
// using FGameplayEventData = __int64;
|
// using FGameplayEventData = __int64;
|
||||||
|
|
||||||
|
struct FPredictionKey // todo move
|
||||||
|
{
|
||||||
|
// __int64 real;
|
||||||
|
|
||||||
|
static UStruct* GetStruct()
|
||||||
|
{
|
||||||
|
static auto Struct = FindObject<UStruct>("/Script/GameplayAbilities.PredictionKey");
|
||||||
|
return Struct;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
||||||
|
};
|
||||||
|
|
||||||
struct FGameplayEffectContextHandle
|
struct FGameplayEffectContextHandle
|
||||||
{
|
{
|
||||||
unsigned char UnknownData00[0x18]; // 0x0000(0x0018) MISSED OFFSET
|
unsigned char UnknownData00[0x18]; // 0x0000(0x0018) MISSED OFFSET
|
||||||
@@ -72,6 +84,9 @@ public:
|
|||||||
return Subobject;
|
return Subobject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ServerEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo, FPredictionKey* PredictionKey);
|
||||||
|
void ClientEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo);
|
||||||
|
void ClientCancelAbility(FGameplayAbilitySpecHandle AbilityToCancel, FGameplayAbilityActivationInfo* ActivationInfo);
|
||||||
bool HasAbility(UObject* DefaultAbility);
|
bool HasAbility(UObject* DefaultAbility);
|
||||||
FActiveGameplayEffectHandle ApplyGameplayEffectToSelf(UClass* GameplayEffectClass, float Level, const FGameplayEffectContextHandle& EffectContext = FGameplayEffectContextHandle());
|
FActiveGameplayEffectHandle ApplyGameplayEffectToSelf(UClass* GameplayEffectClass, float Level, const FGameplayEffectContextHandle& EffectContext = FGameplayEffectContextHandle());
|
||||||
// FGameplayEffectContextHandle MakeEffectContext();
|
// FGameplayEffectContextHandle MakeEffectContext();
|
||||||
@@ -84,3 +99,5 @@ public:
|
|||||||
|
|
||||||
static void InternalServerTryActivateAbilityHook(UAbilitySystemComponent* AbilitySystemComponent, FGameplayAbilitySpecHandle Handle, bool InputPressed, const FPredictionKey* PredictionKey, const FGameplayEventData* TriggerEventData);
|
static void InternalServerTryActivateAbilityHook(UAbilitySystemComponent* AbilitySystemComponent, FGameplayAbilitySpecHandle Handle, bool InputPressed, const FPredictionKey* PredictionKey, const FGameplayEventData* TriggerEventData);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void LoopSpecs(UAbilitySystemComponent* AbilitySystemComponent, std::function<void(FGameplayAbilitySpec*)> func);
|
||||||
@@ -50,6 +50,56 @@ FActiveGameplayEffectHandle UAbilitySystemComponent::ApplyGameplayEffectToSelf(U
|
|||||||
return ContextHandle;
|
return ContextHandle;
|
||||||
} */
|
} */
|
||||||
|
|
||||||
|
void UAbilitySystemComponent::ServerEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo, FPredictionKey* PredictionKey)
|
||||||
|
{
|
||||||
|
static auto ServerEndAbilityFn = FindObject<UFunction>(L"/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility");
|
||||||
|
|
||||||
|
auto Params = Alloc<void>(ServerEndAbilityFn->GetPropertiesSize());
|
||||||
|
|
||||||
|
if (!Params)
|
||||||
|
return;
|
||||||
|
|
||||||
|
static auto AbilityToEndOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility", "AbilityToEnd");
|
||||||
|
static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility", "ActivationInfo");
|
||||||
|
static auto PredictionKeyOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility", "PredictionKey");
|
||||||
|
|
||||||
|
*(FGameplayAbilitySpecHandle*)(__int64(Params) + AbilityToEndOffset) = AbilityToEnd;
|
||||||
|
CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize());
|
||||||
|
CopyStruct((FPredictionKey*)(__int64(Params) + PredictionKeyOffset), PredictionKey, FPredictionKey::GetStructSize());
|
||||||
|
|
||||||
|
this->ProcessEvent(ServerEndAbilityFn, Params);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UAbilitySystemComponent::ClientEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo)
|
||||||
|
{
|
||||||
|
static auto ClientEndAbilityFn = FindObject<UFunction>("/Script/GameplayAbilities.AbilitySystemComponent.ClientEndAbility");
|
||||||
|
|
||||||
|
auto Params = Alloc(ClientEndAbilityFn->GetPropertiesSize());
|
||||||
|
|
||||||
|
static auto AbilityToEndOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientEndAbility", "AbilityToEnd");
|
||||||
|
static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientEndAbility", "ActivationInfo");
|
||||||
|
|
||||||
|
*(FGameplayAbilitySpecHandle*)(__int64(Params) + AbilityToEndOffset) = AbilityToEnd;
|
||||||
|
CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize());
|
||||||
|
|
||||||
|
this->ProcessEvent(ClientEndAbilityFn, Params);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UAbilitySystemComponent::ClientCancelAbility(FGameplayAbilitySpecHandle AbilityToCancel, FGameplayAbilityActivationInfo* ActivationInfo)
|
||||||
|
{
|
||||||
|
static auto ClientCancelAbilityFn = FindObject<UFunction>(L"/Script/GameplayAbilities.AbilitySystemComponent.ClientCancelAbility");
|
||||||
|
|
||||||
|
auto Params = Alloc(ClientCancelAbilityFn->GetPropertiesSize());
|
||||||
|
|
||||||
|
static auto AbilityToCancelOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientCancelAbility", "AbilityToCancel");
|
||||||
|
static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientCancelAbility", "ActivationInfo");
|
||||||
|
|
||||||
|
*(FGameplayAbilitySpecHandle*)(__int64(Params) + AbilityToCancelOffset) = AbilityToCancel;
|
||||||
|
CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize());
|
||||||
|
|
||||||
|
this->ProcessEvent(ClientCancelAbilityFn, Params);
|
||||||
|
}
|
||||||
|
|
||||||
bool UAbilitySystemComponent::HasAbility(UObject* DefaultAbility)
|
bool UAbilitySystemComponent::HasAbility(UObject* DefaultAbility)
|
||||||
{
|
{
|
||||||
auto ActivatableAbilities = GetActivatableAbilities();
|
auto ActivatableAbilities = GetActivatableAbilities();
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ bool ABuildingContainer::SpawnLoot(AFortPawn* Pawn)
|
|||||||
{
|
{
|
||||||
auto& lootDrop = LootDrops.at(i);
|
auto& lootDrop = LootDrops.at(i);
|
||||||
|
|
||||||
PickupCreateData CreateData{};
|
PickupCreateData CreateData;
|
||||||
CreateData.bToss = true;
|
CreateData.bToss = true;
|
||||||
// CreateData.PawnOwner = Pawn;
|
// CreateData.PawnOwner = Pawn;
|
||||||
CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(lootDrop->GetItemDefinition(), lootDrop->GetCount(), lootDrop->GetLoadedAmmo());
|
CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(lootDrop->GetItemDefinition(), lootDrop->GetCount(), lootDrop->GetLoadedAmmo());
|
||||||
|
|||||||
@@ -1129,7 +1129,7 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
|
|
||||||
for (auto& LootDrop : LootDrops)
|
for (auto& LootDrop : LootDrops)
|
||||||
{
|
{
|
||||||
PickupCreateData CreateData{};
|
PickupCreateData CreateData;
|
||||||
CreateData.bToss = true;
|
CreateData.bToss = true;
|
||||||
CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(LootDrop->GetItemDefinition(), LootDrop->GetCount(), LootDrop->GetLoadedAmmo());
|
CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(LootDrop->GetItemDefinition(), LootDrop->GetCount(), LootDrop->GetLoadedAmmo());
|
||||||
CreateData.SpawnLocation = Location;
|
CreateData.SpawnLocation = Location;
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ void UFortKismetLibrary::SpawnItemVariantPickupInWorldHook(UObject* Context, FFr
|
|||||||
|
|
||||||
LOG_INFO(LogDev, "{} {} {}", Position.X, Position.Y, Position.Z);
|
LOG_INFO(LogDev, "{} {} {}", Position.X, Position.Y, Position.Z);
|
||||||
|
|
||||||
PickupCreateData CreateData{};
|
PickupCreateData CreateData;
|
||||||
CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, ParamsPtr->GetNumberToSpawn(), -1);
|
CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, ParamsPtr->GetNumberToSpawn(), -1);
|
||||||
CreateData.SourceType = ParamsPtr->GetSourceType();
|
CreateData.SourceType = ParamsPtr->GetSourceType();
|
||||||
CreateData.Source = ParamsPtr->GetSource();
|
CreateData.Source = ParamsPtr->GetSource();
|
||||||
@@ -508,7 +508,7 @@ AFortPickup* UFortKismetLibrary::K2_SpawnPickupInWorldWithClassHook(UObject* Con
|
|||||||
|
|
||||||
LOG_INFO(LogDev, __FUNCTION__);
|
LOG_INFO(LogDev, __FUNCTION__);
|
||||||
|
|
||||||
PickupCreateData CreateData{};
|
PickupCreateData CreateData;
|
||||||
CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, NumberToSpawn, -1);
|
CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, NumberToSpawn, -1);
|
||||||
CreateData.Source = Source;
|
CreateData.Source = Source;
|
||||||
CreateData.SourceType = SourceType;
|
CreateData.SourceType = SourceType;
|
||||||
@@ -591,7 +591,7 @@ AFortPickup* UFortKismetLibrary::K2_SpawnPickupInWorldHook(UObject* Context, FFr
|
|||||||
|
|
||||||
auto Pawn = OptionalOwnerPC ? OptionalOwnerPC->GetMyFortPawn() : nullptr;
|
auto Pawn = OptionalOwnerPC ? OptionalOwnerPC->GetMyFortPawn() : nullptr;
|
||||||
|
|
||||||
PickupCreateData CreateData{};
|
PickupCreateData CreateData;
|
||||||
CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, NumberToSpawn, -1);
|
CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, NumberToSpawn, -1);
|
||||||
CreateData.SpawnLocation = Position;
|
CreateData.SpawnLocation = Position;
|
||||||
CreateData.bToss = bToss;
|
CreateData.bToss = bToss;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
AFortWeapon* AFortPawn::EquipWeaponDefinition(UFortWeaponItemDefinition* WeaponData, const FGuid& ItemEntryGuid)
|
AFortWeapon* AFortPawn::EquipWeaponDefinition(UFortWeaponItemDefinition* WeaponData, const FGuid& ItemEntryGuid)
|
||||||
{
|
{
|
||||||
static auto EquipWeaponDefinitionFn = FindObject<UFunction>("/Script/FortniteGame.FortPawn.EquipWeaponDefinition");
|
static auto EquipWeaponDefinitionFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPawn.EquipWeaponDefinition");
|
||||||
|
|
||||||
FGuid TrackerGuid{};
|
FGuid TrackerGuid{};
|
||||||
|
|
||||||
@@ -40,6 +40,12 @@ bool AFortPawn::PickUpActor(AActor* PickupTarget, UFortDecoItemDefinition* Place
|
|||||||
return AFortPawn_PickUpActor_Params.ReturnValue;
|
return AFortPawn_PickUpActor_Params.ReturnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AFortPawn::OnRep_IsDBNO()
|
||||||
|
{
|
||||||
|
static auto OnRep_IsDBNOFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPawn.OnRep_IsDBNO");
|
||||||
|
this->ProcessEvent(OnRep_IsDBNOFn);
|
||||||
|
}
|
||||||
|
|
||||||
float AFortPawn::GetShield()
|
float AFortPawn::GetShield()
|
||||||
{
|
{
|
||||||
float Shield = 0;
|
float Shield = 0;
|
||||||
|
|||||||
@@ -27,6 +27,23 @@ public:
|
|||||||
return ReadBitfieldValue(bIsDBNOOffset, bIsDBNOFieldMask);
|
return ReadBitfieldValue(bIsDBNOOffset, bIsDBNOFieldMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetDBNO(bool IsDBNO)
|
||||||
|
{
|
||||||
|
static auto bIsDBNOFieldMask = GetFieldMask(GetProperty("bIsDBNO"));
|
||||||
|
static auto bIsDBNOOffset = GetOffset("bIsDBNO");
|
||||||
|
|
||||||
|
this->SetBitfieldValue(bIsDBNOOffset, bIsDBNOFieldMask, IsDBNO);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetHasPlayedDying(bool NewValue)
|
||||||
|
{
|
||||||
|
static auto bPlayedDyingFieldMask = GetFieldMask(GetProperty("bPlayedDying"));
|
||||||
|
static auto bPlayedDyingOffset = GetOffset("bPlayedDying");
|
||||||
|
|
||||||
|
this->SetBitfieldValue(bPlayedDyingOffset, bPlayedDyingFieldMask, NewValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnRep_IsDBNO();
|
||||||
float GetShield();
|
float GetShield();
|
||||||
float GetHealth();
|
float GetHealth();
|
||||||
void SetHealth(float NewHealth);
|
void SetHealth(float NewHealth);
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ AFortPickup* AFortPickup::SpawnPickup(PickupCreateData& PickupData)
|
|||||||
} */
|
} */
|
||||||
|
|
||||||
static auto FortPickupAthenaClass = FindObject<UClass>(L"/Script/FortniteGame.FortPickupAthena");
|
static auto FortPickupAthenaClass = FindObject<UClass>(L"/Script/FortniteGame.FortPickupAthena");
|
||||||
auto PlayerState = PickupData.PawnOwner->IsValidLowLevel() ? Cast<AFortPlayerState>(PickupData.PawnOwner->GetPlayerState()) : nullptr;
|
auto PlayerState = PickupData.PawnOwner ? Cast<AFortPlayerState>(PickupData.PawnOwner->GetPlayerState()) : nullptr;
|
||||||
|
|
||||||
FActorSpawnParameters SpawnParameters{};
|
FActorSpawnParameters SpawnParameters{};
|
||||||
// SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
|
// SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
|
||||||
|
|||||||
@@ -197,6 +197,12 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientOnPawnRevived(AController* EventInstigator)
|
||||||
|
{
|
||||||
|
static auto ClientOnPawnRevivedFn = FindObject<UFunction>("/Script/FortniteGame.FortPlayerControllerZone.ClientOnPawnRevived");
|
||||||
|
this->ProcessEvent(ClientOnPawnRevivedFn, &EventInstigator);
|
||||||
|
}
|
||||||
|
|
||||||
bool& IsMarkedAlive()
|
bool& IsMarkedAlive()
|
||||||
{
|
{
|
||||||
static auto bMarkedAliveOffset = GetOffset("bMarkedAlive");
|
static auto bMarkedAliveOffset = GetOffset("bMarkedAlive");
|
||||||
|
|||||||
@@ -17,9 +17,97 @@ FFortAthenaLoadout* AFortPlayerPawn::GetCosmeticLoadout()
|
|||||||
return GetPtr<FFortAthenaLoadout>(CosmeticLoadoutOffset);
|
return GetPtr<FFortAthenaLoadout>(CosmeticLoadoutOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AFortPlayerPawn::ServerReviveFromDBNOHook(AController* EventInstigator)
|
bool DBNOCheck(AFortPlayerPawn* Pawn, AController* EventInstigator)
|
||||||
|
{
|
||||||
|
bool res = false;
|
||||||
|
|
||||||
|
if (Pawn->IsDBNO())
|
||||||
|
{
|
||||||
|
if (EventInstigator)
|
||||||
|
{
|
||||||
|
// idk what this does but this is my interpretation
|
||||||
|
|
||||||
|
auto PlayerState = Cast<AFortPlayerStateAthena>(Pawn->GetPlayerState());
|
||||||
|
auto InstigatorPlayerState = Cast<AFortPlayerStateAthena>(EventInstigator->GetPlayerState());
|
||||||
|
|
||||||
|
if (PlayerState && InstigatorPlayerState)
|
||||||
|
{
|
||||||
|
if (PlayerState->GetTeamIndex() == InstigatorPlayerState->GetTeamIndex())
|
||||||
|
{
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AFortPlayerPawn::ServerReviveFromDBNOHook(AFortPlayerPawn* Pawn, AController* EventInstigator)
|
||||||
{
|
{
|
||||||
LOG_INFO(LogDev, "ServerReviveFromDBNOHook!");
|
LOG_INFO(LogDev, "ServerReviveFromDBNOHook!");
|
||||||
|
|
||||||
|
if (!DBNOCheck(Pawn, EventInstigator))
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto PlayerController = Cast<AFortPlayerControllerAthena>(Pawn->GetController());
|
||||||
|
|
||||||
|
if (!PlayerController)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto PlayerState = Cast<AFortPlayerState>(PlayerController->GetPlayerState());
|
||||||
|
|
||||||
|
if (!PlayerState)
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool IsRevivingSelf = EventInstigator == PlayerController;
|
||||||
|
|
||||||
|
/*
|
||||||
|
UObject* ReviveGameplayEffect = nullptr;
|
||||||
|
|
||||||
|
if (IsRevivingSelf)
|
||||||
|
else
|
||||||
|
*/
|
||||||
|
|
||||||
|
static auto GAB_AthenaDBNOClass = FindObject<UClass>(L"/Game/Abilities/NPC/Generic/GAB_AthenaDBNO.Default__GAB_AthenaDBNO_C");
|
||||||
|
|
||||||
|
auto DBNOPawnASC = PlayerState->GetAbilitySystemComponent();
|
||||||
|
|
||||||
|
if (!DBNOPawnASC)
|
||||||
|
return;
|
||||||
|
|
||||||
|
FGameplayAbilitySpec* DBNOSpec = nullptr;
|
||||||
|
|
||||||
|
UObject* ClassToFind = GAB_AthenaDBNOClass->ClassPrivate;
|
||||||
|
|
||||||
|
auto compareAbilities = [&DBNOSpec, &ClassToFind](FGameplayAbilitySpec* Spec) {
|
||||||
|
auto CurrentAbility = Spec->GetAbility();
|
||||||
|
|
||||||
|
if (CurrentAbility->ClassPrivate == ClassToFind)
|
||||||
|
{
|
||||||
|
DBNOSpec = Spec;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
LoopSpecs(DBNOPawnASC, compareAbilities);
|
||||||
|
|
||||||
|
if (!DBNOSpec)
|
||||||
|
return;
|
||||||
|
|
||||||
|
DBNOPawnASC->ClientCancelAbility(DBNOSpec->GetHandle(), DBNOSpec->GetActivationInfo());
|
||||||
|
DBNOPawnASC->ClientEndAbility(DBNOSpec->GetHandle(), DBNOSpec->GetActivationInfo());
|
||||||
|
DBNOPawnASC->ServerEndAbility(DBNOSpec->GetHandle(), DBNOSpec->GetActivationInfo(), nullptr);
|
||||||
|
|
||||||
|
Pawn->SetDBNO(false);
|
||||||
|
Pawn->SetHasPlayedDying(false);
|
||||||
|
|
||||||
|
Pawn->SetHealth(30); // TODO Get value from SetByCallerReviveHealth?
|
||||||
|
|
||||||
|
Pawn->OnRep_IsDBNO();
|
||||||
|
|
||||||
|
PlayerController->ClientOnPawnRevived(EventInstigator); // We should call the function that calls this.
|
||||||
|
PlayerController->RespawnPlayerAfterDeath(false); // nooo
|
||||||
}
|
}
|
||||||
|
|
||||||
void AFortPlayerPawn::ServerHandlePickupWithRequestedSwapHook(UObject* Context, FFrame* Stack, void* Ret)
|
void AFortPlayerPawn::ServerHandlePickupWithRequestedSwapHook(UObject* Context, FFrame* Stack, void* Ret)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public:
|
|||||||
UFortWeaponItemDefinition* GetVehicleWeaponDefinition(AFortAthenaVehicle* Vehicle);
|
UFortWeaponItemDefinition* GetVehicleWeaponDefinition(AFortAthenaVehicle* Vehicle);
|
||||||
void UnEquipVehicleWeaponDefinition(UFortWeaponItemDefinition* VehicleWeaponDefinition);
|
void UnEquipVehicleWeaponDefinition(UFortWeaponItemDefinition* VehicleWeaponDefinition);
|
||||||
|
|
||||||
static void ServerReviveFromDBNOHook(AController* EventInstigator);
|
static void ServerReviveFromDBNOHook(AFortPlayerPawn* Pawn, AController* EventInstigator);
|
||||||
static void ServerHandlePickupWithRequestedSwapHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but idk
|
static void ServerHandlePickupWithRequestedSwapHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but idk
|
||||||
static void StartGhostModeExitHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but eh
|
static void StartGhostModeExitHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but eh
|
||||||
static AActor* ServerOnExitVehicleHook(AFortPlayerPawn* Pawn, ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle
|
static AActor* ServerOnExitVehicleHook(AFortPlayerPawn* Pawn, ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle
|
||||||
|
|||||||
@@ -23,6 +23,17 @@ struct FGameplayAbilitySpecHandle
|
|||||||
} */
|
} */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct FGameplayAbilityActivationInfo // TODO Move
|
||||||
|
{
|
||||||
|
static UStruct* GetStruct()
|
||||||
|
{
|
||||||
|
static auto Struct = FindObject<UStruct>("/Script/GameplayAbilities.GameplayAbilityActivationInfo");
|
||||||
|
return Struct;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
||||||
|
};
|
||||||
|
|
||||||
struct FGameplayAbilitySpec : FFastArraySerializerItem
|
struct FGameplayAbilitySpec : FFastArraySerializerItem
|
||||||
{
|
{
|
||||||
static int GetStructSize()
|
static int GetStructSize()
|
||||||
@@ -45,6 +56,12 @@ struct FGameplayAbilitySpec : FFastArraySerializerItem
|
|||||||
static auto HandleOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "Handle");
|
static auto HandleOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "Handle");
|
||||||
return *(FGameplayAbilitySpecHandle*)(__int64(this) + HandleOffset);
|
return *(FGameplayAbilitySpecHandle*)(__int64(this) + HandleOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FGameplayAbilityActivationInfo* GetActivationInfo()
|
||||||
|
{
|
||||||
|
static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "ActivationInfo");
|
||||||
|
return (FGameplayAbilityActivationInfo*)(__int64(this) + ActivationInfoOffset);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static FGameplayAbilitySpec* MakeNewSpec(UClass* GameplayAbilityClass, UObject* SourceObject = nullptr, bool bAlreadyIsDefault = false)
|
static FGameplayAbilitySpec* MakeNewSpec(UClass* GameplayAbilityClass, UObject* SourceObject = nullptr, bool bAlreadyIsDefault = false)
|
||||||
|
|||||||
@@ -208,15 +208,15 @@ void UObject::AddToRoot()
|
|||||||
|
|
||||||
bool UObject::IsValidLowLevel()
|
bool UObject::IsValidLowLevel()
|
||||||
{
|
{
|
||||||
if (std::floor(Fortnite_Version) == 5) // real 1:1
|
if (std::floor(Fortnite_Version) == 5) // real 1:1 // todo (milxnor) try without this
|
||||||
return true;
|
return !IsBadReadPtr(this, 8);
|
||||||
|
|
||||||
if (this == nullptr)
|
if (this == nullptr)
|
||||||
{
|
{
|
||||||
// UE_LOG(LogUObjectBase, Warning, TEXT("NULL object"));
|
// UE_LOG(LogUObjectBase, Warning, TEXT("NULL object"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (IsBadReadPtr(this, 8)) // needed?
|
if (IsBadReadPtr(this, 8)) // needed? (milxnor)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -291,7 +291,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");
|
||||||
static auto FortPlayerControllerZoneDefault = FindObject<AFortPlayerController>(L"/Script/FortniteGame.Default__FortPlayerControllerZone");
|
static auto FortPlayerControllerZoneDefault = FindObject<AFortPlayerController>(L"/Script/FortniteGame.Default__FortPlayerControllerZone");
|
||||||
|
|||||||
@@ -278,15 +278,12 @@ static inline void StaticUI()
|
|||||||
{
|
{
|
||||||
// ImGui::Checkbox("Auto Restart", &Globals::bAutoRestart);
|
// ImGui::Checkbox("Auto Restart", &Globals::bAutoRestart);
|
||||||
|
|
||||||
if (false)
|
|
||||||
{
|
|
||||||
if (Globals::bAutoRestart)
|
if (Globals::bAutoRestart)
|
||||||
{
|
{
|
||||||
ImGui::InputFloat(std::format("How long after {} players join the bus will start", NumRequiredPlayersToStart).c_str(), &AutoBusStartSeconds);
|
ImGui::InputFloat(std::format("How long after {} players join the bus will start", NumRequiredPlayersToStart).c_str(), &AutoBusStartSeconds);
|
||||||
ImGui::InputInt("Num Players required for bus auto timer", &NumRequiredPlayersToStart);
|
ImGui::InputInt("Num Players required for bus auto timer", &NumRequiredPlayersToStart);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::InputInt("Shield/Health for siphon", &AmountOfHealthSiphon);
|
ImGui::InputInt("Shield/Health for siphon", &AmountOfHealthSiphon);
|
||||||
|
|
||||||
|
|||||||
@@ -371,6 +371,9 @@ inline int FindOffsetStruct(const std::string& StructName, const std::string& Me
|
|||||||
// template <typename T>
|
// template <typename T>
|
||||||
static void CopyStruct(void* Dest, void* Src, size_t Size, UStruct* Struct = nullptr)
|
static void CopyStruct(void* Dest, void* Src, size_t Size, UStruct* Struct = nullptr)
|
||||||
{
|
{
|
||||||
|
if (!Src)
|
||||||
|
return;
|
||||||
|
|
||||||
memcpy_s(Dest, Size, Src, Size);
|
memcpy_s(Dest, Size, Src, Size);
|
||||||
|
|
||||||
if (Struct)
|
if (Struct)
|
||||||
@@ -394,7 +397,9 @@ public:
|
|||||||
template <typename T = __int64>
|
template <typename T = __int64>
|
||||||
static T* Alloc(size_t Size = sizeof(T), bool bUseFMemoryRealloc = false)
|
static T* Alloc(size_t Size = sizeof(T), bool bUseFMemoryRealloc = false)
|
||||||
{
|
{
|
||||||
return bUseFMemoryRealloc ? (T*)FMemory::Realloc(0, Size, 0) : (T*)VirtualAlloc(0, Size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
auto mem = bUseFMemoryRealloc ? (T*)FMemory::Realloc(0, Size, 0) : (T*)VirtualAlloc(0, Size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
||||||
|
// RtlSecureZeroMemory(mem, Size);
|
||||||
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MemberOffsets
|
namespace MemberOffsets
|
||||||
|
|||||||
Reference in New Issue
Block a user