Hello guys I'm back, this time with a slightly longer question, I am trying to make a filtering enabled chat gui but am having an issue. The message is meant to be made locally, then through a remote-event is cloned onto everyone's client other than the senders, here is the code:
Local code: (creates gui for the sender, successfully moves all other messages up one)
player.Chatted:connect(function(message) local PG = player:WaitForChild("PlayerGui") repeat wait() until PG:FindFirstChild("chatter") repeat wait() until PG.chatter:FindFirstChild("textboxy") local Parent = player:WaitForChild("PlayerGui").chatter.textboxy for i,v in pairs(Parent:GetChildren()) do if v.Name:sub(1,4):lower() == "line" then local LineNumber = v.Name:sub(5) if LineNumber == "9" then v:Destroy() else v.Name = "line"..tostring(tonumber(LineNumber) + 1) v.Position = v.Position - UDim2.new(0,0,0,20) end end end newchatline = Instance.new("TextLabel",player:WaitForChild("PlayerGui").chatter.textboxy) if player then newchatline.Text = player.Name.. ": " ..message else newchatline.Text = "System Message: " ..message end newchatline.Size = UDim2.new(1,0,0,20) newchatline.Position = UDim2.new(0,0,1,-20) newchatline.Font = "SourceSansBold" newchatline.TextColor3 = player:FindFirstChild("color").Value.Color newchatline.TextStrokeTransparency = 0 newchatline.BackgroundTransparency = 1 newchatline.BorderSizePixel = 0 newchatline.FontSize = "Size18" newchatline.TextXAlignment = "Left" newchatline.TextYAlignment = "Top" newchatline.ClipsDescendants = true newchatline.Name = "line1" game:GetService("ReplicatedStorage").Chatted:InvokeServer(message) end)
Server script: Message clones onto everyone's screens other than sender as intended, although it DOES NOT move the local message up one, for example if I send 3 messages "msg1""msg2""msg3" and then someone else sent one ("msg4") it would just overlap with message 3 and not send it up one rung of the ladder, if another person was to send a message after that it would move msg4 up but the local mesages would remain in place, I don't really understand this! From what I gather it is because the server script cannot access the local gui because of filtering enabled and therefore cannot move it up as it does not exist! The only way I can think of getting around this is by make everything client side, but I really wanted to do it this way in order to reduce lag!
Any ideas?
local PG = player:WaitForChild("PlayerGui") repeat wait() until PG:FindFirstChild("chatter") repeat wait() until PG.chatter:FindFirstChild("textboxy") for i,v in pairs(game:GetService("Players"):GetPlayers()) do local Parent = v:WaitForChild("PlayerGui").chatter.textboxy for i,v in pairs(Parent:GetChildren()) do if v.Name:sub(1,4):lower() == "line" then local LineNumber = v.Name:sub(5) if LineNumber == "9" then v:Destroy() else v.Name = "line"..tostring(tonumber(LineNumber) + 1) v.Position = v.Position - UDim2.new(0,0,0,20) end end end if v.Name ~= player.Name then newchatline = Instance.new("TextLabel",v:WaitForChild("PlayerGui").chatter.textboxy) if player then newchatline.Text = player.Name.. ": " .. message else newchatline.Text = "System Message: " .. message end newchatline.Size = UDim2.new(1,0,0,20) newchatline.Position = UDim2.new(0,0,1,-20) newchatline.Font = "SourceSansBold" newchatline.TextColor3 = player:FindFirstChild("color").Value.Color newchatline.TextStrokeTransparency = 0 newchatline.BackgroundTransparency = 1 newchatline.BorderSizePixel = 0 newchatline.FontSize = "Size18" newchatline.TextXAlignment = "Left" newchatline.TextYAlignment = "Top" newchatline.ClipsDescendants = true newchatline.Name = "line1" end end local Parent2 = game:GetService("StarterGui").chatter.textboxy for i,v in pairs(Parent2:GetChildren()) do if v.Name:sub(1,4):lower() == "line" then local LineNumber = v.Name:sub(5) if LineNumber == "9" then v:Destroy() else v.Name = "line"..tostring(tonumber(LineNumber) + 1) v.Position = v.Position - UDim2.new(0,0,0,20) end end end if newchatline then newchatline:Clone().Parent = game:GetService("StarterGui").chatter.textboxy end
You could make a queue in the client. When it receives a message from the server, add it to the back of the queue. Have a LocalScript work through the queue from the start of the queue, generating TextLabels for the messages. When the LocalScript moves to the next message in the queue, move all the TextLabels up that have already been created.