Multiple targets targeting system issues

My function FindTargets seems to give me a table that is bigger then the burst and also doesnt find the first 5 targets but the first 4 and then 1 random and then 3 and 2 random an so fourth

  1. What do you want to achieve? To work properly

  2. What is the issue? Find more targets then needed

  3. What solutions have you tried so far? I tried clearing the tables doesnt seem to work

local debris = game:GetService(“Debris”)
local gen = require(game.ServerScriptService.Modules.Projectile)

local map = workspace.Map


local statsFolder = script.Parent.Parent.Stats
local cdr = statsFolder.Cdr
local cost = statsFolder.Cost
local level = statsFolder.Level
local range = statsFolder.Range
local damage = statsFolder.Dmg
local targetting = statsFolder.Targetting
local arrow = game.ReplicatedStorage.Towers.Archer.Projectiles[“Arrow-1”]
local rightUpgrades = statsFolder.Right
local leftUpgrades = statsFolder.Left


local vaynePassive = false
local maxCounter = 6
local counter = 0


local rangeBuff = 10


local burstEnabled = false
local burstAtk = tick()
local burst = 3


local fireArrow = false
local fireDamage = 2


local hm = script.Parent
local char = hm.Parent
local hrp = char.Model.Char.MiddleTorso.Joint
local root = char.Model.Char.HumanoidRootPart
local base = char.HitBox
local xOffSet = hrp.C0.X
local yOffSet = hrp.C0.Y
local zOffSet = hrp.C0.Z


char.Changed:Connect(function()
hm = script.Parent
char = hm.Parent
hrp = char.Model.Char.MiddleTorso.Joint
root = char.Model.Char.HumanoidRootPart
base = char.HitBox
xOffSet = hrp.C0.X
yOffSet = hrp.C0.Y
zOffSet = hrp.C0.Z
end)


local animsFolder = game.ReplicatedStorage.Anims
local anims = {}
anims.Idle = animsFolder.ArcherIdle
anims.Atk = animsFolder.ArcherAtk


local animsTrack = {}
animsTrack.Idle = hm:LoadAnimation(anims.Idle)
animsTrack.Atk = hm:LoadAnimation(anims.Atk)


animsTrack.Idle.Priority = Enum.AnimationPriority.Core
animsTrack.Idle:Play()


function rotate(target)
if target == nil then return end
local dir = (target.Position - root.Position).Unit
local vecA = Vector2.new(root.CFrame.LookVector.X, root.CFrame.LookVector.Z)
local vecB = Vector2.new(dir.X, dir.Z)
local dotValue = vecA:Dot(vecB)
local crossValue = vecA:Cross(vecB)
local ht = root.Position.Y - target.Position.Y
local upAngle = math.atan(ht/10)

local angle = math.atan2(crossValue, dotValue)

hrp.C0 = CFrame.new(xOffSet, yOffSet, zOffSet)*CFrame.Angles(0, -angle, math.rad(-90))
end


function FindTarget(mode, range)
local bestTarget = nil
local bestCorner = nil
local bestDistance = nil
local bestHp = nil

for i, mob in pairs(workspace.Enemy:GetChildren()) do
local distanceToSlime = (mob.Position - Vector3.new(base.Position.X, 1, base.Position.Z)).Magnitude
local distanceToCorner = (mob.Position - map.CheckPoints:GetDescendants()[mob.Corner.Value].Position).Magnitude
if distanceToSlime <= range and mob.Health.Value > 0 then
if mode == “Nearest” then
range = distanceToSlime
bestTarget = mob
elseif mode == “First” then
if not bestCorner or mob.Corner.Value >= bestCorner then
if not bestCorner or mob.Corner.Value > bestCorner then
bestDistance = nil
end

  			bestCorner = mob.Corner.Value

  			if not bestDistance or distanceToCorner < bestDistance  then
  				bestDistance = distanceToCorner
  				bestTarget = mob
  			end
  		end
  	elseif mode == "Last" then
  		if not bestCorner or mob.Corner.Value <= bestCorner then
  			if not bestCorner or mob.Corner.Value < bestCorner then
  				bestDistance = nil
  			end
  			bestCorner = mob.Corner.Value
  			if not bestDistance or distanceToCorner > bestDistance  then
  				bestDistance = distanceToCorner
  				bestTarget = mob
  			end
  		end
  	elseif	mode == "Strongest"  then
  		if not bestHp or mob.Health.Value > bestHp   then
  			bestHp = mob.Health.Value
  			bestTarget = mob
  		end
  	end
  elseif mode == "Weakest" then
  	if not bestHp or mob.Health.Value < bestHp   then
  		bestHp = mob.Health.Value
  		bestTarget = mob
  	end
  end

end
return bestTarget
end


function FindTargets(mode, range, burst)
local bestTargets = {}
local bestCorner = {}
local bestDistances = {}
local bestHps = {}

