//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Friday, November 10, 2017 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TableConfig; namespace Snxxz.UI { public class TeamPrepareWin : Window { [SerializeField] Text m_DungeonName; [SerializeField] TeamPrepareBehaviour[] m_PrepareBehaviours; [SerializeField] Slider m_TimeSlider; [SerializeField] Text m_SurplusTime; [SerializeField] Button m_Reject; [SerializeField] ImageEx m_RejectIcon; [SerializeField] Button m_Prepare; [SerializeField] ImageEx m_PrepareIcon; [SerializeField] Button m_CaptainerCancel; float prepareTotalTime = 30f; float timer = 0f; bool alreadyAutoPrepare = false; bool rejectManual = false; TeamModel model { get { return ModelCenter.Instance.GetModel(); } } #region Built-in protected override void BindController() { } protected override void AddListeners() { m_Reject.AddListener(Reject); m_Prepare.AddListener(Prepare); m_CaptainerCancel.AddListener(CaptainerCancel); } protected override void OnPreOpen() { rejectManual = false; if (!model.myTeam.iamCaptainer) { model.RecordHeroAI(); } PlayerDatas.Instance.hero.Behaviour.StopHandupAI(); MapTransferUtility.Instance.Clear(); PlayerDatas.Instance.hero.StopPathFind(); alreadyAutoPrepare = false; var dungeonModel = ModelCenter.Instance.GetModel(); var dungeonId = dungeonModel.DungeonMap(model.teamPrepare.mapId, model.teamPrepare.mapEx); var dungeonConfig = ConfigManager.Instance.GetTemplate(dungeonId); m_DungeonName.text = dungeonConfig.FBName; m_Reject.gameObject.SetActive(!model.myTeam.iamCaptainer); m_Prepare.gameObject.SetActive(!model.myTeam.iamCaptainer); m_CaptainerCancel.gameObject.SetActive(model.myTeam.iamCaptainer); ShowPrepareStates(); if (model.myTeam.autoPrepare.auto) { Prepare(); } } protected override void OnAfterOpen() { model.memberPrepareStateChangeEvent += ShowPrepareStates; } protected override void OnPreClose() { if (rejectManual || model.teamPrepare.isError || model.teamPrepare.IsReject()) { if (model.autoHandupRecord) { if (PlayerDatas.Instance.hero != null) { PlayerDatas.Instance.hero.Behaviour.StartHandupAI(); } } if (model.moveToNPCRecord != 0) { MapTransferUtility.Instance.MoveToNPC(model.moveToNPCRecord); } } model.ClearHeroAIRecord(); model.memberPrepareStateChangeEvent -= ShowPrepareStates; } protected override void OnAfterClose() { } #endregion private void ShowPrepareStates() { for (int i = 0; i < m_PrepareBehaviours.Length; i++) { var behaviour = m_PrepareBehaviours[i]; Teammate teammate; if (model.myTeam.TryGetMember(i, out teammate) && model.teamPrepare.playerStates.ContainsKey(teammate.id)) { behaviour.Display(model.teamPrepare.GetPlayerPrepareSate(teammate.id) == TeammatePrepareState.Prepared, teammate); } else { behaviour.DisplayEmpty(); } } var myPlayerId = PlayerDatas.Instance.baseData.PlayerID; var prepareState = model.teamPrepare.GetPlayerPrepareSate((int)myPlayerId); m_PrepareIcon.gray = m_RejectIcon.gray = prepareState == TeammatePrepareState.Prepared; } private void Reject() { var myPlayerId = PlayerDatas.Instance.baseData.PlayerID; var prepareState = model.teamPrepare.GetPlayerPrepareSate((int)myPlayerId); if (prepareState == TeammatePrepareState.UnPrepared) { rejectManual = true; model.RequestPrepareEnterDungeon(false); WindowCenter.Instance.Close(); } } private void Prepare() { var myPlayerId = PlayerDatas.Instance.baseData.PlayerID; var prepareState = model.teamPrepare.GetPlayerPrepareSate((int)myPlayerId); if (prepareState == TeammatePrepareState.UnPrepared) { model.RequestPrepareEnterDungeon(true); } } private void CaptainerCancel() { if (model.myTeam.iamCaptainer) { rejectManual = true; model.RequestPrepareEnterDungeon(false); WindowCenter.Instance.Close(); } } protected override void LateUpdate() { base.LateUpdate(); var endTime = model.prepareBeginTime + new TimeSpan(GeneralConfig.Instance.teamReadyTime * TimeSpan.TicksPerSecond); timer += Time.deltaTime; if (timer > 1f) { timer = 0f; var surplusSecond = Mathf.Clamp((float)(endTime - DateTime.Now).TotalSeconds, 0f, float.MaxValue); m_SurplusTime.text = StringUtility.Contact((int)surplusSecond, Language.Get("RealmWin_Bewrite_35")); } m_TimeSlider.value = (float)(DateTime.Now - model.prepareBeginTime).TotalSeconds / GeneralConfig.Instance.teamReadyTime; if (DateTime.Now > endTime && !alreadyAutoPrepare) { alreadyAutoPrepare = true; Reject(); } } } }