Ejemplo n.º 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);
                }
            }
        }