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

Raycasting Weapon is ignoring parts?

Asked by 9 years ago

(This is used by an NPC). SpawnPosition1 is the tip of the weapon, and targetPosition1 is the players Torso it is locked on to.

local function MakeRocket(spawnPosition1,targetPosition1)

--------Randomize targetPosition1
    targetPosition1 = Vector3.new(targetPosition1.X + math.random(-3,3),targetPosition1.Y + math.random(-3,3),targetPosition1.Z + math.random(-3,3))

    local ray = Ray.new(spawnPosition1, (targetPosition1 - Tool.Handle.CFrame.p).unit * 300)    
    local hit, position = game.Workspace:FindPartOnRay(ray, MyModel)

    local distance = (position - Tool.Handle.CFrame.p).magnitude


    local rayPart = Instance.new("Part", MyModel)
    rayPart.Name          = "RayPart"
    rayPart.BrickColor    = BrickColor.new("Bright red")
    rayPart.Transparency  = 0.5
    rayPart.Anchored      = true
    rayPart.CanCollide    = false
    rayPart.TopSurface    = Enum.SurfaceType.Smooth
    rayPart.BottomSurface = Enum.SurfaceType.Smooth
    rayPart.formFactor    = Enum.FormFactor.Custom
    rayPart.Size          = Vector3.new(0.2, 0.2, distance)
    rayPart.CFrame        = CFrame.new(Tool.Handle.CFrame.p, position--[[targetPosition1]]) * CFrame.new(0, 0, -distance/2)
        --add it to debris so it disappears after 0.1 seconds

    rayPart.Touched:connect(function(part)
        local hithumanoid = part and part.Parent and part.Parent:FindFirstChild("Humanoid")
        if hithumanoid and hityet == false and hithumanoid.Parent ~= MyModel then
            hityet = true
            local damagehitting = nil
            for index, value in pairs(points) do
                if distance >= points[index][1] and points[index + 1] and distance <= points[index + 1][1] then
                    local slope = (points[index + 1][2] - points[index][2])/(points[index + 1][1] - points[index][1])
                    local yint = points[index][2] - (slope*points[index][1]) --points[index][2]
                    local damagehitting = slope*distance + yint
                    if damagehitting >= 0 then
                        --print(damagehitting)
                        hithumanoid:TakeDamage(damagehitting)
                        break
                    end
                end
            end
        end
    end)
        DebrisService:AddItem(rayPart, 0.1)
end

The raycast is accurate (as accurate as I want it to be), but for some reason shoots through blocks and the method FindPartOnRay doesn't seem to detect the part even though the "lazer" clearly goes through it. How could I fix this?

Answer this question