| using System.Collections.Generic; | 
|   | 
| public class BattleDmg | 
| { | 
|     public long damage; | 
|     public int attackType; | 
|   | 
|     public bool IsType(DamageType damageType) | 
|     { | 
|         return (attackType & (int)damageType) == (int)damageType; | 
|     } | 
| } | 
|   | 
|   | 
| public class BattleDmgInfo | 
| { | 
|   | 
|     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 SkillConfig skillConfig { get; private set; } | 
|   | 
|     //  是否被格挡了 | 
|     public bool isBlocked = false; | 
|   | 
|     public bool isLastHit = 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) | 
|     { | 
|         this.battleFieldGuid = battleFieldGuid; | 
|         this.damageList = damageList; | 
|         this.hurtObj = hurtObj; | 
|         this.hurt = hurt; | 
|         this.skillConfig = skillConfig; | 
|         this.isLastHit = isLastHit; | 
|         HandleDamageType(); | 
|         HandleAttackTypeAndDamage(); | 
|     } | 
|   | 
|     private void HandleDamageType() | 
|     { | 
|         int attackTypes = 0; | 
|         foreach (ServerDamageType serverDamageType in System.Enum.GetValues(typeof(ServerDamageType))) | 
|         { | 
|             int nsdt = (int)serverDamageType; | 
|             if ((hurt.AttackTypes & nsdt) == nsdt) | 
|             { | 
|                 attackTypes += nsdt; | 
|             } | 
|         } | 
|         hurt.AttackTypes = (uint)attackTypes; | 
|     } | 
|   | 
|     private void HandleAttackTypeAndDamage() | 
|     { | 
|         isBlocked = HaveBlockDamage(); | 
|         int rawAttackType = (int)hurt.AttackTypes; | 
|         float blockRatio = float.Parse(GeneralDefine.parryCfg.Numerical3); // 格挡减伤率 | 
|   | 
|         for (int i = 0; i < damageList.Count; i++) | 
|         { | 
|             long actualDamage = damageList[i]; | 
|   | 
|             // 格挡处理 | 
|             if (isBlocked) | 
|             { | 
|                 // 去掉格挡类型 | 
|                 int attackType = rawAttackType & (~(int)DamageType.Block); | 
|   | 
|                 // 计算格挡伤害 | 
|                 long totalDamage = (long)(actualDamage / (1 - blockRatio)); | 
|                 long blockDmg = totalDamage - actualDamage; | 
|                 battleDamageList.Add(new BattleDmg { damage = blockDmg, attackType = (int)DamageType.Block }); | 
|   | 
|                 // 真实伤害特殊处理 | 
|                 if (IsRealdamage()) | 
|                 { | 
|                     int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0); | 
|                     battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType }); | 
|                     continue; | 
|                 } | 
|   | 
|                 // 普通伤害/治疗处理 | 
|                 if (DamageNumConfig.Get(attackType) == null) | 
|                 { | 
|                     UnityEngine.Debug.LogError($"服务器给的伤害类型不对,强制转换为普通伤害/治疗, attackType: {attackType}"); | 
|                     if ((attackType & (int)DamageType.Damage) != 0) | 
|                         attackType = (int)DamageType.Damage; | 
|                     else if ((attackType & (int)DamageType.Recovery) != 0) | 
|                         attackType = (int)DamageType.Recovery; | 
|                     else | 
|                         UnityEngine.Debug.LogError($"强制转换失败,该类型不是治疗也不是伤害 {attackType}"); | 
|                 } | 
|                 battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType }); | 
|             } | 
|             else | 
|             { | 
|                 int attackType = rawAttackType; | 
|   | 
|                 // 真实伤害特殊处理 | 
|                 if (IsRealdamage()) | 
|                 { | 
|                     int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0); | 
|                     battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType }); | 
|                     continue; | 
|                 } | 
|   | 
|                 // 普通伤害/治疗处理 | 
|                 if (DamageNumConfig.Get(attackType) == null) | 
|                 { | 
|                     UnityEngine.Debug.LogError($"服务器给的伤害类型不对,强制转换为普通伤害/治疗, attackType: {attackType}"); | 
|                     if ((attackType & (int)DamageType.Damage) != 0) | 
|                         attackType = (int)DamageType.Damage; | 
|                     else if ((attackType & (int)DamageType.Recovery) != 0) | 
|                         attackType = (int)DamageType.Recovery; | 
|                     else | 
|                         UnityEngine.Debug.LogError($"强制转换失败,该类型不是治疗也不是伤害 {attackType}"); | 
|                 } | 
|                 battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType }); | 
|             } | 
|         } | 
|     } | 
|   | 
|     public bool IsType(DamageType damageType) | 
|     { | 
|         return (hurt.AttackTypes & (int)damageType) == (int)damageType; | 
|     } | 
|   | 
|     public bool IsCrit() | 
|     { | 
|         return IsType(DamageType.Crit); | 
|     } | 
|   | 
|     public bool HaveBlockDamage() | 
|     { | 
|         return IsType(DamageType.Block); | 
|     } | 
|   | 
|     public bool IsRealdamage() | 
|     { | 
|         return skillConfig.HurtType / 10 == 1; | 
|     } | 
|   | 
| } |