context: using System;
  using System.Collections.Generic;
  using Server.Mobiles;
  using Server.Targeting;
  using Server.Items;
  using Server.Network;
  using Server.Factions;
  using Server.Spells.Seventh;
  using Server.Spells.Fifth;
  using Server.Spells;
  using Server.Spells.Ninjitsu;
  
  namespace Server.SkillHandlers
  {
      public class Stealing
  	{
  		public static void Initialize()
  		{
  			SkillInfo.Table[33].Callback = new SkillUseCallback( OnUse );
  		}
  
  		public static readonly bool ClassicMode = false;
  		public static readonly bool SuspendOnMurder = false;
  
  		public static bool IsInGuild( Mobile m )
  		{
  			return ( m is PlayerMobile && ((PlayerMobile)m).NpcGuild == NpcGuild.ThievesGuild );
  		}
  
  		public static bool IsInnocentTo( Mobile from, Mobile to )
  		{
  			return ( Notoriety.Compute( from, (Mobile)to ) == Notoriety.Innocent );
  		}
  
  		private class StealingTarget : Target
  		{
  			private Mobile m_Thief;
  
  			public StealingTarget( Mobile thief ) : base ( 1, false, TargetFlags.None )
  			{
  				m_Thief = thief;
  
  				AllowNonlocal = true;
  			}
  
  			private Item TryStealItem( Item toSteal, ref bool caught )
  			{
  				Item stolen = null;
  
  				object root = toSteal.RootParent;
  
  				StealableArtifactsSpawner.StealableInstance si = null;
  				if ( toSteal.Parent == null || !toSteal.Movable )
  					si = StealableArtifactsSpawner.GetStealableInstance( toSteal );
  
  				if ( !IsEmptyHanded( m_Thief ) )
  				{
  					m_Thief.SendLocalizedMessage( 1005584 ); // Both hands must be free to steal.
  				}
  				else if ( m_Thief.Region.IsPartOf( typeof( Engines.ConPVP.SafeZone ) ) )
  				{
  					m_Thief.SendMessage( "You may not steal in this area." );
  				}
  				else if ( root is Mobile && ((Mobile)root).Player && !IsInGuild( m_Thief ) )
  				{
  					m_Thief.SendLocalizedMessage( 1005596 ); // You must be in the thieves guild to steal from other players.
  				}
  				else if ( SuspendOnMurder && root is Mobile && ((Mobile)root).Player && IsInGuild( m_Thief ) && m_Thief.Kills > 0 )
  				{
  					m_Thief.SendLocalizedMessage( 502706 ); // You are currently suspended from the thieves guild.
  				}
  				else if ( root is BaseVendor && ((BaseVendor)root).IsInvulnerable )
  				{
  					m_Thief.SendLocalizedMessage( 1005598 ); // You can't steal from shopkeepers.
  				}
  				else if ( root is PlayerVendor )
  				{
  					m_Thief.SendLocalizedMessage( 502709 ); // You can't steal from vendors.
  				}
  				else if ( !m_Thief.CanSee( toSteal ) )
  				{
  					m_Thief.SendLocalizedMessage( 500237 ); // Target can not be seen.
  				}
  				else if ( m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold( m_Thief, toSteal, false, true ) )
  				{
  					m_Thief.SendLocalizedMessage( 1048147 ); // Your backpack can't hold anything else.
  				}
  				#region Sigils
  				else if ( toSteal is Sigil )
  				{						
  					PlayerState pl = PlayerState.Find( m_Thief );
  					Faction faction = ( pl == null ? null : pl.Faction );
  
  					Sigil sig = (Sigil) toSteal;
  
  					if ( !m_Thief.InRange( toSteal.GetWorldLocation(), 1 ) )
  					{
  						m_Thief.SendLocalizedMessage( 502703 ); // You must be standing next to an item to steal it.
  					}
  					else if ( root != null ) // not on the ground
  					{
  						m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
  					}
  					else if ( faction != null )
  					{
  						if ( !m_Thief.CanBeginAction( typeof( IncognitoSpell ) ) )
  						{
  							m_Thief.SendLocalizedMessage( 1010581 ); //	You cannot steal the sigil when you are incognito
  						}
  						else if ( DisguiseTimers.IsDisguised( m_Thief ) )
  						{
  							m_Thief.SendLocalizedMessage( 1010583 ); //	You cannot steal the sigil while disguised
  						}
  						else if ( !m_Thief.CanBeginAction( typeof( PolymorphSpell ) ) )
  						{
  							m_Thief.SendLocalizedMessage( 1010582 ); //	You cannot steal the sigil while polymorphed				
  						}
  						else if( TransformationSpellHelper.UnderTransformation( m_Thief ) )
  						{
  							m_Thief.SendLocalizedMessage( 1061622 ); // You cannot steal the sigil while in that form.
  						}
  						else if ( AnimalForm.UnderTransformation( m_Thief ) )
  						{
  							m_Thief.SendLocalizedMessage( 1063222 ); // You cannot steal the sigil while mimicking an animal.
  						}
  						else if ( pl.IsLeaving )
  						{
  							m_Thief.SendLocalizedMessage( 1005589 ); // You are currently quitting a faction and cannot steal the town sigil
  						}
  						else if ( sig.IsBeingCorrupted && sig.LastMonolith.Faction == faction )
  						{
  							m_Thief.SendLocalizedMessage( 1005590 ); //	You cannot steal your own sigil
  						}
  						else if ( sig.IsPurifying )
  						{
  							m_Thief.SendLocalizedMessage( 1005592 ); // You cannot steal this sigil until it has been purified
  						}
  						else if ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, 80.0, 80.0 ) )
  						{
  							if ( Sigil.ExistsOn( m_Thief ) )
  							{
  								m_Thief.SendLocalizedMessage( 1010258 ); //	The sigil has gone back to its home location because you already have a sigil.
  							}
  							else if ( m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold( m_Thief, sig, false, true ) )
  							{
  								m_Thief.SendLocalizedMessage( 1010259 ); //	The sigil has gone home because your backpack is full
  							}
  							else
  							{
  								if ( sig.IsBeingCorrupted )
  									sig.GraceStart = DateTime.UtcNow; // begin grace period
  
  								m_Thief.SendLocalizedMessage( 1010586 ); // YOU STOLE THE SIGIL!!!   (woah, calm down now)
  
  								if ( sig.LastMonolith != null && sig.LastMonolith.Sigil != null ) {
  									sig.LastMonolith.Sigil = null;
  									sig.LastStolen = DateTime.UtcNow;
  								}
  
  								return sig;
  							}
  						}
  						else
  						{
  							m_Thief.SendLocalizedMessage( 1005594 ); //	You do not have enough skill to steal the sigil
  						}
  					}
  					else
  					{
  						m_Thief.SendLocalizedMessage( 1005588 ); //	You must join a faction to do that
  					}
  				}
  				#endregion
  				else if ( si == null && ( toSteal.Parent == null || !toSteal.Movable ) )
  				{
  					m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
  				}
  				else if ( toSteal.LootType == LootType.Newbied || toSteal.CheckBlessed( root ) )
  				{
  					m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
  				}
  				else if ( Core.AOS && si == null && toSteal is Container )
  				{
  					m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
  				}
  				else if ( !m_Thief.InRange( toSteal.GetWorldLocation(), 1 ) )
  				{
  					m_Thief.SendLocalizedMessage( 502703 ); // You must be standing next to an item to steal it.
  				}
  				else if ( si != null && m_Thief.Skills[SkillName.Stealing].Value < 100.0 )
  				{
  					m_Thief.SendLocalizedMessage( 1060025, "", 0x66D ); // You're not skilled enough to attempt the theft of this item.
  				}
  				else if ( toSteal.Parent is Mobile )
  				{
  					m_Thief.SendLocalizedMessage( 1005585 ); // You cannot steal items which are equiped.
  				}
  				else if ( root == m_Thief )
  				{
  					m_Thief.SendLocalizedMessage( 502704 ); // You catch yourself red-handed.
  				}
  				else if ( root is Mobile && ((Mobile)root).AccessLevel > AccessLevel.Player )
  				{
  					m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
  				}
  				else if ( root is Mobile && !m_Thief.CanBeHarmful( (Mobile)root ) )
  				{
  				}
  				else if ( root is Corpse )
  				{
  					m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
  				}
  				else
  				{
  					double w = toSteal.Weight + toSteal.TotalWeight;
  
  					if ( w > 10 )
  					{
  						m_Thief.SendMessage( "That is too heavy to steal." );
  					}
  					else
  					{
  						if ( toSteal.Stackable && toSteal.Amount > 1 )
  						{
  							int maxAmount = (int)((m_Thief.Skills[SkillName.Stealing].Value / 10.0) / toSteal.Weight);
  
  							if ( maxAmount < 1 )
  								maxAmount = 1;
  							else if ( maxAmount > toSteal.Amount )
  								maxAmount = toSteal.Amount;
  
  							int amount = Utility.RandomMinMax( 1, maxAmount );
  
  							if ( amount >= toSteal.Amount )
  							{
  								int pileWeight = (int)Math.Ceiling( toSteal.Weight * toSteal.Amount );
  								pileWeight *= 10;
  
  								if ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5 ) )
  									stolen = toSteal;
  							}
  							else
  							{
  								int pileWeight = (int)Math.Ceiling( toSteal.Weight * amount );
  								pileWeight *= 10;
  
  								if ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5 ) )
  								{
  									stolen = Mobile.LiftItemDupe( toSteal, toSteal.Amount - amount );
  
  									if ( stolen == null )
  										stolen = toSteal;
  								}
  							}
  						}
  						else
  						{
  							int iw = (int)Math.Ceiling( w );
  							iw *= 10;
  
  							if ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, iw - 22.5, iw + 27.5 ) )
  								stolen = toSteal;
  						}
  
  						if ( stolen != null )
  						{
  							m_Thief.SendLocalizedMessage( 502724 ); // You succesfully steal the item.
  
  							if ( si != null )
  							{
  								toSteal.Movable = true;
  								si.Item = null;
  							}
  						}
  						else
  						{
  							m_Thief.SendLocalizedMessage( 502723 ); // You fail to steal the item.
  						}
  
  						caught = ( m_Thief.Skills[SkillName.Stealing].Value < Utility.Random( 150 ) );
  					}
  				}
  
  				return stolen;
  			}
  
  			protected override void OnTarget( Mobile from, object target )
  			{
  				from.RevealingAction();
  
  				Item stolen = null;
  				object root = null;
  				bool caught = false;
  
  				if ( target is Item )
  				{
  					root = ((Item)target).RootParent;
  					stolen = TryStealItem( (Item)target, ref caught );
  				} 
  				else if ( target is Mobile )
  				{
  					Container pack = ((Mobile)target).Backpack;
  
  					if ( pack != null && pack.Items.Count > 0 )
  					{
  						int randomIndex = Utility.Random( pack.Items.Count );
  
  						root = target;
  						stolen = TryStealItem( pack.Items[randomIndex], ref caught );
  					}
  				} 
  				else 
  				{
  
gt: 					m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!