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!

PowerScroll help plz

supernova72611;643096 said:
its just i was not payin att. was that return; was in your code and i missed it when i change it around a bit to fit my needs so put in break then it compiled no prob i'll test real quick and if all goes well will post it up

Ok done first test it seems ok for a base but now we need a random set up for other two types of deeds, do you know of a file where i can look for a ref. on that

like say so much % gives you this one , so much gives this one and so on
thanks
 

Malaperth

Wanderer
You can just extend the current way.

Code:
double chance = Utility.RandomDouble();
if(chance <= 0.20)
    dropStuffA();
else if(chance <=0.4)
    dropStuffB();
else
    dropStuffC();
 
Malaperth;643169 said:
You can just extend the current way.

Code:
double chance = Utility.RandomDouble();
if(chance <= 0.20)
    dropStuffA();
else if(chance <=0.4)
    dropStuffB();
else
    dropStuffC();

you are ref. to the deed drop add in correct
Code:
/* Mods To Base Champion By
 * Malaperth And Supernova72611
 * Please leave in header
 * to give great where credit is due*/

using System;
using System.Collections;
using Server;
using Server.Items;
using Server.Engines.CannedEvil;
using System.Collections.Generic;

namespace Server.Mobiles
{
	public abstract class BaseChampion : BaseCreature
	{
		public BaseChampion( AIType aiType ) : this( aiType, FightMode.Closest )
		{
		}

		public BaseChampion( AIType aiType, FightMode mode ) : base( aiType, mode, 18, 1, 0.1, 0.2 )
		{
		}

		public BaseChampion( Serial serial ) : base( serial )
		{
		}

		public abstract ChampionSkullType SkullType{ get; }

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

 //////////////////////////////////////////////////////////
        public static Item CreateRandomDeed()
        {
            Item item = null;
            switch (Utility.Random(15))
            {
                case 0: item = new ArmorBonusHitRegenDeed(); break;
                case 1: item = new ArmorBonusStamRegenDeed(); return;
                case 2: item = new ArmorEnergyResistDeed(); break;
                case 3: item = new ArmorSelfRepairDeed(); break;
                case 4: item = new ArmorLowerManaCostDeed(); break;
                case 5: item = new ArmorLuckDeed(); break;
                case 6: item = new ArmorNightSightDeed(); break;
                case 7: item = new ArmorPoisonResistDeed(); break;
                case 8: item = new ArmorReflectDeed(); break;
                case 9: item = new ArmorPhysicalResistDeed(); break;
                case 10: item = new ArmorMageArmorDeed(); break;
                case 11: item = new ArmorLowerReagentCostDeed(); break;
                case 12: item = new ArmorFireResistDeed(); break;
                case 13: item = new ArmorColdResistDeed(); break;
                case 14: item = new ArmorBonusManaRegenDeed(); break;
            }
            m.SendMessage("You have recieved an enhancment scroll.");
            return item;
        }
     
 ////////////////////////////////////////////////////////////
		private PowerScroll CreateRandomPowerScroll()
		{
			int level;
			double random = Utility.RandomDouble();

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

			return PowerScroll.CreateRandomNoCraft( level, level );
		}

