예제 #1
0
 static void SendHandler(ulong remoteUser, byte[] data, int byteCount, P2PMessageEnum msgType, int channel)
 {
     if (!Peer2Peer.SendPacket(remoteUser, data, byteCount, msgType, channel))
     {
         System.Diagnostics.Debug.Fail("P2P packet send fail");
     }
 }
예제 #2
0
        void SendHandler(ulong remoteUser, byte[] data, int byteCount, P2PMessageEnum msgType, int channel)
        {
            if (msgType == P2PMessageEnum.ReliableWithBuffering)
            {
                m_pendingFlushes.Add(remoteUser);
            }

            ByteCountSent += byteCount;
            if (!Peer2Peer.SendPacket(remoteUser, data, byteCount, msgType, channel))
            {
                System.Diagnostics.Debug.Fail("P2P packet send fail");
            }
        }
예제 #3
0
        public void SendMessage <TMessage>(ref TMessage msg, List <ulong> recipients, MyTransportMessageEnum messageType, bool includeSelf)
            where TMessage : struct
        {
            if (recipients.Count == 0 && !includeSelf)
            {
                return;
            }

            var msgId = GetId <TMessage>(messageType);
            ITransportCallback <TMessage> c = (ITransportCallback <TMessage>)m_callbacks[msgId.Item1].Callback;
            P2PMessageEnum sendType         = msgId.Item2;

            m_sendStream.Position = 0;
            m_sendStream.WriteByte((byte)MyMessageId.OLD_GAME_EVENT);
            m_sendStream.WriteUShort(msgId.Item1);
            c.Write(m_sendStream, ref msg);

            const int mtu = 1200;

            if ((sendType == P2PMessageEnum.Unreliable || sendType == P2PMessageEnum.UnreliableNoDelay) && m_sendStream.Position > mtu)
            {
                Debug.Fail("Sending unreliable message as reliable, because it's bigger than MTU, message type: " + FindDebugName(msgId.Item1));
                sendType = P2PMessageEnum.ReliableWithBuffering;
            }

            if (sendType == P2PMessageEnum.Reliable) // Always with buffering
            {
                sendType = P2PMessageEnum.ReliableWithBuffering;
            }

            Stats.Network.WriteFormat(StatName <TMessage> .Name, (int)m_sendStream.Position, VRage.Stats.MyStatTypeEnum.CounterSum, 1000, 0);

            if (!MySandboxGame.IsDedicated)
            {
                LogStats(SendStats, TypeNameHelper <TMessage> .Name, (int)m_sendStream.Position, recipients.Count, msgId.Item2);
            }

            if (includeSelf)
            {
                MyTrace.Send(TraceWindow.Multiplayer, "Loopback: " + typeof(TMessage).Name);
                m_loopback(m_sendStream.Data, (int)m_sendStream.Position, Sync.MyId);
            }

            foreach (var sendTo in recipients)
            {
                Debug.Assert(Sync.MultiplayerActive);
                TraceMessage("Sending: ", msg.ToString(), sendTo, m_sendStream.Position, sendType);
                SendMessage(m_sendStream, sendType, sendTo, m_channel);
            }
        }
예제 #4
0
 public void EnqueueSend(ulong sendTo, byte[] data, int length, P2PMessageEnum sendType, int channel)
 {
     var msg = GetMessage();
     msg.Timestamp = DateTime.UtcNow;
     if (msg.Data.Length < length)
     {
         Array.Resize(ref msg.Data, length);
     }
     Array.Copy(data, 0, msg.Data, 0, length);
     msg.Length = length;
     msg.SendType = sendType;
     msg.UserId = sendTo;
     msg.Channel = channel;
     m_sendQueue.Enqueue(msg);
 }
예제 #5
0
        public void EnqueueSend(ulong sendTo, byte[] data, int length, P2PMessageEnum sendType, int channel)
        {
            var msg = GetMessage();

            msg.Timestamp = DateTime.UtcNow;
            if (msg.Data.Length < length)
            {
                Array.Resize(ref msg.Data, length);
            }
            Array.Copy(data, 0, msg.Data, 0, length);
            msg.Length   = length;
            msg.SendType = sendType;
            msg.UserId   = sendTo;
            msg.Channel  = channel;
            m_sendQueue.Enqueue(msg);
        }
예제 #6
0
        void TraceMessage(string text, string messageText, ulong userId, long messageSize, P2PMessageEnum sendType)
        {
            string playerName;

            Sandbox.Game.World.MyNetworkClient player;
            if (MyMultiplayer.Static != null && MyMultiplayer.Static.SyncLayer.Clients.TryGetClient(userId, out player))
            {
                playerName = player.DisplayName;
            }
            else
            {
                playerName = userId.ToString();
            }

            MyTrace.Send(TraceWindow.Multiplayer, text + messageText, playerName + ", " + messageSize + " B");
            if (sendType == P2PMessageEnum.Reliable || sendType == P2PMessageEnum.ReliableWithBuffering)
            {
                MyTrace.Send(TraceWindow.MultiplayerFiltered, text + messageText, playerName + ", " + messageSize + " B");
            }
        }
