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!

[RunUO 2.0 SVN] Universal Storage Keys

GhostRiderGrey

Sorceror
Well, today I had a player unlock their Armory and forget to lock it down again and it poofed. He wondered if there was a way that it could tell you that it was locked down when you run your mouse over it, like most of the other locked down house items do.

The Add-On Deed Key does show you that it is locked down. I compared that key to the Armory and do not see why one the Add-On key will show you locked down, and the Armory will not. Both derive from BaseStoreKey and are very similar scripts.

Thoughts or Suggestions?

Thanks!
:D GhostRiderGrey
 

datguy

Sorceror
When I did the Bod's I remember I had to play with it a bit, here's mine & you can find what's different & maybe make yours work
Here's Bodlistentries
Smallbod
Code:
    public class SmallTinkerBODListEntry : ItemListEntry
    {
        public override int GumpWidth { get { return 550; } }

        //generic bod-specific data
        protected int _AmountCur, _AmountMax;
        protected Type _BODFillType;				//the item to go into the BOD, different from the BOD type
        protected int _Number;
        protected int _Graphic;

        public override List<ItemListEntryColumn> Columns
        {
            get
            {
                if (_Columns == null)
                {
                    //NOTE: the default name is overridden here completely
                    _Columns = new List<ItemListEntryColumn>();

                    //add in specifics for this list type here
                    _Columns.Add(new ItemListEntryColumn(0, "Item Type", CliLoc.GetName(_BODFillType)));
                    _Columns.Add(new ItemListEntryColumn(150, "Amount", _AmountCur.ToString() + "/" + _AmountMax.ToString()));
                    //_Columns.Add(new ItemListEntryColumn(250, "Exceptional?", (_RequireExceptional ? "yes" : "no")));
                    //_Columns.Add(new ItemListEntryColumn(350, "Resource", Enum.GetName(typeof(BulkMaterialType), (int)_Material)));
                }

                return _Columns;
            }
        }

        //public accessors
        public int AmountCur { get { return _AmountCur; } }
        public int AmountMax { get { return _AmountMax; } }
        public Type BODFillType { get { return _BODFillType; } }
        public int Number { get { return _Number; } }
        public int Graphic { get { return _Graphic; } }



        //master constructor
        public SmallTinkerBODListEntry(Item item)
            : base(item)
        {
            SmallTinkerBOD bod = (SmallTinkerBOD)item;

            _AmountCur = bod.AmountCur;
            _AmountMax = bod.AmountMax;
            _BODFillType = bod.Type;
            _Number = bod.Number;
            _Graphic = bod.Graphic;
        }

        //world load constructor
        public SmallTinkerBODListEntry(GenericReader reader)
            : base(reader)
        {
        }

        //clone constructor
        public SmallTinkerBODListEntry(SmallTinkerBODListEntry entry)
            : base(entry)
        {
            _AmountCur = entry.AmountCur;
            _AmountMax = entry.AmountMax;
            _BODFillType = entry.BODFillType;
            _Number = entry.Number;
            _Graphic = entry.Graphic;
        }

        //this generates an item from what is stored in the entry.  Note no exception handling
        public override Item GenerateItem()
        {
            //TODO: have this do nothing, and have child constructors do the work?
            SmallTinkerBOD bod = (SmallTinkerBOD)Activator.CreateInstance(_Type, new object[] { _AmountCur, _AmountMax, _BODFillType, _Number, _Graphic });

            return bod;
        }


        //this checks if the item you're attempting to create with is proper.  The child classes define specifics for this
        public override bool AllGood(Item item)
        {
            if (!base.AllGood(item))
            {      
                Console.WriteLine("AllGood  return false;");
                return false;
            }

            if (!(item is SmallTinkerBOD))
            {
                Console.WriteLine("SmallTinkerBOD  return false;");
                return false;
            }


            SmallTinkBOD bod = (SmallTinkBOD)item;

            //TODO: test for bod stuff here?

            return true;
        }

        //this is used to drive the cloning process - derived classes fire their associated clone constructor
        public override ItemListEntry Clone()
        {
            return new SmallTinkerBODListEntry(this);

        }

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

            writer.Write(0);

            writer.Write(_AmountCur);
            writer.Write(_AmountMax);
            writer.Write(_BODFillType.Name);
            writer.Write(_Number);
            writer.Write(_Graphic);
        }

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

            int version = reader.ReadInt();

            _AmountCur = reader.ReadInt();
            _AmountMax = reader.ReadInt();
            _BODFillType = ScriptCompiler.FindTypeByName(reader.ReadString());
            _Number = reader.ReadInt();
            _Graphic = reader.ReadInt();

        }
    }

