/// <summary>
        /// The read.
        /// </summary>
        /// <param name="client">
        /// </param>
        /// <param name="packet">
        /// </param>
        public static void Read(Client client, byte[] packet)
        {
            LogUtil.Debug(DebugInfoDetail.Network, "\r\nReceived:\r\n" + HexOutput.Output(packet));

            MemoryStream m_stream = new MemoryStream(packet);
            BinaryReader m_reader = new BinaryReader(m_stream);

            // now we should do password check and then send OK or Error
            // sending OK now
            m_stream.Position = 8;

            short userNameLength = IPAddress.NetworkToHostOrder(m_reader.ReadInt16());
            string userName = Encoding.ASCII.GetString(m_reader.ReadBytes(userNameLength));
            short loginKeyLength = IPAddress.NetworkToHostOrder(m_reader.ReadInt16());
            string loginKey = Encoding.ASCII.GetString(m_reader.ReadBytes(loginKeyLength));

            LoginEncryption loginEncryption = new LoginEncryption();

            if (loginEncryption.IsValidLogin(loginKey, client.ServerSalt, userName))
            {
                client.IsBot = true;
                byte[] chars = AccountCharacterList.Create(userName);
                LogUtil.Debug(DebugInfoDetail.Network, "\r\nReceived:\r\n" + HexOutput.Output(chars));

                client.Send(chars);
            }
            else
            {
                byte[] loginerr = LoginError.Create();
                client.Send(loginerr);
                client.Server.DisconnectClient(client);
            }
        }
 /// <summary>
 /// The new.
 /// </summary>
 /// <param name="client">
 /// </param>
 /// <param name="id">
 /// The id.
 /// </param>
 /// <returns>
 /// </returns>
 public static byte[] Create(Client client, uint id)
 {
     PacketWriter writer = new PacketWriter(20);
     writer.WriteUInt32(id);
     writer.WriteString(client.Character.characterName);
     return writer.Finish();
 }
        /// <summary>
        /// Initializes a new instance of the <see cref="Character"/> class. 
        /// The character.
        /// </summary>
        /// <param name="characterId">
        /// </param>
        /// <param name="client">
        /// </param>
        public Character(uint characterId, Client client)
            : base(characterId)
        {
            this.Client = client;

            if (characterId != 0)
            {
                this.characterName = CharacterDao.Instance.GetCharacterNameById((int)characterId);
            }
        }
        /// <summary>
        /// Read private group invite player packet
        /// </summary>
        /// <param name="client">
        /// Client sending
        /// </param>
        /// <param name="packet">
        /// Packet data
        /// </param>
        public void Read(Client client, byte[] packet)
        {
            PacketReader reader = new PacketReader(ref packet);

            reader.ReadUInt16(); // Packet ID
            reader.ReadUInt16(); // Data length
            this.playerId = reader.ReadUInt32();
            client.Server.Debug(
                client,
                "{0} >> PrivGrpInvitePlayer: PlayerID: {1}",
                client.Character.characterName,
                this.playerId);
            reader.Finish();
        }
        /// <summary>
        /// The read.
        /// </summary>
        /// <param name="client">
        /// </param>
        /// <param name="packet">
        /// </param>
        public static void Read(Client client, byte[] packet)
        {
            byte[] senderId = BitConverter.GetBytes(client.Character.CharacterId);
            Array.Reverse(senderId);

            ChannelBase channel = client.ChatServer().GetChannel(packet);

            PacketReader reader = new PacketReader(ref packet);
            reader.ReadUInt16();
            reader.ReadUInt16();
            reader.ReadUInt16();
            reader.ReadUInt16();
            reader.ReadByte();
            string text = reader.ReadString();
            string channelName = channel.ChannelName;

            // Check if it is a Chat Command (starting with a dot)
            if (!ProcessServerCommand(text, client))
            {
                byte[] newpacket = new byte[packet.Length + 4];

                Array.Copy(packet, 0, newpacket, 0, 9);
                Array.Copy(senderId, 0, newpacket, 9, 4);
                Array.Copy(packet, 9, newpacket, 13, packet.Length - 9);
                newpacket[2] = (byte)(packet.Length >> 8);
                newpacket[3] = (byte)packet.Length;

                foreach (Client recipient in client.ChatServer().ConnectedClients.Values)
                {
                    if (recipient.Channels.Contains(channel))
                    {
                        if (!recipient.KnownClients.Contains(client.Character.CharacterId)
                            && (recipient.Character.CharacterId != client.Character.CharacterId))
                        {
                            byte[] pname = PlayerName.Create(client, client.Character.CharacterId);
                            recipient.Send(pname);
                            recipient.KnownClients.Add(client.Character.CharacterId);
                        }

                        recipient.Send(newpacket);
                    }
                }

                client.ChannelMessageReceived(channel, client.Character.characterName, text);
            }

            ChatLogger.WriteString(channelName, text, client.Character.characterName);
        }
        /// <summary>
        /// Read private group message
        /// </summary>
        /// <param name="client">
        /// Client sending
        /// </param>
        /// <param name="packet">
        /// packet data
        /// </param>
        public void Read(Client client, byte[] packet)
        {
            PacketReader reader = new PacketReader(ref packet);

            reader.ReadUInt16(); // Packet ID
            reader.ReadUInt16(); // Data length
            this.playerid = reader.ReadUInt32();
            this.message = reader.ReadString();
            client.Server.Debug(
                client,
                "{0} >> PrivGrpMessage: PlayerId: {1} Message: {2}",
                client.Character.characterName,
                this.playerid,
                this.message);
            reader.Finish();
        }
        /// <summary>
        /// Read chat command packet
        /// </summary>
        /// <param name="client">
        /// Client sending
        /// </param>
        /// <param name="packet">
        /// packet data
        /// </param>
        public void Read(Client client, byte[] packet)
        {
            PacketReader reader = new PacketReader(ref packet);

            reader.ReadUInt16(); // Packet ID
            reader.ReadUInt16(); // Data length
            reader.ReadUInt16(); // ?
            this.command = reader.ReadString();
            this.value = reader.ReadString();
            client.Server.Debug(
                client,
                "{0} >> ChatCommand: Command: {1} Value: {2}",
                client.Character.characterName,
                this.command,
                this.value);
            reader.Finish();
        }
        /// <summary>
        /// Read and send back Player name lookup 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 = uint.MaxValue;
            string playerName = reader.ReadString();
            if (playerName == string.Empty)
            {
                return;
            }

            if (playerName == ConfigReadWrite.Instance.CurrentConfig.RelayBotNick)
            {
                byte[] botlookup = NameLookupResult.Create(
                    0x80000000,
                    ConfigReadWrite.Instance.CurrentConfig.RelayBotNick);
                client.Send(botlookup);
                client.Send(BuddyOnlineStatus.Create(0x80000000, 1, new byte[] { 0x00, 0x01, 0x00 }));
                return;
            }

            client.Server.Debug(
                client,
                "{0} >> PlayerNameLookup: PlayerName: {1}",
                client.Character.characterName,
                playerName);
            reader.Finish();

            DBCharacter character = CharacterDao.GetByCharName(playerName);
            if (character != null)
            {
                playerId = (uint)character.Id;
            }

            byte[] namelookup = NameLookupResult.Create(playerId, playerName);
            client.Send(namelookup);
            client.Send(
                BuddyOnlineStatus.Create(
                    playerId,
                    (uint)OnlineDao.IsOnline((int)playerId).Online,
                    new byte[] { 0x00, 0x01, 0x00 }));
            client.KnownClients.Add(playerId);
        }