예제 #7
0
 public MessageIdAttribute(ushort messageId, P2PMessageEnum sendType)
 {
     Debug.Assert(messageId < ushort.MaxValue / 4, "Message ID must be smaller than ushort.MaxValue/4, it's used for Request/Success/Failure flags");
     MessageId = messageId;
     SendType  = sendType;
 }
예제 #8
0
 void SendMessage(ByteStream sendStream, P2PMessageEnum sendType, ulong sendTo, int channel)
 {
     SendHandler(sendTo, sendStream.Data, (int)sendStream.Position, sendType, channel);
 }
예제 #9
0
        private static void LogStats(Dictionary <string, NetworkStat> logTo, string name, int size, int recipientCount, P2PMessageEnum messageType)
        {
            NetworkStat stat;

            if (!logTo.TryGetValue(name, out stat))
            {
                stat = new NetworkStat();
                logTo.Add(name, stat);
            }
            stat.TotalSize    += size * recipientCount;
            stat.MessageCount += recipientCount;
            stat.IsReliable    = messageType == P2PMessageEnum.Reliable || messageType == P2PMessageEnum.ReliableWithBuffering;
            stat.UniqueMessageCount++;
        }
예제 #10
0
 public unsafe static bool SendPacket(ulong remoteUser, byte[] data, int byteCount, P2PMessageEnum msgType, int channel)
 {
     // int dataPtr_07_cp_1 = 0;
     // ISteamNetworking* remoteUser2 = Peer2Peer.GetSteamNetworking();
     // CSteamID data2 = remoteUser;
     // return calli(System.Byte modopt(System.Runtime.CompilerServices.CompilerMarshalOverride) modopt(System.Runtime.CompilerServices.CallConvCdecl)(System.IntPtr,CSteamID,System.Void modopt(System.Runtime.CompilerServices.IsConst)*,System.UInt32,EP2PSend,System.Int32), remoteUser2, data2, ref data[dataPtr_07_cp_1], byteCount, msgType, channel, *(*(long*)remoteUser2));
     return false;
 }
예제 #11
0
 public unsafe static bool SendPacket(ulong remoteUser, byte* dataPtr, int byteCount, P2PMessageEnum msgType, int channel)
 {
     // CSteamID byteCount2 = remoteUser;
     // if (<Module>.CSteamID.IsValid(ref byteCount2) != null)
     // {
     //     ISteamNetworking* remoteUser2 = Peer2Peer.GetSteamNetworking();
     //     CSteamID dataPtr2 = remoteUser;
     //     return calli(System.Byte modopt(System.Runtime.CompilerServices.CompilerMarshalOverride) modopt(System.Runtime.CompilerServices.CallConvCdecl)(System.IntPtr,CSteamID,System.Void modopt(System.Runtime.CompilerServices.IsConst)*,System.UInt32,EP2PSend,System.Int32), remoteUser2, dataPtr2, dataPtr, byteCount, msgType, channel, *(*(long*)remoteUser2));
     // }
     return false;
 }
예제 #12
0
 public unsafe static bool SendPacket(ulong remoteUser, byte[] data, int byteCount, P2PMessageEnum msgType, int channel)
 {
     // int dataPtr_07_cp_1 = 0;
     // ISteamNetworking* remoteUser2 = Peer2Peer.GetSteamNetworking();
     // CSteamID data2 = remoteUser;
     // return calli(System.Byte modopt(System.Runtime.CompilerServices.CompilerMarshalOverride) modopt(System.Runtime.CompilerServices.CallConvCdecl)(System.IntPtr,CSteamID,System.Void modopt(System.Runtime.CompilerServices.IsConst)*,System.UInt32,EP2PSend,System.Int32), remoteUser2, data2, ref data[dataPtr_07_cp_1], byteCount, msgType, channel, *(*(long*)remoteUser2));
     return(false);
 }
예제 #13
0
 public unsafe static bool SendPacket(ulong remoteUser, byte *dataPtr, int byteCount, P2PMessageEnum msgType, int channel)
 {
     // CSteamID byteCount2 = remoteUser;
     // if (<Module>.CSteamID.IsValid(ref byteCount2) != null)
     // {
     //     ISteamNetworking* remoteUser2 = Peer2Peer.GetSteamNetworking();
     //     CSteamID dataPtr2 = remoteUser;
     //     return calli(System.Byte modopt(System.Runtime.CompilerServices.CompilerMarshalOverride) modopt(System.Runtime.CompilerServices.CallConvCdecl)(System.IntPtr,CSteamID,System.Void modopt(System.Runtime.CompilerServices.IsConst)*,System.UInt32,EP2PSend,System.Int32), remoteUser2, dataPtr2, dataPtr, byteCount, msgType, channel, *(*(long*)remoteUser2));
     // }
     return(false);
 }