From 0019ec8507d0aeedebbeb7ac5fc66caee97d5c0d Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期一, 26 五月 2025 15:55:03 +0800
Subject: [PATCH] 18 子 2D卡牌客户端搭建 / 2D卡牌客户端搭建 必备窗口更新&常用组件移植

---
 Main/Component/UI/Decorate/Tweens/ScaleTween.cs     |    6 
 Main/Component/UI/Common/LanguageReplace.cs         |    3 
 Main/Component/UI/Decorate/Tweens/Tween.cs          |    3 
 Main/System/Chat/ChatData.cs.meta                   |   11 
 Main/System/Tip.meta                                |    2 
 Main/Component/UI/Common/CanvasRaycastFilter.cs     |    3 
 Main/UI/Decorate.meta                               |    2 
 Main/Component/UI/Common/FunctionButton.cs          |    3 
 Main/Component/UI/Common/SmoothSlider.cs            |    4 
 Main/Component/UI/Common/FuncEnable.cs              |    3 
 Main/Component/UI/Common/SmoothMask.cs              |    3 
 Main/Component/UI/Manager/UIEventTrigger.cs         |    1 
 Main/Component/UI/Common/PopupMessage.cs            |    6 
 Main/System/Chat/ChatData.cs                        |  226 ++++++++
 Main/System/Tip/ServerTipDetails.cs.meta            |   11 
 Main/Component/UI/Common/ButtonClickInterval.cs     |    3 
 Main/Component/UI/Common/LongPressButton.cs         |    6 
 Main/System/Message/SysNotifyMgr.cs                 |  312 +++++++++++
 Main/Component/UI/Common/FunctionButtonGroup.cs     |    3 
 Main/Component/UI/Common/OnOffToggle.cs             |    9 
 Main/Component/UI/Common/AutoSelectCyclicScroll.cs  |    5 
 Main/Component/UI/Common/CoolDownBehaviour.cs       |    3 
 Main/Component/UI/Common/DragItem.cs                |    4 
 Main/System/Redpoint/RedpointBehaviour.cs           |    3 
 Main/Component/UI/Common/AutoSelectScrollItem.cs    |    3 
 Main/Component/UI/Common/DragContainer.cs           |    2 
 Main/Component/UI/Decorate/Tweens/PositionTween.cs  |    5 
 Main/System/Chat.meta                               |    2 
 Main/System/Message/MessageWin.cs.meta              |    3 
 Main/System/Tip/MarqueeWin.cs                       |  134 ++++
 Main/Component/UI/Common/FrameEffect.cs             |    3 
 Main/System/Message/WaitCallBack.cs                 |    3 
 Main/System/Redpoint/Redpoint.cs                    |    4 
 Main/Component/UI/Common/InputSpecialWordLimit.cs   |    3 
 Main/System/Message/SysNotifyMgr.cs.meta            |   11 
 Main/Component/UI/Common/DynamicCyclicScroll.cs     |    3 
 Main/Component/UI/Common/NestingScrollRect.cs       |    4 
 Main/Component/UI/Common/GameObjectDefaultActive.cs |    2 
 Main/Component/UI/Common/PopupMessageContainer.cs   |    5 
 Main/System/Redpoint/RedpointCenter.cs              |    4 
 /dev/null                                           |    8 
 Main/Component/UI/Common/MultipleSmoothSlider.cs    |    6 
 Main/System/Message/MessageWin.cs                   |  557 ++++++++++---------
 Main/System/Tip/ServerTipDetails.cs                 |  255 +++++++++
 Main/System/Tip/MarqueeWin.cs.meta                  |   11 
 Main/Component/UI/Effect/UIEffect.cs                |    1 
 46 files changed, 1,267 insertions(+), 397 deletions(-)

diff --git a/Main/Component/UI/Common/AutoSelectCyclicScroll.cs b/Main/Component/UI/Common/AutoSelectCyclicScroll.cs
index d985f3e..a81bdc6 100644
--- a/Main/Component/UI/Common/AutoSelectCyclicScroll.cs
+++ b/Main/Component/UI/Common/AutoSelectCyclicScroll.cs
@@ -7,8 +7,6 @@
 using UnityEngine.UI;
 using UnityEngine.EventSystems;
 
-namespace vnxbqy.UI
-{
 
     public class AutoSelectCyclicScroll : CyclicScroll
     {
@@ -51,8 +49,5 @@
 
 
     }
-
-}
-
 
 
diff --git a/Main/Component/UI/Common/AutoSelectScrollItem.cs b/Main/Component/UI/Common/AutoSelectScrollItem.cs
index 9ff0ae1..949f298 100644
--- a/Main/Component/UI/Common/AutoSelectScrollItem.cs
+++ b/Main/Component/UI/Common/AutoSelectScrollItem.cs
@@ -4,13 +4,10 @@
 using UnityEngine.UI;
 using System;
 
-namespace vnxbqy.UI
-{
     public class AutoSelectScrollItem : ScrollItem
     {
         public AutoSelectCyclicScroll autoSelectScroll { get; set; }
         public RectTransform centerSign { get; set; }
 
     }
-}
 
diff --git a/Main/Component/UI/Common/ButtonClickInterval.cs b/Main/Component/UI/Common/ButtonClickInterval.cs
index f8ca274..f4eb65a 100644
--- a/Main/Component/UI/Common/ButtonClickInterval.cs
+++ b/Main/Component/UI/Common/ButtonClickInterval.cs
@@ -3,8 +3,6 @@
 using UnityEngine.UI;
 using System.Collections;
 
-namespace vnxbqy.UI
-{
     
     public class ButtonClickInterval : MonoBehaviour
     {
@@ -28,4 +26,3 @@
             targetBtn.enabled = true;
         }
     }
-}
diff --git a/Main/Component/UI/Common/CanvasRaycastFilter.cs b/Main/Component/UI/Common/CanvasRaycastFilter.cs
index 8e5a66c..ba8f254 100644
--- a/Main/Component/UI/Common/CanvasRaycastFilter.cs
+++ b/Main/Component/UI/Common/CanvasRaycastFilter.cs
@@ -6,8 +6,6 @@
 using System.Collections;
 using UnityEngine.UI;
 
-namespace vnxbqy.UI
-{
 
     public class CanvasRaycastFilter : MonoBehaviour, ICanvasRaycastFilter
     {
@@ -22,7 +20,6 @@
 
     }
 
-}
 
 
 
diff --git a/Main/Component/UI/Common/CoolDownBehaviour.cs b/Main/Component/UI/Common/CoolDownBehaviour.cs
index 0b858d0..c3d1a44 100644
--- a/Main/Component/UI/Common/CoolDownBehaviour.cs
+++ b/Main/Component/UI/Common/CoolDownBehaviour.cs
@@ -6,8 +6,6 @@
 using System.Collections;
 using UnityEngine.UI;
 
-namespace vnxbqy.UI
-{
 
     public class CoolDownBehaviour : MonoBehaviour
     {
@@ -83,7 +81,6 @@
 
     }
 
-}
 
 
 
diff --git a/Main/Component/UI/Common/DragContainer.cs b/Main/Component/UI/Common/DragContainer.cs
index 94da996..a75be3c 100644
--- a/Main/Component/UI/Common/DragContainer.cs
+++ b/Main/Component/UI/Common/DragContainer.cs
@@ -5,7 +5,6 @@
 using UnityEngine;
 using System.Collections;
 
-namespace vnxbqy.UI {
 
     public class DragContainer:MonoBehaviour {
 
@@ -13,7 +12,6 @@
 
     }
 
-}
 
 
 
diff --git a/Main/Component/UI/Common/DragItem.cs b/Main/Component/UI/Common/DragItem.cs
index 0e6f8da..1746546 100644
--- a/Main/Component/UI/Common/DragItem.cs
+++ b/Main/Component/UI/Common/DragItem.cs
@@ -7,8 +7,6 @@
 using UnityEngine.EventSystems;
 using System;
 
-namespace vnxbqy.UI {
-
     public class DragItem:MonoBehaviour,ICanvasRaycastFilter,IBeginDragHandler,IDragHandler,IEndDragHandler {
 
         [SerializeField]
@@ -55,8 +53,6 @@
             return raycastTarget;
         }
     }
-
-}
 
 
 
diff --git a/Main/Component/UI/Common/DynamicCyclicScroll.cs b/Main/Component/UI/Common/DynamicCyclicScroll.cs
index 5e63227..83681db 100644
--- a/Main/Component/UI/Common/DynamicCyclicScroll.cs
+++ b/Main/Component/UI/Common/DynamicCyclicScroll.cs
@@ -7,8 +7,6 @@
 using UnityEngine.UI;
 using System.Collections.Generic;
 
-namespace vnxbqy.UI
-{
 
     public class DynamicCyclicScroll : CyclicScroll
     {
@@ -38,7 +36,6 @@
 
     }
 
-}
 
 
 
