public void Serialize(BitStream stream, MyClientStateBase forClient, byte packetId, int maxBitPosition) { if (stream.Writing) { InventoryClientData clientData = m_clientInventoryUpdate[forClient.EndpointId.Value]; if (clientData.FailedIncompletePackets.Count > 0) { InventoryPartInfo failedPacket = clientData.FailedIncompletePackets[0]; clientData.FailedIncompletePackets.RemoveAtFast(0); InventoryPartInfo reSendPacket = WriteInventory(ref failedPacket, stream, packetId, maxBitPosition, true); clientData.SendPackets[packetId] = reSendPacket; } else { clientData.MainSendingInfo = WriteInventory(ref clientData.MainSendingInfo, stream, packetId, maxBitPosition); clientData.SendPackets[packetId] = clientData.MainSendingInfo; List <MyPhysicalInventoryItem> items = Inventory.GetItems(); if (clientData.MainSendingInfo.StartItemIndex + clientData.MainSendingInfo.NumItems >= items.Count) { clientData.MainSendingInfo.StartItemIndex = 0; clientData.MainSendingInfo.NumItems = 0; clientData.Dirty = false; } } } else { ReadInventory(stream); } }
private InventoryPartInfo WriteInventory(ref InventoryPartInfo packetInfo, BitStream stream, byte packetId, int maxBitPosition, bool resend = false) { if (m_items == null) { m_items = new List<MyPhysicalInventoryItem>(); } Console.WriteLine(String.Format("sending: {0}, {1}", packetId, Inventory.Owner.ToString())); InventoryPartInfo sendPacketInfo = new InventoryPartInfo(); sendPacketInfo.AllItemsSend = true; List<MyPhysicalInventoryItem> items = Inventory.GetItems(); int numItems = items.Count; int sentItems = packetInfo.StartItemIndex + (resend ? 0 : packetInfo.NumItems); sendPacketInfo.StartItemIndex = sentItems; bool startNewTransfer = (resend == false) && sentItems == 0; VRage.Serialization.MySerializer.Write(stream, ref startNewTransfer); int startStreamPosition = stream.BitPosition; VRage.Serialization.MySerializer.Write(stream, ref numItems); int maxNumItems = (resend ? packetInfo.NumItems : numItems); for (; sentItems < numItems; ++sentItems) { MyPhysicalInventoryItem item = items[sentItems]; m_items.Add(item); VRage.Serialization.MySerializer.Write(stream, ref item, MyObjectBuilderSerializer.Dynamic); if (stream.BitPosition > maxBitPosition) { m_items.RemoveAt(m_items.Count - 1); break; } else if (sentItems >= maxNumItems) { break; } } if (m_items.Count < numItems) { sendPacketInfo.AllItemsSend = false; stream.SetBitPositionWrite(startStreamPosition); numItems = m_items.Count; VRage.Serialization.MySerializer.Write(stream, ref numItems); for (int i = 0; i < m_items.Count; ++i) { MyPhysicalInventoryItem item = m_items[i]; VRage.Serialization.MySerializer.Write(stream, ref item, MyObjectBuilderSerializer.Dynamic); } } VRage.Serialization.MySerializer.Write(stream, ref sendPacketInfo.StartItemIndex); sendPacketInfo.NumItems = m_items.Count; m_items.Clear(); return sendPacketInfo; }
private InventoryPartInfo WriteInventory(ref InventoryPartInfo packetInfo, BitStream stream, byte packetId, int maxBitPosition, bool resend = false) { if (m_items == null) { m_items = new List <MyPhysicalInventoryItem>(); } Console.WriteLine(String.Format("sending: {0}, {1}", packetId, Inventory.Owner.ToString())); InventoryPartInfo sendPacketInfo = new InventoryPartInfo(); sendPacketInfo.AllItemsSend = true; List <MyPhysicalInventoryItem> items = Inventory.GetItems(); int numItems = items.Count; int sentItems = packetInfo.StartItemIndex + (resend ? 0 : packetInfo.NumItems); sendPacketInfo.StartItemIndex = sentItems; bool startNewTransfer = (resend == false) && sentItems == 0; VRage.Serialization.MySerializer.Write(stream, ref startNewTransfer); int startStreamPosition = stream.BitPosition; VRage.Serialization.MySerializer.Write(stream, ref numItems); int maxNumItems = (resend ? packetInfo.NumItems : numItems); for (; sentItems < numItems; ++sentItems) { MyPhysicalInventoryItem item = items[sentItems]; m_items.Add(item); VRage.Serialization.MySerializer.Write(stream, ref item, MyObjectBuilderSerializer.Dynamic); if (stream.BitPosition > maxBitPosition) { m_items.RemoveAt(m_items.Count - 1); break; } else if (sentItems >= maxNumItems) { break; } } if (m_items.Count < numItems) { sendPacketInfo.AllItemsSend = false; stream.SetBitPositionWrite(startStreamPosition); numItems = m_items.Count; VRage.Serialization.MySerializer.Write(stream, ref numItems); for (int i = 0; i < m_items.Count; ++i) { MyPhysicalInventoryItem item = m_items[i]; VRage.Serialization.MySerializer.Write(stream, ref item, MyObjectBuilderSerializer.Dynamic); } } VRage.Serialization.MySerializer.Write(stream, ref sendPacketInfo.StartItemIndex); sendPacketInfo.NumItems = m_items.Count; m_items.Clear(); return(sendPacketInfo); }