Hello guys, It's Fred I'm Learning the C# , today I set up my localserver but I have this strange problem how you can see at the link below;
http://it.tinypic.com/r/qnk8z9/9

all the npcs and me included, we are moved under the ground ... how can i resolve it ?

RunUO 2.3
client 5.0.9.1 (patch 31) ML 5.0.9.1

how can i resolve?
 
Hi,
I have the file Patchw32.dll nothing about datapatch.dll
last one is inside the Ultima online general folder not in the
UO/patch .
 
ok I checked and put the correct folder
my runuo server says this
Restricting client version to 5.0.9.1. Action to be taken: LenientKick
So i think that should ok, but the problem persists,

This is the code


/* If you have not installed Ultima Online,
* or wish the server to use a separate set of datafiles,
* change the 'CustomPath' value.
* Example:
* private static string CustomPath = @"C:\Program Files\Ultima Online";
*/
private static string CustomPath = @"C:\Giochi\uoml_setup_fully_patched_5.0.9.1\Ultima Online Mondains Legacy";
/* The following is a list of files which a required for proper execution:
*
* Multi.idx
* Multi.mul
* VerData.mul
* TileData.mul
* Map*.mul or Map*LegacyMUL.uop
* StaIdx*.mul
* Statics*.mul
* MapDif*.mul
* MapDifL*.mul
* StaDif*.mul
* StaDifL*.mul
* StaDifI*.mul
*/
public static void Configure()
{
string pathUO = GetPath( @"Origin Worlds Online\Ultima Online\1.0", "ExePath" );
string pathTD = GetPath( @"Origin Worlds Online\Ultima Online Third Dawn\1.0", "ExePath" ); //These refer to 2D & 3D, not the Third Dawn expansion
string pathKR = GetPath( @"Origin Worlds Online\Ultima Online\KR Legacy Beta", "ExePath" ); //After KR, This is the new registry key for the 2D client
string pathSA = GetPath( @"Electronic Arts\EA Games\Ultima Online Stygian Abyss Classic", "InstallDir" );
string pathHS = GetPath( @"Electronic Arts\EA Games\Ultima Online Classic", "InstallDir" );
if ( CustomPath != null )
Core.DataDirectories.Add( CustomPath );
if ( pathUO != null )
Core.DataDirectories.Add( pathUO );
if ( pathTD != null )
Core.DataDirectories.Add( pathTD );
if ( pathKR != null )
Core.DataDirectories.Add( pathKR );
if ( pathSA != null )
Core.DataDirectories.Add( pathSA );
if ( pathHS != null )
Core.DataDirectories.Add( pathHS );
if ( Core.DataDirectories.Count == 0 && !Core.Service )
{
Console.WriteLine( "Enter the Ultima Online directory:" );
Console.Write( "> " );
Core.DataDirectories.Add( Console.ReadLine() );
}
}
private static string GetPath( string subName, string keyName )
{
try
{
string keyString;
if( Core.Is64Bit )
keyString = @"SOFTWARE\Wow6432Node\{0}";
else
keyString = @"SOFTWARE\{0}";
using( RegistryKey key = Registry.LocalMachine.OpenSubKey( String.Format( keyString, subName ) ) )
{
if( key == null )
return null;
string v = key.GetValue( keyName ) as string;
if( String.IsNullOrEmpty( v ) )
return null;
if ( keyName == "InstallDir" )
v = v + @"\";
v = Path.GetDirectoryName( v );
if ( String.IsNullOrEmpty( v ) )
return null;
return v;
}
}
catch
{
return null;
}
}
}
}
 
Did you want to use this low a client for your server? client 5.0.9.1 (patch 31) ML 5.0.9.1
If not patch up the game client, if so does runuo have an expansion to set?
 
Hello guys, It's Fred I'm Learning the C# , today I set up my localserver but I have this strange problem how you can see at the link below;
http://it.tinypic.com/r/qnk8z9/9

all the npcs and me included, we are moved under the ground ... how can i resolve it ?

RunUO 2.3
client 5.0.9.1 (patch 31) ML 5.0.9.1

how can i resolve?

It is not that strange problem, there is only a few of us that I working with older expansions. The real issue here is that RunUO/ServUO Trammel facet is made for a UOSA client. I would guess that the NPC spawn is a part of new haven and the map has changed around Occlo (and other places). It will go even more horrible with spawning door to buildings. You will not have this problem in Felucca.

You can copy the spawn data from Felucca to Trammel or lock your users in Felucca only. The last solution is to fix the spawns by hand but that will take time. Working with old expansions require a lot of rework with the server code and spawns sins it doesn't support if out of the box. The client is easy to get but the server will be the hard part.

