|
|
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<ILSkillManager>
|
{
|
|
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<int, int> skillPlaceMap = new Dictionary<int, int>();
|
Dictionary<int, int> placeSkillMap = new Dictionary<int, int>();
|
|
|
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;
|
}
|
}
|
}
|
|
|
|
|
}
|