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); }
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); }
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); }