Exemple #1
0
        public bool ProcessNextSegment(byte[] nextSegment, int offset, int len, out IPacket packet)
        {
            packet        = null;
            CurrentPacket = null;

            if (nextSegment.Length > 0)
            {
                PacketBuffer.AddRange(new ByteArraySegment(nextSegment, offset, len));
            }

            if (PacketBuffer.Count == 0)
            {
                return(false);
            }

            if (CurrentPacket == null)
            {
                byte packetId = PacketBuffer[0];

                Func <IPacket> createPacket;
                if (ServerBound)
                {
                    createPacket = PacketReader.ServerboundPackets[packetId];
                }
                else
                {
                    createPacket = PacketReader.ClientboundPackets[packetId];
                }

                if (createPacket == null)
                {
                    throw new NotSupportedException("Unable to read packet type 0x" + packetId.ToString("X2"));
                }

                CurrentPacket = createPacket();
            }

            using (ByteListMemoryStream listStream = new ByteListMemoryStream(PacketBuffer, 1))
            {
                using (MinecraftStream ms = new MinecraftStream(listStream))
                {
                    try
                    {
                        CurrentPacket.ReadPacket(ms);
                    }
                    catch (EndOfStreamException)
                    {
                        return(false);
                    }
                }

                PacketBuffer.RemoveRange(0, (int)listStream.Position);
            }

            packet        = CurrentPacket;
            CurrentPacket = null;

            return(PacketBuffer.Count > 0);
        }
        public bool ProcessNextSegment(byte[] nextSegment, int offset, int len, out IPacket packet)
        {
            packet = null;
            CurrentPacket = null;

            if (nextSegment.Length > 0)
            {
                PacketBuffer.AddRange(new ByteArraySegment(nextSegment, offset, len));
            }

            if (PacketBuffer.Count == 0)
                return false;
            
            if (CurrentPacket == null)
            {
                byte packetId = PacketBuffer[0];

                Func<IPacket> createPacket;
                if (ServerBound)
                    createPacket = PacketReader.ServerboundPackets[packetId];
                else
                    createPacket = PacketReader.ClientboundPackets[packetId];

                if (createPacket == null)
                    throw new NotSupportedException("Unable to read packet type 0x" + packetId.ToString("X2"));

                CurrentPacket = createPacket();
            }
            
            using (ByteListMemoryStream listStream = new ByteListMemoryStream(PacketBuffer, 1))
            {
                using (MinecraftStream ms = new MinecraftStream(listStream))
                {
                    try
                    {
                        CurrentPacket.ReadPacket(ms);
                    }
                    catch (EndOfStreamException)
                    {
                        return false;
                    }
                }
                
                PacketBuffer.RemoveRange(0, (int)listStream.Position);
            }
            
            packet = CurrentPacket;
            CurrentPacket = null;

            return PacketBuffer.Count > 0;
        }