I made a script that creates lasers and reflects them off of parts not in an ignore list. It works find in a part in workspace using a normal script, but when I try to implement it in a tool with a local script, it will just stop at the first point of impact. It seems that in the script, using a print with the count variable (print(count)), it will increment as many times as it should, but in the local script it only increments once every time you click. Why? I only modified the script slightly? Heres the code (I know its a lot I dont know where the problem is.):
Here is the normal script code in a part in workspace:
wait(5)
count = 0
maxCount = 10
ignoreList = game.Workspace.Glass:GetChildren()
table.insert(ignoreList, script.Parent)
function shoot(position, normal)
local ray = Ray.new(position, normal * 500)
local hit, endPosition, surfaceNormal = workspace:FindPartOnRayWithIgnoreList(ray, ignoreList)
local beam = Instance.new("Part", workspace)
beam.BrickColor = BrickColor.new("Bright red")
beam.FormFactor = "Custom"
beam.Material = "Neon"
beam.Transparency = 0.25
beam.Anchored = true
beam.Locked = true
beam.CanCollide = false
local distance = (position - endPosition).magnitude
beam.Size = Vector3.new(0.3, 0.3, distance)
beam.CFrame = CFrame.new(position, endPosition) * CFrame.new(0, 0, -distance / 2)
if (hit) and count < maxCount then
count = count + 1
print(count)
local reflectedNormal = (normal - (2 * normal:Dot(surfaceNormal) * surfaceNormal))
local newNormal = reflectedNormal
shoot(endPosition, newNormal)
end
end
shoot(script.Parent.CFrame.p, script.Parent.CFrame.lookVector)
Here is the local script in a tool:
local tool = script.Parent.Parent
local player = game:GetService("Players").LocalPlayer
local canUse = true
count = 0
maxCount = 10
ignoreList = game.Workspace.Glass:GetChildren()
table.insert(ignoreList, script.Parent)
table.insert(ignoreList, script.Parent.Parent.Handle)
tool.Equipped:connect(function(mouse)
mouse.Button1Down:connect(function()
shoot(tool.Shoot.CFrame.p, (mouse.Hit.p - tool.Shoot.CFrame.p).unit)
end)
end)
function shoot(position, normal)
if canUse then
canUse = false
local ray = Ray.new(position, normal * 300)
local hit, endPosition, surfaceNormal = workspace:FindPartOnRayWithIgnoreList(ray, ignoreList)
local beam = Instance.new("Part", workspace)
beam.BrickColor = BrickColor.new("Bright red")
beam.FormFactor = "Custom"
beam.Material = "Neon"
beam.Transparency = 0.25
beam.Anchored = true
beam.Locked = true
beam.CanCollide = false
local distance = (position - endPosition).magnitude
beam.Size = Vector3.new(0.3, 0.3, distance)
beam.CFrame = CFrame.new(position, endPosition) * CFrame.new(0, 0, -distance / 2)
game:GetService("Debris"):AddItem(beam, 1)
if (hit) and count < maxCount then
count = count + 1
print(count)
local reflectedNormal = (normal - (2 * normal:Dot(surfaceNormal) * surfaceNormal))
local newNormal = reflectedNormal
shoot(endPosition, newNormal)
end
wait(1)
canUse = true
end
end

1 comment
I figured it out, I just added a ray distance and max iterations parameter to the shoot script and moved count = count + 1 and some other miscellaneous stuff around.