Esempio n. 1
0
    public void SendIgnoreList(ClientClass client, WcHandlerCharacter.CharacterObject character)
    {
        // DONE: Query DB
        DataTable q = new();

        _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT * FROM character_social WHERE guid = {0} AND (flags & {1}) > 0;", character.Guid, Conversions.ToInteger(SocialFlag.SOCIAL_FLAG_IGNORED)), ref q);

        // DONE: Make the packet
        PacketClass smsgIgnoreList = new(Opcodes.SMSG_IGNORE_LIST);

        if (q.Rows.Count > 0)
        {
            smsgIgnoreList.AddInt8((byte)q.Rows.Count);
            foreach (DataRow row in q.Rows)
            {
                smsgIgnoreList.AddUInt64(row.As <ulong>("friend"));                    // Player GUID
            }
        }
        else
        {
            smsgIgnoreList.AddInt8(0);
        }

        client.Send(smsgIgnoreList);
        smsgIgnoreList.Dispose();
        _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_IGNORE_LIST", client.IP, client.Port);
    }
Esempio n. 2
0
        public void BroadcastChatMessageGuild(WcHandlerCharacter.CharacterObject sender, string message, LANGUAGES language, int guildId)
        {
            // DONE: Check for guild member
            if (!sender.IsInGuild)
            {
                SendGuildResult(sender.Client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PLAYER_NOT_IN_GUILD);
                return;
            }

            // DONE: Check for rights to speak
            if (!sender.IsGuildRightSet(GuildRankRights.GR_RIGHT_GCHATSPEAK))
            {
                SendGuildResult(sender.Client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PERMISSIONS);
                return;
            }

            // DONE: Build packet
            var packet = _clusterServiceLocator.Functions.BuildChatMessage(sender.Guid, message, ChatMsg.CHAT_MSG_GUILD, language, (byte)sender.ChatFlag);

            // DONE: Send message to everyone
            var tmpArray = sender.Guild.Members.ToArray();

            foreach (var member in tmpArray)
            {
                if (_clusterServiceLocator.WorldCluster.CharacteRs.ContainsKey(member))
                {
                    if (_clusterServiceLocator.WorldCluster.CharacteRs[member].IsGuildRightSet(GuildRankRights.GR_RIGHT_GCHATLISTEN))
                    {
                        _clusterServiceLocator.WorldCluster.CharacteRs[member].Client.SendMultiplyPackets(packet);
                    }
                }
            }

            packet.Dispose();
        }
Esempio n. 3
0
            public void SendChatMessage(WcHandlerCharacter.CharacterObject sender, string message, LANGUAGES language, ChatMsg thisType)
            {
                PacketClass packet = _clusterServiceLocator.Functions.BuildChatMessage(sender.Guid, message, thisType, language, (byte)sender.ChatFlag);

                Broadcast(packet);
                packet.Dispose();
            }
Esempio n. 4
0
        public void SendGameTime(ClientClass client, WcHandlerCharacter.CharacterObject character)
        {
            var smsgLoginSettimespeed = new PacketClass(Opcodes.SMSG_LOGIN_SETTIMESPEED);

            try
            {
                var time      = DateTime.Now;
                var year      = time.Year - 2000;
                var month     = time.Month - 1;
                var day       = time.Day - 1;
                var dayOfWeek = (int)time.DayOfWeek;
                var hour      = time.Hour;
                var minute    = time.Minute;

                // SMSG_LOGIN_SETTIMESPEED.AddInt32(CType((((((Minute + (Hour << 6)) + (DayOfWeek << 11)) + (Day << 14)) + (Year << 18)) + (Month << 20)), Integer))
                smsgLoginSettimespeed.AddInt32(minute + (hour << 6) + (dayOfWeek << 11) + (day << 14) + (month << 20) + (year << 24));
                smsgLoginSettimespeed.AddSingle(0.01666667f);
                client.Send(smsgLoginSettimespeed);
            }
            finally
            {
                smsgLoginSettimespeed.Dispose();
            }

            _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_LOGIN_SETTIMESPEED", client.IP, client.Port);
        }
