public static void Notify(ulong clientId, SslStream stream, bool joining = false)
        {
            var client = ClientManager.GetClient(clientId);

            TdfEncoder encoder = new TdfEncoder();

            // TODO: check if this is correct
            ulong longid = client.persona.id;
            string pname = client.persona.name;

            if (client.type == ClientType.CLIENT_TYPE_GAMEPLAY_USER && joining)
            {
                longid = client.gameId;
                pname = "bf3-server-pc";

                //user.data.Add(new TdfBlob("EXBB", new byte[] { }));
            }

            encoder.WriteTdf(new List<Tdf>
            {
                new TdfStruct("DATA", new List<Tdf>
                {
                    new TdfUnion("ADDR", NetworkAddressMember.MEMBER_UNSET, new List<Tdf> { }),
                    new TdfString("BPS", ""),
                    new TdfString("CTY", ""),
                    new TdfMap("DMAP", TdfBaseType.TDF_TYPE_INTEGER, TdfBaseType.TDF_TYPE_INTEGER, new Dictionary<object, object>
                    {
                        { (ulong)0x70001, (ulong)55 },
                        { (ulong)0x70002, (ulong)707 }
                    }),
                    new TdfInteger("HWFG", 0),
                    new TdfStruct("QDAT", new List<Tdf>
                    {
                        new TdfInteger("DBPS", 0),
                        new TdfInteger("NATT", (ulong)NatType.NAT_TYPE_OPEN), // TdfMin
                        new TdfInteger("UBPS", 0)
                    }),

                    new TdfInteger("UATT", 0)
                    //new TdfList("ULST", 9)
                }),
                new TdfStruct("USER", new List<Tdf>
                {
                    new TdfInteger("AID", clientId),
                    new TdfInteger("ALOC", client.localization),
                    new TdfInteger("ID", longid),
                    new TdfString("NAME", pname)
                })
            });

            byte[] payload = encoder.Encode();

            Utilities.SendPacket(new Packet
            {
                componentId = Component.USERSESSIONS,
                commandId = 0x2,
                errorCode = 0,
                msgType = MessageType.NOTIFICATION,
                msgNum = 0,

                payload = payload,
                payloadSize = payload.Length
            }, stream);
        }
Exemplo n.º 2
0
        public static void Handle(ulong clientId, Packet packet, SslStream stream)
        {
            // decode payload
            Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload);

            // read client type
            TdfStruct  cdat = (TdfStruct)data["CDAT"];
            TdfInteger type = (TdfInteger)cdat.data.Find(tdf => tdf.label == "TYPE");
            TdfString  svcn = (TdfString)cdat.data.Find(tdf => tdf.label == "SVCN");

            TdfStruct  cinf = (TdfStruct)data["CINF"];
            TdfInteger loc  = (TdfInteger)cinf.data.Find(tdf => tdf.label == "LOC");

            // set client type
            ClientManager.UpdateClientType(clientId, (ClientType)type.value);
            ClientManager.UpdateClientLocalization(clientId, loc.value);
            ClientManager.UpdateClientService(clientId, svcn.value);

            var client = ClientManager.GetClient(clientId);

            TdfList cids = new TdfList("CIDS", TdfBaseType.TDF_TYPE_INTEGER, new ArrayList
            {
                //1, 25, 4, 27, 28, 6, 7, 9, 10, 11, 30720, 30721, 30722, 30723, 20, 30725, 30726, 2000
            });

            cids.list.AddRange((new ulong[] { 1, 25, 4, 27, 28, 6, 7, 9, 10, 11, 30720, 30721, 30722, 30723, 20, 30725, 30726, 2000 }).ToArray());

            TdfEncoder encoder = new TdfEncoder();

            encoder.WriteTdf(new List <Tdf>
            {
                new TdfInteger("ANON", 0),
                new TdfString("ASRC", "300294"),
                cids,
                new TdfString("CNGN", ""),
                new TdfStruct("CONF", new List <Tdf>
                {
                    new TdfMap("CONF", TdfBaseType.TDF_TYPE_STRING, TdfBaseType.TDF_TYPE_STRING, new Dictionary <object, object>
                    {
                        { "connIdleTimeout", "90s" },
                        { "defaultRequestTimeout", "80s" },
                        { "pingPeriod", "20s" },
                        { "voipHeadsetUpdateRate", "1000" },
                        { "xlspConnectionIdleTimeout", "300" }
                    })
                }),
                new TdfString("INST", client.service),
                new TdfInteger("MINR", 0),
                new TdfString("NASP", "cem_ea_id"), // TODO: check if present in decoded data
                new TdfString("PILD", ""),
                new TdfString("PLAT", "pc"),        // TODO: fetch from decoded data
                new TdfString("PTAG", ""),
                new TdfStruct("QOSS", new List <Tdf>
                {
                    // bandwidth ping site info
                    new TdfStruct("BWPS", new List <Tdf>
                    {
                        new TdfString("PSA", "127.0.0.1"), // ping site address
                        new TdfInteger("PSP", 17502),      // ping site port
                        new TdfString("SNA", "ams")        // ping site name
                    }),
                    new TdfInteger("LNP", 10),             // number of latency probes
                    new TdfMap("LTPS", TdfBaseType.TDF_TYPE_STRING, TdfBaseType.TDF_TYPE_STRUCT, new Dictionary <object, object>
                    {
                        { "ams", new List <Tdf>
                          {
                              new TdfString("PSA", "127.0.0.1"), // ping site address
                              new TdfInteger("PSP", 17502),      // ping site port
                              new TdfString("SNA", "ams")        // ping site name
                          } }
                    }),
                    new TdfInteger("SVID", 1161889797) // service ID
                }),
                new TdfString("RSRC", "300294"),
                new TdfString("SVER", "Blaze 3.15.08.0 (CL# 1060080)")
            });

            byte[] payload = encoder.Encode();

            Utilities.SendPacket(new Packet
            {
                componentId = Component.UTIL,
                commandId   = 0x7,
                errorCode   = 0,
                msgType     = MessageType.REPLY,
                msgNum      = packet.msgNum,

                payload     = payload,
                payloadSize = payload.Length
            }, stream);
        }
