RunUO Community

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Sorious' PvpKit

stu

Wanderer
Since he is rather busy, Im going to go ahead and post this for folks. I had a problem on my shard where players could use an exploit to get themselves flagged "yellow" permanently. The following "unyellows" players...! Hats off to Sorious for taking the time to come to my shard, look at the problem and send me a fix!
Usage: When players are stuck yellow type [fixduels
Install: backup and replace onsitecore.cs
 

Attachments

  • OnSiteCore.cs
    39.4 KB · Views: 13

Jeff

Lord
stu said:
Since he is rather busy, Im going to go ahead and post this for folks. I had a problem on my shard where players could use an exploit to get themselves flagged "yellow" permanently. The following "unyellows" players...! Hats off to Sorious for taking the time to come to my shard, look at the problem and send me a fix!
Usage: When players are stuck yellow type [fixduels
Install: backup and replace onsitecore.cs
please keep in mind this is a temporary fix, until i can sit down and code a real one :)
 

stu

Wanderer
another one :(
Code:
Server Crash Report
===================

RunUO Version 1.0.0, Build 36918
Operating System: Microsoft Windows NT 5.2.3790.0
.NET Framework: 1.1.4322.2300
Time: 5/1/2006 3:59:27 AM
Mobiles: 21637
Items: 421734
Clients:
- Count: 21
clients removed
Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
   at Duel.EndDuel(Mobile loser) in c:\UOSERVER\RunUO 1.0\Scripts\Customs\Sorious' PvpKit\Duels\Onsite\OnSiteCore.cs:line 937
   at Server.Customs.OnSiteDueling.OnSiteCore.EventSink_PlayerDeath(PlayerDeathEventArgs e) in c:\UOSERVER\RunUO 1.0\Scripts\Customs\Sorious' PvpKit\Duels\Onsite\OnSiteCore.cs:line 382
   at Server.PlayerDeathEventHandler.Invoke(PlayerDeathEventArgs e)
   at Server.Mobile.OnDeath(Container c)
   at Server.Mobiles.PlayerMobile.OnDeath(Container c) in c:\UOSERVER\RunUO 1.0\Scripts\Mobiles\playermobile.cs:line 1757
   at Server.Mobile.Kill()
   at Server.Mobile.Damage(Int32 amount, Mobile from)
   at Server.Mobiles.PlayerMobile.Damage(Int32 amount, Mobile from) in c:\UOSERVER\RunUO 1.0\Scripts\Mobiles\playermobile.cs:line 2042
   at Server.AOS.Damage(Mobile m, Mobile from, Int32 damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy, Boolean keepAlive) in c:\UOSERVER\RunUO 1.0\Scripts\Misc\AOS.cs:line 69
   at Server.AOS.Damage(Mobile m, Mobile from, Int32 damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy) in c:\UOSERVER\RunUO 1.0\Scripts\Misc\AOS.cs:line 56
   at Server.Spells.SpellHelper.Damage(TimeSpan delay, Mobile target, Mobile from, Double damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy, DFAlgorithm dfa) in c:\UOSERVER\RunUO 1.0\Scripts\Spells\Base\SpellHelper.cs:line 826
   at Server.Spells.SpellHelper.Damage(TimeSpan delay, Mobile target, Mobile from, Double damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy) in c:\UOSERVER\RunUO 1.0\Scripts\Spells\Base\SpellHelper.cs:line 809
   at Server.Spells.SpellHelper.Damage(Spell spell, Mobile target, Double damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy) in c:\UOSERVER\RunUO 1.0\Scripts\Spells\Base\SpellHelper.cs:line 792
   at Server.Spells.Fourth.LightningSpell.Target(Mobile m) in c:\UOSERVER\RunUO 1.0\Scripts\Spells\Fourth\Lightning.cs:line 63
   at Server.Spells.Fourth.InternalTarget.OnTarget(Mobile from, Object o) in c:\UOSERVER\RunUO 1.0\Scripts\Spells\Fourth\Lightning.cs:line 81
   at Server.Targeting.Target.Invoke(Mobile from, Object targeted)
   at Server.Network.PacketHandlers.TargetResponse(NetState state, PacketReader pvSrc)
   at Server.Network.MessagePump.HandleReceive(NetState ns)
   at Server.Network.MessagePump.Slice()
   at Server.Core.Main(String[] args)

my onsitecore:
Code:
using System;
using System.IO;
using System.Text;
using System.Collections;

using Server;
using Server.Items;
using Server.Mobiles;
using Server.Targets;
using Server.Targeting;
using Server.Network;
using Server.Gumps;
using Server.Factions;
using Server.Customs.OnSiteDueling.Gumps;
using Server.Customs.OnSiteDueling.Items;

namespace Server.Customs.OnSiteDueling
{
    public class OnSiteCore
    {

        public const bool Enabled = true;                                      //Enable/Disable the entire system
        private static int m_MaxDist = 30;                                      //Sets the max distance a player can run from another player without ending the duel.
        private static bool m_WorldBroadcastWins = true;                        //If true will broadcast the winner of each duel.
        private static bool m_KeepScore = true;                                 //Turn the score keeping system on/off;
        private static bool m_UseCommand = true;                                //Turn the command to duel on/off.
        private static string m_ChallengeString = "i challenge thee to a duel"; //String used to start a duel.
        private static string m_DuelCommand = "OnSiteDuel";                     //The command players can call to duel someone.
        private static string m_GetPointsString = "showpoints";                 //String used to get your duelpoints.
        private static Hashtable m_CurrentDuels;                                //This is the container for each duel in progress
        private static Hashtable m_PointsTable;                                 //Points tracker.
        private static string m_SavePath = Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves\\scores.bin" );//Save path.

        private static string m_Version = "2.0.1";
                
        public static string Version { get { return m_Version; } }
        public static Hashtable CurrentDuels { get { return m_CurrentDuels; } set { m_CurrentDuels = value; } }
        public static Hashtable PointsTable { get { return m_PointsTable; } set { m_PointsTable = value; } }

        public static void Initialize()
        {
            if( Enabled )
            {
                if( m_KeepScore )
                    m_PointsTable = new Hashtable();

                if( m_UseCommand )
                    Commands.Register( m_DuelCommand, AccessLevel.Player, new CommandEventHandler( OnSiteDuel_Command ) );//Command event.

                Commands.Register( "FixDuels", AccessLevel.Counselor, new CommandEventHandler( FixDuels_Command ) );//Command event.

                m_CurrentDuels = new Hashtable();

                Load();


                EventSink.Speech += new SpeechEventHandler( EventSink_Speech );
                EventSink.WorldSave += new WorldSaveEventHandler( EventSink_WorldSave );
                EventSink.Movement += new MovementEventHandler( EventSink_Movement );//Checks distance between players.
                EventSink.PlayerDeath += new PlayerDeathEventHandler( EventSink_PlayerDeath );//Checks each death to see if the player was in a duel.
            }
            
        }

        [Usage( "FixDuels" )]
        [Description( "Fixes Duels" )]
        private static void FixDuels_Command( CommandEventArgs args )
        {
            m_CurrentDuels.Clear();
        }

        [Usage( "OnSiteDuel" )]
        [Description( "Initiates a duel request with the targeted player." )]
        private static void OnSiteDuel_Command( CommandEventArgs args )
        {
            Mobile m = ( Mobile )args.Mobile;

            if( m == null )
                return;

            if( !CanDuel(m) )
                return;

            Duel duel = new Duel( m );
            m_CurrentDuels.Add( m.Serial, duel );
            
            m.CloseGump( typeof( DuelAcceptGump ) );
            m.CloseGump( typeof( DuelOptionsGump ) );
            m.SendGump( new DuelOptionsGump( duel ) );

        }

        public static bool CanDuel( Mobile m )
        {            
            if (m.Criminal)
            {
                m.SendMessage("You may not start a duel while flagged criminal.");
                return false;
            }
            else if( Spells.SpellHelper.CheckCombat( m ) )
            {
                m.SendMessage( "You cannot start a duel while in combat." );
                return false;
            }
            else if( m.HasGump( typeof( DuelOptionsGump ) ) )
            {
                m.SendMessage( "You are already initiating a duel." );
                return false;
            }
            else if( m.HasGump( typeof( DuelAcceptGump ) ) )
            {
                m.SendMessage( "You are already approving a duel." );
                return false;
            }
            else if( IsInDuel( m ) )
            {
                m.SendMessage( "You are currently in a duel." );
                return false;
            }
            else if( m.Target is SelectDueler )
            {
                m.SendMessage( "You are already starting a duel." );
                return false;
            }
            else if( Factions.Sigil.ExistsOn( m ) )
            {
                m.SendMessage( "You may not challenge someone while you have a faction sigil." );
                return false;
            }

            return true;
        }

        private static void EventSink_Speech( SpeechEventArgs e )
        {
            Mobile mobile = e.Mobile;

            if( e.Speech.ToLower().IndexOf( m_GetPointsString ) >= 0 )
            {
                if( mobile != null )
                {
                    if( PointsTable.ContainsKey( mobile.Serial ) )
                    {
                        DuelPoints dp = ( DuelPoints )PointsTable[mobile.Serial];
                        mobile.NonlocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "{0} Wins/{1} Loses", dp.Wins, dp.Losses ) );
                        mobile.LocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "{0} Wins/{1} Loses", dp.Wins, dp.Losses ) );
                    }
                    else
                    {
                        mobile.NonlocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "I have not duel yet" ) );
                        mobile.LocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "You have not duel yet" ) );
                    }
                }
            }

            if( e.Speech.ToLower().IndexOf( "bank" ) >= 0 )
            {
                if( IsInDuel( mobile ) )
                {
                    e.Handled = true;
                    return;
                }
            }
            
            if( e.Speech.ToLower().IndexOf( m_ChallengeString ) >= 0 )
            {
                Mobile m = mobile;
                PlayerMobile pm = ( PlayerMobile )m;

                if( m == null )
                    return;

                if( !CanDuel( m ) )
                    return;

                Duel duel = new Duel( m );
                m_CurrentDuels.Add( m.Serial, duel );

                m.CloseGump( typeof( DuelAcceptGump ) );
                m.CloseGump( typeof( DuelOptionsGump ) );
                m.SendGump( new DuelOptionsGump( duel ) );             
            }
        }

        private static void EventSink_WorldSave( WorldSaveEventArgs e )
        {
            if( m_KeepScore )
            {
                if( !Directory.Exists( Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves" ) ) )
                    Directory.CreateDirectory( Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves" ) );

                GenericWriter bin = new BinaryFileWriter( m_SavePath, true );

                try
                {
                    bin.Write( ( int )0 );//Versioning

                    ArrayList keyList = new ArrayList();
                    ArrayList valueList = new ArrayList();

                    IDictionaryEnumerator myEnum = m_PointsTable.GetEnumerator();

                    while( myEnum.MoveNext() )
                    {
                        keyList.Add( myEnum.Key );
                        valueList.Add( myEnum.Value );
                    }

                    int count = keyList.Count;

                    bin.Write( ( int )count );

                    for( int i = 0; i < count; i++ )
                    {
                        Serial key = ( Serial )keyList[i];
                        DuelPoints dp = ( DuelPoints )valueList[i];

                        bin.Write( ( int )key );
                        dp.Serialize( bin );
                    }
                }
                catch( Exception err )
                {
                    Console.WriteLine( err.ToString() );
                }
                finally
                {
                    bin.Close();
                }
            }
        }

        private static void Load()
        {
            if( m_KeepScore )
            {
                if( File.Exists( m_SavePath ) )
                {

                        using( FileStream fs = new FileStream( m_SavePath, FileMode.Open, FileAccess.Read, FileShare.Read ) )
                        {
                            try
                            {
                                BinaryReader br = new BinaryReader( fs );
                                BinaryFileReader reader = new BinaryFileReader( br );

                                int version = reader.ReadInt();

                                switch( version )
                                {
                                    case 0:
                                        {
                                            int count = reader.ReadInt();
                                            for( int i = 0; i < count; i++ )
                                            {
                                                DuelPoints dp = new DuelPoints();
                                                Serial s = reader.ReadInt();
                                                dp.Deserialize( reader );
                                                PointsTable.Add( s, dp );
                                            }

                                            break;
                                        }
                                }
                            }
                            catch( Exception err )
                            {
                                Console.WriteLine( err.ToString() );
                            }
                            finally
                            {
                                fs.Close();
                            } 
                        }
                    
                    
                }
            }

            foreach( Mobile m in World.Mobiles.Values )
            {
                if( m != null )
                {
                    if( m.Player )
                    {
                        Container b = m.Backpack;

                        if( b != null )
                        {
                            ArrayList toDelete = new ArrayList();
                            foreach( Item i in b.Items )
                            {
                                if( i != null && i is DuelFixBall )                                
                                {
                                    m.Blessed = false;
                                    toDelete.Add( i );
                                }
                            }

                            if( toDelete.Count > 0 )
                            {
                                foreach( Item i in toDelete )
                                    i.Delete();
                            }
                        }
                    }
                }
            }
        }

        private static void EventSink_Movement( MovementEventArgs e )
        {
            Mobile m = e.Mobile;

            if( m == null )
                return;

            if( m is PlayerMobile )
            {
                if( IsInDuel( m ) )
                {
                    Duel duel = GetDuel( m );

                    if (duel.Started)
                    {
                        if ((duel.Defender.Location.X - duel.Attacker.Location.X) >= m_MaxDist ||
                            (duel.Defender.Location.X - duel.Attacker.Location.X) <= -m_MaxDist ||
                            (duel.Defender.Location.Y - duel.Attacker.Location.Y) >= m_MaxDist ||
                            (duel.Defender.Location.Y - duel.Attacker.Location.Y) <= -m_MaxDist)
                        {
                            duel.EndDuel(duel.Defender);
                            duel.Attacker.SendMessage("The duel was ended because one or more parties has fleed the battle");
                            duel.Defender.SendMessage("The duel was ended because one or more parties has fleed the battle");
                            m_CurrentDuels.Remove(duel);
                        }

                        if (duel.MagicOnly)
                        {

                            foreach (Layer layer in WeaponCheckLayers)
                            {
                                Item i = m.FindItemOnLayer(layer);

                                if (i != null)
                                {
                                    Container bp = m.Backpack;

                                    if (i is BaseWeapon)
                                    {
                                        BaseWeapon weapon = (BaseWeapon)i;
                                        bp.AddItem(weapon);
                                        m.SendMessage("This is a Magic Only duel. Please follow the rules!");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        private static Layer[] WeaponCheckLayers = new Layer[]
		{
			Layer.OneHanded,
			Layer.TwoHanded,
		};

        private static void EventSink_PlayerDeath( PlayerDeathEventArgs e )
        {
            Duel duel;
            Mobile m = e.Mobile;

            if( m == null )
                return;

            if( IsInDuel( m ) )
            {
                duel = GetDuel( m );

                if( duel != null )
                {
                    duel.EndDuel( m );
                    m_CurrentDuels.Remove( duel );

                    if( m_WorldBroadcastWins )
                    {
                        if( m == duel.Attacker )
                            World.Broadcast( 0, false, String.Format( "{0} has defeated {1} in a duel.", duel.Defender.Name, duel.Attacker.Name ) );
                        else
                            World.Broadcast( 0, false, String.Format( "{0} has defeated {1} in a duel.", duel.Attacker.Name, duel.Defender.Name ) );
                    }

                    if( m_KeepScore && duel.KeepScore )
                    {
                        if( m == duel.Attacker )
                            UpdatePoints( duel.Defender, duel.Attacker );
                        else
                            UpdatePoints( duel.Attacker, duel.Defender );
                    }
                }
            }
        }        

        public static Duel GetDuel( Mobile m )
        {
            if( m_CurrentDuels.ContainsKey( m.Serial ) )
                return ( Duel )m_CurrentDuels[m.Serial];

            return null;    
        }

        public static bool IsInDuel( Mobile m )
        {
            if( m_CurrentDuels.ContainsKey( m.Serial ) )
                return true;

            return false;  
        }

        private static void UpdatePoints( Mobile winner, Mobile loser )
        {
            if( PointsTable.ContainsKey( winner.Serial ) )
            {
                DuelPoints dp = ( DuelPoints )PointsTable[winner.Serial];
                dp.Wins++;
            }
            else
            {
                DuelPoints dp = new DuelPoints( winner, 1, 0 );
                PointsTable.Add( winner.Serial, dp );
            }

            if( PointsTable.ContainsKey( loser.Serial ) )
            {
                DuelPoints dp = ( DuelPoints )PointsTable[loser.Serial];
                dp.Losses++;
            }
            else
            {
                DuelPoints dp = new DuelPoints( loser, 0, 1 );
                PointsTable.Add( loser.Serial, dp );
            }
        }

        public static void DestroyDuel( Duel duel )
        {
            if( duel.Attacker != null )
                m_CurrentDuels.Remove( duel.Attacker.Serial );

            if( duel.Defender != null )
                m_CurrentDuels.Remove( duel.Defender.Serial );
        }
    }

    public class SelectDueler : Target
    {
        private int[] m_Switches;
        private bool m_SevenFiveX;
        private Duel m_Duel;

        public SelectDueler( Duel duel, int[] switches, bool sevenFiveX ) : base( 100, false, TargetFlags.None )
        {
            m_Duel = duel;
            m_Switches = switches;
            m_SevenFiveX = sevenFiveX;
        }

        protected override void OnTargetCancel( Mobile from, TargetCancelType cancelType )
        {
            base.OnTargetCancel( from, cancelType );
            OnSiteCore.DestroyDuel( m_Duel );
            from.SendMessage( "You have cancelled the duel request." );
        }

        protected override void OnTarget( Mobile from, object target )
        {
            if( target is PlayerMobile )
            {
                Mobile m = ( Mobile )target;

                if( m.NetState == null )
                {
                    from.SendMessage( "That player is not online." );                    
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;                
                }

                if( m == from )
                {
                    from.SendMessage( "You slap yourself across the face and declare yourself the winner." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if (m.Criminal)
                {
                    m.SendMessage("You may not start a duel with someone who is flagged criminal.");
                    from.SendMessage("Select a new target.");
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( Spells.SpellHelper.CheckCombat( m ) )
                {
                    from.SendMessage( "That person is currently in combat. You must wait to duel them." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( m.SkillsTotal > 500 && !m_SevenFiveX )
                {
                    from.SendMessage( "That player has over 500 skillpoints and is not a valid candidate for a 5X duel." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( !OnSiteCore.IsInDuel( m ) )
                {
                    if( !m.HasGump( typeof( DuelAcceptGump ) ) )
                    {
                        Rectangle2D r = new Rectangle2D( from.Location.X, from.Location.Y, ( m.Location.X - from.Location.X ), ( m.Location.Y - from.Location.Y ) );

                        int xMid = r.X + ( r.Width / 2 );
                        int yMid = r.Y + ( r.Height / 2 );

                        Point2D mid = new Point2D( xMid, yMid );
                        Point3D location;

                        Item poll = new Item( 0x9 );
                        location = new Point3D( xMid - 1, yMid, from.Location.Z + 70 );
                        poll.Movable = false;
                        poll.Name = "a duel request post";
                        poll.MoveToWorld( location, from.Map );

                        Item holder = new Item( 0xB99 );
                        location = new Point3D( xMid, yMid, from.Location.Z + 70 );
                        holder.Movable = false;
                        holder.Name = "a duel request post";
                        holder.MoveToWorld( location, from.Map );

                        Item sign = new Item( 0xBBF );
                        sign.Movable = false;
                        sign.Name = "a duel request post";
                        sign.MoveToWorld( location, from.Map );

                        Item[] items = new Item[] { poll, holder, sign };  

                        foreach( Mobile mob in from.GetMobilesInRange( 10 ) )
                        {
                            if( mob != null )
                                mob.SendMessage( String.Format( "{0} has challenged {1} to a duel.", from.Name, m.Name ) );
                        }

                        new DropDuelFlag( items ).Start();
                        m_Duel.Items = items;
                        m_Duel.Switches = m_Switches;
                        m.CloseGump( typeof( DuelAcceptGump ) );
                        m.SendGump( new DuelAcceptGump( m_Duel, m_Switches, from, m, items ) );
                    }
                    else
                    {
                        m.SendMessage( "That player has already been offered a duel." );
                        from.SendMessage( "Select a new target." );
                        from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                        return;
                    }
                }
                else
                {
                    from.SendMessage( "That player is already in a duel." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }
            }
            else
            {
                from.SendMessage( "You may only duel players." );
                from.SendMessage( "Select a new target." );
                from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                return;
            }
        }

        public class DropDuelFlag : Timer
        {
            Item[] m_Items;
            int count = 0;

            public DropDuelFlag( Item[] items ) : base( TimeSpan.FromSeconds( .1 ), TimeSpan.FromSeconds( .1 ) )
            {
                m_Items = items;
            }

            protected override void OnTick()
            {
                if( count <= 13 )
                {
                    count++;
                    foreach( Item i in m_Items )
                    {
                        if( !i.Deleted && i != null )
                        {
                            Point3D location = new Point3D( i.Location.X, i.Location.Y, ( i.Location.Z - 5 ) );
                            i.MoveToWorld( location );
                        }
                    }
                }
                else
                    Stop();
            }
        }
    }
}

public class Duel
{
    private Mobile m_Attacker;
    private Mobile m_Defender;
    private Item[] m_Items;
    private int[] m_Switches;
    private bool m_Started = false;

    public bool Started { get { return m_Started; } set { m_Started = value; } }
    public int[] Switches { get { return m_Switches; } set { m_Switches = value; } }
    public Item[] Items { get { return m_Items; } set { m_Items = value; } }
    public Mobile Attacker { get { return m_Attacker; } set { m_Attacker = value; } }
    public Mobile Defender { get { return m_Defender; } set { m_Defender = value; } }

    private bool m_MagicWeapons;
    private bool m_MagicArmor;
    private bool m_Potions;
    private bool m_Bandaids;
    private bool m_Mounts;
    private bool m_Pets;
    private bool m_MagicOnly;
    private bool m_KeepScore;
    private bool m_SevenFiveX;
    private ArrayList m_AttackerFollowers;
    private ArrayList m_DefenderFollowers;

    public bool MagicWeapons { get { return m_MagicWeapons; } set { m_MagicWeapons = value; } }
    public bool MagicArmor { get { return m_MagicArmor; } set { m_MagicArmor = value; } }
    public bool Potions { get { return m_Potions; } set { m_Potions = value; } }
    public bool Bandaids { get { return m_Bandaids; } set { m_Bandaids = value; } }
    public bool Mounts { get { return m_Mounts; } set { m_Mounts = value; } }
    public bool Pets { get { return m_Pets; } set { m_Pets = value; } }
    public bool MagicOnly { get { return m_MagicOnly; } set { m_MagicOnly = value; } }
    public bool KeepScore { get { return m_KeepScore; } set { m_KeepScore = value; } }
    public bool SevenFiveX { get { return m_SevenFiveX; } set { m_SevenFiveX = value; } }    
    
    public Duel( Mobile attacker )
    {
        m_Attacker = attacker;
        m_AttackerFollowers = new ArrayList();
        m_DefenderFollowers = new ArrayList();
    }

    public void StartDuel()
    {
        SetupDuel();
        SetupDuelers();
        Started = true;
        new DuelStartTimer( this, new Mobile[] { m_Attacker, m_Defender }, m_Items ).Start();
    }

    private void SetupDuel()
    {
        MagicWeapons = false;
        MagicArmor = false;
        Potions = false;
        Bandaids = false;
        Mounts = false;
        Pets = false;
        MagicOnly = false;
        KeepScore = false;
        SevenFiveX = false;

        for( int i = 0; i < m_Switches.Length; i++ )
        {
            switch( m_Switches[i] )
            {
                case 2: { SevenFiveX = true; break; }
                case 3: { KeepScore = true; break; }
                case 4: { MagicOnly = true; break; }
                case 5: { Pets = true; break; }
                case 6: { Mounts = true; break; }
                case 7: { Bandaids = true; break; }
                case 8: { Potions = true; break; }
                case 9: { MagicArmor = true; break; }
                case 10: { MagicWeapons = true; break; }
            }
        }        
    }

    private void SetupDuelers()
    {
        Mobile[] mobiles = new Mobile[] { m_Attacker, m_Defender };

        foreach( Mobile m in mobiles )
        {
            if( !m.Alive )
                m.Resurrect();

            Container bp = m.Backpack;
            Container bag = new Bag();
            bag.Hue = 38;
            BankBox bank = m.BankBox;
            Item oncurs = m.Holding;

            if( oncurs != null )
                bp.DropItem( oncurs );

            m.CurePoison( m );

            m.Hits = m.HitsMax;
            m.Mana = m.ManaMax;
            m.Stam = m.StamMax;

            m.StatMods.Clear();

            ArrayList items = new ArrayList();

            foreach( Layer layer in EquipmentLayers )
            {
                Item item = m.FindItemOnLayer( layer );

                if( item != null )
                {
                    if( item is BaseWeapon && !MagicWeapons )
                    {
                        BaseWeapon weapon = ( BaseWeapon )item;

                        if( weapon.AccuracyLevel != WeaponAccuracyLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DamageLevel != WeaponDamageLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DurabilityLevel != WeaponDurabilityLevel.Regular )
                            items.Add( weapon );

                    }
                    else if( item is BaseArmor && !MagicArmor )
                    {
                        BaseArmor armor = ( BaseArmor )item;

                        if( armor.Durability != ArmorDurabilityLevel.Regular )
                            items.Add( armor );
                        else if( armor.ProtectionLevel != ArmorProtectionLevel.Regular )
                            items.Add( armor );

                    }
                }
            }

            foreach( Item item in m.Backpack.Items )
            {
                if( item != null )
                {

                    if( item is BaseWeapon && !MagicWeapons)
                    {
                        BaseWeapon weapon = ( BaseWeapon )item;

                        if( weapon.AccuracyLevel != WeaponAccuracyLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DamageLevel != WeaponDamageLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DurabilityLevel != WeaponDurabilityLevel.Regular )
                            items.Add( weapon );
                   
                    }
                    else if( item is BaseArmor && !MagicArmor )
                    {
                        BaseArmor armor = ( BaseArmor )item;

                        if( armor.Durability != ArmorDurabilityLevel.Regular )
                            items.Add( armor );
                        else if( armor.ProtectionLevel != ArmorProtectionLevel.Regular )
                            items.Add( armor );                        
                    }
                    else if( item is BasePotion && !Potions )
                        items.Add( item );
                    else if( item is EtherealMount && !Mounts )
                        items.Add( item );
                    else if( item is Bandage && !Bandaids )
                        items.Add( item );
                }
            }            

            if( !Mounts )
            {

                if( m.Mount != null )
                {
                    IMount mount = m.Mount;
                    mount.Rider = null;
                    if( mount is BaseMount )
                    {
                        if( mount is BaseCreature )
                        {
                            BaseCreature bc = ( BaseCreature )mount;
                            bc.ControlTarget = null;
                            bc.ControlOrder = OrderType.Stay;
                            bc.Internalize();

                            bc.SetControlMaster( null );
                            bc.SummonMaster = null;

                            bc.IsStabled = true;
                            m.Stabled.Add( bc );
                            if (m == m_Attacker)
                                m_AttackerFollowers.Add(bc);
                            else
                                m_DefenderFollowers.Add(bc);
                        }
                    }
                }
            }

            ArrayList pets = new ArrayList();

            if( !Pets )
            {
                foreach( Mobile mob in World.Mobiles.Values )
                {
                    if( mob is BaseCreature )
                    {
                        BaseCreature bc = ( BaseCreature )mob;

                        if( ( bc.Controled && bc.ControlMaster == m ) || ( bc.Summoned && bc.SummonMaster == m ) )
                            pets.Add( bc );
                    }
                }
                

                foreach( BaseCreature c in pets )
                {
                    if( c != null )
                    {
                        c.ControlTarget = null;
                        c.ControlOrder = OrderType.Stay;
                        c.Internalize();

                        c.SetControlMaster( null );
                        c.SummonMaster = null;

                        c.IsStabled = true;
                        m.Stabled.Add( c );
                        if (m == m_Attacker)
                            m_AttackerFollowers.Add(c);
                        else
                            m_DefenderFollowers.Add(c);
                    }
                }
            }

            foreach( Item item in items )
            {
                bag.AddItem( item );
            }

            if( bag.Items.Count > 0 )
                bank.DropItem( bag );
            else
                bag.Delete();
        }
    }

    private Layer[] EquipmentLayers = new Layer[]
		{
			Layer.Cloak,
			Layer.Bracelet,
			Layer.Ring,
			Layer.Shirt,
			Layer.Pants,
			Layer.InnerLegs,
			Layer.Shoes,
			Layer.Arms,
			Layer.InnerTorso,
			Layer.MiddleTorso,
			Layer.OuterLegs,
			Layer.Neck,
			Layer.Waist,
			Layer.Gloves,
			Layer.OuterTorso,
			Layer.OneHanded,
			Layer.TwoHanded,
			Layer.FacialHair,
			Layer.Hair,
			Layer.Helm
		};

    public void EndDuel( Mobile loser )
    {
        Started = false;

        if( !loser.Alive )
        {
            loser.Resurrect();
            HandleCorpse( loser );
        }

        foreach (BaseCreature bc in m_DefenderFollowers)
        {
            bc.ControlTarget = m_Defender;
            bc.ControlOrder = OrderType.Stay;

            bc.SetControlMaster(m_Defender);
            bc.SummonMaster = m_Defender;

            bc.IsStabled = false;
            bc.MoveToWorld(m_Defender.Location, m_Defender.Map);
            m_Defender.Stabled.Remove(bc);
        }

        foreach (BaseCreature bc in m_AttackerFollowers)
        {
            bc.ControlTarget = m_Attacker;
            bc.ControlOrder = OrderType.Stay;

            bc.SetControlMaster(m_Attacker);
            bc.SummonMaster = m_Attacker;

            bc.IsStabled = false;
            bc.MoveToWorld(m_Attacker.Location, m_Attacker.Map);
            m_Attacker.Stabled.Remove(bc);
        }

        Mobile[] mobs = new Mobile[] { Attacker, Defender };
        
        foreach( Mobile m in mobs )
        {
            m.Aggressed.Clear();
            m.Aggressors.Clear();
            m.Hits = m.HitsMax;
            m.Stam = m.StamMax;
            m.Mana = m.ManaMax;
            m.DamageEntries.Clear();
            m.Combatant = null;
            m.Blessed = true;
            m.SendMessage( String.Format( "You have been made invulnerable for 10 seconds." ) );
        }

        new InvulTimer( mobs ).Start();
        new RaiseDuelFlag( this, m_Items ).Start();
    }

    public void HandleCorpse( Mobile from )
		{
			if( from.Corpse != null )
			{
				Corpse c = (Corpse)from.Corpse;
				Container b = from.Backpack;

				foreach( Item i in new ArrayList( c.Items ) )
				{
					if( i.Map != Map.Internal )
						b.AddItem( i );
				}

				c.Delete();

				from.SendMessage( 1161, "The contents of your corpse have been safely placed into your backpack" );
			}
		}

    public class DuelStartTimer : Timer
    {
        Item[] m_Items;
        Mobile[] m_Mobiles;
        Duel m_Duel;
        int count = 5;

        public DuelStartTimer( Duel duel, Mobile[] mobiles, Item[] items ) 
            : base( TimeSpan.FromSeconds( 0 ), TimeSpan.FromSeconds( 1.0 ) )
        {
            m_Duel = duel;
            m_Items = items;
            m_Mobiles = mobiles;
        }

        protected override void OnTick()
        {
            if( count <= 0 )
            {
                foreach( Mobile m in m_Mobiles )
                    if( m != null )
                        m.SendMessage( "Fight!" );
                m_Duel.Started = true;
                Stop();
            }

            foreach( Mobile m in m_Mobiles )
                if( m != null )
                    m.SendMessage( String.Format( "{0}", count ) );

            count--;            
        }
    }

    public class InvulTimer : Timer
    {
        Mobile[] m_Mobiles;
        DuelFixBall[] m_FixBall;
        int count = 0;

        public InvulTimer( Mobile[] mobiles )
            : base( TimeSpan.FromSeconds( 0 ), TimeSpan.FromSeconds( 1.0 ) )
        {
            m_Mobiles = mobiles;
            m_FixBall = new DuelFixBall[2];

            int i = 0;
            foreach( Mobile m in mobiles )
            {
                Container b = m.Backpack;
                DuelFixBall d = new DuelFixBall();
                b.AddItem( d );
                m_FixBall[i] = d;
                i++;
            }
        }

        protected override void OnTick()
        {
            if( count >= 10 )
            {
                int i = 0;
                foreach( Mobile m in m_Mobiles )
                {
                    if( m != null )
                    {
                        m.SendMessage( String.Format( "You are no longer invulnerable." ) );
                        m_FixBall[i].Delete();
                        m.Blessed = false;
                    }
                    i++;
                }

                Stop();
            }

            count++;
        }
    }

    public class RaiseDuelFlag : Timer
    {
        Item[] m_Items;
        Duel m_Duel;
        int count = 0;

        public RaiseDuelFlag( Duel duel, Item[] items )
            : base( TimeSpan.FromSeconds( .1 ), TimeSpan.FromSeconds( .1 ) )
        {
            m_Items = items;
            m_Duel = duel;
        }

        protected override void OnTick()
        {
            if( count <= 13 )
            {
                count++;
                foreach( Item i in m_Items )
                {
                    if( !i.Deleted && i != null )
                    {
                        Point3D location = new Point3D( i.Location.X, i.Location.Y, ( i.Location.Z + 5 ) );
                        i.MoveToWorld( location );
                    }
                }
            }
            else
            {
                foreach( Item i in m_Items )
                    if( i != null && !i.Deleted )
                        i.Delete();

                Server.Customs.OnSiteDueling.OnSiteCore.DestroyDuel( m_Duel );
                Stop();
            }
        }
    }
}

public class DuelPoints
{
    private Mobile m_Mobile;
    private int m_Wins;
    private int m_Losses;

    public Mobile Mob { get { return m_Mobile; } }
    public int Wins { get { return m_Wins; } set { m_Wins = value; } }
    public int Losses { get { return m_Losses; } set { m_Losses = value; } }
    
    public DuelPoints( Mobile m, int wins, int losses )
    {
        m_Mobile = m;
        m_Wins = wins;
        m_Losses = losses;
    }

    public DuelPoints()
    {

    }

    public void Serialize( GenericWriter writer )
    {
        writer.Write( ( int )0 );//Version

        writer.Write( ( Mobile )m_Mobile );
        writer.Write( ( int )m_Wins );
        writer.Write( ( int )m_Losses );
    }

    public void Deserialize( GenericReader reader )
    {
        int version = reader.ReadInt();

        switch( version )
        {
            case 0:
            {
                m_Mobile = reader.ReadMobile();
                m_Wins = reader.ReadInt();
                m_Losses = reader.ReadInt();
                break;
            }
        }
    }
}
 

Jeff

Lord
Fixed and Updated, sry i havent been updating this package like i had meant to, Im currently super busy with some RL stuff and something else that you guys will find out about soon enough, Soon as 2.0 is out I will start work on my 2.0 Version of this and will continue where i left off.
 

stu

Wanderer
Got a bug in the new onsite core bro!

Sorry I didnt get a debug, ill try and get one this evening.....
Code:
Server Crash Report
===================

RunUO Version 1.0.0, Build 36918
Operating System: Microsoft Windows NT 5.2.3790.0
.NET Framework: 1.1.4322.2300
Time: 5/4/2006 2:50:17 AM
Mobiles: 21711
Items: 426237
Clients:
- Count: 19

accounts removed

Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
   at Duel.EndDuel(Mobile loser)
   at Server.Customs.OnSiteDueling.OnSiteCore.EventSink_PlayerDeath(PlayerDeathEventArgs e)
   at Server.PlayerDeathEventHandler.Invoke(PlayerDeathEventArgs e)
   at Server.Mobile.OnDeath(Container c)
   at Server.Mobiles.PlayerMobile.OnDeath(Container c)
   at Server.Mobile.Kill()
   at Server.Mobile.Damage(Int32 amount, Mobile from)
   at Server.Mobiles.PlayerMobile.Damage(Int32 amount, Mobile from)
   at Server.AOS.Damage(Mobile m, Mobile from, Int32 damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy, Boolean keepAlive)
   at Server.AOS.Damage(Mobile m, Mobile from, Int32 damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy)
   at Server.Spells.SpellHelper.Damage(TimeSpan delay, Mobile target, Mobile from, Double damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy, DFAlgorithm dfa)
   at Server.Spells.SpellHelper.Damage(TimeSpan delay, Mobile target, Mobile from, Double damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy)
   at Server.Spells.SpellHelper.Damage(Spell spell, Mobile target, Double damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy)
   at Server.Spells.Fourth.LightningSpell.Target(Mobile m)
   at Server.Spells.Fourth.InternalTarget.OnTarget(Mobile from, Object o)
   at Server.Targeting.Target.Invoke(Mobile from, Object targeted)
   at Server.Network.PacketHandlers.TargetResponse(NetState state, PacketReader pvSrc)
   at Server.Network.MessagePump.HandleReceive(NetState ns)
   at Server.Network.MessagePump.Slice()
   at Server.Core.Main(String[] args)
 

stu

Wanderer
my onsitecore...........
(slightly modded with the fixduels readded becasue we are still experienceing "stuck" players...)
Code:
using System;
using System.IO;
using System.Text;
using System.Collections;

using Server;
using Server.Items;
using Server.Mobiles;
using Server.Targets;
using Server.Targeting;
using Server.Network;
using Server.Gumps;
using Server.Factions;
using Server.Customs.OnSiteDueling.Gumps;
using Server.Customs.OnSiteDueling.Items;

namespace Server.Customs.OnSiteDueling
{
    public class OnSiteCore
    {

        public const bool Enabled = true;                                      //Enable/Disable the entire system
        private static int m_MaxDist = 30;                                      //Sets the max distance a player can run from another player without ending the duel.
        private static bool m_WorldBroadcastWins = true;                        //If true will broadcast the winner of each duel.
        private static bool m_KeepScore = true;                                 //Turn the score keeping system on/off;
        private static bool m_UseCommand = true;                                //Turn the command to duel on/off.
        private static string m_ChallengeString = "i challenge thee to a duel"; //String used to start a duel.
        private static string m_DuelCommand = "OnSiteDuel";                     //The command players can call to duel someone.
        private static string m_GetPointsString = "showpoints";                 //String used to get your duelpoints.
        private static Hashtable m_CurrentDuels;                                //This is the container for each duel in progress
        private static Hashtable m_PointsTable;                                 //Points tracker.
        private static string m_SavePath = Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves\\scores.bin" );//Save path.

        private static string m_Version = "2.0.2";
                
        public static string Version { get { return m_Version; } }
        public static Hashtable CurrentDuels { get { return m_CurrentDuels; } set { m_CurrentDuels = value; } }
        public static Hashtable PointsTable { get { return m_PointsTable; } set { m_PointsTable = value; } }

        public static void Initialize()
        {
            if( Enabled )
            {
                if( m_KeepScore )
                    m_PointsTable = new Hashtable();

                if( m_UseCommand )
                    Commands.Register( m_DuelCommand, AccessLevel.Player, new CommandEventHandler( OnSiteDuel_Command ) );//Command event.
                    Commands.Register( "FixDuels", AccessLevel.Counselor, new CommandEventHandler( FixDuels_Command ) );//Command event.

                m_CurrentDuels = new Hashtable();

                Load();


                EventSink.Speech += new SpeechEventHandler( EventSink_Speech );
                EventSink.WorldSave += new WorldSaveEventHandler( EventSink_WorldSave );
                EventSink.Movement += new MovementEventHandler( EventSink_Movement );//Checks distance between players.
                EventSink.PlayerDeath += new PlayerDeathEventHandler( EventSink_PlayerDeath );//Checks each death to see if the player was in a duel.
            }
            
        }

        [Usage( "FixDuels" )]
        [Description( "Fixes Duels" )]
        private static void FixDuels_Command( CommandEventArgs args )
        {
            m_CurrentDuels.Clear();
        }
        [Usage( "OnSiteDuel" )]
        [Description( "Initiates a duel request with the targeted player." )]
        private static void OnSiteDuel_Command( CommandEventArgs args )
        {
            Mobile m = ( Mobile )args.Mobile;

            if( m == null )
                return;

            if( !CanDuel(m) )
                return;

            Duel duel = new Duel( m );
            m_CurrentDuels.Add( m.Serial, duel );
            
            m.CloseGump( typeof( DuelAcceptGump ) );
            m.CloseGump( typeof( DuelOptionsGump ) );
            m.SendGump( new DuelOptionsGump( duel ) );

        }

        public static bool CanDuel( Mobile m )
        {            
            if (m.Criminal)
            {
                m.SendMessage("You may not start a duel while flagged criminal.");
                return false;
            }
            else if( Spells.SpellHelper.CheckCombat( m ) )
            {
                m.SendMessage( "You cannot start a duel while in combat." );
                return false;
            }
            else if( m.HasGump( typeof( DuelOptionsGump ) ) )
            {
                m.SendMessage( "You are already initiating a duel." );
                return false;
            }
            else if( m.HasGump( typeof( DuelAcceptGump ) ) )
            {
                m.SendMessage( "You are already approving a duel." );
                return false;
            }
            else if( IsInDuel( m ) )
            {
                m.SendMessage( "You are currently in a duel." );
                return false;
            }
            else if( m.Target is SelectDueler )
            {
                m.SendMessage( "You are already starting a duel." );
                return false;
            }
            else if( Factions.Sigil.ExistsOn( m ) )
            {
                m.SendMessage( "You may not challenge someone while you have a faction sigil." );
                return false;
            }

            return true;
        }

        private static void EventSink_Speech( SpeechEventArgs e )
        {
            Mobile mobile = e.Mobile;

            if( e.Speech.ToLower().IndexOf( m_GetPointsString ) >= 0 )
            {
                if( mobile != null )
                {
                    if( PointsTable.ContainsKey( mobile.Serial ) )
                    {
                        DuelPoints dp = ( DuelPoints )PointsTable[mobile.Serial];
                        mobile.NonlocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "{0} Wins/{1} Loses", dp.Wins, dp.Losses ) );
                        mobile.LocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "{0} Wins/{1} Loses", dp.Wins, dp.Losses ) );
                    }
                    else
                    {
                        mobile.NonlocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "I have not duel yet" ) );
                        mobile.LocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "You have not duel yet" ) );
                    }
                }
            }

            if( e.Speech.ToLower().IndexOf( "bank" ) >= 0 )
            {
                if( IsInDuel( mobile ) )
                {
                    e.Handled = true;
                    return;
                }
            }
            
            if( e.Speech.ToLower().IndexOf( m_ChallengeString ) >= 0 )
            {
                Mobile m = mobile;
                PlayerMobile pm = ( PlayerMobile )m;

                if( m == null )
                    return;

                if( !CanDuel( m ) )
                    return;

                Duel duel = new Duel( m );
                m_CurrentDuels.Add( m.Serial, duel );

                m.CloseGump( typeof( DuelAcceptGump ) );
                m.CloseGump( typeof( DuelOptionsGump ) );
                m.SendGump( new DuelOptionsGump( duel ) );             
            }
        }

        private static void EventSink_WorldSave( WorldSaveEventArgs e )
        {
            if( m_KeepScore )
            {
                if( !Directory.Exists( Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves" ) ) )
                    Directory.CreateDirectory( Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves" ) );

                GenericWriter bin = new BinaryFileWriter( m_SavePath, true );

                try
                {
                    bin.Write( ( int )0 );//Versioning

                    ArrayList keyList = new ArrayList();
                    ArrayList valueList = new ArrayList();

                    IDictionaryEnumerator myEnum = m_PointsTable.GetEnumerator();

                    while( myEnum.MoveNext() )
                    {
                        keyList.Add( myEnum.Key );
                        valueList.Add( myEnum.Value );
                    }

                    int count = keyList.Count;

                    bin.Write( ( int )count );

                    for( int i = 0; i < count; i++ )
                    {
                        Serial key = ( Serial )keyList[i];
                        DuelPoints dp = ( DuelPoints )valueList[i];

                        bin.Write( ( int )key );
                        dp.Serialize( bin );
                    }
                }
                catch( Exception err )
                {
                    Console.WriteLine( err.ToString() );
                }
                finally
                {
                    bin.Close();
                }
            }
        }

        private static void Load()
        {
            if( m_KeepScore )
            {
                if( File.Exists( m_SavePath ) )
                {

                        using( FileStream fs = new FileStream( m_SavePath, FileMode.Open, FileAccess.Read, FileShare.Read ) )
                        {
                            try
                            {
                                BinaryReader br = new BinaryReader( fs );
                                BinaryFileReader reader = new BinaryFileReader( br );

                                int version = reader.ReadInt();

                                switch( version )
                                {
                                    case 0:
                                        {
                                            int count = reader.ReadInt();
                                            for( int i = 0; i < count; i++ )
                                            {
                                                DuelPoints dp = new DuelPoints();
                                                Serial s = reader.ReadInt();
                                                dp.Deserialize( reader );
                                                PointsTable.Add( s, dp );
                                            }

                                            break;
                                        }
                                }
                            }
                            catch( Exception err )
                            {
                                Console.WriteLine( err.ToString() );
                            }
                            finally
                            {
                                fs.Close();
                            } 
                        }
                    
                    
                }
            }

            foreach( Mobile m in World.Mobiles.Values )
            {
                if( m != null )
                {
                    if( m.Player )
                    {
                        Container b = m.Backpack;

                        if( b != null )
                        {
                            ArrayList toDelete = new ArrayList();
                            foreach( Item i in b.Items )
                            {
                                if( i != null && i is DuelFixBall )                                
                                {
                                    m.Blessed = false;
                                    toDelete.Add( i );
                                }
                            }

                            if( toDelete.Count > 0 )
                            {
                                foreach( Item i in toDelete )
                                    i.Delete();
                            }
                        }
                    }
                }
            }
        }

        private static void EventSink_Movement( MovementEventArgs e )
        {
            Mobile m = e.Mobile;

            if( m == null )
                return;

            if( m is PlayerMobile )
            {
                if( IsInDuel( m ) )
                {
                    Duel duel = GetDuel( m );

                    if (duel.Started)
                    {
                        if ((duel.Defender.Location.X - duel.Attacker.Location.X) >= m_MaxDist ||
                            (duel.Defender.Location.X - duel.Attacker.Location.X) <= -m_MaxDist ||
                            (duel.Defender.Location.Y - duel.Attacker.Location.Y) >= m_MaxDist ||
                            (duel.Defender.Location.Y - duel.Attacker.Location.Y) <= -m_MaxDist)
                        {
                            duel.EndDuel(duel.Defender);
                            duel.Attacker.SendMessage("The duel was ended because one or more parties has fleed the battle");
                            duel.Defender.SendMessage("The duel was ended because one or more parties has fleed the battle");
                            m_CurrentDuels.Remove(duel);
                        }

                        if (duel.MagicOnly)
                        {

                            foreach (Layer layer in WeaponCheckLayers)
                            {
                                Item i = m.FindItemOnLayer(layer);

                                if (i != null)
                                {
                                    Container bp = m.Backpack;

                                    if (i is BaseWeapon)
                                    {
                                        BaseWeapon weapon = (BaseWeapon)i;
                                        bp.AddItem(weapon);
                                        m.SendMessage("This is a Magic Only duel. Please follow the rules!");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        private static Layer[] WeaponCheckLayers = new Layer[]
		{
			Layer.OneHanded,
			Layer.TwoHanded,
		};

        private static void EventSink_PlayerDeath( PlayerDeathEventArgs e )
        {
            Duel duel;
            Mobile m = e.Mobile;

            if( m == null )
                return;

            if( IsInDuel( m ) )
            {
                duel = GetDuel( m );

                if( duel != null )
                {
                    duel.EndDuel( m );
                    m_CurrentDuels.Remove( duel );

                    if( duel.Attacker != null && duel.Defender != null )
                    {
                        if( m_WorldBroadcastWins )
                        {
                            if( m == duel.Attacker )
                                World.Broadcast( 0, false, String.Format( "{0} has defeated {1} in a duel.", duel.Defender.Name, duel.Attacker.Name ) );
                            else
                                World.Broadcast( 0, false, String.Format( "{0} has defeated {1} in a duel.", duel.Attacker.Name, duel.Defender.Name ) );
                        }

                        if( m_KeepScore && duel.KeepScore )
                        {
                            if( m == duel.Attacker )
                                UpdatePoints( duel.Defender, duel.Attacker );
                            else
                                UpdatePoints( duel.Attacker, duel.Defender );
                        }
                    }
                }
            }
        }        

        public static Duel GetDuel( Mobile m )
        {
            if( m_CurrentDuels.ContainsKey( m.Serial ) )
                return ( Duel )m_CurrentDuels[m.Serial];

            return null;    
        }

        public static bool IsInDuel( Mobile m )
        {
            if( m_CurrentDuels.ContainsKey( m.Serial ) )
                return true;

            return false;  
        }

        private static void UpdatePoints( Mobile winner, Mobile loser )
        {
            if( PointsTable.ContainsKey( winner.Serial ) )
            {
                DuelPoints dp = ( DuelPoints )PointsTable[winner.Serial];
                dp.Wins++;
            }
            else
            {
                DuelPoints dp = new DuelPoints( winner, 1, 0 );
                PointsTable.Add( winner.Serial, dp );
            }

            if( PointsTable.ContainsKey( loser.Serial ) )
            {
                DuelPoints dp = ( DuelPoints )PointsTable[loser.Serial];
                dp.Losses++;
            }
            else
            {
                DuelPoints dp = new DuelPoints( loser, 0, 1 );
                PointsTable.Add( loser.Serial, dp );
            }
        }

        public static void DestroyDuel( Duel duel )
        {
            if( duel.Attacker != null )
                m_CurrentDuels.Remove( duel.Attacker.Serial );

            if( duel.Defender != null )
                m_CurrentDuels.Remove( duel.Defender.Serial );
        }
    }

    public class SelectDueler : Target
    {
        private int[] m_Switches;
        private bool m_SevenFiveX;
        private Duel m_Duel;

        public SelectDueler( Duel duel, int[] switches, bool sevenFiveX ) : base( 100, false, TargetFlags.None )
        {
            m_Duel = duel;
            m_Switches = switches;
            m_SevenFiveX = sevenFiveX;
        }

        protected override void OnTargetOutOfLOS( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetNotAccessible( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetUntargetable( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetDeleted( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnCantSeeTarget( Mobile from, object targeted )
        {
            from.SendMessage( "You cannot see that." );
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetCancel( Mobile from, TargetCancelType cancelType )
        {
            base.OnTargetCancel( from, cancelType );
            OnSiteCore.DestroyDuel( m_Duel );
            from.SendMessage( "You have cancelled the duel request." );
        }

        protected override void OnTarget( Mobile from, object target )
        {
            if( target is PlayerMobile )
            {
                Mobile m = ( Mobile )target;

                if( m.NetState == null )
                {
                    from.SendMessage( "That player is not online." );                    
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;                
                }

                if( m == from )
                {
                    from.SendMessage( "You slap yourself across the face and declare yourself the winner." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if (m.Criminal)
                {
                    m.SendMessage("You may not start a duel with someone who is flagged criminal.");
                    from.SendMessage("Select a new target.");
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( Spells.SpellHelper.CheckCombat( m ) )
                {
                    from.SendMessage( "That person is currently in combat. You must wait to duel them." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( m.SkillsTotal > 500 && !m_SevenFiveX )
                {
                    from.SendMessage( "That player has over 500 skillpoints and is not a valid candidate for a 5X duel." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( !OnSiteCore.IsInDuel( m ) )
                {
                    if( !m.HasGump( typeof( DuelAcceptGump ) ) )
                    {
                        Rectangle2D r = new Rectangle2D( from.Location.X, from.Location.Y, ( m.Location.X - from.Location.X ), ( m.Location.Y - from.Location.Y ) );

                        int xMid = r.X + ( r.Width / 2 );
                        int yMid = r.Y + ( r.Height / 2 );

                        Point2D mid = new Point2D( xMid, yMid );
                        Point3D location;

                        Item poll = new Item( 0x9 );
                        location = new Point3D( xMid - 1, yMid, from.Location.Z + 70 );
                        poll.Movable = false;
                        poll.Name = "a duel request post";
                        poll.MoveToWorld( location, from.Map );

                        Item holder = new Item( 0xB99 );
                        location = new Point3D( xMid, yMid, from.Location.Z + 70 );
                        holder.Movable = false;
                        holder.Name = "a duel request post";
                        holder.MoveToWorld( location, from.Map );

                        Item sign = new Item( 0xBBF );
                        sign.Movable = false;
                        sign.Name = "a duel request post";
                        sign.MoveToWorld( location, from.Map );

                        Item[] items = new Item[] { poll, holder, sign };  

                        foreach( Mobile mob in from.GetMobilesInRange( 10 ) )
                        {
                            if( mob != null )
                                mob.SendMessage( String.Format( "{0} has challenged {1} to a duel.", from.Name, m.Name ) );
                        }

                        new DropDuelFlag( items ).Start();
                        m_Duel.Items = items;
                        m_Duel.Switches = m_Switches;
                        m.CloseGump( typeof( DuelAcceptGump ) );
                        m.SendGump( new DuelAcceptGump( m_Duel, m_Switches, from, m, items ) );
                    }
                    else
                    {
                        m.SendMessage( "That player has already been offered a duel." );
                        from.SendMessage( "Select a new target." );
                        from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                        return;
                    }
                }
                else
                {
                    from.SendMessage( "That player is already in a duel." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }
            }
            else
            {
                from.SendMessage( "You may only duel players." );
                from.SendMessage( "Select a new target." );
                from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                return;
            }
        }

        public class DropDuelFlag : Timer
        {
            Item[] m_Items;
            int count = 0;

            public DropDuelFlag( Item[] items ) : base( TimeSpan.FromSeconds( .1 ), TimeSpan.FromSeconds( .1 ) )
            {
                m_Items = items;
            }

            protected override void OnTick()
            {
                if( count <= 13 )
                {
                    count++;
                    foreach( Item i in m_Items )
                    {
                        if( !i.Deleted && i != null )
                        {
                            Point3D location = new Point3D( i.Location.X, i.Location.Y, ( i.Location.Z - 5 ) );
                            i.MoveToWorld( location );
                        }
                    }
                }
                else
                    Stop();
            }
        }
    }
}

public class Duel
{
    private Mobile m_Attacker;
    private Mobile m_Defender;
    private Item[] m_Items;
    private int[] m_Switches;
    private bool m_Started = false;

    public bool Started { get { return m_Started; } set { m_Started = value; } }
    public int[] Switches { get { return m_Switches; } set { m_Switches = value; } }
    public Item[] Items { get { return m_Items; } set { m_Items = value; } }
    public Mobile Attacker { get { return m_Attacker; } set { m_Attacker = value; } }
    public Mobile Defender { get { return m_Defender; } set { m_Defender = value; } }

    private bool m_MagicWeapons;
    private bool m_MagicArmor;
    private bool m_Potions;
    private bool m_Bandaids;
    private bool m_Mounts;
    private bool m_Pets;
    private bool m_MagicOnly;
    private bool m_KeepScore;
    private bool m_SevenFiveX;
    private ArrayList m_AttackerFollowers;
    private ArrayList m_DefenderFollowers;

    public bool MagicWeapons { get { return m_MagicWeapons; } set { m_MagicWeapons = value; } }
    public bool MagicArmor { get { return m_MagicArmor; } set { m_MagicArmor = value; } }
    public bool Potions { get { return m_Potions; } set { m_Potions = value; } }
    public bool Bandaids { get { return m_Bandaids; } set { m_Bandaids = value; } }
    public bool Mounts { get { return m_Mounts; } set { m_Mounts = value; } }
    public bool Pets { get { return m_Pets; } set { m_Pets = value; } }
    public bool MagicOnly { get { return m_MagicOnly; } set { m_MagicOnly = value; } }
    public bool KeepScore { get { return m_KeepScore; } set { m_KeepScore = value; } }
    public bool SevenFiveX { get { return m_SevenFiveX; } set { m_SevenFiveX = value; } }    
    
    public Duel( Mobile attacker )
    {
        m_Attacker = attacker;
        m_AttackerFollowers = new ArrayList();
        m_DefenderFollowers = new ArrayList();
    }

    public void StartDuel()
    {
        SetupDuel();
        SetupDuelers();
        Started = true;
        new DuelStartTimer( this, new Mobile[] { m_Attacker, m_Defender }, m_Items ).Start();
    }

    private void SetupDuel()
    {
        MagicWeapons = false;
        MagicArmor = false;
        Potions = false;
        Bandaids = false;
        Mounts = false;
        Pets = false;
        MagicOnly = false;
        KeepScore = false;
        SevenFiveX = false;

        for( int i = 0; i < m_Switches.Length; i++ )
        {
            switch( m_Switches[i] )
            {
                case 2: { SevenFiveX = true; break; }
                case 3: { KeepScore = true; break; }
                case 4: { MagicOnly = true; break; }
                case 5: { Pets = true; break; }
                case 6: { Mounts = true; break; }
                case 7: { Bandaids = true; break; }
                case 8: { Potions = true; break; }
                case 9: { MagicArmor = true; break; }
                case 10: { MagicWeapons = true; break; }
            }
        }        
    }

    private void SetupDuelers()
    {
        Mobile[] mobiles = new Mobile[] { m_Attacker, m_Defender };

        foreach( Mobile m in mobiles )
        {
            if( !m.Alive )
                m.Resurrect();

            Container bp = m.Backpack;
            Container bag = new Bag();
            bag.Hue = 38;
            BankBox bank = m.BankBox;
            Item oncurs = m.Holding;

            if( oncurs != null )
                bp.DropItem( oncurs );

            m.CurePoison( m );

            m.Hits = m.HitsMax;
            m.Mana = m.ManaMax;
            m.Stam = m.StamMax;

            m.StatMods.Clear();

            ArrayList items = new ArrayList();

            foreach( Layer layer in EquipmentLayers )
            {
                Item item = m.FindItemOnLayer( layer );

                if( item != null )
                {
                    if( item is BaseWeapon && !MagicWeapons )
                    {
                        BaseWeapon weapon = ( BaseWeapon )item;

                        if( weapon.AccuracyLevel != WeaponAccuracyLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DamageLevel != WeaponDamageLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DurabilityLevel != WeaponDurabilityLevel.Regular )
                            items.Add( weapon );

                    }
                    else if( item is BaseArmor && !MagicArmor )
                    {
                        BaseArmor armor = ( BaseArmor )item;

                        if( armor.Durability != ArmorDurabilityLevel.Regular )
                            items.Add( armor );
                        else if( armor.ProtectionLevel != ArmorProtectionLevel.Regular )
                            items.Add( armor );

                    }
                }
            }

            foreach( Item item in m.Backpack.Items )
            {
                if( item != null )
                {

                    if( item is BaseWeapon && !MagicWeapons)
                    {
                        BaseWeapon weapon = ( BaseWeapon )item;

                        if( weapon.AccuracyLevel != WeaponAccuracyLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DamageLevel != WeaponDamageLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DurabilityLevel != WeaponDurabilityLevel.Regular )
                            items.Add( weapon );
                   
                    }
                    else if( item is BaseArmor && !MagicArmor )
                    {
                        BaseArmor armor = ( BaseArmor )item;

                        if( armor.Durability != ArmorDurabilityLevel.Regular )
                            items.Add( armor );
                        else if( armor.ProtectionLevel != ArmorProtectionLevel.Regular )
                            items.Add( armor );                        
                    }
                    else if( item is BasePotion && !Potions )
                        items.Add( item );
                    else if( item is EtherealMount && !Mounts )
                        items.Add( item );
                    else if( item is Bandage && !Bandaids )
                        items.Add( item );
                }
            }            

            if( !Mounts )
            {

                if( m.Mount != null )
                {
                    IMount mount = m.Mount;
                    mount.Rider = null;
                    if( mount is BaseMount )
                    {
                        if( mount is BaseCreature )
                        {
                            BaseCreature bc = ( BaseCreature )mount;
                            bc.ControlTarget = null;
                            bc.ControlOrder = OrderType.Stay;
                            bc.Internalize();

                            bc.SetControlMaster( null );
                            bc.SummonMaster = null;

                            bc.IsStabled = true;
                            m.Stabled.Add( bc );
                            if (m == m_Attacker)
                                m_AttackerFollowers.Add(bc);
                            else
                                m_DefenderFollowers.Add(bc);
                        }
                    }
                }
            }

            ArrayList pets = new ArrayList();

            if( !Pets )
            {
                foreach( Mobile mob in World.Mobiles.Values )
                {
                    if( mob is BaseCreature )
                    {
                        BaseCreature bc = ( BaseCreature )mob;

                        if( ( bc.Controled && bc.ControlMaster == m ) || ( bc.Summoned && bc.SummonMaster == m ) )
                            pets.Add( bc );
                    }
                }
                

                foreach( BaseCreature c in pets )
                {
                    if( c != null )
                    {
                        c.ControlTarget = null;
                        c.ControlOrder = OrderType.Stay;
                        c.Internalize();

                        c.SetControlMaster( null );
                        c.SummonMaster = null;

                        c.IsStabled = true;
                        m.Stabled.Add( c );
                        if (m == m_Attacker)
                            m_AttackerFollowers.Add(c);
                        else
                            m_DefenderFollowers.Add(c);
                    }
                }
            }

            foreach( Item item in items )
            {
                bag.AddItem( item );
            }

            if( bag.Items.Count > 0 )
                bank.DropItem( bag );
            else
                bag.Delete();
        }
    }

    private Layer[] EquipmentLayers = new Layer[]
		{
			Layer.Cloak,
			Layer.Bracelet,
			Layer.Ring,
			Layer.Shirt,
			Layer.Pants,
			Layer.InnerLegs,
			Layer.Shoes,
			Layer.Arms,
			Layer.InnerTorso,
			Layer.MiddleTorso,
			Layer.OuterLegs,
			Layer.Neck,
			Layer.Waist,
			Layer.Gloves,
			Layer.OuterTorso,
			Layer.OneHanded,
			Layer.TwoHanded,
			Layer.FacialHair,
			Layer.Hair,
			Layer.Helm
		};

    public void EndDuel( Mobile loser )
    {
        Started = false;

        if( !loser.Alive )
        {
            loser.Resurrect();
            HandleCorpse( loser );
        }

        foreach (BaseCreature bc in m_DefenderFollowers)
        {
            bc.ControlTarget = m_Defender;
            bc.ControlOrder = OrderType.Stay;

            bc.SetControlMaster(m_Defender);
            bc.SummonMaster = m_Defender;

            bc.IsStabled = false;
            bc.MoveToWorld(m_Defender.Location, m_Defender.Map);
            m_Defender.Stabled.Remove(bc);
        }

        foreach (BaseCreature bc in m_AttackerFollowers)
        {
            bc.ControlTarget = m_Attacker;
            bc.ControlOrder = OrderType.Stay;

            bc.SetControlMaster(m_Attacker);
            bc.SummonMaster = m_Attacker;

            bc.IsStabled = false;
            bc.MoveToWorld(m_Attacker.Location, m_Attacker.Map);
            m_Attacker.Stabled.Remove(bc);
        }

        Mobile[] mobs = new Mobile[] { Attacker, Defender };
        
        foreach( Mobile m in mobs )
        {
            m.Aggressed.Clear();
            m.Aggressors.Clear();
            m.Hits = m.HitsMax;
            m.Stam = m.StamMax;
            m.Mana = m.ManaMax;
            m.DamageEntries.Clear();
            m.Combatant = null;
            m.Blessed = true;
            m.SendMessage( String.Format( "You have been made invulnerable for 10 seconds." ) );
        }

        new InvulTimer( mobs ).Start();
        new RaiseDuelFlag( this, m_Items ).Start();
    }

    public void HandleCorpse( Mobile from )
		{
			if( from.Corpse != null )
			{
				Corpse c = (Corpse)from.Corpse;
				Container b = from.Backpack;

				foreach( Item i in new ArrayList( c.Items ) )
				{
					if( i.Map != Map.Internal )
						b.AddItem( i );
				}

				c.Delete();

				from.SendMessage( 1161, "The contents of your corpse have been safely placed into your backpack" );
			}
		}

    public class DuelStartTimer : Timer
    {
        Item[] m_Items;
        Mobile[] m_Mobiles;
        Duel m_Duel;
        int count = 5;

        public DuelStartTimer( Duel duel, Mobile[] mobiles, Item[] items ) 
            : base( TimeSpan.FromSeconds( 0 ), TimeSpan.FromSeconds( 1.0 ) )
        {
            m_Duel = duel;
            m_Items = items;
            m_Mobiles = mobiles;
        }

        protected override void OnTick()
        {
            if( count <= 0 )
            {
                foreach( Mobile m in m_Mobiles )
                    if( m != null )
                        m.SendMessage( "Fight!" );
                m_Duel.Started = true;
                Stop();
            }

            foreach( Mobile m in m_Mobiles )
                if( m != null )
                    m.SendMessage( String.Format( "{0}", count ) );

            count--;            
        }
    }

    public class InvulTimer : Timer
    {
        Mobile[] m_Mobiles;
        DuelFixBall[] m_FixBall;
        int count = 0;

        public InvulTimer( Mobile[] mobiles )
            : base( TimeSpan.FromSeconds( 0 ), TimeSpan.FromSeconds( 1.0 ) )
        {
            m_Mobiles = mobiles;
            m_FixBall = new DuelFixBall[2];

            int i = 0;
            foreach( Mobile m in mobiles )
            {
                Container b = m.Backpack;
                DuelFixBall d = new DuelFixBall();
                b.AddItem( d );
                m_FixBall[i] = d;
                i++;
            }
        }

        protected override void OnTick()
        {
            if( count >= 10 )
            {
                int i = 0;
                foreach( Mobile m in m_Mobiles )
                {
                    if( m != null )
                    {
                        m.SendMessage( String.Format( "You are no longer invulnerable." ) );
                        m_FixBall[i].Delete();
                        m.Blessed = false;
                    }
                    i++;
                }

                Stop();
            }

            count++;
        }
    }

    public class RaiseDuelFlag : Timer
    {
        Item[] m_Items;
        Duel m_Duel;
        int count = 0;

        public RaiseDuelFlag( Duel duel, Item[] items )
            : base( TimeSpan.FromSeconds( .1 ), TimeSpan.FromSeconds( .1 ) )
        {
            m_Items = items;
            m_Duel = duel;
        }

        protected override void OnTick()
        {
            if( count <= 13 )
            {
                count++;
                foreach( Item i in m_Items )
                {
                    if( !i.Deleted && i != null )
                    {
                        Point3D location = new Point3D( i.Location.X, i.Location.Y, ( i.Location.Z + 5 ) );
                        i.MoveToWorld( location );
                    }
                }
            }
            else
            {
                foreach( Item i in m_Items )
                    if( i != null && !i.Deleted )
                        i.Delete();

                Server.Customs.OnSiteDueling.OnSiteCore.DestroyDuel( m_Duel );
                Stop();
            }
        }
    }
}

public class DuelPoints
{
    private Mobile m_Mobile;
    private int m_Wins;
    private int m_Losses;

    public Mobile Mob { get { return m_Mobile; } }
    public int Wins { get { return m_Wins; } set { m_Wins = value; } }
    public int Losses { get { return m_Losses; } set { m_Losses = value; } }
    
    public DuelPoints( Mobile m, int wins, int losses )
    {
        m_Mobile = m;
        m_Wins = wins;
        m_Losses = losses;
    }

    public DuelPoints()
    {

    }

    public void Serialize( GenericWriter writer )
    {
        writer.Write( ( int )0 );//Version

        writer.Write( ( Mobile )m_Mobile );
        writer.Write( ( int )m_Wins );
        writer.Write( ( int )m_Losses );
    }

    public void Deserialize( GenericReader reader )
    {
        int version = reader.ReadInt();

        switch( version )
        {
            case 0:
            {
                m_Mobile = reader.ReadMobile();
                m_Wins = reader.ReadInt();
                m_Losses = reader.ReadInt();
                break;
            }
        }
    }
}
 

stu

Wanderer
ok, I got the debug for ya, sorry its taken so long. Ive been swamped lately. This occured RIGHT after the moring restart with ONE player on, i think the old ugly exploit has reared its head again :(
here goes....
Code:
Server Crash Report
===================

RunUO Version 1.0.0, Build 36918
Operating System: Microsoft Windows NT 5.2.3790.0
.NET Framework: 1.1.4322.2300
Time: 5/8/2006 6:54:27 AM
Mobiles: 21814
Items: 429541
Clients:
- Count: 2
+ 
+  (account = ) (mobile = 0x40E1 name removed)

Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
   at Duel.EndDuel(Mobile loser) in c:\UOSERVER\RunUO 1.0\Scripts\Customs\Sorious' PvpKit\Duels\Onsite\OnSiteCore.cs:line 982
   at Server.Customs.OnSiteDueling.OnSiteCore.EventSink_PlayerDeath(PlayerDeathEventArgs e) in c:\UOSERVER\RunUO 1.0\Scripts\Customs\Sorious' PvpKit\Duels\Onsite\OnSiteCore.cs:line 380
   at Server.PlayerDeathEventHandler.Invoke(PlayerDeathEventArgs e)
   at Server.Mobile.OnDeath(Container c)
   at Server.Mobiles.PlayerMobile.OnDeath(Container c) in c:\UOSERVER\RunUO 1.0\Scripts\Mobiles\playermobile.cs:line 1987
   at Server.Mobile.Kill()
   at Server.Mobile.Damage(Int32 amount, Mobile from)
   at Server.Mobiles.PlayerMobile.Damage(Int32 amount, Mobile from) in c:\UOSERVER\RunUO 1.0\Scripts\Mobiles\playermobile.cs:line 2272
   at Server.AOS.Damage(Mobile m, Mobile from, Int32 damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy, Boolean keepAlive) in c:\UOSERVER\RunUO 1.0\Scripts\Misc\AOS.cs:line 69
   at Server.AOS.Damage(Mobile m, Mobile from, Int32 damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy) in c:\UOSERVER\RunUO 1.0\Scripts\Misc\AOS.cs:line 56
   at Server.Spells.SpellDamageTimerAOS.OnTick() in c:\UOSERVER\RunUO 1.0\Scripts\Spells\Base\SpellHelper.cs:line 895
   at Server.Timer.Slice()
   at Server.Core.Main(String[] args)
my onsitecore:

Code:
using System;
using System.IO;
using System.Text;
using System.Collections;

using Server;
using Server.Items;
using Server.Mobiles;
using Server.Targets;
using Server.Targeting;
using Server.Network;
using Server.Gumps;
using Server.Factions;
using Server.Customs.OnSiteDueling.Gumps;
using Server.Customs.OnSiteDueling.Items;

namespace Server.Customs.OnSiteDueling
{
    public class OnSiteCore
    {

        public const bool Enabled = true;                                      //Enable/Disable the entire system
        private static int m_MaxDist = 30;                                      //Sets the max distance a player can run from another player without ending the duel.
        private static bool m_WorldBroadcastWins = true;                        //If true will broadcast the winner of each duel.
        private static bool m_KeepScore = true;                                 //Turn the score keeping system on/off;
        private static bool m_UseCommand = true;                                //Turn the command to duel on/off.
        private static string m_ChallengeString = "i challenge thee to a duel"; //String used to start a duel.
        private static string m_DuelCommand = "OnSiteDuel";                     //The command players can call to duel someone.
        private static string m_GetPointsString = "showpoints";                 //String used to get your duelpoints.
        private static Hashtable m_CurrentDuels;                                //This is the container for each duel in progress
        private static Hashtable m_PointsTable;                                 //Points tracker.
        private static string m_SavePath = Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves\\scores.bin" );//Save path.

        private static string m_Version = "2.0.2";
                
        public static string Version { get { return m_Version; } }
        public static Hashtable CurrentDuels { get { return m_CurrentDuels; } set { m_CurrentDuels = value; } }
        public static Hashtable PointsTable { get { return m_PointsTable; } set { m_PointsTable = value; } }

        public static void Initialize()
        {
            if( Enabled )
            {
                if( m_KeepScore )
                    m_PointsTable = new Hashtable();

                if( m_UseCommand )
                    Commands.Register( m_DuelCommand, AccessLevel.Player, new CommandEventHandler( OnSiteDuel_Command ) );//Command event.
                    Commands.Register( "FixDuels", AccessLevel.Counselor, new CommandEventHandler( FixDuels_Command ) );//Command event.

                m_CurrentDuels = new Hashtable();

                Load();


                EventSink.Speech += new SpeechEventHandler( EventSink_Speech );
                EventSink.WorldSave += new WorldSaveEventHandler( EventSink_WorldSave );
                EventSink.Movement += new MovementEventHandler( EventSink_Movement );//Checks distance between players.
                EventSink.PlayerDeath += new PlayerDeathEventHandler( EventSink_PlayerDeath );//Checks each death to see if the player was in a duel.
            }
            
        }

        [Usage( "FixDuels" )]
        [Description( "Fixes Duels" )]
        private static void FixDuels_Command( CommandEventArgs args )
        {
            m_CurrentDuels.Clear();
        }
        [Usage( "OnSiteDuel" )]
        [Description( "Initiates a duel request with the targeted player." )]
        private static void OnSiteDuel_Command( CommandEventArgs args )
        {
            Mobile m = ( Mobile )args.Mobile;

            if( m == null )
                return;

            if( !CanDuel(m) )
                return;

            Duel duel = new Duel( m );
            m_CurrentDuels.Add( m.Serial, duel );
            
            m.CloseGump( typeof( DuelAcceptGump ) );
            m.CloseGump( typeof( DuelOptionsGump ) );
            m.SendGump( new DuelOptionsGump( duel ) );

        }

        public static bool CanDuel( Mobile m )
        {            
            if (m.Criminal)
            {
                m.SendMessage("You may not start a duel while flagged criminal.");
                return false;
            }
            else if( Spells.SpellHelper.CheckCombat( m ) )
            {
                m.SendMessage( "You cannot start a duel while in combat." );
                return false;
            }
            else if( m.HasGump( typeof( DuelOptionsGump ) ) )
            {
                m.SendMessage( "You are already initiating a duel." );
                return false;
            }
            else if( m.HasGump( typeof( DuelAcceptGump ) ) )
            {
                m.SendMessage( "You are already approving a duel." );
                return false;
            }
            else if( IsInDuel( m ) )
            {
                m.SendMessage( "You are currently in a duel." );
                return false;
            }
            else if( m.Target is SelectDueler )
            {
                m.SendMessage( "You are already starting a duel." );
                return false;
            }
            else if( Factions.Sigil.ExistsOn( m ) )
            {
                m.SendMessage( "You may not challenge someone while you have a faction sigil." );
                return false;
            }

            return true;
        }

        private static void EventSink_Speech( SpeechEventArgs e )
        {
            Mobile mobile = e.Mobile;

            if( e.Speech.ToLower().IndexOf( m_GetPointsString ) >= 0 )
            {
                if( mobile != null )
                {
                    if( PointsTable.ContainsKey( mobile.Serial ) )
                    {
                        DuelPoints dp = ( DuelPoints )PointsTable[mobile.Serial];
                        mobile.NonlocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "{0} Wins/{1} Loses", dp.Wins, dp.Losses ) );
                        mobile.LocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "{0} Wins/{1} Loses", dp.Wins, dp.Losses ) );
                    }
                    else
                    {
                        mobile.NonlocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "I have not duel yet" ) );
                        mobile.LocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "You have not duel yet" ) );
                    }
                }
            }

            if( e.Speech.ToLower().IndexOf( "bank" ) >= 0 )
            {
                if( IsInDuel( mobile ) )
                {
                    e.Handled = true;
                    return;
                }
            }
            
            if( e.Speech.ToLower().IndexOf( m_ChallengeString ) >= 0 )
            {
                Mobile m = mobile;
                PlayerMobile pm = ( PlayerMobile )m;

                if( m == null )
                    return;

                if( !CanDuel( m ) )
                    return;

                Duel duel = new Duel( m );
                m_CurrentDuels.Add( m.Serial, duel );

                m.CloseGump( typeof( DuelAcceptGump ) );
                m.CloseGump( typeof( DuelOptionsGump ) );
                m.SendGump( new DuelOptionsGump( duel ) );             
            }
        }

        private static void EventSink_WorldSave( WorldSaveEventArgs e )
        {
            if( m_KeepScore )
            {
                if( !Directory.Exists( Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves" ) ) )
                    Directory.CreateDirectory( Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves" ) );

                GenericWriter bin = new BinaryFileWriter( m_SavePath, true );

                try
                {
                    bin.Write( ( int )0 );//Versioning

                    ArrayList keyList = new ArrayList();
                    ArrayList valueList = new ArrayList();

                    IDictionaryEnumerator myEnum = m_PointsTable.GetEnumerator();

                    while( myEnum.MoveNext() )
                    {
                        keyList.Add( myEnum.Key );
                        valueList.Add( myEnum.Value );
                    }

                    int count = keyList.Count;

                    bin.Write( ( int )count );

                    for( int i = 0; i < count; i++ )
                    {
                        Serial key = ( Serial )keyList[i];
                        DuelPoints dp = ( DuelPoints )valueList[i];

                        bin.Write( ( int )key );
                        dp.Serialize( bin );
                    }
                }
                catch( Exception err )
                {
                    Console.WriteLine( err.ToString() );
                }
                finally
                {
                    bin.Close();
                }
            }
        }

        private static void Load()
        {
            if( m_KeepScore )
            {
                if( File.Exists( m_SavePath ) )
                {

                        using( FileStream fs = new FileStream( m_SavePath, FileMode.Open, FileAccess.Read, FileShare.Read ) )
                        {
                            try
                            {
                                BinaryReader br = new BinaryReader( fs );
                                BinaryFileReader reader = new BinaryFileReader( br );

                                int version = reader.ReadInt();

                                switch( version )
                                {
                                    case 0:
                                        {
                                            int count = reader.ReadInt();
                                            for( int i = 0; i < count; i++ )
                                            {
                                                DuelPoints dp = new DuelPoints();
                                                Serial s = reader.ReadInt();
                                                dp.Deserialize( reader );
                                                PointsTable.Add( s, dp );
                                            }

                                            break;
                                        }
                                }
                            }
                            catch( Exception err )
                            {
                                Console.WriteLine( err.ToString() );
                            }
                            finally
                            {
                                fs.Close();
                            } 
                        }
                    
                    
                }
            }

            foreach( Mobile m in World.Mobiles.Values )
            {
                if( m != null )
                {
                    if( m.Player )
                    {
                        Container b = m.Backpack;

                        if( b != null )
                        {
                            ArrayList toDelete = new ArrayList();
                            foreach( Item i in b.Items )
                            {
                                if( i != null && i is DuelFixBall )                                
                                {
                                    m.Blessed = false;
                                    toDelete.Add( i );
                                }
                            }

                            if( toDelete.Count > 0 )
                            {
                                foreach( Item i in toDelete )
                                    i.Delete();
                            }
                        }
                    }
                }
            }
        }

        private static void EventSink_Movement( MovementEventArgs e )
        {
            Mobile m = e.Mobile;

            if( m == null )
                return;

            if( m is PlayerMobile )
            {
                if( IsInDuel( m ) )
                {
                    Duel duel = GetDuel( m );

                    if (duel.Started)
                    {
                        if ((duel.Defender.Location.X - duel.Attacker.Location.X) >= m_MaxDist ||
                            (duel.Defender.Location.X - duel.Attacker.Location.X) <= -m_MaxDist ||
                            (duel.Defender.Location.Y - duel.Attacker.Location.Y) >= m_MaxDist ||
                            (duel.Defender.Location.Y - duel.Attacker.Location.Y) <= -m_MaxDist)
                        {
                            duel.EndDuel(duel.Defender);
                            duel.Attacker.SendMessage("The duel was ended because one or more parties has fleed the battle");
                            duel.Defender.SendMessage("The duel was ended because one or more parties has fleed the battle");
                            m_CurrentDuels.Remove(duel);
                        }

                        if (duel.MagicOnly)
                        {

                            foreach (Layer layer in WeaponCheckLayers)
                            {
                                Item i = m.FindItemOnLayer(layer);

                                if (i != null)
                                {
                                    Container bp = m.Backpack;

                                    if (i is BaseWeapon)
                                    {
                                        BaseWeapon weapon = (BaseWeapon)i;
                                        bp.AddItem(weapon);
                                        m.SendMessage("This is a Magic Only duel. Please follow the rules!");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        private static Layer[] WeaponCheckLayers = new Layer[]
		{
			Layer.OneHanded,
			Layer.TwoHanded,
		};

        private static void EventSink_PlayerDeath( PlayerDeathEventArgs e )
        {
            Duel duel;
            Mobile m = e.Mobile;

            if( m == null )
                return;

            if( IsInDuel( m ) )
            {
                duel = GetDuel( m );

                if( duel != null )
                {
                    duel.EndDuel( m );
                    m_CurrentDuels.Remove( duel );

                    if( duel.Attacker != null && duel.Defender != null )
                    {
                        if( m_WorldBroadcastWins )
                        {
                            if( m == duel.Attacker )
                                World.Broadcast( 0, false, String.Format( "{0} has defeated {1} in a duel.", duel.Defender.Name, duel.Attacker.Name ) );
                            else
                                World.Broadcast( 0, false, String.Format( "{0} has defeated {1} in a duel.", duel.Attacker.Name, duel.Defender.Name ) );
                        }

                        if( m_KeepScore && duel.KeepScore )
                        {
                            if( m == duel.Attacker )
                                UpdatePoints( duel.Defender, duel.Attacker );
                            else
                                UpdatePoints( duel.Attacker, duel.Defender );
                        }
                    }
                }
            }
        }        

        public static Duel GetDuel( Mobile m )
        {
            if( m_CurrentDuels.ContainsKey( m.Serial ) )
                return ( Duel )m_CurrentDuels[m.Serial];

            return null;    
        }

        public static bool IsInDuel( Mobile m )
        {
            if( m_CurrentDuels.ContainsKey( m.Serial ) )
                return true;

            return false;  
        }

        private static void UpdatePoints( Mobile winner, Mobile loser )
        {
            if( PointsTable.ContainsKey( winner.Serial ) )
            {
                DuelPoints dp = ( DuelPoints )PointsTable[winner.Serial];
                dp.Wins++;
            }
            else
            {
                DuelPoints dp = new DuelPoints( winner, 1, 0 );
                PointsTable.Add( winner.Serial, dp );
            }

            if( PointsTable.ContainsKey( loser.Serial ) )
            {
                DuelPoints dp = ( DuelPoints )PointsTable[loser.Serial];
                dp.Losses++;
            }
            else
            {
                DuelPoints dp = new DuelPoints( loser, 0, 1 );
                PointsTable.Add( loser.Serial, dp );
            }
        }

        public static void DestroyDuel( Duel duel )
        {
            if( duel.Attacker != null )
                m_CurrentDuels.Remove( duel.Attacker.Serial );

            if( duel.Defender != null )
                m_CurrentDuels.Remove( duel.Defender.Serial );
        }
    }

    public class SelectDueler : Target
    {
        private int[] m_Switches;
        private bool m_SevenFiveX;
        private Duel m_Duel;

        public SelectDueler( Duel duel, int[] switches, bool sevenFiveX ) : base( 100, false, TargetFlags.None )
        {
            m_Duel = duel;
            m_Switches = switches;
            m_SevenFiveX = sevenFiveX;
        }

        protected override void OnTargetOutOfLOS( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetNotAccessible( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetUntargetable( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetDeleted( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnCantSeeTarget( Mobile from, object targeted )
        {
            from.SendMessage( "You cannot see that." );
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetCancel( Mobile from, TargetCancelType cancelType )
        {
            base.OnTargetCancel( from, cancelType );
            OnSiteCore.DestroyDuel( m_Duel );
            from.SendMessage( "You have cancelled the duel request." );
        }

        protected override void OnTarget( Mobile from, object target )
        {
            if( target is PlayerMobile )
            {
                Mobile m = ( Mobile )target;

                if( m.NetState == null )
                {
                    from.SendMessage( "That player is not online." );                    
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;                
                }

                if( m == from )
                {
                    from.SendMessage( "You slap yourself across the face and declare yourself the winner." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if (m.Criminal)
                {
                    m.SendMessage("You may not start a duel with someone who is flagged criminal.");
                    from.SendMessage("Select a new target.");
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( Spells.SpellHelper.CheckCombat( m ) )
                {
                    from.SendMessage( "That person is currently in combat. You must wait to duel them." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( m.SkillsTotal > 500 && !m_SevenFiveX )
                {
                    from.SendMessage( "That player has over 500 skillpoints and is not a valid candidate for a 5X duel." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( !OnSiteCore.IsInDuel( m ) )
                {
                    if( !m.HasGump( typeof( DuelAcceptGump ) ) )
                    {
                        Rectangle2D r = new Rectangle2D( from.Location.X, from.Location.Y, ( m.Location.X - from.Location.X ), ( m.Location.Y - from.Location.Y ) );

                        int xMid = r.X + ( r.Width / 2 );
                        int yMid = r.Y + ( r.Height / 2 );

                        Point2D mid = new Point2D( xMid, yMid );
                        Point3D location;

                        Item poll = new Item( 0x9 );
                        location = new Point3D( xMid - 1, yMid, from.Location.Z + 70 );
                        poll.Movable = false;
                        poll.Name = "a duel request post";
                        poll.MoveToWorld( location, from.Map );

                        Item holder = new Item( 0xB99 );
                        location = new Point3D( xMid, yMid, from.Location.Z + 70 );
                        holder.Movable = false;
                        holder.Name = "a duel request post";
                        holder.MoveToWorld( location, from.Map );

                        Item sign = new Item( 0xBBF );
                        sign.Movable = false;
                        sign.Name = "a duel request post";
                        sign.MoveToWorld( location, from.Map );

                        Item[] items = new Item[] { poll, holder, sign };  

                        foreach( Mobile mob in from.GetMobilesInRange( 10 ) )
                        {
                            if( mob != null )
                                mob.SendMessage( String.Format( "{0} has challenged {1} to a duel.", from.Name, m.Name ) );
                        }

                        new DropDuelFlag( items ).Start();
                        m_Duel.Items = items;
                        m_Duel.Switches = m_Switches;
                        m.CloseGump( typeof( DuelAcceptGump ) );
                        m.SendGump( new DuelAcceptGump( m_Duel, m_Switches, from, m, items ) );
                    }
                    else
                    {
                        m.SendMessage( "That player has already been offered a duel." );
                        from.SendMessage( "Select a new target." );
                        from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                        return;
                    }
                }
                else
                {
                    from.SendMessage( "That player is already in a duel." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }
            }
            else
            {
                from.SendMessage( "You may only duel players." );
                from.SendMessage( "Select a new target." );
                from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                return;
            }
        }

        public class DropDuelFlag : Timer
        {
            Item[] m_Items;
            int count = 0;

            public DropDuelFlag( Item[] items ) : base( TimeSpan.FromSeconds( .1 ), TimeSpan.FromSeconds( .1 ) )
            {
                m_Items = items;
            }

            protected override void OnTick()
            {
                if( count <= 13 )
                {
                    count++;
                    foreach( Item i in m_Items )
                    {
                        if( !i.Deleted && i != null )
                        {
                            Point3D location = new Point3D( i.Location.X, i.Location.Y, ( i.Location.Z - 5 ) );
                            i.MoveToWorld( location );
                        }
                    }
                }
                else
                    Stop();
            }
        }
    }
}

public class Duel
{
    private Mobile m_Attacker;
    private Mobile m_Defender;
    private Item[] m_Items;
    private int[] m_Switches;
    private bool m_Started = false;

    public bool Started { get { return m_Started; } set { m_Started = value; } }
    public int[] Switches { get { return m_Switches; } set { m_Switches = value; } }
    public Item[] Items { get { return m_Items; } set { m_Items = value; } }
    public Mobile Attacker { get { return m_Attacker; } set { m_Attacker = value; } }
    public Mobile Defender { get { return m_Defender; } set { m_Defender = value; } }

    private bool m_MagicWeapons;
    private bool m_MagicArmor;
    private bool m_Potions;
    private bool m_Bandaids;
    private bool m_Mounts;
    private bool m_Pets;
    private bool m_MagicOnly;
    private bool m_KeepScore;
    private bool m_SevenFiveX;
    private ArrayList m_AttackerFollowers;
    private ArrayList m_DefenderFollowers;

    public bool MagicWeapons { get { return m_MagicWeapons; } set { m_MagicWeapons = value; } }
    public bool MagicArmor { get { return m_MagicArmor; } set { m_MagicArmor = value; } }
    public bool Potions { get { return m_Potions; } set { m_Potions = value; } }
    public bool Bandaids { get { return m_Bandaids; } set { m_Bandaids = value; } }
    public bool Mounts { get { return m_Mounts; } set { m_Mounts = value; } }
    public bool Pets { get { return m_Pets; } set { m_Pets = value; } }
    public bool MagicOnly { get { return m_MagicOnly; } set { m_MagicOnly = value; } }
    public bool KeepScore { get { return m_KeepScore; } set { m_KeepScore = value; } }
    public bool SevenFiveX { get { return m_SevenFiveX; } set { m_SevenFiveX = value; } }    
    
    public Duel( Mobile attacker )
    {
        m_Attacker = attacker;
        m_AttackerFollowers = new ArrayList();
        m_DefenderFollowers = new ArrayList();
    }

    public void StartDuel()
    {
        SetupDuel();
        SetupDuelers();
        Started = true;
        new DuelStartTimer( this, new Mobile[] { m_Attacker, m_Defender }, m_Items ).Start();
    }

    private void SetupDuel()
    {
        MagicWeapons = false;
        MagicArmor = false;
        Potions = false;
        Bandaids = false;
        Mounts = false;
        Pets = false;
        MagicOnly = false;
        KeepScore = false;
        SevenFiveX = false;

        for( int i = 0; i < m_Switches.Length; i++ )
        {
            switch( m_Switches[i] )
            {
                case 2: { SevenFiveX = true; break; }
                case 3: { KeepScore = true; break; }
                case 4: { MagicOnly = true; break; }
                case 5: { Pets = true; break; }
                case 6: { Mounts = true; break; }
                case 7: { Bandaids = true; break; }
                case 8: { Potions = true; break; }
                case 9: { MagicArmor = true; break; }
                case 10: { MagicWeapons = true; break; }
            }
        }        
    }

    private void SetupDuelers()
    {
        Mobile[] mobiles = new Mobile[] { m_Attacker, m_Defender };

        foreach( Mobile m in mobiles )
        {
            if( !m.Alive )
                m.Resurrect();

            Container bp = m.Backpack;
            Container bag = new Bag();
            bag.Hue = 38;
            BankBox bank = m.BankBox;
            Item oncurs = m.Holding;

            if( oncurs != null )
                bp.DropItem( oncurs );

            m.CurePoison( m );

            m.Hits = m.HitsMax;
            m.Mana = m.ManaMax;
            m.Stam = m.StamMax;

            m.StatMods.Clear();

            ArrayList items = new ArrayList();

            foreach( Layer layer in EquipmentLayers )
            {
                Item item = m.FindItemOnLayer( layer );

                if( item != null )
                {
                    if( item is BaseWeapon && !MagicWeapons )
                    {
                        BaseWeapon weapon = ( BaseWeapon )item;

                        if( weapon.AccuracyLevel != WeaponAccuracyLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DamageLevel != WeaponDamageLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DurabilityLevel != WeaponDurabilityLevel.Regular )
                            items.Add( weapon );

                    }
                    else if( item is BaseArmor && !MagicArmor )
                    {
                        BaseArmor armor = ( BaseArmor )item;

                        if( armor.Durability != ArmorDurabilityLevel.Regular )
                            items.Add( armor );
                        else if( armor.ProtectionLevel != ArmorProtectionLevel.Regular )
                            items.Add( armor );

                    }
                }
            }

            foreach( Item item in m.Backpack.Items )
            {
                if( item != null )
                {

                    if( item is BaseWeapon && !MagicWeapons)
                    {
                        BaseWeapon weapon = ( BaseWeapon )item;

                        if( weapon.AccuracyLevel != WeaponAccuracyLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DamageLevel != WeaponDamageLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DurabilityLevel != WeaponDurabilityLevel.Regular )
                            items.Add( weapon );
                   
                    }
                    else if( item is BaseArmor && !MagicArmor )
                    {
                        BaseArmor armor = ( BaseArmor )item;

                        if( armor.Durability != ArmorDurabilityLevel.Regular )
                            items.Add( armor );
                        else if( armor.ProtectionLevel != ArmorProtectionLevel.Regular )
                            items.Add( armor );                        
                    }
                    else if( item is BasePotion && !Potions )
                        items.Add( item );
                    else if( item is EtherealMount && !Mounts )
                        items.Add( item );
                    else if( item is Bandage && !Bandaids )
                        items.Add( item );
                }
            }            

            if( !Mounts )
            {

                if( m.Mount != null )
                {
                    IMount mount = m.Mount;
                    mount.Rider = null;
                    if( mount is BaseMount )
                    {
                        if( mount is BaseCreature )
                        {
                            BaseCreature bc = ( BaseCreature )mount;
                            bc.ControlTarget = null;
                            bc.ControlOrder = OrderType.Stay;
                            bc.Internalize();

                            bc.SetControlMaster( null );
                            bc.SummonMaster = null;

                            bc.IsStabled = true;
                            m.Stabled.Add( bc );
                            if (m == m_Attacker)
                                m_AttackerFollowers.Add(bc);
                            else
                                m_DefenderFollowers.Add(bc);
                        }
                    }
                }
            }

            ArrayList pets = new ArrayList();

            if( !Pets )
            {
                foreach( Mobile mob in World.Mobiles.Values )
                {
                    if( mob is BaseCreature )
                    {
                        BaseCreature bc = ( BaseCreature )mob;

                        if( ( bc.Controled && bc.ControlMaster == m ) || ( bc.Summoned && bc.SummonMaster == m ) )
                            pets.Add( bc );
                    }
                }
                

                foreach( BaseCreature c in pets )
                {
                    if( c != null )
                    {
                        c.ControlTarget = null;
                        c.ControlOrder = OrderType.Stay;
                        c.Internalize();

                        c.SetControlMaster( null );
                        c.SummonMaster = null;

                        c.IsStabled = true;
                        m.Stabled.Add( c );
                        if (m == m_Attacker)
                            m_AttackerFollowers.Add(c);
                        else
                            m_DefenderFollowers.Add(c);
                    }
                }
            }

            foreach( Item item in items )
            {
                bag.AddItem( item );
            }

            if( bag.Items.Count > 0 )
                bank.DropItem( bag );
            else
                bag.Delete();
        }
    }

    private Layer[] EquipmentLayers = new Layer[]
		{
			Layer.Cloak,
			Layer.Bracelet,
			Layer.Ring,
			Layer.Shirt,
			Layer.Pants,
			Layer.InnerLegs,
			Layer.Shoes,
			Layer.Arms,
			Layer.InnerTorso,
			Layer.MiddleTorso,
			Layer.OuterLegs,
			Layer.Neck,
			Layer.Waist,
			Layer.Gloves,
			Layer.OuterTorso,
			Layer.OneHanded,
			Layer.TwoHanded,
			Layer.FacialHair,
			Layer.Hair,
			Layer.Helm
		};

    public void EndDuel( Mobile loser )
    {
        Started = false;

        if( !loser.Alive )
        {
            loser.Resurrect();
            HandleCorpse( loser );
        }

        foreach (BaseCreature bc in m_DefenderFollowers)
        {
            bc.ControlTarget = m_Defender;
            bc.ControlOrder = OrderType.Stay;

            bc.SetControlMaster(m_Defender);
            bc.SummonMaster = m_Defender;

            bc.IsStabled = false;
            bc.MoveToWorld(m_Defender.Location, m_Defender.Map);
            m_Defender.Stabled.Remove(bc);
        }

        foreach (BaseCreature bc in m_AttackerFollowers)
        {
            bc.ControlTarget = m_Attacker;
            bc.ControlOrder = OrderType.Stay;

            bc.SetControlMaster(m_Attacker);
            bc.SummonMaster = m_Attacker;

            bc.IsStabled = false;
            bc.MoveToWorld(m_Attacker.Location, m_Attacker.Map);
            m_Attacker.Stabled.Remove(bc);
        }

        Mobile[] mobs = new Mobile[] { Attacker, Defender };
        
        foreach( Mobile m in mobs )
        {
            m.Aggressed.Clear();
            m.Aggressors.Clear();
            m.Hits = m.HitsMax;
            m.Stam = m.StamMax;
            m.Mana = m.ManaMax;
            m.DamageEntries.Clear();
            m.Combatant = null;
            m.Blessed = true;
            m.SendMessage( String.Format( "You have been made invulnerable for 10 seconds." ) );
        }

        new InvulTimer( mobs ).Start();
        new RaiseDuelFlag( this, m_Items ).Start();
    }

    public void HandleCorpse( Mobile from )
		{
			if( from.Corpse != null )
			{
				Corpse c = (Corpse)from.Corpse;
				Container b = from.Backpack;

				foreach( Item i in new ArrayList( c.Items ) )
				{
					if( i.Map != Map.Internal )
						b.AddItem( i );
				}

				c.Delete();

				from.SendMessage( 1161, "The contents of your corpse have been safely placed into your backpack" );
			}
		}

    public class DuelStartTimer : Timer
    {
        Item[] m_Items;
        Mobile[] m_Mobiles;
        Duel m_Duel;
        int count = 5;

        public DuelStartTimer( Duel duel, Mobile[] mobiles, Item[] items ) 
            : base( TimeSpan.FromSeconds( 0 ), TimeSpan.FromSeconds( 1.0 ) )
        {
            m_Duel = duel;
            m_Items = items;
            m_Mobiles = mobiles;
        }

        protected override void OnTick()
        {
            if( count <= 0 )
            {
                foreach( Mobile m in m_Mobiles )
                    if( m != null )
                        m.SendMessage( "Fight!" );
                m_Duel.Started = true;
                Stop();
            }

            foreach( Mobile m in m_Mobiles )
                if( m != null )
                    m.SendMessage( String.Format( "{0}", count ) );

            count--;            
        }
    }

    public class InvulTimer : Timer
    {
        Mobile[] m_Mobiles;
        DuelFixBall[] m_FixBall;
        int count = 0;

        public InvulTimer( Mobile[] mobiles )
            : base( TimeSpan.FromSeconds( 0 ), TimeSpan.FromSeconds( 1.0 ) )
        {
            m_Mobiles = mobiles;
            m_FixBall = new DuelFixBall[2];

            int i = 0;
            foreach( Mobile m in mobiles )
            {
                Container b = m.Backpack;
                DuelFixBall d = new DuelFixBall();
                b.AddItem( d );
                m_FixBall[i] = d;
                i++;
            }
        }

        protected override void OnTick()
        {
            if( count >= 10 )
            {
                int i = 0;
                foreach( Mobile m in m_Mobiles )
                {
                    if( m != null )
                    {
                        m.SendMessage( String.Format( "You are no longer invulnerable." ) );
                        m_FixBall[i].Delete();
                        m.Blessed = false;
                    }
                    i++;
                }

                Stop();
            }

            count++;
        }
    }

    public class RaiseDuelFlag : Timer
    {
        Item[] m_Items;
        Duel m_Duel;
        int count = 0;

        public RaiseDuelFlag( Duel duel, Item[] items )
            : base( TimeSpan.FromSeconds( .1 ), TimeSpan.FromSeconds( .1 ) )
        {
            m_Items = items;
            m_Duel = duel;
        }

        protected override void OnTick()
        {
            if( count <= 13 )
            {
                count++;
                foreach( Item i in m_Items )
                {
                    if( !i.Deleted && i != null )
                    {
                        Point3D location = new Point3D( i.Location.X, i.Location.Y, ( i.Location.Z + 5 ) );
                        i.MoveToWorld( location );
                    }
                }
            }
            else
            {
                foreach( Item i in m_Items )
                    if( i != null && !i.Deleted )
                        i.Delete();

                Server.Customs.OnSiteDueling.OnSiteCore.DestroyDuel( m_Duel );
                Stop();
            }
        }
    }
}

public class DuelPoints
{
    private Mobile m_Mobile;
    private int m_Wins;
    private int m_Losses;

    public Mobile Mob { get { return m_Mobile; } }
    public int Wins { get { return m_Wins; } set { m_Wins = value; } }
    public int Losses { get { return m_Losses; } set { m_Losses = value; } }
    
    public DuelPoints( Mobile m, int wins, int losses )
    {
        m_Mobile = m;
        m_Wins = wins;
        m_Losses = losses;
    }

    public DuelPoints()
    {

    }

    public void Serialize( GenericWriter writer )
    {
        writer.Write( ( int )0 );//Version

        writer.Write( ( Mobile )m_Mobile );
        writer.Write( ( int )m_Wins );
        writer.Write( ( int )m_Losses );
    }

    public void Deserialize( GenericReader reader )
    {
        int version = reader.ReadInt();

        switch( version )
        {
            case 0:
            {
                m_Mobile = reader.ReadMobile();
                m_Wins = reader.ReadInt();
                m_Losses = reader.ReadInt();
                break;
            }
        }
    }
}
 

stu

Wanderer
another one last night :(
Code:
Server Crash Report
===================

RunUO Version 1.0.0, Build 36918
Operating System: Microsoft Windows NT 5.2.3790.0
.NET Framework: 1.1.4322.2300
Time: 5/8/2006 11:51:11 PM
Mobiles: 21857
Items: 430969
Clients:
- Count: 16
+ Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
   at Duel.EndDuel(Mobile loser) in c:\UOSERVER\RunUO 1.0\Scripts\Customs\Sorious' PvpKit\Duels\Onsite\OnSiteCore.cs:line 982
   at Server.Customs.OnSiteDueling.OnSiteCore.EventSink_PlayerDeath(PlayerDeathEventArgs e) in c:\UOSERVER\RunUO 1.0\Scripts\Customs\Sorious' PvpKit\Duels\Onsite\OnSiteCore.cs:line 380
   at Server.PlayerDeathEventHandler.Invoke(PlayerDeathEventArgs e)
   at Server.Mobile.OnDeath(Container c)
   at Server.Mobiles.PlayerMobile.OnDeath(Container c) in c:\UOSERVER\RunUO 1.0\Scripts\Mobiles\playermobile.cs:line 1987
   at Server.Mobile.Kill()
   at Server.Mobile.Damage(Int32 amount, Mobile from)
   at Server.Mobiles.PlayerMobile.Damage(Int32 amount, Mobile from) in c:\UOSERVER\RunUO 1.0\Scripts\Mobiles\playermobile.cs:line 2272
   at Server.AOS.Damage(Mobile m, Mobile from, Int32 damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy, Boolean keepAlive) in c:\UOSERVER\RunUO 1.0\Scripts\Misc\AOS.cs:line 69
   at Server.AOS.Damage(Mobile m, Mobile from, Int32 damage, Int32 phys, Int32 fire, Int32 cold, Int32 pois, Int32 nrgy) in c:\UOSERVER\RunUO 1.0\Scripts\Misc\AOS.cs:line 56
   at Server.Spells.SpellDamageTimerAOS.OnTick() in c:\UOSERVER\RunUO 1.0\Scripts\Spells\Base\SpellHelper.cs:line 895
   at Server.Timer.Slice()
   at Server.Core.Main(String[] args)
 

Jeff

Lord
I will get to the as soon as i can, im on vacation and dont have time nor access atm to fix this. :( sry for the inconvinience.
 

stu

Wanderer
We added a fix for the null............
I dont know if it will work tho...
Code:
using System;
using System.IO;
using System.Text;
using System.Collections;

using Server;
using Server.Items;
using Server.Mobiles;
using Server.Targets;
using Server.Targeting;
using Server.Network;
using Server.Gumps;
using Server.Factions;
using Server.Customs.OnSiteDueling.Gumps;
using Server.Customs.OnSiteDueling.Items;

namespace Server.Customs.OnSiteDueling
{
    public class OnSiteCore
    {

        public const bool Enabled = true;                                      //Enable/Disable the entire system
        private static int m_MaxDist = 30;                                      //Sets the max distance a player can run from another player without ending the duel.
        private static bool m_WorldBroadcastWins = true;                        //If true will broadcast the winner of each duel.
        private static bool m_KeepScore = true;                                 //Turn the score keeping system on/off;
        private static bool m_UseCommand = true;                                //Turn the command to duel on/off.
        private static string m_ChallengeString = "i challenge thee to a duel"; //String used to start a duel.
        private static string m_DuelCommand = "OnSiteDuel";                     //The command players can call to duel someone.
        private static string m_GetPointsString = "showpoints";                 //String used to get your duelpoints.
        private static Hashtable m_CurrentDuels;                                //This is the container for each duel in progress
        private static Hashtable m_PointsTable;                                 //Points tracker.
        private static string m_SavePath = Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves\\scores.bin" );//Save path.

        private static string m_Version = "2.0.2";
                
        public static string Version { get { return m_Version; } }
        public static Hashtable CurrentDuels { get { return m_CurrentDuels; } set { m_CurrentDuels = value; } }
        public static Hashtable PointsTable { get { return m_PointsTable; } set { m_PointsTable = value; } }

        public static void Initialize()
        {
            if( Enabled )
            {
                if( m_KeepScore )
                    m_PointsTable = new Hashtable();

                if( m_UseCommand )
                    Commands.Register( m_DuelCommand, AccessLevel.Player, new CommandEventHandler( OnSiteDuel_Command ) );//Command event.
                    Commands.Register( "FixDuels", AccessLevel.Counselor, new CommandEventHandler( FixDuels_Command ) );//Command event.

                m_CurrentDuels = new Hashtable();

                Load();


                EventSink.Speech += new SpeechEventHandler( EventSink_Speech );
                EventSink.WorldSave += new WorldSaveEventHandler( EventSink_WorldSave );
                EventSink.Movement += new MovementEventHandler( EventSink_Movement );//Checks distance between players.
                EventSink.PlayerDeath += new PlayerDeathEventHandler( EventSink_PlayerDeath );//Checks each death to see if the player was in a duel.
            }
            
        }

        [Usage( "FixDuels" )]
        [Description( "Fixes Duels" )]
        private static void FixDuels_Command( CommandEventArgs args )
        {
            m_CurrentDuels.Clear();
        }
        [Usage( "OnSiteDuel" )]
        [Description( "Initiates a duel request with the targeted player." )]
        private static void OnSiteDuel_Command( CommandEventArgs args )
        {
            Mobile m = ( Mobile )args.Mobile;

            if( m == null )
                return;

            if( !CanDuel(m) )
                return;

            Duel duel = new Duel( m );
            m_CurrentDuels.Add( m.Serial, duel );
            
            m.CloseGump( typeof( DuelAcceptGump ) );
            m.CloseGump( typeof( DuelOptionsGump ) );
            m.SendGump( new DuelOptionsGump( duel ) );

        }

        public static bool CanDuel( Mobile m )
        {            
            if (m.Criminal)
            {
                m.SendMessage("You may not start a duel while flagged criminal.");
                return false;
            }
            else if( Spells.SpellHelper.CheckCombat( m ) )
            {
                m.SendMessage( "You cannot start a duel while in combat." );
                return false;
            }
            else if( m.HasGump( typeof( DuelOptionsGump ) ) )
            {
                m.SendMessage( "You are already initiating a duel." );
                return false;
            }
            else if( m.HasGump( typeof( DuelAcceptGump ) ) )
            {
                m.SendMessage( "You are already approving a duel." );
                return false;
            }
            else if( IsInDuel( m ) )
            {
                m.SendMessage( "You are currently in a duel." );
                return false;
            }
            else if( m.Target is SelectDueler )
            {
                m.SendMessage( "You are already starting a duel." );
                return false;
            }
            else if( Factions.Sigil.ExistsOn( m ) )
            {
                m.SendMessage( "You may not challenge someone while you have a faction sigil." );
                return false;
            }

            return true;
        }

        private static void EventSink_Speech( SpeechEventArgs e )
        {
            Mobile mobile = e.Mobile;

            if( e.Speech.ToLower().IndexOf( m_GetPointsString ) >= 0 )
            {
                if( mobile != null )
                {
                    if( PointsTable.ContainsKey( mobile.Serial ) )
                    {
                        DuelPoints dp = ( DuelPoints )PointsTable[mobile.Serial];
                        mobile.NonlocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "{0} Wins/{1} Loses", dp.Wins, dp.Losses ) );
                        mobile.LocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "{0} Wins/{1} Loses", dp.Wins, dp.Losses ) );
                    }
                    else
                    {
                        mobile.NonlocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "I have not duel yet" ) );
                        mobile.LocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "You have not duel yet" ) );
                    }
                }
            }

            if( e.Speech.ToLower().IndexOf( "bank" ) >= 0 )
            {
                if( IsInDuel( mobile ) )
                {
                    e.Handled = true;
                    return;
                }
            }
            
            if( e.Speech.ToLower().IndexOf( m_ChallengeString ) >= 0 )
            {
                Mobile m = mobile;
                PlayerMobile pm = ( PlayerMobile )m;

                if( m == null )
                    return;

                if( !CanDuel( m ) )
                    return;

                Duel duel = new Duel( m );
                m_CurrentDuels.Add( m.Serial, duel );

                m.CloseGump( typeof( DuelAcceptGump ) );
                m.CloseGump( typeof( DuelOptionsGump ) );
                m.SendGump( new DuelOptionsGump( duel ) );             
            }
        }

        private static void EventSink_WorldSave( WorldSaveEventArgs e )
        {
            if( m_KeepScore )
            {
                if( !Directory.Exists( Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves" ) ) )
                    Directory.CreateDirectory( Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves" ) );

                GenericWriter bin = new BinaryFileWriter( m_SavePath, true );

                try
                {
                    bin.Write( ( int )0 );//Versioning

                    ArrayList keyList = new ArrayList();
                    ArrayList valueList = new ArrayList();

                    IDictionaryEnumerator myEnum = m_PointsTable.GetEnumerator();

                    while( myEnum.MoveNext() )
                    {
                        keyList.Add( myEnum.Key );
                        valueList.Add( myEnum.Value );
                    }

                    int count = keyList.Count;

                    bin.Write( ( int )count );

                    for( int i = 0; i < count; i++ )
                    {
                        Serial key = ( Serial )keyList[i];
                        DuelPoints dp = ( DuelPoints )valueList[i];

                        bin.Write( ( int )key );
                        dp.Serialize( bin );
                    }
                }
                catch( Exception err )
                {
                    Console.WriteLine( err.ToString() );
                }
                finally
                {
                    bin.Close();
                }
            }
        }

        private static void Load()
        {
            if( m_KeepScore )
            {
                if( File.Exists( m_SavePath ) )
                {

                        using( FileStream fs = new FileStream( m_SavePath, FileMode.Open, FileAccess.Read, FileShare.Read ) )
                        {
                            try
                            {
                                BinaryReader br = new BinaryReader( fs );
                                BinaryFileReader reader = new BinaryFileReader( br );

                                int version = reader.ReadInt();

                                switch( version )
                                {
                                    case 0:
                                        {
                                            int count = reader.ReadInt();
                                            for( int i = 0; i < count; i++ )
                                            {
                                                DuelPoints dp = new DuelPoints();
                                                Serial s = reader.ReadInt();
                                                dp.Deserialize( reader );
                                                PointsTable.Add( s, dp );
                                            }

                                            break;
                                        }
                                }
                            }
                            catch( Exception err )
                            {
                                Console.WriteLine( err.ToString() );
                            }
                            finally
                            {
                                fs.Close();
                            } 
                        }
                    
                    
                }
            }

            foreach( Mobile m in World.Mobiles.Values )
            {
                if( m != null )
                {
                    if( m.Player )
                    {
                        Container b = m.Backpack;

                        if( b != null )
                        {
                            ArrayList toDelete = new ArrayList();
                            foreach( Item i in b.Items )
                            {
                                if( i != null && i is DuelFixBall )                                
                                {
                                    m.Blessed = false;
                                    toDelete.Add( i );
                                }
                            }

                            if( toDelete.Count > 0 )
                            {
                                foreach( Item i in toDelete )
                                    i.Delete();
                            }
                        }
                    }
                }
            }
        }

        private static void EventSink_Movement( MovementEventArgs e )
        {
            Mobile m = e.Mobile;

            if( m == null )
                return;

            if( m is PlayerMobile )
            {
                if( IsInDuel( m ) )
                {
                    Duel duel = GetDuel( m );

                    if (duel.Started)
                    {
                        if ((duel.Defender.Location.X - duel.Attacker.Location.X) >= m_MaxDist ||
                            (duel.Defender.Location.X - duel.Attacker.Location.X) <= -m_MaxDist ||
                            (duel.Defender.Location.Y - duel.Attacker.Location.Y) >= m_MaxDist ||
                            (duel.Defender.Location.Y - duel.Attacker.Location.Y) <= -m_MaxDist)
                        {
                            duel.EndDuel(duel.Defender);
                            duel.Attacker.SendMessage("The duel was ended because one or more parties has fleed the battle");
                            duel.Defender.SendMessage("The duel was ended because one or more parties has fleed the battle");
                            m_CurrentDuels.Remove(duel);
                        }

                        if (duel.MagicOnly)
                        {

                            foreach (Layer layer in WeaponCheckLayers)
                            {
                                Item i = m.FindItemOnLayer(layer);

                                if (i != null)
                                {
                                    Container bp = m.Backpack;

                                    if (i is BaseWeapon)
                                    {
                                        BaseWeapon weapon = (BaseWeapon)i;
                                        bp.AddItem(weapon);
                                        m.SendMessage("This is a Magic Only duel. Please follow the rules!");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        private static Layer[] WeaponCheckLayers = new Layer[]
		{
			Layer.OneHanded,
			Layer.TwoHanded,
		};

        private static void EventSink_PlayerDeath( PlayerDeathEventArgs e )
        {
            Duel duel;
            Mobile m = e.Mobile;

            if( m == null )
                return;

            if( IsInDuel( m ) )
            {
                duel = GetDuel( m );

                if( duel != null )
                {
                    duel.EndDuel( m );
                    m_CurrentDuels.Remove( duel );

                    if( duel.Attacker != null && duel.Defender != null )
                    {
                        if( m_WorldBroadcastWins )
                        {
                            if( m == duel.Attacker )
                                World.Broadcast( 0, false, String.Format( "{0} has defeated {1} in a duel.", duel.Defender.Name, duel.Attacker.Name ) );
                            else
                                World.Broadcast( 0, false, String.Format( "{0} has defeated {1} in a duel.", duel.Attacker.Name, duel.Defender.Name ) );
                        }

                        if( m_KeepScore && duel.KeepScore )
                        {
                            if( m == duel.Attacker )
                                UpdatePoints( duel.Defender, duel.Attacker );
                            else
                                UpdatePoints( duel.Attacker, duel.Defender );
                        }
                    }
                }
            }
        }        

        public static Duel GetDuel( Mobile m )
        {
            if( m_CurrentDuels.ContainsKey( m.Serial ) )
                return ( Duel )m_CurrentDuels[m.Serial];

            return null;    
        }

        public static bool IsInDuel( Mobile m )
        {
            if( m_CurrentDuels.ContainsKey( m.Serial ) )
                return true;

            return false;  
        }

        private static void UpdatePoints( Mobile winner, Mobile loser )
        {
            if( PointsTable.ContainsKey( winner.Serial ) )
            {
                DuelPoints dp = ( DuelPoints )PointsTable[winner.Serial];
                dp.Wins++;
            }
            else
            {
                DuelPoints dp = new DuelPoints( winner, 1, 0 );
                PointsTable.Add( winner.Serial, dp );
            }

            if( PointsTable.ContainsKey( loser.Serial ) )
            {
                DuelPoints dp = ( DuelPoints )PointsTable[loser.Serial];
                dp.Losses++;
            }
            else
            {
                DuelPoints dp = new DuelPoints( loser, 0, 1 );
                PointsTable.Add( loser.Serial, dp );
            }
        }

        public static void DestroyDuel( Duel duel )
        {
            if( duel.Attacker != null )
                m_CurrentDuels.Remove( duel.Attacker.Serial );

            if( duel.Defender != null )
                m_CurrentDuels.Remove( duel.Defender.Serial );
        }
    }

    public class SelectDueler : Target
    {
        private int[] m_Switches;
        private bool m_SevenFiveX;
        private Duel m_Duel;

        public SelectDueler( Duel duel, int[] switches, bool sevenFiveX ) : base( 100, false, TargetFlags.None )
        {
            m_Duel = duel;
            m_Switches = switches;
            m_SevenFiveX = sevenFiveX;
        }

        protected override void OnTargetOutOfLOS( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetNotAccessible( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetUntargetable( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetDeleted( Mobile from, object targeted )
        {

            from.SendMessage( "You cannot see that." ); 
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnCantSeeTarget( Mobile from, object targeted )
        {
            from.SendMessage( "You cannot see that." );
            from.SendMessage( "Select a new target." );
            from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
            return;
        }

        protected override void OnTargetCancel( Mobile from, TargetCancelType cancelType )
        {
            base.OnTargetCancel( from, cancelType );
            OnSiteCore.DestroyDuel( m_Duel );
            from.SendMessage( "You have cancelled the duel request." );
        }

        protected override void OnTarget( Mobile from, object target )
        {
            if( target is PlayerMobile )
            {
                Mobile m = ( Mobile )target;

                if( m.NetState == null )
                {
                    from.SendMessage( "That player is not online." );                    
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;                
                }

                if( m == from )
                {
                    from.SendMessage( "You slap yourself across the face and declare yourself the winner." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if (m.Criminal)
                {
                    m.SendMessage("You may not start a duel with someone who is flagged criminal.");
                    from.SendMessage("Select a new target.");
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( Spells.SpellHelper.CheckCombat( m ) )
                {
                    from.SendMessage( "That person is currently in combat. You must wait to duel them." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( m.SkillsTotal > 500 && !m_SevenFiveX )
                {
                    from.SendMessage( "That player has over 500 skillpoints and is not a valid candidate for a 5X duel." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }

                if( !OnSiteCore.IsInDuel( m ) )
                {
                    if( !m.HasGump( typeof( DuelAcceptGump ) ) )
                    {
                        Rectangle2D r = new Rectangle2D( from.Location.X, from.Location.Y, ( m.Location.X - from.Location.X ), ( m.Location.Y - from.Location.Y ) );

                        int xMid = r.X + ( r.Width / 2 );
                        int yMid = r.Y + ( r.Height / 2 );

                        Point2D mid = new Point2D( xMid, yMid );
                        Point3D location;

                        Item poll = new Item( 0x9 );
                        location = new Point3D( xMid - 1, yMid, from.Location.Z + 70 );
                        poll.Movable = false;
                        poll.Name = "a duel request post";
                        poll.MoveToWorld( location, from.Map );

                        Item holder = new Item( 0xB99 );
                        location = new Point3D( xMid, yMid, from.Location.Z + 70 );
                        holder.Movable = false;
                        holder.Name = "a duel request post";
                        holder.MoveToWorld( location, from.Map );

                        Item sign = new Item( 0xBBF );
                        sign.Movable = false;
                        sign.Name = "a duel request post";
                        sign.MoveToWorld( location, from.Map );

                        Item[] items = new Item[] { poll, holder, sign };  

                        foreach( Mobile mob in from.GetMobilesInRange( 10 ) )
                        {
                            if( mob != null )
                                mob.SendMessage( String.Format( "{0} has challenged {1} to a duel.", from.Name, m.Name ) );
                        }

                        new DropDuelFlag( items ).Start();
                        m_Duel.Items = items;
                        m_Duel.Switches = m_Switches;
                        m.CloseGump( typeof( DuelAcceptGump ) );
                        m.SendGump( new DuelAcceptGump( m_Duel, m_Switches, from, m, items ) );
                    }
                    else
                    {
                        m.SendMessage( "That player has already been offered a duel." );
                        from.SendMessage( "Select a new target." );
                        from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                        return;
                    }
                }
                else
                {
                    from.SendMessage( "That player is already in a duel." );
                    from.SendMessage( "Select a new target." );
                    from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                    return;
                }
            }
            else
            {
                from.SendMessage( "You may only duel players." );
                from.SendMessage( "Select a new target." );
                from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
                return;
            }
        }

        public class DropDuelFlag : Timer
        {
            Item[] m_Items;
            int count = 0;

            public DropDuelFlag( Item[] items ) : base( TimeSpan.FromSeconds( .1 ), TimeSpan.FromSeconds( .1 ) )
            {
                m_Items = items;
            }

            protected override void OnTick()
            {
                if( count <= 13 )
                {
                    count++;
                    foreach( Item i in m_Items )
                    {
                        if( !i.Deleted && i != null )
                        {
                            Point3D location = new Point3D( i.Location.X, i.Location.Y, ( i.Location.Z - 5 ) );
                            i.MoveToWorld( location );
                        }
                    }
                }
                else
                    Stop();
            }
        }
    }
}

public class Duel
{
    private Mobile m_Attacker;
    private Mobile m_Defender;
    private Item[] m_Items;
    private int[] m_Switches;
    private bool m_Started = false;

    public bool Started { get { return m_Started; } set { m_Started = value; } }
    public int[] Switches { get { return m_Switches; } set { m_Switches = value; } }
    public Item[] Items { get { return m_Items; } set { m_Items = value; } }
    public Mobile Attacker { get { return m_Attacker; } set { m_Attacker = value; } }
    public Mobile Defender { get { return m_Defender; } set { m_Defender = value; } }

    private bool m_MagicWeapons;
    private bool m_MagicArmor;
    private bool m_Potions;
    private bool m_Bandaids;
    private bool m_Mounts;
    private bool m_Pets;
    private bool m_MagicOnly;
    private bool m_KeepScore;
    private bool m_SevenFiveX;
    private ArrayList m_AttackerFollowers;
    private ArrayList m_DefenderFollowers;

    public bool MagicWeapons { get { return m_MagicWeapons; } set { m_MagicWeapons = value; } }
    public bool MagicArmor { get { return m_MagicArmor; } set { m_MagicArmor = value; } }
    public bool Potions { get { return m_Potions; } set { m_Potions = value; } }
    public bool Bandaids { get { return m_Bandaids; } set { m_Bandaids = value; } }
    public bool Mounts { get { return m_Mounts; } set { m_Mounts = value; } }
    public bool Pets { get { return m_Pets; } set { m_Pets = value; } }
    public bool MagicOnly { get { return m_MagicOnly; } set { m_MagicOnly = value; } }
    public bool KeepScore { get { return m_KeepScore; } set { m_KeepScore = value; } }
    public bool SevenFiveX { get { return m_SevenFiveX; } set { m_SevenFiveX = value; } }    
    
    public Duel( Mobile attacker )
    {
        m_Attacker = attacker;
        m_AttackerFollowers = new ArrayList();
        m_DefenderFollowers = new ArrayList();
    }

    public void StartDuel()
    {
        SetupDuel();
        SetupDuelers();
        Started = true;
        new DuelStartTimer( this, new Mobile[] { m_Attacker, m_Defender }, m_Items ).Start();
    }

    private void SetupDuel()
    {
        MagicWeapons = false;
        MagicArmor = false;
        Potions = false;
        Bandaids = false;
        Mounts = false;
        Pets = false;
        MagicOnly = false;
        KeepScore = false;
        SevenFiveX = false;

        for( int i = 0; i < m_Switches.Length; i++ )
        {
            switch( m_Switches[i] )
            {
                case 2: { SevenFiveX = true; break; }
                case 3: { KeepScore = true; break; }
                case 4: { MagicOnly = true; break; }
                case 5: { Pets = true; break; }
                case 6: { Mounts = true; break; }
                case 7: { Bandaids = true; break; }
                case 8: { Potions = true; break; }
                case 9: { MagicArmor = true; break; }
                case 10: { MagicWeapons = true; break; }
            }
        }        
    }

    private void SetupDuelers()
    {
        Mobile[] mobiles = new Mobile[] { m_Attacker, m_Defender };

        foreach( Mobile m in mobiles )
        {
            if( !m.Alive )
                m.Resurrect();

            Container bp = m.Backpack;
            Container bag = new Bag();
            bag.Hue = 38;
            BankBox bank = m.BankBox;
            Item oncurs = m.Holding;

            if( oncurs != null )
                bp.DropItem( oncurs );

            m.CurePoison( m );

            m.Hits = m.HitsMax;
            m.Mana = m.ManaMax;
            m.Stam = m.StamMax;

            m.StatMods.Clear();

            ArrayList items = new ArrayList();

            foreach( Layer layer in EquipmentLayers )
            {
                Item item = m.FindItemOnLayer( layer );

                if( item != null )
                {
                    if( item is BaseWeapon && !MagicWeapons )
                    {
                        BaseWeapon weapon = ( BaseWeapon )item;

                        if( weapon.AccuracyLevel != WeaponAccuracyLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DamageLevel != WeaponDamageLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DurabilityLevel != WeaponDurabilityLevel.Regular )
                            items.Add( weapon );

                    }
                    else if( item is BaseArmor && !MagicArmor )
                    {
                        BaseArmor armor = ( BaseArmor )item;

                        if( armor.Durability != ArmorDurabilityLevel.Regular )
                            items.Add( armor );
                        else if( armor.ProtectionLevel != ArmorProtectionLevel.Regular )
                            items.Add( armor );

                    }
                }
            }

            foreach( Item item in m.Backpack.Items )
            {
                if( item != null )
                {

                    if( item is BaseWeapon && !MagicWeapons)
                    {
                        BaseWeapon weapon = ( BaseWeapon )item;

                        if( weapon.AccuracyLevel != WeaponAccuracyLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DamageLevel != WeaponDamageLevel.Regular )
                            items.Add( weapon );
                        else if( weapon.DurabilityLevel != WeaponDurabilityLevel.Regular )
                            items.Add( weapon );
                   
                    }
                    else if( item is BaseArmor && !MagicArmor )
                    {
                        BaseArmor armor = ( BaseArmor )item;

                        if( armor.Durability != ArmorDurabilityLevel.Regular )
                            items.Add( armor );
                        else if( armor.ProtectionLevel != ArmorProtectionLevel.Regular )
                            items.Add( armor );                        
                    }
                    else if( item is BasePotion && !Potions )
                        items.Add( item );
                    else if( item is EtherealMount && !Mounts )
                        items.Add( item );
                    else if( item is Bandage && !Bandaids )
                        items.Add( item );
                }
            }            

            if( !Mounts )
            {

                if( m.Mount != null )
                {
                    IMount mount = m.Mount;
                    mount.Rider = null;
                    if( mount is BaseMount )
                    {
                        if( mount is BaseCreature )
                        {
                            BaseCreature bc = ( BaseCreature )mount;
                            bc.ControlTarget = null;
                            bc.ControlOrder = OrderType.Stay;
                            bc.Internalize();

                            bc.SetControlMaster( null );
                            bc.SummonMaster = null;

                            bc.IsStabled = true;
                            m.Stabled.Add( bc );
                            if (m == m_Attacker)
                                m_AttackerFollowers.Add(bc);
                            else
                                m_DefenderFollowers.Add(bc);
                        }
                    }
                }
            }

            ArrayList pets = new ArrayList();

            if( !Pets )
            {
                foreach( Mobile mob in World.Mobiles.Values )
                {
                    if( mob is BaseCreature )
                    {
                        BaseCreature bc = ( BaseCreature )mob;

                        if( ( bc.Controled && bc.ControlMaster == m ) || ( bc.Summoned && bc.SummonMaster == m ) )
                            pets.Add( bc );
                    }
                }
                

                foreach( BaseCreature c in pets )
                {
                    if( c != null )
                    {
                        c.ControlTarget = null;
                        c.ControlOrder = OrderType.Stay;
                        c.Internalize();

                        c.SetControlMaster( null );
                        c.SummonMaster = null;

                        c.IsStabled = true;
                        m.Stabled.Add( c );
                        if (m == m_Attacker)
                            m_AttackerFollowers.Add(c);
                        else
                            m_DefenderFollowers.Add(c);
                    }
                }
            }

            foreach( Item item in items )
            {
                bag.AddItem( item );
            }

            if( bag.Items.Count > 0 )
                bank.DropItem( bag );
            else
                bag.Delete();
        }
    }

    private Layer[] EquipmentLayers = new Layer[]
		{
			Layer.Cloak,
			Layer.Bracelet,
			Layer.Ring,
			Layer.Shirt,
			Layer.Pants,
			Layer.InnerLegs,
			Layer.Shoes,
			Layer.Arms,
			Layer.InnerTorso,
			Layer.MiddleTorso,
			Layer.OuterLegs,
			Layer.Neck,
			Layer.Waist,
			Layer.Gloves,
			Layer.OuterTorso,
			Layer.OneHanded,
			Layer.TwoHanded,
			Layer.FacialHair,
			Layer.Hair,
			Layer.Helm
		};

    public void EndDuel( Mobile loser )
    {
        Started = false;

        if( !loser.Alive )
        {
            loser.Resurrect();
            HandleCorpse( loser );
        }

        foreach (BaseCreature bc in m_DefenderFollowers)
        {
            bc.ControlTarget = m_Defender;
            bc.ControlOrder = OrderType.Stay;

            bc.SetControlMaster(m_Defender);
            bc.SummonMaster = m_Defender;

            bc.IsStabled = false;
            bc.MoveToWorld(m_Defender.Location, m_Defender.Map);
            m_Defender.Stabled.Remove(bc);
        }

        foreach (BaseCreature bc in m_AttackerFollowers)
        {
            bc.ControlTarget = m_Attacker;
            bc.ControlOrder = OrderType.Stay;

            bc.SetControlMaster(m_Attacker);
            bc.SummonMaster = m_Attacker;

            bc.IsStabled = false;
            bc.MoveToWorld(m_Attacker.Location, m_Attacker.Map);
            m_Attacker.Stabled.Remove(bc);
        }

        Mobile[] mobs = new Mobile[] { Attacker, Defender };

	//if ( m == null )
	//{
	//	Console.WriteLine( m );
	//	Console.WriteLine( "This is the m value in OnSiteCore.s" );
	//	return;
	//}
        
        foreach( Mobile m in mobs )
        {
		if ( m != null )
		{
        	    m.Aggressed.Clear();
        	    m.Aggressors.Clear();
        	    m.Hits = m.HitsMax;
        	    m.Stam = m.StamMax;
        	    m.Mana = m.ManaMax;
        	    m.DamageEntries.Clear();
        	    m.Combatant = null;
        	    m.Blessed = true;
        	    m.SendMessage( String.Format( "You have been made invulnerable for 10 seconds." ) );
		}
        }

        new InvulTimer( mobs ).Start();
        new RaiseDuelFlag( this, m_Items ).Start();
    }

    public void HandleCorpse( Mobile from )
		{
			if( from.Corpse != null )
			{
				Corpse c = (Corpse)from.Corpse;
				Container b = from.Backpack;

				foreach( Item i in new ArrayList( c.Items ) )
				{
					if( i.Map != Map.Internal )
						b.AddItem( i );
				}

				c.Delete();

				from.SendMessage( 1161, "The contents of your corpse have been safely placed into your backpack" );
			}
		}

    public class DuelStartTimer : Timer
    {
        Item[] m_Items;
        Mobile[] m_Mobiles;
        Duel m_Duel;
        int count = 5;

        public DuelStartTimer( Duel duel, Mobile[] mobiles, Item[] items ) 
            : base( TimeSpan.FromSeconds( 0 ), TimeSpan.FromSeconds( 1.0 ) )
        {
            m_Duel = duel;
            m_Items = items;
            m_Mobiles = mobiles;
        }

        protected override void OnTick()
        {
            if( count <= 0 )
            {
                foreach( Mobile m in m_Mobiles )
                    if( m != null )
                        m.SendMessage( "Fight!" );
                m_Duel.Started = true;
                Stop();
            }

            foreach( Mobile m in m_Mobiles )
                if( m != null )
                    m.SendMessage( String.Format( "{0}", count ) );

            count--;            
        }
    }

    public class InvulTimer : Timer
    {
        Mobile[] m_Mobiles;
        DuelFixBall[] m_FixBall;
        int count = 0;

        public InvulTimer( Mobile[] mobiles )
            : base( TimeSpan.FromSeconds( 0 ), TimeSpan.FromSeconds( 1.0 ) )
        {
            m_Mobiles = mobiles;
            m_FixBall = new DuelFixBall[2];

            int i = 0;
            foreach( Mobile m in mobiles )
            {
                Container b = m.Backpack;
                DuelFixBall d = new DuelFixBall();
                b.AddItem( d );
                m_FixBall[i] = d;
                i++;
            }
        }

        protected override void OnTick()
        {
            if( count >= 10 )
            {
                int i = 0;
                foreach( Mobile m in m_Mobiles )
                {
                    if( m != null )
                    {
                        m.SendMessage( String.Format( "You are no longer invulnerable." ) );
                        m_FixBall[i].Delete();
                        m.Blessed = false;
                    }
                    i++;
                }

                Stop();
            }

            count++;
        }
    }

    public class RaiseDuelFlag : Timer
    {
        Item[] m_Items;
        Duel m_Duel;
        int count = 0;

        public RaiseDuelFlag( Duel duel, Item[] items )
            : base( TimeSpan.FromSeconds( .1 ), TimeSpan.FromSeconds( .1 ) )
        {
            m_Items = items;
            m_Duel = duel;
        }

        protected override void OnTick()
        {
            if( count <= 13 )
            {
                count++;
                foreach( Item i in m_Items )
                {
                    if( !i.Deleted && i != null )
                    {
                        Point3D location = new Point3D( i.Location.X, i.Location.Y, ( i.Location.Z + 5 ) );
                        i.MoveToWorld( location );
                    }
                }
            }
            else
            {
                foreach( Item i in m_Items )
                    if( i != null && !i.Deleted )
                        i.Delete();

                Server.Customs.OnSiteDueling.OnSiteCore.DestroyDuel( m_Duel );
                Stop();
            }
        }
    }
}

public class DuelPoints
{
    private Mobile m_Mobile;
    private int m_Wins;
    private int m_Losses;

    public Mobile Mob { get { return m_Mobile; } }
    public int Wins { get { return m_Wins; } set { m_Wins = value; } }
    public int Losses { get { return m_Losses; } set { m_Losses = value; } }
    
    public DuelPoints( Mobile m, int wins, int losses )
    {
        m_Mobile = m;
        m_Wins = wins;
        m_Losses = losses;
    }

    public DuelPoints()
    {

    }

    public void Serialize( GenericWriter writer )
    {
        writer.Write( ( int )0 );//Version

        writer.Write( ( Mobile )m_Mobile );
        writer.Write( ( int )m_Wins );
        writer.Write( ( int )m_Losses );
    }

    public void Deserialize( GenericReader reader )
    {
        int version = reader.ReadInt();

        switch( version )
        {
            case 0:
            {
                m_Mobile = reader.ReadMobile();
                m_Wins = reader.ReadInt();
                m_Losses = reader.ReadInt();
                break;
            }
        }
    }
}
in a nutshell, our attempted fix:
find this line(somewhere near 987, line#s wont be identical, i still have the fixduels command):
Code:
foreach( Mobile m in mobs )
under it add:
Code:
if ( m != null )
{
theoretically it should resolve the null exception issue, correct?
 
hi there i got this error when i started my server.
thanks

Code:
 - Warning: Scripts\Customs\AdminStuff\Programs\Modified - Pvpkit\Deathmatch\Gum
ps\DMScoreGump.cs: CS0183: (line 31, column 21) The given expression is always o
f the provided ('Server.Custom.PvpToolkit.DMatch.ScoreKeeper') type

 - Warning: Scripts\Customs\AdminStuff\Programs\Modified - Pvpkit\Deathmatch\Ite
ms\DMSpawnPoint.cs: CS0183: (line 33, column 24) The given expression is always
of the provided ('Server.Custom.PvpToolkit.DMatch.Items.DMStone') type
 

Jeff

Lord
WonderlandADnc said:
hi there i got this error when i started my server.
thanks

Code:
 - Warning: Scripts\Customs\AdminStuff\Programs\Modified - Pvpkit\Deathmatch\Gum
ps\DMScoreGump.cs: CS0183: (line 31, column 21) The given expression is always o
f the provided ('Server.Custom.PvpToolkit.DMatch.ScoreKeeper') type

 - Warning: Scripts\Customs\AdminStuff\Programs\Modified - Pvpkit\Deathmatch\Ite
ms\DMSpawnPoint.cs: CS0183: (line 33, column 24) The given expression is always
of the provided ('Server.Custom.PvpToolkit.DMatch.Items.DMStone') type
those arent errors they are warnings, they wont prevent compiling.
 
ok thanks for the quick reply. its great to here from you. ive not seen you about for a bit.
any new updated or addons. or anything.
as i have used this be on my online server we use it. but im working on my test server to have a clean out to put my online server in it.

as i see theres just onsite and death and i love the death one.
i saw on a server where it there is like a garden type fence outside, and 2 players get tele ported into the fence place and when they die there things go in there bank. and so on. i will say i love the way if you die in the deathmatch its like you didnt die. no setting it all back up in your backpack. i need some time to look thought to see how you did that. to use in a new game im setting up. and will be posting in here.
but i want it to run on a system like the acc that comes up in the server loading that says Sorious' PvpKit, well thanks for your time
 

Jeff

Lord
WonderlandADnc said:
ok thanks for the quick reply. its great to here from you. ive not seen you about for a bit.
any new updated or addons. or anything.
as i have used this be on my online server we use it. but im working on my test server to have a clean out to put my online server in it.

as i see theres just onsite and death and i love the death one.
i saw on a server where it there is like a garden type fence outside, and 2 players get tele ported into the fence place and when they die there things go in there bank. and so on. i will say i love the way if you die in the deathmatch its like you didnt die. no setting it all back up in your backpack. i need some time to look thought to see how you did that. to use in a new game im setting up. and will be posting in here.
but i want it to run on a system like the acc that comes up in the server loading that says Sorious' PvpKit, well thanks for your time


I havent worked on any new things at all cause i wanted to wait for 2.0 :)

Thanks for the kind words, im glad you enjoy my scripts. I will be making the rest of the things that i intended to make once 2.0 comes out.
 

egemen

Wanderer
when i use [onsiteduel i can not click ok button on gump i see only ok and cancel text but i can not click either


 

Jeff

Lord
egemen said:
when i use [onsiteduel i can not click ok button on gump i see only ok and cancel text but i can not click either


You dont have the latest client, it uses artwork from the SE client
 

ii.

Sorceror
I've always had a problem with .rar files see i cant extract it so i really have no idea what to do with it its in my customs folder still as a .rar file can anyone help me here please?
 

Jeff

Lord
ii. said:
I've always had a problem with .rar files see i cant extract it so i really have no idea what to do with it its in my customs folder still as a .rar file can anyone help me here please?
www.rarlabs.com, download winrar from there. when you extract the files follow my directions :) other then please explain the exact problem your having with rar files.
 
Top