From bd19eadbee8a0d3ec67c36a166a8cca4f87f454e Mon Sep 17 00:00:00 2001
From: client_Wu Xijin <364452445@qq.com>
Date: 星期一, 15 十月 2018 14:44:33 +0800
Subject: [PATCH] Merge branch 'master' into UserCenter

---
 Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA17_tagMCFlashSaleInfo.cs                               |   81 ++
 Fight/GameActor/GActorNpcNoFight.cs                                                                       |   13 
 Core/GameEngine/SnxxzGame.cs                                                                              |    8 
 Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA17_tagMCFlashSaleInfo.cs                     |   20 
 System/OpenServerActivity/OpenServerActivityNotifyBase.cs.meta                                            |   12 
 System/OpenServerActivity/OpenServerActivityNotifyModel.cs.meta                                           |   12 
 System/OpenServerActivity/FlashSaleItemCell.cs                                                            |  186 +++++
 System/Welfare/OperationTimeHepler.cs                                                                     |   42 +
 Fight/GameActor/GActorNpcFight.cs                                                                         |   37 
 Core/GameEngine/DataToCtl/PackageRegedit.cs                                                               |    2 
 System/OpenServerActivity/FlashRushToBuyModel.cs.meta                                                     |   12 
 Utility/DebugMousePos.cs                                                                                  |   37 +
 Core/NetworkPackage/DebugPkgCache.cs                                                                      |   17 
 System/OpenServerActivity/FlashRushToBuyNotify.cs.meta                                                    |   12 
 System/Vip/VipInvest/WheelOfFortuneModel.cs                                                               |   13 
 Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0104_tagServerDisconnect.cs                          |    9 
 System/SystemSetting/ActivitiesPushMgr.cs                                                                 |  110 ++
 Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA18_tagMCFlashSaleAppointmentInfo.cs.meta     |   12 
 Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA17_tagMCFlashSaleInfo.cs.meta                          |   12 
 Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA18_tagMCFlashSaleAppointmentInfo.cs          |   22 
 System/OpenServerActivity/OperationFlashRushToBuy.cs                                                      |  172 ++++
 System/OpenServerActivity/OpenServerActivityNotifyBase.cs                                                 |   34 
 System/OpenServerActivity/OpenServerActivityWin.cs                                                        |   11 
 System/OpenServerActivity/OperationFlashRushToBuy.cs.meta                                                 |   12 
 Utility/GlobalTimeEvent.cs                                                                                |   22 
 Fight/GameActor/GA_NpcCollect.cs                                                                          |   11 
 Core/NetworkPackage/ClientPack/ClientToMapServer/CAA SaleActivity/CAA05_tagCMFlashSaleAppointment.cs.meta |   12 
 System/OpenServerActivity/OpenServerActivityNotifyWin.cs                                                  |   54 +
 System/OpenServerActivity/OpenServerActivityNotifyModel.cs                                                |  193 +++++
 System/OpenServerActivity/ImpactRankModel.cs                                                              |    2 
 System/OpenServerActivity/FlashSaleTimeCell.cs.meta                                                       |   12 
 Core/NetworkPackage/DTCFile/ClientPack/ClientToMapServer.meta                                             |    9 
 System/OpenServerActivity/FlashRushToBuyCoolDown.cs.meta                                                  |   12 
 System/OpenServerActivity/FlashSaleItemCell.cs.meta                                                       |   12 
 Core/NetworkPackage/ClientPack/ClientToMapServer/CAA SaleActivity/CAA05_tagCMFlashSaleAppointment.cs      |   20 
 Utility/DebugMousePos.cs.meta                                                                             |   12 
 System/Launch/LaunchWin.cs                                                                                |   59 +
 System/OpenServerActivity/FlashRushToBuyModel.cs                                                          |  363 +++++++++
 System/OpenServerActivity/FlashRushToBuyWin.cs                                                            |  126 +++
 System/OpenServerActivity/FlashSaleTimeCell.cs                                                            |   87 ++
 Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA17_tagMCFlashSaleInfo.cs.meta                |   12 
 Fight/GameActor/GActorPlayerBase.cs                                                                       |   14 
 System/Vip/VipInvest/WheelOfFortuneWin.cs                                                                 |   10 
 Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA18_tagMCFlashSaleAppointmentInfo.cs.meta               |   12 
 System/OpenServerActivity/OpenServerActivityNotifyWin.cs.meta                                             |   12 
 Core/NetworkPackage/DTCFile/ClientPack.meta                                                               |    9 
 System/GMCommand/GMInputWin.cs                                                                            |   16 
 Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA18_tagMCFlashSaleAppointmentInfo.cs                    |   31 
 System/KnapSack/Logic/PackSendQuestMgr.cs                                                                 |    2 
 System/OpenServerActivity/FlashRushToBuyWin.cs.meta                                                       |   12 
 Core/ResModule/InstanceResourcesLoader.cs                                                                 |   24 
 System/OpenServerActivity/FlashRushToBuyCoolDown.cs                                                       |   85 ++
 Core/NetworkPackage/GameNetSystem.cs                                                                      |    2 
 System/Vip/VipInvest/RotatePointer.cs                                                                     |    4 
 System/WindowBase/ModelCenter.cs                                                                          |    2 
 System/OpenServerActivity/FlashRushToBuyNotify.cs                                                         |   35 
 Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA003_tagUniversalGameRecInfo.cs                         |    3 
 57 files changed, 2,137 insertions(+), 52 deletions(-)

diff --git a/Core/GameEngine/DataToCtl/PackageRegedit.cs b/Core/GameEngine/DataToCtl/PackageRegedit.cs
index 0f95b75..5fd7ca9 100644
--- a/Core/GameEngine/DataToCtl/PackageRegedit.cs
+++ b/Core/GameEngine/DataToCtl/PackageRegedit.cs
@@ -369,6 +369,8 @@
         Register(typeof(HA318_tagMCFreeGoodsInfo), typeof(DTCA318_tagMCFreeGoodsInfo));
         Register(typeof(HAA12_tagMCFlashGiftbagInfo), typeof(DTCAA12_tagMCFlashGiftbagInfo));
         Register(typeof(HAA13_tagMCFlashGiftbagPlayerInfo), typeof(DTCAA13_tagMCFlashGiftbagPlayerInfo));
+        Register(typeof(HAA17_tagMCFlashSaleInfo), typeof(DTCAA17_tagMCFlashSaleInfo));
+        Register(typeof(HAA18_tagMCFlashSaleAppointmentInfo), typeof(DTCAA18_tagMCFlashSaleAppointmentInfo));
 
         #region 浠欑晫鐩涘吀
         Register(typeof(HAC09_tagGCFairyCeremonyInfo), typeof(DTCAC09_tagGCFairyCeremonyInfo));
diff --git a/Core/GameEngine/SnxxzGame.cs b/Core/GameEngine/SnxxzGame.cs
index 315f3ea..9e3884f 100644
--- a/Core/GameEngine/SnxxzGame.cs
+++ b/Core/GameEngine/SnxxzGame.cs
@@ -71,16 +71,16 @@
 
                 for (int i = 0; i < row + 1; ++i)
                 {
-                    _start = new Vector3(_startX, _hero.Pos.y + 0.1f, _startZ + i * size);
-                    _end = new Vector3(_startX + column * .5f, _hero.Pos.y + 0.1f, _startZ + i * size);
+                    _start = new Vector3(_startX, _hero.Pos.y + 0.001f, _startZ + i * size);
+                    _end = new Vector3(_startX + column * .5f, _hero.Pos.y + 0.001f, _startZ + i * size);
 
                     Gizmos.DrawLine(_start, _end);
                 }
 
                 for (int i = 0; i < column + 1; ++i)
                 {
-                    _start = new Vector3(_startX + i * size, _hero.Pos.y + 0.1f, _startZ);
-                    _end = new Vector3(_startX + i * size, _hero.Pos.y + 0.1f, _startZ + row* .5f);
+                    _start = new Vector3(_startX + i * size, _hero.Pos.y + 0.001f, _startZ);
+                    _end = new Vector3(_startX + i * size, _hero.Pos.y + 0.001f, _startZ + row* .5f);
 
                     Gizmos.DrawLine(_start, _end);
                 }
diff --git a/Core/NetworkPackage/ClientPack/ClientToMapServer/CAA SaleActivity/CAA05_tagCMFlashSaleAppointment.cs b/Core/NetworkPackage/ClientPack/ClientToMapServer/CAA SaleActivity/CAA05_tagCMFlashSaleAppointment.cs
new file mode 100644
index 0000000..5ba3881
--- /dev/null
+++ b/Core/NetworkPackage/ClientPack/ClientToMapServer/CAA SaleActivity/CAA05_tagCMFlashSaleAppointment.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+// AA 05 限时抢购预约 #tagCMFlashSaleAppointment

+

+public class CAA05_tagCMFlashSaleAppointment : GameNetPackBasic {

+    public uint GoodsID;    // 抢购商品标识

+    public byte State;    // 1-预约 0-取消

+

+    public CAA05_tagCMFlashSaleAppointment () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xAA05;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (GoodsID, NetDataType.DWORD);

+        WriteBytes (State, NetDataType.BYTE);

+    }

+

+}

diff --git a/Core/NetworkPackage/ClientPack/ClientToMapServer/CAA SaleActivity/CAA05_tagCMFlashSaleAppointment.cs.meta b/Core/NetworkPackage/ClientPack/ClientToMapServer/CAA SaleActivity/CAA05_tagCMFlashSaleAppointment.cs.meta
new file mode 100644
index 0000000..8749196
--- /dev/null
+++ b/Core/NetworkPackage/ClientPack/ClientToMapServer/CAA SaleActivity/CAA05_tagCMFlashSaleAppointment.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0bd4980ed38baa24e8d85722181ec836
+timeCreated: 1539228128
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/DTCFile/ClientPack.meta b/Core/NetworkPackage/DTCFile/ClientPack.meta
new file mode 100644
index 0000000..a5a6f03
--- /dev/null
+++ b/Core/NetworkPackage/DTCFile/ClientPack.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 722e5e3d30096674e811f5bd191246a0
+folderAsset: yes
+timeCreated: 1539228128
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/DTCFile/ClientPack/ClientToMapServer.meta b/Core/NetworkPackage/DTCFile/ClientPack/ClientToMapServer.meta
new file mode 100644
index 0000000..5651f96
--- /dev/null
+++ b/Core/NetworkPackage/DTCFile/ClientPack/ClientToMapServer.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a75d33f87d2bafb4191666d4978b2e08
+folderAsset: yes
+timeCreated: 1539228128
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0104_tagServerDisconnect.cs b/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0104_tagServerDisconnect.cs
index 2767b83..aab91fd 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0104_tagServerDisconnect.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0104_tagServerDisconnect.cs
@@ -28,6 +28,15 @@
                 {
                     SDKUtility.Instance.FreePlatformLoginout();
                 }
+
+                if (vNetData.Reason != 0
+                 && vNetData.Reason != 11
+                 && vNetData.Reason != 28
+                 && vNetData.Reason != 51
+                 && vNetData.Reason != 110)
+                {
+                    DebugPkgCache.UpLoad();
+                }
             }
 
             WindowCenter.Instance.Open<ServerForceExitHintWin>();
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA003_tagUniversalGameRecInfo.cs b/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA003_tagUniversalGameRecInfo.cs
index 1375eb4..f4fec55 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA003_tagUniversalGameRecInfo.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA003_tagUniversalGameRecInfo.cs
@@ -18,12 +18,11 @@
     {
         base.Done(vNetPack);
         var data = vNetPack as HA003_tagUniversalGameRecInfo;
+        heavenModel.RefreshBattleInfo(data);
         if (onGetUniversalGameInfo != null)
         {
             onGetUniversalGameInfo(data);
         }
-
-        heavenModel.RefreshBattleInfo(data);
 
     }
 }
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA17_tagMCFlashSaleInfo.cs b/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA17_tagMCFlashSaleInfo.cs
new file mode 100644
index 0000000..80724f4
--- /dev/null
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA17_tagMCFlashSaleInfo.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+using Snxxz.UI;
+
+// AA 17 限时抢购活动信息 #tagMCFlashSaleInfo
+
+
+
+public class DTCAA17_tagMCFlashSaleInfo : DtcBasic {
+
+    public override void Done(GameNetPackBasic vNetPack) {
+
+        base.Done(vNetPack);
+
+        HAA17_tagMCFlashSaleInfo vNetData = vNetPack as HAA17_tagMCFlashSaleInfo;
+        OperationTimeHepler.Instance.UpdateFlashRushToBuy(vNetData);
+    }
+
+}
+
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA17_tagMCFlashSaleInfo.cs.meta b/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA17_tagMCFlashSaleInfo.cs.meta
new file mode 100644
index 0000000..9450023
--- /dev/null
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA17_tagMCFlashSaleInfo.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: d00087bdecd7d4947a5c1f5e6d0e98a3
+timeCreated: 1539228128
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA18_tagMCFlashSaleAppointmentInfo.cs b/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA18_tagMCFlashSaleAppointmentInfo.cs
new file mode 100644
index 0000000..9ac5dc1
--- /dev/null
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA18_tagMCFlashSaleAppointmentInfo.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+using System.Collections;
+using Snxxz.UI;
+// AA 18 限时抢购活动玩家预约信息 #tagMCFlashSaleAppointmentInfo
+
+
+
+public class DTCAA18_tagMCFlashSaleAppointmentInfo : DtcBasic
+{
+
+    FlashRushToBuyModel rushToBuyModel { get { return ModelCenter.Instance.GetModel<FlashRushToBuyModel>(); } }
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+
+        base.Done(vNetPack);
+
+        HAA18_tagMCFlashSaleAppointmentInfo vNetData = vNetPack as HAA18_tagMCFlashSaleAppointmentInfo;
+        rushToBuyModel.UpdateFlashSaleAppointmentInfo(vNetData);
+    }
+
+}
+
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA18_tagMCFlashSaleAppointmentInfo.cs.meta b/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA18_tagMCFlashSaleAppointmentInfo.cs.meta
new file mode 100644
index 0000000..70d45e6
--- /dev/null
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA18_tagMCFlashSaleAppointmentInfo.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 32d6f801e94f8b84086c12c4672b5dcf
+timeCreated: 1539228128
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/DebugPkgCache.cs b/Core/NetworkPackage/DebugPkgCache.cs
index c20213b..b7fdd2c 100644
--- a/Core/NetworkPackage/DebugPkgCache.cs
+++ b/Core/NetworkPackage/DebugPkgCache.cs
@@ -26,6 +26,23 @@
 
     public static void UpLoad()
     {
+        var _contents = new System.Text.StringBuilder();
+        foreach (var _content in m_List)
+        {
+            _contents.Append("[");
+            _contents.Append(_content.dataTime);
+            _contents.Append("]");
+            _contents.Append(_content.code);
+            _contents.Append("\r\n");
+        }
 
+#if UNITY_EDITOR
+        UnityEngine.Debug.Log("鐧婚檰寮傚父: " + _contents.ToString());
+#else
+        ExceptionCatcher.ReportException("鐧婚檰寮傚父", _contents.ToString());
+#endif
+        _contents = null;
+
+        m_List.Clear();
     }
 }
