/// <summary> /// </summary> /// <param name="sender"> /// </param> /// <param name="message"> /// </param> public void Handle(object sender, Message message) { var client = (Client)sender; var selectCharacterMessage = (SelectCharacterMessage)message.Body; var checkLogin = new CheckLogin(); if (checkLogin.IsCharacterOnAccount(client, selectCharacterMessage.CharacterId) == false) { Colouring.Push(ConsoleColor.Green); Console.WriteLine( "Client '" + client.AccountName + "' tried to log in as CharID " + selectCharacterMessage.CharacterId + " but it is not on their account!"); Colouring.Pop(); // NV: Is this really what we want to send? Should find out sometime... client.Send(0x00001F83, new LoginErrorMessage { Error = LoginError.InvalidUserNamePassword }); client.Server.DisconnectClient(client); return; } if (OnlineDao.IsOnline(selectCharacterMessage.CharacterId).Online == 1) { Console.WriteLine( "Client '" + client.AccountName + "' is trying to login, but the requested character is already logged in."); client.Send(0x00001F83, new LoginErrorMessage { Error = LoginError.AlreadyLoggedIn }); client.Server.DisconnectClient(client); return; } OnlineDao.SetOnline(selectCharacterMessage.CharacterId); IPAddress zoneIpAdress; if (IPAddress.TryParse(ConfigReadWrite.Instance.CurrentConfig.ZoneIP, out zoneIpAdress) == false) { IPHostEntry zoneHost = Dns.GetHostEntry(ConfigReadWrite.Instance.CurrentConfig.ZoneIP); zoneIpAdress = zoneHost.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork); } var zoneRedirectionMessage = new ZoneInfoMessage { CharacterId = selectCharacterMessage.CharacterId, ServerIpAddress = zoneIpAdress, ServerPort = (ushort) ConfigReadWrite.Instance.CurrentConfig.ZonePort }; client.Send(0x0000615B, zoneRedirectionMessage); }
/// <summary> /// Read Login Character packet /// </summary> /// <param name="client"> /// Client sending /// </param> /// <param name="packet"> /// packet data /// </param> public static void Read(Client client, byte[] packet) { PacketReader reader = new PacketReader(ref packet); reader.ReadUInt16(); // Packet ID reader.ReadUInt16(); // Data length uint playerId = reader.ReadUInt32(); client.Server.Debug( client, "{0} >> LoginCharacter: PlayerID: {1}", client.Character.characterName, playerId); reader.Finish(); if (client.IsBot) { OnlineDao.SetOnline((int)playerId); } DBCharacter character = CharacterDao.GetById((int)playerId).First(); client.Character.CharacterId = playerId; client.Character.characterName = character.Name; client.Character.characterFirstName = character.FirstName; client.Character.characterLastName = character.LastName; client.ChatServer().AddClientToChannels(client); if (client.IsBot) { // and give client its own name lookup byte[] pname = PlayerName.Create(client, client.Character.CharacterId); client.Send(pname); // send server welcome message to client byte[] anonv = MsgAnonymousVicinity.Create( string.Empty, string.Format( client.ChatServer().MessageOfTheDay, AssemblyInfoclass.RevisionName + " " + AssemblyInfoclass.AssemblyVersion), string.Empty); client.Send(anonv); // TODO: Add Buddies List/BuddyOnlineStatus messages foreach (ChannelBase channel in client.Channels) { byte[] channelJoin = ChannelJoin.Create( channel.channelType, channel.ChannelId, channel.ChannelName, channel.channelFlags, new byte[] { 0x00, 0x00 }); client.Send(channelJoin); } if (!client.ChatServer().ConnectedClients.ContainsKey(client.Character.CharacterId)) { client.ChatServer().ConnectedClients.Add(client.Character.CharacterId, client); } // add yourself to that list client.KnownClients.Add(client.Character.CharacterId); } }
/// <summary> /// </summary> /// <param name="id"> /// </param> public static void SetOnline(int id) { OnlineDao.SetOnline(id); }