import { IFurnitureStackingHeightMap, ILegacyWallGeometry, IObjectData, IRoomCanvasMouseListener, IRoomEngineServices, IRoomGeometry, IRoomObject, IRoomObjectController, IRoomObjectEventManager, ISelectedRoomObjectData, IVector3D, MouseEventType, RoomObjectCategory, RoomObjectOperationType, RoomObjectPlacementSource, RoomObjectType, RoomObjectUserType, RoomObjectVariable } from '@nitrots/api'; import { BotPlaceComposer, ClickFurniMessageComposer, FurnitureColorWheelComposer, FurnitureDiceActivateComposer, FurnitureDiceDeactivateComposer, FurnitureFloorUpdateComposer, FurnitureGroupInfoComposer, FurnitureMultiStateComposer, FurnitureOneWayDoorComposer, FurniturePickupComposer, FurniturePlaceComposer, FurniturePostItPlaceComposer, FurnitureRandomStateComposer, FurnitureWallMultiStateComposer, FurnitureWallUpdateComposer, GetCommunication, GetItemDataComposer, GetResolutionAchievementsMessageComposer, PetMoveComposer, PetPlaceComposer, RemoveWallItemComposer, RoomUnitLookComposer, RoomUnitWalkComposer, SetItemDataMessageComposer, SetObjectDataMessageComposer } from '@nitrots/communication'; import { GetConfiguration } from '@nitrots/configuration'; import { GetEventDispatcher, 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 '@nitrots/events'; import { GetRoomSessionManager, GetSessionDataManager } from '@nitrots/session'; import { CreateLinkEvent, NitroLogger, RoomId, Vector3d } from '@nitrots/utils'; import { RoomEnterEffect, RoomObjectUpdateMessage } from '../../room'; import { ObjectAvatarSelectedMessage, ObjectDataUpdateMessage, ObjectSelectedMessage, ObjectTileCursorUpdateMessage, ObjectVisibilityUpdateMessage } from './messages'; import { SelectedRoomObjectData } from './utils'; export class RoomObjectEventHandler implements IRoomCanvasMouseListener, IRoomObjectEventManager { private _eventIds: Map> = new Map(); private _selectedAvatarId: number = -1; private _selectedObjectId: number = -1; private _selectedObjectCategory: number = -2; private _whereYouClickIsWhereYouGo: boolean = true; private _objectPlacementSource: string = null; constructor( private readonly _roomEngine: IRoomEngineServices) { GetEventDispatcher().addEventListener(RoomEngineObjectEvent.ADDED, event => this.onRoomEngineObjectEvent(event)); } 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(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.AREA_HIDE: 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; if(event instanceof RoomObjectTileMouseEvent) { this._roomEngine.areaSelectionManager.handleTileMouseEvent(event); } 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 clickRoomObject(event: RoomObjectMouseEvent): void { if(!event || event.altKey || event.ctrlKey || event.shiftKey) return; const objectId = event.objectId; const objectType = event.objectType; const category = this._roomEngine.getRoomObjectCategoryForType(objectType); if(category === RoomObjectCategory.FLOOR) { GetCommunication().connection.send(new ClickFurniMessageComposer(objectId, category)); return; } if(category === RoomObjectCategory.WALL) { // This packet only sends a negative number to tell the server that its a wall item GetCommunication().connection.send(new ClickFurniMessageComposer(-Math.abs(objectId), category)); return; } } private handleRoomObjectMouseClickEvent(event: RoomObjectMouseEvent, roomId: number): void { if(!event) return; this.clickRoomObject(event); 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.handleClickOnTile(roomId, event); } else { if(!this._roomEngine.isAreaSelectionMode() || (category === RoomObjectCategory.UNIT)) { this.setSelectedObject(roomId, event.objectId, category); } else { this.deselectObject(roomId); GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.DESELECTED, roomId, -1, RoomObjectCategory.MINIMUM)); } 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(GetEventDispatcher()) { GetEventDispatcher().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(GetEventDispatcher()) GetEventDispatcher().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(GetEventDispatcher()) { GetEventDispatcher().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(GetEventDispatcher()) GetEventDispatcher().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(GetEventDispatcher()) GetEventDispatcher().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(GetEventDispatcher()) { GetEventDispatcher().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(GetEventDispatcher()) { GetEventDispatcher().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: GetEventDispatcher().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); if(RoomId.isRoomPreviewerId(roomId)) return; switch(event.type) { case RoomObjectWidgetRequestEvent.OPEN_WIDGET: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.OPEN_WIDGET, roomId, objectId, objectCategory, ((event.object as IRoomObjectController).logic.widget))); return; case RoomObjectWidgetRequestEvent.CLOSE_WIDGET: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.CLOSE_WIDGET, roomId, objectId, objectCategory, ((event.object as IRoomObjectController).logic.widget))); return; case RoomObjectWidgetRequestEvent.OPEN_FURNI_CONTEXT_MENU: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU, roomId, objectId, objectCategory, ((event.object as IRoomObjectController).logic.contextMenu))); return; case RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.PLACEHOLDER: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLACEHOLDER, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.CREDITFURNI: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_CREDITFURNI, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.STACK_HEIGHT: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_STACK_HEIGHT, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.EXTERNAL_IMAGE: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_EXTERNAL_IMAGE, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.STICKIE: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_STICKIE, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.PRESENT: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PRESENT, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.TROPHY: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_TROPHY, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.TEASER: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_TEASER, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.ECOTRONBOX: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ECOTRONBOX, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.DIMMER: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.WIDGET_REMOVE_DIMMER: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REMOVE_DIMMER, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.CLOTHING_CHANGE: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_CLOTHING_CHANGE, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.JUKEBOX_PLAYLIST_EDITOR: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLAYLIST_EDITOR, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.MANNEQUIN: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MANNEQUIN, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.PET_PRODUCT_MENU: GetEventDispatcher().dispatchEvent(new RoomEngineUseProductEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.GUILD_FURNI_CONTEXT_MENU: GetCommunication().connection.send(new FurnitureGroupInfoComposer(event.objectId, event.object.model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_GUILD_ID))); return; case RoomObjectWidgetRequestEvent.MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.BACKGROUND_COLOR: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.AREA_HIDE: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_AREA_HIDE, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.MYSTERYBOX_OPEN_DIALOG: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYBOX_OPEN_DIALOG, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.EFFECTBOX_OPEN_DIALOG: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.MYSTERYTROPHY_OPEN_DIALOG: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYTROPHY_OPEN_DIALOG, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_OPEN: GetCommunication().connection.send(new GetResolutionAchievementsMessageComposer(event.objectId, 0)); return; case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_ENGRAVING: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_FAILED: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_CONFIRM: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_CONFIRM, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_ENGRAVING: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.BADGE_DISPLAY_ENGRAVING: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.HIGH_SCORE_DISPLAY: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.HIDE_HIGH_SCORE_DISPLAY: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.INERNAL_LINK: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.ROOM_LINK: GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK, roomId, objectId, objectCategory)); return; case RoomObjectWidgetRequestEvent.YOUTUBE: GetEventDispatcher().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: GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_INIT, roomId, event.objectId, objectCategory)); return; case RoomObjectFurnitureActionEvent.SOUND_MACHINE_START: GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_SWITCHED_ON, roomId, event.objectId, objectCategory)); return; case RoomObjectFurnitureActionEvent.SOUND_MACHINE_STOP: GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_SWITCHED_OFF, roomId, event.objectId, objectCategory)); return; case RoomObjectFurnitureActionEvent.SOUND_MACHINE_DISPOSE: GetEventDispatcher().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: GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_INIT, roomId, event.objectId, objectCategory)); return; case RoomObjectFurnitureActionEvent.JUKEBOX_START: GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_SWITCHED_ON, roomId, event.objectId, objectCategory)); return; case RoomObjectFurnitureActionEvent.JUKEBOX_MACHINE_STOP: GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_SWITCHED_OFF, roomId, event.objectId, objectCategory)); return; case RoomObjectFurnitureActionEvent.JUKEBOX_DISPOSE: GetEventDispatcher().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: GetEventDispatcher().dispatchEvent(event); if(event.clickUrl && (event.clickUrl.length > 0)) { 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) 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) GetEventDispatcher().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: GetEventDispatcher().dispatchEvent(new RoomEngineObjectPlaySoundEvent(RoomEngineObjectPlaySoundEvent.PLAY_SOUND, roomId, event.objectId, objectCategory, event.soundId, event.pitch)); return; case RoomObjectPlaySoundIdEvent.PLAY_SOUND_AT_PITCH: GetEventDispatcher().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: GetEventDispatcher().dispatchEvent(new RoomEngineSamplePlaybackEvent(RoomEngineSamplePlaybackEvent.ROOM_OBJECT_INITIALIZED, roomId, event.objectId, objectCategory, event.sampleId, event.pitch)); break; case RoomObjectSamplePlaybackEvent.ROOM_OBJECT_DISPOSED: GetEventDispatcher().dispatchEvent(new RoomEngineSamplePlaybackEvent(RoomEngineSamplePlaybackEvent.ROOM_OBJECT_DISPOSED, roomId, event.objectId, objectCategory, event.sampleId, event.pitch)); break; case RoomObjectSamplePlaybackEvent.PLAY_SAMPLE: GetEventDispatcher().dispatchEvent(new RoomEngineSamplePlaybackEvent(RoomEngineSamplePlaybackEvent.PLAY_SAMPLE, roomId, event.objectId, objectCategory, event.sampleId, event.pitch)); break; case RoomObjectSamplePlaybackEvent.CHANGE_PITCH: GetEventDispatcher().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: GetEventDispatcher().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, GetSessionDataManager().userId); return; case RoomObjectDataRequestEvent.RODRE_URL_PREFIX: event.object.model.setValue(RoomObjectVariable.SESSION_URL_PREFIX, GetConfiguration().getValue('url.prefix')); return; } } private handleClickOnTile(roomId: number, event: RoomObjectTileMouseEvent): void { if(!this._roomEngine || this._roomEngine.isDecorating) return; const session = GetRoomSessionManager().getSession(roomId); if(!session || session.isSpectator) return; if(!this._roomEngine.moveBlocked) this.sendWalkUpdate(event.tileXAsInt, event.tileYAsInt); } private handleObjectMove(event: RoomObjectMouseEvent, roomId: number): void { if(!event || !this._roomEngine) return; const eventDispatcher = GetEventDispatcher(); 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 = GetEventDispatcher(); 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(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(RoomObjectVariable.FURNITURE_SIZE_X); let sizeY = k.model.getValue(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(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(RoomObjectVariable.FURNITURE_SIZE_X); const _local_9 = k.model.getValue(RoomObjectVariable.FURNITURE_SIZE_Z); const _local_10 = k.model.getValue(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 || !GetCommunication().connection) return; switch(action) { case RoomObjectFurnitureActionEvent.DICE_ACTIVATE: GetCommunication().connection.send(new FurnitureDiceActivateComposer(objectId)); return; case RoomObjectFurnitureActionEvent.DICE_OFF: GetCommunication().connection.send(new FurnitureDiceDeactivateComposer(objectId)); return; case RoomObjectFurnitureActionEvent.USE_HABBOWHEEL: GetCommunication().connection.send(new FurnitureColorWheelComposer(objectId)); return; case RoomObjectFurnitureActionEvent.STICKIE: GetCommunication().connection.send(new GetItemDataComposer(objectId)); return; case RoomObjectFurnitureActionEvent.ENTER_ONEWAYDOOR: GetCommunication().connection.send(new FurnitureOneWayDoorComposer(objectId)); return; } } private changeRoomObjectState(roomId: number, objectId: number, category: number, state: number, isRandom: boolean): boolean { if(!this._roomEngine || !GetCommunication().connection) return true; if(category === RoomObjectCategory.FLOOR) { if(!isRandom) { GetCommunication().connection.send(new FurnitureMultiStateComposer(objectId, state)); } else { GetCommunication().connection.send(new FurnitureRandomStateComposer(objectId, state)); } } else if(category === RoomObjectCategory.WALL) { GetCommunication().connection.send(new FurnitureWallMultiStateComposer(objectId, state)); } return true; } private sendWalkUpdate(x: number, y: number): void { if(!this._roomEngine || !GetCommunication().connection) return; GetCommunication().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 { const roomObject = this._roomEngine.getRoomObject(k, _arg_2.objectId, RoomObjectCategory.FLOOR); const point = this.getActiveSurfaceLocation(roomObject, _arg_2); if(point && !this._roomEngine.moveBlocked) { this.sendWalkUpdate(point.x, point.y); return true; } return false; } private getActiveSurfaceLocation(k: IRoomObject, _arg_2: RoomObjectMouseEvent): Vector3d { if(!k || !_arg_2) return null; const furniData = GetSessionDataManager().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(RoomObjectVariable.FURNITURE_SIZE_X); let sizeY = model.getValue(RoomObjectVariable.FURNITURE_SIZE_Y); const sizeZ = model.getValue(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(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 && GetCommunication().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) { GetCommunication().connection.send(new PetPlaceComposer(objectId, Math.trunc(x), Math.trunc(y))); } else if(selectedData.typeId === RoomObjectType.RENTABLE_BOT) { GetCommunication().connection.send(new BotPlaceComposer(objectId, Math.trunc(x), Math.trunc(y))); } } else if(roomObject.model.getValue(RoomObjectVariable.FURNITURE_IS_STICKIE) !== undefined) { GetCommunication().connection.send(new FurniturePostItPlaceComposer(objectId, wallLocation)); } else { GetCommunication().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 && GetEventDispatcher()) { const placedInRoom = (roomObject && (roomObject.id === selectedData.id)); GetEventDispatcher().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(GetCommunication().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 = GetRoomSessionManager().getSession(roomId); if(roomSession) { const userData = roomSession.userDataManager.getUserDataByIndex(objectId); if(userData) { GetCommunication().connection.send(new PetMoveComposer(userData.webID, Math.trunc(x), Math.trunc(y), direction)); } } } else { GetCommunication().connection.send(new FurnitureFloorUpdateComposer(objectId, x, y, direction)); } } } break; case RoomObjectOperationType.OBJECT_EJECT: case RoomObjectOperationType.OBJECT_PICKUP: if(GetCommunication().connection) GetCommunication().connection.send(new FurniturePickupComposer(category, objectId)); break; case RoomObjectOperationType.OBJECT_PICKUP_PET: if(GetCommunication().connection) { const session = GetRoomSessionManager().getSession(roomId); if(session) { const userData = session.userDataManager.getUserDataByIndex(objectId); session.pickupPet(userData.webID); } } break; case RoomObjectOperationType.OBJECT_PICKUP_BOT: if(GetCommunication().connection) { const session = GetRoomSessionManager().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(GetCommunication().connection) { if(category === RoomObjectCategory.FLOOR) { const angle = ((roomObject.getDirection().x) % 360); const location = roomObject.getLocation(); const direction = (angle / 45); GetCommunication().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) GetCommunication().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(RoomObjectVariable.RACE)); const roomSession = GetRoomSessionManager().getSession(roomId); if(roomSession) { const userData = roomSession.userDataManager.getUserDataByIndex(objectId); if(userData) GetCommunication().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): 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(GetCommunication().connection) { GetCommunication().connection.send(new SetObjectDataMessageComposer(objectId, data)); } break; } return true; } public modifyWallItemData(roomId: number, objectId: number, colorHex: string, text: string): boolean { if(!this._roomEngine || !GetCommunication().connection) return false; GetCommunication().connection.send(new SetItemDataMessageComposer(objectId, colorHex, text)); return true; } public deleteWallItem(roomId: number, itemId: number): boolean { if(!this._roomEngine || !GetCommunication().connection) return false; GetCommunication().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(RoomObjectVariable.PET_ALLOWED_DIRECTIONS); } else { allowedDirections = k.model.getValue(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(RoomObjectVariable.FURNITURE_SIZE_X); let sizeY = object.model.getValue(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(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 objectData = this.getSelectedRoomObjectData(roomId); if(!objectData) return; const roomObjectController = this._roomEngine.getRoomObject(roomId, objectId, category); if(!roomObjectController) return; if(!this._roomEngine || !GetEventDispatcher()) return; GetEventDispatcher().dispatchEvent(new RoomEngineObjectPlacedOnUserEvent(RoomEngineObjectEvent.PLACED_ON_USER, roomId, objectId, category, objectData.id, objectData.category)); } public setSelectedObject(roomId: number, objectId: number, category: number): void { if(!this._roomEngine) return; const eventDispatcher = GetEventDispatcher(); 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; } } } GetEventDispatcher().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) GetCommunication().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; } public whereYouClickIsWhereYouGo(): boolean { return this._roomEngine.whereYouClickIsWhereYouGo(); } }