From 40beae8380dc59e5f5bc7f29b202ed2ed4ea839e Mon Sep 17 00:00:00 2001
From: client_Wu Xijin <364452445@qq.com>
Date: 星期六, 13 四月 2019 10:47:52 +0800
Subject: [PATCH] 6498 【前端】【2.0】主界面技能转盘修改

---
 Core/GameEngine/DataToCtl/ConnectedState.cs                                            |    6 
 System/AssetVersion/AssetVersionUtility.cs                                             |    2 
 System/CrossServerOneVsOne/CrossServerOneVsOneModel.cs                                 |   15 
 Core/GameEngine/Login/Launch.cs                                                        |    2 
 Fight/Actor/Skill/SkillManager.cs                                                      |    4 
 System/MainWin/MainWinSkillController.cs                                               |  304 +++++++++++
 System/MainWin/SkillButton.cs                                                          |  327 ++++++++---
 System/NewBieGuidance/NewBieWin.cs                                                     |    2 
 System/Team/TeamModel.cs                                                               |    6 
 System/MainWin/AttackButton.cs                                                         |    1 
 System/MainInterfacePanel/IsShowXpButton.cs                                            |    9 
 Fight/Actor/Status/Status_Base.cs                                                      |    3 
 System/Skill/TreasureSkillWin.cs                                                       |    9 
 System/Dungeon/DungeonModel.cs                                                         |    4 
 System/MainInterfacePanel/SkillButtonEffects.cs                                        |  493 ------------------
 Fight/Actor/Skill/Skill.cs                                                             |   54 -
 System/Login/CrossServerLogin.cs                                                       |   11 
 System/MainWin/SkillContainer.cs                                                       |  108 ++-
 Utility/Clock.cs                                                                       |  119 ++--
 System/CrossServerOneVsOne/CrossServerOneVsOneCyclicScroll.cs                          |    6 
 Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs |   10 
 Core/GameEngine/DataToCtl/CreateOrSelectRoleState.cs                                   |    6 
 System/MainInterfacePanel/LongPressShowPanel.cs                                        |   33 +
 System/MainWin/MainWinSkillController.cs.meta                                          |   12 
 Core/NetworkPackage/DTCFile/ServerPack/HB4_Fight/DTCB403_tagMCAttackFail.cs            |    4 
 System/AssetVersion/InGameDownLoad.cs                                                  |    7 
 System/MainInterfacePanel/MainInterfaceWin.cs                                          |    3 
 Fight/Actor/Status/StatusMgr.cs                                                        |    3 
 System/ClientVersion/VersionUtility.cs                                                 |   10 
 System/Login/ServerListCenter.cs                                                       |    6 
 System/Dungeon/NormalDungeonEntranceWin.cs                                             |    2 
 31 files changed, 777 insertions(+), 804 deletions(-)

diff --git a/Core/GameEngine/DataToCtl/ConnectedState.cs b/Core/GameEngine/DataToCtl/ConnectedState.cs
index efebb6b..ad27e81 100644
--- a/Core/GameEngine/DataToCtl/ConnectedState.cs
+++ b/Core/GameEngine/DataToCtl/ConnectedState.cs
@@ -65,7 +65,7 @@
     {
         if (clock != null)
         {
-            clock.Stop();
+            Clock.Stop(clock);
         }
         clock = null;
 
@@ -90,9 +90,9 @@
 
         if (clock != null)
         {
-            clock.Stop();
+            Clock.Stop(clock);
         }
-        clock = Clock.Create(DateTime.Now + new TimeSpan(_seconds * TimeSpan.TicksPerSecond), OnDetectEnd);
+        clock = Clock.AlarmAt(DateTime.Now + new TimeSpan(_seconds * TimeSpan.TicksPerSecond), OnDetectEnd);
     }
 
     private void OnDetectEnd()
diff --git a/Core/GameEngine/DataToCtl/CreateOrSelectRoleState.cs b/Core/GameEngine/DataToCtl/CreateOrSelectRoleState.cs
index 761a9c2..97dfbfa 100644
--- a/Core/GameEngine/DataToCtl/CreateOrSelectRoleState.cs
+++ b/Core/GameEngine/DataToCtl/CreateOrSelectRoleState.cs
@@ -60,7 +60,7 @@
     {
         if (clock != null)
         {
-            clock.Stop();
+            Clock.Stop(clock);
         }
         clock = null;
         base.OnExit();
@@ -77,9 +77,9 @@
 
         if (clock != null)
         {
-            clock.Stop();
+            Clock.Stop(clock);
         }
-        clock = Clock.Create(DateTime.Now + new TimeSpan(_seconds * TimeSpan.TicksPerSecond), OnDetectEnd);
+        clock = Clock.AlarmAt(DateTime.Now + new TimeSpan(_seconds * TimeSpan.TicksPerSecond), OnDetectEnd);
     }
 
     private void OnDetectEnd()
diff --git a/Core/GameEngine/Login/Launch.cs b/Core/GameEngine/Login/Launch.cs
index a7d810b..b27ce39 100644
--- a/Core/GameEngine/Login/Launch.cs
+++ b/Core/GameEngine/Login/Launch.cs
@@ -61,7 +61,6 @@
 #endif
 #endif
 
-
         tasks.Enqueue(checkAssetValidTask);
         tasks.Enqueue(downLoadAssetTask);
         tasks.Enqueue(assetBundleInitTask);
@@ -361,6 +360,7 @@
 
             GlobalTimeEvent.Instance.Begin();
             PackageRegedit.Init();
+            Clock.Init();
 
             // ## PocoManager Start
             if (VersionConfig.Get().appId.Equals("test"))
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs b/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs
index f0d654e..f74280a 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs
@@ -13,10 +13,8 @@
     public static event SkillChangeHandler SkillChangeEvent;
 
     MountModel m_HorseModel;
-    MountModel horsemodel
-    {
-        get
-        {
+    MountModel horsemodel {
+        get {
             return m_HorseModel ?? (m_HorseModel = ModelCenter.Instance.GetModel<MountModel>());
         }
     }
@@ -57,9 +55,9 @@
         {
             Skill _skill = _hero.SkillMgr.Get(vNetData.NewSkillID);
             _skill.cd = vNetData.RemainTime * Constants.F_GAMMA;
-            if (_skill.RefreshCD != null)
+            if (Skill.RefreshCD != null)
             {
-                _skill.RefreshCD(vNetData.RemainTime * Constants.F_GAMMA, _skill.skillInfo.config.CoolDownTime * Constants.F_GAMMA);
+                Skill.RefreshCD(_skill.id, vNetData.RemainTime * Constants.F_GAMMA, _skill.skillInfo.config.CoolDownTime * Constants.F_GAMMA);
             }
 
             if (_skill.skillInfo.config.FuncType == 9)
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HB4_Fight/DTCB403_tagMCAttackFail.cs b/Core/NetworkPackage/DTCFile/ServerPack/HB4_Fight/DTCB403_tagMCAttackFail.cs
index b885f6f..766e0b6 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/HB4_Fight/DTCB403_tagMCAttackFail.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HB4_Fight/DTCB403_tagMCAttackFail.cs
@@ -41,9 +41,9 @@
         _skill.ClearServerHurtList();
         _skill.DoPreparingFail(_hero.ServerInstID);
 
-        if (_skill.RefreshCD != null)
+        if (Skill.RefreshCD != null)
         {
-            _skill.RefreshCD(0, _skill.skillInfo.config.CoolDownTime * Constants.F_GAMMA);
+            Skill.RefreshCD(_skill.id, 0, _skill.skillInfo.config.CoolDownTime * Constants.F_GAMMA);
         }
     }
 }
\ No newline at end of file
diff --git a/Fight/Actor/Skill/Skill.cs b/Fight/Actor/Skill/Skill.cs
index ec6b5b9..34e6194 100644
--- a/Fight/Actor/Skill/Skill.cs
+++ b/Fight/Actor/Skill/Skill.cs
@@ -13,27 +13,23 @@
 
     public static event System.Action<int> OnSkillCDFinished;
     public static event System.Action<uint, int> OnSkillCast;
-    public UnityEngine.Events.UnityAction<float, float> RefreshCD;
+    public static UnityEngine.Events.UnityAction<int, float, float> RefreshCD;
     public event System.Action<uint> OnPreparingEnd;
     public event System.Action<uint> OnPreparingFail;
     public event System.Action OnPreparingCast;
 
     public uint OwnerID { get; private set; }
 
-    public int id
-    {
+    public int id {
         get; private set;
     }
 
     private float m_Cd;
-    public float cd
-    {
-        get
-        {
+    public float cd {
+        get {
             return m_Cd;
         }
-        set
-        {
+        set {
             m_Cd = value;
         }
     }
@@ -54,14 +50,11 @@
     public List<Vector3> warnPosList = new List<Vector3>();// 棰勮鏃跺�欑殑浣嶇疆
 
     private bool m_CSkillPrepareEnd;
-    public bool CSkillPrepareEnd
-    {
-        get
-        {
+    public bool CSkillPrepareEnd {
+        get {
             return m_CSkillPrepareEnd;
         }
-        set
-        {
+        set {
             m_CSkillPrepareEnd = value;
         }
     }
@@ -75,40 +68,31 @@
     }
 
     private E_SkillPrepareStatus m_SSkillPrepareStatus = E_SkillPrepareStatus.None;
-    public E_SkillPrepareStatus SSkillPrepareStatus
-    {
-        get
-        {
+    public E_SkillPrepareStatus SSkillPrepareStatus {
+        get {
             return m_SSkillPrepareStatus;
         }
-        set
-        {
+        set {
             m_SSkillPrepareStatus = value;
         }
     }
 
     private bool m_SkillPreparing = false;
-    public bool SkillPreparing
-    {
-        get
-        {
+    public bool SkillPreparing {
+        get {
             return m_SkillPreparing;
         }
-        set
-        {
+        set {
             m_SkillPreparing = value;
         }
     }
 
     private bool m_SkillCompelete = true;
-    public bool SkillCompelete
-    {
-        get
-        {
+    public bool SkillCompelete {
+        get {
             return m_SkillCompelete;
         }
-        set
-        {
+        set {
             m_SkillCompelete = value;
             //if (id == 251)
             //{
@@ -201,7 +185,7 @@
             {
                 if (RefreshCD != null)
                 {
-                    RefreshCD(cd, cd);
+                    RefreshCD(id, cd, cd);
                 }
             }
         }
@@ -216,7 +200,7 @@
             cd = skillInfo.config.CoolDownTime * Constants.F_GAMMA;
             if (RefreshCD != null)
             {
-                RefreshCD(cd, cd);
+                RefreshCD(id,cd, cd);
             }
         }
     }
diff --git a/Fight/Actor/Skill/SkillManager.cs b/Fight/Actor/Skill/SkillManager.cs
index dcd3b13..e521797 100644
--- a/Fight/Actor/Skill/SkillManager.cs
+++ b/Fight/Actor/Skill/SkillManager.cs
@@ -49,10 +49,10 @@
              && _skill.skillInfo != null
              && _skill.skillInfo.config != null)
             {
-                if (_skill.RefreshCD != null)
+                if ( Skill.RefreshCD != null)
                 {
                     _skill.cd = 0;
-                    _skill.RefreshCD(0, _skill.skillInfo.config.CoolDownTime * Constants.F_GAMMA);
+                    Skill.RefreshCD( _skill.id,0, _skill.skillInfo.config.CoolDownTime * Constants.F_GAMMA);
                 }
             }
         }
diff --git a/Fight/Actor/Status/StatusMgr.cs b/Fight/Actor/Status/StatusMgr.cs
index 904b64b..cf9f470 100644
--- a/Fight/Actor/Status/StatusMgr.cs
+++ b/Fight/Actor/Status/StatusMgr.cs
@@ -175,7 +175,8 @@
             for (int i = 0; i < _list.Count; ++i)
             {
                 _skillInfo = SkillHelper.Instance.Get(_list[i].h0605.SkillID);
-                if ((_skillInfo.config.ClientSkillSeriesLimit & 2) != 0)
+                if (_skillInfo.config.ClientSkillSeriesLimit == 0
+                 || (_skillInfo.config.ClientSkillSeriesLimit & 2) == 0)
                 {
                     return true;
                 }
diff --git a/Fight/Actor/Status/Status_Base.cs b/Fight/Actor/Status/Status_Base.cs
index db1eaed..fa15e82 100644
--- a/Fight/Actor/Status/Status_Base.cs
+++ b/Fight/Actor/Status/Status_Base.cs
@@ -205,6 +205,7 @@
 
     public bool CanUseSkill()
     {
-        return (m_SkillConfig.ClientSkillSeriesLimit & 2) != 0;
+        return m_SkillConfig.ClientSkillSeriesLimit == 0
+           || (m_SkillConfig.ClientSkillSeriesLimit & 2) == 0;
     }
 }
diff --git a/System/AssetVersion/AssetVersionUtility.cs b/System/AssetVersion/AssetVersionUtility.cs
index 1b68b8e..eea57e9 100644
--- a/System/AssetVersion/AssetVersionUtility.cs
+++ b/System/AssetVersion/AssetVersionUtility.cs
@@ -87,7 +87,7 @@
         }
         else
         {
-            Clock.Create(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), GetAssetVersionFile);
+            Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), GetAssetVersionFile);
         }
     }
 
diff --git a/System/AssetVersion/InGameDownLoad.cs b/System/AssetVersion/InGameDownLoad.cs
index 5832b0d..9176e2d 100644
--- a/System/AssetVersion/InGameDownLoad.cs
+++ b/System/AssetVersion/InGameDownLoad.cs
@@ -415,9 +415,10 @@
                             var endTime = DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond * 3);
                             if (netSwitchClock != null)
                             {
-                                netSwitchClock.Stop();
+                                Clock.Stop(netSwitchClock);
                             }
-                            netSwitchClock = Clock.Create(endTime, () =>
+
+                            netSwitchClock = Clock.AlarmAt(endTime, () =>
                              {
                                  if (CheckDominantDownLoad())
                                  {
@@ -454,7 +455,7 @@
                     {
                         Pause();
                         var endTime = DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond * 10);
-                        Clock.Create(endTime, () =>
+                        Clock.AlarmAt(endTime, () =>
                         {
                             if (CheckDominantDownLoad())
                             {
diff --git a/System/ClientVersion/VersionUtility.cs b/System/ClientVersion/VersionUtility.cs
index 55e56ae..35495e1 100644
--- a/System/ClientVersion/VersionUtility.cs
+++ b/System/ClientVersion/VersionUtility.cs
@@ -97,7 +97,7 @@
         else
         {
             step = Step.None;
-            Clock.Create(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestVersionCheck);
+            Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestVersionCheck);
         }
     }
 
@@ -144,7 +144,7 @@
         }
         else
         {
-            Clock.Create(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestApkDownConfigs);
+            Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestApkDownConfigs);
         }
     }
 
@@ -327,20 +327,20 @@
                 else
                 {
                     step = Step.None;
-                    Clock.Create(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestMaoErVersionCheck);
+                    Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestMaoErVersionCheck);
                 }
             }
             catch (System.Exception ex)
             {
                 Debug.Log(ex);
                 step = Step.None;
-                Clock.Create(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestMaoErVersionCheck);
+                Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestMaoErVersionCheck);
             }
         }
         else
         {
             step = Step.None;
-            Clock.Create(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestMaoErVersionCheck);
+            Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestMaoErVersionCheck);
         }
     }
 
diff --git a/System/CrossServerOneVsOne/CrossServerOneVsOneCyclicScroll.cs b/System/CrossServerOneVsOne/CrossServerOneVsOneCyclicScroll.cs
index c789d9e..3dd4603 100644
--- a/System/CrossServerOneVsOne/CrossServerOneVsOneCyclicScroll.cs
+++ b/System/CrossServerOneVsOne/CrossServerOneVsOneCyclicScroll.cs
@@ -50,7 +50,7 @@
 
             showing = true;
             this.enabled = false;
-            Clock.Create(DateTime.Now + new TimeSpan((long)(0.5f * TimeSpan.TicksPerSecond)), OnUnfoldShowEnd);
+            Clock.AlarmAt(DateTime.Now + new TimeSpan((long)(0.5f * TimeSpan.TicksPerSecond)), OnUnfoldShowEnd);
         }
 
         private void OnUnfoldShowEnd()
@@ -70,7 +70,7 @@
             showAchievementBehaviour.alphaTween.SetStartState();
             showAchievementBehaviour.alphaTween.Play();
             var endTime = DateTime.Now + new TimeSpan((long)(fadeOutTime * TimeSpan.TicksPerSecond));
-            Clock.Create(endTime, ReLocateItems);
+            Clock.AlarmAt(endTime, ReLocateItems);
         }
 
         void ReLocateItems()
@@ -80,7 +80,7 @@
             ReLocateAllItems(showAchievementBehaviour);
 
             var endTime = DateTime.Now + new TimeSpan((long)(relocationTime * TimeSpan.TicksPerSecond));
-            Clock.Create(endTime, ShowEnd);
+            Clock.AlarmAt(endTime, ShowEnd);
         }
 
         void ShowEnd()
diff --git a/System/CrossServerOneVsOne/CrossServerOneVsOneModel.cs b/System/CrossServerOneVsOne/CrossServerOneVsOneModel.cs
index daf9d70..9af6b8b 100644
--- a/System/CrossServerOneVsOne/CrossServerOneVsOneModel.cs
+++ b/System/CrossServerOneVsOne/CrossServerOneVsOneModel.cs
@@ -73,9 +73,11 @@
         public void OnSwitchAccount()
         {
             IsMatching = false;
-            if (clientMatchClock!=null )
+
+            if (clientMatchClock != null)
             {
-                clientMatchClock.Stop();
+                Clock.Stop(clientMatchClock);
+                clientMatchClock = null;
             }
         }
 
@@ -470,7 +472,7 @@
                     var onMatchPackage = new HC002_tagGCCrossRealmPKStartMatch();
                     GameNetSystem.Instance.PushPackage(onMatchPackage, ServerType.Main);
                     var randomWaitSeconds = UnityEngine.Random.Range(3, 8);
-                    clientMatchClock = Clock.Create(DateTime.Now + new TimeSpan(randomWaitSeconds * TimeSpan.TicksPerSecond), () =>
+                    clientMatchClock = Clock.AlarmAt(DateTime.Now + new TimeSpan(randomWaitSeconds * TimeSpan.TicksPerSecond), () =>
                     {
                         IsMatching = false;
                         if (GameNetSystem.Instance.netState == GameNetSystem.NetState.Connected)
@@ -489,9 +491,10 @@
             }
             else
             {
-                if (clientMatchClock != null && !clientMatchClock.stopped)
+                if (clientMatchClock != null )
                 {
-                    clientMatchClock.Stop();
+                    Clock.Stop(clientMatchClock);
+                    clientMatchClock = null;
                     IsMatching = false;
                 }
                 else
@@ -506,7 +509,7 @@
 
         public void SendBuyMatchCount()
         {
-            CC102_tagCMCrossRealmPKBuy pKBuy = new CC102_tagCMCrossRealmPKBuy();
+            var pKBuy = new CC102_tagCMCrossRealmPKBuy();
             GameNetSystem.Instance.SendInfo(pKBuy);
         }
 
diff --git a/System/Dungeon/DungeonModel.cs b/System/Dungeon/DungeonModel.cs
index 069bc98..037259b 100644
--- a/System/Dungeon/DungeonModel.cs
+++ b/System/Dungeon/DungeonModel.cs
@@ -413,7 +413,7 @@
                         if (ok)
                         {
                             teamModel.RequestExitTeam();
-                            Clock.Create(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond),
+                            Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond),
                                 () =>
                                 {
                                     m_CurrentDungeon = _dungeon;
@@ -708,7 +708,7 @@
 
             if (_type == DungeonCoolDownType.WaitStart)
             {
-                Clock.Create(dungeonCoolDowns[_type], OnBeginCoolDownEnd);
+                Clock.AlarmAt(dungeonCoolDowns[_type], OnBeginCoolDownEnd);
             }
         }
 
diff --git a/System/Dungeon/NormalDungeonEntranceWin.cs b/System/Dungeon/NormalDungeonEntranceWin.cs
index 5f49d42..3667555 100644
--- a/System/Dungeon/NormalDungeonEntranceWin.cs
+++ b/System/Dungeon/NormalDungeonEntranceWin.cs
@@ -312,7 +312,7 @@
                             if (_ok)
                             {
                                 teamModel.RequestExitTeam();
-                                Clock.Create(DateTime.Now + new TimeSpan(1 * TimeSpan.TicksPerSecond),
+                                Clock.AlarmAt(DateTime.Now + new TimeSpan(1 * TimeSpan.TicksPerSecond),
                                     () =>
                                     {
                                         OpenDungeonSuppliesLack(_dungeon);
diff --git a/System/Login/CrossServerLogin.cs b/System/Login/CrossServerLogin.cs
index 2f71002..7822a2d 100644
--- a/System/Login/CrossServerLogin.cs
+++ b/System/Login/CrossServerLogin.cs
@@ -61,7 +61,7 @@
                 MaxProDef = (int)matchOK.MatchPlayer[0].MaxProDef,
             };
 
-            Clock.Create(DateTime.Now + new TimeSpan(3 * TimeSpan.TicksPerSecond), () =>
+            Clock.AlarmAt(DateTime.Now + new TimeSpan(3 * TimeSpan.TicksPerSecond), () =>
             {
                 if (oneVsOnePlayerData.waitForLoginCrossServer)
                 {
@@ -139,7 +139,7 @@
                 gamePortBuf = gamePort;
 
                 StopLoginOverTimeProcess();
-                loginOverTimeClock = Clock.Create(DateTime.Now + new TimeSpan(30 * TimeSpan.TicksPerSecond), () =>
+                loginOverTimeClock = Clock.AlarmAt(DateTime.Now + new TimeSpan(30 * TimeSpan.TicksPerSecond), () =>
                 {
                     busy = false;
                     ReAccountLogin();
@@ -174,7 +174,7 @@
             {
                 this.reconnectBackGround = true;
                 StopLoginOverTimeProcess();
-                loginOverTimeClock = Clock.Create(DateTime.Now + new TimeSpan(30 * TimeSpan.TicksPerSecond), () =>
+                loginOverTimeClock = Clock.AlarmAt(DateTime.Now + new TimeSpan(30 * TimeSpan.TicksPerSecond), () =>
                  {
                      busy = false;
                      ReAccountLogin();
@@ -193,8 +193,9 @@
         {
             if (loginOverTimeClock != null)
             {
-                loginOverTimeClock.Stop();
+                Clock.Stop(loginOverTimeClock);
             }
+        
             loginOverTimeClock = null;
         }
 
@@ -263,7 +264,7 @@
             var sendInfo = new CC003_tagCGForceQuitCrossState();
             GameNetSystem.Instance.SendInfo(sendInfo);
             GameNetSystem.Instance.crossServerConnected_Loigc = false;
-            Clock.Create(DateTime.Now + new TimeSpan(2 * TimeSpan.TicksPerSecond), () =>
+            Clock.AlarmAt(DateTime.Now + new TimeSpan(2 * TimeSpan.TicksPerSecond), () =>
             {
                 GameNetSystem.Instance.Reconnect();
             });
diff --git a/System/Login/ServerListCenter.cs b/System/Login/ServerListCenter.cs
index baa4aab..14e83be 100644
--- a/System/Login/ServerListCenter.cs
+++ b/System/Login/ServerListCenter.cs
@@ -157,7 +157,7 @@
         }
         else
         {
-            Clock.Create(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestJumpUrl);
+            Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestJumpUrl);
         }
     }
 
@@ -193,7 +193,7 @@
         }
         else
         {
-            Clock.Create(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestServerCommonList);
+            Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestServerCommonList);
         }
     }
 
@@ -262,7 +262,7 @@
         {
             if (StageLoad.Instance.currentStage == null || StageLoad.Instance.currentStage is LoginStage)
             {
-                Clock.Create(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), () =>
+                Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), () =>
                 {
                     RequestServerListPlayer(accountNameBuf);
                 });
diff --git a/System/MainInterfacePanel/IsShowXpButton.cs b/System/MainInterfacePanel/IsShowXpButton.cs
index c3ad3df..da422b8 100644
--- a/System/MainInterfacePanel/IsShowXpButton.cs
+++ b/System/MainInterfacePanel/IsShowXpButton.cs
@@ -5,9 +5,9 @@
 using UnityEngine;
 using System.Collections;
 using UnityEngine.UI;
-
 using System.Collections.Generic;
 using System;
+
 //鏄惁鏄剧ずXP
 namespace Snxxz.UI
 {
@@ -72,10 +72,7 @@
             Skill.OnSkillCDFinished -= OnSkillCDFinished;
             Skill.OnSkillCast -= OnSkillCast;
             PlayerMainDate.Event_XpSkill -= OPenXpSkill;
-
-
         }
-
 
         private void OPenXpSkill()//鑾峰緱鎶�鑳�
         {
@@ -112,9 +109,7 @@
                     m_UiEffect.Play();
                 }
             }
-
         }
-
 
         private void StorageList()
         {
@@ -127,9 +122,9 @@
                 {
                     ProhibitedToRelease.Add(int.Parse(list[i]));
                 }
-
             }
         }
+
     }
 
 }
diff --git a/System/MainInterfacePanel/LongPressShowPanel.cs b/System/MainInterfacePanel/LongPressShowPanel.cs
index fbb732b..7442419 100644
--- a/System/MainInterfacePanel/LongPressShowPanel.cs
+++ b/System/MainInterfacePanel/LongPressShowPanel.cs
@@ -6,13 +6,42 @@
 using System.Collections;
 using UnityEngine.UI;
 //鎶�鑳借鎯呴潰鏉�
-namespace Snxxz.UI {
+namespace Snxxz.UI
+{
 
-    public class LongPressShowPanel:MonoBehaviour {
+    public class LongPressShowPanel : MonoBehaviour
+    {
         public Image m_Icon;
         public Text Name;
         public Text Describe;
 
+        public void Display(int skillId)
+        {
+            var treasureModel = ModelCenter.Instance.GetModel<TreasureModel>();
+            var treasures = treasureModel.GetAllTreasure();
+            var treasureId = 0;
+
+            for (int i = 0; i < treasures.Count; i++)
+            {
+                Treasure treasure;
+                if (treasureModel.TryGetTreasure(treasures[i], out treasure))
+                {
+                    if (treasure.skillId == skillId)
+                    {
+                        treasureId = treasure.id;
+                        break;
+                    }
+                }
+            }
+
+
+            var skillConfig = SkillConfig.Get(skillId);
+            Name.text = skillConfig.SkillName;
+            Describe.text = skillConfig.Description;
+
+            var treasureConfig = TreasureConfig.Get(treasureId);
+            m_Icon.SetSprite(treasureConfig.Icon);
+        }
 
     }
 
diff --git a/System/MainInterfacePanel/MainInterfaceWin.cs b/System/MainInterfacePanel/MainInterfaceWin.cs
index 18d4d20..fa674cc 100644
--- a/System/MainInterfacePanel/MainInterfaceWin.cs
+++ b/System/MainInterfacePanel/MainInterfaceWin.cs
@@ -27,7 +27,6 @@
         [SerializeField] TopRightTip m_TopRightTip;
         [SerializeField] FunctionForecastTip m_FunctionForecastTip;//鍔熻兘棰勫憡
         [SerializeField] IsShowXpButton m_IsShowXp;//XP 鎶�鑳藉父鏄�                                                
-        [SerializeField] SkillButtonEffects m_SkillButtonEffects;
         [SerializeField] FairyLeagueRemindBehaviour m_FairyLeagueRemind;
         [SerializeField] TeamInvitationEntrance m_TeamInvitationEntrance;
         [SerializeField] FairyCallMemberBehaviour m_FairyCallBehaviour;
@@ -119,7 +118,6 @@
             m_TaskListTip.Init();
             m_IsShowXp.Init();
             m_TopRightTip.Init();
-            m_SkillButtonEffects.Init();
             m_AnimationFadeOut.Init();
             m_TeamInvitationEntrance.Init();
             m_FairyCallBehaviour.Init();
@@ -240,7 +238,6 @@
             m_HighSettingFadeInFadeOut.UnInit();
             m_TaskListTip.UnInit();
             m_TopRightTip.UnInit();
-            m_SkillButtonEffects.UnInit();
             m_FunctionForecastTip.Unit();
             m_AnimationFadeOut.Unit();
             m_TeamInvitationEntrance.UnInit();
diff --git a/System/MainInterfacePanel/SkillButtonEffects.cs b/System/MainInterfacePanel/SkillButtonEffects.cs
index 09b380f..c7fe385 100644
--- a/System/MainInterfacePanel/SkillButtonEffects.cs
+++ b/System/MainInterfacePanel/SkillButtonEffects.cs
@@ -11,499 +11,6 @@
 
     public class SkillButtonEffects : MonoBehaviour
     {
-        [SerializeField] AttackButton m_Attack;
-
-        [SerializeField] SkillButton m_BlinkSkill;
-        [SerializeField] SkillButton m_Skill1;
-        [SerializeField] SkillButton m_Skill2;
-        [SerializeField] SkillButton m_Skill3;
-        [SerializeField] SkillButton m_Skill4;
-        [SerializeField] SkillButton m_Skill5;
-        [SerializeField] SkillButton m_Skill6;
-        [SerializeField] SkillButton m_Skill7;
-        [SerializeField] SkillButton m_SkillXp;
-
-        [SerializeField] Transform Skill1Info;
-        [SerializeField] Transform Skill2Info;
-        [SerializeField] Transform Skill3Info;
-        [SerializeField] Transform Skill4Info;
-        [SerializeField] Transform Skill5Info;
-        [SerializeField] Transform Skill6Info;
-        [SerializeField] Transform Skill7Info;
-        [SerializeField] Transform XpSkillInfo;
-
-        [SerializeField] GameObject SkillSelected1;
-        [SerializeField] GameObject SkillSelected2;
-        [SerializeField] GameObject SkillSelected3;
-        [SerializeField] GameObject SkillSelected4;
-        [SerializeField] GameObject SkillSelected5;
-        [SerializeField] GameObject SkillSelected6;
-        [SerializeField] GameObject SkillSelected7;
-        [SerializeField] GameObject SkillSelectedXp;
-
-        LongPressShowPanel _LongPressShowPanel;
-        public float TimeLong = 1f;
-        private bool BoolFb = false;
-        private bool AccordingBool = true;//鏄剧ず寮�鍏�
-        private int SkillsHole = -1;//鑾峰彇鎶�鑳藉瓟
-        private float _currentime = 0;
-        private int m_PlayerXpSkillId = 0;
-        private bool _bool = false;
-        UIEffect effect;
-
-        private float preTime = 0;
-
-        private void Awake()
-        {
-            m_PlayerXpSkillId = ConfigParse.GetDic<int, int>(FuncConfigConfig.Get("XpSkillID").Numerical1)[PlayerDatas.Instance.baseData.Job];//鑾峰彇鍚勪釜鑱屼笟鐨刋P鎶�鑳�
-            MagicWeapon();
-        }
-
-        public void Init()
-        {
-            SkillSelected1.SetActive(false);
-            SkillSelected2.SetActive(false);
-            SkillSelected3.SetActive(false);
-            SkillSelected4.SetActive(false);
-            SkillSelected5.SetActive(false);
-            SkillSelected6.SetActive(false);
-            SkillSelected7.SetActive(false);
-            SkillSelectedXp.SetActive(false);
-            TipShutDown(-1);
-
-            Skill.OnSkillCDFinished += OnSkillCDFinished;
-            Skill.OnSkillCast += OnSkillCast;
-        }
-
-        public void UnInit()
-        {
-            TipShutDown(-1);
-            Skill.OnSkillCDFinished -= OnSkillCDFinished;
-            Skill.OnSkillCast -= OnSkillCast;
-        }
-
-        private void OnSkillCast(uint objSID, int obj)
-        {
-            if (objSID != PlayerDatas.Instance.PlayerId)
-            {
-                return;
-            }
-            if (obj != 0 && obj == m_PlayerXpSkillId)
-            {
-                EffectMgr.Instance.PlayUIEffect(1023, 1500, m_SkillXp.transform, false);
-            }
-            int position = PlayerDatas.Instance.skill.ContainsQuickSkill(obj);
-            switch ((SkillEffects)position)
-            {
-                case SkillEffects.skillEffect_1:
-                    EffectMgr.Instance.PlayUIEffect(1023, 1500, m_Skill1.transform, false);
-                    break;
-                case SkillEffects.skillEffect_2:
-                    EffectMgr.Instance.PlayUIEffect(1023, 1500, m_Skill2.transform, false);
-                    break;
-                case SkillEffects.skillEffect_3:
-                    EffectMgr.Instance.PlayUIEffect(1023, 1500, m_Skill3.transform, false);
-                    break;
-                case SkillEffects.skillEffect_4:
-                    EffectMgr.Instance.PlayUIEffect(1023, 1500, m_Skill4.transform, false);
-                    break;
-                case SkillEffects.skillEffect_5:
-                    EffectMgr.Instance.PlayUIEffect(1023, 1500, m_Skill5.transform, false);
-                    break;
-                case SkillEffects.skillEffect_6:
-                    EffectMgr.Instance.PlayUIEffect(1023, 1500, m_Skill6.transform, false);
-                    break;
-                case SkillEffects.skillEffect_7:
-                    EffectMgr.Instance.PlayUIEffect(1023, 1500, m_Skill7.transform, false);
-                    break;
-                case SkillEffects.skillEffect_xp:
-                    //EffectMgr.Instance.PlayUIEffect(1023, 1500, m_SkillXp.transform, false);
-                    break;
-                default:
-                    break;
-            }
-
-        }
-
-        private void OnSkillCDFinished(int obj)
-        {
-            if (obj != 0 && obj == m_PlayerXpSkillId)
-            {
-                EffectMgr.Instance.PlayUIEffect(1024, 1500, m_SkillXp.transform, false);
-            }
-            int position = PlayerDatas.Instance.skill.ContainsQuickSkill(obj);
-            switch ((SkillEffects)position)
-            {
-                case SkillEffects.skillEffect_1:
-                    EffectMgr.Instance.PlayUIEffect(1024, 1500, m_Skill1.transform, false);
-                    break;
-                case SkillEffects.skillEffect_2:
-                    EffectMgr.Instance.PlayUIEffect(1024, 1500, m_Skill2.transform, false);
-                    break;
-                case SkillEffects.skillEffect_3:
-                    EffectMgr.Instance.PlayUIEffect(1024, 1500, m_Skill3.transform, false);
-                    break;
-                case SkillEffects.skillEffect_4:
-                    EffectMgr.Instance.PlayUIEffect(1024, 1500, m_Skill4.transform, false);
-                    break;
-                case SkillEffects.skillEffect_5:
-                    EffectMgr.Instance.PlayUIEffect(1024, 1500, m_Skill5.transform, false);
-                    break;
-                case SkillEffects.skillEffect_6:
-                    EffectMgr.Instance.PlayUIEffect(1024, 1500, m_Skill6.transform, false);
-                    break;
-                case SkillEffects.skillEffect_7:
-                    EffectMgr.Instance.PlayUIEffect(1024, 1500, m_Skill7.transform, false);
-                    break;
-                case SkillEffects.skillEffect_xp:
-                    //EffectMgr.Instance.PlayUIEffect(1024, 1500, m_SkillXp.transform, false);
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        private void Start()
-        {
-            UIEventTrigger.Get(m_Attack.gameObject).OnDown = DownAttackButton;
-            UIEventTrigger.Get(m_Skill1.gameObject).OnDown = DownAttackButton;
-            UIEventTrigger.Get(m_Skill2.gameObject).OnDown = DownAttackButton;
-            UIEventTrigger.Get(m_Skill3.gameObject).OnDown = DownAttackButton;
-            UIEventTrigger.Get(m_Skill4.gameObject).OnDown = DownAttackButton;
-            UIEventTrigger.Get(m_Skill5.gameObject).OnDown = DownAttackButton;
-            UIEventTrigger.Get(m_Skill6.gameObject).OnDown = DownAttackButton;
-            UIEventTrigger.Get(m_Skill7.gameObject).OnDown = DownAttackButton;
-            UIEventTrigger.Get(m_SkillXp.gameObject).OnDown = DownAttackButton;
-
-            UIEventTrigger.Get(m_Attack.gameObject).OnUp = UpAttackButton;
-            UIEventTrigger.Get(m_Skill1.gameObject).OnUp = UpAttackButton;
-            UIEventTrigger.Get(m_Skill2.gameObject).OnUp = UpAttackButton;
-            UIEventTrigger.Get(m_Skill3.gameObject).OnUp = UpAttackButton;
-            UIEventTrigger.Get(m_Skill4.gameObject).OnUp = UpAttackButton;
-            UIEventTrigger.Get(m_Skill5.gameObject).OnUp = UpAttackButton;
-            UIEventTrigger.Get(m_Skill6.gameObject).OnUp = UpAttackButton;
-            UIEventTrigger.Get(m_Skill7.gameObject).OnUp = UpAttackButton;
-            UIEventTrigger.Get(m_SkillXp.gameObject).OnUp = UpAttackButton;
-        }
-
-        private void OnComplete()
-        {
-            if (_bool)
-            {
-                effect = EffectMgr.Instance.PlayUIEffect(1021, 1500, m_Attack.transform, false);
-                effect.OnComplete = OnComplete;
-            }
-        }
-
-        void DownAttackButton(GameObject go)
-        {
-            switch (go.name)
-            {
-                case "AttackBtn":
-                    preTime = Time.time;
-                    effect = EffectMgr.Instance.PlayUIEffect(1021, 1500, m_Attack.transform, false);
-                    effect.OnComplete = OnComplete;
-                    _bool = true;
-                    break;
-                case "Btn_Skill1":
-                    Prompting((int)SkillEffects.skillEffect_1);
-                    if (PlayerDatas.Instance.skill.GetQuickSkillByPos((int)SkillEffects.skillEffect_1) == null)
-                    {
-                        return;
-                    }
-                    BoolFb = true;
-                    AccordingBool = true;
-                    SkillsHole = (int)SkillEffects.skillEffect_1;
-                    SkillSelected1.SetActive(true);
-                    break;
-                case "Btn_Skill2":
-                    Prompting((int)SkillEffects.skillEffect_2);
-                    if (PlayerDatas.Instance.skill.GetQuickSkillByPos((int)SkillEffects.skillEffect_2) == null)
-                        return;
-                    BoolFb = true;
-                    AccordingBool = true;
-                    SkillsHole = (int)SkillEffects.skillEffect_2;
-                    SkillSelected2.SetActive(true);
-                    break;
-                case "Btn_Skill3":
-                    Prompting((int)SkillEffects.skillEffect_3);
-                    if (PlayerDatas.Instance.skill.GetQuickSkillByPos((int)SkillEffects.skillEffect_3) == null)
-                        return;
-                    BoolFb = true;
-                    AccordingBool = true;
-                    SkillsHole = (int)SkillEffects.skillEffect_3;
-                    SkillSelected3.SetActive(true);
-                    break;
-                case "Btn_Skill4":
-                    Prompting((int)SkillEffects.skillEffect_4);
-                    if (PlayerDatas.Instance.skill.GetQuickSkillByPos((int)SkillEffects.skillEffect_4) == null)
-                        return;
-                    BoolFb = true;
-                    AccordingBool = true;
-                    SkillsHole = (int)SkillEffects.skillEffect_4;
-                    SkillSelected4.SetActive(true);
-                    break;
-                case "Btn_Skill5":
-                    Prompting((int)SkillEffects.skillEffect_5);
-                    if (PlayerDatas.Instance.skill.GetQuickSkillByPos((int)SkillEffects.skillEffect_5) == null)
-                        return;
-                    BoolFb = true;
-                    AccordingBool = true;
-                    SkillsHole = (int)SkillEffects.skillEffect_5;
-                    SkillSelected5.SetActive(true);
-                    break;
-                case "Btn_Skill6":
-                    Prompting((int)SkillEffects.skillEffect_6);
-                    if (PlayerDatas.Instance.skill.GetQuickSkillByPos((int)SkillEffects.skillEffect_6) == null)
-                        return;
-                    BoolFb = true;
-                    AccordingBool = true;
-                    SkillsHole = (int)SkillEffects.skillEffect_6;
-                    SkillSelected6.SetActive(true);
-                    break;
-                case "Btn_Skill7":
-                    Prompting((int)SkillEffects.skillEffect_7);
-                    if (PlayerDatas.Instance.skill.GetQuickSkillByPos((int)SkillEffects.skillEffect_7) == null)
-                        return;
-                    BoolFb = true;
-                    AccordingBool = true;
-                    SkillsHole = (int)SkillEffects.skillEffect_7;
-                    SkillSelected7.SetActive(true);
-                    break;
-                case "Btn_SkillXp":
-                    Prompting((int)SkillEffects.skillEffect_xp);
-                    var skillModel = ModelCenter.Instance.GetModel<SkillModel>();
-                    var xpSkillId = skillModel.GetXpSkillID();
-                    if (PlayerDatas.Instance.skill.GetSKillById(xpSkillId) != null)
-                    {
-                        BoolFb = true;
-                        AccordingBool = true;
-                        SkillsHole = (int)SkillEffects.skillEffect_xp;
-                        SkillSelectedXp.SetActive(true);
-                    }
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        void UpAttackButton(GameObject go)
-        {
-            _currentime = 0;
-            TipShutDown(-1);
-            switch (go.name)
-            {
-                case "AttackBtn":
-                    _bool = false;
-                    if (effect != null)
-                    {
-                        if (Time.time - preTime < effect.duration)
-                        {
-                            effect.OnComplete = null;
-                        }
-                    }
-                    break;
-                case "Btn_Skill1":
-                    BoolFb = false;
-                    SkillSelected1.SetActive(false);
-                    break;
-                case "Btn_Skill2":
-                    BoolFb = false;
-                    SkillSelected2.SetActive(false);
-                    break;
-                case "Btn_Skill3":
-                    BoolFb = false;
-                    SkillSelected3.SetActive(false);
-                    break;
-                case "Btn_Skill4":
-                    BoolFb = false;
-                    SkillSelected4.SetActive(false);
-                    break;
-                case "Btn_Skill5":
-                    BoolFb = false;
-                    SkillSelected5.SetActive(false);
-                    break;
-                case "Btn_Skill6":
-                    BoolFb = false;
-                    SkillSelected6.SetActive(false);
-                    break;
-                case "Btn_Skill7":
-                    BoolFb = false;
-                    SkillSelected7.SetActive(false);
-                    break;
-                case "Btn_SkillXp":
-                    BoolFb = false;
-                    SkillSelectedXp.SetActive(false);
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        private Dictionary<int, int> _SkillAndPreTreasure = new Dictionary<int, int>();
-        void MagicWeapon()//娉曞疂鑾峰彇
-        {
-            var treasureModel = ModelCenter.Instance.GetModel<TreasureModel>();
-            var treasures = treasureModel.GetAllTreasure();
-
-            for (int i = 0; i < treasures.Count; i++)
-            {
-                Treasure treasure;
-                if (treasureModel.TryGetTreasure(treasures[i], out treasure))
-                {
-                    _SkillAndPreTreasure[treasure.skillId] = treasures[i];
-                }
-            }
-        }
-
-        private void LateUpdate()
-        {
-            if (BoolFb)
-            {
-                _currentime += Time.deltaTime;
-                if (_currentime >= TimeLong)
-                {
-                    if (AccordingBool)
-                    {
-                        DynamicallyCreate();
-                        AccordingBool = false;
-                    }
-
-                }
-            }
-        }
-
-        void DynamicallyCreate()
-        {
-            TipShutDown(SkillsHole);
-            switch ((SkillEffects)SkillsHole)
-            {
-                case SkillEffects.skillEffect_1:
-                    _LongPressShowPanel = Skill1Info.GetChild(0).GetComponent<LongPressShowPanel>();
-                    break;
-                case SkillEffects.skillEffect_2:
-                    _LongPressShowPanel = Skill2Info.GetChild(0).GetComponent<LongPressShowPanel>();
-                    break;
-                case SkillEffects.skillEffect_3:
-                    _LongPressShowPanel = Skill3Info.GetChild(0).GetComponent<LongPressShowPanel>();
-                    break;
-                case SkillEffects.skillEffect_4:
-                    _LongPressShowPanel = Skill4Info.GetChild(0).GetComponent<LongPressShowPanel>();
-                    break;
-                case SkillEffects.skillEffect_5:
-                    _LongPressShowPanel = Skill5Info.GetChild(0).GetComponent<LongPressShowPanel>();
-                    break;
-                case SkillEffects.skillEffect_6:
-                    _LongPressShowPanel = Skill6Info.GetChild(0).GetComponent<LongPressShowPanel>();
-                    break;
-                case SkillEffects.skillEffect_7:
-                    _LongPressShowPanel = Skill7Info.GetChild(0).GetComponent<LongPressShowPanel>();
-                    break;
-                case SkillEffects.skillEffect_xp:
-                    _LongPressShowPanel = XpSkillInfo.GetChild(0).GetComponent<LongPressShowPanel>();
-                    break;
-            }
-            PlayerSkillData _PlayerSkillData = null;
-            if ((SkillEffects)SkillsHole == SkillEffects.skillEffect_xp)
-            {
-                var skillModel = ModelCenter.Instance.GetModel<SkillModel>();
-                var xpSkillId = skillModel.GetXpSkillID();
-                _PlayerSkillData = PlayerDatas.Instance.skill.GetSKillById(xpSkillId);
-            }
-            else
-            {
-                _PlayerSkillData = PlayerDatas.Instance.skill.GetQuickSkillByPos(SkillsHole);
-            }
-            if (!_SkillAndPreTreasure.ContainsKey(_PlayerSkillData.id))
-            {
-                DebugEx.LogError("娉曞疂琛ㄦ病鏈夊搴旂殑鎶�鑳絀D" + _PlayerSkillData.id);
-                return;
-            }
-            else
-            {
-                int FBID = _SkillAndPreTreasure[_PlayerSkillData.id];
-                _LongPressShowPanel.Name.text = SkillConfig.Get(_PlayerSkillData.id).SkillName;
-                _LongPressShowPanel.Describe.text = SkillConfig.Get(_PlayerSkillData.id).Description;
-
-                var treasureConfig = TreasureConfig.Get(FBID);
-                _LongPressShowPanel.m_Icon.SetSprite(treasureConfig.Icon);
-            }
-
-        }
-
-
-        void TipShutDown(int _index)
-        {
-            Skill1Info.gameObject.SetActive((SkillEffects)_index == SkillEffects.skillEffect_1);
-            Skill2Info.gameObject.SetActive((SkillEffects)_index == SkillEffects.skillEffect_2);
-            Skill3Info.gameObject.SetActive((SkillEffects)_index == SkillEffects.skillEffect_3);
-            Skill4Info.gameObject.SetActive((SkillEffects)_index == SkillEffects.skillEffect_4);
-            Skill5Info.gameObject.SetActive((SkillEffects)_index == SkillEffects.skillEffect_5);
-            Skill6Info.gameObject.SetActive((SkillEffects)_index == SkillEffects.skillEffect_6);
-            Skill7Info.gameObject.SetActive((SkillEffects)_index == SkillEffects.skillEffect_7);
-            XpSkillInfo.gameObject.SetActive((SkillEffects)_index == SkillEffects.skillEffect_xp);
-        }
-
-        void Prompting(int _Skillindex)
-        {
-            if (PlayerDatas.Instance.skill.GetQuickSkillByPos(_Skillindex) == null)
-            {
-                switch ((SkillEffects)_Skillindex)
-                {
-                    case SkillEffects.skillEffect_1:
-                        SysNotifyMgr.Instance.ShowTip("Skill1Btn_Unlock");
-                        break;
-                    case SkillEffects.skillEffect_2:
-                        SysNotifyMgr.Instance.ShowTip("Skill2Btn_Unlock");
-                        break;
-                    case SkillEffects.skillEffect_3:
-                        SysNotifyMgr.Instance.ShowTip("Skill3Btn_Unlock");
-                        break;
-                    case SkillEffects.skillEffect_4:
-                        SysNotifyMgr.Instance.ShowTip("Skill4Btn_Unlock");
-                        break;
-                    case SkillEffects.skillEffect_5:
-                        SysNotifyMgr.Instance.ShowTip("Skill5Btn_Unlock");
-                        break;
-                    case SkillEffects.skillEffect_6:
-                        SysNotifyMgr.Instance.ShowTip("Skill6Btn_Unlock");
-                        break;
-                    case SkillEffects.skillEffect_7:
-                        SysNotifyMgr.Instance.ShowTip("Skill7Btn_Unlock");
-                        break;
-                    case SkillEffects.skillEffect_xp:
-                        var skillModel = ModelCenter.Instance.GetModel<SkillModel>();
-                        var xpSkillId = skillModel.GetXpSkillID();
-                        if (PlayerDatas.Instance.skill.GetSKillById(xpSkillId) == null)
-                        {
-                            SysNotifyMgr.Instance.ShowTip("SkillXpBtn_Unlock");
-                        }
-                        break;
-                }
-            }
-            else
-            {
-                int SkillID = PlayerDatas.Instance.skill.GetQuickSkillByPos(_Skillindex).id;
-                Skill _skill = PlayerDatas.Instance.hero.SkillMgr.Get(SkillID);
-                if (!_skill.IsValid())
-                {
-                    SysNotifyMgr.Instance.ShowTip("SkillBtn_CD");
-                }
-            }
-
-        }
-
-        private enum SkillEffects
-        {
-            skillEffect_1 = 0,
-            skillEffect_2 = 1,
-            skillEffect_3 = 2,
-            skillEffect_4 = 3,
-            skillEffect_5 = 4,
-            skillEffect_6 = 5,
-            skillEffect_7 = 6,
-            skillEffect_xp = 7,
-        }
     }
 
 }
diff --git a/System/MainWin/AttackButton.cs b/System/MainWin/AttackButton.cs
index 2455036..30a1c5f 100644
--- a/System/MainWin/AttackButton.cs
+++ b/System/MainWin/AttackButton.cs
@@ -93,6 +93,7 @@
                     attackEvent.Invoke();
                 }
 
+                EffectMgr.Instance.PlayUIEffect(1021, 1500, this.transform, false);
                 clickResponse = false;
             }
 
diff --git a/System/MainWin/MainWinSkillController.cs b/System/MainWin/MainWinSkillController.cs
new file mode 100644
index 0000000..a6e8335
--- /dev/null
+++ b/System/MainWin/MainWinSkillController.cs
@@ -0,0 +1,304 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Snxxz.UI
+{
+    public class MainWinSkillController : Singleton<MainWinSkillController>
+    {
+        const int SKILL_COUNT_MAX = 7;
+
+        public bool enable { get; set; }
+
+        public readonly LogicStruct<SkillCD> skillcd0 = new LogicStruct<SkillCD>();
+        public readonly LogicStruct<SkillCD> skillcd1 = new LogicStruct<SkillCD>();
+        public readonly LogicStruct<SkillCD> skillcd2 = new LogicStruct<SkillCD>();
+        public readonly LogicStruct<SkillCD> skillcd3 = new LogicStruct<SkillCD>();
+        public readonly LogicStruct<SkillCD> skillcd4 = new LogicStruct<SkillCD>();
+        public readonly LogicStruct<SkillCD> skillcd5 = new LogicStruct<SkillCD>();
+        public readonly LogicStruct<SkillCD> skillcd6 = new LogicStruct<SkillCD>();
+        public readonly LogicStruct<SkillCD> skillcd7 = new LogicStruct<SkillCD>();
+        public readonly LogicStruct<SkillCD> skillcdxp = new LogicStruct<SkillCD>();
+
+        public readonly LogicBool forbid0 = new LogicBool();
+        public readonly LogicBool forbid1 = new LogicBool();
+        public readonly LogicBool forbid2 = new LogicBool();
+        public readonly LogicBool forbid3 = new LogicBool();
+        public readonly LogicBool forbid4 = new LogicBool();
+        public readonly LogicBool forbid5 = new LogicBool();
+        public readonly LogicBool forbid6 = new LogicBool();
+        public readonly LogicBool forbid7 = new LogicBool();
+        public readonly LogicBool forbidxp = new LogicBool();
+
+        Dictionary<int, int> skillPlaceMap = new Dictionary<int, int>();
+        Dictionary<int, int> placeSkillMap = new Dictionary<int, int>();
+
+        SkillModel model { get { return ModelCenter.Instance.GetModel<SkillModel>(); } }
+
+        public MainWinSkillController()
+        {
+            PlayerSkillDatas.OnRefreshSkill -= OnSkillRefresh;
+            Skill.RefreshCD += OnSkillCDRefresh;
+
+            GA_Hero.OnStateEnter += OnSkillStateEnter;
+            GA_Hero.OnStateEnd += OnSkillStateEnd;
+
+            StatusMgr.OnGainCantCastSkillStatus += OnGainCantCastSkillStatus;
+            StatusMgr.OnReleaseCantCastSkillStatus += OnReleaseCantCastSkillStatus;
+        }
+
+        public void InitSkill()
+        {
+            skillPlaceMap.Clear();
+            placeSkillMap.Clear();
+            for (int i = 0; i < SKILL_COUNT_MAX; i++)
+            {
+                var skillData = PlayerDatas.Instance.skill.GetQuickSkillByPos(i);
+                placeSkillMap[i + 1] = skillData != null ? skillData.id : 0;
+                if (skillData != null)
+                {
+                    skillPlaceMap[skillData.id] = i + 1;
+                }
+            }
+
+            var blinkSkill = PlayerDatas.Instance.skill.GetSKillById(190);
+            placeSkillMap[0] = blinkSkill != null ? blinkSkill.id : 0;
+            if (blinkSkill != null)
+            {
+                skillPlaceMap[blinkSkill.id] = 0;
+            }
+
+            var skillXpId = model.GetXpSkillID();
+            var skillXpData = PlayerDatas.Instance.skill.GetSKillById(skillXpId);
+            placeSkillMap[8] = skillXpData != null ? skillXpData.id : 0;
+            if (skillXpData != null)
+            {
+                skillPlaceMap[skillXpId] = 8;
+            }
+
+            if (PlayerDatas.Instance.hero != null)
+            {
+                foreach (var skillId in skillPlaceMap.Keys)
+                {
+                    var skill = PlayerDatas.Instance.hero.SkillMgr.Get(skillId);
+                    if (skill != null)
+                    {
+                        UpdateSkillExclusiveCountDown(skillId, skill.cd, skill.skillInfo.config.CoolDownTime * Constants.F_GAMMA);
+                    }
+                }
+            }
+
+            UpdateSkillForbidStates();
+        }
+
+        public void Reset()
+        {
+            skillcd0.value = default(SkillCD);
+            skillcd1.value = default(SkillCD);
+            skillcd2.value = default(SkillCD);
+            skillcd3.value = default(SkillCD);
+            skillcd4.value = default(SkillCD);
+            skillcd5.value = default(SkillCD);
+            skillcd6.value = default(SkillCD);
+            skillcd7.value = default(SkillCD);
+            skillcdxp.value = default(SkillCD);
+
+            forbid0.value = false;
+            forbid1.value = false;
+            forbid2.value = false;
+            forbid3.value = false;
+            forbid4.value = false;
+            forbid5.value = false;
+            forbid6.value = false;
+            forbid7.value = false;
+            forbidxp.value = false;
+
+            skillPlaceMap.Clear();
+            placeSkillMap.Clear();
+        }
+
+        public LogicStruct<SkillCD> GetSkillCD(int index)
+        {
+            switch (index)
+            {
+                case 0:
+                    return skillcd0;
+                case 1:
+                    return skillcd1;
+                case 2:
+                    return skillcd2;
+                case 3:
+                    return skillcd3;
+                case 4:
+                    return skillcd4;
+                case 5:
+                    return skillcd5;
+                case 6:
+                    return skillcd6;
+                case 7:
+                    return skillcd7;
+                case 8:
+                    return skillcdxp;
+                default:
+                    return null;
+            }
+        }
+
+        public LogicBool GetSkillForbid(int index)
+        {
+            switch (index)
+            {
+                case 0:
+                    return forbid0;
+                case 1:
+                    return forbid1;
+                case 2:
+                    return forbid2;
+                case 3:
+                    return forbid3;
+                case 4:
+                    return forbid4;
+                case 5:
+                    return forbid5;
+                case 6:
+                    return forbid6;
+                case 7:
+                    return forbid7;
+                case 8:
+                    return forbidxp;
+                default:
+                    return null;
+            }
+        }
+
+        private void OnSkillRefresh()
+        {
+            InitSkill();
+        }
+
+        private void OnSkillCDRefresh(int skillId, float cd, float total)
+        {
+            UpdateSkillExclusiveCountDown(skillId, cd, total);
+        }
+
+        private void OnSkillStateEnter(float time)
+        {
+            UpdateSkillCommonCountDown(time);
+        }
+
+        private void OnSkillStateEnd()
+        {
+            UpdateSkillCommonCountDown(0);
+        }
+
+        private void OnGainCantCastSkillStatus(float duration)
+        {
+            UpdateSkillForbidStates();
+        }
+
+        private void OnReleaseCantCastSkillStatus()
+        {
+            UpdateSkillForbidStates();
+        }
+
+        private void UpdateSkillExclusiveCountDown(int skillId, float cd, float total)
+        {
+            if (skillPlaceMap.ContainsKey(skillId))
+            {
+                var place = skillPlaceMap[skillId];
+                var skillcd = GetSkillCD(place);
+                skillcd.value = skillcd.value.SetExclusiveCountDown(cd, total);
+            }
+        }
+
+        private void UpdateSkillCommonCountDown(float time)
+        {
+            for (int i = 0; i <= 8; i++)
+            {
+                if (placeSkillMap.ContainsKey(i) && placeSkillMap[i] != 0)
+                {
+                    var skillcd = GetSkillCD(i);
+                    skillcd.value = skillcd.value.SetCommonCountDown(time);
+                }
+            }
+        }
+
+        private void UpdateSkillForbidStates()
+        {
+            var forbid = !StatusMgr.Instance.CanCastSkill(PlayerDatas.Instance.baseData.PlayerID);
+            for (int i = 0; i <= 8; i++)
+            {
+                var skillForbid = GetSkillForbid(i);
+                skillForbid.value = forbid;
+            }
+        }
+
+        public struct SkillCD
+        {
+            public float exclusiveTotal;
+            public float exclusiveOverTime;
+            public float commonTotal;
+            public float commonOverTime;
+
+            public SkillCD SetCommonCountDown(float time)
+            {
+                commonTotal = time;
+                commonOverTime = Time.realtimeSinceStartup + time;
+
+                return this;
+            }
+
+            public SkillCD SetExclusiveCountDown(float cd, float total)
+            {
+                exclusiveTotal = total;
+                exclusiveOverTime = Time.realtimeSinceStartup + cd;
+
+                return this;
+            }
+
+            public bool IsCountDown()
+            {
+                if (exclusiveOverTime > Time.realtimeSinceStartup)
+                {
+                    return true;
+                }
+
+                if (commonOverTime > Time.realtimeSinceStartup)
+                {
+                    return true;
+                }
+
+                return false;
+            }
+
+            public float GetCountDownFillAmount()
+            {
+                if (exclusiveOverTime > Time.realtimeSinceStartup)
+                {
+                    return (exclusiveOverTime - Time.realtimeSinceStartup) / exclusiveTotal;
+                }
+
+                if (commonOverTime > Time.realtimeSinceStartup)
+                {
+                    return (commonOverTime - Time.realtimeSinceStartup) / commonTotal;
+                }
+
+                return 0f;
+            }
+
+            public float GetCountDown()
+            {
+                if (exclusiveOverTime > Time.realtimeSinceStartup)
+                {
+                    return exclusiveOverTime - Time.realtimeSinceStartup;
+                }
+
+                return 0f;
+            }
+
+        }
+
+
+    }
+}
+
diff --git a/System/MainWin/MainWinSkillController.cs.meta b/System/MainWin/MainWinSkillController.cs.meta
new file mode 100644
index 0000000..3cff3c0
--- /dev/null
+++ b/System/MainWin/MainWinSkillController.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 78c5929158f09c74dbdc5e481afcb400
+timeCreated: 1555070239
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/MainWin/SkillButton.cs b/System/MainWin/SkillButton.cs
index 6732b95..9866027 100644
--- a/System/MainWin/SkillButton.cs
+++ b/System/MainWin/SkillButton.cs
@@ -6,7 +6,6 @@
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine.UI;
-
 using UnityEngine.EventSystems;
 using UnityEngine.Events;
 
@@ -28,64 +27,32 @@
 
     public class SkillButton : SkillButtonInterface, IPointerExitHandler
     {
+        [SerializeField] int m_Index;
         [SerializeField] SkillTurnplate m_SkillTurnplate;
-        [SerializeField] Image m_Icon;
-        public Image icon { get { return m_Icon; } }
+        [SerializeField] ImageEx m_Icon;
         [SerializeField] Transform m_Locked;
-        public Transform locked
-        {
-            get
-            {
-                return m_Locked;
-            }
-        }
-
         [SerializeField] Text m_CoolDown;
         [SerializeField] Image m_CoolDownMask;
         [SerializeField] ScaleTween m_ScaleTween;
+        [SerializeField] Image m_Selected;
+        [SerializeField] LongPressShowPanel m_SkillTip;
 
-        [Header("閬僵鏄惁鍙嶅悜")]
-        public bool Isreverse = false;
+        public Image icon { get { return m_Icon; } }
+        public Transform locked { get { return m_Locked; } }
+
         UIEvent skillEvent1 = new UIEvent();
         UIEvent skillEvent2 = new UIEvent();
 
         bool isExit = false;
 
-        float m_TotalCoolDown = 0f;
-        public float totalCoolDown
-        {
-            get
-            {
-                return m_TotalCoolDown;
-            }
-            set
-            {
-                m_TotalCoolDown = value;
-            }
-        }
-
-        float m_CoolDownCompleteTime = 0f;
-        public float coolDownCompleteTime
-        {
-            get
-            {
-                return m_CoolDownCompleteTime;
-            }
-            set
-            {
-                m_CoolDownCompleteTime = value;
-            }
-        }
-
+        bool inCountDown = false;
         float timer = 0f;
-        PlayerSkillData m_SkillData = null;
-        Skill skillBuf = null;
-        float fillAmountRevise = 1f;
+        int skillId = 0;
 
-        public void SetSkillData(PlayerSkillData _skillData)
+        public void Initialize(int skillId)
         {
-            m_SkillData = _skillData;
-            if (m_SkillData == null)
+            this.skillId = skillId;
+            if (this.skillId == 0)
             {
                 locked.gameObject.SetActive(true);
                 m_Icon.gameObject.SetActive(false);
@@ -98,30 +65,32 @@
                     locked.gameObject.SetActive(false);
                     m_Icon.gameObject.SetActive(true);
                 }
-                var skillConfig = m_SkillData.skillCfg;
+
+                var skillConfig = SkillConfig.Get(this.skillId);
                 m_Icon.SetSprite(skillConfig.IconName);
-
-                if (skillBuf != null)
-                {
-                    skillBuf.RefreshCD -= OnSkillCDRefresh;
-                }
-
-                if (PlayerDatas.Instance.hero != null)
-                {
-                    skillBuf = PlayerDatas.Instance.hero.SkillMgr.Get(m_SkillData.id);
-                    OnSkillCDRefresh(skillBuf.cd, skillBuf.skillInfo.config.CoolDownTime * Constants.F_GAMMA);
-                    skillBuf.RefreshCD += OnSkillCDRefresh;
-                }
             }
 
+            DisplaySkillDynamicInfo(true);
+            m_Selected.gameObject.SetActive(false);
+            HideSkillTip();
+
+            this.enabled = true;
         }
 
         public void Dispose()
         {
-            if (skillBuf != null)
+            if (showSkillTipClock != null)
             {
-                skillBuf.RefreshCD -= OnSkillCDRefresh;
+                Clock.Stop(showSkillTipClock);
+                showSkillTipClock = null;
             }
+
+            if (m_Index != 0)
+            {
+                HideSkillTip();
+            }
+
+            this.enabled = false;
         }
 
         public void AddDownListener(UnityAction _action)
@@ -140,72 +109,55 @@
             skillEvent2.RemoveAllListeners();
         }
 
-        /// <summary>
-        /// 鍓╀綑CD鍜屾�籆D閮芥槸姣
-        /// </summary>
-        /// <param name="_cd"></param>
-        /// <param name="_totalCD"></param>
-        private void OnSkillCDRefresh(float _cd, float _totalCD)
-        {
-            totalCoolDown = _totalCD;
-            coolDownCompleteTime = Time.time + _cd;
-            timer = 0f;
-        }
-
         private void LateUpdate()
         {
-            if (m_CoolDownCompleteTime > Time.time)
+            DisplaySkillDynamicInfo(false);
+
+            if (inCountDown)
             {
-                var cd = m_CoolDownCompleteTime - Time.time;
-                if (!m_CoolDown.gameObject.activeInHierarchy)
+                if (!m_CoolDown.gameObject.activeSelf)
                 {
                     m_CoolDown.gameObject.SetActive(true);
                 }
 
-                if (m_CoolDownMask != null && !m_CoolDownMask.gameObject.activeInHierarchy)
+                if (m_CoolDownMask != null && !m_CoolDownMask.gameObject.activeSelf)
                 {
                     m_CoolDownMask.gameObject.SetActive(true);
                 }
 
                 if (m_CoolDownMask != null)
                 {
-                    if (Isreverse)
-                    {
-                        float flo = cd / totalCoolDown;
-                        m_CoolDownMask.fillAmount = 1.0f - flo;
-                    }
-                    else
-                    {
-                        m_CoolDownMask.fillAmount = cd / totalCoolDown;
-                    }
+                    m_CoolDownMask.fillAmount = MainWinSkillController.Instance.GetSkillCD(m_Index).value.GetCountDownFillAmount();
                 }
 
                 timer -= Time.deltaTime;
                 if (timer < 0f)
                 {
-                    m_CoolDown.text = cd.ToString("f0");
+                    var countDown = MainWinSkillController.Instance.GetSkillCD(m_Index).value.GetCountDown();
+                    if (countDown > 1)
+                    {
+                        m_CoolDown.text = countDown.ToString("f0");
+                    }
+                    else
+                    {
+                        m_CoolDown.text = "";
+                    }
+
                     timer += 1f;
                 }
             }
             else
             {
-                if (m_CoolDown.gameObject.activeInHierarchy)
+                if (m_CoolDown.gameObject.activeSelf)
                 {
                     m_CoolDown.gameObject.SetActive(false);
                 }
 
                 if (m_CoolDownMask != null)
                 {
-                    if (Isreverse)
+                    if (m_CoolDownMask.gameObject.activeSelf)
                     {
-                        m_CoolDownMask.fillAmount = 1;
-                    }
-                    else
-                    {
-                        if (m_CoolDownMask.gameObject.activeInHierarchy)
-                        {
-                            m_CoolDownMask.gameObject.SetActive(false);
-                        }
+                        m_CoolDownMask.gameObject.SetActive(false);
                     }
                 }
 
@@ -216,21 +168,34 @@
         public override void OnPointerDown(PointerEventData eventData)
         {
             base.OnPointerDown(eventData);
-
+            ProcessForbid();
             PassEvent(eventData, ExecuteEvents.pointerDownHandler);
 
-            if (m_SkillData == null)
+            if (this.skillId == 0)
             {
                 return;
             }
+
             if (m_ScaleTween != null)
             {
                 m_ScaleTween.Play();
             }
 
-            skillEvent1.Invoke();
-            isExit = false;
+            m_Selected.gameObject.SetActive(true);
 
+            skillEvent1.Invoke();
+
+            if (m_Index != 0)
+            {
+                if (showSkillTipClock != null)
+                {
+                    Clock.Stop(showSkillTipClock);
+                }
+
+                showSkillTipClock = Clock.AlarmAfter(1, ShowSkillTip);
+            }
+
+            isExit = false;
         }
 
         public override void OnPointerUp(PointerEventData eventData)
@@ -239,18 +204,32 @@
 
             PassEvent(eventData, ExecuteEvents.pointerUpHandler);
 
-            if (m_SkillData == null)
+            if (this.skillId == 0)
             {
                 return;
             }
+
             if (m_ScaleTween != null)
             {
                 m_ScaleTween.Play(true);
             }
 
+            m_Selected.gameObject.SetActive(false);
+
             if (isExit == false)
             {
                 skillEvent2.Invoke();
+            }
+
+            if (showSkillTipClock != null)
+            {
+                Clock.Stop(showSkillTipClock);
+                showSkillTipClock = null;
+            }
+
+            if (m_Index != 0)
+            {
+                HideSkillTip();
             }
         }
 
@@ -283,6 +262,152 @@
             }
 
         }
+
+        private void Awake()
+        {
+            Skill.OnSkillCDFinished += OnSkillPrepared;
+            Skill.OnSkillCast += OnSkillCast;
+        }
+
+        private void OnDestroy()
+        {
+            Skill.OnSkillCDFinished += OnSkillPrepared;
+            Skill.OnSkillCast += OnSkillCast;
+        }
+
+        private void OnSkillPrepared(int skillId)
+        {
+            if (!this.enabled)
+            {
+                return;
+            }
+
+            if (this.skillId != skillId)
+            {
+                return;
+            }
+
+            EffectMgr.Instance.PlayUIEffect(1024, 1500, this.transform, false);
+        }
+
+        private void OnSkillCast(uint playerInstanceId, int skillId)
+        {
+            if (!this.enabled)
+            {
+                return;
+            }
+
+            if (playerInstanceId != PlayerDatas.Instance.PlayerId)
+            {
+                return;
+            }
+
+            if (this.skillId != skillId)
+            {
+                return;
+            }
+
+            EffectMgr.Instance.PlayUIEffect(1023, 1500, this.transform, false);
+        }
+
+        private void ProcessForbid()
+        {
+            var isUnLocked = this.skillId != 0;
+            if (!isUnLocked)
+            {
+                switch (m_Index)
+                {
+                    case 1:
+                        SysNotifyMgr.Instance.ShowTip("Skill1Btn_Unlock");
+                        break;
+                    case 2:
+                        SysNotifyMgr.Instance.ShowTip("Skill2Btn_Unlock");
+                        break;
+                    case 3:
+                        SysNotifyMgr.Instance.ShowTip("Skill3Btn_Unlock");
+                        break;
+                    case 4:
+                        SysNotifyMgr.Instance.ShowTip("Skill4Btn_Unlock");
+                        break;
+                    case 5:
+                        SysNotifyMgr.Instance.ShowTip("Skill5Btn_Unlock");
+                        break;
+                    case 6:
+                        SysNotifyMgr.Instance.ShowTip("Skill6Btn_Unlock");
+                        break;
+                    case 7:
+                        SysNotifyMgr.Instance.ShowTip("Skill7Btn_Unlock");
+                        break;
+                    case 8:
+                        SysNotifyMgr.Instance.ShowTip("SkillXpBtn_Unlock");
+                        break;
+                }
+
+                return;
+            }
+
+            if (PlayerDatas.Instance.hero == null)
+            {
+                return;
+            }
+
+            var skill = PlayerDatas.Instance.hero.SkillMgr.Get(this.skillId);
+            if (!skill.IsValid())
+            {
+                SysNotifyMgr.Instance.ShowTip("SkillBtn_CD");
+                return;
+            }
+        }
+
+        Clock showSkillTipClock;
+        private void ShowSkillTip()
+        {
+            if (this.skillId == 0)
+            {
+                return;
+            }
+
+            if (m_SkillTip)
+            {
+                m_SkillTip.gameObject.SetActive(true);
+                m_SkillTip.Display(this.skillId);
+            }
+        }
+
+        private void HideSkillTip()
+        {
+            if (m_SkillTip)
+            {
+                m_SkillTip.gameObject.SetActive(false);
+            }
+        }
+
+        private void DisplaySkillDynamicInfo(bool force)
+        {
+            var skillCd = MainWinSkillController.Instance.GetSkillCD(m_Index);
+            if (force || skillCd.dirty)
+            {
+                var data = skillCd.Fetch();
+                inCountDown = data.IsCountDown();
+
+                var countDown = MainWinSkillController.Instance.GetSkillCD(m_Index).value.GetCountDown();
+                if (countDown > 0)
+                {
+                    m_CoolDown.text = countDown.ToString("f0");
+                }
+                else
+                {
+                    m_CoolDown.text = "";
+                }
+            }
+
+            var skillForbid = MainWinSkillController.Instance.GetSkillForbid(m_Index);
+            if (force || skillForbid.dirty)
+            {
+                m_Icon.gray = skillForbid.Fetch();
+            }
+        }
+
     }
 
 }
diff --git a/System/MainWin/SkillContainer.cs b/System/MainWin/SkillContainer.cs
index 76d8544..8ff1f2a 100644
--- a/System/MainWin/SkillContainer.cs
+++ b/System/MainWin/SkillContainer.cs
@@ -3,7 +3,6 @@
 //    [  Date ]:           Saturday, September 02, 2017
 //--------------------------------------------------------
 using UnityEngine;
-
 using UnityEngine.UI;
 using System.Collections.Generic;
 
@@ -49,7 +48,7 @@
         public SkillButton skillXP { get { return m_SkillXP; } }
 
         const int SKILL_COUNT_MAX = 8;
-        Dictionary<int, PlayerSkillData> indexSkillDataDict = new Dictionary<int, PlayerSkillData>();
+        Dictionary<int, int> indexSkillDataDict = new Dictionary<int, int>();
 
         public void Init()
         {
@@ -77,6 +76,7 @@
             m_Skill7.AddUpListener(PrepareCastSkill7);
             m_SkillXP.AddUpListener(PrepareCastSkillXp);
 
+            MainWinSkillController.Instance.InitSkill();
             OnSkillRefresh();
             HandleAchievement();
             PlayerSkillDatas.OnRefreshSkill += OnSkillRefresh;
@@ -95,7 +95,18 @@
             m_Skill5.RemoveAllListeners();
             m_Skill6.RemoveAllListeners();
             m_Skill7.RemoveAllListeners();
-            skillXP.RemoveAllListeners();
+            skillXP.RemoveAllListeners();
+
+            m_BlinkSkill.Dispose();
+            m_Skill1.Dispose();
+            m_Skill2.Dispose();
+            m_Skill3.Dispose();
+            m_Skill4.Dispose();
+            m_Skill5.Dispose();
+            m_Skill6.Dispose();
+            m_Skill7.Dispose();
+            skillXP.Dispose();
+
             PlayerSkillDatas.OnRefreshSkill -= OnSkillRefresh;
             if (AchievementGoto.achievementType == AchievementGoto.ExcuteSkill)
             {
@@ -107,22 +118,25 @@
         {
             for (int i = 0; i < SKILL_COUNT_MAX; i++)
             {
-                indexSkillDataDict[i] = PlayerDatas.Instance.skill.GetQuickSkillByPos(i);
+                var skillData = PlayerDatas.Instance.skill.GetQuickSkillByPos(i);
+                indexSkillDataDict[i] = skillData == null ? 0 : skillData.id;
             }
 
-            m_Skill1.SetSkillData(indexSkillDataDict[0]);
-            m_Skill2.SetSkillData(indexSkillDataDict[1]);
-            m_Skill3.SetSkillData(indexSkillDataDict[2]);
-            m_Skill4.SetSkillData(indexSkillDataDict[3]);
-            m_Skill5.SetSkillData(indexSkillDataDict[4]);
-            m_Skill6.SetSkillData(indexSkillDataDict[5]);
-            m_Skill7.SetSkillData(indexSkillDataDict[6]);
+            m_Skill1.Initialize(indexSkillDataDict[0]);
+            m_Skill2.Initialize(indexSkillDataDict[1]);
+            m_Skill3.Initialize(indexSkillDataDict[2]);
+            m_Skill4.Initialize(indexSkillDataDict[3]);
+            m_Skill5.Initialize(indexSkillDataDict[4]);
+            m_Skill6.Initialize(indexSkillDataDict[5]);
+            m_Skill7.Initialize(indexSkillDataDict[6]);
 
-            m_BlinkSkill.SetSkillData(PlayerDatas.Instance.skill.GetSKillById(190));
+            var blinkSkillData = PlayerDatas.Instance.skill.GetSKillById(190);
+            m_BlinkSkill.Initialize(blinkSkillData == null ? 0 : blinkSkillData.id);
 
             var model = ModelCenter.Instance.GetModel<SkillModel>();
-            var skillXpId = model.GetXpSkillID();
-            m_SkillXP.SetSkillData(PlayerDatas.Instance.skill.GetSKillById(skillXpId));          
+            var skillXpId = model.GetXpSkillID();
+            var skillXpData = PlayerDatas.Instance.skill.GetSKillById(skillXpId);
+            m_SkillXP.Initialize(skillXpData != null ? skillXpId : 0);
         }
 
         void SwitchTarget()
@@ -154,86 +168,79 @@
 
         void CastSkill1()
         {
-            if (indexSkillDataDict[0] == null)
+            if (indexSkillDataDict[0] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoCastSkill(indexSkillDataDict[0].id);
-
+            DoCastSkill(indexSkillDataDict[0]);
         }
 
         void CastSkill2()
         {
-
-            if (indexSkillDataDict[1] == null)
+            if (indexSkillDataDict[1] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoCastSkill(indexSkillDataDict[1].id);
+            DoCastSkill(indexSkillDataDict[1]);
         }
 
         void CastSkill3()
         {
-
-            if (indexSkillDataDict[2] == null)
+            if (indexSkillDataDict[2] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoCastSkill(indexSkillDataDict[2].id);
+            DoCastSkill(indexSkillDataDict[2]);
         }
 
         void CastSkill4()
         {
-
-            if (indexSkillDataDict[3] == null)
+            if (indexSkillDataDict[3] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoCastSkill(indexSkillDataDict[3].id);
+            DoCastSkill(indexSkillDataDict[3]);
         }
 
         void CastSkill5()
         {
-
-            if (indexSkillDataDict[4] == null)
+            if (indexSkillDataDict[4] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoCastSkill(indexSkillDataDict[4].id);
+            DoCastSkill(indexSkillDataDict[4]);
         }
 
         void CastSkill6()
         {
-
-            if (indexSkillDataDict[5] == null)
+            if (indexSkillDataDict[5] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoCastSkill(indexSkillDataDict[5].id);
+            DoCastSkill(indexSkillDataDict[5]);
         }
 
         void CastSkill7()
         {
-
-            if (indexSkillDataDict[6] == null)
+            if (indexSkillDataDict[6] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoCastSkill(indexSkillDataDict[6].id);
+            DoCastSkill(indexSkillDataDict[6]);
         }
 
         void CastSkillXp()
@@ -245,86 +252,85 @@
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
-            DoCastSkill(skillXpId);          
+            DoCastSkill(skillXpId);
         }
 
         void PrepareCastSkill1()
         {
-            if (indexSkillDataDict[0] == null)
+            if (indexSkillDataDict[0] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoPrepareCast(indexSkillDataDict[0].id);
+            DoPrepareCast(indexSkillDataDict[0]);
         }
 
         void PrepareCastSkill2()
         {
 
-            if (indexSkillDataDict[1] == null)
+            if (indexSkillDataDict[1] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoPrepareCast(indexSkillDataDict[1].id);
+            DoPrepareCast(indexSkillDataDict[1]);
         }
 
         void PrepareCastSkill3()
         {
-
-            if (indexSkillDataDict[2] == null)
+            if (indexSkillDataDict[2] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoPrepareCast(indexSkillDataDict[2].id);
+            DoPrepareCast(indexSkillDataDict[2]);
         }
 
         void PrepareCastSkill4()
         {
-            if (indexSkillDataDict[3] == null)
+            if (indexSkillDataDict[3] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoPrepareCast(indexSkillDataDict[3].id);
+            DoPrepareCast(indexSkillDataDict[3]);
         }
 
         void PrepareCastSkill5()
         {
-            if (indexSkillDataDict[4] == null)
+            if (indexSkillDataDict[4] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoPrepareCast(indexSkillDataDict[4].id);
+            DoPrepareCast(indexSkillDataDict[4]);
         }
 
         void PrepareCastSkill6()
         {
-            if (indexSkillDataDict[5] == null)
+            if (indexSkillDataDict[5] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoPrepareCast(indexSkillDataDict[5].id);
+            DoPrepareCast(indexSkillDataDict[5]);
         }
 
         void PrepareCastSkill7()
         {
-            if (indexSkillDataDict[6] == null)
+            if (indexSkillDataDict[6] == 0)
             {
                 DebugEx.Log("鎶�鑳芥湭瑙i攣");
                 return;
             }
 
-            DoPrepareCast(indexSkillDataDict[6].id);
+            DoPrepareCast(indexSkillDataDict[6]);
         }
 
         void PrepareCastSkillXp()
diff --git a/System/NewBieGuidance/NewBieWin.cs b/System/NewBieGuidance/NewBieWin.cs
index 038f960..56a821e 100644
--- a/System/NewBieGuidance/NewBieWin.cs
+++ b/System/NewBieGuidance/NewBieWin.cs
@@ -95,7 +95,7 @@
                 DisplayFunctionUnLock(config.Condition);
                 if (config.Steps == null || config.Steps.Length == 0)
                 {
-                    Clock.Create(5,
+                    Clock.AlarmAfter(5,
                         () =>
                         {
                             var guideId = config.ID;
diff --git a/System/Skill/TreasureSkillWin.cs b/System/Skill/TreasureSkillWin.cs
index dd04b35..e780213 100644
--- a/System/Skill/TreasureSkillWin.cs
+++ b/System/Skill/TreasureSkillWin.cs
@@ -93,9 +93,10 @@
             {
                 m_TreasurePotentials[i].StopUnlock();
             }
+
             foreach (var clock in clocks)
             {
-                clock.Stop();
+                Clock.Stop(clock);
             }
             clocks.Clear();
         }
@@ -248,11 +249,13 @@
             {
                 m_TreasurePotentials[i].StopUnlock();
             }
+
             foreach (var clock in clocks)
             {
-                clock.Stop();
+                Clock.Stop(clock);
             }
             clocks.Clear();
+
             m_Controller.m_Scorller.RefreshActiveCellViews();
             DisplaySkillDetial();
             DisplayPotentials();
@@ -278,7 +281,7 @@
                         {
                             m_TreasurePotentials[index].StartUnlock();
                             Clock clock = null;
-                            clock = Clock.Create(1, () =>
+                            clock = Clock.AlarmAfter(1, () =>
                               {
                                   DisplayPotential(index);
                                   if (clock != null && clocks.Contains(clock))
diff --git a/System/Team/TeamModel.cs b/System/Team/TeamModel.cs
index 42ae1c4..2980abd 100644
--- a/System/Team/TeamModel.cs
+++ b/System/Team/TeamModel.cs
@@ -133,16 +133,16 @@
                         }
                     }
 
-                    if (m_MatchingClock != null && m_MatchingClock.isActiveAndEnabled)
+                    if (m_MatchingClock != null )
                     {
-                        m_MatchingClock.Stop();
+                        Clock.Stop(m_MatchingClock);
                         m_MatchingClock = null;
                     }
 
                     if (m_IsMatching)
                     {
                         matchingEndTime = DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond * GeneralDefine.teamMatchingTimeOut);
-                        m_MatchingClock = Clock.Create(matchingEndTime, OnMatchingCoolDownEnd);
+                        m_MatchingClock = Clock.AlarmAt(matchingEndTime, OnMatchingCoolDownEnd);
                     }
 
                     if (matchingStateChangeEvent != null)
diff --git a/Utility/Clock.cs b/Utility/Clock.cs
index 71158d4..2998e8c 100644
--- a/Utility/Clock.cs
+++ b/Utility/Clock.cs
@@ -1,80 +1,85 @@
 锘縰sing System;
 using UnityEngine;
+using System.Collections.Generic;
 using UnityEngine.Events;
 
-public class Clock : MonoBehaviour
+public class Clock
 {
-    public bool stopped { get; private set; }
-
-    public DateTime alarmTime {
-        get; set;
-    }
-
+    DateTime alarmTime;
     UnityAction alarmCallBack;
 
-    public void AddListener(UnityAction _action)
+    public Clock(DateTime alarmTime, UnityAction callBack)
     {
-        alarmCallBack += _action;
+        this.alarmTime = alarmTime;
+        this.alarmCallBack = callBack;
     }
 
-    public void Stop()
+    public bool CanAlarm()
     {
-        stopped = true;
-        GameObject.Destroy(this.gameObject);
+        return DateTime.Now >= alarmTime;
     }
 
-    private void Awake()
+    public void Execute()
     {
-        this.gameObject.hideFlags = HideFlags.HideInHierarchy;
-    }
-
-    private void LateUpdate()
-    {
-        if (System.DateTime.Now > alarmTime)
+        if (alarmCallBack != null)
         {
-            try
+            alarmCallBack();
+            alarmCallBack = null;
+        }
+    }
+
+    static List<Clock> clocks = new List<Clock>();
+
+    public static void Init()
+    {
+        new LogicUpdate().Start(OnUpdate);
+    }
+
+    public static Clock AlarmAt(DateTime alarmTime, UnityAction callBack)
+    {
+        var clock = new Clock(alarmTime, callBack);
+
+        clocks.Add(clock);
+        return clock;
+    }
+
+    public static Clock AlarmAfter(int seconds, UnityAction callBack)
+    {
+        var clock = new Clock(DateTime.Now.AddSeconds(seconds), callBack);
+
+        clocks.Add(clock);
+        return clock;
+    }
+
+    public static void Stop(Clock clock)
+    {
+        if (clocks.Contains(clock))
+        {
+            clocks.Remove(clock);
+        }
+    }
+
+    static void OnUpdate()
+    {
+        for (var i = clocks.Count - 1; i >= 0; i--)
+        {
+            var clock = clocks[i];
+            if (clock.CanAlarm())
             {
-                if (alarmCallBack != null)
+                try
                 {
-                    alarmCallBack();
-                    alarmCallBack = null;
+                    clock.Execute();
+                }
+                catch (Exception e)
+                {
+                    Debug.LogException(e);
+                }
+                finally
+                {
+                    clocks.RemoveAt(i);
                 }
             }
-            catch (System.Exception ex)
-            {
-                DebugEx.Log(ex);
-            }
-            finally
-            {
-                Stop();
-            }
         }
-
-    }
-
-
-    public static Clock Create(DateTime _alarmTime, UnityAction _action)
-    {
-        var carrier = new GameObject();
-        GameObject.DontDestroyOnLoad(carrier);
-
-        var clock = carrier.AddComponent<Clock>();
-        clock.alarmTime = _alarmTime;
-        clock.AddListener(_action);
-
-        return clock;
-    }
-
-    public static Clock Create(int _seconds, UnityAction _action)
-    {
-        var carrier = new GameObject();
-        GameObject.DontDestroyOnLoad(carrier);
-
-        var clock = carrier.AddComponent<Clock>();
-        clock.alarmTime = System.DateTime.Now + new TimeSpan(_seconds * TimeSpan.TicksPerSecond);
-        clock.AddListener(_action);
-
-        return clock;
     }
 
 }

--
Gitblit v1.8.0