For anyone who is interested. The latest up to date ServUO won't run with this enhanced client package properly. There were a few additions from the enhanced slayer system and some bug fixes that made them incompatible. All I did was merge the files that Regnak created. This zip only contains the merged CS files and doesn't include any executables like the UOSA loader.
 

Attachments

  • EC Support 3-22-14.zip
    138.8 KB · Views: 310
Are you use a UOSALoader 2.3 for a connect? Ask because we cant connect with and login via this ver with our server (latest ServUo with EC Support 3-22-14 pack) Ver of game client - 4.0.35.5.
 
Ello again. My problem with UOSA is resolved so we can test now and found two lack in your enhanced version code. Hope that this info help you :) and maybe one of you - Dear Friends - already found a way to solve this problem?

First - ehhanced user (player with enhanced client) cannot set price of items on his playervendors. When I drop my stuff for sale and when I have to determine the selling price (enter for chat activate, text write and confirmation enter) - the process ends with a display of what I wrote (like I said on my toon) while on vendor price is always set at 999 gp. Same when I use chat legacy mode - (text and enter). Probably the server does not identify my text as set prices but only as a spoken text.
I found same problem with town criers.

Second - Names of main menu button in staff runebook, cannot display properly (I see only gray button without names although all of the options in each of runebook tabs display properly)
 
Last edited:
Cool findings !

There's a lot of work to do for a free shard to fully support the Enhanced Client.
There are tons of such things that don't work... :(

For now, I'm more worried about the encryption. It seems you can't connect with the latest UO Enhanced Clients, unless you have encryption enabled.
There are scripts for that, of course ... but they seem not to be very stable. I activated them on my shard, and it causes a crash from time to time. I'm not sure how to fix it, so I have desactivated the encryption scripts.

But well, for a test shard, I think those scripts can work ^^
 
Regnak, I connect with my shard , with most new enhanced client (4.0.35.5) and little older version of UoSA (looks at end of this post for a link to my .rar). Couple of days ago we had a connection problems between 3dclient and server but we managed to solve them. Also for run UoSA on win 7-8 You need file msvcr71.dll (I added it to my zip) dropped to client folder. Simly only drop all files inside .rar to a client folder, edit ip/port in cheese AND login files and run UOSA. Its works with my most latest version of uo3d and latest of servuo :p.

Here is my UoSA . Try it with most latest uo3d client :)
http://www.sendspace.pl/file/f98600022f74963004e972a
 
Last edited:
@LordFenris , thanks for sharing your UOSALoader. ;)

I gave it a try yesterday, but I couldn't pass the encryption check.

Do you use a server-side game encryption ?
Or can you remove the encryption from client-side ? (like Razor, UOSteam and the others do for the Classic Client)

Other questions open to everyone : what is the legality of such programs that remove the encryption in the client before connecting ?
I saw another UOSALoader project on Google (active in 2014 ... so it's still in development), but the developer mentions he doesn't want to patch client-side encryption. I'm not sure why though .... he says it's just to avoid servers to rely on "copy-paste" for Enhanced Client support.

Which leads me to my other question : Anyone knows a good server-side encryption support ?
I took the one from RunUO, which is pretty obvious to find, but it gives me random crashes. I would like to rely on a better version of those scripts, if there are. I'm currently using 2.4.

Okay thanks everyone for your help and thoughts on this ! :)

-Rek-
 
Hello again.
I implement pack ECSupport by Samuel Packham, and my ver. of UOSALoader without aby other programs. Check ip and port adress in both - "cheese" and "login" files (from my pack) - change ip and port sequence inside this files to your adress/port. Next, please try run UOSALoader in XP compatibility mode and as administrator.
 
Thank you LordFenris for your hints, but I'm still stuck at the encryption check. In the server console, I have this message : "Encrypted client detected, disconnecting".

I have put back the server-side encryption support, and I can connect :)
But I fear I haven't fixed the crash that happens every 2-3 days :
System.AggregateException: One or more errors occurred. ---> System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Scripts.Engines.Encryption.GameEncryption.serverEncrypt(Byte[]& buffer, Int32 length) in ...\GameEncryption.cs:line 65
 
