using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; #if UNITY_EDITOR using UnityEditor; using UnityEditorInternal; #endif namespace Snxxz.UI { [XLua.Hotfix] public class OpenServerActivityWin : Window { [SerializeField] ScrollerController m_ActivityCtrl; [SerializeField] Button m_BtnClose; [SerializeField, HideInInspector] List m_CustomActivitys; 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()); } } FairyLeagueModel fairyLeagueModel { get { return ModelCenter.Instance.GetModel(); } } FairyGrabBossModel fairyGrabBossModel { get { return ModelCenter.Instance.GetModel(); } } OSGiftModel giftModel { get { return ModelCenter.Instance.GetModel(); } } FestivalRedpackModel festivalRedpackModel { get { return ModelCenter.Instance.GetModel(); } } List openActivitys = new List(); List priorityActivitys = new List(); List alreadyOpenActivitys = new List(); public static event Func tryCloseEvent; protected override void BindController() { } protected override void AddListeners() { m_ActivityCtrl.OnRefreshCell += OnOpenServerActivityRefresh; m_ActivityCtrl.OnGetDynamicSize += OnGetDynamicSize; m_ActivityCtrl.lockType = EnhanceLockType.KeepVertical; m_BtnClose.onClick.AddListener(TryClose); } protected override void OnPreOpen() { TimeUtility.OnServerOpenDayRefresh += OnStepServerDayEvent; OperationTimeHepler.Instance.operationTimeUpdateEvent += OperationTimeUpdateEvent; OpenServerActivityCenter.Instance.openServerActivityStateChange += OpenServerActivityStateChange; for (int i = 0; i < m_CustomActivitys.Count; i++) { m_ActivitySpreadDict[(int)m_CustomActivitys[i].activityType] = false; } var impactDefaultType = impactRankModel.GetDefaultSelectType(); if (impactRankModel.IsLock(impactDefaultType)) { impactDefaultType = impactRankModel.impactRankSorts[0]; } impactRankModel.presentSelectType = impactDefaultType; impactRankModel.gotoImpactRankType = 0; envelopeModel.selectType = 1; festivalRedpackModel.selectType = 1; giftModel.SetAreadyOpens(); GlobalTimeEvent.Instance.secondEvent += SecondEvent; CheckAlreadyOpen(); UpdateFunctionBtns(); } protected override void OnActived() { bool force = false; if (OpenServerActivityCenter.Instance.selectFuncOrder != -1 && !WindowJumpMgr.Instance.IsJumpState) { functionOrder = OpenServerActivityCenter.Instance.selectFuncOrder; force = true; } OpenServerActivityCenter.Instance.selectFuncOrder = -1; if (alreadyOpenActivitys.Count == 0) { CloseImmediately(); return; } if (functionOrder == 0 && !WindowJumpMgr.Instance.IsJumpState && !force) { functionOrder = GetDefaultSelect(); //for (int i = 0; i < m_SortArray.Count; i++) //{ // m_ActivitySpreadDict[m_SortArray[i]] = m_SortArray[i] == functionOrder; //} UpdateFunctionBtns(); } else { if (!alreadyOpenActivitys.Contains(functionOrder)) { functionOrder = GetDefaultSelect(); } //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; } if (functionOrder == 6) { giftModel.selectIndex = giftModel.GetDefaultSelect(); } if (functionOrder == 19) { festivalRedpackModel.selectType = festivalRedpackModel.jumpType != 0 ? festivalRedpackModel.jumpType : 1; festivalRedpackModel.jumpType = 0; } UpdateFunctionBtns(); } OnOpenActivity(functionOrder); var index = alreadyOpenActivitys.IndexOf(functionOrder); if (alreadyOpenActivitys.Contains(6)) { if (index > alreadyOpenActivitys.IndexOf(6)) { index = index + giftModel.alreadyOpens.Count - 1; } else if (index == alreadyOpenActivitys.IndexOf(6)) { index = index + giftModel.selectIndex; } } m_ActivityCtrl.JumpIndex(index); } protected override void OnAfterOpen() { impactRankModel.OSCEffectOpen = false; } protected override void OnPreClose() { TimeUtility.OnServerOpenDayRefresh -= OnStepServerDayEvent; OperationTimeHepler.Instance.operationTimeUpdateEvent -= OperationTimeUpdateEvent; OpenServerActivityCenter.Instance.openServerActivityStateChange -= OpenServerActivityStateChange; GlobalTimeEvent.Instance.secondEvent -= SecondEvent; CloseOtherWin(); impactRankModel.gotoImpactRankType = 0; } protected override void OnAfterClose() { if (!WindowJumpMgr.Instance.IsJumpState) { WindowCenter.Instance.Open(); } } private void TryClose() { switch ((OpenServerActivityCenter.OSActivityType)functionOrder) { case OpenServerActivityCenter.OSActivityType.MysticalPurchase: if (tryCloseEvent != null) { if (!tryCloseEvent()) { return; } } break; } CloseClick(); } int GetDefaultSelect() { openActivitys.Clear(); priorityActivitys.Clear(); for (int i = 0; i < m_CustomActivitys.Count; i++) { if (OpenServerActivityCenter.Instance.IsActivityOpen((int)m_CustomActivitys[i].activityType)) { openActivitys.Add((int)m_CustomActivitys[i].activityType); if (OpenServerActivityCenter.Instance.IsPriorityOpenOpen((int)m_CustomActivitys[i].activityType)) { priorityActivitys.Add((int)m_CustomActivitys[i].activityType); switch (m_CustomActivitys[i].activityType) { case OpenServerActivityCenter.OSActivityType.OSRedpack: envelopeModel.selectType = envelopeModel.m_RedAchieveRedpoint.state == RedPointState.Simple ? 1 : 2; break; case OpenServerActivityCenter.OSActivityType.OSGift: giftModel.selectIndex = giftModel.GetDefaultSelect(); break; case OpenServerActivityCenter.OSActivityType.FestivalRedpack: if (festivalRedpackModel.systemRedpoint.state == RedPointState.Simple) { festivalRedpackModel.selectType = 1; break; } else if (festivalRedpackModel.taskRedpoint.state == RedPointState.Simple) { festivalRedpackModel.selectType = 2; break; } else if (festivalRedpackModel.receiveRedpoint.state == RedPointState.Simple) { festivalRedpackModel.selectType = 3; break; } festivalRedpackModel.selectType = 1; break; } } } } if (priorityActivitys.Count > 0) { priorityActivitys.Sort(Compare); return priorityActivitys[0]; } else { openActivitys.Sort(Compare); return openActivitys[0]; } } private void SecondEvent() { var cell = m_ActivityCtrl.GetActiveCellView((int)OpenServerActivityCenter.OSActivityType.FairyLeagueNotice); if (cell != null) { var activityCell = cell as OpenServerActivityCell; var seconds = fairyLeagueModel.GetBeforeFirstLeagueTime(); activityCell.timer.text = TimeUtility.SecondsToHMS(seconds); activityCell.containerTimer.gameObject.SetActive(seconds > 0); } cell = m_ActivityCtrl.GetActiveCellView((int)OpenServerActivityCenter.OSActivityType.FairyGrabBossNotice); if (cell != null) { var activityCell = cell as OpenServerActivityCell; var seconds = fairyGrabBossModel.GetNextSessionSeconds(); bool isOpen = fairyGrabBossModel.IsOpen; activityCell.containerTimer.gameObject.SetActive(seconds > 0 || isOpen); if (seconds > 0) { activityCell.timer.text = TimeUtility.SecondsToHMS(seconds); } else if (isOpen) { activityCell.timer.text = Language.Get("FairyGrabBossOpened"); } } } void CheckAlreadyOpen() { alreadyOpenActivitys.Clear(); for (int i = 0; i < m_CustomActivitys.Count; i++) { if (OpenServerActivityCenter.Instance.IsActivityOpen((int)m_CustomActivitys[i].activityType)) { alreadyOpenActivitys.Add((int)m_CustomActivitys[i].activityType); } } } 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 bool OnGetDynamicSize(ScrollerDataType type, int index, out float height) { height = 74; var sort = index; if (type == ScrollerDataType.Header) { if (!m_ActivitySpreadDict.ContainsKey(sort) || !m_ActivitySpreadDict[sort] || (sort != 2 && sort != 0 && sort != 19)) { height = 114; return true; } } return false; } 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 == activityType; }); switch (activityType) { case 12: { var seconds = fairyLeagueModel.GetBeforeFirstLeagueTime(); _cell.containerTimer.gameObject.SetActive(seconds > 0); if (seconds > 0) { _cell.timer.text = TimeUtility.SecondsToHMS(seconds); } } break; case 13: { var seconds = fairyGrabBossModel.GetNextSessionSeconds(); bool isOpen = fairyGrabBossModel.IsOpen; _cell.containerTimer.gameObject.SetActive(seconds > 0 || isOpen); if (seconds > 0) { _cell.timer.text = TimeUtility.SecondsToHMS(seconds); } else if (isOpen) { _cell.timer.text = Language.Get("FairyGrabBossOpened"); } } break; default: _cell.containerTimer.gameObject.SetActive(false); break; } _cell.activityType = activityType; switch (activityType) { case 6: _cell.redpoint.redpointId = 20906 * 100 + extraValue; _cell.SetSelect(extraValue == giftModel.selectIndex && functionOrder == activityType); _cell.icon.SetSprite(StringUtility.Contact(customActivity.bottomIcon, extraValue)); break; default: _cell.redpoint.redpointId = MainRedDot.REDPOINT_OPENSERVER * 100 + activityType; _cell.SetSelect(_cell.activityType == functionOrder); _cell.icon.SetSprite(customActivity.bottomIcon); break; } _cell.downArrow.gameObject.SetActive(false); _cell.upArrow.gameObject.SetActive(false); if (_cell.activityType == 0 || _cell.activityType == 2 || _cell.activityType == 19) { _cell.downArrow.gameObject.SetActive(m_ActivitySpreadDict[_cell.activityType]); _cell.upArrow.gameObject.SetActive(!m_ActivitySpreadDict[_cell.activityType]); } _cell.funcBtn.onClick.RemoveAllListeners(); _cell.funcBtn.onClick.AddListener(() => { OnActivityClick(_cell.activityType, extraValue); }); } private void OnStepServerDayEvent() { //m_ActivityCtrl.m_Scorller.RefreshActiveCellViews(); UpdateFunctionBtns(); } 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.SetSelect(_type == impactRankModel.presentSelectType); break; case 2: _cell.redpoint.redpointId = 20902 * 100 + _type; _cell.titleTxt.text = Language.Get(StringUtility.Contact("OSRedEnvelopeType_", _type)); _cell.SetSelect(_type == envelopeModel.selectType); break; case 19: _cell.redpoint.redpointId = 20919 * 100 + _type; _cell.titleTxt.text = Language.Get(StringUtility.Contact("FestivalRedpackType_", _type)); _cell.SetSelect(_type == festivalRedpackModel.selectType); break; } _cell.functionBtn.onClick.RemoveAllListeners(); _cell.functionBtn.onClick.AddListener(() => { OnActivityType(_cell.index); }); } private void UpdateFunctionBtns() { m_ActivityCtrl.Refresh(); for (int i = 0; i < m_CustomActivitys.Count; i++) { var sort = (int)m_CustomActivitys[i].activityType; if (!alreadyOpenActivitys.Contains(sort)) { continue; } switch (sort) { case 0: m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort); if (functionOrder != sort) { m_ActivitySpreadDict[sort] = false; break; } if (!m_ActivitySpreadDict[sort]) { break; } foreach (var _type in impactRankModel.impactRankSorts) { if (impactRankModel.IsLock(_type)) { continue; } m_ActivityCtrl.AddCell(ScrollerDataType.Normal, sort * 100 + _type); } break; case 2: m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort); if (!m_ActivitySpreadDict[sort]) { m_ActivitySpreadDict[sort] = false; break; } 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; case 19: m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort); if (!m_ActivitySpreadDict[sort]) { m_ActivitySpreadDict[sort] = false; break; } m_ActivityCtrl.AddCell(ScrollerDataType.Normal, sort * 100 + 1); m_ActivityCtrl.AddCell(ScrollerDataType.Normal, sort * 100 + 2); m_ActivityCtrl.AddCell(ScrollerDataType.Normal, sort * 100 + 3); break; default: m_ActivityCtrl.AddCell(ScrollerDataType.Header, sort); break; } } m_ActivityCtrl.Restart(); m_ActivityCtrl.m_Scorller.RefreshActiveCellViews(); } private void OnActivityClick(int _order, int extra = 0) { if (functionOrder == _order && _order != 6) { m_ActivitySpreadDict[_order] = !m_ActivitySpreadDict[_order]; UpdateFunctionBtns(); return; } else { m_ActivitySpreadDict[functionOrder] = false; m_ActivitySpreadDict[_order] = true; } if (functionOrder != _order) { functionOrder = _order; OnOpenActivity(functionOrder); } switch (functionOrder) { case 6: giftModel.selectIndex = extra; break; } UpdateFunctionBtns(); } private void OnOpenActivity(int _order) { CloseOtherWin(); switch (_order) { case 0: WindowCenter.Instance.Open(true); break; case 1: WindowCenter.Instance.Open(true); break; case 2: WindowCenter.Instance.Open(true); break; case 3: WindowCenter.Instance.Open(true); break; case 4: WindowCenter.Instance.Open(true); break; case 5: WindowCenter.Instance.Open(true); break; case 6: WindowCenter.Instance.Open(true); break; case 7: WindowCenter.Instance.Open(true); break; case 8: WindowCenter.Instance.Open(true); break; case 9: WindowCenter.Instance.Open(true); break; case 10: WindowCenter.Instance.Open(true); break; case 11: WindowCenter.Instance.Open(true); break; case 12: WindowCenter.Instance.Open(true); break; case 13: WindowCenter.Instance.Open(true); break; case 14: WindowCenter.Instance.Open(true); break; case 15: WindowCenter.Instance.Open(true); break; case 16: WindowCenter.Instance.Open(true); break; case 17: WindowCenter.Instance.Open(true); break; case 18: WindowCenter.Instance.Open(true); break; case 19: WindowCenter.Instance.Open(true); break; case 20: WindowCenter.Instance.Open(true); break; case 21: 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; case 19: festivalRedpackModel.selectType = _type; break; } m_ActivityCtrl.m_Scorller.RefreshActiveCellViews(); } private void CloseOtherWin() { var children = WindowConfig.Get().FindChildWindows("OpenServerActivityWin"); foreach (var window in children) { WindowCenter.Instance.Close(window); } } private int Compare(int order_x, int order_y) { var index_x = m_CustomActivitys.FindIndex((x) => { return order_x == (int)x.activityType; }); var index_y = m_CustomActivitys.FindIndex((x) => { return order_y == (int)x.activityType; }); return index_x.CompareTo(index_y); } private void OperationTimeUpdateEvent(Operation type) { if (type == Operation.MultipleExp || type == Operation.MultipRealmPoint) { m_ActivityCtrl.m_Scorller.RefreshActiveCellViews(); } } private void OpenServerActivityStateChange() { bool _update = false; for (int i = 0; i < m_CustomActivitys.Count; i++) { if (OpenServerActivityCenter.Instance.IsActivityOpen((int)m_CustomActivitys[i].activityType) && !alreadyOpenActivitys.Contains((int)m_CustomActivitys[i].activityType)) { alreadyOpenActivitys.Add((int)m_CustomActivitys[i].activityType); _update = true; } } if (_update) { UpdateFunctionBtns(); } } [Serializable] public struct CustomActivityDisplay { public OpenServerActivityCenter.OSActivityType activityType; public string bottomIcon; } } #if UNITY_EDITOR [CustomEditor(typeof(OpenServerActivityWin))] public class OpenServerActivityInspector : Editor { ReorderableList reorderableList; private void OnEnable() { var prop = serializedObject.FindProperty("m_CustomActivitys"); reorderableList = new ReorderableList(serializedObject, prop, true, true, true, true); reorderableList.elementHeight = 50; reorderableList.drawElementCallback = (rect, index, isActive, isFocused) => { var element = prop.GetArrayElementAtIndex(index); rect.height -= 4; rect.y += 2; EditorGUI.PropertyField(rect, element); }; reorderableList.drawHeaderCallback = (rect) => EditorGUI.LabelField(rect, prop.displayName); } public override void OnInspectorGUI() { base.OnInspectorGUI(); serializedObject.Update(); reorderableList.DoLayoutList(); serializedObject.ApplyModifiedProperties(); } } [CustomPropertyDrawer(typeof(OpenServerActivityWin.CustomActivityDisplay))] public class CustomActivityDrawer : PropertyDrawer { static string[] enumDisplayNames = null; public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { using (new EditorGUI.PropertyScope(position, label, property)) { var rect = new Rect(position) { height = 20, }; var serializedProperty = property.FindPropertyRelative("activityType"); if (enumDisplayNames == null || enumDisplayNames.Length != serializedProperty.enumNames.Length) { enumDisplayNames = new string[serializedProperty.enumNames.Length]; var enumtype = typeof(OpenServerActivityCenter.OSActivityType); var index = 0; foreach (var enumName in serializedProperty.enumNames) { var enumfield = enumtype.GetField(enumName); var customAttributes = enumfield.GetCustomAttributes(typeof(HeaderAttribute), false); enumDisplayNames[index] = customAttributes.Length <= 0 ? enumName : ((HeaderAttribute)customAttributes[0]).header; index++; } } serializedProperty.enumValueIndex = EditorGUI.Popup(rect, serializedProperty.enumValueIndex, enumDisplayNames); rect = new Rect(position) { y = position.y + 20, height = 20, }; serializedProperty = property.FindPropertyRelative("bottomIcon"); serializedProperty.stringValue = EditorGUI.TextField(rect, "IconKey", serializedProperty.stringValue); } } } #endif }