using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class OpenServerActivityWin : Window { [SerializeField] ScrollerController m_ActivityCtrl; [SerializeField] Button m_BtnClose; [SerializeField] Image m_TitleIcon; [SerializeField, Header("排序")] List m_SortArray; Dictionary m_ActivitySpreadDict = new Dictionary(); ImpactRankModel m_ImpactRankModel; ImpactRankModel impactRankModel { get { return m_ImpactRankModel ?? (m_ImpactRankModel = ModelCenter.Instance.GetModel()); } } OSRedEnvelopeModel m_OSRedEnvelopeModel; OSRedEnvelopeModel envelopeModel { get { return m_OSRedEnvelopeModel ?? (m_OSRedEnvelopeModel = ModelCenter.Instance.GetModel()); } } OSTimeLimitGiftModel m_OSTimeLimitGiftModel; OSTimeLimitGiftModel timeLimitGiftModel { get { return m_OSTimeLimitGiftModel ?? (m_OSTimeLimitGiftModel = ModelCenter.Instance.GetModel()); } } FlashSaleModel flashSaleModel { get { return ModelCenter.Instance.GetModel(); } } ConsumeRebateModel consumeRebateModel { get { return ModelCenter.Instance.GetModel(); } } MultipleExpModel multipleExpModel { get { return ModelCenter.Instance.GetModel(); } } List openActivitys = new List(); List activityReds = new List(); List alreadyOpenActivitys = new List(); protected override void BindController() { } protected override void AddListeners() { m_ActivityCtrl.OnRefreshCell += OnOpenServerActivityRefresh; m_BtnClose.onClick.AddListener(CloseClick); } protected override void OnPreOpen() { TimeUtility.OnServerOpenDayRefresh += OnStepServerDayEvent; OperationTimeHepler.Instance.operationTimeUpdateEvent += OperationTimeUpdateEvent; for (int i = 0; i < m_SortArray.Count; i++) { m_ActivitySpreadDict[m_SortArray[i]] = false; } impactRankModel.presentSelectType = impactRankModel.GetDefaultSelectType(); impactRankModel.gotoImpactRankType = 0; envelopeModel.selectType = 1; CheckAlreadyOpen(); UpdateFunctionBtns(); } protected override void OnActived() { if (functionOrder == 1) { functionOrder = 0; } if (functionOrder == 0 && !WindowJumpMgr.Instance.IsJumpState) { functionOrder = GetDefaultSelect(); for (int i = 0; i < m_SortArray.Count; i++) { m_ActivitySpreadDict[m_SortArray[i]] = m_SortArray[i] == functionOrder; } UpdateFunctionBtns(); } else { for (int i = 0; i < m_SortArray.Count; i++) { m_ActivitySpreadDict[m_SortArray[i]] = m_SortArray[i] == functionOrder; } if (functionOrder == 2) { envelopeModel.selectType = envelopeModel.JumpType != 0 ? envelopeModel.JumpType : 1; envelopeModel.JumpType = 0; } UpdateFunctionBtns(); } OnOpenActivity(functionOrder); } protected override void OnAfterOpen() { impactRankModel.OSCEffectOpen = false; } protected override void OnPreClose() { TimeUtility.OnServerOpenDayRefresh -= OnStepServerDayEvent; OperationTimeHepler.Instance.operationTimeUpdateEvent -= OperationTimeUpdateEvent; CloseOtherWin(); WindowCenter.Instance.Open(); impactRankModel.gotoImpactRankType = 0; } protected override void OnAfterClose() { } int GetDefaultSelect() { openActivitys.Clear(); activityReds.Clear(); if (OpenServerActivityCenter.Instance.IsTimeLimitGiftOpen()) { openActivitys.Add(3); if (timeLimitGiftModel.redpoint.state == RedPointState.Simple) { activityReds.Add(3); } } if (OpenServerActivityCenter.Instance.IsFlashSaleOpen()) { openActivitys.Add(4); if (flashSaleModel.flashSaleRedpoint.state == RedPointState.Simple) { activityReds.Add(4); } } if (OpenServerActivityCenter.Instance.IsImpactRankOpen()) { openActivitys.Add(0); if (impactRankModel.HasRedpoint()) { activityReds.Add(0); } } if (OpenServerActivityCenter.Instance.IsRedEnvelopeOpen()) { openActivitys.Add(2); if (envelopeModel.m_RedAchieveRedpoint.state == RedPointState.Simple) { activityReds.Add(2); envelopeModel.selectType = 1; } else if (envelopeModel.m_OpenServerGetRedpin.state == RedPointState.Simple) { activityReds.Add(2); envelopeModel.selectType = 2; } } if (OpenServerActivityCenter.Instance.IsConsumeRebateOpen()) { openActivitys.Add(1); if (consumeRebateModel.consumeRebateRedpoint.state == RedPointState.Simple) { activityReds.Add(1); } } if (OpenServerActivityCenter.Instance.IsMultipleExpOpen()) { openActivitys.Add(5); if (multipleExpModel.multipleExpRedpoint.state == RedPointState.Simple) { activityReds.Add(5); } } if (activityReds.Count > 0) { activityReds.Sort(Compare); return activityReds[0]; } else { openActivitys.Sort(Compare); return openActivitys[0]; } } void CheckAlreadyOpen() { alreadyOpenActivitys.Clear(); if (OpenServerActivityCenter.Instance.IsTimeLimitGiftOpen()) { alreadyOpenActivitys.Add(3); } if (OpenServerActivityCenter.Instance.IsFlashSaleOpen()) { alreadyOpenActivitys.Add(4); } if (OpenServerActivityCenter.Instance.IsImpactRankOpen()) { alreadyOpenActivitys.Add(0); } if (OpenServerActivityCenter.Instance.IsRedEnvelopeOpen()) { alreadyOpenActivitys.Add(2); } if (OpenServerActivityCenter.Instance.IsConsumeRebateOpen()) { alreadyOpenActivitys.Add(1); } if (OpenServerActivityCenter.Instance.IsMultipleExpOpen()) { alreadyOpenActivitys.Add(5); } } private void OnOpenServerActivityRefresh(ScrollerDataType type, CellView cell) { switch (type) { case ScrollerDataType.Header: RefreshOpenActivityCell(cell as OpenServerActivityCell); break; case ScrollerDataType.Normal: RefreshActivityTypeCell(cell as OpenActivityRankTypeCell); break; } } private void RefreshOpenActivityCell(OpenServerActivityCell _cell) { switch (_cell.index) { case 5: OperationBase operationBase; if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.MultipleExp, out operationBase)) { _cell.title.text = Language.Get("ExpActivity_Text5", (operationBase as OperationMultiExp).GetMultipleCHS()); } break; default: _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.arrow.rectTransform.localEulerAngles = m_ActivitySpreadDict[_cell.order] ? new Vector3(0, 0, -90) : Vector3.zero; _cell.arrow.gameObject.SetActive(_cell.order == 0 || _cell.order == 2); _cell.funcBtn.onClick.RemoveAllListeners(); _cell.funcBtn.onClick.AddListener(() => { OnActivityClick(_cell.order); }); } private void OnStepServerDayEvent() { m_ActivityCtrl.m_Scorller.RefreshActiveCellViews(); } private void RefreshActivityTypeCell(OpenActivityRankTypeCell _cell) { int _order = _cell.index / 100; int _type = _cell.index % 100; switch (_order) { case 0: _cell.redpoint.redpointId = ImpactRankModel.Redpoint_Key_ImpactRank * 100 + _type; _cell.titleTxt.text = Language.Get(StringUtility.Contact("ImpactRankType_", _type)); _cell.ChangeState(_type == impactRankModel.presentSelectType ? TitleBtnState.Click : TitleBtnState.Normal); break; case 2: _cell.redpoint.redpointId = 20902 * 100 + _type; _cell.titleTxt.text = Language.Get(StringUtility.Contact("OSRedEnvelopeType_", _type)); _cell.ChangeState(_type == envelopeModel.selectType ? TitleBtnState.Click : TitleBtnState.Normal); break; } _cell.functionBtn.onClick.RemoveAllListeners(); _cell.functionBtn.onClick.AddListener(() => { OnActivityType(_cell.index); }); } private void UpdateFunctionBtns() { m_ActivityCtrl.Refresh(); for (int i = 0; i < m_SortArray.Count; i++) { var sort = m_SortArray[i]; if (!alreadyOpenActivitys.Contains(sort)) { continue; } switch (sort) { case 0: m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort); if (functionOrder != sort) { break; } if (!m_ActivitySpreadDict[sort]) { break; } foreach (var _type in impactRankModel.billRankCfgDict.Keys) { m_ActivityCtrl.AddCell(ScrollerDataType.Normal, sort * 100 + _type); } break; case 1: m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort); continue; case 2: m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort); if (!m_ActivitySpreadDict[sort]) { break; } m_ActivityCtrl.AddCell(ScrollerDataType.Normal, sort * 100 + 1); m_ActivityCtrl.AddCell(ScrollerDataType.Normal, sort * 100 + 2); break; case 3: m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort); break; case 4: m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort); break; case 5: m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort); break; } } m_ActivityCtrl.Restart(); m_ActivityCtrl.m_Scorller.RefreshActiveCellViews(); } private void OnActivityClick(int _order) { if (functionOrder == _order) { m_ActivitySpreadDict[_order] = !m_ActivitySpreadDict[_order]; UpdateFunctionBtns(); return; } else { m_ActivitySpreadDict[functionOrder] = false; m_ActivitySpreadDict[_order] = true; } functionOrder = _order; OnOpenActivity(functionOrder); UpdateFunctionBtns(); } private void OnOpenActivity(int _order) { CloseOtherWin(); switch (_order) { case 0: if (windowState == WindowState.Opened) { WindowCenter.Instance.OpenWithoutAnimation(); } else { WindowCenter.Instance.Open(true); } break; case 1: if (windowState == WindowState.Opened) { WindowCenter.Instance.OpenWithoutAnimation(); } else { WindowCenter.Instance.Open(true); } break; case 2: if (windowState == WindowState.Opened) { WindowCenter.Instance.OpenWithoutAnimation(); } else { WindowCenter.Instance.Open(true); } break; case 3: if (windowState == WindowState.Opened) { WindowCenter.Instance.OpenWithoutAnimation(); } else { WindowCenter.Instance.Open(true); } break; case 4: if (windowState == WindowState.Opened) { WindowCenter.Instance.OpenWithoutAnimation(); } else { WindowCenter.Instance.Open(true); } break; case 5: if (windowState == WindowState.Opened) { WindowCenter.Instance.OpenWithoutAnimation(); } else { WindowCenter.Instance.Open(true); } break; } } private void OnActivityType(int _index) { var _order = _index / 100; var _type = _index % 100; switch (_order) { case 0: impactRankModel.presentSelectType = _type; break; case 2: envelopeModel.selectType = _type; break; } m_ActivityCtrl.m_Scorller.RefreshActiveCellViews(); } private void CloseOtherWin() { WindowCenter.Instance.CloseImmediately(); WindowCenter.Instance.CloseImmediately(); WindowCenter.Instance.CloseImmediately(); WindowCenter.Instance.CloseImmediately(); WindowCenter.Instance.CloseImmediately(); WindowCenter.Instance.CloseImmediately(); } private int Compare(int x, int y) { var index_x = m_SortArray.IndexOf(x); var index_y = m_SortArray.IndexOf(y); return index_x.CompareTo(index_y); } private void OperationTimeUpdateEvent(Operation type) { if (type == Operation.MultipleExp) { m_ActivityCtrl.m_Scorller.RefreshActiveCellViews(); } } } }