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 BattleHurtParam battleHurtParam { get; private set; } public List damageList { get { return battleHurtParam.damageList; } } public BattleObject hurtObj { get { return battleHurtParam.hurtObj; } } public BattleObject casterObj { get { return battleHurtParam.casterObj; } } public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt { get { return battleHurtParam.hurt; } } public SkillConfig skillConfig { get { return battleHurtParam.skillConfig; } } // 是否被格挡了 public bool isBlocked = false; public bool isLastHit = false; public List targetDamageList = new List(); public List casterDamageList = new List(); public BattleDmgInfo(string battleFieldGuid, BattleHurtParam battleHurtParam) { this.battleFieldGuid = battleFieldGuid; this.battleHurtParam = battleHurtParam; this.isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1; 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]; // ============ 1. 先处理当前段对应的反伤 ============ if (battleHurtParam.reflectHpList != null && i < battleHurtParam.reflectHpList.Count) { long reflectHp = battleHurtParam.reflectHpList[i]; if (reflectHp > 0) { casterDamageList.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) { casterDamageList.Add(new BattleDmg { damage = suckHp, attackType = (int)DamageType.SuckHP }); } } // ============ 3. 最后处理主要伤害 ============ // 格挡处理 if (isBlocked) { // 去掉格挡类型 int attackType = rawAttackType & (~(int)DamageType.Block); // 计算格挡伤害 long totalDamage = (long)(actualDamage / (1 - blockRatio)); long blockDmg = totalDamage - actualDamage; targetDamageList.Add(new BattleDmg { damage = blockDmg, attackType = (int)DamageType.Block }); // 真实伤害特殊处理 if (IsRealdamage()) { int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0); targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType }); } else { // 普通伤害/治疗处理 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}"); } targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType }); } } else { int attackType = rawAttackType; // 真实伤害特殊处理 if (IsRealdamage()) { int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0); targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType }); } else { // 普通伤害/治疗处理 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}"); } targetDamageList.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; } } public class BattleHurtParam { public BattleObject casterObj; public BattleObject hurtObj; public List damageList; public List suckHpList; public List 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; }