Skip to content

Instantly share code, notes, and snippets.

@SigmaThetaTech
Created May 17, 2024 20:48
Show Gist options
  • Save SigmaThetaTech/0a3f8da16d470190c22fc7d56790a6e7 to your computer and use it in GitHub Desktop.
Save SigmaThetaTech/0a3f8da16d470190c22fc7d56790a6e7 to your computer and use it in GitHub Desktop.
Sample code for a controller by SigmaTech
--!strict
-- Authors: ΣTΞCH (SigmaTech)
-- May 02, 2024
--[[
BasicMoveToolController.lua
(PURPOSE OF THIS FILE)
[API]
]]
--// Services //--
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ContextActionService = game:GetService("ContextActionService")
--// References //--
local Shared = ReplicatedStorage.Source.Shared
--// Requires //--
local Import = require(Shared.Core.Import)
local Knit = Import("Knit")
local Janitor = Import("Janitor") ---@module Janitor
--// Types //--
--// Constants //--
local DAMAGE = 5
local COOLDOWN = 3
local HITSCAN_DISTANCE = 10
local TOOL_TAG = "BasicMoveTool"
--// Volatiles //--
local isActive = false
local activationTimestamp = 0
--------------------------------------------------------------------------------
--// KNIT CONTROLLER DECLARATION //--
--------------------------------------------------------------------------------
local BasicMoveToolController = Knit.CreateController { Name = "BasicMoveToolController" }
--------------------------------------------------------------------------------
--// PRIVATE FUNCTIONS //--
--------------------------------------------------------------------------------
local function onActivated()
-- Cooldown
if isActive then return end
isActive = true
activationTimestamp = tick()
task.delay(COOLDOWN, function()
isActive = false
end)
local character = game.Players.LocalPlayer.Character
local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
local localUUID = character:GetAttribute("UUID")
-- Block cast
local overlapParams = OverlapParams.new()
overlapParams.FilterType = Enum.RaycastFilterType.Blacklist
overlapParams.FilterDescendantsInstances = character:GetDescendants()
local raycastResult = workspace:GetPartBoundsInBox(humanoidRootPart.CFrame + humanoidRootPart.CFrame.LookVector * (HITSCAN_DISTANCE/2 + 0.5), Vector3.new(5,5,HITSCAN_DISTANCE), overlapParams)
-- Determine hit UUID
local hitUUID = nil
if raycastResult then
for _, hitPart in raycastResult do
local UUID = hitPart.Parent:GetAttribute("UUID")
if UUID then
hitUUID = UUID
break
end
end
end
-- Ask CharacterStateController to change state on both local and server
local CharacterStateController = Knit.GetController("CharacterStateController")
CharacterStateController:BasicMove(localUUID, hitUUID, DAMAGE)
end
local function onDeactivated()
--print("Deactivated")
end
local function equipped(tool: Tool, janitor: Janitor)
print("Equipped")
end
local function unequipped(tool: Tool)
if isActive then
local CharacterStateController = Knit.GetController("CharacterStateController")
CharacterStateController:CancelAllAnimations()
end
end
--------------------------------------------------------------------------------
--// METHODS //--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--// KNIT CORE //--
--------------------------------------------------------------------------------
function BasicMoveToolController:KnitStart()
local equippedJanitor: Janitor = Janitor.new()
ContextActionService.LocalToolEquipped:Connect(function(tool)
if tool:HasTag(TOOL_TAG) then
equipped(tool, equippedJanitor)
equippedJanitor:Add(tool.Activated:Connect(onActivated), "Disconnect", "Activated")
equippedJanitor:Add(tool.Deactivated:Connect(onDeactivated), "Disconnect", "Deactivated")
end
end)
ContextActionService.LocalToolUnequipped:Connect(function(tool)
if tool:HasTag(TOOL_TAG) then
unequipped(tool)
equippedJanitor:Cleanup()
end
end)
end
function BasicMoveToolController:KnitInit()
end
return BasicMoveToolController
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment