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<int> OnSkillCDFinished;
|
public static event System.Action<uint, int> OnSkillCast;
|
public static UnityEngine.Events.UnityAction<int, float, float> RefreshCD;
|
public event System.Action<uint> OnPreparingEnd;
|
public event System.Action<uint> OnPreparingFail;
|
public event System.Action OnPreparingCast;
|
|
public uint OwnerID { get; private set; }
|
|
public int SkillElementID; //专精ID
|
|
public int id
|
{
|
get; private set;
|
}
|
|
private float m_Cd;
|
public float cd
|
{
|
get
|
{
|
return m_Cd;
|
}
|
set
|
{
|
m_Cd = value;
|
}
|
}
|
|
/// <summary>
|
/// 当前攻击到的对象, 由服务端回包决定
|
/// </summary>
|
public List<AttackHandler.HurtObjs> hurtServerList = new List<AttackHandler.HurtObjs>();
|
public List<AttackHandler.HurtObjs> hurtClientList = new List<AttackHandler.HurtObjs>();
|
public List<uint> hitTargetList = new List<uint>();
|
|
public List<AttackHandler.HurtObjs> hurtClntFightNpcList = new List<AttackHandler.HurtObjs>();
|
public List<uint> hitClientBattleTargetList = new List<uint>();
|
public List<int> cacheBuffList = new List<int>();
|
|
public GActorFight mainTarget;
|
public Vector3 targetPosition;
|
public List<Vector3> warnPosList = new List<Vector3>();// 预警时候的位置
|
|
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, 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, int ElementID = 0)
|
{
|
this.id = id;
|
OwnerID = ownerID;
|
|
SkillElementID = ElementID;
|
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 && !ArenaManager.IsArenaClientNotMirrorFight)
|
{
|
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;
|
}
|
}
|