		public void GivePowerScrolls()
		{
			/*if ( Map != Map.Felucca )
				return;*/

			ArrayList toGive = new ArrayList();
			List<DamageStore> rights = BaseCreature.GetLootingRights( this.DamageEntries, this.HitsMax );
           
                                               
			for ( int i = rights.Count - 1; i >= 0; --i )
			{
				DamageStore ds = rights[i];

				if ( ds.m_HasRight )
					toGive.Add( ds.m_Mobile );
			}

			if ( toGive.Count == 0 )
				return;

			for( int i = 0; i < toGive.Count; i++ )
			{
				Mobile m = (Mobile)toGive[i];

				if( !(m is PlayerMobile) )
					continue;

				bool gainedPath = false;

				int pointsToGain = 800;

				if( VirtueHelper.Award( m, VirtueName.Valor, pointsToGain, ref gainedPath ) )
				{
					if( gainedPath )
						m.SendLocalizedMessage( 1054032 ); // You have gained a path in Valor!
					else
						m.SendLocalizedMessage( 1054030 ); // You have gained in Valor!

					//No delay on Valor gains
				}
			}

			// Randomize
			for ( int i = 0; i < toGive.Count; ++i )
			{
				int rand = Utility.Random( toGive.Count );
				object hold = toGive[i];
				toGive[i] = toGive[rand];
				toGive[rand] = hold;
			}

			for ( int i = 0; i < 6; ++i )
			{
				Mobile m = (Mobile)toGive[i % toGive.Count];

				PowerScroll ps = CreateRandomPowerScroll();

				m.SendLocalizedMessage( 1049524 ); // You have received a scroll of power!

                if (!Core.SE || m.Alive)
////////////////////////////////////////////////////////////////////
                    if (Utility.RandomDouble() <= 0.20)
                        m.AddToBackpack(CreateRandomDeed());                         
                    else
////////////////////////////////////////////////////////////////////
                        m.AddToBackpack(ps);
                else
                {
					if ( m.Corpse != null && !m.Corpse.Deleted )
						((Container)m.Corpse).DropItem( ps );
					else
						m.AddToBackpack( ps );
				}

				if ( m is PlayerMobile )
				{
					PlayerMobile pm = (PlayerMobile)m;

					for ( int j = 0; j < pm.JusticeProtectors.Count; ++j )
					{
						Mobile prot = (Mobile)pm.JusticeProtectors[j];

						if ( prot.Map != m.Map || prot.Kills >= 5 || prot.Criminal || !JusticeVirtue.CheckMapRegion( m, prot ) )
							continue;

						int chance = 0;

						switch ( VirtueHelper.GetLevel( prot, VirtueName.Justice ) )
						{
							case VirtueLevel.Seeker: chance = 60; break;
							case VirtueLevel.Follower: chance = 80; break;
							case VirtueLevel.Knight: chance = 100; break;
						}

						if ( chance > Utility.Random( 100 ) )
						{
							ps = CreateRandomPowerScroll();

							prot.SendLocalizedMessage( 1049368 ); // You have been rewarded for your dedication to Justice!

							if ( !Core.SE || prot.Alive )
								prot.AddToBackpack( ps );
							else
							{
								if ( prot.Corpse != null && !prot.Corpse.Deleted )
									((Container)prot.Corpse).DropItem( ps );
								else
									prot.AddToBackpack( ps );
							}
						}
					}
				}
			}
		}

		public override bool OnBeforeDeath()
		{
			if ( !NoKillAwards )
			{
				GivePowerScrolls();

				Map map = this.Map;

				if ( map != null )
				{
					for ( int x = -12; x <= 12; ++x )
					{
						for ( int y = -12; y <= 12; ++y )
						{
							double dist = Math.Sqrt(x*x+y*y);

							if ( dist <= 12 )
								new GoodiesTimer( map, X + x, Y + y ).Start();
						}
					}
				}
			}

			return base.OnBeforeDeath();
		}

		public override void OnDeath( Container c )
		{
			//if ( Map == Map.Felucca )
			{
				//TODO: Confirm SE change or AoS one too?
				List<DamageStore> rights = BaseCreature.GetLootingRights( this.DamageEntries, this.HitsMax );
				List<Mobile> toGive = new List<Mobile>();

				for ( int i = rights.Count - 1; i >= 0; --i )
				{
					DamageStore ds = rights[i];

					if ( ds.m_HasRight )
						toGive.Add( ds.m_Mobile );
				}

				if ( toGive.Count > 0 )
					toGive[Utility.Random( toGive.Count )].AddToBackpack( new ChampionSkull( SkullType ) );
				else
					c.DropItem( new ChampionSkull( SkullType ) );
			}

			base.OnDeath( c );
		}

		private class GoodiesTimer : Timer
		{
			private Map m_Map;
			private int m_X, m_Y;

			public GoodiesTimer( Map map, int x, int y ) : base( TimeSpan.FromSeconds( Utility.RandomDouble() * 10.0 ) )
			{
				m_Map = map;
				m_X = x;
				m_Y = y;
			}

