Skip to content

Conversation

@unrooot
Copy link
Collaborator

@unrooot unrooot commented Jan 19, 2026

This pull request adds support for tracking and configuring "holdable" inputs in the input key mapping system. The main change is the introduction of a new HoldableInputModel class, which provides observable hold state and timing logic for inputs that require being held down. Additionally, the input key map list now supports options and methods for configuring and querying holdable behavior and maximum hold durations.

New model for holdable input logic:

  • Added the HoldableInputModel class in HoldableInputModel.lua, which tracks input hold state, manages hold timing, and exposes signals and observables for hold progress and release events.

Input key map list enhancements:

  • Updated the InputKeyMapListOptions type to include optional holdable and maxHoldDuration fields, allowing configuration of holdable inputs and their maximum hold durations.
  • Added methods to InputKeyMapList for querying and observing whether an input is holdable (IsHoldable, ObserveIsHoldable) and for getting/observing the maximum hold duration (GetMaxHoldDuration, ObserveMaxHoldDuration).
📦 Published PR as canary version: Canary Versions

✨ Test out this PR locally via:

npm install @quenty/actionmanager@13.27.2-canary.648.7c77d1f.0
npm install @quenty/adorneeboundingbox@8.30.3-canary.648.7c77d1f.0
npm install @quenty/adorneedata@7.28.2-canary.648.7c77d1f.0
npm install @quenty/adorneevalue@10.29.3-canary.648.7c77d1f.0
npm install @quenty/aggregator@1.10.2-canary.648.7c77d1f.0
npm install @quenty/animationprovider@11.29.3-canary.648.7c77d1f.0
npm install @quenty/animations@8.26.2-canary.648.7c77d1f.0
npm install @quenty/assetserviceutils@5.26.2-canary.648.7c77d1f.0
npm install @quenty/attributeutils@14.24.2-canary.648.7c77d1f.0
npm install @quenty/avatareditorutils@7.31.3-canary.648.7c77d1f.0
npm install @quenty/basicpane@13.25.2-canary.648.7c77d1f.0
npm install @quenty/binder@14.29.2-canary.648.7c77d1f.0
npm install @quenty/bindtocloseservice@8.25.2-canary.648.7c77d1f.0
npm install @quenty/blend@12.28.3-canary.648.7c77d1f.0
npm install @quenty/bodycolorsutils@7.28.3-canary.648.7c77d1f.0
npm install @quenty/boundlinkutils@14.30.2-canary.648.7c77d1f.0
npm install @quenty/brio@14.24.2-canary.648.7c77d1f.0
npm install @quenty/buttondragmodel@1.24.2-canary.648.7c77d1f.0
npm install @quenty/buttonhighlightmodel@14.28.3-canary.648.7c77d1f.0
npm install @quenty/camera@14.32.3-canary.648.7c77d1f.0
npm install @quenty/camerastoryutils@10.13.2-canary.648.7c77d1f.0
npm install @quenty/canceltoken@11.14.2-canary.648.7c77d1f.0
npm install @quenty/characterutils@12.26.2-canary.648.7c77d1f.0
npm install @quenty/chatproviderservice@9.41.3-canary.648.7c77d1f.0
npm install @quenty/clienttranslator@14.29.3-canary.648.7c77d1f.0
npm install @quenty/clipcharacters@12.32.2-canary.648.7c77d1f.0
npm install @quenty/cmdrservice@13.35.3-canary.648.7c77d1f.0
npm install @quenty/collectionserviceutils@8.25.2-canary.648.7c77d1f.0
npm install @quenty/color3utils@11.28.3-canary.648.7c77d1f.0
npm install @quenty/colorpalette@10.31.3-canary.648.7c77d1f.0
npm install @quenty/colorpicker@10.29.3-canary.648.7c77d1f.0
npm install @quenty/conditions@10.33.2-canary.648.7c77d1f.0
npm install @quenty/contentproviderutils@12.25.2-canary.648.7c77d1f.0
npm install @quenty/cooldown@11.31.2-canary.648.7c77d1f.0
npm install @quenty/coreguienabler@12.27.2-canary.648.7c77d1f.0
npm install @quenty/counter@7.25.2-canary.648.7c77d1f.0
npm install @quenty/datastore@13.31.2-canary.648.7c77d1f.0
npm install @quenty/deathreport@10.36.2-canary.648.7c77d1f.0
npm install @quenty/depthoffield@11.30.3-canary.648.7c77d1f.0
npm install @quenty/elo@7.29.3-canary.648.7c77d1f.0
npm install @quenty/enabledmixin@11.20.2-canary.648.7c77d1f.0
npm install @quenty/equippedtracker@13.27.2-canary.648.7c77d1f.0
npm install @quenty/firstpersoncharactertransparency@14.27.2-canary.648.7c77d1f.0
npm install @quenty/flipbook@9.25.3-canary.648.7c77d1f.0
npm install @quenty/friendutils@12.24.2-canary.648.7c77d1f.0
npm install @quenty/funnels@1.17.2-canary.648.7c77d1f.0
npm install @quenty/gameconfig@12.39.3-canary.648.7c77d1f.0
npm install @quenty/gameproductservice@14.41.3-canary.648.7c77d1f.0
npm install @quenty/gamescalingutils@13.28.3-canary.648.7c77d1f.0
npm install @quenty/genericscreenguiprovider@13.31.3-canary.648.7c77d1f.0
npm install @quenty/guivisiblemanager@12.17.2-canary.648.7c77d1f.0
npm install @quenty/hide@11.31.3-canary.648.7c77d1f.0
npm install @quenty/highlight@10.32.3-canary.648.7c77d1f.0
npm install @quenty/hintscoringutils@14.33.3-canary.648.7c77d1f.0
npm install @quenty/humanoidspeed@12.39.3-canary.648.7c77d1f.0
npm install @quenty/humanoidtracker@13.25.2-canary.648.7c77d1f.0
npm install @quenty/humanoidutils@2.7.2-canary.648.7c77d1f.0
npm install @quenty/idleservice@13.41.3-canary.648.7c77d1f.0
npm install @quenty/ik@15.42.3-canary.648.7c77d1f.0
npm install @quenty/influxdbclient@7.28.2-canary.648.7c77d1f.0
npm install @quenty/inputkeymaputils@14.34.3-canary.648.7c77d1f.0
npm install @quenty/inputmode@13.27.2-canary.648.7c77d1f.0
npm install @quenty/inputobjectutils@4.24.2-canary.648.7c77d1f.0
npm install @quenty/instanceutils@13.24.2-canary.648.7c77d1f.0
npm install @quenty/linkutils@13.24.2-canary.648.7c77d1f.0
npm install @quenty/lipsum@14.28.3-canary.648.7c77d1f.0
npm install @quenty/localizedtextutils@12.24.2-canary.648.7c77d1f.0
npm install @quenty/messagingserviceutils@7.15.2-canary.648.7c77d1f.0
npm install @quenty/motor6d@7.35.2-canary.648.7c77d1f.0
npm install @quenty/multipleclickutils@13.23.2-canary.648.7c77d1f.0
npm install @quenty/observablecollection@12.30.3-canary.648.7c77d1f.0
npm install @quenty/particleengine@13.26.2-canary.648.7c77d1f.0
npm install @quenty/parttouchingcalculator@14.33.2-canary.648.7c77d1f.0
npm install @quenty/permissionprovider@14.30.2-canary.648.7c77d1f.0
npm install @quenty/physicsutils@8.23.2-canary.648.7c77d1f.0
npm install @quenty/playerbinder@14.29.2-canary.648.7c77d1f.0
npm install @quenty/playerhumanoidbinder@14.30.2-canary.648.7c77d1f.0
npm install @quenty/playerinputmode@9.31.2-canary.648.7c77d1f.0
npm install @quenty/playerutils@8.26.2-canary.648.7c77d1f.0
npm install @quenty/promptqueue@1.29.3-canary.648.7c77d1f.0
npm install @quenty/propertyvalue@7.24.2-canary.648.7c77d1f.0
npm install @quenty/qframe@10.14.2-canary.648.7c77d1f.0
npm install @quenty/r15utils@13.25.2-canary.648.7c77d1f.0
npm install @quenty/racketingropeconstraint@12.35.2-canary.648.7c77d1f.0
npm install @quenty/radial-image@9.29.3-canary.648.7c77d1f.0
npm install @quenty/ragdoll@15.41.3-canary.648.7c77d1f.0
npm install @quenty/receiptprocessing@7.27.2-canary.648.7c77d1f.0
npm install @quenty/remoting@12.26.2-canary.648.7c77d1f.0
npm install @quenty/resetservice@11.30.2-canary.648.7c77d1f.0
npm install @quenty/rigbuilderutils@10.26.3-canary.648.7c77d1f.0
npm install @quenty/rogue-humanoid@10.39.3-canary.648.7c77d1f.0
npm install @quenty/rogue-properties@11.37.3-canary.648.7c77d1f.0
npm install @quenty/rx@13.23.2-canary.648.7c77d1f.0
npm install @quenty/rxbinderutils@14.29.2-canary.648.7c77d1f.0
npm install @quenty/rxsignal@7.23.2-canary.648.7c77d1f.0
npm install @quenty/scoredactionservice@16.35.3-canary.648.7c77d1f.0
npm install @quenty/screenshothudservice@7.27.2-canary.648.7c77d1f.0
npm install @quenty/seatutils@7.28.2-canary.648.7c77d1f.0
npm install @quenty/secrets@7.39.3-canary.648.7c77d1f.0
npm install @quenty/selectionutils@8.25.2-canary.648.7c77d1f.0
npm install @quenty/settings@11.42.3-canary.648.7c77d1f.0
npm install @quenty/settings-inputkeymap@10.44.3-canary.648.7c77d1f.0
npm install @quenty/snackbar@11.33.3-canary.648.7c77d1f.0
npm install @quenty/softshutdown@9.38.3-canary.648.7c77d1f.0
npm install @quenty/soundgroup@1.32.3-canary.648.7c77d1f.0
npm install @quenty/soundplayer@7.31.4-canary.648.7c77d1f.0
npm install @quenty/spawning@10.37.3-canary.648.7c77d1f.0
npm install @quenty/sprites@13.23.3-canary.648.7c77d1f.0
npm install @quenty/statestack@14.26.2-canary.648.7c77d1f.0
npm install @quenty/teamtracker@13.25.2-canary.648.7c77d1f.0
npm install @quenty/teamutils@10.25.2-canary.648.7c77d1f.0
npm install @quenty/teleportserviceutils@9.25.2-canary.648.7c77d1f.0
npm install @quenty/templateprovider@11.29.3-canary.648.7c77d1f.0
npm install @quenty/textboxutils@7.23.2-canary.648.7c77d1f.0
npm install @quenty/textfilterservice@13.26.2-canary.648.7c77d1f.0
npm install @quenty/textserviceutils@13.28.3-canary.648.7c77d1f.0
npm install @quenty/tie@10.33.2-canary.648.7c77d1f.0
npm install @quenty/timedtween@7.28.3-canary.648.7c77d1f.0
npm install @quenty/timesyncservice@13.27.2-canary.648.7c77d1f.0
npm install @quenty/toolutils@1.10.2-canary.648.7c77d1f.0
npm install @quenty/transitionmodel@7.30.3-canary.648.7c77d1f.0
npm install @quenty/ugcsanitize@1.11.2-canary.648.7c77d1f.0
npm install @quenty/uiobjectutils@6.23.3-canary.648.7c77d1f.0
npm install @quenty/undostack@7.25.2-canary.648.7c77d1f.0
npm install @quenty/userserviceutils@9.25.2-canary.648.7c77d1f.0
npm install @quenty/valuebaseutils@13.24.2-canary.648.7c77d1f.0
npm install @quenty/valueobject@13.25.2-canary.648.7c77d1f.0
npm install @quenty/viewport@11.33.3-canary.648.7c77d1f.0
npm install @quenty/nevermore-cli@4.15.3-canary.648.7c77d1f.0
npm install @quenty/nevermore-template-helpers@1.5.2-canary.648.7c77d1f.0
# or 
yarn add @quenty/actionmanager@13.27.2-canary.648.7c77d1f.0
yarn add @quenty/adorneeboundingbox@8.30.3-canary.648.7c77d1f.0
yarn add @quenty/adorneedata@7.28.2-canary.648.7c77d1f.0
yarn add @quenty/adorneevalue@10.29.3-canary.648.7c77d1f.0
yarn add @quenty/aggregator@1.10.2-canary.648.7c77d1f.0
yarn add @quenty/animationprovider@11.29.3-canary.648.7c77d1f.0
yarn add @quenty/animations@8.26.2-canary.648.7c77d1f.0
yarn add @quenty/assetserviceutils@5.26.2-canary.648.7c77d1f.0
yarn add @quenty/attributeutils@14.24.2-canary.648.7c77d1f.0
yarn add @quenty/avatareditorutils@7.31.3-canary.648.7c77d1f.0
yarn add @quenty/basicpane@13.25.2-canary.648.7c77d1f.0
yarn add @quenty/binder@14.29.2-canary.648.7c77d1f.0
yarn add @quenty/bindtocloseservice@8.25.2-canary.648.7c77d1f.0
yarn add @quenty/blend@12.28.3-canary.648.7c77d1f.0
yarn add @quenty/bodycolorsutils@7.28.3-canary.648.7c77d1f.0
yarn add @quenty/boundlinkutils@14.30.2-canary.648.7c77d1f.0
yarn add @quenty/brio@14.24.2-canary.648.7c77d1f.0
yarn add @quenty/buttondragmodel@1.24.2-canary.648.7c77d1f.0
yarn add @quenty/buttonhighlightmodel@14.28.3-canary.648.7c77d1f.0
yarn add @quenty/camera@14.32.3-canary.648.7c77d1f.0
yarn add @quenty/camerastoryutils@10.13.2-canary.648.7c77d1f.0
yarn add @quenty/canceltoken@11.14.2-canary.648.7c77d1f.0
yarn add @quenty/characterutils@12.26.2-canary.648.7c77d1f.0
yarn add @quenty/chatproviderservice@9.41.3-canary.648.7c77d1f.0
yarn add @quenty/clienttranslator@14.29.3-canary.648.7c77d1f.0
yarn add @quenty/clipcharacters@12.32.2-canary.648.7c77d1f.0
yarn add @quenty/cmdrservice@13.35.3-canary.648.7c77d1f.0
yarn add @quenty/collectionserviceutils@8.25.2-canary.648.7c77d1f.0
yarn add @quenty/color3utils@11.28.3-canary.648.7c77d1f.0
yarn add @quenty/colorpalette@10.31.3-canary.648.7c77d1f.0
yarn add @quenty/colorpicker@10.29.3-canary.648.7c77d1f.0
yarn add @quenty/conditions@10.33.2-canary.648.7c77d1f.0
yarn add @quenty/contentproviderutils@12.25.2-canary.648.7c77d1f.0
yarn add @quenty/cooldown@11.31.2-canary.648.7c77d1f.0
yarn add @quenty/coreguienabler@12.27.2-canary.648.7c77d1f.0
yarn add @quenty/counter@7.25.2-canary.648.7c77d1f.0
yarn add @quenty/datastore@13.31.2-canary.648.7c77d1f.0
yarn add @quenty/deathreport@10.36.2-canary.648.7c77d1f.0
yarn add @quenty/depthoffield@11.30.3-canary.648.7c77d1f.0
yarn add @quenty/elo@7.29.3-canary.648.7c77d1f.0
yarn add @quenty/enabledmixin@11.20.2-canary.648.7c77d1f.0
yarn add @quenty/equippedtracker@13.27.2-canary.648.7c77d1f.0
yarn add @quenty/firstpersoncharactertransparency@14.27.2-canary.648.7c77d1f.0
yarn add @quenty/flipbook@9.25.3-canary.648.7c77d1f.0
yarn add @quenty/friendutils@12.24.2-canary.648.7c77d1f.0
yarn add @quenty/funnels@1.17.2-canary.648.7c77d1f.0
yarn add @quenty/gameconfig@12.39.3-canary.648.7c77d1f.0
yarn add @quenty/gameproductservice@14.41.3-canary.648.7c77d1f.0
yarn add @quenty/gamescalingutils@13.28.3-canary.648.7c77d1f.0
yarn add @quenty/genericscreenguiprovider@13.31.3-canary.648.7c77d1f.0
yarn add @quenty/guivisiblemanager@12.17.2-canary.648.7c77d1f.0
yarn add @quenty/hide@11.31.3-canary.648.7c77d1f.0
yarn add @quenty/highlight@10.32.3-canary.648.7c77d1f.0
yarn add @quenty/hintscoringutils@14.33.3-canary.648.7c77d1f.0
yarn add @quenty/humanoidspeed@12.39.3-canary.648.7c77d1f.0
yarn add @quenty/humanoidtracker@13.25.2-canary.648.7c77d1f.0
yarn add @quenty/humanoidutils@2.7.2-canary.648.7c77d1f.0
yarn add @quenty/idleservice@13.41.3-canary.648.7c77d1f.0
yarn add @quenty/ik@15.42.3-canary.648.7c77d1f.0
yarn add @quenty/influxdbclient@7.28.2-canary.648.7c77d1f.0
yarn add @quenty/inputkeymaputils@14.34.3-canary.648.7c77d1f.0
yarn add @quenty/inputmode@13.27.2-canary.648.7c77d1f.0
yarn add @quenty/inputobjectutils@4.24.2-canary.648.7c77d1f.0
yarn add @quenty/instanceutils@13.24.2-canary.648.7c77d1f.0
yarn add @quenty/linkutils@13.24.2-canary.648.7c77d1f.0
yarn add @quenty/lipsum@14.28.3-canary.648.7c77d1f.0
yarn add @quenty/localizedtextutils@12.24.2-canary.648.7c77d1f.0
yarn add @quenty/messagingserviceutils@7.15.2-canary.648.7c77d1f.0
yarn add @quenty/motor6d@7.35.2-canary.648.7c77d1f.0
yarn add @quenty/multipleclickutils@13.23.2-canary.648.7c77d1f.0
yarn add @quenty/observablecollection@12.30.3-canary.648.7c77d1f.0
yarn add @quenty/particleengine@13.26.2-canary.648.7c77d1f.0
yarn add @quenty/parttouchingcalculator@14.33.2-canary.648.7c77d1f.0
yarn add @quenty/permissionprovider@14.30.2-canary.648.7c77d1f.0
yarn add @quenty/physicsutils@8.23.2-canary.648.7c77d1f.0
yarn add @quenty/playerbinder@14.29.2-canary.648.7c77d1f.0
yarn add @quenty/playerhumanoidbinder@14.30.2-canary.648.7c77d1f.0
yarn add @quenty/playerinputmode@9.31.2-canary.648.7c77d1f.0
yarn add @quenty/playerutils@8.26.2-canary.648.7c77d1f.0
yarn add @quenty/promptqueue@1.29.3-canary.648.7c77d1f.0
yarn add @quenty/propertyvalue@7.24.2-canary.648.7c77d1f.0
yarn add @quenty/qframe@10.14.2-canary.648.7c77d1f.0
yarn add @quenty/r15utils@13.25.2-canary.648.7c77d1f.0
yarn add @quenty/racketingropeconstraint@12.35.2-canary.648.7c77d1f.0
yarn add @quenty/radial-image@9.29.3-canary.648.7c77d1f.0
yarn add @quenty/ragdoll@15.41.3-canary.648.7c77d1f.0
yarn add @quenty/receiptprocessing@7.27.2-canary.648.7c77d1f.0
yarn add @quenty/remoting@12.26.2-canary.648.7c77d1f.0
yarn add @quenty/resetservice@11.30.2-canary.648.7c77d1f.0
yarn add @quenty/rigbuilderutils@10.26.3-canary.648.7c77d1f.0
yarn add @quenty/rogue-humanoid@10.39.3-canary.648.7c77d1f.0
yarn add @quenty/rogue-properties@11.37.3-canary.648.7c77d1f.0
yarn add @quenty/rx@13.23.2-canary.648.7c77d1f.0
yarn add @quenty/rxbinderutils@14.29.2-canary.648.7c77d1f.0
yarn add @quenty/rxsignal@7.23.2-canary.648.7c77d1f.0
yarn add @quenty/scoredactionservice@16.35.3-canary.648.7c77d1f.0
yarn add @quenty/screenshothudservice@7.27.2-canary.648.7c77d1f.0
yarn add @quenty/seatutils@7.28.2-canary.648.7c77d1f.0
yarn add @quenty/secrets@7.39.3-canary.648.7c77d1f.0
yarn add @quenty/selectionutils@8.25.2-canary.648.7c77d1f.0
yarn add @quenty/settings@11.42.3-canary.648.7c77d1f.0
yarn add @quenty/settings-inputkeymap@10.44.3-canary.648.7c77d1f.0
yarn add @quenty/snackbar@11.33.3-canary.648.7c77d1f.0
yarn add @quenty/softshutdown@9.38.3-canary.648.7c77d1f.0
yarn add @quenty/soundgroup@1.32.3-canary.648.7c77d1f.0
yarn add @quenty/soundplayer@7.31.4-canary.648.7c77d1f.0
yarn add @quenty/spawning@10.37.3-canary.648.7c77d1f.0
yarn add @quenty/sprites@13.23.3-canary.648.7c77d1f.0
yarn add @quenty/statestack@14.26.2-canary.648.7c77d1f.0
yarn add @quenty/teamtracker@13.25.2-canary.648.7c77d1f.0
yarn add @quenty/teamutils@10.25.2-canary.648.7c77d1f.0
yarn add @quenty/teleportserviceutils@9.25.2-canary.648.7c77d1f.0
yarn add @quenty/templateprovider@11.29.3-canary.648.7c77d1f.0
yarn add @quenty/textboxutils@7.23.2-canary.648.7c77d1f.0
yarn add @quenty/textfilterservice@13.26.2-canary.648.7c77d1f.0
yarn add @quenty/textserviceutils@13.28.3-canary.648.7c77d1f.0
yarn add @quenty/tie@10.33.2-canary.648.7c77d1f.0
yarn add @quenty/timedtween@7.28.3-canary.648.7c77d1f.0
yarn add @quenty/timesyncservice@13.27.2-canary.648.7c77d1f.0
yarn add @quenty/toolutils@1.10.2-canary.648.7c77d1f.0
yarn add @quenty/transitionmodel@7.30.3-canary.648.7c77d1f.0
yarn add @quenty/ugcsanitize@1.11.2-canary.648.7c77d1f.0
yarn add @quenty/uiobjectutils@6.23.3-canary.648.7c77d1f.0
yarn add @quenty/undostack@7.25.2-canary.648.7c77d1f.0
yarn add @quenty/userserviceutils@9.25.2-canary.648.7c77d1f.0
yarn add @quenty/valuebaseutils@13.24.2-canary.648.7c77d1f.0
yarn add @quenty/valueobject@13.25.2-canary.648.7c77d1f.0
yarn add @quenty/viewport@11.33.3-canary.648.7c77d1f.0
yarn add @quenty/nevermore-cli@4.15.3-canary.648.7c77d1f.0
yarn add @quenty/nevermore-template-helpers@1.5.2-canary.648.7c77d1f.0

@unrooot unrooot self-assigned this Jan 19, 2026
Copy link
Owner

@Quenty Quenty left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

approved, but added some suggestions

@unrooot unrooot merged commit f989eff into main Jan 26, 2026
10 checks passed
@Quenty
Copy link
Owner

Quenty commented Jan 26, 2026

@Quenty Quenty added the released This issue/pull request has been released. label Jan 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

released This issue/pull request has been released.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants