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 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 battleDamageList = new List(); public BattleDmgInfo(string battleFieldGuid, List 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 = GeneralDefine.blockRatio; // 格挡减伤率 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; } }