/// <summary> /// Syncs a single item change to all accessing clients /// </summary> /// <param name="container">The container the change happened in</param> /// <param name="changedItems">The items that changed</param> /// <param name="type">The type of change</param> private void SyncContainerDelta(AttachedContainer attachedContainer, IEnumerable <Item> changedItems, Container.ContainerChangeType type) { if (attachedContainer.Observers.Count == 0) { return; } int index = Containers.FindIndex(c => attachedContainer == c);; Item[] items = changedItems.ToArray(); GameObject[] itemGameObjects = items.Select(x => x.gameObject).ToArray(); Container container = attachedContainer.Container; Container.StoredItem[] storedItems = null; if (type == Container.ContainerChangeType.Add || type == Container.ContainerChangeType.Move) { storedItems = new Container.StoredItem[items.Length]; for (var i = 0; i < items.Length; i++) { storedItems[i] = container.StoredItems[container.FindItem(items[i])]; } } foreach (Entity creature in attachedContainer.Observers) { if (creature == null) { continue; } var identity = creature.GetComponent <NetworkIdentity>(); if (identity == null) { continue; } var client = identity.connectionToClient; if (client == null) { continue; } if (type == Container.ContainerChangeType.Remove) { TargetSyncItemsRemove(client, index, itemGameObjects); } else if (type == Container.ContainerChangeType.Add) { TargetSyncItemsAdd(client, index, storedItems); } else if (type == Container.ContainerChangeType.Move) { TargetSyncItemsMove(client, index, storedItems); } } }