void ApplyDamage(EiDamage damage) { if (HasShieldType(damage.DamageType)) { if (HasShield) { // calculate armor Loss var shieldLoss = shieldData.flatShieldLoss + shieldData.shieldLossByTotalDamagePercentage * damage.Damage; var preCalcDamage = damage.Damage; // Reduce damage damage.ReduceDamage(shieldData.flatReduction, shieldData.damageMultiplier, calculateFlatReductionFirst); //fix after reduction armor loss shieldLoss += (preCalcDamage - damage.Damage) * shieldData.shieldLossByDamagePercentage; //Check if needed further damage adjustments var tempArmor = CurrentShield; if (shieldLoss > tempArmor) { var percentage = 1f - (tempArmor / shieldLoss); currentShield.Value = 0f; //do some magic stuff for doing more accurate damage reduction based on armor damage.SetDamage(UnityEngine.Mathf.Lerp(damage.Damage, preCalcDamage, percentage)); } else { currentShield.Value -= shieldLoss; } } } }
void ApplyDamage(EiDamage damage) { for (int i = protection.Count - 1; i >= 0; i--) { var protData = protection [i]; if (protData.damageType == damage.DamageType) { damage.ReduceDamage(protData.flatReduction, protData.damageMultiplier, calculateFlatProtectionFirst); } } }
public void Damage(EiDamage damage) { if (damage.Target == null) { damage.Target = damageTarget; } else { if ((damage.Target) != damageTarget) { Debug.LogWarning("The damage target is different to what it hit\n" + Entity.EntityName); } } onHit.Trigger(damage); damage.ReduceDamage(flatDamageReduction.Value, damageMultiplier.Value, calculateFlatReducationFirst); damageTarget.Damage(damage); }