!isCenter && onToggle(rx, ry) }
+ />,
+ );
+ }
+ }
+
+ return (
+
+ { tiles }
+
+ );
+};
+
+export const WiredSelectorUsersNeighborhoodView: FC<{}> = () =>
+{
+ const [ selectedTiles, setSelectedTiles ] = useState
([]);
+ const [ filterExisting, setFilterExisting ] = useState(false);
+ const [ invert, setInvert ] = useState(false);
+ const [ sourceType, setSourceType ] = useState(SOURCE_USER_TRIGGER);
+ const [ curX, setCurX ] = useState(0);
+ const [ curY, setCurY ] = useState(0);
+
+ const { trigger = null, setIntParams } = useWired();
+
+ useEffect(() =>
+ {
+ if(!trigger) return;
+
+ const p = trigger.intData;
+ if(p.length >= 1) setSourceType(Math.min(p[0], SOURCE_USER_CLICKED));
+ if(p.length >= 2) setFilterExisting(p[1] === 1);
+ if(p.length >= 3) setInvert(p[2] === 1);
+
+ if(p.length >= 6)
+ {
+ const n = p[5];
+ const tiles: Tile[] = [];
+
+ for(let i = 0; i < n; i++)
+ {
+ const xi = 6 + i * 2;
+ if(xi + 1 < p.length) tiles.push({ x: p[xi], y: p[xi + 1] });
+ }
+
+ setSelectedTiles(tiles);
+ }
+ else
+ {
+ setSelectedTiles([]);
+ }
+ }, [ trigger ]);
+
+ const save = useCallback(() =>
+ {
+ const params: number[] = [
+ sourceType,
+ filterExisting ? 1 : 0,
+ invert ? 1 : 0,
+ selectedTiles.length,
+ ...selectedTiles.flatMap(t => [ t.x, t.y ]),
+ ];
+
+ setIntParams(params);
+ }, [ sourceType, filterExisting, invert, selectedTiles, setIntParams ]);
+
+ const toggleTile = useCallback((x: number, y: number) =>
+ {
+ setSelectedTiles(prev =>
+ tileIncluded(prev, x, y)
+ ? prev.filter(t => !(t.x === x && t.y === y))
+ : [ ...prev, { x, y } ]
+ );
+ }, []);
+
+ const addTile = useCallback(() =>
+ {
+ if(curX === 0 && curY === 0) return;
+ if(!tileIncluded(selectedTiles, curX, curY))
+ setSelectedTiles(prev => [ ...prev, { x: curX, y: curY } ]);
+ }, [ curX, curY, selectedTiles ]);
+
+ const removeTile = useCallback(() =>
+ {
+ setSelectedTiles(prev => prev.filter(t => !(t.x === curX && t.y === curY)));
+ }, [ curX, curY ]);
+
+ const clearTiles = useCallback(() => setSelectedTiles([]), []);
+
+ const loadDefaultPattern = useCallback(() =>
+ {
+ const tiles: Tile[] = [];
+
+ for(let y = -2; y <= 2; y++)
+ {
+ for(let x = -2; x <= 2; x++)
+ {
+ if(x === 0 && y === 0) continue;
+ tiles.push({ x, y });
+ }
+ }
+
+ setSelectedTiles(tiles);
+ }, []);
+
+ const sourceIndex = USER_SOURCES.findIndex(s => s.value === sourceType);
+
+ const prevSource = () =>
+ setSourceType(USER_SOURCES[(sourceIndex - 1 + USER_SOURCES.length) % USER_SOURCES.length].value);
+
+ const nextSource = () =>
+ setSourceType(USER_SOURCES[(sourceIndex + 1) % USER_SOURCES.length].value);
+
+ return (
+
+
+
+
{ LocalizeText('wiredfurni.params.neighborhood_selection') }
+
+
+
+
+
+
+
+
+
+
+
+
+
+ X:
+ setCurX(parseInt(e.target.value) || 0) } />
+ Y:
+ setCurY(parseInt(e.target.value) || 0) } />
+
+
+
+
+
{ LocalizeText('wiredfurni.params.selector_options_selector') }
+
+
+
+
+
+
+
+
{ LocalizeText('wiredfurni.params.sources.merged.title.neighborhood') }
+
+
+
+
+ { LocalizeText(USER_SOURCES[sourceIndex].label) }
+
+
+
+
+
+
+ );
+};