			protected override void OnTick()
			{
				int z = m_Map.GetAverageZ( m_X, m_Y );
				bool canFit = m_Map.CanFit( m_X, m_Y, z, 6, false, false );

				for ( int i = -3; !canFit && i <= 3; ++i )
				{
					canFit = m_Map.CanFit( m_X, m_Y, z + i, 6, false, false );

					if ( canFit )
						z += i;
				}

				if ( !canFit )
					return;

				Gold g = new Gold( 500, 1000 );
				
				g.MoveToWorld( new Point3D( m_X, m_Y, z ), m_Map );

				if ( 0.5 >= Utility.RandomDouble() )
				{
					switch ( Utility.Random( 3 ) )
					{
						case 0: // Fire column
						{
							Effects.SendLocationParticles( EffectItem.Create( g.Location, g.Map, EffectItem.DefaultDuration ), 0x3709, 10, 30, 5052 );
							Effects.PlaySound( g, g.Map, 0x208 );

							break;
						}
						case 1: // Explosion
						{
							Effects.SendLocationParticles( EffectItem.Create( g.Location, g.Map, EffectItem.DefaultDuration ), 0x36BD, 20, 10, 5044 );
							Effects.PlaySound( g, g.Map, 0x307 );

							break;
						}
						case 2: // Ball of fire
						{
							Effects.SendLocationParticles( EffectItem.Create( g.Location, g.Map, EffectItem.DefaultDuration ), 0x36FE, 10, 10, 5052 );

							break;
						}
					}
				}
			}
		}
	}
}
 

Malaperth

Wanderer
I'm not sure what you mean. You can either create another method like the CreateRandomDeed method I showed you, or add more random chances to check what to drop as I showed you. If it's something else you want, I need to understand what it is you want better.
 
Malaperth;643172 said:
I'm not sure what you mean. You can either create another method like the CreateRandomDeed method I showed you, or add more random chances to check what to drop as I showed you. If it's something else you want, I need to understand what it is you want better.

no! im sorry just showing you what i had so far as to keep you up on what im changing that was all adding in new method now
 
thats not the point here because you are in fact helping me put it together and i fell its no more than right that you have the credit for what you are doing for me and im learning more as i go so that is good for me so i look as its a good thing
 
OK finally got it all put back together after boo booo , here is what i have all but there random part was having trouble getting it to work and im getting really tierd been up too long LOL son mad a wreck of things quick, anyway had to go back and mod a few of the deeds also


Code:
/* Mods To Base Champion By
 * Malaperth And Supernova72611
 * Please leave in header
 * to give great where credit is due*/

using System;
using System.Collections;
using Server;
using Server.Items;
using Server.Engines.CannedEvil;
using System.Collections.Generic;

namespace Server.Mobiles
{
	public abstract class BaseChampion : BaseCreature
	{
		public BaseChampion( AIType aiType ) : this( aiType, FightMode.Closest )
		{
		}

		public BaseChampion( AIType aiType, FightMode mode ) : base( aiType, mode, 18, 1, 0.1, 0.2 )
		{
		}

		public BaseChampion( Serial serial ) : base( serial )
		{
		}

		public abstract ChampionSkullType SkullType{ get; }

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

 //////////////////////////////////////////////////////////
        public static Item CreateRandomDeed()
        {
            Item item = null;
         
            switch (Utility.Random(84))
            {
                case 0: {item = new ArmorBonusHitRegenDeed(); break;}
                case 1: {item = new ArmorBonusStamRegenDeed(); break;}
                case 2: {item = new ArmorEnergyResistDeed(); break;}
                case 3: {item = new ArmorSelfRepairDeed(); break;}
                case 4: {item = new ArmorLowerManaCostDeed(); break;}
                case 5: {item = new ArmorLuckDeed(); break;}
                case 6: {item = new ArmorNightSightDeed(); break;}
                case 7: {item = new ArmorPoisonResistDeed(); break;}
                case 8: {item = new ArmorReflectDeed(); break;}
                case 9: {item = new ArmorPhysicalResistDeed(); break;}
                case 10: {item = new ArmorMageArmorDeed(); break;}
                case 11: {item = new ArmorLowerReagentCostDeed(); break;}
                case 12: {item = new ArmorFireResistDeed(); break;}
                case 13: {item = new ArmorColdResistDeed(); break;}
                case 14: {item = new ArmorBonusManaRegenDeed(); break;}
                
                case 15: {item = new WeaponAttackChanceDeed(); break;}
                case 16: {item = new WeaponColdResistDeed(); break;}
                case 17: {item = new WeaponDmgDeed(); break;}
                case 18: {item = new WeaponFireResistDeed(); break;}
                case 19: {item = new WeaponHitDispelDeed(); break;}
                case 20: {item = new WeaponHitFireAreaDeed(); break;}
                case 21: {item = new WeaponHitHarmDeed(); break;}
                case 22: {item = new WeaponHitLightningDeed(); break;}
                case 23: {item = new WeaponHitLowerDefenceDeed(); break;}
                case 24: {item = new WeaponHitManaDeed(); break;}
                case 25: {item = new WeaponHitPoisonAreaDeed(); break;}
                case 26: {item = new WeaponLuckDeed(); break;}
                case 27: {item = new WeaponPhysicalResistDeed(); break;}
                case 28: {item = new WeaponSelfRepairDeed(); break;}
                case 29: {item = new WeaponSpellChannelDeed(); break;}
                case 30: {item = new WeaponCastSpeedDeed(); break;}
                case 31: {item = new WeaponDefenceChanceDeed(); break;}
                case 32: {item = new WeaponEnergyResistDeed(); break;}
                case 33: {item = new WeaponHitColdAreaDeed(); break;}
                case 34: {item = new WeaponHitEnergyAreaDeed(); break;}
                case 35: {item = new WeaponHitFireballDeed(); break;}
                case 36: {item = new WeaponHitLifeDeed(); break;}
                case 37: {item = new WeaponHitLowerAttackDeed(); break;}
                case 38: {item = new WeaponHitMagicarrowDeed(); break;}
                case 39: {item = new WeaponHitPhysicalAreaDeed(); break;}
                case 40: {item = new WeaponHitStamDeed(); break;}
                case 41: {item = new WeaponMageWeapDeed(); break;}
                case 42: {item = new WeaponPoisonResistDeed(); break;}
                case 43: {item = new WeaponSpeedDeed(); break;}
                case 44: {item = new WeaponUseBestWeaponSkillDeed(); break; }
               
                case 45: {item = new ShieldAttackChanceModDeed(); break;}
                case 46: {item = new ShieldDefenceChanceModDeed(); break;}
                case 47: {item = new ShieldReflectModDeed(); break;}
                case 48: {item = new ShieldSpellChannelingDeed(); break;}
                case 49: {item = new ShieldSelfRepairModDeed(); break;}
                case 50: {item = new ShieldLuckModDeed(); break;}
                case 51: {item = new ShieldCastSpeedModDeed(); break;}

                case 52: {item = new WeaponSlayerArachnidDoomDeed(); break;}
                case 53: {item = new WeaponSlayerBloodDrinkingDeed(); break;}
                case 54: {item = new WeaponSlayerDragonSlayerDeed(); break;}
                case 55: {item = new WeaponSlayerElementalBanDeed(); break;}
                case 56: { item = new WeaponSlayerExorcismDeed(); break; }
                case 57: {item = new WeaponSlayerFlameDousingDeed(); break;}
                case 58: {item = new WeaponSlayerLizardmanSlaughterDeed(); break;}
                case 59: {item = new WeaponSlayerOphidianDeed(); break;}
                case 60: {item = new WeaponSlayerScorpionsBaneDeed(); break;}
                case 61: {item = new WeaponSlayerSpidersDeathDeed(); break;}
                case 62: {item = new WeaponSlayerTerathanDeed(); break;}
                case 63: {item = new WeaponSlayerUndeadDeed(); break;}
                case 64: {item = new WeaponSlayerWaterDissipationDeed(); break;}
                case 65: {item = new WeaponSlayerVacuumDeed(); break;}
                case 66: {item = new WeaponSlayerTrollSlaughterDeed(); break;}
                case 67: {item = new WeaponSlayerSummerWindDeed(); break;}
                case 68: {item = new WeaponSlayerSnakesBaneDeed(); break;}
                case 69: {item = new WeaponSlayerReptilianDeathDeed(); break;}
                case 70: {item = new WeaponSlayerOrcDeed(); break;}
                case 71: {item = new WeaponSlayerGargoylesFoeDeed(); break;}
                case 72: {item = new WeaponSlayerFeyDeed(); break;}
                case 73: {item = new WeaponSlayerElementalHealthDeed(); break;}
                case 74: {item = new WeaponSlayerEarthShatterDeed(); break; }
                case 76: {item = new WeaponSlayerDaemonDismissalDeed(); break;}
                case 77: {item = new WeaponSlayerBalronDamnationDeed(); break; }

                case 78: {item = new ArmorBonusDexDeed(); break;}
                case 79: {item = new ArmorBonusIntDeed(); break;}
                case 80: {item = new ArmorBonusStamDeed(); break;}
                case 81: {item = new ArmorBonusHitsDeed(); break;}
                case 82: {item = new ArmorBonusManaDeed(); break;}
                case 83: {item = new ArmorBonusStrDeed(); break;}
            }
             
             return item;
        }
     
