Gameplay Effect incorrectly applying Attribute change twice on client when triggered from inside Gameplay Ability Task event

I have a multiplayer action game using the Gameplay Ability System Plugin. The whole system has been working great with damage being done, attributes being modified and animations being play all replicating correctly for the past few weeks.

However a few days ago I added an attack that would give energy back to the owner on the hit frame of the animation. This is implemented by applying a Gameplay Effect to Owner, which simply adds a scaled float to the attribute (Energy += 20) and looks like this:

(There is nothing else active within this GE, no gameplay cues or anything else, it just adds +20 energy)

However depending on where I apply this I get different outcomes. This version works correctly:

Server+Client both think this player gets 20 energy and everything works. But if I call the exact same thing from inside the event call-back like so:

The animation plays correctly as before, the event is fired but then on the client (and only the client) the energy gain is applied twice and the client now thinks it has 40 energy not 20. The GE isn’t trigger twice - it’s only applied once on the client, but then the energy update from the server is replicated over and doubles the value. When using the showdebug gameplayabilitysystem command I can see that on the client, it thinks the GE’s are still in effect despite them being instant. After using the the Strike ability a number of times it looks like this:


The client thinks it has 220 energy (compared to the base which is 40 which is what the server correctly thinks we have) because of these zombie GE’s that aren’t ever removed. And I cannot figure out why they stick around when called from inside the event call-back. When I do damage and apply GE’s to targets from within the exact same event it all works. But somehow applying an instant GE to owner inside the event call-back creates these weird zombie effects that continually mess up the local value on the client.

If I set the Net Execution Policy to “Server Only” on the Gameplay Ability, these are never generated on the client and it works (although that obviously breaks the animations etc). But it shows the issues has something to do with local prediction not clearing GE’s applied from inside Ability Task events … but that’s as far as I can figure out.

Any help would be great - this is driving me nuts haha!

did you find the solution ? i have the same issue

Nope - no solution. I ended up writing a work around hack that applied the GE via a different mechanism (doing it in the hit logic rather than in the GA itself).

is it a bug from GAS or we did something stupid ?

Just a thought, you could use a has authority node there. I think what may be happening is the first method retains a prediction key where the client updates and server confirms, whereas the async will desync the client and server.