Handling multiple sources of temporary health

Hello! I have been looking into the Gameplay Attribute System and how Lyra handles health and damage and I had a question regarding “shield” effects, that grant temporary health. (Example : In League Of Legends, Vi’s passive and Sona’s W both create a “shield” effect)

I have been trying to produce “shield” gameplay effects to no success. I cannot seem to have a way to differentiate one “shield” effect from another, or to end the origin effect when the shield is completely depleted.

void UHealthSet::PostAttributeChange(const FGameplayAttribute& Attribute, float OldValue, float NewValue)

only sends the attribute information, we don’t have an handle back to the effect that made the change, so when my temporary health is depleted, I can’t send back a callback to make the ability system component end prematurely the “shield” effect.

Also, using only a “TemporaryHealth” attribute makes it impossible to know the value of which “shield” gets depleted when we hit it. So when a duration “shield” would wear off, I would only be able to reduce the “MaxTemporaryHealth” attribute and clamp the value to it, which could make for some weird behaviors where gaining a low duration “shield” could replenish the value of a long duration one.

I would like still to be able to use GameplayEffect to do this, since I want to be able to use the built-in tags check, durations, etc that the system provides, ideally. I could just wing something on the side, but I was hoping their might be something I’m missing that could let me handle “shields” correctly within the system.