Expose room, user and furni metadata for wired tools

- parse extra room snapshot data such as hotel time, room item limit and group context

- expose richer furni metadata including flags, dimensions and teleport targets

- expose richer user metadata including room-entry fields and ids needed by inspection tools

- keep session and room engine models aligned with the new wired monitor/inspection flow
This commit is contained in:
Lorenzune
2026-03-27 09:37:14 +01:00
parent 0b834e3b93
commit 99c4acea38
21 changed files with 386 additions and 22 deletions
+3 -3
View File
@@ -24,9 +24,9 @@ export interface IRoomCreator
getRoomObjectUser(roomId: number, objectId: number): IRoomObjectController; getRoomObjectUser(roomId: number, objectId: number): IRoomObjectController;
removeRoomObjectUser(roomId: number, objectId: number): void; removeRoomObjectUser(roomId: number, objectId: number): void;
getRoomObjectFloor(roomId: number, objectId: number): IRoomObjectController; getRoomObjectFloor(roomId: number, objectId: number): IRoomObjectController;
addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number, allowStack?: boolean, allowSit?: boolean, allowLay?: boolean, allowWalk?: boolean, dimensionsX?: number, dimensionsY?: number, teleportTargetId?: number): boolean;
addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number, allowStack?: boolean, allowSit?: boolean, allowLay?: boolean, allowWalk?: boolean, dimensionsX?: number, dimensionsY?: number, teleportTargetId?: number): boolean;
addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean): boolean; addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean, allowStack?: boolean, allowSit?: boolean, allowLay?: boolean, allowWalk?: boolean, dimensionsX?: number, dimensionsY?: number, teleportTargetId?: number): boolean;
removeRoomObjectFloor(roomId: number, objectId: number, userId?: number, _arg_4?: boolean): void; removeRoomObjectFloor(roomId: number, objectId: number, userId?: number, _arg_4?: boolean): void;
removeRoomObjectWall(roomId: number, objectId: number, userId?: number): void; removeRoomObjectWall(roomId: number, objectId: number, userId?: number): void;
updateRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, data: IObjectData, extra?: number): boolean; updateRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, data: IObjectData, extra?: number): boolean;
+3 -3
View File
@@ -46,9 +46,9 @@ export interface IRoomEngine
updateRoomObjectWallLocation(roomId: number, objectId: number, location: IVector3D): boolean; updateRoomObjectWallLocation(roomId: number, objectId: number, location: IVector3D): boolean;
addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean; addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean;
updateRoomObjectUserLocation(roomId: number, objectId: number, location: IVector3D, targetLocation: IVector3D, canStandUp?: boolean, baseY?: number, direction?: IVector3D, headDirection?: number, skipLocationFix?: boolean, isSlide?: boolean, duration?: number): boolean; updateRoomObjectUserLocation(roomId: number, objectId: number, location: IVector3D, targetLocation: IVector3D, canStandUp?: boolean, baseY?: number, direction?: IVector3D, headDirection?: number, skipLocationFix?: boolean, isSlide?: boolean, duration?: number): boolean;
addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number, allowStack?: boolean, allowSit?: boolean, allowLay?: boolean, allowWalk?: boolean, dimensionsX?: number, dimensionsY?: number, teleportTargetId?: number): boolean;
addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number, allowStack?: boolean, allowSit?: boolean, allowLay?: boolean, allowWalk?: boolean, dimensionsX?: number, dimensionsY?: number, teleportTargetId?: number): boolean;
addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean): boolean; addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean, allowStack?: boolean, allowSit?: boolean, allowLay?: boolean, allowWalk?: boolean, dimensionsX?: number, dimensionsY?: number, teleportTargetId?: number): boolean;
initalizeTemporaryObjectsByType(type: string, _arg_2: boolean): void; initalizeTemporaryObjectsByType(type: string, _arg_2: boolean): void;
updateRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, data: IObjectData, extra?: number): boolean; updateRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, data: IObjectData, extra?: number): boolean;
updateRoomObjectWall(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, extra?: string): boolean; updateRoomObjectWall(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, extra?: string): boolean;
@@ -22,9 +22,9 @@ export interface IRoomEngineServices
getRoomObjectCursor(roomId: number): IRoomObjectController; getRoomObjectCursor(roomId: number): IRoomObjectController;
getRoomObjectSelectionArrow(roomId: number): IRoomObjectController; getRoomObjectSelectionArrow(roomId: number): IRoomObjectController;
addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean; addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean;
addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number, allowStack?: boolean, allowSit?: boolean, allowLay?: boolean, allowWalk?: boolean, dimensionsX?: number, dimensionsY?: number, teleportTargetId?: number): boolean;
addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number, allowStack?: boolean, allowSit?: boolean, allowLay?: boolean, allowWalk?: boolean, dimensionsX?: number, dimensionsY?: number, teleportTargetId?: number): boolean;
addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean): boolean; addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean, allowStack?: boolean, allowSit?: boolean, allowLay?: boolean, allowWalk?: boolean, dimensionsX?: number, dimensionsY?: number, teleportTargetId?: number): boolean;
removeRoomObjectFloor(roomId: number, objectId: number, userId?: number, _arg_4?: boolean): void; removeRoomObjectFloor(roomId: number, objectId: number, userId?: number, _arg_4?: boolean): void;
removeRoomObjectWall(roomId: number, objectId: number, userId?: number): void; removeRoomObjectWall(roomId: number, objectId: number, userId?: number): void;
removeRoomObjectUser(roomId: number, objectId: number): void; removeRoomObjectUser(roomId: number, objectId: number): void;
@@ -83,6 +83,13 @@ export class RoomObjectVariable
public static FURNITURE_USAGE_POLICY: string = 'furniture_usage_policy'; public static FURNITURE_USAGE_POLICY: string = 'furniture_usage_policy';
public static FURNITURE_OWNER_ID: string = 'furniture_owner_id'; public static FURNITURE_OWNER_ID: string = 'furniture_owner_id';
public static FURNITURE_OWNER_NAME: string = 'furniture_owner_name'; public static FURNITURE_OWNER_NAME: string = 'furniture_owner_name';
public static FURNITURE_ALLOW_STACK: string = 'furniture_allow_stack';
public static FURNITURE_ALLOW_SIT: string = 'furniture_allow_sit';
public static FURNITURE_ALLOW_LAY: string = 'furniture_allow_lay';
public static FURNITURE_ALLOW_WALK: string = 'furniture_allow_walk';
public static FURNITURE_DIMENSIONS_X: string = 'furniture_dimensions_x';
public static FURNITURE_DIMENSIONS_Y: string = 'furniture_dimensions_y';
public static FURNITURE_TELEPORT_TARGET_ID: string = 'furniture_teleport_target_id';
public static FURNITURE_ROOM_BACKGROUND_COLOR_HUE: string = 'furniture_room_background_color_hue'; public static FURNITURE_ROOM_BACKGROUND_COLOR_HUE: string = 'furniture_room_background_color_hue';
public static FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION: string = 'furniture_room_background_color_saturation'; public static FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION: string = 'furniture_room_background_color_saturation';
public static FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS: string = 'furniture_room_background_color_lightness'; public static FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS: string = 'furniture_room_background_color_lightness';
@@ -24,6 +24,7 @@ export interface IFurnitureData
purchaseCouldBeUsedForBuyout: boolean; purchaseCouldBeUsedForBuyout: boolean;
rentCouldBeUsedForBuyout: boolean; rentCouldBeUsedForBuyout: boolean;
availableForBuildersClub: boolean; availableForBuildersClub: boolean;
allowStack: boolean;
canStandOn: boolean; canStandOn: boolean;
canSitOn: boolean; canSitOn: boolean;
canLayOn: boolean; canLayOn: boolean;
@@ -57,6 +57,11 @@ export interface IRoomSession
allowPets: boolean; allowPets: boolean;
controllerLevel: number; controllerLevel: number;
ownRoomIndex: number; ownRoomIndex: number;
groupId: number;
hotelTimeZone: string;
hotelTimeSnapshotMs: number;
hotelTimeSyncMs: number;
roomItemLimit: number;
isGuildRoom: boolean; isGuildRoom: boolean;
isRoomOwner: boolean; isRoomOwner: boolean;
isDecorating: boolean; isDecorating: boolean;
@@ -23,4 +23,6 @@ export interface IRoomUserData
petLevel: number; petLevel: number;
botSkills: number[]; botSkills: number[];
isModerator: boolean; isModerator: boolean;
roomEntryMethod: string;
roomEntryTeleportId: number;
} }
@@ -11,6 +11,9 @@ export class GetGuestRoomResultMessageParser implements IMessageParser
private _isGroupMember: boolean; private _isGroupMember: boolean;
private _moderation: RoomModerationSettings; private _moderation: RoomModerationSettings;
private _chat: RoomChatSettings; private _chat: RoomChatSettings;
private _hotelTimeZoneId: string;
private _hotelCurrentTimeMs: number;
private _roomItemLimit: number;
public flush(): boolean public flush(): boolean
{ {
@@ -21,6 +24,9 @@ export class GetGuestRoomResultMessageParser implements IMessageParser
this._isGroupMember = false; this._isGroupMember = false;
this._moderation = null; this._moderation = null;
this._chat = null; this._chat = null;
this._hotelTimeZoneId = null;
this._hotelCurrentTimeMs = 0;
this._roomItemLimit = 0;
return true; return true;
} }
@@ -39,6 +45,13 @@ export class GetGuestRoomResultMessageParser implements IMessageParser
this.data.canMute = wrapper.readBoolean(); this.data.canMute = wrapper.readBoolean();
this._chat = new RoomChatSettings(wrapper); this._chat = new RoomChatSettings(wrapper);
if(wrapper.bytesAvailable)
{
this._hotelTimeZoneId = wrapper.readString();
this._hotelCurrentTimeMs = Number(wrapper.readString()) || 0;
if(wrapper.bytesAvailable) this._roomItemLimit = wrapper.readInt();
}
return true; return true;
} }
@@ -76,4 +89,19 @@ export class GetGuestRoomResultMessageParser implements IMessageParser
{ {
return this._chat; return this._chat;
} }
public get hotelTimeZoneId(): string
{
return this._hotelTimeZoneId;
}
public get hotelCurrentTimeMs(): number
{
return this._hotelCurrentTimeMs;
}
public get roomItemLimit(): number
{
return this._roomItemLimit;
}
} }
@@ -25,6 +25,13 @@ export class FurnitureFloorDataParser
private _usagePolicy: number; private _usagePolicy: number;
private _userId: number; private _userId: number;
private _username: string; private _username: string;
private _allowStack: boolean;
private _allowSit: boolean;
private _allowLay: boolean;
private _allowWalk: boolean;
private _dimensionsX: number;
private _dimensionsY: number;
private _teleportTargetId: number;
constructor(wrapper: IMessageDataWrapper) constructor(wrapper: IMessageDataWrapper)
{ {
@@ -51,6 +58,13 @@ export class FurnitureFloorDataParser
this._usagePolicy = 0; this._usagePolicy = 0;
this._userId = 0; this._userId = 0;
this._username = null; this._username = null;
this._allowStack = false;
this._allowSit = false;
this._allowLay = false;
this._allowWalk = false;
this._dimensionsX = 0;
this._dimensionsY = 0;
this._teleportTargetId = 0;
return true; return true;
} }
@@ -72,6 +86,13 @@ export class FurnitureFloorDataParser
this._expires = wrapper.readInt(); this._expires = wrapper.readInt();
this._usagePolicy = wrapper.readInt(); this._usagePolicy = wrapper.readInt();
this._userId = wrapper.readInt(); this._userId = wrapper.readInt();
this._allowStack = (wrapper.readInt() === 1);
this._allowSit = (wrapper.readInt() === 1);
this._allowLay = (wrapper.readInt() === 1);
this._allowWalk = (wrapper.readInt() === 1);
this._dimensionsX = wrapper.readInt();
this._dimensionsY = wrapper.readInt();
this._teleportTargetId = wrapper.readInt();
this._username = null; this._username = null;
if(this._spriteId < 0) this._spriteName = wrapper.readString(); if(this._spriteId < 0) this._spriteName = wrapper.readString();
@@ -149,6 +170,41 @@ export class FurnitureFloorDataParser
return this._username; return this._username;
} }
public get allowStack(): boolean
{
return this._allowStack;
}
public get allowSit(): boolean
{
return this._allowSit;
}
public get allowLay(): boolean
{
return this._allowLay;
}
public get allowWalk(): boolean
{
return this._allowWalk;
}
public get dimensionsX(): number
{
return this._dimensionsX;
}
public get dimensionsY(): number
{
return this._dimensionsY;
}
public get teleportTargetId(): number
{
return this._teleportTargetId;
}
public set username(username: string) public set username(username: string)
{ {
this._username = username; this._username = username;
@@ -11,6 +11,13 @@ export class FurnitureWallDataParser
private _usagePolicy: number; private _usagePolicy: number;
private _userId: number; private _userId: number;
private _username: string; private _username: string;
private _allowStack: boolean;
private _allowSit: boolean;
private _allowLay: boolean;
private _allowWalk: boolean;
private _dimensionsX: number;
private _dimensionsY: number;
private _teleportTargetId: number;
private _width: number; private _width: number;
private _height: number; private _height: number;
@@ -40,6 +47,13 @@ export class FurnitureWallDataParser
this._usagePolicy = -1; this._usagePolicy = -1;
this._userId = 0; this._userId = 0;
this._username = null; this._username = null;
this._allowStack = false;
this._allowSit = false;
this._allowLay = false;
this._allowWalk = false;
this._dimensionsX = 0;
this._dimensionsY = 0;
this._teleportTargetId = 0;
this._width = 0; this._width = 0;
this._height = 0; this._height = 0;
@@ -64,6 +78,13 @@ export class FurnitureWallDataParser
this._secondsToExpiration = wrapper.readInt(); this._secondsToExpiration = wrapper.readInt();
this._usagePolicy = wrapper.readInt(); this._usagePolicy = wrapper.readInt();
this._userId = wrapper.readInt(); this._userId = wrapper.readInt();
this._allowStack = (wrapper.readInt() === 1);
this._allowSit = (wrapper.readInt() === 1);
this._allowLay = (wrapper.readInt() === 1);
this._allowWalk = (wrapper.readInt() === 1);
this._dimensionsX = wrapper.readInt();
this._dimensionsY = wrapper.readInt();
this._teleportTargetId = wrapper.readInt();
this._username = null; this._username = null;
const state = parseFloat(this._stuffData); const state = parseFloat(this._stuffData);
@@ -191,6 +212,41 @@ export class FurnitureWallDataParser
return this._username; return this._username;
} }
public get allowStack(): boolean
{
return this._allowStack;
}
public get allowSit(): boolean
{
return this._allowSit;
}
public get allowLay(): boolean
{
return this._allowLay;
}
public get allowWalk(): boolean
{
return this._allowWalk;
}
public get dimensionsX(): number
{
return this._dimensionsX;
}
public get dimensionsY(): number
{
return this._dimensionsY;
}
public get teleportTargetId(): number
{
return this._teleportTargetId;
}
public set username(username: string) public set username(username: string)
{ {
this._username = username; this._username = username;
@@ -135,6 +135,9 @@ export class RoomUnitParser implements IMessageParser
} }
} }
user.roomEntryMethod = wrapper.readString();
user.roomEntryTeleportId = wrapper.readInt();
i++; i++;
} }
@@ -35,6 +35,8 @@ export class UserMessageData
private _petPosture: string = ''; private _petPosture: string = '';
private _botSkills: number[] = []; private _botSkills: number[] = [];
private _isModerator: boolean = false; private _isModerator: boolean = false;
private _roomEntryMethod: string = 'unknown';
private _roomEntryTeleportId: number = 0;
private _isReadOnly: boolean = false; private _isReadOnly: boolean = false;
constructor(k: number) constructor(k: number)
@@ -442,4 +444,30 @@ export class UserMessageData
this._isModerator = k; this._isModerator = k;
} }
} }
public get roomEntryMethod(): string
{
return this._roomEntryMethod;
}
public set roomEntryMethod(k: string)
{
if(!this._isReadOnly)
{
this._roomEntryMethod = k;
}
}
public get roomEntryTeleportId(): number
{
return this._roomEntryTeleportId;
}
public set roomEntryTeleportId(k: number)
{
if(!this._isReadOnly)
{
this._roomEntryTeleportId = k;
}
}
} }
+20 -6
View File
@@ -819,6 +819,13 @@ export class RoomEngine implements IRoomEngine, IRoomCreator, IRoomEngineService
model.setValue(RoomObjectVariable.FURNITURE_USAGE_POLICY, data.usagePolicy); model.setValue(RoomObjectVariable.FURNITURE_USAGE_POLICY, data.usagePolicy);
model.setValue(RoomObjectVariable.FURNITURE_OWNER_ID, data.ownerId); model.setValue(RoomObjectVariable.FURNITURE_OWNER_ID, data.ownerId);
model.setValue(RoomObjectVariable.FURNITURE_OWNER_NAME, data.ownerName); model.setValue(RoomObjectVariable.FURNITURE_OWNER_NAME, data.ownerName);
model.setValue(RoomObjectVariable.FURNITURE_ALLOW_STACK, data.allowStack ? 1 : 0);
model.setValue(RoomObjectVariable.FURNITURE_ALLOW_SIT, data.allowSit ? 1 : 0);
model.setValue(RoomObjectVariable.FURNITURE_ALLOW_LAY, data.allowLay ? 1 : 0);
model.setValue(RoomObjectVariable.FURNITURE_ALLOW_WALK, data.allowWalk ? 1 : 0);
model.setValue(RoomObjectVariable.FURNITURE_DIMENSIONS_X, data.dimensionsX);
model.setValue(RoomObjectVariable.FURNITURE_DIMENSIONS_Y, data.dimensionsY);
model.setValue(RoomObjectVariable.FURNITURE_TELEPORT_TARGET_ID, data.teleportTargetId);
} }
if(!this.updateRoomObjectFloor(roomId, id, data.location, data.direction, data.state, data.data, data.extra)) return false; if(!this.updateRoomObjectFloor(roomId, id, data.location, data.direction, data.state, data.data, data.extra)) return false;
@@ -879,6 +886,13 @@ export class RoomEngine implements IRoomEngine, IRoomCreator, IRoomEngineService
model.setValue(RoomObjectVariable.FURNITURE_USAGE_POLICY, data.usagePolicy); model.setValue(RoomObjectVariable.FURNITURE_USAGE_POLICY, data.usagePolicy);
model.setValue(RoomObjectVariable.FURNITURE_OWNER_ID, data.ownerId); model.setValue(RoomObjectVariable.FURNITURE_OWNER_ID, data.ownerId);
model.setValue(RoomObjectVariable.FURNITURE_OWNER_NAME, data.ownerName); model.setValue(RoomObjectVariable.FURNITURE_OWNER_NAME, data.ownerName);
model.setValue(RoomObjectVariable.FURNITURE_ALLOW_STACK, data.allowStack ? 1 : 0);
model.setValue(RoomObjectVariable.FURNITURE_ALLOW_SIT, data.allowSit ? 1 : 0);
model.setValue(RoomObjectVariable.FURNITURE_ALLOW_LAY, data.allowLay ? 1 : 0);
model.setValue(RoomObjectVariable.FURNITURE_ALLOW_WALK, data.allowWalk ? 1 : 0);
model.setValue(RoomObjectVariable.FURNITURE_DIMENSIONS_X, data.dimensionsX);
model.setValue(RoomObjectVariable.FURNITURE_DIMENSIONS_Y, data.dimensionsY);
model.setValue(RoomObjectVariable.FURNITURE_TELEPORT_TARGET_ID, data.teleportTargetId);
} }
if(!this.updateRoomObjectWall(roomId, id, data.location, data.direction, data.state, extra)) return false; if(!this.updateRoomObjectWall(roomId, id, data.location, data.direction, data.state, extra)) return false;
@@ -1667,33 +1681,33 @@ export class RoomEngine implements IRoomEngine, IRoomCreator, IRoomEngineService
if(GetEventDispatcher()) GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.REMOVED, roomId, objectId, category)); if(GetEventDispatcher()) GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.REMOVED, roomId, objectId, category));
} }
public addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra: number = NaN, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', synchronized: boolean = true, realRoomObject: boolean = true, sizeZ: number = -1): boolean public addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra: number = NaN, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', synchronized: boolean = true, realRoomObject: boolean = true, sizeZ: number = -1, allowStack: boolean = false, allowSit: boolean = false, allowLay: boolean = false, allowWalk: boolean = false, dimensionsX: number = 0, dimensionsY: number = 0, teleportTargetId: number = 0): boolean
{ {
const instanceData = this.getRoomInstanceData(roomId); const instanceData = this.getRoomInstanceData(roomId);
if(!instanceData) return false; if(!instanceData) return false;
const furnitureData = new RoomFurnitureData(id, typeId, null, location, direction, state, objectData, extra, expires, usagePolicy, ownerId, ownerName, synchronized, realRoomObject, sizeZ); const furnitureData = new RoomFurnitureData(id, typeId, null, location, direction, state, objectData, extra, expires, usagePolicy, ownerId, ownerName, synchronized, realRoomObject, sizeZ, allowStack, allowSit, allowLay, allowWalk, dimensionsX, dimensionsY, teleportTargetId);
instanceData.addPendingFurnitureFloor(furnitureData); instanceData.addPendingFurnitureFloor(furnitureData);
return true; return true;
} }
public addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra: number = NaN, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', synchronized: boolean = true, realRoomObject: boolean = true, sizeZ: number = -1): boolean public addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra: number = NaN, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', synchronized: boolean = true, realRoomObject: boolean = true, sizeZ: number = -1, allowStack: boolean = false, allowSit: boolean = false, allowLay: boolean = false, allowWalk: boolean = false, dimensionsX: number = 0, dimensionsY: number = 0, teleportTargetId: number = 0): boolean
{ {
const instanceData = this.getRoomInstanceData(roomId); const instanceData = this.getRoomInstanceData(roomId);
if(!instanceData) return false; if(!instanceData) return false;
const furnitureData = new RoomFurnitureData(id, 0, typeName, location, direction, state, objectData, extra, expires, usagePolicy, ownerId, ownerName, synchronized, realRoomObject, sizeZ); const furnitureData = new RoomFurnitureData(id, 0, typeName, location, direction, state, objectData, extra, expires, usagePolicy, ownerId, ownerName, synchronized, realRoomObject, sizeZ, allowStack, allowSit, allowLay, allowWalk, dimensionsX, dimensionsY, teleportTargetId);
instanceData.addPendingFurnitureFloor(furnitureData); instanceData.addPendingFurnitureFloor(furnitureData);
return true; return true;
} }
public addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', realRoomObject: boolean = true): boolean public addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', realRoomObject: boolean = true, allowStack: boolean = false, allowSit: boolean = false, allowLay: boolean = false, allowWalk: boolean = false, dimensionsX: number = 0, dimensionsY: number = 0, teleportTargetId: number = 0): boolean
{ {
const instanceData = this.getRoomInstanceData(roomId); const instanceData = this.getRoomInstanceData(roomId);
@@ -1703,7 +1717,7 @@ export class RoomEngine implements IRoomEngine, IRoomCreator, IRoomEngineService
objectData.setString(extra); objectData.setString(extra);
const furnitureData = new RoomFurnitureData(id, typeId, null, location, direction, state, objectData, NaN, expires, usagePolicy, ownerId, ownerName, true, realRoomObject); const furnitureData = new RoomFurnitureData(id, typeId, null, location, direction, state, objectData, NaN, expires, usagePolicy, ownerId, ownerName, true, realRoomObject, -1, allowStack, allowSit, allowLay, allowWalk, dimensionsX, dimensionsY, teleportTargetId);
instanceData.addPendingFurnitureWall(furnitureData); instanceData.addPendingFurnitureWall(furnitureData);
+3 -3
View File
@@ -1167,11 +1167,11 @@ export class RoomMessageHandler
if(data.spriteName) if(data.spriteName)
{ {
this._roomEngine.addFurnitureFloorByTypeName(roomId, data.itemId, data.spriteName, location, direction, data.state, data.data, data.extra, data.expires, data.usagePolicy, data.userId, data.username, true, true, data.stackHeight); this._roomEngine.addFurnitureFloorByTypeName(roomId, data.itemId, data.spriteName, location, direction, data.state, data.data, data.extra, data.expires, data.usagePolicy, data.userId, data.username, true, true, data.stackHeight, data.allowStack, data.allowSit, data.allowLay, data.allowWalk, data.dimensionsX, data.dimensionsY, data.teleportTargetId);
} }
else else
{ {
this._roomEngine.addFurnitureFloor(roomId, data.itemId, data.spriteId, location, direction, data.state, data.data, data.extra, data.expires, data.usagePolicy, data.userId, data.username, true, true, data.stackHeight); this._roomEngine.addFurnitureFloor(roomId, data.itemId, data.spriteId, location, direction, data.state, data.data, data.extra, data.expires, data.usagePolicy, data.userId, data.username, true, true, data.stackHeight, data.allowStack, data.allowSit, data.allowLay, data.allowWalk, data.dimensionsX, data.dimensionsY, data.teleportTargetId);
} }
} }
@@ -1196,7 +1196,7 @@ export class RoomMessageHandler
const direction = new Vector3d(wallGeometry.getDirection(data.direction)); const direction = new Vector3d(wallGeometry.getDirection(data.direction));
this._roomEngine.addFurnitureWall(roomId, data.itemId, data.spriteId, location, direction, data.state, data.stuffData, data.secondsToExpiration, data.usagePolicy, data.userId, data.username); this._roomEngine.addFurnitureWall(roomId, data.itemId, data.spriteId, location, direction, data.state, data.stuffData, data.secondsToExpiration, data.usagePolicy, data.userId, data.username, true, data.allowStack, data.allowSit, data.allowLay, data.allowWalk, data.dimensionsX, data.dimensionsY, data.teleportTargetId);
} }
private onIgnoreResultEvent(event: IgnoreResultEvent): void private onIgnoreResultEvent(event: IgnoreResultEvent): void
+50 -1
View File
@@ -18,8 +18,15 @@ export class RoomFurnitureData
private _synchronized: boolean; private _synchronized: boolean;
private _realRoomObject: boolean; private _realRoomObject: boolean;
private _sizeZ: number; private _sizeZ: number;
private _allowStack: boolean;
private _allowSit: boolean;
private _allowLay: boolean;
private _allowWalk: boolean;
private _dimensionsX: number;
private _dimensionsY: number;
private _teleportTargetId: number;
constructor(id: number, typeId: number, type: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra: number = NaN, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', synchronized: boolean = true, realRoomObject: boolean = true, sizeZ: number = -1) constructor(id: number, typeId: number, type: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra: number = NaN, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', synchronized: boolean = true, realRoomObject: boolean = true, sizeZ: number = -1, allowStack: boolean = false, allowSit: boolean = false, allowLay: boolean = false, allowWalk: boolean = false, dimensionsX: number = 0, dimensionsY: number = 0, teleportTargetId: number = 0)
{ {
this._id = id; this._id = id;
this._typeId = typeId; this._typeId = typeId;
@@ -34,6 +41,13 @@ export class RoomFurnitureData
this._synchronized = synchronized; this._synchronized = synchronized;
this._realRoomObject = realRoomObject; this._realRoomObject = realRoomObject;
this._sizeZ = sizeZ; this._sizeZ = sizeZ;
this._allowStack = allowStack;
this._allowSit = allowSit;
this._allowLay = allowLay;
this._allowWalk = allowWalk;
this._dimensionsX = dimensionsX;
this._dimensionsY = dimensionsY;
this._teleportTargetId = teleportTargetId;
this._location = new Vector3d(); this._location = new Vector3d();
this._direction = new Vector3d(); this._direction = new Vector3d();
@@ -116,4 +130,39 @@ export class RoomFurnitureData
{ {
return this._sizeZ; return this._sizeZ;
} }
public get allowStack(): boolean
{
return this._allowStack;
}
public get allowSit(): boolean
{
return this._allowSit;
}
public get allowLay(): boolean
{
return this._allowLay;
}
public get allowWalk(): boolean
{
return this._allowWalk;
}
public get dimensionsX(): number
{
return this._dimensionsX;
}
public get dimensionsY(): number
{
return this._dimensionsY;
}
public get teleportTargetId(): number
{
return this._teleportTargetId;
}
} }
+55
View File
@@ -17,6 +17,11 @@ export class RoomSession implements IRoomSession
private _allowPets: boolean = false; private _allowPets: boolean = false;
private _controllerLevel: number = RoomControllerLevel.NONE; private _controllerLevel: number = RoomControllerLevel.NONE;
private _ownRoomIndex: number = -1; private _ownRoomIndex: number = -1;
private _groupId: number = 0;
private _hotelTimeZone: string = 'UTC';
private _hotelTimeSnapshotMs: number = 0;
private _hotelTimeSyncMs: number = 0;
private _roomItemLimit: number = 0;
private _isGuildRoom: boolean = false; private _isGuildRoom: boolean = false;
private _isRoomOwner: boolean = false; private _isRoomOwner: boolean = false;
private _isDecorating: boolean = false; private _isDecorating: boolean = false;
@@ -398,6 +403,56 @@ export class RoomSession implements IRoomSession
return this._ownRoomIndex; return this._ownRoomIndex;
} }
public get groupId(): number
{
return this._groupId;
}
public set groupId(groupId: number)
{
this._groupId = groupId;
}
public get hotelTimeZone(): string
{
return this._hotelTimeZone;
}
public set hotelTimeZone(timeZone: string)
{
this._hotelTimeZone = (timeZone || 'UTC');
}
public get hotelTimeSnapshotMs(): number
{
return this._hotelTimeSnapshotMs;
}
public set hotelTimeSnapshotMs(value: number)
{
this._hotelTimeSnapshotMs = value;
}
public get hotelTimeSyncMs(): number
{
return this._hotelTimeSyncMs;
}
public set hotelTimeSyncMs(value: number)
{
this._hotelTimeSyncMs = value;
}
public get roomItemLimit(): number
{
return this._roomItemLimit;
}
public set roomItemLimit(value: number)
{
this._roomItemLimit = value;
}
public get isGuildRoom(): boolean public get isGuildRoom(): boolean
{ {
return this._isGuildRoom; return this._isGuildRoom;
+22
View File
@@ -28,6 +28,8 @@ export class RoomUserData implements IRoomUserData
private _hasBreedingPermission: boolean; private _hasBreedingPermission: boolean;
private _botSkills: number[]; private _botSkills: number[];
private _isModerator: boolean; private _isModerator: boolean;
private _roomEntryMethod: string = 'unknown';
private _roomEntryTeleportId: number = 0;
constructor(k: number) constructor(k: number)
{ {
@@ -288,4 +290,24 @@ export class RoomUserData implements IRoomUserData
{ {
this._isModerator = k; this._isModerator = k;
} }
public get roomEntryMethod(): string
{
return this._roomEntryMethod;
}
public set roomEntryMethod(k: string)
{
this._roomEntryMethod = k;
}
public get roomEntryTeleportId(): number
{
return this._roomEntryTeleportId;
}
public set roomEntryTeleportId(k: number)
{
this._roomEntryTeleportId = k;
}
} }
@@ -24,6 +24,7 @@ export class FurnitureData implements IFurnitureData
private _purchaseCouldBeUsedForBuyout: boolean; private _purchaseCouldBeUsedForBuyout: boolean;
private _rentCouldBeUsedForBuyout: boolean; private _rentCouldBeUsedForBuyout: boolean;
private _availableForBuildersClub: boolean; private _availableForBuildersClub: boolean;
private _allowStack: boolean;
private _canStandOn: boolean; private _canStandOn: boolean;
private _canSitOn: boolean; private _canSitOn: boolean;
private _canLayOn: boolean; private _canLayOn: boolean;
@@ -32,7 +33,7 @@ export class FurnitureData implements IFurnitureData
private _environment: string; private _environment: string;
private _rare: boolean; private _rare: boolean;
constructor(type: FurnitureType, id: number, fullName: string, className: string, category: string, localizedName: string, description: string, revision: number, tileSizeX: number, tileSizeY: number, tileSizeZ: number, colors: number[], hadIndexedColor: boolean, colorIndex: number, adUrl: string, purchaseOfferId: number, purchaseCouldBeUsedForBuyout: boolean, rentOfferId: number, rentCouldBeUsedForBuyout: boolean, availableForBuildersClub: boolean, customParams: string, specialType: number, canStandOn: boolean, canSitOn: boolean, canLayOn: boolean, excludedfromDynamic: boolean, furniLine: string, environment: string, rare: boolean) constructor(type: FurnitureType, id: number, fullName: string, className: string, category: string, localizedName: string, description: string, revision: number, tileSizeX: number, tileSizeY: number, tileSizeZ: number, colors: number[], hadIndexedColor: boolean, colorIndex: number, adUrl: string, purchaseOfferId: number, purchaseCouldBeUsedForBuyout: boolean, rentOfferId: number, rentCouldBeUsedForBuyout: boolean, availableForBuildersClub: boolean, customParams: string, specialType: number, allowStack: boolean, canStandOn: boolean, canSitOn: boolean, canLayOn: boolean, excludedfromDynamic: boolean, furniLine: string, environment: string, rare: boolean)
{ {
this._type = type; this._type = type;
this._id = id; this._id = id;
@@ -56,6 +57,7 @@ export class FurnitureData implements IFurnitureData
this._customParams = customParams; this._customParams = customParams;
this._specialType = specialType; this._specialType = specialType;
this._availableForBuildersClub = availableForBuildersClub; this._availableForBuildersClub = availableForBuildersClub;
this._allowStack = allowStack;
this._canStandOn = canStandOn; this._canStandOn = canStandOn;
this._canSitOn = canSitOn; this._canSitOn = canSitOn;
this._canLayOn = canLayOn; this._canLayOn = canLayOn;
@@ -180,6 +182,11 @@ export class FurnitureData implements IFurnitureData
return this._availableForBuildersClub; return this._availableForBuildersClub;
} }
public get allowStack(): boolean
{
return this._allowStack;
}
public get canStandOn(): boolean public get canStandOn(): boolean
{ {
return this._canStandOn; return this._canStandOn;
@@ -82,8 +82,9 @@ export class FurnitureDataLoader
const className = classSplit[0]; const className = classSplit[0];
const colorIndex = ((classSplit.length > 1) ? parseInt(classSplit[1]) : 0); const colorIndex = ((classSplit.length > 1) ? parseInt(classSplit[1]) : 0);
const hasColorIndex = (classSplit.length > 1); const hasColorIndex = (classSplit.length > 1);
const allowStack = this.resolveBooleanFlag(furniture.allowstack, furniture.allow_stack, furniture.allowStack);
const furnitureData = new FurnitureData(FurnitureType.FLOOR, furniture.id, furniture.classname, className, furniture.category, furniture.name, furniture.description, furniture.revision, furniture.xdim, furniture.ydim, 0, colors, hasColorIndex, colorIndex, furniture.adurl, furniture.offerid, furniture.buyout, furniture.rentofferid, furniture.rentbuyout, furniture.bc, furniture.customparams, furniture.specialtype, furniture.canstandon, furniture.cansiton, furniture.canlayon, furniture.excludeddynamic, furniture.furniline, furniture.environment, furniture.rare); const furnitureData = new FurnitureData(FurnitureType.FLOOR, furniture.id, furniture.classname, className, furniture.category, furniture.name, furniture.description, furniture.revision, furniture.xdim, furniture.ydim, 0, colors, hasColorIndex, colorIndex, furniture.adurl, furniture.offerid, furniture.buyout, furniture.rentofferid, furniture.rentbuyout, furniture.bc, furniture.customparams, furniture.specialtype, allowStack, furniture.canstandon, furniture.cansiton, furniture.canlayon, furniture.excludeddynamic, furniture.furniline, furniture.environment, furniture.rare);
this._floorItems.set(furnitureData.id, furnitureData); this._floorItems.set(furnitureData.id, furnitureData);
@@ -99,7 +100,8 @@ export class FurnitureDataLoader
{ {
if(!furniture) continue; if(!furniture) continue;
const furnitureData = new FurnitureData(FurnitureType.WALL, furniture.id, furniture.classname, furniture.classname, furniture.category, furniture.name, furniture.description, furniture.revision, 0, 0, 0, null, false, 0, furniture.adurl, furniture.offerid, furniture.buyout, furniture.rentofferid, furniture.rentbuyout, furniture.bc, null, furniture.specialtype, false, false, false, furniture.excludeddynamic, furniture.furniline, furniture.environment, furniture.rare); const allowStack = this.resolveBooleanFlag(furniture.allowstack, furniture.allow_stack, furniture.allowStack);
const furnitureData = new FurnitureData(FurnitureType.WALL, furniture.id, furniture.classname, furniture.classname, furniture.category, furniture.name, furniture.description, furniture.revision, 0, 0, 0, null, false, 0, furniture.adurl, furniture.offerid, furniture.buyout, furniture.rentofferid, furniture.rentbuyout, furniture.bc, null, furniture.specialtype, allowStack, false, false, false, furniture.excludeddynamic, furniture.furniline, furniture.environment, furniture.rare);
this._wallItems.set(furnitureData.id, furnitureData); this._wallItems.set(furnitureData.id, furnitureData);
@@ -121,4 +123,26 @@ export class FurnitureDataLoader
return; return;
} }
} }
private resolveBooleanFlag(...values: any[]): boolean
{
for(const value of values)
{
if(value === undefined || value === null) continue;
if(typeof value === 'string')
{
const normalized = value.trim().toLowerCase();
if(!normalized.length) continue;
if([ '1', 'true', 'yes' ].includes(normalized)) return true;
if([ '0', 'false', 'no' ].includes(normalized)) return false;
}
return !!value;
}
return false;
}
} }
@@ -29,6 +29,11 @@ export class RoomDataHandler extends BaseHandler
const roomData = parser.data; const roomData = parser.data;
roomSession.tradeMode = roomData.tradeMode; roomSession.tradeMode = roomData.tradeMode;
roomSession.groupId = roomData.habboGroupId;
roomSession.hotelTimeZone = (parser.hotelTimeZoneId || 'UTC');
roomSession.hotelTimeSnapshotMs = parser.hotelCurrentTimeMs;
roomSession.hotelTimeSyncMs = Date.now();
roomSession.roomItemLimit = parser.roomItemLimit;
roomSession.isGuildRoom = (roomData.habboGroupId !== 0); roomSession.isGuildRoom = (roomData.habboGroupId !== 0);
roomSession.doorMode = roomData.doorMode; roomSession.doorMode = roomData.doorMode;
roomSession.allowPets = roomData.allowPets; roomSession.allowPets = roomData.allowPets;
@@ -78,6 +78,8 @@ export class RoomUsersHandler extends BaseHandler
userData.petLevel = user.petLevel; userData.petLevel = user.petLevel;
userData.botSkills = user.botSkills; userData.botSkills = user.botSkills;
userData.isModerator = user.isModerator; userData.isModerator = user.isModerator;
userData.roomEntryMethod = user.roomEntryMethod;
userData.roomEntryTeleportId = user.roomEntryTeleportId;
if(!session.userDataManager.getUserData(user.roomIndex)) usersToAdd.push(userData); if(!session.userDataManager.getUserData(user.roomIndex)) usersToAdd.push(userData);