/// <inheritdoc />
        public void SendJoinWorld(IClusterClient client)
        {
            using (var packet = new FFPacket())
            {
                packet.WriteHeader(PacketType.PRE_JOIN);

                client.Send(packet);
            }
        }
        /// <inheritdoc />
        public void SendLoginNumPad(IClusterClient client, int loginProtectValue)
        {
            using (var packet = new FFPacket())
            {
                packet.WriteHeader(PacketType.LOGIN_PROTECT_NUMPAD);
                packet.Write(loginProtectValue);

                client.Send(packet);
            }
        }
        /// <inheritdoc />
        public void SendClusterError(IClusterClient client, ErrorType errorType)
        {
            using (var packet = new FFPacket())
            {
                packet.WriteHeader(PacketType.ERROR);
                packet.Write((int)errorType);

                client.Send(packet);
            }
        }
        /// <inheritdoc />
        public void SendPong(IClusterClient client, int time)
        {
            using (var packet = new FFPacket())
            {
                packet.WriteHeader(PacketType.PING);
                packet.Write(time);

                client.Send(packet);
            }
        }
        /// <inheritdoc />
        public void SendWelcome(IClusterClient client)
        {
            using (var packet = new FFPacket())
            {
                packet.WriteHeader(PacketType.WELCOME);
                packet.Write(client.SessionId);

                client.Send(packet);
            }
        }
        /// <inheritdoc />
        public void SendWorldAddress(IClusterClient client, string address)
        {
            using (var packet = new FFPacket())
            {
                packet.WriteHeader(PacketType.CACHE_ADDR);
                packet.Write(address);

                client.Send(packet);
            }
        }
        /// <inheritdoc />
        public void SendQueryTickCount(IClusterClient client, uint time)
        {
            using (var packet = new FFPacket())
            {
                packet.WriteHeader(PacketType.QUERYTICKCOUNT);

                packet.Write(time);
                packet.Write(Time.GetElapsedTime());

                client.Send(packet);
            }
        }
        /// <inheritdoc />
        public void SendPlayerList(IClusterClient client, int authenticationKey, IEnumerable <DbCharacter> characters)
        {
            using (var packet = new FFPacket())
            {
                packet.WriteHeader(PacketType.PLAYER_LIST);
                packet.Write(authenticationKey);

                packet.Write(characters.Count()); // player count

                foreach (var character in characters)
                {
                    packet.Write((int)character.Slot);
                    packet.Write(1);                       // this number represents the selected character in the window
                    packet.Write(character.MapId);
                    packet.Write(0x0B + character.Gender); // Model id
                    packet.Write(character.Name);
                    packet.Write(character.PosX);
                    packet.Write(character.PosY);
                    packet.Write(character.PosZ);
                    packet.Write(character.Id);
                    packet.Write(0); // Party id
                    packet.Write(0); // Guild id
                    packet.Write(0); // War Id
                    packet.Write(character.SkinSetId);
                    packet.Write(character.HairId);
                    packet.Write((uint)character.HairColor);
                    packet.Write(character.FaceId);
                    packet.Write(character.Gender);
                    packet.Write(character.JobId);
                    packet.Write(character.Level);
                    packet.Write(0); // Job Level (Maybe master or hero ?)
                    packet.Write(character.Strength);
                    packet.Write(character.Stamina);
                    packet.Write(character.Dexterity);
                    packet.Write(character.Intelligence);
                    packet.Write(0); // Mode ??

                    IEnumerable <DbItem> equipedItems = character.Items.Where(x => x.ItemSlot > 42);

                    packet.Write(equipedItems.Count());

                    foreach (DbItem item in equipedItems)
                    {
                        packet.Write(item.ItemId);
                    }
                }

                packet.Write(0); // Messenger?

                client.Send(packet);
            }
        }