Skip to content

lotr2_net_msg_join - DirectPlay join payloads#

Header: lotr2_net_msg_join.h

Summary#

Custom app opcode 1 carries a joining client's DirectPlay id, 32-byte display name, and a join-state field to the host. Opcode 2 carries the host's response: host id/name plus the host slot, assigned client slot, and session setup state.

  • Confidence: likely
  • Transport: payload inside lotr2_net_msg
  • Endianness: little-endian for multi-byte fields

Opcode 1 Request#

Offset Field Symbol Description
+0x00 player_id lotr2_net_local_player_id Sender DirectPlay player id.
+0x04 player_name lotr2_game_config_block 32-byte short player name buffer (within 0x41c config block).
+0x24 join_flags lotr2_net_join_flags Join capability / host flag field.

Opcode 2 Reply#

Offset Field Symbol Description
+0x00 host_player_id lotr2_net_local_player_id Host DirectPlay player id.
+0x04 host_name lotr2_game_config_block 32-byte host short name buffer.
+0x24 local_slot lotr2_game_local_player_slot Host local slot.
+0x28 assigned_slot lotr2_net_assigned_slot Slot assigned to joining peer.
+0x2c session_state lotr2_net_session_setup_state Session setup state field.

Evidence#

Claim Source
Opcode 1 payload is 0x28 bytes lotr2_net_pack_local_id writes 4 + 0x20 + 4 bytes.
Opcode 1 parse reads same fields FUN_00449eaf reads 4 + 0x20 + 4 bytes.
Opcode 2 payload is 0x30 bytes lotr2_net_pack_join_data writes 4 + 0x20 + 4 + 4 + 4 bytes.
Opcode 2 parse completes handshake lotr2_net_on_join_handshake reads those fields and sets lotr2_net_handshake_done.

Compatibility Notes#

  • The strings are copied as fixed 32-byte buffers; do not add a length prefix.
  • The payload is still wrapped by the 4-byte app-message header and checksum.
  • Opcode 1 and 2 are reliable app messages and are triple-sent by stock code.

Open Questions#

  • Exact semantic meaning of lotr2_net_join_flags and lotr2_net_session_setup_state.
  • Confirm name termination rules from an on-wire capture.