Large Bod
Code:
    public class LargeTinkerBODListEntry : ItemListEntry
    {
        public override int GumpWidth { get { return 700; } }

        //large bod-specific data

        protected int _AmountMax;
        protected string _Contents;				//the name is a composite of the types within the bod
        protected LargeTinkBulkEntry[] _Entries;



        public override List<ItemListEntryColumn> Columns
        {
            get
            {
                if (_Columns == null)
                {
                    //NOTE: the default name is overridden here completely
                    _Columns = new List<ItemListEntryColumn>();

                    //add in specifics for this list type here
                    _Columns.Add(new ItemListEntryColumn(0, "Contents", _Contents));
                    _Columns.Add(new ItemListEntryColumn(450, "Amount", _AmountMax.ToString()));
                }

                return _Columns;
            }
        }

        //public accessors
        public int AmountMax { get { return _AmountMax; } }
        public string Contents { get { return _Contents; } }
        public LargeTinkBulkEntry[] Entries { get { return _Entries; } }


        //master constructor
        public LargeTinkerBODListEntry(Item item)
            : base(item)
        {
            LargeTinkBOD bod = (LargeTinkBOD)item;

            _AmountMax = bod.AmountMax;

            //proper cloning is required

            _Entries = new LargeTinkBulkEntry[bod.Entries.Length];
            for (int i = 0; i < bod.Entries.Length; i++)
            {
                _Entries[i] = new LargeTinkBulkEntry(null, bod.Entries[i].Details);
                _Entries[i].Amount = bod.Entries[i].Amount;
            }



            //this produces the name for the bod based on the bod name definitions
            GenerateContentsName();
        }

        //world load constructor
        public LargeTinkerBODListEntry(GenericReader reader)
            : base(reader)
        {
        }

        //clone constructor
        public LargeTinkerBODListEntry(LargeTinkerBODListEntry entry)
            : base(entry)
        {
            _AmountMax = entry.AmountMax;

            _Entries = new LargeTinkBulkEntry[entry.Entries.Length];

            //proper cloning is required
            for (int i = 0; i < entry.Entries.Length; i++)
            {
                _Entries[i] = new LargeTinkBulkEntry(null, entry.Entries[i].Details);
                _Entries[i].Amount = entry.Entries[i].Amount;
            }

            GenerateContentsName();
        }

        public void GenerateContentsName()
        {
            _Contents = "";

            for (int i = 0; i < _Entries.Length; i++)
            {
                _Contents += CliLoc.GetName(_Entries[i].Details.Type);

                if (i < _Entries.Length - 1)
                {
                    _Contents += ", ";
                }
            }
        }


        //this generates an item from what is stored in the entry.  Note no exception handling
        public override Item GenerateItem()
        {
            LargeTinkerBOD bod = (LargeTinkerBOD)Activator.CreateInstance(_Type, new object[] { _AmountMax, _Entries });

            //attach the large bod to the entries			
            for (int i = 0; i < bod.Entries.Length; i++)
            {
                bod.Entries[i].Owner = bod;
            }

            return bod;
        }


        //this checks if the item you're attempting to create with is proper.  The child classes define specifics for this
        public override bool AllGood(Item item)
        {
            if (!base.AllGood(item))
            {
                return false;
            }

            if (!(item is LargeTinkerBOD))
            {
                return false;
            }

            LargeTinkerBOD bod = (LargeTinkerBOD)item;

            //TODO: test for bod stuff here?

            return true;
        }

        //this is used to drive the cloning process - derived classes fire their associated clone constructor
        public override ItemListEntry Clone()
        {
            return new LargeTinkerBODListEntry(this);

        }

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

            writer.Write(0);

            writer.Write(_AmountMax);
            
            writer.Write(_Entries.Length);

            for (int i = 0; i < _Entries.Length; i++)
            {
                _Entries[i].Serialize(writer);

            }
        }

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

            int version = reader.ReadInt();

            _AmountMax = reader.ReadInt();

            int count = reader.ReadInt();

            _Entries = new LargeTinkBulkEntry[count];
            for (int i = 0; i < count; i++)
            {
                _Entries[i] = new LargeTinkBulkEntry(null, reader);
            }

            GenerateContentsName();

        }
    }



