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
-
What do you want to achieve? To work properly
-
What is the issue? Find more targets then needed
-
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 = nilfor 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
endbestCorner = 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)
endtable.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)
endif 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 thenanimsTrack.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)
endend
Blockquote