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