From b42f989e280d65d437355f4173b56526a01f9473 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Mon, 11 May 2026 21:09:51 +0200 Subject: [PATCH] RoomEnterComposer: optional spawnX/spawnY for reconnect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Arcturus' RequestRoomLoadEvent reads the two extra ints only when the inbound packet has 8+ bytes remaining after roomId+password, so the renderer can send 2-arg or 4-arg payloads against the same header. The client already calls 'new RoomEnterComposer(roomId, password, spawnX, spawnY)' in two places inside RoomSession / RoomSessionManager (the reconnect/respawn flow) — the composer signature is what was lagging behind. Server-side reference: Arcturus-Morningstar-Extended/Emulator/src/main/java/com/eu/habbo/ messages/incoming/rooms/RequestRoomLoadEvent.java --- .../outgoing/room/access/RoomEnterComposer.ts | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/communication/src/messages/outgoing/room/access/RoomEnterComposer.ts b/packages/communication/src/messages/outgoing/room/access/RoomEnterComposer.ts index a195223..3c29e4b 100644 --- a/packages/communication/src/messages/outgoing/room/access/RoomEnterComposer.ts +++ b/packages/communication/src/messages/outgoing/room/access/RoomEnterComposer.ts @@ -1,12 +1,23 @@ import { IMessageComposer } from '@nitrots/api'; -export class RoomEnterComposer implements IMessageComposer> -{ - private _data: ConstructorParameters; +type RoomEnterPayload = [ number, string, number?, number? ]; - constructor(roomId: number, password: string = null) +export class RoomEnterComposer implements IMessageComposer +{ + private _data: RoomEnterPayload; + + /** + * Optional spawnX/spawnY let the server resume the avatar at a + * specific tile when re-entering the same room — used by the + * reconnect flow. Arcturus' RequestRoomLoadEvent reads both ints + * only if `packet.remaining >= 8`, so omitting them keeps the + * legacy enter-via-door behavior. + */ + constructor(roomId: number, password: string = null, spawnX?: number, spawnY?: number) { - this._data = [roomId, password]; + this._data = (spawnX !== undefined && spawnY !== undefined) + ? [ roomId, password, spawnX, spawnY ] + : [ roomId, password ]; } public getMessageArray()