Use Strings Inside Of Table - then check table

I’m currently new to learning scripting/programming and I’m not familiar with using tables. I want to create a table that stores the names of all the children of a UI into a table, then check the table to see if the player has a tool with the same name as one of the children.

I’m using this for a sword shop, where players can only equip one sword at once. The intention is when the player tries to equip a sword, if they already have a sword with the same name as one of the UI’s children (all of the UI’s children are names of swords) then it destroys that sword and clones the new one they are trying to equip.

A sample I wrote is:

local player = game.Players.LocalPlayer
local uiChildrenNames = player.PlayerGui.Frames.Frames.SwordsFrame.ScrollingFrame
local childrenNames = {}

for _, child in ipairs(uiChildrenNames:GetChildren()) do
	childrenNames[child.Name] = true
end

local backpack = player.Backpack
if backpack then
	for _, tool in ipairs(backpack:GetChildren()) do
		if childrenNames[tool.Name] then
			print("Player has tool with name: " .. tool.Name .. " in their backpack.")
		end
	end
else
	print("Nil")
end

However, it does not work and doesn’t return any errors. Any help would be appreciated.

2 Likes

Still need help with this.

:slight_smile:

zzzzz

2 Likes

Can you try printing childrenNames and backpack:GetChildren()?

You can remove this if statement, because if the backpack didn’t exist it would have errored anyway.

Don’t need ipairs here
for _, child in uiChildrenNames:GetChildren() do
for _, tool in backpack:GetChildren() do

1 Like

Looks like this might be causing the issue, try changing this line.
But first, to confirm everything went well, put a print statement like this:

for _, tool in ipairs(backpack:GetChildren()) do
    print(tool.Name) -- This is what you need to add to troubleshoot, temporarily.
	if childrenNames[tool.Name] then
		print("Player has tool with name: " .. tool.Name .. " in their backpack.")
	end
end

It will also still print the name of the item.
The reason why I said that line could’ve been the culprit was because, you are trying to index and find something in an empty table, what that ‘if statement’ actually does is, you are checking if that exists within the table, although you didn’t seem to add anything to that childrenNames table. It is empty.

Please let me know if everything went well till there… I mean…

If the print(tool.Name) is working and you’ve put it above the if statement, and it is successfully printing, then everything went well till there… That’s how you can troubleshoot if output doesn’t throw any errors.

If it is still not working, try putting a wait(10) at the top of the script as a temporary solution, and see if the print statement I told you to put before the if statement is working…

Also, a tip for troubleshooting in the future if the output doesn’t say anything:
In the same way I suggested above, you can put a few print statements after a specific for loop starts (Or functions, etc., and wherever you suspect it is happening), to make sure everything went well till there, if everything’s great till there, then the logic you have to tackle with to achieve the functionality you’re trying to do will narrow down.

1 Like
local player = game.Players.LocalPlayer
local swordsFrame = player.PlayerGui:WaitForChild("Frames"):WaitForChild("SwordsFrame"):WaitForChild("ScrollingFrame")
local childrenNames = {}

-- Fill the table with the names of the UI's children (sword names)
for _, child in ipairs(swordsFrame:GetChildren()) do
    childrenNames[child.Name] = true
end

-- Function to check and replace the sword
local function checkAndReplaceSword()
    local backpack = player.Backpack
    for _, tool in ipairs(backpack:GetChildren()) do
        -- If the tool's name matches one of the UI children's names
        if childrenNames[tool.Name] then
            print("Player has tool with name: " .. tool.Name .. " in their backpack.")
            -- Destroy the existing tool
            tool:Destroy()
            -- Here, add your logic to clone and equip the new sword.
            -- You might need to clone from a Storage service or similar place where you keep the sword templates.
        end
    end
end

-- Calling the function to perform the check
checkAndReplaceSword()

-- Optionally, you can connect this function to an event (like a button click in the UI) 
-- to perform the check when the player tries to equip a new sword.
2 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.