When the result is cached, it needs to be invalidated when new value arrives. This can be done using e.g. a delegate callback and invalidation handle. The call to InvalidateResult() on that handle will invalidate the query state so that next time IsTrue() is called required conditions will be re-evaluated. It is advised to do as little work as possible in the delegate callback: bool FWorldConditionFoo::Activate(const FWorldConditionContext& Context) const { FStructBar* Bar = Context.GetMutableContextDataPtr(BarRef) if (bCanCacheResult && Bar != nullptr) { if (FOnFooEvent* Delegate = Bar->GetDelegate()) { FStateType& State = Context.GetState(*this); State.DelegateHandle = Delegate->AddLambda(this, InvalidationHandle = Context.GetInvalidationHandle(*this) { InvalidationHandle.InvalidateResult(); }); } ... }