// RunUO 2.0 Venus Düzenlemesi <admin@venus.gen.tr>

// Bodcu karakterlerin bod haklarını tek bir karakterde toplar ve bu karakter
// yoluyla toplanmasını sağlar. Ayrıca kontrat haline getirilip satılabilir.

using System;
using System.Collections;
using Server; 
using Server.Items; 
using Server.Mobiles; 
using Server.Targeting; 
using Server.Network;
using Server.Gumps;
using Server.Commands;

namespace Server.BODSystem
{ 
	public class Core
	{
		private static Hashtable ScrollLimit = new Hashtable();

		public static void Initialize() 
		{
			if ( Ayarlar.BodcuSistemi )
			{
				CommandSystem.Register( "Bod", AccessLevel.Player, new CommandEventHandler( BodCommand ) );
				CommandSystem.Register( "Bodcu", AccessLevel.Player, new CommandEventHandler( BodcuCommand ) );
			}
		}
		[Usage( "Bod" )] 
		public static void BodCommand( CommandEventArgs e ) 
		{
			e.Mobile.CloseGump( typeof ( BODGump ) );
			e.Mobile.SendGump( new BODGump( e.Mobile ) );
		}
		public class BODGump : Gump
		{
			public BODGump( Mobile from ) : base(0, 0)
			{
				PlayerMobile pm = (PlayerMobile)from;

				AddPage(0);
				AddBackground(50, 50, 283, 277, 9270);
				AddImageTiled(61, 61, 261, 255, 2624);
				AddItem(71, 66, 3992);
				AddLabel(128, 85, 1160, "Tailor/Smith Bilgileri");
				AddLabel(70, 130, 67, "Tailoring:");
				AddLabel(70, 150, 1149, "Bod Hakkınız:");
				AddLabel(70, 165, 1149, "Kalan Hak:");
				AddLabel(70, 180, 1149, "Sonraki Bod:");
				AddLabel(200, 150, 1149, pm.BODTailorMax.ToString() );
				AddLabel(200, 165, 1149, pm.BODTailor.ToString() );
				AddLabel(200, 180, 1149, pm.NextTailorBulkOrder.ToString().Substring( 0, 8 ) );
				AddLabel(70, 200, 67, "Blacksmithy:");
				AddLabel(70, 220, 1149, "Bod Hakkınız:");
				AddLabel(70, 235, 1149, "Kalan Hak:");
				AddLabel(70, 250, 1149, "Sonraki Bod:");
				AddLabel(200, 220, 1149, pm.BODSmithMax.ToString() );
				AddLabel(200, 235, 1149, pm.BODSmith.ToString() );
				AddLabel(200, 250, 1149, pm.NextSmithBulkOrder.ToString().Substring( 0, 8 ) );
				AddLabel(70, 270, 67, "Diğerleri:");
				AddLabel(70, 285, 1149, "Sonraki Bod:");
				AddLabel(200, 285, 1149, pm.BODLastTime.AddHours( 24 ).ToString().Substring( 0, 16 ) );
			}
		}
		[Usage( "Bodcu" )] 
		public static void BodcuCommand( CommandEventArgs e ) 
		{
			if ( e.Mobile.CantWalk || e.Mobile.Frozen )
				return;

			Mobile from = e.Mobile;
			if ( from.Skills.Blacksmith.Base < 100 && from.Skills.Tailoring.Base < 100 )
				from.SendMessage("Bod alabilen biri değilsiniz.");
			else
			{
				from.CloseGump( typeof ( BODAcceptGump ) );
				from.SendGump( new BODAcceptGump( e.Mobile ) );
			}
		}
		public class BODAcceptGump : Gump
		{
			public BODAcceptGump( Mobile from ) : base(0, 0)
			{
				PlayerMobile pm = from as PlayerMobile;
				if ( pm == null )
					return;

				String msg = "Eğer sahip olduğunuz BOD alma yetkisini başka bir craft karaktere aktarırsanız bu karakterin Blacksmithy ve Tailoring skillleri 50.0'a düşecektir. Isterseniz aynı karaktere tekrar Tailoring ya da Blacksmithy kasarak yine bod hakkı kazanabilirsiniz. Bod haklarınızı transfer etme işlemini kabul ediyor musunuz?";
				int bonus1 = pm.Skills.Blacksmith.Base >= 100 ? 1 : 0;
				int bonus2 = pm.Skills.Tailoring.Base >= 100 ? 1 : 0;

				AddPage(0);
				AddBackground(50, 50, 378, 330, 9270);
				AddImageTiled(61, 61, 355, 308, 2624);
				AddLabel(70, 65, 1160, "Bod Hakkı Aktarımı");
				AddHtml( 69, 84, 342, 103, msg, true, true);
				AddLabel(70, 190, 68, "Tailoring Hakkı");
				AddLabel(70, 210, 68, "Blacksmith Hakkı");
				AddLabel(200, 190, 1149, String.Format(": {0}", pm.BODTailorMax + bonus2) );
				AddLabel(200, 210, 1149, String.Format(": {0}", pm.BODSmithMax + bonus1) );
				AddButton(120, 250, 4011, 4013, 1, GumpButtonType.Reply, 0);
				AddButton(154, 250, 4005, 4007, 2, GumpButtonType.Reply, 0);
				AddLabel(192, 250, 1149, "Tailoring Haklarını Devret");
				AddButton(120, 275, 4011, 4013, 3, GumpButtonType.Reply, 0);
				AddButton(154, 275, 4005, 4007, 4, GumpButtonType.Reply, 0);
				AddLabel(192, 275, 1149, "Blacksmith Haklarını Devret");
				AddButton(154, 300, 4005, 4007, 5, GumpButtonType.Reply, 0);
				AddLabel(192, 300, 1149, "Tüm Haklarını Devret");
				AddButton(217, 339, 241, 243, 0, GumpButtonType.Reply, 0);
				AddBackground(70, 250, 49, 23, 9350);
				AddBackground(70, 274, 49, 23, 9350);
				AddTextEntry(75, 254, 40, 16, 0, 1, "5");
				AddTextEntry(74, 277, 40, 16, 0, 2, "5");
			}
			public override void OnResponse( NetState state, RelayInfo info )
			{
				if ( info.ButtonID == 0 || state.Mobile == null || !( state.Mobile is PlayerMobile ) )
					return;
				int Secim = info.ButtonID;
				PlayerMobile from = state.Mobile as PlayerMobile;

				int bodTailor = 5;
				int bodSmith = 5;
				try{
					bodTailor = Convert.ToInt32( ( info.GetTextEntry( 1 ) ).Text.Trim() );
					bodSmith = Convert.ToInt32( ( info.GetTextEntry( 2 ) ).Text.Trim() );
				}
				catch{
					return;
				}
				if ( bodTailor > 100 || bodSmith > 100 || bodTailor < 1 || bodSmith < 1 )
				{
					from.SendMessage(0x22, "En az 1, en fazla 100 bod hakkını bir deed şekline getirebilirsin.");
					return;
				}

				if ( Secim == 2 )
					from.Target = new BODAcceptTarget( 1 );
				else if ( Secim == 4 )
					from.Target = new BODAcceptTarget( 2 );
				else if ( Secim == 5 )
					from.Target = new BODAcceptTarget( 5 );
				else if ( Secim == 1 )
				{
					if ( ScrollLimit[from] != null && ((DateTime)ScrollLimit[from]).AddSeconds( 30 ) > DateTime.Now )
						from.SendMessage(0x22, "Bu kadar kısa sürede scroll çıkartamazsın.");
					else if ( from.BODTailorMax > bodTailor )
					{
						from.NextTailorBulkOrder = TimeSpan.FromHours( 6 );
						from.BODTailorMax = from.BODTailorMax - bodTailor;
						from.AddToBackpack( new TailorBODScroll( bodTailor ) );
						from.SendMessage(68, "{0} Tailoring BOD hakkı scroll halinde çantanıza konulmuştur.", bodTailor );

						ScrollLimit[from] = DateTime.Now;
					}
					else
						from.SendMessage(0x22, "Yeteneğin hariç en az 1 fazladan Tailoring BOD hakkı gereklidir.");
				}
				else if ( Secim == 3 )
				{
					if ( ScrollLimit[from] != null && ((DateTime)ScrollLimit[from]).AddSeconds( 30 ) > DateTime.Now )
						from.SendMessage(0x22, "Bu kadar kısa sürede scroll çıkartamazsın.");
					else if ( from.BODSmithMax > bodSmith )
					{
						from.NextSmithBulkOrder = TimeSpan.FromHours( 6 );
						from.BODSmithMax = from.BODSmithMax - bodSmith;
						from.AddToBackpack( new SmithBODScroll( bodSmith ) );
						from.SendMessage(68, "{0} Blacksmith BOD hakkı scroll halinde çantanıza konulmuştur.", bodSmith );

						ScrollLimit[from] = DateTime.Now;
					}
					else
						from.SendMessage(0x22, "Yeteneğin hariç en az 1 fazladan Blacksmith BOD hakkı gereklidir.");
				}

				if ( Secim == 2 || Secim == 4 || Secim == 5 )
					from.SendMessage(1166, "Yetkinizi vereceğiniz Tailor ya da Blacksmith karakteri seçin...");
			}
		}
		public class BODAcceptTarget : Target
		{
			int style = 0;
			public BODAcceptTarget( int secim ) : base( -1, false, TargetFlags.None )
			{
				style = secim;
			}
			protected override void OnTarget( Mobile from, object o )
			{
				if ( !(o is PlayerMobile) )
					return;
				else
				{
					PlayerMobile pm = (PlayerMobile)o;
					PlayerMobile pm_from = (PlayerMobile)from;

					if ( style == 5 || style == 1 )
					{
						if ( from.Skills.Tailoring.Base >= 100 && pm.Skills.Tailoring.Base >= 100 && pm_from != pm )
						{
							int total = pm_from.BODTailorMax + 1;
							pm.BODTailorMax = pm.BODTailorMax + total;
							pm.SendMessage( String.Format("{0} adlı oyuncu Tailor BOD alma haklarını size devretmiştir. 6 saat sonra kullanabilirsiniz.", from.Name ) );
							pm.SendMessage( 68, String.Format("{0} Tailoring bod hakkı kazandınız.", total ) );
							pm_from.BODTailorMax = 0;
							pm_from.BODTailor = 0;
							pm.NextTailorBulkOrder = TimeSpan.FromHours( 6 );
							from.Skills.Tailoring.Base = 50;
						}
					}
					if ( style == 5 || style == 2 )
					{
						if ( from.Skills.Blacksmith.Base >= 100 && pm.Skills.Blacksmith.Base >= 100 && pm_from != pm )
						{
							int total = pm_from.BODSmithMax + 1;
							pm.BODSmithMax = pm.BODSmithMax + total;
							pm.SendMessage( String.Format("{0} adlı oyuncu Smith BOD alma haklarını size devretmiştir. 6 saat sonra kullanabilirsiniz.", from.Name ) );
							pm.SendMessage( 68, String.Format("{0} Blacksmithy bod hakkı kazandınız.", total ) );
							pm_from.BODSmithMax = 0;
							pm_from.BODSmith = 0;
							pm.NextSmithBulkOrder = TimeSpan.FromHours( 6 );
							from.Skills.Blacksmith.Base = 50;
						}
					}
				}
			}
		}
	}

