Code snippets (thanks to Snaps)

Some parent class

void UFGItemContainer::GetReplicatedCustomConditionState(FCustomPropertyConditionState& OutActiveState) const
{
    DOREPDYNAMICCONDITION_INITCONDITION_FAST(ThisClass, ItemStacks, GetReplicationCondition());
    if(GetReplicationCondition() == COND_Custom)
    {
        DOREPCUSTOMCONDITION_ACTIVE_FAST(ThisClass, ItemStacks, ShouldReplicate());
    }
}
 
void UFGItemContainer::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    FDoRepLifetimeParams Params;
    Params.bIsPushBased = true;
    Params.Condition = COND_Dynamic;
    
    DOREPLIFETIME_WITH_PARAMS_FAST(UFGItemContainer, ItemStacks, Params);
}
 
ELifetimeCondition UFGItemContainer::GetReplicationCondition() const
{
    return ELifetimeCondition::COND_Custom;
}
 
bool UFGItemContainer::ShouldReplicate() const
{
    return ViewingPlayers.Num() > 0;
}

Some subclass where we want to override

ELifetimeCondition UFGItemBackpack::GetReplicationCondition() const
{
    return ELifetimeCondition::COND_OwnerOnly;
}
 
bool UFGItemBackpack::ShouldReplicate() const
{
    return true;
}