少年修仙传客户端代码仓库
client_linchunjie
2018-09-17 db0192c0e911dc86d828ec650e995282e6eacdf2
Merge branch '3442运营活动修改'
21个文件已修改
14个文件已添加
2461 ■■■■ 已修改文件
Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA11_tagMCSpringSaleInfo.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA12_tagMCFlashGiftbagInfo.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HAB_Activity/HAB04_tagMCBossRebornInfo.cs 115 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/BossReborn/BossRebornModel.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/FlashSaleBehaviour.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/FlashSaleCoolDown.cs 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/FlashSaleModel.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/FlashSaleWin.cs 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/ImpactRankModel.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/OSGiftModel.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/OSRedEnvelopeModel.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Vip/FairyJadeInvestmentModel.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Vip/LimitedTimePackageModel.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Vip/LimitedTimePackageWin.cs 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Vip/OSTimeLimitGiftModel.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/ConsumeRebateModel.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/ConsumeRebateWin.cs 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/GiftPackageClass.cs 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/GiftPackageClass.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/MultipleExpModel.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/MultipleRealmPointModel.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationBase.cs 308 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationBase.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationBossReborn.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationBossReborn.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationConsumeRebate.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationConsumeRebate.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationFlashSale.cs 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationFlashSale.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationMultiExp.cs 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationMultiExp.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationMultipleRealmPoint.cs 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationMultipleRealmPoint.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationTimeHepler.cs 1142 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI/Effect/TimeMgr.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA11_tagMCSpringSaleInfo.cs
@@ -6,6 +6,7 @@
public class HAA11_tagMCSpringSaleInfo : GameNetPackBasic {
    public string StartDate;    // 开始日期 y-m-d
    public string EndtDate;    // 结束日期 y-m-d
    public ushort AdvanceMinutes;    // 提前显示分钟
    public byte ActivityTimeCount;
    public  tagMCSpringSaleTime[] ActivityTime;    //活动时间
    public byte IsDayReset;    //是否每天重置
@@ -20,6 +21,7 @@
    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 tagMCSpringSaleTime[ActivityTimeCount];
        for (int i = 0; i < ActivityTimeCount; i ++) {
Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA12_tagMCFlashGiftbagInfo.cs
@@ -6,6 +6,7 @@
public class HAA12_tagMCFlashGiftbagInfo : GameNetPackBasic {
    public string StartDate;    // 开始日期 y-m-d
    public string EndtDate;    // 结束日期 y-m-d
    public ushort AdvanceMinutes;    // 提前显示分钟
    public byte ActivityTimeCount;
    public  tagMCFlashGiftbagTime[] ActivityTime;    //活动时间
    public byte IsDayReset;    //是否每天重置
@@ -20,6 +21,7 @@
    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 tagMCFlashGiftbagTime[ActivityTimeCount];
        for (int i = 0; i < ActivityTimeCount; i ++) {
Core/NetworkPackage/ServerPack/HAB_Activity/HAB04_tagMCBossRebornInfo.cs
@@ -1,60 +1,55 @@
using UnityEngine;
using System.Collections;
// AB 04 Boss复活活动信息 #tagMCBossRebornInfo
public class HAB04_tagMCBossRebornInfo : GameNetPackBasic
{
    public string StartDate;    // 开始日期 y-m-d
    public string EndtDate;    // 结束日期 y-m-d
    public ushort LimitLV;    // 限制等级
    public byte TaskCnt;
    public tagMCBossRebornTaskInfo[] TaskInfo = null;
    public HAB04_tagMCBossRebornInfo()
    {
        _cmd = (ushort)0xAB04;
    }
    public override void ReadFromBytes(byte[] vBytes)
    {
        TransBytes(out StartDate, vBytes, NetDataType.Chars, 10);
        TransBytes(out EndtDate, vBytes, NetDataType.Chars, 10);
        TransBytes(out LimitLV, vBytes, NetDataType.WORD);
        TransBytes(out TaskCnt, vBytes, NetDataType.BYTE);
        TaskInfo = new tagMCBossRebornTaskInfo[TaskCnt];
        for (int i = 0; i < TaskCnt; i++)
        {
            TaskInfo[i] = new tagMCBossRebornTaskInfo();
            TransBytes(out TaskInfo[i].TaskID, vBytes, NetDataType.BYTE);
            TransBytes(out TaskInfo[i].TotalTimes, vBytes, NetDataType.BYTE);
            TransBytes(out TaskInfo[i].SingleTimes, vBytes, NetDataType.BYTE);
            TransBytes(out TaskInfo[i].AwardItemCount, vBytes, NetDataType.BYTE);
            TaskInfo[i].AwardItem = new tagMCBossRebornAwardItem[TaskInfo[i].AwardItemCount];
            for (int j = 0; j < TaskInfo[i].AwardItemCount; j++)
            {
                TaskInfo[i].AwardItem[j] = new tagMCBossRebornAwardItem();
                TransBytes(out TaskInfo[i].AwardItem[j].ItemID, vBytes, NetDataType.DWORD);
                TransBytes(out TaskInfo[i].AwardItem[j].ItemCount, vBytes, NetDataType.WORD);
                TransBytes(out TaskInfo[i].AwardItem[j].IsBind, vBytes, NetDataType.BYTE);
            }
        }
    }
    public struct tagMCBossRebornAwardItem
    {
        public uint ItemID;
        public ushort ItemCount;
        public byte IsBind;
    }
    public struct tagMCBossRebornTaskInfo
    {
        public byte TaskID;        // id
        public byte TotalTimes;        // 可完成总次数,0表示不限次数
        public byte SingleTimes;        // 单次领奖需要次数
        public byte AwardItemCount;        // 奖励物品数
        public tagMCBossRebornAwardItem[] AwardItem;        // 奖励物品信息
    }
}
using UnityEngine;
using System.Collections;
// AB 04 Boss复活活动信息 #tagMCBossRebornInfo
public class HAB04_tagMCBossRebornInfo : GameNetPackBasic {
    public string StartDate;    // 开始日期 y-m-d
    public string EndtDate;    // 结束日期 y-m-d
    public byte ResetType;    // 重置类型,0-0点重置;1-5点重置
    public ushort LimitLV;    // 限制等级
    public byte TaskCnt;
    public  tagMCBossRebornTaskInfo[] TaskInfo;
    public HAB04_tagMCBossRebornInfo () {
        _cmd = (ushort)0xAB04;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out StartDate, vBytes, NetDataType.Chars, 10);
        TransBytes (out EndtDate, vBytes, NetDataType.Chars, 10);
        TransBytes (out ResetType, vBytes, NetDataType.BYTE);
        TransBytes (out LimitLV, vBytes, NetDataType.WORD);
        TransBytes (out TaskCnt, vBytes, NetDataType.BYTE);
        TaskInfo = new tagMCBossRebornTaskInfo[TaskCnt];
        for (int i = 0; i < TaskCnt; i ++) {
            TaskInfo[i] = new tagMCBossRebornTaskInfo();
            TransBytes (out TaskInfo[i].TaskID, vBytes, NetDataType.BYTE);
            TransBytes (out TaskInfo[i].TotalTimes, vBytes, NetDataType.BYTE);
            TransBytes (out TaskInfo[i].SingleTimes, vBytes, NetDataType.BYTE);
            TransBytes (out TaskInfo[i].AwardItemCount, vBytes, NetDataType.BYTE);
            TaskInfo[i].AwardItem = new tagMCBossRebornAwardItem[TaskInfo[i].AwardItemCount];
            for (int j = 0; j < TaskInfo[i].AwardItemCount; j ++) {
                TaskInfo[i].AwardItem[j] = new tagMCBossRebornAwardItem();
                TransBytes (out TaskInfo[i].AwardItem[j].ItemID, vBytes, NetDataType.DWORD);
                TransBytes (out TaskInfo[i].AwardItem[j].ItemCount, vBytes, NetDataType.WORD);
                TransBytes (out TaskInfo[i].AwardItem[j].IsBind, vBytes, NetDataType.BYTE);
            }
        }
    }
    public struct tagMCBossRebornAwardItem {
        public uint ItemID;
        public ushort ItemCount;
        public byte IsBind;
    }
    public struct tagMCBossRebornTaskInfo {
        public byte TaskID;        // id
        public byte TotalTimes;        // 可完成总次数,0表示不限次数
        public byte SingleTimes;        // 单次领奖需要次数
        public byte AwardItemCount;        // 奖励物品数
        public  tagMCBossRebornAwardItem[] AwardItem;        // 奖励物品信息
    }
}
System/BossReborn/BossRebornModel.cs
@@ -101,8 +101,16 @@
            get {
                return OperationTimeHepler.Instance.SatisfyOpenCondition(Operation.BossReborn);
            }
        }
        }
        public bool IsAdvance
        {
            get
            {
                return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.BossReborn);
            }
        }
        public void UpdateTaskBaseInfos(HAB04_tagMCBossRebornInfo.tagMCBossRebornTaskInfo[] _tasks)
        {
            foreach (var task in _tasks)
System/OpenServerActivity/FlashSaleBehaviour.cs
@@ -20,14 +20,13 @@
        StoreModel storeModel { get { return ModelCenter.Instance.GetModel<StoreModel>(); } }
        FlashSaleModel model { get { return ModelCenter.Instance.GetModel<FlashSaleModel>(); } }
        public void Display(int index, int _id)
        public void Display(OperationFlashSale.FlashSaleGift gift)
        {
            m_BuyButton.RemoveAllListeners();
            OperationBase operationBase;
            if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashSale, out operationBase))
            {
                OperationFlashSale operation = operationBase as OperationFlashSale;
                var gift = operation.GetFlashSaleGift(index, _id);
                if (!gift.Equals(default(OperationFlashSale.FlashSaleGift)))
                {
                    m_OriginalCostIcon.SetIconWithMoneyType(gift.moneyType);
@@ -66,7 +65,7 @@
                    m_BuyButton.gameObject.SetActive(buyCount < gift.limitNum);
                    m_BuyButton.AddListener(() =>
                    {
                        model.SendBuyFlashSale(index, _id);
                        model.SendBuyFlashSale(gift);
                    });
                }
            }
System/OpenServerActivity/FlashSaleCoolDown.cs
@@ -12,25 +12,52 @@
        private void OnEnable()
        {
            DisplayTime();
            SecondEvent();
            GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
            OperationTimeHepler.Instance.dayResetEvent -= DayResetEvent;
            OperationTimeHepler.Instance.dayResetEvent += DayResetEvent;
        }
        private void DayResetEvent(int resetType)
        {
            SecondEvent();
        }
        private void SecondEvent()
        {
            var seconds = OperationTimeHepler.Instance.GetOperationSurplusTime(Operation.FlashSale);
            m_Time.timeShow.color = seconds > 3600 ? UIHelper.GetUIColor(TextColType.Green) : UIHelper.GetUIColor(TextColType.Red);
            OperationBase operationBase;
            if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashSale, out operationBase))
            {
                var operation = (operationBase as OperationFlashSale);
                var seconds = operation.GetResetSurplusTime();
                if (seconds * TimeSpan.TicksPerSecond >= TimeSpan.TicksPerDay || seconds <= 0)
                {
                    if (m_Time.gameObject.activeSelf)
                    {
                        DisplayTime(0);
                    }
                }
                else
                {
                    m_Time.timeShow.color = seconds > 3600 ? UIHelper.GetUIColor(TextColType.Green) : UIHelper.GetUIColor(TextColType.Red);
                    if (!m_Time.gameObject.activeSelf)
                    {
                        DisplayTime(seconds);
                    }
                }
            }
        }
        private void OnDisable()
        {
            GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
            OperationTimeHepler.Instance.dayResetEvent -= DayResetEvent;
        }
        void DisplayTime()
        void DisplayTime(int seconds)
        {
            var seconds = OperationTimeHepler.Instance.GetOperationSurplusTime(Operation.FlashSale);
            m_Time.timeShow.color = seconds > 3600 ? UIHelper.GetUIColor(TextColType.Green) : UIHelper.GetUIColor(TextColType.Red);
            m_Time.Begin(DateTime.Now.AddTicks(seconds * TimeSpan.TicksPerSecond));
        }
    }