for i, mob in pairs(workspace.Enemy:GetChildren()) do
local distanceToSlime = (mob.Position - Vector3.new(base.Position.X, 1, base.Position.Z)).Magnitude
local distanceToCorner = (mob.Position - map.CheckPoints:GetDescendants()[mob.Corner.Value].Position).Magnitude
if distanceToSlime <= range and mob.Health.Value > 0 then
if mode == “Nearest” then
for i = 1, burst do
if not bestDistances[i] or distanceToSlime < bestDistances[i] then
table.insert(bestTargets, i, mob)
table.insert(bestDistances, i, distanceToSlime)
break
end
end
elseif mode == “First” then
for i = 1, burst do
print(burst)
–print(bestTargets)
if not bestCorner[i] or mob.Corner.Value >= bestCorner[i] then
if not bestCorner[i] or mob.Corner.Value > bestCorner[i] then
table.remove(bestDistances, i)
end

  				table.insert(bestCorner, i, mob.Corner.Value)
  				
  				if not bestDistances[i] or distanceToCorner < bestDistances[i] then
  					table.insert(bestDistances, i, distanceToCorner)
  					table.insert(bestTargets, i, mob)
  					break
  				end
  			end
  		end
  	elseif mode == "Last" then
  		for i = 1, burst do
  			if not bestCorner[i] or mob.Corner.Value <= bestCorner[i] then
  				if not bestCorner[i] or mob.Corner.Value < bestCorner[i] then
  					table.remove(bestDistances, i)
  				end

  				table.insert(bestCorner, i, mob.Corner.Value)

  				if not bestDistances[i] or distanceToCorner < bestDistances[i] then
  					table.insert(bestDistances, i, distanceToCorner)
  					table.insert(bestTargets, i, mob)
  					break
  				end
  			end
  		end	
  	elseif mode == "Strongest" then
  		for i = 1, burst do
  			if not bestHps[i] or mob.Health.Value > bestHps[i] then
  				table.insert(bestTargets, i, mob)
  				table.insert(bestHps, i, mob.Health.Value)
  				break
  			end
  		end
  	elseif mode == "Weakest" then
  		for i = 1, burst do
  			if not bestHps[i] or mob.Health.Value < bestHps[i] then
  				table.insert(bestTargets, i, mob)
  				table.insert(bestHps, i, mob.Health.Value)
  				break
  			end
  		end
  	end
  end

end

return bestTargets

end


rightUpgrades.Changed:Connect(function()
if char.Name == “Archer-4-0” then
if fireArrow == false then
fireArrow = true
else
if fireDamage < 4 then
fireDamage += 1
else
print(“Maxxed”)
end
end
elseif char.Name == “Archer-0-4” then
if vaynePassive == false then
vaynePassive = true
end
end
end)

leftUpgrades.Changed:Connect(function()
if char.Name == “Archer-4-0” then
if burstEnabled == false then
burstEnabled = true
burstAtk = tick()
else
if burst < 5 then
burst += 1
else
print(“Maxxed”…burst)
end
end
elseif char.Name == “Archer-0-4” then
–Support buffed firerate and range
end
end)


function fireArrows(target, dmg, fireDmg)
if target == nil then return end
target.Health.Value -= dmg
if #target.Effects:GetChildren() == 0 then
local fire = game.ServerStorage.Effects.FIre:Clone()
fire:SetAttribute(“Damage”, fireDmg)
fire.FireParticle.Parent = target
fire.Parent = target.Effects
fire.Value = true
end
end


function damaged(target, dmg)
if target == nil then return end
target.Health.Value -= dmg
end


function attack(dmg)
local target = FindTarget(targetting.Value, range.Value)
if target and target.Health.Value > 0 then
animsTrack.Atk:Play()
while animsTrack.Atk.IsPlaying == true do
task.wait(0.02)
target = FindTarget(targetting.Value, range.Value)
rotate(target)
end

  if target ~= nil then
  	local metricTable = {
  		char.Model.Char.RightHand.Position,
  		target.Position,
  		0.1,
  		target
  	}
  	gen.New(arrow, metricTable)
  	
  	if target.Parent ~= nil then
  		if fireArrow == true then
  			fireArrows(target, dmg, fireDamage)
  		else
  			damaged(target, dmg)
  		end
  		
  		task.wait(cdr.Value-animsTrack.Atk.Length+animsTrack.Atk.Length)
  	end
  end

end
end


function barrage(dmg)
local target = FindTarget(targetting.Value, range.Value)
local targets
if target and target.Health.Value > 0 then

  animsTrack.Atk:Play()
  while animsTrack.Atk.IsPlaying == true do
  	task.wait(0.02)
  	target = FindTarget(targetting.Value, range.Value)
  	rotate(target)
  end
  
  --table.clear(targets)
  targets = FindTargets(targetting.Value, range.Value*2, burst)
  if target ~= nil then
  	
  	for i=1, #targets do
  		if targets[i] == nil then return end
  		gen.New(arrow, {char.Model.Char.RightHand.Position,targets[i].Position,0.5,targets[i]})
  	end
  	
  	--print(#targets)
  	
  	if target.Parent ~= nil then
  		if fireArrow == true then
  			for i=1, #targets do
  				fireArrows(targets[i], dmg, fireDamage)
  			end
  		else
  			for i=1, #targets do
  				damaged(targets[i], dmg)
  			end
  		end

  		task.wait(cdr.Value-animsTrack.Atk.Length+animsTrack.Atk.Length)
  	end
  end

end
end


while task.wait(0.02) do
attack(damage.Value)
if tick() - burstAtk >= 5 and burstEnabled == true then
burstAtk = tick()
barrage(damage.Value)
end

end

Blockquote