Files
JJBB/Assets/Project/Script/Player/Relation/RelationList.cs
2024-08-23 15:49:34 +08:00

530 lines
17 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************************
* 文件名: 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);
}
}