System/OpenServerActivity/FlashSaleModel.cs
@@ -11,6 +11,7 @@
        {
            OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;
            OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;
            OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent;
            TimeMgr.Instance.OnDayEvent += OnDayEvent;
            OpenServerActivityCenter.Instance.Register(4, this);
        }
@@ -28,6 +29,7 @@
        {
            OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;
            OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent;
            OperationTimeHepler.Instance.operationAdvanceEvent -= OperationAdvanceEvent;
            TimeMgr.Instance.OnDayEvent -= OnDayEvent;
        }
@@ -36,6 +38,17 @@
            if (type == Operation.FlashSale && state == 0)
            {
                UpdateRedpoint();
                if (onStateUpate != null)
                {
                    onStateUpate(4);
                }
            }
        }
        private void OperationAdvanceEvent(Operation type)
        {
            if (type == Operation.FlashSale)
            {
                if (onStateUpate != null)
                {
                    onStateUpate(4);
@@ -73,19 +86,7 @@
        {
            get
            {
                OperationBase operationBase;
                OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashSale, out operationBase);
                return operationBase != null && operationBase.SatisfyOpenCondition() && operationBase.InTime(TimeUtility.ServerNow);
            }
        }
        public bool InAdvanceOpen
        {
            get
            {
                OperationBase operationBase;
                OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashSale, out operationBase);
                return operationBase != null && operationBase.SatisfyOpenCondition() && operationBase.InAdvanceTime(TimeUtility.ServerNow);
                return OperationTimeHepler.Instance.SatisfyOpenCondition(Operation.FlashSale);
            }
        }
@@ -97,7 +98,15 @@
            }
        }
        public void SendBuyFlashSale(int index, int id)
        public bool IsAdvance
        {
            get
            {
                return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.FlashSale);
            }
        }
        public void SendBuyFlashSale(OperationFlashSale.FlashSaleGift gift)
        {
            OperationBase operationBase;
            if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashSale, out operationBase))
@@ -105,6 +114,7 @@
                OperationFlashSale operation = operationBase as OperationFlashSale;
                if (operation.InAdvanceTime(TimeUtility.ServerNow))
                {
                    SysNotifyMgr.Instance.ShowTip("InOperationTimeError");
                    return;
                }
                if (!operation.InTime(TimeUtility.ServerNow))
@@ -112,7 +122,6 @@
                    SysNotifyMgr.Instance.ShowTip("ActiveOutTime");
                    return;
                }
                var gift = operation.GetFlashSaleGift(index, id);
                if (!gift.Equals(default(OperationFlashSale.FlashSaleGift)))
                {
                    var buyInfo = storeModel.GetBuyShopLimit((uint)gift.id);
@@ -183,10 +192,9 @@
            if (operationBase != null && operationBase.InTime(TimeUtility.ServerNow))
            {
                OperationFlashSale operation = operationBase as OperationFlashSale;
                var index = operation.IndexOfFlashShop();
                if (index != -1 && index < operation.flashShops.Count)
                OperationFlashSale.FlashSale flashShop;
                if (operation.TryGetFlashSale(TimeUtility.ServerNow, out flashShop))
                {
                    var flashShop = operation.flashShops[index];
                    for (int i = 0; i < flashShop.gifts.Length; i++)
                    {
                        var gift = flashShop.gifts[i];
System/OpenServerActivity/FlashSaleWin.cs
@@ -80,10 +80,9 @@
                OperationFlashSale operation = operationBase as OperationFlashSale;
                m_OpreationTime.text = StringUtility.Contact(Language.Get("ExpActivity_Text1"), operation.ToDisplayTime());
                m_RefreshGiftTime.gameObject.SetActive(operation.allDay);
                var index = operation.IndexOfFlashShop();
                if (index != -1 && index < operation.flashShops.Count)
                OperationFlashSale.FlashSale flashSale;
                if (operation.TryGetFlashSale(TimeUtility.ServerNow, out flashSale))
                {
                    var flashSale = operation.flashShops[index];
                    if (flashSale.gifts.Length > 0)
                    {
                        var moneyType = flashSale.gifts[0].moneyType;
@@ -95,7 +94,7 @@
                        if (i < flashSale.gifts.Length)
                        {
                            m_FlashSaleBehaviours[i].gameObject.SetActive(true);
                            m_FlashSaleBehaviours[i].Display(index, flashSale.gifts[i].id);
                            m_FlashSaleBehaviours[i].Display(flashSale.gifts[i]);
                        }
                        else
                        {
@@ -130,14 +129,30 @@
            OperationBase operationBase;
            OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashSale, out operationBase);
            var seconds = 0;
            var inAdvance = false;
            if (operationBase != null)
            {
                OperationFlashSale operation = operationBase as OperationFlashSale;
                seconds = operation.GetSurplusTime(operation.IndexOfFlashShop());
                if (operationBase.InAdvanceTime(TimeUtility.ServerNow))
                {
                    inAdvance = true;
                    seconds = operationBase.GetSecondsBeforeStart(TimeUtility.ServerNow);
                }
                else
                {
                    OperationFlashSale operation = operationBase as OperationFlashSale;
                    seconds = operation.GetResetSurplusTime();
                }
            }
            if (seconds > 0)
            {
                m_SurplusTime.text = Language.Get("LimitGift1", TimeUtility.SecondsToDHMSCHS(seconds));
                if (inAdvance)
                {
                    m_SurplusTime.text = string.Format("{0}之后开启", TimeUtility.SecondsToDHMSCHS(seconds));
                }
                else
                {
                    m_SurplusTime.text = Language.Get("LimitGift1", TimeUtility.SecondsToDHMSCHS(seconds));
                }
            }
            else
            {
System/OpenServerActivity/ImpactRankModel.cs
@@ -670,6 +670,14 @@
                return TimeUtility.OpenDay < openServerRankDays && FuncOpen.Instance.IsFuncOpen(125);
            }
        }
        public bool IsAdvance
        {
            get
            {
                return false;
            }
        }
        #endregion
    }
@@ -716,7 +724,7 @@
            _functionOrder = 0;
            foreach (var _order in openServerActivitys.Keys)
            {
                if (openServerActivitys[_order].IsOpen)
                if (openServerActivitys[_order].IsOpen || openServerActivitys[_order].IsAdvance)
                {
                    _functionOrder = _order;
                    return true;
@@ -729,7 +737,7 @@
        {
            if (openServerActivitys.ContainsKey(_funcOrder))
            {
                return openServerActivitys[_funcOrder].IsOpen;
                return openServerActivitys[_funcOrder].IsOpen || openServerActivitys[_funcOrder].IsAdvance;
            }
            return false;
        }
@@ -765,6 +773,7 @@
    public interface IOpenServerActivity
    {
        bool IsOpen { get; }
        bool IsAdvance { get; }
        bool priorityOpen { get; }
        event Action<int> onStateUpate;
System/OpenServerActivity/OSGiftModel.cs
@@ -76,6 +76,15 @@
        }
        public int timeOverdueGiftId { get; private set; }
        public bool IsAdvance
        {
            get
            {
                return false;
            }
        }
        public DateTime overDueTime = DateTime.Now;
        public void UpdateTime(HAA16_tagMCSuperGiftInfo package)
        {
System/OpenServerActivity/OSRedEnvelopeModel.cs
@@ -424,6 +424,14 @@
            }
        }
        public bool IsAdvance
        {
            get
            {
                return false;
            }
        }
        public event Action OSRedEnvelopeInfoEnvent;
        public event Action<int> onStateUpate;
System/Vip/FairyJadeInvestmentModel.cs
@@ -47,6 +47,13 @@
        }
    }
    public bool IsAdvance
    {
        get
        {
            return false;
        }
    }
    private bool IsRedPoint()//红点
    {
System/Vip/LimitedTimePackageModel.cs
@@ -42,6 +42,14 @@
        }
    }
    public bool IsAdvance
    {
        get
        {
            return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.GiftPackage);
        }
    }
    public void OnBeforePlayerDataInitialize()
    {
        IsShowPanel = false;
@@ -141,14 +149,13 @@
        if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.GiftPackage, out operationBase))
        {
            GiftPackageClass operation = operationBase as GiftPackageClass;
            var index = operation.IndexOfFlashShop();
            if (index != -1 && index < operation.giftpackage1.Count)
            GiftPackageClass.Gift_Package gift;
            if (operation.TryGetGift(TimeUtility.ServerNow, out gift))
            {
                var giftpackage = operation.giftpackage1[index];
                if (giftpackage.gifts.Length > 0)
                if (gift.gifts.Length > 0)
                {
                    int BuyCountLimit = giftpackage.gifts[0].limitNum;//限购数量
                    int GiftID = giftpackage.gifts[0].id;//礼包ID
                    int BuyCountLimit = gift.gifts[0].limitNum;//限购数量
                    int GiftID = gift.gifts[0].id;//礼包ID
                    if (DicBuyPackage.ContainsKey(GiftID) && DicBuyPackage[GiftID] >= BuyCountLimit)
                    {
                        IsBuyBool = true;
System/Vip/LimitedTimePackageWin.cs
@@ -89,36 +89,34 @@
            if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.GiftPackage, out operationBase))
            {
                GiftPackageClass operation = operationBase as GiftPackageClass;
               // m_Text_ActivityTimeTo.text = StringUtility.Contact(Language.Get("ExpActivity_Text1"), operation.ToDisplayTime());
                var index = operation.IndexOfFlashShop();
                if (index != -1 && index < operation.giftpackage1.Count)
                GiftPackageClass.Gift_Package gift;
                if (operation.TryGetGift(TimeUtility.ServerNow, out gift))
                {
                    var giftpackage = operation.giftpackage1[index];
                    if (giftpackage.gifts.Length > 0)
                    if (gift.gifts.Length > 0)
                    {
                        string str = string.Empty;
                        str= giftpackage.gifts[0].rmb + Language.Get("RMB_Package_Z");
                        str = gift.gifts[0].rmb + Language.Get("RMB_Package_Z");
                        m_Text_PackageName.text = str;
                        m_Money1.text = giftpackage.gifts[0].rmbOriginal + Language.Get("RMB_Z");//原价
                        m_Money2.text = giftpackage.gifts[0].rmb + Language.Get("RMB_Z");//现价
                        int BuyCountLimit = giftpackage.gifts[0].limitNum;//限购数量
                        int GiftID = giftpackage.gifts[0].id;//礼包ID
                        m_Money1.text = gift.gifts[0].rmbOriginal + Language.Get("RMB_Z");//原价
                        m_Money2.text = gift.gifts[0].rmb + Language.Get("RMB_Z");//现价
                        int BuyCountLimit = gift.gifts[0].limitNum;//限购数量
                        int GiftID = gift.gifts[0].id;//礼包ID
                        m_Buy_Btn.RemoveAllListeners();
                        m_Buy_Btn.AddListener(()=>
                        m_Buy_Btn.AddListener(() =>
                        {
                            if (limitedTimePackageItemModel.IsExpired())
                            {
                                m_Buy_Btn.interactable = false;
                                time = 0;
                                limitedTimePackageItemModel.OpenFreePlat(str, giftpackage.gifts[0].rmb, giftpackage.gifts[0].OrderInfo);
                                limitedTimePackageItemModel.OpenFreePlat(str, gift.gifts[0].rmb, gift.gifts[0].OrderInfo);
                            }
                            else
                            {
                                SysNotifyMgr.Instance.ShowTip("LimitGift9");
                                return;
                            }
                        });
                        if (limitedTimePackageItemModel.DicBuyPackage.ContainsKey(GiftID) && limitedTimePackageItemModel.DicBuyPackage[GiftID] >= BuyCountLimit)
                        {
@@ -130,7 +128,7 @@
                            m_Buy_Btn.gameObject.SetActive(true);
                            m_BoughtObj.SetActive(false);
                        }
                        var items = giftpackage.gifts[0].items;
                        var items = gift.gifts[0].items;
                        for (int i = 0; i < items.Length; i++)
                        {
                            int type = i;
@@ -162,6 +160,7 @@
                        }
                    }
                }
                // m_Text_ActivityTimeTo.text = StringUtility.Contact(Language.Get("ExpActivity_Text1"), operation.ToDisplayTime());
            }
        }
System/Vip/OSTimeLimitGiftModel.cs
@@ -51,6 +51,14 @@
            }
        }
        public bool IsAdvance
        {
            get
            {
                return false;
            }
        }
        public override void Init()
        {
            var _openDay = 0;
System/Welfare/ConsumeRebateModel.cs
@@ -14,7 +14,7 @@
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
            OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;
            OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;
            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
            OperationTimeHepler.Instance.dayResetEvent += DayResetEvent;
            OpenServerActivityCenter.Instance.Register(1, this);
        }
