Ejemplo n.º 1
0
        private static void CreateSession(MessageData mdata, DWMessage packet)
        {
            Net_TcpDisconnected(mdata);
            var    seed = 0;
            string IP   = mdata.Get <string>("cid");

            string[] IPParts = IP.Split(':');
            seed = BitConverter.ToInt32(IPAddress.Parse(IPParts[0]).GetAddressBytes(), 0);
            TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));

            seed += (int)ts.TotalSeconds;

            var rnd = new Random(seed);
            var sid = new byte[8];

            rnd.NextBytes(sid);

            var titleID            = DWRouter.GetTitleIDForData(mdata);
            bdMatchMakingInfo info = null;

            if (titleID == TitleID.T5)
            {
                info = new MatchMakingInfoT5();
            }
            else if (titleID == TitleID.IW5)
            {
                info = new MatchMakingInfoIW5();
            }

            info.Deserialize(packet);
            info.SessionID = sid;
            info.CID       = mdata.Get <string>("cid");
            info.User      = (DWRouter.CIDToUser.ContainsKey(info.CID)) ? DWRouter.CIDToUser[info.CID] : 0;
            info.Reachable = true;

            lock (_sessions)
            {
                _sessions.Add(BitConverter.ToUInt64(sid, 0), info);
            }

            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)1);
            reply.ByteBuffer.Write((uint)1);
            reply.ByteBuffer.Write((uint)1);
            reply.ByteBuffer.WriteBlob(info.SessionID);
            reply.Send(true);

            if (titleID == TitleID.T5)
            {
                var tInfo = (MatchMakingInfoT5)info;
                Log.Debug(tInfo.OnlineID.ToString("X16") + " registered session (map " + tInfo.MapName + ", gametype " + tInfo.GameTypeName + ")");
            }
            else if (titleID == TitleID.IW5)
            {
                Log.Debug("Registered session.");
            }
        }
Ejemplo n.º 2
0
        private static void UpdateSession(MessageData mdata, DWMessage packet)
        {
            var sidBlob = packet.ByteBuffer.ReadBlob();
            var sid     = BitConverter.ToUInt64(sidBlob, 0);

            var titleID            = DWRouter.GetTitleIDForData(mdata);
            MatchMakingInfoT5 info = null;

            if (titleID == TitleID.T5)
            {
                info = new MatchMakingInfoT5();
            }
            else if (titleID == TitleID.IW5)
            {
                //info = new MatchMakingInfoIW5();
            }

            info.Deserialize(packet);
            info.SessionID   = sidBlob;
            info.CID         = mdata.Get <string>("cid");
            info.User        = (DWRouter.CIDToUser.ContainsKey(info.CID)) ? DWRouter.CIDToUser[info.CID] : 0;
            info.Reachable   = true;
            info.LastTouched = DateTime.Now;

            _sessions[sid] = info;

            if (titleID == TitleID.T5)
            {
                var tInfo = (MatchMakingInfoT5)info;
                Log.Debug(tInfo.OnlineID.ToString("X16") + " updated session (map " + tInfo.MapName + ", gametype " + tInfo.GameTypeName + ")");
            }
            else if (titleID == TitleID.IW5)
            {
                Log.Debug("Updated session.");
            }

            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)1);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((uint)0);
            reply.Send(true);
        }
Ejemplo n.º 3
0
        private static void FindSessions(MessageData mdata, DWMessage packet)
        {
            var queryType = packet.ByteBuffer.ReadUInt32(); // query type
            var vb        = packet.ByteBuffer.ReadUInt32(); // seems to be 0
            var count     = packet.ByteBuffer.ReadUInt32();

            var titleID = DWRouter.GetTitleIDForData(mdata);

            if (titleID == TitleID.T5)
            {
                if (queryType == 2)
                {
                    FindZombieSessions(mdata, packet);
                }
                else if (queryType == 4)
                {
                    // technically a UInt64, but we don't seem to like bit shifting :)
                    packet.ByteBuffer.ReadDataType(10);
                    var portbytes = packet.ByteBuffer.Read(2);
                    var ipbytes   = packet.ByteBuffer.Read(4);
                    var port      = BitConverter.ToUInt16(portbytes, 0);
                    var address   = BitConverter.ToUInt32(ipbytes, 0);
                    packet.ByteBuffer.Read(2);

                    FindSessionByIP(mdata, packet, address, port);
                }
            }
            else if (titleID == TitleID.IW5)
            {
                IEnumerable <KeyValuePair <ulong, bdMatchMakingInfo> > matchingSessions = null;
                var reply = packet.MakeReply(1, false);
                reply.ByteBuffer.Write(0x8000000000000001);
                reply.ByteBuffer.Write((uint)0);
                reply.ByteBuffer.Write((byte)13);

                Func <MatchMakingInfoIW5, bool> condition = null;

                /*switch (queryType)
                 * {
                 *  case 1:
                 *
                 *      break;
                 * }*/
                var a = packet.ByteBuffer.ReadInt32();
                var e = packet.ByteBuffer.ReadInt32();

                condition = info =>
                {
                    return(info.Playlist == e);
                };

                var rand = new Random();

                lock (_sessions)
                {
                    matchingSessions = (from session in _sessions
                                        where (session.Value.TitleID == TitleID.IW5 &&
                                               condition((MatchMakingInfoIW5)session.Value))
                                        orderby rand.Next()
                                        select session).Take((int)count);
                    reply.ByteBuffer.Write((uint)matchingSessions.Count());
                    reply.ByteBuffer.Write((uint)matchingSessions.Count());
                    foreach (var session in matchingSessions)
                    {
                        session.Value.Serialize(reply);
                    }
                }

                reply.Send(true);
            }
        }
Ejemplo n.º 4
0
        private static void CreateSession(MessageData mdata, DWMessage packet)
        {
            Net_TcpDisconnected(mdata);
            var    seed = 0;
            string IP   = mdata.Get <string>("cid");

            string[] IPParts = IP.Split(':');
            seed = BitConverter.ToInt32(IPAddress.Parse(IPParts[0]).GetAddressBytes(), 0);
            TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));

            seed += (int)ts.TotalSeconds;

            var rnd = new Random(seed);
            var sid = new byte[8];

            rnd.NextBytes(sid);

            var titleID            = DWRouter.GetTitleIDForData(mdata);
            MatchMakingInfoT5 info = null;

            if (titleID == TitleID.T5)
            {
                info = new MatchMakingInfoT5();
            }
            else if (titleID == TitleID.IW5)
            {
                //info = new MatchMakingInfoIW5();
            }

            info.Deserialize(packet);
            info.SessionID = sid;
            info.CID       = mdata.Get <string>("cid");
            info.User      = (DWRouter.CIDToUser.ContainsKey(info.CID)) ? DWRouter.CIDToUser[info.CID] : 0;
            info.Reachable = true;

            lock (_sessions)
            {
                //Delete old sessions
                int deleted = 0;
                foreach (var session in _sessions)
                {
                    if (session.Value.User == info.User)
                    {
                        _sessions.Remove(session.Key);
                        deleted++;
                    }
                }

                /*
                 * var duplicateValues = _sessions.GroupBy(x => x.Value).Where(x => x.Count() > 1);
                 *
                 * foreach (var dupSession in _sessions)
                 * {
                 *  _sessions.Remove(dupSession.Key);
                 *  deleted++;
                 * }
                 */

                Console.WriteLine("Deleted {0} old sessions whilst making a new one...", deleted);

                _sessions.Add(BitConverter.ToUInt64(sid, 0), info);
            }

            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)1);
            reply.ByteBuffer.Write((uint)1);
            reply.ByteBuffer.Write((uint)1);
            reply.ByteBuffer.WriteBlob(info.SessionID);
            reply.Send(true);

            if (titleID == TitleID.T5)
            {
                var tInfo = (MatchMakingInfoT5)info;
                Log.Debug(tInfo.OnlineID.ToString("X16") + " registered session (map " + tInfo.MapName + ", gametype " + tInfo.GameTypeName + ")");
            }
            else if (titleID == TitleID.IW5)
            {
                Log.Debug("Registered session.");
            }
        }