fix(room): support wired click-user controls

This commit is contained in:
Lorenzune
2026-03-21 14:27:57 +01:00
parent a0bece2d4a
commit fd61704375
3 changed files with 50 additions and 9 deletions
@@ -65,6 +65,7 @@ export interface IRoomEngine
getFurnitureWallName(typeId: number, extra?: string): string; getFurnitureWallName(typeId: number, extra?: string): string;
selectRoomObject(roomId: number, objectId: number, objectCategory: number): void; selectRoomObject(roomId: number, objectId: number, objectCategory: number): void;
setSelectedAvatar(roomId: number, objectId: number): void; setSelectedAvatar(roomId: number, objectId: number): void;
clearSelectedAvatar(roomId: number): void;
cancelRoomObjectInsert(): void; cancelRoomObjectInsert(): void;
getPetColorResult(petIndex: number, paletteIndex: number): IPetColorResult; getPetColorResult(petIndex: number, paletteIndex: number): IPetColorResult;
getPetColorResultsForTag(petIndex: number, tagName: string): IPetColorResult[]; getPetColorResultsForTag(petIndex: number, tagName: string): IPetColorResult[];
+8 -3
View File
@@ -2285,8 +2285,6 @@ export class RoomEngine implements IRoomEngine, IRoomCreator, IRoomEngineService
private handleRoomDragging(canvas: IRoomRenderingCanvas, x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean): boolean private handleRoomDragging(canvas: IRoomRenderingCanvas, x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean): boolean
{ {
if(this.isPlayingGame()) return false;
if(this._areaSelectionManager.areaSelectionState === RoomAreaSelectionManager.SELECTING) if(this._areaSelectionManager.areaSelectionState === RoomAreaSelectionManager.SELECTING)
{ {
this._activeRoomIsDragged = false; this._activeRoomIsDragged = false;
@@ -2521,11 +2519,18 @@ export class RoomEngine implements IRoomEngine, IRoomCreator, IRoomEngineService
public setSelectedAvatar(roomId: number, objectId: number): void public setSelectedAvatar(roomId: number, objectId: number): void
{ {
if(this._roomObjectEventHandler) return; if(!this._roomObjectEventHandler) return;
this._roomObjectEventHandler.setSelectedAvatar(roomId, objectId, true); this._roomObjectEventHandler.setSelectedAvatar(roomId, objectId, true);
} }
public clearSelectedAvatar(roomId: number): void
{
if(!this._roomObjectEventHandler) return;
this._roomObjectEventHandler.clearSelectedAvatar(roomId);
}
public cancelRoomObjectInsert(): void public cancelRoomObjectInsert(): void
{ {
if(!this._roomObjectEventHandler) return; if(!this._roomObjectEventHandler) return;
+41 -6
View File
@@ -10,6 +10,7 @@ import { SelectedRoomObjectData } from './utils';
export class RoomObjectEventHandler implements IRoomCanvasMouseListener, IRoomObjectEventManager export class RoomObjectEventHandler implements IRoomCanvasMouseListener, IRoomObjectEventManager
{ {
private static readonly CLICK_USER_LOOK_DELAY_MS = 120;
private _eventIds: Map<number, Map<string, string>> = new Map(); private _eventIds: Map<number, Map<string, string>> = new Map();
private _selectedAvatarId: number = -1; private _selectedAvatarId: number = -1;
@@ -17,6 +18,7 @@ export class RoomObjectEventHandler implements IRoomCanvasMouseListener, IRoomOb
private _selectedObjectCategory: number = -2; private _selectedObjectCategory: number = -2;
private _whereYouClickIsWhereYouGo: boolean = true; private _whereYouClickIsWhereYouGo: boolean = true;
private _objectPlacementSource: string = null; private _objectPlacementSource: string = null;
private _pendingAvatarLookTimeout: ReturnType<typeof setTimeout> = null;
constructor( constructor(
private readonly _roomEngine: IRoomEngineServices) private readonly _roomEngine: IRoomEngineServices)
@@ -2080,6 +2082,8 @@ export class RoomObjectEventHandler implements IRoomCanvasMouseListener, IRoomOb
{ {
if(!this._roomEngine) return; if(!this._roomEngine) return;
this.clearPendingAvatarLook();
const _local_4 = RoomObjectCategory.UNIT; const _local_4 = RoomObjectCategory.UNIT;
const _local_5 = this._roomEngine.getRoomObject(k, this._selectedAvatarId, _local_4); const _local_5 = this._roomEngine.getRoomObject(k, this._selectedAvatarId, _local_4);
@@ -2100,15 +2104,26 @@ export class RoomObjectEventHandler implements IRoomCanvasMouseListener, IRoomOb
{ {
_local_5.logic.processUpdateMessage(new ObjectAvatarSelectedMessage(true)); _local_5.logic.processUpdateMessage(new ObjectAvatarSelectedMessage(true));
_local_6 = true; _local_6 = true;
this._selectedAvatarId = _arg_2; this._selectedAvatarId = _arg_2;
const location = _local_5.getLocation(); const location = _local_5.getLocation();
if(location) GetCommunication().connection.send(new RoomUnitLookComposer(~~(location.x), ~~(location.y))); if(location)
} {
} this._pendingAvatarLookTimeout = setTimeout(() =>
{
this._pendingAvatarLookTimeout = null;
if(this.shouldSuppressAvatarLook()) return;
if(this._selectedAvatarId !== _arg_2) return;
GetCommunication().connection.send(new RoomUnitLookComposer(~~(location.x), ~~(location.y)));
}, RoomObjectEventHandler.CLICK_USER_LOOK_DELAY_MS);
}
}
}
const selectionArrow = this._roomEngine.getRoomObjectSelectionArrow(k); const selectionArrow = this._roomEngine.getRoomObjectSelectionArrow(k);
@@ -2119,6 +2134,26 @@ export class RoomObjectEventHandler implements IRoomCanvasMouseListener, IRoomOb
} }
} }
public clearSelectedAvatar(roomId: number): void
{
this.setSelectedAvatar(roomId, 0, false);
}
private clearPendingAvatarLook(): void
{
if(!this._pendingAvatarLookTimeout) return;
clearTimeout(this._pendingAvatarLookTimeout);
this._pendingAvatarLookTimeout = null;
}
private shouldSuppressAvatarLook(): boolean
{
const control = (globalThis as any).__nitroAvatarClickControl;
return !!control && (control.suppressRotateUntil > Date.now());
}
private resetSelectedObjectData(roomId: number): void private resetSelectedObjectData(roomId: number): void
{ {
if(!this._roomEngine) return; if(!this._roomEngine) return;