@@ -26,7 +26,6 @@
        public void OnPlayerLoginOk()
        {
            UpdateRedpoint();
            rebateOpenDayIndex = OperationTimeHepler.Instance.IndexOfOperationDays(Operation.ConsumeRebate);
        }
        public override void UnInit()
@@ -34,7 +33,7 @@
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= PlayerDataRefreshInfoEvent;
            OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;
            OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent;
            GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
            OperationTimeHepler.Instance.dayResetEvent -= DayResetEvent;
        }
        public bool IsOpen
@@ -61,7 +60,13 @@
            }
        }
        int rebateOpenDayIndex = -1;
        public bool IsAdvance
        {
            get
            {
                return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.ConsumeRebate);
            }
        }
        public bool IsRebateGot(int day, int _index)
        {
@@ -89,13 +94,15 @@
            }
        }
        private void SecondEvent()
        private void DayResetEvent(int resetType)
        {
            var index = OperationTimeHepler.Instance.IndexOfOperationDays(Operation.ConsumeRebate);
            if (index != rebateOpenDayIndex)
            OperationBase operationBase;
            if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.ConsumeRebate, out operationBase))
            {
                rebateOpenDayIndex = index;
                UpdateRedpoint();
                if (resetType == operationBase.resetType)
                {
                    UpdateRedpoint();
                }
            }
        }
@@ -189,7 +196,6 @@
            {
                return;
            }
            rebateOpenDayIndex = OperationTimeHepler.Instance.IndexOfOperationDays(Operation.ConsumeRebate);
            OperationBase operationBase;
            if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.ConsumeRebate, out operationBase))
            {
System/Welfare/ConsumeRebateWin.cs
@@ -20,8 +20,6 @@
        [SerializeField] ScrollerController m_Controller;
        int rebateOpenDayIndex = -1;
        ConsumeRebateModel model { get { return ModelCenter.Instance.GetModel<ConsumeRebateModel>(); } }
        #region Built-in
        protected override void BindController()
@@ -37,11 +35,9 @@
        protected override void OnPreOpen()
        {
            Display();
            rebateOpenDayIndex = OperationTimeHepler.Instance.IndexOfOperationDays(Operation.ConsumeRebate);
            TimeUtility.OnServerOpenDayRefresh += OnServerOpenDayRefresh;
            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
            model.consumeRebateUpdateEvent += ConsumeRebateUpdateEvent;
            OperationTimeHepler.Instance.operationTimeUpdateEvent += OperationTimeUpdateEvent;
            OperationTimeHepler.Instance.dayResetEvent += DayResetEvent;
        }
        protected override void OnAfterOpen()
@@ -50,10 +46,9 @@
        protected override void OnPreClose()
        {
            GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
            TimeUtility.OnServerOpenDayRefresh -= OnServerOpenDayRefresh;
            model.consumeRebateUpdateEvent -= ConsumeRebateUpdateEvent;
            OperationTimeHepler.Instance.operationTimeUpdateEvent -= OperationTimeUpdateEvent;
            OperationTimeHepler.Instance.dayResetEvent -= DayResetEvent;
        }
        protected override void OnAfterClose()
@@ -86,23 +81,15 @@
            m_Controller.m_Scorller.RefreshActiveCellViews();
        }
        private void SecondEvent()
        private void DayResetEvent(int resetType)
        {
            var index = OperationTimeHepler.Instance.IndexOfOperationDays(Operation.ConsumeRebate);
            if (index != rebateOpenDayIndex)
            OperationBase operationBase;
            if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.ConsumeRebate, out operationBase))
            {
                rebateOpenDayIndex = index;
                DisplayRebate();
            }
        }
        private void OnServerOpenDayRefresh()
        {
            var index = OperationTimeHepler.Instance.IndexOfOperationDays(Operation.ConsumeRebate);
            if (index != rebateOpenDayIndex)
            {
                rebateOpenDayIndex = index;
                DisplayRebate();
                if (resetType == operationBase.resetType)
                {
                    DisplayRebate();
                }
            }
        }
System/Welfare/GiftPackageClass.cs
New file
@@ -0,0 +1,106 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class GiftPackageClass : OperationBase
    {
        public List<Gift_Package> giftpackage1 = new List<Gift_Package>();
        public bool TryGetGift(DateTime time, out Gift_Package flashSale)
        {
            flashSale = default(Gift_Package);
            var index = IndexOfTime(time);
            index = Mathf.Min(index, giftpackage1.Count - 1);
            if (index >= 0)
            {
                flashSale = giftpackage1[index];
            }
            return index >= 0;
        }
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
        public override void Reset()
        {
            base.Reset();
            giftpackage1.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(HAA12_tagMCFlashGiftbagInfo package)
        {
            for (int i = 0; i < package.GiftbagTypeCount; i++)
            {
                var GiftbagType = new Gift_Package();
                var Giftbag = package.GiftbagTypeInfo[i];
                GiftbagType.gifts = new GiftPackageGift[Giftbag.GiftbagCount];
                for (int k = 0; k < Giftbag.GiftbagCount; k++)
                {
                    var gift = new GiftPackageGift();
                    var pakGift = Giftbag.GiftbagInfo[k];
                    gift.id = (int)pakGift.GiftID;
                    gift.limitNum = pakGift.BuyCountLimit;
                    gift.rmb = (int)pakGift.RMB;
                    gift.rmbOriginal = (int)pakGift.RMBOriginal;
                    gift.OrderInfo = pakGift.OrderInfo;
                    gift.OrderInfoLength = pakGift.OrderInfoLen;
                    gift.items = new GiftPackageItem[pakGift.GiftItemCount];
                    for (int q = 0; q < pakGift.GiftItemCount; q++)
                    {
                        var item = new GiftPackageItem();
                        item.itemId = (int)pakGift.ItemInfo[q].ItemID;
                        item.isBind = pakGift.ItemInfo[q].IsBind;
                        item.itemCount = pakGift.ItemInfo[q].ItemCount;
                        item.isMainItem = pakGift.ItemInfo[q].IsMainItem == 1;
                        gift.items[q] = item;
                    }
                    GiftbagType.gifts[k] = gift;
                }
                giftpackage1.Add(GiftbagType);
            }
        }
        public struct Gift_Package
        {
            public GiftPackageGift[] gifts;
        }
        public struct GiftPackageGift
        {
            public int id;
            public int limitNum;//限购数
            public int rmb;//人民币
            public int rmbOriginal;//原价
            public string OrderInfo;//商品编号
            public int OrderInfoLength;//长度
            public GiftPackageItem[] items;
        }
        public struct GiftPackageItem
        {
            public int itemId;
            public int itemCount;
            public int isBind;
            public bool isMainItem;
        }
    }
}
System/Welfare/GiftPackageClass.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 5051eb1dd73718a418d483105847c859
timeCreated: 1536803961
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Welfare/MultipleExpModel.cs
@@ -45,7 +45,7 @@
                    {
                        for (int i = 0; i < operationBase.times.Count; i++)
                        {
                            if (operationBase.times[i].SideOfTime(TimeUtility.ServerNow) == -1)
                            if (operationBase.times[i].CompareTime(TimeUtility.ServerNow) == -1)
                            {
                                SysNotifyMgr.Instance.ShowTip("ExpActivity_Ready",
                                    operation.GetMultipleCHS(),
@@ -128,6 +128,14 @@
            }
        }
        public bool IsAdvance
        {
            get
            {
                return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.MultipleExp);
            }
        }
        public void SetDayRemind()
        {
            if (multipleExpRedpoint.state == RedPointState.Simple)
System/Welfare/MultipleRealmPointModel.cs
@@ -60,6 +60,14 @@
            }
        }
        public bool IsAdvance
        {
            get
            {
                return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.MultipRealmPoint);
            }
        }
        private void CheckReconnect()
        {
            if (!(StageManager.Instance.CurrentStage is DungeonStage))
System/Welfare/OperationBase.cs
New file
@@ -0,0 +1,308 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class OperationBase
    {
        public OperationDate startDate;
        public OperationDate endDate;
        public List<OperationTime> times = new List<OperationTime>();
        /// <summary>
        /// 是否每日重置
        /// </summary>
        public bool dayReset = false;
        /// <summary>
        /// 0-0点重置,1-5点重置
        /// </summary>
        public int resetType = 0;
        public const int DayResetHour = 5;
        public bool stepTimeNotify = false;
        public bool stepDateNotify = false;
        public bool inTimeNotify = false;
        public bool inDateNotify = false;
        public int inAdvanceMinute = 0;
        public bool inAdvanceNotify = false;
        public int limitLv;
        public bool allDay
        {
            get { return times.Count <= 0; }
        }
        public int totalDays
        {
            get { return endDate - startDate; }
        }
        public bool InTime(DateTime time)
        {
            if (!InDay(time))
            {
                return false;
            }
            if (allDay)
            {
                return InDayResetTime(time);
            }
            for (int i = 0; i < times.Count; i++)
            {
                if (times[i].InTime(time))
                {
                    return true;
                }
            }
            return false;
        }
        bool InDayResetTime(DateTime time)
        {
            if (!InDay(time))
            {
                return false;
            }
            switch (resetType)
            {
                case 0:
                    return true;
                case 1:
                    var indexOfDays = IndexOfDays(time);
                    if (indexOfDays == 0)
                    {
                        return time.Hour >= DayResetHour;
                    }
                    if (indexOfDays == totalDays)
                    {
                        return time.Hour < DayResetHour;
                    }
                    break;
            }
            return false;
        }
        public bool InDay(DateTime time)
        {
            OperationDate date = new OperationDate()
            {
                year = time.Year,
                month = time.Month,
                day = time.Day,
            };
            return date >= startDate && date <= endDate;
        }
        protected int IndexOfDays(DateTime time)
        {
            if (!InDay(time))
            {
                return -1;
            }
            DateTime s = new DateTime(startDate.year, startDate.month, startDate.day);
            return (time - s).Days;
        }
        protected virtual int IndexOfTime(DateTime time, int compare = 0)
        {
            if (allDay)
            {
                if (!dayReset)
                {
                    return 0;
                }
                var index = IndexOfDays(time);
                switch (resetType)
                {
                    case 0:
                        return index;
                    case 1:
                        return time.Hour < DayResetHour ? Mathf.Max(0, index - 1) : index;
                    default:
                        return index;
                }
            }
            else
            {
                var index = 0;
                for (int i = 0; i < times.Count; i++)
                {
                    if (times[i].InTime(time))
                    {
                        index = i;
                        break;
                    }
                    if (times[i].CompareTime(TimeUtility.ServerNow) == compare)
                    {
                        index = i;
                    }
                }
                return index;
            }
        }
        public int GetSurplusTime(DateTime time)
        {
            var seconds = 0;
            if (InTime(time))
            {
                if (allDay)
                {
                    seconds += GetSurplusDayResetTime(time);
                }
                else
                {
                    for (int i = 0; i < times.Count; i++)
                    {
                        if (times[i].InTime(time))
                        {
                            seconds += times[i] - time;
                            break;
                        }
                    }
                }
            }
            return seconds;
        }
        int GetSurplusDayResetTime(DateTime time)
        {
            switch (resetType)
            {
                case 0:
                    return (int)(endDate.AddSeconds(24 * 60 * 60) - time).TotalSeconds;
                case 1:
                    var endTime = new DateTime(endDate.year, endDate.month, endDate.day, DayResetHour, 0, 0);
                    return (int)(endTime - time).TotalSeconds;
            }
            return 0;
        }
        public bool InAdvanceTime(DateTime time)
        {
            if (inAdvanceMinute <= 0)
            {
                return false;
            }
            var advanceSeconds = inAdvanceMinute * 60;
            var beforeStartSeconds = GetSecondsBeforeStart(time);
            return beforeStartSeconds > 0 && beforeStartSeconds <= advanceSeconds;
        }
        public int GetSecondsBeforeStart(DateTime time)
        {
            var seconds = 0;
            if (InTime(time))
            {
                return 0;
            }
            if (allDay)
            {
                var startHour = 0;
                if (resetType == 0)
                {
                    startHour = 0;
                }
                else if (resetType == 1)
                {
                    startHour = DayResetHour;
                }
                var startTime = new DateTime(startDate.year, startDate.month, startDate.day, startHour, 0, 0);
                seconds = (int)(startTime - time).TotalSeconds;
            }
            else
            {
                var index = IndexOfDays(time);
                var date = startDate.AddDays(index);
                for (int i = 0; i < times.Count; i++)
                {
                    var startTime = new DateTime(date.year, date.month, date.day, times[i].startHour, times[i].startMinute, 0);
                    seconds = (int)(startTime - time).TotalSeconds;
                    if (seconds > 0)
                    {
                        break;
                    }
                }
            }
            return seconds;
        }
        public int GetResetSurplusTime()
        {
            var time = TimeUtility.ServerNow;
            if (!InTime(time))
            {
                return 0;
            }
            var seconds = 0;
            if (allDay)
            {
                if (!dayReset)
                {
                    return GetSurplusTime(time);
                }
                if (resetType == 0)
                {
                    DateTime endOperationTime = new DateTime(TimeUtility.Year, TimeUtility.Month,
                          TimeUtility.Day, 0, 0, 0);
                    endOperationTime = endOperationTime.AddDays(1);
                    seconds = (int)(endOperationTime - TimeUtility.ServerNow).TotalSeconds;
                }
                else if (resetType == 1)
                {
                    DateTime endOperationTime = new DateTime(TimeUtility.Year, TimeUtility.Month,
                          TimeUtility.Day, DayResetHour, 0, 0);
                    if (time.Hour >= DayResetHour)
                    {
                        endOperationTime = endOperationTime.AddDays(1);
                    }
                    seconds = (int)(endOperationTime - TimeUtility.ServerNow).TotalSeconds;
                }
            }
            else
            {
                for (int i = 0; i < times.Count; i++)
                {
                    if (times[i].InTime(time))
                    {
                        DateTime endOperationTime = new DateTime(TimeUtility.Year, TimeUtility.Month,
                                TimeUtility.Day, times[i].endHour, times[i].endMinute, 0);
                        seconds = (int)(endOperationTime - TimeUtility.ServerNow).TotalSeconds;
                        break;
                    }
                }
            }
            return seconds;
        }
        public virtual string ToDisplayTime()
        {
            return string.Empty;
        }
        public virtual void Reset()
        {
            stepTimeNotify = false;
            stepDateNotify = false;
            inTimeNotify = false;
            inDateNotify = false;
            dayReset = false;
            resetType = 0;
            limitLv = 0;
            inAdvanceNotify = false;
            inAdvanceMinute = 0;
            times.Clear();
        }
        public virtual bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
    }
}
System/Welfare/OperationBase.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: d7a32da08ee54c94aa3e7054a83a2446
timeCreated: 1536804239
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Welfare/OperationBossReborn.cs
New file
@@ -0,0 +1,14 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class OperationBossReborn : OperationBase
    {
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
    }
}
System/Welfare/OperationBossReborn.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 871a52c1c3a7e6140bb40344a7daa763
timeCreated: 1536803824
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Welfare/OperationConsumeRebate.cs
New file
@@ -0,0 +1,91 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class OperationConsumeRebate : OperationBase
    {
        public List<Rebate> rebates = new List<Rebate>();
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
        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 override void Reset()
        {
            base.Reset();
            rebates.Clear();
        }
        public void ParseRebate(HAA09_tagMCCostRebateInfo package)
        {
            for (int i = 0; i < package.AwardDays; i++)
            {
                var _rebate = package.AwardDayInfo[i];
                Rebate rebate = new Rebate();
                for (int k = 0; k < _rebate.AwardCount; k++)
                {
                    RebateGrade rebateGrade = new RebateGrade();
                    rebateGrade.needGold = (int)_rebate.AwardInfo[k].NeedGold;
                    rebateGrade.index = _rebate.AwardInfo[k].AwardIndex;
                    for (int q = 0; q < _rebate.AwardInfo[k].AwardItemCount; q++)
                    {
                        var _item = _rebate.AwardInfo[k].AwardItem[q];
                        rebateGrade.items.Add(new Item()
                        {
                            itemId = (int)_item.ItemID,
                            count = _item.ItemCount,
                            isBind = _item.IsBind,
                        });
                    }
                    rebate.rebateGrades.Add(rebateGrade);
                }
                rebates.Add(rebate);
            }
        }
        public Rebate GetRebate(DateTime time)
        {
            if (rebates.Count == 0)
            {
                return null;
            }
            var index = Mathf.Min(rebates.Count - 1, IndexOfTime(time));
            return rebates[index];
        }
        public class Rebate
        {
            public List<RebateGrade> rebateGrades = new List<RebateGrade>();
        }
        public class RebateGrade
        {
            public int needGold;
            public int index;//奖励索引
            public List<Item> items = new List<Item>();
        }
        public struct Item
        {
            public int itemId;
            public int count;
            public int isBind;
        }
    }
}
System/Welfare/OperationConsumeRebate.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 1bfa06ccdcd3afa4cafd3c186ce338e4
timeCreated: 1536803885
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Welfare/OperationFlashSale.cs
New file
@@ -0,0 +1,103 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class OperationFlashSale : OperationBase
    {
        public List<FlashSale> flashShops = new List<FlashSale>();
        public bool TryGetFlashSale(DateTime time, out FlashSale flashSale)
        {
            flashSale = default(FlashSale);
            var index = IndexOfTime(time, inAdvanceMinute > 0 ? -1 : 0);
            index = Mathf.Min(index, flashShops.Count - 1);
            if (index >= 0)
            {
                flashSale = flashShops[index];
            }
            return index >= 0;
        }
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
        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(HAA11_tagMCSpringSaleInfo package)
        {
            for (int i = 0; i < package.ShopCount; i++)
            {
                var flashShop = new FlashSale();
                var shop = package.ShopInfo[i];
                flashShop.gifts = new FlashSaleGift[shop.GiftbagCount];
                for (int k = 0; k < shop.GiftbagCount; k++)
                {
                    var gift = new FlashSaleGift();
                    var pakGift = shop.GiftbagInfo[k];
                    gift.id = (int)pakGift.GiftID;
                    gift.limitNum = pakGift.BuyCountLimit;
                    gift.moneyNumber = (int)pakGift.MoneyNumber;
                    gift.moneyType = pakGift.MoneyType;
                    gift.moneyOriginal = (int)pakGift.MoneyOriginal;
                    gift.items = new FlashSaleItem[pakGift.GiftItemCount];
                    for (int q = 0; q < pakGift.GiftItemCount; q++)
                    {
                        var item = new FlashSaleItem();
                        item.itemId = (int)pakGift.ItemInfo[q].ItemID;
                        item.isBind = pakGift.ItemInfo[q].IsBind;
                        item.itemCount = pakGift.ItemInfo[q].ItemCount;
                        item.isMainItem = pakGift.ItemInfo[q].IsMainItem == 1;
                        gift.items[q] = item;
                    }
                    flashShop.gifts[k] = gift;
                }
                flashShops.Add(flashShop);
            }
        }
        public struct FlashSale
        {
            public FlashSaleGift[] gifts;
        }
        public struct FlashSaleGift
        {
            public int id;
            public int limitNum;
            public int moneyType;
            public int moneyNumber;
            public int moneyOriginal;
            public FlashSaleItem[] items;
        }
        public struct FlashSaleItem
        {
            public int itemId;
            public int itemCount;
            public int isBind;
            public bool isMainItem;
        }
    }
}
System/Welfare/OperationFlashSale.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 72f839fb443541941a4b633bb0fbc1ce
timeCreated: 1536804031
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Welfare/OperationMultiExp.cs
New file
@@ -0,0 +1,55 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class OperationMultiExp : OperationBase
    {
        public int multiple;
        public override string ToDisplayTime()
        {
            var textBuilder = OperationTimeHepler.textBuilder;
            textBuilder.Length = 0;
            if (allDay)
            {
                textBuilder.Append(Language.Get("OpenAllDay"));
            }
            else
            {
                if (startDate != endDate)
                {
                    textBuilder.Append(Language.Get("EveryDay"));
                }
                for (int i = 0, n = times.Count; i < n; i++)
                {
                    textBuilder.Append(times[i].ToString());
                    if (i < n - 1)
                    {
                        textBuilder.Append("、");
                    }
                }
            }
            return textBuilder.ToString();
        }
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
        public string GetMultipleCHS()
        {
            if (multiple / 10000 == 2)
            {
                return Language.Get("Num_CHS_Double");
            }
            else
            {
                return Language.Get(StringUtility.Contact("Num_CHS_", multiple / 10000));
            }
        }
    }
}
System/Welfare/OperationMultiExp.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 7440669afa465c14dbc84fb90070c92a
timeCreated: 1536804176
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Welfare/OperationMultipleRealmPoint.cs
New file
@@ -0,0 +1,126 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class OperationMultipleRealmPoint : OperationBase
    {
        public int multiplePractice; //倍数
        public int startHour = 5;
        public int startMinute = 0;
        public int startSecond = 0;
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
        public bool InActiveTime(DateTime time)
        {
            if (time.Year != startDate.year && time.Year != endDate.year)
            {
                return false;
            }
            if (startDate.year != endDate.year)
            {
                if (time.Year == startDate.year)
                {
                    if (time.Month < startDate.month)
                    {
                        return false;
                    }
                    else if (time.Month == startDate.month && time.Day < startDate.day)
                    {
                        return false;
                    }
                    else if (time.Month == startDate.month
                        && time.Day == startDate.day
                        && time.Hour < startHour)
                    {
                        return false;
                    }
                    else if (time.Month == startDate.month
                       && time.Day == startDate.day
                       && time.Hour == startHour
                       && time.Minute < startMinute)
                    {
                        return false;
                    }
                    else if (time.Month == startDate.month
                      && time.Day == startDate.day
                      && time.Hour == startHour
                      && time.Minute == startMinute
                        && time.Second < startSecond)
                    {
                        return false;
                    }
                }
                else if (time.Year == endDate.year)
                {
                    if (time.Month > endDate.month)
                    {
                        return false;
                    }
                    else if (time.Month == endDate.month && time.Day > endDate.day)
                    {
                        return false;
                    }
                    else if (time.Month == endDate.month
                        && time.Day == endDate.day
                        && time.Hour > startHour)
                    {
                        return false;
                    }
                    else if (time.Month == endDate.month
                       && time.Day == endDate.day
                       && time.Hour == startHour
                       && time.Minute > startMinute)
                    {
                        return false;
                    }
                    else if (time.Month == endDate.month
                      && time.Day == endDate.day
                      && time.Hour == startHour
                      && time.Minute == startMinute
                        && time.Second > startSecond)
                    {
                        return false;
                    }
                }
            }
            else
            {
                if (time.Month < startDate.month
                    || (time.Month == startDate.month && time.Day < startDate.day)
                    || (time.Month == startDate.month && time.Day == startDate.day && time.Hour < startHour)
                    || (time.Month == startDate.month && time.Day == startDate.day && time.Hour == startHour && time.Minute < startMinute)
                    || (time.Month == startDate.month && time.Day == startDate.day && time.Hour == startHour && time.Minute == startMinute) && time.Second < startSecond)
                {
                    return false;
                }
                if (time.Month > endDate.month
                    || (time.Month == endDate.month && time.Day > endDate.day)
                    || (time.Month == endDate.month && time.Day == endDate.day && time.Hour > startHour)
                     || (time.Month == endDate.month && time.Day == endDate.day && time.Hour == startHour && time.Minute > startMinute)
                    || (time.Month == endDate.month && time.Day == endDate.day && time.Hour == startHour && time.Minute == startMinute) && time.Second > startSecond)
                {
                    return false;
                }
            }
            return true;
        }
        public int GetRemainTime(DateTime time)
        {
            var seconds = 0;
            if (InActiveTime(time))
            {
                DateTime endTime = new DateTime(endDate.year, endDate.month, endDate.day, startHour, 0, 0);
                seconds = (int)(endTime - time).TotalSeconds;
            }
            return seconds;
        }
    }
}
System/Welfare/OperationMultipleRealmPoint.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 7b9f0fb0bdae59749b657f227e556d59
timeCreated: 1536803704
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Welfare/OperationTimeHepler.cs
@@ -15,11 +15,13 @@
        public event Action<Operation> operationServerCloseEvent;//特殊情况下触发
        public event Action<Operation, int> operationEndEvent;//活动结束时间触发  第二个参数0--过活动时间触发  1--过活动天触发
        public event Action<Operation, int> operationStartEvent;//活动开始时间并且满足开启条件触发 第二个参数0--活动时间触发  1--活动天触发
        public event Action<Operation> operationAdvanceEvent;//活动提前开放事件
        public event Action<int> dayResetEvent;//活动重置事件0-0点 1-5点
        public event Action<Operation> operationAdvanceEvent;//活动在提前开启的时间内
        public OperationTimeHepler()
        {
            DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitializeEvent;
            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
            TimeMgr.Instance.OnHourEvent += HourEvent;
        }
        private void BeforePlayerDataInitializeEvent()
@@ -38,8 +40,8 @@
                if (operationDict.ContainsKey((Operation)i))
                {
                    var operation = operationDict[(Operation)i];
                    if (operation.InDay(TimeUtility.ServerNow) && operation.SatisfyOpenCondition()
                        && !operation.inDateNotify)
                    if (!operation.inDateNotify && operation.SatisfyOpenCondition()
                        && operation.InDay(TimeUtility.ServerNow))
                    {
                        operation.inDateNotify = true;
                        operation.stepDateNotify = false;
@@ -49,7 +51,7 @@
                            operationStartEvent((Operation)i, 1);
                        }
                    }
                    else if (!operation.InDay(TimeUtility.ServerNow) && !operation.stepDateNotify)
                    else if (!operation.stepDateNotify && !operation.InDay(TimeUtility.ServerNow))
                    {
                        operation.inDateNotify = false;
                        operation.stepDateNotify = true;
@@ -59,22 +61,22 @@
                            operationEndEvent((Operation)i, 1);
                        }
                    }
                    if (operation.InTime(TimeUtility.ServerNow) && operation.SatisfyOpenCondition()
                        && !operation.inTimeNotify)
                    if (!operation.inTimeNotify && operation.SatisfyOpenCondition()
                        && operation.InTime(TimeUtility.ServerNow))
                    {
                        operation.inTimeNotify = true;
                        operation.stepTimeNotify = false;
                        operation.inAdvanceNotify = false;
                        DebugEx.LogFormat("{0}  活动时间开始", (Operation)i);
                        if (operationStartEvent != null)
                        {
                            operationStartEvent((Operation)i, 0);
                        }
                    }
                    else if (!operation.InTime(TimeUtility.ServerNow) && !operation.stepTimeNotify)
                    else if (!operation.stepTimeNotify && !operation.InTime(TimeUtility.ServerNow))
                    {
                        operation.inTimeNotify = false;
                        operation.stepTimeNotify = true;
                        operation.inAdvanceNotify = false;
                        DebugEx.LogFormat("{0}  活动时间结束", (Operation)i);
                        if (operationEndEvent != null)
                        {
@@ -82,15 +84,33 @@
                        }
                    }
                    if (!operation.inAdvanceNotify && operation.InAdvanceTime(TimeUtility.ServerNow))
                    if (!operation.inAdvanceNotify && operation.SatisfyOpenCondition()
                        && operation.InAdvanceTime(TimeUtility.ServerNow))
                    {
                        operation.inAdvanceNotify = true;
                        DebugEx.LogFormat("{0}  活动提前开启", (Operation)i);
                        if (operationAdvanceEvent != null)
                        {
                            operationAdvanceEvent((Operation)i);
                        }
                    }
                }
            }
        }
        private void HourEvent()
        {
            if (!(StageManager.Instance.CurrentStage is DungeonStage))
            {
                return;
            }
            if (TimeUtility.Hour == 0 && dayResetEvent != null)
            {
                dayResetEvent(0);
            }
            if (TimeUtility.Hour == 5 && dayResetEvent != null)
            {
                dayResetEvent(1);
            }
        }
@@ -102,22 +122,9 @@
        {
            OperationBase operation = null;
            operationDict.TryGetValue(Operation.MultipleExp, out operation);
            if (package.StartDate == null || package.StartDate.Equals(string.Empty)
                || package.EndtDate == null || package.EndtDate.Equals(string.Empty))
            if (string.IsNullOrEmpty(package.StartDate) || string.IsNullOrEmpty(package.EndtDate))
            {
                if (operationDict.ContainsKey(Operation.MultipleExp))
                {
                    operationDict.Remove(Operation.MultipleExp);
                }
                if (operationServerCloseEvent != null)
                {
                    operationServerCloseEvent(Operation.MultipleExp);
                }
                if (operationEndEvent != null)
                {
                    operationEndEvent(Operation.MultipleExp, 0);
                    operationEndEvent(Operation.MultipleExp, 1);
                }
                ForceStopOperation(Operation.MultipleExp);
            }
            else
            {
@@ -131,17 +138,10 @@
                operation.endDate = ParseOperationDate(package.EndtDate);
                operation.limitLv = package.LimitLV;
                (operation as OperationMultiExp).multiple = (int)package.AddExpRate + 10000;
                if (package.ActivityTimeCount == 0)
                for (int i = 0; i < package.ActivityTimeCount; i++)
                {
                    operation.allDay = true;
                }
                else
                {
                    for (int i = 0; i < package.ActivityTimeCount; i++)
                    {
                        operation.times.Add(ParseOperationTime(package.ActivityTime[i].StartTime,
                            package.ActivityTime[i].EndtTime));
                    }
                    operation.times.Add(ParseOperationTime(package.ActivityTime[i].StartTime,
                        package.ActivityTime[i].EndtTime));
                }
                if (operationTimeUpdateEvent != null)
                {
@@ -149,6 +149,7 @@
                }
            }
        }
        /// <summary>
        /// 消费返利
        /// </summary>
