The skill always fails, it works when i target a weak monster like skeleton.

Heres the discordanc script, the problem is the difficult i guess, oh and i would like to decrease they hitmaxseed/hits, not the str/int/dex

(My dragons are not bard immune)

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

namespace Server.SkillHandlers
{
    public class Discordance
    {
        public static void Initialize()
        {
            SkillInfo.Table[(int)SkillName.Discordance].Callback = OnUse;
        }

        public static TimeSpan OnUse( Mobile m )
        {
            if (m.BeginAction(typeof(IAction)))
            {
                m.RevealingAction();
                BaseInstrument.PickInstrument(m, OnPickedInstrument);
            }
            else
                m.SendAsciiMessage("You must wait to perform another action.");

            return TimeSpan.FromSeconds( 1.0 ); // Cannot use another skill for 1 second
        }

        public static void OnPickedInstrument( Mobile from, BaseInstrument instrument )
        {
            from.RevealingAction();
            from.SendLocalizedMessage( 1049541 ); // Choose the target for your song of discordance.
            from.Target = new DiscordanceTarget( from, instrument );
        }

        private class DiscordanceInfo
        {
            public readonly Mobile m_From;
            public readonly Mobile m_Creature;
            public readonly DateTime m_EndTime;
            public Timer m_Timer;
            public readonly int m_Effect;
            public readonly ArrayList m_Mods;

            public DiscordanceInfo( Mobile from, Mobile creature, TimeSpan duration, int effect, ArrayList mods )
            {
                m_From = from;
                m_Creature = creature;
                m_EndTime = DateTime.Now + duration;
                m_Effect = effect;
                m_Mods = mods;

                Apply();
            }

            public void Apply()
            {
                for ( int i = 0; i < m_Mods.Count; ++i )
                {
                    object mod = m_Mods[i];

                    if ( mod is ResistanceMod )
                        m_Creature.AddResistanceMod( (ResistanceMod) mod );
                    else if ( mod is StatMod )
                        m_Creature.AddStatMod( (StatMod) mod );
                    else if ( mod is SkillMod )
                        m_Creature.AddSkillMod( (SkillMod) mod );
                }
            }

            public void Clear()
            {
                for ( int i = 0; i < m_Mods.Count; ++i )
                {
                    object mod = m_Mods[i];

                    if ( mod is ResistanceMod )
                        m_Creature.RemoveResistanceMod( (ResistanceMod) mod );
                    else if ( mod is StatMod )
                        m_Creature.RemoveStatMod( ((StatMod) mod).Name );
                    else if ( mod is SkillMod )
                        m_Creature.RemoveSkillMod( (SkillMod) mod );
                }
            }
        }

        private static readonly Hashtable m_Table = new Hashtable();

        public static bool GetEffect( Mobile targ, ref int effect )
        {
            DiscordanceInfo info = m_Table[targ] as DiscordanceInfo;

            if ( info == null )
                return false;

            effect = info.m_Effect;
            return true;
        }

        private static void ProcessDiscordance( object state )
        {
            DiscordanceInfo info = (DiscordanceInfo)state;
            Mobile from = info.m_From;
            Mobile targ = info.m_Creature;

            if ( DateTime.Now >= info.m_EndTime || targ.Deleted || from.Map != targ.Map || targ.GetDistanceToSqrt( from ) > 16 )
            {
                if ( info.m_Timer != null )
                    info.m_Timer.Stop();

                info.Clear();
                m_Table.Remove( targ );
            }
            else
            {
                targ.FixedEffect( 0x376A, 1, 32 );
            }
        }

        public class DiscordanceTarget : Target, IAction
        {
            private readonly BaseInstrument m_Instrument;

            public DiscordanceTarget( Mobile from, BaseInstrument inst ) : base( BaseInstrument.GetBardRange( from, SkillName.Discordance ), false, TargetFlags.Harmful )
            {
                m_Instrument = inst;

                if (from is PlayerMobile)
                    ((PlayerMobile)from).ResetPlayerAction(this);
            }

