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); } }
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); } } } }
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); }
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; }