Home Page

About Me

Projects

Projects - Jerrith UO Packets Guide

Back when I was involved in the Ultima Online Server Emulator community, I created the following documentation to help myself and others with the implementation of new features. Basically, by listening to the actual data that was sent between the servers and the client, I was able to figure out this information about how the game actually worked.

The last version of this document that I released is available here: JUOPackets.doc

It has since been taken and been updated and maintained by others, and is available elsewhere on the web.

Here's a sample entry from the above version:

0xBF Packet
Last Modified on Friday, 19-May-2000  
The 0xBF packet starts off with a cmd byte, followed by two bytes for the length.  After that is a two byte value which
is a subcmd, and the message varies after that.

General Info (5 bytes, plus specific message) 
•	BYTE cmd 
•	BYTE[2] len
•	BYTE[2] subcmd
•	BYTE[len-5] submessage
Note: Client & Server message

Subcommand 1: Initialize Fast Walk Prevention (24 bytes (for 29 total))
•	BYTE[4] key1
•	BYTE[4] key2
•	BYTE[4] key3
•	BYTE[4] key4
•	BYTE[4] key5
•	BYTE[4] key6
Note: Server Message
Note: This sets up stack on the client and whenever it moves, it takes the top value from this stack and uses it.  (key1
starts at the top, key6 at the bottom).

Subcommand 2: Add key to Fast Walk Stack (4 bytes (for 9 total))
•	BYTE[4] newkey
Note: Server Message
Note: This key is added to the top of the stack.  In other words, it’s the one that will be used next.  Basically, the other
5 only get used when the client is sending moves faster than the server is responding.

Subcommand 5: Unknown (8 bytes (for 13 total))
•	BYTE[4] unknown (00 00 03 20)
•	BYTE[4] unknown (00 00 00 05)
Note: Client Message

Subcommand 6: Party System (YES! Subsubcommands)
•	BYTE subsubcommand #  

Subsubcommand 1: Add a party member (4 bytes)
•	BYTE[4] id (if 0, a targeting cursor appears)
Note: Client Message

Subsubcommand 1: Add party member(s) (1+ numMembers*4)
•	BYTE numMembers (total number of members in the party)
Then, for each member in numMembers:
•	BYTE[4] id 
Note: Server Message

Subsubcommand 2: Remove a party member (4 bytes)
•	BYTE[4] id (if 0, a targeting cursor appears)
Note: Client message

Subsubcommand 2: Remove a party member (? Bytes)
•	BYTE numMembers (total number of members in the new party)
•	BYTE[4] idofPlayerRemoved
Then, for each member in numMembers:
•	BYTE[4] id 
Note: Server message

Subsubcommand 3: Tell party member a message (Variable # of bytes)
•	BYTE[4] id (of target, from client, of source, from server)
•	BYTE[n][2] Null terminated Unicode message.
Note: Client & Server Message

Subsubcommand 4: Tell full party a message (Variable # of bytes)
•	BYTE[n][2] Null terminated Unicode message.
Note: Client Message.

Subsubcommand 4: Tell full party a message (Variable # of bytes)
•	BYTE[4] id (of source)
•	BYTE[n][2] Null terminated Unicode message.
Note: Server Message

Subsubcommand 6: Party Can Loot Me?  (1 byte)
•	BYTE canloot (0=no, 1=yes)
Note: Client message

Subsubcommand 8: Accept join party invitation (4 bytes)
•	BYTE[4] id (party leader’s id)
Note: Client message

Subsubcommand 9: Decline join party invitation (4 bytes)
•	BYTE[4] id (party leader’s id)
Note: Client message

Subcommand 8: Set cursor hue (1 byte (for 6 total))
•	BYTE hue  (0 = Felucca, unhued.  1 = Trammel, hued gold)
Note: Server Message

Subcommand 11: Client Language (3 bytes (for 8 total))	//0x08
•	BYTE[3] language  (ENU, for English) 
Note: Client Message

Subcommand 12: Closed Status Gump (4 bytes (for 8 total))
•	BYTE[4] id (character id)
Note: Server Message