feat(wired-ui): add freeze and furni movement action views

- add UI support for FREEZE, UNFREEZE, FURNI_TO_USER, USER_TO_FURNI and FURNI_TO_FURNI

- add secondary furni source 101 and dual furni-source labels for furni-to-furni targeting

- extend source selectors for custom source sets and titles

- add green primary and blue secondary wired highlights

- clear wired highlights globally on close, reopen and save to avoid stuck selections
This commit is contained in:
Lorenzune
2026-03-17 03:28:00 +01:00
parent 92f69442ad
commit 5f2e9af7fb
9 changed files with 426 additions and 27 deletions
+5
View File
@@ -32,4 +32,9 @@ export class WiredActionLayoutCode
public static USERS_AREA_SELECTOR: number = 31;
public static USERS_NEIGHBORHOOD_SELECTOR: number = 32;
public static SEND_SIGNAL: number = 33;
public static FREEZE: number = 34;
public static UNFREEZE: number = 35;
public static FURNI_TO_USER: number = 36;
public static USER_TO_FURNI: number = 37;
public static FURNI_TO_FURNI: number = 38;
}
+61 -10
View File
@@ -3,25 +3,42 @@ import { GetRoomEngine, IRoomObject, IRoomObjectSpriteVisualization, RoomObjectC
export class WiredSelectionVisualizer
{
private static _selectionShader: WiredFilter = new WiredFilter({
lineColor: [ 1, 1, 1 ],
color: [ 0.6, 0.6, 0.6 ]
lineColor: [ 0.45, 0.95, 0.55 ],
color: [ 0.18, 0.78, 0.30 ]
});
private static _secondarySelectionShader: WiredFilter = new WiredFilter({
lineColor: [ 0.45, 0.78, 1 ],
color: [ 0.20, 0.52, 0.95 ]
});
public static show(furniId: number): void
{
WiredSelectionVisualizer.applySelectionShader(WiredSelectionVisualizer.getRoomObject(furniId));
WiredSelectionVisualizer.applySelectionShader(WiredSelectionVisualizer.getRoomObject(furniId), WiredSelectionVisualizer._selectionShader);
}
public static hide(furniId: number): void
{
WiredSelectionVisualizer.clearSelectionShader(WiredSelectionVisualizer.getRoomObject(furniId));
const roomObject = WiredSelectionVisualizer.getRoomObject(furniId);
WiredSelectionVisualizer.clearSelectionShader(roomObject, WiredSelectionVisualizer._selectionShader);
WiredSelectionVisualizer.clearSelectionShader(roomObject, WiredSelectionVisualizer._secondarySelectionShader);
}
public static showSecondary(furniId: number): void
{
WiredSelectionVisualizer.applySelectionShader(WiredSelectionVisualizer.getRoomObject(furniId), WiredSelectionVisualizer._secondarySelectionShader);
}
public static hideSecondary(furniId: number): void
{
WiredSelectionVisualizer.clearSelectionShader(WiredSelectionVisualizer.getRoomObject(furniId), WiredSelectionVisualizer._secondarySelectionShader);
}
public static clearSelectionShaderFromFurni(furniIds: number[]): void
{
for(const furniId of furniIds)
{
WiredSelectionVisualizer.clearSelectionShader(WiredSelectionVisualizer.getRoomObject(furniId));
WiredSelectionVisualizer.clearSelectionShader(WiredSelectionVisualizer.getRoomObject(furniId), WiredSelectionVisualizer._selectionShader);
}
}
@@ -29,7 +46,39 @@ export class WiredSelectionVisualizer
{
for(const furniId of furniIds)
{
WiredSelectionVisualizer.applySelectionShader(WiredSelectionVisualizer.getRoomObject(furniId));
WiredSelectionVisualizer.applySelectionShader(WiredSelectionVisualizer.getRoomObject(furniId), WiredSelectionVisualizer._selectionShader);
}
}
public static clearSecondarySelectionShaderFromFurni(furniIds: number[]): void
{
for(const furniId of furniIds)
{
WiredSelectionVisualizer.clearSelectionShader(WiredSelectionVisualizer.getRoomObject(furniId), WiredSelectionVisualizer._secondarySelectionShader);
}
}
public static applySecondarySelectionShaderToFurni(furniIds: number[]): void
{
for(const furniId of furniIds)
{
WiredSelectionVisualizer.applySelectionShader(WiredSelectionVisualizer.getRoomObject(furniId), WiredSelectionVisualizer._secondarySelectionShader);
}
}
public static clearAllSelectionShaders(): void
{
const roomEngine = GetRoomEngine();
const roomId = roomEngine.activeRoomId;
if(roomId < 0) return;
const roomObjects = roomEngine.getRoomObjects(roomId, RoomObjectCategory.FLOOR);
for(const roomObject of roomObjects)
{
WiredSelectionVisualizer.clearSelectionShader(roomObject, WiredSelectionVisualizer._selectionShader);
WiredSelectionVisualizer.clearSelectionShader(roomObject, WiredSelectionVisualizer._secondarySelectionShader);
}
}
@@ -40,7 +89,7 @@ export class WiredSelectionVisualizer
return roomEngine.getRoomObject(roomEngine.activeRoomId, objectId, RoomObjectCategory.FLOOR);
}
private static applySelectionShader(roomObject: IRoomObject): void
private static applySelectionShader(roomObject: IRoomObject, filter: WiredFilter): void
{
if(!roomObject) return;
@@ -54,13 +103,15 @@ export class WiredSelectionVisualizer
if(!sprite.filters) sprite.filters = [];
sprite.filters.push(WiredSelectionVisualizer._selectionShader);
if(sprite.filters.includes(filter)) continue;
sprite.filters.push(filter);
sprite.increaseUpdateCounter();
}
}
private static clearSelectionShader(roomObject: IRoomObject): void
private static clearSelectionShader(roomObject: IRoomObject, filter: WiredFilter): void
{
if(!roomObject) return;
@@ -72,7 +123,7 @@ export class WiredSelectionVisualizer
{
if(!sprite.filters) continue;
const index = sprite.filters.indexOf(WiredSelectionVisualizer._selectionShader);
const index = sprite.filters.indexOf(filter);
if(index >= 0)
{