All pastes #68802 Raw Edit

Asmir

public text v1 · immutable
#68802 ·published 2006-06-22 02:57 UTC
rendered paste body
using System;
using System.IO;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using Server;
using Server.Accounting;
using Server.ContextMenus;
using Server.Engines.Help;
using Server.Gumps;
using Server.Items;
using Server.Misc;
using Server.Multis;
using Server.Network;
using Server.Regions;
using Server.Spells;
using Server.Spells.Fifth;
using Server.Spells.Seventh;
using Server.Targeting;
using Server.Commands.Generic;
using Server.Commands;
using Server.DuelSystem;
using Server.Factions;
using Server.Engines.PartySystem;
using Server.Guilds;

namespace Server.Mobiles
{
	public enum HideEffects 
	{ 
		Default,
		WhiteGate,
		BlackGate,
		BlueGate,
		RedGate,
		Divine,
		Explosion,
		FlameStrike,
		BlueFlames,
		Lightning,
		Reaper,
		BigFlameStrike,
		BigDivine,
		BigGates,
		RadialFlames,
		BigWater
	}

	public class RealmPlayer : PlayerMobile
	{
		//Vote stone
		private DateTime m_LastVoteTime;
		[CommandProperty(AccessLevel.Counselor, AccessLevel.Seer)]
		public DateTime LastVoteTime
		{
			get{return m_LastVoteTime;}
			set{m_LastVoteTime = value;}
		}

		private int m_Votes;
		[CommandProperty(AccessLevel.Counselor, AccessLevel.Seer)]
		public int Votes
		{
			get
			{
				Account acct = this.Account as Account;
				if(acct == null)
					return 0;
				else
				{
					string tag = acct.GetTag("votes");
					if(tag == null)
						acct.AddTag("votes", m_Votes.ToString());
					else
					{
						try
						{
							return Convert.ToInt32(tag);
						}
						catch
						{}
					}
				}
				return 0;
			}
			set{
				Account acct = this.Account as Account;
				if(acct != null)
				{
					acct.SetTag("votes", value.ToString());
				}
			}
		}

		[CommandProperty(AccessLevel.GameMaster)]
		public int SetBodyMod
		{
			set{this.BodyMod = new Body(value);}
			get{return this.BodyMod.BodyID;}
		}

		[CommandProperty(AccessLevel.Counselor)]
		public int TotalHours
		{
			get
			{
				return this.GameTime.Hours + (this.GameTime.Days * 24);
			}
		}

		private static ArrayList m_Instances = new ArrayList();
		public static ArrayList Instances{ get{ return m_Instances; } }

		private static ArrayList m_Duelists = new ArrayList();
		public static ArrayList Duelists{ get{ return m_Duelists; } }

		// GM Hide Effects
		public HideEffects m_HideEffect;

		// Dueling Pits.
		private bool m_OpenRequest, m_CanRegenHits, m_BannedFromPits, m_FillCorpse;
		private bool m_IsHelper, m_EventBan, m_HasGMBody, m_UseNotoriety, m_AlwaysMurderer;
		private int m_Level, m_Score, m_Wins, m_Losses;
		
		/*
		 * Dueling Pits.
		 * Cannot override 'CanRegenHits.set' because 'Mobile.CanRegenHits' does not have
		 * a overidable set accessor. The mothod SetCanRegenHits is used for toggling the 
		 * CanRegenHits property.
		 */
		public override bool CanRegenHits{ get{ return (Alive ? m_CanRegenHits : false); } }

		// Dueling Pits.
		public bool OpenRequest{ get{ return m_OpenRequest; } set{ m_OpenRequest = value; } }

		[CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator)]
		public int Score{ get{ return m_Score; } set{ m_Score = value; } }