and the Bodkey here
Code:
using System;
using System.Collections;
using System.Collections.Generic;
using Server;
using Solaris.ItemStore;							//for connection to resource store data objects
using Server.Engines.BulkOrders;

namespace Server.Items
{
	//item inherited from BaseResourceKey
	public class BODKey : BaseStoreKey
	{
		public override int DisplayColumns{ get{ return 2; } }
		
		public override List<StoreEntry> EntryStructure
		{
			get
			{
				List<StoreEntry> entry = base.EntryStructure;

                entry.Add(new ListEntry(typeof(SmallSmithBOD), typeof(SmallBODListEntry), "Sm. Blacksmith", 0x14EF, 0x44E));
                entry.Add(new ListEntry(typeof(SmallTailorBOD), typeof(SmallBODListEntry), "Sm. Tailor", 0x14EF, 0x483));
                entry.Add(new ListEntry(typeof(SmallCarpenterBOD), typeof(SmallBODListEntry), "Sm. Carpenter", 0x14EF, 0x30));
                entry.Add(new ListEntry(typeof(SmallFletcherBOD), typeof(SmallBODListEntry), "Sm. Fletcher", 0x14EF, 0x58));
                entry.Add(new ListEntry(typeof(SmallTinkerBOD), typeof(SmallTinkerBODListEntry), "Sm. Tinker", 0x14EF, 0x14));
                entry.Add(new ListEntry(typeof(SmallTamingBOD), typeof(SmallBODMobileListEntry), "Sm. Taming", 0x14EF, 0x1CA));

               //entry.Add(new ColumnSeparationEntry());

                entry.Add(new ListEntry(typeof(LargeSmithBOD), typeof(LargeBODListEntry), "Lg. Blacksmith", 0x2258, 0x44E));
                entry.Add(new ListEntry(typeof(LargeTailorBOD), typeof(LargeBODListEntry), "Lg. Tailor", 0x2258, 0x483));
                entry.Add(new ListEntry(typeof(LargeCarpenterBOD), typeof(LargeBODListEntry), "Lg. Carpenter", 0x2258, 0x30));
                entry.Add(new ListEntry(typeof(LargeFletcherBOD), typeof(LargeBODListEntry), "Lg. Fletcher", 0x2258, 0x58));
                entry.Add(new ListEntry(typeof(LargeTinkerBOD), typeof(LargeTinkerBODListEntry), "Lg. Tinker", 0x2258, 0x14));
                entry.Add(new ListEntry(typeof(LargeTamingBOD), typeof(LargeBODMobileListEntry), "Lg. Taming", 0x2258, 0x1CA));
				return entry;
			}
		}
		
		
		
		[Constructable]
		public BODKey() : base( 1161 )		//hue 1161 - blaze
		{
			ItemID = 8793;
			Name = "Ultimate BOD Book";
		}
		
		
		
		//this loads properties specific to the store, like the gump label, and whether it's a dynamic storage device
		protected override ItemStore GenerateItemStore()
		{
			//load the basic store info
			ItemStore store = base.GenerateItemStore();

			//properties of this storage device
			store.Label = "BOD Storage";
			
			store.Dynamic = false;
			store.OfferDeeds = false;
			return store;
		}
		
		//serial constructor
		public BODKey( Serial serial ) : base( serial )
		{
		}
		
		//events
		
		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			
			writer.Write( 0 );
		}
		
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			
			int version = reader.ReadInt();
		}
	}
 

Fenn

Wanderer
GhostRiderGrey;812837 said:
Well, today I had a player unlock their Armory and forget to lock it down again and it poofed. He wondered if there was a way that it could tell you that it was locked down when you run your mouse over it, like most of the other locked down house items do.