	public class TailorBODScroll : Item
	{
		private int m_Count;
		[CommandProperty( AccessLevel.Administrator )]
		public int Count
		{
			get{ return m_Count; }
			set{ m_Count = value; }
		}
		[Constructable]
		public TailorBODScroll( int amount ) : base( 0x14F0 )
		{
			Weight = 1.0;
			Count = 1;
			LootType = LootType.Blessed;

			if ( amount > 0 && amount <= 100 )
				Count = amount;

			Name = String.Format("{0} Tailoring BOD Hakkı", Count);
		}
		public TailorBODScroll( Serial serial ) : base( serial )
		{
		}
		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			writer.Write( (int) 0 ); // version
			writer.Write( (int) m_Count );
		}
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			int version = reader.ReadInt();
			m_Count = reader.ReadInt();
		}
		public override void OnDoubleClick( Mobile from )
		{
			if ( !IsChildOf( from.Backpack ) )
				from.SendMessage(0x22, "Çantanda kullanmalısın.");
			else if ( from.Skills.Tailoring.Base < 100.0 )
				from.SendMessage(0x22, "Gerekli Tailoring yeteneğine sahip değilsin.");
			else if ( from is PlayerMobile )
			{
				from.FixedEffect( 0x376A, 1, 32 );

				PlayerMobile pm = from as PlayerMobile;
				pm.BODTailorMax = pm.BODTailorMax + Count;
				pm.NextTailorBulkOrder = TimeSpan.FromHours( 6 );

				from.SendMessage(68, "{0} Tailoring bod hakkı kazandınız. Bod haklarınızı görmek için [Bod komutu kullanabilirsiniz..", Count);

				if ( this != null || !this.Deleted )
					this.Delete();
			}
		}
	}

	public class SmithBODScroll : Item
	{
		private int m_Count;
		[CommandProperty( AccessLevel.Administrator )]
		public int Count
		{
			get{ return m_Count; }
			set{ m_Count = value; }
		}
		[Constructable]
		public SmithBODScroll( int amount ) : base( 0x14F0 )
		{
			Weight = 1.0;
			Count = 1;
			LootType = LootType.Blessed;

			if ( amount > 0 && amount <= 100 )
				Count = amount;

			Name = String.Format("{0} Blacksmith BOD Hakkı", Count);
		}
		public SmithBODScroll( Serial serial ) : base( serial )
		{
		}
		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			writer.Write( (int) 0 ); // version
			writer.Write( (int) m_Count );
		}
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			int version = reader.ReadInt();
			m_Count = reader.ReadInt();
		}
		public override void OnDoubleClick( Mobile from )
		{
			if ( !IsChildOf( from.Backpack ) )
				from.SendMessage(0x22, "Çantanda kullanmalısın.");
			else if ( from.Skills.Blacksmith.Base < 100.0 )
				from.SendMessage(0x22, "Gerekli Blacksmith yeteneğine sahip değilsin.");
			else if ( from is PlayerMobile )
			{
				from.FixedEffect( 0x376A, 1, 32 );

				PlayerMobile pm = from as PlayerMobile;
				pm.BODSmithMax = pm.BODSmithMax + Count;
				pm.NextSmithBulkOrder = TimeSpan.FromHours( 6 );

				from.SendMessage(68, "{0} Blacksmith bod hakkı kazandınız. Bod haklarınızı görmek için [Bod komutu kullanabilirsiniz..", Count);

				if ( this != null || !this.Deleted )
					this.Delete();
			}
		}
	}
}