Skip to main content

Room Entry

Full room entry flow:

Client Server
│ │
│── C→S 2312 RequestRoomLoad(roomId, pw) ──────>│
│ │
│<─ S→C 687 RoomData ──────────────────────────│ (room metadata)
│<─ S→C 2031 RoomModel ─────────────────────────│ (layout name + room ID)
│<─ S→C 2454 RoomPaint ─────────────────────────│ (background / floor / wall)
│ │
│── C→S 3898 RequestHeightmap ─────────────────>│
│ │
│<─ S→C 1301 RoomHeightMap ─────────────────────│ (relative heightmap string)
│<─ S→C 2753 RoomRelativeMap ───────────────────│ (tile heightmap)
│<─ S→C 749 RoomPane ──────────────────────────│ (rights info)
│<─ S→C 780 RoomRights ────────────────────────│ (user's rights level 0-4)
│<─ S→C 758 RoomOpen ──────────────────────────│ (signal: room is ready)
│ │
│<─ S→C 374 RoomUsers ─────────────────────────│ (all users + bots in room)
│<─ S→C 1640 RoomUserStatus ────────────────────│ (initial positions)
│<─ S→C 1778 RoomFloorItems ────────────────────│ (floor furniture)
│<─ S→C 1369 RoomWallItems ─────────────────────│ (wall furniture)
│<─ S→C 2233 RoomUserDance ─────────────────────│* (if any user is dancing)
│<─ S→C 2454 RoomPaint (layers) ────────────────│* (additional paint layers)

Error paths:

Client Server
│ │
│── C→S 2312 RequestRoomLoad ──────────────────>│
│ │
│ [room is full] │
│<─ S→C 899 RoomEnterError(1) ─────────────────│
│ │
│ [user is banned] │
│<─ S→C 899 RoomEnterError(4) ─────────────────│
│ │
│ [room requires password] │
│<─ S→C 878 RoomAccessDenied("") ──────────────│
│ │
│ [doorbell] │
│<─ S→C 2309 DoorbellAddUser ───────────────────│
│ [owner accepts] │
│<─ S→C 758 RoomOpen ──────────────────────────│ → continue normal entry
│ [owner rejects] │
│<─ S→C 3783 HideDoorbell ──────────────────────│ → entry denied

C→S 2312 - RequestRoomLoad

Nitro: ROOM_ENTER - Load (technical)→ENTER (semantic). Nitro names by user intent. Source: RequestRoomLoadEvent, RoomEnterComposer

Requests entry into a specific room by ID, optionally supplying a password for locked rooms.

Body:
roomId: int

C→S 3898 - RequestHeightmap

Nitro: FURNITURE_ALIASES - ⚠ COLLISION: Arcturus uses this as the second step of room entry (client requests the heightmap). Nitro uses it to request the furniture alias map. See §45. Source: RequestRoomHeightmapEvent, FurnitureAliasesComposer

Body: (empty)

Purpose: Triggers the server to complete the room-enter sequence and send Triggers the server to send the room heightmap data as the second step of the room-load sequence.

C→S 2230 - RequestRoomData (GetGuestRoom)

Nitro: GET_GUEST_ROOM - Room data→guest room. Nitro names it by the type of room being queried. Source: RequestRoomDataEvent, GetGuestRoomMessageComposer

Nitro sends:
roomId: int
enterRoom: int 0 or 1 (whether to auto-enter the room)
forwardRoom: int 0 or 1 (whether this is a room forward)

Note: GetGuestRoomMessage sends 3 integers. The doc previously listed fields 2 and 3 as x:int, y:int - wrong. Arcturus reads them as something and something2 (opaque integers); their semantic meaning comes from the nitro source.

Requests metadata for a specific room by ID, optionally signalling that the client intends to enter or forward to it. The server responds with S→C 687 RoomData.

S→C 687 - RoomData

Source: RoomDataComposer, GetGuestRoomResultEvent

Delivers full room metadata (owner, settings, door state, category, capacity) in response to a room-info or room-enter request.

Body:
enterRoom: boolean Whether to auto-enter
roomId: int
roomName: string
ownerId: int (0 for public rooms)
ownerName: string (empty for public rooms)
doorState: int 0=open, 1=doorbell, 2=password, 3=invisible
currentUsers: int
maxUsers: int
description: string
tradeMode: int 0=no, 1=rights only, 2=all
score: int
ranking: int
categoryId: int
tagCount: int
[tagCount]:
tag: string
flags: int Bitmask: 2=hasGuild, 4=isPromoted, 8=isPrivate, 16=allowPets
*[if flags & 2]: (group info)
groupId: int
groupName: string
groupBadge: string
*[if flags & 4]: (promotion info)
promoTitle: string
promoDesc: string
promoTimeLeft: int (minutes)
isGroupForward: boolean
isStaffPicked: boolean
isGroupMember: boolean
isRoomMuted: boolean
muteOption: int
kickOption: int
banOption: int
chatMode: int
chatSize: int
chatSpeed: int
chatHearingDist: int

S→C 2031 - RoomModel

Source: RoomModelComposer, RoomReadyMessageEvent

Sends the room model (layout name and room ID) to the client at the start of the room-load sequence.

Body:
layoutName: string Model identifier (e.g. "model_a", "custom")

S→C 2454 - RoomPaint

Source: RoomPaintComposer, RoomPaintEvent

Body:
type: string "floor" | "landscape" | "wallpaper"
value: string Asset/color identifier

May be sent multiple times (once per paint type).

S→C 1301 - RoomHeightMap

Source: RoomHeightMapComposer, FloorHeightMapEvent

Body:
isLargeFloorplan: boolean true for large rooms
wallHeight: int Fixed walls height
relativeMap: string Tile map: newline-separated rows, each char
encodes tile height (x=blocked/void, 0-f=height)

S→C 2753 - RoomRelativeMap

Source: RoomRelativeMapComposer, RoomHeightMapEvent

Delivers a compact relative-height map of the room's floor tiles for client-side stacking and collision logic.

Body: (empty)

S→C 749 - RoomPane

Source: RoomPaneComposer, RoomEntryInfoMessageEvent

Body:
roomId: int Room ID
isOwner: boolean Whether the receiving user is the room owner

Note: RoomPane only sends these two fields. The rights list is sent separately via S→C 1284 RoomRightsList.

S→C 780 - RoomRights

Source: RoomRightsComposer, RoomRightsEvent

Delivers the current user's rights level in the room (none, rights, owner, etc.).

Body: (empty)

S→C 758 - RoomOpen

Source: RoomOpenComposer, RoomEnterEvent

Body: (empty)

Signals that the room is fully loaded and the client's avatar has entered; client transitions to in-room state.

S→C 899 - RoomEnterError

Source: RoomEnterErrorComposer, RoomEnterErrorEvent

Notifies the client that room entry was denied, with a code indicating the reason (full, banned, queue, VIP-only, etc.).

Body:
errorCode: int 1=full, 2=cant enter, 3=queue, 4=banned

S→C 878 - RoomAccessDenied

Source: RoomAccessDeniedComposer, FlatAccessDeniedMessageEvent

Notifies a user that access to a room was denied; carries the username that was refused.

Body: (empty)

S→C 2309 - DoorbellAddUser

Source: DoorbellAddUserComposer, DoorbellMessageEvent

Notifies the room owner that a user is ringing the doorbell, so they can accept or reject entry.

Body: (empty)

S→C 3783 - HideDoorbell

Source: HideDoorbellComposer, RoomDoorbellAcceptedEvent

Removes a specific username from the doorbell queue (e.g. after the owner accepts or the user leaves).

Body: (empty)

S→C 160 - ForwardToRoom

Source: ForwardToRoomComposer, RoomForwardEvent

Instructs the client to navigate to a different room by ID.

Body: (empty)

S→C 2208 - RoomQueueStatus

Delivers the user's current position in the doorbell entry queue and the total queue length.

Body:
position: int Position in doorbell queue