Example #9
0
        /// <summary>
        /// Read buddy add 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();
            ushort unknown1 = reader.ReadUInt16();
            byte unknown2 = reader.ReadByte();
            client.Server.Debug(
                client,
                "{0} >> BuddyAdd: PlayerID {1} Unknown1: {2} Unknown2: {3}",
                client.Character.characterName,
                playerId,
                unknown1,
                unknown2);
            reader.Finish();
        }
        /// <summary>
        /// Channel Data packet read
        /// </summary>
        /// <param name="client">
        /// Client sending
        /// </param>
        /// <param name="packet">
        /// Packet data
        /// </param>
        public void Read(Client client, byte[] packet)
        {
            PacketReader reader = new PacketReader(ref packet);

            reader.ReadUInt16(); // Packet ID
            reader.ReadUInt16(); // Data length
            this.channelId = reader.ReadBytes(5);
            this.mute = reader.ReadUInt16();
            this.data = reader.ReadString();
            client.Server.Debug(
                client,
                "{0} >> ChannelDataSet: Channel {1} {2} Mute: {3} Data: {4}",
                client.Character.characterName,
                this.channelId[0],
                BitConverter.ToUInt32(this.channelId, 1),
                this.mute,
                this.data);
            reader.Finish();
        }
        /// <summary>
        /// Read Channel Mode packet
        /// </summary>
        /// <param name="client">
        /// Client sending
        /// </param>
        /// <param name="packet">
        /// packet data
        /// </param>
        public void Read(Client client, byte[] packet)
        {
            PacketReader reader = new PacketReader(ref packet);

            reader.ReadUInt16(); // Packet ID
            reader.ReadUInt16(); // Data length
            this.channelId = reader.ReadBytes(5);
            this.arg1 = reader.ReadUInt16();
            this.arg2 = reader.ReadUInt16();
            this.arg3 = reader.ReadUInt16();
            this.arg4 = reader.ReadUInt16();
            client.Server.Debug(
                client,
                "{0} >> ChannelMode: Channel: {1} {2} Arg1: {3} Arg2: {4} Arg3: {5} Arg4: {6}",
                client.Character.characterName,
                this.channelId[0],
                BitConverter.ToUInt32(this.channelId, 1),
                this.arg1,
                this.arg2,
                this.arg3,
                this.arg4);
            reader.Finish();
        }
