#Raycast gun

10 messages · Page 1 of 1 (latest)

rapid bison
#

This is my script:

#

local tool = script.Parent
local shoot_part = tool:WaitForChild("Handle"):FindFirstChild("Shot")
local remote = tool:WaitForChild("OnShoot")
local maxRange = tool:GetAttribute("MaxRange")

local Workspace = game:GetService("Workspace")
local ServerStorage = game:GetService("ServerStorage")
local Debris = game:GetService("Debris")

local Visuals = Workspace:WaitForChild("Visuals")

local function creatVisual(origin, direction)
    local center = origin + direction / 2
    local distance = direction.Magnitude

    local visual = Instance.new("Part", Visuals)
    visual.Anchored = true
    visual.CanCollide = false
    visual.CanQuery = false
    visual.BrickColor = BrickColor.new("Dark stone grey")
    visual.Material = Enum.Material.Neon

    visual.CFrame = CFrame.new( center, origin )
    visual.Size = Vector3.new( .5, .5, distance )

    Debris:AddItem(visual, .05)
end

remote.OnServerEvent:Connect(function(player, position)
    
    local origin = shoot_part.Position
    local direction = (position - origin).Unit * maxRange
    local result = Workspace:Raycast(origin, direction)

    local intersection = result and result.Position or origin + direction
    local distance = (origin - intersection).Magnitude
    
    creatVisual(origin, direction)

    if result then
        
        local part = result.Instance
        local humanoid = part.Parent:FindFirstChild("Humanoid") or part.Parent.Parent:FindFirstChild("Humanoid")

        if humanoid then
            
            humanoid:TakeDamage(10)
            
        end
        
    end
    
end) ```
rapid bison
#

i keep the function the same?

grand steppe
#

Didn't put much brainpower into that one

#

Technically, it would be

createVisual(origin, direction / maxRange * distance)
#

But you should really be having createVisual taking and endpoint value instead

#

Which would just be intersection