/// <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); } } }
private void ContainerOnContentsChanged(Container container, IEnumerable <Item> items, Container.ContainerChangeType type) { switch (type) { case Container.ContainerChangeType.Add: foreach (Item item in items) { Vector2Int position = container.PositionOf(item); CreateItemDisplay(item, position); } break; case Container.ContainerChangeType.Remove: foreach (Item item in items) { for (var i = 0; i < gridItems.Count; i++) { ItemGridItem gridItem = gridItems[i]; if (gridItem.Item == item) { gridItems.RemoveAt(i); Destroy(gridItem.gameObject); break; } } } break; case Container.ContainerChangeType.Move: foreach (Item item in items) { foreach (ItemGridItem gridItem in gridItems) { if (gridItem.Item == item) { Vector2Int position = container.PositionOf(item); MoveToSlot(gridItem.transform, position); break; } } } break; default: throw new ArgumentOutOfRangeException(nameof(type), type, null); } }