Wanderer

Member
I have used the following script on Djeryv's Odyssey and it works with no issue. Is it possible that a similar script will play a game music file?

C#:
using System;
using Server;
using Server.Mobiles;
using System.Collections;
using Server.Gumps;

namespace Server.Items
{
    public class Sounder : Item
    {
        private bool m_Active = false; // default starting settings
        private string m_Desc = null;
        private int m_Range = 10;
        private bool m_Random = true;
        private double m_Chance = 1;
        private int m_MinPause = 10;
        private int m_MaxPause = 20;
        private string m_Creature = null;
        private int m_CreatureRange = 6;
        private bool m_CreaturePlays = false;

        private DateTime m_NextPlay;
        private int m_lastIndex;
        private int m_validCount;

        private int[] m_Sounds = new int[10];

        [CommandProperty( AccessLevel.GameMaster )]
        public bool Active
        {
            get { return m_Active; }
            set { m_Active = value; InvalidateProperties(); }
        }

        [CommandProperty( AccessLevel.GameMaster )]
        public String Description
        {
            get { return m_Desc; }
            set { m_Desc = value; InvalidateProperties(); }
        }

        [CommandProperty( AccessLevel.GameMaster )]
        public int PlayerRange
        {
            get { return m_Range; }
            set
            {
                if ( value < 0 )
                    m_Range = 0;
                else if ( value > 20 )
                    m_Range = 20;
                else
                    m_Range = value;
            }
        }

        [CommandProperty( AccessLevel.GameMaster )]
        public bool Random
        {
            get { return m_Random; }
            set { m_Random = value; }
        }

        [CommandProperty( AccessLevel.GameMaster )]
        public int Chance
        {
            get { return (int)( m_Chance * 100 ); }
            set
            {
                int num = value;

                if ( num > 100 )
                    num = 100;
                else if ( num < 1 )
                {
                    m_Chance = 0;
                    m_Active = false;
                    return;
                }

                m_Chance = (double)num / 100 ;
            }
        }

        [CommandProperty( AccessLevel.GameMaster )]
        public int MinPause
        {
            get { return m_MinPause; }
            set
            {
                if ( value > m_MaxPause )
                    m_MinPause = m_MaxPause;
                else
                    m_MinPause = value;
            }
        }

        [CommandProperty( AccessLevel.GameMaster )]
        public int MaxPause
        {
            get { return m_MaxPause; }
            set
            {
                if ( value < m_MinPause )
                    m_MaxPause = m_MinPause;
                else
                    m_MaxPause = value;
            }
        }

        [CommandProperty( AccessLevel.GameMaster )]
        public String Creature
        {
            get { return m_Creature; }
            set
            {
                string str = value;

                if ( str != null )
                {
                    str = str.ToLower();
                    str = str.Trim();

                    Type type = SpawnerType.GetType( str );

                    if ( type != null )
                        m_Creature = str;
                    else
                        m_Creature = null;
                }
                else
                    m_Creature = null;
            }
        }

        [CommandProperty( AccessLevel.GameMaster )]
        public int CreatureRange
        {
            get { return m_CreatureRange; }
            set
            {
                if ( value < 0 )
                    m_CreatureRange = 0;
                else if ( value > 20 )
                    m_CreatureRange = 20;
                else
                    m_CreatureRange = value;
            }
        }

        [CommandProperty( AccessLevel.GameMaster )]
        public bool CreaturePlaysSnd
        {
            get { return m_CreaturePlays; }
            set { m_CreaturePlays = value; }
        }

        public int[] Sounds
        {
            get { return m_Sounds; }
            set
            {
                m_Sounds = Compact( value );

                m_validCount = 0;
                for ( int i = 0;  i < 10; i++ )
                {
                    if ( m_Sounds[i] != -1 )
                        m_validCount++;
                }

                if ( m_validCount == 0 )
                    m_Active = false;

                m_lastIndex = m_validCount - 1;
            }
        }

        static int[] Compact( int[] array )
        {
            int cnt;
            bool swapped = true;

            cnt = array.Length;
            if ( cnt > 1 )
            {
                int tmp;
                while ( swapped )
                {
                    swapped = false;

                    for ( int i = 0;  i < (cnt - 1); i++ )
                    {
                        if ( array[i] == -1 && array[i + 1] != -1 )
                        {
                            //Console.WriteLine( "Swapping {0},{1} at {2}", array[i], array[i + 1], i );

                            tmp = array[i + 1];
                            array[i + 1] = array[i];
                            array[i] = tmp;

                            swapped = true;
                        }
                    }
                }
            }

            return array;
        }