diff --git a/Main/Component/UI/Common/FrameEffect.cs b/Main/Component/UI/Common/FrameEffect.cs
index 88563e3..8572c88 100644
--- a/Main/Component/UI/Common/FrameEffect.cs
+++ b/Main/Component/UI/Common/FrameEffect.cs
@@ -7,8 +7,6 @@
 using UnityEngine.UI;
 using System;
 
-namespace vnxbqy.UI
-{
 
     public class FrameEffect : MonoBehaviour
     {
@@ -92,7 +90,6 @@
 
     }
 
-}
 
 
 
diff --git a/Main/Component/UI/Common/FuncEnable.cs b/Main/Component/UI/Common/FuncEnable.cs
index 1f46340..f5e3877 100644
--- a/Main/Component/UI/Common/FuncEnable.cs
+++ b/Main/Component/UI/Common/FuncEnable.cs
@@ -3,8 +3,6 @@
 using System.Collections.Generic;
 
 using UnityEngine;
-namespace vnxbqy.UI
-{
     public class FuncEnable : MonoBehaviour
     {
         [SerializeField] int funcOpenKey;
@@ -39,5 +37,4 @@
             gameObject.SetActive(true);
         }
     }
-}
 
diff --git a/Main/Component/UI/Common/FunctionButton.cs b/Main/Component/UI/Common/FunctionButton.cs
index 73a3f74..b348232 100644
--- a/Main/Component/UI/Common/FunctionButton.cs
+++ b/Main/Component/UI/Common/FunctionButton.cs
@@ -10,8 +10,6 @@
 
 using System;
 
-namespace vnxbqy.UI
-{
 
     
     public class FunctionButton : Button
@@ -256,7 +254,6 @@
 
     }
 
-}
 
 
 
diff --git a/Main/Component/UI/Common/FunctionButtonGroup.cs b/Main/Component/UI/Common/FunctionButtonGroup.cs
index 4fe1177..1bd65c7 100644
--- a/Main/Component/UI/Common/FunctionButtonGroup.cs
+++ b/Main/Component/UI/Common/FunctionButtonGroup.cs
@@ -8,8 +8,6 @@
 using UnityEngine.UI;
 using UnityEngine.Events;
 
-namespace vnxbqy.UI
-{
 
     public class FunctionButtonGroup : MonoBehaviour
     {
@@ -263,7 +261,6 @@
         }
     }
 
-}
 
 
 
diff --git a/Main/Component/UI/Common/GameObjectDefaultActive.cs b/Main/Component/UI/Common/GameObjectDefaultActive.cs
index 8dd9e8e..46aa723 100644
--- a/Main/Component/UI/Common/GameObjectDefaultActive.cs
+++ b/Main/Component/UI/Common/GameObjectDefaultActive.cs
@@ -5,7 +5,6 @@
 using UnityEngine;
 using System.Collections;
 
-namespace vnxbqy.UI {
     public class GameObjectDefaultActive:MonoBehaviour {
 
         [SerializeField]
@@ -21,7 +20,6 @@
 
     }
 
-}
 
 
 
diff --git a/Main/Component/UI/Common/InputSpecialWordLimit.cs b/Main/Component/UI/Common/InputSpecialWordLimit.cs
index 815479f..46b515b 100644
--- a/Main/Component/UI/Common/InputSpecialWordLimit.cs
+++ b/Main/Component/UI/Common/InputSpecialWordLimit.cs
@@ -4,8 +4,6 @@
 using System.Globalization;
 using UnityEngine;
 using UnityEngine.UI;
-namespace vnxbqy.UI
-{
     [RequireComponent(typeof(InputField))]
     public class InputSpecialWordLimit : MonoBehaviour
     {
@@ -39,6 +37,5 @@
             return addedChar;
         }
     }
-}
 
 
diff --git a/Main/Component/UI/Common/LanguageReplace.cs b/Main/Component/UI/Common/LanguageReplace.cs
index 2a8a2ca..a52dfba 100644
--- a/Main/Component/UI/Common/LanguageReplace.cs
+++ b/Main/Component/UI/Common/LanguageReplace.cs
@@ -3,8 +3,6 @@
 using UnityEngine;
 using UnityEngine.UI;
 using System;
-namespace vnxbqy.UI
-{
     //璁剧疆鏂囨湰锛屾潵婧愯鍙朖.杩涘叆娓告垙鍓嶇殑鎻愮ず.xlsx
     public class LanguageReplace : MonoBehaviour
     {
@@ -20,4 +18,3 @@
         }
 
     }
-}
diff --git a/Main/Component/UI/Common/LongPressButton.cs b/Main/Component/UI/Common/LongPressButton.cs
index a4d85a4..b84d4ce 100644
--- a/Main/Component/UI/Common/LongPressButton.cs
+++ b/Main/Component/UI/Common/LongPressButton.cs
@@ -6,8 +6,6 @@
 using UnityEngine.Serialization;
 using UnityEngine.UI;
 
-namespace vnxbqy.UI
-{
     public class LongPressButton : ButtonEx
     {
         public class ButtonPressEvent : UnityEvent { }
@@ -97,6 +95,4 @@
             m_LongPress = false;
             m_IsButtonDown = false;
         }
-    }
-}
-
+    }
\ No newline at end of file
diff --git a/Main/Component/UI/Common/MultipleSmoothSlider.cs b/Main/Component/UI/Common/MultipleSmoothSlider.cs
index 5dc7eb8..a4b6f57 100644
--- a/Main/Component/UI/Common/MultipleSmoothSlider.cs
+++ b/Main/Component/UI/Common/MultipleSmoothSlider.cs
@@ -3,8 +3,6 @@
 using UnityEngine.UI;
 using System;
 
-namespace vnxbqy.UI
-{
 
     [DisallowMultipleComponent]
     public class MultipleSmoothSlider : MonoBehaviour
@@ -90,6 +88,4 @@
             value = m_Value;
         }
 
-    }
-}
-
+    }
\ No newline at end of file
diff --git a/Main/Component/UI/Common/NestingScrollRect.cs b/Main/Component/UI/Common/NestingScrollRect.cs
index 75f5137..1cab040 100644
--- a/Main/Component/UI/Common/NestingScrollRect.cs
+++ b/Main/Component/UI/Common/NestingScrollRect.cs
@@ -3,8 +3,6 @@
 using UnityEngine;
 using UnityEngine.EventSystems;
 using UnityEngine.UI;
-namespace vnxbqy.UI
-{
     [RequireComponent(typeof(ScrollRect))]
     public class NestingScrollRect : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
     {
@@ -54,5 +52,3 @@
             scrollRect.OnEndDrag(eventData);
         }
     }
-}
-
diff --git a/Main/Component/UI/Common/OnOffToggle.cs b/Main/Component/UI/Common/OnOffToggle.cs
index d9060d1..2835b04 100644
--- a/Main/Component/UI/Common/OnOffToggle.cs
+++ b/Main/Component/UI/Common/OnOffToggle.cs
@@ -7,8 +7,6 @@
 using UnityEngine.UI;
 using UnityEngine.Events;
 
-namespace vnxbqy.UI
-{
 
     public class OnOffToggle : MonoBehaviour
     {
@@ -55,9 +53,4 @@
             m_OnShow.SetActive(_isOn);
             m_OffShow.SetActive(!_isOn);
         }
-    }
-
-}
-
-
-
+    }
\ No newline at end of file
diff --git a/Main/Component/UI/Common/PopupMessage.cs b/Main/Component/UI/Common/PopupMessage.cs
index 8860128..170592b 100644
--- a/Main/Component/UI/Common/PopupMessage.cs
+++ b/Main/Component/UI/Common/PopupMessage.cs
@@ -6,7 +6,6 @@
 using System.Collections;
 using UnityEngine.UI;
 
-namespace vnxbqy.UI {
 
     public class PopupMessage:MonoBehaviour {
 
@@ -50,9 +49,4 @@
 
 
     }
-
-
-}
-
-
 
diff --git a/Main/Component/UI/Common/PopupMessageContainer.cs b/Main/Component/UI/Common/PopupMessageContainer.cs
index cad23f1..d2bb252 100644
--- a/Main/Component/UI/Common/PopupMessageContainer.cs
+++ b/Main/Component/UI/Common/PopupMessageContainer.cs
@@ -6,8 +6,6 @@
 using System.Collections;
 using System.Collections.Generic;
 
-namespace vnxbqy.UI {
-
     [RequireComponent(typeof(RectTransform))]
     public class PopupMessageContainer:MonoBehaviour {
 
@@ -75,8 +73,5 @@
 
 
     }
-
-}
-
 
 
diff --git a/Main/Component/UI/Common/SmoothMask.cs b/Main/Component/UI/Common/SmoothMask.cs
index 3907fcf..14d04c5 100644
--- a/Main/Component/UI/Common/SmoothMask.cs
+++ b/Main/Component/UI/Common/SmoothMask.cs
@@ -96,6 +96,9 @@
     }
 
     private void UpdateChildMaterialSmoothMask() {
+        if (null == canvasScaler)
+            return;
+
         var scaleX = canvasScaler.transform.localScale.x;
         var scaleY = canvasScaler.transform.localScale.y;
 
diff --git a/Main/Component/UI/Common/SmoothSlider.cs b/Main/Component/UI/Common/SmoothSlider.cs
index 95c2f29..043f5a3 100644
--- a/Main/Component/UI/Common/SmoothSlider.cs
+++ b/Main/Component/UI/Common/SmoothSlider.cs
@@ -3,8 +3,6 @@
 using UnityEngine;
 using UnityEngine.UI;
 
-namespace vnxbqy.UI
-{
 
     [DisallowMultipleComponent]
     
@@ -68,5 +66,3 @@
         }
 
     }
-
-}
diff --git a/Main/Component/UI/Decorate/Tweens/PositionTween.cs b/Main/Component/UI/Decorate/Tweens/PositionTween.cs
index 20c9db1..811eff9 100644
--- a/Main/Component/UI/Decorate/Tweens/PositionTween.cs
+++ b/Main/Component/UI/Decorate/Tweens/PositionTween.cs
@@ -1,8 +1,6 @@
 锘縰sing UnityEngine;
 using System.Collections;
 
-namespace vnxbqy.UI
-{
     public class PositionTween : Tween
     {
 
@@ -44,5 +42,4 @@
             this.rectTransform.anchoredPosition = CalculateVector3();
         }
 
-    }
-}
+    }
\ No newline at end of file
diff --git a/Main/Component/UI/Decorate/Tweens/ScaleTween.cs b/Main/Component/UI/Decorate/Tweens/ScaleTween.cs
index 257050d..a03c80d 100644
--- a/Main/Component/UI/Decorate/Tweens/ScaleTween.cs
+++ b/Main/Component/UI/Decorate/Tweens/ScaleTween.cs
@@ -1,8 +1,6 @@
 锘縰sing UnityEngine;
 using System.Collections;
 
-namespace vnxbqy.UI
-{
     public class ScaleTween : Tween
     {
         public override void SetStartState()
@@ -35,6 +33,4 @@
             this.transform.localScale = CalculateVector3();
         }
 
-    }
-
-}
\ No newline at end of file
+    }
\ No newline at end of file
diff --git a/Main/Component/UI/Decorate/Tweens/Tween.cs b/Main/Component/UI/Decorate/Tweens/Tween.cs
index edfe4db..8b18ab9 100644
--- a/Main/Component/UI/Decorate/Tweens/Tween.cs
+++ b/Main/Component/UI/Decorate/Tweens/Tween.cs
@@ -2,8 +2,6 @@
 using System.Collections;
 using System;
 
-namespace vnxbqy.UI
-{
     [RequireComponent(typeof(RectTransform))]
     public class Tween : MonoBehaviour
     {
@@ -232,5 +230,4 @@
             PingPongOnce,
         }
     }
-}
 
diff --git a/Main/Component/UI/Effect/UIEffect.cs b/Main/Component/UI/Effect/UIEffect.cs
index 624af85..b074a1a 100644
--- a/Main/Component/UI/Effect/UIEffect.cs
+++ b/Main/Component/UI/Effect/UIEffect.cs
@@ -10,7 +10,6 @@
 using UnityEditor;
 #endif
 
-using CJ.Wait;
 
 
 public class UIEffect : MonoBehaviour
diff --git a/Main/Component/UI/Manager/UIEventTrigger.cs b/Main/Component/UI/Manager/UIEventTrigger.cs
index 446f056..e9abe30 100644
--- a/Main/Component/UI/Manager/UIEventTrigger.cs
+++ b/Main/Component/UI/Manager/UIEventTrigger.cs
@@ -3,7 +3,6 @@
 using UnityEngine;
 using UnityEngine.EventSystems;
 using System;
