Quick answer: Call MarkItemDirty(Item) after mutating an entry, MarkArrayDirty() after add/remove. Without these, the delta serializer sees no change.

A FastArraySerializer inventory replicates from server. Adding items works; modifying an existing item’s count doesn’t propagate. The change marker wasn’t set.

Item Mutation Pattern

void AInventory::AddCount(int32 Index, int32 Delta)
{
    if (!Items.IsValidIndex(Index)) return;
    Items.Items[Index].Count += Delta;
    Items.MarkItemDirty(Items.Items[Index]);
}

MarkItemDirty notifies the serializer that this item changed; the delta packet carries just this item.

Add/Remove

Items.Items.Add(NewItem);
Items.MarkArrayDirty();

For collection changes, MarkArrayDirty rebuilds the structure delta. Without this, the new item is invisible to clients.

FFastArraySerializerItem Override

Each item type extends FFastArraySerializerItem and may override:

void PreReplicatedRemove(const FFastArraySerializer&);
void PostReplicatedAdd(const FFastArraySerializer&);
void PostReplicatedChange(const FFastArraySerializer&);

Use PostReplicatedChange for client-side update (refresh UI). PostReplicatedAdd for new items.

Network Profiler

Window → Developer Tools → Network Profiler. Capture a session. See per-frame bytes for your array; jumps indicate full re-replication (you forgot dirty), small bytes indicate delta is working.

Verifying

Server mutates inventory. Client UI updates. Network bytes per change are small (one item, not whole array). Add/remove also delta.

“FastArray reps deltas, but only if you mark. Mutate + MarkItemDirty is the contract.”

For large inventories (1000+ items), profile carefully. FastArray scales well only if each mutation is correctly marked; otherwise you blow your bandwidth.