using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using System.Text;
|
using System;
|
using System.Text.RegularExpressions;
|
using Snxxz.UI;
|
|
using System.Linq;
|
|
public class ChatCtrl
|
{
|
|
#region 单例
|
private static ChatCtrl _inst = null;
|
|
public static ChatCtrl Inst {
|
get {
|
if (_inst == null)
|
{
|
_inst = new ChatCtrl();
|
}
|
return _inst;
|
}
|
}
|
#endregion
|
public int CHAT_INFO_CNT = 50;
|
public const int CHAT_TIP_CNT = 4;
|
public const int CHAT_CELL_CNT = 6;
|
public const int CHAT_INFO_LIMIT = 50;
|
|
public readonly int BugleItem = 0;//喇叭物品id
|
|
static StringBuilder sb = new StringBuilder();
|
/// <summary>
|
/// 聊天信息
|
/// </summary>
|
private bool _lockUpdate = true;
|
public bool lockUpdate {
|
get {
|
return _lockUpdate;
|
}
|
set {
|
_lockUpdate = value;
|
if (ChatFriend != null && ChatFriend.IsOpen)
|
{
|
ChatFriend.OnSetLock();
|
}
|
}
|
}
|
|
private Dictionary<ChatInfoType, List<ChatData>> chatDics = new Dictionary<ChatInfoType, List<ChatData>>();
|
|
private Dictionary<ChatInfoType, bool> chatOpenDics = new Dictionary<ChatInfoType, bool>();
|
|
public List<ChatData> chatDisplayList = new List<ChatData>();
|
|
#region 私聊
|
private Dictionary<int, List<ChatFriendData>> pteChatDics = new Dictionary<int, List<ChatFriendData>>();
|
public event Action OnPteChatChangeEvent;
|
public event Action<int> SelectRecentlyEvent;
|
public static event OnChatPteRefresh OnRefreshPteChat;
|
private int pteChatId = 0;
|
public int PteChatID {
|
get { return pteChatId; }
|
set {
|
if (pteChatId == value)
|
{
|
return;
|
}
|
pteChatId = value;
|
if (OnPteChatChangeEvent != null)
|
{
|
OnPteChatChangeEvent();
|
}
|
if (ChatFriend != null && ChatFriend.IsOpen)
|
{
|
ChatFriend.RefreshChatInfo();
|
}
|
}
|
}
|
private string pteChatName = string.Empty;
|
public string PteChatName {
|
get { return pteChatName; }
|
set { pteChatName = value; }
|
}
|
|
private ChatFriend m_ChatFriend;
|
public ChatFriend ChatFriend {
|
get { return m_ChatFriend; }
|
}
|
|
public void ClearPteChat(int playerId)
|
{
|
var id = (int)PlayerDatas.Instance.PlayerId + playerId;
|
if (pteChatDics.ContainsKey(id))
|
{
|
pteChatDics.Remove(id);
|
if (OnRefreshPteChat != null)
|
{
|
OnRefreshPteChat(null);
|
}
|
}
|
}
|
|
public void SelectRecentlyChat(int playerId)
|
{
|
if (SelectRecentlyEvent != null)
|
{
|
SelectRecentlyEvent(playerId);
|
}
|
}
|
#endregion
|
|
private List<ChatData> chatlist = new List<ChatData>();
|
private List<ChatData> chatUpList = new List<ChatData>();
|
|
public delegate void OnChatRefresh(ChatInfoType type);
|
public static event OnChatRefresh OnRefreshChat;
|
|
public delegate void OnChatSelfRefresh(ChatData data);
|
public static event OnChatSelfRefresh OnRefreshSelf;
|
|
public delegate void OnChatPteRefresh(ChatFriendData data);
|
|
public ChatInfoType presentChatType {
|
get; set;
|
}
|
|
public event Action OnClickCloseChatEvent;
|
public event Action<bool> OnChatExtentOpenEvent;
|
|
public event Action<ChatData> chatFloatUpdate;
|
|
TeamModel teamModel {
|
get {
|
return ModelCenter.Instance.GetModel<TeamModel>();
|
}
|
}
|
|
ChatCenter m_ChatCenter;
|
ChatCenter chatCenter {
|
get {
|
return m_ChatCenter ?? (m_ChatCenter = ModelCenter.Instance.GetModel<ChatCenter>());
|
}
|
}
|
|
FriendsModel friendModel {
|
get { return ModelCenter.Instance.GetModel<FriendsModel>(); }
|
}
|
|
EquipGemModel equipGemModel { get { return ModelCenter.Instance.GetModel<EquipGemModel>(); } }
|
EquipStrengthModel equipStrengthModel { get { return ModelCenter.Instance.GetModel<EquipStrengthModel>(); } }
|
EquipStarModel equipStarModel { get { return ModelCenter.Instance.GetModel<EquipStarModel>(); } }
|
EquipTrainModel equipTrainModel { get { return ModelCenter.Instance.GetModel<EquipTrainModel>(); } }
|
EquipModel equipModel { get { return ModelCenter.Instance.GetModel<EquipModel>(); } }
|
PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
|
|
public Dictionary<ChatInfoType, List<string>> achievementRandoms = new Dictionary<ChatInfoType, List<string>>();
|
|
private ChatCtrl()
|
{
|
chatOpenDics.Add(ChatInfoType.System, true);
|
chatOpenDics.Add(ChatInfoType.World, true);
|
chatOpenDics.Add(ChatInfoType.CrossServer, true);
|
chatOpenDics.Add(ChatInfoType.Area, true);
|
chatOpenDics.Add(ChatInfoType.Team, true);
|
chatOpenDics.Add(ChatInfoType.Invite, true);
|
chatOpenDics.Add(ChatInfoType.Trumpet, true);
|
chatOpenDics.Add(ChatInfoType.Fairy, true);
|
lockUpdate = true;
|
presentChatType = ChatInfoType.World;
|
IsExtentOpen = false;
|
|
var _funcCfg = FuncConfigConfig.Get("BugleItem");
|
BugleItem = int.Parse(_funcCfg.Numerical1);
|
|
DTC0102_tagCDBPlayer.switchAccountEvent += SwitchAccountEvent;
|
StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish;
|
DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += PlayerLoginOkEvent;
|
|
InitChatRedpoints();
|
|
FuncConfigConfig _cfg = FuncConfigConfig.Get("RandomWord");
|
try
|
{
|
achievementRandoms.Add(ChatInfoType.World, new List<string>(ConfigParse.GetMultipleStr(_cfg.Numerical1)));
|
achievementRandoms.Add(ChatInfoType.Fairy, new List<string>(ConfigParse.GetMultipleStr(_cfg.Numerical2)));
|
var json = LitJson.JsonMapper.ToObject(_cfg.Numerical3);
|
foreach (var key in json.Keys)
|
{
|
var type = int.Parse(key);
|
m_TaskRandomChats.Add(type, new List<string>(LitJson.JsonMapper.ToObject<string[]>(json[key].ToJson())));
|
}
|
}
|
catch (Exception e)
|
{
|
DebugEx.LogError(e.Message);
|
}
|
}
|
|
private void PlayerLoginOkEvent()
|
{
|
UpdateRedpoint(ChatInfoType.Team);
|
UpdateRedpoint(ChatInfoType.Fairy);
|
}
|
|
private void OnStageLoadFinish()
|
{
|
bool isDungeon = StageLoad.Instance.currentStage is DungeonStage;
|
if (!isDungeon)
|
{
|
ClearAllChatInfo();
|
unReadChatCounts[ChatInfoType.Fairy] = 0;
|
unReadChatCounts[ChatInfoType.Team] = 0;
|
}
|
}
|
|
private void SwitchAccountEvent()
|
{
|
ClearAllChatInfo();
|
}
|
|
void ChatReport(ChatInfoType chatType, string content, string toPlayer)
|
{
|
try
|
{
|
if (chatCenter.IsChatBanned || chatCenter.IsClientBan(chatType) ||
|
IsInviteChat(content) || KillRegex.IsMatch(content))
|
{
|
return;
|
}
|
var channelName = string.Empty;
|
switch (chatType)
|
{
|
case ChatInfoType.World:
|
channelName = Language.Get("ChatType_World");
|
break;
|
case ChatInfoType.Area:
|
channelName = Language.Get("ChatType_Area");
|
break;
|
case ChatInfoType.CrossServer:
|
channelName = Language.Get("ChatType_CrossServer");
|
break;
|
case ChatInfoType.Team:
|
channelName = Language.Get("ChatType_Team");
|
break;
|
case ChatInfoType.Invite:
|
channelName = Language.Get("ChatType_Invite");
|
break;
|
case ChatInfoType.Trumpet:
|
channelName = Language.Get("ChatType_Trumpet");
|
break;
|
case ChatInfoType.Fairy:
|
channelName = Language.Get("ChatType_Fairy");
|
break;
|
case ChatInfoType.Friend:
|
channelName = Language.Get("PlayerDetail_PrivateChat");
|
break;
|
default:
|
return;
|
}
|
OperationLogCollect.Instance.ChatReport(content, channelName, chatType == ChatInfoType.Friend ? toPlayer : string.Empty, chatType);
|
}
|
catch (Exception e)
|
{
|
DebugEx.Log(e.Message);
|
}
|
}
|
|
public void SendChatInfo(ChatInfoType type, string msg, ChatExtraData? info = null)
|
{
|
bool isDirty = false;
|
bool isVoice = ChatCenter.s_VoiceRegex.IsMatch(msg);
|
|
if (CheckEmptyChat(msg))
|
{
|
SysNotifyMgr.Instance.ShowTip("CanootTalk14");
|
return;
|
}
|
|
ChatReport(type, msg, PteChatName);
|
|
if (!isVoice && !InviteRegex.IsMatch(msg))
|
{
|
isDirty = DirtyWordConfig.IsDirtWord(msg);
|
msg = DirtyWordConfig.IsDirtWord(msg, '*');
|
var length = GetChatMessageLength(msg);
|
if (length > CHAT_INFO_CNT)
|
{
|
ServerTipDetails.DisplayNormalTip(Language.Get("L1014"));
|
return;
|
}
|
if (itemPlaceList.Count > 5)
|
{
|
SysNotifyMgr.Instance.ShowTip("ChatSendItemLimit");
|
return;
|
}
|
}
|
LanguageVerify.toPlayer = (uint)PteChatID;
|
LanguageVerify.toPlayerName = PteChatName;
|
LanguageVerify.Instance.VerifyChat(msg, type, (bool ok, string result) =>
|
{
|
if (ok)
|
{
|
ChatCenter.RecentlyChat _recentlyChat = null;
|
if (!isDirty && !isVoice)
|
{
|
_recentlyChat = chatCenter.SaveRecentlyChat(result);
|
}
|
msg = CheckHasItem(result, _recentlyChat);
|
chatCenter.recentlyChat = null;
|
|
if (chatCenter.IsChatBanned || chatCenter.IsClientBan(type))
|
{
|
var toPlayer = PteChatID;
|
if (info.HasValue && info.Value.infoint1 == 0)
|
{
|
toPlayer = info.Value.infoint1;
|
}
|
chatCenter.HandleChatBanned(type, msg, toPlayer);
|
return;
|
}
|
|
switch (type)
|
{
|
case ChatInfoType.World:
|
case ChatInfoType.Fairy:
|
if (IsAssitChat(msg) != 0)
|
{
|
teamModel.RequestAssistAutoMatch();
|
}
|
break;
|
}
|
|
switch (type)
|
{
|
case ChatInfoType.World:
|
{
|
C0201_tagCTalkGong chatPack = new C0201_tagCTalkGong();
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
break;
|
case ChatInfoType.Area:
|
{
|
C0207_tagCTalkArea chatPack = new C0207_tagCTalkArea();
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
if (CrossServerUtility.IsCrossServer())
|
{
|
GameNetSystem.Instance.SendToCrossServer(chatPack);
|
}
|
else
|
{
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
}
|
break;
|
case ChatInfoType.CrossServer:
|
{
|
C0208_tagCTalkCountry chatPack = new C0208_tagCTalkCountry();
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
break;
|
case ChatInfoType.Team:
|
{
|
C0205_tagCTalkDui chatPack = new C0205_tagCTalkDui();
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
break;
|
case ChatInfoType.Friend:
|
{
|
var _toPlayer = PteChatID;
|
if (info.HasValue && info.Value.infoint1 == 0)
|
{
|
_toPlayer = info.Value.infoint1;
|
}
|
if (_toPlayer == 0)
|
{
|
SysNotifyMgr.Instance.ShowTip("NoChatTarget");
|
return;
|
}
|
SendFriendChat(msg, _toPlayer);
|
}
|
break;
|
case ChatInfoType.Fairy:
|
{
|
C0203_tagCTalkBang chatPack = new C0203_tagCTalkBang();
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
break;
|
case ChatInfoType.Trumpet:
|
{
|
if (info.HasValue)
|
{
|
CA217_tagCMPYSpeaker _pak = new CA217_tagCMPYSpeaker();
|
_pak.SpeakerType = 1;
|
_pak.IsUseGold = 0;
|
_pak.ItemIndex = (byte)info.Value.infoint1;
|
_pak.TextLen = (ushort)GetUTF8InfoLen(msg);
|
_pak.Text = msg;
|
GameNetSystem.Instance.SendInfo(_pak);
|
}
|
}
|
break;
|
}
|
}
|
});
|
}
|
|
int GetChatMessageLength(string message)
|
{
|
message = WordAnalysis.Color_Start_Regex.Replace(message, string.Empty);
|
message = WordAnalysis.Color_End_Regex.Replace(message, string.Empty);
|
return message.Length;
|
}
|
|
bool CheckEmptyChat(string msg)
|
{
|
if (string.IsNullOrEmpty(msg.Replace(" ", string.Empty)))
|
{
|
return true;
|
}
|
return false;
|
}
|
/// <summary>
|
/// 世界频道
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(H0201_tagTalkGong vNetData)
|
{
|
if (friendModel.GetFirendInfo(vNetData.PlayerID, (byte)GroupType.Balcklist) != null)//黑名单拦截
|
{
|
return;
|
}
|
ChatData chatData = null;
|
var content = vNetData.Content;
|
if (IsInviteChat(vNetData.Content))
|
{
|
content = InviteRegex.Replace(vNetData.Content, "");
|
if (teamModel.myTeam.GetIndexOfMember((int)vNetData.PlayerID) != -1)
|
{
|
content = StringUtility.Contact("<color=#f8983b>", vNetData.Name, "</color>", ":", content);
|
}
|
else
|
{
|
content = StringUtility.Contact("<color=#f8983b>", vNetData.Name, "</color>", ":", content, string.Format("<color=#00ff00><a>{0}|invite={1}</a></color>", Language.Get("L1013"), vNetData.PlayerID));
|
}
|
chatData = new ChatInviteData(content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
|
KeepChatInfo(chatData);
|
return;
|
}
|
if (IsAssitChat(content, true) == 2 && vNetData.PlayerID != PlayerDatas.Instance.baseData.PlayerID)
|
{
|
content = StringUtility.Contact(content, Language.Get("InviteTeam", vNetData.PlayerID));
|
}
|
chatData = new ChatWorldData(content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
KeepChatInfo(chatData);
|
}
|
/// <summary>
|
/// 区域频道
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(H0207_tagTalkArea vNetData)
|
{
|
if (friendModel.GetFirendInfo(vNetData.PlayerID, (byte)GroupType.Balcklist) != null)//黑名单拦截
|
{
|
return;
|
}
|
ChatData chatData = new ChatAreaData(vNetData.Content, (int)vNetData.PlayerID, vNetData.SrcName, vNetData.Extras);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
KeepChatInfo(chatData);
|
}
|
|
/// <summary>
|
/// 跨服聊天
|
/// </summary>
|
/// <param name="package"></param>
|
public void RevChatInfo(H0208_tagTalkCountry package)
|
{
|
if (friendModel.GetFirendInfo(package.PlayerID, (byte)GroupType.Balcklist) != null)//黑名单拦截
|
{
|
return;
|
}
|
if (!FuncOpen.Instance.IsFuncOpen(162))
|
{
|
return;
|
}
|
ChatData chatData = new ChatCrossServerData(package.Content, (int)package.PlayerID, package.Name, package.Extras);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
KeepChatInfo(chatData);
|
}
|
|
/// <summary>
|
/// 喇叭喊话
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(HA9A3_tagGCPYSpeakerContent vNetData)
|
{
|
ChatData chatData = new ChatTrumpetData(vNetData.Text, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras, vNetData.SpeakerType, vNetData.AccID);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
KeepChatInfo(chatData);
|
ServerTipDetails.ShowTrumpetTip(chatData as ChatTrumpetData);
|
}
|
/// <summary>
|
/// 家族频道
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(H0203_tagTalkBang vNetData)
|
{
|
var content = vNetData.Content;
|
if (IsAssitChat(content, true) == 1 && vNetData.PlayerID != PlayerDatas.Instance.baseData.PlayerID)
|
{
|
content = StringUtility.Contact(content, Language.Get("InviteTeam", vNetData.PlayerID));
|
}
|
ChatData chatData = new ChatFamilyData(content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
KeepChatInfo(chatData);
|
ReceiveNewChat(ChatInfoType.Fairy);
|
}
|
/// <summary>
|
/// 好友私聊
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void SetChatFreind(ChatFriend inst)
|
{
|
m_ChatFriend = inst;
|
}
|
public void RevChatInfo(H0206_tagTalkMi vNetData)
|
{
|
if (Regex.IsMatch(vNetData.Content, KILL_IDENTIFY))
|
{
|
if (vNetData.PlayerID == PlayerDatas.Instance.baseData.PlayerID)
|
{
|
return;
|
}
|
}
|
ChatFriendData chatData = new ChatFriendData(vNetData.Content, (int)vNetData.PlayerID, vNetData.SrcName, vNetData.Extras, vNetData.ToName, vNetData.TalkType, vNetData.ToPlayerID);
|
FitterChat(chatData);
|
AddPteChat(chatData, false);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
if (chatData.player == PlayerDatas.Instance.baseData.PlayerID)
|
{
|
if (OnRefreshSelf != null)
|
{
|
OnRefreshSelf(chatData);
|
}
|
}
|
if (chatData.IsSound)
|
{
|
chatCenter.CheckAutoPlayVoice(chatData);
|
}
|
}
|
private void AddPteChat(ChatFriendData chatData, bool isLocal)
|
{
|
List<ChatFriendData> list = null;
|
pteChatDics.TryGetValue(chatData.player + chatData.toPlayer, out list);
|
if (list != null)
|
{
|
if (list.Count > CHAT_INFO_CNT)
|
{
|
ChatUeseData outData = list[0];
|
list.RemoveAt(0);
|
outData = null;
|
}
|
list.Add(chatData);
|
}
|
else
|
{
|
list = new List<ChatFriendData>();
|
list.Add(chatData);
|
pteChatDics.Add(chatData.player + chatData.toPlayer, list);
|
}
|
if (OnRefreshPteChat != null && !isLocal)
|
{
|
OnRefreshPteChat(chatData);
|
}
|
}
|
/// <summary>
|
/// 队伍频道
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(H0205_tagTalkDui vNetData)
|
{
|
ChatData chatData = new ChatTeamData(vNetData.Content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
|
KeepChatInfo(chatData);
|
ReceiveNewChat(ChatInfoType.Team);
|
}
|
/// <summary>
|
/// GM
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(H3202_tagServerResponse vNetData)
|
{
|
ChatData chatData = new ChatSystemData(vNetData.Message);
|
KeepChatInfo(chatData);
|
}
|
/// <summary>
|
/// 系统提示
|
/// </summary>
|
/// <param name="msg"></param>
|
public void RevChatInfo(string msg)
|
{
|
ChatData chatData = new ChatSystemData(msg);
|
KeepChatInfo(chatData);
|
}
|
public void RevChatInfo(string msg, ArrayList infoList, ChatInfoType type = ChatInfoType.System)
|
{
|
ChatData chatData = null;
|
switch (type)
|
{
|
case ChatInfoType.System:
|
{
|
chatData = new ChatSystemData(msg);
|
chatData.infoList.AddRange(infoList);
|
}
|
break;
|
case ChatInfoType.FairyTip:
|
case ChatInfoType.FairyQuestion:
|
{
|
chatData = new ChatFamilyData(msg, 0, string.Empty, string.Empty, type);
|
chatData.infoList.AddRange(infoList);
|
}
|
break;
|
case ChatInfoType.TeamTip:
|
{
|
chatData = new ChatTeamData(msg, 0, string.Empty, string.Empty, type);
|
chatData.infoList.AddRange(infoList);
|
}
|
break;
|
}
|
if (chatData != null)
|
{
|
KeepChatInfo(chatData);
|
}
|
}
|
/// <summary>
|
/// 获取频道聊天数据
|
/// </summary>
|
/// <param name="type"></param>
|
/// <returns></returns>
|
public List<ChatData> GetChatInfo(ChatInfoType type)
|
{
|
List<ChatData> list = null;
|
chatDics.TryGetValue(type, out list);
|
return list;
|
}
|
/// <summary>
|
/// 获取好友聊天数据
|
/// </summary>
|
/// <param name="type"></param>
|
/// <returns></returns>
|
public List<ChatFriendData> GetChatInfo(int player)
|
{
|
List<ChatFriendData> list = null;
|
pteChatDics.TryGetValue(player + (int)PlayerDatas.Instance.baseData.PlayerID, out list);
|
return list;
|
}
|
/// <summary>
|
/// 获取主界面的聊天数据
|
/// </summary>
|
/// <returns></returns>
|
public List<ChatData> GetChatInfo()
|
{
|
return chatlist;
|
}
|
public List<ChatData> GetChatUpInfo()
|
{
|
return chatUpList;
|
}
|
public ChatData GetChatInfo(ChatInfoType type, int index)
|
{
|
List<ChatData> list = null;
|
chatDics.TryGetValue(type, out list);
|
if (list != null)
|
{
|
return list[index];
|
}
|
return null;
|
}
|
|
public void KeepLocalChat(ChatData chat)
|
{
|
if (chat.type == ChatInfoType.Friend)
|
{
|
FitterChat(chat);
|
AddPteChat(chat as ChatFriendData, true);
|
}
|
else
|
{
|
KeepChatInfo(chat);
|
}
|
}
|
|
private void KeepChatInfo(ChatData data)
|
{
|
KeepAllTypeChat(data);
|
List<ChatData> list = null;
|
chatDics.TryGetValue(data.type, out list);
|
if (list != null)
|
{
|
if (list.Count >= CHAT_INFO_CNT)
|
{
|
ChatData outData = list[0];
|
list.RemoveAt(0);
|
outData = null;
|
}
|
list.Add(data);
|
}
|
else
|
{
|
list = new List<ChatData>();
|
list.Add(data);
|
chatDics.Add(data.type, list);
|
}
|
if (chatFloatUpdate != null)
|
{
|
chatFloatUpdate(data);
|
}
|
if (OnRefreshChat != null)
|
OnRefreshChat(data.type);
|
if (data.type != ChatInfoType.System && (data as ChatUeseData).player == PlayerDatas.Instance.baseData.PlayerID)
|
{
|
if (OnRefreshSelf != null)
|
OnRefreshSelf(data);
|
}
|
if ((data is ChatUeseData)
|
&& (data as ChatUeseData).IsSound)
|
{
|
chatCenter.CheckAutoPlayVoice(data);
|
}
|
}
|
private void KeepAllTypeChat(ChatData data)
|
{
|
if (!FitterChat(data))
|
{
|
if (chatlist.Count >= CHAT_TIP_CNT)
|
{
|
ChatData outData = chatlist[0];
|
chatlist.RemoveAt(0);
|
}
|
if (chatUpList.Count >= CHAT_INFO_CNT)
|
{
|
ChatData outData = chatUpList[0];
|
chatUpList.RemoveAt(0);
|
}
|
chatlist.Add(data);
|
chatUpList.Add(data);
|
}
|
}
|
private bool FitterChat(ChatData data)
|
{
|
if (IsItemChat(data.content))
|
{
|
string content = data.content;
|
MatchCollection matchArray = HrefAnalysis.EquipDetailRegex.Matches(content);
|
int index = 0;
|
for (int i = 0; i < matchArray.Count; i++)
|
{
|
data.richText.Append(content.Substring(index, matchArray[i].Index - index));
|
index = matchArray[i].Index + matchArray[i].Length;
|
string detail = matchArray[i].Groups[1].Value;
|
var itemplusArray = detail.Split('|');
|
if (itemplusArray.Length > 1)
|
{
|
var itemId = int.Parse(itemplusArray[0]);
|
ItemConfig itemConfig = ItemConfig.Get(itemId);
|
if (itemConfig != null)
|
{
|
try
|
{
|
int[] equipGems = null;
|
if (itemplusArray.Length >= 8)
|
{
|
equipGems = new int[4];
|
for (int j = 0; j < equipGems.Length; j++)
|
{
|
equipGems[j] = int.Parse(itemplusArray[4 + j]);
|
}
|
}
|
|
ItemTipUtility.CustomEquipWash equipWash = new ItemTipUtility.CustomEquipWash();
|
if (itemplusArray.Length >= 15)
|
{
|
equipWash.LV = int.Parse(itemplusArray[11]);
|
equipWash.Value = new int[3];
|
equipWash.Value[0] = int.Parse(itemplusArray[12]);
|
equipWash.Value[1] = int.Parse(itemplusArray[13]);
|
equipWash.Value[2] = int.Parse(itemplusArray[14]);
|
}
|
|
List<int> suitPlaces = null;
|
if (itemplusArray.Length > 15)
|
{
|
suitPlaces = new List<int>();
|
for (int j = 0; j < 8; j++)
|
{
|
var place = int.Parse(itemplusArray[15 + j]);
|
if (place != 0)
|
{
|
suitPlaces.Add(place);
|
}
|
}
|
}
|
|
int[] suitLevels = null;
|
if (itemplusArray.Length > 15)
|
{
|
suitLevels = new int[3];
|
for (int j = 0; j < 3; j++)
|
{
|
suitLevels[j] = int.Parse(itemplusArray[23 + j]);
|
}
|
}
|
|
int[] placeStars = null;
|
if (itemplusArray.Length > 15)
|
{
|
placeStars = new int[8];
|
for (int j = 0; j < 8; j++)
|
{
|
placeStars[j] = int.Parse(itemplusArray[26 + j]);
|
}
|
}
|
|
|
ItemTipUtility.CustomItemPlus itemplus = new ItemTipUtility.CustomItemPlus()
|
{
|
ItemID = itemId,
|
count = int.Parse(itemplusArray[1]),
|
Equipped = int.Parse(itemplusArray[2]),
|
UserData = itemplusArray[3],
|
Stone = equipGems,
|
PlusLV = itemplusArray.Length >= 9 ? int.Parse(itemplusArray[8]) : 0,
|
Star = itemplusArray.Length >= 10 ? int.Parse(itemplusArray[9]) : 0,
|
EvolveLV = itemplusArray.Length >= 11 ? int.Parse(itemplusArray[10]) : 0,
|
Wash = equipWash,
|
Equips = null,
|
suitPlaces = suitPlaces == null ? null : suitPlaces.ToArray(),
|
suitLevels = suitLevels,
|
placeStars = placeStars,
|
};
|
|
string append = string.Format("<a><Word info=item id={0} itemplus={1} chatsend=1/>|showitem={0} itemplus={1}</a>",
|
itemId, LitJson.JsonMapper.ToJson(itemplus));
|
append = UIHelper.AppendColor(itemConfig.ItemColor, append);
|
data.richText.Append(append);
|
}
|
catch (Exception e)
|
{
|
data.richText.Append(itemConfig.ItemName);
|
DebugEx.Log(e.Message);
|
}
|
}
|
}
|
else
|
{
|
data.richText.Append(matchArray[i].Value);
|
}
|
}
|
data.richText.Append(content.Substring(index, content.Length - index));
|
}
|
if (data.type == ChatInfoType.Friend)
|
{
|
return true;
|
}
|
if (data.content.Equals(string.Empty))
|
{
|
return true;
|
}
|
return !chatOpenDics[data.type];
|
}
|
public Dictionary<ChatInfoType, bool> GetChatOpen()
|
{
|
return chatOpenDics;
|
}
|
|
#region 组队邀请
|
private const string INVITE_IDENTIFY = "<i>";
|
public static Regex InviteRegex = new Regex(@INVITE_IDENTIFY, RegexOptions.Singleline);
|
public void SendInvite(string msg)
|
{
|
SendChatInfo(ChatInfoType.World, StringUtility.Contact(msg, INVITE_IDENTIFY));
|
}
|
public bool IsInviteChat(string msg)
|
{
|
return InviteRegex.IsMatch(msg);
|
}
|
#endregion
|
|
#region 发送物品
|
public List<ItemModel> itemPlaceList = new List<ItemModel>();
|
public bool IsItemChat(string msg)
|
{
|
return HrefAnalysis.EquipDetailRegex.IsMatch(msg);
|
}
|
public string CheckHasItem(string msg, ChatCenter.RecentlyChat _recently)
|
{
|
if (!HrefAnalysis.EquipRegex.IsMatch(msg))
|
{
|
return msg;
|
}
|
sb.Length = 0;
|
MatchCollection matchArray = HrefAnalysis.EquipRegex.Matches(msg);
|
int index = 0;
|
for (int i = 0; i < matchArray.Count; i++)
|
{
|
sb.Append(msg.Substring(index, matchArray[i].Index - index));
|
if (chatCenter.recentlyChat != null)
|
{
|
if (i < chatCenter.recentlyChat.itemIndexs.Count)
|
{
|
var _index = chatCenter.recentlyChat.itemIndexs[i];
|
sb.Append(" ");
|
sb.Append(chatCenter.recentlyChat.itemInfos[_index]);
|
sb.Append(" ");
|
}
|
index = matchArray[i].Index + matchArray[i].Length;
|
continue;
|
}
|
var _length = sb.Length;
|
if (i < itemPlaceList.Count)
|
{
|
var itemConfig = ItemConfig.Get((int)itemPlaceList[i].itemId);
|
if (itemConfig.ItemName == matchArray[i].Groups[1].Value)
|
{
|
bool equip = itemPlaceList[i].packType == PackType.Equip;
|
|
sb.Append("#item#");
|
AppendValue(sb, itemPlaceList[i].itemId);
|
AppendValue(sb, itemPlaceList[i].count);
|
AppendValue(sb, equip ? 1 : 0);
|
AppendValue(sb, itemPlaceList[i].itemInfo.userData);
|
|
if (equip)
|
{
|
var position = new Int2(itemConfig.LV, itemConfig.EquipPlace);
|
|
int[] equipGems;
|
equipGemModel.TryGetEquipGems(itemPlaceList[i].gridIndex, out equipGems);
|
for (int j = 0; j < EquipGemModel.EQUIPGEM_HOLE_COUNT; j++)
|
{
|
AppendValue(sb, equipGems != null && j < equipGems.Length ? equipGems[j] : 0);
|
}
|
|
var strengthLevel = equipStrengthModel.GetStrengthLevel(itemConfig.LV, itemConfig.EquipPlace);
|
AppendValue(sb, strengthLevel);
|
|
var starLevel = equipStarModel.GetEquipStarLevel(new Int2(itemConfig.LV, itemConfig.EquipPlace));
|
AppendValue(sb, starLevel);
|
|
var evolveLevel = equipStrengthModel.GetStrengthEvolveLevel(position.x, position.y);
|
AppendValue(sb, evolveLevel);
|
|
AppendValue(sb, equipTrainModel.GetTrainLevel(position));
|
|
var property = equipTrainModel.GetTrainedProperties(position);
|
AppendValue(sb, property.x);
|
AppendValue(sb, property.y);
|
AppendValue(sb, property.z);
|
|
for (int place = 1; place <= 12; place++)
|
{
|
if (place > 8)
|
{
|
continue;
|
}
|
var equipGuid = equipModel.GetEquip(new Int2(position.x, place));
|
if (!string.IsNullOrEmpty(equipGuid))
|
{
|
var equipItem = packModel.GetItemByGuid(equipGuid);
|
if (equipItem.config.SuiteiD > 0)
|
{
|
AppendValue(sb, place);
|
continue;
|
}
|
}
|
AppendValue(sb, 0);
|
}
|
|
AppendValue(sb, equipModel.GetSuitLevel(itemConfig.LV, EquipSuitType.TwoSuit));
|
AppendValue(sb, equipModel.GetSuitLevel(itemConfig.LV, EquipSuitType.FiveSuit));
|
AppendValue(sb, equipModel.GetSuitLevel(itemConfig.LV, EquipSuitType.EightSuit));
|
|
for (int place = 1; place <= 8; place++)
|
{
|
var equipGuid = equipModel.GetEquip(new Int2(position.x, place));
|
if (!string.IsNullOrEmpty(equipGuid))
|
{
|
var equipItem = packModel.GetItemByGuid(equipGuid);
|
if (ItemLogicUtility.Instance.IsSuitEquip(equipItem.itemId))
|
{
|
AppendValue(sb, equipStarModel.GetStarLevel(new Int2(position.x, place)));
|
}
|
else
|
{
|
AppendValue(sb, -1);
|
}
|
}
|
else
|
{
|
AppendValue(sb, -1);
|
}
|
}
|
}
|
|
sb.Remove(sb.Length - 1, 1);
|
sb.Append("#item#");
|
|
if (_recently != null)
|
{
|
_recently.Add(itemConfig.ItemName, sb.ToString().Substring(_length));
|
}
|
}
|
else
|
{
|
sb.Append(matchArray[i].Value);
|
}
|
}
|
else
|
{
|
sb.Append(matchArray[i].Value);
|
}
|
index = matchArray[i].Index + matchArray[i].Length;
|
}
|
sb.Append(msg.Substring(index, msg.Length - index));
|
return sb.ToString();
|
}
|
|
void AppendValue(StringBuilder sb, object _object)
|
{
|
sb.Append(_object);
|
sb.Append('|');
|
}
|
#endregion
|
|
#region 好友私聊
|
public static Regex KillRegex = new Regex(@KILL_IDENTIFY, RegexOptions.Singleline);
|
public const string KILL_IDENTIFY = "<k>";
|
public void SendFriendChat(string msg, int player)
|
{
|
C0209_tagCTalkMiFix chatPack = new C0209_tagCTalkMiFix();
|
chatPack.TalkType = 1;
|
chatPack.PlayerID = (uint)player;
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
#endregion
|
/// <summary>
|
/// 清屏
|
/// </summary>
|
public void ClearAllChatInfo()
|
{
|
chatDics.Clear();
|
chatlist.Clear();
|
chatUpList.Clear();
|
pteChatDics.Clear();
|
if (OnRefreshChat != null)
|
{
|
OnRefreshChat(presentChatType);
|
}
|
}
|
|
public void ClearChatInfo(ChatInfoType type)
|
{
|
List<ChatData> list = null;
|
if (chatDics.TryGetValue(type, out list))
|
{
|
list.Clear();
|
if (OnRefreshChat != null)
|
{
|
OnRefreshChat(type);
|
}
|
}
|
}
|
|
public static int GetUTF8InfoLen(string msg)
|
{
|
return Encoding.UTF8.GetBytes(msg).Length;
|
}
|
|
public void CloseChatBtnClick()
|
{
|
if (OnClickCloseChatEvent != null)
|
{
|
OnClickCloseChatEvent();
|
}
|
}
|
|
public bool IsExtentOpen { get; set; }
|
public void OpenChatExtent(bool open)
|
{
|
if (OnChatExtentOpenEvent != null)
|
{
|
OnChatExtentOpenEvent(open);
|
}
|
}
|
|
#region 陌生人聊天
|
public event Action OpenPteChatEvent;
|
public void OpenFriendWin()
|
{
|
if (OpenPteChatEvent != null)
|
{
|
OpenPteChatEvent();
|
}
|
}
|
#endregion
|
|
#region 主界面聊天频道显示设置
|
public void SetChatChannelShow(ChatInfoType type, bool open)
|
{
|
if (chatOpenDics.ContainsKey(type))
|
{
|
chatOpenDics[type] = open;
|
}
|
}
|
|
public void GetChatChannelShow()
|
{
|
chatOpenDics[ChatInfoType.World] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelWorld);
|
chatOpenDics[ChatInfoType.Area] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelArea);
|
chatOpenDics[ChatInfoType.Fairy] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelGrad);
|
chatOpenDics[ChatInfoType.Invite] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelATeam);
|
chatOpenDics[ChatInfoType.System] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelSystem);
|
chatOpenDics[ChatInfoType.Team] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelTeam);
|
chatOpenDics[ChatInfoType.Trumpet] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelBugle);
|
chatOpenDics[ChatInfoType.CrossServer] = true;
|
}
|
#endregion
|
|
#region 日常跳转
|
private string[] realmRandomChats = new string[2] { "DailyQuestRealmTalk1", "DailyQuestRealmTalk2" };
|
private string[] dungeonRandomChats = new string[2] { "DailyQuestAssitmTalk1", "DailyQuestAssitmTalk2" };
|
public bool openFromDaily { get; set; }
|
public string GetAssitRandomChat(ChatInfoType _type)
|
{
|
int _index = UnityEngine.Random.Range(0, 2);
|
switch (_type)
|
{
|
case ChatInfoType.World:
|
if (_index == 0)
|
{
|
return Language.Get(dungeonRandomChats[0]);
|
}
|
else
|
{
|
return Language.Get(dungeonRandomChats[1], PlayerDatas.Instance.baseData.FightPoint);
|
}
|
case ChatInfoType.Fairy:
|
return Language.Get(realmRandomChats[_index]);
|
}
|
return string.Empty;
|
}
|
|
public bool openFromFairyTask { get; set; }
|
Dictionary<int, List<string>> m_TaskRandomChats = new Dictionary<int, List<string>>();
|
public string GetTaskRandomChat(ChatInfoType _type)
|
{
|
if (m_TaskRandomChats.ContainsKey((int)_type))
|
{
|
var list = m_TaskRandomChats[(int)_type];
|
var index = UnityEngine.Random.Range(0, list.Count);
|
return Language.Get(list[index]);
|
}
|
return string.Empty;
|
}
|
|
public bool needCheckAssitChat { get; set; }
|
public int IsAssitChat(string message, bool force = false)
|
{
|
int assitChat = 0;
|
if (needCheckAssitChat || force)
|
{
|
for (int i = 0; i < 2; i++)
|
{
|
if (message.Equals(Language.Get(realmRandomChats[i])))
|
{
|
assitChat = 1;
|
break;
|
}
|
if (message.Equals(Language.Get(dungeonRandomChats[i])))
|
{
|
assitChat = 2;
|
break;
|
}
|
}
|
}
|
return assitChat;
|
}
|
#endregion
|
|
#region 宝石炫耀跳转
|
public bool openFromGem { get; set; }
|
public int flauntGemId { get; set; }
|
public bool flauntGemBind { get; set; }
|
public string GetGemFlauntChat()
|
{
|
var config = ItemConfig.Get(flauntGemId);
|
if (config != null)
|
{
|
var itemInfo = new ItemInfo();
|
itemInfo.itemId = flauntGemId;
|
var item = new ItemModel(PackType.Item, itemInfo);
|
var tip = string.Format("[{0}]", config.ItemName);
|
itemPlaceList.Add(item);
|
return Language.Get("GemLookTalk", tip);
|
}
|
return string.Empty;
|
}
|
#endregion
|
|
#region 仙缘红点
|
Dictionary<ChatInfoType, Redpoint> chatSocialRedpoints = new Dictionary<ChatInfoType, Redpoint>();
|
Dictionary<ChatInfoType, int> unReadChatCounts = new Dictionary<ChatInfoType, int>();
|
public void InitChatRedpoints()
|
{
|
chatSocialRedpoints.Add(ChatInfoType.Fairy, new Redpoint(MainRedDot.RedPoint_FriendChatKey, 2502));
|
chatSocialRedpoints.Add(ChatInfoType.Team, new Redpoint(MainRedDot.RedPoint_FriendChatKey, 2503));
|
unReadChatCounts.Add(ChatInfoType.Fairy, 0);
|
unReadChatCounts.Add(ChatInfoType.Team, 0);
|
}
|
|
public void ViewChat(ChatInfoType type)
|
{
|
if (unReadChatCounts.ContainsKey(type))
|
{
|
unReadChatCounts[type] = 0;
|
UpdateRedpoint(type);
|
}
|
}
|
|
void ReceiveNewChat(ChatInfoType type)
|
{
|
switch (type)
|
{
|
case ChatInfoType.Team:
|
if (!WindowCenter.Instance.IsOpen<TeamChatWin>()
|
&& (!WindowCenter.Instance.IsOpen<ChatWin>() || presentChatType != ChatInfoType.Team))
|
{
|
unReadChatCounts[ChatInfoType.Team] = Mathf.Min(unReadChatCounts[ChatInfoType.Team] + 1, 99);
|
}
|
break;
|
case ChatInfoType.Fairy:
|
if (!WindowCenter.Instance.IsOpen<FairyChatWin>()
|
&& (!WindowCenter.Instance.IsOpen<ChatWin>() || presentChatType != ChatInfoType.Fairy))
|
{
|
unReadChatCounts[ChatInfoType.Fairy] = Mathf.Min(unReadChatCounts[ChatInfoType.Fairy] + 1, 99);
|
}
|
break;
|
}
|
UpdateRedpoint(type);
|
}
|
|
public void UpdateRedpoint(ChatInfoType type)
|
{
|
if (chatSocialRedpoints.ContainsKey(type))
|
{
|
var redpoint = chatSocialRedpoints[type];
|
if (unReadChatCounts[type] > 0)
|
{
|
redpoint.state = RedPointState.Quantity;
|
redpoint.count = unReadChatCounts[type];
|
}
|
else
|
{
|
redpoint.state = RedPointState.None;
|
}
|
}
|
var socialRed = MainRedDot.Instance.redPointFriendChat;
|
if (chatSocialRedpoints[ChatInfoType.Fairy].state == RedPointState.Quantity
|
|| chatSocialRedpoints[ChatInfoType.Team].state == RedPointState.Quantity)
|
{
|
socialRed.count = unReadChatCounts[ChatInfoType.Fairy] > 0 ?
|
unReadChatCounts[ChatInfoType.Fairy] : unReadChatCounts[ChatInfoType.Team];
|
}
|
else
|
{
|
socialRed.count = 0;
|
}
|
}
|
|
public RedPointState GetSocialChatRedpoint(ChatInfoType type)
|
{
|
if (chatSocialRedpoints.ContainsKey(type))
|
{
|
return chatSocialRedpoints[type].state;
|
}
|
return RedPointState.None;
|
}
|
#endregion
|
}
|
public struct ChatExtraData
|
{
|
public int infoint1;
|
public ChatExtraData(int info1)
|
{
|
this.infoint1 = info1;
|
}
|
|
public static ChatExtraData Default {
|
get {
|
return new ChatExtraData(0);
|
}
|
}
|
}
|
|
public enum ChatInfoType
|
{
|
System,//系统消息
|
World, //世界频道
|
Area, //区域频道
|
Team, //队伍
|
Invite,//组队
|
Trumpet,//喇叭
|
Fairy,//仙盟
|
Friend,//私聊
|
CrossServer,//跨服
|
FairyQuestion,
|
FairyTip,
|
TeamTip,
|
}
|