-Grim
 
That is a good solution to start with, and then you have learned how things work you might prefer an old expansion in a later stage.

-Grim
 
uhm why? :)
Can I answer to you guys if I need help about runuo even if it's not servuo? works in same same way ?
Yes! i got almost 700 posts, all of them are bout runuo issues :D and this beautiful community always help me.

I think it doesnt really matter wich emulator you use. We all love UO
 
Cool :) 1 thing , I would like to disable the necromancy , bushido , chivalry ,Ninjitsu, spellweaving, I want a OLD STYLE SHARD ^^ I tried today but there are too many files interested, then I got error, I lost the way :asd: then I got a nice headache..
I removed in all files interested like weaponbase.cs , AI_Mage ecc ecc , the ;
using Server.Spells.Necromancy;
using Server.Spells.Bushido ;

ecc ecc is there a way painless as possible to do that?
 
Go to scripts/misc/CurrentExpansion.cs and se the expansion to None, restart server

also inside SkillGump.cs u can comment out (remove) the skills u dont want to show up inside the skillsgump
 
SkillName.Necromancy,(remove)

Like this? don't works!

Then ;
bool Enabled = Core.AOS;

I tried to put disable, but don't works
 
Last edited:
ah ok :) and about the skill ) where I should put (remove) ?
[doublepost=1548587599][/doublepost]Cool, i tried but I think that I keep the AOS, but I like how appear the name on the head's pg, npc with no expansion, very old style.. but I think that the resistences are very cool to use .
Is there a mode to keep the old style names with the AOS expansion?
I remove the necromance book to the mage vendor, I think that i need to remove the scrolls now to the loots,
 
Yes remove the scrolls from file loot.cs the method its called Randomnecroscroll if i recall good.

Also the npc names i understand what you saying but im not sure how to get rid of the context menus and the square name
 
Ok I will see , do you know how can i add the deadwood on this method?

lumber.BonusResources = new BonusHarvestResource[]
{
new BonusHarvestResource( 0, 83.9, null, null ), //Nothing
new BonusHarvestResource( 100, 10.0, 1072548, typeof( BarkFragment ) ),
new BonusHarvestResource( 100, 03.0, 1072550, typeof( LuminescentFungi ) ),
new BonusHarvestResource( 100, 02.0, 1072547, typeof( SwitchItem ) ),
new BonusHarvestResource( 100, 01.0, 1072549, typeof( ParasiticPlant ) ),
new BonusHarvestResource( 100, 00.1, 1072551, typeof( BrilliantAmber ) )

I tried but I dont know how I can get the numbers before typeof, I putted 1072547 o something like that but runuo reads the Sewing kit...
How can i get the correct number of the DeadWood? .
Thanks!
 
You need UOFiddler4.6 if you going to work on your own server. It is a program that allows you to read internal files inside the client.

What you are looking for is CLILOC, that is the way UO handle different languages in the client.

For later use, there is a UOP packer/unpacker tool that you might need if you decide to stay on newer clients.
Here is the original post made by the author Epila taken from the old RUNUO site.
http://uot2a.com/forums/runuo.com/threads/uofiddler-uop-extractor-plugin.534519/

I have attached the resource file for you.

-Grim
 

Attachments

  • UOPPacker.zip
    10.8 KB · Views: 4
Last edited:
On Uofiddler there is the cliloc I see, and i see the number that i was for looking for, so I should use the uoppacker but i see only a dll file where i should put it? inside the uofiddler?
thanks for your help :)
 
You add it to the plugins directory.

Then open fiddler select plugins and manage. Cross UOP Packer and restart UO Fiddler.

-Grim
 
ok done thanks ! :)
[doublepost=1548629668][/doublepost]But is it normal that the Number of the item on CliLoc (UOfiddler) is different on the Lumberjacking.cs ? on Uofiddler Yew logs is 1075065 on the cs file is 1072543 and is called Yew log without final "s"
 
1072543 - You chop some yew logs and put them into your backpack.
That (1072543) value is the message you get when you have successfully gathered some resources.
It is based on this structure: https://github.com/Grimoric/RUNUO/blob/master/devel/Scripts/Engines/Harvest/Core/HarvestResource.cs

1075065 - yew logs
Is used by the public YewLog class based on the Log class which gets its value from the struct in ResourceInfo.
https://github.com/Grimoric/RUNUO/blob/master/devel/Scripts/Items/Skill Items/Lumberjack/Log.cs
https://github.com/Grimoric/RUNUO/blob/master/devel/Scripts/Misc/ResourceInfo.cs

