Room State
Walking flow:
Client Server Room (all clients incl. walker)
│ │ │
│── [3320] Walk(5,3) ───>│ │
│ │ A* pathfind to (5,3) │
│ │ compute tile path │
│ │ ┌─ game tick fires ──────── │
│ │ │ advance one tile │
│ │ │ set status: mv x,y,z │
│ │ └────────────────────────── │
│ │ │
│ [1640] RoomEntityStatuses #1 ───────────────────>│
│ tick 1: first step │
│ status="/mv 3,2,0.5/" │
│ │ │
│ │ ┌─ next tick ────────────── │
│ │ │ advance another tile │
│ │ └────────────────────────── │
│ │ │
│ [1640] RoomEntityStatuses #2 ───────────────────>│
│ tick N: intermediate │
│ status="/mv 4,3,0.0/" │
│ one broadcast per tile per tick until goal │
│ │ │
│ │ ┌─ final tick: goal reached │
│ │ │ remove "mv" status │
│ │ │ onWalkOn() fires for tile│
│ │ └────────────────────────── │
│ │ │
│ [1640] RoomEntityStatuses #3 ───────────────────>│
│ arrival │ │
│ status="/" │ │
│ │ │
│ │ │
│ │ │
S→C 374 - RoomEntities
Delivers the list of all entities (users, bots, pets) currently in the room at load time or as they enter.
Body:
count: int
[count user entries]:
userId: int
username: string
motto: string
look: string Figure string
roomEntityId: int Per-room entity ID (used in all subsequent status msgs)
x: int
y: int
z: string Double as string (e.g. "0.0")
bodyRotation: int 0-7 (N=2, NE=3, E=4, SE=5, S=6, SW=7, W=0, NW=1)
entityType: int 1=user, 2=pet, 4=bot (NOTE: bots use 4, NOT 3)
gender: string "M" or "F"
groupId: int (-1 if no group)
groupRank: int (-1 if no group)
groupName: string (empty if no group)
swimmingFigure: string (empty if not swimming)
achievementScore: int
Bot-specific extra fields (only appended when
entityType == 4): AfterisModerator, bots have additional fields serialized byRoomUsers:ownerId: int Account ID of the bot's ownerownerName: string Username of the bot's ownerskills: int Always 10 (count of skills shorts that follow)[10 shorts] Skill slots 0-9 (short values, always 0–9)
S→C 1640 - RoomEntityStatuses
Pushes position, rotation, and status-string updates for one or more room entities (movement, sitting, waving, etc.).
The coordinates from the user position before any movement updates from the current ticket. Each packet tells the client "entity was at (prevX,prevY,prevZ) and is now moving toward (next from status string)". The client animates the transition between previous and next positions at its own frame rate.
Body:
count: int
[count entries]:
roomEntityId: int
x: int Previous X
y: int Previous Y
z: string Previous Z as string
headRotation: int 0-7
bodyRotation: int 0-7
Status keys used in statusString:
| Key | Value | Meaning |
|---|---|---|
mv | x,y,z | Moving to position |
sit | height | Sitting (height as double string) |
lay | height | Lying down |
wave | 1 | Waving |
carry | itemId | Carrying an item |
use | itemId | Using an item |
sign | signId | Showing a sign (0-17) |
swim | 1 | Swimming |
trd | 1 | In a trade |
dead | 1 | Dead (Battle Banzai minigame) |
flatctrl | level | Has room rights (level 1-4) |
S→C 2661 - RoomEntityLeave
Notifies the client that a specific room entity (user, bot, or pet) has left the room.
Body:
roomEntityId: int
S→C 1255 - RoomEntityTags
Nitro:
GET_USER_TAGSSource:
RoomUserTagsComposer,UserTagsMessageEvent
Pushes a room entity's profile tags to other clients in the room.
| Field | Type | Notes |
|---|---|---|
| roomEntityId | int | Room unit ID of the user |
| tagCount | int | Number of tags |
| tags[] | string[] | User's profile tags |
S→C 339 - RoomOwnerMarker
Nitro:
ROOM_RIGHTS_OWNERSource:RoomOwnerComposer,RoomOwnerEvent
Receiving this packet signals that the receiving client is the room owner. The same information is also conveyed by the isOwner:boolean field in S→C 749 RoomPane; RoomOwner (339) is the older companion signal sent Signals to the client that the current user is the room owner. Carries no fields; ownership is implicit from receipt.
Body: (empty)
S→C 5210 - FireworkChargeData
Nitro:
FIREWORK_CHARGE_DATASource:FireworkChargeDataEvent
(no Arcturus composer)
Delivers firework charge data for a firework item in the room. Nitro-only.
Body: (empty)