Exemplo n.º 1
0
 /// <summary>
 /// Causes the chunk to detect access paths.
 /// </summary>
 public void ChunkDetect()
 {
     if (!Flags.HasFlag(ChunkFlags.NEEDS_DETECT))
     {
         DetectChunkAccess();
         Flags &= ~ChunkFlags.NEEDS_DETECT;
     }
 }
Exemplo n.º 2
0
 public void ChunkDetect()
 {
     if (!Flags.HasFlag(ChunkFlags.NEEDS_DETECT))
     {
         DetectChunkAccess();
         //chunkAccessDetection = chunkAccessDetection == null ? OwningRegion.TheWorld.Schedule.StartASyncTask(DetectChunkAccess)
         //    : chunkAccessDetection.ReplaceOrFollowWith(OwningRegion.TheWorld.Schedule.AddASyncTask(DetectChunkAccess));
         Flags &= ~ChunkFlags.NEEDS_DETECT;
     }
 }
Exemplo n.º 3
0
        protected override bool QueueChunkEx(ChunkFlags flags, byte[] data, int dataSize,
                                             int sequence)
        {
            if (ResendChunkConstruct.DataSize + dataSize + NetworkHelper.MaxChunkHeaderSize >
                ResendChunkConstruct.Data.Length ||
                ResendChunkConstruct.NumChunks >= NetworkHelper.MaxPacketChunks)
            {
                Flush();
            }

            var header = new ChunkHeader
            {
                Flags    = flags,
                Size     = dataSize,
                Sequence = sequence
            };

            var dataOffset = ResendChunkConstruct.DataSize;

            dataOffset = header.Pack(ResendChunkConstruct.Data, dataOffset);

            Buffer.BlockCopy(data, 0, ResendChunkConstruct.Data, dataOffset, dataSize);
            ResendChunkConstruct.NumChunks++;
            ResendChunkConstruct.DataSize = dataOffset + dataSize;

            if (flags.HasFlag(ChunkFlags.Vital) && !flags.HasFlag(ChunkFlags.Resend))
            {
                SizeOfChunksForResends += 32 + dataSize;

                if (SizeOfChunksForResends >= NetworkHelper.ConnectionBufferSize)
                {
                    Disconnect("too weak connection (out of buffer)");
                    return(false);
                }

                var resend = new ChunkResend
                {
                    Sequence      = sequence,
                    Flags         = flags,
                    DataSize      = dataSize,
                    Data          = new byte[dataSize],
                    FirstSendTime = Time.Get(),
                    LastSendTime  = Time.Get()
                };

                Buffer.BlockCopy(data, 0, resend.Data, 0, dataSize);
                ChunksForResends.Add(resend);
            }

            return(true);
        }
Exemplo n.º 4
0
        public override bool QueueChunkEx(ChunkFlags flags, int dataSize, byte[] data, int sequence)
        {
            if (ResendQueueConstruct.DataSize +
                dataSize + NetworkCore.PACKET_HEADER_SIZE > NetworkCore.MAX_PAYLOAD)
            {
                Flush();
            }

            var header = new NetworkChunkHeader
            {
                Flags    = flags,
                Size     = dataSize,
                Sequence = sequence
            };

            var chunkDataOffset = ResendQueueConstruct.DataSize;

            chunkDataOffset = header.Pack(ResendQueueConstruct.Data, chunkDataOffset);

            Buffer.BlockCopy(data, 0, ResendQueueConstruct.Data, chunkDataOffset, dataSize);
            chunkDataOffset += dataSize;

            ResendQueueConstruct.NumChunks++;
            ResendQueueConstruct.DataSize = chunkDataOffset;

            if (flags.HasFlag(ChunkFlags.VITAL) && !flags.HasFlag(ChunkFlags.RESEND))
            {
                BufferSize += SIZEOF_NETWORK_CHUNK_RESEND + dataSize;
                if (BufferSize >= BUFFERSIZE)
                {
                    Disconnect("too weak connection (out of buffer)");
                    return(false);
                }

                var resend = new NetworkChunkResend
                {
                    Sequence      = sequence,
                    Flags         = flags,
                    DataSize      = dataSize,
                    Data          = new byte[dataSize],
                    FirstSendTime = Time.Get(),
                    LastSendTime  = Time.Get()
                };

                Buffer.BlockCopy(data, 0, resend.Data, 0, dataSize);
                ResendQueue.Enqueue(resend);
            }

            return(true);
        }
Exemplo n.º 5
0
 public override bool QueueChunk(ChunkFlags flags, byte[] data, int dataSize)
 {
     if (flags.HasFlag(ChunkFlags.Vital))
     {
         Sequence = (Sequence + 1) % NetworkHelper.MaxSequence;
     }
     return(QueueChunkEx(flags, data, dataSize, Sequence));
 }
Exemplo n.º 6
0
 public override bool QueueChunk(ChunkFlags flags, byte[] data, int dataSize)
 {
     if (flags.HasFlag(ChunkFlags.VITAL))
     {
         Sequence = (Sequence + 1) % NetworkCore.MAX_SEQUENCE;
     }
     return(QueueChunkEx(flags, dataSize, data, Sequence));
 }
Exemplo n.º 7
0
        public int Pack(byte[] inputData, int inputOffset)
        {
            inputData[inputOffset + 0] = (byte)((((int)Flags & 3) << 6) | ((Size >> 4) & 0x3F));
            inputData[inputOffset + 1] = (byte)(Size & 0xf);

            if (Flags.HasFlag(ChunkFlags.VITAL))
            {
                inputData[inputOffset + 1] |= (byte)((Sequence >> 2) & 0b1111_0000);
                inputData[inputOffset + 2]  = (byte)(Sequence & 0b1111_1111);
                return(inputOffset + 3);
            }

            return(inputOffset + 2);
        }
Exemplo n.º 8
0
        public int Unpack(byte[] inputData, int inputOffset)
        {
            Flags = (ChunkFlags)((inputData[inputOffset + 0] >> 6) & 0b11);
            Size  = ((inputData[inputOffset + 0] & 0b111111) << 4) |
                    ((inputData[inputOffset + 1] & 0b1111));
            Sequence = -1;

            if (Flags.HasFlag(ChunkFlags.VITAL))
            {
                Sequence = ((inputData[inputOffset + 1] & 0b1111_0000) << 2) |
                           ((inputData[inputOffset + 2]));
                return(inputOffset + 3);
            }

            return(inputOffset + 2);
        }