\ No newline at end of file
diff --git a/Core/NetworkPackage/GameNetSystem.cs b/Core/NetworkPackage/GameNetSystem.cs
index 6b86bca..2026d59 100644
--- a/Core/NetworkPackage/GameNetSystem.cs
+++ b/Core/NetworkPackage/GameNetSystem.cs
@@ -130,6 +130,7 @@
         if (socketController != null)
         {
             socketController.SendInfo(vNetPack);
+            DebugPkgCache.Push(vNetPack);
         }
     }
 
@@ -157,6 +158,7 @@
                 if (PackageRegedit.Contain(_package.cmd))
                 {
                     packQueue.Enqueue(_package);
+                    DebugPkgCache.Push(_package);
                 }
                 else
                 {
diff --git a/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA17_tagMCFlashSaleInfo.cs b/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA17_tagMCFlashSaleInfo.cs
new file mode 100644
index 0000000..09cbb37
--- /dev/null
+++ b/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA17_tagMCFlashSaleInfo.cs
@@ -0,0 +1,81 @@
+using UnityEngine;
+using System.Collections;
+
+// AA 17 限时抢购活动信息 #tagMCFlashSaleInfo

+

+public class HAA17_tagMCFlashSaleInfo : GameNetPackBasic {

+    public string StartDate;    // 开始日期 y-m-d

+    public string EndtDate;    // 结束日期 y-m-d

+    public ushort AdvanceMinutes;    // 提前显示分钟

+    public byte ActivityTimeCount;

+    public  tagMCFlashSaleTime[] ActivityTime;    //活动时间

+    public byte IsDayReset;    //是否每天重置

+    public ushort LimitLV;    // 限制等级

+    public byte ShopCount;    // 商店数

+    public  tagMCFlashSaleShop[] ShopInfo;    // 商店信息, 当有多个商店且有多个活动时间段时则每个时间段对应一个商店;

+

+    public HAA17_tagMCFlashSaleInfo () {

+        _cmd = (ushort)0xAA17;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out StartDate, vBytes, NetDataType.Chars, 10);

+        TransBytes (out EndtDate, vBytes, NetDataType.Chars, 10);

+        TransBytes (out AdvanceMinutes, vBytes, NetDataType.WORD);

+        TransBytes (out ActivityTimeCount, vBytes, NetDataType.BYTE);

+        ActivityTime = new tagMCFlashSaleTime[ActivityTimeCount];

+        for (int i = 0; i < ActivityTimeCount; i ++) {

+            ActivityTime[i] = new tagMCFlashSaleTime();

+            TransBytes (out ActivityTime[i].StartTime, vBytes, NetDataType.Chars, 5);

+            TransBytes (out ActivityTime[i].EndtTime, vBytes, NetDataType.Chars, 5);

+        }

+        TransBytes (out IsDayReset, vBytes, NetDataType.BYTE);

+        TransBytes (out LimitLV, vBytes, NetDataType.WORD);

+        TransBytes (out ShopCount, vBytes, NetDataType.BYTE);

+        ShopInfo = new tagMCFlashSaleShop[ShopCount];

+        for (int i = 0; i < ShopCount; i ++) {

+            ShopInfo[i] = new tagMCFlashSaleShop();

+            TransBytes (out ShopInfo[i].DayIndex, vBytes, NetDataType.BYTE);

+            TransBytes (out ShopInfo[i].TimeIndex, vBytes, NetDataType.BYTE);

+            TransBytes (out ShopInfo[i].GiftbagCount, vBytes, NetDataType.BYTE);

+            ShopInfo[i].GiftbagInfo = new tagMCFlashSaleGiftbag[ShopInfo[i].GiftbagCount];

+            for (int j = 0; j < ShopInfo[i].GiftbagCount; j ++) {

+                ShopInfo[i].GiftbagInfo[j] = new tagMCFlashSaleGiftbag();

+                TransBytes (out ShopInfo[i].GiftbagInfo[j].GiftID, vBytes, NetDataType.DWORD);

+                TransBytes (out ShopInfo[i].GiftbagInfo[j].BuyCountLimit, vBytes, NetDataType.BYTE);

+                TransBytes (out ShopInfo[i].GiftbagInfo[j].ServerBuyCountLimit, vBytes, NetDataType.WORD);

+                TransBytes (out ShopInfo[i].GiftbagInfo[j].MoneyType, vBytes, NetDataType.BYTE);

+                TransBytes (out ShopInfo[i].GiftbagInfo[j].MoneyNumber, vBytes, NetDataType.DWORD);

+                TransBytes (out ShopInfo[i].GiftbagInfo[j].MoneyOriginal, vBytes, NetDataType.DWORD);

+                TransBytes (out ShopInfo[i].GiftbagInfo[j].ItemID, vBytes, NetDataType.DWORD);

+                TransBytes (out ShopInfo[i].GiftbagInfo[j].ItemCount, vBytes, NetDataType.WORD);

+                TransBytes (out ShopInfo[i].GiftbagInfo[j].IsBind, vBytes, NetDataType.BYTE);

+            }

+        }

+    }

+

+    public struct tagMCFlashSaleGiftbag {

+        public uint GiftID;        //商城表的物品ID

+        public byte BuyCountLimit;        //限购数

+        public ushort ServerBuyCountLimit;        //全服限购数

+        public byte MoneyType;        //消耗货币类型

+        public uint MoneyNumber;        //消耗货币数量

+        public uint MoneyOriginal;        //原价

+        public uint ItemID;

+        public ushort ItemCount;

+        public byte IsBind;

+    }

+

+    public struct tagMCFlashSaleShop {

+        public byte DayIndex;        // 活动第几天

+        public byte TimeIndex;        // 第几个时间段

+        public byte GiftbagCount;        // 商店礼包数

+        public  tagMCFlashSaleGiftbag[] GiftbagInfo;        // 礼包信息

+    }

+

+    public struct tagMCFlashSaleTime {

+        public string StartTime;        // 开始时间 H:M

+        public string EndtTime;        // 结束时间 H:M

+    }

+

+}

diff --git a/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA17_tagMCFlashSaleInfo.cs.meta b/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA17_tagMCFlashSaleInfo.cs.meta
new file mode 100644
index 0000000..5859e9a
--- /dev/null
+++ b/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA17_tagMCFlashSaleInfo.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ed9668281d90fdc4f97232ce3fcd3c9d
+timeCreated: 1539228128
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA18_tagMCFlashSaleAppointmentInfo.cs b/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA18_tagMCFlashSaleAppointmentInfo.cs
new file mode 100644
index 0000000..a3db259
--- /dev/null
+++ b/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA18_tagMCFlashSaleAppointmentInfo.cs
@@ -0,0 +1,31 @@
+using UnityEngine;
+using System.Collections;
+
+// AA 18 限时抢购活动玩家预约信息 #tagMCFlashSaleAppointmentInfo

+

+public class HAA18_tagMCFlashSaleAppointmentInfo : GameNetPackBasic {

+    public byte IsAll;    // 是否全部

+    public ushort GoodsCount;    // 商品数

+    public  tagMCFlashSaleAppointmentState[] GoodsList;    // 预约的商品

+

+    public HAA18_tagMCFlashSaleAppointmentInfo () {

+        _cmd = (ushort)0xAA18;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out IsAll, vBytes, NetDataType.BYTE);

+        TransBytes (out GoodsCount, vBytes, NetDataType.WORD);

+        GoodsList = new tagMCFlashSaleAppointmentState[GoodsCount];

+        for (int i = 0; i < GoodsCount; i ++) {

+            GoodsList[i] = new tagMCFlashSaleAppointmentState();

+            TransBytes (out GoodsList[i].GoodsMark, vBytes, NetDataType.DWORD);

+            TransBytes (out GoodsList[i].State, vBytes, NetDataType.BYTE);

+        }

+    }

+

+    public struct tagMCFlashSaleAppointmentState {

+        public uint GoodsMark;        // 商品标识

+        public byte State;        // 是否预约

+    }

+

+}

diff --git a/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA18_tagMCFlashSaleAppointmentInfo.cs.meta b/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA18_tagMCFlashSaleAppointmentInfo.cs.meta
new file mode 100644
index 0000000..01719fc
--- /dev/null
+++ b/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA18_tagMCFlashSaleAppointmentInfo.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 44e6594130c5e614c8411949a184b843
+timeCreated: 1539228128
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/ResModule/InstanceResourcesLoader.cs b/Core/ResModule/InstanceResourcesLoader.cs
index cd0eae8..a7f8d61 100644
--- a/Core/ResModule/InstanceResourcesLoader.cs
+++ b/Core/ResModule/InstanceResourcesLoader.cs
@@ -26,6 +26,30 @@
         return LoadModelPrefab(raceSuffix, _m.MODE);
     }
 