Esempio n. 5
0
        public void SendTriggerCinematic(ClientClass client, WcHandlerCharacter.CharacterObject character)
        {
            var packet = new PacketClass(Opcodes.SMSG_TRIGGER_CINEMATIC);

            try
            {
                if (_clusterServiceLocator.WsDbcDatabase.CharRaces.ContainsKey((int)character.Race))
                {
                    packet.AddInt32(_clusterServiceLocator.WsDbcDatabase.CharRaces[(int)character.Race].CinematicId);
                }
                else
                {
                    _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.WARNING, "[{0}:{1}] SMSG_TRIGGER_CINEMATIC [Error: RACE={2} CLASS={3}]", client.IP, client.Port, character.Race, character.Classe);
                    return;
                }

                client.Send(packet);
            }
            finally
            {
                packet.Dispose();
            }

            _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_TRIGGER_CINEMATIC", client.IP, client.Port);
        }
Esempio n. 6
0
 public void RemoveCharacterFromGuild(WcHandlerCharacter.CharacterObject objCharacter)
 {
     _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Update(string.Format("UPDATE characters SET char_guildId = {0}, char_guildRank = 0, char_guildOffNote = '', char_guildPNote = '' WHERE char_guid = {1};", 0, objCharacter.Guid));
     objCharacter.Guild.Members.Remove(objCharacter.Guid);
     objCharacter.Guild     = null;
     objCharacter.GuildRank = 0;
     objCharacter.SendGuildUpdate();
 }
Esempio n. 7
0
 public void BroadcastToOther(PacketClass packet, WcHandlerCharacter.CharacterObject objCharacter)
 {
     for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++)
     {
         if (Members[i] is object && !ReferenceEquals(Members[i], objCharacter) && Members[i].Client is object)
         {
             Members[i].Client.SendMultiplyPackets(packet);
         }
     }
 }
Esempio n. 8
0
        public void SendAccountMd5(ClientClass client, WcHandlerCharacter.CharacterObject character)
        {
            var foundData = false;

            // TODO: How Does Mangos Zero Handle the Account Data For the Characters?
            // Dim AccData As New DataTable
            // _WorldCluster.AccountDatabase.Query(String.Format("SELECT id FROM account WHERE username = ""{0}"";", client.Account), AccData)
            // If AccData.Rows.Count > 0 Then
            // Dim AccID As Integer = CType(AccData.Rows(0).Item("account_id"), Integer)

            // AccData.Clear()
            // _WorldCluster.AccountDatabase.Query(String.Format("SELECT * FROM account_data WHERE account_id = {0}", AccID), AccData)
            // If AccData.Rows.Count > 0 Then
            // FoundData = True
            // Else
            // _WorldCluster.AccountDatabase.Update(String.Format("INSERT INTO account_data VALUES({0}, '', '', '', '', '', '', '', '')", AccID))
            // End If
            // End If

            var smsgAccountDataTimes = new PacketClass(Opcodes.SMSG_ACCOUNT_DATA_MD5);

            try
            {
                // Dim md5hash As MD5 = MD5.Create()
                for (var i = 0; i <= 7; i++)
                {
                    if (foundData)
                    {
                    }
                    // Dim tmpBytes() As Byte = AccData.Rows(0).Item("account_data" & i)
                    // If tmpBytes.Length = 0 Then
                    // SMSG_ACCOUNT_DATA_TIMES.AddInt64(0)
                    // SMSG_ACCOUNT_DATA_TIMES.AddInt64(0)
                    // Else
                    // SMSG_ACCOUNT_DATA_TIMES.AddByteArray(md5hash.ComputeHash(tmpBytes))
                    // End If
                    else
                    {
                        smsgAccountDataTimes.AddInt64(0L);
                        smsgAccountDataTimes.AddInt64(0L);
                    }
                }
                // md5hash.Clear()
                // md5hash = Nothing

                client.Send(smsgAccountDataTimes);
            }
            finally
            {
                smsgAccountDataTimes.Dispose();
            }

            _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_ACCOUNT_DATA_MD5", client.IP, client.Port);
        }
