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 { Spring } from "@rbxts/flipper" import { useMotor } from "@rbxts/pretty-roact-hooks" interface SlotProps extends Roact.JsxInstanceProperties { index: number keycode: Enum.KeyCode tool: Tool Event?: Roact.JsxInstanceEvents Change?: Roact.JsxInstanceChangeEvents } const SLOT_DEFAULT = new Spring(6, { frequency: 6 }) const SLOT_ACTIVE = new Spring(5, { frequency: 6 }) function slot(props: SlotProps): Roact.Element { const { index, keycode, tool } = props const spreadableProps = { ...props } as Partial delete spreadableProps.index delete spreadableProps.keycode delete spreadableProps.tool const [slotRatio, setSlotGoal] = useMotor(0) const { clientState } = useWorldContext() const handleActivated = (): void => { if (tool.Parent !== clientState.character) { clientState.character.Humanoid.EquipTool(tool) setSlotGoal(SLOT_ACTIVE) } else { clientState.character.Humanoid.UnequipTools() setSlotGoal(SLOT_DEFAULT) } } // TODO: maybe opt this into our system for inputs? useEffect(() => { const guid = HttpService.GenerateGUID(false) ContextActionService.BindAction( guid, (_, userInputState) => { if (Enum.UserInputState.Begin === userInputState) handleActivated() }, false, keycode ) tool.Unequipped.Connect(() => { setSlotGoal(SLOT_DEFAULT) }) }) return ( ) } export default slot