private void ProcessMessage(byte[] data, int dataSize, ulong sender, TimeSpan timestamp)
        {
            Debug.Assert(data.Length >= dataSize, "Wrong size");

            MyMessageId id = (MyMessageId)data[0];

            MyPacket p = new MyPacket();

            p.Data          = data;
            p.PayloadOffset = 1; // First byte is message id
            p.PayloadLength = dataSize - p.PayloadOffset;
            p.Sender        = new VRage.Network.EndpointId(sender);
            p.Timestamp     = timestamp;

            Action <MyPacket> handler;

            if (m_handlers.TryGetValue(id, out handler))
            {
                ProfilerShort.Begin(MyEnum <MyMessageId> .GetName(id));
                NetProfiler.Begin(MyEnum <MyMessageId> .GetName(id));
                handler(p);
                NetProfiler.End(p.PayloadLength);
                ProfilerShort.End();
            }
            else
            {
                Debug.Fail("No handler for message type: " + id);
            }
        }
Beispiel #2
0
        private void HandleMessage(MyPacket p)
        {
            int         bitPosition = p.BitStream.BitPosition;
            MyMessageId id          = (MyMessageId)p.BitStream.ReadByte(8);

            if (id == MyMessageId.FLUSH)
            {
                this.ClearBuffer();
                p.Return();
            }
            else
            {
                p.BitStream.SetBitPositionRead(bitPosition);
                if ((this.IsBuffering && ((id != MyMessageId.JOIN_RESULT) && ((id != MyMessageId.WORLD_DATA) && (id != MyMessageId.WORLD)))) && (id != MyMessageId.PLAYER_DATA))
                {
                    this.m_buffer.Add(p);
                }
                else
                {
                    this.ProfilePacketStatistics(true);
                    MyStatsGraph.Begin("Live data", 0, "HandleMessage", 0xc5, @"E:\Repo1\Sources\Sandbox.Game\Engine\Multiplayer\MyTransportLayer.cs");
                    this.ProcessMessage(p);
                    float?bytesTransfered = null;
                    MyStatsGraph.End(bytesTransfered, 0f, "", "{0} B", null, "HandleMessage", 0xc7, @"E:\Repo1\Sources\Sandbox.Game\Engine\Multiplayer\MyTransportLayer.cs");
                    this.ProfilePacketStatistics(false);
                }
            }
        }
Beispiel #3
0
 public void SendMessage(MyMessageId id, IPacketData data, bool reliable, List <EndpointId> endpoints, byte index = 0)
 {
     MyNetworkWriter.MyPacketDescriptor packet = this.InitSendStream(EndpointId.Null, reliable ? MyP2PMessageEnum.ReliableWithBuffering : MyP2PMessageEnum.Unreliable, id, index);
     packet.Recipients.AddRange(endpoints);
     packet.Data = data;
     MyNetworkWriter.SendPacket(packet);
 }
Beispiel #4
0
        public void Unregister(MyMessageId messageId, byte receiverIndex)
        {
            HandlerId key = new HandlerId {
                messageId     = messageId,
                receiverIndex = receiverIndex
            };

            this.m_handlers.Remove(key);
        }
Beispiel #5
0
        public void Register(MyMessageId messageId, byte receiverIndex, Action <MyPacket> handler)
        {
            HandlerId key = new HandlerId {
                messageId     = messageId,
                receiverIndex = receiverIndex
            };

            this.m_handlers.Add(key, handler);
        }
        public unsafe void SendMessage(MyMessageId id, BitStream stream, bool reliable, EndpointId endpoint)
        {
            m_sendStream.Position = 0;
            m_sendStream.WriteByte((byte)id);
            if (stream != null)
            {
                m_sendStream.WriteNoAlloc((byte *)(void *)stream.DataPointer, 0, stream.BytePosition);
            }

            SendMessage(m_sendStream, reliable ? P2PMessageEnum.ReliableWithBuffering : P2PMessageEnum.Unreliable, endpoint.Value, m_channel);
        }
Beispiel #7
0
        private void ProcessMessage(byte[] data, int dataSize, ulong sender, MyTimeSpan timestamp, MyTimeSpan receivedTime)
        {
            Debug.Assert(data.Length >= dataSize, "Wrong size");

            MyMessageId id = (MyMessageId)data[0];

            if (id == MyMessageId.CLIENT_CONNNECTED)
            {
                MyNetworkClient player;
                if (Sync.Layer != null && Sync.Layer.Clients != null)
                {
                    bool playerFound = Sync.Layer.Clients.TryGetClient(sender, out player);

                    if (!playerFound)
                    {
                        Sync.Layer.Clients.AddClient(sender);
                    }
                }
            }

            MyPacket p = new MyPacket
            {
                Data = data,
                // First byte is message id
                PayloadOffset = 1,
                PayloadLength = dataSize - 1,
                Sender        = new VRage.Network.EndpointId(sender),
                Timestamp     = timestamp,
                ReceivedTime  = receivedTime
            };

            Action <MyPacket> handler;

            if (m_handlers.TryGetValue(id, out handler))
            {
                ProfilerShort.Begin(MyEnum <MyMessageId> .GetName(id));
                NetProfiler.Begin(MyEnum <MyMessageId> .GetName(id));
                handler(p);
                NetProfiler.End(p.PayloadLength);
                ProfilerShort.End();
            }
            else
            {
                Debug.Fail("No handler for message type: " + id);
            }
        }
