Repository navigation
Messages Pregame
Every message in the Pregame area: its opcode, direction, how far it is verified, and its fields.
Note
Generated from the message declarations at bootstrap 48bb36d by Tools/NexusTomorrow.ProtocolReference. Don't edit it by hand: change the declaration's documentation and regenerate.
| Opcode | Direction | Verified to |
|---|---|---|
0x0015 |
server to client | unverified |
| Field | Bits | Encoding |
|---|---|---|
Unknown0 |
5 | unsigned |
Unknown1 |
32 | unsigned |
A level that limits the character creation options the client offers.
| Opcode | Direction | Verified to |
|---|---|---|
0x0036 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Level |
32 | unsigned | The level. Of the creation options that need no entitlement, the client offers only those whose starting level is at most this, or at most 1 when it is 0. |
A server message encrypted with the login connection's key.
| Opcode | Direction | Verified to |
|---|---|---|
0x0076 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Payload |
varies | byte block, 32-bit length, the length counts itself | One whole message, which begins with its own 32-bit length (counting those four bytes). The length travels in clear and the bytes after it are encrypted with the login connection's key; the client decrypts them and handles the result as that message. |
The client picks the key by opcode, not by the connection the envelope arrives on. Every server message but a ServerHello on the login connection arrives inside this or WorldEnvelope (0x03DC); the client drops any other message that arrives bare.
Moves the player into a world: on character select, the answer to CharacterSelect; in the world, a change of world.
| Opcode | Direction | Verified to |
|---|---|---|
0x00AD |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
WorldId |
15 | unsigned | The world, as an id in the client's World table. |
Position.X |
32 | float | A point in the world. The client hands it to the world it loads on every update, until it replaces it with a point of its own. |
Position.Y |
32 | float | |
Position.Z |
32 | float | |
Unknown2 |
32 | float | The client gives this value no meaning. |
Unknown3 |
32 | float | The client gives this value no meaning. |
On character select the client takes it only while a selection is pending, shows the world's loading screen and loads the world.
The answer to CharacterCreate. On success the client selects the new character.
| Opcode | Direction | Verified to |
|---|---|---|
0x00DC |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
CharacterId |
64 | unsigned | The new character's id, which the client then selects. |
Unknown1 |
32 | unsigned | The client gives this value no meaning. |
Result |
6 | unsigned | The result. 3 means the character was created. Any other value is a failure the client hands to its interface, which has a message of its own for 6 (the name is taken), 9 (the account is full), 10 (the name is not allowed), 11 (refused because of the character's faction) and 44 (a character is online), and a general message for the rest. |
Taken only while a creation is pending.
The answer to CharacterDelete.
| Opcode | Direction | Verified to |
|---|---|---|
0x00E6 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Result |
6 | unsigned | The result. 0 means the character was deleted: the client removes it from its list. The interface has a message of its own for 2 (the character leads a guild) and 42 (the character is online), and a general message for the rest. |
Count |
32 | unsigned | A number the interface puts into result 2's message; it reads it for no other result. |
Taken only while a deletion is pending.
Marks one listed character disabled or enabled on character select.
| Opcode | Direction | Verified to |
|---|---|---|
0x00E7 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
CharacterId |
64 | unsigned | The character, as listed in the character list (0x0117). |
Disabled |
1 | unsigned | Whether the character is disabled; the client keeps the flag with the character and shows it. |
Taken in any state; a character the list does not hold is ignored.
The account's deleted characters, kept for the character-select interface to look up.
| Opcode | Direction | Verified to |
|---|---|---|
0x0116 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Characters count |
32 | unsigned | |
Characters |
array, counted by Characters count
|
The deleted characters. | |
Characters[].Unknown0 |
64 | unsigned | The client gives this value no meaning. |
Characters[].Unknown1 |
32 | unsigned | The client gives this value no meaning. |
Characters[].Name |
varies | wide string | The character's name. |
Characters[].Level |
32 | unsigned | The character's level. |
Characters[].ClassId |
14 | unsigned | The character's class id. |
Characters[].RaceId |
14 | unsigned | The character's race id. |
Characters[].GenderId |
2 | unsigned | The character's gender id. |
Characters[].FactionId |
14 | unsigned | The character's faction id. |
Characters[].PathId |
3 | unsigned | The character's path id. |
Characters[].WorldId |
15 | unsigned | The world the character was in. |
Characters[].WorldZoneId |
15 | unsigned | The zone the character was in, as a world zone id. |
Characters[].Unknown11 |
32 | float | The client gives this value no meaning. It hands it to its interface as the character's purge date. |
Taken while character select is active; the client replaces the list it holds and raises nothing. No interface script looks the list up.
The account's characters and its character creation options, the answer to CharacterListRequest. The client replaces its list with this one.
| Opcode | Direction | Verified to |
|---|---|---|
0x0117 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
ServerTime |
64 | unsigned | The server's clock, as a Windows file time. The client keeps its difference from its own clock. |
Characters count |
32 | unsigned | |
Characters |
array, counted by Characters count
|
The account's characters. | |
Characters[].CharacterId |
64 | unsigned | The character's id, which the client sends back to select, delete or rename it. |
Characters[].Name |
varies | wide string | The character's name. |
Characters[].GenderId |
2 | unsigned | The character's gender id. |
Characters[].RaceId |
5 | unsigned | The character's race id. |
Characters[].ClassId |
5 | unsigned | The character's class id. |
Characters[].FactionId |
32 | unsigned | The character's faction id. |
Characters[].Level |
32 | unsigned | The character's level. |
Characters[].PlainItems count |
32 | unsigned | |
Characters[].PlainItems |
array, counted by Characters[].PlainItems count
|
Items that set a slot's look only: the client reads each item's slot and display id here, and neither colour field. | |
Characters[].PlainItems[].Slot |
7 | unsigned | The item slot, 0 to 71. |
Characters[].PlainItems[].DisplayId |
15 | unsigned | The look to show in the slot, as a display id. |
Characters[].PlainItems[].ColorSetId |
14 | unsigned | A colour set, as an id in the ItemColorSet table, used when Color is 0. |
Characters[].PlainItems[].Color |
32 | unsigned | The slot's colour, with the top bit set and three 10-bit channels below it; 0 means the colour comes from ColorSetId. |
Characters[].ColoredItems count |
32 | unsigned | |
Characters[].ColoredItems |
array, counted by Characters[].ColoredItems count
|
Items that set a slot's look and colour, applied after PlainItems and over it for the same slot. |
|
Characters[].ColoredItems[].Slot |
7 | unsigned | The item slot, 0 to 71. |
Characters[].ColoredItems[].DisplayId |
15 | unsigned | The look to show in the slot, as a display id. |
Characters[].ColoredItems[].ColorSetId |
14 | unsigned | A colour set, as an id in the ItemColorSet table, used when Color is 0. |
Characters[].ColoredItems[].Color |
32 | unsigned | The slot's colour, with the top bit set and three 10-bit channels below it; 0 means the colour comes from ColorSetId. |
Characters[].WorldId |
15 | unsigned | The world the character is in. |
Characters[].ZoneId |
15 | unsigned | A zone id the client uses, with WorldId and Position, to pick the zone whose name it hands to its interface. |
Characters[].Unknown11 |
14 | unsigned | The client gives this value no meaning. |
Characters[].Position.X |
32 | float | A point the client uses, x and z only, with WorldId and ZoneId, to pick the zone whose name it hands to its interface. |
Characters[].Position.Y |
32 | float | |
Characters[].Position.Z |
32 | float | |
Characters[].Unknown13 |
32 | float | The client gives this value no meaning. |
Characters[].Unknown14 |
32 | float | The client gives this value no meaning. |
Characters[].PathId |
3 | unsigned | The character's path id. |
Characters[].Disabled |
1 | unsigned | Whether the character is disabled; CharacterDisabled updates it. |
Characters[].RequiresRename |
1 | unsigned | Whether the character must be renamed; a successful rename clears it. |
Characters[].CostumeMask |
32 | unsigned | Which costume entries the character shows: bit i set shows entry i of CostumeItems, clear empties its slot. Entries 0 to 5 are item slots 1 to 6 and entry 6 is slot 20. |
Characters[].CostumeCount |
4 | unsigned; counts Characters[].CostumeItems, Characters[].CostumeColors
|
How many costume entries follow; the client uses at most seven. |
Characters[].CostumeItems |
array, counted by Characters[].CostumeCount
|
The costume's items, one per entry, as ids in the Item2 table. | |
Characters[].CostumeItems[] |
32 | unsigned | |
Characters[].CostumeColors |
array, counted by Characters[].CostumeCount
|
A colour per costume entry, laid over its item's own colour. | |
Characters[].CostumeColors[] |
32 | unsigned | |
Characters[].Bones count |
32 | unsigned | |
Characters[].Bones |
array, counted by Characters[].Bones count
|
Values the client applies to the character's model. | |
Characters[].Bones[] |
32 | float | |
Characters[].LastLoggedOutDays |
32 | float | Days relative to when the list arrives, negative in the past; 0 hands nothing over. The client hands it to its interface as the character's last logout, and the interface first selects the character with the largest value. |
OfferedCreationIds count |
32 | unsigned | |
OfferedCreationIds |
array, counted by OfferedCreationIds count
|
Character creation options to add to those the client considers, as ids in the CharacterCreation table. | |
OfferedCreationIds[] |
32 | unsigned | |
WithheldCreationIds count |
32 | unsigned | |
WithheldCreationIds |
array, counted by WithheldCreationIds count
|
Character creation options to withhold, as ids in the CharacterCreation table. | |
WithheldCreationIds[] |
32 | unsigned | |
RealmId |
14 | unsigned | A realm id; the client takes it as its current realm when a character is selected. |
Removal |
the fields below | A character the client hands to its interface with RemovalTime, when both parts are not 0 and the character is listed. |
|
Removal.Unknown0 |
14 | unsigned | The client gives this value no meaning. The client uses the pair only when this is not 0. |
Removal.CharacterId |
64 | unsigned | The character, as listed in Characters. |
RemovalTime |
32 | unsigned | Milliseconds left before the character in Removal is removed. |
Reservations |
32 | unsigned | The number of character reservations, which the client hands to its interface. |
Unknown8 |
32 | unsigned | The client gives this value no meaning. It hands it to its interface with the list. |
Unknown9 |
32 | unsigned | The client gives this value no meaning. |
FactionRestriction |
14 | unsigned | The faction the interface shows the account locked to: 166 Dominion, 167 Exile, 0 none. The client hands it to its interface, which applies it only on a realm that keeps characters to one faction. |
FreeLevel50 |
1 | unsigned | Whether the account may create characters at level 50 for free: it gates the interface's count of those and lets character creation skip an entitlement check for one type of creation option. |
Taken while character select is active.
The answer to CharacterRename.
| Opcode | Direction | Verified to |
|---|---|---|
0x014B |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Result |
6 | unsigned | The result. 18 means the character was renamed: the client applies the new name and clears the character's rename-required mark. The interface has a message of its own for 14 (an internal error), 15 (the name is not allowed), 16 (the name is taken), 17 (no rename is available for the character) and 43 (the character is online), and a general message for the rest. |
CharacterId |
64 | unsigned | The character, as listed in the character list (0x0117). |
Name |
varies | wide string | The character's new name, applied when the result is 18. |
Taken only while a rename is pending. The client also reports 15 itself, without sending, for a name that fails its own check.
Tells the client a CharacterSelect failed; the client returns to idle and passes the reason to its interface.
| Opcode | Direction | Verified to |
|---|---|---|
0x0162 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Reason |
3 | unsigned | Why the selection failed. The interface has a message of its own for 1 (the character must be renamed first), 3 (the character is disabled) and 4 (another of the account's characters is still in the world), and a general message for 2 and any other value. |
Taken only while a selection is pending.
The account's subscription state.
| Opcode | Direction | Verified to |
|---|---|---|
0x033D |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
TransferFlags |
32 | unsigned | Bit 0 set makes the interface offer a free realm transfer; the client reads no other bit. |
Expired |
1 | unsigned | Whether the subscription has expired. While it has, the client refuses to create, delete, rename or select characters and to ask for transfer destinations. |
GameTimeHours |
32 | float | The game time left, in hours. |
The server ends the player's session.
| Opcode | Direction | Verified to |
|---|---|---|
0x036A |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Reason |
5 | unsigned | Why the session ended: 6, 7, 8, 12, 15, 16, 19 and 20 each have a message of their own, any other value a general message. |
Taken on character select, realm select and in the world: the client drops its connections and shows the reason's message.
The login server hands the client to a realm's world server: where to connect, the session key, and the realm's details.
| Opcode | Direction | Verified to |
|---|---|---|
0x03DB |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
WorldAddress |
32 | unsigned | The world server's IPv4 address as a host-order integer: a.b.c.d is (a << 24) | (b << 16) | (c << 8) | d. |
WorldPort |
16 | unsigned | The world server's TCP port. |
SessionKey |
the fields below | The session key, in the GUID layout. The client sends it back in WorldHello (0x058F) and derives the world connection's key from it. |
|
SessionKey.Data1 |
32 | signed | The first 32 bits. |
SessionKey.Data2 |
16 | signed | The next 16 bits. |
SessionKey.Data3 |
16 | signed | The 16 bits after those. |
SessionKey.Data4[0] |
8 | unsigned | The last eight bytes, in order. |
SessionKey.Data4[1] |
8 | unsigned | |
SessionKey.Data4[2] |
8 | unsigned | |
SessionKey.Data4[3] |
8 | unsigned | |
SessionKey.Data4[4] |
8 | unsigned | |
SessionKey.Data4[5] |
8 | unsigned | |
SessionKey.Data4[6] |
8 | unsigned | |
SessionKey.Data4[7] |
8 | unsigned | |
Echo |
32 | unsigned | A value the client keeps and sends back unchanged as the first field of WorldHello (0x058F). |
RealmName |
varies | wide string | The realm's name, shown to the player and used to name the client's settings file for the realm. |
RealmFlags |
32 | unsigned | The realm's flags. Bit 4 set means the realm keeps characters to one faction; the client tests no other bit. |
PvpType |
2 | unsigned | The realm's PvP type: 0 PvE, 1 PvP. The interface treats any other value as PvE. |
NoteTextId |
21 | unsigned | A note about the realm, as an id in the client's text table; 0 means none. |
Taken only on the login connection after LoginAccepted. The client opens a connection to the world server, starts it under the build's fixed key, and waits there for ServerHello; the login connection stays open.
A server message encrypted with the world connection's key.
| Opcode | Direction | Verified to |
|---|---|---|
0x03DC |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Payload |
varies | byte block, 32-bit length, the length counts itself | One whole message, which begins with its own 32-bit length (counting those four bytes). The length travels in clear and the bytes after it are encrypted with the world connection's key; the client decrypts them and handles the result as that message. |
The client picks the key by opcode, not by the connection the envelope arrives on, and drops a server message that arrives bare on the world connection.
A realm-wide announcement, taken on every screen.
| Opcode | Direction | Verified to |
|---|---|---|
0x03E1 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Tier |
2 | unsigned | The announcement's tier. On character and realm select the client passes it to its interface with the text; in the world, 0 and 1 each raise an announcement of their own, and 2 and 3 do not. |
Text |
varies | wide string | The announcement's text. |
The login server accepts the login.
| Opcode | Direction | Verified to |
|---|---|---|
0x0591 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
DroppedForLag |
32 | unsigned | Bit 0 set means the player's previous session was dropped for lag, which the login screen can show. The client ignores the other bits. |
Taken only on the login connection while the client waits for an answer to LoginRequest. The client then waits for RealmHandoff.
Ends the player's session in the world.
| Opcode | Direction | Verified to |
|---|---|---|
0x0594 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
ToCharacterSelect |
1 | unsigned | With an ordinary Reason, true returns the player to character select on the same connection and false shows a disconnect message. |
Reason |
5 | unsigned | Why the session ended. 6, 7, 8, 12, 15, 16, 19 and 20 always end in a disconnect message, whatever ToCharacterSelect says; with any other value ToCharacterSelect decides. |
Character select and realm select drop it.
The login server refuses the login.
| Opcode | Direction | Verified to |
|---|---|---|
0x063D |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Result |
32 | unsigned | Why the login was refused. The client has a message of its own for 0 to 13, 16 to 20 and 22 to 27, and a general message for 14, 15 and anything above 27; for 21 it builds its message from Duration. |
ResultArgument |
32 | unsigned | A number the client puts into the message it shows, for every result but 21. |
Duration |
32 | float | Read only when Result is 21: the client multiplies it by 24 and shows the product, to one decimal place, in that result's message. |
Taken on the login connection in any state until the client has greeted the world server. The client shows a message chosen by Result, closes its connections and returns to the login screen.
Tells the client a copy of a character to the test realm was queued.
| Opcode | Direction | Verified to |
|---|---|---|
0x06EA |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
| (none) | 0 |
On character select the client passes it to its interface.
Tells character select the login queue is done.
| Opcode | Direction | Verified to |
|---|---|---|
0x0715 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
| (none) | 0 |
Taken in any state; the client passes it to its interface.
The login queue's status, which the client passes to the character-select interface.
| Opcode | Direction | Verified to |
|---|---|---|
0x0717 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Position |
32 | unsigned | The player's place in the queue, shown as a number. |
WaitSeconds |
32 | unsigned | The expected wait, in seconds. |
ShowNotice |
1 | unsigned | Whether the interface shows an extra notice in its queue window. |
Taken while character select is active; realm select drops it.
The realm's current notices, each in several languages.
| Opcode | Direction | Verified to |
|---|---|---|
0x0763 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Notices count |
32 | unsigned | |
Notices |
array, counted by Notices count
|
The notices. The client replaces the ones it holds with these. | |
Notices[].Unknown0 |
32 | unsigned | The client gives this value no meaning. |
Notices[].Translations count |
8 | unsigned | |
Notices[].Translations |
array, counted by Notices[].Translations count
|
The notice's text per language: the client shows the string at its language id less one (the id its Language table gives the language), and the first string when that one is empty. It does not check that index against the notice's own string count, and the ids are not consecutive, so every notice carries strings through the highest language id less one, with any string at an index no language uses. | |
Notices[].Translations[] |
varies | wide string |
Arrives inside an envelope; the client takes it in any state.
The outcome of a realm transfer, which the client hands to the character-select screen's interface.
| Opcode | Direction | Verified to |
|---|---|---|
0x0765 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Result |
6 | unsigned | The result. 21 means the transfer went through, and the interface treats every other value as an error. It has a message of its own for 20 to 33, 47, 48, 51 and 55. |
The server's answer to a RealmChoice of another realm: its world server, the session key and the realm's details.
| Opcode | Direction | Verified to |
|---|---|---|
0x07A1 |
server to client | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Unknown0 |
32 | unsigned | The client gives this value no meaning. |
SessionKey |
the fields below | The session key, in the GUID layout. The client sends it back in WorldHello on the new connection and derives that connection's key from it. |
|
SessionKey.Data1 |
32 | signed | The first 32 bits. |
SessionKey.Data2 |
16 | signed | The next 16 bits. |
SessionKey.Data3 |
16 | signed | The 16 bits after those. |
SessionKey.Data4[0] |
8 | unsigned | The last eight bytes, in order. |
SessionKey.Data4[1] |
8 | unsigned | |
SessionKey.Data4[2] |
8 | unsigned | |
SessionKey.Data4[3] |
8 | unsigned | |
SessionKey.Data4[4] |
8 | unsigned | |
SessionKey.Data4[5] |
8 | unsigned | |
SessionKey.Data4[6] |
8 | unsigned | |
SessionKey.Data4[7] |
8 | unsigned | |
Gateway |
the fields below | The realm's world server. | |
Gateway.Address |
32 | unsigned | The IPv4 address as a host-order integer: a.b.c.d is (a << 24) | (b << 16) | (c << 8) | d. |
Gateway.Port |
16 | unsigned | The TCP port. |
Unknown3 |
1 | unsigned | The client gives this value no meaning. |
RealmName |
varies | wide string | The realm's name; the client keeps it and names its settings file for the realm with it. |
RealmFlags |
32 | unsigned | The realm's flags. Bit 4 set means the realm keeps characters to one faction; the client tests no other bit. |
PvpType |
2 | unsigned | The realm's PvP type: 0 PvE, 1 PvP. The interface treats any other value as PvE. |
NoteTextId |
21 | unsigned | A note about the realm, as an id in the client's text table; 0 means none. |
Taken on the realm-select connection. The client connects to Gateway and waits there for ServerHello.
Keeps the connection alive on character and realm select.
| Opcode | Direction | Verified to |
|---|---|---|
0x0241 |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
| (none) | 0 |
The client sends it at most about once a minute (the interval is a row of its game formula table, 60 seconds by default).
A client message encrypted for the connection it is sent on. The client sends every message inside one.
| Opcode | Direction | Verified to |
|---|---|---|
0x0244 |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Payload |
varies | byte block, 32-bit length, the length counts itself | One whole message, which begins with its own 32-bit length (counting those four bytes). The length travels in clear and the bytes after it are encrypted with the key of the connection it is sent on. |
The message inside is either a TaggedMessage (0x038C), which carries another message under a tag, or a message on its own with no tag. The client sends tagged messages before the world as well as in it. Those it sends on their own include LoginRequest (0x0592), WorldHello (0x058F), CharacterListRequest (0x07E0), CharacterSelect (0x07DD), CharacterDelete (0x0352), PregameKeepAlive (0x0241) and NestedMessage (0x025C).
Creates a character from a character creation option, a name and the player's choices.
| Opcode | Direction | Verified to |
|---|---|---|
0x025B |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
CreationId |
32 | unsigned | The character creation option, as an id in the CharacterCreation table. |
Name |
varies | wide string | The new character's name. |
Path |
3 | unsigned | The character's path: 0 Soldier, 1 Settler, 2 Scientist, 3 Explorer. |
LookCount |
32 | unsigned; counts LookIds, LookValues
|
How many look entries follow. |
LookIds |
array, counted by LookCount
|
The look options the player set, by the ids the client keys its look options by. | |
LookIds[] |
32 | unsigned | |
LookValues |
array, counted by LookCount
|
The value chosen for each option in LookIds. |
|
LookValues[] |
32 | unsigned | |
Bones count |
32 | unsigned | |
Bones |
array, counted by Bones count
|
Values the client's model produces from the player's bone settings. | |
Bones[] |
32 | float |
Sent inside a NestedMessage, itself inside a ClientEnvelope; the client then waits for CharacterCreateResult.
One already-encoded client message, unencrypted, sent only inside a ClientEnvelope.
| Opcode | Direction | Verified to |
|---|---|---|
0x025C |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Payload |
varies | byte block, 32-bit length, the length counts itself | One whole encoded message, which begins with its own 32-bit length (counting those four bytes). |
The client uses it only for character creation (0x025B).
Deletes one listed character.
| Opcode | Direction | Verified to |
|---|---|---|
0x0352 |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
CharacterId |
64 | unsigned | The character, as listed in the character list (0x0117). |
The client then waits for the reply (CharacterDeleteResult).
Asks for the realms a character could transfer to.
| Opcode | Direction | Verified to |
|---|---|---|
0x03EE |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Paid |
1 | unsigned | True when the player asks from the interface's paid transfer, false from its free transfer. |
The client sends it only while the account's subscription has not expired (SubscriptionState); the answer is TransferDestinationList.
The client's greeting on a world connection, its answer to ServerHello there.
| Opcode | Direction | Verified to |
|---|---|---|
0x058F |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Echo |
32 | unsigned | The value RealmHandoff (0x03DB) gave the client to send back, unchanged. |
SessionKey |
the fields below | The session key the client was handed, sent back unchanged, in the GUID layout. | |
SessionKey.Data1 |
32 | signed | The first 32 bits. |
SessionKey.Data2 |
16 | signed | The next 16 bits. |
SessionKey.Data3 |
16 | signed | The 16 bits after those. |
SessionKey.Data4[0] |
8 | unsigned | The last eight bytes, in order. |
SessionKey.Data4[1] |
8 | unsigned | |
SessionKey.Data4[2] |
8 | unsigned | |
SessionKey.Data4[3] |
8 | unsigned | |
SessionKey.Data4[4] |
8 | unsigned | |
SessionKey.Data4[5] |
8 | unsigned | |
SessionKey.Data4[6] |
8 | unsigned | |
SessionKey.Data4[7] |
8 | unsigned | |
Unknown2 |
64 | unsigned | The client gives this value no meaning. It always sends 0. |
AccountName |
varies | wide string | The account name the login server accepted. |
Unknown4 |
32 | unsigned | The client gives this value no meaning. It always sends 3. |
The client sends it under the connection's current key, and right after sending it switches the connection to a key derived from SessionKey.
The client's login request on the login connection, its answer to a valid ServerHello: its build, the account and the game token the STS issued, and a description of the client and its machine.
| Opcode | Direction | Verified to |
|---|---|---|
0x0592 |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Build |
32 | unsigned | The client's build, 16042. |
Fingerprint |
64 | unsigned | A fingerprint of the client's install: a fixed seed folded, byte by byte, over the SHA-1 digests of the running executable and of its patch index file. The same install sends the same value on every login. |
AccountName |
varies | terminated wide string | The account name the player logged in with, as typed. At most 251 characters. |
StsUserId |
the fields below | The user id the STS returned when the login finished, parsed from its text form. | |
StsUserId.Data1 |
32 | signed | The first 32 bits. |
StsUserId.Data2 |
16 | signed | The next 16 bits. |
StsUserId.Data3 |
16 | signed | The 16 bits after those. |
StsUserId.Data4[0] |
8 | unsigned | The last eight bytes, in order. |
StsUserId.Data4[1] |
8 | unsigned | |
StsUserId.Data4[2] |
8 | unsigned | |
StsUserId.Data4[3] |
8 | unsigned | |
StsUserId.Data4[4] |
8 | unsigned | |
StsUserId.Data4[5] |
8 | unsigned | |
StsUserId.Data4[6] |
8 | unsigned | |
StsUserId.Data4[7] |
8 | unsigned | |
GameToken |
the fields below | The game token the STS issued for this login, parsed from its text form. | |
GameToken.Data1 |
32 | signed | The first 32 bits. |
GameToken.Data2 |
16 | signed | The next 16 bits. |
GameToken.Data3 |
16 | signed | The 16 bits after those. |
GameToken.Data4[0] |
8 | unsigned | The last eight bytes, in order. |
GameToken.Data4[1] |
8 | unsigned | |
GameToken.Data4[2] |
8 | unsigned | |
GameToken.Data4[3] |
8 | unsigned | |
GameToken.Data4[4] |
8 | unsigned | |
GameToken.Data4[5] |
8 | unsigned | |
GameToken.Data4[6] |
8 | unsigned | |
GameToken.Data4[7] |
8 | unsigned | |
ClientAddress |
32 | unsigned | The client's own IPv4 address on its STS connection, as its socket reports the local end, as a host-order integer: a.b.c.d is (a << 24) | (b << 16) | (c << 8) | d. |
LanguageId |
32 | unsigned | The client's interface language, as an id in the client's Language table. |
GameMode |
32 | unsigned | The client's game mode, set when it starts: 0 by default, and any value of 2 or more becomes 0. |
Unknown8 |
32 | unsigned | The client gives this value no meaning. It always sends 0. |
Machine |
the fields below | A description of the client's machine. | |
Machine.Processor |
the fields below | The processor. | |
Machine.Processor.Manufacturer |
varies | wide string | The processor's manufacturer. |
Machine.Processor.Name |
varies | wide string | The processor's name. |
Machine.Processor.Description |
varies | wide string | The processor's description. |
Machine.Processor.Family |
32 | unsigned | The processor's family code. |
Machine.Processor.Level |
32 | unsigned | The processor's level. |
Machine.Processor.Revision |
32 | unsigned | The processor's revision; 0 when Windows gives none. |
Machine.Processor.ClockMhz |
32 | unsigned | The processor's maximum clock speed, in MHz. |
Machine.Processor.Cores |
32 | unsigned | The processor's core count; its logical processor count when Windows reports no cores. |
Machine.MemoryMb |
32 | unsigned | The machine's physical memory, in MiB, rounded up. |
Machine.Adapter |
the fields below | The default display adapter. | |
Machine.Adapter.Description |
varies | wide string | The adapter's description. |
Machine.Adapter.VendorId |
32 | unsigned | The adapter's vendor id. |
Machine.Adapter.DeviceId |
32 | unsigned | The adapter's device id. |
Machine.Adapter.SubsystemId |
32 | unsigned | The adapter's subsystem id. |
Machine.Adapter.Revision |
32 | unsigned | The adapter's revision. |
Machine.Adapter.MemoryMb |
32 | unsigned | The adapter's memory, in MiB. Windows' own figure stops at 4095. |
Machine.Architecture |
32 | unsigned | The processor architecture: 0x10000 plus a code, 1 for x86, 2 for x64, 3 for IA-64, 4 for ARM and 0 for any other. |
Machine.OsVersion |
32 | unsigned | The Windows version, as (major << 16) | minor. |
Machine.OsServicePack |
32 | unsigned | The Windows service pack, as (major << 16) | minor. |
Machine.OsEdition |
32 | unsigned | The Windows edition: the suite mask in bits 16 to 31, the product type in bits 8 to 15, and in bits 0 to 3 whether Windows is Server R2, Media Center, Starter and Tablet PC. |
RealmDataCenterId |
32 | unsigned | The realm data center the client was started for, as an id in the client's RealmDataCenter table. |
The client sends it once per login connection, inside a ClientEnvelope, only once it has an account name, and then waits for LoginAccepted or LoginDenied.
Asks to copy the current character to the test realm, from inside the world.
| Opcode | Direction | Verified to |
|---|---|---|
0x06E8 |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
| (none) | 0 |
Sent on the world connection, at most once every three seconds from the interface or without that limit from a chat command. The character-select version is 0x06E7, which carries a character id.
Renames one listed character.
| Opcode | Direction | Verified to |
|---|---|---|
0x0786 |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
CharacterId |
64 | unsigned | The character, as listed in the character list (0x0117). |
NewName |
varies | wide string | The new name. The client sends only names that pass its own check; a server checks it again. |
The client then waits for the reply (CharacterRenameResult).
Asks for the realm list when the player opens realm select from character select.
| Opcode | Direction | Verified to |
|---|---|---|
0x07A4 |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
| (none) | 0 |
Sent on the character-select connection, which realm select takes over.
Enters the world with one listed character.
| Opcode | Direction | Verified to |
|---|---|---|
0x07DD |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
CharacterId |
64 | unsigned | The character, as listed in the character list (0x0117). |
The client takes the realm id from the character list (0x0117) as its current realm, then waits for EnterWorld or the selection's failure (CharacterSelectFailed).
The player's realm choice on the realm-select screen.
| Opcode | Direction | Verified to |
|---|---|---|
0x07DF |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
RealmId |
32 | unsigned | The chosen realm's id from RealmList, or the current realm's when the player backs out of realm select. |
For the realm the client is already on, it carries on in character select without waiting; for another realm it waits for RealmRedirect.
Asks for the character list.
| Opcode | Direction | Verified to |
|---|---|---|
0x07E0 |
client to server | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
| (none) | 0 |
The client sends it each time it enters character select: after a world connection's greeting, on choosing the current realm or backing out of realm select, and after leaving the world.
The server's greeting, the first message on every connection.
| Opcode | Direction | Verified to |
|---|---|---|
0x0003 |
both ways | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Build |
32 | unsigned | The client's build. On the login connection the client ends the login unless this is 16042. |
RealmId |
32 | unsigned | The realm the connection serves. The client reads it only on the world connection the login opens, and keeps it as its current realm. |
Unknown2 |
32 | unsigned | The client gives this value no meaning. |
Unknown3 |
32 | unsigned | The client gives this value no meaning. |
Unknown4 |
64 | unsigned | The client gives this value no meaning. |
Unknown5 |
16 | unsigned | The client gives this value no meaning. |
Unknown6 |
5 | unsigned | The client gives this value no meaning. |
ProtocolVersion |
32 | unsigned | The protocol version. On the login connection the client ends the login unless this is 0x097998A0. |
Unknown8 |
32 | unsigned | The client gives this value no meaning. |
Unknown9 |
64 | unsigned | The client gives this value no meaning. |
Unknown10 |
32 | unsigned | The client gives this value no meaning. |
On the login connection the client checks Build and ProtocolVersion and answers with LoginRequest (0x0592). On a world connection it answers with WorldHello (0x058F) and then switches the connection to the key derived from the session key; of its fields it reads only RealmId, and only on the world connection the login opens. The client takes a bare greeting only on the login connection and drops one that arrives bare on any other. The client registers a writer for it as well.
| Opcode | Direction | Verified to |
|---|---|---|
0x003D |
both ways | unverified |
| Field | Bits | Encoding |
|---|---|---|
Unknown0 |
14 | unsigned |
Unknown1 |
32 | unsigned |
Unknown2 |
varies | wide string |
Unknown3 |
64 | unsigned |
The realm-select screen's list of realms, and the realm notices.
| Opcode | Direction | Verified to |
|---|---|---|
0x0761 |
both ways | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Unknown0 |
64 | unsigned | The client gives this value no meaning. |
Realms count |
32 | unsigned | |
Realms |
array, counted by Realms count
|
The realms. The client replaces its list with these. | |
Realms[].RealmId |
32 | unsigned | The realm's id; RealmChoice names a realm by it. |
Realms[].Name |
varies | wide string | The realm's name, shown to the player. |
Realms[].NoteTextId |
32 | unsigned | A note about the realm, as an id in the client's text table, shown to the player. |
Realms[].Flags |
32 | unsigned | The realm's flags. Bit 4 set means the realm keeps characters to one faction; bit 0 marks the realm the client picks when it selects one on its own. The client tests no other bit. |
Realms[].PvpType |
2 | unsigned | The realm's PvP type: 0 PvE, 1 PvP. The interface treats any other value as PvE. |
Realms[].Status |
3 | unsigned | The realm's status: 0 unknown, 1 offline, 2 down, 3 on standby, 4 up. The interface shows any other value as unknown. |
Realms[].Population |
3 | unsigned | The realm's population: 0 low, 1 medium, 2 high, 3 full. The interface labels no other value. |
Realms[].Unknown7 |
32 | unsigned | The client gives this value no meaning. |
Realms[].Unknown8[0] |
8 | unsigned | The client gives this value no meaning. |
Realms[].Unknown8[1] |
8 | unsigned | |
Realms[].Unknown8[2] |
8 | unsigned | |
Realms[].Unknown8[3] |
8 | unsigned | |
Realms[].Unknown8[4] |
8 | unsigned | |
Realms[].Unknown8[5] |
8 | unsigned | |
Realms[].Unknown8[6] |
8 | unsigned | |
Realms[].Unknown8[7] |
8 | unsigned | |
Realms[].Unknown8[8] |
8 | unsigned | |
Realms[].Unknown8[9] |
8 | unsigned | |
Realms[].Unknown8[10] |
8 | unsigned | |
Realms[].Unknown8[11] |
8 | unsigned | |
Realms[].Unknown8[12] |
8 | unsigned | |
Realms[].Unknown8[13] |
8 | unsigned | |
Realms[].Unknown8[14] |
8 | unsigned | |
Realms[].Unknown8[15] |
8 | unsigned | |
Realms[].Summary |
the fields below | Values the client shows with the realm. | |
Realms[].Summary.Unknown0 |
14 | unsigned | The client gives this value no meaning. |
Realms[].Summary.Count |
32 | unsigned | A count the client shows with the realm. |
Realms[].Summary.LastPlayed |
varies | wide string | A character name the client shows as last played on the realm, when present. |
Realms[].Summary.Unknown3 |
64 | unsigned | The client gives this value no meaning. |
Realms[].Unknown10 |
16 | unsigned | The client gives this value no meaning. |
Realms[].Unknown11 |
16 | unsigned | The client gives this value no meaning. |
Realms[].Unknown12 |
16 | unsigned | The client gives this value no meaning. |
Realms[].Unknown13 |
16 | unsigned | The client gives this value no meaning. |
Notices count |
32 | unsigned | |
Notices |
array, counted by Notices count
|
The realm notices. The client replaces the ones it holds with these. | |
Notices[].Unknown0 |
32 | unsigned | The client gives this value no meaning. |
Notices[].Translations count |
8 | unsigned | |
Notices[].Translations |
array, counted by Notices[].Translations count
|
The notice's text per language: the client shows the string at its language id less one (the id its Language table gives the language), and the first string when that one is empty. It does not check that index against the notice's own string count, and the ids are not consecutive, so every notice carries strings through the highest language id less one, with any string at an index no language uses. | |
Notices[].Translations[] |
varies | wide string |
The client registers a writer for it as well. When a client-side switch is set, the client selects a realm from the list on its own: the first whose Flags has bit 0 set, else the first.
The realms a character may transfer to, the answer to TransferDestinationsRequest.
| Opcode | Direction | Verified to |
|---|---|---|
0x0862 |
both ways | fields |
| Field | Bits | Encoding | Meaning |
|---|---|---|---|
Destinations count |
32 | unsigned | |
Destinations |
array, counted by Destinations count
|
The realms. | |
Destinations[].RealmId |
32 | unsigned | The realm's id; RealmChoice names a realm by it. |
Destinations[].Name |
varies | wide string | The realm's name, shown to the player. |
Destinations[].NoteTextId |
32 | unsigned | A note about the realm, as an id in the client's text table, shown to the player. |
Destinations[].Flags |
32 | unsigned | The realm's flags. Bit 4 set means the realm keeps characters to one faction; bit 0 marks the realm the client picks when it selects one on its own. The client tests no other bit. |
Destinations[].PvpType |
2 | unsigned | The realm's PvP type: 0 PvE, 1 PvP. The interface treats any other value as PvE. |
Destinations[].Status |
3 | unsigned | The realm's status: 0 unknown, 1 offline, 2 down, 3 on standby, 4 up. The interface shows any other value as unknown. |
Destinations[].Population |
3 | unsigned | The realm's population: 0 low, 1 medium, 2 high, 3 full. The interface labels no other value. |
Destinations[].Unknown7 |
32 | unsigned | The client gives this value no meaning. |
Destinations[].Unknown8[0] |
8 | unsigned | The client gives this value no meaning. |
Destinations[].Unknown8[1] |
8 | unsigned | |
Destinations[].Unknown8[2] |
8 | unsigned | |
Destinations[].Unknown8[3] |
8 | unsigned | |
Destinations[].Unknown8[4] |
8 | unsigned | |
Destinations[].Unknown8[5] |
8 | unsigned | |
Destinations[].Unknown8[6] |
8 | unsigned | |
Destinations[].Unknown8[7] |
8 | unsigned | |
Destinations[].Unknown8[8] |
8 | unsigned | |
Destinations[].Unknown8[9] |
8 | unsigned | |
Destinations[].Unknown8[10] |
8 | unsigned | |
Destinations[].Unknown8[11] |
8 | unsigned | |
Destinations[].Unknown8[12] |
8 | unsigned | |
Destinations[].Unknown8[13] |
8 | unsigned | |
Destinations[].Unknown8[14] |
8 | unsigned | |
Destinations[].Unknown8[15] |
8 | unsigned | |
Destinations[].Summary |
the fields below | Values the client shows with the realm. | |
Destinations[].Summary.Unknown0 |
14 | unsigned | The client gives this value no meaning. |
Destinations[].Summary.Count |
32 | unsigned | A count the client shows with the realm. |
Destinations[].Summary.LastPlayed |
varies | wide string | A character name the client shows as last played on the realm, when present. |
Destinations[].Summary.Unknown3 |
64 | unsigned | The client gives this value no meaning. |
Destinations[].Unknown10 |
16 | unsigned | The client gives this value no meaning. |
Destinations[].Unknown11 |
16 | unsigned | The client gives this value no meaning. |
Destinations[].Unknown12 |
16 | unsigned | The client gives this value no meaning. |
Destinations[].Unknown13 |
16 | unsigned | The client gives this value no meaning. |
Destinations[].IsFree |
1 | unsigned | Whether the transfer to this realm is free; the interface leaves such realms out of its paid-transfer list. |
The client registers a writer for it as well.
| Piece | Path |
|---|---|
| Message declarations | Source/NexusTomorrow.Network.Auth/Message/Model/ |
| Message declarations | Source/NexusTomorrow.Network.World/Message/Model/Pregame/ |
| Message declarations | Source/NexusTomorrow.Network/Message/Model/ |
| This page's generator | Tools/NexusTomorrow.ProtocolReference/ |
Guides
Explanation
Reference
Design
- Server core design
- Roadmap
- Codec design
- Message audit design
- Host design
- Gateway design
- Owners design
- Persistence design
- Command layer design
- Harness design
About this wiki