+    public static RuntimeAnimatorController LoadDefaultMobAnimatorController_Fight()
+    {
+        return AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix,
+                                                          GeneralConfig.Instance.ModeDefaultConfig[1][1]);
+    }
+
+    public static RuntimeAnimatorController LoadDefaultMobAnimatorController_Func()
+    {
+        return AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix,
+                                                          GeneralConfig.Instance.ModeDefaultConfig[0][1]);
+    }
+
+    public static RuntimeAnimatorController LoadDefaultMobAnimatorController_Horse()
+    {
+        return AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix,
+                                                          GeneralConfig.Instance.ModeDefaultConfig[3][1]);
+    }
+
+    public static RuntimeAnimatorController LoadDefaultMobAnimatorController_Pet()
+    {
+        return AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix,
+                                                          GeneralConfig.Instance.ModeDefaultConfig[2][1]);
+    }
+
     public static GameObject LoadDefaultFightNPC()
     {
         return LoadMob(GeneralConfig.Instance.ModeDefaultConfig[1][0],
diff --git a/Fight/GameActor/GA_NpcCollect.cs b/Fight/GameActor/GA_NpcCollect.cs
index 8df5b76..eec39bb 100644
--- a/Fight/GameActor/GA_NpcCollect.cs
+++ b/Fight/GameActor/GA_NpcCollect.cs
@@ -109,6 +109,17 @@
                 m_Animator = m_Model.GetComponent<Animator>();
                 if (m_Animator)
                 {
+                    RuntimeAnimatorController _controller = null;
+                    if (m_LoadDefaultRes)
+                    {
+                        _controller = InstanceResourcesLoader.LoadDefaultMobAnimatorController_Func();
+                    }
+                    else
+                    {
+                        _controller = AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix, NpcConfig.MODE);
+                    }
+                    m_Animator.runtimeAnimatorController = _controller;
+
                     m_Animator.enabled = true;
                     m_Animator.SetInteger(GAStaticDefine.Param_ActorInstID, (int)clientInstID);
                 }
diff --git a/Fight/GameActor/GActorNpcFight.cs b/Fight/GameActor/GActorNpcFight.cs
index 3b82d57..934b35f 100644
--- a/Fight/GameActor/GActorNpcFight.cs
+++ b/Fight/GameActor/GActorNpcFight.cs
@@ -31,7 +31,7 @@
     {
         get
         {
-            if (!m_Animator)
+            if (!m_Animator || !m_Animator.runtimeAnimatorController)
             {
                 return -1;
             }
@@ -40,7 +40,7 @@
 
         set
         {
-            if (m_Animator)
+            if (m_Animator && m_Animator.runtimeAnimatorController)
             {
                 if (m_Animator.parameterCount > 0)
                 {
@@ -127,7 +127,27 @@
 
                 if (m_Animator)
                 {
+                    RuntimeAnimatorController _controller = null;
+                    if (m_LoadDefaultRes)
+                    {
+                        if (this is GA_Pet)
+                        {
+                            _controller = InstanceResourcesLoader.LoadDefaultMobAnimatorController_Pet();
+                        }
+                        else
+                        {
+                            _controller = InstanceResourcesLoader.LoadDefaultMobAnimatorController_Fight();
+                        }
+                    }
+                    else
+                    {
+                        _controller = AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix, NpcConfig.MODE);
+
+                    }
+                    m_Animator.runtimeAnimatorController = _controller;
+
                     m_Animator.enabled = true;
+
                     if (m_Animator.parameterCount > 0)
                     {
                         m_Animator.SetInteger(GAStaticDefine.Param_ActorInstID, (int)clientInstID);
@@ -254,6 +274,7 @@
 
         if (m_Animator)
         {
+            m_Animator.runtimeAnimatorController = null;
             NextAction = 0;
             m_Animator.enabled = false;
             m_Animator = null;
@@ -731,6 +752,7 @@
     public sealed override void Polymorph(bool doOrNo, int npcID)
     {
         IsPolyMorph = doOrNo;
+        var _npcConfig = Config.Instance.Get<NPCConfig>(npcID);
 
         if (IsPolyMorph)
         {
@@ -752,6 +774,16 @@
             var _a = m_SheepModel.GetComponent<Animator>();
             if (_a)
             {
+                RuntimeAnimatorController _controller = null;
+                if (m_SheepIsDefaultNpc)
+                {
+                    _controller = InstanceResourcesLoader.LoadDefaultMobAnimatorController_Fight();
+                }
+                else
+                {
+                    _controller = AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix, _npcConfig.MODE);
+                }
+
                 _a.enabled = true;
                 _a.SetInteger(GAStaticDefine.Param_ActorInstID, (int)ClientInstID);
                 m_Animator.enabled = false;
@@ -777,6 +809,7 @@
                 if (_a)
                 {
                     _a.enabled = false;
+                    _a.runtimeAnimatorController = null;
                 }
 
                 if (m_SheepIsDefaultNpc)
diff --git a/Fight/GameActor/GActorNpcNoFight.cs b/Fight/GameActor/GActorNpcNoFight.cs
index 0c93cd9..9fadc45 100644
--- a/Fight/GameActor/GActorNpcNoFight.cs
+++ b/Fight/GameActor/GActorNpcNoFight.cs
@@ -128,6 +128,7 @@
 
         if (m_Animator)
         {
+            m_Animator.runtimeAnimatorController = null;
             m_Animator.enabled = false;
             m_Animator = null;
         }
@@ -141,7 +142,7 @@
             m_Dig = null;
         }
 
-        if(Root)
+        if (Root)
         {
             Root.localScale = Vector3.one;
         }
@@ -190,6 +191,16 @@
                 m_Animator = m_Model.GetComponent<Animator>();
                 if (m_Animator)
                 {
+                    RuntimeAnimatorController _controller = null;
+                    if (m_LoadDefaultRes)
+                    {
+                        _controller = InstanceResourcesLoader.LoadDefaultMobAnimatorController_Func();
+                    }
+                    else
+                    {
+                        _controller = AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix, NpcConfig.MODE);
+                    }
+                    m_Animator.runtimeAnimatorController = _controller;
                     m_Animator.enabled = true;
                     m_Animator.SetInteger(GAStaticDefine.Param_ActorInstID, (int)clientInstID);
                 }
diff --git a/Fight/GameActor/GActorPlayerBase.cs b/Fight/GameActor/GActorPlayerBase.cs
index b8202ef..8655498 100644
--- a/Fight/GameActor/GActorPlayerBase.cs
+++ b/Fight/GameActor/GActorPlayerBase.cs
@@ -1135,6 +1135,7 @@
             m_HorseModel = null;
             if (m_HorseAnimator)
             {
+                m_HorseAnimator.runtimeAnimatorController = null;
                 m_HorseAnimator.enabled = false;
                 m_HorseAnimator = null;
             }
@@ -1225,6 +1226,7 @@
                 m_HorseModel = null;
                 if (m_HorseAnimator)
                 {
+                    m_HorseAnimator.runtimeAnimatorController = null;
                     m_HorseAnimator.enabled = false;
                     m_HorseAnimator = null;
                 }
@@ -1251,6 +1253,18 @@
 
             m_HorseModel = GameObjectPoolManager.Instance.RequestGameObject(_prefab);
             m_HorseAnimator = m_HorseModel.GetComponent<Animator>();
+
+            RuntimeAnimatorController _controller = null;
+            if (m_LoadDefaultHorse)
+            {
+                _controller = InstanceResourcesLoader.LoadDefaultMobAnimatorController_Horse();
+            }
+            else
+            {
+                _controller = AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix, _modelResConfig.ResourcesName);
+            }
+
+            m_HorseAnimator.runtimeAnimatorController = _controller;
             m_HorseAnimator.enabled = true;
 
             // 鍏堣缃牴鑺傜偣
diff --git a/System/GMCommand/GMInputWin.cs b/System/GMCommand/GMInputWin.cs
index e9ae8c4..1ddd701 100644
--- a/System/GMCommand/GMInputWin.cs
+++ b/System/GMCommand/GMInputWin.cs
@@ -87,22 +87,6 @@
             {
                 OnClickSendBtn();
             }
-
-            //if(Input.GetKeyDown(KeyCode.J))
-            //{
-            //    EquipWashModel washModel = ModelCenter.Instance.GetModel<EquipWashModel>();
-            //    LocalSave.SetBool(washModel.MasterGroup1ActiveKey, false);
-            //    washModel.SetMasterGroupActiveRecord(2,1, washModel.MasterGroup1ActiveKey);
-            //    WindowCenter.Instance.Open<WashMasterActiveWin>();
-            //}
-
-            //if (Input.GetKeyDown(KeyCode.O))
-            //{
-            //    EquipWashModel washModel = ModelCenter.Instance.GetModel<EquipWashModel>();
-            //    LocalSave.SetInt(washModel.MasterGroup1RaiseKey, 2);
-            //    washModel.SetMasterGroupRaiseRecord(4, 1, washModel.MasterGroup1RaiseKey);
-            //    WindowCenter.Instance.Open<WashMasterActiveWin>();
-            //}
         }
 
         private void CreateCmdCell()
diff --git a/System/KnapSack/Logic/PackSendQuestMgr.cs b/System/KnapSack/Logic/PackSendQuestMgr.cs
index 5d11fbc..3529d49 100644
--- a/System/KnapSack/Logic/PackSendQuestMgr.cs
+++ b/System/KnapSack/Logic/PackSendQuestMgr.cs
@@ -1113,7 +1113,7 @@
                 }
             }
 
-            int offsetGrid = needGridCnt - playerPack.GetReaminGridCount(PackType.rptItem) - 1;
+            int offsetGrid = needGridCnt - playerPack.GetReaminGridCount(PackType.rptItem);
             if (offsetGrid > 0)
             {
                 SysNotifyMgr.Instance.ShowTip("BagFull102", attrData.itemConfig.ItemName, offsetGrid);
diff --git a/System/Launch/LaunchWin.cs b/System/Launch/LaunchWin.cs
index 143c587..72497e8 100644
--- a/System/Launch/LaunchWin.cs
+++ b/System/Launch/LaunchWin.cs
@@ -16,8 +16,11 @@
     {
         [SerializeField] UIAlphaTween m_AlphaTween;
         [SerializeField] Image m_BackGround;
+        [SerializeField] RectTransform m_AndroidProgressContainer;
         [SerializeField] SmoothSlider m_ProgressSlider;
         [SerializeField] Text m_Progress;
+        [SerializeField] RectTransform m_IosProgressContainer;
+        [SerializeField] Text m_IosProgressTip;
         [SerializeField] Text m_BuildTime;
         [SerializeField] Text m_Version;
 
@@ -61,11 +64,20 @@
                 m_BuildTime.text = "";
             }
 
-            m_Progress.text = VersionUtility.Instance.IsShangGu() ? "" : StringUtility.Contact(0, "%");
-
-            UpdateLoadingProgress(Launch.currentStage, Launch.progress);
-
-            Launch.progressEvent += UpdateLoadingProgress;
+            if (Application.platform == RuntimePlatform.IPhonePlayer)
+            {
+                m_AndroidProgressContainer.gameObject.SetActive(false);
+                m_IosProgressContainer.gameObject.SetActive(true);
+                m_IosProgressTip.text = Language.GetFromLocal(30);
+            }
+            else
+            {
+                m_AndroidProgressContainer.gameObject.SetActive(true);
+                m_IosProgressContainer.gameObject.SetActive(false);
+                m_Progress.text = VersionUtility.Instance.IsShangGu() ? "" : StringUtility.Contact(0, "%");
+                UpdateLoadingProgress(Launch.currentStage, Launch.progress);
+                Launch.progressEvent += UpdateLoadingProgress;
+            }
         }
 
         protected override void OnAfterOpen()
@@ -112,25 +124,36 @@
         {
             base.LateUpdate();
 
-            if (trueProgress > 0.9599f)
+            if (Application.platform == RuntimePlatform.IPhonePlayer)
             {
-                behaviourProgress = Mathf.Clamp01(behaviourProgress + Time.deltaTime * 0.2f);
+                m_IosProgressContainer.gameObject.SetActive(Launch.currentStage != Launch.LaunchStage.DownLoad);
+                var remainder = ((int)Time.time) % 3;
+                var dot = remainder == 0 ? "." : remainder == 1 ? ".." : "...";
+                m_IosProgressTip.text = StringUtility.Contact(Language.GetFromLocal(30), dot);
             }
             else
             {
-                behaviourProgress = Mathf.SmoothDamp(behaviourProgress, trueProgress, ref refProgress, 0.2f);
+                if (trueProgress > 0.9599f)
+                {
+                    behaviourProgress = Mathf.Clamp01(behaviourProgress + Time.deltaTime * 0.2f);
+                }
+                else
+                {
+                    behaviourProgress = Mathf.SmoothDamp(behaviourProgress, trueProgress, ref refProgress, 0.2f);
+                }
+
+                m_ProgressSlider.value = behaviourProgress;
+                m_Progress.text = VersionUtility.Instance.IsShangGu() ? stepDescription :
+                    StringUtility.Contact(stepDescription, Mathf.RoundToInt(behaviourProgress * 100), "%");
+
+                if (!assetBuildTimeShowed && AssetVersionUtility.assetsBuildTime != DateTime.MinValue)
+                {
+                    assetBuildTimeShowed = true;
+                    var totalMinute = (int)(AssetVersionUtility.assetsBuildTime - new DateTime(2018, 1, 1)).TotalMinutes;
+                    m_Version.text = StringUtility.Contact(VersionConfig.Get().version, "_", VersionConfig.Get().buildIndex, "_", totalMinute.ToString());
+                }
             }
 
-            m_ProgressSlider.value = behaviourProgress;
-            m_Progress.text = VersionUtility.Instance.IsShangGu() ? stepDescription :
-                StringUtility.Contact(stepDescription, Mathf.RoundToInt(behaviourProgress * 100), "%");
-
-            if (!assetBuildTimeShowed && AssetVersionUtility.assetsBuildTime != DateTime.MinValue)
-            {
-                assetBuildTimeShowed = true;
-                var totalMinute = (int)(AssetVersionUtility.assetsBuildTime - new DateTime(2018, 1, 1)).TotalMinutes;
-                m_Version.text = StringUtility.Contact(VersionConfig.Get().version, "_", VersionConfig.Get().buildIndex, "_", totalMinute.ToString());
-            }
         }
 
 
diff --git a/System/OpenServerActivity/FlashRushToBuyCoolDown.cs b/System/OpenServerActivity/FlashRushToBuyCoolDown.cs
new file mode 100644
index 0000000..97472c9
--- /dev/null
+++ b/System/OpenServerActivity/FlashRushToBuyCoolDown.cs
@@ -0,0 +1,85 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Snxxz.UI
+{
+    public class FlashRushToBuyCoolDown : MonoBehaviour
+    {
+        [SerializeField] Text timeText;
+        FlashRushToBuyModel rushToBuyModel { get { return ModelCenter.Instance.GetModel<FlashRushToBuyModel>(); } }
+        bool isReplace = false;
+        bool isStartReplace = false;
+        private void Awake()
+        {
+            GlobalTimeEvent.Instance.halfMinuteEvent += UpdateHalfMinute;
+        }
+
+        private void OnEnable()
+        {
+            SecondEvent();
+            GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
+            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
+        }
+
+        private void OnDisable()
+        {
+            GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
+        }
+
+        private void UpdateHalfMinute()
+        {
+            if (!isStartReplace) return;
+
+            isReplace = !isReplace;
+        }
+
+        private void SecondEvent()
+        {
+            DisplayTime();
+        }
+
+        void DisplayTime()
+        {
+            var operation = rushToBuyModel.GetOperationFlashRushToBuy();
+            if (operation == null) return;
+            int seconds = 0;
+            OperationTime operationTime;
+            OperationFlashRushToBuy.FlashSaleShop saleShop;
+            FlashRushToBuyModel.FlashRushToBuySate flashState = rushToBuyModel.GetActivityState(out seconds,out operationTime,out saleShop);
+            isStartReplace = false;
+            switch (flashState)
+            {
+                case FlashRushToBuyModel.FlashRushToBuySate.NoOpen:
+                    break;
+                case FlashRushToBuyModel.FlashRushToBuySate.InAdvance:
+                    if(seconds <= 3600)
+                    {
+                        isStartReplace = true;
+                        if(!isReplace)
+                        {
+                            timeText.text = TimeUtility.SecondsToHMS(seconds);
+                        }
+                        else
+                        {
+                            timeText.text = operation.ToDisplayBuyTime(operationTime.startHour, operationTime.startMinute);
+                        }
+                    }
+                    else
+                    {
+                        timeText.text = operation.ToDisplayBuyTime(operationTime.startHour, operationTime.startMinute);
+                    }
+                    break;
+                case FlashRushToBuyModel.FlashRushToBuySate.Begining:
+                    timeText.text = "绉掓潃涓�";
+                    break;
+                case FlashRushToBuyModel.FlashRushToBuySate.End:
+                    timeText.text = "娲诲姩宸茬粨鏉�";
+                    break;
+            }
+        }
+    }
+}
+
diff --git a/System/OpenServerActivity/FlashRushToBuyCoolDown.cs.meta b/System/OpenServerActivity/FlashRushToBuyCoolDown.cs.meta
new file mode 100644
index 0000000..a1c9908
--- /dev/null
+++ b/System/OpenServerActivity/FlashRushToBuyCoolDown.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 00bbdfc8d38efc7488d8dc83b041b07a
+timeCreated: 1539088207
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/OpenServerActivity/FlashRushToBuyModel.cs b/System/OpenServerActivity/FlashRushToBuyModel.cs
new file mode 100644
index 0000000..73af31f
--- /dev/null
+++ b/System/OpenServerActivity/FlashRushToBuyModel.cs
@@ -0,0 +1,363 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Snxxz.UI
+{
+    public class FlashRushToBuyModel : Model,IBeforePlayerDataInitialize,IPlayerLoginOk,IOpenServerActivity
+    {
+        StoreModel storeModel { get { return ModelCenter.Instance.GetModel<StoreModel>(); } }
+        HeavenBattleModel battleModel { get { return ModelCenter.Instance.GetModel<HeavenBattleModel>(); } }
+
+        public override void Init()
+        {
+            OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;
+            OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;
+            OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent;
+            OpenServerActivityCenter.Instance.Register((int)OpenServerActivityCenter.OSActivityType.FlashRushToBuy, this);
+        }
+
+        public void OnBeforePlayerDataInitialize()
+        {
+        }
+
+        public void OnPlayerLoginOk()
+        {
+            //UpdateRedpoint();
+        }
+
+        public override void UnInit()
+        {
+            OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;
+            OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent;
+            OperationTimeHepler.Instance.operationAdvanceEvent -= OperationAdvanceEvent;
+        }
+
+        public bool IsOpen
+        {
+            get
+            {
+                var operation = GetOperationFlashRushToBuy();
+                if(operation != null)
+                {
+                    return operation.SatisfyOpenCondition();
+                }
+                return false;
+            }
+        }
+
+        public bool priorityOpen
+        {
+            get
+            {
+                return flashSaleRedpoint.state == RedPointState.Simple;
+            }
+        }
+
+        public bool IsAdvance
+        {
+            get
+            {
+                return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.FlashRushToBuy);
+            }
+        }
+
+        public void SetDefaultSelectSaleTime()
+        {
+            OperationFlashRushToBuy operation = GetOperationFlashRushToBuy();
+            if (presentFlashShop != null)
+            {
+                int seconds = 0;
+                int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow,presentFlashShop.dayIndex,presentFlashShop.timeIndex, out seconds);
+                if(buyState != 1)
+                {
+                    return;
+                }
+            }
+
+            for (int i = 0; i < operation.flashShops.Count; i++)
+            {
+                int days = operation.totalDays + 1;
+                int dayIndex = i / (operation.flashShops.Count / days);
+                int timeIndex = i % (operation.flashShops.Count / days);
+                int seconds = 0;
+                OperationTime operationTime = operation.times[timeIndex];
+                var date = operation.startDate;
+                int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow, dayIndex, timeIndex, out seconds);
+                switch(buyState)
+                {
+                    case -1:
+                    case 0:
+                        UpdateSelectFlashSaleTime(dayIndex,timeIndex);
+                        return;
+                }
+            }
+        }
+
+        public void ResetFlashShop()
+        {
+            presentFlashShop = null;
+        }
+
+        #region 鏈湴鏁版嵁澶勭悊
+        public OperationFlashRushToBuy.FlashSaleShop presentFlashShop { get; private set; }
+        public event Action UpdateSelectSaleTimeEvent;
+        public void UpdateSelectFlashSaleTime(int dayIndex,int timeIndex)
+        {
+            presentFlashShop = null;
+            OperationFlashRushToBuy operation = GetOperationFlashRushToBuy();
+            if(operation != null)
+            {
+                OperationFlashRushToBuy.FlashSaleShop flashShop;
+                operation.TryGetFlashShop(dayIndex, timeIndex, out flashShop);
+                presentFlashShop = flashShop;
+                if(UpdateSelectSaleTimeEvent != null)
+                {
+                    UpdateSelectSaleTimeEvent();
+                }
+            }
+        }
+
+        public OperationFlashRushToBuy GetOperationFlashRushToBuy()
+        {
+            OperationBase operationBase;
+            if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashRushToBuy, out operationBase))
+            {
+                return operationBase as OperationFlashRushToBuy;
+            }
+
+            return null;
+        }
+        #endregion
+
+        #region 鍗忚
+        public event Action UpdateAllAppointmentEvent;
+        public event Action<int> UpdateAppointmentEvent;
+        public void UpdateFlashSaleAppointmentInfo(HAA18_tagMCFlashSaleAppointmentInfo appointmentInfo)
+        {
+            var operation = GetOperationFlashRushToBuy();
+            if (operation == null) return;
+
+            if (appointmentInfo.IsAll == 1)
+            {
+                for (int j = 0; j < operation.flashShops.Count; j++)
+                {
+                    var saleItems = operation.flashShops[j].items;
+                    for (int k = 0; k < saleItems.Length; k++)
+                    {
+                        saleItems[k].isAppointment = 0;
+                    }
+                }
+            }
+
+            for (int i = 0; i < appointmentInfo.GoodsCount; i++)
+            {
+                var saleItemInfo = appointmentInfo.GoodsList[i];
+                for (int j = 0; j < operation.flashShops.Count; j++)
+                {
+                    var saleItems = operation.flashShops[j].items;
+                    for (int k = 0; k < saleItems.Length; k++)
+                    {
+                       if (saleItems[k].shopGuid == saleItemInfo.GoodsMark)
+                        {
+                            if(saleItems[k].isAppointment != saleItemInfo.State)
+                            {
+                                saleItems[k].isAppointment = saleItemInfo.State;
+                                if(UpdateAppointmentEvent != null)
+                                {
+                                    UpdateAppointmentEvent((int)saleItemInfo.GoodsMark);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            if(appointmentInfo.IsAll == 1)
+            {
+                if (UpdateAllAppointmentEvent != null)
+                {
+                    UpdateAllAppointmentEvent();
+                }
+            }
+
+        }
+        /// <summary>
+        /// Value1  鍟嗗搧ID  Value2 鍏ㄦ湇璐拱娆℃暟
+        /// </summary>
+        /// <returns></returns>
+        public GameRecInfo GetFullServerInfo()
+        {
+            var infolist = battleModel.GetBatterInfoListByType(8);
+            if(infolist != null && infolist.Count > 0)
+            {
+                return infolist[0];
+            }
+            return null;
+        }
+
+        /// <summary>
+        ///  闄愭椂鎶㈣喘棰勭害
+        /// </summary>
+        public void SendFlashSaleAppointment(int shopGuid,int state)
+        {
+            CAA05_tagCMFlashSaleAppointment appointment = new CAA05_tagCMFlashSaleAppointment();
+            appointment.GoodsID = (uint)shopGuid;
+            appointment.State = (byte)state;
+            GameNetSystem.Instance.SendInfo(appointment);
+        }
+        #endregion
+
+        /// <summary>
+        /// 鑾峰緱闄愭椂鎶㈣喘娲诲姩鐘舵��
+        /// </summary>
+        /// <param name="seconds"></param>
+        /// <returns></returns>
+        public FlashRushToBuySate GetActivityState(out int seconds,out OperationTime operationTime,out OperationFlashRushToBuy.FlashSaleShop saleShop)
+        {
+            seconds = 0;
+            saleShop = null;
+            operationTime = default(OperationTime);
+            var operation = GetOperationFlashRushToBuy();
+            if (!IsOpen || operation == null) return FlashRushToBuySate.NoOpen;
+
+            int openState = 0;
+            int endState = 0;
+            int openSeconds = 0;
+            int endSeconds = 0;
+            for(int i = 0; i < operation.flashShops.Count;i++)
+            {
+                OperationFlashRushToBuy.FlashSaleShop openSaleShop = operation.flashShops[i];
+                operationTime = operation.times[openSaleShop.timeIndex];
+                openState = operation.GetBuyTimeState(TimeUtility.ServerNow, openSaleShop.dayIndex, openSaleShop.timeIndex, out openSeconds);
+                if(openState != 1)
+                {
+                    saleShop = openSaleShop;
+                    break;
+                }
+            }
+            if(operation.flashShops.Count > 0)
+            {
+                OperationFlashRushToBuy.FlashSaleShop endSaleShop = operation.flashShops[operation.flashShops.Count - 1];
+                endState = operation.GetBuyTimeState(TimeUtility.ServerNow, endSaleShop.dayIndex, endSaleShop.timeIndex, out endSeconds);
+            }
+            
+            switch(openState)
+            {
+                case -1:
+                    seconds = openSeconds;
+                    return FlashRushToBuySate.InAdvance;
+                case 0:
+                    return FlashRushToBuySate.Begining;
+            }
+
+            switch(endState)
+            {
+                case -1:
+                    return FlashRushToBuySate.Begining;
+                case 0:
+                    return FlashRushToBuySate.Begining;
+                case 1:
+                    return FlashRushToBuySate.End;
+                default:
+                    return FlashRushToBuySate.NoOpen;
+            }
+        }
+
+        public bool CheckIsPush(out OperationFlashRushToBuy.FlashSaleShop saleShop)
+        {
+            int seconds = 0;
+            OperationTime operationTime;
+            saleShop = null;
+            var buyState = GetActivityState(out seconds,out operationTime,out saleShop);
+            switch (buyState)
+            {
+                case FlashRushToBuySate.NoOpen:
+                    break;
+                case FlashRushToBuySate.InAdvance:
+                    if(saleShop != null && seconds <= 180)
+                    {
+                       for(int i = 0; i < saleShop.items.Length; i++)
+                        {
+                            if(saleShop.items[i].isAppointment == 1)
+                            {
+                                return true;
+                            }
+                        }
+                    }
+                    break;
+                case FlashRushToBuySate.Begining:
+                    return true;
+                case FlashRushToBuySate.End:
+                    break;
+            }
+            return false;
+        }
+
+        private void OperationEndEvent(Operation type, int state)
+        {
+            if (type == Operation.FlashRushToBuy && state == 0)
+            {
+                UpdateRedpoint();
+                if (onStateUpate != null)
+                {
+                    onStateUpate((int)OpenServerActivityCenter.OSActivityType.FlashRushToBuy);
+                }
+            }
+        }
+
+        private void OperationAdvanceEvent(Operation type)
+        {
+            if (type == Operation.FlashRushToBuy)
+            {
+                if (onStateUpate != null)
+                {
+                    onStateUpate((int)OpenServerActivityCenter.OSActivityType.FlashRushToBuy);
+                }
+            }
+        }
+
+        private void OperationStartEvent(Operation type, int state)
+        {
+            if (type == Operation.FlashRushToBuy && state == 0)
+            {
+                UpdateRedpoint();
+                if (onStateUpate != null)
+                {
+                    onStateUpate((int)OpenServerActivityCenter.OSActivityType.FlashRushToBuy);
+                }
+            }
+        }
+
+        private void OnDayEvent()
+        {
+            UpdateRedpoint();
+        }
+
+        public void SetDayRemind()
+        {
+            if (flashSaleRedpoint.state == RedPointState.Simple)
+            {
+               // DayRemind.Instance.SetDayRemind(DayRemind.FLASHSALE_REDPOINT, true);
+                UpdateRedpoint();
+            }
+        }
+       
+        public Redpoint flashSaleRedpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, 20914);
+
+        public event Action<int> onStateUpate;
+
+        private void UpdateRedpoint()
+        {
+            flashSaleRedpoint.state = RedPointState.None;
+        }
+
+        public enum FlashRushToBuySate
+        {
+            NoOpen, //娲诲姩鏈紑鍚�
+            InAdvance,//鎻愬墠
+            Begining, //娲诲姩涓�
+            End, //缁撴潫
+        }
+    }
+}
diff --git a/System/OpenServerActivity/FlashRushToBuyModel.cs.meta b/System/OpenServerActivity/FlashRushToBuyModel.cs.meta
new file mode 100644
index 0000000..3416e95
--- /dev/null
+++ b/System/OpenServerActivity/FlashRushToBuyModel.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 1155d8a33808d2640ab01bedff0bb06b
+timeCreated: 1539086199
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/OpenServerActivity/FlashRushToBuyNotify.cs b/System/OpenServerActivity/FlashRushToBuyNotify.cs
new file mode 100644
index 0000000..174cb16
--- /dev/null
+++ b/System/OpenServerActivity/FlashRushToBuyNotify.cs
@@ -0,0 +1,35 @@
+锘縩amespace Snxxz.UI
+{
+    public class FlashRushToBuyNotify : OpenServerActivityNotifyBase
+    {
+        public FlashRushToBuyModel rushToBuyModel { get { return ModelCenter.Instance.GetModel<FlashRushToBuyModel>(); } }
+        public const string iconKey = "TB_BGL_2";
+        private void OnEnable()
+        {
+            Display();
+        }
+
+        private void OnDisable()
+        {
+            
+        }
+
+        protected override void Display()
+        {
+            base.Display();
+            titleText.text = "闄愭椂鎶㈣喘";
+            activityIcon.SetSprite(iconKey);
+        }
+
+        protected override void ClickGotoBtn()
+        {
+            base.ClickGotoBtn();
+            this.gameObject.SetActive(false);
+            WindowCenter.Instance.Open<FlashRushToBuyWin>();
+        }
+        protected override void ClickCloseBtn()
+        {
+            base.ClickCloseBtn();
+        }
+    }
+}
diff --git a/System/OpenServerActivity/FlashRushToBuyNotify.cs.meta b/System/OpenServerActivity/FlashRushToBuyNotify.cs.meta
new file mode 100644
index 0000000..aff0c1c
--- /dev/null
+++ b/System/OpenServerActivity/FlashRushToBuyNotify.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f1b3cf08873bf564ea2ec5d7d71afd41
+timeCreated: 1539423553
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/OpenServerActivity/FlashRushToBuyWin.cs b/System/OpenServerActivity/FlashRushToBuyWin.cs
new file mode 100644
index 0000000..89c05db
--- /dev/null
+++ b/System/OpenServerActivity/FlashRushToBuyWin.cs
@@ -0,0 +1,126 @@
+锘縰sing System;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Snxxz.UI
+{
+    public class FlashRushToBuyWin : Window
+    {
+        [SerializeField] ScrollerController saleItemCtrl;
+        [SerializeField] ScrollerController saleTimeCtrl;
+        [SerializeField] Text opreationTimeText;
+        [SerializeField] Image moneyIcon;
+        [SerializeField] Text moneyNumText;
+
+        StoreModel storeModel { get { return ModelCenter.Instance.GetModel<StoreModel>(); } }
+        FlashRushToBuyModel rushToBuyModel { get { return ModelCenter.Instance.GetModel<FlashRushToBuyModel>(); } }
+        OperationFlashRushToBuy operation = null;
+        #region Built-in
+        protected override void BindController()
+        {
+        }
+
+        protected override void AddListeners()
+        {
+        }
+
+        protected override void OnPreOpen()
+        {
+            rushToBuyModel.SetDefaultSelectSaleTime();
+            OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;
+            OperationTimeHepler.Instance.operationTimeUpdateEvent += OperationTimeUpdateEvent;
+            rushToBuyModel.UpdateSelectSaleTimeEvent += UpdateSelectSaleTime;
+            SetDisplayModel();
+            Display();
+        }
+
+        protected override void OnAfterOpen()
+        {
+            rushToBuyModel.SetDayRemind();
+        }
+
+        protected override void OnPreClose()
+        {
+            rushToBuyModel.UpdateSelectSaleTimeEvent -= UpdateSelectSaleTime;
+            OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;
+            OperationTimeHepler.Instance.operationTimeUpdateEvent -= OperationTimeUpdateEvent;
+            rushToBuyModel.ResetFlashShop();
+        }
+
+        protected override void OnAfterClose()
+        {
+        }
+        #endregion
+
+        private void SetDisplayModel()
+        {
+            operation = null;
+            OperationBase operationBase;
+            if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashRushToBuy, out operationBase))
+            {
+               operation = operationBase as OperationFlashRushToBuy;  
+            }
+        }
+
+        private void Display()
+        {
+            if (rushToBuyModel.presentFlashShop == null|| operation == null) return;
+
+            opreationTimeText.text = StringUtility.Contact(Language.Get("ExpActivity_Text1"), operation.ToDisplayTime());
+            if (rushToBuyModel.presentFlashShop.items.Length > 0)
+            {
+                var moneyType = rushToBuyModel.presentFlashShop.items[0].moneyType;
+                moneyIcon.SetIconWithMoneyType(moneyType);
+                moneyNumText.text = UIHelper.GetMoneyCnt(moneyType).ToString();
+            }
+            CreateOperationTimes();
+            CreateSaleItem();
+        }
+
+
+        private void UpdateSelectSaleTime()
+        {
+            CreateSaleItem();
+            saleTimeCtrl.m_Scorller.RefreshActiveCellViews();
+        }
+
+        private void CreateOperationTimes()
+        {
+            if (operation == null) return;
+
+            saleTimeCtrl.Refresh();
+            for (int i = 0; i < operation.flashShops.Count; i++)
+            {
+                saleTimeCtrl.AddCell(ScrollerDataType.Header, i);
+            }
+            saleTimeCtrl.Restart();
+        }
+
+        public void CreateSaleItem()
+        {
+            saleItemCtrl.Refresh();
+            var flashItems = rushToBuyModel.presentFlashShop.items;
+            for (int i = 0; i < flashItems.Length; i++)
+            {
+                saleItemCtrl.AddCell(ScrollerDataType.Header, i);
+            }
+            saleItemCtrl.Restart();
+        }
+
+        private void OperationTimeUpdateEvent(Operation type)
+        {
+            if (type == Operation.FlashRushToBuy)
+            {
+                Display();
+            }
+        }
+    
+        private void OperationStartEvent(Operation type, int state)
+        {
+            if (type == Operation.FlashRushToBuy && state == 0)
+            {
+                Display();
+            }
+        }
+    }
+}
diff --git a/System/OpenServerActivity/FlashRushToBuyWin.cs.meta b/System/OpenServerActivity/FlashRushToBuyWin.cs.meta
new file mode 100644
index 0000000..d1a99e7
--- /dev/null
+++ b/System/OpenServerActivity/FlashRushToBuyWin.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e1ea7b55e1cc21b42906a2e6984b29cd
+timeCreated: 1539069491
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/OpenServerActivity/FlashSaleItemCell.cs b/System/OpenServerActivity/FlashSaleItemCell.cs
new file mode 100644
index 0000000..5a1498f
--- /dev/null
+++ b/System/OpenServerActivity/FlashSaleItemCell.cs
@@ -0,0 +1,186 @@
+锘縰sing UnityEngine;
+using UnityEngine.UI;
+using EnhancedUI.EnhancedScroller;
+using TableConfig;
+using System;
+
+namespace Snxxz.UI
+{
+    public class FlashSaleItemCell : ScrollerUI
+    {
+        [SerializeField] CommonItemBaisc itemBaisc;
+        [SerializeField] Text originalPrice;
+        [SerializeField] Image originalMoneyIcon;
+        [SerializeField] Text presentPrice;
+        [SerializeField] Image presentMoneyIcon;
+        [SerializeField] Image stateImg;
+        [SerializeField] Button flashSaleBtn;
+        [SerializeField] Text btnStateText;
+        [SerializeField] Text fullServerRemainNum;
+
+        public const int RefreshFullServerBuyType = 8;
+
+        FlashRushToBuyModel rushToBuyModel { get { return ModelCenter.Instance.GetModel<FlashRushToBuyModel>(); } }
+        StoreModel storeModel { get { return ModelCenter.Instance.GetModel<StoreModel>(); } }
+        HeavenBattleModel battleModel { get { return ModelCenter.Instance.GetModel<HeavenBattleModel>(); } }
+        ItemTipsModel tipsModel { get { return ModelCenter.Instance.GetModel<ItemTipsModel>(); } }
+
+        OperationFlashRushToBuy.FlashSaleItem saleItem;
+        int buyState = -1;
+        private void OnEnable()
+        {
+            battleModel.RefreshGameRecInfoAct += UpdateFullServerBuy;
+            storeModel.RefreshBuyShopLimitEvent += RefreshBuyShopLimitEvent;
+            rushToBuyModel.UpdateAllAppointmentEvent += UpdateAllAppointmentInfo;
+            rushToBuyModel.UpdateAppointmentEvent += UpdateAppointmentInfo;
+        }
+
+        private void OnDisable()
+        {
+            storeModel.RefreshBuyShopLimitEvent -= RefreshBuyShopLimitEvent;
+            battleModel.RefreshGameRecInfoAct -= UpdateFullServerBuy;
+            rushToBuyModel.UpdateAllAppointmentEvent -= UpdateAllAppointmentInfo;
+            rushToBuyModel.UpdateAppointmentEvent -= UpdateAppointmentInfo;
+        }
+
+        public override void Refresh(CellView cell)
+        {
+            if (rushToBuyModel.presentFlashShop == null) return;
+
+            saleItem = rushToBuyModel.presentFlashShop.items[cell.index];
+            ItemCellModel cellModel = new ItemCellModel(saleItem.itemId,true,(ulong)saleItem.itemCount,saleItem.isBind);
+            itemBaisc.Init(cellModel);
+            itemBaisc.cellBtn.RemoveAllListeners();
+            itemBaisc.cellBtn.AddListener(()=>
+            {
+                ItemAttrData attrData = new ItemAttrData(saleItem.itemId,true, (ulong)saleItem.itemCount, -1,saleItem.isBind);
+                tipsModel.SetItemTipsModel(attrData);
+            });
+            originalMoneyIcon.SetIconWithMoneyType(saleItem.moneyType);
+            presentMoneyIcon.SetIconWithMoneyType(saleItem.moneyType);
+            originalPrice.text = saleItem.moneyOriginal.ToString();
+            presentPrice.text = saleItem.moneyNumber.ToString();
+            UpdateSaleItem();
+            UpdateSaleItemSellState();
+        }
+
+        private void RefreshBuyShopLimitEvent()
+        {
+            UpdateSaleItemSellState();
+        }
+
+        private void UpdateFullServerBuy(int type)
+        {
+            if (type != RefreshFullServerBuyType) return;
+            UpdateSaleItemSellState();
+        }
+
+
+        private void UpdateAllAppointmentInfo()
+        {
+            UpdateSaleItem();
+        }
+
+        private void UpdateAppointmentInfo(int shopGuid)
+        {
+            if (saleItem == null || shopGuid != saleItem.shopGuid) return;
+            UpdateSaleItem();
+        }
+
+        private void UpdateSaleItem()
+        {
+            if (rushToBuyModel.presentFlashShop == null) return;
+
+            StoreConfig storeConfig = Config.Instance.Get<StoreConfig>(saleItem.shopId);
+            flashSaleBtn.RemoveAllListeners();
+            var operation = rushToBuyModel.GetOperationFlashRushToBuy();
+            int seconds = 0;
+            buyState = operation.GetBuyTimeState(TimeUtility.ServerNow,rushToBuyModel.presentFlashShop.dayIndex,
+                rushToBuyModel.presentFlashShop.timeIndex,out seconds);
+
+            switch(buyState)
+            {
+                case -1:
+                    if(saleItem.isAppointment == 0)
+                    {
+                        btnStateText.text = "棰勭害";
+                        flashSaleBtn.AddListener(() => { rushToBuyModel.SendFlashSaleAppointment(saleItem.shopGuid, 1); });
+                    }
+                    else
+                    {
+                        btnStateText.text = "鍙栨秷棰勭害";
+                        flashSaleBtn.AddListener(() => { rushToBuyModel.SendFlashSaleAppointment(saleItem.shopGuid, 0); });
+                    }
+                    break;
+                case 0:
+                    btnStateText.text = "绉掓潃";
+                    flashSaleBtn.AddListener(() => { storeModel.SendBuyShopItem(storeConfig,saleItem.itemCount); });
+                    break;
+            }
+        }
+
+        private void UpdateSaleItemSellState()
+        {
+            int fullSeverRemain = 0;
+            int sellState = GetSellSate(out fullSeverRemain);
+            fullServerRemainNum.text = fullSeverRemain.ToString();
+            switch (sellState)
+            {
+                case 0:
+                    stateImg.gameObject.SetActive(false);
+                    flashSaleBtn.gameObject.SetActive(true);
+                    break;
+                case 1:
+                    stateImg.gameObject.SetActive(true);
+                    flashSaleBtn.gameObject.SetActive(false);
+                    break;
+                case 2:
+                    stateImg.gameObject.SetActive(true);
+                    flashSaleBtn.gameObject.SetActive(false);
+                    break;
+            }
+
+        }
+        /// <summary>
+        /// 0 绉掓潃 1 宸蹭拱鍒� 2 宸叉姠鍏�
+        /// </summary>
+        /// <returns></returns>
+        private int GetSellSate(out int fullRemainNum)
+        {
+            fullRemainNum = 0;
+    
+            var buyInfo = storeModel.GetBuyShopLimit((uint)saleItem.shopId);
+            var buyCount = 0;
+            var fullServerInfo = rushToBuyModel.GetFullServerInfo();
+            if(buyState != -1)
+            {
+                if (fullServerInfo != null && fullServerInfo.Value1 == saleItem.shopId)
+                {
+                    fullRemainNum = saleItem.fullServerLimitNum - fullServerInfo.Value2;
+                }
+                else
+                {
+                    fullRemainNum = saleItem.fullServerLimitNum;
+                }
+                if (buyInfo != null)
+                {
+                    buyCount = buyInfo.BuyCnt;
+                }
+                if (buyCount >= saleItem.limitNum)
+                {
+                    return 1;
+                }
+
+                if (fullRemainNum <= 0)
+                {
+                    return 2;
+                }
+            }
+            else
+            {
+                fullRemainNum = saleItem.fullServerLimitNum;
+            }
+            return 0;
+        }
+    }
+}
diff --git a/System/OpenServerActivity/FlashSaleItemCell.cs.meta b/System/OpenServerActivity/FlashSaleItemCell.cs.meta
new file mode 100644
index 0000000..4c70a33
--- /dev/null
+++ b/System/OpenServerActivity/FlashSaleItemCell.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0159981474f2dbb4599489e57560e8e6
+timeCreated: 1539070008
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/OpenServerActivity/FlashSaleTimeCell.cs b/System/OpenServerActivity/FlashSaleTimeCell.cs
new file mode 100644
index 0000000..17df1e0
--- /dev/null
+++ b/System/OpenServerActivity/FlashSaleTimeCell.cs
@@ -0,0 +1,87 @@
+锘縰sing UnityEngine;
+using UnityEngine.UI;
+using EnhancedUI.EnhancedScroller;
+using System;
+
+namespace Snxxz.UI
+{
+    public class FlashSaleTimeCell : ScrollerUI
+    {
+        [SerializeField] Text remainText;
+        [SerializeField] Button saleTimeBtn;
+        [SerializeField] GameObject unSelectImg;
+        [SerializeField] GameObject selectImg;
+
+        FlashRushToBuyModel rushToBuyModel { get { return ModelCenter.Instance.GetModel<FlashRushToBuyModel>(); } }
+        OperationFlashRushToBuy operation;
+        int dayIndex = -1;
+        int timeIndex = -1;
+        private void Awake()
+        {
+            saleTimeBtn.AddListener(() =>
+            {
+                rushToBuyModel.UpdateSelectFlashSaleTime(dayIndex, timeIndex);
+            });
+        }
+        private void OnEnable()
+        {
+            GlobalTimeEvent.Instance.secondEvent += UpdateBuyState;
+        }
+        private void OnDisable()
+        {
+            GlobalTimeEvent.Instance.secondEvent -= UpdateBuyState;
+        }
+        public override void Refresh(CellView cell)
+        {
+            operation = rushToBuyModel.GetOperationFlashRushToBuy();
+            dayIndex = -1;
+            timeIndex = -1;
+            if (operation == null) return;
+
+            int days = operation.totalDays + 1;
+            dayIndex = cell.index/(operation.flashShops.Count / days);
+            timeIndex = cell.index % (operation.flashShops.Count / days);
+            if(dayIndex == rushToBuyModel.presentFlashShop.dayIndex 
+                && timeIndex == rushToBuyModel.presentFlashShop.timeIndex)
+            {
+                selectImg.SetActive(true);
+                unSelectImg.SetActive(false);
+            }
+            else
+            {
+                selectImg.SetActive(false);
+                unSelectImg.SetActive(true);
+            }
+            UpdateBuyState();
+        }
+
+        public void UpdateBuyState()
+        {
+            if (operation == null || timeIndex == -1) return;
+
+            int seconds = 0;
+            OperationTime operationTime = operation.times[timeIndex];
+            var date = operation.startDate;
+            int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow, dayIndex, timeIndex, out seconds);
+            switch (buyState)
+            {
+                case -1:
+                    this.gameObject.SetActive(true);
+                    string timeStr = operation.ToDisplayBuyTime(date.month, dayIndex + date.day, operationTime.startHour, operationTime.startMinute);
+                    remainText.text = StringUtility.Contact(timeStr, "寮�鎶�");
+                    break;
+                case 0:
+                    this.gameObject.SetActive(true);
+                    remainText.text = StringUtility.Contact("绉掓潃杩涜涓�", TimeUtility.SecondsToHMS(seconds));
+                    break;
+                case 1:
+                    if(selectImg.activeInHierarchy)
+                    {
+                        rushToBuyModel.SetDefaultSelectSaleTime();
+                    }
+                    this.gameObject.SetActive(false);
+                    break;
+            }
+        }
+    }
+}
diff --git a/System/OpenServerActivity/FlashSaleTimeCell.cs.meta b/System/OpenServerActivity/FlashSaleTimeCell.cs.meta
new file mode 100644
index 0000000..138d9a6
--- /dev/null
+++ b/System/OpenServerActivity/FlashSaleTimeCell.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 45a3148a13dcdbb40b43bf5b9667ca8e
+timeCreated: 1539070917
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/OpenServerActivity/ImpactRankModel.cs b/System/OpenServerActivity/ImpactRankModel.cs
index 8987ad0..032f77c 100644
--- a/System/OpenServerActivity/ImpactRankModel.cs
+++ b/System/OpenServerActivity/ImpactRankModel.cs
@@ -786,6 +786,8 @@
             FairyLeagueNotice,
             [Header("楠戝疇浜夊ず棰勫憡")]
             FairyGrabBossNotice,
+            [Header("闄愭椂鎶㈣喘")]
+            FlashRushToBuy,
         }
     }
 
