Beispiel #1
0
        void CreateClientData(Endpoint clientEndpoint)
        {
            if (!_serverData.TryGetValue(clientEndpoint, out var clientData))
            {
                clientData = new InventoryClientData();
                _serverData[clientEndpoint] = clientData;
            }

            clientData.Dirty     = false;
            clientData.HasRights = !Plugin.StaticConfig.InventoryPreventSharing ||
                                   (Owner as InventoryReplicable).HasRights(clientEndpoint.Id, ValidationType.Access | ValidationType.Ownership) ==
                                   ValidationResult.Passed;

            foreach (var item in Inventory.GetItems())
            {
                var amount = item.Amount;
                if (item.Content is MyObjectBuilder_GasContainerObject gas)
                {
                    amount = (MyFixedPoint)gas.GasLevel;
                }

                var data = new ClientInvetoryData
                {
                    Item   = item,
                    Amount = amount
                };
                clientData.ClientItemsSorted[item.ItemId] = data;
                clientData.ClientItems.Add(data);
            }
        }
Beispiel #2
0
        static void ApplyChangesToClientItems(InventoryClientData clientData, ref InventoryDeltaInformation delta)
        {
            if (delta.RemovedItems != null)
            {
                foreach (var num in delta.RemovedItems)
                {
                    var num2 = -1;
                    for (var i = 0; i < clientData.ClientItems.Count; i++)
                    {
                        if (clientData.ClientItems[i].Item.ItemId == num)
                        {
                            num2 = i;
                            break;
                        }
                    }

                    if (num2 != -1)
                    {
                        clientData.ClientItems.RemoveAt(num2);
                    }
                }
            }

            if (delta.NewItems != null)
            {
                foreach (var keyValuePair in delta.NewItems)
                {
                    var item = new ClientInvetoryData
                    {
                        Item   = keyValuePair.Value,
                        Amount = keyValuePair.Value.Amount
                    };
                    if (keyValuePair.Key >= clientData.ClientItems.Count)
                    {
                        clientData.ClientItems.Add(item);
                    }
                    else
                    {
                        clientData.ClientItems.Insert(keyValuePair.Key, item);
                    }
                }
            }
        }
        private void ApplyChangesToClientItems(InventoryClientData clientData, ref InventoryDeltaInformation delta)
        {
            if (delta.RemovedItems != null)
            {
                foreach (var item in delta.RemovedItems)
                {
                    int index = -1;
                    for (int i = 0; i < clientData.ClientItems.Count; ++i)
                    {
                        if (clientData.ClientItems[i].Item.ItemId == item)
                        {
                            index = i;
                            break;
                        }
                    }

                    if (index != -1)
                    {
                        clientData.ClientItems.RemoveAt(index);
                    }
                }
            }

            if (delta.NewItems != null)
            {
                foreach (var item in delta.NewItems)
                {
                    ClientInvetoryData newitem = new ClientInvetoryData()
                    {
                        Item = item.Value, Amount = item.Value.Amount
                    };
                    if (item.Key >= clientData.ClientItems.Count)
                    {
                        clientData.ClientItems.Add(newitem);
                    }
                    else
                    {
                        clientData.ClientItems.Insert(item.Key, newitem);
                    }
                }
            }
        }
