Files
JJBB/Assets/Project/Script/Player/Chat/GameChatHistory.cs

1052 lines
38 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
//********************************************************************
// 文件名: GameChatHistory.cs
// 描述: 聊天历史结构
// 作者: WangZhe
// 修改记录:
// 2014-5-28 Lijia: 客户端效率优化把OwnSkillData从class改为struct
//********************************************************************
using UnityEngine;
using System.Collections.Generic;
using System;
using Games.GlobeDefine;
using GCGame;
using GCGame.Table;
using Games.LogicObj;
using Module.Log;
namespace Games.ChatHistory
{
// 聊天历史条目
public class ChatHistoryItem
{
public enum LINK_INTDATA_COUNT
{
ITEM = 6,
EQUIP = 9,
COPYTEAM = 0,
MOVETO = 4,
PLAYERINFO = 2,
SWORDSMAN = 3,
GUILDRECRUIT = 7,
}
public enum LINK_STRDATA_COUNT
{
ITEM = 0,
EQUIP = 0,
COPYTEAM = 0,
MOVETO = 0,
PLAYERINFO = 0,
SWORDSMAN = 0,
GUILDRECRUIT = 0,
}
public void CleanUp()
{
m_eChannel = GC_CHAT.CHATTYPE.CHAT_TYPE_INVALID;
m_SenderGuid = GlobeVar.INVALID_GUID;
m_SenderName = "";
m_ServerName = "";
m_ReceiverGuid = GlobeVar.INVALID_GUID;
m_ReceiverName = "";
m_ChatInfo = "";
m_Duration = 0;
if (null == m_eLinkType)
{
m_eLinkType = new List<GC_CHAT.LINKTYPE>();
}
if (null == m_IntData)
{
m_IntData = new List<int>();
}
if (null == m_StrData)
{
m_StrData = new List<string>();
}
m_SenderVIPLevel = GlobeVar.INVALID_ID;
}
public bool IsValid()
{
return m_SenderGuid != GlobeVar.INVALID_GUID;
}
public int GetLinkIntDataCountByIndex(int index)
{
switch (m_eLinkType[index])
{
case GC_CHAT.LINKTYPE.LINK_TYPE_ITEM:
return (int)LINK_INTDATA_COUNT.ITEM;
case GC_CHAT.LINKTYPE.LINK_TYPE_EQUIP:
return (int)LINK_INTDATA_COUNT.EQUIP;
case GC_CHAT.LINKTYPE.LINK_TYPE_COPYTEAM:
return (int)LINK_INTDATA_COUNT.COPYTEAM;
case GC_CHAT.LINKTYPE.LINK_TYPE_MOVETO:
return (int)LINK_INTDATA_COUNT.MOVETO;
case GC_CHAT.LINKTYPE.LINK_TYPE_PLAYERINFO:
return (int)LINK_INTDATA_COUNT.PLAYERINFO;
case GC_CHAT.LINKTYPE.LINK_TYPE_SWORDSMAN:
return (int)LINK_INTDATA_COUNT.SWORDSMAN;
case GC_CHAT.LINKTYPE.LINK_TYPE_GUILDCRUITE:
return (int)LINK_INTDATA_COUNT.GUILDRECRUIT;
default:
return 0;
}
}
public int GetLinkStrDataCountByIndex(int index)
{
switch (m_eLinkType[index])
{
case GC_CHAT.LINKTYPE.LINK_TYPE_ITEM:
return (int)LINK_STRDATA_COUNT.ITEM;
case GC_CHAT.LINKTYPE.LINK_TYPE_EQUIP:
return (int)LINK_STRDATA_COUNT.EQUIP;
case GC_CHAT.LINKTYPE.LINK_TYPE_COPYTEAM:
return (int)LINK_STRDATA_COUNT.COPYTEAM;
case GC_CHAT.LINKTYPE.LINK_TYPE_MOVETO:
return (int)LINK_STRDATA_COUNT.MOVETO;
case GC_CHAT.LINKTYPE.LINK_TYPE_PLAYERINFO:
return (int)LINK_STRDATA_COUNT.PLAYERINFO;
case GC_CHAT.LINKTYPE.LINK_TYPE_SWORDSMAN:
return (int)LINK_STRDATA_COUNT.SWORDSMAN;
case GC_CHAT.LINKTYPE.LINK_TYPE_GUILDCRUITE:
return (int)LINK_STRDATA_COUNT.GUILDRECRUIT;
default:
return 0;
}
}
GC_CHAT.CHATTYPE m_eChannel;
public GC_CHAT.CHATTYPE EChannel
{
get { return m_eChannel; }
set { m_eChannel = value; }
}
int m_HeadBGType = -1;
public int HeadBGType
{
get { return m_HeadBGType; }
set { m_HeadBGType = value; }
}
int m_chatPopType = -1;
public int ChatPopType
{
get { return m_chatPopType; }
set { m_chatPopType = value; }
}
//只针对队伍信息是否是系统消息,其它频道不能用来判断是否是系统消息
//181120 可以通过 || 添加别的类型
bool m_isSystem = false;
public bool IsSystem
{
get { return m_isSystem; }
set { m_isSystem = value; }
}
UInt64 m_SenderGuid;
public UInt64 SenderGuid
{
get { return m_SenderGuid; }
set { m_SenderGuid = value; }
}
string m_SenderName;
public string SenderName
{
get { return m_SenderName; }
set { m_SenderName = value; }
}
string m_ServerName = "";
public string ServerName
{
get { return m_ServerName; }
set { m_ServerName = value; }
}
int m_SenderGuildJob = -1;
public int SenderGuildJob
{
get { return m_SenderGuildJob; }
set { m_SenderGuildJob = value; }
}
int m_SenderLevel;
public int SenderLevel
{
get { return m_SenderLevel; }
set { m_SenderLevel = value; }
}
string m_SenderIcon;
public string SenderIcon
{
get { return m_SenderIcon; }
set { m_SenderIcon = value; }
}
public int SenderPro = 0;
UInt64 m_ReceiverGuid;
public UInt64 ReceiverGuid
{
get { return m_ReceiverGuid; }
set { m_ReceiverGuid = value; }
}
string m_ReceiverName;
public string ReceiverName
{
get { return m_ReceiverName; }
set { m_ReceiverName = value; }
}
int m_ReceiverPro;
public int ReceiverPro
{
get { return m_ReceiverPro; }
set { m_ReceiverPro = value; }
}
string m_ChatInfo;
public string ChatInfo
{
get { return m_ChatInfo; }
set { m_ChatInfo = value; }
}
float m_Duration; //冒泡用到的 显示的时间
public float Duration
{
get { return m_Duration; }
set { m_Duration = value; }
}
List<GC_CHAT.LINKTYPE> m_eLinkType;
public List<GC_CHAT.LINKTYPE> ELinkType
{
get { return m_eLinkType; }
set { m_eLinkType = value; }
}
List<int> m_IntData;
public List<int> IntData
{
get { return m_IntData; }
set { m_IntData = value; }
}
List<string> m_StrData;
public List<string> StrData
{
get { return m_StrData; }
set { m_StrData = value; }
}
int m_SenderVIPLevel;
public int SenderVIPLevel
{
get { return m_SenderVIPLevel; }
set { m_SenderVIPLevel = value; }
}
int m_SenderPrivilegeVIP;
public int SenderPrivilegeVIP
{
get { return m_SenderPrivilegeVIP; }
set { m_SenderPrivilegeVIP = value; }
}
public int _RedPacketID = -1;
public int _RedPacketType = -1;
public bool _ReadTip = false;
//msgTime
public static string _TimeStart = "[Time=";
public static string _TimeEnd = "]";
System.DateTime _MsgTime;
public DateTime GetMsgTime()
{
return _MsgTime;
}
public void SetRecMsgTime()
{
if (m_eChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_FRIEND || m_eChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_TELL)
{
int startIdx = m_ChatInfo.IndexOf(_TimeStart);
if (startIdx < 0)
{
_MsgTime = System.DateTime.Now;
}
else
{
int endIdx = m_ChatInfo.IndexOf(_TimeEnd, startIdx);
string valueStr = m_ChatInfo.Substring(startIdx + _TimeStart.Length, endIdx - (startIdx + _TimeStart.Length));
valueStr = valueStr.Replace('*', ' ');
m_ChatInfo = m_ChatInfo.Substring(endIdx + _TimeEnd.Length, m_ChatInfo.Length - endIdx - _TimeEnd.Length);
if(System.DateTime.TryParse(valueStr,out _MsgTime))
{
_MsgTime = System.DateTime.Now;
}
}
}
}
public void SetSendMsgTime()
{
if (m_eChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_FRIEND || m_eChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_TELL)
{
m_ChatInfo = _TimeStart + System.DateTime.Now.ToString() + _TimeEnd + m_ChatInfo;
}
}
}
// 整个聊天历史 保存在playerdata中
public class GameChatHistory
{
List<ChatHistoryItem> m_ChatHistoryList = new List<ChatHistoryItem>();
public List<ChatHistoryItem> ChatHistoryList
{
get { return m_ChatHistoryList; }
set { m_ChatHistoryList = value; }
}
List<ChatHistoryItem> m_ReplyHistoryList = new List<ChatHistoryItem>();
public List<ChatHistoryItem> ReplyHistoryList
{
get { return m_ReplyHistoryList; }
set { m_ReplyHistoryList = value; }
}
public const int ReplyHistoryNum = 6;
List<ChatHistoryItem>[] m_ChannelHistory = new List<ChatHistoryItem>[(int)GC_CHAT.CHATTYPE.CHAT_TYPE_ALLSERSPEAKER];
int[] Channel_HistoryCount = { 100, 100, 100, 100, 100, 100, 100, 100, 100,100, 100, 100, 100, 100 }; // 各频道聊天记录上限 顺序和m_ChannelHistory一致
List<UInt64> m_FriendSendList = new List<UInt64>();
public List<UInt64> FriendSendList
{
get { return m_FriendSendList; }
set { m_FriendSendList = value; }
}
private bool m_HasNewTellChat = false;
public bool HasNewTellChat
{
get { return m_HasNewTellChat; }
set { m_HasNewTellChat = value; }
}
private bool m_HasNewFriendChat = false;
public bool HasNewFriendChat
{
get { return m_HasNewFriendChat; }
set { m_HasNewFriendChat = value; }
}
public GameChatHistory()
{
ClearData();
}
public void OnReceiveChat(GC_CHAT pak)
{
if (pak != null)
{
if (pak.Chattype - 1 >= m_ChannelHistory.Length || pak.Chattype - 1 >= Channel_HistoryCount.Length || pak.Chattype - 1 < 0)
{
return;
}
if (pak.HasSenderguid)
{
if (pak.Chattype != (int)GC_CHAT.CHATTYPE.CHAT_TYPE_SYSTEM)
{
if (pak.Senderguid != GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid)
{
if (Utils.IsStrFilter_Abuse(pak.Chatinfo))
{
pak.Chatinfo = Utils.StrFilter_Abuse(pak.Chatinfo);
}
}
}
}
else
{
if (Utils.IsStrFilter_Abuse(pak.Chatinfo))
{
pak.Chatinfo = Utils.StrFilter_Abuse(pak.Chatinfo);
}
}
if (m_ChannelHistory[pak.Chattype - 1].Count >= Channel_HistoryCount[pak.Chattype - 1])
{
ChatHistoryItem item = m_ChannelHistory[pak.Chattype - 1][0];
m_ChannelHistory[pak.Chattype - 1].RemoveAt(0);
m_ChatHistoryList.Remove(item);
}
// 记录聊天历史
ChatHistoryItem history = new ChatHistoryItem();
history.CleanUp();
//string ChatInfo = "";
if (pak.HasSenderguid)
{
history.SenderGuid = pak.Senderguid;
}
if (pak.HasSendername)
{
history.SenderName = pak.Sendername;
}
if(pak.HasSenderSerName)
{
history.ServerName = pak.SenderSerName;
}
if (pak.HasReceiverguid)
{
history.ReceiverGuid = pak.Receiverguid;
}
if (pak.HasReceivername)
{
history.ReceiverName = pak.Receivername;
}
history.ChatPopType = pak.HasPopType ?pak.PopType : -1;
history.HeadBGType = pak.HasHeadBGType ? pak.HeadBGType : -1;
if (pak.HasProfession)
{
LogModule.DebugLog("Profession:" + pak.Profession);
history.SenderIcon = Utils.GetProfessionSpriteName( pak.Profession);
history.SenderPro = pak.Profession;
}
if((pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_TEAM
|| pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_GUILD
|| pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_LOUDSPEAKER
|| pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_ALLSERSPEAKER
|| pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_CROSSSERSPEAKER)
&& pak.IsSystem == 1)
{
history.IsSystem = true;
}else
{
history.IsSystem = false;
}
if (pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_SYSTEM || pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_BATTLE
|| (pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_TEAM && pak.IsSystem == 1))
{
char firstChar = pak.Chatinfo[0];
if (firstChar != '#')
{
history.ChatInfo = pak.Chatinfo;
}
else
{
history.ChatInfo = StrDictionary.GetServerDictionaryFormatString(pak.Chatinfo);
}
}
//夺宝分享走帮派跟世界频道(即便是#开头也要在解析完之后过滤一遍,防止世界或者帮派频道可以用#开头从而输入屏蔽内容)
else if (pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_WORLD || pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_GUILD)
{
if(pak.HasIsSystem && pak.IsSystem == 1)
{
history.ChatInfo = StrDictionary.GetServerDictionaryFormatString(pak.Chatinfo);
}
else
{
if (!pak.Chatinfo.StartsWith(ChatVoiceInputLogic._VoiceChatStart))
{
if (pak.Chatinfo.StartsWith("#"))
{
//history.ChatInfo = StrDictionary.GetServerDictionaryFormatString(pak.Chatinfo);
history.ChatInfo = Utils.StrFilter_Chat(pak.Chatinfo);
}
}
}
}
if(string.IsNullOrEmpty(history.ChatInfo))
{
history.ChatInfo = pak.Chatinfo;
}
history.ChatInfo = history.ChatInfo.Replace(" ", " ");
history.EChannel = (GC_CHAT.CHATTYPE)pak.Chattype;
for (int i = 0; i < pak.linktypeCount; i++ )
{
history.ELinkType.Add((GC_CHAT.LINKTYPE)pak.linktypeList[i]);
}
for (int i = 0; i < pak.intdataList.Count; ++i )
{
history.IntData.Add(pak.intdataList[i]);
}
for (int i = 0; i < pak.strdataList.Count; ++i)
{
history.StrData.Add(pak.strdataList[i]);
}
if (pak.HasSenderVIPLevel)
{
history.SenderVIPLevel = pak.SenderVIPLevel;
}
if (pak.HasSenderPrivilegeVip)
{
history.SenderPrivilegeVIP = pak.SenderPrivilegeVip;
}
if (pak.HasSenderlevel)
{
history.SenderLevel = pak.Senderlevel;
}
if(pak.HasGuildjob)
{
history.SenderGuildJob = pak.Guildjob;
}
history.SetRecMsgTime();
if(pak.Chattype != (int)GC_CHAT.CHATTYPE.CHAT_TYPE_LOUDSPEAKER
&& pak.Chattype != (int)GC_CHAT.CHATTYPE.CHAT_TYPE_ALLSERSPEAKER
&& pak.Chattype != (int)GC_CHAT.CHATTYPE.CHAT_TYPE_CROSSSERSPEAKER)
m_ChannelHistory[pak.Chattype - 1].Add(history);
else
m_ChannelHistory[(int)GC_CHAT.CHATTYPE.CHAT_TYPE_WORLD].Add(history);
m_ChatHistoryList.Add(history);
if (pak.HasSenderguid && (pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_NORMAL
|| pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_TEAM
|| pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_WORLD))
{
if (pak.Senderguid == Singleton<ObjManager>.Instance.MainPlayer.GUID)
{
Singleton<ObjManager>.Instance.MainPlayer.ShowChatBubble(history);
}
else
{
Obj_OtherPlayer player = Singleton<ObjManager>.GetInstance().FindOtherPlayerInScene(pak.Senderguid);
if (player != null)
{
player.ShowChatBubble(history);
}
}
}
// 好友频道消息
//history.SenderGuid = GlobeVar.SYSFRIEND_GUID;
//history.SenderName = "1";
if (pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_FRIEND
|| pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_TELL
|| pak.Chattype == (int)CG_CHAT.CHATTYPE.CHAT_TYPE_FRIEND_GUILD)
{
if (pak.Chattype == (int)CG_CHAT.CHATTYPE.CHAT_TYPE_FRIEND_GUILD)
{
history.EChannel = GC_CHAT.CHATTYPE.CHAT_TYPE_FRIEND;
history.SenderGuid = 0;
history.SenderName = "2";
}
if (FriendAndMailRoot.Instance() == null)
{
if (pak.Senderguid == 0)
{
if (string.Equals("1", pak.Sendername))
{
GameManager.gameManager.PlayerDataPool.ChatHistory.AddFriendChat(pak.Senderguid, pak.Sendername, Utils.GetSysIconName(Utils.SysIconType.Sys), pak.Senderlevel, pak.Senderguid, pak.SenderVIPLevel, pak.SenderPrivilegeVip, history);
}
else if (string.Equals("2", pak.Sendername))
{
GameManager.gameManager.PlayerDataPool.ChatHistory.AddFriendChat(pak.Senderguid, pak.Sendername, Utils.GetSysIconName(Utils.SysIconType.Guild), pak.Senderlevel, pak.Senderguid, pak.SenderVIPLevel, pak.SenderPrivilegeVip, history);
}
}
// 发送者不是玩家自己
else if (Singleton<ObjManager>.Instance.MainPlayer.GUID != pak.Senderguid)
{
GameManager.gameManager.PlayerDataPool.ChatHistory.AddFriendChat(pak.Senderguid, pak.Sendername, Utils.GetProfessionSpriteName(pak.Profession), pak.Senderlevel, pak.Senderguid, pak.SenderVIPLevel, pak.SenderPrivilegeVip, history);
//GameManager.gameManager.PlayerDataPool.ChatHistory.AddFriendChat(GlobeVar.SYSFRIEND_GUID, "1", Utils.GetSysIconName(Utils.SysIconType.Sys), 0, GlobeVar.SYSFRIEND_GUID, history);
//history.SenderGuid = GlobeVar.SYSFRIEND_GUID;
//history.SenderName = "1";
}
else
{
GameManager.gameManager.PlayerDataPool.ChatHistory.AddFriendChat(pak.Receiverguid, pak.Receivername, "", pak.Senderlevel, pak.Senderguid, -1, -1, history);
}
}
PlayerPreferenceData.SetFriendChatHistory(GameManager.gameManager.PlayerDataPool.ChatHistory.FriendChatList);
}
if (pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_TELL)
{
if (pak.HasSenderguid && pak.Senderguid != Singleton<ObjManager>.Instance.MainPlayer.GUID)
{
// 聊天界面关闭或者打开但不是密聊频道时
if (ChatInfoLogic.Instance() == null ||
(ChatInfoLogic.Instance() != null && ChatInfoLogic.Instance().CurChannelType != ChatInfoLogic.CHANNEL_TYPE.CHAT_TYPE_TELL))
{
// 通知ChatFrame显示提示红点
if (ChatFrameLogic.Instance() != null)
{
ChatFrameLogic.Instance().SetChatTips(true);
m_HasNewTellChat = true;
}
// 如果打开但不是密聊频道 通知聊天界面显示密聊频道标签上的红点
if (ChatInfoLogic.Instance() != null && ChatInfoLogic.Instance().CurChannelType != ChatInfoLogic.CHANNEL_TYPE.CHAT_TYPE_TELL)
{
//ChatInfoLogic.Instance().m_TellInformSprite.SetActive(true);
}
}
}
}
if(pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_LOUDSPEAKER
|| pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_ALLSERSPEAKER
|| pak.Chattype == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_CROSSSERSPEAKER)
{
char firstChar = pak.Chatinfo[0];
if (firstChar == '#' && pak.Senderguid == GlobeVar.INVALID_GUID)
{
history.ChatInfo = StrDictionary.GetServerDictionaryFormatString(pak.Chatinfo);
}
else
{
history.ChatInfo = pak.Chatinfo;
}
UIManager.ShowUI(UIInfo.HornPanel, delegate (bool bSucess, object param)
{
if (bSucess)
{
HornPanelCtr.Instance.PopHornInfoToList(history/*'[' + history.SenderName + ']' + " : " + history.ChatInfo*/);
}
});
}
}
}
public void AddHistory(ChatHistoryItem history)
{
m_ChatHistoryList.Add(history);
}
public void AddReplyHistory(CG_CHAT pak)
{
if (pak != null)
{
// 记录历史回复
// 如果重复发言 把之前的记录提前 不新增
foreach (ChatHistoryItem item in m_ReplyHistoryList)
{
if (item.ChatInfo == pak.Chatinfo)
{
m_ReplyHistoryList.Remove(item);
break;
}
}
ChatHistoryItem history = new ChatHistoryItem();
history.CleanUp();
history.ChatInfo = pak.Chatinfo;
history.ELinkType.Add((GC_CHAT.LINKTYPE)pak.Linktype);
for (int i = 0; i < pak.intdataList.Count; ++i)
{
history.IntData.Add(pak.intdataList[i]);
}
for (int i = 0; i < pak.strdataList.Count; ++i)
{
history.StrData.Add(pak.strdataList[i]);
}
if (m_ReplyHistoryList.Count >= ReplyHistoryNum)
{
m_ReplyHistoryList.RemoveAt(0);
}
m_ReplyHistoryList.Add(history);
}
}
public void ClearData()
{
m_ChatHistoryList.Clear();
m_ReplyHistoryList.Clear();
for (int i = 0; i < m_ChannelHistory.Length; i++)
{
if (m_ChannelHistory[i] == null)
{
m_ChannelHistory[i] = new List<ChatHistoryItem>();
}
m_ChannelHistory[i].Clear();
}
}
#region friend chat
public const int MAX_FRIEND_CHAT_LIST_CNT = 50;
public const int MAX_FRIEND_CHAT_HISTORY_CNT = 100;
public const int MAX_SHOW_TIME_SECOND = 30;
private List<FriendChat> _FriendChatList = null;
public List<FriendChat> FriendChatList
{
get
{
if (_FriendChatList == null)
{
_FriendChatList = PlayerPreferenceData.GetFriendChatHistory();
}
return _FriendChatList;
}
}
public FriendChat GetFriendChat(ulong guid)
{
FriendChat friendChat = FriendChatList.Find((chatInfo) =>
{
if (chatInfo.ChatGuid == guid)
return true;
return false;
});
return friendChat;
}
public bool AddFriendChat(ulong guid, string name, string icon, int level, ulong senderGuid, int vip, int privilegeVip, ChatHistoryItem chat)
{
FriendChat friendChat = GetFriendChat(guid);
if (friendChat != null)
{
if (!string.IsNullOrEmpty(icon))
friendChat.ChatIcon = icon;
if (level > 0)
{
friendChat.ChatLevel = level;
}
if (vip >= 0)
{
friendChat.VIPLevel = vip;
}
if (privilegeVip >= 0)
{
friendChat.PrivilegeVIP = privilegeVip;
}
// 因为存在改名的情况,所以每次交谈查看交谈对象是否改过名,并更新。
if (!string.IsNullOrEmpty(name)
&& GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid != senderGuid
&& friendChat.ChatName != name)
{
// 当发送者的名称为 1 或者 2 会代表系统相关
if(name != "1" && name != "2")
{
friendChat.ChatName = name;
GameManager.gameManager.PlayerDataPool.FriendList.RelationDataList[senderGuid].Name = name;
}
}
// 最新信息靠前,玩家信息优先级低于系统信息。
FriendChatList.Remove(friendChat);
if (guid == 0)
{
FriendChatList.Insert(0, friendChat);
}
else
{
FriendChatList.Insert(1, friendChat);
}
}
else
{
friendChat = new FriendChat();
friendChat.ChatGuid = guid;
friendChat.ChatName = name;
friendChat.ChatIcon = icon;
friendChat.ChatLevel = level;
if (vip >= 0)
{
friendChat.VIPLevel = vip;
}
if (privilegeVip >= 0)
{
friendChat.PrivilegeVIP = privilegeVip;
}
friendChat.ChatList = new List<FriendChatRecord>();
FriendChatList.Insert(1, friendChat);
if (GameManager.gameManager.PlayerDataPool.FriendList.RelationDataList.ContainsKey(guid))
{
friendChat.ChatName = GameManager.gameManager.PlayerDataPool.FriendList.RelationDataList[guid].Name;
friendChat.ChatIcon = Utils.GetProfessionSpriteName( GameManager.gameManager.PlayerDataPool.FriendList.RelationDataList[guid].Profession);
friendChat.ChatLevel = GameManager.gameManager.PlayerDataPool.FriendList.RelationDataList[guid].Level;
}
else if (GameManager.gameManager.PlayerDataPool.GuildFriendList.RelationDataList.ContainsKey(guid))
{
friendChat.ChatName = GameManager.gameManager.PlayerDataPool.GuildFriendList.RelationDataList[guid].Name;
friendChat.ChatIcon = Utils.GetProfessionSpriteName(GameManager.gameManager.PlayerDataPool.GuildFriendList.RelationDataList[guid].Profession);
friendChat.ChatLevel = GameManager.gameManager.PlayerDataPool.GuildFriendList.RelationDataList[guid].Level;
}
else if (GameManager.gameManager.PlayerDataPool.HateList.RelationDataList.ContainsKey(guid))
{
friendChat.ChatName = GameManager.gameManager.PlayerDataPool.HateList.RelationDataList[guid].Name;
friendChat.ChatIcon = Utils.GetProfessionSpriteName(GameManager.gameManager.PlayerDataPool.HateList.RelationDataList[guid].Profession);
friendChat.ChatLevel = GameManager.gameManager.PlayerDataPool.HateList.RelationDataList[guid].Level;
}
else if (GameManager.gameManager.PlayerDataPool.BlackList.RelationDataList.ContainsKey(guid))
{
friendChat.ChatName = GameManager.gameManager.PlayerDataPool.BlackList.RelationDataList[guid].Name;
friendChat.ChatIcon = Utils.GetProfessionSpriteName(GameManager.gameManager.PlayerDataPool.BlackList.RelationDataList[guid].Profession);
friendChat.ChatLevel = GameManager.gameManager.PlayerDataPool.BlackList.RelationDataList[guid].Level;
}
if (FriendAndMailRoot.Instance() != null)
{
FriendAndMailRoot.Instance()._FriendRootLogic.UpdateTell();
}
}
if (chat != null && !string.IsNullOrEmpty(chat.ChatInfo))
{
bool isNeedSendTime = false;
var timeDelta = (chat.GetMsgTime() - friendChat.LastChatTime).TotalSeconds;
if (timeDelta > MAX_SHOW_TIME_SECOND)
{
FriendChatRecord timeRecord = new FriendChatRecord();
timeRecord.RecordType = FriendChatRecord.RECORD_TYPE.Time;
timeRecord.ChatInfo = GCGame.Utils.GetServerDateTime().ToString();
friendChat.ChatList.Add(timeRecord);
isNeedSendTime = true;
}
friendChat.LastChatTime = System.DateTime.Now;
FriendChatRecord chatRecord = new FriendChatRecord();
if (senderGuid == 0)
{
if (name == "1")
{
chatRecord.RecordType = FriendChatRecord.RECORD_TYPE.SysChat;
}
else if (name == "2")
{
chatRecord.RecordType = FriendChatRecord.RECORD_TYPE.GuideChat;
}
friendChat.SetNewRecordChecked(false);
}
else
{
if (senderGuid == guid)
{
chatRecord.RecordType = FriendChatRecord.RECORD_TYPE.OtherChat;
friendChat.SetNewRecordChecked(false);
}
else
{
chatRecord.RecordType = FriendChatRecord.RECORD_TYPE.MyChat;
friendChat.SetNewRecordChecked(true);
}
}
chatRecord.ChatInfo = chat.ChatInfo;
chatRecord._HeadType = chat.HeadBGType;
chatRecord._ChatPopType = chat.ChatPopType;
friendChat.ChatList.Add(chatRecord);
return isNeedSendTime;
}
return false;
}
public bool IsNeedInsertTime(ulong guid)
{
FriendChat friendChat = GetFriendChat(guid);
if (friendChat != null)
{
var timeDelta = (System.DateTime.Now - friendChat.LastChatTime).TotalSeconds;
if (timeDelta > MAX_SHOW_TIME_SECOND)
{
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
#endregion
#region chat checked tips
private List<ulong> _UnCheckedChat = new List<ulong>();
public void AddUncheckedChat(ulong guid)
{
if (!_UnCheckedChat.Contains(guid))
_UnCheckedChat.Add(guid);
if (ChatFrameLogic.Instance())
ChatFrameLogic.Instance().UpdateRedDotTip();
}
public void RemoveUncheckedChat(ulong guid)
{
if (_UnCheckedChat.Contains(guid))
_UnCheckedChat.Remove(guid);
}
public bool IsHaveUnCheckChat()
{
return _UnCheckedChat.Count > 0;
}
public int GetAllUnCheckedChatCount()
{
return _UnCheckedChat.Count;
}
#endregion
}
public class LastSpeaker
{
public void CleanUp()
{
m_Guid = GlobeVar.INVALID_GUID;
m_Name = "";
}
public bool IsValid()
{
return m_Guid != GlobeVar.INVALID_GUID;
}
UInt64 m_Guid;
public UInt64 Guid
{
get { return m_Guid; }
set { m_Guid = value; }
}
string m_Name;
public string Name
{
get { return m_Name; }
set { m_Name = value; }
}
}
public class LastSpeakerRecord
{
List<LastSpeaker> m_LastSpeakerList = new List<LastSpeaker>();
public List<LastSpeaker> LastSpeakerList
{
get { return m_LastSpeakerList; }
set { m_LastSpeakerList = value; }
}
public LastSpeaker Add(UInt64 guid, string name)
{
if (m_LastSpeakerList.Count >= GlobeVar.MAX_LAST_SPEAKERS)
{
m_LastSpeakerList.RemoveAt(0);
}
LastSpeaker speaker = new LastSpeaker();
speaker.CleanUp();
speaker.Guid = guid;
speaker.Name = name;
m_LastSpeakerList.Add(speaker);
return speaker;
}
public bool IsExist(UInt64 guid)
{
for (int i = 0; i < m_LastSpeakerList.Count; i++ )
{
if (m_LastSpeakerList[i].Guid == guid)
{
return true;
}
}
return false;
}
public void ClearData()
{
m_LastSpeakerList.Clear();
}
}
public class FriendChatRecord
{
public enum RECORD_TYPE
{
Time = 1,
OtherChat,
MyChat,
SysChat,
GuideChat
}
public RECORD_TYPE RecordType;//1time, 2selfsend,3targetsend
public string ChatInfo;
public int _ReadTip;
public int _HeadType = -1;
public int _ChatPopType = -1;
public ChatHistoryItem _TempChatHistory;
}
public class FriendChat
{
public ulong ChatGuid = GlobeVar.INVALID_GUID;
public string ChatName = "";
public string ChatIcon = "";
public int ChatLevel = 0;
public int ChatCombat = 0;
public int VIPLevel = 0;
public int PrivilegeVIP = 0;
public int OnlineState = (int)CharacterDefine.RELATION_TYPE.ONLINE;
public System.DateTime LastChatTime;
private bool _NewRecordChecked = true; // 是否已经检查过新的信息
public bool NewRecordChecked
{
get
{
return _NewRecordChecked;
}
}
public void SetNewRecordChecked(bool isChecked)
{
_NewRecordChecked = isChecked;
if (!NewRecordChecked)
{
GameManager.gameManager.PlayerDataPool.ChatHistory.AddUncheckedChat(ChatGuid);
}
else
{
GameManager.gameManager.PlayerDataPool.ChatHistory.RemoveUncheckedChat(ChatGuid);
}
}
public List<FriendChatRecord> ChatList;
public void ClearChatRecord()
{
LastChatTime = new DateTime();
ChatList.Clear();
}
}
}