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!

Daat99 OWLTR 2.8 Crashing/Corrupt World Saves

toddjumper

Wanderer
Daat99 OWLTR 2.8 Crashing/Corrupt World Saves

Even though you recently made a fix. Our shard and other shards are still having crashes from something being Null, and it is corrupting world saves.

This system has crashed my shard again. Even using your last recent fix and a completely clean install.

The system ran fine for 5 days and now for no reason tonite it crashed again when only 1 person was logged in. And it is again corrupting our world saves causing yet another shard revert (6 reverts within a month from this system)

I am getting rather discouraged and thinking of removing the system and starting shard over completely, unless we figure out what the bug is. If you need more help from me let me know.

Crash today November 8th. Still crashing during world saves from something being Null even though the fix you made earlier worked.

I am also not the only shard having this same exact world save crash. Two shards I know off hand have had to totally wipe their shards and start over recently.

Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
at Server.daat99.Daat99OWLTR.Serialize(GenericWriter writer)
at Server.World.SaveItems()
at Server.World.Save(Boolean message)
at Server.World.Save()
at Server.Misc.AutoSave.Save()
at Server.DelayCallTimer.OnTick()
at Server.Timer.Slice()
at Server.Core.Main(String[] args)

World: Loading...Error:
System.IO.EndOfStreamException: Unable to read beyond the end of the stream.
at System.IO.__Error.EndOfFile()
at System.IO.BinaryReader.FillBuffer(Int32 numBytes)
at System.IO.BinaryReader.ReadInt32()
at Server.World.Load()
at Server.ScriptCompiler.Compile(Boolean debug)
at Server.Core.Main(String[] args)
This exception is fatal, press return to exit
 

Khaz

Knight
This is happening in the serialization method of the Daat99OWLTR class. Post that, and we can see if there is anything to be done.
 

toddjumper

Wanderer
The Daat99 current system I am using is available for anyone to download / look at already on these forums. Daat is well aware of this problem by now and it still is not fixed.

Here is the core of it, that keeps presenting the problem.

daat99holder.cs
Code:
/*
 created by:
     /\            888                   888     .d8888b.   .d8888b.  
____/_ \____       888                   888    d88P  Y88b d88P  Y88b 
\  ___\ \  /       888                   888    888    888 888    888 
 \/ /  \/ /    .d88888  8888b.   8888b.  888888 Y88b. d888 Y88b. d888 
 / /\__/_/\   d88" 888     "88b     "88b 888     "Y888P888  "Y888P888 
/__\ \_____\  888  888 .d888888 .d888888 888           888        888 
    \  /      Y88b 888 888  888 888  888 Y88b.  Y88b  d88P Y88b  d88P 
     \/        "Y88888 "Y888888 "Y888888  "Y888  "Y8888P"   "Y8888P"  
*/
using System;
using System.Collections;
using Server;
using Server.daat99;
using Server.Engines.Craft;
using Server.Gumps;
using Server.Mobiles;
using Server.Network;

namespace Server.Items
{
	public class NewDaat99Holder
	{
		private ArrayList alItemTypeList;
		public ArrayList ItemTypeList{ get{ return alItemTypeList; } set{ alItemTypeList = value; } }
		
		private ArrayList alResources;
		public ArrayList Resources{ get{ return alResources; } set{ alResources = value; } }
		
		private DateTime dtNextReward;
		public TimeSpan NextReward
		{
			get
			{
				TimeSpan ts = dtNextReward - DateTime.Now;

				if ( ts < TimeSpan.Zero )
					ts = TimeSpan.Zero;

				return ts;
			}
			set
			{
				try{ dtNextReward = DateTime.Now + value; }
				catch{}
			}
		}

		private int iItemsCrafted;
		public int ItemsCrafted{ get{ return iItemsCrafted; } set{ iItemsCrafted = value; } }

		public NewDaat99Holder()
		{
			DefaultHolder(this);//need to set default holder values here
		}

		public NewDaat99Holder( ArrayList ItemTypeList, ArrayList resources, TimeSpan nextreward, int itemscrafted )
		{
			alItemTypeList = ItemTypeList;
			alResources = resources;
			NextReward = nextreward;
			iItemsCrafted = itemscrafted;
		}

