What my script does is that whenever my target is cloned (the target will be cloned multiple times) from replicatedstorage to workspace, and is looked at, it gets destroyed.
The script works, it’s just very laggy
Script:
while task.wait() do
local player = game:GetService("Players").LocalPlayer
local character = player.Character or player.CharacterAdded:wait()
local torso = character:WaitForChild("Torso")
local target = workspace:WaitForChild("Silhouette").Torso
local vectors = {}
function dotProduct(a, b)
return a.x * b.x + a.y * b.y + a.z * b.z
end
function getAngle(a, b)
return math.acos(dotProduct(a, b) / (a.magnitude * b.magnitude))
end
function drawVector(position, angle, magnitude, name)
if vectors[name] then
vectors[name]:Destroy()
end
local p = Instance.new("Part")
p.Anchored = true
p.Size = Vector3.new(0.1, 0.1, magnitude)
p.CFrame = CFrame.new(position + angle * magnitude / 2, position + angle)
p.Transparency = 1
p.Massless = true
p.CanCollide = false
p.CanQuery = false
p.Parent = workspace
vectors[name] = p
end
game:GetService("RunService").RenderStepped:Connect(function(part)
local torsoAngle = torso.CFrame.lookVector
local targetVector = torso.Position - target.Position
local flatTorsoAngle = Vector3.new(torsoAngle.x, 0, torsoAngle.z)
local flatTargetVector = Vector3.new(targetVector.x, 0, targetVector.z)
drawVector(torso.Position - Vector3.new(0, 2.5, 0), flatTorsoAngle, flatTargetVector.magnitude, "torso")
drawVector(target.Position, flatTargetVector.unit, flatTargetVector.magnitude, "target")
local angle = math.deg(getAngle(-flatTorsoAngle, flatTargetVector))
if angle < 40 then
target.Parent:Destroy()
end
end)
end
@SomeFedoraGuy is correct, you’re connecting a .RenderStepped every single frame which causes a memory leak.
Fixed code:
local player = game:GetService("Players").LocalPlayer
local character = player.Character or player.CharacterAdded:wait()
local torso = character:WaitForChild("Torso")
local target = workspace:WaitForChild("Silhouette").Torso
local vectors = {}
local function dotProduct(a, b)
return a.x * b.x + a.y * b.y + a.z * b.z
end
local function getAngle(a, b)
return math.acos(dotProduct(a, b) / (a.magnitude * b.magnitude))
end
local function drawVector(position, angle, magnitude, name)
if vectors[name] then
vectors[name]:Destroy()
end
local p = Instance.new("Part")
p.Anchored = true
p.Size = Vector3.new(0.1, 0.1, magnitude)
p.CFrame = CFrame.new(position + angle * magnitude / 2, position + angle)
p.Transparency = 1
p.Massless = true
p.CanCollide = false
p.CanQuery = false
p.Parent = workspace
vectors[name] = p
end
game:GetService("RunService").RenderStepped:Connect(function(part)
local torsoAngle = torso.CFrame.lookVector
local targetVector = torso.Position - target.Position
local flatTorsoAngle = Vector3.new(torsoAngle.x, 0, torsoAngle.z)
local flatTargetVector = Vector3.new(targetVector.x, 0, targetVector.z)
drawVector(torso.Position - Vector3.new(0, 2.5, 0), flatTorsoAngle, flatTargetVector.magnitude, "torso")
drawVector(target.Position, flatTargetVector.unit, flatTargetVector.magnitude, "target")
local angle = math.deg(getAngle(-flatTorsoAngle, flatTargetVector))
if angle < 40 then
target.Parent:Destroy()
end
end)