///////Altering PlayerMobile.cs or add to custom mobile////////////////

Right at the top with the other enums add:

		public enum SolenFriend 
		{ 
			None, Black, Red 
		}

Add to the list of properties in your PlayerMobile class:

		// --- Start Quest Property --- //

		private BaseQuest m_CurrentQuest;
		public DateTime m_QuestRestartTime;
		private SolenFriend m_SolenFriend = SolenFriend.None;

		// --- Stop Quest Property --- //

Add to your PlayerMobile class near other property methods:

		// --- Start Quest Property Method --- //

		public BaseQuest CurrentQuest
		{
			get { return m_CurrentQuest; }
			set { m_CurrentQuest = value; }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public bool CanStartNewQuest
		{
			get
			{
				if ( DateTime.Now > m_QuestRestartTime && Quest == null )
					return true;
				else
					return false;
			}
		}

		[CommandProperty( AccessLevel.GameMaster )] 
		public SolenFriend SolenFriendship 
		{ 
			get { return m_SolenFriend; } 
			set { m_SolenFriend = value; } 
		}

		// --- Stop Quest Property Method --- //

Add to serialize and deserialize methods:( make sure you make a new case for these! ) 

		// --- Start Quest Serialization --- //

		writer.Write( (int)m_SolenFriend );
		writer.Write( m_CurrentQuest );

		// --- Stop Quest Serialization --- //

		// --- Start Quest Deserialization --- //

		m_SolenFriend = (SolenFriend)reader.ReadInt();
		m_CurrentQuest = (BaseQuest) reader.ReadItem();

		// --- Stop Quest Deserialization --- //



This method is already in your PlayerMobile class, find it and make it look like this :



		public override void GetContextMenuEntries( Mobile from, ArrayList list )
		{
			base.GetContextMenuEntries( from, list );

			if ( from == this )
			{
				if ( m_Quest != null )
					m_Quest.GetContextMenuEntries( list );
									
				//added for basequest
				
				if( m_CurrentQuest != null )
				{
					if( !m_CurrentQuest.Deleted )
					{
						list.Add( new QuestLogEntry( from, m_CurrentQuest ) );
						list.Add( new QuestConversationEntry ( from, m_CurrentQuest ) );
						list.Add( new CancelQuestEntry( from, m_CurrentQuest ) );
					}
				}

				//end of added basequest

				if ( Alive && InsuranceEnabled )
				{
					list.Add( new CallbackEntry( 6201, new ContextCallback( ToggleItemInsurance ) ) );

					if ( AutoRenewInsurance )
						list.Add( new CallbackEntry( 6202, new ContextCallback( CancelRenewInventoryInsurance ) ) );
					else
						list.Add( new CallbackEntry( 6200, new ContextCallback( AutoRenewInventoryInsurance ) ) );
				}

				// TODO: Toggle champ titles

				BaseHouse house = BaseHouse.FindHouseAt( this );

				if ( house != null && house.IsAosRules )
					list.Add( new CallbackEntry( 6207, new ContextCallback( LeaveHouse ) ) );

				if ( m_JusticeProtectors.Count > 0 )
					list.Add( new CallbackEntry( 6157, new ContextCallback( CancelProtection ) ) );
			}
		}

These can be added anywhere.. for easy add it right after the method you just altered:

// --- Start Quest Context Menu's --- //

		private class QuestLogEntry : Server.ContextMenus.ContextMenuEntry
		{
			private BaseQuest m_Quest;
			private Mobile m_From;

			public QuestLogEntry( Mobile from, BaseQuest quest ) : base( 6154 )
			{
				m_Quest = quest;
				m_From = from;
			}

			public override void OnClick()
			{
				m_From.SendGump( new Server.Gumps.QuestLogGump( m_Quest ) );
			}
		}

		private class CancelQuestEntry : Server.ContextMenus.ContextMenuEntry
		{
			private BaseQuest m_Quest;
			private Mobile m_From;

			public CancelQuestEntry( Mobile from, BaseQuest quest ) : base( 6155 )
			{
				m_Quest = quest;
				m_From = from;
			}

			public override void OnClick()
			{
				m_From.SendGump( new Server.Gumps.CancelQuestGump( m_Quest ) );
			}
		}

		private class QuestConversationEntry : Server.ContextMenus.ContextMenuEntry
		{
			private BaseQuest m_Quest;
			private Mobile m_From;

			public QuestConversationEntry( Mobile from, BaseQuest quest ) : base( 6156 )
			{
				m_Quest = quest;
				m_From = from;
			}

			public override void OnClick()
			{
				m_From.SendGump( new Server.Gumps.StartQuestGump( m_Quest ) );
			}
		}

// --- Stop Quest Context Menu's --- //

//////////////////End of PlayerMobile Alterations//////////////////////



//////////////////////Find QuestSystem.cs//////////////////

Find the method in questsystem.cs that looks like this

		public static bool CanOfferQuest( Mobile check, Type questType, out bool inRestartPeriod )

Find this part and make it look like this

			if ( pm == null )
				return false;

			//added so quests dont conflict

			if ( pm.CurrentQuest != null )
				return false;

			//end of added

			if ( pm.HasGump( typeof( QuestOfferGump ) ) )
				return false;

//////////////////End of QuestSystem.cs///////////////////////

/////////////////Goto PlantHue.cs////////////////////////

Add this method right after RandomFirstGeneration() method


		public static PlantHue RandomRare()
		{
			switch ( Utility.Random( 3 ) )
			{
				case 0: return PlantHue.Aqua;
				case 1: return PlantHue.Pink;
				default: return PlantHue.Magenta;
			}
		}

//////////////////End of PlantHue.cs///////////////////////////


I may have missed something.. i use a custom playermobile so i had to redo
the changes to release it public. These changes will allow this quest system to run 
along with runuos quest system... it wont let you start a basequest while on a runuo
quest or vice versa.

The ant mobiles and beverage.cs are included, you will need to delete the distro ones.

Post any problems ill help with what i can.


Dev Fury
www.uoevolution.com