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

if I search for the humanoid it returns a nil error and breaks the whole script?

The error is on line 16. The error outputted is: 'attempt to index nil with 'Parent'' Even if I put it inside an if statement, it still brings an error, and I'm not sure why.

local rs = game:GetService("ReplicatedStorage")
local events = rs:WaitForChild("Events")
local shootEvent = events:WaitForChild("Shoot")

function newBullet(player,part,pos,damage)
	if part.Parent:FindFirstChild("Humanoid") ~= nil then
		local humanoid = part.Parent:FindFirstChild("Humanoid")

		if humanoid.Health > 0 then
			humanoid:TakeDamage(damage)
		end
	else	
		local bullet = Instance.new("Part",workspace:WaitForChild("Ignore"))
		bullet.Anchored = true
		bullet.CanCollide = false
		bullet.BrickColor = BrickColor.new("Black")
		bullet.Position = pos
		bullet.Size = Vector3.new(0.1,0.1,0.1)
		game:GetService("Debris"):AddItem(bullet,5)
	end
end
shootEvent.OnServerEvent:Connect(newBullet)

5 comments

0

do NOT use Instance.new("Part", workspace)

0

parenting your part like this is slow

0

not that it will fix the error but its just a suggestion to always do "object.parent" instead

0

you havent given your bullet any information about what its "Parent" might be i guess (line 6)

0

also you made a typo saying its line 16 instead of line 6

1 answer

It may be because the player who is firing the remote event is not actually sending a part instance, so the 'part' parameter in your function is nil. Writing part.Parent in such a case will error the script since it is telling the script to find a humanoid object in nil.Parent.

But why wouldn't the part ever exist? Well, in the context of guns, it can happen if the player shoots at the sky.

So a simple fix would be to verify before anything else that a part instance was indeed sent.

function newBullet(player,part,pos,damage)
	if part ~= nil then -- This is where we check if the part instance exists
		if part.Parent:FindFirstChild("Humanoid") ~= nil then
			local humanoid = part.Parent:FindFirstChild("Humanoid")
			
			if humanoid.Health > 0 then
				humanoid:TakeDamage(damage)
			end
		else
			local bullet = Instance.new("Part",workspace:WaitForChild("Ignore"))
    			bullet.Anchored = true
      			bullet.CanCollide = false
			bullet.BrickColor = BrickColor.new("Black")
			bullet.Position = pos
			bullet.Size = Vector3.new(0.1,0.1,0.1)
			game:GetService("Debris"):AddItem(bullet,5)
		end
	end
end

There is also an improvement I would make to the script on Line 6.

function newBullet(player,part,pos,damage)
	if part ~= nil then
		local humanoid = part.Parent:FindFirstChild("Humanoid") -- This will return the humanoid instance if it exists, and if it doesn't then nil
		if humanoid ~= nil then
			if humanoid.Health > 0 then
				humanoid:TakeDamage(damage)
			end
		else
			-- Humanoid not found; your code that creates a bullet goes here
		end
	end
else

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