private void InternalPerformAttack(Actor actor, IDamageable damageTarget, Damage damage, bool useCooldown = true) { var sourceDamage = new SourcedDamage(Actor, damage); var attackArgs = new AttackerableEventArgs(sourceDamage, actor); OnAttacking(attackArgs); var critDamage = CalculateCritDamage(sourceDamage); var lifesteal = CalculateLifestealModifier(sourceDamage); damageTarget.TakeDamage(critDamage); if (Actor.TryGetModule <IHealthable>(out var healthable)) { healthable.Value += lifesteal; } if (useCooldown) { PutAttackOnCooldown(); } var attackedArgs = new AttackerableEventArgs(critDamage, Actor); OnAttacked(attackedArgs); }
protected abstract void OnAttack(object sender, AttackerableEventArgs e);
protected void OnAttacked(AttackerableEventArgs e) => Attacked?.Invoke(this, e);