| | |
| | | public void OnSkillStart() |
| | | { |
| | | HandleDead(); |
| | | |
| | | skillEffect = SkillEffectFactory.CreateSkillEffect(caster, skillConfig, tagUseSkillAttack); |
| | | skillEffect.Play(OnHitTargets); |
| | | foreach (var subSkillPack in tagUseSkillAttack.subSkillList) |
| | |
| | | // 技能后摇结束回调:通知技能效果处理后摇结束 |
| | | public virtual void OnFinalFrameEnd() |
| | | { |
| | | |
| | | skillEffect?.OnFinalFrameEnd(); // 修复:添加空值检查 |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | // 处理单个目标被命中:应用伤害和施法者效果 |
| | | // 处理单个目标被命中:应用伤害和施法者效果 |
| | | protected virtual void OnHitEachTarget(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt) |
| | | { |
| | | // ============ 第一步:计算伤害分布 ============ |
| | | List<int> damageDivide = new List<int>(); |
| | | if (_hitIndex == 0 && skillConfig.DamageDivide.Length <= 0) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | // 伤害分布计算和应用 |
| | | // 计算总伤害和分段伤害列表 |
| | | long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx); |
| | | List<long> damageList = BattleUtility.DivideDamageToList(damageDivide.ToArray(), totalDamage); |
| | | |
| | | // 获取临时数据并应用伤害 |
| | | // ============ 第二步:刷新实际血量 ============ |
| | | long fromHp = target.teamHero.curHp; |
| | | |
| | | // 计算当前这一击的实际伤害(所有分段伤害之和) |
| | | long currentHitDamage = 0; |
| | | foreach (long dmg in damageList) |
| | | { |
| | | currentHitDamage += dmg; |
| | | } |
| | | |
| | | long toHp = Math.Max(0, fromHp - currentHitDamage); |
| | | |
| | | // 更新目标血量 |
| | | target.teamHero.curHp = toHp; |
| | | |
| | | #if UNITY_EDITOR |
| | | BattleDebug.LogError( |
| | | (caster.Camp == BattleCamp.Red ? "【红方行动】" : "【蓝方行动】") + "\n" + |
| | | $"攻击者: {caster.teamHero.name}\n" + |
| | | $"目标: {target.teamHero.name}\n" + |
| | | $"技能: {skillConfig.SkillName} (第{_hitIndex}击)\n" + |
| | | $"伤害: {currentHitDamage} (总伤害: {totalDamage})\n" + |
| | | $"血量变化: {fromHp} -> {toHp}" |
| | | ); |
| | | #endif |
| | | |
| | | // 只在最后一击时同步HP刷新包 |
| | | bool isLastHit = _hitIndex >= skillConfig.DamageDivide.Length - 1; |
| | | if (isLastHit) |
| | | { |
| | | HandleRefreshHP(hurt); |
| | | } |
| | | |
| | | // ============ 第三步:获取临时数据(掉落、死亡等) ============ |
| | | int objID = (int)target.ObjID; |
| | | tempDropList.TryGetValue(objID, out BattleDrops battleDrops); |
| | | tempDeadPackList.TryGetValue(objID, out HB422_tagMCTurnFightObjDead deadPack); |
| | | target.Hurt(damageList, totalDamage, hurt, skillConfig, _hitIndex, battleDrops, deadPack); |
| | | |
| | | // 处理施法者相关效果 |
| | | // ============ 第四步:执行表现(飘字、动画等) ============ |
| | | target.Hurt(damageList, totalDamage, hurt, skillConfig, _hitIndex, battleDrops, deadPack, fromHp, toHp); |
| | | |
| | | // ============ 第五步:处理施法者相关效果 ============ |
| | | caster.SuckHp(hurt.SuckHP, skillConfig); |
| | | caster.HurtByReflect(hurt.BounceHP, skillConfig); |
| | | } |
| | | |
| | | // 处理HP刷新包(简化逻辑) |
| | | private void HandleRefreshHP(HB427_tagSCUseSkill.tagSCUseSkillHurt hurt) |
| | | { |
| | | // 查找HP刷新包 |
| | | HB419_tagSCObjHPRefresh refreshPack = BattleUtility.FindObjHPRefreshPack(packList); |
| | | |
| | | if (refreshPack != null) |
| | | { |
| | | // 分发HP刷新包 |
| | | PackageRegedit.Distribute(refreshPack); |
| | | packList.Remove(refreshPack); |
| | | } |
| | | } |
| | | |
| | | // 处理死亡相关逻辑:分配掉落和经验 |
| | | protected void HandleDead() |
| | | { |