I noticed my mass dispel spell is not removing in area the fieldspells such as firefield,energy,poison,wall of stone, etc, i checked DispelField spell, theres an attribute called DispellableField, was going to try something like :



Code:
 foreach (Item item in targets)
                    {
                        Type t = item.GetType();
                     
                    if (!t.IsDefined( typeof( DispellableFieldAttribute ), true ) )
                        item.Delete();
                    }

This is the error im getting


Errors:
+ Spells/Seventh/MassDispel.cs:
CS0030: Line 73: Cannot convert type 'Server.Mobile' to 'Server.Item'



Also tried:


Code:
 foreach (Mobile m in targets)
                {
                    Type t = item.GetType();
                        if (Mobile is t)   
                    if (!t.IsDefined( typeof( DispellableFieldAttribute ), true ) )
                        item.Delete();
MassDispel.cs:

Code:
using System.Collections.Generic;
using Server.Items;
using Server.Mobiles;
using Server.Targeting;
using System;
using Server.Misc;

namespace Server.Spells.Seventh
{
    public class MassDispelSpell : MagerySpell
    {
        public override SpellCircle Circle { get { return SpellCircle.Seventh; } }
        public override int Sound { get { return 521; } }
      
        private static readonly SpellInfo m_Info = new SpellInfo(
                "Mass Dispel", "Vas An Ort",
                212,
                9002,
                Reagent.Garlic,
                Reagent.MandrakeRoot,
                Reagent.BlackPearl,
                Reagent.SulfurousAsh
            );

        public MassDispelSpell( Mobile caster, Item scroll ) : base( caster, scroll, m_Info )
        {
        }

        public override void OnPlayerCast()
        {
            if (SphereSpellTarget is IPoint3D)
                Target((IPoint3D)SphereSpellTarget);
            else
                DoFizzle();
        }

        public override void OnCast()
        {
            Caster.Target = new InternalTarget( this );
        }

        public void Target( IPoint3D p )
        {
            if ( !Caster.CanSee( p ) )
            {
                Caster.SendLocalizedMessage( 500237 ); // Target can not be seen.
            }
            else if (SphereSpellTarget is BaseWand)
            {
                BaseWand bw = SphereSpellTarget as BaseWand;
                bw.RechargeWand(Caster, this);
            }
            else if (CheckSequence())
            {
                SpellHelper.GetSurfaceTop(ref p);

                List<Mobile> targets = new List<Mobile>();

                Map map = Caster.Map;

                if (map != null)
                {
                    IPooledEnumerable eable = map.GetMobilesInRange(new Point3D(p), 8);

                    foreach (Mobile m in eable)
                    {
                        targets.Add(m);
                    }

                    eable.Free();
                 
              
                 foreach (Item item in targets)
                    {
                        Type t = item.GetType();
                      
                    if (!t.IsDefined( typeof( DispellableFieldAttribute ), true ) )
                        item.Delete();
                    }

                foreach (Mobile m in targets)
                {
                  
                    if (m is BaseCreature)
                        Spells.Sixth.DispelSpell.RemoveAllEffects((BaseCreature)m, Caster);
                    else
                        Spells.Sixth.DispelSpell.RemoveAllEffects(m, Caster);
                }
            }

            Caster.PlaySound(Sound);
            FinishSequence();
        }
            }
      

        private class InternalTarget : Target
        {
            private readonly MassDispelSpell m_Owner;

            public InternalTarget( MassDispelSpell owner ) : base( 12, true, TargetFlags.None )
            {
                m_Owner = owner;
            }

            protected override void OnTarget( Mobile from, object o )
            {
                IPoint3D p = o as IPoint3D;

                if ( p != null )
                    m_Owner.Target( p );
            }

            protected override void OnTargetFinish( Mobile from )
            {
                m_Owner.FinishSequence();
            }
        }
    }
}
 
Last edited:
Didnt test it so I cant vouch for it
Code:
Type t;
foreach (object targ in targets)
{
	if (targ == null || targ is Mobile)
		continue;
	t = targ.GetType();
	if (!t.IsDefined( typeof( DispellableFieldAttribute ), true ) )
		(targ as Item).Delete();
}
 
Thank you pyro, unfortunately is not working, no errors thought, fields doesnt get dispelled

Maybe using itemid?

Code:
  public void Target( IPoint3D p )
        {
            if ( !Caster.CanSee( p ) )
            {
                Caster.SendLocalizedMessage( 500237 ); // Target can not be seen.
            }
            else if (SphereSpellTarget is BaseWand)
            {
                BaseWand bw = SphereSpellTarget as BaseWand;
                bw.RechargeWand(Caster, this);
            }
            else if (CheckSequence())
            {
                SpellHelper.GetSurfaceTop(ref p);

                List<Mobile> targets = new List<Mobile>();

                Map map = Caster.Map;

                if (map != null)
                {
                    IPooledEnumerable eable = map.GetMobilesInRange(new Point3D(p), 8);

                    foreach (Mobile m in eable)
                    {
                        targets.Add(m);
                    }

  if (map != null)
           {
			   foreach (object targ in targets)
{
         
                foreach (Item i in eable)
               {
                    if (i.ItemID == 0x80); //Stonewall
                       (targ as Item).Delete();
                    if (i.ItemID == 0xF6C); //Gate
                        (targ as Item).Delete();
                    if (i.ItemID >= 14695 && i.ItemID <= 14730); //Paralyze field
                      (targ as Item).Delete();

                    eable.Free();
                 
                foreach (Mobile m in targets)
                {
               //  if (m.MagicDamageAbsorb > 0)
              //  m.MagicDamageAbsorb = 0;
                    if (m is BaseCreature)
                        Spells.Sixth.DispelSpell.RemoveAllEffects((BaseCreature)m, Caster);
                    else
				if (m.MagicDamageAbsorb > 0)
                m.MagicDamageAbsorb = 0;
			   m.LightLevel = 0;
                        Spells.Sixth.DispelSpell.RemoveAllEffects(m, Caster);
                }
            }

            Caster.PlaySound(Sound);
            FinishSequence();
        }
            }
			}
		}
		}

What a mess it crashed the server :p

Exception:
System.ObjectDisposedException: GetEnumerator() called after Free()
Object name: 'PooledEnumerable'.
at Server.Map.PooledEnumerable.GetEnumerator()
at Server.Spells.Seventh.MassDispelSpell.Target(IPoint3D p)
at Server.Spells.Spell.CastTimer.OnTick()
at Server.Timer.Slice()
at Server.Core.Main(String[] args)
 
Last edited:
Replace your part of the else if(CheckSequence()) with that one. I couldnt test it directly with yours (I mean I probably can but my version seems to be way different)

Anyway this worked on my end just fine :)

