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, its 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 leaders id)
Note: Client message
Subsubcommand 9: Decline join party invitation (4 bytes)
BYTE[4] id (party leaders 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
|