using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
using System;
using System.Text.RegularExpressions;
using vnxbqy.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();
///
/// 聊天信息
///
private bool _lockUpdate = true;
public bool lockUpdate {
get {
return _lockUpdate;
}
set {
_lockUpdate = value;
if (ChatFriend != null && ChatFriend.IsOpen)
{
ChatFriend.OnSetLock();
}
}
}
private Dictionary> chatDics = new Dictionary>();
private Dictionary chatOpenDics = new Dictionary();
public List chatDisplayList = new List();
#region 私聊
private Dictionary> pteChatDics = new Dictionary>();
public event Action OnPteChatChangeEvent;
public event Action 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 chatlist = new List();
private List chatUpList = new List();
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 OnChatExtentOpenEvent;
public event Action chatFloatUpdate;
TeamModel teamModel {
get {
return ModelCenter.Instance.GetModel();
}
}
ChatCenter m_ChatCenter;
ChatCenter chatCenter {
get {
return m_ChatCenter ?? (m_ChatCenter = ModelCenter.Instance.GetModel());
}
}
FriendsModel friendModel {
get { return ModelCenter.Instance.GetModel(); }
}
EquipGemModel equipGemModel { get { return ModelCenter.Instance.GetModel(); } }
EquipStrengthModel equipStrengthModel { get { return ModelCenter.Instance.GetModel(); } }
EquipStarModel equipStarModel { get { return ModelCenter.Instance.GetModel(); } }
EquipTrainModel equipTrainModel { get { return ModelCenter.Instance.GetModel(); } }
EquipModel equipModel { get { return ModelCenter.Instance.GetModel(); } }
PackModel packModel { get { return ModelCenter.Instance.GetModel(); } }
DungeonAssistModel dungeonAssistModel { get { return ModelCenter.Instance.GetModel(); } }
public Dictionary> achievementRandoms = new Dictionary>();
List assistThankLanguages = new List();
Int2 assistThankLevelLimit = new Int2(150, 200);
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);
chatOpenDics.Add(ChatInfoType.default1, 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(ConfigParse.GetMultipleStr(_cfg.Numerical1)));
achievementRandoms.Add(ChatInfoType.Fairy, new List(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(LitJson.JsonMapper.ToObject(json[key].ToJson())));
}
assistThankLanguages.AddRange(ConfigParse.GetMultipleStr(_cfg.Numerical4));
if (!string.IsNullOrEmpty(_cfg.Numerical5))
{
var levelArray = ConfigParse.GetMultipleStr(_cfg.Numerical5);
assistThankLevelLimit = new Int2(levelArray[0], levelArray[1]);
}
}
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;
case ChatInfoType.default1:
channelName = Language.Get("ChatType_default1");
break;
default:
return;
}
OperationLogCollect.Instance.ChatReport(content, channelName, chatType == ChatInfoType.Friend ? toPlayer : string.Empty, chatType);
}
catch (Exception e)
{
DebugEx.Log(e.StackTrace + e.Message);
}
}
public void SendChatInfo(ChatInfoType type, string msg, ChatExtraData? info = null , bool isDirtyWord = true, bool isChatInfoCount = true)
{
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))
{
if (isDirtyWord)
{
isDirty = DirtyWordConfig.IsDirtWord(msg);
if (isDirty)
msg = DirtyWordConfig.IsDirtWord(msg, '*');
}
var length = GetChatMessageLength(msg);
if (isChatInfoCount)
{
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;
case ChatInfoType.default1:
{
if (PlayerDatas.Instance.baseData.faction == 0)
{
SysNotifyMgr.Instance.ShowTip("FactionChatLimit");
return;
}
CA216_tagCMPyTalk _pak = new CA216_tagCMPyTalk();
_pak.TalkType = 100;
_pak.Len = (ushort)GetUTF8InfoLen(msg);
_pak.Content = msg;
if (CrossServerUtility.IsCrossServer())
{
GameNetSystem.Instance.SendToCrossServer(_pak);
}
else
{
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;
}
///
/// 世界频道
///
///
public void RevChatInfo(H0201_tagTalkGong vNetData, uint time = 0)
{
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("", vNetData.Name, "", ":", content);
}
else
{
content = StringUtility.Contact("", vNetData.Name, "", ":", content, string.Format("{0}|invite={1}", 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);
if (time != 0)
{
chatData.createTime = TimeUtility.GetTime(time);
}
LocalChatHistory.Save(chatData as ChatUeseData);
KeepChatInfo(chatData);
}
///
/// 区域频道
///
///
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);
}
// 阵营频道
public void RevChatInfo(HA707_tagMCPyTalk vNetData)
{
if (friendModel.GetFirendInfo(vNetData.PlayerID, (byte)GroupType.Balcklist) != null)//黑名单拦截
{
return;
}
ChatData chatData = new ChatFactionData(vNetData.Content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
LocalChatHistory.Save(chatData as ChatUeseData);
KeepChatInfo(chatData);
}
///
/// 跨服聊天
///
///
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);
}
///
/// 喇叭喊话
///
///
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);
}
///
/// 家族频道
///
///
public void RevChatInfo(H0203_tagTalkBang vNetData, uint time = 0)
{
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);
if (time != 0)
{
chatData.createTime = TimeUtility.GetTime(time);
}
LocalChatHistory.Save(chatData as ChatUeseData);
KeepChatInfo(chatData);
ReceiveNewChat(ChatInfoType.Fairy);
}
///
/// 后端缓存
///
///
public void RevChatInfo(HB311_tagGCTalkCache package)
{
for (int i = 0; i < package.Count; i++)
{
var data = package.InfoList[i];
if (data.ChannelType == 1)
{
RevChatInfo(new H0201_tagTalkGong()
{
socketType = package.socketType,
Content = data.Content,
Extras = data.Extras,
ExtraValue = 0,
Name = data.Name,
NameLen = data.NameLen,
Len = data.Len,
PlayerID = data.PlayerID,
}, data.Time);
}
else if (data.ChannelType == 2)
{
RevChatInfo(new H0203_tagTalkBang()
{
socketType = package.socketType,
Content = data.Content,
Extras = data.Extras,
ExtraValue = 0,
Len = data.Len,
Name = data.Name,
NameLen = data.NameLen,
PlayerID = data.PlayerID,
});
}
}
}
///
/// 好友私聊
///
///
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 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();
list.Add(chatData);
pteChatDics.Add(chatData.player + chatData.toPlayer, list);
}
if (OnRefreshPteChat != null && !isLocal)
{
OnRefreshPteChat(chatData);
}
}
///
/// 队伍频道
///
///
public void RevChatInfo(H0205_tagTalkDui vNetData)
{
ChatData chatData = new ChatTeamData(vNetData.Content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
KeepChatInfo(chatData);
ReceiveNewChat(ChatInfoType.Team);
}
///
/// GM
///
///
public void RevChatInfo(H3202_tagServerResponse vNetData)
{
ChatData chatData = new ChatSystemData(vNetData.Message);
KeepChatInfo(chatData);
}
///
/// 系统提示
///
///
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;
case ChatInfoType.default1:
case ChatInfoType.default2:
{
chatData = new ChatFactionData(msg, 0, string.Empty, string.Empty, type);
chatData.infoList.AddRange(infoList);
}
break;
}
if (chatData != null)
{
KeepChatInfo(chatData);
}
}
///
/// 获取频道聊天数据
///
///
///
public List GetChatInfo(ChatInfoType type)
{
List list = null;
chatDics.TryGetValue(type, out list);
return list;
}
///
/// 获取好友聊天数据
///
///
///
public List GetChatInfo(int player)
{
List list = null;
pteChatDics.TryGetValue(player + (int)PlayerDatas.Instance.baseData.PlayerID, out list);
return list;
}
///
/// 获取主界面的聊天数据
///
///
public List GetChatInfo()
{
return chatlist;
}
public List GetChatUpInfo()
{
return chatUpList;
}
public ChatData GetChatInfo(ChatInfoType type, int index)
{
List 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 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();
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 suitPlaces = null;
if (itemplusArray.Length > 15)
{
suitPlaces = new List();
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("|showitem={0} itemplus={1}",
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 GetChatOpen()
{
return chatOpenDics;
}
#region 组队邀请
private const string INVITE_IDENTIFY = "";
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 itemPlaceList = new List();
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 = "";
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
///
/// 清屏
///
public void ClearAllChatInfo()
{
chatDics.Clear();
chatlist.Clear();
chatUpList.Clear();
pteChatDics.Clear();
if (OnRefreshChat != null)
{
OnRefreshChat(presentChatType);
}
}
public void ClearChatInfo(ChatInfoType type)
{
List 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;
chatOpenDics[ChatInfoType.default1] = 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> m_TaskRandomChats = new Dictionary>();
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 chatSocialRedpoints = new Dictionary();
Dictionary unReadChatCounts = new Dictionary();
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()
&& (!WindowCenter.Instance.IsOpen() || presentChatType != ChatInfoType.Team))
{
unReadChatCounts[ChatInfoType.Team] = Mathf.Min(unReadChatCounts[ChatInfoType.Team] + 1, 99);
}
break;
case ChatInfoType.Fairy:
if (!WindowCenter.Instance.IsOpen()
&& (!WindowCenter.Instance.IsOpen() || 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
#region 协助感谢
public void SendThank2AssistPlayer(int playerId)
{
if (PlayerDatas.Instance.baseData.LV >= assistThankLevelLimit.x)
{
return;
}
var assistPlayerInfo = dungeonAssistModel.GetAssistPlayerInfo(playerId);
if (assistPlayerInfo != null)
{
if (assistPlayerInfo.LV >= assistThankLevelLimit.y)
{
return;
}
}
var languageKeyIndex = UnityEngine.Random.Range(0, assistThankLanguages.Count);
if (assistThankLanguages.Count > 0)
{
SendFriendChat(Language.Get(assistThankLanguages[languageKeyIndex]), playerId);
}
}
#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,
//后续IL开发添加预设
default1, //阵营(在跨服地图往跨服发)
default2, //阵营信息提示
default3,
default4,
default5,
default6,
default7,
default8,
default9,
default10,
}