| | |
| | | return true; |
| | | } |
| | | |
| | | public virtual void Hurt(List<long> damageValues, long _totalDamage, |
| | | HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig, int hitIndex, |
| | | BattleDrops battleDrops, HB422_tagMCTurnFightObjDead deadPack, |
| | | long fromHp, long toHp) |
| | | public virtual void Hurt(BattleHurtParam battleHurtParam) |
| | | { |
| | | bool isLastHit = hitIndex >= skillConfig.DamageDivide.Length - 1; |
| | | bool firstHit = hitIndex == 0; |
| | | BattleDmgInfo dmgInfo = PopDamage(damageValues, _totalDamage, hurt, skillConfig, isLastHit, fromHp, toHp); |
| | | bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1; |
| | | bool firstHit = battleHurtParam.hitIndex == 0; |
| | | BattleDmgInfo dmgInfo = PopDamage(battleHurtParam); |
| | | |
| | | |
| | | // 这里 |
| | |
| | | |
| | | |
| | | |
| | | bool isFatalAttack = (null != deadPack) && isLastHit; |
| | | bool isFatalAttack = (null != battleHurtParam.deadPack) && isLastHit; |
| | | |
| | | if (isFatalAttack) |
| | | { |
| | |
| | | { |
| | | PushDropItems(battleDrops); |
| | | } |
| | | battleField.OnObjsDead(new List<HB422_tagMCTurnFightObjDead>() { deadPack }); |
| | | battleField.OnObjsDead(new List<HB422_tagMCTurnFightObjDead>() { battleHurtParam.deadPack }); |
| | | |
| | | } |
| | | else |
| | |
| | | } |
| | | |
| | | // 伤害还要看 是否闪避 暴击 and so on 需要有一个DamageType 服务器应该会给 |
| | | protected virtual BattleDmgInfo PopDamage(List<long> damageValues, long _totalDamage, |
| | | HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig, bool isLastHit, |
| | | long fromHp, long toHp) |
| | | protected virtual BattleDmgInfo PopDamage(BattleHurtParam battleHurtParam) |
| | | { |
| | | BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, damageValues, this, hurt, skillConfig, isLastHit); |
| | | BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, battleHurtParam); |
| | | |
| | | // 使用传入的 fromHp 和 toHp 更新血条显示 |
| | | heroInfoBar.UpdateHP(fromHp, toHp, teamHero.maxHp); |
| | | heroInfoBar.UpdateHP(battleHurtParam.fromHp, battleHurtParam.toHp, teamHero.maxHp); |
| | | |
| | | // YYL TODO 是否需要挂在在自身的follow点上 |
| | | EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo); |
| | |
| | | /// <returns>这一击内每一段的伤害值列表</returns> |
| | | public static List<long> DivideDamageToList(int[][] damageDivideList, int hitIndex, long totalDamage) |
| | | { |
| | | if (totalDamage <= 0) |
| | | { |
| | | return new List<long>{}; |
| | | } |
| | | |
| | | if (damageDivideList == null || damageDivideList.Length == 0) |
| | | { |
| | | Debug.LogError("damageDivideList 为空或长度为0"); |
| | |
| | | { |
| | | |
| | | public string battleFieldGuid { get; private set; } |
| | | public List<long> damageList { get; private set; } |
| | | public BattleObject hurtObj { get; private set; } |
| | | |
| | | public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt { get; private set; } |
| | | public BattleHurtParam battleHurtParam { get; private set; } |
| | | public List<long> damageList { get { return battleHurtParam.damageList; } } |
| | | public BattleObject hurtObj { get { return battleHurtParam.hurtObj; } } |
| | | |
| | | public SkillConfig skillConfig { get; private set; } |
| | | public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt { get { return battleHurtParam.hurt; } } |
| | | |
| | | public SkillConfig skillConfig { get { return battleHurtParam.skillConfig; } } |
| | | |
| | | // 是否被格挡了 |
| | | public bool isBlocked = false; |
| | |
| | | |
| | | public List<BattleDmg> battleDamageList = new List<BattleDmg>(); |
| | | |
| | | public BattleDmgInfo(string battleFieldGuid, List<long> damageList, BattleObject hurtObj, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig, bool isLastHit) |
| | | public BattleDmgInfo(string battleFieldGuid, BattleHurtParam battleHurtParam) |
| | | { |
| | | this.battleFieldGuid = battleFieldGuid; |
| | | this.damageList = damageList; |
| | | this.hurtObj = hurtObj; |
| | | this.hurt = hurt; |
| | | this.skillConfig = skillConfig; |
| | | this.isLastHit = isLastHit; |
| | | this.battleHurtParam = battleHurtParam; |
| | | this.isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1; |
| | | HandleDamageType(); |
| | | HandleAttackTypeAndDamage(); |
| | | } |
| | |
| | | int rawAttackType = (int)hurt.AttackTypes; |
| | | float blockRatio = GeneralDefine.blockRatio; // 格挡减伤率 |
| | | |
| | | // 处理每一段伤害及其对应的反伤和吸血 |
| | | for (int i = 0; i < damageList.Count; i++) |
| | | { |
| | | long actualDamage = damageList[i]; |
| | | |
| | | // ============ 1. 先处理当前段对应的反伤 ============ |
| | | if (battleHurtParam.reflectHpList != null && i < battleHurtParam.reflectHpList.Count) |
| | | { |
| | | long reflectHp = battleHurtParam.reflectHpList[i]; |
| | | if (reflectHp > 0) |
| | | { |
| | | battleDamageList.Add(new BattleDmg |
| | | { |
| | | damage = reflectHp, |
| | | attackType = (int)DamageType.Reflect |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // ============ 2. 然后处理当前段对应的吸血 ============ |
| | | if (battleHurtParam.suckHpList != null && i < battleHurtParam.suckHpList.Count) |
| | | { |
| | | long suckHp = battleHurtParam.suckHpList[i]; |
| | | if (suckHp > 0) |
| | | { |
| | | battleDamageList.Add(new BattleDmg |
| | | { |
| | | damage = suckHp, |
| | | attackType = (int)DamageType.SuckHP |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // ============ 3. 最后处理主要伤害 ============ |
| | | // 格挡处理 |
| | | if (isBlocked) |
| | | { |
| | |
| | | { |
| | | int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0); |
| | | battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType }); |
| | | continue; |
| | | } |
| | | |
| | | else |
| | | { |
| | | // 普通伤害/治疗处理 |
| | | if (DamageNumConfig.Get(attackType) == null) |
| | | { |
| | |
| | | UnityEngine.Debug.LogError($"强制转换失败,该类型不是治疗也不是伤害 {attackType}"); |
| | | } |
| | | battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType }); |
| | | } |
| | | } |
| | | else |
| | | { |
| | |
| | | { |
| | | int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0); |
| | | battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType }); |
| | | continue; |
| | | } |
| | | |
| | | else |
| | | { |
| | | // 普通伤害/治疗处理 |
| | | if (DamageNumConfig.Get(attackType) == null) |
| | | { |
| | |
| | | UnityEngine.Debug.LogError($"强制转换失败,该类型不是治疗也不是伤害 {attackType}"); |
| | | } |
| | | battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType }); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | } |
| | | |
| | | public class BattleHurtParam |
| | | { |
| | | public BattleObject casterObj; |
| | | public BattleObject hurtObj; |
| | | public List<long> damageList; |
| | | public List<long> suckHpList; |
| | | public List<long> reflectHpList; |
| | | |
| | | public long fromHp; |
| | | |
| | | public long toHp; |
| | | |
| | | public BattleDrops battleDrops; |
| | | |
| | | public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt; |
| | | |
| | | public int hitIndex; |
| | | |
| | | public HB422_tagMCTurnFightObjDead deadPack; |
| | | |
| | | public SkillConfig skillConfig; |
| | | } |
| | |
| | | // ============ 第二步:刷新实际血量 ============ |
| | | long fromHp = target.teamHero.curHp; |
| | | |
| | | |
| | | |
| | | // ============处理吸血跟反伤 =============== |
| | | // 也要按每一击平均算 最后要补齐伤害 |
| | | long suckHp = hurt.SuckHP; |
| | | long reflectHp = hurt.BounceHP; |
| | | |
| | | List<long> suckHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, suckHp); |
| | | |
| | | List<long> reflectHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, hurt.BounceHP); |
| | | // long currentSuckHp = suckHp / tagUseSkillAttack.HurtCount; |
| | | |
| | | // 计算当前这一击的实际伤害(所有分段伤害之和) |
| | | long currentHitDamage = 0; |
| | | foreach (long dmg in damageList) |
| | |
| | | currentHitDamage += dmg; |
| | | } |
| | | |
| | | long toHp = Math.Max(0, fromHp - currentHitDamage); |
| | | long currentHitSuckHp = 0; |
| | | foreach (long suck in suckHpList) |
| | | { |
| | | currentHitSuckHp += suck; |
| | | } |
| | | |
| | | long currentHitReflectHp = 0; |
| | | foreach (long reflect in reflectHpList) |
| | | { |
| | | currentHitReflectHp += reflect; |
| | | } |
| | | |
| | | long toHp = Math.Max(0, fromHp - currentHitDamage + currentHitSuckHp - currentHitReflectHp); |
| | | |
| | | |
| | | // 更新目标血量 |
| | | target.teamHero.curHp = toHp; |
| | |
| | | $"目标: {target.teamHero.name}\n" + |
| | | $"技能: {skillConfig.SkillName} (第{_hitIndex}击)\n" + |
| | | $"伤害: {currentHitDamage} (总伤害: {totalDamage})\n" + |
| | | $"吸血: {currentHitSuckHp}\n" + |
| | | $"反伤: {currentHitReflectHp}\n" + |
| | | $"血量变化: {fromHp} -> {toHp}" |
| | | ); |
| | | #endif |
| | |
| | | tempDropList.TryGetValue(objID, out BattleDrops battleDrops); |
| | | tempDeadPackList.TryGetValue(objID, out HB422_tagMCTurnFightObjDead deadPack); |
| | | |
| | | // ============ 第四步:执行表现(飘字、动画等) ============ |
| | | target.Hurt(damageList, totalDamage, hurt, skillConfig, _hitIndex, battleDrops, deadPack, fromHp, toHp); |
| | | |
| | | // ============ 第五步:处理施法者相关效果 ============ |
| | | caster.SuckHp(hurt.SuckHP, skillConfig); |
| | | caster.HurtByReflect(hurt.BounceHP, skillConfig); |
| | | // 参数打包 |
| | | BattleHurtParam hurtParam = new BattleHurtParam() |
| | | { |
| | | casterObj = caster, |
| | | hurtObj = target, |
| | | damageList = damageList, |
| | | suckHpList = suckHpList, |
| | | reflectHpList = reflectHpList, |
| | | fromHp = fromHp, |
| | | toHp = toHp, |
| | | battleDrops = battleDrops, |
| | | hurt = hurt, |
| | | hitIndex = _hitIndex, |
| | | deadPack = deadPack, |
| | | skillConfig = skillConfig |
| | | }; |
| | | |
| | | // ============ 第四步:执行表现(飘字、动画等) ============ |
| | | target.Hurt(hurtParam); |
| | | |
| | | |
| | | } |
| | | |
| | | // 处理HP刷新包(简化逻辑) |