| | |
| | | |
| | | using System.Collections.Generic; |
| | | using UnityEngine; |
| | | using System; |
| | | using System.Linq; |
| | | |
| | | public class DirectlyDamageSkill : SkillBase |
| | | { |
| | | |
| | | public DirectlyDamageSkill(SkillConfig _skillCfg) : base(_skillCfg) |
| | | |
| | | public DirectlyDamageSkill(BattleObject _caster, SkillConfig _skillCfg, |
| | | H0604_tagUseSkillAttack vNetData, BattleField _battleField) : base(_caster, _skillCfg, vNetData, _battleField) |
| | | { |
| | | |
| | | |
| | | } |
| | | |
| | | public override void Run() |
| | | { |
| | | { |
| | | base.Run(); |
| | | |
| | | } |
| | | |
| | | public override void Cast(BattleObject _caster, BattleField _battleField, List<Dictionary<int, List<int>>> damageList) |
| | | 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) |
| | | { |
| | | _caster.PlaySkill(skillConfig, damageList, OnSkillAnimationFinished); |
| | | // 开始记录帧数 |
| | | startCounting = true; |
| | | } |
| | | |
| | | protected void OnSkillAnimationFinished() |
| | | { |
| | | isFinished = true; |
| | | } |
| | | |
| | | #if UNITY_EDITOR |
| | | #if UNITY_EDITOR_STOP_USING |
| | | // 伤害列表理应由服务器发给客户端 这边只做粗浅模拟 |
| | | public override List<Dictionary<int, List<int>>> GetDamageList(BattleObject _caster, BattleField battleField) |
| | | 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(_caster, battleField); |
| | | 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.BattleObjectId, tryDmgList); |
| | | List<int> tryDmgList = caster.TryAttack(obj, skillConfig); |
| | | oneRoundDamage.Add(obj.ObjID, tryDmgList); |
| | | } |
| | | |
| | | damageList.Add(oneRoundDamage); |