diff --git a/src/api/wired/WiredActionLayoutCode.ts b/src/api/wired/WiredActionLayoutCode.ts index 1aa75e2..3240a00 100644 --- a/src/api/wired/WiredActionLayoutCode.ts +++ b/src/api/wired/WiredActionLayoutCode.ts @@ -31,4 +31,5 @@ export class WiredActionLayoutCode public static FURNI_BYTYPE_SELECTOR: number = 30; public static USERS_AREA_SELECTOR: number = 31; public static USERS_NEIGHBORHOOD_SELECTOR: number = 32; + public static SEND_SIGNAL: number = 33; } diff --git a/src/api/wired/WiredTriggerLayoutCode.ts b/src/api/wired/WiredTriggerLayoutCode.ts index fd758df..683ff04 100644 --- a/src/api/wired/WiredTriggerLayoutCode.ts +++ b/src/api/wired/WiredTriggerLayoutCode.ts @@ -14,4 +14,5 @@ export class WiredTriggerLayout public static EXECUTE_PERIODICALLY_LONG: number = 12; public static BOT_REACHED_STUFF: number = 13; public static BOT_REACHED_AVATAR: number = 14; + public static RECEIVE_SIGNAL: number = 15; } diff --git a/src/components/wired/views/actions/WiredActionBaseView.tsx b/src/components/wired/views/actions/WiredActionBaseView.tsx index 4962caf..4fea3f4 100644 --- a/src/components/wired/views/actions/WiredActionBaseView.tsx +++ b/src/components/wired/views/actions/WiredActionBaseView.tsx @@ -10,13 +10,14 @@ export interface WiredActionBaseViewProps hasSpecialInput: boolean; requiresFurni: number; save: () => void; + validate?: () => boolean; cardStyle?: CSSProperties; hideDelay?: boolean; } export const WiredActionBaseView: FC> = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = 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 } = props; const { trigger = null, actionDelay = 0, setActionDelay = null } = useWired(); useEffect(() => @@ -25,7 +26,7 @@ export const WiredActionBaseView: FC }, [ trigger, setActionDelay ]); return ( - + { children } { !hideDelay && !!children &&
} { !hideDelay &&
diff --git a/src/components/wired/views/actions/WiredActionLayoutView.tsx b/src/components/wired/views/actions/WiredActionLayoutView.tsx index 44c2632..23c16d1 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 { WiredActionSendSignalView } from './WiredActionSendSignalView'; import { WiredActionFurniAreaView } from '../selectors/WiredActionFurniAreaView'; import { WiredSelectorFurniNeighborhoodView } from '../selectors/WiredSelectorFurniNeighborhoodView'; import { WiredSelectorFurniByTypeView } from '../selectors/WiredSelectorFurniByTypeView'; @@ -94,6 +95,8 @@ export const WiredActionLayoutView = (code: number) => return ; case WiredActionLayoutCode.USERS_NEIGHBORHOOD_SELECTOR: return ; + case WiredActionLayoutCode.SEND_SIGNAL: + return ; } return null; diff --git a/src/components/wired/views/actions/WiredActionSendSignalView.tsx b/src/components/wired/views/actions/WiredActionSendSignalView.tsx new file mode 100644 index 0000000..ef22fd9 --- /dev/null +++ b/src/components/wired/views/actions/WiredActionSendSignalView.tsx @@ -0,0 +1,186 @@ +import { FC, useCallback, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; +import { WiredActionBaseView } from './WiredActionBaseView'; + +const ANTENNA_PICKED = 0; +const ANTENNA_TRIGGER = 1; + +const FORWARD_NONE = 0; +const FORWARD_TRIGGER = 1; +const FORWARD_SELECTOR = 200; +const FORWARD_SIGNAL = 201; + +const FURNI_FORWARD_OPTIONS = [ + { value: FORWARD_TRIGGER, label: 'wiredfurni.params.sources.furni.0' }, + { value: FORWARD_SELECTOR, label: 'wiredfurni.params.sources.furni.200' }, + { value: FORWARD_SIGNAL, label: 'wiredfurni.params.sources.furni.201' }, +]; + +const USER_FORWARD_OPTIONS = [ + { value: FORWARD_TRIGGER, label: 'wiredfurni.params.sources.users.0' }, + { value: FORWARD_SELECTOR, label: 'wiredfurni.params.sources.users.200' }, + { value: FORWARD_SIGNAL, label: 'wiredfurni.params.sources.users.201' }, +]; + +export const WiredActionSendSignalView: FC<{}> = () => +{ + const [ antennaSource, setAntennaSource ] = useState(ANTENNA_PICKED); + const [ furniForward, setFurniForward ] = useState(FORWARD_NONE); + const [ userForward, setUserForward ] = useState(FORWARD_NONE); + const [ signalPerFurni, setSignalPerFurni ] = useState(false); + const [ signalPerUser, setSignalPerUser ] = useState(false); + const [ showAdvanced, setShowAdvanced ] = useState(false); + + const { trigger = null, setIntParams } = useWired(); + + useEffect(() => + { + if(!trigger) return; + + const p = trigger.intData; + if(p.length >= 1) setAntennaSource(p[0]); + if(p.length >= 2) setFurniForward(p[1]); + if(p.length >= 3) setUserForward(p[2]); + if(p.length >= 4) setSignalPerFurni(p[3] === 1); + if(p.length >= 5) setSignalPerUser(p[4] === 1); + + if(p.length >= 1 && (p[0] !== ANTENNA_PICKED || p[1] !== FORWARD_NONE || + p[2] !== FORWARD_NONE || (p.length >= 4 && p[3] === 1) || (p.length >= 5 && p[4] === 1))) + { + setShowAdvanced(true); + } + }, [ trigger ]); + + const save = useCallback(() => + { + setIntParams([ + antennaSource, + furniForward, + userForward, + signalPerFurni ? 1 : 0, + signalPerUser ? 1 : 0, + ]); + }, [ antennaSource, furniForward, userForward, signalPerFurni, signalPerUser, setIntParams ]); + + return ( + +
+ +
setShowAdvanced(!showAdvanced) }> + + { showAdvanced + ? LocalizeText('wiredfurni.params.hide_advanced') + : LocalizeText('wiredfurni.params.show_advanced') } + +
+ + { showAdvanced && <> + + { /* --- Antennas --- */ } + { LocalizeText('wiredfurni.params.sources.furni.title.signal_antenna') } +
+ 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) } /> + +
+ } + +
+
+ ); +}; diff --git a/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx b/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx index 0b01922..229464f 100644 --- a/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx @@ -12,6 +12,7 @@ import { WiredTriggeExecutePeriodicallyView } from './WiredTriggerExecutePeriodi import { WiredTriggerGameEndsView } from './WiredTriggerGameEndsView'; import { WiredTriggerGameStartsView } from './WiredTriggerGameStartsView'; import { WiredTriggeScoreAchievedView } from './WiredTriggerScoreAchievedView'; +import { WiredTriggerReceiveSignalView } from './WiredTriggerReceiveSignalView'; import { WiredTriggerToggleFurniView } from './WiredTriggerToggleFurniView'; export const WiredTriggerLayoutView = (code: number) => @@ -46,6 +47,8 @@ export const WiredTriggerLayoutView = (code: number) => return ; case WiredTriggerLayout.TOGGLE_FURNI: return ; + case WiredTriggerLayout.RECEIVE_SIGNAL: + return ; } return null; diff --git a/src/components/wired/views/triggers/WiredTriggerReceiveSignalView.tsx b/src/components/wired/views/triggers/WiredTriggerReceiveSignalView.tsx new file mode 100644 index 0000000..036f81d --- /dev/null +++ b/src/components/wired/views/triggers/WiredTriggerReceiveSignalView.tsx @@ -0,0 +1,31 @@ +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; +import { WiredTriggerBaseView } from './WiredTriggerBaseView'; + +export const WiredTriggerReceiveSignalView: FC<{}> = () => +{ + const [ senderCount, setSenderCount ] = useState(0); + const [ maxSenders, setMaxSenders ] = useState(5); + + const { trigger = null } = useWired(); + + useEffect(() => + { + if(!trigger) return; + + const p = trigger.intData; + if(p.length >= 2) setSenderCount(p[1]); + if(p.length >= 3) setMaxSenders(p[2]); + }, [ trigger ]); + + return ( + +
+ { LocalizeText('wiredfurni.params.signal.senders_connected') } + { senderCount }/{ maxSenders } +
+
+ ); +}; diff --git a/src/hooks/wired/useWired.ts b/src/hooks/wired/useWired.ts index df746b5..b455766 100644 --- a/src/hooks/wired/useWired.ts +++ b/src/hooks/wired/useWired.ts @@ -1,4 +1,4 @@ -import { ConditionDefinition, GetRoomEngine, GetSessionDataManager, OpenMessageComposer, RoomObjectCategory, RoomObjectVariable, Triggerable, TriggerDefinition, UpdateActionMessageComposer, UpdateConditionMessageComposer, UpdateTriggerMessageComposer, WiredActionDefinition, WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredOpenEvent, WiredSaveSuccessEvent } from '@nitrots/nitro-renderer'; +import { ConditionDefinition, GetRoomEngine, GetSessionDataManager, OpenMessageComposer, RoomObjectCategory, RoomObjectVariable, Triggerable, TriggerDefinition, UpdateActionMessageComposer, UpdateConditionMessageComposer, UpdateTriggerMessageComposer, WiredActionDefinition, WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredOpenEvent, WiredSaveSuccessEvent, WiredValidationErrorEvent } from '@nitrots/nitro-renderer'; import { useEffect, useState } from 'react'; import { useBetween } from 'use-between'; import { GetRoomSession, IsOwnerOfFloorFurniture, LocalizeText, SendMessageComposer, WiredFurniType, WiredSelectionVisualizer } from '../../api'; @@ -17,7 +17,7 @@ const useWiredState = () => const [ invertSelection, setInvertSelection ] = useState(false); const [ neighborhoodTiles, setNeighborhoodTiles ] = useState<{ x: number; y: number }[] | null>(null); const [ neighborhoodInvert, setNeighborhoodInvert ] = useState(false); - const { showConfirm = null } = useNotification(); + const { showConfirm = null, simpleAlert = null } = useNotification(); const saveWired = () => { @@ -169,6 +169,16 @@ const useWiredState = () => setTrigger(null); }); + useMessageEvent(WiredValidationErrorEvent, event => + { + const parser = event.getParser(); + + if(parser.info && parser.info.length) + { + simpleAlert(parser.info, null, null, null, LocalizeText('wiredfurni.title')); + } + }); + useMessageEvent(WiredFurniActionEvent, event => { const parser = event.getParser();