Is possible to change a nick here? :) I think Fenris without Lord is a better choice, but unfortunately simply "Fenris" is not free :) LordFenris is my nick from SWTOR. But pls Regnak - call me a Fenris :)
I have never encountered a problem about which you wrote. At least on my server it did not occur. I wonder what could be the cause. Could you send me or paste here the file from your server? I will compare it with mine.
 
Regnak - are you got any idea how to resolve set price bug in playervendors?
At the moment this is one of the few errors that I caught, but quite problematic for a players.
 
Hey Fenris !

I used the ServUO files and added the Enhanced Client patch above ;-)
And still, I get blocked because of encryption.
It might be my client. I'll try a fresh installation.

I don't know yet how to fix player vendors. I'll have a look ;)
 
Anyone knows a good server-side encryption support ?
I've been using the same as you for a long time and never noticed a crash about it.
I've also found and fixed a flaw that made some clients be recognized as others due their similarity on encryption keys

I don't know what is the version of this one I'm using but it works for me
 

Attachments

  • Encryption.zip
    10.6 KB · Views: 81
Thanks Feeh !

It seems my players tend to have talent for crashing my shard ! :p

I'll check your version if I can see any difference.

Thanks for sharing.
 
Hey Fenris !

I used the ServUO files and added the Enhanced Client patch above ;-)
And still, I get blocked because of encryption.
It might be my client. I'll try a fresh installation.

I don't know yet how to fix player vendors. I'll have a look ;)
Client version or custom files.
Whats your version of Enhanced client ? We use 4.0.35.5.
 
New information about player vendor bug in Enhanced ver.
Does not work "not for sale"option (pressing ESC does not result in change in the status of the object thrown into a vendor - still the price is 999, and this price is the default if you do not give up her).
Also does not work the option of naming a vendor, naming the store and the collect of gold from a vendor. Inside vendor window works correctly only customize, dismiss and see goods .

But already in the 2d version of the game, on the same server code, everything works fine.
 
Last edited:
Next update:
We found same bug with staff runebook. In Enhanced client - joeku's staff runebook rune name option didnt work too.
Same problem with set player runebook name and other where player must set a name or value. We type text ingame , toon told this and nothing more. :( Any idea?
 
Last edited:
We found next bug in Enhanced version. Does not work properly limit of characters in help page . When you type more than 200 characters (which is the limit in 2d), you can continue to type in another, but sending a page results in disconnecting the game client. This applies to both - players and GMs
Edit:
Also Bulletin Board in Enhanced does not open correctly
 
Last edited:
Code:
Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
   at Server.Network.PacketHandlers.DropReq6017(NetState state, PacketReader pvSrc) in d:\...\Server\Network\PacketHandlers.cs:line 1199
   at Server.Network.MessagePump.HandleReceive(NetState ns) in d:\...\Server\Network\MessagePump.cs:line 314
   at Server.Network.MessagePump.Slice() in d:\...\Server\Network\MessagePump.cs:line 121
   at Server.Core.Main(String[] args) in d:\...\Server\Main.cs:line 622

----------------------------------------
Code:
//genova:START support uo:kr
		public static void DropReq6017(NetState state, PacketReader pvSrc)
        {
            if (state.IsKRClient || state.IsSAClient)
            {
                //pvSrc.ReadInt32(); // serial, ignored
                Serial m_item = pvSrc.ReadInt32(); // support UO:KR
                //pvSrc.ReadInt32(); // serial, ignored
                int x = pvSrc.ReadInt16();
                int y = pvSrc.ReadInt16();
                int z = pvSrc.ReadSByte();
                //pvSrc.ReadByte(); // Grid Location?
                int GridLocation = pvSrc.ReadByte(); // support UO:KR
                //pvSrc.ReadByte(); // Grid Location?
                Serial dest = pvSrc.ReadInt32();

                Point3D loc = new Point3D(x, y, z);

                Mobile from = state.Mobile;

                if (dest.IsMobile)
                    from.Drop(World.FindMobile(dest), loc);
                else if (dest.IsItem)
                {
                    #region GeNova KR Support
                    if (World.FindItem(dest) is Container)
                    {
                        Container m_container = World.FindItem(dest) as Container;
                        Item[] items = m_container.FindItemsByType(typeof(Item));
                        bool canDropGrid = true;
                        foreach (Item itemDropOn in items)
                        {
                            if (itemDropOn.GridLocation == GridLocation && itemDropOn.Parent != null && itemDropOn.Parent == m_container)
                            {
                                canDropGrid = false;
                                break;
                            }
                        }
                        if (canDropGrid)
                            World.FindItem(m_item).GridLocation = GridLocation;
                        else
                        {
                            bool m_sadd = true;
                            for (int i = 0; i <= items.Length; i++)
                            {
                                foreach (Item itemDropOn in items)
                                {
                                    if (itemDropOn.GridLocation == i && itemDropOn.Parent != null && itemDropOn.Parent == m_container)
                                        m_sadd = false;
                                }
                                if (m_sadd)
                                {
                                    World.FindItem(m_item).GridLocation = i;
                                    break;
                                }
                                if (i != items.Length)
                                    m_sadd = true;
                            }
                            if (!m_sadd && (items.Length < 125))
                                World.FindItem(m_item).GridLocation = items.Length;
                        }
                    }
                    #endregion
                    from.Drop(World.FindItem(dest), loc);
                }
                else
                    from.Drop(loc);
                
                #region GeNova: KR Support
                if (state != null)
                    state.Send(new KRDropConfirm());
                #endregion
            }
            else
            {

                pvSrc.ReadInt32(); // serial, ignored

                int x = pvSrc.ReadInt16();

                int y = pvSrc.ReadInt16();

                int z = pvSrc.ReadSByte();

                pvSrc.ReadByte(); // Grid Location?

                Serial dest = pvSrc.ReadInt32();


                Point3D loc = new Point3D(x, y, z);

                Mobile from = state.Mobile;


                bool success = false;

                Item holding = from.Holding;


                if (dest.IsMobile)

                    success = from.Drop(World.FindMobile(dest), loc);

                else if (dest.IsItem)

                    success = from.Drop(World.FindItem(dest), loc);

                else

                    success = from.Drop(loc);

            }
        }
		//genova:END support uo:kr
		//
 
Last edited:
Hello,

You might give a try to this DropReq6017 ;)

