/******************************************************************************** * 文件名: RelationList.cs * 全路径: \Script\Player\Relation\RelationList.cs * 创建人: 李嘉 * 创建时间:2014-02-14 * * 功能说明:游戏玩家关系人数据列表 * 修改记录: *********************************************************************************/ using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using Games.GlobeDefine; using GCGame.Table; public class RelationList { public RelationList() { m_RelationDataList = new Dictionary(); } private Dictionary m_RelationDataList; //关系人数据列表 public Dictionary RelationDataList { get { return m_RelationDataList; } set { m_RelationDataList = value; } } public void CleanUp() { if (null != m_RelationDataList) { m_RelationDataList.Clear(); } } //关系人列表接口 //添加关系人 public bool AddRelation(Relation _relation) { //非法ID,则返回 if (null == _relation || _relation.Guid == GlobeVar.INVALID_GUID) { return false; } //如果发现已存在,则先remove bool bCanAdd = true; if (m_RelationDataList.ContainsKey(_relation.Guid)) { bCanAdd = m_RelationDataList.Remove(_relation.Guid); } if (!bCanAdd) { return false; } //发现可添加,则加入关系人 m_RelationDataList.Add(_relation.Guid, _relation); return true; } //删除关系人 public void DelRelation(UInt64 relationGuid) { //非法ID,则返回 if (relationGuid == GlobeVar.INVALID_GUID) { return; } //如果发现已存在,则remove if (m_RelationDataList.ContainsKey(relationGuid)) { m_RelationDataList.Remove(relationGuid); } if (FriendAndMailRoot.Instance()) { FriendAndMailRoot.Instance().UpdateRedCheck(); FriendAndMailRoot.Instance()._FriendRootLogic.UpdateCheckTip(); } if (ChatFrameLogic.Instance()) ChatFrameLogic.Instance().UpdateRedDotTip(); } //获得关系人数量 public int GetRelationNum() { return m_RelationDataList.Count; } //获得某种状态关系人数量 public int GetStateRelationNum(int relationState) { int nCount = 0; foreach(KeyValuePair _relation in m_RelationDataList) { if (_relation.Value.State == relationState) { nCount++; } } return nCount; } //更新关系人,封装一层接口,方便调用函数时候辨认; public void UpdateRelation(Relation _relation) { AddRelation(_relation); } //更新关系人状态 public void UpdateRelationState(UInt64 relationGuid, int state) { //非法ID,则返回 if (relationGuid == GlobeVar.INVALID_GUID) { return; } //bool needToSortByState = false; //如果存在,则获取联系人并设置状态 Relation _relation = null; if (true == m_RelationDataList.TryGetValue(relationGuid, out _relation)) { if(_relation.State != state) { _relation.State = state; //needToSortByState = true; } } // if(needToSortByState) // { // SortByRelationState ((int)CharacterDefine.RELATION_TYPE.ONLINE); // } } //更新关系人实时状态 public void UpdateRelationUserInfo(Relation _relation) { if (null == _relation || _relation.Guid == GlobeVar.INVALID_GUID) { return; } // bool needToSortByState = false; //更新信息 if (m_RelationDataList.ContainsKey(_relation.Guid)) { Relation relation = m_RelationDataList[_relation.Guid]; if (null != relation) { //由于UserInfo只更新少数数据,所以不能直接 relation.Level = _relation.Level; relation.Profession = _relation.Profession; // needToSortByState = (relation.State != _relation.State); relation.State = _relation.State; relation.CombatNum = _relation.CombatNum; relation.Name = _relation.Name; relation.TimeInfo = _relation.TimeInfo; relation.FriendPoint = _relation.FriendPoint; relation.HeadType = _relation.HeadType; relation.ChatPopType = _relation.ChatPopType; } } else { m_RelationDataList.Add(_relation.Guid, _relation); } if (ChatFrameLogic.Instance()) ChatFrameLogic.Instance().UpdateRedDotTip(); // if(needToSortByState) // { // SortByRelationState ((int)CharacterDefine.RELATION_TYPE.ONLINE); // } } //更新关系人所有数据 //由于消息包不同,所以该方法会被重载 public void RebuildRelationList(GC_SYC_FULL_FRIEND_LIST packet) { m_RelationDataList.Clear(); // "系统信息" 好友 Relation sysFriend = new Relation(); sysFriend.Guid = GlobeVar.SYSFRIEND_GUID; sysFriend.Name = StrDictionary.GetClientDictionaryString("#{5213}"); sysFriend.State = 1; sysFriend.TimeInfo = 0; AddRelation(sysFriend); // "小精灵" 好友 //Relation helpFriend = new Relation(); //helpFriend.Guid = GlobeVar.HELPFRIEND_GUID; //helpFriend.Name = StrDictionary.GetClientDictionaryString("#{5214}"); //helpFriend.State = 1; //helpFriend.TimeInfo = 1; //AddRelation(helpFriend); if (null == m_RelationDataList || null == packet) { return; } for (int i = 0; i < packet.guidCount; ++i) { Relation _relation = new Relation(); _relation.Guid = packet.GetGuid(i); _relation.Level = packet.GetLevel(i); _relation.Name = packet.GetName(i); _relation.Profession = packet.GetProf(i); _relation.CombatNum = packet.GetCombat(i); _relation.State = packet.GetState(i); _relation.TimeInfo = packet.GetTimeInfo(i); _relation.FriendPoint = packet.GetIntimacyDegree(i); // 修改消息后要加上timeInfo if (_relation.IsValid()) { m_RelationDataList.Add(_relation.Guid, _relation); } } // SortByRelationState ((int)CharacterDefine.RELATION_TYPE.ONLINE); } public void RebuildRelationList(GC_SYC_FULL_BLACK_LIST packet) { if (null == m_RelationDataList || null == packet) { return; } m_RelationDataList.Clear(); for (int i = 0; i < packet.guidCount; ++i) { Relation _relation = new Relation(); _relation.Guid = packet.GetGuid(i); _relation.Level = packet.GetLevel(i); _relation.Name = packet.GetName(i); _relation.Profession = packet.GetProf(i); _relation.CombatNum = packet.GetCombat(i); _relation.State = packet.GetState(i); _relation.TimeInfo = packet.GetTimeInfo(i); if (_relation.IsValid()) { m_RelationDataList.Add(_relation.Guid, _relation); } } // SortByRelationState ((int)CharacterDefine.RELATION_TYPE.ONLINE); } public void RebuildRelationList(GC_SYC_FULL_HATE_LIST packet) { if (null == m_RelationDataList || null == packet) { return; } m_RelationDataList.Clear(); for (int i = 0; i < packet.GuidCount; ++i) { Relation _relation = new Relation(); _relation.Guid = packet.GetGuid(i); _relation.Level = packet.GetLevel(i); _relation.Name = packet.GetName(i); _relation.Profession = packet.GetProf(i); _relation.CombatNum = packet.GetCombat(i); _relation.State = packet.GetState(i); _relation.TimeInfo = packet.GetTimeInfo(i); if (_relation.IsValid()) { m_RelationDataList.Add(_relation.Guid, _relation); } } //SortByRelationState ((int)CharacterDefine.RELATION_TYPE.ONLINE); } //按照某个状态整理关系人状态 //多次排序之后,可以保证按照最后一次Sort排列,并保留部分前次排序结果 public void SortByRelationState(int _state) { // "系统信息",无论是否在线,一直在第一位,暂时取离待排字典。 Relation sysFriendRelation = null; if (m_RelationDataList.ContainsKey(GlobeVar.SYSFRIEND_GUID)) { sysFriendRelation = m_RelationDataList[GlobeVar.SYSFRIEND_GUID]; m_RelationDataList.Remove(sysFriendRelation.Guid); } // "小精灵" 同上 Relation helpFriendRelation = null; if (m_RelationDataList.ContainsKey(GlobeVar.SYSFRIEND_GUID)) { helpFriendRelation = m_RelationDataList[GlobeVar.HELPFRIEND_GUID]; m_RelationDataList.Remove(helpFriendRelation.Guid); } //临时队列 Dictionary tempListInState = new Dictionary(); Dictionary tempListOutState = new Dictionary(); foreach (KeyValuePair _relation in m_RelationDataList) { //如果发现状态不符合,则将关系暂时放入临时列表中 if (_relation.Value.State == _state) { if(tempListInState.ContainsKey(_relation.Key)) continue; tempListInState.Add(_relation.Key, _relation.Value); } else { if(tempListOutState.ContainsKey(_relation.Key)) continue; tempListOutState.Add(_relation.Key, _relation.Value); } } // 按照时间信息排列已经按照state分流的,两个分支 SortByTimeInfo (tempListInState); SortByTimeInfo (tempListOutState); m_RelationDataList.Clear (); // 装回字典 if (sysFriendRelation != null) { m_RelationDataList.Add(GlobeVar.SYSFRIEND_GUID, sysFriendRelation); } if (helpFriendRelation != null) { m_RelationDataList.Add(GlobeVar.HELPFRIEND_GUID, helpFriendRelation); } foreach (KeyValuePair _tmpRelation in tempListInState) { //插入老数据 m_RelationDataList.Add(_tmpRelation.Key, _tmpRelation.Value); } foreach (KeyValuePair _tmpRelation in tempListOutState) { //插入老数据 m_RelationDataList.Add(_tmpRelation.Key, _tmpRelation.Value); } } // 优先级规则: // 婚姻关系 -> 师徒 (先师傅,再徒弟) -> 结拜 -> 好友度(相同则随意) public void SortRelation() { // "系统信息",无论是否在线,一直在第一位,暂时取离待排字典。 Relation sysFriendRelation = null; if (m_RelationDataList.ContainsKey(GlobeVar.SYSFRIEND_GUID)) { sysFriendRelation = m_RelationDataList[GlobeVar.SYSFRIEND_GUID]; m_RelationDataList.Remove(sysFriendRelation.Guid); } // "小精灵" 同上 Relation helpFriendRelation = null; if (m_RelationDataList.ContainsKey(GlobeVar.SYSFRIEND_GUID)) { helpFriendRelation = m_RelationDataList[GlobeVar.HELPFRIEND_GUID]; m_RelationDataList.Remove(helpFriendRelation.Guid); } // 重新装填到List,便于排序 List> onlineList = new List>(); List> offlineList = new List>(); foreach (KeyValuePair item in m_RelationDataList) { if (item.Value.State == (int)CharacterDefine.RELATION_TYPE.ONLINE) { onlineList.Add(item); } else { offlineList.Add(item); } } m_RelationDataList.Clear(); SortRelation(onlineList); SortRelation(offlineList); // 装回字典 if (sysFriendRelation != null) { m_RelationDataList.Add(GlobeVar.SYSFRIEND_GUID, sysFriendRelation); } if (helpFriendRelation != null) { m_RelationDataList.Add(GlobeVar.HELPFRIEND_GUID, helpFriendRelation); } foreach(KeyValuePair item in onlineList) { m_RelationDataList.Add(item.Key, item.Value); } foreach (KeyValuePair item in offlineList) { m_RelationDataList.Add(item.Key, item.Value); } } public void SortRelation(List> dicItemsList) { for (int i = dicItemsList.Count - 1; i >= 1; i--) { for (int j = i; j >= 1; j--) { bool needChange = false; if (dicItemsList[j].Value.State == (int)CharacterDefine.RELATION_TYPE.ONLINE && dicItemsList[j - 1].Value.State != (int)CharacterDefine.RELATION_TYPE.ONLINE) { needChange = true; } else { // 结婚对象 if (dicItemsList[j].Key == GameManager.gameManager.PlayerDataPool.LoverGUID) { needChange = true; //break; } else if (dicItemsList[j - 1].Key != GameManager.gameManager.PlayerDataPool.LoverGUID) { // 师傅 if (GameManager.gameManager.PlayerDataPool.m_MasterInfo.IsGuidisMaster(dicItemsList[j].Key) == true) { needChange = true; //break; } else if (GameManager.gameManager.PlayerDataPool.m_MasterInfo.IsGuidisMaster(dicItemsList[j - 1].Key) == false) { // 徒弟 if (GameManager.gameManager.PlayerDataPool.m_MasterInfo.IsGuidisApprentice(dicItemsList[j].Key) == true && GameManager.gameManager.PlayerDataPool.m_MasterInfo.IsGuidisApprentice(dicItemsList[j - 1].Key) == false) { needChange = true; //break; } else if (GameManager.gameManager.PlayerDataPool.m_MasterInfo.IsGuidisApprentice(dicItemsList[j - 1].Key) == false) { // 结拜兄弟 if (GameManager.gameManager.PlayerDataPool._SwornBrother.IsMySwornBro(dicItemsList[j].Key) == true && GameManager.gameManager.PlayerDataPool._SwornBrother.IsMySwornBro(dicItemsList[j - 1].Key) == false) { needChange = true; //break; } else if (GameManager.gameManager.PlayerDataPool._SwornBrother.IsMySwornBro(dicItemsList[j - 1].Key) == false) { // 好友值 if (dicItemsList[j].Value.FriendPoint > dicItemsList[j - 1].Value.FriendPoint) { needChange = true; //break; } } } } } } // 交换 if (needChange == true) { KeyValuePair temp = dicItemsList[j]; dicItemsList[j] = dicItemsList[j - 1]; dicItemsList[j - 1] = temp; } } } } public void SortByTimeInfo(Dictionary needSortList) { SortedDictionary tempList = new SortedDictionary(new MySortURverse()); foreach (KeyValuePair _relation in needSortList) { if(tempList.ContainsKey(_relation.Value.TimeInfo)) { continue; } tempList.Add(_relation.Value.TimeInfo, _relation.Value); } needSortList.Clear (); foreach (KeyValuePair _relation in tempList) { needSortList.Add(_relation.Value.Guid,_relation.Value); } } // 排序顺序优先级为 有未读信息 > 在线 > 离线 public void SoryByLastChat() { } //是否存在某个关系人 public bool IsExist(UInt64 key) { return m_RelationDataList.ContainsKey(key); } }