Hello, (UE5.7) using HandleGameplayEvent to activate an ability. Having a problem where the ability on client machines will have empty activation tags despite them being set in the constructor. Works reliably on server and I can see that the tag is available globally on the client. Anyone have any thoughts?
[/Script/GameplayAbilities.AbilitySystemGlobals]
ReplicateActivationOwnedTags=True
// STEPPED THROUGH THIS, ABILITYTAGS IS ALWAYS EMPTY ON CLIENT
for (FGameplayAbilitySpec AS : ASC->GetActivatableAbilities())
{
for (FGameplayTag T : AS.Ability->AbilityTags)
{
UE_LOG(RTSRuntime, Warning, TEXT("%s"), *T.GetTagName().ToString());
}
}
// Ability Constructor
UGameplayAbility_PurchaseUnit::UGameplayAbility_PurchaseUnit()
{
NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::LocalPredicted;
ReplicationPolicy = EGameplayAbilityReplicationPolicy::ReplicateYes;
InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerExecution;
NetSecurityPolicy = EGameplayAbilityNetSecurityPolicy::ClientOrServer;
bWasCancelled = true;
bReplicateEndAbility = true;
// Grants tags to actor using this ability while this ability is active
FGameplayTag RequestedAbilityTag = FGameplayTag::RequestGameplayTag(FName("GASCore.Event.PurchaseUnit"), true);
if (RequestedAbilityTag.IsValid())
{
FAbilityTriggerData TriggerData;
TriggerData.TriggerTag = RequestedAbilityTag;
TriggerData.TriggerSource = EGameplayAbilityTriggerSource::GameplayEvent;
AbilityTriggers.Add(TriggerData);
}
else
{
UE_LOG(RTSRuntime, Warning, TEXT("Failed to add tag to ability trigger"));
}
}
// Calling the ability
FGameplayEventData EventData;
EventData.Instigator = this;
EventData.Target = this; //shouldnt need target
EventData.TargetData = FGameplayAbilityTargetDataHandle(TargetDataPtr);
EventData.OptionalObject = UnitData;
// Fire the gameplay event to the Ability System Component to trigger abilities listening to this event tag
FGameplayTag RequestedAbilityTag = FGameplayTag::RequestGameplayTag(FName("GASCore.Event.PurchaseUnit"), true);
if (RequestedAbilityTag.IsValid())
{
if (ASC->HandleGameplayEvent(RequestedAbilityTag, &EventData))
{
UE_LOG(RTSRuntime, Display, TEXT("Successfully activated events from tag %s"), *RequestedAbilityTag.GetTagName().ToString());
}
else
{
UE_LOG(RTSRuntime, Warning, TEXT("Was unable to activate any events from tag %s"), *RequestedAbilityTag.GetTagName().ToString());
}
}
else
{
UE_LOG(RTSRuntime, Warning, TEXT("RequestedAbilityTag is NOT valid."));
}
}