少年修仙传客户端代码仓库
client_linchunjie
2018-10-25 b7961088385a401c6fdba03b1573a6fef2a66011
4318 【前端】【1.2】超值礼包拆分成精彩活动的3个礼包
8个文件已修改
652 ■■■■ 已修改文件
Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA16_tagMCSuperGiftInfo.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/DailyQuest/DayRemind.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/OSGiftBehaviour.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/OSGiftModel.cs 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/OpenServerActivityCell.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/OpenServerActivityWin.cs 287 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/OpenServerGiftWin.cs 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/WindowJump/WindowJumpMgr.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA16_tagMCSuperGiftInfo.cs
@@ -4,16 +4,14 @@
// AA 16 通知超值礼包信息 #tagMCSuperGiftInfo
public class HAA16_tagMCSuperGiftInfo : GameNetPackBasic {
    public uint GiftID;    //商品ID
    public string EndtDate;    // 结束日期 y-m-d
    public uint StartTime;
    public HAA16_tagMCSuperGiftInfo () {
        _cmd = (ushort)0xAA16;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out GiftID, vBytes, NetDataType.DWORD);
        TransBytes (out EndtDate, vBytes, NetDataType.Chars, 10);
        TransBytes (out StartTime, vBytes, NetDataType.DWORD);
    }
}
System/DailyQuest/DayRemind.cs
@@ -42,7 +42,6 @@
    public const string POTENTIAL_NO_NOTIFY = "PotentialNoNotify";
    public const string FLASHSALE_REDPOINT = "FlashSale_Redpoint";
    public const string OSTIMEGIFT_REDPOINT = "OSTimeGift_Redpoint";
    public const string OSGIFT_REDPOINT = "OSGitf_Redpoint";
    public const string TASK_SKILL_HOLE = "TaskSkillHole";
    public const string RUNE_SPECIAL_HOLE = "RuneSpecialHole";
    public const string LEAGUE_NOTICE_REDPOINT = "LeagueNoticeRedpoint";
@@ -97,7 +96,6 @@
        SetDayRemind(POTENTIAL_NO_NOTIFY);
        SetDayRemind(FLASHSALE_REDPOINT);
        SetDayRemind(OSTIMEGIFT_REDPOINT);
        SetDayRemind(OSGIFT_REDPOINT);
        SetDayRemind(TASK_SKILL_HOLE);
        SetDayRemind(RUNE_SPECIAL_HOLE);
        SetDayRemind(LEAGUE_NOTICE_REDPOINT);