Esempio n. 9
0
 public void BroadcastToOutOfRange(PacketClass packet, WcHandlerCharacter.CharacterObject objCharacter)
 {
     for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++)
     {
         if (Members[i] is object && !ReferenceEquals(Members[i], objCharacter) && Members[i].Client is object)
         {
             if (objCharacter.Map != Members[i].Map || Math.Sqrt(Math.Pow(objCharacter.PositionX - Members[i].PositionX, 2d) + Math.Pow(objCharacter.PositionY - Members[i].PositionY, 2d)) > _clusterServiceLocator.GlobalConstants.DEFAULT_DISTANCE_VISIBLE)
             {
                 Members[i].Client.SendMultiplyPackets(packet);
             }
         }
     }
 }
Esempio n. 10
0
    public void LoadIgnoreList(WcHandlerCharacter.CharacterObject objCharacter)
    {
        // DONE: Query DB
        DataTable q = new();

        _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT * FROM character_social WHERE guid = {0} AND flags = {1};", objCharacter.Guid, Conversions.ToByte(SocialFlag.SOCIAL_FLAG_IGNORED)), ref q);

        // DONE: Add to list
        foreach (DataRow row in q.Rows)
        {
            objCharacter.IgnoreList.Add(row.As <ulong>("friend"));
        }
    }
Esempio n. 11
0
    public void SendFriendList(ClientClass client, WcHandlerCharacter.CharacterObject character)
    {
        // DONE: Query DB
        DataTable q = new();

        _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT * FROM character_social WHERE guid = {0} AND (flags & {1}) > 0;", character.Guid, Conversions.ToInteger(SocialFlag.SOCIAL_FLAG_FRIEND)), ref q);

        // DONE: Make the packet
        PacketClass smsgFriendList = new(Opcodes.SMSG_FRIEND_LIST);

        if (q.Rows.Count > 0)
        {
            smsgFriendList.AddInt8((byte)q.Rows.Count);
            foreach (DataRow row in q.Rows)
            {
                var guid = row.As <ulong>("friend");
                smsgFriendList.AddUInt64(guid);                    // Player GUID
                if (_clusterServiceLocator.WorldCluster.CharacteRs.ContainsKey(guid) && _clusterServiceLocator.WorldCluster.CharacteRs[guid].IsInWorld)
                {
                    if (_clusterServiceLocator.WorldCluster.CharacteRs[guid].Dnd)
                    {
                        smsgFriendList.AddInt8((byte)FriendStatus.FRIEND_STATUS_DND);
                    }
                    else if (_clusterServiceLocator.WorldCluster.CharacteRs[guid].Afk)
                    {
                        smsgFriendList.AddInt8((byte)FriendStatus.FRIEND_STATUS_AFK);
                    }
                    else
                    {
                        smsgFriendList.AddInt8((byte)FriendStatus.FRIEND_STATUS_ONLINE);
                    }

                    smsgFriendList.AddInt32((int)_clusterServiceLocator.WorldCluster.CharacteRs[guid].Zone);   // Area
                    smsgFriendList.AddInt32(_clusterServiceLocator.WorldCluster.CharacteRs[guid].Level);       // Level
                    smsgFriendList.AddInt32((int)_clusterServiceLocator.WorldCluster.CharacteRs[guid].Classe); // Class
                }
                else
                {
                    smsgFriendList.AddInt8((byte)FriendStatus.FRIEND_STATUS_OFFLINE);
                }
            }
        }
        else
        {
            smsgFriendList.AddInt8(0);
        }

        client.Send(smsgFriendList);
        smsgFriendList.Dispose();
        _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_FRIEND_LIST", client.IP, client.Port);
    }
Esempio n. 12
0
            public void SetLootMaster(WcHandlerCharacter.CharacterObject objCharacter)
            {
                _lootMaster = Leader;
                for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++)
                {
                    if (ReferenceEquals(Members[i], objCharacter))
                    {
                        _lootMaster = i;
                        break;
                    }
                }

                SendGroupList();
            }
