Associated UDN [Link Removed]
We've been having some issues with the replication of attributes. Namely we have an OnRep_ function for an attribute that receives FGameplayAttributeData& OldValue and passes that to GAMEPLAYATTRIBUTE_REPNOTIFY. Note that by the time this is hit the attribute already has its current value set from replication.
This call forwards all of this to SetBaseAttributeValueFromReplication which in turn calls OnAttributeAggregatorDirty which then calls InternalUpdateNumericalAttribute. In here however it is assumed that the current value is the old value (float OldValue = Owner->GetNumericAttribute(Attribute)) and the new value is passed in via function parameter. This is true for the server but in case of the client these 2 are the same because as mentioned by the time the repnotify macro is called, replication has already set the attribute to the current value and thus the old value is lost by the time InternalUpdateNumericalAttribute is called.
This results in both NewValue and OldValue being identical on the client by the time the aggregator delegates are called and our "if newvalue != oldvalue" check fails.
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-137205 in the post.