Beispiel #8
0
        private void HandleMessage(byte[] data, int dataSize, ulong sender, MyTimeSpan timestamp, MyTimeSpan receivedTime)
        {
            if (dataSize < sizeof(byte)) // This would cause crash, message has to contain at least MyMessageId
            {
                return;
            }

            ProfilerShort.Begin("Handle message");

            if (sender != Sync.MyId)
            {
                ByteCountReceived += dataSize;
            }

            MyMessageId id = (MyMessageId)data[0];

            LogStats(ReceiveStats, "", dataSize, 1, P2PMessageEnum.Reliable);


            m_thisFrameTraffic[(int)id] += dataSize;

            if (id == MyMessageId.OLD_GAME_EVENT_FLUSH) // Flush buffer
            {
                if (m_buffer != null)
                {
                    m_buffer.Clear();
                }
            }
            else if (IsBuffering && id != MyMessageId.JOIN_RESULT && id != MyMessageId.WORLD_DATA && id != MyMessageId.WORLD_BATTLE_DATA)  // Buffer event
            {
                var buff = new Buffer();
                buff.Sender = sender;
                buff.Data   = new byte[dataSize];
                Array.Copy(data, buff.Data, dataSize);
                buff.ReceivedTime = MyTimeSpan.FromTicks(Stopwatch.GetTimestamp());
                m_buffer.Add(buff);
            }
            else // Process event
            {
                NetProfiler.Begin("Live data", 0);
                ProcessMessage(data, dataSize, sender, timestamp, receivedTime);
                NetProfiler.End();
            }

            ProfilerShort.End();
        }
        public unsafe void SendMessage(MyMessageId id, BitStream stream, bool reliable, EndpointId endpoint,
                                       byte index = 0)
        {
            var sendStream = _sendStreamCache.Value;
            var channel    = _transportChannel(TransportLayer);

            var mode = reliable ? MyP2PMessageEnum.ReliableWithBuffering : MyP2PMessageEnum.Unreliable;

            if (reliable && stream != null)
            {
                byte b = (byte)(stream.BytePosition / _sizeMtr + 1);
                for (int i = 0; i < b; i++)
                {
                    sendStream.Position = 0L;
                    sendStream.WriteByte((byte)id);
                    sendStream.WriteByte(index);
                    sendStream.WriteByte(i == 0 ? b : (byte)0);

                    int num  = i * (_sizeMtr - 3);
                    int num2 = _sizeMtr - 3;
                    if (num + num2 > stream.BytePosition)
                    {
                        num2 = stream.BytePosition - num;
                    }

                    sendStream.WriteNoAlloc((byte *)stream.DataPointer.ToPointer(), num, num2);

                    _transportSendMessage(TransportLayer, sendStream, mode, endpoint.Value, channel);
                }

                return;
            }

            sendStream.Position = 0L;
            sendStream.WriteByte((byte)id);
            sendStream.WriteByte(index);
            sendStream.WriteByte(1);
            if (stream != null)
            {
                sendStream.WriteNoAlloc((byte *)stream.DataPointer.ToPointer(), 0, stream.BytePosition);
            }

            _transportSendMessage(TransportLayer, sendStream, mode, endpoint.Value, channel);
        }
        private void HandleMessage(byte[] data, int dataSize, ulong sender, TimeSpan timestamp)
        {
            if (dataSize < sizeof(byte)) // This would cause crash, message has to contain at least MyMessageId
            {
                return;
            }

            ProfilerShort.Begin("Handle message");

            if (sender != Sync.MyId)
            {
                ByteCountReceived += dataSize;
            }

            MyMessageId id = (MyMessageId)data[0];

            m_thisFrameTraffic[(int)id] += dataSize;

            if (id == MyMessageId.OLD_GAME_EVENT_FLUSH) // Flush buffer
            {
                if (m_buffer != null)
                {
                    m_buffer.Clear();
                }
            }
            else if (IsBuffering) // Buffer event
            {
                var buff = new Buffer();
                buff.Sender = sender;
                buff.Data   = new byte[dataSize];
                Array.Copy(data, buff.Data, dataSize);
                m_buffer.Add(buff);
            }
            else // Process event
            {
                NetProfiler.Begin("Live data", 0);
                ProcessMessage(data, dataSize, sender, timestamp);
                NetProfiler.End();
            }

            ProfilerShort.End();
        }
 public void Unregister(MyMessageId messageId)
 {
     m_handlers.Remove(messageId);
 }
 public void Register(MyMessageId messageId, Action <MyPacket> handler)
 {
     m_handlers.Add(messageId, handler);
 }
 public bool IsRegistered(MyMessageId messageId)
 {
     return(m_handlers.ContainsKey(messageId));
 }
Beispiel #14
0
 private MyNetworkWriter.MyPacketDescriptor InitSendStream(EndpointId endpoint, MyP2PMessageEnum msgType, MyMessageId msgId, byte index = 0)
 {
     MyNetworkWriter.MyPacketDescriptor descriptor1 = MyNetworkWriter.GetPacketDescriptor(endpoint, msgType, this.m_channel);
     descriptor1.Header.WriteByte((byte)msgId);
     descriptor1.Header.WriteByte(index);
     return(descriptor1);
 }
Beispiel #15
0
 public void SendMessage(MyMessageId id, IPacketData data, bool reliable, EndpointId endpoint, byte index = 0)
 {
     MyNetworkWriter.MyPacketDescriptor packet = this.InitSendStream(endpoint, reliable ? MyP2PMessageEnum.ReliableWithBuffering : MyP2PMessageEnum.Unreliable, id, index);
     packet.Data = data;
     MyNetworkWriter.SendPacket(packet);
 }