The dude was actually extremely fast to get back to me. I am entirely unfamiliar with RunUO internals - I haven't worked with any emulators since Sphere .54 back in I don't know what year. I'm going to look at the current RunUO release and see if I can follow the information I was given, however I'll also post the reply I got since we have some RunUO experts that hang out here. If you have anything to add that might help get RunUO working with the 1.25 client please chime in.
Greetings,
It has been a while since I've touched this part of the code but let's see what I can scrounge from my archives...
I can tell you it takes quite a bit to get it going as several packets have to be reviewed, but if you have some previous knowledge in working with UO packets it should take at most 2 days of fiddling around to get it working.
In the end I decided against using 1.25 on my server, the lack of the black border and other features were too much. I went with 1.25.37g which is a t2a version, in fact the latest version I could find that still had the code for the original chest opening screen, albeit it wasn't being used by the client but it was still there so a quick hex edit and it was restored.
Below I'll use snippets of code from my own version, they won't be the same as what's in stock runuo but they will get my point across:
1.25 encryption keys are:as you can see the login and game server use the same encryption, unlike later clients.Code: Select all
new EncryptionKey("1.25", 0xF1A372D5, 0x3A1FD527, loginEncryptionType.Client_1_25, gameEncryptionType.SameAsLogin),
And here is the 1.25 encryption function:Once you get the server recognizing the client encryption(or just remove the encryption from the client) you will still need to change several packets before the client can actually connect and move around the world.Code: Select all
case loginEncryptionType.Client_1_25: { uint table1 = 0, table2 = 0; for (int i = 0; i < length; i++) { buffer[i] = (byte)(buffer[i] ^ m_CurrentKey1); table1 = m_CurrentKey1; table2 = m_CurrentKey2; /* simple rotary crypt */ m_CurrentKey1 = ((table1 >> 1) | (table2 << 31)) ^ m_EncryptionKey.Key2; m_CurrentKey2 = ((table2 >> 1) | (table1 << 31)) ^ m_EncryptionKey.Key1; } break; }
Firstly the login, character creation and enterworld packets must be modified for the client to even get to the server list and then into the game. For this purpose I recommend you get your hands on some old UO packets references, the source code for some old versions of UOX3 have the info you need, I think some web pages do too, a good way here is to get a packet monitoring software like UOLog and see what packets cause the client to hang and then fixing them till it just works. Remember that if the UO client gets a packet it doesnt recognize(either unexpected ID or unexpected length) it will simply stop receiving any more packets and just hang there without doing anything.
You will also have to remove some packets from runuo, like the advanced particle effects, buff system packets and etc. I dont remember the specifics for 1.25 as I went with 1.25.37g as I mentioned earlier, there are some differences between them but much fewer than from them to the most recent versions.
If something I just wrote is not clear enough or you have any more questions feel free to contact me again.
Hail Dekaru!
I'm currently trying to get any emulator to work with the original release UO client (1.25) and my travels brought me to a thread you posted back in 2009 saying you had gotten some early clients to work with RunUO. Sadly no one indulged you enough to get any useful information posted and I couldn't find any shard websites that were related to your name.
Can you share any information you have that may help me connect a version 1.25 client to a RunUO server? Or perhaps how I could patch the client encryption on the 1.25 client? I have some old emulators (oldest I have in my possession is Graysvr 37o, which wants 1.25.37 or later to connect) that might work if I can patch the encryption.
Thanks for your time,
uuang.