using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using CJ.Wait; using System; using TableConfig; using System.Text.RegularExpressions; using DG.Tweening; namespace Snxxz.UI { public class MessageWin : Window { private static MessageWin _inst = null; public static MessageWin Inst { get { if (_inst == null) { _inst = WindowCenter.Instance.Open(true); } return _inst; } } [SerializeField] RectTransform m_ContianerFixedTip0; [SerializeField] RichText m_FixedTip0; [SerializeField] List m_ContianerFixedTips; [SerializeField] List m_FixedTips; List m_FixedTipDisplays = new List(); #region GM [SerializeField] GameObject gmPanel; [SerializeField] ScrollerController gmCtrl; [SerializeField] Toggle gmToggle; [SerializeField] Toggle gmUpdateToggle; [SerializeField] Button gmClose; #endregion public void ShowFixedTip(string tip, ArrayList infoList = null) { m_FixedTip0.SetExtenalData(infoList); m_FixedTip0.text = tip; if (!m_ContianerFixedTip0.gameObject.activeInHierarchy) { m_ContianerFixedTip0.gameObject.SetActive(true); } m_ContianerFixedTip0.DoWaitRestart(); } public void ShowFixedTips(string tip, ArrayList infoList = null) { var _index = m_FixedTipDisplays.FindIndex((x) => { return !x; }); _index = _index == -1 ? 0 : _index; m_FixedTips[_index].SetExtenalData(infoList); m_FixedTips[_index].text = tip; m_FixedTipDisplays[_index] = true; if (!m_ContianerFixedTips[_index].gameObject.activeInHierarchy) { m_ContianerFixedTips[_index].gameObject.SetActive(true); } m_ContianerFixedTips[_index].DoWaitRestart(); } private void OnHideFixedTip(Component com) { com.DoWaitStop(); com.gameObject.SetActive(false); var _index = m_ContianerFixedTips.FindIndex((x) => { return x.Equals(com); }); if (_index != -1) { m_FixedTipDisplays[_index] = false; } } [SerializeField] RectTransform m_ContainerServerTip; [SerializeField] ScaleTween m_ServerTipScaleTween; [SerializeField] PositionTween m_ServerTipPositionTween; [SerializeField] RichText m_ServerTip; [SerializeField, Header("全服广播停留时间")] float m_ServerTipKeepTime = 1.5f; private bool serverTipPrepared = true; public void ShowServerTip() { if (!serverTipPrepared) { return; } var _hint = ServerTipDetails.RequireServerTip(); if (_hint != null) { serverTipPrepared = false; m_ServerTipScaleTween.SetStartState(); m_ServerTipPositionTween.SetStartState(); m_ContainerServerTip.gameObject.SetActive(true); m_ServerTip.SetExtenalData(_hint.extentionData); m_ServerTip.text = _hint.message; m_ServerTipScaleTween.Play(); TimeMgr.Instance.Register(m_ServerTip, ServerTipStartHide, m_ServerTipKeepTime + m_ServerTipScaleTween.duration); } else { DisableServerTip(); } } private void ServerTipStartHide(Component comp) { m_ServerTipPositionTween.Play(); TimeMgr.Instance.Register(m_ServerTipPositionTween, ServerTipTweenComplete, m_ServerTipPositionTween.duration); } private void ServerTipTweenComplete(Component comp) { serverTipPrepared = true; DisableServerTip(); ShowServerTip(); } private void DisableServerTip() { m_ContainerServerTip.gameObject.SetActive(false); m_ServerTipScaleTween.Stop(); m_ServerTipPositionTween.Stop(); m_ServerTipScaleTween.SetStartState(); m_ServerTipPositionTween.SetStartState(); } #region GM private const int MAX_GM = 300; private List gmList = new List(); public readonly Regex autoPopRegex = new Regex("参数错误|执行GM命令错误|^###"); public void RevGMMsg(string msg) { if (gmList.Count >= MAX_GM) { gmList.RemoveAt(0); } msg.Replace("###", string.Empty); gmList.Add(msg); if (gmToggle.isOn && hasOnFrom) { RectTransform rt = gmPanel.transform as RectTransform; Vector3 pos = new Vector3(hasOnFrom ? -rt.sizeDelta.x / 2 : rt.sizeDelta.x / 2, 0, 0); rt.DOLocalMove(pos, 1.0f); hasOnFrom = !hasOnFrom; gmClose.gameObject.SetActive(!hasOnFrom); } if (gmCtrl.GetNumberOfCells(gmCtrl.m_Scorller) >= MAX_GM) { gmCtrl.m_Scorller.RefreshActiveCellViews(); return; } gmCtrl.Refresh(); for (int i = 0; i < gmList.Count; i++) { gmCtrl.AddCell(ScrollerDataType.Normal, i); } gmCtrl.Restart(); if (autoPopRegex.IsMatch(msg)) { if (hasOnFrom) { OnGMOpen(); } } } private void OnRefreshGmCell(ScrollerDataType type, CellView cell) { if (cell.index < gmList.Count) { Text text = cell.transform.Find("Text").GetComponent(); text.text = gmList[cell.index]; } } private void OnGMClose() { if (!hasOnFrom) { RectTransform rt = gmPanel.transform as RectTransform; Vector3 pos = new Vector3(hasOnFrom ? -rt.sizeDelta.x / 2 : rt.sizeDelta.x / 2, 0, 0); rt.DOLocalMove(pos, 1.0f); hasOnFrom = !hasOnFrom; gmClose.gameObject.SetActive(!hasOnFrom); } } #endregion private void OnDisable() { m_ContianerFixedTip0.gameObject.SetActive(false); for (int i = 0; i < m_ContianerFixedTips.Count; i++) { m_ContianerFixedTips[i].gameObject.SetActive(false); } DisableServerTip(); StopAllCoroutines(); } private Vector3 gmTo = new Vector3(442, 0, 0); private Vector3 gmFrom = new Vector3(892, 0, 0); private bool hasOnFrom = true; public void OnGMOpen() { RectTransform rt = gmPanel.transform as RectTransform; Vector3 pos = new Vector3(hasOnFrom ? -rt.sizeDelta.x / 2 : rt.sizeDelta.x / 2, 0, 0); rt.DOLocalMove(pos, 1.0f); hasOnFrom = !hasOnFrom; gmClose.gameObject.SetActive(!hasOnFrom); } protected override void LateUpdate() { #if UNITY_EDITOR if (Input.GetKeyDown(KeyCode.F3)) { OnGMOpen(); } #endif } protected override void BindController() { } protected override void AddListeners() { m_ContianerFixedTip0.OnWaitCompelete(OnHideFixedTip); for (int i = 0; i < m_ContianerFixedTips.Count; i++) { m_ContianerFixedTips[i].OnWaitCompelete(OnHideFixedTip); m_FixedTipDisplays.Add(false); } gmCtrl.OnRefreshCell += OnRefreshGmCell; gmCtrl.lockType = EnhanceLockType.LockVerticalBottom; gmClose.onClick.AddListener(OnGMClose); } protected override void OnPreOpen() { #if UNITY_EDITOR gmPanel.SetActive(VersionConfig.Get().debugVersion); #else gmPanel.SetActive(false); #endif serverTipPrepared = true; } protected override void OnAfterOpen() { } protected override void OnPreClose() { } protected override void OnAfterClose() { _inst = null; } } }