-using CJ.Wait;
 
 public class UIEventTrigger : EventTrigger {
     public delegate void ObjectDelegate(GameObject go,PointerEventData eventData);
diff --git a/Main/UI/Launch.meta b/Main/System/Chat.meta
similarity index 76%
copy from Main/UI/Launch.meta
copy to Main/System/Chat.meta
index f4af743..dd22f00 100644
--- a/Main/UI/Launch.meta
+++ b/Main/System/Chat.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 91e90d274ca17e84aab980cb88d23de7
+guid: 75379fcf96e9da74a849e8fc132ff30f
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Main/System/Chat/ChatData.cs b/Main/System/Chat/ChatData.cs
new file mode 100644
index 0000000..ffe5a31
--- /dev/null
+++ b/Main/System/Chat/ChatData.cs
@@ -0,0 +1,226 @@
+锘縰sing System.Text;
+using System.Collections;
+using vnxbqy.UI;
+using System;
+
+public class ChatData
+{
+    // public ChatData(string content)
+    // {
+    //     _content = content;
+    //     if (ChatCenter.s_VoiceRegex.IsMatch(_content))
+    //     {
+    //         _content = ChatCenter.s_VoiceRegex.Replace(_content, string.Empty);
+    //     }
+    //     richText = new StringBuilder();
+    //     richText.Length = 0;
+    //     createTime = DateTime.Now;
+    // }
+
+    private string _content = string.Empty;
+
+    public string content
+    {
+        get
+        {
+            if (richText.Length > 0)
+            {
+                return richText.ToString();
+            }
+            return _content;
+        }
+        protected set
+        {
+            _content = value;
+        }
+    }
+
+    // public ChatInfoType type { get; protected set; }
+
+    // public DateTime createTime { get; set; }
+
+    // private ChatInfoType m_DetailType = ChatInfoType.World;
+    // public ChatInfoType detailType
+    // {
+    //     get
+    //     {
+    //         return m_DetailType;
+    //     }
+    //     set
+    //     {
+    //         m_DetailType = value;
+    //     }
+    // }
+
+    public StringBuilder richText;
+
+    public ArrayList infoList = new ArrayList();
+}
+
+public class ChatUeseData : ChatData
+{
+    public ChatUeseData()
+    {
+
+    }
+
+    public ChatUeseData(string _content, int player, string name, string extra)// : base(_content)
+    {
+        this.player = player;
+        this.name = name;
+        extra = UIHelper.ServerStringTrim(extra);
+        this.extra = extra;
+        this.job = 1;
+        IsSound = false;
+        var extraLength = extra.Length;
+        if (extraLength > 1)
+        {
+            vipLv = int.Parse(extra.Substring(0, 2));
+        }
+        if (extraLength > 2)
+        {
+            isGm = byte.Parse(extra.Substring(2, 1)) == 1;
+        }
+        if (extraLength > 3)
+        {
+            job = byte.Parse(extra.Substring(3, 1));
+        }
+        if (extraLength > 4)
+        {
+            bubbleId = int.Parse(extra.Substring(4, extraLength > 5 ? 2 : 1));
+        }
+        if (extraLength > 12)
+        {
+            serverGroupId = int.Parse(extra.Substring(6, 7));
+        }
+        if (extraLength > 16)
+        {
+            level = int.Parse(extra.Substring(13, 4));
+        }
+        // if (ChatCenter.s_VoiceRegex.IsMatch(_content))
+        // {
+        //     var _match = ChatCenter.s_VoiceRegex.Match(_content);
+        //     soundTick = long.Parse(_match.Groups[1].Value);
+        //     soundLength = byte.Parse(_match.Groups[2].Value)/10.0f;
+        //     IsSound = true;
+        // }
+
+        string[] parts = extra.Split('|');
+        face = (parts.Length > 4 && int.TryParse(parts[4], out var result1)) ? result1 : 0;
+        facePic = (parts.Length > 5 && int.TryParse(parts[5], out var result2)) ? result2 : 0;
+    }
+    public int player { get; protected set; }
+    public string name { get; protected set; }
+    public string extra { get; protected set; }
+    public int vipLv { get; protected set; }
+    public bool isGm { get; protected set; }
+    public int job { get; protected set; }
+    public int bubbleId { get; protected set; }
+    public long soundTick { get; private set; }
+    public bool IsSound { get; private set; }
+    public float soundLength { get; private set; }
+    public int serverGroupId { get; private set; }
+    public int level { get; private set; }
+    public int face { get; private set; }
+    public int facePic { get; private set; }
+}
+
+public class ChatSystemData : ChatData
+{
+    // public ChatSystemData(string content) : base(content)
+    // {
+    //     type = ChatInfoType.System;
+    // }
+}
+
+
+// 鍠囧彮鏆傛椂涓嶈浜�
+// public class ChatTrumpetData : ChatUeseData
+// {
+//     public ChatTrumpetData(string content, int player, string name, string extra, byte speakType, string accId) : base(content, player, name, extra)
+//     {
+//         this.speakType = speakType;
+//         this.accId = accId;
+//         // type = ChatInfoType.Trumpet;
+//     }
+
+//     public byte speakType { get; protected set; }
+
+//     public string accId { get; protected set; }
+// }
+
+public class ChatWorldData : ChatUeseData
+{
+    // public ChatWorldData(string content, int player, string name, string extra) : base(content, player, name, extra)
+    // {
+    //     type = ChatInfoType.World;
+    // }
+}
+
+public class ChatAreaData : ChatUeseData
+{
+    // public ChatAreaData(string content, int player, string name, string extra) : base(content, player, name, extra)
+    // {
+    //     type = ChatInfoType.Area;
+    // }
+}
+
+public class ChatCrossServerData : ChatUeseData
+{
+    // public ChatCrossServerData(string content, int player, string name, string extra) : base(content, player, name, extra)
+    // {
+    //     type = ChatInfoType.CrossServer;
+    // }
+}
+
+public class ChatFactionData : ChatUeseData
+{
+    // public ChatFactionData(string content, int player, string name, string extra, ChatInfoType detailType = ChatInfoType.default1) : base(content, player, name, extra)
+    // {
+    //     type = ChatInfoType.default1;
+    //     this.detailType = detailType;
+    // }
+}
+
+public class ChatTeamData : ChatUeseData
+{
+    // public ChatTeamData(string content, int player, string name, string extra, ChatInfoType detailType = ChatInfoType.Team) : base(content, player, name, extra)
+    // {
+    //     type = ChatInfoType.Team;
+    //     this.detailType = detailType;
+    // }
+}
+
+public class ChatFamilyData : ChatUeseData
+{
+    // public ChatFamilyData(string content, int player, string name, string extra, ChatInfoType detailType = ChatInfoType.Fairy) : base(content, player, name, extra)
+    // {
+    //     type = ChatInfoType.Fairy;
+    //     this.detailType = detailType;
+    // }
+}
+
+public class ChatInviteData : ChatUeseData
+{
+    // public ChatInviteData(string content, int player, string name, string extra) : base(content, player, name, extra)
+    // {
+    //     type = ChatInfoType.Invite;
+    // }
+}
+
+public class ChatFriendData : ChatUeseData
+{
+    // public ChatFriendData(string content, int player, string name, string extra, string toName, byte talkType, uint toPlayer) : base(content, player, name, extra)
+    // {
+    //     type = ChatInfoType.Friend;
+    //     this.toName = toName;
+    //     this.talkType = talkType;
+    //     this.toPlayer = (int)toPlayer;
+    // }
+
+    public string toName { get; protected set; }
+
+    public byte talkType { get; protected set; }
+
+    public int toPlayer { get; protected set; }
+}
\ No newline at end of file
diff --git a/Main/System/Chat/ChatData.cs.meta b/Main/System/Chat/ChatData.cs.meta
new file mode 100644
index 0000000..ce30f07
--- /dev/null
+++ b/Main/System/Chat/ChatData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e982ff8b244efbc40b4832c2ed2df164
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Message/MessageWin.cs b/Main/System/Message/MessageWin.cs
index 7eae546..7f6bb80 100644
--- a/Main/System/Message/MessageWin.cs
+++ b/Main/System/Message/MessageWin.cs
@@ -1,302 +1,313 @@
-锘�// using System.Collections;
-// using System.Collections.Generic;
-// using UnityEngine;
-// using UnityEngine.UI;
-// using CJ.Wait;
-// using System;
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine.UI;
+using DG.Tweening;
+using Cysharp.Threading.Tasks;
 
-// using System.Text.RegularExpressions;
-// using DG.Tweening;
-// namespace vnxbqy.UI
-// {
-    
-//     public class MessageWin : Window
-//     {
-//         [SerializeField] RectTransform m_ContainerNormalHint;
-//         [SerializeField] RichText m_NormalHint;
-//         [SerializeField] RectTransform m_ContainerChatHint;
-//         [SerializeField] RichText m_NormalChatHint; //鏄剧ず鍦ㄨ亰澶╃晫闈㈢殑浣嶇疆
+using System;
 
-//         [SerializeField] RectTransform m_ContainerServerTip;
-//         [SerializeField] ScaleTween m_ServerTipScaleTween;
-//         [SerializeField] PositionTween m_ServerTipPositionTween;
-//         [SerializeField] RichText m_ServerTip;
-//         [SerializeField, Header("鍏ㄦ湇骞挎挱鍋滅暀鏃堕棿")] float m_ServerTipKeepTime = 1.5f;
+using System.Text.RegularExpressions;
+using DG.Tweening;
 
-//         [SerializeField] RectTransform m_ContainerGM;
-//         [SerializeField] Text m_GmRichText;
-//         [SerializeField] ScrollerController m_ScrollControl;
-//         [SerializeField] Toggle m_AutoPopToggle;
-//         [SerializeField] Toggle m_AutoRefreshToggle;
-//         [SerializeField] Button m_GMClose;
+public class MessageWin : UIBase
+{
+	[SerializeField] RectTransform m_ContainerNormalHint;
+    [SerializeField] RichText m_NormalHint;
+    [SerializeField] RectTransform m_ContainerChatHint;
+    [SerializeField] RichText m_NormalChatHint; //鏄剧ず鍦ㄨ亰澶╃晫闈㈢殑浣嶇疆
 
-//         bool m_ServerTipPrepared = true;
+    [SerializeField] RectTransform m_ContainerServerTip;
+    [SerializeField] ScaleTween m_ServerTipScaleTween;
+    [SerializeField] PositionTween m_ServerTipPositionTween;
+    [SerializeField] RichText m_ServerTip;
+    [SerializeField, Header("鍏ㄦ湇骞挎挱鍋滅暀鏃堕棿")] float m_ServerTipKeepTime = 1.5f;
 
-//         protected override void BindController()
-//         {
-//         }
+    [SerializeField] RectTransform m_ContainerGM;
+    [SerializeField] Text m_GmRichText;
+    [SerializeField] ScrollerController m_ScrollControl;
+    [SerializeField] Toggle m_AutoPopToggle;
+    [SerializeField] Toggle m_AutoRefreshToggle;
+    [SerializeField] Button m_GMClose;
 
-//         protected override void AddListeners()
-//         {
-//             m_ContainerNormalHint.OnWaitCompelete(OnHintDisplayComplete);
-//             m_ContainerChatHint.OnWaitCompelete(OnHintDisplayComplete);
-//             m_ScrollControl.OnRefreshCell += OnRefreshGmCell;
-//             m_ScrollControl.OnGetDynamicSize += OnGetDynamicSize;
-//             m_ScrollControl.lockType = EnhanceLockType.LockVerticalBottom;
-//             m_GMClose.onClick.AddListener(OnGMClose);
-//         }
+    bool m_ServerTipPrepared = true;
 
-//         protected override void OnPreOpen()
-//         {
-//             m_ServerTipPrepared = true;
+    // 鐢熷懡鍛ㄦ湡
+    protected override void Awake()
+    {
+        base.Awake();
+    }
 
-// #if UNITY_EDITOR
-//             m_ContainerGM.SetActive(VersionConfig.Get().debugVersion);
-// #else
-//             m_ContainerGM.SetActive(false);
-// #endif
-//             ServerTipDetails.normalHintRefresh += CheckNormalHint;
-//             ServerTipDetails.serverHintRefresh += CheckServerHint;
-//             ServerTipDetails.gmMessageRefresh += DisplayGM;
-//             ServerTipDetails.gmOpenEvent += GmOpenEvent;
-//             ServerTipDetails.chatHintRefresh += CheckChatHint;
-//             CheckNormalHint();
-//             CheckChatHint();
-//             CheckServerHint();
-//             DisplayGM(string.Empty);
+    protected override void Start()
+    {
+        base.Start();
+        // 鍒濆鍖栨暟鎹�
+    }
 
-//             if (ServerTipDetails.requireOpenGM)
-//             {
-//                 if (hasOnFrom)
-//                 {
-//                     OnGMOpen();
-//                 }
-//                 ServerTipDetails.requireOpenGM = false;
-//             }
-//         }
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        // 鍒濆鍖栫粍浠�
+        m_ContainerNormalHint.OnWaitCompelete(OnHintDisplayComplete);
+        m_ContainerChatHint.OnWaitCompelete(OnHintDisplayComplete);
+        m_ScrollControl.OnRefreshCell += OnRefreshGmCell;
+        m_ScrollControl.OnGetDynamicSize += OnGetDynamicSize;
+        m_ScrollControl.lockType = EnhanceLockType.LockVerticalBottom;
+        m_GMClose.onClick.AddListener(OnGMClose);
+    }
 
-//         protected override void OnAfterOpen()
-//         {
-//         }
+    protected override void OnPreOpen()
+    {
+        // 瀛愮被鍙互閲嶅啓姝ゆ柟娉曡繘琛岄澶栫殑棰勬墦寮�鎿嶄綔
+        base.OnPreOpen();
+        m_ServerTipPrepared = true;
 
-//         protected override void OnPreClose()
-//         {
-//             ServerTipDetails.normalHintRefresh -= CheckNormalHint;
-//             ServerTipDetails.serverHintRefresh -= CheckServerHint;
-//             ServerTipDetails.gmMessageRefresh -= DisplayGM;
-//             ServerTipDetails.gmOpenEvent -= GmOpenEvent;
-//             ServerTipDetails.chatHintRefresh -= CheckChatHint;
-//         }
+#if UNITY_EDITOR
+        m_ContainerGM.SetActive(VersionConfig.Get().debugVersion);
+#else
+        m_ContainerGM.SetActive(false);
+#endif
+        ServerTipDetails.normalHintRefresh += CheckNormalHint;
+        ServerTipDetails.serverHintRefresh += CheckServerHint;
+        ServerTipDetails.gmMessageRefresh += DisplayGM;
+        ServerTipDetails.gmOpenEvent += GmOpenEvent;
+        ServerTipDetails.chatHintRefresh += CheckChatHint;
+        CheckNormalHint();
+        CheckChatHint();
+        CheckServerHint();
+        DisplayGM(string.Empty);
 
-//         protected override void OnAfterClose()
-//         {
-//         }
+        if (ServerTipDetails.requireOpenGM)
+        {
+            if (hasOnFrom)
+            {
+                OnGMOpen();
+            }
+            ServerTipDetails.requireOpenGM = false;
+        }
+    }
 
-//         private void GmOpenEvent()
-//         {
-//             if (ServerTipDetails.requireOpenGM)
-//             {
-//                 OnGMOpen();
-//                 ServerTipDetails.requireOpenGM = false;
-//             }
-//         }
+    // UI浜嬩欢
+    protected override void OnOpen()
+    {
+        base.OnOpen();
+        // 绐楀彛鎵撳紑鏃剁殑閫昏緫
+    }
 
-//         void CheckNormalHint()
-//         {
-//             var hint = ServerTipDetails.RequireNormalHint();
-//             if (hint != null)
-//             {
-//                 DisplayNormalHint(hint);
-//             }
-//         }
+    protected override void OnClose()
+    {
+        base.OnClose();
+        ServerTipDetails.normalHintRefresh -= CheckNormalHint;
+        ServerTipDetails.serverHintRefresh -= CheckServerHint;
+        ServerTipDetails.gmMessageRefresh -= DisplayGM;
+        ServerTipDetails.gmOpenEvent -= GmOpenEvent;
+        ServerTipDetails.chatHintRefresh -= CheckChatHint;
+        // 绐楀彛鍏抽棴鏃剁殑閫昏緫
+        
+    }
 
-//         void DisplayNormalHint(SystemHintData hint)
-//         {
-//             transform.SetAsLastSibling();
-//             m_NormalHint.SetExtenalData(hint.extentionData);
-//             m_NormalHint.text = hint.message;
-//             if (!m_ContainerNormalHint.gameObject.activeInHierarchy)
-//             {
-//                 m_ContainerNormalHint.SetActive(true);
-//             }
-//             m_ContainerNormalHint.DoWaitRestart();
-//         }
+    private void GmOpenEvent()
+    {
+        if (ServerTipDetails.requireOpenGM)
+        {
+            OnGMOpen();
+            ServerTipDetails.requireOpenGM = false;
+        }
+    }
 
-//         private void OnHintDisplayComplete(Component com)
-//         {
-//             com.DoWaitStop();
-//             com.SetActive(false);
-//         }
+    private void OnDisable()
+    {
+        m_ContainerNormalHint.SetActive(false);
+        m_ContainerChatHint.SetActive(false);
+        DisableServerTip();
+        StopAllCoroutines();
+    }
 
-//         void CheckServerHint()
-//         {
-//             if (!m_ServerTipPrepared)
-//             {
-//                 return;
-//             }
-//             var hint = ServerTipDetails.RequireServerTip();
-//             if (hint != null && gameObject.activeInHierarchy)
-//             {
-//                 DisplayServerHint(hint);
-//             }
-//             else
-//             {
-//                 DisableServerTip();
-//             }
-//         }
+    void CheckNormalHint()
+    {
+        var hint = ServerTipDetails.RequireNormalHint();
+        if (hint != null)
+        {
+            DisplayNormalHint(hint);
+        }
+    }
 
-//         public void DisplayServerHint(SystemHintData hint)
-//         {
-//             transform.SetAsLastSibling();
-//             m_ServerTipPrepared = false;
-//             if (!m_ServerTipScaleTween.gameObject.activeSelf)
-//             {
-//                 m_ServerTipScaleTween.SetActive(true);
-//             }
-//             m_ServerTipScaleTween.SetStartState();
-//             m_ServerTipPositionTween.SetStartState();
-//             m_ContainerServerTip.SetActive(true);
-//             m_ServerTip.SetExtenalData(hint.extentionData);
-//             m_ServerTip.text = hint.message;
-//             m_ServerTipScaleTween.Play();
-//             TimeMgr.Instance.Register(m_ServerTip, ServerTipStartHide, m_ServerTipKeepTime + m_ServerTipScaleTween.duration);
-//         }
+    void DisplayNormalHint(SystemHintData hint)
+    {
+        transform.SetAsLastSibling();
+        m_NormalHint.SetExtenalData(hint.extentionData);
+        m_NormalHint.text = hint.message;
+        if (!m_ContainerNormalHint.gameObject.activeInHierarchy)
+        {
+            m_ContainerNormalHint.SetActive(true);
+        }
+        m_ContainerNormalHint.DoWaitRestart();
+    }
 
-//         private void ServerTipStartHide(Component comp)
-//         {
-//             m_ServerTipPositionTween.Play();
-//             TimeMgr.Instance.Register(m_ServerTipPositionTween, ServerTipTweenComplete, m_ServerTipPositionTween.duration);
-//         }
+    private void OnHintDisplayComplete(Component com)
+    {
+        com.DoWaitStop();
+        com.SetActive(false);
+    }
 
-//         private void ServerTipTweenComplete(Component comp)
-//         {
-//             m_ServerTipPrepared = true;
-//             DisableServerTip();
-//             CheckServerHint();
-//         }
+    void CheckServerHint()
+    {
+        if (!m_ServerTipPrepared)
+        {
+            return;
+        }
+        var hint = ServerTipDetails.RequireServerTip();
+        if (hint != null && gameObject.activeInHierarchy)
+        {
+            DisplayServerHint(hint);
+        }
+        else
+        {
+            DisableServerTip();
+        }
+    }
 
-//         private void DisableServerTip()
-//         {
-//             TimeMgr.Instance.UnRegister(m_ServerTip);
-//             TimeMgr.Instance.UnRegister(m_ServerTipPositionTween);
-//             m_ContainerServerTip.SetActive(false);
-//             m_ServerTipScaleTween.Stop();
-//             m_ServerTipPositionTween.Stop();
-//             m_ServerTipScaleTween.SetStartState();
-//             m_ServerTipPositionTween.SetStartState();
-//         }
+    public void DisplayServerHint(SystemHintData hint)
+    {
+        transform.SetAsLastSibling();
+        m_ServerTipPrepared = false;
+        if (!m_ServerTipScaleTween.gameObject.activeSelf)
+        {
+            m_ServerTipScaleTween.SetActive(true);
+        }
+        m_ServerTipScaleTween.SetStartState();
+        m_ServerTipPositionTween.SetStartState();
+        m_ContainerServerTip.SetActive(true);
+        m_ServerTip.SetExtenalData(hint.extentionData);
+        m_ServerTip.text = hint.message;
+        m_ServerTipScaleTween.Play();
+        TimeMgr.Instance.Register(m_ServerTip, ServerTipStartHide, m_ServerTipKeepTime + m_ServerTipScaleTween.duration);
+    }
+
+    private void ServerTipStartHide(Component comp)
+    {
+        m_ServerTipPositionTween.Play();
+        TimeMgr.Instance.Register(m_ServerTipPositionTween, ServerTipTweenComplete, m_ServerTipPositionTween.duration);
+    }
+
+    private void ServerTipTweenComplete(Component comp)
+    {
+        m_ServerTipPrepared = true;
+        DisableServerTip();
+        CheckServerHint();
+    }
+
+    private void DisableServerTip()
+    {
+        TimeMgr.Instance.UnRegister(m_ServerTip);
+        TimeMgr.Instance.UnRegister(m_ServerTipPositionTween);
+        m_ContainerServerTip.SetActive(false);
+        m_ServerTipScaleTween.Stop();
+        m_ServerTipPositionTween.Stop();
+        m_ServerTipScaleTween.SetStartState();
+        m_ServerTipPositionTween.SetStartState();
+    }
 
 
-//         #region GM
-//         readonly Regex autoPopRegex = new Regex("鍙傛暟閿欒|鎵цGM鍛戒护閿欒|^###");
-//         void DisplayGM(string latest)
-//         {
-//             if (!string.IsNullOrEmpty(latest))
-//             {
-//                 if (m_AutoPopToggle.isOn && hasOnFrom)
-//                 {
-//                     RectTransform rt = m_ContainerGM;
-//                     Vector3 pos = new Vector3(hasOnFrom ? -rt.sizeDelta.x / 2 : rt.sizeDelta.x / 2, 0, 0);
-//                     rt.DOLocalMove(pos, 1.0f);
-//                     hasOnFrom = !hasOnFrom;
-//                     m_GMClose.SetActive(!hasOnFrom);
-//                 }
-//             }
-//             if (m_ScrollControl.GetNumberOfCells(m_ScrollControl.m_Scorller) >= 300)
-//             {
-//                 m_ScrollControl.m_Scorller.RefreshActiveCellViews();
-//                 return;
-//             }
-//             m_ScrollControl.Refresh();
-//             for (int i = 0; i < ServerTipDetails.gmMessages.Count; i++)
-//             {
-//                 m_ScrollControl.AddCell(ScrollerDataType.Normal, i);
-//             }
-//             m_ScrollControl.Restart();
-//             if (autoPopRegex.IsMatch(latest))
-//             {
-//                 if (hasOnFrom)
-//                 {
-//                     OnGMOpen();
-//                 }
-//             }
-//         }
+    readonly Regex autoPopRegex = new Regex("鍙傛暟閿欒|鎵цGM鍛戒护閿欒|^###");
+    void DisplayGM(string latest)
+    {
+        if (!string.IsNullOrEmpty(latest))
+        {
+            if (m_AutoPopToggle.isOn && hasOnFrom)
+            {
+                RectTransform rt = m_ContainerGM;
+                Vector3 pos = new Vector3(hasOnFrom ? -rt.sizeDelta.x / 2 : rt.sizeDelta.x / 2, 0, 0);
+                rt.DOLocalMove(pos, 1.0f);
+                hasOnFrom = !hasOnFrom;
+                m_GMClose.SetActive(!hasOnFrom);
+            }
+        }
+        if (m_ScrollControl.GetNumberOfCells(m_ScrollControl.m_Scorller) >= 300)
+        {
+            m_ScrollControl.m_Scorller.RefreshActiveCellViews();
+            return;
+        }
+        m_ScrollControl.Refresh();
+        for (int i = 0; i < ServerTipDetails.gmMessages.Count; i++)
+        {
+            m_ScrollControl.AddCell(ScrollerDataType.Normal, i);
+        }
+        m_ScrollControl.Restart();
+        if (autoPopRegex.IsMatch(latest))
+        {
+            if (hasOnFrom)
+            {
+                OnGMOpen();
+            }
+        }
+    }
 
-//         private void OnRefreshGmCell(ScrollerDataType type, CellView cell)
-//         {
-//             if (cell.index < ServerTipDetails.gmMessages.Count)
-//             {
-//                 Text text = cell.transform.Find("Text").GetComponent<Text>();
-//                 text.text = ServerTipDetails.gmMessages[cell.index];
-//             }
-//         }
+    private void OnRefreshGmCell(ScrollerDataType type, CellView cell)
+    {
+        if (cell.index < ServerTipDetails.gmMessages.Count)
+        {
+            Text text = cell.transform.Find("Text").GetComponent<Text>();
+            text.text = ServerTipDetails.gmMessages[cell.index];
+        }
+    }
 
-//         private bool OnGetDynamicSize(ScrollerDataType type, int index, out float height)
-//         {
-//             var msg = index < ServerTipDetails.gmMessages.Count ? ServerTipDetails.gmMessages[index] : string.Empty;
-//             height = m_GmRichText.cachedTextGeneratorForLayout.GetPreferredHeight(msg,
-//                 m_GmRichText.GetGenerationSettings(new Vector2(m_GmRichText.rectTransform.rect.size.x, 0.0f)))
-//                 / m_GmRichText.pixelsPerUnit;
-//             height += 5;
-//             return true;
-//         }
+    private bool OnGetDynamicSize(ScrollerDataType type, int index, out float height)
+    {
+        var msg = index < ServerTipDetails.gmMessages.Count ? ServerTipDetails.gmMessages[index] : string.Empty;
+        height = m_GmRichText.cachedTextGeneratorForLayout.GetPreferredHeight(msg,
+            m_GmRichText.GetGenerationSettings(new Vector2(m_GmRichText.rectTransform.rect.size.x, 0.0f)))
+            / m_GmRichText.pixelsPerUnit;
+        height += 5;
+        return true;
+    }
 
-//         private void OnGMClose()
-//         {
-//             if (!hasOnFrom)
-//             {
-//                 RectTransform rt = m_ContainerGM;
-//                 Vector3 pos = new Vector3(hasOnFrom ? -rt.sizeDelta.x / 2 : rt.sizeDelta.x / 2, 0, 0);
-//                 rt.DOLocalMove(pos, 1.0f);
-//                 hasOnFrom = !hasOnFrom;
-//                 m_GMClose.SetActive(!hasOnFrom);
-//             }
-//         }
-//         #endregion
+    private void OnGMClose()
+    {
+        if (!hasOnFrom)
+        {
+            RectTransform rt = m_ContainerGM;
+            Vector3 pos = new Vector3(hasOnFrom ? -rt.sizeDelta.x / 2 : rt.sizeDelta.x / 2, 0, 0);
+            rt.DOLocalMove(pos, 1.0f);
+            hasOnFrom = !hasOnFrom;
+            m_GMClose.SetActive(!hasOnFrom);
+        }
+    }
 
-//         private void OnDisable()
-//         {
-//             m_ContainerNormalHint.SetActive(false);
-//             m_ContainerChatHint.SetActive(false);
-//             DisableServerTip();
-//             StopAllCoroutines();
-//         }
+    private Vector3 gmTo = new Vector3(442, 0, 0);
+    private Vector3 gmFrom = new Vector3(892, 0, 0);
+    private bool hasOnFrom = true;
+    public void OnGMOpen()
+    {
+        RectTransform rt = m_ContainerGM;
+        Vector3 pos = new Vector3(hasOnFrom ? -rt.sizeDelta.x / 2 : rt.sizeDelta.x / 2, 0, 0);
+        rt.DOLocalMove(pos, 1.0f);
+        hasOnFrom = !hasOnFrom;
+        m_GMClose.SetActive(!hasOnFrom);
+    }
 
-//         private Vector3 gmTo = new Vector3(442, 0, 0);
-//         private Vector3 gmFrom = new Vector3(892, 0, 0);
-//         private bool hasOnFrom = true;
-//         public void OnGMOpen()
-//         {
-//             RectTransform rt = m_ContainerGM;
-//             Vector3 pos = new Vector3(hasOnFrom ? -rt.sizeDelta.x / 2 : rt.sizeDelta.x / 2, 0, 0);
-//             rt.DOLocalMove(pos, 1.0f);
-//             hasOnFrom = !hasOnFrom;
-//             m_GMClose.SetActive(!hasOnFrom);
-//         }
+    void CheckChatHint()
+    {
+        var hint = ServerTipDetails.RequireChatHint();
+        if (hint != null)
+        {
+            DisplayChatHint(hint);
+        }
+    }
 
-//         void CheckChatHint()
-//         {
-//             var hint = ServerTipDetails.RequireChatHint();
-//             if (hint != null)
-//             {
-//                 DisplayChatHint(hint);
-//             }
-//         }
-
-//         void DisplayChatHint(SystemHintData hint)
-//         {
-//             if (!WindowCenter.Instance.IsOpen<ChatWin>())
-//             {
-//                 return;
-//             }
-//             if (!m_ContainerChatHint.gameObject.activeInHierarchy)
-//             {
-//                 m_ContainerChatHint.gameObject.SetActive(true);
-//             }
-//             m_NormalChatHint.SetExtenalData(hint.extentionData);
-//             m_NormalChatHint.text = hint.message;
-//             m_ContainerChatHint.DoWaitRestart();
-//         }
-//     }
-// }
-
+    void DisplayChatHint(SystemHintData hint)
+    {
+        //  TODO YYL
+        // if (!UIManager.Instance.IsOpened<ChatWin>())
+        // {
+        //     return;
+        // }
+        if (!m_ContainerChatHint.gameObject.activeInHierarchy)
+        {
+            m_ContainerChatHint.gameObject.SetActive(true);
+        }
+        m_NormalChatHint.SetExtenalData(hint.extentionData);
+        m_NormalChatHint.text = hint.message;
+        m_ContainerChatHint.DoWaitRestart();
+    }
+}
diff --git a/Main/System/Message/MessageWin.cs.meta b/Main/System/Message/MessageWin.cs.meta
index 8d6285a..5abe19c 100644
--- a/Main/System/Message/MessageWin.cs.meta
+++ b/Main/System/Message/MessageWin.cs.meta
@@ -1,8 +1,7 @@
 fileFormatVersion: 2
 guid: d7426a87e4ad9af4a8fd4bbabab7c32d