System/OpenServerActivity/OSGiftBehaviour.cs
@@ -166,7 +166,7 @@
                    return;
                case StoreFunc.OSGift:
                    {
                        if (giftModel.IsGiftOverdue(_storeConfig.ID))
                        if (!giftModel.IsGiftExist(_storeConfig.ID))
                        {
                            SysNotifyMgr.Instance.ShowTip("ActiveOutTime");
                            return;
System/OpenServerActivity/OSGiftModel.cs
@@ -9,9 +9,8 @@
    {
        public override void Init()
        {
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
            ParseConfig();
            storeModel.RefreshBuyShopLimitEvent += RefreshBuyShopLimitEvent;
            vipModel.firstChargeRewardEvent += FirstChargeRewardEvent;
            OpenServerActivityCenter.Instance.Register(6, this);
        }
@@ -20,9 +19,13 @@
        }
        public void OnBeforePlayerDataInitialize()
        {
            startSeconds = 0;
        }
        public void OnPlayerLoginOk()
        {
            activate = CheckActivate();
            if (onStateUpate != null)
            {
                onStateUpate(6);
@@ -31,25 +34,15 @@
        }
        public event Action<int> onStateUpate;
        public event Action timeLimitUpdate;
        public event Action onSelectUpdate;
        public bool activate { get; private set; }
        StoreModel storeModel
        {
            get
            {
                return ModelCenter.Instance.GetModel<StoreModel>();
            }
        }
        VipModel vipModel { get { return ModelCenter.Instance.GetModel<VipModel>(); } }
        StoreModel storeModel { get { return ModelCenter.Instance.GetModel<StoreModel>(); } }
        public bool IsOpen
        {
            get
            {
                return CheckActivate();
                return IsExist();
            }
        }
@@ -57,25 +50,16 @@
        {
            get
            {
                return OSGiftRedpoint.state == RedPointState.Simple;
            }
        }
        private void RefreshBuyShopLimitEvent()
        {
            bool _activate = CheckActivate();
            if (activate != _activate)
            {
                activate = _activate;
                if (onStateUpate != null)
                for (int i = 0; i < redpoints.Count; i++)
                {
                    onStateUpate(6);
                    if (redpoints[i].state == RedPointState.Simple)
                    {
                        return true;
                    }
                }
                UpdateRedpoint();
                return false;
            }
        }
        public int timeOverdueGiftId { get; private set; }
        public bool IsAdvance
        {
@@ -85,80 +69,94 @@
            }
        }
        public DateTime overDueTime = DateTime.Now;
        int m_SelectIndex = 0;
        public int selectIndex
        {
            get { return m_SelectIndex; }
            set
            {
                if (value != m_SelectIndex)
                {
                    m_SelectIndex = value;
                    if (onSelectUpdate != null)
                    {
                        onSelectUpdate();
                    }
                }
                m_SelectIndex = value;
            }
        }
        public int jumpGiftId { get; set; }
        public List<SuperValueGift> gifts { get; private set; }
        public List<int> alreadyOpens { get; private set; }
        void ParseConfig()
        {
            gifts = new List<SuperValueGift>();
            alreadyOpens = new List<int>();
            var config = Config.Instance.Get<FuncConfigConfig>("SuperGiftTimeList");
            var array = LitJson.JsonMapper.ToObject<int[][]>(config.Numerical1);
            for (int i = 0; i < array.Length; i++)
            {
                gifts.Add(new SuperValueGift()
                {
                    giftId = array[i][0],
                    openDays = array[i][1],
                });
            }
            for (int i = 0; i < gifts.Count; i++)
            {
                redpoints.Add(new Redpoint(MainRedDot.REDPOINT_OPENSERVER, 20906 * 100 + i));
            }
        }
        private void RefreshBuyShopLimitEvent()
        {
            UpdateRedpoint();
        }
        public uint startSeconds { get; private set; }
        public void UpdateTime(HAA16_tagMCSuperGiftInfo package)
        {
            timeOverdueGiftId = (int)package.GiftID;
            overDueTime = ParseOverdueTime(package.EndtDate);
            bool _activate = CheckActivate();
            if (activate != _activate)
            startSeconds = package.StartTime;
            if (onStateUpate != null)
            {
                activate = _activate;
                if (onStateUpate != null)
                {
                    onStateUpate(6);
                }
            }
            if (timeLimitUpdate != null)
            {
                timeLimitUpdate();
                onStateUpate(6);
            }
            UpdateRedpoint();
        }
        DateTime ParseOverdueTime(string _date)
        public bool IsExist()
        {
            var array = _date.Split('-');
            var year = int.Parse(array[0]);
            var month = int.Parse(array[1]);
            var day = int.Parse(array[2]);
            var time = new DateTime(year, month, day, 0, 0, 0);
            return time.AddDays(1);
        }
        private void FirstChargeRewardEvent()
        {
            bool _activate = CheckActivate();
            if (activate != _activate)
            for (int i = 0; i < gifts.Count; i++)
            {
                activate = _activate;
                if (onStateUpate != null)
                {
                    onStateUpate(6);
                }
            }
            UpdateRedpoint();
        }
        public bool CheckActivate()
        {
            if (PlayerDatas.Instance.baseData.coinPointTotal == 0
                || !ModelCenter.Instance.GetModel<VipModel>().firstChargeRewardGet)
            {
                return false;
            }
            List<StoreConfig> _list = null;
            StoreConfig.TryGetStoreConfigs((int)StoreFunc.OSGift,out _list);
            for (int i = 0; i < _list.Count; i++)
            {
                if (IsGiftOverdue(_list[i].ID))
                if (!IsGiftExist(gifts[i].giftId))
                {
                    continue;
                }
                var _limit = storeModel.GetBuyShopLimit((uint)_list[i].ID);
                if (_limit == null || _limit.BuyCnt < _list[i].PurchaseNumber[0])
                {
                    return true;
                }
                return true;
            }
            return false;
        }
        public bool IsGiftOverdue(int _id)
        public bool IsGiftExist(int _id)
        {
            if (_id == timeOverdueGiftId)
            if (startSeconds == 0)
            {
                return TimeUtility.ServerNow >= overDueTime;
                return false;
            }
            var gift = gifts.Find((x) =>
            {
                return x.giftId == _id;
            });
            if (!gift.Equals(default(SuperValueGift)))
            {
                var startTime = TimeUtility.GetTime(startSeconds);
                var endTime = startTime.AddDays(gift.openDays);
                endTime = new DateTime(endTime.Year, endTime.Month, endTime.Day, 0, 0, 0);
                return TimeUtility.ServerNow < endTime;
            }
            return true;
        }
@@ -175,43 +173,75 @@
            return false;
        }
        private void PlayerDataRefreshInfoEvent(PlayerDataRefresh _type)
        public void SetAreadyOpens()
        {
            bool _activate = CheckActivate();
            if (_type == PlayerDataRefresh.ChangeCoinPointTotal && activate != _activate)
            alreadyOpens.Clear();
            for (int i = 0; i < gifts.Count; i++)
            {
                activate = _activate;
                if (onStateUpate != null)
                if (IsGiftExist(gifts[i].giftId))
                {
                    onStateUpate(6);
                    alreadyOpens.Add(i);
                }
            }
        }
        public void OnBeforePlayerDataInitialize()
        public int GetDefaultSelect()
        {
            timeOverdueGiftId = 0;
            for (int i = 0; i < alreadyOpens.Count; i++)
            {
                if (gifts[i].giftId == jumpGiftId)
                {
                    jumpGiftId = 0;
                    return alreadyOpens[i];
                }
            }
            jumpGiftId = 0;
            for (int i = 0; i < alreadyOpens.Count; i++)
            {
                if (redpoints[alreadyOpens[i]].state == RedPointState.Simple)
                {
                    return alreadyOpens[i];
                }
            }
            return alreadyOpens[0];
        }
        public void SetDayRemind()
        bool GetDayRemind(int index)
        {
            if (OSGiftRedpoint.state == RedPointState.Simple)
            return LocalSave.GetInt(StringUtility.Contact("OSGift_", index, "_",
                PlayerDatas.Instance.baseData.PlayerID), 0) == TimeUtility.Day;
        }
        public void SetDayRemind(int index)
        {
            if (redpoints[index].state == RedPointState.Simple)
            {
                DayRemind.Instance.SetDayRemind(DayRemind.OSGIFT_REDPOINT, true);
                LocalSave.SetInt(StringUtility.Contact("OSGift_", index, "_",
                       PlayerDatas.Instance.baseData.PlayerID), TimeUtility.Day);
                UpdateRedpoint();
            }
        }
        List<Redpoint> redpoints = new List<Redpoint>();
        void UpdateRedpoint()
        {
            OSGiftRedpoint.state = RedPointState.None;
            if (CheckActivate() && !DayRemind.Instance.GetDayRemind(DayRemind.OSGIFT_REDPOINT))
            for (int i = 0; i < redpoints.Count; i++)
            {
                OSGiftRedpoint.state = RedPointState.Simple;
                redpoints[i].state = RedPointState.None;
                if (IsGiftExist(gifts[i].giftId) && !IsGiftBuy(gifts[i].giftId)
                    && !GetDayRemind(i))
                {
                    redpoints[i].state = RedPointState.Simple;
                }
            }
        }
        public Redpoint OSGiftRedpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, 20906);
        public struct SuperValueGift
        {
            public int giftId;
            public int openDays;
        }
    }
}
System/OpenServerActivity/OpenServerActivityCell.cs
@@ -37,8 +37,8 @@
        [SerializeField] UIEffect m_TitleEffect;
        public UIEffect titleEffect { get { return m_TitleEffect; } }
        private int m_Order = 0;
        public int order { get { return m_Order; } set { m_Order = value; } }
        private int m_ActivityType = 0;
        public int activityType { get { return m_ActivityType; } set { m_ActivityType = value; } }
        public void ChangeState(TitleBtnState _state)
        {
System/OpenServerActivity/OpenServerActivityWin.cs
@@ -17,20 +17,25 @@
        Dictionary<int, bool> m_ActivitySpreadDict = new Dictionary<int, bool>();
        ImpactRankModel m_ImpactRankModel;
        ImpactRankModel impactRankModel {
            get {
        ImpactRankModel impactRankModel
        {
            get
            {
                return m_ImpactRankModel ?? (m_ImpactRankModel = ModelCenter.Instance.GetModel<ImpactRankModel>());
            }
        }
        OSRedEnvelopeModel m_OSRedEnvelopeModel;
        OSRedEnvelopeModel envelopeModel {
            get {
        OSRedEnvelopeModel envelopeModel
        {
            get
            {
                return m_OSRedEnvelopeModel ?? (m_OSRedEnvelopeModel = ModelCenter.Instance.GetModel<OSRedEnvelopeModel>());
            }
        }
        FairyLeagueModel fairyLeagueModel { get { return ModelCenter.Instance.GetModel<FairyLeagueModel>(); } }
        FairyGrabBossModel fairyGrabBossModel { get { return ModelCenter.Instance.GetModel<FairyGrabBossModel>(); } }
        OSGiftModel giftModel { get { return ModelCenter.Instance.GetModel<OSGiftModel>(); } }
        List<int> openActivitys = new List<int>();
        List<int> priorityActivitys = new List<int>();
@@ -58,7 +63,7 @@
            {
                m_ActivitySpreadDict[(int)m_CustomActivitys[i].activityType] = false;
            }
            var impactDefaultType= impactRankModel.GetDefaultSelectType();
            var impactDefaultType = impactRankModel.GetDefaultSelectType();
            if (impactRankModel.IsLock(impactDefaultType))
            {
                impactDefaultType = impactRankModel.billRankCfgDict.Keys.First();
@@ -66,6 +71,7 @@
            impactRankModel.presentSelectType = impactDefaultType;
            impactRankModel.gotoImpactRankType = 0;
            envelopeModel.selectType = 1;
            giftModel.SetAreadyOpens();
            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
            CheckAlreadyOpen();
            UpdateFunctionBtns();
@@ -109,9 +115,27 @@
                    envelopeModel.selectType = envelopeModel.JumpType != 0 ? envelopeModel.JumpType : 1;
                    envelopeModel.JumpType = 0;
                }
                if (functionOrder == 6)
                {
                    giftModel.selectIndex = giftModel.GetDefaultSelect();
                }
                UpdateFunctionBtns();
            }
            OnOpenActivity(functionOrder);
            var index = functionOrder;
            if (alreadyOpenActivitys.Contains(6))
            {
                if (functionOrder > 6)
                {
                    index = functionOrder + giftModel.alreadyOpens.Count - 1;
                }
                else if (functionOrder == 6)
                {
                    index = functionOrder + giftModel.selectIndex;
                }
            }
            m_ActivityCtrl.JumpIndex(index);
        }
        protected override void OnAfterOpen()
@@ -155,6 +179,9 @@
                        {
                            case OpenServerActivityCenter.OSActivityType.OSRedpack:
                                envelopeModel.selectType = envelopeModel.m_RedAchieveRedpoint.state == RedPointState.Simple ? 1 : 2;
                                break;
                            case OpenServerActivityCenter.OSActivityType.OSGift:
                                giftModel.selectIndex = giftModel.GetDefaultSelect();
                                break;
                        }
                    }
@@ -244,16 +271,21 @@
        private void RefreshOpenActivityCell(OpenServerActivityCell _cell)
        {
            var activityType = 0;
            activityType = _cell.index >= 1000 ? _cell.index / 1000 : _cell.index;
            var extraValue = _cell.index % 1000;
            var customActivity = m_CustomActivitys.Find((x) =>
            {
                return (int)x.activityType == _cell.index;
                return (int)x.activityType == activityType;
            });
            bool customIcon = !string.IsNullOrEmpty(customActivity.titleIcon);
            bool customIcon = !string.IsNullOrEmpty(customActivity.titleIcon)
                || (customActivity.titleIcons != null && customActivity.titleIcons.Count > 0);
            _cell.title.color = UIHelper.GetUIColor(TextColType.NavyBrown);
            OperationBase operationBase;
            switch (_cell.index)
            switch (activityType)
            {
                case 5:
                    if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.MultipleExp, out operationBase))
@@ -298,37 +330,63 @@
                    break;
                default:
                    _cell.title.gameObject.SetActive(!customIcon);
                    _cell.title.text = Language.Get(StringUtility.Contact("OSActivityTitle_", _cell.index));
                    if (!customIcon)
                    {
                        _cell.title.text = Language.Get(StringUtility.Contact("OSActivityTitle_", _cell.index));
                    }
                    break;
            }
            _cell.order = _cell.index;
            _cell.redpoint.redpointId = MainRedDot.REDPOINT_OPENSERVER * 100 + _cell.index;
            _cell.ChangeState(_cell.order == functionOrder ? TitleBtnState.Click : TitleBtnState.Normal);
            _cell.activityType = activityType;
            _cell.titleImage.gameObject.SetActive(customIcon);
            _cell.titleEffect.StopImediatly();
            switch (activityType)
            {
                case 6:
                    _cell.redpoint.redpointId = 20906 * 100 + extraValue;
                    _cell.ChangeState(extraValue == giftModel.selectIndex && functionOrder == activityType
                        ? TitleBtnState.Click : TitleBtnState.Normal);
                    if (customIcon)
                    {
                        _cell.titleImage.SetSprite(customActivity.titleIcons[extraValue]);
                        _cell.titleImage.SetNativeSize();
                    }
                    if (customActivity.titleEffectIds != null && extraValue < customActivity.titleEffectIds.Count)
                    {
                        _cell.titleEffect.effect = customActivity.titleEffectIds[extraValue];
                        _cell.titleEffect.Play();
                    }
                    break;
                default:
                    _cell.redpoint.redpointId = MainRedDot.REDPOINT_OPENSERVER * 100 + activityType;
                    _cell.ChangeState(_cell.activityType == functionOrder ? TitleBtnState.Click : TitleBtnState.Normal);
                    if (customIcon)
                    {
                        _cell.titleImage.SetSprite(customActivity.titleIcon);
                        _cell.titleImage.SetNativeSize();
                    }
                    if (customActivity.titleEffectId != 0)
                    {
                        _cell.titleEffect.effect = customActivity.titleEffectId;
                        _cell.titleEffect.Play();
                    }
                    break;
            }
            _cell.downArrow.gameObject.SetActive(false);
            _cell.upArrow.gameObject.SetActive(false);
            _cell.titleImage.gameObject.SetActive(customIcon);
            if (customIcon)
            if (_cell.activityType == 0 || _cell.activityType == 2)
            {
                _cell.titleImage.SetSprite(customActivity.titleIcon);
                _cell.titleImage.SetNativeSize();
            }
            _cell.titleEffect.StopImediatly();
            if (customActivity.titleEffectId != 0)
            {
                _cell.titleEffect.effect = customActivity.titleEffectId;
                _cell.titleEffect.Play();
                _cell.downArrow.gameObject.SetActive(m_ActivitySpreadDict[_cell.activityType]);
                _cell.upArrow.gameObject.SetActive(!m_ActivitySpreadDict[_cell.activityType]);
            }
            if (_cell.order == 0 || _cell.order == 2)
            {
                _cell.downArrow.gameObject.SetActive(m_ActivitySpreadDict[_cell.order]);
                _cell.upArrow.gameObject.SetActive(!m_ActivitySpreadDict[_cell.order]);
            }
            _cell.funcBtn.onClick.RemoveAllListeners();
            _cell.funcBtn.onClick.AddListener(() =>
            {
                OnActivityClick(_cell.order);
                OnActivityClick(_cell.activityType, extraValue);
            });
        }
@@ -402,6 +460,12 @@
                        m_ActivityCtrl.AddCell(ScrollerDataType.Normal, sort * 100 + 1);
                        m_ActivityCtrl.AddCell(ScrollerDataType.Normal, sort * 100 + 2);
                        break;
                    case 6:
                        for (int k = 0; k < giftModel.alreadyOpens.Count; k++)
                        {
                            m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort * 1000 + giftModel.alreadyOpens[k]);
                        }
                        break;
                    default:
                        m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort);
                        break;
@@ -411,9 +475,9 @@
            m_ActivityCtrl.m_Scorller.RefreshActiveCellViews();
        }
        private void OnActivityClick(int _order)
        private void OnActivityClick(int _order, int extra = 0)
        {
            if (functionOrder == _order)
            if (functionOrder == _order && _order != 6)
            {
                m_ActivitySpreadDict[_order] = !m_ActivitySpreadDict[_order];
                UpdateFunctionBtns();
@@ -424,8 +488,20 @@
                m_ActivitySpreadDict[functionOrder] = false;
                m_ActivitySpreadDict[_order] = true;
            }
            functionOrder = _order;
            OnOpenActivity(functionOrder);
            if (functionOrder != _order)
            {
                functionOrder = _order;
                OnOpenActivity(functionOrder);
            }
            switch (functionOrder)
            {
                case 6:
                    giftModel.selectIndex = extra;
                    break;
            }
            UpdateFunctionBtns();
        }
@@ -435,164 +511,52 @@
            switch (_order)
            {
                case 0:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<ImpactRankWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<ImpactRankWin>(true);
                    }
                    WindowCenter.Instance.Open<ImpactRankWin>(true);
                    break;
                case 1:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<ConsumeRebateWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<ConsumeRebateWin>(true);
                    }
                    WindowCenter.Instance.Open<ConsumeRebateWin>(true);
                    break;
                case 2:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<OpenServerRedEnvelopeWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<OpenServerRedEnvelopeWin>(true);
                    }
                    WindowCenter.Instance.Open<OpenServerRedEnvelopeWin>(true);
                    break;
                case 3:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<OSTimeLimitGiftWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<OSTimeLimitGiftWin>(true);
                    }
                    WindowCenter.Instance.Open<OSTimeLimitGiftWin>(true);
                    break;
                case 4:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<FlashSaleWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<FlashSaleWin>(true);
                    }
                    WindowCenter.Instance.Open<FlashSaleWin>(true);
                    break;
                case 5:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<MultipleExpWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<MultipleExpWin>(true);
                    }
                    WindowCenter.Instance.Open<MultipleExpWin>(true);
                    break;
                case 6:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<OpenServerGiftWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<OpenServerGiftWin>(true);
                    }
                    WindowCenter.Instance.Open<OpenServerGiftWin>(true);
                    break;
                case 7:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<LimitedTimePackageWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<LimitedTimePackageWin>(true);
                    }
                    WindowCenter.Instance.Open<LimitedTimePackageWin>(true);
                    break;
                case 8:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<NPracticePointWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<NPracticePointWin>(true);
                    }
                    WindowCenter.Instance.Open<NPracticePointWin>(true);
                    break;
                case 9:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<BossRebornWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<BossRebornWin>(true);
                    }
                    WindowCenter.Instance.Open<BossRebornWin>(true);
                    break;
                case 10:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<FairyJadeInvestmentWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<FairyJadeInvestmentWin>(true);
                    }
                    WindowCenter.Instance.Open<FairyJadeInvestmentWin>(true);
                    break;
                case 11:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<VipInvestWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<VipInvestWin>(true);
                    }
                    WindowCenter.Instance.Open<VipInvestWin>(true);
                    break;
                case 12:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<FairyLeagueNoticeWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<FairyLeagueNoticeWin>(true);
                    }
                    WindowCenter.Instance.Open<FairyLeagueNoticeWin>(true);
                    break;
                case 13:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<FairyGrabBossNoticeWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<FairyGrabBossNoticeWin>(true);
                    }
                    WindowCenter.Instance.Open<FairyGrabBossNoticeWin>(true);
                    break;
                case 14:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<FlashRushToBuyWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<FlashRushToBuyWin>(true);
                    }
                    WindowCenter.Instance.Open<FlashRushToBuyWin>(true);
                    break;
                case 15:
                    if (windowState == WindowState.Opened)
                    {
                        WindowCenter.Instance.OpenWithoutAnimation<WishingPoolWin>();
                    }
                    else
                    {
                        WindowCenter.Instance.Open<WishingPoolWin>(true);
                    }
                    WindowCenter.Instance.Open<WishingPoolWin>(true);
                    break;
            }
        }
