Files
JJBB/Assets/Project/Script/Player/Relation/RelationList.cs

530 lines
17 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
/********************************************************************************
* 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<UInt64, Relation>();
}
private Dictionary<UInt64, Relation> m_RelationDataList; //关系人数据列表
public Dictionary<UInt64, Relation> 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<UInt64, Relation> _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<UInt64, Relation> tempListInState = new Dictionary<UInt64, Relation>();
Dictionary<UInt64, Relation> tempListOutState = new Dictionary<UInt64, Relation>();
foreach (KeyValuePair<UInt64, Relation> _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<UInt64, Relation> _tmpRelation in tempListInState)
{
//插入老数据
m_RelationDataList.Add(_tmpRelation.Key, _tmpRelation.Value);
}
foreach (KeyValuePair<UInt64, Relation> _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<KeyValuePair<UInt64, Relation>> onlineList = new List<KeyValuePair<UInt64, Relation>>();
List<KeyValuePair<UInt64, Relation>> offlineList = new List<KeyValuePair<UInt64, Relation>>();
foreach (KeyValuePair<UInt64, Relation> 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<UInt64, Relation> item in onlineList)
{
m_RelationDataList.Add(item.Key, item.Value);
}
foreach (KeyValuePair<UInt64, Relation> item in offlineList)
{
m_RelationDataList.Add(item.Key, item.Value);
}
}
public void SortRelation(List<KeyValuePair<UInt64, Relation>> 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<UInt64, Relation> temp = dicItemsList[j];
dicItemsList[j] = dicItemsList[j - 1];
dicItemsList[j - 1] = temp;
}
}
}
}
public void SortByTimeInfo(Dictionary<UInt64, Relation> needSortList)
{
SortedDictionary<UInt32, Relation> tempList = new SortedDictionary<UInt32, Relation>(new MySortURverse());
foreach (KeyValuePair<UInt64, Relation> _relation in needSortList)
{
if(tempList.ContainsKey(_relation.Value.TimeInfo))
{
continue;
}
tempList.Add(_relation.Value.TimeInfo, _relation.Value);
}
needSortList.Clear ();
foreach (KeyValuePair<UInt32, Relation> _relation in tempList)
{
needSortList.Add(_relation.Value.Guid,_relation.Value);
}
}
// 排序顺序优先级为 有未读信息 > 在线 > 离线
public void SoryByLastChat()
{
}
//是否存在某个关系人
public bool IsExist(UInt64 key)
{
return m_RelationDataList.ContainsKey(key);
}
}