Beispiel #4
0
        public void CreateClientData(MyClientStateBase forClient)
        {
            if (m_clientInventoryUpdate == null)
            {
                m_clientInventoryUpdate = new Dictionary <ulong, InventoryClientData>();
            }

            InventoryClientData data;

            if (m_clientInventoryUpdate.TryGetValue(forClient.EndpointId.Value, out data) == false)
            {
                m_clientInventoryUpdate[forClient.EndpointId.Value] = new InventoryClientData();
                data = m_clientInventoryUpdate[forClient.EndpointId.Value];
            }
            data.Dirty = false;

            List <MyPhysicalInventoryItem> items = Inventory.GetItems();

            foreach (var serverItem in items)
            {
                MyFixedPoint amount = serverItem.Amount;

                var gasItem = serverItem.Content as MyObjectBuilder_GasContainerObject;
                if (gasItem != null)
                {
                    amount = (MyFixedPoint)gasItem.GasLevel;
                }

                ClientInvetoryData item = new ClientInvetoryData()
                {
                    Item = serverItem, Amount = amount
                };
                data.ClientItemsSorted[serverItem.ItemId] = item;
                data.ClientItems.Add(item);
            }

            MyMultiplayer.GetReplicationServer().AddToDirtyGroups(this);
        }
        InventoryDeltaInformation CalculateInventoryDiff(ref InventoryClientData clientData)
        {
            if (m_itemsToSend == null)
            {
                m_itemsToSend = new List <MyPhysicalInventoryItem>();
            }

            if (m_foundDeltaItems == null)
            {
                m_foundDeltaItems = new HashSet <uint>();
            }
            m_foundDeltaItems.Clear();


            InventoryDeltaInformation      delta;
            List <MyPhysicalInventoryItem> items = Inventory.GetItems();

            //this is two step algoritm

            //first check for adds/removals
            //this part can find removed and added items
            //but cannot find swapped items
            CalculateAddsAndRemovals(clientData, out delta, items);

            //apply changes to client items (only add and remove)

            if (delta.HasChanges)
            {
                ApplyChangesToClientItems(clientData, ref delta);
            }
            //then check client data for changed items
            for (int i = 0; i < items.Count; ++i)
            {
                if (clientData.ClientItems.Count < i && clientData.ClientItems[i].Item.ItemId != items[i].ItemId)
                {
                    if (delta.SwappedItems == null)
                    {
                        delta.SwappedItems = new Dictionary <int, int>();
                    }
                    if (delta.SwappedItems.ContainsKey(i))
                    {
                        continue;
                    }

                    for (int j = 0; j < clientData.ClientItems.Count; ++j)
                    {
                        if (clientData.ClientItems[j].Item.ItemId == items[i].ItemId)
                        {
                            delta.SwappedItems[j] = i;
                        }
                    }
                }
            }

            clientData.ClientItemsSorted.Clear();
            clientData.ClientItems.Clear();

            foreach (var serverItem in items)
            {
                MyFixedPoint amount = serverItem.Amount;

                var gasItem = serverItem.Content as MyObjectBuilder_GasContainerObject;
                if (gasItem != null)
                {
                    amount = (MyFixedPoint)gasItem.GasLevel;
                }
                ClientInvetoryData item = new ClientInvetoryData()
                {
                    Item = serverItem, Amount = amount
                };
                clientData.ClientItemsSorted[serverItem.ItemId] = item;
                clientData.ClientItems.Add(item);
            }
            return(delta);
        }
