Skip to main content

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): After isModerator, bots have additional fields serialized by RoomUsers:

ownerId: int Account ID of the bot's owner
ownerName: string Username of the bot's owner
skills: 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:

KeyValueMeaning
mvx,y,zMoving to position
sitheightSitting (height as double string)
layheightLying down
wave1Waving
carryitemIdCarrying an item
useitemIdUsing an item
signsignIdShowing a sign (0-17)
swim1Swimming
trd1In a trade
dead1Dead (Battle Banzai minigame)
flatctrllevelHas 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_TAGS

Source: RoomUserTagsComposer, UserTagsMessageEvent

Pushes a room entity's profile tags to other clients in the room.

FieldTypeNotes
roomEntityIdintRoom unit ID of the user
tagCountintNumber of tags
tags[]string[]User's profile tags

S→C 339 - RoomOwnerMarker​

Nitro: ROOM_RIGHTS_OWNER Source: 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_DATA Source: FireworkChargeDataEvent

(no Arcturus composer)

Delivers firework charge data for a firework item in the room. Nitro-only.

Body: (empty)