コード例 #1
0
        public static unsafe bool Slice()
        {
            if (m_Server == null)
            {
                Thread.Sleep(1);
                return(true);
            }
            if ((m_LastNetworkActivity.Elapsed && m_Server.Poll(1, SelectMode.SelectRead)) && (m_Server.Available == 0))
            {
                Debug.Trace("Disconnected");
                if (!m_SoftDisconnect)
                {
                    Gumps.MessageBoxOk("Connection lost", true, new OnClick(Engine.DestroyDialogShowAcctLogin_OnClick));
                }
                Disconnect();
                Cursor.Hourglass = false;
                m_SoftDisconnect = false;
                Engine.amMoving  = false;
                return(true);
            }
            if (m_Server.Available > 0)
            {
                if (m_Buffer == null)
                {
                    m_Buffer = new byte[0x10000];
                }
                int num = Read(m_Buffer, m_CurrFilled);
                if (num == -1)
                {
                    return(true);
                }
                m_CurrFilled += num;
                int currFilled = m_CurrFilled;
                int index      = 0;
                while (index < currFilled)
                {
                    byte          num4 = m_Buffer[index];
                    PacketHandler ph   = PacketHandlers.m_Handlers[num4];
                    if (ph == null)
                    {
                        PacketReader.Initialize(m_Buffer, index, m_CurrFilled - index, true, num4, "Unknown").Trace();
                        m_CurrFilled = 0;
                        return(true);
                    }
                    int length = ph.Length;
                    if (length == -1)
                    {
                        if ((currFilled - index) < 3)
                        {
                            break;
                        }
                        length = m_Buffer[index + 2] | (m_Buffer[index + 1] << 8);
                    }
                    if ((currFilled - index) < length)
                    {
                        break;
                    }
                    if (OnRecv != null)
                    {
                        OnRecv(length);
                    }
                    PacketReader pvSrc = PacketReader.Initialize(m_Buffer, index, length, ph.Length != -1, num4, ph.Name);
                    ph.Handle(pvSrc);
                    m_LastNetworkActivity.Reset();
                    if (OnPacketHandle != null)
                    {
                        OnPacketHandle(ph);
                    }
                    index += length;
                    if (m_CurrFilled != currFilled)
                    {
                        return(true);
                    }
                }
                m_CurrFilled -= index;
                if (m_CurrFilled > 0)
                {
                    fixed(byte *numRef = m_Buffer)
                    {
                        byte *numPtr  = numRef;
                        byte *numPtr2 = numRef + index;
                        byte *numPtr3 = numPtr + m_CurrFilled;

                        while (numPtr < numPtr3)
                        {
                            *(numPtr++) = *(numPtr2++);
                        }
                    }
                }
            }
            return(true);
        }