Combat system v3 by lazar

Hello i make my combat system v3 but i need your opinion in my script

--[[
How to use ?

CLIENT----
if not game:IsLoaded() then game.Loaded:Wait() end

local UserInputService = game:GetService("UserInputService")
local ReplicatedStrorage = game:GetService("ReplicatedStorage")

local combatModule = require(ReplicatedStrorage.CombatModule)

local function onInputService(input: InputObject)
	if input.UserInputType == Enum.UserInputType.MouseButton1 then
		combatModule.onAttack(1)
	end
end

UserInputService.InputBegan:Connect(onInputService)

Server-----
local ReplicatedStrorage = game:GetService("ReplicatedStorage")

local combatModule = require(ReplicatedStrorage.CombatModule)

combatModule.onDamage()
]]

local RunService = game:GetService("RunService")

local template = script.Template
local takeDamageEvent = template.TakeDamageEvent

local index = 0
local cooldown = false
local connect, touchHit

type combatInfo = {animdId: string, part: string}

local combatInfo = {
	{animdId = "rbxassetid://17265480831", part = "Right Arm"},
	{animdId = "rbxassetid://17265488397", part = "Left Arm"},
	{animdId = "rbxassetid://17265491575", part = "Right Leg"}
}

local function getIndexCombatInfo()
	index = index%#combatInfo + 1
	
	return combatInfo[index]
end

local function onTouched(hit: BasePart, humanoidRootPart: BasePart)
	if hit.Name ~= "HumanoidRootPart" and hit ~= humanoidRootPart then return end
	if hit.CanTouch then hit.CanTouch = false end
	
	touchHit = hit
	
	takeDamageEvent:FireServer(hit.Parent.Humanoid)
end

local function onStoppedAnimation(animTrack: AnimationTrack)
	animTrack.Stopped:Wait()

	if touchHit then touchHit.CanTouch = true end

	connect:Disconnect()
	cooldown = false
end

local function onPlayAnimation(t: combatInfo, speed: number, character: Model)
	local animation = Instance.new("Animation")
	local touchingPart = character:FindFirstChild(t.part):: BasePart
	local humanoid = character.Humanoid
	
	local animTrack
	
	animation.AnimationId = t.animdId
	
	animTrack = humanoid:LoadAnimation(animation)
	
	animTrack:Play(nil, nil, speed)
	
	connect = touchingPart.Touched:Connect(function(hit)
		onTouched(hit, character.HumanoidRootPart)
	end)
	
	onStoppedAnimation(animTrack)
end

local function onAttack(speed: number?)
	assert(RunService:IsClient(), "You can call this function only server")
	
	local player = game.Players.LocalPlayer
	local character = player.Character
	
	if not cooldown then cooldown = true else return end
	if not speed then speed = 1 end
	
	local t = getIndexCombatInfo()

	onPlayAnimation(t, speed, character)
end

local function onDamage()
	assert(RunService:IsServer(), "You can call this function only server")
	
	takeDamageEvent.OnServerEvent:Connect(function(player: Player, otherHumanoid: Humanoid)
		otherHumanoid:TakeDamage(10)
	end)
end

return {
	onAttack = onAttack,
	onDamage = onDamage
}