using System.Collections; using System.Collections.Generic; using UnityEngine; namespace vnxbqy.UI { public class MainWinSkillController : Singleton { const int SKILL_COUNT_MAX = 8; public bool enable { get; set; } public readonly LogicStruct skillcd0 = new LogicStruct(); public readonly LogicStruct skillcd1 = new LogicStruct(); public readonly LogicStruct skillcd2 = new LogicStruct(); public readonly LogicStruct skillcd3 = new LogicStruct(); public readonly LogicStruct skillcd4 = new LogicStruct(); public readonly LogicStruct skillcd5 = new LogicStruct(); public readonly LogicStruct skillcd6 = new LogicStruct(); public readonly LogicStruct skillcd7 = new LogicStruct(); public readonly LogicStruct skillcd8 = new LogicStruct(); public readonly LogicBool forbid0 = new LogicBool(); public readonly LogicBool forbid1 = new LogicBool(); public readonly LogicBool forbid2 = new LogicBool(); public readonly LogicBool forbid3 = new LogicBool(); public readonly LogicBool forbid4 = new LogicBool(); public readonly LogicBool forbid5 = new LogicBool(); public readonly LogicBool forbid6 = new LogicBool(); public readonly LogicBool forbid7 = new LogicBool(); public readonly LogicBool forbid8 = new LogicBool(); Dictionary skillPlaceMap = new Dictionary(); Dictionary placeSkillMap = new Dictionary(); SkillModel model { get { return ModelCenter.Instance.GetModel(); } } public MainWinSkillController() { PlayerSkillDatas.OnRefreshSkill += OnSkillRefresh; Skill.RefreshCD += OnSkillCDRefresh; GA_Hero.OnStateEnter += OnSkillStateEnter; GA_Hero.OnStateEnd += OnSkillStateEnd; StatusMgr.OnGainCantCastSkillStatus += OnGainCantCastSkillStatus; StatusMgr.OnReleaseCantCastSkillStatus += OnReleaseCantCastSkillStatus; } public void InitSkill() { skillPlaceMap.Clear(); placeSkillMap.Clear(); if(PlayerDatas.Instance.skill == null) return; for (int i = 0; i < SKILL_COUNT_MAX; i++) { var skillData = PlayerDatas.Instance.skill.GetQuickSkillByPos(i); placeSkillMap[i + 1] = skillData != null ? skillData.id : 0; if (skillData != null) { skillPlaceMap[skillData.id] = i + 1; } } var blinkSkill = PlayerDatas.Instance.skill.GetSKillById(190); placeSkillMap[0] = blinkSkill != null ? blinkSkill.id : 0; if (blinkSkill != null) { skillPlaceMap[blinkSkill.id] = 0; } //var skillXpId = model.GetXpSkillID(); //var skillXpData = PlayerDatas.Instance.skill.GetSKillById(skillXpId); //placeSkillMap[8] = skillXpData != null ? skillXpData.id : 0; //if (skillXpData != null) //{ // skillPlaceMap[skillXpId] = 8; //} if (PlayerDatas.Instance.hero != null) { foreach (var skillId in skillPlaceMap.Keys) { if (PlayerDatas.Instance.hero.SkillMgr == null) break; var skill = PlayerDatas.Instance.hero.SkillMgr.Get(skillId); if (skill != null) { UpdateSkillExclusiveCountDown(skillId, skill.cd, skill.skillInfo.config.CoolDownTime * Constants.F_GAMMA); } } } UpdateSkillForbidStates(); } public void Reset() { skillcd0.value = default(SkillCD); skillcd1.value = default(SkillCD); skillcd2.value = default(SkillCD); skillcd3.value = default(SkillCD); skillcd4.value = default(SkillCD); skillcd5.value = default(SkillCD); skillcd6.value = default(SkillCD); skillcd7.value = default(SkillCD); skillcd8.value = default(SkillCD); forbid0.value = false; forbid1.value = false; forbid2.value = false; forbid3.value = false; forbid4.value = false; forbid5.value = false; forbid6.value = false; forbid7.value = false; forbid8.value = false; skillPlaceMap.Clear(); placeSkillMap.Clear(); } public LogicStruct GetSkillCD(int index) { switch (index) { case 0: return skillcd0; case 1: return skillcd1; case 2: return skillcd2; case 3: return skillcd3; case 4: return skillcd4; case 5: return skillcd5; case 6: return skillcd6; case 7: return skillcd7; case 8: return skillcd8; default: return null; } } public LogicBool GetSkillForbid(int index) { switch (index) { case 0: return forbid0; case 1: return forbid1; case 2: return forbid2; case 3: return forbid3; case 4: return forbid4; case 5: return forbid5; case 6: return forbid6; case 7: return forbid7; case 8: return forbid8; default: return null; } } private void OnSkillRefresh() { InitSkill(); } private void OnSkillCDRefresh(int skillId, float cd, float total) { UpdateSkillExclusiveCountDown(skillId, cd, total); } private void OnSkillStateEnter(float time) { UpdateSkillCommonCountDown(time); } private void OnSkillStateEnd() { UpdateSkillCommonCountDown(0); } private void OnGainCantCastSkillStatus(float duration) { UpdateSkillForbidStates(); } private void OnReleaseCantCastSkillStatus() { UpdateSkillForbidStates(); } private void UpdateSkillExclusiveCountDown(int skillId, float cd, float total) { ILSkillManager.Instance.OnSkillCDRefresh(skillId, cd, total); if (skillPlaceMap.ContainsKey(skillId)) { var place = skillPlaceMap[skillId]; var skillcd = GetSkillCD(place); skillcd.value = skillcd.value.SetExclusiveCountDown(cd, total); } } private void UpdateSkillCommonCountDown(float time) { for (int i = 0; i <= 8; i++) { if (placeSkillMap.ContainsKey(i) && placeSkillMap[i] != 0) { var skillcd = GetSkillCD(i); skillcd.value = skillcd.value.SetCommonCountDown(time); } } } private void UpdateSkillForbidStates() { var forbid = !StatusMgr.Instance.CanCastSkill(PlayerDatas.Instance.baseData.PlayerID); for (int i = 0; i <= 8; i++) { if (placeSkillMap.ContainsKey(i)) { int _skillId = placeSkillMap[i]; var _tsModel = ModelCenter.Instance.GetModel(); if (_tsModel.TryGetExpertSkill(_skillId, out _skillId)) { int _level = 0; if (_tsModel.TryGetExpertActiveLevel(_skillId, out _level)) { _skillId += (_level - 1); } var _skillInfo = SkillHelper.Instance.Get(_skillId); SkillHelper.EffectValue _effectValue; if (_skillInfo.effectValue.TryGetValue(4093, out _effectValue)) { if (forbid) { continue; } } } } var skillForbid = GetSkillForbid(i); skillForbid.value = forbid; } } public struct SkillCD { public float exclusiveTotal; public float exclusiveOverTime; public float commonTotal; public float commonOverTime; public SkillCD SetCommonCountDown(float time) { commonTotal = time; commonOverTime = Time.realtimeSinceStartup + time; return this; } public SkillCD SetExclusiveCountDown(float cd, float total) { exclusiveTotal = total; exclusiveOverTime = Time.realtimeSinceStartup + cd; return this; } public bool IsCountDown() { if (exclusiveOverTime > Time.realtimeSinceStartup) { return true; } if (commonOverTime > Time.realtimeSinceStartup) { return true; } return false; } public bool IsExclusiveCountDown() { if (exclusiveOverTime > Time.realtimeSinceStartup) { return true; } return false; } public float GetCountDownFillAmount() { if (exclusiveOverTime > Time.realtimeSinceStartup) { return (exclusiveOverTime - Time.realtimeSinceStartup) / exclusiveTotal; } if (commonOverTime > Time.realtimeSinceStartup) { return (commonOverTime - Time.realtimeSinceStartup) / commonTotal; } return 0f; } public float GetCountDown() { if (exclusiveOverTime > Time.realtimeSinceStartup) { return exclusiveOverTime - Time.realtimeSinceStartup; } return 0f; } } } }