Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Ray casting, ray won't cast at the direction of the mouse's hit position?

Asked by
royee354 129
6 years ago
Edited 6 years ago

The following script is a global script that fires when I say something specific in a local script in that case for testing purposes I chose "IDK", and when I click after saying "IDK" with the activated event on the tool it will fire the remote event, for some reason the ray cast is casting sometimes at the direction of the mouse but not always. Sometimes it just casts randomly to the sky or to the sides of the tool, any suggestions why? The problem is at line 29

    script.RemoteEvent.OnServerEvent:connect(function(Player,Mousehitp,Mousehit)
    repeat wait() until Player.Character
    Character = Player.Character
    tool = script.Parent.Parent
    local laser = Instance.new("Part")
    laser.Name = "Laser"
    laser.FormFactor = Enum.FormFactor.Custom
    laser.TopSurface, laser.BottomSurface = 0, 0
    laser.Size = Vector3.new(0.2, 0.2, 10)
    laser.BrickColor = BrickColor.Blue()
    laser.Material = "Neon"
    laser.Anchored = true
    laser.CanCollide = false
    laser.Locked = true
    laser.CFrame = tool.Tip.CFrame
    laser.Parent = game.Workspace

    local maxDistance = 400
    local curDistance = 0

    local stepDistance = 2.5
    local stepWait = 0

    local StartPoint = tool.Tip.Position

    local function Step(overrideDistance)

        -- Cast ray:
        local ray = Ray.new(StartPoint, Mousehit.p.Unit * (overrideDistance or stepDistance))
        local hit, pos, norm = game.Workspace:FindPartOnRayWithIgnoreList(ray, {tool.Tip,Character})
        local ignore = {Character,tool.Tip}
local hit, position, normal = game.Workspace:FindPartOnRay(ray, ignore)

        -- Update laser position:
        laser.CFrame = CFrame.new(StartPoint:lerp(pos, 0.5), pos)

        local oldPos = StartPoint
        StartPoint = pos

        if (hit) then
        end

        curDistance = (curDistance + (pos - oldPos).magnitude)

        -- Apply fade effect to laser as it approaches max distance from < 75 studs:
        if (curDistance > (maxDistance - 75)) then
            local d = (curDistance - (maxDistance - 75)) / 75
            laser.Transparency = d
        end

        -- Recurse if max distance not reached:
        if (curDistance < maxDistance) then
            wait(stepWait)
            Step()
        end
    end

    Step()

    -- Done! Destroy laser:
    laser:Destroy()

end)

Answer this question