Beispiel #6
0
        InventoryDeltaInformation CalculateInventoryDiff(ref InventoryClientData clientData)
        {
            if (m_itemsToSend == null)
            {
                m_itemsToSend = new List <MyPhysicalInventoryItem>();
            }

            if (m_foundDeltaItems == null)
            {
                m_foundDeltaItems = new HashSet <uint>();
            }

            m_foundDeltaItems.Clear();
            var items = Inventory.GetItems();

            CalculateAddsAndRemovals(clientData, out var delta, items);
            if (delta.HasChanges)
            {
                ApplyChangesToClientItems(clientData, ref delta);
            }

            for (var i = 0; i < items.Count; i++)
            {
                if (i < clientData.ClientItems.Count)
                {
                    var itemId = clientData.ClientItems[i].Item.ItemId;
                    if (itemId != items[i].ItemId)
                    {
                        if (delta.SwappedItems == null)
                        {
                            delta.SwappedItems = new Dictionary <uint, int>();
                        }

                        for (var j = 0; j < items.Count; j++)
                        {
                            if (itemId == items[j].ItemId)
                            {
                                delta.SwappedItems[itemId] = j;
                            }
                        }
                    }
                }
            }

            clientData.ClientItemsSorted.Clear();
            clientData.ClientItems.Clear();
            foreach (var item in items)
            {
                var amount = item.Amount;
                var obj    = item.Content as MyObjectBuilder_GasContainerObject;
                if (obj != null)
                {
                    amount = (MyFixedPoint)obj.GasLevel;
                }

                var data = new ClientInvetoryData
                {
                    Item   = item,
                    Amount = amount
                };
                clientData.ClientItemsSorted[item.ItemId] = data;
                clientData.ClientItems.Add(data);
            }

            return(delta);
        }
        public void CreateClientData(MyClientStateBase forClient)
        {
            if (m_clientInventoryUpdate == null)
            {
                m_clientInventoryUpdate = new Dictionary<ulong, InventoryClientData>();
            }

            InventoryClientData data;
            if (m_clientInventoryUpdate.TryGetValue(forClient.EndpointId.Value, out data) == false)
            {
                m_clientInventoryUpdate[forClient.EndpointId.Value] = new InventoryClientData();
                data = m_clientInventoryUpdate[forClient.EndpointId.Value];
            }
            data.Dirty = false;

            List<MyPhysicalInventoryItem> items = Inventory.GetItems();

            foreach (var serverItem in items)
            {
                MyFixedPoint amount = serverItem.Amount;

                var gasItem = serverItem.Content as MyObjectBuilder_GasContainerObject;
                if (gasItem != null)
                {
                    amount = (MyFixedPoint)gasItem.GasLevel;
                }

                ClientInvetoryData item = new ClientInvetoryData() { Item = serverItem, Amount = amount };
                data.ClientItemsSorted[serverItem.ItemId] = item;
                data.ClientItems.Add(item);
            }
            
        }
        private void ApplyChangesToClientItems(InventoryClientData clientData,ref  InventoryDeltaInformation delta)
        {
            if (delta.RemovedItems != null)
            {
                foreach (var item in delta.RemovedItems)
                {
                    int index = -1;
                    for (int i = 0; i < clientData.ClientItems.Count; ++i)
                    {
                        if (clientData.ClientItems[i].Item.ItemId == item)
                        {
                            index = i;
                            break;
                        }
                    }

                    if (index != -1)
                    {
                        clientData.ClientItems.RemoveAt(index);
                    }
                }
            }

            if (delta.NewItems != null)
            {
                foreach (var item in delta.NewItems)
                {
                    ClientInvetoryData newitem = new ClientInvetoryData() { Item = item.Value, Amount = item.Value.Amount };
                    if (item.Key >= clientData.ClientItems.Count)
                    {
                        clientData.ClientItems.Add(newitem);
                    }
                    else
                    {
                        clientData.ClientItems.Insert(item.Key, newitem);
                    }
                }
            }
        }
        InventoryDeltaInformation CalculateInventoryDiff(ref InventoryClientData clientData)
        {
            if (m_itemsToSend == null)
            {
                m_itemsToSend = new List<MyPhysicalInventoryItem>();
            }

            if(m_foundDeltaItems == null )
            {
                m_foundDeltaItems = new HashSet<uint>();
            }
            m_foundDeltaItems.Clear();
           
            
            InventoryDeltaInformation delta;
            List<MyPhysicalInventoryItem> items = Inventory.GetItems();
            //this is two step algoritm 

            //first check for adds/removals
            //this part can find removed and added items
            //but cannot find swapped items
            CalculateAddsAndRemovals(clientData, out delta, items);

            //apply changes to client items (only add and remove)

            if(delta.HasChanges)
            {
                ApplyChangesToClientItems(clientData,ref delta);
            }
            //then check client data for changed items
            for (int i = 0; i < items.Count; ++i)
            {
                if(clientData.ClientItems.Count < i && clientData.ClientItems[i].Item.ItemId !=  items[i].ItemId)
                {    
                    if(delta.SwappedItems == null)
                    {
                        delta.SwappedItems = new Dictionary<int, int>();
                    }
                    if(delta.SwappedItems.ContainsKey(i))
                    {
                        continue;
                    }

                    for (int j = 0; j < clientData.ClientItems.Count;++j)
                    {
                        if(clientData.ClientItems[j].Item.ItemId == items[i].ItemId)
                        {
                            delta.SwappedItems[j] = i;
                        }
                    }             
                }
            }

            clientData.ClientItemsSorted.Clear();
            clientData.ClientItems.Clear();

            foreach (var serverItem in items)
            {
                MyFixedPoint amount = serverItem.Amount;

                var gasItem = serverItem.Content as MyObjectBuilder_GasContainerObject;
                if (gasItem != null)
                {
                    amount = (MyFixedPoint)gasItem.GasLevel;
                }
                ClientInvetoryData item = new ClientInvetoryData() { Item = serverItem, Amount = amount };
                clientData.ClientItemsSorted[serverItem.ItemId] = item;
                clientData.ClientItems.Add(item);
            }
            return delta;
        }