		[CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator)]
		public int Wins{ get{ return m_Wins; } set{ m_Wins = value; } }

		[CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator)]
		public int Losses{ get{ return m_Losses; } set{ m_Losses = value; } }

		[CommandProperty(AccessLevel.Counselor, AccessLevel.GameMaster)]
		public int Level
		{
			get{ return m_Level; }
			set
			{
				if ( value < 0 )
					value = 0;
			
				m_Level = value;

				if ( (m_Wins + m_Losses) >= 5 && !m_Duelists.Contains( this ) )
					m_Duelists.Add( this );
			}
		}
		
		// Dueling Pits.
		[CommandProperty(AccessLevel.Counselor, AccessLevel.GameMaster)]
		public bool BannedFromPits
		{
			get{ return m_BannedFromPits; }
			set
			{
				m_BannedFromPits = value;
				
				if ( value )
				{
					m_Wins = 0;
					m_Losses = 0;
					m_Level = 0;
			
					if ( m_Duelists.Contains( this ) )
						m_Duelists.Remove( this );
				}
			}
		}

		/*
		 * Is a newbie helper. They are allowed in new player area but can't attack nor be
		 * attack by anything.
		 */
		[CommandProperty(AccessLevel.Seer)]
		public bool FillCorpse{ get{ return m_FillCorpse; } set{ m_FillCorpse = value; } }

		[CommandProperty(AccessLevel.Counselor, AccessLevel.GameMaster)]
		public bool IsHelper{ get{ return m_IsHelper; } set{ m_IsHelper = value; } }

		[CommandProperty(AccessLevel.Counselor, AccessLevel.Seer)]
		public bool EventBan{ get{ return m_EventBan; } set{ m_EventBan = value; } }

		[CommandProperty(AccessLevel.Counselor)]
		public HideEffects HideEffect
		{
			get{ return m_HideEffect; }
			set
			{
				if(this.AccessLevel < AccessLevel.Seer && this.Title != "[Developer]")
				{
					if(value == HideEffects.Reaper || value == HideEffects.BigFlameStrike || value == HideEffects.BigDivine || value == HideEffects.BigGates || value == HideEffects.BigWater || value == HideEffects.RadialFlames)
					{
						this.SendMessage(38, "You cannot use this Hide Effect.");
					}
					else
					{
						m_HideEffect = value;
					}
				}
				else
				{
					m_HideEffect = value;
				}
			}
		}

		[CommandProperty(AccessLevel.Administrator)]
		public bool UseNotoriety
		{
			get{ return m_UseNotoriety; }
			set
			{
				if ( AccessLevel == AccessLevel.Administrator )
					m_UseNotoriety = value;
				else
					m_UseNotoriety = false;

				Delta( MobileDelta.Noto );
			}
		}

		[CommandProperty(AccessLevel.Administrator)]
		public bool HasGMBody
		{
			get{ return m_HasGMBody; }
			set
			{
				if ( AccessLevel > AccessLevel.Player )
					m_HasGMBody = value;
				else
					m_HasGMBody = false;

				if ( m_HasGMBody )
					BodyValue = 0x3DB;
				else if ( Female )
					BodyValue = 0x191;
				else
					BodyValue = 0x190;
			}
		}

		// They are made murderers (perminatly red) until toggled off.
		[CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator)]
		public bool AlwaysMurderer
		{
			get{ return m_AlwaysMurderer; }
			set
			{
				m_AlwaysMurderer = value;
				Delta( MobileDelta.Noto );
			}
		}

		/*
		 *  New code for donation reward system
		 *
		[CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator )]
		public override bool Donated
		{
			get
			{
				return base.Donated;
			}
			set
			{
				base.Donated = value;
				if ( value )
					this.Account.SetTag( "protected", value.ToString() );
			}
		}
		*/

		/*
		 * Old Code for Donation Reward System
		 */
		[CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator )]
		public bool Donated
		{
			get
			{
				Account acct = (Account)this.Account;
				return Convert.ToBoolean( acct.GetTag( "donated" ) );
			}
			set
			{
				Account acct = (Account)this.Account;
				acct.SetTag( "donated", value.ToString() );
				if ( value )
					acct.SetTag( "protected", value.ToString() );
			}
		}

		//Account Cleanup
		[CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator )]
		public bool ProtectAccount
		{
			get
			{
				Account acct = (Account)this.Account;
				return Convert.ToBoolean( acct.GetTag( "protected" ) );
			}
			set
			{
				Account acct = (Account)this.Account;
				acct.SetTag( "protected", value.ToString() );
			}
		}

		[CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator )]
		public bool FastWalkExempt
		{
			get
			{
				Account acct = (Account)this.Account;
				return Convert.ToBoolean( acct.GetTag( "FastWalkExempt" ) );
			}
			set
			{
				Account acct = (Account)this.Account;
				acct.SetTag( "FastWalkExempt", value.ToString() );
				if ( value )
				{
					acct.RemoveTag( "FastWalk" );
					acct.RemoveTag( "LastFastWalk" );
				}
			}
		}


		private Item m_LastBOD;
		[CommandProperty(AccessLevel.Counselor, AccessLevel.GameMaster )]
		public Item LastBOD
		{
			get{return m_LastBOD;}
			set{m_LastBOD = value;}
		}

		private int m_MaxHouses;
		[CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator )]
		public int MaxHouses
		{
			get{return m_MaxHouses;}
			set{m_MaxHouses = value;}
		}

		//Object Constructor: Also known as .ctor
		public RealmPlayer()
		{
			m_CanRegenHits = true;

			m_Instances.Add( this );

			m_MaxHouses = 2;
		}

		public RealmPlayer( Serial s ) : base( s )
		{
		}
		
		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			
			//Version 3: Added MaxHouses
			//Version 2: Addition of LastBOD
			//Version 1: Addition of voting stone
			writer.Write( (int) 3 ); // version

			writer.Write( (int) m_MaxHouses );

			writer.Write( m_LastBOD as Item );

			writer.Write( (DateTime) m_LastVoteTime);
			writer.Write( (int) m_Votes);

			//Event system
			writer.Write( (bool) m_EventBan );

			// Dueling Pits
			writer.Write( m_Score );
			writer.Write( m_Level );
			writer.Write( m_BannedFromPits );
			writer.Write( m_Wins );
			writer.Write( m_Losses );

			writer.Write( (bool) m_IsHelper );
			writer.Write( (int) m_HideEffect );
			writer.Write( (bool) m_HasGMBody );
			writer.Write( (bool) m_UseNotoriety );
			writer.Write( (bool) m_AlwaysMurderer );
		}
		
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt(); // version

			//Default values for updates:
			if(version == 0)
			{
				m_LastVoteTime = DateTime.Now.Subtract(TimeSpan.FromHours(24));
				m_Votes = 0;
			}

			if(version == 2)
				m_MaxHouses = 2;

			switch ( version )
			{
				case 5:
				case 4:
				case 3:
				{
					m_MaxHouses = reader.ReadInt();
					goto case 2;
				}
				case 2:
				{
					m_LastBOD = reader.ReadItem();
					goto case 1;
				}
				case 1:
				{
					m_LastVoteTime = reader.ReadDateTime();
					m_Votes = reader.ReadInt();
					goto case 0;
				}
				case 0:
				{
					m_EventBan = reader.ReadBool();	
					m_Score = reader.ReadInt();
					m_Level = reader.ReadInt();
					m_BannedFromPits = reader.ReadBool();
					m_Wins = reader.ReadInt();
					m_Losses = reader.ReadInt();

					m_IsHelper = reader.ReadBool();
					m_HideEffect = (HideEffects) reader.ReadInt();
					m_HasGMBody = reader.ReadBool();
					m_UseNotoriety = reader.ReadBool();
					m_AlwaysMurderer = reader.ReadBool();

					break;
				}
			}
			
			m_Instances.Add( this );
			
			// Dueling Pits
			if ( (m_Wins + m_Losses) >= 5 )
				m_Duelists.Add( this );
			
			// Dueling Pits
			m_CanRegenHits = true;
		}

		public bool Wearing(Type type)
		{
			foreach(Item i in Items)
			{
				if(i.GetType() == type)
					return true;
			}
			return false;
		}

		public static new void Initialize()
		{
			CommandSystem.Register( "FindOwner", AccessLevel.GameMaster, new CommandEventHandler( FindOwner_OnCommand ) );
			CommandSystem.Register( "GameTime", AccessLevel.Player, new CommandEventHandler( GameTime_OnCommand ) );
		}

		[Usage( "FindOwner" )]
		[Description( "Find the owner of an item." )]
		private static void FindOwner_OnCommand( CommandEventArgs e )
		{
			Mobile from = args.Mobile;
			if(args.Length == 1 && args.GetString(0).ToLower() == "root")
			{
				from.Target = new FindOwnerTarget(true);
			}
			else
			{
				from.Target = new FindOwnerTarget(false);
			}
		}

		[Usage( "GameTime" )]
		[Description( "Display your game time in hours." )]
		private static void GameTime_OnCommand( CommandEventArgs e )
		{
			Mobile from = args.Mobile;
			if(from is PlayerMobile)
			{
				TimeSpan time = ((PlayerMobile)from).GameTime;
				from.SendMessage("Your game time is {0} days, {1} hours, {2} minutes, and {3} seconds.", time.Days.ToString(), time.Hours.ToString(), time.Minutes.ToString(), time.Seconds.ToString());
			}
		}

		private class FindOwnerTarget : Target
		{
			private bool m_Root;
			public FindOwnerTarget(bool root) : base(-1, false, TargetFlags.None)
			{
				m_Root = root;
			}

			protected override void OnTarget(Mobile from, object targeted)
			{
				if(targeted is Item)
				{
					if(m_Root)
					{
						ArrayList list = new ArrayList();
						list.Add(((Item)targeted).RootParent);
						from.SendGump(new InterfaceGump(from, list, 0));
					}
					else
					{
						Mobile owner = FindOwner((Item)targeted);
						if(owner == null)
						{
							from.SendMessage("No owner was found for that item.");
						}
						else
						{
							from.SendMessage("The type of the found owner was {0}.", owner.GetType().Name);
							ArrayList list = new ArrayList();
							list.Add(owner);
							from.SendGump(new InterfaceGump(from, list, 0));
						}
					}
				}
			}
		}

		public static Mobile FindOwner(Item item)
		{
			if(item.RootParent is Item)
			{
				item = (Item) item.RootParent;
			}
			if(item.RootParent is BaseCreature)
			{
				BaseCreature bc = (BaseCreature) item.RootParent;
				if(bc.ControlMaster != null)
				{
					return bc.ControlMaster as Mobile;
				}
				else if(bc.SummonMaster != null)
				{
					return bc.SummonMaster as Mobile;
				}
				else
				{
					return bc as Mobile;
				}
				
			}
			if(item.RootParent is PlayerMobile)
			{
				return item.RootParent as Mobile;
			}
			if(item != null)
			{
				BaseHouse house = BaseHouse.FindHouseAt(item);
				if(house != null && house.Owner != null)
					return house.Owner;
			}
			return null;
		}

		public override void OnAosSingleClick( Mobile from )
		{
			if ( Map == Faction.Facet )
			{
				PlayerState pl = PlayerState.Find( this );

				if ( pl != null )
				{
					string text;
					bool ascii = false;

					Faction faction = pl.Faction;

					if ( faction.Commander == this )
						text = String.Concat( this.Female ? "(Commanding Lady of the " : "(Commanding Lord of the ", faction.Definition.FriendlyName, ")" );
					else if ( pl.Sheriff != null )
						text = String.Concat( "(The Sheriff of ", pl.Sheriff.Definition.FriendlyName, ", ", faction.Definition.FriendlyName, ")" );
					else if ( pl.Finance != null )
						text = String.Concat( "(The Finance Minister of ", pl.Finance.Definition.FriendlyName, ", ", faction.Definition.FriendlyName, ")" );
					else
					{
						ascii = true;

						if ( pl.MerchantTitle != MerchantTitle.None )
							text = String.Concat( "(", MerchantTitles.GetInfo( pl.MerchantTitle ).Title.String, ", ", faction.Definition.FriendlyName, ")" );
						else
							text = String.Concat( "(", pl.Rank.Title.String, ", ", faction.Definition.FriendlyName, ")" );
					}

					int hue = ( Faction.Find( from ) == faction ? 98 : 38 );

					PrivateOverheadMessage( MessageType.Label, hue, ascii, text, from.NetState );
				}
			}
			base.OnAosSingleClick( from );
		}
		
		public override void OnDeath( Container c )
		{
			base.OnDeath( c );

			//find the killer
			Mobile killer = FindMostRecentDamager(false);
			if(killer == null)
				return;

			//find the killer's guild
			BaseGuild killerguild = killer.Guild;
			if(killerguild == null)
				return;

			//find the victim's guild
			BaseGuild guild = Guild;
			if(guild == null)
				return;

			//check to see if they're in the same guild
			if(guild == killerguild)
				return;
			
			//check to see fi they're partied
			if(Party != null && killer.Party == Party)
				return;

			//add a kill for the killer's guild
			//if(killerguild is Guild)
			{
				//((Guild)killerguild).AddKill(guild);
				//Console.WriteLine("Adding kill {0}", DateTime.Now.ToString());
			}
		}
		
		// Dueling Pits
		public override bool OnBeforeDeath()
		{

			///////////////////// FROZEN BUG FIX ///////////////////////
			try
			{
				NetState ns = this.NetState;
				GumpCollection gumps = ns.Gumps;
				for ( int i = 0; i < gumps.Count; ++i )
				{
					if (gumps[i] is ResurrectGump)
						NetState.RemoveGump(i);
				}
			}
			catch{}
			///////////////////// FROZEN BUG FIX ///////////////////////

			if ( m_FillCorpse )
			{
				ArrayList toGive = new ArrayList();

				ArrayList list = Aggressors;
				for ( int i = 0; i < list.Count; ++i )
				{
					AggressorInfo info = (AggressorInfo)list[i];

					if ( info.Attacker.Player && info.Attacker.Alive && (DateTime.Now - info.LastCombatTime) < TimeSpan.FromSeconds( 30.0 ) && !toGive.Contains( info.Attacker ) )
						toGive.Add( info.Attacker );
				}

				list = Aggressed;
				for ( int i = 0; i < list.Count; ++i )
				{
					AggressorInfo info = (AggressorInfo)list[i];

					if ( info.Defender.Player && info.Defender.Alive && (DateTime.Now - info.LastCombatTime) < TimeSpan.FromSeconds( 30.0 ) && !toGive.Contains( info.Defender ) )
						toGive.Add( info.Defender );
				}

				if ( toGive.Count > 0 )
				{
					for ( int i = 0; i < toGive.Count; ++i )
					{
						int level;
						double random = Utility.RandomDouble();

						if ( 0.1 >= random )
							level = 20;
						else if ( 0.4 >= random )
							level = 15;
						else
							level = 10;

						Mobile m = (Mobile)toGive[i];

						PowerScroll ps = PowerScroll.CreateRandom( level, level );
						if ( !m.PlaceInBackpack( ps ) )
							ps.Delete();

						BankCheck check = new BankCheck( Utility.Random( 10000, 20000 ) );
						if ( !m.PlaceInBackpack( check ) )
							check.Delete();
					}
				}
			}

			if ( Region is Server.DuelSystem.DuelRegion )
			{
				m_CanRegenHits = false;
				((Server.DuelSystem.DuelRegion)Region).Pit.End();
				
				return false;
			}
			
			return base.OnBeforeDeath();
		}
		
		// Dueling Pits
		public void SetCanRegenHits( bool value )
		{
			m_CanRegenHits = value;
		}
		
		public override void OnAfterDelete()
		{
			base.OnAfterDelete();
			
			if ( m_Instances.Contains( this ) )
				m_Instances.Remove( this );
			
			if ( m_Duelists.Contains( this ) )
				m_Duelists.Remove( this );
		}
		
		public override void Resurrect()
		{
			base.Resurrect();

			Item item = FindItemOnLayer( Layer.OuterTorso );
			if ( item != null && item is DeathRobe )
				item.Delete();
			
			//Counselor body. It allows you to walk through doors.
			if ( m_HasGMBody && this.AccessLevel > AccessLevel.Player )
			{
				if ( BodyValue != 0x3DB )
					BodyValue = 0x3DB;
			}
		}

		
		public override void OnAfterResurrect()
		{
			base.OnAfterResurrect();

			Mobile m = this as Mobile;
			if(m == null)
				return;
		}

		public override void OnBeneficialAction( Mobile target, bool isCriminal )
		{
			if(Guild == null || target.Guild == null || Guild != target.Guild || ((Guild)Guild).IsAlly((Guild)target.Guild))
				base.OnBeneficialAction(target, isCriminal);
		}

		public void AllianceMessage(SpeechEventArgs regArgs, BaseGuild guild, string text, MessageType type, int hue)
		{
			if(guild is Guild)
			{
				Guild g = (Guild) guild;
				if(g.Allies.Count == 0)
				{
					SendMessage("Your guild has no allies.");
					return;
				}
			}
				
		}
	}
}