@@ -679,6 +643,9 @@
            public OpenServerActivityCenter.OSActivityType activityType;
            public string titleIcon;
            public int titleEffectId;
            public List<string> titleIcons;
            public List<int> titleEffectIds;
        }
    }
}
System/OpenServerActivity/OpenServerGiftWin.cs
@@ -15,7 +15,6 @@
    public class OpenServerGiftWin : Window
    {
        [SerializeField] RectTransform m_ContainerDisplay;
        [SerializeField] Button[] m_CloseBtns;
        [SerializeField] OSGiftBehaviour[] m_OSGifts;
        [SerializeField] RectTransform m_ContainerTime;
        [SerializeField] Text m_Overdue;
@@ -29,8 +28,6 @@
            }
        }
        int currentSelectId = 0;
        OSGiftModel giftModel { get { return ModelCenter.Instance.GetModel<OSGiftModel>(); } }
        #region Built-in
        protected override void BindController()
@@ -39,24 +36,20 @@
        protected override void AddListeners()
        {
            for (int i = 0; i < m_CloseBtns.Length; i++)
            {
                m_CloseBtns[i].onClick.AddListener(OnCloseClick);
            }
        }
        protected override void OnPreOpen()
        {
            WindowCenter.Instance.windowAfterOpenEvent += WindowAfterOpenEvent;
            WindowCenter.Instance.windowAfterCloseEvent += windowAfterCloseEvent;
            model.RefreshBuyShopLimitEvent += RefreshBuyShopLimitEvent;
            TimeUtility.OnServerOpenDayRefresh += OnServerOpenDayRefresh;
            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
            giftModel.timeLimitUpdate += TimeLimitUpdate;
            giftModel.SetDayRemind();
            Display();
            if (!giftModel.alreadyOpens.Contains(giftModel.selectIndex))
            {
                giftModel.selectIndex = giftModel.alreadyOpens[0];
            }
            m_ContainerDisplay.gameObject.SetActive(!WindowCenter.Instance.IsOpen<OffLineOnHookWin>());
            model.RefreshBuyShopLimitEvent += RefreshBuyShopLimitEvent;
            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
            giftModel.onSelectUpdate += OnSelectUpdate;
            giftModel.jumpGiftId = 0;
            Display();
        }
        protected override void OnAfterOpen()
