diff --git a/package.json b/package.json index 707cbd5..f637509 100644 --- a/package.json +++ b/package.json @@ -38,11 +38,11 @@ "@rbxts/make": "^1.0.6", "@rbxts/matter": "^0.6.2-ts.6", "@rbxts/plasma": "^0.4.1-ts.1", - "@rbxts/pretty-roact-hooks": "^3.1.1", "@rbxts/reflex": "^4.2.0", "@rbxts/rewire": "^0.3.0", "@rbxts/roact": "^1.4.4-ts.0", "@rbxts/roact-hooked": "^2.6.0", + "@rbxts/roact-hooked-plus": "^1.8.1", "@rbxts/roact-reflex": "^2.1.0", "@rbxts/services": "^1.5.1", "@rbxts/testez": "^0.4.2-ts.0", diff --git a/readme.md b/readme.md index 28b9431..4bccada 100644 --- a/readme.md +++ b/readme.md @@ -16,8 +16,7 @@ I should put this in the game sometime, but the option to open the configuration * I decided to omit the "TS" folder from [`./default.project.json:40`](./default.project.json) due to the script override not working in Health.server.ts in StarterCharacterScripts. # Todo -* Investigate why our hotbar only loads _sometimes_ -* Maybe swap to our input system in the UI. +* Better null checking for the clientState.character (can cause errors atm) * Custom player list * Custom chat * Add guns diff --git a/src/ReplicatedStorage/ecs/state.ts b/src/ReplicatedStorage/ecs/state.ts index 40d8d22..f1a4d21 100644 --- a/src/ReplicatedStorage/ecs/state.ts +++ b/src/ReplicatedStorage/ecs/state.ts @@ -10,29 +10,29 @@ import { InputKind } from "ReplicatedStorage/inputKind" export class ClientState { constructor( player: Player, + character: CharacterRigR6, debugEnabled: boolean, isRunning: boolean, - backpack: Instance, - // character?: CharacterRigR6, - // lastProcessedCommand?: Inputkind, + backpack: Backpack, + // lastProcessedCommand: Inputkind, logger: Logger ) { + this.character = character this.player = player this.debugEnabled = debugEnabled this.isRunning = isRunning this.backpack = backpack - // this.character = character // this.lastProcessedCommand = lastProcessedCommand this.logger = logger } player: Player + character: CharacterRigR6 debugEnabled: boolean isRunning: boolean - backpack: Instance - character?: CharacterRigR6 + backpack: Backpack lastProcessedCommand?: InputKind logger: Logger diff --git a/src/ReplicatedStorage/ecs/systems/client/sprint.ts b/src/ReplicatedStorage/ecs/systems/client/sprint.ts index 8682028..8df1a1a 100644 --- a/src/ReplicatedStorage/ecs/systems/client/sprint.ts +++ b/src/ReplicatedStorage/ecs/systems/client/sprint.ts @@ -3,8 +3,6 @@ import { match } from "@rbxts/variant" import { ClientState } from "ReplicatedStorage/ecs/state" function sprint(_: World, client: ClientState): void { - if (client.character === undefined) return - if (client.lastProcessedCommand !== undefined) { match(client.lastProcessedCommand, { KeyDown: ({ key }) => { diff --git a/src/ReplicatedStorage/ui/components/canvas.tsx b/src/ReplicatedStorage/ui/components/canvas.tsx deleted file mode 100644 index 47f4151..0000000 --- a/src/ReplicatedStorage/ui/components/canvas.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import Roact from "@rbxts/roact" -import { BindingOrValue, mapBinding } from "ReplicatedStorage/utils/bindingUtil" - -interface canvasProps extends Roact.JsxInstanceProperties { - size?: BindingOrValue - position?: BindingOrValue - anchor?: Vector2 - padding?: { - top?: BindingOrValue - right?: BindingOrValue - bottom?: BindingOrValue - left?: BindingOrValue - } - clipsDescendants?: boolean - zIndex?: number - [Roact.Children]?: Roact.Children - - Event?: Roact.JsxInstanceEvents - Change?: Roact.JsxInstanceChangeEvents -} - -function canvas(props: canvasProps): Roact.Element { - const { size, position, anchor, padding, clipsDescendants, zIndex } = props - - const spreadableProps = { ...props } as Partial - delete spreadableProps.size - delete spreadableProps.position - delete spreadableProps.anchor - delete spreadableProps.padding - delete spreadableProps.clipsDescendants - delete spreadableProps.zIndex - delete spreadableProps[Roact.Children] - - return ( - - {padding !== undefined && ( - new UDim(0, px))} - PaddingRight={mapBinding(padding.right, (px) => new UDim(0, px))} - PaddingBottom={mapBinding(padding.bottom, (px) => new UDim(0, px))} - PaddingLeft={mapBinding(padding.left, (px) => new UDim(0, px))} - /> - )} - - {props[Roact.Children]} - - ) -} - -export default canvas \ No newline at end of file diff --git a/src/ReplicatedStorage/ui/components/fill.tsx b/src/ReplicatedStorage/ui/components/fill.tsx deleted file mode 100644 index 4e2e274..0000000 --- a/src/ReplicatedStorage/ui/components/fill.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import Roact from "@rbxts/roact" -import { BindingOrValue, mapBinding } from "ReplicatedStorage/utils/bindingUtil" - -interface fillProps extends Roact.JsxInstanceProperties { - color?: BindingOrValue - transparency?: BindingOrValue - radius?: BindingOrValue - [Roact.Children]?: Roact.Children - - Event?: Roact.JsxInstanceEvents - Change?: Roact.JsxInstanceChangeEvents -} - -function fill(props: fillProps): Roact.Element { - const { color, transparency, radius } = props - - const spreadableProps = { ...props } as Partial - delete spreadableProps.color - delete spreadableProps.transparency - delete spreadableProps.radius - delete spreadableProps[Roact.Children] - - return ( - - {radius !== undefined && ( - (r === "circular" ? new UDim(1, 0) : new UDim(0, r)))} - /> - )} - - {props[Roact.Children]} - - ) -} - -export default fill \ No newline at end of file diff --git a/src/ReplicatedStorage/ui/components/padding.tsx b/src/ReplicatedStorage/ui/components/padding.tsx new file mode 100644 index 0000000..402d2cf --- /dev/null +++ b/src/ReplicatedStorage/ui/components/padding.tsx @@ -0,0 +1,31 @@ +import Roact from "@rbxts/roact" + +interface paddingProps extends Roact.JsxInstanceProperties { + padding?: UDim | Roact.Binding + paddingX?: UDim | Roact.Binding + paddingY?: UDim | Roact.Binding + + Event?: Roact.JsxInstanceEvents + Change?: Roact.JsxInstanceChangeEvents +} + +function padding(props: paddingProps): Roact.Element { + const { padding, paddingX, paddingY } = props + + const spreadableProps = { ...props } as Partial + delete spreadableProps.padding + delete spreadableProps.paddingX + delete spreadableProps.paddingY + + return ( + + ) +} + +export default padding \ No newline at end of file diff --git a/src/ReplicatedStorage/ui/components/surface.tsx b/src/ReplicatedStorage/ui/components/surface.tsx deleted file mode 100644 index e5c2c33..0000000 --- a/src/ReplicatedStorage/ui/components/surface.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import Roact from "@rbxts/roact" -import Canvas from "./canvas" -import Acrylic from "./acrylic" -import Fill from "./fill" -import { BindingOrValue } from "ReplicatedStorage/utils/bindingUtil" - -interface surfaceProps extends Roact.JsxInstanceProperties { - size: BindingOrValue - position: BindingOrValue - ratio?: BindingOrValue - color?: BindingOrValue - anchor?: Vector2 - [Roact.Children]?: Roact.Children - - Event?: Roact.JsxInstanceEvents - Change?: Roact.JsxInstanceChangeEvents -} - -function surface(props: surfaceProps): Roact.Element { - const { size, position, ratio, color, anchor } = props - - const spreadableProps = { ...props } as Partial - delete spreadableProps.size - delete spreadableProps.position - delete spreadableProps.ratio - delete spreadableProps.color - delete spreadableProps.anchor - delete spreadableProps[Roact.Children] - - return ( - - <> - { - ratio !== undefined && - } - - - - - - - - {props[Roact.Children]} - - - ) -} - -export default surface \ No newline at end of file diff --git a/src/ReplicatedStorage/ui/components/text.tsx b/src/ReplicatedStorage/ui/components/text.tsx deleted file mode 100644 index 8403910..0000000 --- a/src/ReplicatedStorage/ui/components/text.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import Roact from "@rbxts/roact" - -interface textProps extends Roact.JsxInstanceProperties { - bold?: boolean - paddingX?: UDim - paddingY?: UDim - - Event?: Roact.JsxInstanceEvents - Change?: Roact.JsxInstanceChangeEvents -} - -function text(props: textProps): Roact.Element { - const { bold, paddingX, paddingY, Text, TextXAlignment } = props - - const spreadableProps = { ...props } as Partial - delete spreadableProps.bold - delete spreadableProps.paddingX - delete spreadableProps.paddingY - - return ( - - - - ) -} - -export default text \ No newline at end of file diff --git a/src/ReplicatedStorage/ui/store/producer/config.ts b/src/ReplicatedStorage/ui/store/producer/config.ts index d0f997f..de831aa 100644 --- a/src/ReplicatedStorage/ui/store/producer/config.ts +++ b/src/ReplicatedStorage/ui/store/producer/config.ts @@ -5,12 +5,12 @@ export interface ConfigState { } const initialState: ConfigState = { - acrylicBlur: true + acrylicBlur: false } export const configProducer = createProducer(initialState, { - toggleConfig: (state, action: keyof ConfigState) => ({ + toggleAcrylic: (state) => ({ ...state, - [action]: !state[action] + acrylicBlur: !state.acrylicBlur }) }) \ No newline at end of file diff --git a/src/ReplicatedStorage/utils/bindingUtil.ts b/src/ReplicatedStorage/utils/bindingUtil.ts deleted file mode 100644 index 36a479f..0000000 --- a/src/ReplicatedStorage/utils/bindingUtil.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Roact from "@rbxts/roact" - -export type BindingOrValue = T | Roact.Binding - -export function isBinding(binding: unknown): binding is Roact.Binding { - return typeIs(binding, "table") && "getValue" in binding -} - -export function mapBinding(value: BindingOrValue, transform: (value: T) => U): Roact.Binding { - return isBinding(value) ? value.map(transform) : Roact.createBinding(transform(value))[0] -} - -export function asBinding(value: BindingOrValue): Roact.Binding { - return isBinding(value) ? value : Roact.createBinding(value)[0] -} \ No newline at end of file diff --git a/src/StarterPlayer/StarterPlayerScripts/main.client.ts b/src/StarterPlayer/StarterPlayerScripts/main.client.ts index b0cd365..31125c1 100644 --- a/src/StarterPlayer/StarterPlayerScripts/main.client.ts +++ b/src/StarterPlayer/StarterPlayerScripts/main.client.ts @@ -15,16 +15,14 @@ const clientLogger = Logger.configure() const clientState = new ClientState( Players.LocalPlayer, + (Players.LocalPlayer.Character || Players.LocalPlayer.CharacterAdded.Wait()[0]) as CharacterRigR6, false, false, - Players.LocalPlayer.WaitForChild("Backpack"), + Players.LocalPlayer.WaitForChild("Backpack") as Backpack, clientLogger ) -clientState.character = (Players.LocalPlayer.Character || Players.LocalPlayer.CharacterAdded.Wait()[0]) as CharacterRigR6 -clientState.backpack = Players.LocalPlayer.WaitForChild("Backpack") - const worldAndClientState = start(HOST, clientState) showGUI(worldAndClientState[0], clientState) setEnvironment(HOST) \ No newline at end of file diff --git a/src/StarterPlayer/StarterPlayerScripts/ui/config/config.tsx b/src/StarterPlayer/StarterPlayerScripts/ui/config/config.tsx index c8f1776..92a05dc 100644 --- a/src/StarterPlayer/StarterPlayerScripts/ui/config/config.tsx +++ b/src/StarterPlayer/StarterPlayerScripts/ui/config/config.tsx @@ -1,10 +1,11 @@ import Roact from "@rbxts/roact" +import Padding from "ReplicatedStorage/ui/components/padding" +import Acrylic from "ReplicatedStorage/ui/components/acrylic" import { ContextActionService, HttpService } from "@rbxts/services" import { Spring } from "@rbxts/flipper" +import { useGroupMotor } from "@rbxts/roact-hooked-plus" import { useEffect } from "@rbxts/roact-hooked" -import Item from "./item" -import Surface from "ReplicatedStorage/ui/components/surface" -import { useMotor } from "@rbxts/pretty-roact-hooks" +import { useRootProducer } from "ReplicatedStorage/ui/store/hooks/useUiProducer" interface ConfigProps extends Roact.JsxInstanceProperties { shown: boolean @@ -13,18 +14,20 @@ interface ConfigProps extends Roact.JsxInstanceProperties { Change?: Roact.JsxInstanceChangeEvents } -const CONFIG_DEFAULT = new Spring(1.5, { frequency: 6 }) -const CONFIG_ACTIVE = new Spring(.5, { frequency: 6 }) +const CONFIG_DEFAULT = [new Spring(1.5, { frequency: 6 })] +const CONFIG_ACTIVE = [new Spring(.5, { frequency: 6 })] function config(props: ConfigProps): Roact.Element { + const { toggleAcrylic } = useRootProducer() + let { shown } = props const spreadableProps = { ...props } as Partial delete spreadableProps.shown - const [configPosY, setConfigGoal] = useMotor(1.5) + const [slotPosYMap, setPosYGoal] = useGroupMotor([1.5, 6]) + const slotPosY = slotPosYMap.map((t) => t[0]) - // TODO: maybe opt this into our system for inputs? useEffect(() => { const guid = HttpService.GenerateGUID(false) ContextActionService.BindAction( @@ -33,9 +36,9 @@ function config(props: ConfigProps): Roact.Element { if (Enum.UserInputState.Begin === userInputState) { shown = !shown if (shown) { - setConfigGoal(CONFIG_ACTIVE) + setPosYGoal(CONFIG_ACTIVE) } else { - setConfigGoal(CONFIG_DEFAULT) + setPosYGoal(CONFIG_DEFAULT) } } }, @@ -45,34 +48,65 @@ function config(props: ConfigProps): Roact.Element { }) return ( - { + AnchorPoint={new Vector2(.5, .5)} + Position={ + slotPosY.map((posY) => { return new UDim2(.5, 0, posY, 0) }) } - size={new UDim2(.4, 0, .7, 0)} - Key={"config"} + BackgroundTransparency={1} + Size={new UDim2(.4, 0, .7, 0)} + Key={"Config"} > - - - - + + + + + {toggleAcrylic()} + }} + > + + + + + ) } diff --git a/src/StarterPlayer/StarterPlayerScripts/ui/config/item.tsx b/src/StarterPlayer/StarterPlayerScripts/ui/config/item.tsx deleted file mode 100644 index 43a72fe..0000000 --- a/src/StarterPlayer/StarterPlayerScripts/ui/config/item.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import Roact from "@rbxts/roact" -import Fill from "ReplicatedStorage/ui/components/fill" -import Text from "ReplicatedStorage/ui/components/text" -import Canvas from "ReplicatedStorage/ui/components/canvas" -import { useRootProducer, useRootSelector } from "ReplicatedStorage/ui/store/hooks/useUiProducer" -import { ConfigState } from "ReplicatedStorage/ui/store/producer/config" - -interface itemProps extends Roact.JsxInstanceProperties { - size: UDim2 - position: UDim2 - text: string - action: keyof ConfigState - - Event?: Roact.JsxInstanceEvents - Change?: Roact.JsxInstanceChangeEvents -} - -function item(props: itemProps): Roact.Element { - const { size, position, text, action } = props - - const { toggleConfig } = useRootProducer() - - const active = useRootSelector((state) => state.configProducer[action]) - - const spreadableProps = { ...props } as Partial - delete spreadableProps.size - delete spreadableProps.position - delete spreadableProps.text - delete spreadableProps.action - - return ( - - - - - - toggleConfig(action) - }} - Size={new UDim2(1, 0, 1, 0)} - Transparency={1} - Text={""} - /> - - ) -} - -export default item \ No newline at end of file diff --git a/src/StarterPlayer/StarterPlayerScripts/ui/hotbar/hotbar.tsx b/src/StarterPlayer/StarterPlayerScripts/ui/hotbar/hotbar.tsx index 9b170d6..b196570 100644 --- a/src/StarterPlayer/StarterPlayerScripts/ui/hotbar/hotbar.tsx +++ b/src/StarterPlayer/StarterPlayerScripts/ui/hotbar/hotbar.tsx @@ -1,37 +1,14 @@ import Roact from "@rbxts/roact" import Slot from "./slot" import { useWorldContext } from "../contexts/worldContext" -import Canvas from "ReplicatedStorage/ui/components/canvas" +import Padding from "ReplicatedStorage/ui/components/padding" import { StarterGui } from "@rbxts/services" -import { useEffect, useMemo, useState } from "@rbxts/roact-hooked" -import { ClientState } from "ReplicatedStorage/ecs/state" interface HotbarProps extends Roact.JsxInstanceProperties { Event?: Roact.JsxInstanceEvents Change?: Roact.JsxInstanceChangeEvents } -function useBackpackContents(clientState: ClientState): Instance[] { - const [contents, setContents] = useState(clientState.backpack.GetChildren()) - - useEffect(() => { - const addedHandle = clientState.backpack.ChildAdded.Connect(() => { - setContents(clientState.backpack.GetChildren()) - }) - const removingHandle = clientState.backpack.ChildRemoved.Connect((removed) => { - // the tool is removed from the bp when equipped, can cause weird behavior - if (removed.Parent === clientState.character) { return } - setContents(clientState.backpack.GetChildren()) - }) - return () => { - addedHandle.Disconnect() - removingHandle.Disconnect() - } - }, []) - - return contents -} - StarterGui.SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, false) function hotbar(props: HotbarProps): Roact.Element { @@ -39,13 +16,6 @@ function hotbar(props: HotbarProps): Roact.Element { const { clientState } = useWorldContext() - const backpackContents = useBackpackContents(clientState) - - const sortedBackpackContents = useMemo(() => { - return backpackContents - .sort((a, b) => a.Name.lower() < b.Name.lower()) - }, [backpackContents]) - const keycodes: Enum.KeyCode[] = [ Enum.KeyCode.One, Enum.KeyCode.Two, @@ -58,27 +28,36 @@ function hotbar(props: HotbarProps): Roact.Element { Enum.KeyCode.Nine ] + const items: Roact.Element[] = [] + clientState.backpack.GetChildren().forEach((tool, i) => { + items.push( + + ) + }) + return ( - - { - sortedBackpackContents.map((tool, i) => ( - - )) - } - + + {...items} + ) } diff --git a/src/StarterPlayer/StarterPlayerScripts/ui/hotbar/slot.tsx b/src/StarterPlayer/StarterPlayerScripts/ui/hotbar/slot.tsx index 8f16c56..203d9c9 100644 --- a/src/StarterPlayer/StarterPlayerScripts/ui/hotbar/slot.tsx +++ b/src/StarterPlayer/StarterPlayerScripts/ui/hotbar/slot.tsx @@ -2,10 +2,10 @@ import Roact from "@rbxts/roact" import { useEffect } from "@rbxts/roact-hooked" import { useWorldContext } from "../contexts/worldContext" import { ContextActionService, HttpService } from "@rbxts/services" -import Text from "ReplicatedStorage/ui/components/text" -import Surface from "ReplicatedStorage/ui/components/surface" +import Padding from "ReplicatedStorage/ui/components/padding" +import Acrylic from "ReplicatedStorage/ui/components/acrylic" import { Spring } from "@rbxts/flipper" -import { useMotor } from "@rbxts/pretty-roact-hooks" +import { useGroupMotor } from "@rbxts/roact-hooked-plus" interface SlotProps extends Roact.JsxInstanceProperties { index: number @@ -16,8 +16,8 @@ interface SlotProps extends Roact.JsxInstanceProperties { Change?: Roact.JsxInstanceChangeEvents } -const SLOT_DEFAULT = new Spring(6, { frequency: 6 }) -const SLOT_ACTIVE = new Spring(5, { frequency: 6 }) +const SLOT_DEFAULT = [new Spring(.7, { frequency: 6 }), new Spring(6, { frequency: 6 })] +const SLOT_ACTIVE = [new Spring(.5, { frequency: 6 }), new Spring(5, { frequency: 6 })] function slot(props: SlotProps): Roact.Element { const { index, keycode, tool } = props @@ -27,12 +27,13 @@ function slot(props: SlotProps): Roact.Element { delete spreadableProps.keycode delete spreadableProps.tool - const [slotRatio, setSlotGoal] = useMotor(6) + const [slotBgTransparencyAndSlotRatio, setSlotGoal] = useGroupMotor([.7, 6]) + const slotBgTransparency = slotBgTransparencyAndSlotRatio.map((t) => t[0]) + const slotRatio = slotBgTransparencyAndSlotRatio.map((t) => t[1]) const { clientState } = useWorldContext() const handleActivated = (): void => { - if (clientState.character === undefined) return if (tool.Parent !== clientState.character) { clientState.character.Humanoid.EquipTool(tool) setSlotGoal(SLOT_ACTIVE) @@ -58,29 +59,47 @@ function slot(props: SlotProps): Roact.Element { setSlotGoal(SLOT_DEFAULT) }) }) - return ( - - - - + + + + + + + ) } diff --git a/src/StarterPlayer/StarterPlayerScripts/ui/main.tsx b/src/StarterPlayer/StarterPlayerScripts/ui/main.tsx index f508bb7..755ea44 100644 --- a/src/StarterPlayer/StarterPlayerScripts/ui/main.tsx +++ b/src/StarterPlayer/StarterPlayerScripts/ui/main.tsx @@ -1,8 +1,7 @@ import Roact from "@rbxts/roact" -import { withHookDetection } from "@rbxts/roact-hooked" import Hotbar from "./hotbar/hotbar" import Config from "./config/config" -import Canvas from "ReplicatedStorage/ui/components/canvas" +import { withHookDetection } from "@rbxts/roact-hooked" interface MainProps extends Roact.JsxInstanceEvents { Event?: Roact.JsxInstanceEvents @@ -15,22 +14,18 @@ export default function main(props: MainProps): Roact.Element { withHookDetection(Roact) return ( - - - - - + + + ) } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 5010b83..73f5dcd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -131,14 +131,6 @@ resolved "https://registry.yarnpkg.com/@rbxts/plasma/-/plasma-0.4.1-ts.1.tgz#3d8db367c3220e6b6953cdddbf8af9f087165392" integrity sha512-RhLkC3GQW0KeyqjFwvOUbHhsIJOHmXg+BhcKLp0IgUDVgC5GktShi3zmW6GQ319yod+RlUDG1XHjOnP3Omo4bA== -"@rbxts/pretty-roact-hooks@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@rbxts/pretty-roact-hooks/-/pretty-roact-hooks-3.1.1.tgz#b2729163bfd2c89e1efb91c544d7ddb798054fe0" - integrity sha512-eve1L7GWKZVo6ZLgcmk6c95SDvhTRIjWwR8notAz7g+CQ/jdtOoX+5fVHOQLMYE6HbQ79Bth+LO13WOM4T3WKg== - dependencies: - "@rbxts/services" "^1.5.1" - "@rbxts/set-timeout" "^1.1.2" - "@rbxts/reflex@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@rbxts/reflex/-/reflex-4.2.0.tgz#10d064de5e293f1aea429846d4d8739821cb575a" @@ -149,6 +141,14 @@ resolved "https://registry.yarnpkg.com/@rbxts/rewire/-/rewire-0.3.0.tgz#47f0cd651fe405cf418936799d2a4dac6b1bb7ce" integrity sha512-wChhGZ3kEkEsMK9ZuwKpwRsC7OGVZlvxrYMR3beFgCIPXE58JKLziBLkDACmd709XCCEmsMAqv9HMCMhSTD08Q== +"@rbxts/roact-hooked-plus@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@rbxts/roact-hooked-plus/-/roact-hooked-plus-1.8.1.tgz#e0fa32b74c0f958430ae62f249f1b5b52ce27f3b" + integrity sha512-ipJf6pZcQZlx/0hyisQz2eoRECg38knUgjkEvx2dvAHfs0+IDgera7mcwv6zTMACqalaXu00inc4E5dpOrs54A== + dependencies: + "@rbxts/flipper" "^2.0.1" + "@rbxts/services" "^1.2.0" + "@rbxts/roact-hooked@^2.6.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@rbxts/roact-hooked/-/roact-hooked-2.6.0.tgz#cbe3e244e1d52d879083c62b6662c4d082c6d30b" @@ -164,18 +164,11 @@ resolved "https://registry.yarnpkg.com/@rbxts/roact/-/roact-1.4.4-ts.0.tgz#7f297bec03dbea9473bd2d82b148d3ae6e4f6c00" integrity sha512-gn9mBoGG/Clzgv2kyOvLNVd9dh5t6z+jukC3ITv2HnfPqvf/sMbz/VMaBoiB7t5umuiIe0LjW0ctZrkrS+uTOA== -"@rbxts/services@^1.5.1": +"@rbxts/services@^1.2.0", "@rbxts/services@^1.5.1": version "1.5.1" resolved "https://registry.yarnpkg.com/@rbxts/services/-/services-1.5.1.tgz#4536a87932f28797507ed591f0061277c52ea77f" integrity sha512-SRtfIjga0K4YYSXRpK+eH3kcTq7ZXo9OHOt0jszaOOoEOIJloMGlyuRPqesPHyhveh2AMXAZr3TYbRMSD+u+kQ== -"@rbxts/set-timeout@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@rbxts/set-timeout/-/set-timeout-1.1.2.tgz#2adc9d4b5dcb54ca4332eb7ec8d19793932dbd40" - integrity sha512-P/A0IiH9wuZdSJYr4Us0MDFm61nvIFR0acfKFHLkcOsgvIgELC90Up9ugiSsaMEHRIcIcO5UjE39LuS3xTzQHw== - dependencies: - "@rbxts/services" "^1.5.1" - "@rbxts/testez@^0.4.2-ts.0": version "0.4.2-ts.0" resolved "https://registry.yarnpkg.com/@rbxts/testez/-/testez-0.4.2-ts.0.tgz#4475183d317182ac7099bffee6492ffcb7bcaf0b"