public static void Handle(ulong clientId, Packet packet, SslStream stream) { Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload); TdfInteger gid = (TdfInteger)data["GID"]; TdfList pcap = (TdfList)data["PCAP"]; Database.UpdateGameCapacity(gid.value, pcap.list); TdfEncoder encoder = new TdfEncoder(); byte[] payload = encoder.Encode(); Utilities.SendPacket(new Packet { componentId = Component.GAMEMANAGER, commandId = 0x5, errorCode = 0, msgType = MessageType.REPLY, msgNum = packet.msgNum, payload = payload, payloadSize = payload.Length }, stream); GameCapacityChangeNotification.Notify(gid.value, pcap.list, stream); }
public static void Handle(ulong clientId, Packet packet, SslStream stream) { Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload); TdfUnion addr = (TdfUnion)data["ADDR"]; TdfStruct valu = (TdfStruct)addr.data.Find(tdf => tdf.label == "VALU"); TdfStruct inip = (TdfStruct)valu.data.Find(tdf => tdf.label == "INIP"); TdfInteger ip = (TdfInteger)inip.data.Find(tdf => tdf.label == "IP"); TdfInteger port = (TdfInteger)inip.data.Find(tdf => tdf.label == "PORT"); Log.Debug(string.Format("Updating internal network info for client {0}.", clientId)); ClientManager.UpdateClientInternalNetworkData(clientId, ip.value, (ushort)port.value); TdfEncoder encoder = new TdfEncoder(); byte[] payload = encoder.Encode(); Utilities.SendPacket(new Packet { componentId = Component.USERSESSIONS, commandId = 0x14, errorCode = 0, msgType = MessageType.REPLY, msgNum = packet.msgNum, payload = payload, payloadSize = payload.Length }, stream); }
public static void Handle(Packet packet, SslStream stream) { Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload); TdfInteger gid = (TdfInteger)data["GID"]; TdfInteger gsta = (TdfInteger)data["GSTA"]; // update game state Database.UpdateGameState(gid.value, (GameState)gsta.value); Log.Info(string.Format("Advancing game state to {0} for game {1}.", (GameState)gsta.value, gid.value)); TdfEncoder encoder = new TdfEncoder(); byte[] payload = encoder.Encode(); Utilities.SendPacket(new Packet { componentId = packet.componentId, commandId = 0x3, errorCode = 0, msgType = MessageType.REPLY, msgNum = packet.msgNum, payload = payload, payloadSize = payload.Length }, stream); GameStateChangeNotification.Notify(gid.value, (GameState)gsta.value, stream); }
public static void Handle(ulong clientId, Packet packet, SslStream stream) { var client = ClientManager.GetClient(clientId); Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload); TdfInteger gameId = (TdfInteger)data["GID"]; TdfInteger personaId = (TdfInteger)data["PID"]; TdfInteger reason = (TdfInteger)data["REAS"]; // TODO: GameManager.RemovePlayer TdfEncoder encoder = new TdfEncoder(); byte[] payload = encoder.Encode(); Utilities.SendPacket(new Packet { componentId = packet.componentId, commandId = 0xB, errorCode = 0, msgType = MessageType.REPLY, msgNum = packet.msgNum, payload = payload, payloadSize = payload.Length }, stream); // send a notification that a player has been removed PlayerRemovedNotification.Notify(gameId.value, personaId.value, (PlayerRemovedReason)reason.value, stream); }
public static void Handle(ulong clientId, Packet packet, SslStream stream) { Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload); TdfList targ = (TdfList)data["TARG"]; List <Tdf> targData = (List <Tdf>)targ.list[0]; TdfInteger stat = (TdfInteger)targData[2]; TdfEncoder encoder = new TdfEncoder(); byte[] payload = encoder.Encode(); Utilities.SendPacket(new Packet { componentId = Component.GAMEMANAGER, commandId = 0x1D, errorCode = 0, msgType = MessageType.REPLY, msgNum = packet.msgNum, payload = payload, payloadSize = payload.Length }, stream); var client = ClientManager.GetClient(clientId); switch ((PlayerState)stat.value) { case PlayerState.DISCONNECTED: // TODO: GameManager.RemovePlayer? Log.Warn("*updateMeshConnection -> RemovePlayer*"); break; case PlayerState.CONNECTED: GamePlayerStateChangeNotification.Notify(clientId, stream); PlayerJoinCompletedNotification.Notify(client.gameId, client.persona.id, stream); break; default: Log.Warn("Unknown PlayerState in updateMeshCommand: " + stat.value); break; } }
public static void Handle(ulong clientId, Packet packet, SslStream stream) { Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload); TdfInteger vid = (TdfInteger)data["VID"]; TdfList eid = (TdfList)data["EID"]; ClientManager.UpdateViewID(clientId, vid.value); ClientManager.UpdateEntityIDs(clientId, eid.list); Utilities.SendPacket(new Packet { componentId = Component.STATS, commandId = 0x10, errorCode = 0, msgType = MessageType.REPLY, msgNum = packet.msgNum, payload = null, payloadSize = 0 }, stream); }
public static void Handle(ulong clientId, Packet packet, SslStream stream) { Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload); TdfMap attr = (TdfMap)data["ATTR"]; TdfInteger gid = (TdfInteger)data["GID"]; Log.Info(string.Format("Setting game attributes for game {0}.", gid.value)); var game = Database.GetGameByID(gid.value); var attributes = game.attributes; foreach (var key in attr.map.Keys) { attributes[key] = attr.map[key]; } Database.UpdateGameAttributes(gid.value, attributes); TdfEncoder encoder = new TdfEncoder(); byte[] payload = encoder.Encode(); Utilities.SendPacket(new Packet { componentId = Component.GAMEMANAGER, commandId = 0x7, errorCode = 0, msgType = MessageType.REPLY, msgNum = packet.msgNum, payload = payload, payloadSize = payload.Length }, stream); GameAttribChangeNotification.Notify(gid.value, attr.map, stream); }
public static void Handle(ulong clientId, Packet packet, SslStream stream) { Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload); TdfInteger gid = (TdfInteger)data["GID"]; TdfUnion pnet = (TdfUnion)data["PNET"]; TdfStruct valu = (TdfStruct)pnet.data.Find(tdf => tdf.label == "VALU"); TdfStruct exip = (TdfStruct)valu.data.Find(tdf => tdf.label == "EXIP"); TdfInteger exipIP = (TdfInteger)exip.data.Find(tdf => tdf.label == "IP"); TdfInteger exipPort = (TdfInteger)exip.data.Find(tdf => tdf.label == "PORT"); TdfStruct inip = (TdfStruct)valu.data.Find(tdf => tdf.label == "INIP"); TdfInteger inipIP = (TdfInteger)inip.data.Find(tdf => tdf.label == "IP"); TdfInteger inipPort = (TdfInteger)inip.data.Find(tdf => tdf.label == "PORT"); var client = ClientManager.GetClient(clientId); if (Database.GameExists(gid.value)) { // update stuff ClientManager.UpdateClientInternalNetworkData(clientId, inipIP.value, (ushort)inipPort.value); ClientManager.UpdateClientExternalNetworkData(clientId, exipIP.value, (ushort)inipPort.value); ClientManager.UpdateClientGameID(clientId, (ulong)gid.value); Log.Info(string.Format("User {0} is joining game {1}.", client.user.id, gid.value)); TdfEncoder encoder = new TdfEncoder(); encoder.WriteTdf(new List <Tdf> { new TdfInteger("GID", (ulong)gid.value), new TdfInteger("JGS", 0) }); byte[] payload = encoder.Encode(); Utilities.SendPacket(new Packet { componentId = Component.GAMEMANAGER, commandId = 0x9, errorCode = 0, msgType = MessageType.REPLY, msgNum = packet.msgNum, payload = payload, payloadSize = payload.Length }, stream); var game = Database.GetGameByID(gid.value); var gameClient = ClientManager.GetClient(game.clientId); // TODO: check if only userupdated needed UserAddedNotification.Notify(clientId, stream, true); UserUpdatedNotification.Notify(client.persona.id, stream); JoiningPlayerInitiateConnectionsNotification.Notify(clientId, stream); UserSessionExtendedDataUpdateNotification.Notify(clientId, stream, true); PlayerJoiningNotification.Notify(clientId, gameClient.stream); PlayerClaimingReservationNotification.Notify(clientId, gameClient.stream); UserSessionExtendedDataUpdateNotification.Notify(clientId, gameClient.stream, true); } else { Log.Warn(string.Format("User {0} wanted to a game that doesn't exist ({1}).", client.user.id, gid.value)); /* * not sure if we should set the error code to GAMEMANAGER_ERR_NO_DEDICATED_SERVER_FOUND (0x12D0004) * or GAMEMANAGER_ERR_INVALID_GAME_ID (0x20004) * */ Utilities.SendPacket(new Packet { componentId = Component.GAMEMANAGER, commandId = 0x9, errorCode = 0x20004, // GAMEMANAGER_ERR_INVALID_GAME_ID msgType = MessageType.ERROR_REPLY, msgNum = packet.msgNum, payload = null, payloadSize = 0 }, stream); } }
public static void Handle(ulong clientId, Packet packet) { var client = ClientManager.GetClient(clientId); Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload); TdfMap attr = (TdfMap)data["ATTR"]; TdfString gnam = (TdfString)data["GNAM"]; TdfInteger gset = (TdfInteger)data["GSET"]; TdfList pcap = (TdfList)data["PCAP"]; TdfInteger igno = (TdfInteger)data["IGNO"]; TdfInteger pmax = (TdfInteger)data["PMAX"]; TdfInteger nres = (TdfInteger)data["NRES"]; // network topology TdfInteger ntop = (TdfInteger)data["NTOP"]; TdfInteger voip = (TdfInteger)data["VOIP"]; TdfInteger pres = (TdfInteger)data["PRES"]; // TdfMin TdfInteger qcap = (TdfInteger)data["QCAP"]; //TdfString uuid = (TdfString)data["UUID"]; TdfList hnet = (TdfList)data["HNET"]; TdfStruct exip = (TdfStruct)hnet.list[0]; TdfInteger exipIP = (TdfInteger)exip.data.Find(tdf => tdf.label == "IP"); TdfInteger exipPort = (TdfInteger)exip.data.Find(tdf => tdf.label == "PORT"); TdfStruct inip = (TdfStruct)hnet.list[1]; TdfInteger inipIP = (TdfInteger)inip.data.Find(tdf => tdf.label == "IP"); TdfInteger inipPort = (TdfInteger)inip.data.Find(tdf => tdf.label == "PORT"); // TODO: don't get gameId as result but get by clientId after creating the game /* ulong gameId = GameManager.CreateGame( * * (int)gset.value, * (int)igno.value, * (int)nres.value, * (int)ntop.value, * "714b05dc-93bc-49ac-961c-cb38b574f30a" * ); */ var level = attr.map["level"].ToString(); var gametype = attr.map["levellocation"].ToString(); var game = new Database.Game(); game.clientId = clientId; game.name = gnam.value; game.attributes = attr.map; game.capacity = pcap.list; game.level = attr.map["level"].ToString(); game.gametype = attr.map["levellocation"].ToString(); game.maxPlayers = (ushort)pmax.value; game.notResetable = (byte)nres.value; game.queueCapacity = (ushort)qcap.value; game.presenceMode = (PresenceMode)pres.value; game.state = GameState.INITIALIZING; game.networkTopology = (GameNetworkTopology)ntop.value; game.voipTopology = (VoipTopology)voip.value; Database.NetworkInfo internalNetworkInfo = new Database.NetworkInfo(); internalNetworkInfo.ip = inipIP.value; internalNetworkInfo.port = (ushort)inipPort.value; Database.NetworkInfo externalNetworkInfo = new Database.NetworkInfo(); externalNetworkInfo.ip = exipIP.value; externalNetworkInfo.port = (ushort)exipPort.value; game.internalNetworkInfo = internalNetworkInfo; game.externalNetworkInfo = externalNetworkInfo; ulong gameId = Database.CreateGame(game); TdfEncoder encoder = new TdfEncoder(); encoder.WriteTdf(new List <Tdf> { // this one is tdfmin new TdfInteger("GID", (ulong)gameId) }); byte[] payload = encoder.Encode(); Utilities.SendPacket(new Packet { componentId = Component.GAMEMANAGER, commandId = 0x1, errorCode = 0, msgType = MessageType.REPLY, msgNum = packet.msgNum, payload = payload, payloadSize = payload.Length }, client.stream); GameStateChangeNotification.Notify(gameId, game.state, client.stream); GameSetupNotification.Notify(clientId, gameId, client.stream); }
private void WriteTdfInteger(TdfInteger tdf) { // write value WriteInteger(tdf.value); }
public static void Handle(ulong clientId, Packet packet, SslStream stream) { Dictionary <string, Tdf> data = Utilities.DecodePayload(packet.payload); TdfString auth = (TdfString)data["AUTH"]; ClientManager.UpdateClientAuthToken(clientId, auth.value); TdfInteger pid = (TdfInteger)data["PID"]; var user = Database.GetUser(pid.value); if (user.mail != null) { ClientManager.SetClientUser(clientId, user); } else { Log.Warn(string.Format("Could not find user by persona ID {0}.", pid.value)); } Log.Info(string.Format("Performing silent login with persona {0} for user {1}.", pid.value, user.id)); var persona = Database.GetPersona(pid.value); if (persona.name != null) { //Log.Info(string.Format("User {0} logging in to persona {1} with auth token {2}.", user.id, persona.name, auth.value)); ClientManager.SetClientPersona(clientId, persona); } else { Log.Warn(string.Format("Could not find persona {0} for user {1}.", pid.value, user.id)); } // not sure what is this type for //TdfInteger type = (TdfInteger)data.Find(tdf => tdf.label == "TYPE"); var client = ClientManager.GetClient(clientId); TdfEncoder encoder = new TdfEncoder(); encoder.WriteTdf(new List <Tdf> { new TdfInteger("AGUP", 0), new TdfString("LDHT", ""), new TdfInteger("NTOS", 0), new TdfString("PCTK", "fa1a26c1-d934-422a-a6ba-ed92614f7d87"), new TdfString("PRIV", ""), new TdfStruct("SESS", new List <Tdf> { new TdfInteger("BUID", client.persona.id), new TdfInteger("FRST", 0), new TdfString("KEY", "some_key"), new TdfInteger("LLOG", Utilities.GetUnixTime()), new TdfString("MAIL", client.user.mail), // TODO: get mail for client new TdfStruct("PDTL", new List <Tdf> { new TdfString("DSNM", client.persona.name), // persona display name new TdfInteger("LAST", Utilities.GetUnixTime()), // time of last persona authentication new TdfInteger("PID", client.persona.id), // persona ID new TdfInteger("STAS", 0), // should be ACTIVE(2)? new TdfInteger("XREF", 0), new TdfInteger("XTYP", (ulong)ExternalRefType.BLAZE_EXTERNAL_REF_TYPE_UNKNOWN) // this is actually a TdfMin }), new TdfInteger("UID", clientId) }), new TdfInteger("SPAM", 0), new TdfString("THST", ""), new TdfString("TSUI", ""), new TdfString("TURI", "") }); byte[] payload = encoder.Encode(); Utilities.SendPacket(new Packet { componentId = Component.AUTHENTICATION, commandId = 0x32, errorCode = 0, msgType = MessageType.REPLY, msgNum = packet.msgNum, 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); }