//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Wednesday, February 20, 2019 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { [XLua.Hotfix] public class TreasureSkillWin : Window { [SerializeField] ScrollerController m_Controller; [SerializeField] SkillWidget m_SkillNow; [SerializeField] Button m_SkillExpertBtn; [SerializeField] SkillExpertWidget m_SkillExpert; [SerializeField] RedpointBehaviour m_SelectRedpoint; [SerializeField] SkillExpertBehaviour[] m_SkillExpertBehaviours; [SerializeField] FunctionUnlockFlyObjectTarget m_FlyTarget; [SerializeField] Image m_DragSkillIcon; [SerializeField] float m_DisappearTime = 1f; FunctionUnlockFlyObject flyObject; public static int autoSelectSkill = 0; int functionGuideId = 0; float functionGuideTime = 0f; List displaySkills = new List(); TreasureSkillModel model { get { return ModelCenter.Instance.GetModel(); } } PackModel packModel { get { return ModelCenter.Instance.GetModel(); } } SkillModel skillModel { get { return ModelCenter.Instance.GetModel(); } } ReikiRootModel reikiRootModel { get { return ModelCenter.Instance.GetModel(); } } TreasureModel treasureModel { get { return ModelCenter.Instance.GetModel(); } } #region Built-in protected override void BindController() { } protected override void AddListeners() { m_Controller.OnRefreshCell += OnRefreshCell; m_SkillExpertBtn.AddListener(OpenExpert); } protected override void OnPreOpen() { SetDefaultSelect(); model.selectActivePriority = false; functionGuideId = 0; m_DragSkillIcon.gameObject.SetActive(false); if (flyObject != null) { GameObject.Destroy(flyObject.gameObject); flyObject = null; } Display(); model.treasureSkillRefresh += TreasureSkillRefresh; model.selectRefresh += SelectRefresh; model.skillLevelUpRefresh += SkillLevelUpRefresh; packModel.refreshItemCountEvent += RefreshItemCountEvent; model.expertSkillRefresh += ExpertSkillRefresh; WindowCenter.Instance.windowAfterCloseEvent += WindowAfterCloseEvent; } protected override void OnActived() { base.OnActived(); var index = displaySkills.IndexOf(model.selectSkill); if (index != -1) { var offset = 0f; m_Controller.JumpIndex(index, ref offset); var rect = m_Controller.mScrollRect.transform as RectTransform; m_Controller.JumpIndex(offset - rect.rect.height / 2 + 50, 0, EnhancedUI.EnhancedScroller.EnhancedScroller.TweenType.immediate); } } protected override void OnAfterOpen() { TreasureSkill treasureSkill; if (model.TryGetSkill(model.selectSkill, out treasureSkill)) { if (treasureSkill.expertSelectRedpoint.state == RedPointState.Simple) { PlaySelectGuide(true); } } } protected override void OnPreClose() { model.treasureSkillRefresh -= TreasureSkillRefresh; model.selectRefresh -= SelectRefresh; model.skillLevelUpRefresh -= SkillLevelUpRefresh; packModel.refreshItemCountEvent -= RefreshItemCountEvent; model.expertSkillRefresh -= ExpertSkillRefresh; WindowCenter.Instance.windowAfterCloseEvent -= WindowAfterCloseEvent; if (flyObject != null) { GameObject.Destroy(flyObject.gameObject); flyObject = null; } if (autoSelectSkill != 0) { var pak = new CA516_tagCMSelectSkillElement(); pak.SkillTypeID = (uint)autoSelectSkill; pak.DoType = 1; GameNetSystem.Instance.SendInfo(pak); } if(NewBieCenter.Instance.inGuiding&& NewBieCenter.Instance.currentGuide == 62) { NewBieCenter.Instance.FinishNewBieGuide(62); } } protected override void OnAfterClose() { } #endregion void SetDefaultSelect() { displaySkills.Clear(); var _skill = 0; List list; if (model.TryGetSkills(out list)) { displaySkills.AddRange(list); var index = displaySkills.FindIndex((x) => { var treasureId = treasureModel.GetTreasureBySkillId(x); var treasureConfig = TreasureConfig.Get(treasureId); return treasureConfig.Category == (int)TreasureCategory.Fairy; }); if (index != -1) { var skillId = displaySkills[index]; TreasureSkill treasureSkill; var isActive = model.TryGetSkill(skillId, out treasureSkill) && treasureSkill.level > 0; displaySkills.RemoveAt(index); if (isActive) { displaySkills.Insert(0, skillId); } else { displaySkills.Add(skillId); } } foreach (var skillId in displaySkills) { TreasureSkill skill; if (model.TryGetSkill(skillId, out skill)) { if (_skill == 0 && skill.level > 0) { _skill = skillId; } if (skill.redpoint.state == RedPointState.Simple) { _skill = skillId; } if (model.selectActivePriority && skill.expertRedpoint.state == RedPointState.Simple) { _skill = skillId; break; } } } if (_skill == 0) { _skill = list[0]; } } model.selectSkill = _skill; } private void Display() { DisplaySkills(); DisplaySkillDetial(); DisplayExpertSkill(); TryStartGuide(); } private void DisplaySkills() { m_Controller.Refresh(); for (int i = 0; i < displaySkills.Count; i++) { m_Controller.AddCell(ScrollerDataType.Header, displaySkills[i]); } m_Controller.Restart(); } void DisplaySkillDetial() { TreasureSkill skill; if (model.TryGetSkill(model.selectSkill, out skill)) { m_SelectRedpoint.redpointId = skill.expertSelectRedpoint.id; var config = skill.GetSkillConfig(skill.level); if (config == null) { return; } m_SkillNow.Display(skill.skillId, skill.level); } } void DisplayExpertSkill() { var skillId = 0; var level = 0; if (model.TryGetExpertSkill(model.selectSkill, out skillId)) { TreasurePotential potential; if (model.TryGetPotential(skillId, out potential)) { level = potential.level; } } m_SkillExpert.Display(skillId, level); DisplayExpertSkills(); } void DisplayExpertSkills() { TreasureSkill skill; if (model.TryGetSkill(model.selectSkill, out skill)) { for (int i = 0; i < m_SkillExpertBehaviours.Length; i++) { var potential = skill.potentials[i]; var level = 0; model.TryGetExpertActiveLevel(potential.id, out level); m_SkillExpertBehaviours[i].Display(potential.id, level); } } } private void ExpertSelect() { ExpertSkillSelectWin.skillId = model.selectSkill; WindowCenter.Instance.Open(); } private void OnRefreshCell(ScrollerDataType type, CellView cell) { var skillCell = cell as TreasureSkillCell; skillCell.Display(cell.index); } private void WindowAfterCloseEvent(Window win) { if (win is ExpertSkillSelectWin) { TryAutoUse(); TryStartGuide(); } } private void TreasureSkillRefresh(int skillId) { m_Controller.m_Scorller.RefreshActiveCellViews(); if (skillId == model.selectSkill) { DisplaySkillDetial(); } } private void SelectRefresh() { m_Controller.m_Scorller.RefreshActiveCellViews(); DisplaySkillDetial(); DisplayExpertSkill(); TryStartGuide(); TreasureSkill treasureSkill; if (model.TryGetSkill(model.selectSkill, out treasureSkill)) { if (treasureSkill.expertSelectRedpoint.state == RedPointState.Simple) { PlaySelectGuide(true); } } } private void SkillLevelUpRefresh(int id) { if (model.selectSkill == id) { m_Controller.m_Scorller.RefreshActiveCellViews(); DisplaySkillDetial(); } } private void ExpertSkillRefresh() { DisplayExpertSkill(); m_Controller.m_Scorller.RefreshActiveCellViews(); TryStartGuide(); } private void RefreshItemCountEvent(PackType packType, int arg2, int itemId) { if (packType == PackType.Item && model.skillLevelUpItems.Contains(itemId)) { DisplaySkillDetial(); } } void TrySwitchExpertSkill() { var des = RectTransformUtility.CalculateRelativeRectTransformBounds(this.transform, m_SkillExpert.dragAccepter); var src = RectTransformUtility.CalculateRelativeRectTransformBounds(this.transform, m_DragSkillIcon.rectTransform); var dis = Vector3.Distance(des.center, src.center); if (dis < m_SkillExpert.dragAccepter.rect.width / 2) { var skillId = 0; if (model.TryGetExpertSkill(model.selectSkill, out skillId) && skillId == skillModel.skillDragId) { return; } var pak = new CA516_tagCMSelectSkillElement(); pak.SkillTypeID = (uint)skillModel.skillDragId; pak.DoType = 1; GameNetSystem.Instance.SendInfo(pak); } } void TryAutoUse() { var skill = 0; if (model.GetTotalExpertSkillLevel() == 1 && !model.TryGetExpertSkill(model.selectSkill, out skill) && model.ExistAnyActiveExpert(model.selectSkill, out skill) && PlayerDatas.Instance.baseData.LV < reikiRootModel.resetReikiLimitLevel) { if (flyObject != null) { GameObject.Destroy(flyObject.gameObject); flyObject = null; } RectTransform parent = null; for (int i = 0; i < m_SkillExpertBehaviours.Length; i++) { if (m_SkillExpertBehaviours[i].skillId == skill) { parent = m_SkillExpertBehaviours[i].flyContainer; } } m_FlyTarget.IdList = new int[1] { skill }; FunctionUnlockFlyObjectTargetCenter.Register(FunctionUnlockType.Skill, new int[] { skill }, m_FlyTarget); var instance = UIUtility.CreateWidget("SkillUnlockFlyObject", "SkillUnlockFlyObject"); instance.transform.SetParentEx(parent, Vector3.zero, Quaternion.identity, Vector3.one); flyObject = instance.GetComponent(); flyObject.SetContent(FunctionUnlockType.Skill, skill); autoSelectSkill = skill; flyObject.Begin(() => { var pak = new CA516_tagCMSelectSkillElement(); pak.SkillTypeID = (uint)skill; pak.DoType = 1; GameNetSystem.Instance.SendInfo(pak); autoSelectSkill = 0; }); } } void TryStartGuide() { if (NewBieCenter.Instance.inGuiding) { return; } if (!NewBieCenter.Instance.IsGuideCompleted(62)) { var treasureModel = ModelCenter.Instance.GetModel(); var treasureId = treasureModel.GetTreasureBySkillId(model.selectSkill); if (treasureId == 102) { var skill = 0; if (model.ExistAnyActiveExpert(model.selectSkill) && !WindowCenter.Instance.IsOpen() && !model.TryGetExpertSkill(model.selectSkill, out skill)) { NewBieCenter.Instance.StartNewBieGuide(62); } } } } private void OpenExpert() { var skillId = 0; if (model.TryGetExpertSkill(model.selectSkill, out skillId)) { ExpertSkillSelectWin.skillId = skillId; WindowCenter.Instance.Open(); } else { var expertSkill = 0; if (model.ExistAnyActiveExpert(model.selectSkill, out expertSkill)) { PlaySelectGuide(); } else { SysNotifyMgr.Instance.ShowTip("NoneOfAnyActiveExpert"); } } } private void PlaySelectGuide(bool disappear = false) { if (NewBieCenter.Instance.inGuiding) { return; } List indexs = new List(); TreasureSkill treasureSkill; if (model.TryGetSkill(model.selectSkill, out treasureSkill)) { for (int i = 0; i < treasureSkill.potentials.Count; i++) { var level = 0; if (model.TryGetExpertActiveLevel(treasureSkill.potentials[i].id, out level) && level > 0) { indexs.Add(i); } } } if (indexs.Count == 0) { return; } var index = indexs[UnityEngine.Random.Range(0, indexs.Count)]; functionGuideTime = Time.time; switch (index) { case 0: if (disappear) { functionGuideId = 65; } NewBieCenter.Instance.StartNewBieGuide(65); break; case 1: if (disappear) { functionGuideId = 63; } NewBieCenter.Instance.StartNewBieGuide(63); break; case 2: if (disappear) { functionGuideId = 64; } NewBieCenter.Instance.StartNewBieGuide(64); break; } } protected override void LateUpdate() { base.LateUpdate(); if (skillModel.skillDraging) { if (!m_DragSkillIcon.gameObject.activeSelf) { m_DragSkillIcon.gameObject.SetActive(true); var config = SkillConfig.Get(skillModel.skillDragId); if (config != null) { m_DragSkillIcon.SetSprite(config.IconName); } } Vector2 _pos; if (RectTransformUtility.ScreenPointToLocalPointInRectangle(this.transform as RectTransform, Input.mousePosition, CameraManager.uiCamera, out _pos)) { m_DragSkillIcon.rectTransform.localPosition = _pos; } if (Input.GetMouseButtonUp(0)) { skillModel.skillDraging = false; TrySwitchExpertSkill(); m_DragSkillIcon.gameObject.SetActive(false); } } if (functionGuideId != 0) { if (Time.time - functionGuideTime >= m_DisappearTime) { NewBieCenter.Instance.FinishNewBieGuide(functionGuideId); functionGuideId = 0; } } } [Serializable] public class SkillWidget { [SerializeField] Transform m_Container; [SerializeField] Text m_SkillLevel; [SerializeField] Text m_SkillCoolDown; [SerializeField] Text m_SkillDesc; TreasureSkillModel model { get { return ModelCenter.Instance.GetModel(); } } public void Display(int skillId, int level) { m_SkillLevel.text = Language.Get("SkillActLevel", level); TreasureSkill skill; model.TryGetSkill(skillId, out skill); var skillConfig = skill.GetSkillConfig(level); m_SkillCoolDown.text = skillConfig.CoolDownTime == 0 ? string.Empty : Language.Get("L1065", skillConfig.CoolDownTime / 1000); m_SkillDesc.text = skillConfig.Description; } public void SetActive(bool active) { m_Container.gameObject.SetActive(active); } } [Serializable] public class SkillExpertWidget { [SerializeField] RectTransform m_DragAccepter; [SerializeField] Image m_SkillIcon; [SerializeField] Text m_SkillName; [SerializeField] Transform m_ContainerReikiIcon; [SerializeField] Image[] m_ReikiIcons; [SerializeField] Text m_UnSelectRemind; [SerializeField] Text m_Description; public RectTransform dragAccepter { get { return m_DragAccepter; } } TreasureSkillModel model { get { return ModelCenter.Instance.GetModel(); } } public void Display(int skillId, int level) { m_SkillIcon.gameObject.SetActive(skillId != 0); m_SkillName.gameObject.SetActive(skillId != 0); m_UnSelectRemind.gameObject.SetActive(skillId == 0); m_Description.gameObject.SetActive(false); m_ContainerReikiIcon.gameObject.SetActive(skillId != 0); if (skillId != 0) { SkillConfig skillConfig; if (level == 0) { skillConfig = SkillConfig.Get(skillId); } else { skillConfig = SkillConfig.Get(skillId + level - 1); } m_SkillIcon.SetSprite(skillConfig.IconName); m_SkillName.text = skillConfig.SkillName; var property = skillConfig.RequireProperty(); var propertyConfig = PlayerPropertyConfig.Get(property); m_ReikiIcons[0].gameObject.SetActive(property == (int)PropertyType.Mater); m_ReikiIcons[1].gameObject.SetActive(property == (int)PropertyType.Wood); m_ReikiIcons[2].gameObject.SetActive(property == (int)PropertyType.Water); m_ReikiIcons[3].gameObject.SetActive(property == (int)PropertyType.Fire); m_ReikiIcons[4].gameObject.SetActive(property == (int)PropertyType.Earth); if (level == 0) { var conditionLabel = string.Format("({0}{1}激活)", propertyConfig.Name, skillConfig.RequirePropertyValue()); conditionLabel = UIHelper.AppendColor(TextColType.Red, conditionLabel, true); m_Description.text = StringUtility.Contact(skillConfig.Description, conditionLabel); m_Description.color = UIHelper.s_BrightWhiteColor; } else { m_Description.text = skillConfig.Description; m_Description.color = UIHelper.s_NavyBrown; } } } } } }