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