-timeCreated: 1499772891
-licenseType: Free
 MonoImporter:
+  externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
diff --git a/Main/System/Message/SysNotifyMgr.cs b/Main/System/Message/SysNotifyMgr.cs
new file mode 100644
index 0000000..6efe145
--- /dev/null
+++ b/Main/System/Message/SysNotifyMgr.cs
@@ -0,0 +1,312 @@
+锘縰sing vnxbqy.UI;
+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>
+    // TODO YYL
+    // 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()
+    {
+        // TODO YYL
+        // 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();
+        // TODO YYL
+        // DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerDataInitializeEvent;
+        // StageLoad.Instance.onStageLoadFinish -= OnStageLoadFinish;
+    }
+
+    private void OnStageLoadFinish()
+    {
+        ServerTipDetails.OnStageLoadFinish();
+        // TODO YYL
+        // BattleHint.Instance.OnStageLoadFinish();
+    }
+
+    private void BeforePlayerDataInitializeEvent()
+    {
+        // TODO YYL
+        // ScrollTip.m_Hints.Clear();
+        ServerTipDetails.ClearHint();
+    }
+
+    // // TODO YYL
+    // 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);
+            // TODO YYL
+            // ScrollTip.ShowTip(hint);
+            // ChatCtrl.Inst.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);
+        }
+    }
+
+    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:
+                    // TODO YYL
+                    // ScrollTip.ShowTip(msg, tipInfoList, order);
+                    break;
+                case SysNotifyType.SysIntervalFixedTip:
+                    ServerTipDetails.ShowServerTip(msg, tipInfoList, order);
+                    break;
+                case SysNotifyType.SysMarqueeTip:
+                    ServerTipDetails.ShowMarquee(msg, tipInfoList,order);
+                    break;
+
+                //  TODO YYL    
+                // case SysNotifyType.SysChanelTip:
+                //     ChatCtrl.Inst.RevChatInfo(msg, tipInfoList);
+                //     break;
+                // case SysNotifyType.SysFairyQuestionTip:
+                //     ChatCtrl.Inst.RevChatInfo(msg, tipInfoList, ChatInfoType.FairyQuestion);
+                //     break;
+                // case SysNotifyType.SysFairyTip:
+                //     ChatCtrl.Inst.RevChatInfo(msg, tipInfoList, ChatInfoType.FairyTip);
+                //     break;
+                // case SysNotifyType.SysTeamTip:
+                //     ChatCtrl.Inst.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:
+                //     ChatCtrl.Inst.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;
+}
diff --git a/Main/System/Message/SysNotifyMgr.cs.meta b/Main/System/Message/SysNotifyMgr.cs.meta
new file mode 100644
index 0000000..636fd19
--- /dev/null
+++ b/Main/System/Message/SysNotifyMgr.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 08ac47bafc115db42959baf190cbaad1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Message/WaitCallBack.cs b/Main/System/Message/WaitCallBack.cs
index 5b19d3d..6137ec6 100644
--- a/Main/System/Message/WaitCallBack.cs
+++ b/Main/System/Message/WaitCallBack.cs
@@ -2,8 +2,6 @@
 using System.Collections.Generic;
 using UnityEngine;
 
-namespace CJ.Wait
-{
     /// <summary>
     /// 寤惰繜鍑犵鎵ц浜嬩欢
     /// </summary>
@@ -168,5 +166,4 @@
             }
         }
     }
-}
 
diff --git a/Main/System/Redpoint/Redpoint.cs b/Main/System/Redpoint/Redpoint.cs
index 2f2b95b..1f68524 100644
--- a/Main/System/Redpoint/Redpoint.cs
+++ b/Main/System/Redpoint/Redpoint.cs
@@ -2,8 +2,6 @@
 using System.Collections.Generic;
 using UnityEngine;
 
-namespace vnxbqy.UI
-{
     
     public class Redpoint
     {
@@ -64,5 +62,3 @@
 
         public int RedpoindId { get; internal set; }
     }
-}
-
diff --git a/Main/System/Redpoint/RedpointBehaviour.cs b/Main/System/Redpoint/RedpointBehaviour.cs
index 80062ab..6cb2382 100644
--- a/Main/System/Redpoint/RedpointBehaviour.cs
+++ b/Main/System/Redpoint/RedpointBehaviour.cs
@@ -6,8 +6,6 @@
 using System.Collections;
 using UnityEngine.UI;
 
-namespace vnxbqy.UI
-{
     
     public class RedpointBehaviour : MonoBehaviour
     {
@@ -116,7 +114,6 @@
 
     }
 
-}
 
 
 