Code:
public static void DropReq6017(NetState state, PacketReader pvSrc)
  {     
  if (state.IsKRClient)
  {   
  Serial m_item = pvSrc.ReadInt32(); // support UO:KR
  int x = pvSrc.ReadInt16();
  int y = pvSrc.ReadInt16();
  int z = pvSrc.ReadSByte();
  int GridLocation = pvSrc.ReadByte(); // support UO:KR
  Serial dest = pvSrc.ReadInt32();
  Point3D loc = new Point3D(x, y, z);
  Mobile from = state.Mobile;
  if (dest.IsMobile)
  from.Drop(World.FindMobile(dest), loc);
  else if (dest.IsItem)
  {
  #region GeNova KR Support
  if (World.FindItem(dest) is Container)
  {
  Container m_container = World.FindItem(dest) as Container;
  Item[] items = m_container.FindItemsByType(typeof(Item));
  bool canDropGrid = true;
  foreach (Item itemDropOn in items)
  {
  if (itemDropOn.GridLocation == GridLocation && itemDropOn.Parent != null && itemDropOn.Parent == m_container)
  {
  canDropGrid = false;
  break;
  }
  }
  if (canDropGrid)
                 if (m_item != null)
                   if (World.FindItem(m_item) != null)
                       World.FindItem(m_item).GridLocation = GridLocation;
  else
  {
  bool m_sadd = true;
  for (int i = 0; i <= items.Length; i++)
  {
  foreach (Item itemDropOn in items)
  {
  if (itemDropOn.GridLocation == i && itemDropOn.Parent != null && itemDropOn.Parent == m_container)
  m_sadd = false;
  }
  if (m_sadd)
  {
                   if (m_item != null)
                   {
                     if (World.FindItem(m_item) != null)   
                     {
                       World.FindItem(m_item).GridLocation = i;
                       break;
                     }
                   }
  }
  if (i != items.Length)
  m_sadd = true;
  }
  if (!m_sadd && (items.Length < 125))
                 if (m_item != null)
                   if (World.FindItem(m_item) != null)
                     World.FindItem(m_item).GridLocation = items.Length;
  }
  }
  #endregion
  from.Drop(World.FindItem(dest), loc);
  }
  else
  from.Drop(loc);
   
  #region GeNova: KR Support
  if (state != null)
  state.Send(new KRDropConfirm());
  #endregion
  }
  else
  {
  pvSrc.ReadInt32(); // serial, ignored
  int x = pvSrc.ReadInt16();
  int y = pvSrc.ReadInt16();
  int z = pvSrc.ReadSByte();
  pvSrc.ReadByte(); // Grid Location?
  Serial dest = pvSrc.ReadInt32();

  Point3D loc = new Point3D(x, y, z);
  Mobile from = state.Mobile;

  if (dest.IsMobile)
  from.Drop(World.FindMobile(dest), loc);
  else if (dest.IsItem)
         {
           Item item = World.FindItem(dest);

           if (item is BaseMulti && ((BaseMulti)item).AllowsRelativeDrop)
           {
             loc.m_X += item.X;
             loc.m_Y += item.Y;
             from.Drop(loc);
           }
           else
           {
             from.Drop(item, loc);
           }
         }
  else
  from.Drop(loc);
  }
  }
 