        [Constructable]
        public Sounder() : base( 0x13A8 )
        {
            Visible = false;
            Name = "Sound Maker";
            m_NextPlay = DateTime.Now;

            for ( int i = 0;  i < 10; i++ )
                m_Sounds[i] = -1;

            InvalidateProperties();
        }

        public override bool HandlesOnMovement{ get{ return true; } }
        public override void OnMovement( Mobile m, Point3D oldLocation )
        {                                                   
            if( m_Active && m.Player && !m.Hidden && DateTime.Now > m_NextPlay && m.InRange( this, m_Range ) )
            {
                if ( Utility.RandomDouble() < m_Chance )
                {               
                    // Test for Creature...
                    if ( m_Creature != null )
                    {
                        try
                        {
                            foreach ( Mobile creature in GetMobilesInRange( m_CreatureRange ) )
                            {
                                if ( Insensitive.Equals( m_Creature, creature.GetType().Name ) )
                                {
                                    m_NextPlay = (DateTime.Now).AddSeconds( Utility.RandomMinMax( m_MinPause, m_MaxPause ) );

                                    if ( m_CreaturePlays && creature.Alive )
                                        Effects.PlaySound( creature.Location, creature.Map, GetNextSound() );
                                    else
                                        Effects.PlaySound( this.Location, this.Map, GetNextSound() );

                                    return;
                                }
                            }
                        }
                        catch
                        {
                            Console.WriteLine( String.Format( "Exception caught in Sounder at {0},(1),{2) while checking for {3}.", X, Y, Z, m_Creature ) );
                        }
                    }
                    else
                    {
                        m_NextPlay = (DateTime.Now).AddSeconds( Utility.RandomMinMax( m_MinPause, m_MaxPause ) );
                        Effects.PlaySound( Location, Map, GetNextSound() );
                    }
                }
            }
        }

        private int GetNextSound()
        {
            if ( m_Random )
            {
                return m_Sounds[Utility.Random( m_validCount )];
            }
            else
            {
                if ( ++m_lastIndex >= m_validCount )
                    m_lastIndex = 0;

                return m_Sounds[m_lastIndex];
            }
        }

        public override void GetProperties( ObjectPropertyList list )
        {
            base.GetProperties( list );

            list.Add( this.Name );

            if ( m_Active )
                list.Add( 1060742 ); // active
            else
                list.Add( 1060743 ); // inactive

            if ( m_Desc != null && m_Desc.Length > 0 )
                list.Add( 1042971, m_Desc );
        }

        public override void OnSingleClick( Mobile from )
        {
            base.OnSingleClick( from );

            if ( m_Active )
            {
                LabelTo( from, m_Desc );
            }
            else
            {
                LabelTo( from, "(inactive)" );
            }
        }

        public override void OnDoubleClick( Mobile from )
        {
            if ( from.AccessLevel < AccessLevel.GameMaster )
                return;

            SounderGump g = new SounderGump( from, this );
            from.SendGump( g );
        }

        public Sounder( Serial serial ) : base( serial )
        {
            m_NextPlay = DateTime.Now;
        }

        public override void Serialize( GenericWriter writer )
        {
            base.Serialize( writer );

            writer.Write( (int) 1 ); // version

            writer.Write( m_CreaturePlays );

            writer.Write( m_Active );
            writer.Write( m_Desc );
            writer.Write( m_Range );
            writer.Write( m_Random );
            writer.Write( m_Chance );
            writer.Write( m_MinPause );
            writer.Write( m_MaxPause );
            writer.Write( m_Creature );
            writer.Write( m_CreatureRange );
            
            for ( int i = 0; i < m_Sounds.Length; ++i )
                writer.Write( m_Sounds[i] );
        }

        public override void Deserialize( GenericReader reader )
        {
            base.Deserialize( reader );

            int version = reader.ReadInt();

            switch ( version )
            {
                case 1:
                {
                    m_CreaturePlays = reader.ReadBool();
                    goto case 0;
                }
                case 0:
                {
                    m_Active = reader.ReadBool();
                    m_Desc = reader.ReadString();
                    m_Range = reader.ReadInt();
                    m_Random = reader.ReadBool();
                    m_Chance = reader.ReadDouble();
                    m_MinPause = reader.ReadInt();
                    m_MaxPause = reader.ReadInt();
                    m_Creature = reader.ReadString();
                    m_CreatureRange = reader.ReadInt();

                    for ( int i = 0; i < m_Sounds.Length; ++i )
                        m_Sounds[i] = reader.ReadInt();
                    this.Sounds = m_Sounds; // required for initialization on World Load

                    break;
                }
            }
        }
    }
}
 

Active Shards

Donations

Total amount
$50.00
Goal
$1,000.00
Back