diff --git a/System/OpenServerActivity/OpenServerActivityNotifyBase.cs b/System/OpenServerActivity/OpenServerActivityNotifyBase.cs
new file mode 100644
index 0000000..1d0dc9f
--- /dev/null
+++ b/System/OpenServerActivity/OpenServerActivityNotifyBase.cs
@@ -0,0 +1,34 @@
+锘縰sing UnityEngine;
+using UnityEngine.UI;
+
+namespace Snxxz.UI
+{
+     public class OpenServerActivityNotifyBase : MonoBehaviour
+    {
+        [SerializeField] protected Text titleText;
+        [SerializeField] protected Image activityIcon;
+        [SerializeField] protected Button gotoBtn;
+        [SerializeField] protected Button closeBtn;
+
+        private void Awake()
+        {
+            gotoBtn.AddListener(ClickGotoBtn);
+            closeBtn.AddListener(ClickCloseBtn);
+        }
+
+        protected virtual void Display()
+        {
+
+        }
+
+        protected virtual void ClickGotoBtn()
+        {
+
+        }
+
+        protected virtual void ClickCloseBtn()
+        {
+            this.gameObject.SetActive(false);
+        }
+    }
+}
diff --git a/System/OpenServerActivity/OpenServerActivityNotifyBase.cs.meta b/System/OpenServerActivity/OpenServerActivityNotifyBase.cs.meta
new file mode 100644
index 0000000..026d4c7
--- /dev/null
+++ b/System/OpenServerActivity/OpenServerActivityNotifyBase.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 22be8e7eacfacb343b53b11b5d22aa29
+timeCreated: 1539422752
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/OpenServerActivity/OpenServerActivityNotifyModel.cs b/System/OpenServerActivity/OpenServerActivityNotifyModel.cs
new file mode 100644
index 0000000..f69a356
--- /dev/null
+++ b/System/OpenServerActivity/OpenServerActivityNotifyModel.cs
@@ -0,0 +1,193 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Snxxz.UI
+{
+    public class OpenServerActivityNotifyModel : Model,IBeforePlayerDataInitialize,IPlayerLoginOk
+    {
+      
+        public override void Init()
+        {
+          
+        }
+
+        public void OnBeforePlayerDataInitialize()
+        {
+            FlashRushToBuyActivityClose();
+            GlobalTimeEvent.Instance.minuteEvent -= UpdateMinute;
+            OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;
+            OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent;
+            OperationTimeHepler.Instance.operationTimeUpdateEvent -= OperationTimeEvent;
+            OperationTimeHepler.Instance.operationServerCloseEvent -= OperationServerCloseEvent;
+            NewBieCenter.Instance.guideCompletedEvent -= GuideCompletedEvent;
+        }
+
+        public void OnPlayerLoginOk()
+        {
+            OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;
+            OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;
+            OperationTimeHepler.Instance.operationTimeUpdateEvent += OperationTimeEvent;
+            OperationTimeHepler.Instance.operationServerCloseEvent += OperationServerCloseEvent;
+            NewBieCenter.Instance.guideCompletedEvent += GuideCompletedEvent;
+            GlobalTimeEvent.Instance.minuteEvent += UpdateMinute;
+            SetFlashRushToBuyNotify();
+            if (!WindowCenter.Instance.IsOpen<OpenServerActivityNotifyWin>())
+            {
+                WindowCenter.Instance.Open<OpenServerActivityNotifyWin>();
+            }
+        }
+
+        public override void UnInit()
+        {
+          
+        }
+
+        private void UpdateMinute()
+        {
+            SetFlashRushToBuyNotify();
+        }
+
+        private void OperationTimeEvent(Operation type)
+        {
+            switch (type)
+            {
+                case Operation.MultipleExp:
+                    break;
+                case Operation.ConsumeRebate:
+                    break;
+                case Operation.FlashSale:
+                    break;
+                case Operation.BossReborn:
+                    break;
+                case Operation.GiftPackage:
+                    break;
+                case Operation.FairyCeremony:
+                    break;
+                case Operation.MultipRealmPoint:
+                    break;
+                case Operation.FlashRushToBuy:
+                    SetFlashRushToBuyNotify();
+                    break;
+                case Operation.max:
+                    break;
+            }
+        }
+
+        private void OperationStartEvent(Operation type, int state)
+        {
+            switch (type)
+            {
+                case Operation.MultipleExp:
+                    break;
+                case Operation.ConsumeRebate:
+                    break;
+                case Operation.FlashSale:
+                    break;
+                case Operation.BossReborn:
+                    break;
+                case Operation.GiftPackage:
+                    break;
+                case Operation.FairyCeremony:
+                    break;
+                case Operation.MultipRealmPoint:
+                    break;
+                case Operation.FlashRushToBuy:
+                    SetFlashRushToBuyNotify();
+                    break;
+                case Operation.max:
+                    break;
+            }
+        }
+
+
+        private void OperationServerCloseEvent(Operation type)
+        {
+            switch (type)
+            {
+                case Operation.MultipleExp:
+                    break;
+                case Operation.ConsumeRebate:
+                    break;
+                case Operation.FlashSale:
+                    break;
+                case Operation.BossReborn:
+                    break;
+                case Operation.GiftPackage:
+                    break;
+                case Operation.FairyCeremony:
+                    break;
+                case Operation.MultipRealmPoint:
+                    break;
+                case Operation.FlashRushToBuy:
+                    FlashRushToBuyActivityClose();
+                    break;
+                case Operation.max:
+                    break;
+            }
+        }
+
+        private void OperationEndEvent(Operation type, int state)
+        {
+            switch (type)
+            {
+                case Operation.MultipleExp:
+                    break;
+                case Operation.ConsumeRebate:
+                    break;
+                case Operation.FlashSale:
+                    break;
+                case Operation.BossReborn:
+                    break;
+                case Operation.GiftPackage:
+                    break;
+                case Operation.FairyCeremony:
+                    break;
+                case Operation.MultipRealmPoint:
+                    break;
+                case Operation.FlashRushToBuy:
+                    FlashRushToBuyActivityClose();
+                    break;
+                case Operation.max:
+                    break;
+            }
+        }
+
+        private void GuideCompletedEvent(int id)
+        {
+            SetFlashRushToBuyNotify();
+        }
+
+        #region 闄愭椂鎶㈣喘
+        public event Action UpdateFlashRushToBuyEvent;
+        FlashRushToBuyModel rushToBuyModel { get { return ModelCenter.Instance.GetModel<FlashRushToBuyModel>(); } }
+        public List<OperationFlashRushToBuy.FlashSaleShop> flashSaleShops = new List<OperationFlashRushToBuy.FlashSaleShop>();
+        public void SetFlashRushToBuyNotify()
+        {
+            if (NewBieCenter.Instance.inGuiding) return;
+
+            OperationFlashRushToBuy.FlashSaleShop saleShop = null;
+            bool isPush = rushToBuyModel.CheckIsPush(out saleShop);
+            if(isPush && !flashSaleShops.Contains(saleShop))
+            {
+                flashSaleShops.Add(saleShop);
+                if(UpdateFlashRushToBuyEvent != null)
+                {
+                    UpdateFlashRushToBuyEvent();
+                }
+            }
+        }
+
+        public void FlashRushToBuyActivityClose()
+        {
+            flashSaleShops.Clear();
+            if (UpdateFlashRushToBuyEvent != null)
+            {
+                UpdateFlashRushToBuyEvent();
+            }
+        }
+        #endregion
+
+    }
+}
diff --git a/System/OpenServerActivity/OpenServerActivityNotifyModel.cs.meta b/System/OpenServerActivity/OpenServerActivityNotifyModel.cs.meta
new file mode 100644
index 0000000..cac9cd0
--- /dev/null
+++ b/System/OpenServerActivity/OpenServerActivityNotifyModel.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 2a78df4065d071145b2e5877404cd6fd
+timeCreated: 1539572551
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/OpenServerActivity/OpenServerActivityNotifyWin.cs b/System/OpenServerActivity/OpenServerActivityNotifyWin.cs
new file mode 100644
index 0000000..758d631
--- /dev/null
+++ b/System/OpenServerActivity/OpenServerActivityNotifyWin.cs
@@ -0,0 +1,54 @@
+锘縰sing System;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Snxxz.UI
+{
+    public class OpenServerActivityNotifyWin : Window
+    {
+        [SerializeField] FlashRushToBuyNotify flashRushToBuyNotify;
+        OpenServerActivityNotifyModel activityNotifyModel { get { return ModelCenter.Instance.GetModel<OpenServerActivityNotifyModel>(); } }
+        protected override void BindController()
+        {
+
+        }
+
+        protected override void AddListeners()
+        {
+            
+        }
+
+        protected override void OnPreOpen()
+        {          
+            activityNotifyModel.UpdateFlashRushToBuyEvent += CheckFlashRushToBuy;
+            CheckFlashRushToBuy();
+        }
+
+        protected override void OnAfterOpen()
+        {
+          
+        }
+
+        protected override void OnPreClose()
+        {
+            activityNotifyModel.UpdateFlashRushToBuyEvent -= CheckFlashRushToBuy;
+        }
+
+        protected override void OnAfterClose()
+        {
+
+        }
+
+        private void CheckFlashRushToBuy()
+        {
+            if(activityNotifyModel.flashSaleShops.Count > 0)
+            {
+                flashRushToBuyNotify.gameObject.SetActive(true);
+            }
+            else
+            {
+                flashRushToBuyNotify.gameObject.SetActive(false);
+            }
+        }
+    }
+}
diff --git a/System/OpenServerActivity/OpenServerActivityNotifyWin.cs.meta b/System/OpenServerActivity/OpenServerActivityNotifyWin.cs.meta
new file mode 100644
index 0000000..3d2fa9c
--- /dev/null
+++ b/System/OpenServerActivity/OpenServerActivityNotifyWin.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: aa084ec4d5a2ea446b5ec00c0e1cc687
+timeCreated: 1539422752
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/OpenServerActivity/OpenServerActivityWin.cs b/System/OpenServerActivity/OpenServerActivityWin.cs
index 44aea99..b0ee292 100644
--- a/System/OpenServerActivity/OpenServerActivityWin.cs
+++ b/System/OpenServerActivity/OpenServerActivityWin.cs
@@ -574,6 +574,16 @@
                         WindowCenter.Instance.Open<FairyGrabBossNoticeWin>(true);
                     }
                     break;
+                case 14:
+                    if (windowState == WindowState.Opened)
+                    {
+                        WindowCenter.Instance.OpenWithoutAnimation<FlashRushToBuyWin>();
+                    }
+                    else
+                    {
+                        WindowCenter.Instance.Open<FlashRushToBuyWin>(true);
+                    }
+                    break;
             }
         }
 
@@ -609,6 +619,7 @@
             WindowCenter.Instance.CloseImmediately<VipInvestWin>();
             WindowCenter.Instance.CloseImmediately<FairyLeagueNoticeWin>();
             WindowCenter.Instance.CloseImmediately<FairyGrabBossNoticeWin>();
+            WindowCenter.Instance.CloseImmediately<FlashRushToBuyWin>();
         }
 
         private int Compare(int order_x, int order_y)
diff --git a/System/OpenServerActivity/OperationFlashRushToBuy.cs b/System/OpenServerActivity/OperationFlashRushToBuy.cs
new file mode 100644
index 0000000..947addb
--- /dev/null
+++ b/System/OpenServerActivity/OperationFlashRushToBuy.cs
@@ -0,0 +1,172 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+namespace Snxxz.UI
+{
+    public class OperationFlashRushToBuy : OperationBase
+    {
+        public List<FlashSaleShop> flashShops = new List<FlashSaleShop>();
+
+        public bool TryGetFlashShop(int dayIndex,int timeIndex ,out FlashSaleShop flashSaleShop)
+        {
+           flashSaleShop = null;
+           for (int i = 0; i < flashShops.Count; i++)
+            {
+                var shop = flashShops[i];
+                if (shop.dayIndex == dayIndex
+                    && shop.timeIndex == timeIndex)
+                {
+                    flashSaleShop = shop;
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public bool TryGetFlashItem(int shopGuid,out FlashSaleShop flashSaleShop, out FlashSaleItem saleItem)
+        {
+            saleItem = null;
+            flashSaleShop = null;
+            for (int i = 0; i < flashShops.Count; i++)
+            {
+                var saleItems = flashShops[i].items;
+                for (int j = 0; j < saleItems.Length; j++)
+                {
+                    if (saleItems[j].shopGuid == shopGuid)
+                    {
+                        flashSaleShop = flashShops[i];
+                        saleItem = saleItems[j];
+                        return true;
+                    }
+                }
+            }
+          
+            return false;
+        }
+
+        /// <summary>
+        ///-1 鏈紑濮� 0 寮�濮� 1缁撴潫
+        /// </summary>
+        /// <param name="time"></param>
+        /// <param name="dayIndex"></param>
+        /// <param name="timeIndex"></param>
+        /// <returns></returns>
+        public int GetBuyTimeState(DateTime time,int dayIndex,int timeIndex,out int seconds)
+        {
+            seconds = 0;
+            int day = startDate.day + dayIndex;
+            OperationTime operationTime = times[timeIndex];
+            var startTime = new DateTime(startDate.year, startDate.month,day, operationTime.startHour, operationTime.startMinute,0);
+            var endTime = new DateTime(startDate.year, startDate.month,day, operationTime.endHour, operationTime.endHour, 0);
+            int advanceSec = Mathf.CeilToInt((float)(startTime - time).TotalSeconds);
+            int endSec = Mathf.CeilToInt((float)(endTime - time).TotalSeconds);
+            if (advanceSec > 0)
+            {
+                seconds = advanceSec;
+                return -1;
+            }
+            else if(endSec <= 0)
+            {
+                return 1;
+            }
+            else
+            {
+                seconds = endSec;
+                return 0;
+            }
+        }
+
+        public string ToDisplayBuyTime(int month,int day,int startHour,int startMinute)
+        {
+            return StringUtility.Contact(month, Language.Get("Month"), day, Language.Get("Day"), startHour.ToString("D2"), ":", startMinute.ToString("D2"));
+        }
+
+        public string ToDisplayBuyTime(int startHour, int startMinute)
+        {
+            return StringUtility.Contact(startHour.ToString("D2"), ":", startMinute.ToString("D2"));
+        }
+
+        public override bool SatisfyOpenCondition()
+        {
+            if(PlayerDatas.Instance.baseData.LV >= limitLv && InDay(TimeUtility.ServerNow))
+            {
+                return true;
+            }
+            return false;
+        }
+
+        public override void Reset()
+        {
+            base.Reset();
+            flashShops.Clear();
+        }
+
+        public override string ToDisplayTime()
+        {
+            var textBuilder = OperationTimeHepler.textBuilder;
+            textBuilder.Length = 0;
+            textBuilder.Append(startDate.ToDisplay());
+            if (startDate != endDate)
+            {
+                textBuilder.Append("鈥�");
+                textBuilder.Append(endDate.ToDisplay());
+            }
+            return textBuilder.ToString();
+        }
+
+        public void ParsePackage(HAA17_tagMCFlashSaleInfo package)
+        {
+            for (int i = 0; i < package.ShopCount; i++)
+            {
+                var gift = new FlashSaleShop();
+                var shop = package.ShopInfo[i];
+                gift.dayIndex = shop.DayIndex;
+                gift.timeIndex = shop.TimeIndex;
+                gift.items = new FlashSaleItem[shop.GiftbagCount];
+                for (int k = 0; k < shop.GiftbagCount; k++)
+                {
+                    var item = new FlashSaleItem();
+                    var saleItem = shop.GiftbagInfo[k];
+                    item.shopId = (int)saleItem.GiftID;
+                    item.shopGuid = shop.DayIndex*1000 + shop.TimeIndex*100 + k;
+                    item.limitNum = saleItem.BuyCountLimit;
+                    item.fullServerLimitNum = saleItem.ServerBuyCountLimit;
+                    item.moneyType = saleItem.MoneyType;
+                    item.moneyNumber = (int)saleItem.MoneyNumber;
+                    item.moneyOriginal = (int)saleItem.MoneyOriginal;
+                    item.itemId = (int)saleItem.ItemID;
+                    item.itemCount = saleItem.ItemCount;
+                    item.isBind = saleItem.IsBind;
+                    item.isAppointment = 0;
+                    gift.items[k] = item;
+                }
+                flashShops.Add(gift);
+            }
+        }
+
+     
+        public class FlashSaleShop
+        {
+            public int dayIndex; // 娲诲姩绗嚑澶�
+            public int timeIndex;//绗嚑涓椂闂存
+            public FlashSaleItem[] items;
+        }
+
+        public class FlashSaleItem
+        {
+            public int shopId;
+            public int shopGuid;
+            public int limitNum;//涓汉闄愯喘鏁伴噺
+            public int fullServerLimitNum; //涓汉闄愯喘鏁伴噺
+            public int moneyType;
+            public int moneyNumber;
+            public int moneyOriginal;
+            public int itemId;
+            public int itemCount;
+            public int isBind;
+            public int isAppointment; //鏄惁棰勭害
+        }
+    }
+}
+
diff --git a/System/OpenServerActivity/OperationFlashRushToBuy.cs.meta b/System/OpenServerActivity/OperationFlashRushToBuy.cs.meta
new file mode 100644
index 0000000..af00fe6
--- /dev/null
+++ b/System/OpenServerActivity/OperationFlashRushToBuy.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6b7d522af470b8a42b9127be5090cb6f
+timeCreated: 1539088859
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/SystemSetting/ActivitiesPushMgr.cs b/System/SystemSetting/ActivitiesPushMgr.cs
index 74d62e6..e3c0a36 100644
--- a/System/SystemSetting/ActivitiesPushMgr.cs
+++ b/System/SystemSetting/ActivitiesPushMgr.cs
@@ -11,8 +11,10 @@
     {
         public const int WholePeopleRankStart = 2091000; //鍏ㄦ皯鍐叉寮�濮�
         public const int WholePeopleRankEnd = 20910000; //鍏ㄦ皯鍐叉鎴
-
+        public const int FlashRushToBuy = 209014; //闄愭椂鎶㈣喘
         ImpactRankModel impactRank { get { return ModelCenter.Instance.GetModel<ImpactRankModel>(); } }
+        FlashRushToBuyModel rushToBuyModel { get { return ModelCenter.Instance.GetModel<FlashRushToBuyModel>(); } }
+
         private List<int> rankTypelist = new List<int>();
 
         public override void Init()
@@ -29,7 +31,10 @@
 
         public void OnBeforePlayerDataInitialize()
         {
-
+            rushToBuyModel.UpdateAllAppointmentEvent -= UpdateAllAppointment;
+            rushToBuyModel.UpdateAppointmentEvent -= UpdateAppointment;
+            GlobalTimeEvent.Instance.minuteEvent -= RefreshMinuteTime;
+            OpenServerActivityCenter.Instance.openServerActivityStateChange -= RefreshOpenServerState;
         }
 
         public void OnAfterPlayerDataInitialize()
@@ -41,10 +46,11 @@
         {
             SetRankStartPushInfo();
             SetRankEndPushInfo();
-            GlobalTimeEvent.Instance.minuteEvent -= RefreshMinuteTime;
+            SetFlashRushToBuyAppointmentInfo();
             GlobalTimeEvent.Instance.minuteEvent += RefreshMinuteTime;
-            OpenServerActivityCenter.Instance.openServerActivityStateChange -= RefreshOpenServerState;
             OpenServerActivityCenter.Instance.openServerActivityStateChange += RefreshOpenServerState;
+            rushToBuyModel.UpdateAllAppointmentEvent += UpdateAllAppointment;
+            rushToBuyModel.UpdateAppointmentEvent += UpdateAppointment;
         }
 
         public override void UnInit()
@@ -57,6 +63,7 @@
         {
             RemovePushByTime(PushInfoType.RankStart,11);
             RemovePushByTime(PushInfoType.RankEnd,23);
+            RemoveFlashRushToBuyAppointmentByTime();
         }
 
         private void RefreshOpenServerState()
@@ -65,8 +72,10 @@
             SetRankEndPushInfo();
             RemovePushByActiveClose(PushInfoType.RankStart);
             RemovePushByActiveClose(PushInfoType.RankEnd);
+            SetFlashRushToBuyAppointmentInfo();
         }
 
+        #region 寮�鏈嶆椿鍔ㄥ啿姒滄帹閫�
         private void SetRankStartPushInfo()
         {
             for(int i = 0; i <rankTypelist.Count; i++)
@@ -144,7 +153,7 @@
             }
         }
 
-        private void RemovePushByTime(PushInfoType type,int time)
+        private void RemovePushByTime(PushInfoType type, int time)
         {
             int remainHour = time - TimeUtility.ServerNow.Hour;
             int remainMinute = 0 - TimeUtility.ServerNow.Minute;
@@ -181,7 +190,98 @@
                     break;
             }
         }
+        #endregion
 
+        #region 闄愭椂鎶㈣喘鎺ㄩ��
+        private void UpdateAllAppointment()
+        {
+            SetFlashRushToBuyAppointmentInfo();
+        }
+
+        private void UpdateAppointment(int shopGuid)
+        {
+            if (!rushToBuyModel.IsOpen) return;
+
+            var operation = rushToBuyModel.GetOperationFlashRushToBuy();
+            int pushId = FlashRushToBuy * 10 + shopGuid;
+            OperationFlashRushToBuy.FlashSaleItem saleItem;
+            OperationFlashRushToBuy.FlashSaleShop saleShop;
+            bool isSaleItem = operation.TryGetFlashItem(shopGuid,out saleShop,out saleItem);
+            if(isSaleItem)
+            {
+                if(saleItem.isAppointment != 1)
+                {
+                    RemovePushInfo(pushId);
+                }
+                else
+                {
+                    int seconds = 0;
+                    int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow, saleShop.dayIndex, saleShop.timeIndex, out seconds);
+                    if(seconds > 800)
+                    {
+                        int remainSecond = seconds - 600;
+                        SendPushInfo(GetPushJsonData(pushId, remainSecond, "闄愭椂鎶㈣喘", "浜茬埍鐨勯亾鍙嬶紝鎮ㄩ绾︾殑闄愭椂鎶㈣喘鍟嗗搧鍗冲皢寮�鎶紝璇峰敖蹇繘鍏ユ父鎴忕鏉�锛�"));
+                    }
+                }
+            }
+        }
+
+        private void SetFlashRushToBuyAppointmentInfo()
+        {
+            if (!rushToBuyModel.IsOpen) return;
+
+            var operation = rushToBuyModel.GetOperationFlashRushToBuy();
+            for(int i = 0; i < operation.flashShops.Count; i++)
+            {
+                var flashShop = operation.flashShops[i];
+                int seconds = 0;
+                int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow, flashShop.dayIndex,flashShop.timeIndex,out seconds);
+                var saleItems = operation.flashShops[i].items;
+                for (int j = 0; j < saleItems.Length; j++)
+                {
+                    int pushId = FlashRushToBuy * 10 + saleItems[j].shopGuid;
+                    if (buyState == -1 && seconds > 800 && saleItems[j].isAppointment == 1)
+                    {
+                        int remainSecond = seconds - 600;
+                        SendPushInfo(GetPushJsonData(pushId, remainSecond, "闄愭椂鎶㈣喘", "浜茬埍鐨勯亾鍙嬶紝鎮ㄩ绾︾殑闄愭椂鎶㈣喘鍟嗗搧鍗冲皢寮�鎶紝璇峰敖蹇繘鍏ユ父鎴忕鏉�锛�"));
+                    }
+                    else
+                    {
+                        RemovePushInfo(pushId);
+                    }
+                }
+            }
+        }
+
+        private void RemoveFlashRushToBuyAppointmentByTime()
+        {
+            if (!rushToBuyModel.IsOpen) return;
+
+            var operation = rushToBuyModel.GetOperationFlashRushToBuy();
+            for (int i = 0; i < operation.flashShops.Count; i++)
+            {
+                var flashShop = operation.flashShops[i];
+                int seconds = 0;
+                int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow, flashShop.dayIndex, flashShop.timeIndex, out seconds);
+                var saleItems = operation.flashShops[i].items;
+                for (int j = 0; j < saleItems.Length; j++)
+                {
+                    int pushId = FlashRushToBuy * 10 + saleItems[j].shopGuid;
+                    if (buyState != -1)
+                    {
+                        RemovePushInfo(pushId);
+                    }
+                    else
+                    {
+                        if(seconds <= 180)
+                        {
+                            RemovePushInfo(pushId);
+                        }
+                    }
+                }
+            }
+        }
+        #endregion
         public void RemovePushInfo(int pushId)
         {
             SDKUtility.Instance.GeTui_RemoveLocalMessage(pushId.ToString());
diff --git a/System/Vip/VipInvest/RotatePointer.cs b/System/Vip/VipInvest/RotatePointer.cs
index 6727112..bdff08b 100644
--- a/System/Vip/VipInvest/RotatePointer.cs
+++ b/System/Vip/VipInvest/RotatePointer.cs
@@ -43,6 +43,10 @@
         {
 
         }
+        private void OnDisable()
+        {
+            sequence.Kill();
+        }
         private Sequence sequence;
         void Update()
         {
diff --git a/System/Vip/VipInvest/WheelOfFortuneModel.cs b/System/Vip/VipInvest/WheelOfFortuneModel.cs
index 9c9e149..e85eb63 100644
--- a/System/Vip/VipInvest/WheelOfFortuneModel.cs
+++ b/System/Vip/VipInvest/WheelOfFortuneModel.cs
@@ -99,6 +99,17 @@
                     {
                         flo = flo - 360f;
                     }
+                    if (Math.Abs(flo- AngleSave)<=0.2)
+                    {
+                        if ((flo + 1f )> (AngleDic[Lattice].AngleStart + 1f) && (flo + 1f) < (AngleDic[Lattice].AngleEnd - 1f))
+                        {
+                            flo += 1;
+                        }
+                        else if ((flo - 1f) > (AngleDic[Lattice].AngleStart + 1f) && (flo - 1f) < (AngleDic[Lattice].AngleEnd - 1f))
+                        {
+                            flo -= 1;
+                        }
+                    }
                     LocalSave.SetFloat(StrKey, flo);
                     AngleSave = LocalSave.GetFloat(StrKey);
                 }
@@ -124,7 +135,7 @@
         }
         private void RedPoint()
         {
-            if (!FuncOpen.Instance.IsFuncOpen(144) /*|| Number<=0*/)
+            if (!FuncOpen.Instance.IsFuncOpen(144))
             {
                 return;
             }
diff --git a/System/Vip/VipInvest/WheelOfFortuneWin.cs b/System/Vip/VipInvest/WheelOfFortuneWin.cs
index 90ca72f..877c725 100644
--- a/System/Vip/VipInvest/WheelOfFortuneWin.cs
+++ b/System/Vip/VipInvest/WheelOfFortuneWin.cs
@@ -132,7 +132,15 @@
             int LotteryNumber = vipmodel.GetVipPrivilegeCnt(VipPrivilegeType.BindJadeWheel);
             if (LotteryNumber <= wheelOfFortuneModel.Number)
             {
-                LackOfVIP(); //VIP 涓嶈冻
+                if (PlayerDatas.Instance.baseData.VIPLv >= 10)
+                {
+                    SysNotifyMgr.Instance.ShowTip("BindJadeNoNum");
+                }
+                else
+                {
+                    LackOfVIP(); //VIP 涓嶈冻
+                }
+               
                 return;
             }
             else if (LotteryNumber > wheelOfFortuneModel.Number && (int)UIHelper.GetMoneyCnt(1) < wheelOfFortuneModel.NeedJade)
diff --git a/System/Welfare/OperationTimeHepler.cs b/System/Welfare/OperationTimeHepler.cs
index 2e2a544..1b582a2 100644
--- a/System/Welfare/OperationTimeHepler.cs
+++ b/System/Welfare/OperationTimeHepler.cs
@@ -223,6 +223,45 @@
         }
 
         /// <summary>
+        /// 闄愭椂鎶㈣喘
+        /// </summary>
+        /// <param name="package"></param>
+        public void UpdateFlashRushToBuy(HAA17_tagMCFlashSaleInfo package)
+        {
+            OperationBase operationBase = null;
+            operationDict.TryGetValue(Operation.FlashRushToBuy, out operationBase);
+            if (string.IsNullOrEmpty(package.StartDate) || string.IsNullOrEmpty(package.EndtDate))
+            {
+                ForceStopOperation(Operation.FlashRushToBuy);
+            }
+            else
+            {
+                if (operationBase == null)
+                {
+                    operationBase = new OperationFlashRushToBuy();
+                    operationDict.Add(Operation.FlashRushToBuy, operationBase);
+                }
+                OperationFlashRushToBuy operation = operationBase as OperationFlashRushToBuy;
+                operation.Reset();
+                operation.limitLv = package.LimitLV;
+                operation.startDate = ParseOperationDate(package.StartDate);
+                operation.endDate = ParseOperationDate(package.EndtDate);
+                operation.dayReset = package.IsDayReset == 1;
+                operation.inAdvanceMinute = package.AdvanceMinutes;
+                for (int i = 0; i < package.ActivityTimeCount; i++)
+                {
+                    operation.times.Add(ParseOperationTime(package.ActivityTime[i].StartTime,
+                        package.ActivityTime[i].EndtTime));
+                }
+                operation.ParsePackage(package);
+                if (operationTimeUpdateEvent != null)
+                {
+                    operationTimeUpdateEvent(Operation.FlashRushToBuy);
+                }
+            }
+        }
+
+        /// <summary>
         /// 闄愭椂绀煎寘
         /// </summary>
         /// <param name="package"></param>
