|
using System.Collections.Generic;
|
using UnityEngine;
|
using System;
|
using System.Linq;
|
|
public class DirectlyDamageSkill : SkillBase
|
{
|
|
public DirectlyDamageSkill(BattleObject _caster, SkillConfig _skillCfg,
|
H0604_tagUseSkillAttack vNetData, BattleField _battleField) : base(_caster, _skillCfg, vNetData, _battleField)
|
{
|
|
}
|
|
public override void Run()
|
{
|
base.Run();
|
|
}
|
|
protected override void OnTriggerEvent(int triggerIndex, int triggerFrame)
|
{
|
if (0 == triggerIndex)
|
{
|
List<BattleObject> targetList = GetTargetList();
|
// 子类实现具体的技能逻辑
|
SkillEffect effect = SkillEffectFactory.CreateSkillEffect(caster, skillConfig, tagUseSkillAttack);
|
if (null != effect)
|
{
|
// 如果是子弹类型的
|
effect.Play((hitIndex, hurList) =>
|
{
|
for (int i = 0; i < hurList.Count; i++)
|
{
|
var hurt = hurList[i];
|
BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
|
|
List<long> damageList = new List<long>();
|
// 计算伤害 分段的话
|
if (hitIndex >= skillConfig.DamageDivide.Length)
|
{
|
Debug.LogError("DamageDivide有问题 需要检查 只显示一段伤害 取triggerFrames的");
|
long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx) / (skillConfig.TriggerFrames.Length == 0 ? 1 : skillConfig.TriggerFrames.Length);
|
damageList.Add(totalDamage);
|
}
|
else
|
{
|
long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
|
|
if (hitIndex >= skillConfig.DamageDivide.Length)
|
{
|
int[] tenKDamagePercentArray = skillConfig.DamageDivide[hitIndex];
|
long factDamage = totalDamage;
|
for (int j = 0; j < tenKDamagePercentArray.Length; j++)
|
{
|
long damage = (long)(Mathf.Round(factDamage * tenKDamagePercentArray[j] / 10000.0f));
|
damageList.Add(damage);
|
}
|
}
|
}
|
target.Hurt(damageList, hurt.AttackType);
|
}
|
});
|
}
|
}
|
}
|
|
protected override void DoSkillLogic(Action _onComplete = null)
|
{
|
// 开始记录帧数
|
startCounting = true;
|
}
|
|
|
#if UNITY_EDITOR_STOP_USING
|
// 伤害列表理应由服务器发给客户端 这边只做粗浅模拟
|
public override List<Dictionary<int, List<int>>> GetDamageList(BattleField battleField)
|
{
|
List<Dictionary<int, List<int>>> damageList = new List<Dictionary<int, List<int>>>();
|
|
List<BattleObject> affectList = GetTargetList(battleField);
|
|
Dictionary<int, List<int>> oneRoundDamage = new Dictionary<int, List<int>>();
|
|
for (int j = 0; j < affectList.Count; j++)
|
{
|
BattleObject obj = affectList[j];
|
List<int> tryDmgList = caster.TryAttack(obj, skillConfig);
|
oneRoundDamage.Add(obj.ObjID, tryDmgList);
|
}
|
|
damageList.Add(oneRoundDamage);
|
|
return damageList;
|
}
|
#endif
|
}
|