@argalep Code tags. Code tags. Code tags. Code tags. Code tags. Code tags. Code tags. Code tags. Code tags. Code tags. Code tags. Code tags.
 
I got a question on this I got it all installed using uo saloader but when I click login with enhanced client consol outputs the msg encryption check waiting why wont it let it go though
 
I installed the encryption.cs files that was on here still not sure why wont let it go in when I got server set to let encrypted clients in
 
When i use this script and create a mage character from client.exe related characters items are not dropped.

Mage Character Create
Code:
private static void EventSink_CharacterCreated(CharacterCreatedEventArgs args)
        {
			Console.WriteLine("Test: {0}", args.Profession);

Console output : Test: 0

must be : Test: 2
 
Last edited:
fix : EventSink.cs

Change to

Code:
public class CharacterCreatedEventArgs : EventArgs
	{	
		private readonly NetState m_State;
		private readonly IAccount m_Account;
		private readonly CityInfo m_City;
		private readonly SkillNameValue[] m_Skills;
		private readonly int m_ShirtHue;
		private readonly int m_PantsHue;
		private readonly int m_HairID;
		private readonly int m_HairHue;
		private readonly int m_BeardID;
		private readonly int m_BeardHue;
		private readonly string m_Name;
		private readonly bool m_Female;
		private readonly int m_Hue;
		private readonly int m_Str;
		private readonly int m_Dex;
		private readonly int m_Int;

		private readonly Race m_Race;
	
 		
        #region GeNova: KR Support
        private readonly int m_Face;
        private readonly int m_FaceHue;
        #endregion
		//genova:END support uo:kr

		public NetState State { get { return m_State; } }
		public IAccount Account { get { return m_Account; } }
        public Mobile Mobile { get; set; }
		public string Name { get { return m_Name; } }
		public bool Female { get { return m_Female; } }
		public int Hue { get { return m_Hue; } }
		public int Str { get { return m_Str; } }
		public int Dex { get { return m_Dex; } }
		public int Int { get { return m_Int; } }
		public CityInfo City { get { return m_City; } }
		public SkillNameValue[] Skills { get { return m_Skills; } }
		public int ShirtHue { get { return m_ShirtHue; } }
		public int PantsHue { get { return m_PantsHue; } }
		public int HairID { get { return m_HairID; } }
		public int HairHue { get { return m_HairHue; } }
		public int BeardID { get { return m_BeardID; } }
		public int BeardHue { get { return m_BeardHue; } }
		public int Profession { get; set; }
		public Race Race { get { return m_Race; } }

		//genova:START support uo:kr	
        public int FaceID { get { return m_Face; } }
        public int FaceHue { get { return m_FaceHue; } }		
		//genova:END support uo:kr		
		
		//genova:START support uo:kr
		public CharacterCreatedEventArgs(
			NetState state,
			IAccount a,
			string name,
			bool female,
			int hue,
			int str,
			int dex,
			int intel,
			CityInfo city,
			SkillNameValue[] skills,
			int shirtHue,
			int pantsHue,
			int hairID,
			int hairHue,
			int beardID,
			int beardHue,
			int profession,
			Race race)
		  : this(state, a, name, female, hue, str, dex, intel, city, skills, shirtHue, pantsHue, hairID, hairHue, beardID, beardHue, profession, race, 0, 0)
		{
			/*m_State = state;
			m_Account = a;
			m_Name = name;
			m_Female = female;
			m_Hue = hue;
			m_Str = str;
			m_Dex = dex;
			m_Int = intel;
			m_City = city;
			m_Skills = skills;
			m_ShirtHue = shirtHue;
			m_PantsHue = pantsHue;
			m_HairID = hairID;
			m_HairHue = hairHue;
			m_BeardID = beardID;
			m_BeardHue = beardHue;
			Profession = profession;
			m_Race = race;*/
		}
		
		 // GeNova: KR Support (Added params)
        public CharacterCreatedEventArgs(NetState state, IAccount a, string name, bool female, int hue, int str, int dex, int intel, CityInfo city, SkillNameValue[] skills, int shirtHue, int pantsHue, int hairID, int hairHue, int beardID, int beardHue, int profession, Race race, int faceID, int faceHue)
        {
       
            m_State = state;
            m_Account = a;
            m_Name = name;
            m_Female = female;
            m_Hue = hue;
            m_Str = str;
            m_Dex = dex;
            m_Int = intel;
            m_City = city;
            m_Skills = skills;
            m_ShirtHue = shirtHue;
            m_PantsHue = pantsHue;
            m_HairID = hairID;
            m_HairHue = hairHue;
            m_BeardID = beardID;
            m_BeardHue = beardHue;
            Profession = profession;
            m_Race = race;
            m_Face = faceID;
            m_FaceHue = faceHue;
        }
		//genova:END support uo:kr
	}
 
well I try to login with client I get msg on console

encryption check passed - new client
client 127.0.0.1 : detecting unknown client.
encryption check waiting.

Im trying to login with enhanced client 7.0.35.6
 
When i use this script and create a mage character from client.exe related characters items are not dropped.

Mage Character Create
Code:
private static void EventSink_CharacterCreated(CharacterCreatedEventArgs args)
        {
			Console.WriteLine("Test: {0}", args.Profession);

Console output : Test: 0

must be : Test: 2

Here is my Evensink.cs with corrects for resolve advanced character lack of equipment. You ask about that yesterday.

public class CharacterCreatedEventArgs : EventArgs
{

//genova:START support uo:kr
/*
private readonly NetState m_State;
private readonly IAccount m_Account;
private readonly CityInfo m_City;
private readonly SkillNameValue[] m_Skills;
private readonly int m_ShirtHue;
private readonly int m_PantsHue;
private readonly int m_HairID;
private readonly int m_HairHue;
private readonly int m_BeardID;
private readonly int m_BeardHue;
private readonly string m_Name;
private readonly bool m_Female;
private readonly int m_Hue;
private readonly int m_Str;
private readonly int m_Dex;
private readonly int m_Int;

private readonly Race m_Race;
*/
private NetState m_State;
private IAccount m_Account;
private CityInfo m_City;
private SkillNameValue[] m_Skills;
private int m_ShirtHue, m_PantsHue;
private int m_HairID, m_HairHue;
private int m_BeardID, m_BeardHue;
private string m_Name;
private bool m_Female;
private int m_Hue;
private int m_Str, m_Dex, m_Int;
private int m_Profession;
private Mobile m_Mobile;

private Race m_Race;
#region GeNova: KR Support
private int m_Face;
private int m_FaceHue;
#endregion
//genova:END support uo:kr

public NetState State { get { return m_State; } }
public IAccount Account { get { return m_Account; } }
public Mobile Mobile{ get{ return m_Mobile; } set{ m_Mobile = value; } }
public string Name { get { return m_Name; } }
public bool Female { get { return m_Female; } }
public int Hue { get { return m_Hue; } }
public int Str { get { return m_Str; } }
public int Dex { get { return m_Dex; } }
public int Int { get { return m_Int; } }
public CityInfo City { get { return m_City; } }
public SkillNameValue[] Skills { get { return m_Skills; } }
public int ShirtHue { get { return m_ShirtHue; } }
public int PantsHue { get { return m_PantsHue; } }
public int HairID { get { return m_HairID; } }
public int HairHue { get { return m_HairHue; } }
public int BeardID { get { return m_BeardID; } }
public int BeardHue { get { return m_BeardHue; } }
public int Profession{ get{ return m_Profession; } set{ m_Profession = value; }}
public Race Race { get { return m_Race; } }

//genova:START support uo:kr
public int FaceID { get { return m_Face; } }
public int FaceHue { get { return m_FaceHue; } }
//genova:END support uo:kr

//genova:START support uo:kr
public CharacterCreatedEventArgs(
NetState state,
IAccount a,
string name,
bool female,
int hue,
int str,
int dex,
int intel,
CityInfo city,
SkillNameValue[] skills,
int shirtHue,
int pantsHue,
int hairID,
int hairHue,
int beardID,
int beardHue,
int profession,
Race race)
: this(state, a, name, female, hue, str, dex, intel, city, skills, shirtHue, pantsHue, hairID, hairHue, beardID, beardHue, profession, race, 0, 0)
{
/*m_State = state;
m_Account = a;
m_Name = name;
m_Female = female;
m_Hue = hue;
m_Str = str;
m_Dex = dex;
m_Int = intel;
m_City = city;
m_Skills = skills;
m_ShirtHue = shirtHue;
m_PantsHue = pantsHue;
m_HairID = hairID;
m_HairHue = hairHue;
m_BeardID = beardID;
m_BeardHue = beardHue;
Profession = profession;
m_Race = race;*/
}

// GeNova: KR Support (Added params)
public CharacterCreatedEventArgs(NetState state, IAccount a, string name, bool female, int hue, int str, int dex, int intel, CityInfo city, SkillNameValue[] skills, int shirtHue, int pantsHue, int hairID, int hairHue, int beardID, int beardHue, int profession, Race race, int faceID, int faceHue)
{

m_State = state;
m_Account = a;
m_Name = name;
m_Female = female;
m_Hue = hue;
m_Str = str;
m_Dex = dex;
m_Int = intel;
m_City = city;
m_Skills = skills;
m_ShirtHue = shirtHue;
m_PantsHue = pantsHue;
m_HairID = hairID;
m_HairHue = hairHue;
m_BeardID = beardID;
m_BeardHue = beardHue;
m_Profession = profession;
m_Race = race;
m_Face = faceID;
m_FaceHue = faceHue;
}
//genova:END support uo:kr
}

For equipment I especially change these 3 lines:
First:
public Mobile Mobile { get; set; }
change to:
public Mobile Mobile{ get{ return m_Mobile; } set{ m_Mobile = value; } }
Second:
public int Profession { get; set; }
change to:
public int Profession{ get{ return m_Profession; } set{ m_Profession = value; }}
Third:
Profession = profession;
change to:
m_Profession = profession;
 
Last edited:
But our server still dont remember face chosen by player during character creating. Skin tone , hair and beard style and colour of hair/beards works properly.
 
Last edited:
Hi guys, I have been a couple of years running my own RunUo Server, but I would like to give a try to UO Enhanced client. Could you tell me what steps I should follow to have it running? I guess it could to be:

1) Download last ServUO
2) Add all modifications of scripts that you have posted here.
3) Use Neruns distro for example to have all spawns?
4) Use UOSA Loader 2.3 from https://code.google.com/p/kprojects/downloads/list
5) Download Enhanced Client, patch it, and play

is it correct or Im missing something? I know it could have some bugs, but I think I could help to fix some of them.

Thank You in advance!
 
well enhanced client still little buggy its a great idea to add just like me I updated mine to the latest client but the problem is it wont let me login I would suggest do what you said Tornar and give servuo a try its pretty great emu well I think its better then runuo because they want to support latest client stuff but they want it bug free
 
Gump add AddAlphaRegion transparency problem;

Code:
AddBackground( 0, 0, 380, 280, 5054 );
AddImageTiled( 10, 10, 360, 260, 2624 );
AddAlphaRegion( 10, 10, 360, 260 );

How do I resolve?
 

Attachments

  • classic_client.png
    classic_client.png
    52.7 KB · Views: 40
  • enhanced_client.png
    enhanced_client.png
    59.6 KB · Views: 42
hi guys I have been trying the enhanced client for a few days now and the only problem I have had is the missing string problem on mobiles do you have a fix for that? cheers
 
Back