Requirements:
Signal: https://github.com/Sleitnick/RbxUtil/blob/main/modules/signal/init.lua
Module:
-->> Services
local UserInputService = game:GetService('UserInputService')
-->> Signal
local signal = require(script:WaitForChild('Signal', 1))
-->> Class
local Binder = {}
Binder.__index = Binder
--> Constructor
function Binder.new(Key: string, ignoreProcessed: boolean)
local self = {}
self.Key = Key
self.ignoreProcessed = ignoreProcessed
self.Ended = signal.new()
self.Began = signal.new()
self.Connections = {}
return setmetatable(self, Binder)
end
-->> Methods
function Binder:Enable()
if self.Connections['Began'] == nil then
self.Connections['Began'] = UserInputService.InputBegan:Connect(function(Key: InputObject, processed)
if self.ignoreProcessed == false and processed == true then return end
if Key.KeyCode.Name == self.Key then
self.Began:Fire()
end
end)
end
if self.Connections['Ended'] == nil then
self.Connections['Ended'] = UserInputService.InputEnded:Connect(function(Key: InputObject, processed)
if Key.KeyCode.Name == self.Key then
self.Ended:Fire()
end
end)
end
end
function Binder:Disable()
for Name, Conn in pairs(self.Connections) do
Conn:Disconnect()
end
end
function Binder:Destroy()
self.Ended:Destroy()
self.Began:Destroy()
for Name, Conn in pairs(self.Connections) do
Conn:Disconnect()
end
self = nil
end
-->> return Class
return Binder
Example Script:
-->> Services
local ReplicatedStorage = game:GetService('ReplicatedStorage')
local Players = game:GetService('Players')
-->> Player
local Player = Players.LocalPlayer
-->> Binder
local Binder = require(ReplicatedStorage:WaitForChild('Binder', 1))
-->> Bind Functions
local BindFunctions = {
['LeftShift'] = {
['Bind'] = nil,
['IgnoreProcess'] = true,
['Began'] = function()
local Character = Player.Character
if not Character then return end
local Humanoid: Humanoid = Character:FindFirstChild('Humanoid')
Humanoid.WalkSpeed = 42
end,
['Ended'] = function()
local Character = Player.Character
if not Character then return end
local Humanoid: Humanoid = Character:FindFirstChild('Humanoid')
Humanoid.WalkSpeed = 16
end,
},
}
-->> Setup Binds
for Name, Data in pairs(BindFunctions) do
local bind = Binder.new(Name, Data['IgnoreProcess'])
BindFunctions[Name]['Bind'] = bind
local Began = bind.Began
local Ended = bind.Ended
bind:Enable()
Began:Connect(Data['Began'])
Ended:Connect(Data['Ended'])
end