Exemplo n.º 3
0
        public static void Notify(ulong clientId, SslStream stream)
        {
            TdfEncoder encoder = new TdfEncoder();

            var client = ClientManager.GetClient(clientId);
            var game   = Database.GetGameByID(client.gameId);

            encoder.WriteTdf(new List <Tdf>
            {
                new TdfInteger("GID", (ulong)client.gameId),
                new TdfStruct("PDAT", new List <Tdf>
                {
                    new TdfInteger("EXID", 0),
                    new TdfInteger("GID", (ulong)client.gameId),
                    new TdfInteger("LOC", client.localization),
                    new TdfString("NAME", client.persona.name),
                    new TdfMap("PATT", TdfBaseType.TDF_TYPE_STRING, TdfBaseType.TDF_TYPE_STRING, new Dictionary <object, object>
                    {
                        { "Premium", "False" }
                    }),
                    new TdfInteger("PID", client.persona.id),
                    new TdfUnion("PNET", NetworkAddressMember.MEMBER_IPPAIRADDRESS, new List <Tdf>
                    {
                        new TdfStruct("VALU", new List <Tdf>
                        {
                            new TdfStruct("EXIP", new List <Tdf>
                            {
                                new TdfInteger("IP", client.externalNetworkInfo.ip),
                                new TdfInteger("PORT", client.externalNetworkInfo.port)
                            }),
                            new TdfStruct("INIP", new List <Tdf>
                            {
                                new TdfInteger("IP", client.internalNetworkInfo.ip),
                                new TdfInteger("PORT", client.internalNetworkInfo.port)
                            })
                        })
                    }),
                    new TdfInteger("SID", 1),  // TODO: check what the f**k is this...
                    new TdfInteger("SLOT", 0),
                    new TdfInteger("STAT", 2), // TODO: get enum for this, it's probably ACTIVE
                    new TdfInteger("TIDX", 65535),
                    new TdfInteger("TIME", 0), // TODO: time goes here?
                    new TdfVector3("UGID", 0, 0, 0),
                    new TdfInteger("UID", client.persona.id)
                })
            });

            byte[] payload = encoder.Encode();

            Utilities.SendPacket(new Packet
            {
                componentId = Component.GAMEMANAGER,
                commandId   = 0x19,
                errorCode   = 0,
                msgType     = MessageType.NOTIFICATION,
                msgNum      = 0,

                payload     = payload,
                payloadSize = payload.Length
            }, stream);
        }
        public static void Notify(ulong clientId, ulong gameId, SslStream stream)
        {
            var client = ClientManager.GetClient(clientId);
            var game   = Database.GetGameByID(gameId);

            TdfEncoder encoder = new TdfEncoder();

            encoder.WriteTdf(new TdfStruct("GAME", new List <Tdf>
            {
                new TdfList("ADMN", TdfBaseType.TDF_TYPE_INTEGER, new ArrayList
                {
                    client.persona.id
                }),
                new TdfMap("ATTR", TdfBaseType.TDF_TYPE_STRING, TdfBaseType.TDF_TYPE_STRING, game.attributes),
                new TdfList("CAP", TdfBaseType.TDF_TYPE_INTEGER, game.capacity),
                // CRIT
                new TdfInteger("GID", game.id),
                new TdfString("GNAM", game.name),
                new TdfInteger("GPVH", 666),
                //new TdfInteger("GSET", game.gset),
                new TdfInteger("GSID", 1),
                new TdfInteger("GSTA", (ulong)game.state),
                new TdfString("GTYP", "frostbite_multiplayer"),
                new TdfList("HNET", TdfBaseType.TDF_TYPE_STRUCT, new ArrayList
                {
                    new List <Tdf>
                    {
                        new TdfStruct("EXIP", new List <Tdf>
                        {
                            new TdfInteger("IP", game.externalNetworkInfo.ip),
                            new TdfInteger("PORT", game.externalNetworkInfo.port)
                        }),
                        new TdfStruct("INIP", new List <Tdf>
                        {
                            new TdfInteger("IP", game.internalNetworkInfo.ip),
                            new TdfInteger("PORT", game.internalNetworkInfo.port)
                        })
                    }
                }, true),
                new TdfInteger("HSES", 13666),
                /* new TdfInteger("IGNO", game.igno), */
                new TdfInteger("MCAP", game.maxPlayers),
                new TdfInteger("NRES", game.notResetable),
                new TdfInteger("NTOP", (ulong)game.networkTopology),
                new TdfString("PGID", "b6852db1-ba37-4b40-aea3-0bd16efba4f9"),
                new TdfBlob("PGSR", new byte[] { }),
                new TdfStruct("PHST", new List <Tdf>
                {
                    new TdfInteger("HPID", client.persona.id),
                    new TdfInteger("HSLT", 1)
                }),
                new TdfInteger("PRES", (ulong)game.presenceMode),
                new TdfString("PSAS", "ams"),
                new TdfInteger("QCAP", (ulong)game.queueCapacity),
                new TdfUnion("REAS", NetworkAddressMember.MEMBER_XBOXCLIENTADDRESS, new List <Tdf> {
                }),
                new TdfStruct("VALU", new List <Tdf>
                {
                    new TdfInteger("DCTX", 0)
                }),
                new TdfInteger("SEED", 2291),
                new TdfInteger("TCAP", 0),
                new TdfStruct("THST", new List <Tdf>
                {
                    new TdfInteger("HPID", client.gameId),
                    new TdfInteger("HSLT", 0)
                }),
                //new TdfString("UUID", game.uuid),
                new TdfInteger("VOIP", (ulong)game.voipTopology),
                new TdfString("VSTR", "67")
            }));

            byte[] payload = encoder.Encode();

            Utilities.SendPacket(new Packet
            {
                componentId = Component.GAMEMANAGER,
                commandId   = 0x14,
                errorCode   = 0,
                msgType     = MessageType.NOTIFICATION,
                msgNum      = 0,

                payload     = payload,
                payloadSize = payload.Length
            }, stream);
        }
        public static void Notify(ulong clientId, SslStream stream, bool ulst = false)
        {
            var client = ClientManager.GetClient(clientId);

            TdfEncoder encoder = new TdfEncoder();

            TdfList pslm = new TdfList("PSLM", TdfBaseType.TDF_TYPE_INTEGER, new ArrayList {
            });

            pslm.list.AddRange(new ulong[] { 268374015, 268374015, 268374015, 268374015, 268374015 });

            TdfStruct data = new TdfStruct("DATA", new List <Tdf>
            {
                new TdfUnion("ADDR", NetworkAddressMember.MEMBER_IPPAIRADDRESS, new List <Tdf>
                {
                    new TdfStruct("VALU", new List <Tdf>
                    {
                        new TdfStruct("EXIP", new List <Tdf>
                        {
                            new TdfInteger("IP", client.externalNetworkInfo.ip),
                            new TdfInteger("PORT", client.externalNetworkInfo.port)
                        }),
                        new TdfStruct("INIP", new List <Tdf>
                        {
                            new TdfInteger("IP", client.internalNetworkInfo.ip),
                            new TdfInteger("PORT", client.internalNetworkInfo.port)
                        })
                    })
                }),
                new TdfString("BPS", "ams"),
                new TdfString("CTY", ""),
                new TdfInteger("HWFG", 0),
                pslm,
                new TdfInteger("UATT", 0)
            });

            if (ulst == true)
            {
                data.data.Add(new TdfList("ULST", TdfBaseType.TDF_TYPE_BLAZE_OBJECT_ID, new ArrayList
                {
                    new TdfVector3("0", 0x4, 0x1, client.gameId)
                }));
            }

            encoder.WriteTdf(new List <Tdf>
            {
                data,
                new TdfInteger("USID", client.persona.id)
            });

            byte[] payload = encoder.Encode();

            Utilities.SendPacket(new Packet
            {
                componentId = Component.USERSESSIONS,
                commandId   = 0x1,
                errorCode   = 0,
                msgType     = MessageType.NOTIFICATION,
                msgNum      = 0,

                payload     = payload,
                payloadSize = payload.Length
            }, stream);
        }