From eb4ba702fdf77681d5f4cfe9b9b8f8f7d55db64b Mon Sep 17 00:00:00 2001 From: duckietm Date: Wed, 4 Mar 2026 11:17:40 +0100 Subject: [PATCH] =?UTF-8?q?=E2=84=B9=EF=B8=8F=20=20Release=20wired=20:=20w?= =?UTF-8?q?f=5Fslc=5Ffurni=5Farea?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wired/WiredActionLayoutCode.ts | 1 + .../NavigatorRoomSettingsBasicTabView.tsx | 3 +- src/components/wired/views/WiredBaseView.tsx | 7 +- .../views/actions/WiredActionBaseView.tsx | 7 +- .../views/actions/WiredActionLayoutView.tsx | 3 + .../selectors/WiredActionFurniAreaView.tsx | 98 +++++++++++++++++++ 6 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 src/components/wired/views/selectors/WiredActionFurniAreaView.tsx diff --git a/src/api/wired/WiredActionLayoutCode.ts b/src/api/wired/WiredActionLayoutCode.ts index 5282dc5..cf01487 100644 --- a/src/api/wired/WiredActionLayoutCode.ts +++ b/src/api/wired/WiredActionLayoutCode.ts @@ -26,4 +26,5 @@ export class WiredActionLayoutCode public static BOT_FOLLOW_AVATAR: number = 25; public static BOT_CHANGE_FIGURE: number = 26; public static BOT_TALK_DIRECT_TO_AVTR: number = 27; + public static FURNI_AREA_SELECTOR: number = 28; } diff --git a/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx b/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx index dc4ca42..340d66b 100644 --- a/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx +++ b/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx @@ -163,8 +163,7 @@ export const NavigatorRoomSettingsBasicTabView: FC{ LocalizeText('navigator.roomsettings.allow_walk_through') } - - { LocalizeText('navigator.roomsettings.delete') } + { LocalizeText('navigator.roomsettings.delete') } ); diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index 8e8fb37..46ffa6c 100644 --- a/src/components/wired/views/WiredBaseView.tsx +++ b/src/components/wired/views/WiredBaseView.tsx @@ -1,5 +1,5 @@ import { GetSessionDataManager } from '@nitrots/nitro-renderer'; -import { FC, PropsWithChildren, useEffect, useState } from 'react'; +import { CSSProperties, FC, PropsWithChildren, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../api'; import { Button, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; import { useWired } from '../../../hooks'; @@ -12,11 +12,12 @@ export interface WiredBaseViewProps hasSpecialInput: boolean; save: () => void; validate?: () => boolean; + cardStyle?: CSSProperties; } export const WiredBaseView: FC> = props => { - const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false } = props; + const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false, cardStyle = undefined } = props; const [ wiredName, setWiredName ] = useState(null); const [ wiredDescription, setWiredDescription ] = useState(null); const [ needsSave, setNeedsSave ] = useState(false); @@ -87,7 +88,7 @@ export const WiredBaseView: FC> = props => }, [ trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds, setAllowsFurni ]); return ( - +
diff --git a/src/components/wired/views/actions/WiredActionBaseView.tsx b/src/components/wired/views/actions/WiredActionBaseView.tsx index 1b4fc9a..bc647c5 100644 --- a/src/components/wired/views/actions/WiredActionBaseView.tsx +++ b/src/components/wired/views/actions/WiredActionBaseView.tsx @@ -1,5 +1,5 @@ import { WiredActionDefinition } from '@nitrots/nitro-renderer'; -import { FC, PropsWithChildren, useEffect } from 'react'; +import { CSSProperties, FC, PropsWithChildren, useEffect } from 'react'; import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; @@ -10,11 +10,12 @@ export interface WiredActionBaseViewProps hasSpecialInput: boolean; requiresFurni: number; save: () => void; + cardStyle?: CSSProperties; } export const WiredActionBaseView: FC> = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; + const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null, cardStyle = undefined } = props; const { trigger = null, actionDelay = 0, setActionDelay = null } = useWired(); useEffect(() => @@ -23,7 +24,7 @@ export const WiredActionBaseView: FC }, [ trigger, setActionDelay ]); return ( - + { children } { !!children &&
}
diff --git a/src/components/wired/views/actions/WiredActionLayoutView.tsx b/src/components/wired/views/actions/WiredActionLayoutView.tsx index 36d14d4..0b83483 100644 --- a/src/components/wired/views/actions/WiredActionLayoutView.tsx +++ b/src/components/wired/views/actions/WiredActionLayoutView.tsx @@ -1,5 +1,6 @@ import { WiredActionLayoutCode } from '../../../../api'; import { WiredActionBotChangeFigureView } from './WiredActionBotChangeFigureView'; +import { WiredActionFurniAreaView } from '../selectors/WiredActionFurniAreaView'; import { WiredActionBotFollowAvatarView } from './WiredActionBotFollowAvatarView'; import { WiredActionBotGiveHandItemView } from './WiredActionBotGiveHandItemView'; import { WiredActionBotMoveView } from './WiredActionBotMoveView'; @@ -79,6 +80,8 @@ export const WiredActionLayoutView = (code: number) => return ; case WiredActionLayoutCode.TOGGLE_FURNI_STATE: return ; + case WiredActionLayoutCode.FURNI_AREA_SELECTOR: + return ; } return null; diff --git a/src/components/wired/views/selectors/WiredActionFurniAreaView.tsx b/src/components/wired/views/selectors/WiredActionFurniAreaView.tsx new file mode 100644 index 0000000..b54eff0 --- /dev/null +++ b/src/components/wired/views/selectors/WiredActionFurniAreaView.tsx @@ -0,0 +1,98 @@ +import { GetRoomEngine, RoomAreaSelectionManager } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { LocalizeText } from '../../../../api'; +import { Button, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; +import { WiredActionBaseView } from '../actions/WiredActionBaseView'; + +export const WiredActionFurniAreaView: FC<{}> = props => +{ + const [ rootX, setRootX ] = useState(0); + const [ rootY, setRootY ] = useState(0); + const [ areaWidth, setAreaWidth ] = useState(0); + const [ areaHeight, setAreaHeight ] = useState(0); + const { trigger = null, setIntParams } = useWired(); + + const save = useCallback(() => + { + setIntParams([ rootX, rootY, areaWidth, areaHeight ]); + }, [ rootX, rootY, areaWidth, areaHeight, setIntParams ]); + + useEffect(() => + { + if(!trigger) return; + + const callback = (x: number, y: number, w: number, h: number) => + { + setRootX(x); + setRootY(y); + setAreaWidth(w); + setAreaHeight(h); + }; + + const activated = GetRoomEngine().areaSelectionManager.activate(callback, RoomAreaSelectionManager.HIGHLIGHT_BRIGHTEN); + + if(activated) + { + if(trigger.intData.length >= 4 && trigger.intData[2] > 0 && trigger.intData[3] > 0) + { + GetRoomEngine().areaSelectionManager.setHighlight( + trigger.intData[0], + trigger.intData[1], + trigger.intData[2], + trigger.intData[3] + ); + } + } + + return () => + { + GetRoomEngine().areaSelectionManager.deactivate(); + }; + }, [ trigger ]); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 4) + { + setRootX(trigger.intData[0]); + setRootY(trigger.intData[1]); + setAreaWidth(trigger.intData[2]); + setAreaHeight(trigger.intData[3]); + } + else + { + setRootX(0); + setRootY(0); + setAreaWidth(0); + setAreaHeight(0); + } + }, [ trigger ]); + + const hasArea = areaWidth > 0 && areaHeight > 0; + + return ( + +
+ { LocalizeText('wiredfurni.params.area_selection') } + { LocalizeText('wiredfurni.params.area_selection.info') } + + { hasArea && + + { LocalizeText('wiredfurni.params.area_selection.selected', [ 'x', 'y', 'w', 'h' ], [ rootX.toString(), rootY.toString(), areaWidth.toString(), areaHeight.toString() ]) } + } + +
+ + +
+
+
+ ); +};