Esempio n. 13
0
        // Basic Guild Framework
        public void AddCharacterToGuild(WcHandlerCharacter.CharacterObject objCharacter, int guildId, int guildRank = 4)
        {
            _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Update(string.Format("UPDATE characters SET char_guildId = {0}, char_guildRank = {2}, char_guildOffNote = '', char_guildPNote = '' WHERE char_guid = {1};", guildId, objCharacter.Guid, guildRank));
            if (GuilDs.ContainsKey((uint)guildId) == false)
            {
                var tmpGuild = new Guild((uint)guildId);
                GuilDs.Add((uint)guildId, tmpGuild);
            }

            objCharacter.Guild = GuilDs[(uint)guildId];
            objCharacter.Guild.Members.Add(objCharacter.Guid);
            objCharacter.GuildRank = (byte)guildRank;
            objCharacter.SendGuildUpdate();
        }
Esempio n. 14
0
 // Members Options
 public void SendGuildMotd(WcHandlerCharacter.CharacterObject objCharacter)
 {
     if (objCharacter.IsInGuild)
     {
         if (!string.IsNullOrEmpty(objCharacter.Guild.Motd))
         {
             var response = new PacketClass(Opcodes.SMSG_GUILD_EVENT);
             response.AddInt8((byte)GuildEvent.MOTD);
             response.AddInt8(1);
             response.AddString(objCharacter.Guild.Motd);
             objCharacter.Client.Send(response);
             response.Dispose();
         }
     }
 }
Esempio n. 15
0
        public void SendCorpseReclaimDelay(ClientClass client, WcHandlerCharacter.CharacterObject character, int seconds = 30)
        {
            var packet = new PacketClass(Opcodes.SMSG_CORPSE_RECLAIM_DELAY);

            try
            {
                packet.AddInt32(seconds * 1000);
                client.Send(packet);
            }
            finally
            {
                packet.Dispose();
            }

            _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_CORPSE_RECLAIM_DELAY [{2}s]", client.IP, client.Port, seconds);
        }
Esempio n. 16
0
            public void NewLeader(WcHandlerCharacter.CharacterObject leaver = null)
            {
                byte chosenMember  = 255;
                bool newLootMaster = false;

                for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++)
                {
                    if (Members[i] is object && Members[i].Client is object)
                    {
                        if (leaver is object && ReferenceEquals(leaver, Members[i]))
                        {
                            if (i == _lootMaster)
                            {
                                newLootMaster = true;
                            }

                            if (chosenMember != 255)
                            {
                                break;
                            }
                        }
                        else if (Members[i].GroupAssistant && chosenMember == 255)
                        {
                            chosenMember = i;
                        }
                        else if (chosenMember == 255)
                        {
                            chosenMember = i;
                        }
                    }
                }

                if (chosenMember != 255)
                {
                    Leader = chosenMember;
                    if (newLootMaster)
                    {
                        _lootMaster = Leader;
                    }

                    PacketClass response = new(Opcodes.SMSG_GROUP_SET_LEADER);
                    response.AddString(Members[Leader].Name);
                    Broadcast(response);
                    response.Dispose();
                    _clusterServiceLocator.WcNetwork.WorldServer.GroupSendUpdate(Id);
                }
            }
Esempio n. 17
0
 public Group(WcHandlerCharacter.CharacterObject objCharacter, ClusterServiceLocator clusterServiceLocator)
 {
     _clusterServiceLocator = clusterServiceLocator;
     Members = new WcHandlerCharacter.CharacterObject[_clusterServiceLocator.GlobalConstants.GROUP_SIZE + 1];
     Id      = Interlocked.Increment(ref _clusterServiceLocator.WcHandlersGroup._groupCounter);
     _clusterServiceLocator.WcHandlersGroup.GrouPs.Add(Id, this);
     Members[0]                  = objCharacter;
     Members[1]                  = null;
     Members[2]                  = null;
     Members[3]                  = null;
     Members[4]                  = null;
     Leader                      = 0;
     _lootMaster                 = 255;
     objCharacter.Group          = this;
     objCharacter.GroupAssistant = false;
     objCharacter.GetWorld.ClientSetGroup(objCharacter.Client.Index, Id);
 }
