/// <summary> /// Creates a new <see cref="RequestContent"/> instance for the given client and packet /// </summary> /// <param name="gameClient">The <see cref="GameClientAsync"/> that has received a packet of information</param> /// <param name="packet">The <see cref="PacketAsync"/> of data that was received</param> public RequestContent( GameClientAsync gameClient, PacketAsync packet) { this.Client = gameClient; this.OpCode = packet.Code; this.Data = packet.Data; if (this.OpCode == OpCodes.OPCODE_DATA) { // For the DATA opcode, we have some special handling // that needs to occur now. This additional logic is // responsible for the "data opcode" and also properly // decoding the data payload var data = packet.Data; if (Client != null) // Client can be NULL if we're just asking 'can we handle this' { Client.SetClientSequenceNumber(swap16(BitConverter.ToUInt16(data, 2))); } var arglen = (ushort)(swap16(BitConverter.ToUInt16(data, 6)) - 2); var code = swap16(BitConverter.ToUInt16(data, 8)); var m = new MemoryStream(); m.Write(data, 10, arglen); this.DataOpCode = code; this.Data = m.ToArray(); } }
public void AddClient(GameClientAsync client) { this.logger.Information($"Client {client.ClientIndex} has connected"); client.OnGameClientDisconnected += Client_OnGameClientDisconnected; this.clients.Add(client); this.logger.Information($"There are {clients.Count:N0} connected clients"); }
/// <summary> /// Sends all the currently logged in clients information to the newly joined client /// </summary> /// <param name="client">The client that is joining</param> /// <returns>A promise to submit all information to the client</returns> public async Task ClientJoinedLobbyAsync(GameClientAsync client) { // Tell the incoming client who all is in the lobby foreach (var existing in this.clients) { await client.SendDataPacket(OpCodes.OPCODE_DATA_LOBBY_STATUS_UPDATE, existing.Value.last_status ?? new byte[0]); } this.clients.AddOrUpdate(client.ClientIndex, client, (index, existing) => client); }
/// <summary> /// Sends all the currently logged in clients information to the newly joined client (Aggregate Response for packet handler) /// </summary> /// <param name="client">The client that is joining</param> /// <returns>A promise to submit all information to the client</returns> public IEnumerable <ResponseContent> ClientJoinedLobbyPacketHandler(GameClientAsync client, RequestContent request) { List <ResponseContent> responseContents = new List <ResponseContent>(); // Tell the incoming client who all is in the lobby foreach (var existing in this.clients) { responseContents.Add(request.CreateResponse(OpCodes.OPCODE_DATA_LOBBY_STATUS_UPDATE, existing.Value.last_status ?? new byte[0])); } this.clients.AddOrUpdate(client.ClientIndex, client, (index, existing) => client); return(responseContents); }
public bool TryGetClient(uint index, out GameClientAsync client) { client = null; foreach (var c in clients) { if (c.ClientIndex == index) { client = c; return(true); } } return(false); }
public static AreaServerModel ConvertDate(GameClientAsync client) { if (null == client.AreaServerName) { return(null); } AreaServerModel model = new AreaServerModel(); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); model._serverName = Encoding.GetEncoding("Shift-JIS").GetString(client.AreaServerName, 0, client.AreaServerName.Length - 1); model._serverLevel = client.AreaServerLevel; model._serverStatus = client.AreaServerStatus == 0 ? "Available" : "Busy"; model._numberOfPlayers = client.Players; return(model); }
public static PlayerModel ConvertData(GameClientAsync client) { PlayerModel model = new PlayerModel(); /* * * Console.WriteLine("Character Date \n save_slot "+ save_slot + "\n char_id " +Encoding.ASCII.GetString(save_id) + " \n char_name " + Encoding.ASCII.GetString(char_id) + * "\n char_class " + char_class + "\n char_level " + char_level + "\n greeting "+ Encoding.ASCII.GetString(greeting) +"\n charmodel " +char_model + "\n char_hp " + char_HP+ * "\n char_sp " + char_SP + "\n char_gp " + char_GP + "\n onlien god counter "+ online_god_counter + "\n offline god counter "+ offline_godcounter +"\n\n\n\n full byte araray " + BitConverter.ToString(data)); * */ if (null == client.save_id || null == client.char_id || null == client.char_name || null == client.greeting) { return(null); } Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); model.save_slot = client.save_slot; model.save_id = Encoding.GetEncoding("Shift-JIS").GetString(client.save_id, 0, client.save_id.Length - 1); model.char_id = Encoding.GetEncoding("Shift-JIS").GetString(client.char_id, 0, client.char_id.Length - 1); model.char_name = Encoding.GetEncoding("Shift-JIS").GetString(client.char_name, 0, client.char_name.Length - 1); PlayerClass playerClass = (PlayerClass)client.char_class; model.char_class = playerClass.ToString(); model.char_level = client.char_level; model.greeting = Encoding.GetEncoding("Shift-JIS").GetString(client.greeting, 0, client.greeting.Length - 1); model.char_model = (int)client.char_model; model.char_HP = client.char_HP; model.char_SP = client.char_SP; model.char_GP = (int)client.char_GP; model.online_god_counter = client.online_god_counter; model.offline_godCounter = client.offline_godcounter; model.charModelFile = client.charModelFile; return(model); }
uint ExtractCharacterData(GameClientAsync client, byte[] data) { client.save_slot = data[0]; client.char_id = ReadByteString(data, 1); int pos = 1 + client.char_id.Length; client.char_name = ReadByteString(data, pos); pos += client.char_name.Length; client.char_class = data[pos++]; client.char_level = swap16(BitConverter.ToUInt16(data, pos)); pos += 2; client.greeting = ReadByteString(data, pos); pos += client.greeting.Length; client.char_model = swap32(BitConverter.ToUInt32(data, pos)); pos += 5; client.char_HP = swap16(BitConverter.ToUInt16(data, pos)); pos += 2; client.char_SP = swap16(BitConverter.ToUInt16(data, pos)); pos += 2; client.char_GP = swap32(BitConverter.ToUInt32(data, pos)); pos += 4; client.online_god_counter = swap16(BitConverter.ToUInt16(data, pos)); pos += 2; client.offline_godcounter = swap16(BitConverter.ToUInt16(data, pos)); pos += 2; client.goldCoinCount = swap16(BitConverter.ToUInt16(data, pos)); pos += 2; client.silverCoinCount = swap16(BitConverter.ToUInt16(data, pos)); pos += 2; client.bronzeCoinCount = swap16(BitConverter.ToUInt16(data, pos)); client.classLetter = GetCharacterModelClass(client.char_model); client.modelNumber = GetCharacterModelNumber(client.char_model); client.modelType = GetCharacterModelType(client.char_model); client.colorCode = GetCharacterModelColorCode(client.char_model); client.charModelFile = "xf" + client.classLetter + client.modelNumber + client.modelType + "_" + client.colorCode; return(DBAccess.getInstance().PlayerLogin(client)); }
public void RemoveClient(GameClientAsync client) { this.logger.Information($"Client {client.ClientIndex} has disconnected"); this.clients.Remove(client); this.logger.Information($"There are {clients.Count:N0} connected clients"); }
public uint PlayerLogin(GameClientAsync client) { ///////////////Player Logging /////////////////////////////////////////////////////////////////////////////// RankingDataModel model = new RankingDataModel(); DateTime dateTime = DateTime.UtcNow; model.antiCheatEngineResult = "LEGIT"; model.loginTime = dateTime.ToString("ddd MMM dd hh:mm:ss yyyy"); model.diskID = "DUMMY DISK ID VALUE !"; model.saveID = _encoding.GetString(client.save_id, 0, client.save_id.Length - 1); model.characterSaveID = _encoding.GetString(client.char_id, 0, client.char_id.Length - 1); model.characterName = _encoding.GetString(client.char_name, 0, client.char_name.Length - 1); //Buffer.BlockCopy(client.char_name,0,model.characterName,0,client.char_name.Length-1); PlayerClass playerClass = (PlayerClass)client.char_class; model.characterClassName = playerClass.ToString(); model.characterLevel = client.char_level; model.characterHP = client.char_HP; model.characterSP = client.char_SP; model.characterGP = (int)client.char_GP; model.godStatusCounterOnline = client.online_god_counter; model.averageFieldLevel = client.offline_godcounter; model.accountID = client.AccountId; ///////////////Player Logging /////////////////////////////////////////////////////////////////////////////// using ISession session = _sessionFactory.OpenSession(); using ITransaction transaction = session.BeginTransaction(); CharacterRepositoryModel characterRepositoryModel; characterRepositoryModel = session.Query <CharacterRepositoryModel>().SingleOrDefault( x => x.accountID == client.AccountId && x.charachterSaveID.Equals(model.characterSaveID)); if (characterRepositoryModel == null || characterRepositoryModel.PlayerID == -1 || characterRepositoryModel.PlayerID == 0) { characterRepositoryModel = new CharacterRepositoryModel(); characterRepositoryModel.GuildID = 0; characterRepositoryModel.GuildMaster = 0; characterRepositoryModel.accountID = client.AccountId; characterRepositoryModel.charachterSaveID = model.characterSaveID; } characterRepositoryModel.CharachterName = client.char_name; characterRepositoryModel.Greeting = client.greeting; characterRepositoryModel.ClassID = client.char_class; characterRepositoryModel.CharachterLevel = client.char_level; characterRepositoryModel.OnlineStatus = true; characterRepositoryModel.ModelNumber = (int)client.char_model; characterRepositoryModel.charHP = client.char_HP; characterRepositoryModel.charSP = client.char_SP; characterRepositoryModel.charGP = (int)client.char_GP; characterRepositoryModel.charOnlineGoat = client.online_god_counter; characterRepositoryModel.charOfflineGoat = client.offline_godcounter; characterRepositoryModel.charGoldCoin = client.goldCoinCount; characterRepositoryModel.charSilverCoin = client.silverCoinCount; characterRepositoryModel.charBronzeCoin = client.bronzeCoinCount; session.Save(model); session.SaveOrUpdate(characterRepositoryModel); transaction.Commit(); session.Close(); return((uint)characterRepositoryModel.PlayerID); }
public bool TryFindLobby(GameClientAsync gameClientAsync, out LobbyChatRoom lobbyChatRoom) { return(TryFindLobby((uint)gameClientAsync.ClientIndex, out lobbyChatRoom)); }