Start typing to search packages!
arclightinput
By @nontkph
Roblox
Mirrored from WallyThis version ships no README. Showing the README from v1.0.8, mirrored from wally.
ArcLight Input
A lightweight, priority-based input management system for Roblox
Features
- Priority System – Manage input conflicts with customizable priority levels
- Input Buffering – Capture inputs within configurable time windows
- Combo Detection – Detect sequences and combos with the built-in sequence system
- Multi-Device Support – Seamless support for keyboard, mouse, gamepad, and touch
- UI Integration – Built-in helpers for UI focus and modal states
- Type-Safe – Full Luau type definitions included
Installation
Via Wally (Recommended)
Add to your wally.toml:
[dependencies]
arclightinput = "nontkph/arclightinput@1"
Then run:
wally install
Manual Installation
- Download the latest release from Releases
- Place
Core/andinit.luauin your project - Require the module in your scripts
Quick Start
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Input = require(ReplicatedStorage.Packages.arclightinput)
-- Register an action with priority 10
local Attack = Input.Register("Attack", 10)
:Define(Enum.KeyCode.Q)
-- Listen for the input
Attack.OnBegan:Connect(function()
player:Attack()
end)
Attack.OnEnded:Connect(function()
player:StopAttack()
end)
That's it. Priority 10 blocks anything below it automatically.
Common Patterns
Enable Input Buffering
Queue inputs during animations:
Attack:EnableBuffer(0.3) -- 300ms window
Behavior:
- Press during a lock/animation → buffered.
- On key-up, the buffer auto re-fires once the action is unblocked/enabled (no extra calls).
- If you need manual control, call
Attack:ConsumeBuffer()/Attack:GetBufferedInput().
Real gameplay flow (auto replay):
local Attack = Input.Register("Attack", 10)
:Define(Enum.KeyCode.Q)
:EnableBuffer(0.35)
-- Enter an animation lock: disable to block immediate fire
Attack:Disable()
task.delay(0.2, function()
Attack:Enable() -- when the player releases Q, the buffered press re-fires automatically
end)
Attack.OnBegan:Connect(function()
player:Attack()
end)
Attack.OnEnded:Connect(function()
player:StopAttack()
end)
Manual control example (only replay when you decide):
if Attack:ConsumeBuffer() then
Attack.OnBegan:Fire() -- optional manual replay hook
end
Multiple Input Types
local Attack = Input.Register("Attack", 10)
:Define(Enum.KeyCode.Q)
:Define(Enum.UserInputType.Touch)
Keyboard and touch both trigger the same action.
Combo / Sequence Detection
local Ultimate = Input.Register("Ultimate", 9)
:DefineSequence({
Enum.KeyCode.Q,
Enum.KeyCode.W,
Enum.KeyCode.E
}, 1.0) -- 1 second window to complete sequence
Ultimate.OnBegan:Connect(function()
player:executeUltimate()
end)
Automatically detects the Q-W-E pattern within 1 second.
UI Button Binding
local Shop = Input.Register("Shop", 8)
:Define(Enum.KeyCode.B)
:DefineUI(script.Parent.ShopButton)
Shop.OnBegan:Connect(function()
toggleShop()
end)
One action handles both keyboard (B key) and the button. Same priority system applies.
Runtime Remapping
-- In a keybind menu
local reader = Input.ReadInput("BindAttack", 1, 5)
reader:Connect(function(input)
Attack:Remap(input.KeyCode)
print("Attack rebound to", input.KeyCode)
end)
Captures the next keypress and rebinds automatically.
Critical Priority (Always Works)
local Menu = Input.Register("Menu", Input.CRITICAL_PRIORITY)
:Define(Enum.KeyCode.Escape)
Menu.OnBegan:Connect(function()
openMenu()
end)
This action is never blocked, even when other inputs are disabled.
API Reference
Input (Main Module)
| Function | Description |
|---|---|
Input.Register(name, priority) | Register a new action, returns Action object |
Input.ReadInput(name, maxPresses, timeout) | Capture next N keypresses within timeout (returns Signal) |
Input.GetDevice() | Get current device type ("PC", "Mobile", "GamePad", "Console") |
Input.GetTelemetry() | Get stats: totalInputs, droppedInputs, activeActions |
Input.CRITICAL_PRIORITY | Constant for actions that cannot be blocked |
Action (returned from Input.Register)
| Method | Returns | Description |
|---|---|---|
:Define(input) | self | Add a keybind (Enum.KeyCode or Enum.UserInputType) |
:DefineSequence(inputs, window) | self | Set up combo/sequence detection with time window |
:DefineUI(guiObject) | self | Bind a UI button to this action |
:EnableBuffer(duration) | self | Queue inputs for X seconds during locks |
:Undefine(input) | self | Remove a keybind |
:UndefineUI() | self | Remove UI binding |
:Remap(input) | self | Change keybind at runtime |
:Enable() | self | Re-enable the action |
:Disable() | - | Disable the action temporarily |
:Destroy() | - | Cleanup and remove the action |
.OnBegan | Signal | Fires when input begins |
.OnEnded | Signal | Fires when input ends |
Project Structure
ArcLight-Input/
├── Core/
│ ├── ActionRegistry.luau # Action management
│ ├── BufferSystem.luau # Input buffering
│ ├── DeviceDetector.luau # Device detection
│ ├── InputProcessor.luau # Input normalization
│ ├── SequenceDetector.luau # Combo/sequence detection
│ ├── Types.luau # Type definitions
│ └── UIIntegration.luau # UI helpers
├── init.luau # Entry point
├── wally.toml # Package manifest
└── README.md
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Changelog
See CHANGELOG.md for version history.
Made with ❤️ for the Roblox community
Package Details
Install command (Click to copy)
Version
1.0.9
License
MIT
Safe for commercial use
The package archive does not include its license text; the license is declared in its manifest metadata.
Automated license review — not legal advice.