@@ -157,22 +158,9 @@
        {
            OperationBase operationBase = null;
            operationDict.TryGetValue(Operation.ConsumeRebate, out operationBase);
            if (package.StartDate == null || package.StartDate.Equals(string.Empty)
                || package.EndtDate == null || package.EndtDate.Equals(string.Empty))
            if (string.IsNullOrEmpty(package.StartDate) || string.IsNullOrEmpty(package.EndtDate))
            {
                if (operationDict.ContainsKey(Operation.ConsumeRebate))
                {
                    operationDict.Remove(Operation.ConsumeRebate);
                }
                if (operationServerCloseEvent != null)
                {
                    operationServerCloseEvent(Operation.ConsumeRebate);
                }
                if (operationEndEvent != null)
                {
                    operationEndEvent(Operation.ConsumeRebate, 0);
                    operationEndEvent(Operation.ConsumeRebate, 1);
                }
                ForceStopOperation(Operation.ConsumeRebate);
            }
            else
            {
@@ -186,37 +174,15 @@
                operation.limitLv = package.LimitLV;
                operation.startDate = ParseOperationDate(package.StartDate);
                operation.endDate = ParseOperationDate(package.EndtDate);
                operation.allDay = true;
                operation.dayReset = package.IsDayReset == 1;
                for (int i = 0; i < package.AwardDays; i++)
                {
                    var _rebate = package.AwardDayInfo[i];
                    OperationConsumeRebate.Rebate rebate = new OperationConsumeRebate.Rebate();
                    for (int k = 0; k < _rebate.AwardCount; k++)
                    {
                        OperationConsumeRebate.RebateGrade rebateGrade = new OperationConsumeRebate.RebateGrade();
                        rebateGrade.needGold = (int)_rebate.AwardInfo[k].NeedGold;
                        rebateGrade.index = _rebate.AwardInfo[k].AwardIndex;
                        for (int q = 0; q < _rebate.AwardInfo[k].AwardItemCount; q++)
                        {
                            var _item = _rebate.AwardInfo[k].AwardItem[q];
                            rebateGrade.items.Add(new OperationConsumeRebate.Item()
                            {
                                itemId = (int)_item.ItemID,
                                count = _item.ItemCount,
                                isBind = _item.IsBind,
                            });
                        }
                        rebate.rebateGrades.Add(rebateGrade);
                    }
                    operation.rebates.Add(rebate);
                }
                operation.ParseRebate(package);
                if (operationTimeUpdateEvent != null)
                {
                    operationTimeUpdateEvent(Operation.ConsumeRebate);
                }
            }
        }
        /// <summary>
        /// 限时特惠
        /// </summary>
@@ -227,19 +193,7 @@
            operationDict.TryGetValue(Operation.FlashSale, out operationBase);
            if (string.IsNullOrEmpty(package.StartDate) || string.IsNullOrEmpty(package.EndtDate))
            {
                if (operationDict.ContainsKey(Operation.FlashSale))
                {
                    operationDict.Remove(Operation.FlashSale);
                }
                if (operationServerCloseEvent != null)
                {
                    operationServerCloseEvent(Operation.FlashSale);
                }
                if (operationEndEvent != null)
                {
                    operationEndEvent(Operation.FlashSale, 0);
                    operationEndEvent(Operation.FlashSale, 1);
                }
                ForceStopOperation(Operation.FlashSale);
            }
            else
            {
@@ -253,80 +207,32 @@
                operation.limitLv = package.LimitLV;
                operation.startDate = ParseOperationDate(package.StartDate);
                operation.endDate = ParseOperationDate(package.EndtDate);
                operation.dateEnumerator = new OperationDateEnumerator(operation.startDate, operation.endDate);
                operation.dayReset = package.IsDayReset == 1;
                if (package.ActivityTimeCount == 0)
                operation.inAdvanceMinute = package.AdvanceMinutes;
                for (int i = 0; i < package.ActivityTimeCount; i++)
                {
                    operation.allDay = true;
                    operation.times.Add(ParseOperationTime(package.ActivityTime[i].StartTime,
                        package.ActivityTime[i].EndtTime));
                }
                else
                {
                    for (int i = 0; i < package.ActivityTimeCount; i++)
                    {
                        operation.times.Add(ParseOperationTime(package.ActivityTime[i].StartTime,
                            package.ActivityTime[i].EndtTime));
                    }
                }
                for (int i = 0; i < package.ShopCount; i++)
                {
                    var flashShop = new OperationFlashSale.FlashSale();
                    var shop = package.ShopInfo[i];
                    flashShop.gifts = new OperationFlashSale.FlashSaleGift[shop.GiftbagCount];
                    for (int k = 0; k < shop.GiftbagCount; k++)
                    {
                        var gift = new OperationFlashSale.FlashSaleGift();
                        var pakGift = shop.GiftbagInfo[k];
                        gift.id = (int)pakGift.GiftID;
                        gift.limitNum = pakGift.BuyCountLimit;
                        gift.moneyNumber = (int)pakGift.MoneyNumber;
                        gift.moneyType = pakGift.MoneyType;
                        gift.moneyOriginal = (int)pakGift.MoneyOriginal;
                        gift.items = new OperationFlashSale.FlashSaleItem[pakGift.GiftItemCount];
                        for (int q = 0; q < pakGift.GiftItemCount; q++)
                        {
                            var item = new OperationFlashSale.FlashSaleItem();
                            item.itemId = (int)pakGift.ItemInfo[q].ItemID;
                            item.isBind = pakGift.ItemInfo[q].IsBind;
                            item.itemCount = pakGift.ItemInfo[q].ItemCount;
                            item.isMainItem = pakGift.ItemInfo[q].IsMainItem == 1;
                            gift.items[q] = item;
                        }
                        flashShop.gifts[k] = gift;
                    }
                    operation.flashShops.Add(flashShop);
                }
                operation.ParsePackage(package);
                if (operationTimeUpdateEvent != null)
                {
                    operationTimeUpdateEvent(Operation.FlashSale);
                }
            }
        }
        /// <summary>
        /// 限时礼包
        /// </summary>
        /// <param name="package"></param>
        ///
        public void UpdateGiftPackage(HAA12_tagMCFlashGiftbagInfo package)
        {
            OperationBase operationBase = null;
            operationDict.TryGetValue(Operation.GiftPackage, out operationBase);
            if (string.IsNullOrEmpty(package.StartDate) || string.IsNullOrEmpty(package.EndtDate))
            {
                if (operationDict.ContainsKey(Operation.GiftPackage))
                {
                    operationDict.Remove(Operation.GiftPackage);
                }
                if (operationServerCloseEvent != null)
                {
                    operationServerCloseEvent(Operation.GiftPackage);
                }
                if (operationEndEvent != null)
                {
                    operationEndEvent(Operation.GiftPackage, 0);
                    operationEndEvent(Operation.GiftPackage, 1);
                }
                ForceStopOperation(Operation.GiftPackage);
            }
            else
            {
@@ -341,48 +247,13 @@
                operation.startDate = ParseOperationDate(package.StartDate);
                operation.endDate = ParseOperationDate(package.EndtDate);
                operation.dayReset = package.IsDayReset == 1;
                if (package.ActivityTimeCount == 0)
                operation.inAdvanceMinute = package.AdvanceMinutes;
                for (int i = 0; i < package.ActivityTimeCount; i++)
                {
                    operation.allDay = true;
                    operation.times.Add(ParseOperationTime(package.ActivityTime[i].StartTime,
                        package.ActivityTime[i].EndtTime));
                }
                else
                {
                    for (int i = 0; i < package.ActivityTimeCount; i++)
                    {
                        operation.times.Add(ParseOperationTime(package.ActivityTime[i].StartTime,
                            package.ActivityTime[i].EndtTime));
                    }
                }
                for (int i = 0; i < package.GiftbagTypeCount; i++)
                {
                    var GiftbagType = new GiftPackageClass.Gift_Package();
                    var Giftbag = package.GiftbagTypeInfo[i];
                    GiftbagType.gifts = new GiftPackageClass.GiftPackageGift[Giftbag.GiftbagCount];
                    for (int k = 0; k < Giftbag.GiftbagCount; k++)
                    {
                        var gift = new GiftPackageClass.GiftPackageGift();
                        var pakGift = Giftbag.GiftbagInfo[k];
                        gift.id = (int)pakGift.GiftID;
                        gift.limitNum = pakGift.BuyCountLimit;
                        gift.rmb = (int)pakGift.RMB;
                        gift.rmbOriginal = (int)pakGift.RMBOriginal;
                        gift.OrderInfo = pakGift.OrderInfo;
                        gift.OrderInfoLength = pakGift.OrderInfoLen;
                        gift.items = new GiftPackageClass.GiftPackageItem[pakGift.GiftItemCount];
                        for (int q = 0; q < pakGift.GiftItemCount; q++)
                        {
                            var item = new GiftPackageClass.GiftPackageItem();
                            item.itemId = (int)pakGift.ItemInfo[q].ItemID;
                            item.isBind = pakGift.ItemInfo[q].IsBind;
                            item.itemCount = pakGift.ItemInfo[q].ItemCount;
                            item.isMainItem = pakGift.ItemInfo[q].IsMainItem == 1;
                            gift.items[q] = item;
                        }
                        GiftbagType.gifts[k] = gift;
                    }
                    operation.giftpackage1.Add(GiftbagType);
                }
                operation.ParsePackage(package);
                if (operationTimeUpdateEvent != null)
                {
                    operationTimeUpdateEvent(Operation.GiftPackage);
@@ -395,21 +266,7 @@
        {
            if (string.IsNullOrEmpty(package.StartDate) || string.IsNullOrEmpty(package.EndtDate))
            {
                if (operationDict.ContainsKey(Operation.BossReborn))
                {
                    operationDict.Remove(Operation.BossReborn);
                }
                if (operationServerCloseEvent != null)
                {
                    operationServerCloseEvent(Operation.BossReborn);
                }
                if (operationEndEvent != null)
                {
                    operationEndEvent(Operation.BossReborn, 0);
                    operationEndEvent(Operation.BossReborn, 1);
                }
                ForceStopOperation(Operation.BossReborn);
            }
            else
            {
@@ -423,10 +280,9 @@
                operationBase.Reset();
                operationBase.limitLv = package.LimitLV;
                operationBase.allDay = true;
                operationBase.startDate = ParseOperationDate(package.StartDate);
                operationBase.endDate = ParseOperationDate(package.EndtDate);
                operationBase.resetType = package.ResetType;
                ModelCenter.Instance.GetModel<BossRebornModel>().UpdateTaskBaseInfos(package.TaskInfo); 
            }
        }
@@ -439,22 +295,9 @@
        {
            OperationBase operation = null;
            operationDict.TryGetValue(Operation.FairyCeremony, out operation);
            if (package.StartDate == null || package.StartDate.Equals(string.Empty)
                || package.EndtDate == null || package.EndtDate.Equals(string.Empty))
            if (string.IsNullOrEmpty(package.StartDate) || string.IsNullOrEmpty(package.EndtDate))
            {
                if (operationDict.ContainsKey(Operation.FairyCeremony))
                {
                    operationDict.Remove(Operation.FairyCeremony);
                }
                if (operationServerCloseEvent != null)
                {
                    operationServerCloseEvent(Operation.FairyCeremony);
                }
                if (operationEndEvent != null)
                {
                    operationEndEvent(Operation.FairyCeremony, 0);
                    operationEndEvent(Operation.FairyCeremony, 1);
                }
                ForceStopOperation(Operation.FairyCeremony);
            }
            else
            {
@@ -467,7 +310,6 @@
                operation.startDate = ParseOperationDate(package.StartDate);
                operation.endDate = ParseOperationDate(package.EndtDate);
                operation.limitLv = package.LimitLV;
                operation.allDay = true;
                if (operationTimeUpdateEvent != null)
                {
                    operationTimeUpdateEvent(Operation.FairyCeremony);
@@ -483,22 +325,9 @@
        {
            OperationBase operation = null;
            operationDict.TryGetValue(Operation.MultipRealmPoint, out operation);
            if (package.StartDate == null || package.StartDate.Equals(string.Empty)
                || package.EndtDate == null || package.EndtDate.Equals(string.Empty))
            if (string.IsNullOrEmpty(package.StartDate) || string.IsNullOrEmpty(package.EndtDate))
            {
                if (operationDict.ContainsKey(Operation.MultipRealmPoint))
                {
                    operationDict.Remove(Operation.MultipRealmPoint);
                }
                if (operationServerCloseEvent != null)
                {
                    operationServerCloseEvent(Operation.MultipRealmPoint);
                }
                if (operationEndEvent != null)
                {
                    operationEndEvent(Operation.MultipRealmPoint, 0);
                    operationEndEvent(Operation.MultipRealmPoint, 1);
                }
                ForceStopOperation(Operation.MultipRealmPoint);
            }
            else
            {
@@ -511,12 +340,28 @@
                operation.startDate = ParseOperationDate(package.StartDate);
                operation.endDate = ParseOperationDate(package.EndtDate);
                operation.limitLv = package.LimitLV;
                operation.allDay = true;
                (operation as OperationMultipleRealmPoint).multiplePractice = package.Multiple;
                if (operationTimeUpdateEvent != null)
                {
                    operationTimeUpdateEvent(Operation.MultipRealmPoint);
                }
            }
        }
        void ForceStopOperation(Operation operationType)
        {
            if (operationDict.ContainsKey(operationType))
            {
                operationDict.Remove(operationType);
            }
            if (operationServerCloseEvent != null)
            {
                operationServerCloseEvent(operationType);
            }
            if (operationEndEvent != null)
            {
                operationEndEvent(operationType, 0);
                operationEndEvent(operationType, 1);
            }
        }
@@ -545,17 +390,6 @@
            return false;
        }
        public bool SideOfTime(Operation type, out int side)
        {
            side = 0;
            OperationBase operation;
            if (TryGetOperationTime(type, out operation))
            {
                return operation.SideOfTime(TimeUtility.ServerNow, out side);
            }
            return false;
        }
        public int GetOperationSurplusTime(Operation type)
        {
            OperationBase operation;
@@ -566,12 +400,42 @@
            return 0;
        }
        public bool InOperationAdvance(Operation type)
        {
            OperationBase operation;
            if (TryGetOperationTime(type, out operation))
            {
                return operation.InAdvanceTime(TimeUtility.ServerNow);
            }
            return false;
        }
        public int GetOperationSecondsBeforeStart(Operation type)
        {
            OperationBase operation;
            if (TryGetOperationTime(type, out operation))
            {
                return operation.GetSecondsBeforeStart(TimeUtility.ServerNow);
            }
            return 0;
        }
        public bool SatisfyOpenCondition(Operation type)
        {
            OperationBase operation;
            if (TryGetOperationTime(type, out operation))
            {
                return operation.SatisfyOpenCondition() && InOperationTime(type);
            }
            return false;
        }
        public bool SatisfyAdvanceCondition(Operation type)
        {
            OperationBase operation;
            if (TryGetOperationTime(type, out operation))
            {
                return operation.SatisfyOpenCondition() && InOperationAdvance(type);
            }
            return false;
        }
@@ -600,16 +464,6 @@
            }
        }
        public int IndexOfOperationDays(Operation type)
        {
            OperationBase operation;
            if (TryGetOperationTime(type, out operation))
            {
                return operation.IndexOfOpenDay(TimeUtility.ServerNow);
            }
            return -1;
        }
        OperationDate ParseOperationDate(string date)
        {
            string[] dateArray = date.Split('-');
@@ -620,6 +474,24 @@
                    year = int.Parse(dateArray[0].Trim()),
                    month = int.Parse(dateArray[1].Trim()),
                    day = int.Parse(dateArray[2].Trim())
                };
            }
            else if (dateArray != null && dateArray.Length == 1)
            {
                var time = TimeUtility.openServerTime;
                if (time.Equals(default(DateTime)))
                {
                    DebugEx.Log("服务期开服时间下发顺序有问题");
                }
                var days = 0;
                int.TryParse(date, out days);
                days = Mathf.Max(1, days);
                time = time.AddDays(days - 1);
                return new OperationDate()
                {
                    year = time.Year,
                    month = time.Month,
                    day = time.Day,
                };
            }
            return default(OperationDate);
@@ -644,51 +516,6 @@
        }
    }
    public class OperationDateEnumerator : IEnumerable, IEnumerator
    {
        OperationDate start;
        OperationDate end;
        public int index = -1;
        public OperationDateEnumerator(OperationDate _start,OperationDate _end)
        {
            this.start = _start;
            this.end = _end;
        }
        public object Current
        {
            get
            {
                var date = start;
                date.day += index;
                return date;
            }
        }
        public IEnumerator GetEnumerator()
        {
            return (IEnumerator)this;
        }
        public bool MoveNext()
        {
            index++;
            bool isIn = index <= (start - end);
            if (!isIn)
            {
                GetEnumerator().Reset();
            }
            return isIn;
        }
        public void Reset()
        {
            index = -1;
        }
    }
    public struct OperationDate
    {
        public int year;
@@ -705,10 +532,57 @@
            return !(x == y);
        }
        public static bool operator >(OperationDate x, OperationDate y)
        {
            if (x.year > y.year)
            {
                return true;
            }
            if (x.year == y.year)
            {
                if (x.month > y.month)
                {
                    return true;
                }
                if (x.month == y.month)
                {
                    return x.day > y.day;
                }
            }
            return false;
        }
        public static bool operator <(OperationDate x, OperationDate y)
        {
            return !(x > y) && x != y;
        }
        public static bool operator >=(OperationDate x, OperationDate y)
        {
            return x > y || x == y;
        }
        public static bool operator <=(OperationDate x, OperationDate y)
        {
            return x < y || x == y;
        }
        public DateTime AddSeconds(int _seconds)
        {
            DateTime d = new DateTime(year, month, day);
            return d.AddTicks(_seconds * TimeSpan.TicksPerSecond);
        }
        public OperationDate AddDays(int _days)
        {
            DateTime d = new DateTime(year, month, day);
            d = d.AddDays(_days);
            return new OperationDate()
            {
                year = d.Year,
                month = d.Month,
                day = d.Day,
            };
        }
        public string ToDisplay(bool showYear = true)