Esempio n. 18
0
            public void Join(WcHandlerCharacter.CharacterObject objCharacter)
            {
                for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++)
                {
                    if (Members[i] is null)
                    {
                        Members[i]                  = objCharacter;
                        objCharacter.Group          = this;
                        objCharacter.GroupAssistant = false;
                        break;
                    }
                }

                _clusterServiceLocator.WcNetwork.WorldServer.GroupSendUpdate(Id);
                objCharacter.GetWorld.ClientSetGroup(objCharacter.Client.Index, Id);
                SendGroupList();
            }
Esempio n. 19
0
        public void NotifyGuildStatus(WcHandlerCharacter.CharacterObject objCharacter, GuildEvent status)
        {
            if (objCharacter.Guild is null)
            {
                return;
            }
            var statuspacket = new PacketClass(Opcodes.SMSG_GUILD_EVENT);

            statuspacket.AddInt8((byte)status);
            statuspacket.AddInt8(1);
            statuspacket.AddString(objCharacter.Name);
            statuspacket.AddInt8(0);
            statuspacket.AddInt8(0);
            statuspacket.AddInt8(0);
            BroadcastToGuild(statuspacket, objCharacter.Guild, objCharacter.Guid);
            statuspacket.Dispose();
        }
Esempio n. 20
0
            public void SetLeader(WcHandlerCharacter.CharacterObject objCharacter)
            {
                for (byte i = 0, loopTo = (byte)Members.Length; i <= loopTo; i++)
                {
                    if (ReferenceEquals(Members[i], objCharacter))
                    {
                        Leader = i;
                        break;
                    }
                }

                PacketClass packet = new(Opcodes.SMSG_GROUP_SET_LEADER);

                packet.AddString(objCharacter.Name);
                Broadcast(packet);
                packet.Dispose();
                _clusterServiceLocator.WcNetwork.WorldServer.GroupSendUpdate(Id);
                SendGroupList();
            }
Esempio n. 21
0
            public void Leave(WcHandlerCharacter.CharacterObject objCharacter)
            {
                if (GetMembersCount() == 2)
                {
                    Dispose();
                    return;
                }

                for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++)
                {
                    if (ReferenceEquals(Members[i], objCharacter))
                    {
                        objCharacter.Group = null;
                        Members[i]         = null;

                        // DONE: If current is leader then choose new
                        if (i == Leader)
                        {
                            NewLeader();
                        }

                        // DONE: If current is lootMaster then choose new
                        if (i == _lootMaster)
                        {
                            _lootMaster = Leader;
                        }

                        if (objCharacter.Client is object)
                        {
                            PacketClass packet = new(Opcodes.SMSG_GROUP_UNINVITE);
                            objCharacter.Client.Send(packet);
                            packet.Dispose();
                        }

                        break;
                    }
                }

                _clusterServiceLocator.WcNetwork.WorldServer.GroupSendUpdate(Id);
                objCharacter.GetWorld.ClientSetGroup(objCharacter.Client.Index, -1);
                CheckMembers();
            }
