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

Custom Inventory Cloning same thing twice?

Basically, I'm making a Custom Inventory Gui. Theres a bug where it shows 2 of the same item, even though I don't want it to.

I've tried clearing the 2 tables in this script before the cloning process. I've tried adding wait() arguments (that just made things worse lol).

this is the script:

local player = game.Players.LocalPlayer
local character = player.Character
local items = {}
local buttons = {}
local equipped = script.Parent.Handler.Equipped
local selected = script.Parent.Handler.Selected
local location = script.Parent.Handler.Location
game.StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack,false) -- Makes the original backpack gui invisible

player:WaitForChild("Backpack")

script.Parent.Parent.Parent:WaitForChild("PlayerMain")

function search(location)
	for i,v in ipairs(location:GetChildren()) do -- Find all item in a specific location
		if v:IsA("Tool") then -- If the item found is a "Tool"
			table.insert(items,v) -- We're going to put all the tools found in a table.
		end
	end
end

function Delete()
	for i,v in ipairs(items) do
		table.remove(items,v)
		v:Destroy()
	end
	for i,v in ipairs(buttons) do
		v:Destroy()
	end
end

function Add()
	for i,v in ipairs(items) do -- Finds all items in the table
		local button = script.Sample:Clone() -- clones the sample button inside the localscript
		button.Name = v.Name -- sets the cloned button's name to the name of the item
		button.LayoutOrder = i
		button.Parent = script.Parent.Handler -- Sets the parent of the cloned button to the handler
		button.Image = v.TextureId -- Sets the image of the button to the texture id of the tool
		button.ZIndex = 7
		button.BackgroundColor3 = Color3.fromRGB(50,50,50)
		button.BorderColor3 = Color3.fromRGB(25,25,25)
		button.BorderMode = Enum.BorderMode.Outline
		button.BorderSizePixel = 3
		table.insert(buttons,button) -- Inserts the button to our table "buttons"
		button.MouseEnter:Connect(function()
			if script.Parent.Handler.Selected.Value == nil or script.Parent.Handler.Selected.Value ~= v then -- Checks if the selected value is nothing or if the selected value is not the button
				if button:GetAttribute("ItemEquipped") == false then 
					button.BorderColor3 = Color3.fromRGB(255,0,0)
				end
				script.Parent.Frame.ItemStats.ItemName.Text = v.Name -- Sets the TextLabel's Text to the name of the tool/button
				script.Parent.Frame.ItemStats.ItemLevel.Text = "Lv. "..v:GetAttribute("Level") 
				script.Parent.Frame.ItemStats.ItemDesc.Text = ""..v:GetAttribute("Description")
				script.Parent.Frame.ImageLabel.Image = v.TextureId -- Sets the image label's image to the texture id of the tool
				selected.Value = v
				location.Value = v.Parent
			end
		button.MouseLeave:Connect(function()
			if button:GetAttribute("ItemEquipped") == false then 
				button.BorderColor3 = Color3.fromRGB(25,25,25)
			end
			script.Parent.Frame.ItemStats.ItemName.Text = "(Nothing)"
			script.Parent.Frame.ItemStats.ItemLevel.Text = "Lv. NaN"
			script.Parent.Frame.ItemStats.ItemDesc.Text = "No Description"
			script.Parent.Frame.ImageLabel.Image = "rbxassetid://0"
			selected.Value = nil
			location.Value = nil
		end)
		button.MouseButton1Click:Connect(function()
			if equipped.Value == nil or equipped.Value ~= selected.Value then -- Just the same as the last one
				character.Humanoid:UnequipTools() -- Forces the player to unequip the tool that they equipped
				if location.Value == player.Backpack then
					character.Humanoid:EquipTool(selected.Value)
					equipped.Value = selected.Value
					button:SetAttribute("ItemEquipped",true)
					button.BorderColor3 = Color3.fromRGB(0,255,0)
				end
			else
				character.Humanoid:UnequipTools()
				equipped.Value = nil
				button.EquipCheck.Visible = false
				button:SetAttribute("ItemEquipped",false)
				button.BorderColor3 = Color3.fromRGB(25,25,25)
				end
			end)
		end)
	end
end

function backpackRefresh()
	items = {}
	Delete()
	search(game.Players.LocalPlayer.Character)
	search(game.Players.LocalPlayer.Backpack)
	Add()
end

function FrameVis()
	if script.Parent.Visible == true then
		script.Parent.Parent.Frame.Visible = true
		script.Parent.Parent.Parent.PlayerMain.Dark.Main.Visible = false
		script.Parent.Parent.Parent.PlayerMain.Dark.StatHUD.Visible = false
	elseif script.Parent.Visible == false then
		script.Parent.Parent.Frame.Visible = false
		script.Parent.Parent.Parent.PlayerMain.Dark.Main.Visible = true
		script.Parent.Parent.Parent.PlayerMain.Dark.StatHUD.Visible = true
	end
end

Delete()
backpackRefresh()

player.Backpack.ChildAdded:Connect(backpackRefresh)
player.Backpack.ChildRemoved:Connect(backpackRefresh)

character.ChildAdded:Connect(backpackRefresh)
character.ChildRemoved:Connect(backpackRefresh)

FrameVis()

script.Parent:GetPropertyChangedSignal("Visible"):Connect(FrameVis)

this is the few parts that this script interacts with:

a peek on the explorer

Picture of the bug (in case you don't understand what i mean)

2 comments

0

no errors in the dev console btw

0

and, said script is a local script. It is called "InventoryHandler", you can see in the image i put

1 answer

nvm, this was never the backpack scripts problem, my items just somehow duped. I knew after I checked the backpack for any extra items.

lel

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