            protected override void OnTarget( Mobile from, object target )
            {
                bool releaseLock = true;

                from.RevealingAction();

                if ( !m_Instrument.IsChildOf( from.Backpack ) )
                {
                    from.SendLocalizedMessage( 1062488 ); // The instrument you are trying to play is no longer in your backpack!
                }
                else if ( target is Mobile )
                {
                    Mobile targ = (Mobile)target;

                    if ( targ == from || (targ is BaseCreature && ( ((BaseCreature)targ).BardImmune || !from.CanBeHarmful( targ, false ) )) )
                    {
                        from.SendLocalizedMessage( 1049535 ); // A song of discord would have no effect on that.
                    }
                    else if ( !targ.Player )
                    {
                        TimeSpan len = TimeSpan.FromSeconds( from.Skills[SkillName.Discordance].Value * 2 );
                        double diff = m_Instrument.GetDifficultyFor( targ ) - 10.0;
                        double music = from.Skills[SkillName.Musicianship].Value;

                        if ( music > 100.0 )
                            diff -= (music - 100.0) * 0.5;

                        if ( !BaseInstrument.CheckMusicianship( from ) )
                        {
                            from.SendLocalizedMessage( 500612 ); // You play poorly, and there is no effect.
                            m_Instrument.PlayInstrumentBadly( from );
                            m_Instrument.ConsumeUse( from );
                        }
                        else if ( from.CheckTargetSkill( SkillName.Discordance, target, diff-25.0, diff+25.0 ) )
                        {
                            if ( !m_Table.Contains( targ ) )
                            {
                                from.SendLocalizedMessage( 1049539 ); // You play the song surpressing your targets strength
                                m_Instrument.PlayInstrumentWell( from );
                                m_Instrument.ConsumeUse( from );

                                ArrayList mods = new ArrayList();
                                int effect;
                                double scalar;

                                if ( Core.AOS )
                                {
                                    double discord = from.Skills[SkillName.Discordance].Value;

                                    if ( discord > 100.0 )
                                        effect = -20 + (int)((discord - 100.0) / -2.5);
                                    else
                                        effect = (int)(discord / -5.0);

                                    if ( Core.SE && BaseInstrument.GetBaseDifficulty( targ ) >= 160.0 )
                                        effect /= 2;

                                    scalar = effect * 0.01;

                                    mods.Add( new ResistanceMod( ResistanceType.Physical, effect ) );
                                    mods.Add( new ResistanceMod( ResistanceType.Fire, effect ) );
                                    mods.Add( new ResistanceMod( ResistanceType.Cold, effect ) );
                                    mods.Add( new ResistanceMod( ResistanceType.Poison, effect ) );
                                    mods.Add( new ResistanceMod( ResistanceType.Energy, effect ) );

                                    for ( int i = 0; i < targ.Skills.Length; ++i )
                                    {
                                        if ( targ.Skills[i].Value > 0 )
                                            mods.Add( new DefaultSkillMod( (SkillName)i, true, targ.Skills[i].Value * scalar ) );
                                    }
                                }
                                else
                                {
                                    effect = (int)( from.Skills[SkillName.Discordance].Value / -5.0 );
                                    scalar = effect * 0.01;

                                    mods.Add( new StatMod( StatType.Str, "DiscordanceStr", (int)(targ.RawStr * scalar), TimeSpan.Zero ) );
                                    mods.Add( new StatMod( StatType.Int, "DiscordanceInt", (int)(targ.RawInt * scalar), TimeSpan.Zero ) );
                                    mods.Add( new StatMod( StatType.Dex, "DiscordanceDex", (int)(targ.RawDex * scalar), TimeSpan.Zero ) );

                                    for ( int i = 0; i < targ.Skills.Length; ++i )
                                    {
                                        if ( targ.Skills[i].Value > 0 )
                                            mods.Add( new DefaultSkillMod( (SkillName)i, true, targ.Skills[i].Value * scalar ) );
                                    }
                                }

                                DiscordanceInfo info = new DiscordanceInfo( from, targ, len, Math.Abs( effect ), mods );
                                info.m_Timer = Timer.DelayCall( TimeSpan.Zero, TimeSpan.FromSeconds( 1.25 ), new TimerStateCallback( ProcessDiscordance ), info );

                                m_Table[targ] = info;
                            }
                            else
                            {
                                from.SendLocalizedMessage( 1049537 );// Your target is already in discord.
                            }
                        }
                        else
                        {
                            from.SendLocalizedMessage( 1049540 );// You fail to disrupt your target
                            m_Instrument.PlayInstrumentBadly( from );
                            m_Instrument.ConsumeUse( from );
                        }
                    }
                    else
                    {
                        m_Instrument.PlayInstrumentBadly( from );
                    }
                }
                else
                {
                    from.SendLocalizedMessage( 1049535 ); // A song of discord would have no effect on that.
                }

                if (releaseLock && from is PlayerMobile)
                    ((PlayerMobile)from).EndPlayerAction();
            }

