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 List<BattleDmg> battleDamageList = new List<BattleDmg>();
|
|
public BattleDmgInfo(string battleFieldGuid, List<long> damageList, BattleObject hurtObj, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig)
|
{
|
this.battleFieldGuid = battleFieldGuid;
|
this.damageList = damageList;
|
this.hurtObj = hurtObj;
|
this.hurt = hurt;
|
this.skillConfig = skillConfig;
|
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;
|
}
|
|
}
|