//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Monday, October 16, 2017 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TableConfig; namespace Snxxz.UI { public class MyTeamWin : Window { [SerializeField] Button m_Close; [Header("Middle"), SerializeField] Transform m_ContainerMates; [SerializeField] Transform m_ContainerEmpty; [SerializeField] Transform m_CaptainerSign; [SerializeField] MyTeammateBehaviour[] m_TeammateBehaviours; [Header("Bottom"), SerializeField] Transform m_ContainerTeamExperience; [SerializeField] Transform m_ContainerAutoInvitation; [SerializeField] TeammateNearByBehaviour[] m_TeamateSigns; [SerializeField] Text m_ExperienceAddition; [SerializeField] Button m_CreateTeam; [SerializeField] Button m_AutoFind; [SerializeField] Text m_MatchState; [SerializeField] TimerBehaviour m_MatchingCoolDown; [SerializeField] Button m_ChallengeDungeon; [SerializeField] RectTransform m_AutoPrepareContainer; [SerializeField] Button m_AutoPrepareSetting; [SerializeField] Button m_CancelAutoPrepare; [SerializeField] Toggle m_AutoAcceptInvitation; [Header("Left"), SerializeField] Text m_Mission; [SerializeField] RectTransform m_ContainerTeamLevel; [SerializeField] Image m_LevelMinSign; [SerializeField] Text m_LevelMin; [SerializeField] Image m_LevelMaxSign; [SerializeField] Text m_LevelMax; [SerializeField] Button m_ChangeMission; [SerializeField] GrayGroup m_ChangeMissionGray; [SerializeField] TextEx m_ChangeMissionText; [SerializeField] Button m_ApplicationList; [SerializeField] ImageEx m_ApplicationIcon; [SerializeField] TextEx m_ApplicationText; [SerializeField] ButtonEx m_WorldInviteInTeam; [SerializeField] Button m_WorldInviteNoTeam; [SerializeField] Button m_Invite; [SerializeField] RectTransform m_InviteSelectedSign; [SerializeField] TeamInviteEntrancePanel m_TeamInviteEntrancePanel; TeamModel model { get { return ModelCenter.Instance.GetModel(); } } DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } #region Built-in protected override void BindController() { } protected override void AddListeners() { m_Close.AddListener(CloseClick); m_CreateTeam.AddListener(CreateTeam); m_ChallengeDungeon.AddListener(GroupChallengeDungeon); m_AutoFind.AddListener(AutoFind); m_ApplicationList.AddListener(ViewApplicationList); m_WorldInviteInTeam.AddListener(WorldInvite); m_Invite.AddListener(ShowInviteButtons); m_ChangeMission.AddListener(ChangeMission); m_AutoAcceptInvitation.AddListener(OnAutoAcceptInvitationValueChange); m_AutoPrepareSetting.AddListener(SetAutoPrepare); ; m_CancelAutoPrepare.AddListener(CancelAutoPrepare); } protected override void OnPreOpen() { m_AutoAcceptInvitation.isOn = model.autoAcceptInvitation; m_TeamInviteEntrancePanel.gameObject.SetActive(false); m_InviteSelectedSign.gameObject.SetActive(false); UpdateAutoPrepareButton(); UpdateAutoMatchingButton(); UpdateTeammateInfo(); UpdateInteractElementState(); UpdateExperienceAddition(); UpdateMission(); UpdateLevelLimit(); model.myTeamRefreshEvent += UpdateTeammateInfo; model.myTeamRefreshEvent += UpdateMission; model.myTeamRefreshEvent += UpdateLevelLimit; model.myTeamRefreshEvent += UpdateInteractElementState; model.myTeamRefreshEvent += UpdateExperienceAddition; model.teammateChangeMapEvent += UpdateExperienceAddition; model.teammateChangeMapEvent += UpdateMission; model.missionLevelLimitChangeEvent += UpdateMission; model.missionLevelLimitChangeEvent += UpdateLevelLimit; model.missionLevelLimitChangeEvent += UpdateAutoPrepareButton; model.matchingStateChangeEvent += OnMatchStateChange; m_TeamInviteEntrancePanel.activeOrDeActiveEvent += OnInvitePanelActiveOrDeActive; model.myTeam.autoPrepare.autoPrepareChangeEvent += UpdateAutoPrepareButton; } protected override void OnAfterOpen() { } protected override void OnPreClose() { for (int i = 0; i < m_TeammateBehaviours.Length; i++) { var behaviour = m_TeammateBehaviours[i]; behaviour.Dispose(); } model.myTeamRefreshEvent -= UpdateTeammateInfo; model.myTeamRefreshEvent -= UpdateMission; model.myTeamRefreshEvent -= UpdateLevelLimit; model.myTeamRefreshEvent -= UpdateInteractElementState; model.myTeamRefreshEvent -= UpdateExperienceAddition; model.teammateChangeMapEvent -= UpdateExperienceAddition; model.teammateChangeMapEvent -= UpdateMission; model.missionLevelLimitChangeEvent -= UpdateMission; model.missionLevelLimitChangeEvent -= UpdateLevelLimit; model.missionLevelLimitChangeEvent -= UpdateAutoPrepareButton; model.matchingStateChangeEvent -= OnMatchStateChange; m_TeamInviteEntrancePanel.activeOrDeActiveEvent -= OnInvitePanelActiveOrDeActive; model.myTeam.autoPrepare.autoPrepareChangeEvent -= UpdateAutoPrepareButton; } protected override void OnAfterClose() { } public override void CloseClick() { WindowCenter.Instance.Close(); } #endregion private void CreateTeam() { model.RequestCreateTeam(model.missionBuf.mapId, model.missionBuf.mapEx, model.levelMinBuf, model.levelMaxBuf); } private void GroupChallengeDungeon() { if (model.myTeam.iamCaptainer) { if (model.myTeam.iamCaptainer) { model.RecordHeroAI(); } GroupDungeonChallengeProcessor.Instance.GroupChallengeDungeon(model.myTeam.mission.mapId, model.myTeam.mission.mapEx, false); } else { SysNotifyMgr.Instance.ShowTip("DungeonGroupOnlyTeamLeader"); } } private void AutoFind() { if (model.isMatching) { model.RequestCancelAutoMatchTeam(); } else { var mission = model.myTeam.inTeam ? model.myTeam.mission : model.missionBuf; if (mission.mapId == TeamModel.NONE_MISSION) { SysNotifyMgr.Instance.ShowTip("AutoMatchingNoTarget"); } else if (model.myTeam.memberCount >= 4) { SysNotifyMgr.Instance.ShowTip("AutoMatchingCannotJoinTeam"); } else { model.RequestAutoMatchTeam(true); } } } private void SetAutoPrepare() { WindowCenter.Instance.Open(); } private void CancelAutoPrepare() { model.myTeam.autoPrepare.CancelAutoPrepare(); } private void OnAutoAcceptInvitationValueChange(bool _value) { model.autoAcceptInvitation = _value; } private void ViewApplicationList() { if (model.myTeam.iamCaptainer) { WindowCenter.Instance.Open(); } } private void WorldInvite() { if (model.myTeam.iamCaptainer) { model.RequestWorldInvite(); } } private void ChangeMission() { if (!model.myTeam.inTeam || model.myTeam.iamCaptainer) { if (model.isMatching) { SysNotifyMgr.Instance.ShowTip("AutoMatchingCannotChangeTarget"); } else { WindowCenter.Instance.Open(); } } } private void ShowInviteButtons() { m_TeamInviteEntrancePanel.gameObject.SetActive(true); } private void UpdateTeammateInfo() { m_CaptainerSign.gameObject.SetActive(model.myTeam.inTeam); m_ContainerEmpty.gameObject.SetActive(!model.myTeam.inTeam && !model.isMatching); UpdateAutoMatchingButton(); var gray = model.myTeam.inTeam && !model.myTeam.iamCaptainer; m_ChangeMissionGray.gray = gray; m_ChangeMissionText.colorType = gray ? TextColType.White : TextColType.NavyBrown; for (int i = 0; i < m_TeammateBehaviours.Length; i++) { var behaviour = m_TeammateBehaviours[i]; behaviour.Display(); } } private void UpdateInteractElementState() { UpdateCreateTeamButton(); UpdateDungeonChallengeButton(); UpdateAutoPrepareButton(); var able = model.myTeam.iamCaptainer; m_ApplicationIcon.gray = !able; m_ApplicationText.colorType = able ? TextColType.NavyBrown : TextColType.White; m_WorldInviteInTeam.gameObject.SetActive(able); m_WorldInviteNoTeam.gameObject.SetActive(!able); } private void UpdateExperienceAddition() { m_ContainerAutoInvitation.gameObject.SetActive(!model.myTeam.inTeam && !model.isMatching); m_ContainerTeamExperience.gameObject.SetActive(model.myTeam.inTeam || model.isMatching); var nearByCount = model.myTeam.nearByCount; for (int i = 0; i < m_TeamateSigns.Length; i++) { var sign = m_TeamateSigns[i]; Teammate mate; if (model.myTeam.TryGetMember(i, out mate)) { var isNearBy = mate.mapId == PlayerDatas.Instance.baseData.MapID; sign.Display(isNearBy ? TeammateNearByBehaviour.LocationState.NearBy : TeammateNearByBehaviour.LocationState.FarAway); } else { sign.Display(TeammateNearByBehaviour.LocationState.None); } } var experienceAddition = 10 * model.myTeam.nearByCount; m_ExperienceAddition.text = StringUtility.Contact(experienceAddition, "%"); m_ExperienceAddition.color = UIHelper.GetUIColor(experienceAddition > 0 ? TextColType.Green : TextColType.NavyBrown, true); } private void UpdateExperienceAddition(int _playerId) { UpdateExperienceAddition(); } private void UpdateMission(int _playerId) { UpdateMission(); } private void UpdateMission() { TeamMission mission; if (model.myTeam.inTeam) { mission = model.myTeam.mission; } else { mission = model.missionBuf; } if (mission.mapId == TeamModel.NONE_MISSION) { m_Mission.text = Language.Get("No_Target"); } else { var targetConfig = Config.Instance.Get(mission.mapId); if (targetConfig != null) { var dungeonId = dungeonModel.GetDungeonId(mission.mapId, mission.mapEx); var config = Config.Instance.Get(dungeonId); m_Mission.text = config.FBName; } else { var mapId = 0; if (model.myTeam.inTeam) { Teammate teamLeader; model.myTeam.TryGetMember(0, out teamLeader); mapId = teamLeader != null ? teamLeader.mapId : PlayerDatas.Instance.baseData.MapID; } else { mapId = PlayerDatas.Instance.baseData.MapID; } var config = Config.Instance.Get(mapId); m_Mission.text = config != null ? config.Name : ""; } } UpdateDungeonChallengeButton(); } private void UpdateLevelLimit() { TeamMission mission; if (model.myTeam.inTeam) { mission = model.myTeam.mission; } else { mission = model.missionBuf; } var minLevel = model.myTeam.inTeam ? model.myTeam.levelMin : model.levelMinBuf; var maxLevel = model.myTeam.inTeam ? model.myTeam.levelMax : model.levelMaxBuf; var isMinPickLevel = minLevel >= GeneralConfig.Instance.greatMasterStartLV; m_LevelMinSign.gameObject.SetActive(isMinPickLevel); m_LevelMin.text = (isMinPickLevel ? (minLevel - GeneralConfig.Instance.greatMasterStartLV) : minLevel).ToString(); var isMaxPickLevel = maxLevel >= GeneralConfig.Instance.greatMasterStartLV; m_LevelMaxSign.gameObject.SetActive(isMaxPickLevel); m_LevelMax.text = (isMaxPickLevel ? (maxLevel - GeneralConfig.Instance.greatMasterStartLV) : maxLevel).ToString(); } private void UpdateDungeonChallengeButton() { if (model.myTeam.inTeam) { var dungeonId = dungeonModel.GetDungeonId(model.myTeam.mission.mapId, model.myTeam.mission.mapEx); if (dungeonId == 0) { m_ChallengeDungeon.gameObject.SetActive(false); } else { var dungeonConfig = Config.Instance.Get(dungeonId); var mapConfig = Config.Instance.Get(dungeonConfig.MapID); m_ChallengeDungeon.gameObject.SetActive(mapConfig != null && (MapType)mapConfig.MapFBType == MapType.MultipleFB); } } else { m_ChallengeDungeon.gameObject.SetActive(false); } } private void UpdateAutoMatchingButton() { m_AutoFind.gameObject.SetActive(!model.myTeam.inTeam || model.myTeam.iamCaptainer); m_MatchState.text = model.isMatching ? Language.Get("StopMatching") : Language.Get("TeamListAutoMatching"); if (model.isMatching) { m_MatchingCoolDown.Begin(model.matchingEndTime); } else { m_MatchingCoolDown.Stop(); } } private void UpdateCreateTeamButton() { m_CreateTeam.gameObject.SetActive(!model.myTeam.inTeam); } private void UpdateAutoPrepareButton() { var multipleFB = false; var dungeonId = dungeonModel.GetDungeonId(model.myTeam.mission.mapId, model.myTeam.mission.mapEx); if (dungeonId != 0) { var dungeonConfig = Config.Instance.Get(dungeonId); var mapConfig = Config.Instance.Get(dungeonConfig.MapID); multipleFB = mapConfig != null && (MapType)mapConfig.MapFBType == MapType.MultipleFB; } else { multipleFB = false; } var showAutoPrepare = model.myTeam.inTeam && !model.myTeam.iamCaptainer && multipleFB; if (showAutoPrepare) { m_AutoPrepareSetting.gameObject.SetActive(!model.myTeam.autoPrepare.auto); m_CancelAutoPrepare.gameObject.SetActive(model.myTeam.autoPrepare.auto); m_AutoPrepareContainer.gameObject.SetActive(true); } else { m_AutoPrepareContainer.gameObject.SetActive(false); } } private void OnMatchStateChange() { UpdateTeammateInfo(); UpdateExperienceAddition(); if (model.isMatching) { SysNotifyMgr.Instance.ShowTip("BeginAutoMatching"); } } private void OnInvitePanelActiveOrDeActive(bool _active) { m_InviteSelectedSign.gameObject.SetActive(_active); } } }