Example #12
0
        /// <summary>
        /// Read and process Tell message
        /// </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();
            reader.ReadUInt16();
            uint playerId = reader.ReadUInt32();
            string message = reader.ReadString();
            client.Server.Debug(client, "{0} >> Tell: PlayerId: {1}", client.Character.characterName, playerId);
            reader.Finish();
            if (client.ChatServer().ConnectedClients.ContainsKey(playerId))
            {
                Client tellClient = (Client)client.ChatServer().ConnectedClients[playerId];
                if (!tellClient.KnownClients.Contains(client.Character.CharacterId))
                {
                    byte[] pname = PlayerName.Create(client, client.Character.CharacterId);
                    tellClient.Send(pname);
                    tellClient.KnownClients.Add(client.Character.CharacterId);

                    // TODO: Check if status bytes are correct even for offline chars
                    client.Send(
                        BuddyOnlineStatus.Create(
                            (uint)tellClient.Character.CharacterId,
                            (uint)OnlineDao.IsOnline((int)tellClient.Character.CharacterId).Online,
                            new byte[] { 0x00, 0x01, 0x00 }));
                }

                byte[] pgroup = MsgPrivateGroup.Create(client.Character.CharacterId, message, string.Empty);
                tellClient.Send(pgroup);
            }
            else
            {
                byte[] sysmsg = MsgSystem.Create("Player not online.");
                client.Send(sysmsg);
            }
        }
 /// <summary>
 /// </summary>
 /// <param name="client">
 /// </param>
 /// <returns>
 /// </returns>
 private bool CheckGmStatus(Client client)
 {
     return client.Character.CharacterGMLevel > 0;
 }
        /// <summary>
        /// The read.
        /// </summary>
        /// <param name="client">
        /// </param>
        /// <param name="packet">
        /// </param>
        public static void Read(Client client, ref byte[] packet)
        {
            MemoryStream m_stream = new MemoryStream(packet);
            BinaryReader m_reader = new BinaryReader(m_stream);

            // now we should do password check and then send OK or Error
            // sending OK now
            m_stream.Position = 12;

            short userNameLength = IPAddress.NetworkToHostOrder(m_reader.ReadInt16());
            string userName = Encoding.ASCII.GetString(m_reader.ReadBytes(userNameLength));
            short loginKeyLength = IPAddress.NetworkToHostOrder(m_reader.ReadInt16());
            string loginKey = Encoding.ASCII.GetString(m_reader.ReadBytes(loginKeyLength));

            uint characterId = BitConverter.ToUInt32(new[] { packet[11], packet[10], packet[9], packet[8] }, 0);

            LoginEncryption loginEncryption = new LoginEncryption();

            if (loginEncryption.IsValidLogin(loginKey, client.ServerSalt, userName)
                && loginEncryption.IsCharacterOnAccount(userName, characterId))
            {
                byte[] loginok = LoginOk.Create();
                client.Send(loginok);
            }
            else
            {
                byte[] loginerr = LoginError.Create();
                client.Send(loginerr);
                client.Server.DisconnectClient(client);
                byte[] invalid = BitConverter.GetBytes(characterId);

                ZoneCom.SendMessage(99, invalid);
                return;
            }

            // save characters ID in client - note, this is usually 0 if it is a chat client connecting
            client.Character = new Character(characterId, client);

            // add client to connected clients list
            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);

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

            client.ChatServer().AddClientToChannels(client);
        }
        /// <summary>
        /// </summary>
        /// <param name="text">
        /// </param>
        /// <param name="client">
        /// </param>
        /// <returns>
        /// </returns>
        private static bool ProcessServerCommand(string text, Client client)
        {
            if (text.StartsWith("."))
            {
                Program.ISCom.BroadCast(
                    new CellAO.Communication.Messages.ChatCommand
                    {
                        CharacterId = (int)client.Character.CharacterId,
                        ChatCommandString = text
                    });
                return true;
            }

            return false;
        }
 /// <summary>
 /// </summary>
 /// <param name="client">
 /// </param>
 /// <returns>
 /// </returns>
 private bool CheckOmniRestriction(Client client)
 {
     return client.Character.CharacterSide == (int)Side.Omni;
 }
 /// <summary>
 /// </summary>
 /// <param name="client">
 /// </param>
 /// <returns>
 /// </returns>
 private bool CheckNeutralRestriction(Client client)
 {
     return client.Character.CharacterSide == (int)Side.Neutral;
 }
 /// <summary>
 /// </summary>
 /// <param name="client">
 /// </param>
 /// <returns>
 /// </returns>
 private bool CheckMonsterRestriction(Client client)
 {
     return client.Character.CharacterSide == (int)Side.Monster;
 }
 /// <summary>
 /// </summary>
 /// <param name="client">
 /// </param>
 /// <returns>
 /// </returns>
 private bool CheckAdvisorStatus(Client client)
 {
     return client.Character.CharacterSide == (int)Side.Advisor;
 }
        /// <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)
            {
                CharacterDao.Instance.SetOnline((int)playerId);
            }

            DBCharacter character = CharacterDao.Instance.Get((int)playerId);

            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>
        /// The read.
        /// </summary>
        /// <param name="client">
        /// </param>
        /// <param name="packet">
        /// </param>
        public static void Read(Client client, ref byte[] packet)
        {
            client.Server.Debug(client, "{0} >> PrivGrpKickEveryone", client.Character.characterName);

            // this packet should have no data
        }
 /// <summary>
 /// </summary>
 /// <param name="client">
 /// </param>
 /// <returns>
 /// </returns>
 private bool CheckGuardianStatus(Client client)
 {
     return client.Character.CharacterSide == (int)Side.Guardian;
 }
        /// <summary>
        /// </summary>
        /// <param name="sourceClient">
        /// </param>
        /// <param name="text">
        /// </param>
        /// <param name="blob">
        /// </param>
        public void ChannelMessage(Client sourceClient, string text, string blob = "")
        {
            byte[] channelMessageBytes = Packets.ChannelMessage.Create(
                this,
                sourceClient.Character.CharacterId,
                text,
                blob);
            foreach (IClient client in this.clients)
            {
                client.Send(channelMessageBytes);
            }

            if (this.OnChannelMessage != null)
            {
                this.OnChannelMessage(
                    this,
                    new ChannelMessageEventArgs() { PlayerName = sourceClient.Character.characterName, Text = text });
            }
        }
 /// <summary>
 /// </summary>
 /// <param name="client">
 /// </param>
 /// <returns>
 /// </returns>
 private bool CheckMixedRestriction(Client client)
 {
     return client.Character.CharacterSide == (int)Side.Mixed;
 }