Simple Key Bind Module

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
2 Likes