The Add-On Deed Key does show you that it is locked down. I compared that key to the Armory and do not see why one the Add-On key will show you locked down, and the Armory will not. Both derive from BaseStoreKey and are very similar scripts.

Thoughts or Suggestions?

Thanks!
:D GhostRiderGrey

Heya GhostRiderGrey. Sorry to hear about your player's loss. It's been a while since I've played UO (and I barely check in on these forums!) but I seem to recall something about how the the type of artwork affects whether the object property list (eg. "Locked Down", "Blessed", "Charges x", etc.) is visible or not when an item is sitting in the world. Some client data thing.

A cheap and dirty solution would be to mess around with the ItemID of the amory key and find one that is still relatively appropriate, but still allows for the object property list to be visible. Once you've found one you like, modify the script accordingly, and type the following command into UO:

Code:
[global set ItemID #### where armorykey

That command will set the itemid to the number you specify (####) of all armory keys in the world.
 
commodity deeds

I love this system however i have found a issue.. After I have placed woods to the wood key or ingot keys, If i make a commodity deed using reg wood the deed comes out as saying reg ore then when you place the deed in the bank to open it its comes out as a different wood. Has anyone had any issues with this happening. I am using the latest download of this system on a rc1 server.

I even tried to turn off the commotity deed and they are still active
Thanks in advance for any help..
 

Talow

Sorceror
GhostRiderGrey;808168 said:
Fenn, apologies, but we have run into another issue. the PSKey (which holds power scrolls and stat cap scrolls) takes both just fine, but it will not release the stat scrolls. I tried looking at the ItemListEntries.cs but I don't see anything out of place.

Thanks,
GhostRiderGrey

If you look in the actual PSkey, there is a mistake in the type casting, someone made the value of them int when they need to be a double, thus, you need a way to either convert the int to a double and be on your way, or you can re cast it correctly and work on giving you're players new scrolls.

I do want to point out that I have not looked into this this for a few months so it could be backwards, double instead of int.
 

Iomega0318

Sorceror
Was glancing (wont say reading lol) through this and this is excellent work!
++Karma for you!

I have 3 questions though,
1. Can you manually add items from say a Secure/Locked Down container in your house so you don't have to put it all in your pack?
2. Can you say click on a bag and have it all put into the key (Ex. Clicking a secure container in your house and having it add whatever to the key)?
3. If not would any of that be possible and can someone help me script it lol?

Anyways.. excellent work!
 

dragonheart

Sorceror
Hmm, can you make a gold key? one that spits out checks :)

seriously wondering if you can do this, hold gold and not necessarily spit out checks, but you know if you have the gold it can make a check?
 
First off I want to say I love this key system. I have actually made a couple of different keys after figuring out how the system works. I have been watching the console the last few days and have noticed that when ever someone crafts anything while the materials required are in the keys the console show "withdrawing amount 5" or how ever any of the material required is need to create the item. I have noticed players doing this over and over while working there skills up. Has anyone Else noticed this happening and would this possible cause any problems with the server, lag ect. I am using the latest version and svn.


Thank you in advance
 

clarissa

Sorceror
Wood Key

I added the wood our server has to the wood key yet it will not add it to key. Anyone know how to fix this? we are using RC2.

Code:
using System;
using System.Collections;
using System.Collections.Generic;
using Server;
using Solaris.ItemStore;							//for connection to resource store data objects

namespace Server.Items
{
	//item derived from BaseResourceKey
	public class WoodKey : BaseStoreKey
	{
		public override List<StoreEntry> EntryStructure
		{
			get
			{
				List<StoreEntry> entry = base.EntryStructure;
				
		    entry.Add( new ResourceEntry( typeof( Board ), new Type[]{ typeof( Log ) }, "Plain" ) );
                entry.Add( new ResourceEntry( typeof( Board ), new Type[]{ typeof( Log ) }, "Ash" ) );
                entry.Add( new ResourceEntry( typeof( Board ), new Type[]{ typeof( Log ) }, "Oak" ) );
                entry.Add( new ResourceEntry( typeof( Board ), new Type[]{ typeof( Log ) }, "Yew" ) );
                entry.Add( new ResourceEntry( typeof( Board ), new Type[]{ typeof( Log ) }, "Heartwood" ) );
                entry.Add( new ResourceEntry( typeof( Board ), new Type[]{ typeof( Log ) }, "Bloodwood" ) );
                entry.Add( new ResourceEntry( typeof( Board ), new Type[]{ typeof( Log ) }, "Frostwood" ) );
				entry.Add( new ResourceEntry( typeof( Kindling ), "Kindling" ) );
				entry.Add( new ResourceEntry( typeof( Shaft ), "Shaft" ) );
				entry.Add( new ResourceEntry( typeof( Feather ), "Feather" ) );
				entry.Add( new ResourceEntry( typeof( Arrow ), "Arrow" ) );
				entry.Add( new ResourceEntry( typeof( Bolt ), "Bolt" ) );
				
				
				return entry;
			}
		}

		
		[Constructable]
		public WoodKey() : base( 88 )		//hue 88
		{
			ItemID = 0x1BD9;			//pile of wood
			Name = "Wood Storage";
		}
		
		//this loads properties specific to the store, like the gump label, and whether it's a dynamic storage device
		protected override ItemStore GenerateItemStore()
		{
			//load the basic store info
			ItemStore store = base.GenerateItemStore();

			//properties of this storage device
			store.Label = "Wood Storage";
			
			store.Dynamic = false;
			store.OfferDeeds = true;
			
			return store;
		}
		
		//serial constructor
		public WoodKey( Serial serial ) : base( serial )
		{
		}
		
		//events
		
		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			
			writer.Write( 0 );
		}
		
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			
			int version = reader.ReadInt();
		}
	}

}
 