		public void DefaultHolder( NewDaat99Holder dh )
		{
			alItemTypeList = new ArrayList();
			alResources = new ArrayList();
			for (int ii = 0; ii < RecipesLists.All.Count; ii++)
				alItemTypeList.Add((Type)RecipesLists.All[ii]);
			for (int ii = 0; ii < RecipesLists.Resources.Count; ii++)
				alResources.Add(RecipesLists.Resources[ii]);
			
			int i = 0;
			int backup = 0;
			Type temp;

			//Tinkering
			if ( RecipesLists.TN1.Count > 1 )
			{
				for (i = 0; i < 10; i++)
				{
					temp = (Type)RecipesLists.TN1[Utility.Random((int)(RecipesLists.TN1.Count))];
					if ( dh.alItemTypeList.Contains( temp ) )
					{
						dh.alItemTypeList.Remove( temp );
						if (backup != 0)
						{
							backup = 0;
							break;
						}
						else
							backup++;
					}
				}
			}
			else if ( RecipesLists.TN1.Count == 1 && dh.alItemTypeList.Contains( (Type)RecipesLists.TN1[0] ) )
				dh.alItemTypeList.Remove( (Type)RecipesLists.TN1[0] );
			
			if (RecipesLists.TN2.Count > 0)
			{
				temp = (Type)RecipesLists.TN2[Utility.Random((int)(RecipesLists.TN2.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.TN3.Count > 0)
			{
				temp = (Type)RecipesLists.TN3[Utility.Random((int)(RecipesLists.TN3.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.TN4.Count > 0)
			{
				temp = (Type)RecipesLists.TN4[Utility.Random((int)(RecipesLists.TN4.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.TN5.Count > 0)
			{
				temp = (Type)RecipesLists.TN5[Utility.Random((int)(RecipesLists.TN5.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}

			//Blacksmithy
			if ( RecipesLists.BS1.Count > 1 )
			{
				for (i = 0; i < 10; i++)
				{
					temp = (Type)RecipesLists.BS1[Utility.Random((int)(RecipesLists.BS1.Count))];
					if ( dh.alItemTypeList.Contains( temp ) )
					{
						dh.alItemTypeList.Remove( temp );
						if (backup != 0)
						{
							backup = 0;
							break;
						}
						else
							backup++;
					}
				}
			}
			else if ( RecipesLists.BS1.Count == 1 && dh.alItemTypeList.Contains( (Type)RecipesLists.BS1[0] ) )
				dh.alItemTypeList.Remove( (Type)RecipesLists.BS1[0] );
			if (RecipesLists.BS2.Count > 0)
			{
				temp = (Type)RecipesLists.BS2[Utility.Random((int)(RecipesLists.BS2.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.BS3.Count > 0)
			{
				temp = (Type)RecipesLists.BS3[Utility.Random((int)(RecipesLists.BS3.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.BS4.Count > 0)
			{
				temp = (Type)RecipesLists.BS4[Utility.Random((int)(RecipesLists.BS4.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.BS5.Count > 0)
			{
				temp = (Type)RecipesLists.BS5[Utility.Random((int)(RecipesLists.BS5.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			
			//Tailoring
			if ( RecipesLists.TL1.Count > 1 )
			{
				for (i = 0; i < 10; i++)
				{
					temp = (Type)RecipesLists.TL1[Utility.Random((int)(RecipesLists.TL1.Count))];
					if ( dh.alItemTypeList.Contains( temp ) )
					{
						dh.alItemTypeList.Remove( temp );
						if (backup != 0)
						{
							backup = 0;
							break;
						}
						else
							backup++;
					}
				}
			}
			else if ( RecipesLists.TL1.Count == 1 && dh.alItemTypeList.Contains( (Type)RecipesLists.TL1[0] ) )
				dh.alItemTypeList.Remove( (Type)RecipesLists.TL1[0] );
			if (RecipesLists.TL2.Count > 0)
			{
				temp = (Type)RecipesLists.TL2[Utility.Random((int)(RecipesLists.TL2.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.TL3.Count > 0)
			{
				temp = (Type)RecipesLists.TL3[Utility.Random((int)(RecipesLists.TL3.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.TL4.Count > 0)
			{
				temp = (Type)RecipesLists.TL4[Utility.Random((int)(RecipesLists.TL4.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.TL5.Count > 0)
			{
				temp = (Type)RecipesLists.TL5[Utility.Random((int)(RecipesLists.TL5.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			
			//Cooking
			if ( RecipesLists.CK1.Count > 1 )
			{
				for (i = 0; i < 10; i++)
				{
					temp = (Type)RecipesLists.CK1[Utility.Random((int)(RecipesLists.CK1.Count))];
					if ( dh.alItemTypeList.Contains( temp ) )
					{
						dh.alItemTypeList.Remove( temp );
						if (backup != 0)
						{
							backup = 0;
							break;
						}
						else
							backup++;
					}
				}
			}
			else if ( RecipesLists.CK1.Count == 1 && dh.alItemTypeList.Contains( (Type)RecipesLists.CK1[0] ) )
				dh.alItemTypeList.Remove( (Type)RecipesLists.CK1[0] );
			if (RecipesLists.CK2.Count > 0)
			{
				temp = (Type)RecipesLists.CK2[Utility.Random((int)(RecipesLists.CK2.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.CK3.Count > 0)
			{
				temp = (Type)RecipesLists.CK3[Utility.Random((int)(RecipesLists.CK3.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.CK4.Count > 0)
			{
				temp = (Type)RecipesLists.CK4[Utility.Random((int)(RecipesLists.CK4.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.CK5.Count > 0)
			{
				temp = (Type)RecipesLists.CK5[Utility.Random((int)(RecipesLists.CK5.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}

			//Alchemy
			if ( RecipesLists.ACall.Count > 1 )
			{
				for (i = 0; i < 10; i++)
				{
					temp = (Type)RecipesLists.ACall[Utility.Random((int)(RecipesLists.ACall.Count))];
					if ( dh.alItemTypeList.Contains( temp ) )
					{
						dh.alItemTypeList.Remove( temp );
						if (backup != 0)
						{
							backup = 0;
							break;
						}
						else
							backup++;
					}
				}
			}

			//Inscription
			if ( RecipesLists.IN1.Count > 1 )
			{
				for (i = 0; i < 10; i++)
				{
					temp = (Type)RecipesLists.IN1[Utility.Random((int)(RecipesLists.IN1.Count))];
					if ( dh.alItemTypeList.Contains( temp ) )
					{
						dh.alItemTypeList.Remove( temp );
						if (backup != 0)
						{
							backup = 0;
							break;
						}
						else
							backup++;
					}
				}
			}
			else if ( RecipesLists.IN1.Count == 1 && dh.alItemTypeList.Contains( (Type)RecipesLists.IN1[0] ) )
				dh.alItemTypeList.Remove( (Type)RecipesLists.IN1[0] );
			if (RecipesLists.IN2.Count > 0)
			{
				temp = (Type)RecipesLists.IN2[Utility.Random((int)(RecipesLists.IN2.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.IN3.Count > 0)
			{
				temp = (Type)RecipesLists.IN3[Utility.Random((int)(RecipesLists.IN3.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.IN4.Count > 0)
			{
				temp = (Type)RecipesLists.IN4[Utility.Random((int)(RecipesLists.IN4.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.IN5.Count > 0)
			{
				temp = (Type)RecipesLists.IN5[Utility.Random((int)(RecipesLists.IN5.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}

			//BowFletching
			if (RecipesLists.BF1.Count > 0)
			{
				temp = (Type)RecipesLists.BF1[Utility.Random((int)(RecipesLists.BF1.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}

			//Carpentry
			if ( RecipesLists.CR1.Count > 1 )
			{
				for (i = 0; i < 10; i++)
				{
					temp = (Type)RecipesLists.CR1[Utility.Random((int)(RecipesLists.CR1.Count))];
					if ( dh.alItemTypeList.Contains( temp ) )
					{
						dh.alItemTypeList.Remove( temp );
						if (backup != 0)
						{
							backup = 0;
							break;
						}
						else
							backup++;
					}
				}
			}
			else if ( RecipesLists.CR1.Count == 1 && dh.alItemTypeList.Contains( (Type)RecipesLists.CR1[0] ) )
				dh.alItemTypeList.Remove( (Type)RecipesLists.CR1[0] );
			if (RecipesLists.CR2.Count > 0)
			{
				temp = (Type)RecipesLists.CR2[Utility.Random((int)(RecipesLists.CR2.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.CR3.Count > 0)
			{
				temp = (Type)RecipesLists.CR3[Utility.Random((int)(RecipesLists.CR3.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.CR4.Count > 0)
			{
				temp = (Type)RecipesLists.CR4[Utility.Random((int)(RecipesLists.CR4.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
			if (RecipesLists.CR5.Count > 0)
			{
				temp = (Type)RecipesLists.CR5[Utility.Random((int)(RecipesLists.CR5.Count))];
				if ( dh.alItemTypeList.Contains( temp ) )
					dh.alItemTypeList.Remove( temp );
			}
		}
		
		public void GiveDedication( Mobile from, CraftSystem cs )
		{
			if ( alItemTypeList.Count < 1 )
				return;
			Type type = alItemTypeList[Utility.Random(alItemTypeList.Count)] as Type;
			for ( int i = 0; i < 25; i++ )
			{
				if		( cs is DefTinkering	&& RecipesLists.TNall.Contains( type ) ) break;
				else if ( cs is DefBlacksmithy	&& RecipesLists.BSall.Contains( type ) ) break;
				else if ( cs is DefCooking		&& RecipesLists.CKall.Contains( type ) ) break;
				else if ( cs is DefGlassblowing	&& RecipesLists.GBall.Contains( type ) ) break;
				else if ( cs is DefAlchemy		&& RecipesLists.ACall.Contains( type ) ) break;
				else if ( cs is DefInscription	&& RecipesLists.INall.Contains( type ) ) break;
				else if ( cs is DefBowFletching	&& RecipesLists.BFall.Contains( type ) ) break;
				else if ( cs is DefMasonry		&& RecipesLists.MSall.Contains( type ) ) break;
				else if ( cs is DefCarpentry	&& RecipesLists.CRall.Contains( type ) ) break;
				type = alItemTypeList[Utility.Random(alItemTypeList.Count)] as Type;
			}
			if (type == null)
				return;
			
			string s_Key = type.Name, s_Temp = type.Name;
			int i_Break = s_Temp.IndexOfAny("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(),1);
			if ( i_Break > -1 )
			{
				s_Key = s_Temp.Substring( 0, i_Break );
				s_Temp = s_Temp.Substring( i_Break );
				i_Break = s_Temp.IndexOfAny("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(),1);
				while ( i_Break > -1 )
				{
					s_Key = s_Key + " " + s_Temp.Substring(0, i_Break );
					s_Temp =  s_Temp.Substring( i_Break );
					i_Break = s_Temp.IndexOfAny("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(),1);
				}
				if ( s_Temp != null && s_Temp != s_Key )
					s_Key += " " + s_Temp;
			}
			
			alItemTypeList.Remove(type);
			from.SendMessage(88, "Your dedication to crafting has paid off, you felt an inspiration and you learned how to make {0}.", s_Key );
			
			iItemsCrafted -= 100;
			NextReward = TimeSpan.FromHours( 24.0 );
		}
		
		public void Serialize( GenericWriter writer )
		{ 
			writer.Write( (int) 0 ); // version

			writer.Write( (TimeSpan) NextReward );
			writer.Write( (int) iItemsCrafted );
			writer.Write( alItemTypeList.Count );
			for ( int i = 0; i < alItemTypeList.Count; ++i )
			{
				if( alItemTypeList[i] != null )
				writer.Write( (string) alItemTypeList[i].ToString() );
				else
					writer.Write( (string)"error - bad type" );
			}
			//for ( int i = 0; i < alItemTypeList.Count; ++i )
			//	writer.Write( (string) alItemTypeList[i].ToString() );

			writer.Write( alResources.Count );
			for ( int i = 0; i < alResources.Count; ++i )
				writer.Write( (int) alResources[i] );
		}

		public NewDaat99Holder( GenericReader reader )  //deserialize
		{ 
			int version = reader.ReadInt();

			switch (version)
			{
				case 0:
				{
					NextReward = reader.ReadTimeSpan();
					iItemsCrafted = reader.ReadInt();

					int length = reader.ReadInt();
					alItemTypeList = new ArrayList();
					for (int i=0; i < length; i++)
					{
						try { alItemTypeList.Add(ScriptCompiler.FindTypeByFullName(reader.ReadString())); }
						catch{}
					}

					length = reader.ReadInt();
					alResources = new ArrayList();
					for (int i=0; i < length; i++)
					{
						try { alResources.Add((CraftResource)reader.ReadInt()); }
						catch{}
					}
					break;
				}
			}
		} 
	}

	public class Daat99HolderGump : Gump
	{
		private PlayerMobile pmFrom;
		private NewDaat99Holder dhNDH;
		private Mobile mOwner;
		private bool bAdd;
		public Daat99HolderGump(Mobile from, NewDaat99Holder dh, Mobile owner, bool add) : base(0, 0)
		{
			if (!(from is PlayerMobile))
				return;

			pmFrom = (PlayerMobile)from;
			dhNDH = dh;
			mOwner = owner;
			bAdd = add;
			pmFrom.CloseGump(typeof(Daat99HolderGump));

			AddPage(0);
			AddBackground(3, 3, 365, 430, 2600);
			
			AddHtml(45, 25, 280, 20, String.Format("<basefont color=#0000ff><center>{0}</basefont></center>", mOwner.Name + "'s Daat99 Holder"), false, false);
			AddLabel(30, 50, 33, "Level");
			AddImage(120, 50, 2225);
			AddImage(150, 50, 2226);
			AddImage(180, 50, 2227);
			AddImage(210, 50, 2228);
			AddImage(240, 50, 2229);
			AddImage(270, 50, 2230);
			AddLabel(300, 50, 33, "All:");
			
			AddLabel(30, 75, 64, "Tinkering:");
			AddLabel(30, 100, 64, "Blacksmithy:");
			AddLabel(30, 125, 64, "Tailoring:");
			AddLabel(30, 150, 64, "Cooking:");
			AddLabel(30, 175, 64, "Glassblowing:");
			AddLabel(30, 200, 64, "Alchemy:");
			AddLabel(30, 225, 64, "Inscription:");
			AddLabel(30, 250, 64, "Bowfletching:");
			AddLabel(30, 275, 64, "Masonry:");
			AddLabel(30, 300, 64, "Carpentry:");
			AddLabel(30, 325, 64, "All:");
			
			for (int skill = 1; skill <= 11; skill++)
				for (int level = 1; level <= 7; level++)
					AddButton(90 + level*30, 50 + skill*25, 9020, 9021, level + skill*100, GumpButtonType.Reply, 0);

			AddLabel(30, 345, 64, "Resources:");
			AddLabel(100, 345, 40, "Ore:");
			AddButton(125, 345, 9020, 9021, 51, GumpButtonType.Reply, 0);
			AddLabel(150, 345, 40, "Wood:");
			AddButton(185, 345, 9020, 9021, 52, GumpButtonType.Reply, 0);
			AddLabel(210, 345, 40, "Leather:");
			AddButton(260, 345, 9020, 9021, 53, GumpButtonType.Reply, 0);
			AddLabel(285, 345, 40, "Scale:");
			AddButton(320, 345, 9020, 9021, 54, GumpButtonType.Reply, 0);
			
			AddLabel( 30, 365, 30, @"Press above to add\remove items from the holder.");
			AddRadio( 70, 383, 9727, 9730, add, 1 );
			AddLabel( 105, 385, 32, "Add");

			AddButton( 145 , 385, 1214, 1213, 100, GumpButtonType.Reply, 0);

			AddRadio( 230, 383, 9727, 9730, !add, 0 );
			AddLabel( 265, 385, 32, "Remove");
		}
		public override void OnResponse(NetState state, RelayInfo info)
		{
			Mobile from = state.Mobile;
			if (dhNDH == null)
				return;
			if (info.IsSwitched(1))
			{
				switch (info.ButtonID)
				{
					case 51: { for ( int i=0; i < RecipesLists.Metal.Length; i++)	if ( dhNDH.Resources.Contains(RecipesLists.Metal[i])) dhNDH.Resources.Remove((CraftResource)RecipesLists.Metal[i]); break; }
					case 52: { for ( int i=0; i < RecipesLists.Wood.Length; i++)	if ( dhNDH.Resources.Contains(RecipesLists.Wood[i])) dhNDH.Resources.Remove((CraftResource)RecipesLists.Wood[i]); break; }
					case 53: { for ( int i=0; i < RecipesLists.Leather.Length; i++)	if ( dhNDH.Resources.Contains(RecipesLists.Leather[i])) dhNDH.Resources.Remove((CraftResource)RecipesLists.Leather[i]); break; }
					case 54: { for ( int i=0; i < RecipesLists.Scales.Length; i++)	if ( dhNDH.Resources.Contains(RecipesLists.Scales[i])) dhNDH.Resources.Remove((CraftResource)RecipesLists.Scales[i]); break; }
					case 101: { for (int i=0; i < RecipesLists.TN1.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TN1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TN1[i]); break; }
					case 102: { for (int i=0; i < RecipesLists.TN2.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TN2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TN2[i]); break; }
					case 103: { for (int i=0; i < RecipesLists.TN3.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TN3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TN3[i]); break; }
					case 104: { for (int i=0; i < RecipesLists.TN4.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TN4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TN4[i]); break; }
					case 105: { for (int i=0; i < RecipesLists.TN5.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TN5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TN5[i]); break; }
					case 106: { for (int i=0; i < RecipesLists.TN6.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TN6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TN6[i]); break; }
					case 107: { for (int i=0; i < RecipesLists.TNall.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.TNall[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TNall[i]); break; }
					case 201: { for (int i=0; i < RecipesLists.BS1.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BS1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BS1[i]); break; }
					case 202: { for (int i=0; i < RecipesLists.BS2.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BS2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BS2[i]); break; }
					case 203: { for (int i=0; i < RecipesLists.BS3.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BS3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BS3[i]); break; }
					case 204: { for (int i=0; i < RecipesLists.BS4.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BS4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BS4[i]); break; }
					case 205: { for (int i=0; i < RecipesLists.BS5.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BS5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BS5[i]); break; }
					case 206: { for (int i=0; i < RecipesLists.BS6.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BS6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BS6[i]); break; }
					case 207: { for (int i=0; i < RecipesLists.BSall.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.BSall[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BSall[i]); break; }
					case 301: { for (int i=0; i < RecipesLists.TL1.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TL1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TL1[i]); break; }
					case 302: { for (int i=0; i < RecipesLists.TL2.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TL2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TL2[i]); break; }
					case 303: { for (int i=0; i < RecipesLists.TL3.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TL3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TL3[i]); break; }
					case 304: { for (int i=0; i < RecipesLists.TL4.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TL4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TL4[i]); break; }
					case 305: { for (int i=0; i < RecipesLists.TL5.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TL5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TL5[i]); break; }
					case 306: { for (int i=0; i < RecipesLists.TL6.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.TL6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TL6[i]); break; }
					case 307: { for (int i=0; i < RecipesLists.TLall.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.TLall[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.TLall[i]); break; }
					case 401: { for (int i=0; i < RecipesLists.CK1.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CK1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CK1[i]); break; }
					case 402: { for (int i=0; i < RecipesLists.CK2.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CK2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CK2[i]); break; }
					case 403: { for (int i=0; i < RecipesLists.CK3.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CK3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CK3[i]); break; }
					case 404: { for (int i=0; i < RecipesLists.CK4.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CK4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CK4[i]); break; }
					case 405: { for (int i=0; i < RecipesLists.CK5.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CK5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CK5[i]); break; }
					case 406: { for (int i=0; i < RecipesLists.CK6.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CK6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CK6[i]); break; }
					case 407: { for (int i=0; i < RecipesLists.CKall.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.CKall[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CKall[i]); break; }
					case 501: { for (int i=0; i < RecipesLists.GB1.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.GB1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.GB1[i]); break; }
					case 502: { for (int i=0; i < RecipesLists.GB2.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.GB2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.GB2[i]); break; }
					case 503: { for (int i=0; i < RecipesLists.GB3.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.GB3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.GB3[i]); break; }
					case 504: { for (int i=0; i < RecipesLists.GB4.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.GB4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.GB4[i]); break; }
					case 505: { for (int i=0; i < RecipesLists.GB5.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.GB5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.GB5[i]); break; }
					case 506: { for (int i=0; i < RecipesLists.GB6.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.GB6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.GB6[i]); break; }
					case 507: { for (int i=0; i < RecipesLists.GBall.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.GBall[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.GBall[i]); break; }
					case 601: { for (int i=0; i < RecipesLists.AC1.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.AC1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.AC1[i]); break; }
					case 602: { for (int i=0; i < RecipesLists.AC2.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.AC2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.AC2[i]); break; }
					case 603: { for (int i=0; i < RecipesLists.AC3.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.AC3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.AC3[i]); break; }
					case 604: { for (int i=0; i < RecipesLists.AC4.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.AC4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.AC4[i]); break; }
					case 605: { for (int i=0; i < RecipesLists.AC5.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.AC5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.AC5[i]); break; }
					case 606: { for (int i=0; i < RecipesLists.AC6.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.AC6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.AC6[i]); break; }
					case 607: { for (int i=0; i < RecipesLists.ACall.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.ACall[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.ACall[i]); break; }
					case 701: { for (int i=0; i < RecipesLists.IN1.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.IN1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.IN1[i]); break; }
					case 702: { for (int i=0; i < RecipesLists.IN2.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.IN2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.IN2[i]); break; }
					case 703: { for (int i=0; i < RecipesLists.IN3.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.IN3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.IN3[i]); break; }
					case 704: { for (int i=0; i < RecipesLists.IN4.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.IN4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.IN4[i]); break; }
					case 705: { for (int i=0; i < RecipesLists.IN5.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.IN5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.IN5[i]); break; }
					case 706: { for (int i=0; i < RecipesLists.IN6.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.IN6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.IN6[i]); break; }
					case 707: { for (int i=0; i < RecipesLists.INall.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.INall[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.INall[i]); break; }
					case 801: { for (int i=0; i < RecipesLists.BF1.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BF1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BF1[i]); break; }
					case 802: { for (int i=0; i < RecipesLists.BF2.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BF2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BF2[i]); break; }
					case 803: { for (int i=0; i < RecipesLists.BF3.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BF3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BF3[i]); break; }
					case 804: { for (int i=0; i < RecipesLists.BF4.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BF4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BF4[i]); break; }
					case 805: { for (int i=0; i < RecipesLists.BF5.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BF5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BF5[i]); break; }
					case 806: { for (int i=0; i < RecipesLists.BF6.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.BF6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BF6[i]); break; }
					case 807: { for (int i=0; i < RecipesLists.BFall.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.BFall[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.BFall[i]); break; }
					case 901: { for (int i=0; i < RecipesLists.MS1.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.MS1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.MS1[i]); break; }
					case 902: { for (int i=0; i < RecipesLists.MS2.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.MS2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.MS2[i]); break; }
					case 903: { for (int i=0; i < RecipesLists.MS3.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.MS3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.MS3[i]); break; }
					case 904: { for (int i=0; i < RecipesLists.MS4.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.MS4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.MS4[i]); break; }
					case 905: { for (int i=0; i < RecipesLists.MS5.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.MS5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.MS5[i]); break; }
					case 906: { for (int i=0; i < RecipesLists.MS6.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.MS6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.MS6[i]); break; }
					case 907: { for (int i=0; i < RecipesLists.MSall.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.MSall[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.MSall[i]); break; }
					case 1001: { for (int i=0; i < RecipesLists.CR1.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CR1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CR1[i]); break; }
					case 1002: { for (int i=0; i < RecipesLists.CR2.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CR2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CR2[i]); break; }
					case 1003: { for (int i=0; i < RecipesLists.CR3.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CR3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CR3[i]); break; }
					case 1004: { for (int i=0; i < RecipesLists.CR4.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CR4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CR4[i]); break; }
					case 1005: { for (int i=0; i < RecipesLists.CR5.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CR5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CR5[i]); break; }
					case 1006: { for (int i=0; i < RecipesLists.CR6.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.CR6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CR6[i]); break; }
					case 1007: { for (int i=0; i < RecipesLists.CRall.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.CRall[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.CRall[i]); break; }
					case 1101: { for (int i=0; i < RecipesLists.Lvl1.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl1[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.Lvl1[i]); break; }
					case 1102: { for (int i=0; i < RecipesLists.Lvl2.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl2[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.Lvl2[i]); break; }
					case 1103: { for (int i=0; i < RecipesLists.Lvl3.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl3[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.Lvl3[i]); break; }
					case 1104: { for (int i=0; i < RecipesLists.Lvl4.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl4[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.Lvl4[i]); break; }
					case 1105: { for (int i=0; i < RecipesLists.Lvl5.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl5[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.Lvl5[i]); break; }
					case 1106: { for (int i=0; i < RecipesLists.Lvl6.Count; i++)	if ( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl6[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.Lvl6[i]); break; }
					case 1107: { for (int i=0; i < RecipesLists.All.Count; i++)		if ( dhNDH.ItemTypeList.Contains( RecipesLists.All[i] ) ) dhNDH.ItemTypeList.Remove((Type)RecipesLists.All[i]); break; }
				}
			}
			else
			{
				switch (info.ButtonID)
				{
					case 51: { for ( int i=0; i < RecipesLists.Metal.Length; i++)	if (!( dhNDH.Resources.Contains(RecipesLists.Metal[i]))) dhNDH.Resources.Add((CraftResource)RecipesLists.Metal[i]); break; }
					case 52: { for ( int i=0; i < RecipesLists.Wood.Length; i++)	if (!( dhNDH.Resources.Contains(RecipesLists.Wood[i]))) dhNDH.Resources.Add((CraftResource)RecipesLists.Wood[i]); break; }
					case 53: { for ( int i=0; i < RecipesLists.Leather.Length; i++)	if (!( dhNDH.Resources.Contains(RecipesLists.Leather[i]))) dhNDH.Resources.Add((CraftResource)RecipesLists.Leather[i]); break; }
					case 54: { for ( int i=0; i < RecipesLists.Scales.Length; i++)	if (!( dhNDH.Resources.Contains(RecipesLists.Scales[i]))) dhNDH.Resources.Add((CraftResource)RecipesLists.Scales[i]); break; }
					case 101: { for (int i=0; i < RecipesLists.TN1.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TN1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TN1[i]); break; }
					case 102: { for (int i=0; i < RecipesLists.TN2.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TN2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TN2[i]); break; }
					case 103: { for (int i=0; i < RecipesLists.TN3.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TN3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TN3[i]); break; }
					case 104: { for (int i=0; i < RecipesLists.TN4.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TN4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TN4[i]); break; }
					case 105: { for (int i=0; i < RecipesLists.TN5.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TN5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TN5[i]); break; }
					case 106: { for (int i=0; i < RecipesLists.TN6.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TN6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TN6[i]); break; }
					case 107: { for (int i=0; i < RecipesLists.TNall.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TNall[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TNall[i]); break; }
					case 201: { for (int i=0; i < RecipesLists.BS1.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BS1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BS1[i]); break; }
					case 202: { for (int i=0; i < RecipesLists.BS2.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BS2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BS2[i]); break; }
					case 203: { for (int i=0; i < RecipesLists.BS3.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BS3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BS3[i]); break; }
					case 204: { for (int i=0; i < RecipesLists.BS4.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BS4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BS4[i]); break; }
					case 205: { for (int i=0; i < RecipesLists.BS5.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BS5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BS5[i]); break; }
					case 206: { for (int i=0; i < RecipesLists.BS6.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BS6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BS6[i]); break; }
					case 207: { for (int i=0; i < RecipesLists.BSall.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BSall[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BSall[i]); break; }
					case 301: { for (int i=0; i < RecipesLists.TL1.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TL1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TL1[i]); break; }
					case 302: { for (int i=0; i < RecipesLists.TL2.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TL2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TL2[i]); break; }
					case 303: { for (int i=0; i < RecipesLists.TL3.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TL3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TL3[i]); break; }
					case 304: { for (int i=0; i < RecipesLists.TL4.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TL4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TL4[i]); break; }
					case 305: { for (int i=0; i < RecipesLists.TL5.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TL5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TL5[i]); break; }
					case 306: { for (int i=0; i < RecipesLists.TL6.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TL6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TL6[i]); break; }
					case 307: { for (int i=0; i < RecipesLists.TLall.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.TLall[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.TLall[i]); break; }
					case 401: { for (int i=0; i < RecipesLists.CK1.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CK1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CK1[i]); break; }
					case 402: { for (int i=0; i < RecipesLists.CK2.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CK2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CK2[i]); break; }
					case 403: { for (int i=0; i < RecipesLists.CK3.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CK3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CK3[i]); break; }
					case 404: { for (int i=0; i < RecipesLists.CK4.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CK4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CK4[i]); break; }
					case 405: { for (int i=0; i < RecipesLists.CK5.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CK5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CK5[i]); break; }
					case 406: { for (int i=0; i < RecipesLists.CK6.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CK6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CK6[i]); break; }
					case 407: { for (int i=0; i < RecipesLists.CKall.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CKall[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CKall[i]); break; }
					case 501: { for (int i=0; i < RecipesLists.GB1.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.GB1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.GB1[i]); break; }
					case 502: { for (int i=0; i < RecipesLists.GB2.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.GB2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.GB2[i]); break; }
					case 503: { for (int i=0; i < RecipesLists.GB3.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.GB3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.GB3[i]); break; }
					case 504: { for (int i=0; i < RecipesLists.GB4.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.GB4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.GB4[i]); break; }
					case 505: { for (int i=0; i < RecipesLists.GB5.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.GB5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.GB5[i]); break; }
					case 506: { for (int i=0; i < RecipesLists.GB6.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.GB6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.GB6[i]); break; }
					case 507: { for (int i=0; i < RecipesLists.GBall.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.GBall[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.GBall[i]); break; }
					case 601: { for (int i=0; i < RecipesLists.AC1.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.AC1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.AC1[i]); break; }
					case 602: { for (int i=0; i < RecipesLists.AC2.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.AC2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.AC2[i]); break; }
					case 603: { for (int i=0; i < RecipesLists.AC3.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.AC3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.AC3[i]); break; }
					case 604: { for (int i=0; i < RecipesLists.AC4.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.AC4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.AC4[i]); break; }
					case 605: { for (int i=0; i < RecipesLists.AC5.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.AC5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.AC5[i]); break; }
					case 606: { for (int i=0; i < RecipesLists.AC6.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.AC6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.AC6[i]); break; }
					case 607: { for (int i=0; i < RecipesLists.ACall.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.ACall[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.ACall[i]); break; }
					case 701: { for (int i=0; i < RecipesLists.IN1.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.IN1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.IN1[i]); break; }
					case 702: { for (int i=0; i < RecipesLists.IN2.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.IN2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.IN2[i]); break; }
					case 703: { for (int i=0; i < RecipesLists.IN3.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.IN3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.IN3[i]); break; }
					case 704: { for (int i=0; i < RecipesLists.IN4.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.IN4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.IN4[i]); break; }
					case 705: { for (int i=0; i < RecipesLists.IN5.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.IN5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.IN5[i]); break; }
					case 706: { for (int i=0; i < RecipesLists.IN6.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.IN6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.IN6[i]); break; }
					case 707: { for (int i=0; i < RecipesLists.INall.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.INall[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.INall[i]); break; }
					case 801: { for (int i=0; i < RecipesLists.BF1.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BF1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BF1[i]); break; }
					case 802: { for (int i=0; i < RecipesLists.BF2.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BF2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BF2[i]); break; }
					case 803: { for (int i=0; i < RecipesLists.BF3.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BF3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BF3[i]); break; }
					case 804: { for (int i=0; i < RecipesLists.BF4.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BF4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BF4[i]); break; }
					case 805: { for (int i=0; i < RecipesLists.BF5.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BF5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BF5[i]); break; }
					case 806: { for (int i=0; i < RecipesLists.BF6.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BF6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BF6[i]); break; }
					case 807: { for (int i=0; i < RecipesLists.BFall.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.BFall[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.BFall[i]); break; }
					case 901: { for (int i=0; i < RecipesLists.MS1.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.MS1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.MS1[i]); break; }
					case 902: { for (int i=0; i < RecipesLists.MS2.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.MS2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.MS2[i]); break; }
					case 903: { for (int i=0; i < RecipesLists.MS3.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.MS3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.MS3[i]); break; }
					case 904: { for (int i=0; i < RecipesLists.MS4.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.MS4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.MS4[i]); break; }
					case 905: { for (int i=0; i < RecipesLists.MS5.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.MS5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.MS5[i]); break; }
					case 906: { for (int i=0; i < RecipesLists.MS6.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.MS6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.MS6[i]); break; }
					case 907: { for (int i=0; i < RecipesLists.MSall.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.MSall[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.MSall[i]); break; }
					case 1001: { for (int i=0; i < RecipesLists.CR1.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CR1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CR1[i]); break; }
					case 1002: { for (int i=0; i < RecipesLists.CR2.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CR2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CR2[i]); break; }
					case 1003: { for (int i=0; i < RecipesLists.CR3.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CR3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CR3[i]); break; }
					case 1004: { for (int i=0; i < RecipesLists.CR4.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CR4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CR4[i]); break; }
					case 1005: { for (int i=0; i < RecipesLists.CR5.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CR5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CR5[i]); break; }
					case 1006: { for (int i=0; i < RecipesLists.CR6.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CR6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CR6[i]); break; }
					case 1007: { for (int i=0; i < RecipesLists.CRall.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.CRall[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.CRall[i]); break; }
					case 1101: { for (int i=0; i < RecipesLists.Lvl1.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl1[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.Lvl1[i]); break; }
					case 1102: { for (int i=0; i < RecipesLists.Lvl2.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl2[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.Lvl2[i]); break; }
					case 1103: { for (int i=0; i < RecipesLists.Lvl3.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl3[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.Lvl3[i]); break; }
					case 1104: { for (int i=0; i < RecipesLists.Lvl4.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl4[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.Lvl4[i]); break; }
					case 1105: { for (int i=0; i < RecipesLists.Lvl5.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl5[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.Lvl5[i]); break; }
					case 1106: { for (int i=0; i < RecipesLists.Lvl6.Count; i++)	if (!( dhNDH.ItemTypeList.Contains( RecipesLists.Lvl6[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.Lvl6[i]); break; }
					case 1107: { for (int i=0; i < RecipesLists.All.Count; i++)		if (!( dhNDH.ItemTypeList.Contains( RecipesLists.All[i] ) )) dhNDH.ItemTypeList.Add((Type)RecipesLists.All[i]); break; }
				}
			}
			if (info.ButtonID == 100)
				dhNDH.DefaultHolder( dhNDH );
			else if (info.ButtonID >= 51)
				from.SendGump( new Daat99HolderGump(pmFrom, dhNDH, mOwner, info.IsSwitched(1)) );
		}
	}
}
 

Arvoreen

Sorceror
I haven't had any crashes, or (as far as I can tell) corrupt world saves, but every once in a while when I restart my shard, I get prompted to delete the daat99 control center. If I let it delete it, I just restart the shard again, move the control center back to where I have it (I don't want it in public view), fix all the preferences (i.e. disallowing the mule to smelt), and I'm back off and running.

It doesn't seem to be catastrophic, however, my shard is very young, and has yet to get a significant player base.

If it happens again, I'll post the exception that it throws.
 

daat99

Moderator
Staff member
You guys need to understand that I need a debug crash log in order to fix this crashes.
If you all just stop using the system than it's cool but that doesn't get me any closer to fix this problem.

There seems to be several different problems with the ser\deser of the daat99 control center but I can't fix them without knowing what they are.
The errors that I was aware of due to some crash reports that some of you have posted got fixed and this errors while they seem the same to you are in fact different errors.

The currupt saves are being caused due to the recipe system if you disable it and let it delete all the daat99 control centers on restart (you can't [global delete them, it won't work) than it won't corrupt your saves anymore but it'll require you to delete them every now and than.

Keep in mind that the more debug crash logs I get the faster I can fix them.
If you won't provide the debug log my chances to find the problems are slim and so are my chances to fix it.
 

telekea

Wanderer
Yes we have that same problem with something deleting. Perhaps moving the stone out of britain is a good precaution. We can not tell what exactly is "null" that's causing these crashes. First it was supposed to be because a player was deleted, but still crashing, then was supposedly fixed for the "null" but still crashing. And if you run this on a test server everything appears to be running fine. But try having the shard up for 5 days with active players, then for no reason crash and revert.
 

daat99

Moderator
Staff member
telekea said:
Yes we have that same problem with something deleting. Perhaps moving the stone out of britain is a good precaution. We can not tell what exactly is "null" that's causing these crashes. First it was supposed to be because a player was deleted, but still crashing, then was supposedly fixed for the "null" but still crashing. And if you run this on a test server everything appears to be running fine. But try having the shard up for 5 days with active players, then for no reason crash and revert.
Like I said there are several problems with it.
So far I'm aware of 2 problems that I already fixed and doesn't crash anymore.
The more (debug) bug reports that I get the faster I can solve all the problems and get to work on the next stage of the OWLTR which is on hold just because of this crashes.
Once I'll be 100% that all the crashes are solved I'll resume my work on the next chapter and once it'll be out you'll see the "next thing" in RunUO scripts.

As to the test server that is exactly the main reason of the problem.
I don't have a running shard and I can't simulate players actions in the same way that a test server can't simulate them.
Players does things that you can't check and that's why the crashes only apear on live shards and as reslt takes longer to find and fix.

If you guys willing it'll be very helpfull if the next time you get the bad deser don't delete the owltr centers.
close the shard and zip the entire runuo folder.
This way I could test this on a live shard (if you have an admin acount that I can use to test with it'll be better but it's not required).
If you consider this please contact me via email\icq (make sure you state that you contacting me about this in your initial message) so we could figure a way to transfer the files.
 

Arvoreen

Sorceror
daat99 said:
You guys need to understand that I need a debug crash log in order to fix this crashes.
If you all just stop using the system than it's cool but that doesn't get me any closer to fix this problem.

No way! I really like your system, and all that stuff that comes with it, it'd take something cataclysmal to make me stop using it. :)

daat99 said:
The currupt saves are being caused due to the recipe system if you disable it and let it delete all the daat99 control centers on restart (you can't [global delete them, it won't work) than it won't corrupt your saves anymore but it'll require you to delete them every now and than.

This makes sense, since I don't use recipes. I haven't seen any corrupted saves or crashes, just the occasional prompt to delete the daat99 control center.

I'll try to get a debug log next time I restart to help you out. The only other thing I can add, is I do believe I deleted an account last night, and the restart this morning prompted me to delete the control centers.
 

daat99

Moderator
Staff member
Arvoreen said:
No way! I really like your system, and all that stuff that comes with it, it'd take something cataclysmal to make me stop using it. :)



This makes sense, since I don't use recipes. I haven't seen any corrupted saves or crashes, just the occasional prompt to delete the daat99 control center.

I'll try to get a debug log next time I restart to help you out. The only other thing I can add, is I do believe I deleted an account last night, and the restart this morning prompted me to delete the control centers.
Please make sure you use this fixed daat99 holder before you restart:
http://www.runuo.com/forum/showpost.php?p=467869&postcount=20
It'll solve 1 problem that wasn't solved in the v2.8 release but it still can have problems.
 

daat99

Moderator
Staff member
I was trying to sleep and kept thinking about the latest crash and than it accured to me that it might be in the deser method while I was searching the serialization method all the time.
I compiled this file please test it and let me know if you keep getting crashes.

The crashes are aperantly due to a players getting deleted.
I thought I fixed that problem already but it looks like I only fixed it in the serialization method and not in the deserialization method.
If I was right and that's what caused the crash (can't be sure without debug crash log) than that should solve the crashes after deleting a player.

P.S.
If you aren't testing it than let me know that you don't test it.

In any case I'll wait for your reply.
 

telekea

Wanderer
We are getting our shard back online now with these updates.

We had another crash today in normal mode - I will run these updates under debug mode, and if it crashes again will send you the debug crash on here.
 

daat99

Moderator
Staff member
telekea said:
We are getting our shard back online now with these updates.

We had another crash today in normal mode - I will run these updates under debug mode, and if it crashes again will send you the debug crash on here.
I have reason to believe that the reported crash might be because of a deleted player\acount prior to the restart so if you delete an (active player != staff) acount and you restart your shard without a crash please let me know.

P.S.
Keep in mind that if you run your shard in -debug mode and than you do [restart in game the new shard will not be in debug mode.
In order to have a debug mode on restart you'll have to shutdown your shard manually ([admin ==> shutdown and save) and than run it again in debug mode.
 

telekea

Wanderer
Hello,

Since you implemented these two scripts last night I have been running our shard in -debug mode all day. Also as a stress test, I deleted several unused characters, and old accounts, restarted the server again in -debug mode and so far have not been able to duplicate the previous crashes. We have also been speeding up the world saves during -debug mode but it has yet to crash. Going on 18 hours now with no repeats.
 

daat99

Moderator
Staff member
telekea said:
Hello,

Since you implemented these two scripts last night I have been running our shard in -debug mode all day. Also as a stress test, I deleted several unused characters, and old accounts, restarted the server again in -debug mode and so far have not been able to duplicate the previous crashes. We have also been speeding up the world saves during -debug mode but it has yet to crash. Going on 18 hours now with no repeats.
If I were right than the tricky part is that it require a deletion of an active acount.
That means an acount that actually played since the script was installed.
Due to the fact that I have no idea what actions the players does to create the initial state that make it crash I can't duplicate it on my test shards (yes I have several test shards and no public shard).

So far it's good to know that it didn't crashed but it'll be best to wait a weeks and than see how it works when you delete an acount of a player that played this week.

If you have both public shard and test shard where you can switch the save files than you can simply have your real shard running with those new files for a week and after that take the save file from it and use it on the test shard.
Than just delete the acount on the test shard (real shard acount won't be efected), restart the shard just after you delete the acount and see if it triggers the crash or not.

Just remember, if it ask you to delete the centers press no and shut down the shard.
Than run it from the cmd in debug mode so it will issue the exception and won't close the console so you can copy it and send it to me.

Sorry for all the troubles guys but it couldn't be avoided.
I did a lot of tests before I released this but I can't duplicate a real shard and the actions taken in such on a test shard.
 

toddjumper

Wanderer
I am not sure if account deleting was causing the crashes because the last crash that occured within the past 5 days, no accounts were deleted at all. I am the only admin. And since our shard only allows 1 character per account, I doubt any characters were deleted either. Playerbase is only about 3-4 online at a time and all week they have been the same people.

Since your recent fix I have deleted some test accounts made within the past week, deleted characters and it has not crashed. I used a backup save from a week ago (the same save that crashed 3 days ago, and that save no longer crashes since your most recent fix.) I will let you know if it happens again.

The only thing different I noticed since the script updates is that during world saves now in the server.exe window it looks like this

World: Saving...81, 0

Not sure what the 81, 0 means. But never seen it before.
 

daat99

Moderator
Staff member
toddjumper said:
I am not sure if account deleting was causing the crashes because the last crash that occured within the past 5 days, no accounts were deleted at all. I am the only admin. And since our shard only allows 1 character per account, I doubt any characters were deleted either. Playerbase is only about 3-4 online at a time and all week they have been the same people.

Since your recent fix I have deleted some test accounts made within the past week, deleted characters and it has not crashed. I used a backup save from a week ago (the same save that crashed 3 days ago, and that save no longer crashes since your most recent fix.) I will let you know if it happens again.

The only thing different I noticed since the script updates is that during world saves now in the server.exe window it looks like this

World: Saving...81, 0

Not sure what the 81, 0 means. But never seen it before.
81 == players registered in the OWLTR control center static holder list.
0 == null entries in the OWLTR control center static holder list.

If the 0 shows anything other than 0 for more than 2 saves in a row than it's an indication that something is wrong.
It can be a player that got deleted or changed serial (or many other things).
In any case if it's not 0 than it shouldn't save the null entries and in the next save it should be 0 again (assuming you did restart between them).
 

toddjumper

Wanderer
Well just like before, exactly 5 days later we get this crash again that corrupts the world save.

Even after your most recent fix on the 9th it crashes 5 days down the road. Here is one thing I noticed though, it crashed not long as a new player made a new account. Would it happen to be the token ledgers being "null" since the new player did not assign their ledger to themselves?

NOTE: Never at any time did the world saves say anything other than

World Saving: 94, 0

It always said 0 - so why would it crash on a null item if supposedly there were no null items.

I will be running the server in -debug mode Until it crashes again, which might even take another 5 days. The current crash log is exactly the same as all the others, the daat99holder.cs is still crashing but does not tell you much except something is null.
 

daat99

Moderator
Staff member
toddjumper said:
Well just like before, exactly 5 days later we get this crash again that corrupts the world save.

Even after your most recent fix on the 9th it crashes 5 days down the road. Here is one thing I noticed though, it crashed not long as a new player made a new account. Would it happen to be the token ledgers being "null" since the new player did not assign their ledger to themselves?

NOTE: Never at any time did the world saves say anything other than

World Saving: 94, 0

It always said 0 - so why would it crash on a null item if supposedly there were no null items.

I will be running the server in -debug mode Until it crashes again, which might even take another 5 days. The current crash log is exactly the same as all the others, the daat99holder.cs is still crashing but does not tell you much except something is null.
Did you saved your backup folder before you deleted the daat99 control center?
It'll realy help a lot on figuring this issue.

P.S.
The ledger have nothing to do with it, it's the new static hash tables.
I have 1 more idea to test but I need to check it out before I post on it.
A crash log will be helpfull even if you don't haev a debug 1.

Keep in mind that there can be several problems that cause a crash and I can't tell what does it.
 
Top