// 更新在线好友
    public bool                                                             UpdateOnlineFriend(_RELATION_ONLINE pOnlineRelation)
    {
        RELATION_GROUP RelationGroup = RELATION_GROUP.RELATION_GROUP_FRIEND_ALL;
        int            idx           = -1;
        uint           guid          = 0;

        guid = pOnlineRelation.GetGUID();
        if (GetRelationPosition(guid, ref RelationGroup, ref idx) == RELATION_TYPE.RELATION_TYPE_STRANGER)
        {     // 数据池还为空
            return(true);
        }

        RelationList pRelationList;

        pRelationList = GetRelationList(RelationGroup);
        if (pRelationList == null)
        {
            return(false);
        }

        SDATA_RELATION_MEMBER pMember;

        pMember = pRelationList.GetMemberByGUID(guid);
        if (pMember == null)
        {
            return(false);
        }

        pMember.m_bOnlineFlag = true;
        pMember.m_szMood      = UIString.Instance.GetUnicodeString(pOnlineRelation.GetMood());

        UpdateUIList(RelationGroup);       // 刷新关系人在线状态
        return(true);
    }
    // 客户端获得关系人信息,供界面使用
    public SDATA_RELATION_MEMBER            GetRelationInfo(RELATION_GROUP RelationGroup, int idx)
    {
        RelationList pRelationList;

        pRelationList = GetRelationList(RelationGroup);
        if (pRelationList == null)
        {
            return(null);
        }

        return(pRelationList.GetMember(idx));
    }
    // 得到某个好友的历史邮件数量
    public uint GetMailCount(RELATION_GROUP RelationGroup, int idx)
    {
        SDATA_RELATION_MEMBER pRelationMember;

        pRelationMember = GetRelationInfo(RelationGroup, idx);
        if (pRelationMember == null)
        {
            return(0);
        }

        return((uint)pRelationMember.m_vMailList.Count);
    }
    // 从服务器端收到一条移除关系人的消息
    public bool                                                             RemoveRelation(uint guid)
    {
        RELATION_GROUP RelationGroup = RELATION_GROUP.RELATION_GROUP_FRIEND_ALL;
        int            idx           = -1;

        if (GetRelationPosition(guid, ref RelationGroup, ref idx) != RELATION_TYPE.RELATION_TYPE_STRANGER)
        {
            return(RemoveRelation(RelationGroup, idx));
        }

        return(false);
    }
    // 获得一个名单
    protected RelationList                          GetRelationList(RELATION_GROUP RelationGroup)
    {
        switch (RelationGroup)
        {
        case RELATION_GROUP.RELATION_GROUP_F1:
        {
            return(m_FriendGroup1);
        }

        //break;
        case RELATION_GROUP.RELATION_GROUP_F2:
        {
            return(m_FriendGroup2);
        }

        //break;
        case RELATION_GROUP.RELATION_GROUP_F3:
        {
            return(m_FriendGroup3);
        }

        //break;
        case RELATION_GROUP.RELATION_GROUP_F4:
        {
            return(m_FriendGroup4);
        }

        //break;
        case RELATION_GROUP.RELATION_GROUP_TEMPFRIEND:
        {
            return(m_TeamFriendGroup);
        }

        //break;
        case RELATION_GROUP.RELATION_GROUP_BLACK:
        {
            return(m_BlackListGroup);
        }

        //break;
        default:
            break;
        }

        return(null);
    }
        public void AddFriendByName(string name, RELATION_GROUP nGroup)
        {
            if (string.IsNullOrEmpty(name))
            {
                return;
            }
            int group  = -1;
            int nIndex = -1;

            if (CDataPool.Instance.GetRelation().GetRelationByName(name, ref group, ref nIndex)
                != RELATION_TYPE.RELATION_TYPE_STRANGER)
            {
                return;
            }

            CObject_Character pTargetObj = CObjectManager.Instance.FindCharacterByName(name);

            if (pTargetObj == CObjectManager.Instance.getPlayerMySelf())
            {
                return;
            }
            if (pTargetObj is CObject_PlayerOther)
            {
                ENUM_RELATION sCamp = Interface.GameInterface.Instance.GetCampType(pTargetObj, CObjectManager.Instance.getPlayerMySelf());
                if (sCamp != ENUM_RELATION.RELATION_FRIEND)
                {// 如果不是同一阵营的
                    GameProcedure.s_pEventSystem.PushEvent(GAME_EVENT_ID.GE_INFO_SELF, "不能添加不同阵营的人到好友");
                    return;
                }
            }
            CGRelation Msg = new CGRelation();

            Msg.GetRelation().CleanUp();
            Msg.GetRelation().m_Type = (byte)RELATION_REQUEST_TYPE.REQ_ADDFRIEND;
            REQUEST_ADD_RELATION_WITH_GROUP pFriend = new REQUEST_ADD_RELATION_WITH_GROUP();

            Msg.GetRelation().mRelation = pFriend;
            pFriend.CleanUp();
            pFriend.SetTargetName(EncodeUtility.Instance.GetGbBytes(name));
            pFriend.SetGroup((byte)nGroup);
            pFriend.SetRelationType((byte)RELATION_TYPE.RELATION_TYPE_FRIEND);

            NetManager.GetNetManager().SendPacket(Msg);
        }
    // 得到某个好友的第 uIndex 封历史邮件的邮件池索引号
    public uint GetMailIndex(RELATION_GROUP RelationGroup, int idx, uint uIndex)
    {
        SDATA_RELATION_MEMBER pRelationMember;

        pRelationMember = GetRelationInfo(RelationGroup, idx);
        if (pRelationMember == null)
        {
            return(0);
        }

        if (pRelationMember.m_vMailList.Count <= uIndex)
        {
            return(0);
        }

        List <int> mailList = pRelationMember.m_vMailList;

        return((uint)mailList[(int)uIndex]);
    }
    // 关系人下线
    public bool                                                             RelationOffLine(uint guid)
    {
        RELATION_GROUP RelationGroup = RELATION_GROUP.RELATION_GROUP_FRIEND_ALL;
        int            idx           = 0;

        GetRelationPosition(guid, ref RelationGroup, ref idx);

        RelationList pRelationList;

        pRelationList = GetRelationList(RelationGroup);
        if (pRelationList == null)
        {
            return(false);
        }

        SDATA_RELATION_MEMBER pMember;

        pMember = pRelationList.GetMemberByGUID(guid);
        if (pMember == null)
        {
            return(false);
        }

        pMember.m_bOnlineFlag = false;
        //pMember.m_szMood =  pMember.m_szMood;



        // 只显示好友提示 [6/23/2011 edit by ZL]
        if (pMember.m_RelationType == RELATION_TYPE.RELATION_TYPE_FRIEND)
        {
            string szText = "你的好友#Y" + pMember.m_szName + "#R离开游戏了";
            //ADDTALKMSG(szText); todo
        }

        UpdateUIList(RelationGroup);       // 刷新关系人在线状态
        return(true);
    }
    // 给某个(临时)好友重建历史信息
    public void RebuildMailHistory(RELATION_GROUP RelationGroup, string szName)
    {
        //todo

        /*    RelationList  pRelationList = null;
         *      SDATA_RELATION_MEMBER  pRelationMember = null;
         *
         *      pRelationList = GetRelationList( RelationGroup );
         *      if( pRelationList == null )
         *      {
         *              return;
         *      }
         *
         *      pRelationMember = pRelationList.GetMemberByName(szName);
         *      if( pRelationMember == null )
         *      { // 没有找到这个好友
         *              return;
         *      }
         *
         *      CMailPool  pMailPool = CDataPool::GetMe().GetMailPool();
         *
         *      for( INT i=0; i<pMailPool.GetMailCount(); ++i )
         *      {
         *              const SMail  pMail;
         *
         *              pMail = pMailPool.GetMail(i);
         *              if( pMail != null )
         *              {
         *                      if( strcmp(pMail.m_szSourName, pRelationMember.m_szName) == 0
         || strcmp(pMail.m_szDestName, pRelationMember.m_szName) == 0
         ||                      )
         ||                     {
         ||                             pRelationMember.m_vMailList.push_back(i);
         ||                     }
         ||             }
         ||     }*/
    }
        public void delFriend(RELATION_GROUP group, int index) //删除一个好友
        {
            SDATA_RELATION_MEMBER pInfo = CDataPool.Instance.GetRelation().GetRelationInfo(group, index);

            if (group == RELATION_GROUP.RELATION_GROUP_TEMPFRIEND)      // 如果是临时好友
            {
                CDataPool.Instance.GetRelation().RemoveRelation(group, index);
                GameProcedure.s_pEventSystem.PushEvent(GAME_EVENT_ID.GE_UPDATE_FRIEND);
                return;
            }
            else if (group == RELATION_GROUP.RELATION_GROUP_BLACK)
            {
                CGRelation Msg = new CGRelation();

                Msg.GetRelation().CleanUp();
                Msg.GetRelation().m_Type = (byte)RELATION_REQUEST_TYPE.REQ_DELFROMBLACKLIST;

                RELATION_GUID pBlackName    = new RELATION_GUID();
                Msg.GetRelation().mRelation = pBlackName;
                pBlackName.CleanUp();
                pBlackName.SetTargetGUID(pInfo.m_GUID);
                NetManager.GetNetManager().SendPacket(Msg);
            }
            else
            {
                CGRelation Msg = new CGRelation();
                Msg.GetRelation().CleanUp();
                Msg.GetRelation().m_Type    = (byte)RELATION_REQUEST_TYPE.REQ_DELFRIEND;
                REQUEST_DEL_FRIEND pFriend  = new REQUEST_DEL_FRIEND();
                Msg.GetRelation().mRelation = pFriend;
                pFriend.CleanUp();
                pFriend.SetTargetGUID(pInfo.m_GUID);
                NetManager.GetNetManager().SendPacket(Msg);
            }

            return;
        }
    // 加入一个关系,用于游戏过程中,加入时需要指定将要加入的组
    public bool                                                             AddRelation(RELATION_GROUP RelationGroup, SDATA_RELATION_MEMBER pMember)
    {
        RelationList pRelationList;

        pRelationList = GetRelationList(RelationGroup);
        if (pRelationList == null)
        {
            return(false);
        }

        // 不让重复加好友,不能加自己为好友
        if (pMember.m_GUID != MacroDefine.UINT_MAX)
        {
            if (CObjectManager.Instance.getPlayerMySelf().GetServerGUID() == pMember.m_GUID)
            {
                return(false);
            }

            RELATION_GROUP rg  = RELATION_GROUP.RELATION_GROUP_F4;
            int            idx = 0;

            if (GetRelationPosition(pMember.m_GUID, ref rg, ref idx) != RELATION_TYPE.RELATION_TYPE_STRANGER)
            {
                return(false);
            }
            else if (pRelationList.GetMemberByGUID(pMember.m_GUID) != null)
            {
                return(false);
            }
        }
        else if (pMember.m_szName.Length > 0)
        {
            string str1 = CObjectManager.Instance.getPlayerMySelf().GetCharacterData().Get_Name();
            string str2 = pMember.m_szName;
            if (str1 == str2)
            {
                return(false);
            }

            int nrg = 0;
            int idx = 0;

            if (GetRelationByName(pMember.m_szName, ref nrg, ref idx) != RELATION_TYPE.RELATION_TYPE_STRANGER)
            {
                return(false);
            }
            else if (pRelationList.GetMemberByName(pMember.m_szName) != null)
            {
                return(false);
            }
        }

        SDATA_RELATION_MEMBER pNewRelation = new SDATA_RELATION_MEMBER();

        pNewRelation.m_GUID         = pMember.m_GUID;
        pNewRelation.m_szName       = (pMember.m_szName);
        pNewRelation.m_RelationType = pMember.m_RelationType;
        pNewRelation.m_nFriendPoint = pMember.m_nFriendPoint;
        pNewRelation.m_nLevel       = pMember.m_nLevel;
        pNewRelation.m_nMenPai      = pMember.m_nMenPai;
        pNewRelation.m_nPortrait    = pMember.m_nPortrait;
        pNewRelation.m_GuildID      = pMember.m_GuildID;
        pNewRelation.m_szGuildName  = (pMember.m_szGuildName);
        pNewRelation.m_bOnlineFlag  = pMember.m_bOnlineFlag;
        SetRelationDesc(pNewRelation);

        if (pMember.m_bOnlineFlag)
        {
            pNewRelation.m_szMood  = pMember.m_szMood;
            pNewRelation.m_szTitle = pMember.m_szTitle;
            pNewRelation.m_SceneID = pMember.m_SceneID;
            GetLocationName(pNewRelation.m_SceneID, out pNewRelation.m_szLocation);
            pNewRelation.m_nTeamSize = pMember.m_nTeamSize;
            SetTeamDesc(pNewRelation);
        }
        else
        {
            pNewRelation.m_szLocation = "离线";
        }

        pRelationList.Add(pNewRelation);
        UpdateUIList(RelationGroup);

        return(true);
    }
    // 得到一个 GUID 所在的组以及在组里的索引,没有找到返回 RELATION_TYPE_STRANGER,这个功能不考虑临时好友
    public RELATION_TYPE                                            GetRelationPosition(uint guid, ref RELATION_GROUP RelationGroup, ref int idx)
    {
        RelationList pRelationList;

        for (int i = (int)RELATION_GROUP.RELATION_GROUP_F1; i < (int)RELATION_GROUP.RELATION_GROUP_NUMBER; ++i)
        {
            pRelationList = GetRelationList((RELATION_GROUP)i);
            if (pRelationList == null)
            {
                return(RELATION_TYPE.RELATION_TYPE_STRANGER);
            }

            idx = pRelationList.GetMemberIndex(guid);
            if (idx != -1)
            {
                RelationGroup = (RELATION_GROUP)i;
                return(pRelationList.GetMember(idx).m_RelationType);
            }
        }

        return(RELATION_TYPE.RELATION_TYPE_STRANGER);
    }
    // 通知 UI 刷新 RelationGroup 中第 idx 号关系人的详细信息
    public void                                                             UpdateUIInfo(RELATION_GROUP RelationGroup, int idx)
    {
        List <string> param = new List <string>();
        int           temp  = (int)(RelationGroup);

        param.Add(temp.ToString());
        param.Add(idx.ToString());
        CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_UPDATE_FRIEND_INFO, param);
    }
 // 通知 UI 刷新列表,默认更新所有列表
 public void                                                    UpdateUIList(RELATION_GROUP RelationGroup)
 {
     CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_UPDATE_FRIEND);
 }
    // 移动一个关系,Srg 是原来的组,guid 是要移动的玩家 GUID,Dtype 是移动后的关系类型,Drg 是移动后的组
    public bool                                                             MoveRelation(RELATION_GROUP Srg, RELATION_TYPE Dtype, RELATION_GROUP Drg, uint guid)
    {
        RelationList pSRelationList;

        pSRelationList = GetRelationList(Srg);
        if (pSRelationList == null)
        {
            return(false);
        }

        RelationList pDRelationList;

        pDRelationList = GetRelationList(Drg);
        if (pDRelationList == null)
        {
            return(false);
        }

        SDATA_RELATION_MEMBER pMember;

        pMember = pSRelationList.GetMemberByGUID(guid);
        if (pMember == null)
        {
            return(false);
        }

        if (pSRelationList.RemoveByGUID(guid))
        {
            UpdateUIList(Srg);

            // 修改关系信息
            pMember.m_RelationType = Dtype;

            string m_szName = pMember.m_szName;
            bool   isFinish = false;
            if (pDRelationList.Add(pMember))
            {
                UpdateUIList(Drg);
                isFinish = true;
            }
            else
            {
                pMember  = null;
                isFinish = false;
            }

            // 必须等add完成后再刷新 [9/26/2011 Ivan edit]
            CObject_Character player = (CObject_Character)(CObjectManager.Instance.FindCharacterByName(m_szName));
            if (player != null)
            {
                player.GetCharacterData().RefreshName();
            }
            return(isFinish);
        }

        return(false);
    }
        public override NET_RESULT_DEFINE.PACKET_EXE Execute(PacketBase pPacket, ref Peer pPlayer)
        {
            if (GameProcedure.GetActiveProcedure() == (GameProcedure)GameProcedure.s_ProcMain)
            {
                GCRelation packet = (GCRelation)pPacket;
                if (GameProcedure.s_pUISystem == null)
                {
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
                }

                GC_RELATION pReturn = packet.GetRelation();
                string      szText  = "其他好友操作。";

                Relation pRelation = CDataPool.Instance.GetRelation();
                if (pRelation == null)
                {
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
                }

                switch ((RELATION_RETURN_TYPE )pReturn.m_Type)
                {
                case RELATION_RETURN_TYPE.RET_RELATIONLIST:
                {
                    GC_RELATIONLIST pRelationList = (GC_RELATIONLIST)pReturn.mRelation;

                    pRelation.SetMood(UIString.Instance.GetUnicodeString(pRelationList.GetMood()));

                    for (int i = 0; i < pRelationList.GetFriendCount(); ++i)
                    {
                        pRelation.AddRelation(pRelationList.GetFriend(i));
                    }

                    for (int i = 0; i < pRelationList.GetBlackCount(); ++i)
                    {
                        pRelation.AddRelation(pRelationList.GetBlackName(i));
                    }

                    // 需要 push 一个事件通知 UI
                    pRelation.UpdateUIList(RELATION_GROUP.RELATION_GROUP_FRIEND_ALL);
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
                }
                break;

                case RELATION_RETURN_TYPE.RET_RELATIONINFO:
                {
                    pRelation.UpdateRelationInfo((RETURN_RELATION_INFO )pReturn.mRelation);
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
                }
                break;

                case RELATION_RETURN_TYPE.RET_TEMPFRIEND_TO_FRIEND:
                case RELATION_RETURN_TYPE.RET_TEMPFRIEND_ADDTO_BLACKLIST:
                case RELATION_RETURN_TYPE.RET_ADDFRIEND:
                case RELATION_RETURN_TYPE.RET_ADDTOBLACKLIST:
                {
                    RETURN_ADD_RELATION pAddRelation = (RETURN_ADD_RELATION)pReturn.mRelation;
                    RELATION_GROUP      Drg;
                    string msg = UIString.Instance.GetUnicodeString(pAddRelation.GetRelationData().GetName());
                    if (pAddRelation.GetRelationType() == (byte)RELATION_TYPE.RELATION_TYPE_BLACKNAME)
                    {
                        szText = "你将" + msg + "加入黑名单。";
                        //			    strTemp = NOCOLORMSGFUNC("GCRelationHandler_Info_Add_Black_List", pAddRelation.GetRelationData().GetName());
                        //			    _snprintf(szText, _MAX_PATH, "%s", strTemp.c_str());
                        Drg = RELATION_GROUP.RELATION_GROUP_BLACK;
                    }
                    else if (pAddRelation.GetRelationType() == (byte)RELATION_TYPE.RELATION_TYPE_FRIEND)
                    {
                        szText = "你将" + msg + "添加为好友。";
                        //			    strTemp = NOCOLORMSGFUNC("GCRelationHandler_Info_Add_Firend_List", pAddRelation.GetRelationData().GetName());
                        //			    _snprintf(szText, _MAX_PATH, "%s", strTemp.c_str());
                        Drg = (RELATION_GROUP)pAddRelation.GetGroup();
                    }
                    else
                    {
                        szText = "意外的关系类型:" + pAddRelation.GetRelationType();
                        //				    strTemp = NOCOLORMSGFUNC("GCRelationHandler_Info_Err_Relation", pAddRelation.GetRelationData().GetName());
                        //				    _snprintf(szText, _MAX_PATH, "%s", strTemp.c_str());
                        //				    AssertEx(FALSE, szText);
                        return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
                    }

                    _RELATION pRelationData;
                    pRelationData = pAddRelation.GetRelationData();

                    // 如果是临时好友,则移除
                    pRelation.RemoveRelation(pRelationData.GetGUID());
                    pRelation.RemoveRelation(RELATION_GROUP.RELATION_GROUP_TEMPFRIEND, UIString.Instance.GetUnicodeString(pRelationData.GetName()));

                    SDATA_RELATION_MEMBER Member = new SDATA_RELATION_MEMBER();

                    Member.m_GUID         = pRelationData.GetGUID();
                    Member.m_szName       = UIString.Instance.GetUnicodeString(pRelationData.GetName());
                    Member.m_RelationType = (RELATION_TYPE)pAddRelation.GetRelationType();
                    Member.m_nLevel       = pRelationData.GetLevel();
                    Member.m_nMenPai      = pRelationData.GetMenPai();
                    Member.m_nPortrait    = pRelationData.GetPortrait();
                    Member.m_GuildID      = pRelationData.GetGuildID();
                    Member.m_szGuildName  = UIString.Instance.GetUnicodeString(pRelationData.GetGuildName());
                    Member.m_bOnlineFlag  = pRelationData.GetOnlineFlag() != 0;

                    if (Member.m_bOnlineFlag)
                    {
                        Member.m_szMood    = UIString.Instance.GetUnicodeString(pRelationData.GetMood());
                        Member.m_szTitle   = UIString.Instance.GetUnicodeString(pRelationData.GetTitle());
                        Member.m_SceneID   = pRelationData.GetSceneID();
                        Member.m_nTeamSize = pRelationData.GetTeamSize();
                    }

                    pRelation.AddRelation(Drg, Member);

                    // 更新好友信息 [9/26/2011 Ivan edit]
                    CObject_Character player = (CObject_Character)(CObjectManager.Instance.FindCharacterByName(Member.m_szName));
                    if (player != null)
                    {
                        player.GetCharacterData().RefreshName();
                    }
                }
                break;

                case RELATION_RETURN_TYPE.RET_TRANSITION:
                {
//                  RETURN_ADD_RELATION pAddRelation = (RETURN_ADD_RELATION)(pReturn.mRelation);
//                  RELATION_GROUP Drg;
//
//                  // 将好友分组到黑名单才提示 [6/23/2011 edit by ZL]
//                  if ( pAddRelation.GetRelationType() == (byte)RELATION_TYPE_BLACKNAME )
//                  {
//                      string name = UIString.Instance.GetUnicodeString(pAddRelation.GetRelationData().GetName());
//                         szText = "你将"+name+"加入黑名单";
//                      Drg = (RELATION_GROUP)RELATION_GROUP_BLACK;
//                      GameProcedure.s_pEventSystem.PushEvent( GAME_EVENT_ID.GE_INFO_SELF, szText );
//                  }

                    RELATION_GUID_UCHAR_UCHAR pRelationInfo = (RELATION_GUID_UCHAR_UCHAR)(pReturn.mRelation);

                    RELATION_GROUP Srg = RELATION_GROUP.RELATION_GROUP_FRIEND_ALL;
                    int            idx = 0;

                    pRelation.GetRelationPosition(pRelationInfo.GetTargetGUID(), ref Srg, ref idx);
                    pRelation.MoveRelation(Srg, (RELATION_TYPE)pRelationInfo.GetRelationType(),
                                           (RELATION_GROUP)pRelationInfo.GetGroup(), pRelationInfo.GetTargetGUID());

                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);;
                }
                break;

                case RELATION_RETURN_TYPE.RET_DELFRIEND:
                case RELATION_RETURN_TYPE.RET_DELFROMBLACKLIST:
                {
                    pRelation.RemoveRelation(((RELATION_GUID)pReturn.mRelation).GetTargetGUID());
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
                }
                break;

                case RELATION_RETURN_TYPE.RET_ADDFRIENDNOTIFY:
                {
                    //				_snprintf(szText, _MAX_PATH, "%s已经将你添加为好友了。", pReturn.m_NotifyFriend.GetName() );
//                  ADDTALKMSG(szText);
//                                      strTemp = NOCOLORMSGFUNC("GCRelationHandler_Info_Add_You_To_Firend_List", pReturn.m_NotifyFriend.GetName());
//                                      _snprintf(szText, _MAX_PATH, "%s", strTemp.c_str());
//                                      CGameProcedure::s_pEventSystem.PushEvent( GE_INFO_SELF, szText );
//                                      // 询问是否加对方为好友 [6/22/2011 edit by ZL]
//                                      CGameProcedure::s_pEventSystem.PushEvent( GE_FRIEND_MSG_CONFIRM, "201", pReturn.m_NotifyFriend.GetName(), pReturn.m_NotifyFriend.GetGUID() );
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);;
                }
                break;

                case RELATION_RETURN_TYPE.RET_ONLINELIST:
                {
                    RETURN_ONLINE_LIST pRecv = (RETURN_ONLINE_LIST)(pReturn.mRelation);

                    for (byte i = 0; i < pRecv.GetOnlineCount(); ++i)
                    {
                        pRelation.UpdateOnlineFriend(pRecv.GetOnlineRelation(i));
                    }

                    //CObjectManager::GetMe().GetMySelf().GetCharacterData().Get_IsMinorPwdSetup(TRUE);

                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);;
                }
                break;

                case RELATION_RETURN_TYPE.RET_RELATIONONLINE:
                {
                    RETURN_NOTIFY_ONLINE pRecv = (RETURN_NOTIFY_ONLINE)(pReturn.mRelation);
                    pRelation.RelationOnline(UIString.Instance.GetUnicodeString(pRecv.GetTargetName()), UIString.Instance.GetUnicodeString(pRecv.GetMood()));
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
                }
                break;

                case RELATION_RETURN_TYPE.RET_RELATIONOFFLINE:
                {
                    pRelation.RelationOffLine(((RELATION_GUID )pReturn.mRelation).GetTargetGUID());
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);;
                }
                break;

                case RELATION_RETURN_TYPE.RET_NEWMOOD:
                {
                    REQUEST_MODIFY_MOOD mood = (REQUEST_MODIFY_MOOD)pReturn.mRelation;
                    pRelation.SetMood((UIString.Instance.GetUnicodeString(mood.GetMood())));
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);;
                }
                break;

                case RELATION_RETURN_TYPE.RET_ERR_PASSWDMISMATCH:
                {
                    CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_MINORPASSWORD_OPEN_UNLOCK_PASSWORD_DLG);
                }
                break;

                case RELATION_RETURN_TYPE.RET_ERR_TARGETNOTEXIST:
                case RELATION_RETURN_TYPE.RET_ERR_GROUPISFULL:
                case RELATION_RETURN_TYPE.RET_ERR_ISFRIEND:
                case RELATION_RETURN_TYPE.RET_ERR_ISBLACKNAME:
                case RELATION_RETURN_TYPE.RET_ERR_CANNOTTRANSITION:
                case RELATION_RETURN_TYPE.RET_ERR_ISNOTFRIEND:
                case RELATION_RETURN_TYPE.RET_ERR_ISNOTINBLACKLIST:
                case RELATION_RETURN_TYPE.RET_ERR_SPOUSETOBLACKLIST:
                case RELATION_RETURN_TYPE.RET_ERR_MASTERTOBLACKLIST:
                case RELATION_RETURN_TYPE.RET_ERR_PRENTICETOBLACKLIST:
                case RELATION_RETURN_TYPE.RET_ERR_BROTHERTOBLACKLIST:
                case RELATION_RETURN_TYPE.RET_ERR_DELSPOUSE:
                case RELATION_RETURN_TYPE.RET_ERR_DELMASTER:
                case RELATION_RETURN_TYPE.RET_ERR_DELPRENTICE:
                case RELATION_RETURN_TYPE.RET_ERR_DELBROTHER:
                case RELATION_RETURN_TYPE.RET_ERR_CANNOT_ADDFRIEND:
                case RELATION_RETURN_TYPE.RET_ERR_CANNOTRECEIVEMAIL:
                case RELATION_RETURN_TYPE.RET_ERR_NOTRECVSTRANGEMAIL:
                case RELATION_RETURN_TYPE.RET_ERR_RELATIONUNKNOWN:
                {
//                  STRING strTemp = "";
//                  strTemp = NOCOLORMSGFUNC(pRelationString[ pReturn.m_Type - RET_ERR_START ]);
//                  strncpy(szText, strTemp.c_str(), MAX_PATH-1);
//                  //strncpy(szText, pRelationString[ pReturn.m_Type - RET_ERR_START ], MAX_PATH-1);
                    szText = "错误";
                }
                break;

                case RELATION_RETURN_TYPE.RET_ERR_ISENEMY:
                {
                    szText = "阵营错误";
                }
                break;

                default:
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);;
                }

                GameProcedure.s_pEventSystem.PushEvent(GAME_EVENT_ID.GE_INFO_SELF, szText);
            }

            return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);;
        }
    // 客户端移除一个关系,通常用于移除临时好友
    public bool                                                             RemoveRelation(RELATION_GROUP RelationGroup, string szName)
    {
        RelationList pRelationList;

        pRelationList = GetRelationList(RelationGroup);
        if (pRelationList == null)
        {
            return(false);
        }

        int nIndex;

        nIndex = pRelationList.GetMemberIndexByName(szName);
        if (nIndex >= 0)
        {
            RemoveRelation(RelationGroup, nIndex);
            return(true);
        }

        return(false);
    }
    // 客户端移除一个关系,通常用于移除临时好友
    public bool                                                             RemoveRelation(RELATION_GROUP RelationGroup, int idx)
    {
        RelationList pRelationList;

        pRelationList = GetRelationList(RelationGroup);
        if (pRelationList == null)
        {
            return(false);
        }

        if (idx < 0 || idx >= pRelationList.GetMemberCount())
        {
            return(false);
        }

        // keep name [10/9/2011 Ivan edit]
        string m_szName = pRelationList.GetMember(idx).m_szName;

        // 刷新头顶名字颜色 [9/26/2011 Ivan edit]
        CObject_Character player = (CObject_Character)(CObjectManager.Instance.FindCharacterByName(m_szName));

        if (player != null)
        {
            player.GetCharacterData().RefreshName();
        }
        pRelationList.Erase(idx);
        UpdateUIList(RelationGroup);
        return(true);
    }
        //加入好友功能(包括好友、临时好友、黑名单)
        public void addFriend(RELATION_GROUP nGroup, string name)
        {
            string            strva    = name;
            CGRelation        Msg      = new CGRelation();
            CObject_Character pCharObj = null;

            Msg.GetRelation().m_Type = (byte)RELATION_REQUEST_TYPE.REQ_ADDFRIEND;
            REQUEST_ADD_RELATION_WITH_GROUP pFriend = new REQUEST_ADD_RELATION_WITH_GROUP();

            Msg.GetRelation().mRelation = pFriend;
            pFriend.CleanUp();

            bool valueIsNum = false;                                /*Ogre::StringConverter::isNumber(strva.c_str());*/

            if (nGroup == RELATION_GROUP.RELATION_GROUP_FRIEND_ALL) // 如果直接一个名字,就自动往所有的列表里加,
            {
                nGroup = RELATION_GROUP.RELATION_GROUP_F1;
            }
            else if (nGroup == RELATION_GROUP.RELATION_GROUP_TEMPFRIEND) //临时好友
            {
                SDATA_RELATION_MEMBER pMember = new SDATA_RELATION_MEMBER();

                if (!valueIsNum)
                {
                    pCharObj = (CObject_Character)CObjectManager.Instance.FindCharacterByName(strva);
                    if (pCharObj == null)
                    {
                        return;
                    }
                    pMember.m_szName = strva;
                }
                else
                {
                    pCharObj = (CObject_Character)CObjectManager.Instance.GetMainTarget();
                    if (pCharObj == null)
                    {
                        return;
                    }
                    pMember.m_szName = pCharObj.GetCharacterData().Get_Name();
                }
                // 如果是玩家并且是统一阵营的才会添加
                ENUM_RELATION sCamp = Interface.GameInterface.Instance.GetCampType(pCharObj, CObjectManager.Instance.getPlayerMySelf());
                if ((pCharObj is CObject_PlayerOther) == false)
                {
                    return;
                }
                if (sCamp != ENUM_RELATION.RELATION_FRIEND)
                {
                    return;
                }

                int nTmpGroup = -1, nIndex = -1;
                CDataPool.Instance.GetRelation().GetRelationByName(pMember.m_szName, ref nTmpGroup, ref nIndex);
                if (nTmpGroup >= 0)
                {
                    return;
                }

                pMember.m_RelationType = RELATION_TYPE.RELATION_TYPE_TEMPFRIEND;
                if (CDataPool.Instance.GetRelation().AddRelation(RELATION_GROUP.RELATION_GROUP_TEMPFRIEND, pMember))
                {
                    string szText = "你将" + pMember.m_szName + " 添加为临时好友";
                    GameProcedure.s_pEventSystem.PushEvent(GAME_EVENT_ID.GE_INFO_SELF, szText);
                }
                CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_UPDATE_FRIEND);
                return;
            }
            else if (nGroup == RELATION_GROUP.RELATION_GROUP_BLACK)
            { // 增加黑名单的添加
                CGRelation Msg1                 = new CGRelation();
                Msg1.GetRelation().m_Type       = (byte)RELATION_REQUEST_TYPE.REQ_ADDTOBLACKLIST;
                REQUEST_ADD_RELATION pBlackName = new REQUEST_ADD_RELATION();
                Msg1.GetRelation().mRelation    = pBlackName;
                pBlackName.CleanUp();

                if (strva == "")
                {
                    pCharObj = (CObject_Character)CObjectManager.Instance.GetMainTarget();
                    if (pCharObj == null)
                    {
                        return;
                    }
                    pBlackName.SetTargetName(EncodeUtility.Instance.GetGbBytes(pCharObj.GetCharacterData().Get_Name()));
                }
                else if (valueIsNum)
                {
//                      pCharObj = (CObject_Character)CObjectManager.Instance.FindCharacterByRaceID(int.Parse(strva));
//                      if( pCharObj == null ) pCharObj = (CObject_Character*)CObjectManager::GetMe()->FindCharacterByName(strva.c_str());
//                      if( pCharObj == null ) return ;
//                      pBlackName->SetTargetGUID( Ogre::StringConverter::parseInt(strva.c_str()) );
                }
                else
                {
                    pCharObj = (CObject_Character)CObjectManager.Instance.FindCharacterByName(strva);
                    if (pCharObj == null)
                    {
                        return;
                    }
                    pBlackName.SetTargetName(EncodeUtility.Instance.GetGbBytes(strva));
                }

                if (pCharObj == CObjectManager.Instance.getPlayerMySelf())
                {
                    return;
                }

                if (pCharObj is CObject_PlayerOther)        // 如果是玩家
                {
                    ENUM_RELATION sCamp = Interface.GameInterface.Instance.GetCampType(pCharObj, CObjectManager.Instance.getPlayerMySelf());
                    if (sCamp != ENUM_RELATION.RELATION_FRIEND)
                    {
                        GameProcedure.s_pEventSystem.PushEvent(GAME_EVENT_ID.GE_INFO_SELF, "不能添加不同阵营的人到黑名单");
                        return;
                    }
                }
                else
                {
                    GameProcedure.s_pEventSystem.PushEvent(GAME_EVENT_ID.GE_INFO_SELF, "不能添加非玩家到黑名单");
                    return;
                }

                pBlackName.SetRelationType((byte)RELATION_TYPE.RELATION_TYPE_BLACKNAME);
                NetManager.GetNetManager().SendPacket(Msg1);
                return;
            }

            if (strva == "")
            {
                pCharObj = (CObject_Character)CObjectManager.Instance.GetMainTarget();
                if (pCharObj == null)
                {
                    return;
                }
                pFriend.SetTargetName(EncodeUtility.Instance.GetGbBytes(pCharObj.GetCharacterData().Get_Name()));
            }
            else if (valueIsNum)
            {
//              pCharObj = (CObject_Character)CObjectManager::GetMe()->FindCharacterByRaceID(Ogre::StringConverter::parseInt(strva.c_str()));
//              if( pCharObj == NULL ) pCharObj = (CObject_Character*)CObjectManager::GetMe()->FindCharacterByName(strva.c_str());
//              if( pCharObj == NULL ) return 0;
//              pFriend->SetTargetGUID( Ogre::StringConverter::parseInt(strva.c_str()) );
            }
            else
            {
                pFriend.SetTargetName(EncodeUtility.Instance.GetGbBytes(strva));
                pCharObj = (CObject_Character)CObjectManager.Instance.FindCharacterByName(strva);
                if (pCharObj == null)
                {
                    return;
                }
            }
            if (pCharObj == CObjectManager.Instance.getPlayerMySelf())      // 如果是自己,就不加
            {
                return;
            }

            if (pCharObj is CObject_PlayerOther)       // 如果是玩家
            {
                ENUM_RELATION sCamp = Interface.GameInterface.Instance.GetCampType(pCharObj, CObjectManager.Instance.getPlayerMySelf());
                if (sCamp != ENUM_RELATION.RELATION_FRIEND)             // 如果不是同一阵营的
                {
                    GameProcedure.s_pEventSystem.PushEvent(GAME_EVENT_ID.GE_INFO_SELF, "不能添加不同阵营的人到好友");
                    return;
                }
//              // 改为势力判断 [9/26/2011 Ivan edit]
//              if (pCharObj.GetCharacterData().GetShiLi() !=
//                  CObjectManager::GetMe()->GetMySelf()->GetCharacterData()->GetShiLi())
//              {
//                  CGameProcedure::s_pEventSystem->PushEvent( GE_INFO_SELF, "不能添加不同势力的人到好友" );
//                  return 0;
//              }
            }
            else
            {
                GameProcedure.s_pEventSystem.PushEvent(GAME_EVENT_ID.GE_INFO_SELF, "不能添加非玩家到好友");
                return;
            }

            pFriend.SetGroup((byte)nGroup);
            pFriend.SetRelationType((byte)RELATION_TYPE.RELATION_TYPE_FRIEND);

            NetManager.GetNetManager().SendPacket(Msg);

            return;
        }
    // 获得一个名单的人数
    public int                                                                      GetListCount(RELATION_GROUP RelationGroup)
    {
        RelationList pRelationList;

        pRelationList = GetRelationList(RelationGroup);
        if (pRelationList == null)
        {
            return(0);
        }

        return(pRelationList.GetMemberCount());
    }