@@ -65,12 +58,9 @@
        protected override void OnPreClose()
        {
            WindowCenter.Instance.windowAfterOpenEvent -= WindowAfterOpenEvent;
            WindowCenter.Instance.windowAfterCloseEvent -= windowAfterCloseEvent;
            model.RefreshBuyShopLimitEvent -= RefreshBuyShopLimitEvent;
            TimeUtility.OnServerOpenDayRefresh -= OnServerOpenDayRefresh;
            GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
            giftModel.timeLimitUpdate -= TimeLimitUpdate;
            giftModel.onSelectUpdate -= OnSelectUpdate;
        }
        protected override void OnAfterClose()
@@ -78,28 +68,12 @@
        }
        #endregion
        private void WindowAfterOpenEvent(Window _win)
        {
            if(_win is OffLineOnHookWin)
            {
                m_ContainerDisplay.gameObject.SetActive(false);
            }
        }
        private void windowAfterCloseEvent(Window _win)
        {
            if (_win is OffLineOnHookWin)
            {
                m_ContainerDisplay.gameObject.SetActive(true);
            }
        }
        private void RefreshBuyShopLimitEvent()
        private void OnSelectUpdate()
        {
            Display();
        }
        private void OnServerOpenDayRefresh()
        private void RefreshBuyShopLimitEvent()
        {
            Display();
        }