@@ -735,18 +609,10 @@
        public bool InTime(DateTime time)
        {
            if (time.Hour < startHour || (time.Hour == startHour && time.Minute < startMinute))
            {
                return false;
            }
            if (time.Hour > endHour || (time.Hour == endHour && time.Minute >= endMinute))
            {
                return false;
            }
            return true;
            return CompareTime(time) == 0;
        }
        public int SideOfTime(DateTime time)
        public int CompareTime(DateTime time)
        {
            if (time.Hour < startHour || (time.Hour == startHour && time.Minute < startMinute))
            {
@@ -769,670 +635,6 @@
        {
            DateTime d = new DateTime(y.Year, y.Month, y.Day, x.endHour, x.endMinute, 0);
            return Mathf.Max(0, (int)(d - y).TotalSeconds);
        }
    }
    public class OperationBase
    {
        public OperationDate startDate;
        public OperationDate endDate;
        public List<OperationTime> times = new List<OperationTime>();
        public OperationDateEnumerator dateEnumerator;
        public bool allDay = false;
        public bool stepTimeNotify = false;
        public bool stepDateNotify = false;
        public bool inTimeNotify = false;
        public bool inDateNotify = false;
        public bool inAdvanceNotify = false;
        public int inAdvanceSeconds = 0;
        public int limitLv;
        public bool InTime(DateTime time)
        {
            if (!InDay(time))
            {
                return false;
            }
            if (allDay)
            {
                return true;
            }
            for (int i = 0; i < times.Count; i++)
            {
                if (times[i].InTime(time))
                {
                    return true;
                }
            }
            return false;
        }
        public bool SideOfTime(DateTime time, out int side)
        {
            side = 0;
            if (!InDay(time))
            {
                return false;
            }
            if (allDay)
            {
                side = 0;
                return true;
            }
            for (int i = 0; i < times.Count; i++)
            {
                side = times[i].SideOfTime(time);
            }
            return true;
        }
        public bool InDay(DateTime time)
        {
            if (time.Year != startDate.year && time.Year != endDate.year)
            {
                return false;
            }
            if (startDate.year != endDate.year)
            {
                if (time.Year == startDate.year)
                {
                    if (time.Month < startDate.month)
                    {
                        return false;
                    }
                    else if (time.Month == startDate.month && time.Day < startDate.day)
                    {
                        return false;
                    }
                }
                else if (time.Year == endDate.year)
                {
                    if (time.Month > endDate.month)
                    {
                        return false;
                    }
                    else if (time.Month == endDate.month && time.Day > endDate.day)
                    {
                        return false;
                    }
                }
            }
            else
            {
                if (time.Month < startDate.month || (time.Month == startDate.month && time.Day < startDate.day))
                {
                    return false;
                }
                if (time.Month > endDate.month || (time.Month == endDate.month && time.Day > endDate.day))
                {
                    return false;
                }
            }
            return true;
        }
        public int IndexOfOpenDay(DateTime time)
        {
            if (!InDay(time))
            {
                return -1;
            }
            DateTime s = new DateTime(startDate.year, startDate.month, startDate.day);
            return (time - s).Days;
        }
        public int IndexOfOpenTime(DateTime time)
        {
            if (!InTime(time))
            {
                return -1;
            }
            if (allDay)
            {
                return 0;
            }
            for (int i = 0; i < times.Count; i++)
            {
                if (times[i].InTime(time))
                {
                    return i;
                }
            }
            return -1;
        }
        public bool InAdvanceTime(DateTime time)
        {
            if (InTime(time) || inAdvanceSeconds <= 0)
            {
                return false;
            }
            var seconds = 0;
            if (TryGetInAdvanceSurplusSecond(time, out seconds))
            {
                return seconds < inAdvanceSeconds;
            }
            return false;
        }
        public bool TryGetInAdvanceSurplusSecond(DateTime time, out int seconds)
        {
            seconds = 0;
            if (InTime(time))
            {
                return false;
            }
            if (allDay)
            {
                var startTime = new DateTime(startDate.year, startDate.month, startDate.day);
                seconds = (int)(startTime - time).TotalSeconds;
            }
            else
            {
                if (dateEnumerator != null)
                {
                    foreach (OperationDate date in dateEnumerator)
                    {
                        for (int i = 0; i < times.Count; i++)
                        {
                            var startTime = new DateTime(date.year, date.month, date.day, times[i].startHour, times[i].startMinute, 0);
                            seconds = (int)(startTime - time).TotalSeconds;
                            if (seconds > 0)
                            {
                                break;
                            }
                        }
                        if (seconds > 0)
                        {
                            dateEnumerator.Reset();
                            break;
                        }
                    }
                }
            }
            return seconds > 0;
        }
        public int GetSurplusTime(DateTime time)
        {
            var seconds = 0;
            if (InTime(time))
            {
                if (allDay)
                {
                    seconds += (int)(endDate.AddSeconds(24 * 60 * 60) - time).TotalSeconds;
                }
                else
                {
                    for (int i = 0; i < times.Count; i++)
                    {
                        if (times[i].InTime(time))
                        {
                            seconds += times[i] - time;
                            break;
                        }
                    }
                }
            }
            return seconds;
        }
        public virtual string ToDisplayTime()
        {
            return string.Empty;
        }
        public virtual void Reset()
        {
            stepTimeNotify = false;
            stepDateNotify = false;
            inTimeNotify = false;
            inDateNotify = false;
            inAdvanceNotify = false;
            allDay = false;
            inAdvanceSeconds = 0;
            limitLv = 0;
            times.Clear();
        }
        public virtual bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
    }
    public class OperationMultiExp : OperationBase
    {
        public int multiple;
        public override string ToDisplayTime()
        {
            var textBuilder = OperationTimeHepler.textBuilder;
            textBuilder.Length = 0;
            if (allDay)
            {
                textBuilder.Append(Language.Get("OpenAllDay"));
            }
            else
            {
                if (startDate != endDate)
                {
                    textBuilder.Append(Language.Get("EveryDay"));
                }
                for (int i = 0, n = times.Count; i < n; i++)
                {
                    textBuilder.Append(times[i].ToString());
                    if (i < n - 1)
                    {
                        textBuilder.Append("、");
                    }
                }
            }
            return textBuilder.ToString();
        }
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
        public string GetMultipleCHS()
        {
            if (multiple / 10000 == 2)
            {
                return Language.Get("Num_CHS_Double");
            }
            else
            {
                return Language.Get(StringUtility.Contact("Num_CHS_", multiple / 10000));
            }
        }
    }
    public class OperationFlashSale : OperationBase
    {
        public bool dayReset = false;
        public List<FlashSale> flashShops = new List<FlashSale>();
        public int IndexOfFlashShop()
        {
            if (flashShops.Count == 1)
            {
                return 0;
            }
            var _timeIndex = IndexOfOpenTime(TimeUtility.ServerNow);
            if (_timeIndex == -1)
            {
                return -1;
            }
            return Mathf.Min(flashShops.Count - 1, allDay ? 0 : _timeIndex);
        }
        public FlashSaleGift GetFlashSaleGift(int _index, int _id)
        {
            if (_index < flashShops.Count)
            {
                for (int i = 0; i < flashShops[_index].gifts.Length; i++)
                {
                    if (flashShops[_index].gifts[i].id == _id)
                    {
                        return flashShops[_index].gifts[i];
                    }
                }
            }
            return default(FlashSaleGift);
        }
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
        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 int GetSurplusTime(int index)
        {
            if (!InTime(TimeUtility.ServerNow))
            {
                return 0;
            }
            var seconds = 0;
            if (times.Count == 0)
            {
                DateTime endOperationTime = new DateTime(TimeUtility.Year, TimeUtility.Month,
                        TimeUtility.Day, 0, 0, 0);
                endOperationTime = endOperationTime.AddDays(1);
                seconds = (int)(endOperationTime - TimeUtility.ServerNow).TotalSeconds;
            }
            if (index >= 0 && index < times.Count)
            {
                var _endTime = times[index];
                DateTime endOperationTime = new DateTime(TimeUtility.Year, TimeUtility.Month,
                        TimeUtility.Day, _endTime.endHour, _endTime.endMinute, 0);
                seconds = (int)(endOperationTime - TimeUtility.ServerNow).TotalSeconds;
            }
            return seconds;
        }
        public struct FlashSale
        {
            public FlashSaleGift[] gifts;
        }
        public struct FlashSaleGift
        {
            public int id;
            public int limitNum;
            public int moneyType;
            public int moneyNumber;
            public int moneyOriginal;
            public FlashSaleItem[] items;
        }
        public struct FlashSaleItem
        {
            public int itemId;
            public int itemCount;
            public int isBind;
            public bool isMainItem;
        }
    }
    public class GiftPackageClass : OperationBase
    {
        public bool dayReset = false;
        public List<Gift_Package> giftpackage1 = new List<Gift_Package>();
        public int IndexOfFlashShop()
        {
            if (giftpackage1.Count == 1)
            {
                return 0;
            }
            var _timeIndex = IndexOfOpenTime(TimeUtility.ServerNow);
            if (_timeIndex == -1)
            {
                return -1;
            }
            return Mathf.Min(giftpackage1.Count - 1, allDay ? 0 : _timeIndex);
        }
        public GiftPackageGift GetFlashSaleGift(int _index, int _id)
        {
            if (_index < giftpackage1.Count)
            {
                for (int i = 0; i < giftpackage1[_index].gifts.Length; i++)
                {
                    if (giftpackage1[_index].gifts[i].id == _id)
                    {
                        return giftpackage1[_index].gifts[i];
                    }
                }
            }
            return default(GiftPackageGift);
        }
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
        public override void Reset()
        {
            base.Reset();
            giftpackage1.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 struct Gift_Package
        {
            public GiftPackageGift[] gifts;
        }
        public struct GiftPackageGift
        {
            public int id;
            public int limitNum;//限购数
            public int rmb;//人民币
            public int rmbOriginal;//原价
            public string OrderInfo;//商品编号
            public int OrderInfoLength;//长度
            public GiftPackageItem[] items;
        }
        public struct GiftPackageItem
        {
            public int itemId;
            public int itemCount;
            public int isBind;
            public bool isMainItem;
        }
    }
    public class OperationConsumeRebate : OperationBase
    {
        public bool dayReset = false;
        public List<Rebate> rebates = new List<Rebate>();
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
        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 override void Reset()
        {
            base.Reset();
            rebates.Clear();
        }
        public Rebate GetRebate(DateTime time)
        {
            if (rebates.Count == 0)
            {
                return null;
            }
            var index = IndexOfOpenDay(time);
            if (index != -1 && index < rebates.Count)
            {
                return rebates[index];
            }
            return rebates[rebates.Count - 1];
        }
        public class Rebate
        {
            public List<RebateGrade> rebateGrades = new List<RebateGrade>();
        }
        public class RebateGrade
        {
            public int needGold;
            public int index;//奖励索引
            public List<Item> items = new List<Item>();
        }
        public struct Item
        {
            public int itemId;
            public int count;
            public int isBind;
        }
    }
    public class OperationBossReborn : OperationBase
    {
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
    }
    public class OperationMultipleRealmPoint : OperationBase
    {
        public int multiplePractice; //倍数
        public int startHour = 5;
        public int startMinute = 0;
        public int startSecond = 0;
        public override bool SatisfyOpenCondition()
        {
            return PlayerDatas.Instance.baseData.LV >= limitLv;
        }
        public  bool InActiveTime(DateTime time)
        {
            if (time.Year != startDate.year && time.Year != endDate.year)
            {
                return false;
            }
            if (startDate.year != endDate.year)
            {
                if (time.Year == startDate.year)
                {
                    if (time.Month < startDate.month)
                    {
                        return false;
                    }
                    else if (time.Month == startDate.month && time.Day < startDate.day)
                    {
                        return false;
                    }
                    else if(time.Month == startDate.month
                        && time.Day == startDate.day
                        && time.Hour < startHour)
                    {
                        return false;
                    }
                    else if (time.Month == startDate.month
                       && time.Day == startDate.day
                       && time.Hour == startHour
                       && time.Minute < startMinute)
                    {
                        return false;
                    }
                    else if (time.Month == startDate.month
                      && time.Day == startDate.day
                      && time.Hour == startHour
                      && time.Minute == startMinute
                        && time.Second < startSecond)
                    {
                        return false;
                    }
                }
                else if (time.Year == endDate.year)
                {
                    if (time.Month > endDate.month)
                    {
                        return false;
                    }
                    else if (time.Month == endDate.month && time.Day > endDate.day)
                    {
                        return false;
                    }
                    else if(time.Month == endDate.month
                        && time.Day == endDate.day
                        && time.Hour > startHour)
                    {
                        return false;
                    }
                    else if (time.Month == endDate.month
                       && time.Day == endDate.day
                       && time.Hour == startHour
                       && time.Minute > startMinute)
                    {
                        return false;
                    }
                    else if (time.Month == endDate.month
                      && time.Day == endDate.day
                      && time.Hour == startHour
                      && time.Minute == startMinute
                        && time.Second > startSecond)
                    {
                        return false;
                    }
                }
            }
            else
            {
                if (time.Month < startDate.month
                    || (time.Month == startDate.month && time.Day < startDate.day)
                    || (time.Month == startDate.month && time.Day == startDate.day && time.Hour < startHour)
                    || (time.Month == startDate.month && time.Day == startDate.day && time.Hour == startHour && time.Minute < startMinute)
                    || (time.Month == startDate.month && time.Day == startDate.day && time.Hour == startHour && time.Minute == startMinute) && time.Second < startSecond)
                {
                    return false;
                }
                if (time.Month > endDate.month
                    || (time.Month == endDate.month && time.Day > endDate.day)
                    || (time.Month == endDate.month && time.Day == endDate.day && time.Hour > startHour)
                     || (time.Month == endDate.month && time.Day == endDate.day && time.Hour == startHour && time.Minute > startMinute)
                    || (time.Month == endDate.month && time.Day == endDate.day && time.Hour == startHour && time.Minute == startMinute) && time.Second > startSecond)
                {
                    return false;
                }
            }
            return true;
        }
        public int GetRemainTime(DateTime time)
        {
            var seconds = 0;
            if (InActiveTime(time))
            {
                DateTime endTime = new DateTime(endDate.year, endDate.month, endDate.day, startHour, 0, 0);
                seconds = (int)(endTime - time).TotalSeconds;
            }
            return seconds;
        }
    }
UI/Effect/TimeMgr.cs
@@ -7,9 +7,9 @@
{
    private Dictionary<Component, TimeItem> timeItems = new Dictionary<Component, TimeItem>();
    private List<TimeItem> timeItemList = new List<TimeItem>();
    private int m_LastRecordHour = -1;
    private int m_LastRecordMinute = -1;
    public int m_LastRecordDay = -1;
    private int hourBuff = -1;
    private int minuteBuff = -1;
    public int dayBuff = -1;
    public event Action OnDayEvent;
    public event Action OnHourEvent;
    public event Action OnMinuteEvent;
@@ -18,29 +18,29 @@
    {
        try
        {
            if (m_LastRecordDay != TimeUtility.ServerNow.Day)
            if (dayBuff != TimeUtility.ServerNow.Day)
            {
                if (OnDayEvent != null)
                {
                    OnDayEvent();
                }
                m_LastRecordDay = TimeUtility.ServerNow.Day;
                dayBuff = TimeUtility.ServerNow.Day;
            }
            if (m_LastRecordHour != TimeUtility.ServerNow.Hour)
            if (hourBuff != TimeUtility.ServerNow.Hour)
            {
                if (OnHourEvent != null)
                {
                    OnHourEvent();
                }
                m_LastRecordHour = TimeUtility.ServerNow.Hour;
                hourBuff = TimeUtility.ServerNow.Hour;
            }
            if (m_LastRecordMinute != TimeUtility.ServerNow.Minute)
            if (minuteBuff != TimeUtility.ServerNow.Minute)
            {
                if (OnMinuteEvent != null)
                {
                    OnMinuteEvent();
                }
                m_LastRecordMinute = TimeUtility.ServerNow.Minute;
                minuteBuff = TimeUtility.ServerNow.Minute;
            }
        }
        catch (Exception e)