diff --git a/Main/System/Redpoint/RedpointCenter.cs b/Main/System/Redpoint/RedpointCenter.cs
index ac08e95..b197f86 100644
--- a/Main/System/Redpoint/RedpointCenter.cs
+++ b/Main/System/Redpoint/RedpointCenter.cs
@@ -3,8 +3,6 @@
 using UnityEngine;
 using System;
 
-namespace vnxbqy.UI
-{
     
     public class RedpointCenter : Singleton<RedpointCenter>
     {
@@ -130,5 +128,3 @@
         }
 
     }
-}
-
diff --git a/Main/UI/Launch.meta b/Main/System/Tip.meta
similarity index 76%
copy from Main/UI/Launch.meta
copy to Main/System/Tip.meta
index f4af743..301b7e9 100644
--- a/Main/UI/Launch.meta
+++ b/Main/System/Tip.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 91e90d274ca17e84aab980cb88d23de7
+guid: 8572fb4f5fe742341921a0b8f25be8e2
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Main/System/Tip/MarqueeWin.cs b/Main/System/Tip/MarqueeWin.cs
new file mode 100644
index 0000000..b8f6026
--- /dev/null
+++ b/Main/System/Tip/MarqueeWin.cs
@@ -0,0 +1,134 @@
+锘縰sing UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine.UI;
+using DG.Tweening;
+using Cysharp.Threading.Tasks;
+
+public class MarqueeWin : UIBase
+{
+    // 缁勪欢寮曠敤
+    [SerializeField] RectTransform m_ContainerMarquee;
+    [SerializeField] RichText marqueeText;
+    [SerializeField] RectTransform marqueeBg;
+    [SerializeField] TweenCurve tweenCurve;
+    [SerializeField] UIEffect m_Effect;
+
+    Vector3 fromPos;
+    Vector3 toPos;
+    float m_Time;
+    float duration;
+    int presentCnt = 0;
+    int loopCnt = 1;
+
+    [SerializeField]
+    float speed = 5.0f;
+
+    Coroutine cacheCoroutine = null;
+
+    // 鐢熷懡鍛ㄦ湡
+    protected override void Awake()
+    {
+        base.Awake();
+        // 鍒濆鍖栫粍浠跺紩鐢�
+        fromPos = marqueeText.rectTransform.localPosition;
+    }
+
+    protected override void Start()
+    {
+        base.Start();
+        // 鍒濆鍖栨暟鎹�
+    }
+
+    protected override void OnPreOpen()
+    {
+        // 瀛愮被鍙互閲嶅啓姝ゆ柟娉曡繘琛岄澶栫殑棰勬墦寮�鎿嶄綔
+        base.OnPreOpen();
+
+        m_Time = 0;
+        ServerTipDetails.OnTweening = false;
+        presentCnt = 0;
+        m_ContainerMarquee.SetActive(false);
+        if (cacheCoroutine != null)
+        {
+            StopCoroutine(cacheCoroutine);
+            cacheCoroutine = null;
+        }
+    }
+
+    // UI浜嬩欢
+    protected override void OnOpen()
+    {
+        base.OnOpen();
+        // 绐楀彛鎵撳紑鏃剁殑閫昏緫
+        m_Effect.Play();
+        cacheCoroutine = StartCoroutine(Co_StartTween());
+    }
+
+    protected override void OnClose()
+    {
+        base.OnClose();
+        // 绐楀彛鍏抽棴鏃剁殑閫昏緫
+    }
+
+    IEnumerator Co_StartTween()
+    {
+        yield return new WaitForSeconds(5f);
+        m_ContainerMarquee.SetActive(true);
+        BeginMarquee();
+    }
+
+    void BeginMarquee()
+    {
+        if (presentCnt == 0)
+        {
+            var _hint = ServerTipDetails.RequireMarquee();
+            if (_hint != null)
+            {
+                presentCnt = 0;
+                marqueeText.SetExtenalData(_hint.extentionData);
+                marqueeText.text = _hint.message;
+            }
+            else
+            {
+                CloseWindow();
+                return;
+            }
+        }
+        presentCnt++;
+        marqueeText.rectTransform.localPosition = fromPos;
+        toPos = fromPos;
+        float width = marqueeText.preferredWidth;
+        toPos.x = fromPos.x - marqueeBg.rect.width - width;
+        duration = (width + marqueeBg.rect.width) / speed;
+        ServerTipDetails.OnTweening = true;
+    }
+
+    void OnTweenComp()
+    {
+        m_Time = 0;
+        ServerTipDetails.OnTweening = false;
+        if (presentCnt >= loopCnt)
+        {
+            presentCnt = 0;
+        }
+        BeginMarquee();
+    }
+
+    protected void LateUpdate()
+    {
+        if (ServerTipDetails.OnTweening)
+        {
+            m_Time += Time.deltaTime;
+            if (m_Time <= duration)
+            {
+                float progress = tweenCurve.Evaluate(m_Time / duration);
+                marqueeText.rectTransform.localPosition = Vector3.Lerp(fromPos, toPos, progress);
+            }
+            else
+            {
+                OnTweenComp();
+            }
+        }
+    }
+}
diff --git a/Main/System/Tip/MarqueeWin.cs.meta b/Main/System/Tip/MarqueeWin.cs.meta
new file mode 100644
index 0000000..c92bd1c
--- /dev/null
+++ b/Main/System/Tip/MarqueeWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 33cf9ecf61018054ead9a0dcc8f3d121
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Tip/ServerTipDetails.cs b/Main/System/Tip/ServerTipDetails.cs
new file mode 100644
index 0000000..0bc95db
--- /dev/null
+++ b/Main/System/Tip/ServerTipDetails.cs
@@ -0,0 +1,255 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Cysharp.Threading.Tasks;
+
+public class ServerTipDetails
+{
+    #region 璺戦┈鐏�
+    public static bool OnTweening = false;
+    private static List<SystemHintData> m_Marquees = new List<SystemHintData>();
+    public static void ShowMarquee(string msg, ArrayList info, int _order, int loopCnt = 1)
+    {
+        m_Marquees.Add(new SystemHintData()
+        {
+            appendTime = DateTime.Now,
+            message = msg,
+            extentionData = info == null ? info : new ArrayList(info),
+            order = _order
+        });
+
+        m_Marquees.Sort(SysNotifyMgr.Instance.Compare);
+
+        if (!CheckOpenMarquee())
+        {
+            return;
+        }
+
+        if (!UIManager.Instance.IsOpened<MarqueeWin>())
+        {
+            UIManager.Instance.OpenWindow<MarqueeWin>();
+        }
+    }
+
+    public static void OnStageLoadFinish()
+    {
+        // if (StageLoad.Instance.currentStage is LoginStage)
+        // {
+        //     m_Marquees.Clear();
+        //     return;
+        // }
+        Co_StageLoadFinish().Forget();
+    }
+
+    private static async UniTask Co_StageLoadFinish()
+    {
+        await UniTask.Yield();
+        if (CheckOpenMarquee() && m_Marquees.Count > 0)
+        {
+            if (!UIManager.Instance.IsOpened<MarqueeWin>())
+            {
+                UIManager.Instance.OpenWindow<MarqueeWin>();
+            }
+        }
+    }
+
+
+    static bool CheckOpenMarquee()
+    {
+        return true;
+        // TODO YYL
+        // return (StageLoad.Instance.currentStage is DungeonStage) && !StageLoad.Instance.isLoading;
+    }
+
+    public static SystemHintData RequireMarquee()
+    {
+        if (m_Marquees.Count > 0)
+        {
+            var _hint = m_Marquees[0];
+            m_Marquees.RemoveAt(0);
+            return _hint;
+        }
+        return null;
+    }
+
+    #endregion
+
+    #region 鍥哄畾鍏ㄦ湇娑堟伅
+    private static List<SystemHintData> serverHints = new List<SystemHintData>();
+    public static event Action serverHintRefresh;
+    public static void ShowServerTip(string msg, ArrayList info, int order)
+    {
+        serverHints.Add(new SystemHintData()
+        {
+            message = msg,
+            order = order,
+            extentionData = info == null ? info : new ArrayList(info),
+            appendTime = DateTime.Now,
+        });
+
+        serverHints.Sort(SysNotifyMgr.Instance.Compare);
+
+        if (serverHintRefresh != null)
+        {
+            serverHintRefresh();
+        }
+
+        if (!UIManager.Instance.IsOpened<MessageWin>())
+        {
+            UIManager.Instance.OpenWindow<MessageWin>();
+        }
+    }
+
+    public static SystemHintData RequireServerTip()
+    {
+        if (serverHints.Count > 0)
+        {
+            var hint = serverHints[0];
+            serverHints.RemoveAt(0);
+            return hint;
+        }
+        return null;
+    }
+    #endregion
+
+    #region 鏅�氫俊鎭彁绀�
+    private static List<SystemHintData> normalHints = new List<SystemHintData>();
+    public static event Action normalHintRefresh;
+    public static void DisplayNormalTip(string msg, ArrayList info = null)
+    {
+        normalHints.Clear();
+        normalHints.Add(new SystemHintData()
+        {
+            message = msg,
+            order = 0,
+            extentionData = info == null ? info : new ArrayList(info),
+            appendTime = DateTime.Now,
+        });
+        if (normalHintRefresh != null)
+        {
+            normalHintRefresh();
+        }
+        if (!UIManager.Instance.IsOpened<MessageWin>())
+        {
+            UIManager.Instance.OpenWindow<MessageWin>();
+        }
+    }
+
+    public static SystemHintData RequireNormalHint()
+    {
+        if (normalHints.Count > 0)
+        {
+            var hint = normalHints[0];
+            normalHints.RemoveAt(0);
+            return hint;
+        }
+        return null;
+    }
+    #endregion
+
+    #region 鑱婂ぉ鐣岄潰淇℃伅鎻愮ず
+    private static List<SystemHintData> chatHints = new List<SystemHintData>();
+    public static event Action chatHintRefresh;
+    public static void DisplayChatTip(string msg, ArrayList info = null)
+    {
+        chatHints.Clear();
+        chatHints.Add(new SystemHintData()
+        {
+            message = msg,
+            order = 0,
+            extentionData = info == null ? info : new ArrayList(info),
+            appendTime = DateTime.Now,
+        });
+        if (chatHintRefresh != null)
+        {
+            chatHintRefresh();
+        }
+        if (!UIManager.Instance.IsOpened<MessageWin>())
+        {
+            UIManager.Instance.OpenWindow<MessageWin>();
+        }
+    }
+
+    public static SystemHintData RequireChatHint()
+    {
+        if (chatHints.Count > 0)
+        {
+            var hint = chatHints[0];
+            chatHints.RemoveAt(0);
+            return hint;
+        }
+        return null;
+    }
+    #endregion
+    #region GM娑堟伅
+    public static List<string> gmMessages = new List<string>();
+    public static event Action<string> gmMessageRefresh;
+    public static void ReceivePackage(string message)
+    {
+        message = message.Replace("###", string.Empty);
+        if (gmMessages.Count >= 300)
+        {
+            gmMessages.RemoveAt(0);
+        }
+        gmMessages.Add(message);
+
+        if (gmMessageRefresh != null)
+        {
+            gmMessageRefresh(message);
+        }
+    }
+
+    public static event Action gmOpenEvent;
+    public static bool requireOpenGM;
+    public static void OpenGMPanel()
+    {
+        requireOpenGM = true;
+        if (!UIManager.Instance.IsOpened<MessageWin>())
+        {
+            UIManager.Instance.OpenWindow<MessageWin>();
+        }
+        else
+        {
+            if (gmOpenEvent != null)
+            {
+                gmOpenEvent();
+            }
+        }
+    }
+    #endregion
+
+    public static void ClearHint()
+    {
+        serverHints.Clear();
+        m_Marquees.Clear();
+        // queueTrumpetTips.Clear();
+        normalHints.Clear();
+        chatHints.Clear();
+    }
+
+    // #region 鍠囧彮淇℃伅
+    // private static Queue<ChatTrumpetData> queueTrumpetTips = new Queue<ChatTrumpetData>();
+    // public static void ShowTrumpetTip(ChatTrumpetData trumpetData)
+    // {
+    //     queueTrumpetTips.Enqueue(trumpetData);
+    //     if (!UIManager.Instance.IsOpened<TrumpetWin>())
+    //     {
+    //         UIManager.Instance.OpenWindow<TrumpetWin>();
+    //     }
+    // }
+    // public static ChatTrumpetData RequireTrumpetTip()
+    // {
+    //     if (queueTrumpetTips.Count > 0)
+    //     {
+    //         return queueTrumpetTips.Dequeue();
+    //     }
+    //     return null;
+    // }
+    // public static int GetTrumpetSurplusCnt()
+    // {
+    //     return queueTrumpetTips.Count;
+    // }
+    // #endregion
+}
diff --git a/Main/System/Tip/ServerTipDetails.cs.meta b/Main/System/Tip/ServerTipDetails.cs.meta
new file mode 100644
index 0000000..032110e
--- /dev/null
+++ b/Main/System/Tip/ServerTipDetails.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 618febf3610033745acf7530fc007966
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/UI/Launch.meta b/Main/UI/Decorate.meta
similarity index 77%
rename from Main/UI/Launch.meta
rename to Main/UI/Decorate.meta
index f4af743..3910d07 100644
--- a/Main/UI/Launch.meta
+++ b/Main/UI/Decorate.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 91e90d274ca17e84aab980cb88d23de7
+guid: 7afe0dfa12d3fb54d95a2563bc0e019e
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Main/UI/Login.meta b/Main/UI/Login.meta
deleted file mode 100644
index 99ddaf1..0000000
--- a/Main/UI/Login.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: bef9e971d62416147ae8006de5cbff6a
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

--
Gitblit v1.8.0