public void Explode(Mobile from, bool direct, Point3D loc, Map map)
        {
            if (Deleted)
            {
                return;
            }

            Consume();

            for (int i = 0; m_Users != null && i < m_Users.Count; ++i)
            {
                Mobile      m    = (Mobile)m_Users[i];
                ThrowTarget targ = m.Target as ThrowTarget;

                if (targ != null && targ.Potion == this)
                {
                    Target.Cancel(m);
                }
            }

            if (map == null)
            {
                return;
            }

            Effects.PlaySound(loc, map, 0x542);                         // Yikes

            Effects.SendLocationEffect(loc, map, 0x3709, 9, 10, 23, 0); // Flamestrike

            Effects.SendLocationEffect(loc, map, 0x374A, 9, 10, 23, 0); // Mana Vampire

            Effects.SendLocationEffect(loc, map, 0x36D4, 9, 10, 23, 0); // Meteor Swarm

            Effects.SendLocationEffect(loc, map, 0x379F, 9, 10, 23, 0); // Energy Bolt

            Effects.SendLocationEffect(loc, map, 0x36BD, 9, 10, 23, 0); // Explosion

            Effects.SendLocationEffect(loc, map, 0x375A, 9, 10, 23, 0); // Magic Reflect

            Effects.SendLocationEffect(loc, map, 0x37B9, 9, 10, 23, 0); // Greater Heal

            Effects.SendLocationEffect(loc, map, 0x376A, 9, 10, 23, 0); // Greater Heal

            Effects.SendLocationEffect(loc, map, 0x37C4, 9, 10, 23, 0); // Greater Heal

            int alchemyBonus = 0;

            if (direct)
            {
                alchemyBonus = (int)(from.Skills.Alchemy.Value / (Core.AOS ? 5 : 10));
            }

            IPooledEnumerable eable     = LeveledExplosion ? map.GetObjectsInRange(loc, ExplosionRange) : map.GetMobilesInRange(loc, ExplosionRange);
            ArrayList         toExplode = new ArrayList();

            int toDamage = 0;

            foreach (object o in eable)
            {
                if (o is Mobile && (from == null || (SpellHelper.ValidIndirectTarget(from, (Mobile)o) && from.CanBeHarmful((Mobile)o, false))))
                {
                    toExplode.Add(o);
                    ++toDamage;
                }
                else if (o is BaseLightningPotion && o != this)
                {
                    toExplode.Add(o);
                }
            }

            eable.Free();

            int min = Scale(from, MinDamage);
            int max = Scale(from, MaxDamage);

            for (int i = 0; i < toExplode.Count; ++i)
            {
                object o = toExplode[i];

                if (o is Mobile)
                {
                    Mobile m = (Mobile)o;

                    if (from != null)
                    {
                        from.DoHarmful(m);
                    }

                    int damage = Utility.RandomMinMax(min, max);

                    damage += alchemyBonus;

                    if (!Core.AOS && damage > 40)
                    {
                        damage = 40;
                    }
                    else if (Core.AOS && toDamage > 2)
                    {
                        damage /= toDamage - 1;
                    }

                    AOS.Damage(m, from, damage, 100, 0, 0, 0, 0);
                }
                else if (o is BaseUltimaPotion)
                {
                    BaseUltimaPotion pot = (BaseUltimaPotion)o;

                    pot.Explode(from, false, pot.GetWorldLocation(), pot.Map);
                }
            }
        }
 public ThrowTarget(BaseUltimaPotion potion) : base(12, true, TargetFlags.None)
 {
     m_Potion = potion;
 }