Every TCP frame exchanged between client and server begins with a 4-byte fixed header followed by a variable-length payload encoded as a Protocol Buffers message. UDP datagrams for movement share the same header layout but use a custom packed binary payload forDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/kenzz55/ue5-iocp-mmo-server/llms.txt
Use this file to discover all available pages before exploring further.
MoveBatchNotify rather than Protobuf, so the format is maximally compact inside a single datagram. PacketHandlerRegistry maps the 16-bit packetId directly to a handler via a flat 65,536-entry array, making dispatch O(1) with no hash computation.
Packet Header
size covers the full frame (header + payload). The receiver reads exactly size bytes, strips the 4-byte header, and passes the remainder to the appropriate Protobuf ParseFromArray call. The maximum accepted packet size is MaxPacketSize = 16,384 bytes.
Packet ID Table
System Range — 0x0001–0x00FF
| Constant | ID | Direction | Description |
|---|---|---|---|
PacketIdEchoReq | 0x0001 | C → S | Echo request; payload echoed back verbatim |
PacketIdEchoRes | 0x0002 | S → C | Echo response |
PacketIdErrorRes | 0x0003 | S → C | Error response to any request; see S_ErrorRes |
PacketIdPing | 0x0004 | S → C | Heartbeat ping with HeartbeatPayload |
PacketIdPong | 0x0005 | C → S | Heartbeat reply |
Auth Range — 0x0100–0x01FF
All Auth-range packets are deprecated. Authentication, registration, server listing, and server selection are now served by the HTTPS AuthServer. The game server accepts these IDs for backward compatibility but the handlers return error responses. Use the HTTP AuthServer API and present the resulting
enter_token in C_EnterGameReq instead.| Constant | ID | Status |
|---|---|---|
PacketIdLoginReq | 0x0101 | Deprecated |
PacketIdLoginRes | 0x0102 | Deprecated |
PacketIdRegisterReq | 0x0103 | Deprecated |
PacketIdRegisterRes | 0x0104 | Deprecated |
PacketIdServerListReq | 0x0111 | Deprecated |
PacketIdServerListRes | 0x0112 | Deprecated |
PacketIdSelectServerReq | 0x0121 | Deprecated |
PacketIdSelectServerRes | 0x0122 | Deprecated |
Game Range — 0x0200–0x02FF
| Constant | ID | Direction | Description |
|---|---|---|---|
PacketIdEnterGameReq | 0x0201 | C → S | Enter token + character selection |
PacketIdEnterGameRes | 0x0202 | S → C | Enter result; includes UDP token and port |
PacketIdSpawnMyCharacter | 0x0203 | S → C | Spawns the local character after a successful enter |
PacketIdUdpHelloReq | 0x0204 | C → S UDP | Binds the client’s UDP endpoint to its session |
PacketIdUdpHelloRes | 0x0205 | S → C UDP | Confirms UDP binding; includes server_time_ms |
PacketIdSpawnOtherCharacter | 0x0206 | S → C | Notifies client that another player entered its AoI |
PacketIdDespawnCharacter | 0x0207 | S → C | Notifies client that a player left its AoI |
PacketIdMoveReq | 0x0211 | C → S UDP | Client movement input |
PacketIdMoveNotify | 0x0212 | S → C | Authoritative position update for a single character |
PacketIdMoveBatchNotify | 0x0213 | S → C UDP | Batched movement update (binary layout, see below) |
PacketIdChatReq | 0x0221 | C → S | Chat message request |
PacketIdChatNtf | 0x0222 | S → C | Chat message broadcast |
PacketIdAttackReq | 0x0231 | C → S | Melee attack request |
PacketIdAttackAck | 0x0232 | S → C | Attack acknowledgement |
PacketIdAttackNotify | 0x0233 | S → C | Notifies AoI peers of an attack |
PacketIdSpawnMonster | 0x0241 | S → C | Spawns a monster into the client’s view |
PacketIdDespawnMonster | 0x0242 | S → C | Removes a monster from the client’s view |
PacketIdMonsterMoveNotify | 0x0243 | S → C | Authoritative monster position update |
PacketIdEntityHpChanged | 0x0244 | S → C | HP change for any entity (player or monster) |
PacketIdCombatDebugNotify | 0x0245 | S → C | Debug info for player combat (dev builds only) |
PacketIdMonsterAttackNotify | 0x0246 | S → C | Monster attack event for AoI observers |
PacketIdMonsterCombatDebugNotify | 0x0247 | S → C | Debug info for monster combat (dev builds only) |
PacketIdMonsterRangedShotNotify | 0x0248 | S → C | Ranged projectile start/end position |
PacketIdInventorySnapshot | 0x0251 | S → C | Full inventory state snapshot |
PacketIdInventoryMoveReq | 0x0252 | C → S | Move an item between slots |
PacketIdInventoryOperationResult | 0x0253 | S → C | Result of an inventory operation with new snapshot |
PacketIdInventoryUseReq | 0x0254 | C → S | Use an item from a slot |
Protobuf Message Schemas
Game Entry
Movement
Combat
Inventory
S_InventoryOperationResult wraps a client_request_id echo and an embedded S_InventorySnapshot so the client can apply the new state atomically:
MoveBatchNotify Binary Layout
PacketIdMoveBatchNotify (0x0213) does not use Protobuf. It is a tightly packed binary structure sent over UDP for minimum per-entry overhead:
MovementNotifyDatagramBytes = 1200 bytes per datagram, after accounting for the 4-byte PacketHeader and 12-byte MoveBatchNotifyHeader, each datagram carries at most floor((1200 − 16) / 40) = 29 player entries.
Error Response
S_ErrorRes is sent by the server whenever a request cannot be fulfilled: