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

How do I make a script that checks if someone has a tool?

Asked by 4 years ago

So I have a scanner that checks for certain tools, such as weapons and tells the operator if they are armed or not on a textlabel. The scanner scans everyone in a room. It keeps saying my script bellow is attempting to call a nil value.

local Players = game:GetService("Players")
local armed = false
local text = script.Parent.SurfaceGui.TextButton.Text

local part = script.Parent
local function onTouched(part)
    local player = Players:GetPlayerFromCharacter(part.Parent)
    if player then 
        local Backpack = player.Backpack
        print(player.Name)
        armed = false
        if Backpack:FindFirstChild("M4A1") then 
            armed = true
        end
        if Backpack:FindFirstChild("AK47") then 
            armed = true
        end
        if Backpack:FindFirstChild("Baton") then 
            armed = true
        end
        if Backpack:FindFirstChild("Pistol") then
            armed = true
        end
        if Backpack:FindFirstChild("Rifle") then 
            armed = true
        end
        if armed == true then 
            text = "ARMED"
        else
            text = "UNARMED"
        end
    end
end
part.Touched:Connect(onTouched)

1 answer

Log in to vote
0
Answered by 4 years ago

Your issue may be the double use of the variable part. You are using this variable as a reference to the part that needs to be touched but also using the variable to show a part that was found touching.

I suggest completely remove local part = script.Parent because you are using this variable once, not several times. Please see below for the updated script:

local Players = game:GetService("Players")
local armed = false
local text = script.Parent.SurfaceGui.TextButton.Text

local function onTouched(hit) -- I changed for hit to make it more obvious what this variable represents
    local player = Players:GetPlayerFromCharacter(hit.Parent)
    if player then 
        local Backpack = player.Backpack
        print(player.Name)
        armed = false
        if Backpack:FindFirstChild("M4A1") or player.Character:FindFirstChild("M4A1") then 
            armed = true
        end
        if Backpack:FindFirstChild("AK47") or player.Character:FindFirstChild("AK47") then 
            armed = true
        end
        if Backpack:FindFirstChild("Baton") or player.Character:FindFirstChild("Baton") then 
            armed = true
        end
        if Backpack:FindFirstChild("Pistol") or player.Character:FindFirstChild("Pistol") then
            armed = true
        end
        if Backpack:FindFirstChild("Rifle") or player.Character:FindFirstChild("Rifle") then 
            armed = true
        end
        if armed == true then 
            text = "ARMED"
        else
            text = "UNARMED"
        end
    end
end
part.Touched:Connect(onTouched)

You may have noticed I am checking through Character. This is due to the Tool being moved from Backpack to the Character Model when you equip a tool, meaning your code will give "UNARMED" as a result if the only tool you have is equiped.

Comment any issues or question you have below

Ad

Answer this question