nitro/libs/renderer/src/nitro/room/RoomObjectEventHandler.ts

2299 lines
85 KiB
TypeScript

import {
IFurnitureStackingHeightMap,
ILegacyWallGeometry,
IObjectData,
IRoomCanvasMouseListener,
IRoomEngineServices,
IRoomGeometry,
IRoomObject,
IRoomObjectController,
IRoomObjectEventManager,
ISelectedRoomObjectData,
IVector3D,
MouseEventType,
NitroConfiguration,
NitroLogger,
RoomObjectCategory,
RoomObjectOperationType,
RoomObjectPlacementSource,
RoomObjectType,
RoomObjectUserType,
RoomObjectVariable,
Vector3d,
} from "../../api";
import {Disposable} from "../../core";
import {
RoomEngineDimmerStateEvent,
RoomEngineObjectEvent,
RoomEngineObjectPlacedEvent,
RoomEngineObjectPlacedOnUserEvent,
RoomEngineObjectPlaySoundEvent,
RoomEngineRoomAdEvent,
RoomEngineSamplePlaybackEvent,
RoomEngineTriggerWidgetEvent,
RoomEngineUseProductEvent,
RoomObjectBadgeAssetEvent,
RoomObjectDataRequestEvent,
RoomObjectDimmerStateUpdateEvent,
RoomObjectEvent,
RoomObjectFloorHoleEvent,
RoomObjectFurnitureActionEvent,
RoomObjectHSLColorEnableEvent,
RoomObjectHSLColorEnabledEvent,
RoomObjectMouseEvent,
RoomObjectMoveEvent,
RoomObjectPlaySoundIdEvent,
RoomObjectRoomAdEvent,
RoomObjectSamplePlaybackEvent,
RoomObjectSoundMachineEvent,
RoomObjectStateChangedEvent,
RoomObjectTileMouseEvent,
RoomObjectWallMouseEvent,
RoomObjectWidgetRequestEvent,
RoomSpriteMouseEvent,
} from "../../events";
import {RoomEnterEffect, RoomId, RoomObjectUpdateMessage} from "../../room";
import {Nitro} from "../Nitro";
import {
BotPlaceComposer,
FurnitureColorWheelComposer,
FurnitureDiceActivateComposer,
FurnitureDiceDeactivateComposer,
FurnitureFloorUpdateComposer,
FurnitureGroupInfoComposer,
FurnitureMultiStateComposer,
FurnitureOneWayDoorComposer,
FurniturePickupComposer,
FurniturePlaceComposer,
FurniturePostItPlaceComposer,
FurnitureRandomStateComposer,
FurnitureWallMultiStateComposer,
FurnitureWallUpdateComposer,
GetItemDataComposer,
GetResolutionAchievementsMessageComposer,
PetMoveComposer,
PetPlaceComposer,
RemoveWallItemComposer,
RoomUnitLookComposer,
RoomUnitWalkComposer,
SetItemDataMessageComposer,
SetObjectDataMessageComposer,
} from "../communication";
import {
ObjectAvatarSelectedMessage,
ObjectDataUpdateMessage,
ObjectSelectedMessage,
ObjectTileCursorUpdateMessage,
ObjectVisibilityUpdateMessage,
} from "./messages";
import {SelectedRoomObjectData} from "./utils";
export class RoomObjectEventHandler extends Disposable implements IRoomCanvasMouseListener, IRoomObjectEventManager {
private _roomEngine: IRoomEngineServices;
private _eventIds: Map<number, Map<string, string>>;
private _selectedAvatarId: number;
private _selectedObjectId: number;
private _selectedObjectCategory: number;
private _whereYouClickIsWhereYouGo: boolean;
private _objectPlacementSource: string;
constructor(roomEngine: IRoomEngineServices) {
super();
this._roomEngine = roomEngine;
this._eventIds = new Map();
this._selectedAvatarId = -1;
this._selectedObjectId = -1;
this._selectedObjectCategory = -2;
this._whereYouClickIsWhereYouGo = true;
this._objectPlacementSource = null;
this.onRoomEngineObjectEvent = this.onRoomEngineObjectEvent.bind(this);
this._roomEngine.events.addEventListener(RoomEngineObjectEvent.ADDED, this.onRoomEngineObjectEvent);
}
public override dispose(): void {
if (this._eventIds) {
this._eventIds = null;
}
this._roomEngine.events.removeEventListener(RoomEngineObjectEvent.ADDED, this.onRoomEngineObjectEvent);
this._roomEngine = null;
}
private onRoomEngineObjectEvent(event: RoomEngineObjectEvent): void {
let selectedData = this.getSelectedRoomObjectData(event.roomId);
if (!selectedData) return;
if (selectedData.operation === RoomObjectOperationType.OBJECT_PLACE && selectedData.id === event.objectId) {
const roomObject = this._roomEngine.getRoomObject(event.roomId, selectedData.id, selectedData.category);
if (roomObject && roomObject.model) {
if (selectedData.category === RoomObjectCategory.FLOOR) {
const allowedDirections = roomObject.model.getValue<number[]>(RoomObjectVariable.FURNITURE_ALLOWED_DIRECTIONS);
if (allowedDirections && allowedDirections.length) {
const direction = new Vector3d(allowedDirections[0]);
roomObject.setDirection(direction);
this.updateSelectedObjectData(
event.roomId,
selectedData.id,
selectedData.category,
selectedData.loc,
direction,
selectedData.operation,
selectedData.typeId,
selectedData.instanceData,
selectedData.stuffData,
selectedData.state,
selectedData.animFrame,
selectedData.posture
);
selectedData = this.getSelectedRoomObjectData(event.roomId);
if (!selectedData) return;
}
}
}
this.setFurnitureAlphaMultiplier(roomObject, 0.5);
}
}
public processRoomCanvasMouseEvent(event: RoomSpriteMouseEvent, object: IRoomObject, geometry: IRoomGeometry): void {
if (!event || !object) return;
if (RoomEnterEffect.isRunning()) return;
const type = object.type;
let category = this._roomEngine.getRoomObjectCategoryForType(type);
if (category !== RoomObjectCategory.ROOM && (!this._roomEngine.isPlayingGame() || category !== RoomObjectCategory.UNIT))
category = RoomObjectCategory.MINIMUM;
const _local_7 = this.getMouseEventId(category, event.type);
if (_local_7 === event.eventId) {
if (
event.type === MouseEventType.MOUSE_CLICK ||
event.type === MouseEventType.DOUBLE_CLICK ||
event.type === MouseEventType.MOUSE_DOWN ||
event.type === MouseEventType.MOUSE_UP ||
event.type === MouseEventType.MOUSE_MOVE
)
return;
} else {
if (event.eventId) {
this.setMouseEventId(category, event.type, event.eventId);
}
}
if (object.mouseHandler) object.mouseHandler.mouseEvent(event, geometry);
}
public processRoomObjectPlacement(
placementSource: string,
roomId: number,
id: number,
category: number,
typeId: number,
extra: string = null,
stuffData: IObjectData = null,
state: number = -1,
frameNumber: number = -1,
posture: string = null
): boolean {
this._objectPlacementSource = placementSource;
const location = new Vector3d(-100, -100);
const direction = new Vector3d(0);
this.setSelectedRoomObjectData(
roomId,
id,
category,
location,
direction,
RoomObjectOperationType.OBJECT_PLACE,
typeId,
extra,
stuffData,
state,
frameNumber,
posture
);
if (this._roomEngine) {
this._roomEngine.setObjectMoverIconSprite(typeId, category, false, extra, stuffData, state, frameNumber, posture);
this._roomEngine.setObjectMoverIconSpriteVisible(false);
}
return true;
}
public cancelRoomObjectInsert(k: number): boolean {
this.resetSelectedObjectData(k);
return true;
}
private getMouseEventId(k: number, _arg_2: string): string {
const existing = this._eventIds.get(k);
if (!existing) return null;
return existing.get(_arg_2) || null;
}
private setMouseEventId(k: number, _arg_2: string, _arg_3: string): void {
let existing = this._eventIds.get(k);
if (!existing) {
existing = new Map();
this._eventIds.set(k, existing);
}
existing.delete(_arg_2);
existing.set(_arg_2, _arg_3);
}
public handleRoomObjectEvent(event: RoomObjectEvent, roomId: number): void {
if (!event) return;
if (event instanceof RoomObjectMouseEvent) {
this.handleRoomObjectMouseEvent(event, roomId);
return;
}
switch (event.type) {
case RoomObjectStateChangedEvent.STATE_CHANGE:
case RoomObjectStateChangedEvent.STATE_RANDOM:
this.onRoomObjectStateChangedEvent(event as RoomObjectStateChangedEvent, roomId);
return;
case RoomObjectDimmerStateUpdateEvent.DIMMER_STATE:
this.onRoomObjectDimmerStateUpdateEvent(event as RoomObjectDimmerStateUpdateEvent, roomId);
return;
case RoomObjectMoveEvent.POSITION_CHANGED:
case RoomObjectMoveEvent.OBJECT_REMOVED:
this.handleSelectedObjectRemove(event as RoomObjectMoveEvent, roomId);
return;
case RoomObjectWidgetRequestEvent.OPEN_WIDGET:
case RoomObjectWidgetRequestEvent.CLOSE_WIDGET:
case RoomObjectWidgetRequestEvent.OPEN_FURNI_CONTEXT_MENU:
case RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU:
case RoomObjectWidgetRequestEvent.PLACEHOLDER:
case RoomObjectWidgetRequestEvent.CREDITFURNI:
case RoomObjectWidgetRequestEvent.STACK_HEIGHT:
case RoomObjectWidgetRequestEvent.EXTERNAL_IMAGE:
case RoomObjectWidgetRequestEvent.STICKIE:
case RoomObjectWidgetRequestEvent.PRESENT:
case RoomObjectWidgetRequestEvent.TROPHY:
case RoomObjectWidgetRequestEvent.TEASER:
case RoomObjectWidgetRequestEvent.ECOTRONBOX:
case RoomObjectWidgetRequestEvent.DIMMER:
case RoomObjectWidgetRequestEvent.WIDGET_REMOVE_DIMMER:
case RoomObjectWidgetRequestEvent.CLOTHING_CHANGE:
case RoomObjectWidgetRequestEvent.JUKEBOX_PLAYLIST_EDITOR:
case RoomObjectWidgetRequestEvent.MANNEQUIN:
case RoomObjectWidgetRequestEvent.PET_PRODUCT_MENU:
case RoomObjectWidgetRequestEvent.GUILD_FURNI_CONTEXT_MENU:
case RoomObjectWidgetRequestEvent.MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG:
case RoomObjectWidgetRequestEvent.PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG:
case RoomObjectWidgetRequestEvent.BACKGROUND_COLOR:
case RoomObjectWidgetRequestEvent.MYSTERYBOX_OPEN_DIALOG:
case RoomObjectWidgetRequestEvent.EFFECTBOX_OPEN_DIALOG:
case RoomObjectWidgetRequestEvent.MYSTERYTROPHY_OPEN_DIALOG:
case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_OPEN:
case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_ENGRAVING:
case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_FAILED:
case RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_CONFIRM:
case RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_ENGRAVING:
case RoomObjectWidgetRequestEvent.BADGE_DISPLAY_ENGRAVING:
case RoomObjectWidgetRequestEvent.HIGH_SCORE_DISPLAY:
case RoomObjectWidgetRequestEvent.HIDE_HIGH_SCORE_DISPLAY:
case RoomObjectWidgetRequestEvent.INERNAL_LINK:
case RoomObjectWidgetRequestEvent.ROOM_LINK:
case RoomObjectWidgetRequestEvent.YOUTUBE:
this.onRoomObjectWidgetRequestEvent(event as RoomObjectWidgetRequestEvent, roomId);
return;
case RoomObjectFurnitureActionEvent.DICE_ACTIVATE:
case RoomObjectFurnitureActionEvent.DICE_OFF:
case RoomObjectFurnitureActionEvent.USE_HABBOWHEEL:
case RoomObjectFurnitureActionEvent.STICKIE:
case RoomObjectFurnitureActionEvent.ENTER_ONEWAYDOOR:
this.onRoomObjectFurnitureActionEvent(event as RoomObjectFurnitureActionEvent, roomId);
return;
case RoomObjectFurnitureActionEvent.SOUND_MACHINE_INIT:
case RoomObjectFurnitureActionEvent.SOUND_MACHINE_START:
case RoomObjectFurnitureActionEvent.SOUND_MACHINE_STOP:
case RoomObjectFurnitureActionEvent.SOUND_MACHINE_DISPOSE:
this.handleObjectSoundMachineEvent(event, roomId);
return;
case RoomObjectFurnitureActionEvent.JUKEBOX_INIT:
case RoomObjectFurnitureActionEvent.JUKEBOX_START:
case RoomObjectFurnitureActionEvent.JUKEBOX_MACHINE_STOP:
case RoomObjectFurnitureActionEvent.JUKEBOX_DISPOSE:
this.handleObjectJukeboxEvent(event, roomId);
return;
case RoomObjectFloorHoleEvent.ADD_HOLE:
case RoomObjectFloorHoleEvent.REMOVE_HOLE:
this.onRoomObjectFloorHoleEvent(event as RoomObjectFloorHoleEvent, roomId);
return;
case RoomObjectRoomAdEvent.ROOM_AD_FURNI_CLICK:
case RoomObjectRoomAdEvent.ROOM_AD_FURNI_DOUBLE_CLICK:
case RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_SHOW:
case RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_HIDE:
case RoomObjectRoomAdEvent.ROOM_AD_LOAD_IMAGE:
this.onRoomObjectRoomAdEvent(event as RoomObjectRoomAdEvent, roomId);
return;
case RoomObjectBadgeAssetEvent.LOAD_BADGE:
this.onRoomObjectBadgeAssetEvent(event as RoomObjectBadgeAssetEvent, roomId);
return;
case RoomObjectFurnitureActionEvent.MOUSE_ARROW:
case RoomObjectFurnitureActionEvent.MOUSE_BUTTON:
this.handleMousePointer(event as RoomObjectFurnitureActionEvent, roomId);
return;
case RoomObjectPlaySoundIdEvent.PLAY_SOUND:
case RoomObjectPlaySoundIdEvent.PLAY_SOUND_AT_PITCH:
this.handleRoomObjectPlaySoundEvent(event as RoomObjectPlaySoundIdEvent, roomId);
return;
case RoomObjectSamplePlaybackEvent.ROOM_OBJECT_INITIALIZED:
case RoomObjectSamplePlaybackEvent.ROOM_OBJECT_DISPOSED:
case RoomObjectSamplePlaybackEvent.PLAY_SAMPLE:
case RoomObjectSamplePlaybackEvent.CHANGE_PITCH:
this.handleRoomObjectSamplePlaybackEvent(event as RoomObjectSamplePlaybackEvent, roomId);
return;
case RoomObjectHSLColorEnableEvent.ROOM_BACKGROUND_COLOR:
this.onHSLColorEnableEvent(event as RoomObjectHSLColorEnableEvent, roomId);
return;
case RoomObjectDataRequestEvent.RODRE_CURRENT_USER_ID:
case RoomObjectDataRequestEvent.RODRE_URL_PREFIX:
this.onRoomObjectDataRequestEvent(event as RoomObjectDataRequestEvent, roomId);
return;
default:
NitroLogger.warn("Unhandled Event", event.constructor.name, "Object ID", event.object.id);
return;
}
}
private handleRoomObjectMouseEvent(event: RoomObjectMouseEvent, roomId: number): void {
if (!event || !event.type) return;
switch (event.type) {
case RoomObjectMouseEvent.CLICK:
this.handleRoomObjectMouseClickEvent(event, roomId);
return;
case RoomObjectMouseEvent.DOUBLE_CLICK:
this.handleRoomObjectMouseDoubleClickEvent(event, roomId);
return;
case RoomObjectMouseEvent.MOUSE_MOVE:
this.handleRoomObjectMouseMoveEvent(event, roomId);
return;
case RoomObjectMouseEvent.MOUSE_DOWN:
this.handleRoomObjectMouseDownEvent(event, roomId);
return;
case RoomObjectMouseEvent.MOUSE_DOWN_LONG:
this.handleRoomObjectMouseDownLongEvent(event, roomId);
return;
case RoomObjectMouseEvent.MOUSE_ENTER:
this.handleRoomObjectMouseEnterEvent(event, roomId);
return;
case RoomObjectMouseEvent.MOUSE_LEAVE:
this.handleRoomObjectMouseLeaveEvent(event, roomId);
return;
}
}
private handleRoomObjectMouseClickEvent(event: RoomObjectMouseEvent, roomId: number): void {
if (!event) return;
let operation = RoomObjectOperationType.OBJECT_UNDEFINED;
const selectedData = this.getSelectedRoomObjectData(roomId);
if (selectedData) operation = selectedData.operation;
let didWalk = false;
let didMove = false;
if (this._whereYouClickIsWhereYouGo) {
if (!operation || operation === RoomObjectOperationType.OBJECT_UNDEFINED) {
didWalk = this.handleMoveTargetFurni(roomId, event);
}
}
const category = this._roomEngine.getRoomObjectCategoryForType(event.objectType);
switch (operation) {
case RoomObjectOperationType.OBJECT_MOVE:
if (category === RoomObjectCategory.ROOM) {
if (selectedData) {
this.modifyRoomObject(roomId, selectedData.id, selectedData.category, RoomObjectOperationType.OBJECT_MOVE_TO);
}
} else if (category === RoomObjectCategory.UNIT) {
if (selectedData && event.objectType === RoomObjectUserType.MONSTER_PLANT) {
this.modifyRoomObject(roomId, selectedData.id, selectedData.category, RoomObjectOperationType.OBJECT_MOVE_TO);
}
if (event.eventId) this.setMouseEventId(RoomObjectCategory.ROOM, MouseEventType.MOUSE_CLICK, event.eventId);
this.placeObjectOnUser(roomId, event.objectId, category);
}
didMove = true;
if (event.objectId !== -1) this.setSelectedObject(roomId, event.objectId, category);
break;
case RoomObjectOperationType.OBJECT_PLACE:
if (category === RoomObjectCategory.ROOM) {
this.placeObject(roomId, event instanceof RoomObjectTileMouseEvent, event instanceof RoomObjectWallMouseEvent);
} else if (category === RoomObjectCategory.UNIT) {
switch (event.objectType) {
case RoomObjectUserType.MONSTER_PLANT:
case RoomObjectUserType.RENTABLE_BOT:
this.placeObject(roomId, event instanceof RoomObjectTileMouseEvent, event instanceof RoomObjectWallMouseEvent);
break;
default:
if (event.eventId) {
this.setMouseEventId(RoomObjectCategory.ROOM, MouseEventType.MOUSE_CLICK, event.eventId);
}
this.placeObjectOnUser(roomId, event.objectId, category);
break;
}
}
break;
case RoomObjectOperationType.OBJECT_UNDEFINED:
if (category === RoomObjectCategory.ROOM) {
if (!didWalk && event instanceof RoomObjectTileMouseEvent) this.onRoomObjectTileMouseEvent(roomId, event);
} else {
this.setSelectedObject(roomId, event.objectId, category);
didMove = false;
if (category === RoomObjectCategory.UNIT) {
if (event.ctrlKey && !event.altKey && !event.shiftKey && event.objectType === RoomObjectUserType.RENTABLE_BOT) {
this.modifyRoomObject(roomId, event.objectId, category, RoomObjectOperationType.OBJECT_PICKUP_BOT);
} else if (event.ctrlKey && !event.altKey && !event.shiftKey && event.objectType === RoomObjectUserType.MONSTER_PLANT) {
this.modifyRoomObject(roomId, event.objectId, category, RoomObjectOperationType.OBJECT_PICKUP_PET);
} else if (!event.ctrlKey && !event.altKey && event.shiftKey && event.objectType === RoomObjectUserType.MONSTER_PLANT) {
this.modifyRoomObject(roomId, event.objectId, category, RoomObjectOperationType.OBJECT_ROTATE_POSITIVE);
}
if (!this._roomEngine.isPlayingGame()) {
didWalk = true;
} else {
didMove = true;
}
} else if (category === RoomObjectCategory.FLOOR || category === RoomObjectCategory.WALL) {
if (event.altKey || event.ctrlKey || event.shiftKey) {
if (!event.ctrlKey && !event.altKey && event.shiftKey) {
if (category === RoomObjectCategory.FLOOR) {
if (this._roomEngine.events) {
this._roomEngine.events.dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.REQUEST_ROTATE, roomId, event.objectId, category));
}
}
} else if (event.ctrlKey && !event.altKey && !event.shiftKey) {
this.modifyRoomObject(roomId, event.objectId, category, RoomObjectOperationType.OBJECT_PICKUP);
}
if (!this._roomEngine.isPlayingGame()) {
didWalk = true;
} else {
didMove = true;
}
}
}
if (event.eventId) {
if (didWalk) {
this.setMouseEventId(RoomObjectCategory.ROOM, MouseEventType.MOUSE_CLICK, event.eventId);
}
if (didMove) {
this.setMouseEventId(RoomObjectCategory.MINIMUM, MouseEventType.MOUSE_CLICK, event.eventId);
}
}
}
break;
}
if (category === RoomObjectCategory.ROOM) {
const _local_15 = this.getMouseEventId(RoomObjectCategory.MINIMUM, MouseEventType.MOUSE_CLICK);
const _local_16 = this.getMouseEventId(RoomObjectCategory.UNIT, MouseEventType.MOUSE_CLICK);
if (_local_15 !== event.eventId && _local_16 !== event.eventId && !didMove) {
this.deselectObject(roomId);
if (this._roomEngine.events)
this._roomEngine.events.dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.DESELECTED, roomId, -1, RoomObjectCategory.MINIMUM));
this.setSelectedAvatar(roomId, 0, false);
}
}
}
private handleRoomObjectMouseDoubleClickEvent(event: RoomObjectMouseEvent, roomId: number): void {
const id = event.objectId;
const type = event.objectType;
const category = this._roomEngine.getRoomObjectCategoryForType(type);
if (this._roomEngine.events) {
this._roomEngine.events.dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.DOUBLE_CLICK, roomId, id, category));
}
}
private handleRoomObjectMouseMoveEvent(event: RoomObjectMouseEvent, roomId: number): void {
if (!event) return;
let operation = RoomObjectOperationType.OBJECT_UNDEFINED;
const selectedData = this.getSelectedRoomObjectData(roomId);
if (selectedData) operation = selectedData.operation;
const category = this._roomEngine.getRoomObjectCategoryForType(event.objectType);
if (this._roomEngine) {
const roomCursor = this._roomEngine.getRoomObjectCursor(roomId);
if (roomCursor && roomCursor.logic) {
let newEvent: ObjectTileCursorUpdateMessage = null;
if (event instanceof RoomObjectTileMouseEvent) {
newEvent = this.handleMouseOverTile(event, roomId);
} else if (event.object && event.object.id !== -1) {
if (this._whereYouClickIsWhereYouGo) {
newEvent = this.handleMouseOverObject(category, roomId, event);
}
} else {
newEvent = new ObjectTileCursorUpdateMessage(null, 0, false, event.eventId);
}
roomCursor.processUpdateMessage(newEvent);
}
}
switch (operation) {
case RoomObjectOperationType.OBJECT_MOVE:
if (category === RoomObjectCategory.ROOM) this.handleObjectMove(event, roomId);
return;
case RoomObjectOperationType.OBJECT_PLACE:
if (category === RoomObjectCategory.ROOM) this.handleObjectPlace(event, roomId);
return;
}
}
private handleRoomObjectMouseDownEvent(event: RoomObjectMouseEvent, roomId: number): void {
if (!event) return;
let operation = RoomObjectOperationType.OBJECT_UNDEFINED;
const selectedData = this.getSelectedRoomObjectData(roomId);
if (selectedData) operation = selectedData.operation;
const category = this._roomEngine.getRoomObjectCategoryForType(event.objectType);
switch (operation) {
case RoomObjectOperationType.OBJECT_UNDEFINED:
if (category === RoomObjectCategory.FLOOR || category === RoomObjectCategory.WALL || event.objectType === RoomObjectUserType.MONSTER_PLANT) {
if ((event.altKey && !event.ctrlKey && !event.shiftKey) || this.decorateModeMove(event)) {
if (this._roomEngine.events)
this._roomEngine.events.dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.REQUEST_MOVE, roomId, event.objectId, category));
}
}
return;
}
}
private handleRoomObjectMouseDownLongEvent(event: RoomObjectMouseEvent, roomId: number): void {
if (!event) return;
let operation = RoomObjectOperationType.OBJECT_UNDEFINED;
const selectedData = this.getSelectedRoomObjectData(roomId);
if (selectedData) operation = selectedData.operation;
const category = this._roomEngine.getRoomObjectCategoryForType(event.objectType);
switch (operation) {
case RoomObjectOperationType.OBJECT_UNDEFINED:
if (category === RoomObjectCategory.FLOOR || category === RoomObjectCategory.WALL || event.objectType === RoomObjectUserType.MONSTER_PLANT) {
if ((!event.ctrlKey && !event.shiftKey) || this.decorateModeMove(event)) {
if (this._roomEngine.events)
this._roomEngine.events.dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.REQUEST_MANIPULATION, roomId, event.objectId, category));
}
}
return;
}
}
private handleRoomObjectMouseEnterEvent(event: RoomObjectMouseEvent, roomId: number): void {
const id = event.objectId;
const type = event.objectType;
const category = this._roomEngine.getRoomObjectCategoryForType(type);
if (this._roomEngine.events) {
this._roomEngine.events.dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.MOUSE_ENTER, roomId, id, category));
}
}
private handleRoomObjectMouseLeaveEvent(event: RoomObjectMouseEvent, roomId: number): void {
const id = event.objectId;
const type = event.objectType;
const category = this._roomEngine.getRoomObjectCategoryForType(type);
if (category !== RoomObjectCategory.ROOM) {
if (category === RoomObjectCategory.UNIT) {
const cursor = this._roomEngine.getRoomObjectCursor(roomId);
if (cursor) cursor.processUpdateMessage(new ObjectDataUpdateMessage(0, null));
}
}
if (this._roomEngine.events) {
this._roomEngine.events.dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.MOUSE_LEAVE, roomId, id, category));
}
return;
}
private onRoomObjectStateChangedEvent(event: RoomObjectStateChangedEvent, roomId: number): void {
if (!event) return;
switch (event.type) {
case RoomObjectStateChangedEvent.STATE_CHANGE:
this.changeObjectState(roomId, event.object.id, event.object.type, event.state, false);
return;
case RoomObjectStateChangedEvent.STATE_RANDOM:
this.changeObjectState(roomId, event.object.id, event.object.type, event.state, true);
return;
}
}
private onRoomObjectDimmerStateUpdateEvent(event: RoomObjectDimmerStateUpdateEvent, roomId: number): void {
if (!event) return;
switch (event.type) {
case RoomObjectDimmerStateUpdateEvent.DIMMER_STATE:
this._roomEngine.events.dispatchEvent(
new RoomEngineDimmerStateEvent(roomId, event.state, event.presetId, event.effectId, event.color, event.brightness)
);
return;
}
}
private handleSelectedObjectRemove(event: RoomObjectMoveEvent, roomId: number): void {
if (!event || !this._roomEngine) return;
switch (event.type) {
case RoomObjectMoveEvent.POSITION_CHANGED: {
const objectId = event.objectId;
const objectType = event.objectType;
const objectCategory = this._roomEngine.getRoomObjectCategoryForType(objectType);
const object = this._roomEngine.getRoomObject(roomId, objectId, objectCategory);
const selectionArrow = this._roomEngine.getRoomObjectSelectionArrow(roomId);
if (object && selectionArrow && selectionArrow.logic) {
const location = object.getLocation();
selectionArrow.logic.processUpdateMessage(new RoomObjectUpdateMessage(location, null));
}
return;
}
case RoomObjectMoveEvent.OBJECT_REMOVED:
this.setSelectedAvatar(roomId, 0, false);
return;
}
}
private onRoomObjectWidgetRequestEvent(event: RoomObjectWidgetRequestEvent, roomId: number): void {
if (!event || !this._roomEngine) return;
const objectId = event.objectId;
const objectType = event.objectType;
const objectCategory = this._roomEngine.getRoomObjectCategoryForType(objectType);
const eventDispatcher = this._roomEngine.events;
if (!eventDispatcher) return;
if (RoomId.isRoomPreviewerId(roomId)) return;
switch (event.type) {
case RoomObjectWidgetRequestEvent.OPEN_WIDGET:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(
RoomEngineTriggerWidgetEvent.OPEN_WIDGET,
roomId,
objectId,
objectCategory,
(event.object as IRoomObjectController).logic.widget
)
);
return;
case RoomObjectWidgetRequestEvent.CLOSE_WIDGET:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(
RoomEngineTriggerWidgetEvent.CLOSE_WIDGET,
roomId,
objectId,
objectCategory,
(event.object as IRoomObjectController).logic.widget
)
);
return;
case RoomObjectWidgetRequestEvent.OPEN_FURNI_CONTEXT_MENU:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(
RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU,
roomId,
objectId,
objectCategory,
(event.object as IRoomObjectController).logic.contextMenu
)
);
return;
case RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.PLACEHOLDER:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLACEHOLDER, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.CREDITFURNI:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_CREDITFURNI, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.STACK_HEIGHT:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_STACK_HEIGHT, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.EXTERNAL_IMAGE:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_EXTERNAL_IMAGE, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.STICKIE:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_STICKIE, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.PRESENT:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PRESENT, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.TROPHY:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_TROPHY, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.TEASER:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_TEASER, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.ECOTRONBOX:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ECOTRONBOX, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.DIMMER:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.WIDGET_REMOVE_DIMMER:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REMOVE_DIMMER, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.CLOTHING_CHANGE:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_CLOTHING_CHANGE, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.JUKEBOX_PLAYLIST_EDITOR:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLAYLIST_EDITOR, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.MANNEQUIN:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MANNEQUIN, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.PET_PRODUCT_MENU:
eventDispatcher.dispatchEvent(new RoomEngineUseProductEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.GUILD_FURNI_CONTEXT_MENU:
this._roomEngine.connection.send(
new FurnitureGroupInfoComposer(event.objectId, event.object.model.getValue<number>(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_GUILD_ID))
);
return;
case RoomObjectWidgetRequestEvent.MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.BACKGROUND_COLOR:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.MYSTERYBOX_OPEN_DIALOG:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYBOX_OPEN_DIALOG, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.EFFECTBOX_OPEN_DIALOG:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.MYSTERYTROPHY_OPEN_DIALOG:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYTROPHY_OPEN_DIALOG, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_OPEN:
this._roomEngine.connection.send(new GetResolutionAchievementsMessageComposer(event.objectId, 0));
return;
case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_ENGRAVING:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_FAILED:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_CONFIRM:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_CONFIRM, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_ENGRAVING:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.BADGE_DISPLAY_ENGRAVING:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.HIGH_SCORE_DISPLAY:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.HIDE_HIGH_SCORE_DISPLAY:
eventDispatcher.dispatchEvent(
new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, roomId, objectId, objectCategory)
);
return;
case RoomObjectWidgetRequestEvent.INERNAL_LINK:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.ROOM_LINK:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK, roomId, objectId, objectCategory));
return;
case RoomObjectWidgetRequestEvent.YOUTUBE:
eventDispatcher.dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_YOUTUBE, roomId, objectId, objectCategory));
return;
}
}
private onRoomObjectFurnitureActionEvent(event: RoomObjectFurnitureActionEvent, roomId: number): void {
if (!event) return;
this.useObject(roomId, event.object.id, event.object.type, event.type);
}
private handleObjectSoundMachineEvent(event: RoomObjectEvent, roomId: number): void {
if (!event) return;
const objectCategory = this._roomEngine.getRoomObjectCategoryForType(event.objectType);
const selectedData = this.getSelectedRoomObjectData(roomId);
if (selectedData) {
if (selectedData.category === objectCategory && selectedData.id === event.objectId) {
if (selectedData.operation === RoomObjectOperationType.OBJECT_PLACE) return;
}
}
switch (event.type) {
case RoomObjectFurnitureActionEvent.SOUND_MACHINE_INIT:
this._roomEngine.events.dispatchEvent(
new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_INIT, roomId, event.objectId, objectCategory)
);
return;
case RoomObjectFurnitureActionEvent.SOUND_MACHINE_START:
this._roomEngine.events.dispatchEvent(
new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_SWITCHED_ON, roomId, event.objectId, objectCategory)
);
return;
case RoomObjectFurnitureActionEvent.SOUND_MACHINE_STOP:
this._roomEngine.events.dispatchEvent(
new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_SWITCHED_OFF, roomId, event.objectId, objectCategory)
);
return;
case RoomObjectFurnitureActionEvent.SOUND_MACHINE_DISPOSE:
this._roomEngine.events.dispatchEvent(
new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_DISPOSE, roomId, event.objectId, objectCategory)
);
return;
}
}
private handleObjectJukeboxEvent(event: RoomObjectEvent, roomId: number): void {
if (!event) return;
const objectCategory = this._roomEngine.getRoomObjectCategoryForType(event.objectType);
const selectedData = this.getSelectedRoomObjectData(roomId);
if (selectedData) {
if (selectedData.category === objectCategory && selectedData.id === event.objectId) {
if (selectedData.operation === RoomObjectOperationType.OBJECT_PLACE) return;
}
}
switch (event.type) {
case RoomObjectFurnitureActionEvent.JUKEBOX_INIT:
this._roomEngine.events.dispatchEvent(
new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_INIT, roomId, event.objectId, objectCategory)
);
return;
case RoomObjectFurnitureActionEvent.JUKEBOX_START:
this._roomEngine.events.dispatchEvent(
new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_SWITCHED_ON, roomId, event.objectId, objectCategory)
);
return;
case RoomObjectFurnitureActionEvent.JUKEBOX_MACHINE_STOP:
this._roomEngine.events.dispatchEvent(
new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_SWITCHED_OFF, roomId, event.objectId, objectCategory)
);
return;
case RoomObjectFurnitureActionEvent.JUKEBOX_DISPOSE:
this._roomEngine.events.dispatchEvent(
new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_DISPOSE, roomId, event.objectId, objectCategory)
);
return;
}
}
private onRoomObjectFloorHoleEvent(event: RoomObjectFloorHoleEvent, roomId: number): void {
if (!event) return;
switch (event.type) {
case RoomObjectFloorHoleEvent.ADD_HOLE:
this._roomEngine.addRoomInstanceFloorHole(roomId, event.objectId);
return;
case RoomObjectFloorHoleEvent.REMOVE_HOLE:
this._roomEngine.removeRoomInstanceFloorHole(roomId, event.objectId);
return;
}
}
private onRoomObjectRoomAdEvent(event: RoomObjectRoomAdEvent, roomId: number): void {
if (!event) return;
let eventType: string = null;
switch (event.type) {
case RoomObjectRoomAdEvent.ROOM_AD_FURNI_CLICK:
this._roomEngine.events.dispatchEvent(event);
if (event.clickUrl && event.clickUrl.length > 0) {
Nitro.instance.createLinkEvent(event.clickUrl);
}
eventType = RoomEngineRoomAdEvent.FURNI_CLICK;
break;
case RoomObjectRoomAdEvent.ROOM_AD_FURNI_DOUBLE_CLICK:
if (event.clickUrl && event.clickUrl.length > 0) {
const catalogPage = "CATALOG_PAGE";
if (event.clickUrl.indexOf(catalogPage) === 0) {
Nitro.instance.createLinkEvent(event.clickUrl.substr(catalogPage.length));
}
}
eventType = RoomEngineRoomAdEvent.FURNI_DOUBLE_CLICK;
break;
case RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_SHOW:
eventType = RoomEngineRoomAdEvent.TOOLTIP_SHOW;
break;
case RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_HIDE:
eventType = RoomEngineRoomAdEvent.TOOLTIP_HIDE;
break;
}
if (eventType)
this._roomEngine.events.dispatchEvent(
new RoomEngineObjectEvent(eventType, roomId, event.objectId, this._roomEngine.getRoomObjectCategoryForType(event.objectType))
);
}
private onRoomObjectBadgeAssetEvent(event: RoomObjectBadgeAssetEvent, roomId: number): void {
if (!event || !this._roomEngine) return;
switch (event.type) {
case RoomObjectBadgeAssetEvent.LOAD_BADGE: {
const objectId = event.objectId;
const objectType = event.objectType;
const objectCategory = this._roomEngine.getRoomObjectCategoryForType(objectType);
this._roomEngine.loadRoomObjectBadgeImage(roomId, objectId, objectCategory, event.badgeId, event.groupBadge);
return;
}
}
}
private handleMousePointer(event: RoomObjectFurnitureActionEvent, roomId: number): void {
if (!event) return;
this._roomEngine.updateMousePointer(event.type, event.objectId, event.objectType);
}
private handleRoomObjectPlaySoundEvent(event: RoomObjectPlaySoundIdEvent, roomId: number): void {
const objectCategory = this._roomEngine.getRoomObjectCategoryForType(event.objectType);
switch (event.type) {
case RoomObjectPlaySoundIdEvent.PLAY_SOUND:
this._roomEngine.events.dispatchEvent(
new RoomEngineObjectPlaySoundEvent(RoomEngineObjectPlaySoundEvent.PLAY_SOUND, roomId, event.objectId, objectCategory, event.soundId, event.pitch)
);
return;
case RoomObjectPlaySoundIdEvent.PLAY_SOUND_AT_PITCH:
this._roomEngine.events.dispatchEvent(
new RoomEngineObjectPlaySoundEvent(
RoomEngineObjectPlaySoundEvent.PLAY_SOUND_AT_PITCH,
roomId,
event.objectId,
objectCategory,
event.soundId,
event.pitch
)
);
return;
}
}
private handleRoomObjectSamplePlaybackEvent(event: RoomObjectSamplePlaybackEvent, roomId: number): void {
if (!event) return;
const objectCategory = this._roomEngine.getRoomObjectCategoryForType(event.objectType);
switch (event.type) {
case RoomObjectSamplePlaybackEvent.ROOM_OBJECT_INITIALIZED:
this._roomEngine.events.dispatchEvent(
new RoomEngineSamplePlaybackEvent(
RoomEngineSamplePlaybackEvent.ROOM_OBJECT_INITIALIZED,
roomId,
event.objectId,
objectCategory,
event.sampleId,
event.pitch
)
);
break;
case RoomObjectSamplePlaybackEvent.ROOM_OBJECT_DISPOSED:
this._roomEngine.events.dispatchEvent(
new RoomEngineSamplePlaybackEvent(
RoomEngineSamplePlaybackEvent.ROOM_OBJECT_DISPOSED,
roomId,
event.objectId,
objectCategory,
event.sampleId,
event.pitch
)
);
break;
case RoomObjectSamplePlaybackEvent.PLAY_SAMPLE:
this._roomEngine.events.dispatchEvent(
new RoomEngineSamplePlaybackEvent(RoomEngineSamplePlaybackEvent.PLAY_SAMPLE, roomId, event.objectId, objectCategory, event.sampleId, event.pitch)
);
break;
case RoomObjectSamplePlaybackEvent.CHANGE_PITCH:
this._roomEngine.events.dispatchEvent(
new RoomEngineSamplePlaybackEvent(RoomEngineSamplePlaybackEvent.CHANGE_PITCH, roomId, event.objectId, objectCategory, event.sampleId, event.pitch)
);
break;
}
}
private onHSLColorEnableEvent(event: RoomObjectHSLColorEnableEvent, roomId: number): void {
if (!event || !this._roomEngine) return;
switch (event.type) {
case RoomObjectHSLColorEnableEvent.ROOM_BACKGROUND_COLOR:
this._roomEngine.events.dispatchEvent(
new RoomObjectHSLColorEnabledEvent(
RoomObjectHSLColorEnabledEvent.ROOM_BACKGROUND_COLOR,
roomId,
event.enable,
event.hue,
event.saturation,
event.lightness
)
);
return;
}
}
private onRoomObjectDataRequestEvent(event: RoomObjectDataRequestEvent, roomId: number): void {
if (!event || !this._roomEngine || !event.object) return;
switch (event.type) {
case RoomObjectDataRequestEvent.RODRE_CURRENT_USER_ID:
event.object.model.setValue(RoomObjectVariable.SESSION_CURRENT_USER_ID, this._roomEngine.sessionDataManager.userId);
return;
case RoomObjectDataRequestEvent.RODRE_URL_PREFIX:
event.object.model.setValue(RoomObjectVariable.SESSION_URL_PREFIX, NitroConfiguration.getValue("url.prefix"));
return;
}
}
private onRoomObjectTileMouseEvent(roomId: number, event: RoomObjectTileMouseEvent): void {
if (!this._roomEngine || this._roomEngine.isDecorating || !this._roomEngine.roomSessionManager) return;
const session = this._roomEngine.roomSessionManager.getSession(roomId);
if (!session || session.isSpectator) return;
this.sendWalkUpdate(event.tileXAsInt, event.tileYAsInt);
}
private handleObjectMove(event: RoomObjectMouseEvent, roomId: number): void {
if (!event || !this._roomEngine) return;
const eventDispatcher = this._roomEngine.events;
if (!eventDispatcher) return;
const selectedData = this.getSelectedRoomObjectData(roomId);
if (!selectedData) return;
const roomObject = this._roomEngine.getRoomObject(roomId, selectedData.id, selectedData.category);
if (!roomObject) return;
let _local_6 = true;
if (selectedData.category === RoomObjectCategory.FLOOR || selectedData.category === RoomObjectCategory.UNIT) {
const stackingHeightMap = this._roomEngine.getFurnitureStackingHeightMap(roomId);
if (
!(
event instanceof RoomObjectTileMouseEvent &&
this.handleFurnitureMove(roomObject, selectedData, Math.trunc(event.tileX + 0.5), Math.trunc(event.tileY + 0.5), stackingHeightMap)
)
) {
this.handleFurnitureMove(roomObject, selectedData, selectedData.loc.x, selectedData.loc.y, stackingHeightMap);
_local_6 = false;
}
} else if (selectedData.category === RoomObjectCategory.WALL) {
_local_6 = false;
if (event instanceof RoomObjectWallMouseEvent) {
const _local_10 = event.wallLocation;
const _local_11 = event.wallWidth;
const _local_12 = event.wallHeight;
const _local_13 = event.x;
const _local_14 = event.y;
const _local_15 = event.direction;
if (this.handleWallItemMove(roomObject, selectedData, _local_10, _local_11, _local_12, _local_13, _local_14, _local_15)) {
_local_6 = true;
}
}
if (!_local_6) {
roomObject.setLocation(selectedData.loc);
roomObject.setDirection(selectedData.dir);
}
this._roomEngine.updateRoomObjectMask(roomId, selectedData.id, _local_6);
}
if (_local_6) {
this.setFurnitureAlphaMultiplier(roomObject, 0.5);
this._roomEngine.setObjectMoverIconSpriteVisible(false);
} else {
this.setFurnitureAlphaMultiplier(roomObject, 0);
this._roomEngine.setObjectMoverIconSpriteVisible(true);
}
}
private handleObjectPlace(event: RoomObjectMouseEvent, roomId: number): void {
if (!event || !this._roomEngine) return;
const eventDispatcher = this._roomEngine.events;
if (!eventDispatcher) return;
let selectedData = this.getSelectedRoomObjectData(roomId);
if (!selectedData) return;
let roomObject = this._roomEngine.getRoomObject(roomId, selectedData.id, selectedData.category);
if (!roomObject) {
if (event instanceof RoomObjectTileMouseEvent) {
if (selectedData.category === RoomObjectCategory.FLOOR) {
this._roomEngine.addFurnitureFloor(
roomId,
selectedData.id,
selectedData.typeId,
selectedData.loc,
selectedData.dir,
0,
selectedData.stuffData,
parseFloat(selectedData.instanceData),
-1,
0,
0,
"",
false
);
} else if (selectedData.category === RoomObjectCategory.UNIT) {
this._roomEngine.addRoomObjectUser(roomId, selectedData.id, new Vector3d(), new Vector3d(180), 180, selectedData.typeId, selectedData.instanceData);
const roomObject = this._roomEngine.getRoomObject(roomId, selectedData.id, selectedData.category);
roomObject && selectedData.posture && roomObject.model.setValue(RoomObjectVariable.FIGURE_POSTURE, selectedData.posture);
}
} else if (event instanceof RoomObjectWallMouseEvent) {
if (selectedData.category === RoomObjectCategory.WALL) {
this._roomEngine.addFurnitureWall(roomId, selectedData.id, selectedData.typeId, selectedData.loc, selectedData.dir, 0, selectedData.instanceData, 0);
}
}
roomObject = this._roomEngine.getRoomObject(roomId, selectedData.id, selectedData.category);
if (roomObject) {
if (selectedData.category === RoomObjectCategory.FLOOR) {
const allowedDirections = roomObject.model.getValue<number[]>(RoomObjectVariable.FURNITURE_ALLOWED_DIRECTIONS);
if (allowedDirections && allowedDirections.length) {
const direction = new Vector3d(allowedDirections[0]);
roomObject.setDirection(direction);
this.updateSelectedObjectData(
roomId,
selectedData.id,
selectedData.category,
selectedData.loc,
direction,
selectedData.operation,
selectedData.typeId,
selectedData.instanceData,
selectedData.stuffData,
selectedData.state,
selectedData.animFrame,
selectedData.posture
);
selectedData = this.getSelectedRoomObjectData(roomId);
if (!selectedData) return;
}
}
}
this.setFurnitureAlphaMultiplier(roomObject, 0.5);
this._roomEngine.setObjectMoverIconSpriteVisible(true);
}
if (roomObject) {
let _local_12 = true;
const stackingHeightMap = this._roomEngine.getFurnitureStackingHeightMap(roomId);
if (selectedData.category === RoomObjectCategory.FLOOR) {
if (
!(
event instanceof RoomObjectTileMouseEvent &&
this.handleFurnitureMove(roomObject, selectedData, Math.trunc(event.tileX + 0.5), Math.trunc(event.tileY + 0.5), stackingHeightMap)
)
) {
this._roomEngine.removeRoomObjectFloor(roomId, selectedData.id);
_local_12 = false;
}
} else if (selectedData.category === RoomObjectCategory.WALL) {
_local_12 = false;
if (event instanceof RoomObjectWallMouseEvent) {
const _local_14 = event.wallLocation;
const _local_15 = event.wallWidth;
const _local_16 = event.wallHeight;
const _local_17 = event.x;
const _local_18 = event.y;
const _local_19 = event.direction;
if (this.handleWallItemMove(roomObject, selectedData, _local_14, _local_15, _local_16, _local_17, _local_18, _local_19)) {
_local_12 = true;
}
}
if (!_local_12) {
this._roomEngine.removeRoomObjectWall(roomId, selectedData.id);
}
this._roomEngine.updateRoomObjectMask(roomId, selectedData.id, _local_12);
} else if (selectedData.category === RoomObjectCategory.UNIT) {
if (
!(
event instanceof RoomObjectTileMouseEvent &&
this.handleUserPlace(roomObject, Math.trunc(event.tileX + 0.5), Math.trunc(event.tileY + 0.5), this._roomEngine.getLegacyWallGeometry(roomId))
)
) {
this._roomEngine.removeRoomObjectUser(roomId, selectedData.id);
_local_12 = false;
}
}
this._roomEngine.setObjectMoverIconSpriteVisible(!_local_12);
}
}
private handleFurnitureMove(
roomObject: IRoomObjectController,
selectedObjectData: ISelectedRoomObjectData,
x: number,
y: number,
stackingHeightMap: IFurnitureStackingHeightMap
): boolean {
if (!roomObject || !selectedObjectData) return false;
const _local_6 = new Vector3d();
_local_6.assign(roomObject.getDirection());
roomObject.setDirection(selectedObjectData.dir);
const _local_7 = new Vector3d(x, y, 0);
const _local_8 = new Vector3d();
_local_8.assign(roomObject.getDirection());
let _local_9 = this.validateFurnitureLocation(roomObject, _local_7, selectedObjectData.loc, selectedObjectData.dir, stackingHeightMap);
if (!_local_9) {
_local_8.x = this.getValidRoomObjectDirection(roomObject, true);
roomObject.setDirection(_local_8);
_local_9 = this.validateFurnitureLocation(roomObject, _local_7, selectedObjectData.loc, selectedObjectData.dir, stackingHeightMap);
}
if (!_local_9) {
roomObject.setDirection(_local_6);
return false;
}
roomObject.setLocation(_local_9);
if (_local_8) roomObject.setDirection(_local_8);
return true;
}
private handleWallItemMove(
k: IRoomObjectController,
_arg_2: ISelectedRoomObjectData,
_arg_3: IVector3D,
_arg_4: IVector3D,
_arg_5: IVector3D,
_arg_6: number,
_arg_7: number,
_arg_8: number
): boolean {
if (!k || !_arg_2) return false;
const _local_9 = new Vector3d(_arg_8);
const _local_10 = this.validateWallItemLocation(k, _arg_3, _arg_4, _arg_5, _arg_6, _arg_7, _arg_2);
if (!_local_10) return false;
k.setLocation(_local_10);
k.setDirection(_local_9);
return true;
}
private validateFurnitureLocation(k: IRoomObject, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: IVector3D, _arg_5: IFurnitureStackingHeightMap): Vector3d {
if (!k || !k.model || !_arg_2) return null;
let _local_15: Vector3d = null;
const _local_6 = k.getDirection();
if (!_local_6) return null;
if (!_arg_3 || !_arg_4) return null;
if (_arg_2.x === _arg_3.x && _arg_2.y === _arg_3.y) {
if (_local_6.x === _arg_4.x) {
_local_15 = new Vector3d();
_local_15.assign(_arg_3);
return _local_15;
}
}
let sizeX = k.model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_X);
let sizeY = k.model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_Y);
if (sizeX < 1) sizeX = 1;
if (sizeY < 1) sizeY = 1;
const _local_9 = _arg_3.x;
const _local_10 = _arg_3.y;
let _local_11 = sizeX;
let _local_12 = sizeY;
let _local_13 = 0;
let _local_14 = Math.trunc((Math.trunc(_local_6.x + 45) % 360) / 90);
if (_local_14 === 1 || _local_14 === 3) {
_local_13 = sizeX;
sizeX = sizeY;
sizeY = _local_13;
}
_local_14 = Math.trunc((Math.trunc(_arg_4.x + 45) % 360) / 90);
if (_local_14 === 1 || _local_14 === 3) {
_local_13 = _local_11;
_local_11 = _local_12;
_local_12 = _local_13;
}
if (_arg_5 && _arg_2) {
const stackable = k.model.getValue<number>(RoomObjectVariable.FURNITURE_ALWAYS_STACKABLE) === 1;
if (_arg_5.validateLocation(_arg_2.x, _arg_2.y, sizeX, sizeY, _local_9, _local_10, _local_11, _local_12, stackable)) {
return new Vector3d(_arg_2.x, _arg_2.y, _arg_5.getTileHeight(_arg_2.x, _arg_2.y));
}
return null;
}
return null;
}
private validateWallItemLocation(
k: IRoomObject,
_arg_2: IVector3D,
_arg_3: IVector3D,
_arg_4: IVector3D,
_arg_5: number,
_arg_6: number,
_arg_7: ISelectedRoomObjectData
): Vector3d {
if (k == null || k.model == null || _arg_2 == null || _arg_3 == null || _arg_4 == null || _arg_7 == null) return null;
const _local_8 = k.model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_X);
const _local_9 = k.model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_Z);
const _local_10 = k.model.getValue<number>(RoomObjectVariable.FURNITURE_CENTER_Z);
if (_arg_5 < _local_8 / 2 || _arg_5 > _arg_3.length - _local_8 / 2 || _arg_6 < _local_10 || _arg_6 > _arg_4.length - (_local_9 - _local_10)) {
if (_arg_5 < _local_8 / 2 && _arg_5 <= _arg_3.length - _local_8 / 2) {
_arg_5 = _local_8 / 2;
} else {
if (_arg_5 >= _local_8 / 2 && _arg_5 > _arg_3.length - _local_8 / 2) {
_arg_5 = _arg_3.length - _local_8 / 2;
}
}
if (_arg_6 < _local_10 && _arg_6 <= _arg_4.length - (_local_9 - _local_10)) {
_arg_6 = _local_10;
} else {
if (_arg_6 >= _local_10 && _arg_6 > _arg_4.length - (_local_9 - _local_10)) {
_arg_6 = _arg_4.length - (_local_9 - _local_10);
}
}
}
if (_arg_5 < _local_8 / 2 || _arg_5 > _arg_3.length - _local_8 / 2 || _arg_6 < _local_10 || _arg_6 > _arg_4.length - (_local_9 - _local_10)) {
return null;
}
let _local_11 = Vector3d.sum(Vector3d.product(_arg_3, _arg_5 / _arg_3.length), Vector3d.product(_arg_4, _arg_6 / _arg_4.length));
_local_11 = Vector3d.sum(_arg_2, _local_11);
return _local_11;
}
private changeObjectState(roomId: number, objectId: number, type: string, state: number, isRandom: boolean): void {
const category = this._roomEngine.getRoomObjectCategoryForType(type);
this.changeRoomObjectState(roomId, objectId, category, state, isRandom);
}
private useObject(roomId: number, objectId: number, type: string, action: string): void {
if (!this._roomEngine || !this._roomEngine.connection) return;
switch (action) {
case RoomObjectFurnitureActionEvent.DICE_ACTIVATE:
this._roomEngine.connection.send(new FurnitureDiceActivateComposer(objectId));
return;
case RoomObjectFurnitureActionEvent.DICE_OFF:
this._roomEngine.connection.send(new FurnitureDiceDeactivateComposer(objectId));
return;
case RoomObjectFurnitureActionEvent.USE_HABBOWHEEL:
this._roomEngine.connection.send(new FurnitureColorWheelComposer(objectId));
return;
case RoomObjectFurnitureActionEvent.STICKIE:
this._roomEngine.connection.send(new GetItemDataComposer(objectId));
return;
case RoomObjectFurnitureActionEvent.ENTER_ONEWAYDOOR:
this._roomEngine.connection.send(new FurnitureOneWayDoorComposer(objectId));
return;
}
}
private changeRoomObjectState(roomId: number, objectId: number, category: number, state: number, isRandom: boolean): boolean {
if (!this._roomEngine || !this._roomEngine.connection) return true;
if (category === RoomObjectCategory.FLOOR) {
if (!isRandom) {
this._roomEngine.connection.send(new FurnitureMultiStateComposer(objectId, state));
} else {
this._roomEngine.connection.send(new FurnitureRandomStateComposer(objectId, state));
}
} else if (category === RoomObjectCategory.WALL) {
this._roomEngine.connection.send(new FurnitureWallMultiStateComposer(objectId, state));
}
return true;
}
private sendWalkUpdate(x: number, y: number): void {
if (!this._roomEngine || !this._roomEngine.connection) return;
this._roomEngine.connection.send(new RoomUnitWalkComposer(x, y));
}
private handleMouseOverObject(category: number, roomId: number, event: RoomObjectMouseEvent): ObjectTileCursorUpdateMessage {
if (category !== RoomObjectCategory.FLOOR) return null;
const roomObject = this._roomEngine.getRoomObject(roomId, event.objectId, RoomObjectCategory.FLOOR);
if (!roomObject) return null;
const location = this.getActiveSurfaceLocation(roomObject, event);
if (!location) return null;
const furnitureHeightMap = this._roomEngine.getFurnitureStackingHeightMap(roomId);
if (!furnitureHeightMap) return null;
const x = location.x;
const y = location.y;
const z = location.z;
return new ObjectTileCursorUpdateMessage(new Vector3d(x, y, roomObject.getLocation().z), z, true, event.eventId);
}
private handleMoveTargetFurni(k: number, _arg_2: RoomObjectMouseEvent): boolean {
if (
_arg_2.objectType === RoomObjectUserType.USER ||
_arg_2.objectType === RoomObjectUserType.PET ||
_arg_2.objectType === RoomObjectUserType.BOT ||
_arg_2.objectType === RoomObjectUserType.RENTABLE_BOT ||
_arg_2.objectType === RoomObjectUserType.MONSTER_PLANT
)
return false;
const _local_3 = this._roomEngine.getRoomObject(k, _arg_2.objectId, RoomObjectCategory.FLOOR);
const _local_4 = this.getActiveSurfaceLocation(_local_3, _arg_2);
if (_local_4) {
this.sendWalkUpdate(_local_4.x, _local_4.y);
return true;
}
return false;
}
private getActiveSurfaceLocation(k: IRoomObject, _arg_2: RoomObjectMouseEvent): Vector3d {
if (!k || !_arg_2) return null;
const furniData = this._roomEngine.sessionDataManager.getFloorItemDataByName(k.type);
if (!furniData) return null;
if (!furniData.canStandOn && !furniData.canSitOn && !furniData.canLayOn) return null;
const model = k.model;
if (!model) return null;
const location = k.getLocation();
const direction = k.getDirection();
let sizeX = model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_X);
let sizeY = model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_Y);
const sizeZ = model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_Z);
if (direction.x === 90 || direction.x === 270) [sizeX, sizeY] = [sizeY, sizeX];
if (sizeX < 1) sizeX = 1;
if (sizeY < 1) sizeY = 1;
const renderingCanvas = this._roomEngine.getActiveRoomInstanceRenderingCanvas();
if (!renderingCanvas) return null;
const scale = renderingCanvas.geometry.scale;
const _local_13 = furniData.canSitOn ? 0.5 : 0;
const _local_14 = (scale / 2 + _arg_2.spriteOffsetX + _arg_2.localX) / (scale / 4);
const _local_15 = (_arg_2.spriteOffsetY + _arg_2.localY + ((sizeZ - _local_13) * scale) / 2) / (scale / 4);
const _local_16 = (_local_14 + 2 * _local_15) / 4;
const _local_17 = (_local_14 - 2 * _local_15) / 4;
const _local_18 = Math.floor(location.x + _local_16);
const _local_19 = Math.floor(location.y - _local_17 + 1);
let _local_20 = false;
if (_local_18 < location.x || _local_18 >= location.x + sizeX) _local_20 = true;
else if (_local_19 < location.y || _local_19 >= location.y + sizeY) _local_20 = true;
const _local_21 = furniData.canSitOn ? sizeZ - 0.5 : sizeZ;
if (!_local_20) return new Vector3d(_local_18, _local_19, _local_21);
return null;
}
private handleMouseOverTile(k: RoomObjectTileMouseEvent, roomId: number): ObjectTileCursorUpdateMessage {
if (this._whereYouClickIsWhereYouGo) {
return new ObjectTileCursorUpdateMessage(new Vector3d(k.tileXAsInt, k.tileYAsInt, k.tileZAsInt), 0, true, k.eventId);
}
const roomObject = this._roomEngine.getRoomObjectCursor(roomId);
if (roomObject && roomObject.visualization) {
const _local_4 = k.tileXAsInt;
const _local_5 = k.tileYAsInt;
const _local_6 = k.tileZAsInt;
const _local_7 = this._roomEngine.getRoomInstance(roomId);
if (_local_7) {
const _local_8 = this._roomEngine.getRoomTileObjectMap(roomId);
if (_local_8) {
const _local_9 = _local_8.getObjectIntTile(_local_4, _local_5);
const _local_10 = this._roomEngine.getFurnitureStackingHeightMap(roomId);
if (_local_10) {
if (_local_9 && _local_9.model && _local_9.model.getValue<number>(RoomObjectVariable.FURNITURE_IS_VARIABLE_HEIGHT) > 0) {
const _local_11 = _local_10.getTileHeight(_local_4, _local_5);
const _local_12 = this._roomEngine.getLegacyWallGeometry(roomId).getHeight(_local_4, _local_5);
return new ObjectTileCursorUpdateMessage(new Vector3d(_local_4, _local_5, _local_6), _local_11 - _local_12, true, k.eventId);
}
return new ObjectTileCursorUpdateMessage(new Vector3d(_local_4, _local_5, _local_6), 0, true, k.eventId);
}
}
}
}
return null;
}
private placeObject(roomId: number, isTileEvent: boolean, isWallEvent: boolean): void {
const selectedData = this.getSelectedRoomObjectData(roomId);
if (!selectedData) return;
let roomObject: IRoomObjectController = null;
let objectId = selectedData.id;
const category = selectedData.category;
let x = 0;
let y = 0;
let z = 0;
let direction = 0;
let wallLocation = "";
if (this._roomEngine && this._roomEngine.connection) {
roomObject = this._roomEngine.getRoomObject(roomId, objectId, category);
if (roomObject) {
const location = roomObject.getLocation();
direction = roomObject.getDirection().x;
if (category === RoomObjectCategory.FLOOR || category === RoomObjectCategory.UNIT) {
x = location.x;
y = location.y;
z = location.z;
} else if (category === RoomObjectCategory.WALL) {
x = location.x;
y = location.y;
z = location.z;
const wallGeometry = this._roomEngine.getLegacyWallGeometry(roomId);
if (wallGeometry) wallLocation = wallGeometry.getOldLocationString(location, direction);
}
direction = (((direction / 45) % 8) + 8) % 8;
if (objectId < 0 && category === RoomObjectCategory.UNIT) objectId = objectId * -1;
if (this._objectPlacementSource !== RoomObjectPlacementSource.CATALOG) {
if (category === RoomObjectCategory.UNIT) {
if (selectedData.typeId === RoomObjectType.PET) {
this._roomEngine.connection.send(new PetPlaceComposer(objectId, Math.trunc(x), Math.trunc(y)));
} else if (selectedData.typeId === RoomObjectType.RENTABLE_BOT) {
this._roomEngine.connection.send(new BotPlaceComposer(objectId, Math.trunc(x), Math.trunc(y)));
}
} else if (roomObject.model.getValue<string>(RoomObjectVariable.FURNITURE_IS_STICKIE) !== undefined) {
this._roomEngine.connection.send(new FurniturePostItPlaceComposer(objectId, wallLocation));
} else {
this._roomEngine.connection.send(new FurniturePlaceComposer(objectId, category, wallLocation, Math.trunc(x), Math.trunc(y), direction));
}
}
}
}
this._roomEngine.setPlacedRoomObjectData(roomId, new SelectedRoomObjectData(selectedData.id, selectedData.category, null, selectedData.dir, null));
this.resetSelectedObjectData(roomId);
if (this._roomEngine && this._roomEngine.events) {
const placedInRoom = roomObject && roomObject.id === selectedData.id;
this._roomEngine.events.dispatchEvent(
new RoomEngineObjectPlacedEvent(
RoomEngineObjectEvent.PLACED,
roomId,
objectId,
category,
wallLocation,
x,
y,
z,
direction,
placedInRoom,
isTileEvent,
isWallEvent,
selectedData.instanceData
)
);
}
}
public modifyRoomObject(roomId: number, objectId: number, category: number, operation: string): boolean {
if (!this._roomEngine) return false;
const roomObject = this._roomEngine.getRoomObject(roomId, objectId, category);
if (!roomObject) return false;
let _local_9 = true;
switch (operation) {
case RoomObjectOperationType.OBJECT_ROTATE_POSITIVE:
case RoomObjectOperationType.OBJECT_ROTATE_NEGATIVE:
if (this._roomEngine.connection) {
let direction = 0;
if (operation == RoomObjectOperationType.OBJECT_ROTATE_NEGATIVE) {
direction = this.getValidRoomObjectDirection(roomObject, false);
} else {
direction = this.getValidRoomObjectDirection(roomObject, true);
}
const x = roomObject.getLocation().x;
const y = roomObject.getLocation().y;
if (this.isValidLocation(roomObject, new Vector3d(direction), this._roomEngine.getFurnitureStackingHeightMap(roomId))) {
direction = Math.trunc(direction / 45);
if (roomObject.type === RoomObjectUserType.MONSTER_PLANT) {
const roomSession = this._roomEngine.roomSessionManager.getSession(roomId);
if (roomSession) {
const userData = roomSession.userDataManager.getUserDataByIndex(objectId);
if (userData) {
this._roomEngine.connection.send(new PetMoveComposer(userData.webID, Math.trunc(x), Math.trunc(y), direction));
}
}
} else {
this._roomEngine.connection.send(new FurnitureFloorUpdateComposer(objectId, x, y, direction));
}
}
}
break;
case RoomObjectOperationType.OBJECT_EJECT:
case RoomObjectOperationType.OBJECT_PICKUP:
if (this._roomEngine.connection) this._roomEngine.connection.send(new FurniturePickupComposer(category, objectId));
break;
case RoomObjectOperationType.OBJECT_PICKUP_PET:
if (this._roomEngine.connection) {
const session = this._roomEngine.roomSessionManager.getSession(roomId);
if (session) {
const userData = session.userDataManager.getUserDataByIndex(objectId);
session.pickupPet(userData.webID);
}
}
break;
case RoomObjectOperationType.OBJECT_PICKUP_BOT:
if (this._roomEngine.connection) {
const session = this._roomEngine.roomSessionManager.getSession(roomId);
if (session) {
const userData = session.userDataManager.getUserDataByIndex(objectId);
session.pickupBot(userData.webID);
}
}
break;
case RoomObjectOperationType.OBJECT_MOVE:
_local_9 = false;
this.setFurnitureAlphaMultiplier(roomObject, 0.5);
this.setSelectedRoomObjectData(roomId, roomObject.id, category, roomObject.getLocation(), roomObject.getDirection(), operation);
this._roomEngine.setObjectMoverIconSprite(roomObject.id, category, true);
this._roomEngine.setObjectMoverIconSpriteVisible(false);
break;
case RoomObjectOperationType.OBJECT_MOVE_TO: {
const selectedData = this.getSelectedRoomObjectData(roomId);
this.updateSelectedObjectData(
roomId,
selectedData.id,
selectedData.category,
selectedData.loc,
selectedData.dir,
RoomObjectOperationType.OBJECT_MOVE_TO,
selectedData.typeId,
selectedData.instanceData,
selectedData.stuffData,
selectedData.state,
selectedData.animFrame,
selectedData.posture
);
this.setFurnitureAlphaMultiplier(roomObject, 1);
this._roomEngine.removeObjectMoverIconSprite();
if (this._roomEngine.connection) {
if (category === RoomObjectCategory.FLOOR) {
const angle = roomObject.getDirection().x % 360;
const location = roomObject.getLocation();
const direction = angle / 45;
this._roomEngine.connection.send(new FurnitureFloorUpdateComposer(objectId, location.x, location.y, direction));
} else if (category === RoomObjectCategory.WALL) {
const angle = roomObject.getDirection().x % 360;
const wallGeometry = this._roomEngine.getLegacyWallGeometry(roomId);
if (wallGeometry) {
const location = wallGeometry.getOldLocationString(roomObject.getLocation(), angle);
if (location) this._roomEngine.connection.send(new FurnitureWallUpdateComposer(objectId, location));
}
} else if (category === RoomObjectCategory.UNIT) {
const angle = roomObject.getDirection().x % 360;
const location = roomObject.getLocation();
const direction = angle / 45;
const race = parseInt(roomObject.model.getValue<string>(RoomObjectVariable.RACE));
const roomSession = this._roomEngine.roomSessionManager.getSession(roomId);
if (roomSession) {
const userData = roomSession.userDataManager.getUserDataByIndex(objectId);
if (userData) this._roomEngine.connection.send(new PetMoveComposer(userData.webID, location.x, location.y, direction));
}
}
}
break;
}
}
if (_local_9) this.resetSelectedObjectData(roomId);
return true;
}
public modifyRoomObjectDataWithMap(roomId: number, objectId: number, category: number, operation: string, data: Map<string, string>): boolean {
if (!this._roomEngine) return false;
const roomObject = this._roomEngine.getRoomObject(roomId, objectId, category);
if (!roomObject) return false;
switch (operation) {
case RoomObjectOperationType.OBJECT_SAVE_STUFF_DATA:
if (this._roomEngine.connection) {
this._roomEngine.connection.send(new SetObjectDataMessageComposer(objectId, data));
}
break;
}
return true;
}
public modifyWallItemData(roomId: number, objectId: number, colorHex: string, text: string): boolean {
if (!this._roomEngine || !this._roomEngine.connection) return false;
this._roomEngine.connection.send(new SetItemDataMessageComposer(objectId, colorHex, text));
return true;
}
public deleteWallItem(roomId: number, itemId: number): boolean {
if (!this._roomEngine || !this._roomEngine.connection) return false;
this._roomEngine.connection.send(new RemoveWallItemComposer(itemId));
return true;
}
public getValidRoomObjectDirection(k: IRoomObjectController, _arg_2: boolean): number {
if (!k || !k.model) return 0;
let _local_6 = 0;
let _local_7 = 0;
let allowedDirections: number[] = [];
if (k.type === RoomObjectUserType.MONSTER_PLANT) {
allowedDirections = k.model.getValue<number[]>(RoomObjectVariable.PET_ALLOWED_DIRECTIONS);
} else {
allowedDirections = k.model.getValue<number[]>(RoomObjectVariable.FURNITURE_ALLOWED_DIRECTIONS);
}
let direction = k.getDirection().x;
if (allowedDirections && allowedDirections.length) {
_local_6 = allowedDirections.indexOf(direction);
if (_local_6 < 0) {
_local_6 = 0;
_local_7 = 0;
while (_local_7 < allowedDirections.length) {
if (direction <= allowedDirections[_local_7]) break;
_local_6++;
_local_7++;
}
_local_6 = _local_6 % allowedDirections.length;
}
if (_arg_2) _local_6 = (_local_6 + 1) % allowedDirections.length;
else _local_6 = (_local_6 - 1 + allowedDirections.length) % allowedDirections.length;
direction = allowedDirections[_local_6];
}
return direction;
}
private isValidLocation(object: IRoomObject, goalDirection: IVector3D, stackingHeightMap: IFurnitureStackingHeightMap): boolean {
if (!object || !object.model || !goalDirection) return false;
const direction = object.getDirection();
const location = object.getLocation();
if (!direction || !location) return false;
if (direction.x % 180 === goalDirection.x % 180) return true;
let sizeX = object.model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_X);
let sizeY = object.model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_Y);
if (sizeX < 1) sizeX = 1;
if (sizeY < 1) sizeY = 1;
let _local_8 = sizeX;
let _local_9 = sizeY;
let _local_11 = Math.trunc((Math.trunc(goalDirection.x + 45) % 360) / 90);
if (_local_11 === 1 || _local_11 === 3) [sizeX, sizeY] = [sizeY, sizeX];
_local_11 = Math.trunc((Math.trunc(direction.x + 45) % 360) / 90);
if (_local_11 === 1 || _local_11 === 3) [_local_8, _local_9] = [_local_9, _local_8];
if (stackingHeightMap && location) {
const alwaysStackable = object.model.getValue<number>(RoomObjectVariable.FURNITURE_ALWAYS_STACKABLE) === 1;
if (stackingHeightMap.validateLocation(location.x, location.y, sizeX, sizeY, location.x, location.y, _local_8, _local_9, alwaysStackable, location.z))
return true;
}
return false;
}
private placeObjectOnUser(roomId: number, objectId: number, category: number): void {
const _local_4 = this.getSelectedRoomObjectData(roomId);
if (!_local_4) return;
const _local_5 = this._roomEngine.getRoomObject(roomId, objectId, category) as IRoomObjectController;
if (!_local_5) return;
if (!this._roomEngine || !this._roomEngine.events) return;
this._roomEngine.events.dispatchEvent(
new RoomEngineObjectPlacedOnUserEvent(RoomEngineObjectEvent.PLACED_ON_USER, roomId, objectId, category, _local_4.id, _local_4.category)
);
}
public setSelectedObject(roomId: number, objectId: number, category: number): void {
if (!this._roomEngine) return;
const eventDispatcher = this._roomEngine.events;
if (!eventDispatcher) return;
switch (category) {
case RoomObjectCategory.UNIT:
case RoomObjectCategory.FLOOR:
case RoomObjectCategory.WALL:
if (category === RoomObjectCategory.UNIT) {
this.deselectObject(roomId);
this.setSelectedAvatar(roomId, objectId, true);
} else {
this.setSelectedAvatar(roomId, 0, false);
if (objectId !== this._selectedObjectId) {
this.deselectObject(roomId);
const roomObject = this._roomEngine.getRoomObject(roomId, objectId, category);
if (roomObject && roomObject.logic) {
roomObject.logic.processUpdateMessage(new ObjectSelectedMessage(true));
this._selectedObjectId = objectId;
this._selectedObjectCategory = category;
}
}
}
eventDispatcher.dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.SELECTED, roomId, objectId, category));
return;
}
}
private deselectObject(roomId: number): void {
if (this._selectedObjectId === -1) return;
const object = this._roomEngine.getRoomObject(roomId, this._selectedObjectId, this._selectedObjectCategory);
if (object && object.logic) {
object.logic.processUpdateMessage(new ObjectSelectedMessage(false));
this._selectedObjectId = -1;
this._selectedObjectCategory = RoomObjectCategory.MINIMUM;
}
}
public setSelectedAvatar(k: number, _arg_2: number, _arg_3: boolean): void {
if (!this._roomEngine) return;
const _local_4 = RoomObjectCategory.UNIT;
const _local_5 = this._roomEngine.getRoomObject(k, this._selectedAvatarId, _local_4);
if (_local_5 && _local_5.logic) {
_local_5.logic.processUpdateMessage(new ObjectAvatarSelectedMessage(false));
this._selectedAvatarId = -1;
}
let _local_6 = false;
if (_arg_3) {
const _local_5 = this._roomEngine.getRoomObject(k, _arg_2, _local_4);
if (_local_5 && _local_5.logic) {
_local_5.logic.processUpdateMessage(new ObjectAvatarSelectedMessage(true));
_local_6 = true;
this._selectedAvatarId = _arg_2;
const location = _local_5.getLocation();
if (location) this._roomEngine.connection.send(new RoomUnitLookComposer(~~location.x, ~~location.y));
}
}
const selectionArrow = this._roomEngine.getRoomObjectSelectionArrow(k);
if (selectionArrow && selectionArrow.logic) {
if (_local_6 && !this._roomEngine.isPlayingGame())
selectionArrow.logic.processUpdateMessage(new ObjectVisibilityUpdateMessage(ObjectVisibilityUpdateMessage.ENABLED));
else selectionArrow.logic.processUpdateMessage(new ObjectVisibilityUpdateMessage(ObjectVisibilityUpdateMessage.DISABLED));
}
}
private resetSelectedObjectData(roomId: number): void {
if (!this._roomEngine) return;
this._roomEngine.removeObjectMoverIconSprite();
const selectedData = this.getSelectedRoomObjectData(roomId);
if (selectedData) {
if (selectedData.operation === RoomObjectOperationType.OBJECT_MOVE || selectedData.operation === RoomObjectOperationType.OBJECT_MOVE_TO) {
const roomObject = this._roomEngine.getRoomObject(roomId, selectedData.id, selectedData.category);
if (roomObject && selectedData.operation !== RoomObjectOperationType.OBJECT_MOVE_TO) {
roomObject.setLocation(selectedData.loc);
roomObject.setDirection(selectedData.dir);
}
this.setFurnitureAlphaMultiplier(roomObject, 1);
if (selectedData.category === RoomObjectCategory.WALL) {
this._roomEngine.updateRoomObjectMask(roomId, selectedData.id, true);
}
this.updateSelectedObjectData(
roomId,
selectedData.id,
selectedData.category,
selectedData.loc,
selectedData.dir,
RoomObjectOperationType.OBJECT_MOVE,
selectedData.typeId,
selectedData.instanceData,
selectedData.stuffData,
selectedData.state,
selectedData.animFrame,
selectedData.posture
);
} else if (selectedData.operation === RoomObjectOperationType.OBJECT_PLACE) {
const objectId = selectedData.id;
const category = selectedData.category;
switch (category) {
case RoomObjectCategory.FLOOR:
this._roomEngine.removeRoomObjectFloor(roomId, objectId);
break;
case RoomObjectCategory.WALL:
this._roomEngine.removeRoomObjectWall(roomId, objectId);
break;
case RoomObjectCategory.UNIT:
this._roomEngine.removeRoomObjectUser(roomId, objectId);
break;
}
}
this._roomEngine.setSelectedRoomObjectData(roomId, null);
}
}
private getSelectedRoomObjectData(roomId: number): ISelectedRoomObjectData {
if (!this._roomEngine) return null;
return this._roomEngine.getSelectedRoomObjectData(roomId);
}
private setFurnitureAlphaMultiplier(object: IRoomObjectController, multiplier: number): void {
if (!object || !object.model) return;
object.model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, multiplier);
}
private decorateModeMove(event: RoomObjectMouseEvent): boolean {
return this._roomEngine.isDecorating && !(event.ctrlKey || event.shiftKey);
}
public cancelRoomObjectPlacement(roomId: number): boolean {
this.resetSelectedObjectData(roomId);
return true;
}
private setSelectedRoomObjectData(
roomId: number,
id: number,
category: number,
location: IVector3D,
direction: IVector3D,
operation: string,
typeId: number = 0,
instanceData: string = null,
stuffData: IObjectData = null,
state: number = -1,
frameNumber: number = -1,
posture: string = null
): void {
this.resetSelectedObjectData(roomId);
if (!this._roomEngine) return;
const selectedData = new SelectedRoomObjectData(id, category, operation, location, direction, typeId, instanceData, stuffData, state, frameNumber, posture);
this._roomEngine.setSelectedRoomObjectData(roomId, selectedData);
}
private updateSelectedObjectData(
roomId: number,
id: number,
category: number,
location: IVector3D,
direction: IVector3D,
operation: string,
typeId: number = 0,
instanceData: string = null,
stuffData: IObjectData = null,
state: number = -1,
frameNumber: number = -1,
posture: string = null
): void {
if (!this._roomEngine) return null;
const selectedData = new SelectedRoomObjectData(id, category, operation, location, direction, typeId, instanceData, stuffData, state, frameNumber, posture);
this._roomEngine.setSelectedRoomObjectData(roomId, selectedData);
}
private handleUserPlace(roomObject: IRoomObjectController, x: number, y: number, wallGeometry: ILegacyWallGeometry): boolean {
if (!wallGeometry.isRoomTile(x, y)) return false;
roomObject.setLocation(new Vector3d(x, y, wallGeometry.getHeight(x, y)));
return true;
}
public get engine(): IRoomEngineServices {
return this._roomEngine;
}
public get selectedAvatarId(): number {
return this._selectedAvatarId;
}
}