mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 02:42:22 +01:00
a bit
start work on vending machines, fix some playlist specific things, fixed a bug with <s5 playlist looting,
This commit is contained in:
273
Project Reboot 3.0/FortPlaylist.h
Normal file
273
Project Reboot 3.0/FortPlaylist.h
Normal file
@@ -0,0 +1,273 @@
|
||||
#pragma once
|
||||
|
||||
#include "Object.h"
|
||||
#include "Array.h"
|
||||
#include "FortAbilitySet.h"
|
||||
#include "SoftObjectPtr.h"
|
||||
#include "FortPlayerPawnAthena.h"
|
||||
#include "GameplayTagContainer.h"
|
||||
#include "BuildingActor.h"
|
||||
#include "FortPlayerPawnAthena.h"
|
||||
|
||||
struct FGameplayTagRequirements
|
||||
{
|
||||
FGameplayTagContainer RequireTags; // 0x0000(0x0020) (Edit, BlueprintVisible, NativeAccessSpecifierPublic)
|
||||
FGameplayTagContainer IgnoreTags; // 0x0020(0x0020) (Edit, BlueprintVisible, NativeAccessSpecifierPublic)
|
||||
};
|
||||
|
||||
enum class EFortDeliveryInfoBuildingActorSpecification : uint8_t
|
||||
{
|
||||
All = 0,
|
||||
PlayerBuildable = 1,
|
||||
NonPlayerBuildable = 2,
|
||||
EFortDeliveryInfoBuildingActorSpecification_MAX = 3
|
||||
};
|
||||
|
||||
struct FFortDeliveryInfoRequirementsFilter
|
||||
{
|
||||
bool ShouldApplyToPawns()
|
||||
{
|
||||
static auto bApplyToPlayerPawnsOffset = FindOffsetStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bApplyToPlayerPawns");
|
||||
static auto bApplyToPlayerPawnsFieldMask = GetFieldMask(FindPropertyStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bApplyToPlayerPawns"));
|
||||
return ReadBitfield((PlaceholderBitfield*)(__int64(this) + bApplyToPlayerPawnsOffset), bApplyToPlayerPawnsFieldMask);
|
||||
}
|
||||
|
||||
bool ShouldApplyToBuildingActors()
|
||||
{
|
||||
static auto bApplyToBuildingActorsOffset = FindOffsetStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bApplyToBuildingActors");
|
||||
static auto bApplyToBuildingActorsFieldMask = GetFieldMask(FindPropertyStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bApplyToBuildingActors"));
|
||||
return ReadBitfield((PlaceholderBitfield*)(__int64(this) + bApplyToBuildingActorsOffset), bApplyToBuildingActorsFieldMask);
|
||||
}
|
||||
|
||||
bool ShouldConsiderTeam()
|
||||
{
|
||||
static auto bConsiderTeamOffset = FindOffsetStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bConsiderTeam");
|
||||
static auto bConsiderTeamFieldMask = GetFieldMask(FindPropertyStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bConsiderTeam"));
|
||||
return ReadBitfield((PlaceholderBitfield*)(__int64(this) + bConsiderTeamOffset), bConsiderTeamFieldMask);
|
||||
}
|
||||
|
||||
FGameplayTagRequirements& GetTargetTagRequirements()
|
||||
{
|
||||
static auto TargetTagRequirementsOffset = FindOffsetStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "TargetTagRequirements");
|
||||
return *(FGameplayTagRequirements*)(__int64(this) + TargetTagRequirementsOffset);
|
||||
}
|
||||
|
||||
EFortDeliveryInfoBuildingActorSpecification& GetBuildingActorSpecification()
|
||||
{
|
||||
static auto BuildingActorSpecificationOffset = FindOffsetStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "BuildingActorSpecification");
|
||||
return *(EFortDeliveryInfoBuildingActorSpecification*)(__int64(this) + BuildingActorSpecificationOffset);
|
||||
}
|
||||
|
||||
bool DoesActorFollowsRequirements(AActor* Actor)
|
||||
{
|
||||
// TODO ADD TEAM CHECK! (We can use UFortKismetLibrary::GetActorTeam)
|
||||
|
||||
if (auto BuildingActor = Cast<ABuildingActor>(Actor))
|
||||
{
|
||||
if (!ShouldApplyToBuildingActors())
|
||||
return false;
|
||||
|
||||
//if (GetTargetTagRequirements().RequireTags.GameplayTags.Num() > 0 && GetTargetTagRequirements().) // idk todo
|
||||
|
||||
if (GetBuildingActorSpecification() == EFortDeliveryInfoBuildingActorSpecification::PlayerBuildable && BuildingActor->IsPlayerBuildable())
|
||||
return true;
|
||||
|
||||
if (GetBuildingActorSpecification() == EFortDeliveryInfoBuildingActorSpecification::NonPlayerBuildable && !BuildingActor->IsPlayerBuildable())
|
||||
return true;
|
||||
|
||||
return GetBuildingActorSpecification() == EFortDeliveryInfoBuildingActorSpecification::All;
|
||||
}
|
||||
|
||||
else if (auto Pawn = Cast<AFortPlayerPawnAthena>(Actor))
|
||||
{
|
||||
return ShouldApplyToPawns();
|
||||
}
|
||||
|
||||
else if (auto PlayerState = Cast<AFortPlayerState>(Actor))
|
||||
{
|
||||
return ShouldApplyToPawns(); // scuffed
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
struct FFortGameplayEffectDeliveryInfo
|
||||
{
|
||||
static UStruct* GetStruct()
|
||||
{
|
||||
static auto Struct = FindObject<UStruct>("/Script/FortniteGame.FortGameplayEffectDeliveryInfo");
|
||||
return Struct;
|
||||
}
|
||||
|
||||
static int GetStructSize()
|
||||
{
|
||||
return GetStruct()->GetPropertiesSize();
|
||||
}
|
||||
|
||||
FFortDeliveryInfoRequirementsFilter* GetDeliveryRequirements()
|
||||
{
|
||||
static auto DeliveryRequirementsOffset = FindOffsetStruct("/Script/FortniteGame.FortGameplayEffectDeliveryInfo", "DeliveryRequirements");
|
||||
return (FFortDeliveryInfoRequirementsFilter*)(__int64(this) + DeliveryRequirementsOffset);
|
||||
}
|
||||
|
||||
TArray<FGameplayEffectApplicationInfo>& GetGameplayEffects()
|
||||
{
|
||||
static auto GameplayEffectsOffset = FindOffsetStruct("/Script/FortniteGame.FortGameplayEffectDeliveryInfo", "GameplayEffects");
|
||||
return *(TArray<FGameplayEffectApplicationInfo>*)(__int64(this) + GameplayEffectsOffset);
|
||||
}
|
||||
};
|
||||
|
||||
struct FFortAbilitySetDeliveryInfo
|
||||
{
|
||||
static UStruct* GetStruct()
|
||||
{
|
||||
static auto Struct = FindObject<UStruct>("/Script/FortniteGame.FortAbilitySetDeliveryInfo");
|
||||
return Struct;
|
||||
}
|
||||
|
||||
static int GetStructSize()
|
||||
{
|
||||
return GetStruct()->GetPropertiesSize();
|
||||
}
|
||||
|
||||
FFortDeliveryInfoRequirementsFilter* GetDeliveryRequirements()
|
||||
{
|
||||
static auto DeliveryRequirementsOffset = FindOffsetStruct("/Script/FortniteGame.FortAbilitySetDeliveryInfo", "DeliveryRequirements");
|
||||
return (FFortDeliveryInfoRequirementsFilter*)(__int64(this) + DeliveryRequirementsOffset);
|
||||
}
|
||||
|
||||
TArray<TSoftObjectPtr<UFortAbilitySet>>& GetAbilitySets()
|
||||
{
|
||||
static auto AbilitySetsOffset = FindOffsetStruct("/Script/FortniteGame.FortAbilitySetDeliveryInfo", "AbilitySets");
|
||||
return *(TArray<TSoftObjectPtr<UFortAbilitySet>>*)(__int64(this) + AbilitySetsOffset);
|
||||
}
|
||||
};
|
||||
|
||||
class UFortGameplayModifierItemDefinition : public UObject
|
||||
{
|
||||
public:
|
||||
TArray<FFortGameplayEffectDeliveryInfo>& GetPersistentGameplayEffects()
|
||||
{
|
||||
static auto PersistentGameplayEffectsOffset = GetOffset("PersistentGameplayEffects");
|
||||
return this->Get<TArray<FFortGameplayEffectDeliveryInfo>>(PersistentGameplayEffectsOffset);
|
||||
}
|
||||
|
||||
TArray<FFortAbilitySetDeliveryInfo>& GetPersistentAbilitySets()
|
||||
{
|
||||
static auto PersistentAbilitySetsOffset = GetOffset("PersistentAbilitySets");
|
||||
return this->Get<TArray<FFortAbilitySetDeliveryInfo>>(PersistentAbilitySetsOffset);
|
||||
}
|
||||
|
||||
void ApplyModifierToActor(AActor* Actor)
|
||||
{
|
||||
if (!Actor)
|
||||
return;
|
||||
|
||||
UAbilitySystemComponent* AbilitySystemComponent = nullptr;
|
||||
|
||||
if (auto BuildingActor = Cast<ABuildingActor>(Actor))
|
||||
{
|
||||
static auto AbilitySystemComponentOffset = BuildingActor->GetOffset("AbilitySystemComponent");
|
||||
AbilitySystemComponent = BuildingActor->Get<UAbilitySystemComponent*>(AbilitySystemComponentOffset);
|
||||
}
|
||||
|
||||
else if (auto PlayerState = Cast<AFortPlayerState>(Actor))
|
||||
{
|
||||
AbilitySystemComponent = PlayerState->GetAbilitySystemComponent();
|
||||
}
|
||||
|
||||
else if (auto Pawn = Cast<AFortPlayerPawnAthena>(Actor))
|
||||
{
|
||||
static auto AbilitySystemComponentOffset = Pawn->GetOffset("AbilitySystemComponent");
|
||||
AbilitySystemComponent = Pawn->Get<UAbilitySystemComponent*>(AbilitySystemComponentOffset);
|
||||
}
|
||||
|
||||
if (!AbilitySystemComponent)
|
||||
{
|
||||
LOG_INFO(LogDev, "Unable to find ASC for {}", Actor->GetName());
|
||||
return;
|
||||
}
|
||||
|
||||
for (int z = 0; z < this->GetPersistentAbilitySets().Num(); z++)
|
||||
{
|
||||
auto& AbilitySetDeliveryInfo = this->GetPersistentAbilitySets().at(z, FFortAbilitySetDeliveryInfo::GetStructSize());
|
||||
|
||||
if (!AbilitySetDeliveryInfo.GetDeliveryRequirements()->DoesActorFollowsRequirements(Actor))
|
||||
continue;
|
||||
|
||||
auto& CurrentAbilitySets = AbilitySetDeliveryInfo.GetAbilitySets();
|
||||
|
||||
for (int j = 0; j < CurrentAbilitySets.Num(); j++)
|
||||
{
|
||||
auto& CurrentAbilitySetSoft = CurrentAbilitySets.at(j);
|
||||
auto CurrentAbilitySet = CurrentAbilitySetSoft.Get(UFortAbilitySet::StaticClass(), true);
|
||||
|
||||
if (!CurrentAbilitySet)
|
||||
continue;
|
||||
|
||||
CurrentAbilitySet->GiveToAbilitySystem(AbilitySystemComponent);
|
||||
}
|
||||
}
|
||||
|
||||
for (int z = 0; z < this->GetPersistentGameplayEffects().Num(); z++)
|
||||
{
|
||||
auto& GameplayEffectDeliveryInfo = this->GetPersistentGameplayEffects().at(z, FFortGameplayEffectDeliveryInfo::GetStructSize());
|
||||
|
||||
if (!GameplayEffectDeliveryInfo.GetDeliveryRequirements()->DoesActorFollowsRequirements(Actor))
|
||||
continue;
|
||||
|
||||
auto& CurrentGameplayEffects = GameplayEffectDeliveryInfo.GetGameplayEffects();
|
||||
|
||||
for (int j = 0; j < CurrentGameplayEffects.Num(); j++)
|
||||
{
|
||||
auto& CurrentGameplayEffectInfo = CurrentGameplayEffects.at(j);
|
||||
auto& CurrentGameplayEffectSoft = CurrentGameplayEffectInfo.GameplayEffect;
|
||||
static auto ClassClass = FindObject<UClass>("/Script/CoreUObject.Class");
|
||||
auto CurrentGameplayEffect = CurrentGameplayEffectSoft.Get(ClassClass, true);
|
||||
|
||||
if (!CurrentGameplayEffect)
|
||||
continue;
|
||||
|
||||
LOG_INFO(LogDev, "Giving GameplayEffect {}", CurrentGameplayEffect->GetFullName());
|
||||
AbilitySystemComponent->ApplyGameplayEffectToSelf(CurrentGameplayEffect, CurrentGameplayEffectInfo.Level);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class UFortPlaylist : public UObject
|
||||
{
|
||||
public:
|
||||
TArray<TSoftObjectPtr<UFortGameplayModifierItemDefinition>>& GetModifierList()
|
||||
{
|
||||
static auto ModifierListOffset = this->GetOffset("ModifierList");
|
||||
return this->Get<TArray<TSoftObjectPtr<UFortGameplayModifierItemDefinition>>>(ModifierListOffset);
|
||||
}
|
||||
|
||||
void ApplyModifiersToActor(AActor* Actor)
|
||||
{
|
||||
if (!Actor)
|
||||
return;
|
||||
|
||||
static auto ModifierListOffset = this->GetOffset("ModifierList", false);
|
||||
|
||||
if (ModifierListOffset == -1)
|
||||
return;
|
||||
|
||||
auto& ModifierList = this->GetModifierList();
|
||||
|
||||
static auto FortGameplayModifierItemDefinitionClass = FindObject<UClass>("/Script/FortniteGame.FortGameplayModifierItemDefinition");
|
||||
|
||||
for (int i = 0; i < ModifierList.Num(); i++)
|
||||
{
|
||||
auto& ModifierSoft = ModifierList.at(i);
|
||||
auto StrongModifier = ModifierSoft.Get(FortGameplayModifierItemDefinitionClass, true);
|
||||
|
||||
if (!StrongModifier)
|
||||
continue;
|
||||
|
||||
StrongModifier->ApplyModifierToActor(Actor);
|
||||
}
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user