Exemple #1
0
        /// <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);
                }
            }
        }
Exemple #2
0
        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);
            }
        }