function task.start(u,s) end function task.finish(u,s) end function task.run(u,s)if s.DebounceTable.Attacking==true and time()<s.DebounceTable.lastAttackTime+s.DebounceTable.currentAttackDuration then s.DebounceTable.Attacking=true u:running()return else s.DebounceTable.CanMove=true s.DebounceTable.Attacking=false end local X,x=s:GetBestAttack()if(s.Model.HumanoidRootPart.Position-s.currentTarget.HumanoidRootPart.Position).magnitude<s.MaxAttackRange and X then if X then X=require(AttacksFolder[X])s.DebounceTable.currentAttackDuration=X.Duration end s.DebounceTable.lastAttackTime=time()s.DebounceTable.CanMove=false s.DebounceTable.Attacking=true if X then local u,x=pcall(function()X.Attack(s)end)if not u then warn(x)end end u:running()return end u:success()end return task


function task:start(obj)
	--[[
		(optional) this function is called directly before the run method
  		is called. It allows you to setup things before starting to run
  		Beware: if task is resumed after calling running(), start is not called.
	--]]
	
end
function task:finish(obj)
	--[[
		(optional) this function is called directly after the run method
		is completed with either success() or fail(). It allows you to clean up
		things, after you run the task.
	--]]
		
end	
function task:run(obj)
	--[[
		This is the meat of your task. The run method does everything you want it to do.
			
  	 	Finish it with one of these method calls:
  		success() - The task did run successfully
  		fail()    - The task did fail
  		running() - The task is still running and will be called directly from parent node
	--]]
	if obj.DebounceTable.Attacking == true and time() < (obj.DebounceTable.lastAttackTime + obj.DebounceTable.currentAttackDuration) then
		obj.DebounceTable.Attacking = true
		self:running()
		return
	else
		obj.DebounceTable.CanMove = true
		obj.DebounceTable.Attacking = false
	end
	local BestAttack, range = obj:GetBestAttack()
	if (obj.Model.HumanoidRootPart.Position - obj.currentTarget.HumanoidRootPart.Position).magnitude < obj.MaxAttackRange and BestAttack then
		
		
		if BestAttack then
			BestAttack = require(AttacksFolder[BestAttack])
			obj.DebounceTable.currentAttackDuration = BestAttack.Duration
		end 
		
		obj.DebounceTable.lastAttackTime = time()
		obj.DebounceTable.CanMove = false
		obj.DebounceTable.Attacking = true
		
		if BestAttack then
			local success,_error = pcall(function()
				BestAttack.Attack(obj)
			end)
			if not success then
				warn(_error)
			end
		end
		self:running()
		return
		--local AttackModule = 
	end
		
	self:success();
end
return task;