-Grim
 
Ah ok, so if I want to create a material, i need to create the message in the uofiddler right?
and add it to the resourceinfo.cs

I will try
[doublepost=1548680512][/doublepost]I created a new item, magicwood, put the magicwood.cs in the
RunUO2.3r987_Full\2.3\Scripts\Items\Resources\Reagents

but when I try to add the item [add magicwood , create deadwood not the magicwood .
Then, I would like to disable at the pg creation the possibility to choose the necromancer class .
Thanks for you help guys .
 
Last edited:
Could you show the source of that file: MagicWood.cs

My guess is that you still are using the image/ItemId for DeadWood, 0xF90 in line 18, this also uses the name of that item.
https://github.com/Grimoric/RUNUO/blob/master/devel/Scripts/Items/Resources/Reagents/DeadWood.cs
Code:
// Line 18:
public DeadWood( int amount ) : base( 0xF90, amount )

The name is picked by the Item.cs inside the core.
https://github.com/Grimoric/RUNUO/blob/master/devel/Server/Item.cs
Code:
// Line 2743:
public virtual int LabelNumber
{
	get
	{
		if ( m_ItemID < 0x4000 )
			return 1020000 + m_ItemID;
		else
			return 1078872 + m_ItemID;
	}
}

You can override this by either change the CliLoc like it is done with oilcloth:
https://github.com/Grimoric/RUNUO/blob/master/devel/Scripts/Items/Misc/OilCloth.cs
Code:
// Line 10:
public override int LabelNumber{ get{ return 1041498; } } // oil cloth

It can also be done by setting a name on it without language support like it have been done to "Pool Of Acid".
https://github.com/Grimoric/RUNUO/blob/master/devel/Scripts/Items/Misc/PoolOfAcid.cs
Code:
// Line 24:
public override string DefaultName { get { return "a pool of acid"; } }

-Grim
[doublepost=1548723855][/doublepost]The next issue is a client-server feature negotiation. You can disable features but it will hit all of them for that expansion.

Here is all the information you need from the Ultima Online packet guide.
http://docs.polserver.com/packets/index.php?Packet=0xB9

To solve this you need to make some core change and recompile it.
https://github.com/Grimoric/RUNUO/blob/master/devel/Server/ExpansionInfo.cs
Code:
// feature enums can be found at Line 54 and forward.
[Flags]
	public enum FeatureFlags
	{
			None			= 0x00000000,
			T2A			= 0x00000001,
			UOR			= 0x00000002,
			UOTD			= 0x00000004,
			LBR			= 0x00000008,
			AOS			= 0x00000010,
			SixthCharacterSlot	= 0x00000020,
			SE			= 0x00000040,
			ML			= 0x00000080,
			Unk1			= 0x00000100,
			Unk2			= 0x00000200,
			Unk3			= 0x00000400,
			Unk4			= 0x00000800,
			SeventhCharacterSlot	= 0x00001000,
			Unk5			= 0x00002000,
			Unk6			= 0x00004000,
			Unk7			= 0x00008000,
			SA				= 0x00010000,
			HS				= 0x00020000,
			Gothic			= 0x00040000,
			Rustic			= 0x00080000,
			ExpansionNone		= None,
			ExpansionT2A		= T2A,
			ExpansionUOR		= ExpansionT2A	| UOR,
			ExpansionUOTD		= ExpansionUOR	| UOTD,
			ExpansionLBR		= ExpansionUOTD	| LBR,
			ExpansionAOS		= ExpansionLBR	| AOS	| Unk7,
			ExpansionSE		= ExpansionAOS	| SE,
			ExpansionML		= ExpansionSE	| ML	| Unk2,
			ExpansionSA		= ExpansionML	| SA	| Gothic	| Rustic,
			ExpansionHS		= ExpansionSA
}

-Grim
 
Last edited:
Hi Grim this is my code

using System;
using Server;
using Server.Items;
namespace Server.Items
{
public class MagicWood : BaseReagent, ICommodity
{
int ICommodity.DescriptionNumber { get { return LabelNumber; } }
bool ICommodity.IsDeedable { get { return true; } }
[Constructable]
public MagicWood() : this( 1 )
{
Hue = 150;
}
[Constructable]
public MagicWood( int amount ) : base( 0xF90, amount )
{
}
public MagicWood( Serial serial ) : base( serial )
{
}
 
Code:
using System;
using Server;
using Server.Items;

namespace Server.Items
{
	public class MagicWood : BaseReagent, ICommodity
	{
		int ICommodity.DescriptionNumber { get { return LabelNumber; } }
		bool ICommodity.IsDeedable { get { return true; } }

		[Constructable]
		public MagicWood() : this( 1 )
		{
			Hue = 150;
			DefaultName = "Magic Wood"; // not supported by clients using German CliLoc.
		}
		
		[Constructable]
		public MagicWood( int amount ) : base( 0xF90, amount )
		{
		}
		
		public MagicWood( Serial serial ) : base( serial )
		{
		}
	}
}

I'm not working with ICommodity sins my focus is on T2A, but this needs to be fixed to allow your new item.

-Grim
 
Last edited:
I have done how you said but I got this message on the runuo console

errors:
+ Items / Resources / Reagents / Magicwood.cs:
CS0200: Line 16: Unable to assign a value to the 'Server.Item.DefaultName' property or indexer because it is read-only.
 
Upps my bad!
Code:
using System;
using Server;
using Server.Items;

namespace Server.Items
{
   public class MagicWood : BaseReagent, ICommodity
   {
       int ICommodity.DescriptionNumber { get { return LabelNumber; } }
       bool ICommodity.IsDeedable { get { return true; } }

       public override string DefaultName = "Magic Wood"; // not supported by clients using German CliLoc.

       [Constructable]
       public MagicWood() : this( 1 )
       {
            Hue = 150;
       }

       [Constructable]
       public MagicWood( int amount ) : base( 0xF90, amount )
       {
       }
  
       public MagicWood( Serial serial ) : base( serial )
       {
       }
   }
}
 
The console says that "=" (invalid token)
I tried in this mode ; (1116792 number of magic wood on my uofiddler saved and put the cliloc on the UO directory, but when I add the item appears the Dead Wood name not the Magic Wood … :|

namespace Server.Items
{
public class MagicWood : BaseReagent, ICommodity
{
int ICommodity.DescriptionNumber { get { return 1116792; } }
bool ICommodity.IsDeedable { get { return true; } }
[Constructable]
public MagicWood() : this(1)
{
Hue = 150;
}

[Constructable]
public MagicWood(int amount) : base(0xF90, amount)
{
}
public MagicWood(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
[doublepost=1548773856][/doublepost]I tried in this mode how you said

public class MagicWood : BaseReagent, ICommodity
{
int ICommodity.DescriptionNumber { get { return LabelNumber; } }
bool ICommodity.IsDeedable { get { return true; } }
public override string DefaultName = "Magic Wood"; // not supported by clients using German CliLoc.
[Constructable]
public MagicWood() : this(1)
{
Hue = 150;
}
[Constructable]
public MagicWood(int amount) : base(0xF90, amount)
{
}
public MagicWood(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 );
int version = reader.ReadInt();
}
}
} */

ERROR ; Line 11: The 'override' modifier is not valid for this element.
[doublepost=1548775389][/doublepost]OK Grim in this mode works, I use the poolofacid .
Now I try with the cliloc :)

using System;
using Server;
using Server.Items;
namespace Server.Items
{
public class MagicWood : BaseReagent, ICommodity
{
int ICommodity.DescriptionNumber { get { return LabelNumber; } }
bool ICommodity.IsDeedable { get { return true; } }
public override string DefaultName { get { return "Magic Wood"; } }
[Constructable]
public MagicWood() : this( 1 )
{
}
[Constructable]
public MagicWood( int amount ) : base( 0xF90, amount )
{
hue = 150;

}
public MagicWood( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
}
public override void Deserialize( GenericReader reader )
{
}
}
}
[doublepost=1548776337][/doublepost]In that mode with the cliloc code dont works… very strange..
 
Last edited:
Did you replace
Code:
public override string DefaultName { get { return "Magic Wood"; } }
with
Code:
publicoverrideint LabelNumber{get{return1041498;}}// oil cloth

-Grim
 
yes with this works with the cliloc codes
public override int LabelNumber { get { return 1116792; } }// magic wood

with this not works..
int ICommodity.DescriptionNumber { get { return 1116792; } }
 
Last edited:
Yes dont works.. :| I will use this
public override int LabelNumber { get { return 1116792; } }// magic wood

:)
[doublepost=1548787233][/doublepost]is it normal that i chop only logs? ^^ the second numbers by the left side should be the chance for get the item?
res = new HarvestResource[]
{
new HarvestResource( 00.0, 00.0, 100.0, 500498, typeof( Log ) ),
new HarvestResource( 50.0, 90.0, 100.0, 1095510, typeof( DeadWood ) ),
new HarvestResource( 50.0, 10.0, 100.0, 1095511, typeof( MagicWood ) ),
 
Back