using UnityEngine; using System.Collections.Generic; public class Skill { public struct EffectValue { public int value1; public int value2; public int value3; } public static event System.Action OnSkillCDFinished; public static event System.Action OnSkillCast; public static UnityEngine.Events.UnityAction RefreshCD; public event System.Action OnPreparingEnd; public event System.Action OnPreparingFail; public event System.Action OnPreparingCast; public uint OwnerID { get; private set; } public int id { get; private set; } private float m_Cd; public float cd { get { return m_Cd; } set { m_Cd = value; } } /// /// 当前攻击到的对象, 由服务端回包决定 /// public List hurtServerList = new List(); public List hurtClientList = new List(); public List hitTargetList = new List(); public List hurtClntFightNpcList = new List(); public List hitClientBattleTargetList = new List(); public List cacheBuffList = new List(); public GActorFight mainTarget; public Vector3 targetPosition; public List warnPosList = new List();// 预警时候的位置 private bool m_CSkillPrepareEnd; public bool CSkillPrepareEnd { get { return m_CSkillPrepareEnd; } set { m_CSkillPrepareEnd = value; } } public enum E_SkillPrepareStatus { None, Begin, End, Fail } private E_SkillPrepareStatus m_SSkillPrepareStatus = E_SkillPrepareStatus.None; public E_SkillPrepareStatus SSkillPrepareStatus { get { return m_SSkillPrepareStatus; } set { m_SSkillPrepareStatus = value; } } private bool m_SkillPreparing = false; public bool SkillPreparing { get { return m_SkillPreparing; } set { m_SkillPreparing = value; } } private bool m_SkillCompelete = true; public bool SkillCompelete { get { return m_SkillCompelete; } set { m_SkillCompelete = value; //if (id == 251) //{ // Debug.LogFormat("------------- 设置技能: {0} 的是否完成为: {1}", id, value); //} } } private float m_SkillStartTime; public void ClearServerHurtList() { #if UNITY_EDITOR if (id == 251) { string _content = string.Format("技能 {0} 清空了所有服务端伤害对象.", id); RuntimeLogUtility.AddLog_Blue(_content); } #endif hurtServerList.Clear(); } public void ClearSkillKillTargets() { GActorFight _fight = null; GActorFight _owner = GAMgr.Instance.GetBySID(OwnerID) as GActorFight; for (int i = hurtServerList.Count - 1; i >= 0; --i) { _fight = GAMgr.Instance.GetByCID(hurtServerList[i].clientInstID) as GActorFight; if (_fight == null) { continue; } if (_owner is GA_NpcSummonFight) { if (_fight.ActorInfo.serverDie && _fight.NextAction != GAStaticDefine.Act_Dead) { GAStaticDefine.PopHp(_owner, _fight, hurtServerList[i].AttackType, (int)hurtServerList[i].HurtHP); _fight.Die(); #if UNITY_EDITOR string _content = string.Format(" |-- {0} 死亡时技能: {1} 杀死的对象: {2} 还未死亡, 这里弄死它.", OwnerID, id, _fight.ServerInstID); RuntimeLogUtility.AddLog_Red(_content, _fight.ServerInstID); #endif } } } } public SkillHelper.SkillInfo skillInfo; public Skill(uint ownerID, int id) { this.id = id; OwnerID = ownerID; skillInfo = SkillHelper.Instance.Get(id); } public void Cast(uint userSID) { if (skillInfo.config != null) { if (OnSkillCast != null) { OnSkillCast(userSID, id); } bool _clientRefreshCD = !PreFightMission.Instance.IsFinished() || PlayerDatas.Instance.baseData.MapID == 52020 || userSID != PlayerDatas.Instance.PlayerId || ClientDungeonStageUtility.isClientDungeon || ClientSceneManager.Instance.IsClientFightMode || AdventureStage.Instance.IsInAdventureStage #if UNITY_EDITOR || RuntimeLogUtility.TEST_CLIENT_PVP #endif ; if (_clientRefreshCD) { cd = skillInfo.config.CoolDownTime * Constants.F_GAMMA; } if (_clientRefreshCD || PlayerDatas.Instance.baseData.MapID == 52020) { if (OwnerID == PlayerDatas.Instance.PlayerId) { if (RefreshCD != null) { RefreshCD(id, cd, cd); } } } } m_SkillStartTime = Time.time; } public void OnRecv_SkillCast() { if (skillInfo.config != null) { cd = skillInfo.config.CoolDownTime * Constants.F_GAMMA; if (OwnerID == PlayerDatas.Instance.PlayerId) { if (RefreshCD != null) { RefreshCD(id, cd, cd); } } } } public void Update() { if (cd > 0) { cd -= Time.deltaTime; if (cd <= 0) { cd = 0; if (OwnerID == PlayerDatas.Instance.PlayerId) { if (OnSkillCDFinished != null) { OnSkillCDFinished(id); } } } } // 对与技能被异常设置为未完成的状态进行保护 if (!SkillCompelete) { if (Time.time - m_SkillStartTime > 3.2f) { SkillCompelete = true; } } } public bool IsValid() { return cd == 0; } public void DoPreparingEnd(uint serverObjId) { if (OnPreparingEnd != null) { OnPreparingEnd(serverObjId); } SSkillPrepareStatus = E_SkillPrepareStatus.End; } public void DoPreparingFail(uint serverObjId) { if (OnPreparingFail != null) { OnPreparingFail(serverObjId); } SSkillPrepareStatus = E_SkillPrepareStatus.Fail; } public void DoPreparingCast() { if (OnPreparingCast != null) { OnPreparingCast(); } } public void UnInit() { ClearServerHurtList(); hurtClientList.Clear(); hitTargetList.Clear(); hurtClntFightNpcList.Clear(); hitClientBattleTargetList.Clear(); mainTarget = null; m_SkillCompelete = true; } }