/// <summary>
/// Handles explosion.
/// </summary>
/// <param name="attacker"></param>
/// <param name="skill"></param>
/// <param name="fireballProp"></param>
private void Impact(Creature attacker, Skill skill, Prop fireballProp)
{
var regionId = attacker.RegionId;
var propPos = fireballProp.GetPosition();
var targetLocation = new Location(regionId, propPos);
var targets = attacker.GetTargetableCreaturesAround(propPos, ExplosionRadius);
var aAction = new AttackerAction(CombatActionType.SpecialHit, attacker, targetLocation.ToLocationId(), skill.Info.Id);
aAction.Set(AttackerOptions.UseEffect);
aAction.PropId = fireballProp.EntityId;
var cap = new CombatActionPack(attacker, skill.Info.Id, aAction);
foreach (var target in targets)
{
target.StopMove();
var tAction = new TargetAction(CombatActionType.TakeHit, target, attacker, skill.Info.Id);
tAction.Set(TargetOptions.Result | TargetOptions.KnockDown);
tAction.Stun = TargetStun;
tAction.Delay = 200;
tAction.EffectFlags = EffectFlags.SpecialRangeHit;
cap.Add(tAction);
// Damage
var damage = this.GetDamage(attacker, skill);
// Elements
damage *= this.GetElementalDamageMultiplier(attacker, target);
// Critical Hit
var critChance = attacker.GetTotalCritChance(target.Protection, true);
CriticalHit.Handle(attacker, critChance, ref damage, tAction);
// Reduce damage
SkillHelper.HandleMagicDefenseProtection(target, ref damage);
SkillHelper.HandleConditions(attacker, target, ref damage);
ManaShield.Handle(target, ref damage, tAction);
ManaDeflector.Handle(attacker, target, ref damage, tAction);
// Deal damage
if (damage > 0)
target.TakeDamage(tAction.Damage = damage, attacker);
target.Aggro(attacker);
// Knockback
target.Stability = Creature.MinStability;
target.GetShoved(fireballProp, KnockbackDistance);
if (target.IsDead)
tAction.Set(TargetOptions.FinishingKnockDown);
this.Train(skill, tAction);
}
cap.Handle();
}