            #region TargetFailed

            protected override void OnCantSeeTarget(Mobile from, object targeted)
            {
                if (from is PlayerMobile)
                    ((PlayerMobile)from).EndPlayerAction();
                else
                    from.EndAction(typeof(IAction));

                base.OnCantSeeTarget(from, targeted);
            }

            protected override void OnTargetDeleted(Mobile from, object targeted)
            {
                if (from is PlayerMobile)
                    ((PlayerMobile)from).EndPlayerAction();
                else
                    from.EndAction(typeof(IAction));

                base.OnTargetDeleted(from, targeted);
            }

            protected override void OnTargetUntargetable(Mobile from, object targeted)
            {
                if (from is PlayerMobile)
                    ((PlayerMobile)from).EndPlayerAction();
                else
                    from.EndAction(typeof(IAction));

                base.OnTargetUntargetable(from, targeted);
            }

            protected override void OnNonlocalTarget(Mobile from, object targeted)
            {
                if (from is PlayerMobile)
                    ((PlayerMobile)from).EndPlayerAction();
                else
                    from.EndAction(typeof(IAction));

                base.OnNonlocalTarget(from, targeted);
            }

            protected override void OnTargetInSecureTrade(Mobile from, object targeted)
            {
                if (from is PlayerMobile)
                    ((PlayerMobile)from).EndPlayerAction();
                else
                    from.EndAction(typeof(IAction));

                base.OnTargetInSecureTrade(from, targeted);
            }

            protected override void OnTargetNotAccessible(Mobile from, object targeted)
            {
                if (from is PlayerMobile)
                    ((PlayerMobile)from).EndPlayerAction();
                else
                    from.EndAction(typeof(IAction));

                base.OnTargetNotAccessible(from, targeted);
            }

            protected override void OnTargetOutOfLOS(Mobile from, object targeted)
            {
                if (from is PlayerMobile)
                    ((PlayerMobile)from).EndPlayerAction();
                else
                    from.EndAction(typeof(IAction));

                base.OnTargetOutOfLOS(from, targeted);
            }

            protected override void OnTargetOutOfRange(Mobile from, object targeted)
            {
                if (from is PlayerMobile)
                    ((PlayerMobile)from).EndPlayerAction();
                else
                    from.EndAction(typeof(IAction));

                base.OnTargetOutOfRange(from, targeted);
            }

            protected override void OnTargetCancel(Mobile from, TargetCancelType cancelType)
            {
                if (from is PlayerMobile)
                    ((PlayerMobile)from).EndPlayerAction();
                else
                    from.EndAction(typeof(IAction));

                base.OnTargetCancel(from, cancelType);
            }

            #endregion

            #region IAction Members

            public void AbortAction(Mobile from)
            {
            }

            #endregion
        }
    }
}

Thanks
 
Back