New children don't get detected with :GetChildren()

So I have a local script that inserts Image Labels into a frame, then later with User Input Service I send a signal trough a remote event to a script in ServerScriptService. It might be something small since its my first time scripting with remote events but they seemed simple enough. Everything is fine in the local script but the server script’s :GetChildren() function doesn’t detect the stuff added by the local script, only the stuff that was already there.

This is the server script:

interactEvent.OnServerEvent:Connect(function(player, item:Instance)
	local inventoryFrame = player.PlayerGui.Inventory.InventoryFrame
	
	local numberOfSlots = 0
	for i, v in pairs(inventoryFrame:GetChildren()) do -- Checking how many slots there are
		print(v.Name)
		if v:IsA("ImageLabel") and v.Name == aSlot.Name then
			numberOfSlots += 1
			print("Small")
		end
		if v:IsA("ImageLabel") and v.Name == aBigSlot.Name then
			numberOfSlots += 2
			print("Big")	
		end
	end
end

The output prints out a UI Gradient and a UI List Layout that were already there.

I believe that the local script cannot add elements for the serveur

1 Like

What happens here is that any changes made by a server replicate to clients, but not the other way around (most of the time). You’ll want to detect the children of the frame via LocalScript for this to work :+1:

1 Like

When you use :GetChildren() on the server, it will only see instances that were created on the server or instances that were replicated from the server to the client. Any UI elements added by a LocalScript will not be visible to the server.

Solution

To ensure the server is aware of the UI elements added by the LocalScript, you need to inform the server about these changes. One way to do this is to use RemoteEvents or RemoteFunctions to communicate the necessary information from the client to the server.

Here is an example approach:

  1. Client-side (LocalScript): Notify the server whenever a new slot is added.

  2. Server-side (ServerScript): Handle the notification and update the server’s understanding of the UI elements.

Example Implementation

LocalScript (Client-side)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local addSlotEvent = ReplicatedStorage:WaitForChild("AddSlotEvent")

-- Function to add a new slot
local function addSlot(slotName, slotType)
    -- Create a new slot (ImageLabel)
    local newSlot = Instance.new("ImageLabel")
    newSlot.Name = slotName
    -- Set properties for the new slot as needed
    -- ...

    -- Add the slot to the InventoryFrame
    local inventoryFrame = script.Parent.Inventory.InventoryFrame
    newSlot.Parent = inventoryFrame

    -- Notify the server about the new slot
    addSlotEvent:FireServer(slotName, slotType)
end

-- Example usage
addSlot("NewSlotName", "Small")

ServerScript (Server-side)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local addSlotEvent = Instance.new("RemoteEvent")
addSlotEvent.Name = "AddSlotEvent"
addSlotEvent.Parent = ReplicatedStorage

local interactEvent = ReplicatedStorage:WaitForChild("InteractEvent")

-- Table to keep track of player inventories
local playerInventories = {}

-- Handle the AddSlotEvent from the client
addSlotEvent.OnServerEvent:Connect(function(player, slotName, slotType)
    if not playerInventories[player] then
        playerInventories[player] = {}
    end
    
    table.insert(playerInventories[player], {Name = slotName, Type = slotType})
end)

-- Handle the interact event
interactEvent.OnServerEvent:Connect(function(player, item)
    local inventory = playerInventories[player] or {}
    local numberOfSlots = 0

    for _, slot in pairs(inventory) do
        print(slot.Name)
        if slot.Type == "Small" then
            numberOfSlots += 1
            print("Small")
        elseif slot.Type == "Big" then
            numberOfSlots += 2
            print("Big")
        end
    end
end)
1 Like

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