public async Task OnTargetAsync(ITargetResponse <IPoint3D> response) { if (!response.HasValue) { return; } var point = SpellHelper.GetSurfaceTop(response.Target); var power = 2.0; Caster.FireHook(h => h.OnModifyWithMagicEfficiency(Caster, ref power)); var seconds = Caster.Skills[SkillName.Magery].Value / 5.0 + 20.0; Caster.FireHook(h => h.OnModifyWithMagicEfficiency(Caster, ref seconds)); var duration = TimeSpan.FromSeconds(seconds); Effects.PlaySound(point, Caster.Map, 0x20B); var itemIds = (ewItemId : 0x3946, nsItemId : 0x3956); FieldItem.CreateField( itemIds, point, Caster, duration, TimeSpan.FromSeconds(1.0), onCreate: item => { Effects.SendLocationParticles( EffectItem.Create(item.Location, Caster.Map, EffectItem.DefaultDuration), 0x376A, 9, 10, 5051 ); }, onTick: item => { var eastToWest = item.ItemID == itemIds.ewItemId; var eable = Caster.Map.GetMobilesInBounds( // Makes a 1x3 hitbox that extends 1 square either side of the field new Rectangle2D( item.X - (eastToWest ? 0 : 1), item.Y - (eastToWest ? 1 : 0), eastToWest ? 1 : 3, eastToWest ? 3 : 1 ) ); foreach (var mobile in eable) { if (mobile.Z + 16 > item.Z && item.Z + 12 > mobile.Z && SpellHelper.ValidIndirectTarget(Caster, mobile) && Caster.CanBeHarmful(mobile, false) ) { DealDamage(Caster, mobile, power); } } eable.Free(); }, onMoveOver: mobile => { DealDamage(Caster, mobile, power); return(null); } ); }