Designed to handle various types of user inputs across different devices such as Keyboard and Mouse (KBM), TouchScreen, and Controller.
Inputs.Binds = {
["PlaceBlock"] = { KBM = {"UserInputType", "MouseButton1"}, TouchScreen = {"UserInputType", "Touch"}, Controller = {"KeyCode", "ButtonR1"}},
["PrimaryAttack"] = { KBM = {"UserInputType", "MouseButton1"}, TouchScreen = {"UserInputType", "Touch"}, Controller = {"KeyCode", "ButtonR1"}},
["ToggleInventory"] = { KBM = {"KeyCode", "E"}, TouchScreen = {"UiButton", "ToggleInventoryButton"}, Controller = {"KeyCode", "ButtonX"}, AllDevices = {"UiButton", "ToggleInventoryButton" }},
["HotbarSlot1"] = { KBM = {"KeyCode", "One"}, TouchScreen = {"UiButton", "HotbarSlot1Button"}, Controller = {"UiButton", "HotbarSlot1Button"}, AllDevices = {"UiButton", "HotbarSlot1Button" } },
["HotbarSlot2"] = { KBM = {"KeyCode", "Two"}, TouchScreen = {"UiButton", "HotbarSlot2Button"}, Controller = {"UiButton", "HotbarSlot2Button"}, AllDevices = {"UiButton", "HotbarSlot2Button" }},
["HotbarSlot3"] = { KBM = {"KeyCode", "Three"}, TouchScreen = {"UiButton", "HotbarSlot3Button"}, Controller = {"UiButton", "HotbarSlot3Button"}, AllDevices = {"UiButton", "HotbarSlot3Button" } },
["HotbarSlot4"] = { KBM = {"KeyCode", "Four"}, TouchScreen = {"UiButton", "HotbarSlot4Button"}, Controller = {"UiButton", "HotbarSlot4Button"}, AllDevices = {"UiButton", "HotbarSlot4Button" } },
["HotbarSlot5"] = { KBM = {"KeyCode", "Five"}, TouchScreen = {"UiButton", "HotbarSlot5Button"}, Controller = {"UiButton", "HotbarSlot5Button"}, AllDevices = {"UiButton", "HotbarSlot5Button" } },
["NextHotbarSlot"] = { KBM = {"KeyCode", "Q"}, TouchScreen = {"UiButton", "NextHotbarSlotButton"}, Controller = {"KeyCode", "ButtonR2"}, AllDevices = {"UiButton", "NextHotbarSlotButton" } },
}
Here’s a high-level overview of its functionality:
-
Input Binds: The module defines a table
Inputs.Bindsthat maps various actions (like “PlaceBlock”, “PrimaryAttack”, etc.) to their corresponding inputs for each device type. - Device Switching: The module allows for device switching, with specific binds defined for switching between devices.
-
Device Types: The module defines a table
Devicesthat maps device types to their names. - Player Devices: The module keeps track of the current device for each player.
-
Event Connections: The module provides functions to connect to input began and input ended events (
RoInputs.Began,RoInputs.Ended). These functions handle the logic of checking if the input matches the binds for the current device and the action, and if so, they fire the corresponding event. -
ECS Systems: The module provides functions to handle inputs in an Entity Component System (ECS) style. It keeps a list of new inputs for each step, and provides functions to get these inputs (
RoInputs.onInputBegan,RoInputs.onInputEnded). It also provides a function to clear these lists for the next step (RoInputs.nextstep).
Download Script (Source): Roblox Lua Input/Device module. This script makes creating inputs for all devices easier and communicating them. (Works with ECS or Event Based/OOP) · GitHub
Example Usage
Event-Based Structure:
Client:
local RoInputs = require(game.ReplicatedStorage.RoInputs)
RoInputs.Began("PlaceBlock", function()
if not MouseLocation then return end
return true, MouseLocation --Send args to the server
end)
Server:
local RoInputs = require(game.ReplicatedStorage.RoInputs)
RoInputs.Began("PlaceBlock", function(player, MouseLocation)
if not MouseLocation then return end
print(player, MouseLocation)
--handle placing block here
end)
ECS-Based Structure (Matter):
Init System (Shared Server and Client):
local RoInputs = require(game.ReplicatedStorage.RoInputs)
local function Inputs()
RoInputs.nextstep()
end
return {
system = Inputs,
priority = math.huge
}
Client:
local RoInputs = require(game.ReplicatedStorage.RoInputs)
local function placeBlock(world)
for _, Input in next, RoInputs.onInputBegan("PlaceBlock") do
if not MouseLocation then continue end
Input.SendToServer(MouseLocation)
end
end
return placeBlock
Server:
local RoInputs = require(game.ReplicatedStorage.RoInputs)
local function placeBlock(world)
for _, Input in next, RoInputs.onInputBegan("PlaceBlock") do
local player, MouseLocation = unpack(Input.args)
if not MouseLocation then continue end
print(player, MouseLocation)
--handle placing block here
end
end
return placeBlock
Other useful methods:
Devices
Inputs.GetDevice(player: Player): string]
Inputs.GetAllDevices(): {[Player]: "device string"}
Custom send inputs to the server
Inputs.SendInputBegan(InputName, ...)
Inputs.SendInputEnded(InputName, ...)
Checking input states
Inputs.isHolding(InputName, player):boolean
Overview:
This module is very expandable/easy to understand and can be modified to your liking. I would love input or any suggestions/issues that need to be fixed.