private void ProcessGetCharacters(ClientConnection client, SubPacket packet) { Program.Log.Info("{0} => Get characters", client.currentUserId == 0 ? client.GetAddress() : "User " + client.currentUserId); SendWorldList(client, packet); SendImportList(client, packet); SendRetainerList(client, packet); SendCharacterList(client, packet); }
private void ProcessSelectCharacter(ClientConnection client, SubPacket packet) { SelectCharacterPacket selectCharRequest = new SelectCharacterPacket(packet.data); Program.Log.Info("{0} => Select character id {1}", client.currentUserId == 0 ? client.GetAddress() : "User " + client.currentUserId, selectCharRequest.characterId); Character chara = Database.GetCharacter(client.currentUserId, selectCharRequest.characterId); World world = null; if (chara != null) { world = Database.GetServer(chara.serverId); } if (world == null) { ErrorPacket errorPacket = new ErrorPacket(selectCharRequest.sequence, 0, 0, 13001, "World Does not exist or is inactive."); SubPacket subpacket = errorPacket.BuildPacket(); BasePacket basePacket = BasePacket.CreatePacket(subpacket, true, false); BasePacket.EncryptPacket(client.blowfish, basePacket); client.QueuePacket(basePacket); return; } SelectCharacterConfirmPacket connectCharacter = new SelectCharacterConfirmPacket(selectCharRequest.sequence, selectCharRequest.characterId, client.currentSessionToken, world.address, world.port, selectCharRequest.ticket); BasePacket outgoingPacket = BasePacket.CreatePacket(connectCharacter.BuildPackets(), true, false); BasePacket.EncryptPacket(client.blowfish, outgoingPacket); client.QueuePacket(outgoingPacket); }
private void ReceiveCallback(IAsyncResult result) { ClientConnection conn = (ClientConnection)result.AsyncState; try { int bytesRead = conn.socket.EndReceive(result); bytesRead += conn.lastPartialSize; if (bytesRead > 0) { int offset = 0; //Build packets until can no longer or out of data while (true) { BasePacket basePacket = BuildPacket(ref offset, conn.buffer, bytesRead); //If can't build packet, break, else process another if (basePacket == null) { break; } else { mProcessor.ProcessPacket(conn, basePacket); } } //Not all bytes consumed, transfer leftover to beginning if (offset < bytesRead) { Array.Copy(conn.buffer, offset, conn.buffer, 0, bytesRead - offset); } Array.Clear(conn.buffer, bytesRead - offset, conn.buffer.Length - (bytesRead - offset)); conn.lastPartialSize = bytesRead - offset; //Build any queued subpackets into basepackets and send conn.FlushQueuedSendPackets(); if (offset < bytesRead) { //Need offset since not all bytes consumed conn.socket.BeginReceive(conn.buffer, bytesRead - offset, conn.buffer.Length - (bytesRead - offset), SocketFlags.None, new AsyncCallback(ReceiveCallback), conn); } else { //All bytes consumed, full buffer available conn.socket.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), conn); } } else { Program.Log.Info("{0} has disconnected.", conn.currentUserId == 0 ? conn.GetAddress() : "User " + conn.currentUserId); lock (mConnectionList) { conn.Disconnect(); mConnectionList.Remove(conn); } } } catch (SocketException) { if (conn.socket != null) { Program.Log.Info("{0} has disconnected.", conn.currentUserId == 0 ? conn.GetAddress() : "User " + conn.currentUserId); lock (mConnectionList) { mConnectionList.Remove(conn); } } } }