I been getting this crash sometimes and I thought I fixed it , Players seem do this crash i cant seem to mimic it .. Any Suggestions?

Error:
System.NullReferenceException: Object reference not set to an instance of an obj
ect.
at Server.Items.MasterItemStoreKey.FillEntriesFromBackpack(Mobile from)
at Solaris.ItemStore.KeyFillEntry.OnClick()
at Server.Network.PacketHandlers.ContextMenuResponse(NetState state, PacketRe
ader pvSrc)
at Server.Network.PacketHandlers.ExtendedCommand(NetState state, PacketReader
pvSrc)
at Server.Network.MessagePump.HandleReceive(NetState ns)
at Server.Network.MessagePump.Slice()
at Server.Core.Main(String[] args)
Crash: Backing up...done
Crash: Generating report...done
This exception is fatal, press return to exit
 

Pure Insanity

Sorceror
Just try removing the fill entries from backpack button? I can't seem to even get it working, doesn't crash the shard though. I was considering on removing it myself. Maybe even make it so the add button will multi add till you hit escape.
 

dawnofages2

Wanderer
universal key errors

Have older shard SVN 264, worked until our latest power spike, jumped across all the protectors, anyway, downloaded back up server files to a to differn't computer,now all my keys and a few Gump files coming up as errors, any suggestions on how to fix this? the error is this, The type or namespace 'Item Store' does not exist in the NameSpace Solaris
 

giric

Sorceror
Regular Deed Storage

Ok, I've been trying to figure this out for a couple days now...

We have a very nice AddonDeed Key, but I'd like a key for all the 'other' deeds.. ie:
LuckDeed, EthyDeed, SpellBookDeed, AOSEnhancementDeed, etc etc...

From what I've seen/can find in the scripts for these kind of items, they have a generic Server.Items namespace.. I don't have anything like BaseDeed etc that I can add to a list/stash/etc entry..

In fact, most of them seem to only have the word deed in the item's name, and nowhere else.. as an example, here is the script I have for an Item Bless Deed:

Code:
using System;
using Server.Network;
using Server.Prompts;
using Server.Items;
using Server.Targeting;

namespace Server.Items
{
	public class ItemBlessTarget : Target // Create our targeting class (which we derive from the base target class)
	{
		private ItemBlessDeed m_Deed;

		public ItemBlessTarget( ItemBlessDeed deed ) : base( 1, false, TargetFlags.None )
		{
			m_Deed = deed;
		}

		protected override void OnTarget( Mobile from, object target ) // Override the protected OnTarget() for our feature
		{
			if ( m_Deed.Deleted || m_Deed.RootParent != from )
				return;

			if ( target is Item )
			{
				Item item = (Item)target;

				if ( item.LootType == LootType.Blessed || item.BlessedFor == from || (Mobile.InsuranceEnabled && item.Insured) ) // Check if its already newbied (blessed)
				{
					from.SendLocalizedMessage( 1045113 ); // That item is already blessed
				}
				else if ( item is BaseWeapon || item is BaseArmor || item is BaseClothing || item is BaseJewel || item.LootType == LootType.Regular )
				{
					item.LootType = LootType.Blessed;
					from.SendLocalizedMessage( 1010026 ); // You bless the item....

					m_Deed.Delete(); // Delete the bless deed
				}
				else
					from.SendMessage( "That item can not be blessed" );
			}
			else
			{
				from.SendLocalizedMessage( 500509 ); // You cannot bless that object
			}
		}
	}

	public class ItemBlessDeed : Item // Create the item class which is derived from the base item class
	{
		public override string DefaultName
		{
			get { return "an item bless deed"; }
		}

		[Constructable]
		public ItemBlessDeed() : base( 0x14F0 )
		{
			Weight = 1.0;
			LootType = LootType.Blessed;
		}

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

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

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

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

			int version = reader.ReadInt();
		}

		public override bool DisplayLootType{ get{ return false; } }

		public override void OnDoubleClick( Mobile from ) // Override double click of the deed to call our target
		{
			if ( !IsChildOf( from.Backpack ) ) // Make sure its in their pack
			{
				 from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
			}
			else
			{
                from.SendLocalizedMessage( 500506 ); // Which item do you wish to bless?
				from.Target = new ItemBlessTarget( this ); // Call our target
			 }
		}	
	}
}

Can anyone help with ideas? Perhaps a "How to make Custom Storage Keys" tutorial or something?

I'm going even crazier trying to figure this out....

Giric
 

Pure Insanity

Sorceror
Pretty sure there is a key that shows you how to add new things to it, forgot what the key is called...but I'm sure it's not stored with the other keys. I think it allows you to store items on the key by listing it's type. For the bless deed you listed, it would be: ItemBlessDeed
 

Pure Insanity

Sorceror
I hate to necro an old thread...but I'm pretty confused with this system atm. When using the tailor key, I can add wool to it if I add the wool myself ([add wool) Can even add a large quantity and add it to the keys this way.

Now...the big problem, and the problem I can't seem to figure out. Is that when a player skins a sheep and gets wool. They can't add this wool to the keys at all. They are the same two items, I've checked the sheep script to double check even. I have no idea what's going on here and why it refuses to add the ones from the sheep, but works just fine if I add the wool manually.

Nvm this post...apparently the sheeps were creating tainted wool...which is normal. I just added taintedwool as an array to the wool type to fix the issue.
 

datguy

Sorceror
I been getting this crash sometimes and I thought I fixed it , Players seem do this crash i cant seem to mimic it .. Any Suggestions?
What you could try is add a try/catch to Masterkey, not sure if it'll fix but shouldn't hurt. What I think it is though is items are not being withdrawn but the code says it is, then crashes when there is no item to make the stuff.
Code:
        //this triggers all fill from backpack methods in all entries contained within the master keys
        public void FillEntriesFromBackpack( Mobile from )
        {
            foreach( ItemStore store in _Stores )
            {
                try
                {
                //don't resend this gump if it's not up
                store.FillFromBackpack( from, false );
                }
                catch
                {
                    from.SendMessage("Error please report to staff that you saw this" );
                }
            }
        }
 

datguy

Sorceror
Changed the Extras.cs to display [guarded] in the name of items being guarded from key entry
because you forget if the item is guarded or not
found in \Extras
 

Attachments

  • Extras.cs
    4.8 KB · Views: 24

tass23

Page
Fenn, I hope you're still around, doesn't look like you have been for quite some time, but I just wanted to say thanks for a great script. And to anyone else out there: I was able to create an ore key that's really going to make miners happy. I used the ingot key and changed all entries for "ingot" to "ore" and it worked nicely. I noticed when I was unloading the ore from the key that I was getting the different shaped stacks, so even though it said 88 iron ore, it wasn't all in one stack to be smelted. Not a huge deal, but that'd be a snag if anyone were to try to make it possible to smelt from the key.
 
Top