Code:
else if (CheckSequence())
{
    SpellHelper.GetSurfaceTop(ref p);

    List<Mobile> targets = new List<Mobile>();
    List<Item> fields = new List<Item>();

    Map map = Caster.Map;

    if (map != null)
    {
        IPooledEnumerable eable = map.GetMobilesInRange(new Point3D(p), 8);

        foreach (Mobile m in eable)
        {
            targets.Add(m);
        }

        eable.Free();

        eable = map.GetItemsInRange(new Point3D(p), 4);
        foreach (Item i in eable)
            if (i.GetType().IsDefined(typeof(DispellableFieldAttribute), false))
                fields.Add(i);
        eable.Free();
    }

    foreach (Item targ in fields)
    {
        if (targ == null)
            continue;
        Effects.SendLocationParticles(EffectItem.Create(targ.Location, targ.Map, EffectItem.DefaultDuration), 0x376A, 9, 20, 5042);
        Effects.PlaySound(targ.GetWorldLocation(), targ.Map, 0x201);
        targ.Delete();
    }

    foreach (Mobile m in targets)
    {
        if (m is BaseCreature)
            Spells.Sixth.DispelSpell.RemoveAllEffects((BaseCreature)m, Caster);
        else
            Spells.Sixth.DispelSpell.RemoveAllEffects(m, Caster);
    }

    Caster.PlaySound(Sound);
    FinishSequence();
}
 
Back