 ////////////////////////////////////////////////////////////
		private PowerScroll CreateRandomPowerScroll()
		{
			int level;
			double random = Utility.RandomDouble();

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

			return PowerScroll.CreateRandomNoCraft( level, level );
		}

		public void GivePowerScrolls()
		{
			/*if ( Map != Map.Felucca )
				return;*/

			ArrayList toGive = new ArrayList();
			List<DamageStore> rights = BaseCreature.GetLootingRights( this.DamageEntries, this.HitsMax );
           
                                               
			for ( int i = rights.Count - 1; i >= 0; --i )
			{
				DamageStore ds = rights[i];

				if ( ds.m_HasRight )
					toGive.Add( ds.m_Mobile );
			}

			if ( toGive.Count == 0 )
				return;

			for( int i = 0; i < toGive.Count; i++ )
			{
				Mobile m = (Mobile)toGive[i];

				if( !(m is PlayerMobile) )
					continue;

				bool gainedPath = false;

				int pointsToGain = 800;

				if( VirtueHelper.Award( m, VirtueName.Valor, pointsToGain, ref gainedPath ) )
				{
					if( gainedPath )
						m.SendLocalizedMessage( 1054032 ); // You have gained a path in Valor!
					else
						m.SendLocalizedMessage( 1054030 ); // You have gained in Valor!

					//No delay on Valor gains
				}
			}

			// Randomize
			for ( int i = 0; i < toGive.Count; ++i )
			{
				int rand = Utility.Random( toGive.Count );
				object hold = toGive[i];
				toGive[i] = toGive[rand];
				toGive[rand] = hold;
			}

			for ( int i = 0; i < 6; ++i )
			{
				Mobile m = (Mobile)toGive[i % toGive.Count];

				PowerScroll ps = CreateRandomPowerScroll();

				m.SendLocalizedMessage( 1049524 ); // You have received a scroll of power!

                if (!Core.SE || m.Alive)
////////////////////////////////////////////////////////////////////
                    if (Utility.RandomDouble() <= 0.20)
                        m.AddToBackpack(CreateRandomDeed());
                    else
////////////////////////////////////////////////////////////////////
                        m.AddToBackpack(ps);
                else
                {
					if ( m.Corpse != null && !m.Corpse.Deleted )
						((Container)m.Corpse).DropItem( ps );
					else
						m.AddToBackpack( ps );
				}

				if ( m is PlayerMobile )
				{
					PlayerMobile pm = (PlayerMobile)m;

					for ( int j = 0; j < pm.JusticeProtectors.Count; ++j )
					{
						Mobile prot = (Mobile)pm.JusticeProtectors[j];

						if ( prot.Map != m.Map || prot.Kills >= 5 || prot.Criminal || !JusticeVirtue.CheckMapRegion( m, prot ) )
							continue;

						int chance = 0;

						switch ( VirtueHelper.GetLevel( prot, VirtueName.Justice ) )
						{
							case VirtueLevel.Seeker: chance = 60; break;
							case VirtueLevel.Follower: chance = 80; break;
							case VirtueLevel.Knight: chance = 100; break;
						}

						if ( chance > Utility.Random( 100 ) )
						{
							ps = CreateRandomPowerScroll();

							prot.SendLocalizedMessage( 1049368 ); // You have been rewarded for your dedication to Justice!

							if ( !Core.SE || prot.Alive )
								prot.AddToBackpack( ps );
							else
							{
								if ( prot.Corpse != null && !prot.Corpse.Deleted )
									((Container)prot.Corpse).DropItem( ps );
								else
									prot.AddToBackpack( ps );
							}
						}
					}
				}
			}
		}

		public override bool OnBeforeDeath()
		{
			if ( !NoKillAwards )
			{
				GivePowerScrolls();

				Map map = this.Map;

				if ( map != null )
				{
					for ( int x = -12; x <= 12; ++x )
					{
						for ( int y = -12; y <= 12; ++y )
						{
							double dist = Math.Sqrt(x*x+y*y);

							if ( dist <= 12 )
								new GoodiesTimer( map, X + x, Y + y ).Start();
						}
					}
				}
			}

			return base.OnBeforeDeath();
		}

		public override void OnDeath( Container c )
		{
			//if ( Map == Map.Felucca )
			{
				//TODO: Confirm SE change or AoS one too?
				List<DamageStore> rights = BaseCreature.GetLootingRights( this.DamageEntries, this.HitsMax );
				List<Mobile> toGive = new List<Mobile>();

				for ( int i = rights.Count - 1; i >= 0; --i )
				{
					DamageStore ds = rights[i];

					if ( ds.m_HasRight )
						toGive.Add( ds.m_Mobile );
				}

				if ( toGive.Count > 0 )
					toGive[Utility.Random( toGive.Count )].AddToBackpack( new ChampionSkull( SkullType ) );
				else
					c.DropItem( new ChampionSkull( SkullType ) );
			}

			base.OnDeath( c );
		}

		private class GoodiesTimer : Timer
		{
			private Map m_Map;
			private int m_X, m_Y;

			public GoodiesTimer( Map map, int x, int y ) : base( TimeSpan.FromSeconds( Utility.RandomDouble() * 10.0 ) )
			{
				m_Map = map;
				m_X = x;
				m_Y = y;
			}

			protected override void OnTick()
			{
				int z = m_Map.GetAverageZ( m_X, m_Y );
				bool canFit = m_Map.CanFit( m_X, m_Y, z, 6, false, false );

				for ( int i = -3; !canFit && i <= 3; ++i )
				{
					canFit = m_Map.CanFit( m_X, m_Y, z + i, 6, false, false );

					if ( canFit )
						z += i;
				}

				if ( !canFit )
					return;

				Gold g = new Gold( 500, 1000 );
				
				g.MoveToWorld( new Point3D( m_X, m_Y, z ), m_Map );

				if ( 0.5 >= Utility.RandomDouble() )
				{
					switch ( Utility.Random( 3 ) )
					{
						case 0: // Fire column
						{
							Effects.SendLocationParticles( EffectItem.Create( g.Location, g.Map, EffectItem.DefaultDuration ), 0x3709, 10, 30, 5052 );
							Effects.PlaySound( g, g.Map, 0x208 );

							break;
						}
						case 1: // Explosion
						{
							Effects.SendLocationParticles( EffectItem.Create( g.Location, g.Map, EffectItem.DefaultDuration ), 0x36BD, 20, 10, 5044 );
							Effects.PlaySound( g, g.Map, 0x307 );

							break;
						}
						case 2: // Ball of fire
						{
							Effects.SendLocationParticles( EffectItem.Create( g.Location, g.Map, EffectItem.DefaultDuration ), 0x36FE, 10, 10, 5052 );

							break;
						}
					}
				}
			}
		}
	}
}

This compiles but not tested yet so if you have a better way of puttiing it in let me know please thanks for help ahead of time
 

Malaperth

Wanderer
bah... sorry, but I'm far too lazy to look at code that hasn't even been compiled yet :) Get some sleep, compile the code and see where you stand. Things hopefully will be better in the morning :)
 
This compiles but not tested yet so if you have a better way of puttiing it in let me know please thanks for help ahead of time.

Was at bottom of page
 

Malaperth

Wanderer
Well, crap, sorry I was so lazy I didn't even read the whole post :(

Anyway, I don't see anything wrong with it, but, just in case you want something else to have a chance at dropping those deeds, I might put all that info in another class by itself so it can be called by anything. If you want to do that and don't understand how, I expect I'll be back tomorrow since I don't seem to have a life.
 
Top