Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

[SOLVED] Why is my raycasting gun not working like it's supposed to?

Hey there! So I made a gun using a viewmodel and attaching it to the camera. All of this works fine, but the part that is not working is the shooting. I'm trying to create a raycast, but after a couple of shots the gun just hits the baseplate and not the part I'm shooting at. If I shoot even more it just prints nothing.

Shooting part of the local script (Don't worry about the "Spread" part, this is unused for now.):

mouse.Button1Down:Connect(function()
				if using and canShoot and not reloading and ammo > 0 and fp then
					canShoot = false
					
					local shootAnim = gunHumanoid:LoadAnimation(script:WaitForChild("Shoot"..currentEquipped.Name))
					shootAnim:Play()
					
					local spread = 0
					
					ammo = ammo - 1
					
					if aiming then
						spread = 0
					elseif running then
						spread = 5
					elseif humanoid:GetState() == Enum.HumanoidStateType.Jumping or humanoid:GetState() == Enum.HumanoidStateType.FallingDown or humanoid:GetState() == Enum.HumanoidStateType.Freefall then
						spread = 10
					end
					
					local spreadX, spreadY, spreadZ = math.random(-spread, spread), math.random(-spread, spread), math.random(-spread, spread)
					
					mouse.TargetFilter = currentEquipped
					
					print(mouse.Target)
					
					game.ReplicatedStorage:WaitForChild("RaycastEvent"):FireServer(currentEquipped:WaitForChild("Flame").Position, mouse.Hit.Position, math.random(20,25), Vector3.new(spreadX/10, spreadY/10, spreadZ/10))
					
					wait(shootAnim.Length)
					
					canShoot = true
				elseif ammo <= 0 and not reloading and using then
					Reload()
				end
			end)

Server script:

game.ReplicatedStorage:WaitForChild("RaycastEvent").OnServerEvent:Connect(function(player, fromP, toP, damage, spread)
	local raycast = Ray.new(fromP, (toP - fromP).unit * 100)
	local part, position, normal = workspace:FindPartOnRay(raycast, player.Character, false, true)
	local character = player.Character or player.CharacterAdded:Wait()
	local hitType = "Else"
	
	if part then
		local humanoid = part.Parent:FindFirstChild("Humanoid")
		
		print(part:GetFullName())

		if humanoid then
			humanoid:TakeDamage(damage)
		end
		
		local parInst = Instance.new("Part", part)
		parInst.Position = toP
		parInst.Material = Enum.Material.Neon
		parInst.Size = Vector3.new(.2,.2,.2)
		parInst.Anchored = true
		parInst.CanCollide = false
		parInst.Archivable = false
	end
end)

Any help is appreciated!

2 answers

Note:

WorldRoot:FindPartOnRay() has been deprecated. "Use WorldRoot:Raycast() along with RaycastParams for new work." - Roblox API

The syntax for WorldRoot:RayCast() is:

workspace:Raycast(Origin, Direction, RaycastParams)

After I converted your code to the new way of Raycasting, it worked fine for me:

game.ReplicatedStorage:WaitForChild("RaycastEvent").OnServerEvent:Connect(function(player, fromP, toP, damage, spread)
	local raycastResults = workspace:Raycast(fromP, (toP - fromP).unit * 100, RaycastParams.new())
	--local raycast = Ray.new(fromP, (toP - fromP).unit * 100)
	--local part, position, normal = workspace:FindPartOnRay(raycast, player.Character, false, true)
	local character = player.Character or player.CharacterAdded:Wait()
	local hitType = "Else"

	--if part then
	if raycastResults then
		local part = raycastResults.Instance
		local humanoid = part.Parent:FindFirstChild("Humanoid")

		print(part:GetFullName())

		if humanoid then
			humanoid:TakeDamage(damage)
		end

		local parInst = Instance.new("Part", part)
		parInst.Position = toP
		parInst.Material = Enum.Material.Neon
		parInst.Size = Vector3.new(.2,.2,.2)
		parInst.Anchored = true
		parInst.CanCollide = false
		parInst.Archivable = false
	end
end)

1 comment

0

It unfortunately didn't fix my problem, but this was helpful anyway, thanks!

I solved it! All I did was put the gun into a tool, tweaked it a little, and it worked.

This discussion is preserved as it was. New answers, comments, and votes are closed.