Esempio n. 22
0
        public void NewLeader(WcHandlerCharacter.CharacterObject leaver = null)
        {
            byte chosenMember  = 255;
            var  newLootMaster = false;

            for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++)
            {
                if (Members[i] is not null && Members[i].Client is not null)
                {
                    if (leaver is not null && ReferenceEquals(leaver, Members[i]))
                    {
                        if (i == _lootMaster)
                        {
                            newLootMaster = true;
                        }

                        if (chosenMember != 255)
                        {
                            break;
                        }
                    }
Esempio n. 23
0
    public void NotifyFriendStatus(WcHandlerCharacter.CharacterObject objCharacter, FriendStatus s)
    {
        DataTable q = new();

        _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT guid FROM character_social WHERE friend = {0} AND (flags & {1}) > 0;", objCharacter.Guid, Conversions.ToInteger(SocialFlag.SOCIAL_FLAG_FRIEND)), ref q);

        // DONE: Send "Friend offline/online"
        PacketClass friendpacket = new(Opcodes.SMSG_FRIEND_STATUS);

        friendpacket.AddInt8((byte)s);
        friendpacket.AddUInt64(objCharacter.Guid);
        foreach (DataRow row in q.Rows)
        {
            var guid = row.As <ulong>("guid");
            if (_clusterServiceLocator.WorldCluster.CharacteRs.ContainsKey(guid) && _clusterServiceLocator.WorldCluster.CharacteRs[guid].Client is not null)
            {
                _clusterServiceLocator.WorldCluster.CharacteRs[guid].Client.SendMultiplyPackets(friendpacket);
            }
        }

        friendpacket.Dispose();
    }
Esempio n. 24
0
        public void SendGuildRoster(WcHandlerCharacter.CharacterObject objCharacter)
        {
            if (!objCharacter.IsInGuild)
            {
                return;
            }

            // DONE: Count the ranks
            byte guildRanksCount = 0;

            for (var i = 0; i <= 9; i++)
            {
                if (!string.IsNullOrEmpty(objCharacter.Guild.Ranks[i]))
                {
                    guildRanksCount = (byte)(guildRanksCount + 1);
                }
            }

            // DONE: Count the members
            var members = new DataTable();

            _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query("SELECT char_online, char_guid, char_name, char_class, char_level, char_zone_id, char_logouttime, char_guildRank, char_guildPNote, char_guildOffNote FROM characters WHERE char_guildId = " + objCharacter.Guild.Id + ";", ref members);
            var response = new PacketClass(Opcodes.SMSG_GUILD_ROSTER);

            response.AddInt32(members.Rows.Count);
            response.AddString(objCharacter.Guild.Motd);
            response.AddString(objCharacter.Guild.Info);
            response.AddInt32(guildRanksCount);
            for (var i = 0; i <= 9; i++)
            {
                if (!string.IsNullOrEmpty(objCharacter.Guild.Ranks[i]))
                {
                    response.AddUInt32(objCharacter.Guild.RankRights[i]);
                }
            }

            var officer = objCharacter.IsGuildRightSet(GuildRankRights.GR_RIGHT_VIEWOFFNOTE);

            for (int i = 0, loopTo = members.Rows.Count - 1; i <= loopTo; i++)
            {
                if (members.Rows[i].As <byte>("char_online") == 1)
                {
                    response.AddUInt64(members.Rows[i].As <ulong>("char_guid"));
                    response.AddInt8(1);                         // OnlineFlag
                    response.AddString(members.Rows[i].As <string>("char_name"));
                    response.AddInt32(members.Rows[i].As <int>("char_guildRank"));
                    response.AddInt8(members.Rows[i].As <byte>("char_level"));
                    response.AddInt8(members.Rows[i].As <byte>("char_class"));
                    response.AddInt32(members.Rows[i].As <int>("char_zone_id"));
                    response.AddString(members.Rows[i].As <string>("char_guildPNote"));
                    if (officer)
                    {
                        response.AddString(members.Rows[i].As <string>("char_guildOffNote"));
                    }
                    else
                    {
                        response.AddInt8(0);
                    }
                }
                else
                {
                    response.AddUInt64(members.Rows[i].As <ulong>("char_guid"));
                    response.AddInt8(0);                         // OfflineFlag
                    response.AddString(members.Rows[i].As <string>("char_name"));
                    response.AddInt32(members.Rows[i].As <int>("char_guildRank"));
                    response.AddInt8(members.Rows[i].As <byte>("char_level"));
                    response.AddInt8(members.Rows[i].As <byte>("char_class"));
                    response.AddInt32(members.Rows[i].As <int>("char_zone_id"));
                    // 0 = < 1 hour / 0.1 = 2.4 hours / 1 = 24 hours (1 day)
                    // (Time logged out / 86400) = Days offline
                    var daysOffline = (float)((_clusterServiceLocator.Functions.GetTimestamp(DateAndTime.Now) - members.Rows[i].As <uint>("char_logouttime")) / (double)DateInterval.Day);
                    response.AddSingle(daysOffline); // Days offline
                    response.AddString(members.Rows[i].As <string>("char_guildPNote"));
                    if (officer)
                    {
                        response.AddString(members.Rows[i].As <string>("char_guildOffNote"));
                    }
                    else
                    {
                        response.AddInt8(0);
                    }
                }
            }

            objCharacter.Client.Send(response);
            response.Dispose();
        }