From ba0208c65483ee5dd6bedbfa6ffcc4142e132cfa Mon Sep 17 00:00:00 2001 From: Lorenzune Date: Sun, 15 Mar 2026 19:02:34 +0100 Subject: [PATCH 1/2] wired ui: add source selector support --- src/components/wired/views/WiredBaseView.tsx | 17 +++- .../wired/views/WiredSourcesSelector.tsx | 92 +++++++++++++++++++ .../views/actions/WiredActionBaseView.tsx | 7 +- .../WiredActionBotFollowAvatarView.tsx | 15 ++- .../WiredActionBotGiveHandItemView.tsx | 15 ++- .../views/actions/WiredActionBotMoveView.tsx | 46 +++++++++- .../WiredActionBotTalkToAvatarView.tsx | 15 ++- .../actions/WiredActionBotTeleportView.tsx | 46 +++++++++- .../WiredActionCallAnotherStackView.tsx | 49 +++++++++- .../views/actions/WiredActionChaseView.tsx | 49 +++++++++- .../views/actions/WiredActionChatView.tsx | 22 ++++- .../views/actions/WiredActionFleeView.tsx | 49 +++++++++- .../actions/WiredActionGiveRewardView.tsx | 15 ++- .../actions/WiredActionGiveScoreView.tsx | 16 +++- .../views/actions/WiredActionJoinTeamView.tsx | 15 ++- .../actions/WiredActionKickFromRoomView.tsx | 22 ++++- .../actions/WiredActionLeaveTeamView.tsx | 28 +++++- .../WiredActionMoveAndRotateFurniView.tsx | 39 +++++++- .../actions/WiredActionMoveFurniToView.tsx | 39 +++++++- .../actions/WiredActionMoveFurniView.tsx | 39 +++++++- .../views/actions/WiredActionMuteUserView.tsx | 15 ++- .../WiredActionSetFurniStateToView.tsx | 39 +++++++- .../views/actions/WiredActionTeleportView.tsx | 67 +++++++++++++- .../WiredActionToggleFurniStateView.tsx | 49 +++++++++- .../WiredConditionActorHasHandItem.tsx | 15 ++- .../WiredConditionActorIsGroupMemberView.tsx | 28 +++++- .../WiredConditionActorIsOnFurniView.tsx | 65 ++++++++++++- .../WiredConditionActorIsTeamMemberView.tsx | 15 ++- .../WiredConditionActorIsWearingBadgeView.tsx | 22 ++++- ...WiredConditionActorIsWearingEffectView.tsx | 16 +++- .../conditions/WiredConditionBaseView.tsx | 7 +- .../WiredConditionFurniHasAvatarOnView.tsx | 48 +++++++++- .../WiredConditionFurniHasFurniOnView.tsx | 38 +++++++- .../WiredConditionFurniHasNotFurniOnView.tsx | 38 +++++++- .../WiredConditionFurniIsOfTypeView.tsx | 48 +++++++++- ...WiredConditionFurniMatchesSnapshotView.tsx | 38 +++++++- .../WiredConditionUserCountInRoomView.tsx | 16 +++- 37 files changed, 1095 insertions(+), 104 deletions(-) create mode 100644 src/components/wired/views/WiredSourcesSelector.tsx diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index 46ffa6c..4c4f0db 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 { CSSProperties, FC, PropsWithChildren, useEffect, useState } from 'react'; +import { CSSProperties, FC, PropsWithChildren, ReactNode, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../api'; import { Button, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; import { useWired } from '../../../hooks'; @@ -13,11 +13,12 @@ export interface WiredBaseViewProps save: () => void; validate?: () => boolean; cardStyle?: CSSProperties; + footer?: ReactNode; } export const WiredBaseView: FC> = props => { - const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false, cardStyle = undefined } = props; + const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false, cardStyle = undefined, footer = null } = props; const [ wiredName, setWiredName ] = useState(null); const [ wiredDescription, setWiredDescription ] = useState(null); const [ needsSave, setNeedsSave ] = useState(false); @@ -83,9 +84,14 @@ export const WiredBaseView: FC> = props => return []; }); } + }, [ trigger, hasSpecialInput, setIntParams, setStringParam, setFurniIds ]); + + useEffect(() => + { + if(!trigger) return; setAllowsFurni(requiresFurni); - }, [ trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds, setAllowsFurni ]); + }, [ trigger, requiresFurni, setAllowsFurni ]); return ( @@ -105,6 +111,11 @@ export const WiredBaseView: FC> = props =>
} + { footer && + <> +
+ { footer } + }
diff --git a/src/components/wired/views/WiredSourcesSelector.tsx b/src/components/wired/views/WiredSourcesSelector.tsx new file mode 100644 index 0000000..db072a6 --- /dev/null +++ b/src/components/wired/views/WiredSourcesSelector.tsx @@ -0,0 +1,92 @@ +import { FC } from 'react'; +import { FaChevronLeft, FaChevronRight } from 'react-icons/fa'; +import { LocalizeText } from '../../../api'; +import { Button, Text } from '../../../common'; + +export const FURNI_SOURCES = [ + { value: 0, label: 'wiredfurni.params.sources.furni.0' }, + { value: 100, label: 'wiredfurni.params.sources.furni.100' }, + { value: 200, label: 'wiredfurni.params.sources.furni.200' }, + { value: 201, label: 'wiredfurni.params.sources.furni.201' } +]; + +export const USER_SOURCES = [ + { value: 0, label: 'wiredfurni.params.sources.users.0' }, + { value: 200, label: 'wiredfurni.params.sources.users.200' }, + { value: 201, label: 'wiredfurni.params.sources.users.201' } +]; + +interface WiredSourcesSelectorProps +{ + showFurni?: boolean; + showUsers?: boolean; + furniSource?: number; + userSource?: number; + onChangeFurni?: (source: number) => void; + onChangeUsers?: (source: number) => void; +} + +export const WiredSourcesSelector: FC = props => +{ + const { showFurni = false, showUsers = false, furniSource = 0, userSource = 0, onChangeFurni = null, onChangeUsers = null } = props; + + const furniIndex = Math.max(0, FURNI_SOURCES.findIndex(s => s.value === furniSource)); + const userIndex = Math.max(0, USER_SOURCES.findIndex(s => s.value === userSource)); + + const prevFurni = () => + { + const next = (furniIndex - 1 + FURNI_SOURCES.length) % FURNI_SOURCES.length; + onChangeFurni && onChangeFurni(FURNI_SOURCES[next].value); + }; + + const nextFurni = () => + { + const next = (furniIndex + 1) % FURNI_SOURCES.length; + onChangeFurni && onChangeFurni(FURNI_SOURCES[next].value); + }; + + const prevUsers = () => + { + const next = (userIndex - 1 + USER_SOURCES.length) % USER_SOURCES.length; + onChangeUsers && onChangeUsers(USER_SOURCES[next].value); + }; + + const nextUsers = () => + { + const next = (userIndex + 1) % USER_SOURCES.length; + onChangeUsers && onChangeUsers(USER_SOURCES[next].value); + }; + + if(!showFurni && !showUsers) return null; + + return ( +
+ { showFurni && + <> + { LocalizeText('wiredfurni.params.sources.furni.title') } +
+ +
+ { LocalizeText(FURNI_SOURCES[furniIndex].label) } +
+ +
+ } + + { showFurni && showUsers &&
} + + { showUsers && + <> + { LocalizeText('wiredfurni.params.sources.users.title') } +
+ +
+ { LocalizeText(USER_SOURCES[userIndex].label) } +
+ +
+ } +
+ ); +}; + diff --git a/src/components/wired/views/actions/WiredActionBaseView.tsx b/src/components/wired/views/actions/WiredActionBaseView.tsx index 4fea3f4..eaa30fc 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 { CSSProperties, FC, PropsWithChildren, useEffect } from 'react'; +import { CSSProperties, FC, PropsWithChildren, ReactNode, useEffect } from 'react'; import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; @@ -13,11 +13,12 @@ export interface WiredActionBaseViewProps validate?: () => boolean; cardStyle?: CSSProperties; hideDelay?: boolean; + footer?: ReactNode; } export const WiredActionBaseView: FC> = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, hasSpecialInput = false, children = null, cardStyle = undefined, hideDelay = false } = props; + const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, hasSpecialInput = false, children = null, cardStyle = undefined, hideDelay = false, footer = null } = props; const { trigger = null, actionDelay = 0, setActionDelay = null } = useWired(); useEffect(() => @@ -26,7 +27,7 @@ export const WiredActionBaseView: FC }, [ trigger, setActionDelay ]); return ( - + { children } { !hideDelay && !!children &&
} { !hideDelay &&
diff --git a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx index 9576ea0..e78ce8a 100644 --- a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx @@ -4,27 +4,38 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionBotFollowAvatarView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); const [ followMode, setFollowMode ] = useState(-1); const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); const save = () => { setStringParam(botName); - setIntParams([ followMode ]); + setIntParams([ followMode, userSource ]); }; useEffect(() => { setBotName(trigger.stringData); setFollowMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx index 0dc2bc4..472e46f 100644 --- a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx +++ b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx @@ -4,6 +4,7 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; const ALLOWED_HAND_ITEM_IDS: number[] = [ 2, 5, 7, 8, 9, 10, 27 ]; @@ -12,21 +13,31 @@ export const WiredActionBotGiveHandItemView: FC<{}> = props => const [ botName, setBotName ] = useState(''); const [ handItemId, setHandItemId ] = useState(-1); const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); const save = () => { setStringParam(botName); - setIntParams([ handItemId ]); + setIntParams([ handItemId, userSource ]); }; useEffect(() => { setBotName(trigger.stringData); setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotMoveView.tsx b/src/components/wired/views/actions/WiredActionBotMoveView.tsx index 644b34e..14a3d47 100644 --- a/src/components/wired/views/actions/WiredActionBotMoveView.tsx +++ b/src/components/wired/views/actions/WiredActionBotMoveView.tsx @@ -1,24 +1,62 @@ import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; +import { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../../api'; import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionBotMoveView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); + const { trigger = null, furniIds = [], setFurniIds = null, setStringParam = null, setIntParams = null } = useWired(); - const save = () => setStringParam(botName); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + const save = () => + { + setStringParam(botName); + setIntParams([ furniSource ]); + }; useEffect(() => { + if(!trigger) return; + setBotName(trigger.stringData); + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + return ( - + }>
{ LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx index b69a972..4961154 100644 --- a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx @@ -4,6 +4,7 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionBotTalkToAvatarView: FC<{}> = props => { @@ -11,11 +12,16 @@ export const WiredActionBotTalkToAvatarView: FC<{}> = props => const [ message, setMessage ] = useState(''); const [ talkMode, setTalkMode ] = useState(-1); const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); const save = () => { setStringParam(botName + WIRED_STRING_DELIMETER + message); - setIntParams([ talkMode ]); + setIntParams([ talkMode, userSource ]); }; useEffect(() => @@ -26,10 +32,15 @@ export const WiredActionBotTalkToAvatarView: FC<{}> = props => if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx b/src/components/wired/views/actions/WiredActionBotTeleportView.tsx index 1979930..ef53eb4 100644 --- a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTeleportView.tsx @@ -1,24 +1,62 @@ import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; +import { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../../api'; import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionBotTeleportView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); + const { trigger = null, furniIds = [], setFurniIds = null, setStringParam = null, setIntParams = null } = useWired(); - const save = () => setStringParam(botName); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + const save = () => + { + setStringParam(botName); + setIntParams([ furniSource ]); + }; useEffect(() => { + if(!trigger) return; + setBotName(trigger.stringData); + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + return ( - + }>
{ LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx b/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx index 69c17fe..adff8b5 100644 --- a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx +++ b/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx @@ -1,8 +1,51 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; +import { FC, useEffect, useState } from 'react'; +import { WiredFurniType, WiredSelectionVisualizer } from '../../../../api'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionCallAnotherStackView: FC<{}> = props => { - return ; + const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); + }, [ trigger ]); + + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const save = () => setIntParams([ furniSource ]); + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + + return ( + } /> + ); }; diff --git a/src/components/wired/views/actions/WiredActionChaseView.tsx b/src/components/wired/views/actions/WiredActionChaseView.tsx index d0e1c41..b8a8a63 100644 --- a/src/components/wired/views/actions/WiredActionChaseView.tsx +++ b/src/components/wired/views/actions/WiredActionChaseView.tsx @@ -1,8 +1,51 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; +import { FC, useEffect, useState } from 'react'; +import { WiredFurniType, WiredSelectionVisualizer } from '../../../../api'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionChaseView: FC<{}> = props => { - return ; + const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); + }, [ trigger ]); + + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const save = () => setIntParams([ furniSource ]); + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + + return ( + } /> + ); }; diff --git a/src/components/wired/views/actions/WiredActionChatView.tsx b/src/components/wired/views/actions/WiredActionChatView.tsx index 8f622c2..8601d23 100644 --- a/src/components/wired/views/actions/WiredActionChatView.tsx +++ b/src/components/wired/views/actions/WiredActionChatView.tsx @@ -4,21 +4,37 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionChatView: FC<{}> = props => { const [ message, setMessage ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return 0; + }); - const save = () => setStringParam(message); + const save = () => + { + setStringParam(message); + setIntParams([ userSource ]); + }; useEffect(() => { setMessage(trigger.stringData); + if(trigger.intData.length >= 1) setUserSource(trigger.intData[0]); + else setUserSource(0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.message') } ('wired.action.chat.max.length', 100) } type="text" value={ message } onChange={ event => setMessage(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionFleeView.tsx b/src/components/wired/views/actions/WiredActionFleeView.tsx index e3e5776..69eaf8a 100644 --- a/src/components/wired/views/actions/WiredActionFleeView.tsx +++ b/src/components/wired/views/actions/WiredActionFleeView.tsx @@ -1,8 +1,51 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; +import { FC, useEffect, useState } from 'react'; +import { WiredFurniType, WiredSelectionVisualizer } from '../../../../api'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionFleeView: FC<{}> = props => { - return ; + const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); + }, [ trigger ]); + + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const save = () => setIntParams([ furniSource ]); + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + + return ( + } /> + ); }; diff --git a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx index 903238b..91c1468 100644 --- a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx @@ -5,6 +5,7 @@ import { Button, Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionGiveRewardView: FC<{}> = props => { @@ -15,6 +16,11 @@ export const WiredActionGiveRewardView: FC<{}> = props => const [ limitationInterval, setLimitationInterval ] = useState(1); const [ rewards, setRewards ] = useState<{ isBadge: boolean, itemCode: string, probability: number }[]>([]); const { trigger = null, setIntParams = null, setStringParam = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 4) return trigger.intData[4]; + return 0; + }); const addReward = () => setRewards(rewards => [ ...rewards, { isBadge: false, itemCode: '', probability: null } ]); @@ -59,7 +65,7 @@ export const WiredActionGiveRewardView: FC<{}> = props => if(stringRewards.length > 0) { setStringParam(stringRewards.join(';')); - setIntParams([ rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval ]); + setIntParams([ rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval, userSource ]); } }; @@ -88,11 +94,16 @@ export const WiredActionGiveRewardView: FC<{}> = props => setRewardsLimit((trigger.intData.length > 2) ? trigger.intData[2] : 0); setLimitationInterval((trigger.intData.length > 3) ? trigger.intData[3] : 0); setLimitEnabled((trigger.intData.length > 3) ? trigger.intData[3] > 0 : false); + setUserSource((trigger.intData.length > 4) ? trigger.intData[4] : 0); setRewards(readRewards); }, [ trigger ]); return ( - + }>
setLimitEnabled(event.target.checked) } /> { LocalizeText('wiredfurni.params.prizelimit', [ 'amount' ], [ limitEnabled ? rewardsLimit.toString() : '' ]) } diff --git a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreView.tsx index 2077581..402b69d 100644 --- a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveScoreView.tsx @@ -3,14 +3,20 @@ import { LocalizeText, WiredFurniType } from '../../../../api'; import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionGiveScoreView: FC<{}> = props => { const [ points, setPoints ] = useState(1); const [ time, setTime ] = useState(1); const { trigger = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 2) return trigger.intData[2]; + return 0; + }); - const save = () => setIntParams([ points, time ]); + const save = () => setIntParams([ points, time, userSource ]); useEffect(() => { @@ -24,10 +30,16 @@ export const WiredActionGiveScoreView: FC<{}> = props => setPoints(1); setTime(1); } + + setUserSource((trigger.intData.length > 2) ? trigger.intData[2] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.setpoints', [ 'points' ], [ points.toString() ]) } = props => { const [ selectedTeam, setSelectedTeam ] = useState(-1); const { trigger = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); - const save = () => setIntParams([ selectedTeam ]); + const save = () => setIntParams([ selectedTeam, userSource ]); useEffect(() => { setSelectedTeam((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.team') } { [ 1, 2, 3, 4 ].map(team => diff --git a/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx b/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx index 002426d..5ed851b 100644 --- a/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx +++ b/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx @@ -4,21 +4,37 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionKickFromRoomView: FC<{}> = props => { const [ message, setMessage ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return 0; + }); - const save = () => setStringParam(message); + const save = () => + { + setStringParam(message); + setIntParams([ userSource ]); + }; useEffect(() => { setMessage(trigger.stringData); + if(trigger.intData.length >= 1) setUserSource(trigger.intData[0]); + else setUserSource(0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.message') } ('wired.action.kick.from.room.max.length', 100) } type="text" value={ message } onChange={ event => setMessage(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx index 9202ed3..2a5ceb3 100644 --- a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx @@ -1,8 +1,32 @@ -import { FC } from 'react'; +import { FC, useEffect, useState } from 'react'; import { WiredFurniType } from '../../../../api'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionLeaveTeamView: FC<{}> = props => { - return ; + const { trigger = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return 0; + }); + + useEffect(() => + { + if(!trigger) return; + if(trigger.intData.length >= 1) setUserSource(trigger.intData[0]); + else setUserSource(0); + }, [ trigger ]); + + const save = () => setIntParams([ userSource ]); + + return ( + } /> + ); }; diff --git a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx index d30b43b..83d66b6 100644 --- a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx @@ -1,8 +1,9 @@ import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; +import { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../../api'; import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; const directionOptions: { value: number, icon: string }[] = [ { @@ -29,9 +30,14 @@ export const WiredActionMoveAndRotateFurniView: FC<{}> = props => { const [ movement, setMovement ] = useState(-1); const [ rotation, setRotation ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); + const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length > 2) return trigger.intData[2]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); - const save = () => setIntParams([ movement, rotation ]); + const save = () => setIntParams([ movement, rotation, furniSource ]); useEffect(() => { @@ -45,10 +51,35 @@ export const WiredActionMoveAndRotateFurniView: FC<{}> = props => setMovement(-1); setRotation(-1); } + + if(trigger.intData.length > 2) setFurniSource(trigger.intData[2]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + return ( - + }>
{ LocalizeText('wiredfurni.params.startdir') }
diff --git a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx index 64ece78..8653c02 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx @@ -1,8 +1,9 @@ import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; +import { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../../api'; import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; const directionOptions: { value: number, icon: string }[] = [ { @@ -27,9 +28,14 @@ export const WiredActionMoveFurniToView: FC<{}> = props => { const [ spacing, setSpacing ] = useState(-1); const [ movement, setMovement ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); + const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length > 2) return trigger.intData[2]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); - const save = () => setIntParams([ movement, spacing ]); + const save = () => setIntParams([ movement, spacing, furniSource ]); useEffect(() => { @@ -43,10 +49,35 @@ export const WiredActionMoveFurniToView: FC<{}> = props => setSpacing(-1); setMovement(-1); } + + if(trigger.intData.length > 2) setFurniSource(trigger.intData[2]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_OR_BY_TYPE + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + return ( - + }>
{ LocalizeText('wiredfurni.params.emptytiles', [ 'tiles' ], [ spacing.toString() ]) } = props => { const [ movement, setMovement ] = useState(-1); const [ rotation, setRotation ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); + const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length > 2) return trigger.intData[2]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); - const save = () => setIntParams([ movement, rotation ]); + const save = () => setIntParams([ movement, rotation, furniSource ]); useEffect(() => { @@ -57,10 +63,35 @@ export const WiredActionMoveFurniView: FC<{}> = props => setMovement(-1); setRotation(-1); } + + if(trigger.intData.length > 2) setFurniSource(trigger.intData[2]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + return ( - + }>
{ LocalizeText('wiredfurni.params.movefurni') }
diff --git a/src/components/wired/views/actions/WiredActionMuteUserView.tsx b/src/components/wired/views/actions/WiredActionMuteUserView.tsx index 7011c02..0645834 100644 --- a/src/components/wired/views/actions/WiredActionMuteUserView.tsx +++ b/src/components/wired/views/actions/WiredActionMuteUserView.tsx @@ -4,27 +4,38 @@ import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionMuteUserView: FC<{}> = props => { const [ time, setTime ] = useState(-1); const [ message, setMessage ] = useState(''); const { trigger = null, setIntParams = null, setStringParam = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); const save = () => { - setIntParams([ time ]); + setIntParams([ time, userSource ]); setStringParam(message); }; useEffect(() => { setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); setMessage(trigger.stringData); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.length.minutes', [ 'minutes' ], [ time.toString() ]) } = props => { const [ stateFlag, setStateFlag ] = useState(0); const [ directionFlag, setDirectionFlag ] = useState(0); const [ positionFlag, setPositionFlag ] = useState(0); - const { trigger = null, setIntParams = null } = useWired(); + const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length > 3) return trigger.intData[3]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); - const save = () => setIntParams([ stateFlag, directionFlag, positionFlag ]); + const save = () => setIntParams([ stateFlag, directionFlag, positionFlag, furniSource ]); useEffect(() => { setStateFlag(trigger.getBoolean(0) ? 1 : 0); setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); setPositionFlag(trigger.getBoolean(2) ? 1 : 0); + + if(trigger.intData.length > 3) setFurniSource(trigger.intData[3]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + return ( - + }>
{ LocalizeText('wiredfurni.params.conditions') }
diff --git a/src/components/wired/views/actions/WiredActionTeleportView.tsx b/src/components/wired/views/actions/WiredActionTeleportView.tsx index 04ef42d..34e8b8f 100644 --- a/src/components/wired/views/actions/WiredActionTeleportView.tsx +++ b/src/components/wired/views/actions/WiredActionTeleportView.tsx @@ -1,8 +1,69 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; +import { FC, useEffect, useState } from 'react'; +import { WiredFurniType, WiredSelectionVisualizer } from '../../../../api'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionTeleportView: FC<{}> = props => { - return ; + const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length >= 2) return trigger.intData[1]; + return 0; + }); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); + + if(trigger.intData.length >= 2) setUserSource(trigger.intData[1]); + else setUserSource(0); + }, [ trigger ]); + + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const save = () => setIntParams([ furniSource, userSource ]); + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + + return ( + + } /> + ); }; diff --git a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx b/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx index 486aa8e..d0ca065 100644 --- a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx +++ b/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx @@ -1,8 +1,51 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; +import { FC, useEffect, useState } from 'react'; +import { WiredFurniType, WiredSelectionVisualizer } from '../../../../api'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; +import { useWired } from '../../../../hooks'; export const WiredActionToggleFurniStateView: FC<{}> = props => { - return ; + const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); + }, [ trigger ]); + + const onChangeFurniSource = (next: number) => + { + if(furniIds.length && setFurniIds) + { + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + return []; + }); + } + + setFurniSource(next); + }; + + const save = () => setIntParams([ furniSource ]); + + const requiresFurni = (furniSource === 100) + ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT + : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + + return ( + } /> + ); }; diff --git a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx b/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx index 5c6c391..41df779 100644 --- a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx @@ -3,6 +3,7 @@ import { LocalizeText, WiredFurniType } from '../../../../api'; import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; const ALLOWED_HAND_ITEM_IDS: number[] = [ 2, 5, 7, 8, 9, 10, 27 ]; @@ -10,16 +11,26 @@ export const WiredConditionActorHasHandItemView: FC<{}> = props => { const [ handItemId, setHandItemId ] = useState(-1); const { trigger = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); - const save = () => setIntParams([ handItemId ]); + const save = () => setIntParams([ handItemId, userSource ]); useEffect(() => { setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.handitem') } setAntennaSource(antennaSource === ANTENNA_PICKED ? ANTENNA_TRIGGER : ANTENNA_PICKED) } /> - -
- - { /* --- Furni to forward --- */ } - { LocalizeText('wiredfurni.params.sources.furni.title.signal_forward') } -
-
- setFurniForward(e.target.checked ? FORWARD_TRIGGER : FORWARD_NONE) } /> - -
- { furniForward !== FORWARD_NONE && - - } -
- - { /* --- Users to forward --- */ } - { LocalizeText('wiredfurni.params.sources.users.title.signal_forward') } -
-
- setUserForward(e.target.checked ? FORWARD_TRIGGER : FORWARD_NONE) } /> - -
- { userForward !== FORWARD_NONE && - - } -
- - { LocalizeText('wiredfurni.params.signal.options') } -
- setSignalPerFurni(e.target.checked) } /> - -
-
- setSignalPerUser(e.target.checked) } /> - -
- } - + { LocalizeText('wiredfurni.params.signal.options') } +
+ setSignalPerFurni(e.target.checked) } /> + +
+
+ setSignalPerUser(e.target.checked) } /> + +
); diff --git a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx index f7ee4c3..8f31754 100644 --- a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx +++ b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx @@ -1,5 +1,5 @@ import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../../api'; +import { LocalizeText, WiredFurniType } from '../../../../api'; import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -10,7 +10,7 @@ export const WiredActionSetFurniStateToView: FC<{}> = props => const [ stateFlag, setStateFlag ] = useState(0); const [ directionFlag, setDirectionFlag ] = useState(0); const [ positionFlag, setPositionFlag ] = useState(0); - const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const { trigger = null, setIntParams = null } = useWired(); const [ furniSource, setFurniSource ] = useState(() => { if(trigger?.intData?.length > 3) return trigger.intData[3]; @@ -29,23 +29,9 @@ export const WiredActionSetFurniStateToView: FC<{}> = props => else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); - const onChangeFurniSource = (next: number) => - { - if(furniIds.length && setFurniIds) - { - setFurniIds(prev => - { - if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); - return []; - }); - } + const onChangeFurniSource = (next: number) => setFurniSource(next); - setFurniSource(next); - }; - - const requiresFurni = (furniSource === 100) - ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID - : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID; return ( = props => { - const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const { trigger = null, setIntParams = null } = useWired(); const [ furniSource, setFurniSource ] = useState(() => { @@ -31,25 +31,11 @@ export const WiredActionTeleportView: FC<{}> = props => else setUserSource(0); }, [ trigger ]); - const onChangeFurniSource = (next: number) => - { - if(furniIds.length && setFurniIds) - { - setFurniIds(prev => - { - if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); - return []; - }); - } - - setFurniSource(next); - }; + const onChangeFurniSource = (next: number) => setFurniSource(next); const save = () => setIntParams([ furniSource, userSource ]); - const requiresFurni = (furniSource === 100) - ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT - : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT; return ( = props => { - const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const { trigger = null, setIntParams = null } = useWired(); const [ furniSource, setFurniSource ] = useState(() => { if(trigger?.intData?.length >= 1) return trigger.intData[0]; @@ -21,25 +21,11 @@ export const WiredActionToggleFurniStateView: FC<{}> = props => else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); - const onChangeFurniSource = (next: number) => - { - if(furniIds.length && setFurniIds) - { - setFurniIds(prev => - { - if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); - return []; - }); - } - - setFurniSource(next); - }; + const onChangeFurniSource = (next: number) => setFurniSource(next); const save = () => setIntParams([ furniSource ]); - const requiresFurni = (furniSource === 100) - ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT - : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT; return ( = props => { - const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const { trigger = null, setIntParams = null } = useWired(); const [ furniSource, setFurniSource ] = useState(() => { if(trigger?.intData?.length > 0) return trigger.intData[0]; @@ -29,25 +29,11 @@ export const WiredConditionActorIsOnFurniView: FC<{}> = props => else setUserSource(0); }, [ trigger ]); - const onChangeFurniSource = (next: number) => - { - if(furniIds.length && setFurniIds) - { - setFurniIds(prev => - { - if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); - return []; - }); - } - - setFurniSource(next); - }; + const onChangeFurniSource = (next: number) => setFurniSource(next); const save = () => setIntParams([ furniSource, userSource ]); - const requiresFurni = (furniSource === 100) - ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID - : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID; return ( = props => { - const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const { trigger = null, setIntParams = null } = useWired(); const [ furniSource, setFurniSource ] = useState(() => { if(trigger?.intData?.length >= 1) return trigger.intData[0]; @@ -20,25 +20,11 @@ export const WiredConditionFurniHasAvatarOnView: FC<{}> = props => else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); - const onChangeFurniSource = (next: number) => - { - if(furniIds.length && setFurniIds) - { - setFurniIds(prev => - { - if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); - return []; - }); - } - - setFurniSource(next); - }; + const onChangeFurniSource = (next: number) => setFurniSource(next); const save = () => setIntParams([ furniSource ]); - const requiresFurni = (furniSource === 100) - ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID - : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID; return ( = props => { const [ requireAll, setRequireAll ] = useState(-1); - const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const { trigger = null, setIntParams = null } = useWired(); const [ furniSource, setFurniSource ] = useState(() => { if(trigger?.intData?.length > 1) return trigger.intData[1]; @@ -24,23 +24,9 @@ export const WiredConditionFurniHasFurniOnView: FC<{}> = props => else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); - const onChangeFurniSource = (next: number) => - { - if(furniIds.length && setFurniIds) - { - setFurniIds(prev => - { - if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); - return []; - }); - } + const onChangeFurniSource = (next: number) => setFurniSource(next); - setFurniSource(next); - }; - - const requiresFurni = (furniSource === 100) - ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID - : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID; return ( = props => { const [ requireAll, setRequireAll ] = useState(-1); - const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const { trigger = null, setIntParams = null } = useWired(); const [ furniSource, setFurniSource ] = useState(() => { if(trigger?.intData?.length > 1) return trigger.intData[1]; @@ -24,23 +24,9 @@ export const WiredConditionFurniHasNotFurniOnView: FC<{}> = props => else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); - const onChangeFurniSource = (next: number) => - { - if(furniIds.length && setFurniIds) - { - setFurniIds(prev => - { - if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); - return []; - }); - } + const onChangeFurniSource = (next: number) => setFurniSource(next); - setFurniSource(next); - }; - - const requiresFurni = (furniSource === 100) - ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID - : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID; return ( = props => { - const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const { trigger = null, setIntParams = null } = useWired(); const [ furniSource, setFurniSource ] = useState(() => { if(trigger?.intData?.length >= 1) return trigger.intData[0]; @@ -20,25 +20,11 @@ export const WiredConditionFurniIsOfTypeView: FC<{}> = props => else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); - const onChangeFurniSource = (next: number) => - { - if(furniIds.length && setFurniIds) - { - setFurniIds(prev => - { - if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); - return []; - }); - } - - setFurniSource(next); - }; + const onChangeFurniSource = (next: number) => setFurniSource(next); const save = () => setIntParams([ furniSource ]); - const requiresFurni = (furniSource === 100) - ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_OR_BY_TYPE - : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_OR_BY_TYPE; return ( = props => const [ stateFlag, setStateFlag ] = useState(0); const [ directionFlag, setDirectionFlag ] = useState(0); const [ positionFlag, setPositionFlag ] = useState(0); - const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null } = useWired(); + const { trigger = null, setIntParams = null } = useWired(); const [ furniSource, setFurniSource ] = useState(() => { if(trigger?.intData?.length > 3) return trigger.intData[3]; @@ -28,23 +28,9 @@ export const WiredConditionFurniMatchesSnapshotView: FC<{}> = props => else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); - const onChangeFurniSource = (next: number) => - { - if(furniIds.length && setFurniIds) - { - setFurniIds(prev => - { - if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); - return []; - }); - } + const onChangeFurniSource = (next: number) => setFurniSource(next); - setFurniSource(next); - }; - - const requiresFurni = (furniSource === 100) - ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID - : WiredFurniType.STUFF_SELECTION_OPTION_NONE; + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID; return ( = () => { - const [ sourceType, setSourceType ] = useState(SOURCE_FURNI_PICKED); const [ matchState, setMatchState ] = useState(false); const [ filterExisting, setFilterExisting ] = useState(false); const [ invert, setInvert ] = useState(false); - const { trigger = null, furniIds = [], setIntParams, setSelectByType, setInvertSelection } = useWired(); + const { trigger = null, setIntParams, setSelectByType } = useWired(); useEffect(() => { if(!trigger) return; const p = trigger.intData; - if(p.length >= 1) setSourceType(p[0]); if(p.length >= 2) setMatchState(p[1] === 1); if(p.length >= 3) setFilterExisting(p[2] === 1); if(p.length >= 4) setInvert(p[3] === 1); @@ -37,38 +26,20 @@ export const WiredSelectorFurniByTypeView: FC<{}> = () => useEffect(() => { - setSelectByType(sourceType === SOURCE_FURNI_PICKED); - }, [ sourceType, setSelectByType ]); - - useEffect(() => - { - setInvertSelection(invert); - }, [ invert, setInvertSelection ]); + setSelectByType(true); + }, [ setSelectByType ]); const save = useCallback(() => { setIntParams([ - sourceType, + SOURCE_FURNI_PICKED, matchState ? 1 : 0, filterExisting ? 1 : 0, invert ? 1 : 0, ]); - }, [ sourceType, matchState, filterExisting, invert, setIntParams ]); + }, [ matchState, filterExisting, invert, setIntParams ]); - const sourceIndex = SOURCES.findIndex(s => s.value === sourceType); - - const prevSource = () => - setSourceType(SOURCES[(sourceIndex - 1 + SOURCES.length) % SOURCES.length].value); - - const nextSource = () => - setSourceType(SOURCES[(sourceIndex + 1) % SOURCES.length].value); - - const requiresFurni = sourceType === SOURCE_FURNI_PICKED - ? WiredFurniType.STUFF_SELECTION_OPTION_BY_ID - : WiredFurniType.STUFF_SELECTION_OPTION_NONE; - - const pickedCount = furniIds.length; - const pickedLimit = trigger?.maximumItemSelectionCount ?? 20; + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID; return ( @@ -104,22 +75,6 @@ export const WiredSelectorFurniByTypeView: FC<{}> = () => onChange={ e => setInvert(e.target.checked) } /> { LocalizeText('wiredfurni.params.selector_option.1') } - -
- - { LocalizeText('wiredfurni.params.sources.furni.title') } - -
- -
- { LocalizeText(SOURCES[sourceIndex >= 0 ? sourceIndex : 0].label) } -
- -
); diff --git a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx b/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx index 7b9a766..6cb4726 100644 --- a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { FriendlyTime, LocalizeText, WiredFurniType } from '../../../../api'; -import { Text } from '../../../../common'; +import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; diff --git a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx b/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx index 7c3056a..ebed0ee 100644 --- a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Text } from '../../../../common'; +import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; diff --git a/src/components/wired/views/triggers/WiredTriggerReceiveSignalView.tsx b/src/components/wired/views/triggers/WiredTriggerReceiveSignalView.tsx index 036f81d..30bc9a6 100644 --- a/src/components/wired/views/triggers/WiredTriggerReceiveSignalView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerReceiveSignalView.tsx @@ -4,12 +4,14 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; +const ANTENNA_INTERACTION_TYPES = [ 'antenna' ]; + export const WiredTriggerReceiveSignalView: FC<{}> = () => { const [ senderCount, setSenderCount ] = useState(0); const [ maxSenders, setMaxSenders ] = useState(5); - const { trigger = null } = useWired(); + const { trigger = null, setAllowedInteractionTypes } = useWired(); useEffect(() => { @@ -20,8 +22,15 @@ export const WiredTriggerReceiveSignalView: FC<{}> = () => if(p.length >= 3) setMaxSenders(p[2]); }, [ trigger ]); + useEffect(() => + { + setAllowedInteractionTypes(ANTENNA_INTERACTION_TYPES); + + return () => setAllowedInteractionTypes(null); + }, [ setAllowedInteractionTypes ]); + return ( - +
{ LocalizeText('wiredfurni.params.signal.senders_connected') } { senderCount }/{ maxSenders } diff --git a/src/hooks/wired/useWired.ts b/src/hooks/wired/useWired.ts index b455766..b0c3f32 100644 --- a/src/hooks/wired/useWired.ts +++ b/src/hooks/wired/useWired.ts @@ -14,9 +14,9 @@ const useWiredState = () => const [ actionDelay, setActionDelay ] = useState(0); const [ allowsFurni, setAllowsFurni ] = useState(WiredFurniType.STUFF_SELECTION_OPTION_NONE); const [ selectByType, setSelectByType ] = useState(false); - const [ invertSelection, setInvertSelection ] = useState(false); const [ neighborhoodTiles, setNeighborhoodTiles ] = useState<{ x: number; y: number }[] | null>(null); const [ neighborhoodInvert, setNeighborhoodInvert ] = useState(false); + const [ allowedInteractionTypes, setAllowedInteractionTypes ] = useState(null); const { showConfirm = null, simpleAlert = null } = useNotification(); const saveWired = () => @@ -60,6 +60,30 @@ const useWiredState = () => if(objectId <= 0) return; + const getInteractionTypeName = (furniData: any): string => + { + if(!furniData) return null; + + const rawValue = (furniData as any).interactionType + ?? (furniData as any).interactionTypeName + ?? (furniData as any).interactionTypeId; + + if(rawValue === undefined || rawValue === null) return null; + if(typeof rawValue !== 'string') return null; + + return rawValue.toLowerCase(); + }; + + const isAllowedInteraction = (furniData: any): boolean => + { + if(!allowedInteractionTypes || !allowedInteractionTypes.length) return true; + + const interactionType = getInteractionTypeName(furniData); + if(!interactionType) return true; + + return allowedInteractionTypes.some(type => (type && type.toLowerCase() === interactionType)); + }; + if(selectByType && category === RoomObjectCategory.FLOOR) { const roomId = GetRoomSession().roomId; @@ -71,6 +95,21 @@ const useWiredState = () => const sourceFurniData = GetSessionDataManager().getFloorItemData(typeId); if(!sourceFurniData) return; + if(!isAllowedInteraction(sourceFurniData)) + { + setFurniIds(prevValue => + { + if(!prevValue.includes(objectId)) return prevValue; + + const remaining = prevValue.filter(id => id !== objectId); + + WiredSelectionVisualizer.hide(objectId); + + return remaining; + }); + + return; + } const matchFurniLine = sourceFurniData.furniLine; const matchName = sourceFurniData.name; @@ -84,6 +123,8 @@ const useWiredState = () => const fd = GetSessionDataManager().getFloorItemData(tId); if(!fd) return false; + if(!isAllowedInteraction(fd)) return false; + const furniLineMatch = matchFurniLine && matchFurniLine.length > 0 && fd.furniLine === matchFurniLine; return furniLineMatch || fd.name === matchName; }; @@ -102,10 +143,8 @@ const useWiredState = () => } // ── Select a new group ────────────────────────────────────── - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - const allFloorObjects = GetRoomEngine().getRoomObjects(roomId, RoomObjectCategory.FLOOR); - const newIds: number[] = []; + const newIds = [ ...prevValue ]; const limit = trigger.maximumItemSelectionCount; for(const obj of allFloorObjects) @@ -116,14 +155,16 @@ const useWiredState = () => const tId = obj.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); const fd = GetSessionDataManager().getFloorItemData(tId); if(!fd) continue; + if(!isAllowedInteraction(fd)) continue; const furniLineMatch = matchFurniLine && matchFurniLine.length > 0 && fd.furniLine === matchFurniLine; const matches = furniLineMatch || fd.name === matchName; - if(invertSelection ? !matches : matches) newIds.push(obj.id); + if(matches && !newIds.includes(obj.id)) newIds.push(obj.id); } - WiredSelectionVisualizer.applySelectionShaderToFurni(newIds); + const addedIds = newIds.filter(id => !prevValue.includes(id)); + if(addedIds.length) WiredSelectionVisualizer.applySelectionShaderToFurni(addedIds); return newIds; }); @@ -131,6 +172,34 @@ const useWiredState = () => return; } + if(category === RoomObjectCategory.FLOOR && allowedInteractionTypes && allowedInteractionTypes.length) + { + const roomId = GetRoomSession().roomId; + const clickedObject = GetRoomEngine().getRoomObject(roomId, objectId, RoomObjectCategory.FLOOR); + + if(!clickedObject) return; + + const typeId = clickedObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); + const sourceFurniData = GetSessionDataManager().getFloorItemData(typeId); + + if(!sourceFurniData) return; + if(!isAllowedInteraction(sourceFurniData)) + { + setFurniIds(prevValue => + { + if(!prevValue.includes(objectId)) return prevValue; + + const remaining = prevValue.filter(id => id !== objectId); + + WiredSelectionVisualizer.hide(objectId); + + return remaining; + }); + + return; + } + } + setFurniIds(prevValue => { const newFurniIds = [ ...prevValue ]; @@ -217,13 +286,13 @@ const useWiredState = () => }); setAllowsFurni(WiredFurniType.STUFF_SELECTION_OPTION_NONE); setSelectByType(false); - setInvertSelection(false); setNeighborhoodTiles(null); setNeighborhoodInvert(false); + setAllowedInteractionTypes(null); }; }, [ trigger ]); - return { trigger, setTrigger, intParams, setIntParams, stringParam, setStringParam, furniIds, setFurniIds, actionDelay, setActionDelay, setAllowsFurni, saveWired, selectObjectForWired, setSelectByType, setInvertSelection, setNeighborhoodTiles, setNeighborhoodInvert }; + return { trigger, setTrigger, intParams, setIntParams, stringParam, setStringParam, furniIds, setFurniIds, actionDelay, setActionDelay, setAllowsFurni, saveWired, selectObjectForWired, setSelectByType, setNeighborhoodTiles, setNeighborhoodInvert, setAllowedInteractionTypes }; }; export const useWired = () => useBetween(useWiredState);