@@ -643,11 +682,12 @@
     {
         MultipleExp,
         ConsumeRebate,
-        FlashSale,
+        FlashSale,//闄愭椂鐗规儬
         BossReborn,
         GiftPackage,
         FairyCeremony, //浠欑晫鐩涘吀
         MultipRealmPoint, //N鍊嶄慨琛岀偣
+        FlashRushToBuy, //闄愭椂鎶㈣喘
         max,
     }
 }
diff --git a/System/WindowBase/ModelCenter.cs b/System/WindowBase/ModelCenter.cs
index 865aa34..cd10e20 100644
--- a/System/WindowBase/ModelCenter.cs
+++ b/System/WindowBase/ModelCenter.cs
@@ -196,6 +196,8 @@
             RegisterModel<FeatureNoticeModel>();
             RegisterModel<AwardExchangeModel>();
             RegisterModel<WheelOfFortuneModel>();
+            RegisterModel<FlashRushToBuyModel>();
+            RegisterModel<OpenServerActivityNotifyModel>();
             inited = true;
         }
 
diff --git a/Utility/DebugMousePos.cs b/Utility/DebugMousePos.cs
new file mode 100644
index 0000000..c2657b1
--- /dev/null
+++ b/Utility/DebugMousePos.cs
@@ -0,0 +1,37 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class DebugMousePos : MonoBehaviour
+{
+    [SerializeField] Text m_Content;
+    float timer = 0.5f;
+
+    private void LateUpdate()
+    {
+        if (CameraController.Instance == null)
+        {
+            return;
+        }
+
+        timer += Time.deltaTime;
+        if (timer > 0.5f)
+        {
+            timer = 0f;
+
+            Camera _mainCamera = CameraController.Instance.CameraObject;
+            RaycastHit _hitInfo;
+            Ray _ray = _mainCamera.ScreenPointToRay(Input.mousePosition);
+
+            if (Physics.Raycast(_ray, out _hitInfo, 100, LayerUtility.WalkbleMask) == false)
+            {
+                return;
+            }
+
+            m_Content.text = StringUtility.Contact("M Pos:", new Vector2(_hitInfo.point.x * 2f + GA_Hero.MapOffset.x, _hitInfo.point.z * 2f + GA_Hero.MapOffset.z));
+
+        }
+    }
+
+}
diff --git a/Utility/DebugMousePos.cs.meta b/Utility/DebugMousePos.cs.meta
new file mode 100644
index 0000000..8bc5bcc
--- /dev/null
+++ b/Utility/DebugMousePos.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6162cab73fd1bea43b8c540484a634f3
+timeCreated: 1539425015
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Utility/GlobalTimeEvent.cs b/Utility/GlobalTimeEvent.cs
index b1699c7..1266d35 100644
--- a/Utility/GlobalTimeEvent.cs
+++ b/Utility/GlobalTimeEvent.cs
@@ -11,6 +11,7 @@
     public event Action tenMinuteEvent;
     public event Action halfHourEvent;
     public event Action hourEvent;
+    public event Action halfMinuteEvent;
 
     int secondBuf = -1;
     int minuteBuf = -1;
@@ -18,6 +19,7 @@
     int tenMinuteBuf = -1;
     int halfHourBuf = -1;
     int hourBuf = -1;
+    int halfMinuteBuf = -1;
 
     public void Begin()
     {
@@ -57,6 +59,26 @@
             }
         }
 
+        var thirtySeconds = second / 30;
+        if (halfMinuteBuf != thirtySeconds)
+        {
+            try
+            {
+                if (halfMinuteEvent != null)
+                {
+                    halfMinuteEvent();
+                }
+            }
+            catch (Exception ex)
+            {
+                Debug.LogException(ex);
+            }
+            finally
+            {
+                halfMinuteBuf = thirtySeconds;
+            }
+        }
+
         var fiveMinute = minute / 5;
         if (fiveMinuteBuf != fiveMinute)
         {

--
Gitblit v1.8.0