private void ProcessDamage(DamageInfo damageInfo) { if (!_unit.InZone || _unit.IsAttackable != ErrorCodes.NoError || _unit.States.Dead || _unit.IsInvulnerable) { return; } var totalDamage = 0.0; var totalKers = 0.0; var totalAbsorbedDamage = 0.0; foreach (var damage in damageInfo.CalculateDamages(_unit)) { var partialDamage = CalculateAbsorbedDamage(damage.value, ref totalAbsorbedDamage); if (partialDamage <= 0.0) { continue; } var resist = _unit.GetResistByDamageType(damage.type); partialDamage -= (partialDamage * resist); var kers = CalculateKersValue(damage.type, partialDamage); if (kers > 0.0) { _unit.Core += kers; totalKers += kers; } totalDamage += partialDamage; } var h = DamageTaken; if (h == null) { return; } var e = new DamageTakenEventArgs { TotalDamage = totalDamage, TotalCoreDamage = totalAbsorbedDamage, TotalKers = totalKers, IsCritical = damageInfo.IsCritical, IsKillingBlow = false }; h(damageInfo.attacker, e); }