| using System; | 
| using System.Collections; | 
| using System.Collections.Generic; | 
| using System.Text.RegularExpressions; | 
|   | 
| using UnityEngine; | 
| using UnityEngine.UI; | 
| using Cysharp.Threading.Tasks; | 
|   | 
|   | 
| public class SysNotifyMgr : SingletonMonobehaviour<SysNotifyMgr> | 
|   | 
| { | 
|     /// <summary> | 
|     /// 服务端下发的数据 | 
|     /// </summary> | 
|     private H0212_tagNotifyCode.tagNotifyStr[] sysNotifyMsg; | 
|   | 
|     private ArrayList tipInfoList = new ArrayList(); | 
|   | 
|     private Dictionary<string, Func<string, ArrayList, bool>> notifyConditionDict = new Dictionary<string, Func<string, ArrayList, bool>>(); | 
|   | 
|     public event Action<string, ArrayList> sysNotifyEvent; | 
|   | 
|     public event Action<string> OnSystemNotifyEvent; | 
|     /// <summary> | 
|     /// UserData去空格处理 | 
|     /// </summary> | 
|     public static Regex s_UserDataSpaceRegex = new Regex(@"'([0-9]+)':[ ]+\[(.*?)\]", RegexOptions.Singleline); | 
|   | 
|     private void Awake() | 
|     { | 
|         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitializeEvent; | 
|         // StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish; | 
|         Co_Instance().Forget(); | 
|     } | 
|   | 
|     private async UniTask Co_Instance() | 
|     { | 
|         await UniTask.Yield(); | 
|         //TODO YYL | 
|         // var instance = BattleHint.Instance; | 
|     } | 
|   | 
|     private void LateUpdate() | 
|     { | 
| #if UNITY_EDITOR | 
|         if (Input.GetKeyDown(KeyCode.F3)) | 
|         { | 
|             ServerTipDetails.OpenGMPanel(); | 
|         } | 
| #endif | 
|     } | 
|   | 
|     protected override void OnDestroy() | 
|     { | 
|         base.OnDestroy(); | 
|         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerDataInitializeEvent; | 
|         // StageLoad.Instance.onStageLoadFinish -= OnStageLoadFinish; | 
|     } | 
|   | 
|     private void OnStageLoadFinish() | 
|     { | 
|         ServerTipDetails.OnStageLoadFinish(); | 
|         // TODO YYL | 
|         // BattleHint.Instance.OnStageLoadFinish(); | 
|     } | 
|   | 
|     private void BeforePlayerDataInitializeEvent() | 
|     { | 
|         ScrollTip.m_Hints.Clear(); | 
|         ServerTipDetails.ClearHint(); | 
|     } | 
|   | 
|     public void ReceiveNotifyCode(H0212_tagNotifyCode vNetData) | 
|     { | 
|         if (vNetData != null) | 
|         { | 
|             sysNotifyMsg = vNetData.Pars; | 
|   | 
|             tipInfoList.Clear(); | 
|             for (int i = 0; i < sysNotifyMsg.Length; i++) | 
|             { | 
|                 if (sysNotifyMsg[i].Len != 0) | 
|                 { | 
|                     var _msg = sysNotifyMsg[i].Msg; | 
|                     _msg = _msg.Replace(" ", string.Empty); | 
|                     tipInfoList.Add(_msg); | 
|                 } | 
|                 else | 
|                 { | 
|                     tipInfoList.Add(sysNotifyMsg[i].MsgInt); | 
|                 } | 
|             } | 
|   | 
|             if (sysNotifyEvent != null) | 
|             { | 
|                 sysNotifyEvent(vNetData.Msg, tipInfoList); | 
|             } | 
|   | 
|             GetSysMsg(vNetData.Msg); | 
|         } | 
|     } | 
|   | 
|     void GetSysMsg(string key) | 
|     { | 
|         ///根据key从系统信息表取到消息类型 | 
|         SysInfoConfig cfg = SysInfoConfig.Get(key); | 
|         if (cfg == null) | 
|         { | 
| #if UNITY_EDITOR | 
|             string hint = Language.Get("L1093", key); | 
|             ScrollTip.ShowTip(hint); | 
|             ChatManager.Instance.RevChatInfo(hint); | 
| #endif | 
|         } | 
|         else | 
|         { | 
|             if (!string.IsNullOrEmpty(cfg.richText)) | 
|             { | 
|                 if (notifyConditionDict.ContainsKey(cfg.key)) | 
|                 { | 
|                     try | 
|                     { | 
|                         if (!notifyConditionDict[cfg.key](cfg.key, tipInfoList)) | 
|                         { | 
|                             return; | 
|                         } | 
|                     } | 
|                     catch (Exception e) | 
|                     { | 
|                         Debug.Log(e.StackTrace); | 
|                     } | 
|                 } | 
|                 AnalysisSysmsg(cfg); | 
|             } | 
|             if (OnSystemNotifyEvent != null) | 
|             { | 
|                 OnSystemNotifyEvent(cfg.key); | 
|             } | 
|         } | 
|     } | 
|   | 
|     public void RegisterCondition(string key, Func<string, ArrayList, bool> condition) | 
|     { | 
|         if (!notifyConditionDict.ContainsKey(key)) | 
|         { | 
|             notifyConditionDict.Add(key, condition); | 
|         } | 
|     } | 
|   | 
|     public void ShowTip(string key, params object[] msg) | 
|     { | 
|         SysInfoConfig cfg = SysInfoConfig.Get(key); | 
|         if (cfg != null) | 
|         { | 
|             tipInfoList.Clear(); | 
|             tipInfoList.AddRange(msg); | 
|             AnalysisSysmsg(cfg); | 
|         } | 
|         else | 
|         {  | 
|             Debug.LogError("未找到系统提示信息: " + key); | 
|         } | 
|     } | 
|   | 
|     void AnalysisSysmsg(SysInfoConfig cfg) | 
|     { | 
|         SysNotifySound(cfg.sound); | 
|         SysNotifyFx(cfg.effect); | 
|         SysNotifyRichText(cfg.type, cfg.richText, cfg.order); | 
|     } | 
|   | 
|     void SysNotifySound(string msg) | 
|     { | 
|         //DesignDebug.Log("音效信息" + msg); | 
|     } | 
|   | 
|     void SysNotifyFx(string msg) | 
|     { | 
|         //DesignDebug.Log("特效信息" + msg); | 
|     } | 
|   | 
|     void SysNotifyRichText(int[] type, string msg, int order = 0) | 
|     { | 
|         if (type == null || type.Length == 0) | 
|         { | 
|             return; | 
|         } | 
|         for (int i = 0; i < type.Length; i++) | 
|         { | 
|             switch ((SysNotifyType)type[i]) | 
|             { | 
|                 case SysNotifyType.SysFixedTip: | 
|                 case SysNotifyType.SysFixedTip1: | 
|                 case SysNotifyType.SysScrollTip: | 
|                 case SysNotifyType.SysIntervalFixedTip: | 
|                 case SysNotifyType.SysMarqueeTip: | 
|                 case SysNotifyType.SysRealmTip: | 
|                     // TODO YYL | 
|                     // if (!PreFightMission.Instance.IsFinished()) | 
|                     // { | 
|                     //     continue; | 
|                     // } | 
|                     break; | 
|             } | 
|             switch ((SysNotifyType)type[i]) | 
|             { | 
|                 case SysNotifyType.SysFixedTip: | 
|                     ServerTipDetails.DisplayNormalTip(msg, tipInfoList); | 
|                     break; | 
|                 case SysNotifyType.SysChatWin: | 
|                     ServerTipDetails.DisplayChatTip(msg, tipInfoList); | 
|                     break; | 
|                 case SysNotifyType.SysFixedTip1: | 
|                 case SysNotifyType.SysScrollTip: | 
|                     ScrollTip.ShowTip(msg, tipInfoList, order); | 
|                     break; | 
|                 case SysNotifyType.SysIntervalFixedTip: | 
|                     ServerTipDetails.ShowServerTip(msg, tipInfoList, order); | 
|                     break; | 
|                 case SysNotifyType.SysMarqueeTip: | 
|                     ServerTipDetails.ShowMarquee(msg, tipInfoList,order); | 
|                     break; | 
|   | 
|                 case SysNotifyType.SysChanelTip: | 
|                     ChatManager.Instance.RevChatInfo(msg, tipInfoList); | 
|                     break; | 
|                 case SysNotifyType.SysFairyQuestionTip: | 
|                     ChatManager.Instance.RevChatInfo(msg, tipInfoList, ChatInfoType.FairyQuestion); | 
|                     break; | 
|                 case SysNotifyType.SysFairyTip: | 
|                     ChatManager.Instance.RevChatInfo(msg, tipInfoList, ChatInfoType.FairyTip); | 
|                     break; | 
|                 case SysNotifyType.SysTeamTip: | 
|                     ChatManager.Instance.RevChatInfo(msg, tipInfoList, ChatInfoType.TeamTip); | 
|                     break; | 
|                 case SysNotifyType.SysRealmTip: | 
|                     if (OnSysTipEvent != null) | 
|                     { | 
|                         OnSysTipEvent(type[i], msg, tipInfoList); | 
|                     } | 
|                     break; | 
|   | 
|                 //  TODO YYL     | 
|                 // case SysNotifyType.SysEvenKill: | 
|                 //     BattleHint.Instance.ReceiveEvenKill(msg, tipInfoList); | 
|                 //     break; | 
|                 case SysNotifyType.SysFactionTip: | 
|                     ChatManager.Instance.RevChatInfo(msg, tipInfoList, ChatInfoType.default2); | 
|                     break; | 
|   | 
|             } | 
|         } | 
|   | 
|     } | 
|   | 
|     #region 事件 | 
|     public static event Action<int, string, ArrayList> OnSysTipEvent; | 
|     #endregion | 
|   | 
|     public enum SysNotifyType | 
|     { | 
|         SysFixedTip = 1,//固定提示 | 
|         SysScrollTip = 2,//滚动提示 | 
|         SysIntervalFixedTip = 4,//全服固定消息提示 | 
|         SysMarqueeTip = 5,//跑马灯 | 
|         SysChatWin = 6, //聊天位置的提示 | 
|         SysEvenKill = 7,//上古战场连杀提示 | 
|         SysFixedTip1 = 11,//固定提示2 | 
|         SysChanelTip = 20,//系统频道显示 | 
|         SysFairyQuestionTip = 31,//仙盟频道问答提示 | 
|         SysFairyTip = 32,//仙盟频道信息提示 | 
|         SysTeamTip = 41,//队伍频道提示 | 
|         SysFactionTip = 51, //阵营频道提示 | 
|         SysRealmTip = 100,//境界提示 | 
|   | 
|         //后续IL开发添加预设 | 
|         default1 = 200, | 
|         default2, | 
|         default3, | 
|         default4, | 
|         default5, | 
|         default6, | 
|         default7, | 
|         default8, | 
|         default9, | 
|         default10, | 
|     } | 
|   | 
|     public int Compare(SystemHintData x, SystemHintData y) | 
|     { | 
|         if (x.order.CompareTo(y.order) != 0) | 
|         { | 
|             return -x.order.CompareTo(y.order); | 
|         } | 
|         return x.appendTime.CompareTo(y.appendTime); | 
|     } | 
| } | 
|   | 
| public class SystemHintData | 
| { | 
|     public DateTime appendTime; | 
|     public string message; | 
|     public ArrayList extentionData; | 
|     public int order; | 
| } |