public static void MeteorFallDamage_Callback(object state)
        {
            //Point3D loc = (Point3D)state;

            object[]         states = ((object[])state);
            TeiravonMobile   ag     = states[0] as TeiravonMobile;
            Point3D          loc    = ((Point3D)states[1]);
            int              damage = ((int)states[2]);
            Element          e      = ((Element)states[3]);
            MeteorSwarmSpell s      = ((MeteorSwarmSpell)states[4]);

            if (ag == null || !ag.Alive || ag.Map == Map.Internal)
            {
                return;
            }

            ArrayList targets = new ArrayList();
            int       x       = 2;

            if (e == Element.Fire)
            {
                x = 3;
            }
            else if (e == Element.Air)
            {
                x = 3;
            }

            IPooledEnumerable eable = ag.Map.GetMobilesInRange(loc, x);

            foreach (Mobile m in eable)
            {
                if (m.AccessLevel > ag.AccessLevel || m.Blessed || m == null || m.Map == Map.Internal || m.Map == null || !m.Alive || m == ag || !ag.CanBeHarmful(m, false) || !SpellHelper.ValidIndirectTarget(ag, m))
                {
                    return;
                }

                targets.Add(m);
            }
            eable.Free();

            switch (e)
            {
            case Element.Air:
            {
                for (int i = 0; i < targets.Count; ++i)
                {
                    Mobile from = (Mobile)targets[i];
                    AOS.Damage(from, ag, s.GetDamage(e, from.Player), 0, 0, 50, 0, 50);
                }
            }
            break;

            case Element.Earth:
            {
                for (int i = 0; i < targets.Count; ++i)
                {
                    Mobile from = (Mobile)targets[i];
                    AOS.Damage(from, ag, s.GetDamage(e, from.Player), 100, 0, 0, 0, 0);
                }
            }
            break;

            case Element.Fire:
            {
                for (int i = 0; i < targets.Count; ++i)
                {
                    Mobile from = (Mobile)targets[i];
                    AOS.Damage(from, ag, s.GetDamage(e, from.Player), 0, 100, 0, 0, 0);
                }
            }
            break;

            case Element.Water:
            {
                for (int i = 0; i < targets.Count; ++i)
                {
                    Mobile from = (Mobile)targets[i];
                    if (.1 > Utility.RandomDouble())
                    {
                        AOS.Damage(from, ag, (int)(s.GetDamage(e, from.Player) * 4.5), 0, 0, 0, 0, 100);
                        Effects.SendBoltEffect(from);
                    }
                    else
                    {
                        AOS.Damage(from, ag, s.GetDamage(e, from.Player), 0, 0, 100, 0, 0);
                        Effects.SendLocationEffect(from.Location, from.Map, 2323, 10, 1, 3);
                    }
                }
            }
            break;
            }
        }