internal void ImpactDamage(int srcObjId, int targetId, int impactId, int seq)
{
EntityInfo targetObj = m_Scene.EntityManager.GetEntityInfo(targetId);
EntityInfo srcObj = m_Scene.EntityManager.GetEntityInfo(srcObjId);
if (null != targetObj && !targetObj.IsDead())
{
ImpactInfo impactInfo = targetObj.GetSkillStateInfo().GetImpactInfoBySeq(seq);
if (null != impactInfo && impactId == impactInfo.ImpactId)
{
TableConfig.Skill cfg = impactInfo.ConfigData;
int targetType = impactInfo.TargetType;
float damage = impactInfo.DamageData.Damage;
int addShield = impactInfo.DamageData.AddShield;
int hpRecover = impactInfo.DamageData.HpRecover;
if (hpRecover != 0)
{
targetObj.SetHp(Operate_Type.OT_Relative, (int)impactInfo.DamageData.HpRecover);
targetObj.SetAttackerInfo(srcObjId, false, true, false, -impactInfo.DamageData.HpRecover, 0);
}
if (addShield != 0)
{
targetObj.SetShield(Operate_Type.OT_Relative, impactInfo.DamageData.AddShield);
}
if ((targetType == (int)SkillTargetType.Enemy || targetType == (int)SkillTargetType.RandEnemy) && damage != 0)
{
if (targetObj.EntityType == (int)EntityTypeEnum.Tower)
{
if (null != srcObj && srcObj.NormalSkillId != impactInfo.SkillId)
{
//技能打塔不产生伤害
return;
}
}
bool isKiller = false;
if (targetObj.Shield >= damage)
{
targetObj.SetShield(Operate_Type.OT_Relative, -(int)damage);
}
else if (targetObj.Shield > 0)
{
int leftDamage = (int)damage - targetObj.Shield;
targetObj.SetShield(Operate_Type.OT_Absolute, 0);
targetObj.SetHp(Operate_Type.OT_Relative, -(int)leftDamage);
if (targetObj.Hp <= 0)
{
isKiller = true;
}
}
else
{
targetObj.SetHp(Operate_Type.OT_Relative, -(int)damage);
if (targetObj.Hp <= 0)
{
isKiller = true;
}
}
if (isKiller)
{
targetObj.GetCombatStatisticInfo().AddDeadCount(1);
if (null != srcObj)
{
EntityInfo killer = srcObj;
if (killer.SummonerId > 0)
{
killer = m_Scene.EntityManager.GetEntityInfo(killer.SummonerId);
}
if (targetObj.EntityType == (int)EntityTypeEnum.Tower)
{
killer.GetCombatStatisticInfo().AddKillTowerCount(1);
}
else if (targetObj.EntityType == (int)EntityTypeEnum.Hero)
{
killer.GetCombatStatisticInfo().AddKillHeroCount(1);
killer.GetCombatStatisticInfo().AddMultiKillCount(1);
}
else
{
killer.GetCombatStatisticInfo().AddKillNpcCount(1);
}
}
}
targetObj.SetAttackerInfo(srcObjId, isKiller, true, false, (int)damage, 0);
}
}
}
}