using LitJson; using vnxbqy.UI; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; //参考MainWinSkillController 神通技能管理 public class SkillCD { public float exclusiveTotal; public float exclusiveOverTime; public float commonTotal; public float commonOverTime; public bool dirty; public void SetCommonCountDown(float time) { commonTotal = time; commonOverTime = Time.realtimeSinceStartup + time; dirty = true; } public void SetExclusiveCountDown(float cd, float total) { exclusiveTotal = total; exclusiveOverTime = Time.realtimeSinceStartup + cd; dirty = true; Debug.Log("SkillCD SetExclusiveCountDown"); } public SkillCD Fetch() { dirty = false; 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; } } class ILSkillManager : ILModel { int SKILL_COUNT_MAX = 3; public SkillCD skillcd0 = new SkillCD(); public SkillCD skillcd1 = new SkillCD(); public SkillCD skillcd2 = new SkillCD(); public LogicBool forbid0 = new LogicBool(); public LogicBool forbid1 = new LogicBool(); public LogicBool forbid2 = new LogicBool(); Dictionary skillPlaceMap = new Dictionary(); Dictionary placeSkillMap = new Dictionary(); protected override void Init() { PlayerSkillDatas.OnRefreshSkill += OnSkillRefresh; GA_Hero.OnStateEnter += OnSkillStateEnter; GA_Hero.OnStateEnd += OnSkillStateEnd; StatusMgr.OnGainCantCastSkillStatus += OnGainCantCastSkillStatus; StatusMgr.OnReleaseCantCastSkillStatus += OnReleaseCantCastSkillStatus; GameEvent.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent; } protected override void UnInit() { PlayerSkillDatas.OnRefreshSkill -= OnSkillRefresh; GA_Hero.OnStateEnter -= OnSkillStateEnter; GA_Hero.OnStateEnd -= OnSkillStateEnd; StatusMgr.OnGainCantCastSkillStatus -= OnGainCantCastSkillStatus; StatusMgr.OnReleaseCantCastSkillStatus -= OnReleaseCantCastSkillStatus; GameEvent.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent; } void OnBeforePlayerDataInitializeEvent() { Reset(); } public void InitSkill() { skillPlaceMap.Clear(); placeSkillMap.Clear(); for (int i = 0; i < SKILL_COUNT_MAX; i++) { var skillID = ShentongModel.Instance.shentongSetSkillIDs[i]; placeSkillMap[i] = skillID; if (skillID != 0) { skillPlaceMap[skillID] = i; } } if (PlayerDatas.Instance.hero != null) { var keys = skillPlaceMap.Keys.ToList(); for (int i = 0; i < keys.Count; i++) { var skillId = keys[i]; var skill = PlayerDatas.Instance.hero.SkillMgr.Get(skillId); if (skill != null) { UpdateSkillExclusiveCountDown(skillId, skill.cd, skill.skillInfo.config.CoolDownTime * Constants.F_GAMMA); } } } UpdateSkillForbidStates(); } public bool HasSkill(int skillID) { return skillPlaceMap.ContainsKey(skillID); } public void Reset() { skillcd0 = new SkillCD(); skillcd1 = new SkillCD(); skillcd2 = new SkillCD(); forbid0.value = false; forbid1.value = false; forbid2.value = false; skillPlaceMap.Clear(); placeSkillMap.Clear(); } public SkillCD GetSkillCD(int skillID) { int index = skillPlaceMap[skillID]; switch (index) { case 0: return skillcd0; case 1: return skillcd1; case 2: return skillcd2; default: return default(SkillCD); } } public LogicBool GetSkillForbid(int skillID) { int index = skillPlaceMap[skillID]; switch (index) { case 0: return forbid0; case 1: return forbid1; case 2: return forbid2; default: return null; } } private void OnSkillRefresh() { InitSkill(); } public 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) { if (skillPlaceMap.ContainsKey(skillId)) { var skillcd = GetSkillCD(skillId); skillcd.SetExclusiveCountDown(cd, total); } } private void UpdateSkillCommonCountDown(float time) { for (int i = 0; i < SKILL_COUNT_MAX; i++) { if (placeSkillMap.ContainsKey(i) && placeSkillMap[i] != 0) { var skillcd = GetSkillCD(placeSkillMap[i]); skillcd.SetCommonCountDown(time); } } } private void UpdateSkillForbidStates() { var forbid = !StatusMgr.Instance.CanCastSkill(PlayerDatas.Instance.baseData.PlayerID); for (int i = 0; i < SKILL_COUNT_MAX; i++) { if (placeSkillMap[i] != 0) { var skillForbid = GetSkillForbid(placeSkillMap[i]); skillForbid.value = forbid; } } } }