-- Compiled with roblox-ts v3.0.0 local TS = _G[script] local Signal = TS.import(script, TS.getModule(script, "@rbxts", "lemon-signal").src).default local BaseAction = TS.import(script, script.Parent, "base-action").BaseAction local getInputEnum = TS.import(script, script.Parent, "common").getInputEnum local BaseStandardAction do local super = BaseAction BaseStandardAction = setmetatable({}, { __tostring = function() return "BaseStandardAction" end, __index = super, }) BaseStandardAction.__index = BaseStandardAction function BaseStandardAction:constructor(...) super.constructor(self, ...) self.activated = self.janitor:Add(Signal.new(), "Destroy") self.deactivated = self.janitor:Add(Signal.new(), "Destroy") self.isActive = false end function BaseStandardAction:activate() self.isActive = true self.activated:Fire() end function BaseStandardAction:deactivate() self.isActive = false self.deactivated:Fire() end end local StandardAction do local super = BaseStandardAction StandardAction = setmetatable({}, { __tostring = function() return "StandardAction" end, __index = super, }) StandardAction.__index = StandardAction function StandardAction:constructor(...) local rawInputs = { ... } super.constructor(self) self.inputQueueing = false self.cooldown = 0 self.lastPress = 0 self.lastRelease = 0 self.queuedPresses = 0 self.queuedReleases = 0 self.rawInputs = rawInputs end function StandardAction:handleInput(input, processed, isPress) if isPress == nil then isPress = input.UserInputState == Enum.UserInputState.Begin end if self.processed ~= processed then return nil end if not self:supportsInput(input) then return nil end local coolingDown = self.cooldown > 0 and os.clock() - self[if isPress then "lastPress" else "lastRelease"] < self.cooldown if coolingDown then if self.inputQueueing then local _exp = self.cooldown local _index = if isPress then "queuedPresses" else "queuedReleases" self[_index] += 1 local delay = _exp * self[_index] task.delay(delay, function() self:handleInput(input, processed, isPress) self[if isPress then "queuedPresses" else "queuedReleases"] -= 1 end) end return nil end if isPress then self.lastRelease = 0 end self[if isPress then "lastPress" else "lastRelease"] = os.clock() if isPress then self:activate() else self:deactivate() end end function StandardAction:supportsInput(input) local _exp = self.rawInputs -- ▼ ReadonlyArray.some ▼ local _result = false local _callback = function(rawInput) return self:rawInputMatches(rawInput, input) end for _k, _v in _exp do if _callback(_v, _k - 1, _exp) then _result = true break end end -- ▲ ReadonlyArray.some ▲ return _result end function StandardAction:rawInputMatches(rawInput, input) local inputEnum = getInputEnum(rawInput) return input.KeyCode == inputEnum or input.UserInputType == inputEnum end end local StandardActionBuilder do local super = StandardAction StandardActionBuilder = setmetatable({}, { __tostring = function() return "StandardActionBuilder" end, __index = super, }) StandardActionBuilder.__index = StandardActionBuilder function StandardActionBuilder.new(...) local self = setmetatable({}, StandardActionBuilder) return self:constructor(...) or self end function StandardActionBuilder:constructor(...) super.constructor(self, ...) end function StandardActionBuilder:setID(id) self.id = id return self end function StandardActionBuilder:setProcessed(processed) self.processed = processed return self end function StandardActionBuilder:setInputQueueing(inputQueueing) self.inputQueueing = inputQueueing return self end function StandardActionBuilder:setCooldown(cooldown) self.cooldown = cooldown return self end end return { BaseStandardAction = BaseStandardAction, StandardAction = StandardAction, StandardActionBuilder = StandardActionBuilder, }