@@ -109,59 +83,48 @@
            DisplayTimer();
        }
        private void TimeLimitUpdate()
        {
            Display();
        }
        void DisplayTimer()
        {
            var seconds = (int)(giftModel.overDueTime - TimeUtility.ServerNow).TotalSeconds;
            if (giftModel.IsGiftOverdue(currentSelectId) || seconds <= 0)
            if (giftModel.selectIndex >= 0 && giftModel.selectIndex < giftModel.gifts.Count)
            {
                m_ContainerTime.gameObject.SetActive(false);
                m_Overdue.gameObject.SetActive(true);
            }
            else
            {
                m_ContainerTime.gameObject.SetActive(true);
                m_Overdue.gameObject.SetActive(false);
                m_Timer.text = TimeUtility.SecondsToDHMSCHS(seconds);
                m_Timer.color = UIHelper.GetUIColor(TextColType.Green);
                var gift = giftModel.gifts[giftModel.selectIndex];
                var startTime = TimeUtility.GetTime(giftModel.startSeconds);
                var endTime = startTime.AddDays(gift.openDays);
                endTime = new DateTime(endTime.Year, endTime.Month, endTime.Day, 0, 0, 0);
                var seconds = (int)(endTime - TimeUtility.ServerNow).TotalSeconds;
                if (seconds <= 0)
                {
                    m_ContainerTime.gameObject.SetActive(false);
                    m_Overdue.gameObject.SetActive(true);
                }
                else
                {
                    m_ContainerTime.gameObject.SetActive(true);
                    m_Overdue.gameObject.SetActive(false);
                    m_Timer.text = TimeUtility.SecondsToDHMSCHS(seconds);
                    m_Timer.color = UIHelper.GetUIColor(TextColType.Green);
                }
            }
        }
        private void Display()
        {
            List<StoreConfig> _list = null;
            StoreConfig.TryGetStoreConfigs((int)StoreFunc.OSGift, out _list);
            var _index = 0;
            for (int i = 0; i < _list.Count; i++)
            for (int i = 0; i < giftModel.gifts.Count; i++)
            {
                if (!giftModel.IsGiftOverdue(_list[i].ID))
                if (giftModel.selectIndex == i)
                {
                    var _storeConfig = Config.Instance.Get<StoreConfig>(_list[i].ID);
                    var _limit = model.GetBuyShopLimit((uint)_list[i].ID);
                    if (_limit == null || _limit.BuyCnt < _storeConfig.PurchaseNumber[0])
                    {
                        _index = i;
                        currentSelectId = _list[i].ID;
                        m_OSGifts[i].Display(_list[i].ID);
                        break;
                    }
                    m_OSGifts[i].Display(giftModel.gifts[i].giftId);
                    _index = i;
                    break;
                }
                _index = i;
            }
            giftModel.SetDayRemind(giftModel.selectIndex);
            for (int i = 0; i < m_OSGifts.Length; i++)
            {
                m_OSGifts[i].gameObject.SetActive(_index == i);
            }
            DisplayTimer();
        }
        private void OnCloseClick()
        {
            CloseImmediately();
        }
    }
System/WindowJump/WindowJumpMgr.cs
@@ -837,7 +837,7 @@
                var giftModel = ModelCenter.Instance.GetModel<OSGiftModel>();
                int giftId = 0;
                int.TryParse(_tagWinSearchModel.SelectActive, out giftId);
                if (!giftModel.CheckActivate())
                if (!giftModel.IsGiftExist(giftId))
                {
                    if (PlayerDatas.Instance.baseData.coinPointTotal <= 0
                        || !ModelCenter.Instance.GetModel<VipModel>().firstChargeRewardGet)
@@ -848,12 +848,16 @@
                    {
                        SysNotifyMgr.Instance.ShowTip("GiftAlreadyBuy");
                    }
                    else if (giftModel.IsGiftOverdue(giftId))
                    else if (!giftModel.IsGiftExist(giftId))
                    {
                        SysNotifyMgr.Instance.ShowTip("MissSell");
                    }
                    return false;
                }
                else
                {
                    giftModel.jumpGiftId = giftId;
                }
                break;
            case JumpUIType.OpenServerGift:
                return false;