Ever since the update last night, I’ve noticed that the default chat icon on the new CoreGui UI does not get removed when starterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Chat, false) is executed from a script in game.ReplicatedFirst. This is happening in both Studio and the live game. The Roblox chat interface itself is removed though. This JUST started happening.
Additional Information
Parameter
Value
Problem Area
Engine
Problem Component
UI
First Noticed
19 April 2025
Priority
Medium
Impact
HIgh
Annoyance Level
High
The beta features that I have enabled are as follows:
Assistant Preview
Texture Generator
As for plugins, I have a bunch that are installed, but very few are enabled. The ones that are enabled are listed below with links to their details page on the Roblox store website:
I have the same probelm and this really is annoying because I have a custom chat system that doesn’t use that button so its just there taking up space! And also for games that disable chat they are gonna have that button there but it does absolutely nothing! I hope there is a fix for this.
I suggest you to do it right now. Is it really that hard to just set the icon’s “Visible” property boolean based on the second argument of SetCoreGuiEnabled call?
Sad that all TextChatService related bugs got the exact same response. I wonder what are they actively working on then. If it’s about improving the performance, then I guess they’re doing a bad job there, because everytime I test it, I notice the exact same results as before.
Hey! If anyone else is still having problems, I’ve released a faithful recreation of TextChatService that addresses this issue. OpenTextChatService - Open-Source Implementation of TextChatService. This is on top of a bunch of other bugs and performance issues with TextChatService that I’ve addressed. If that isn’t your jam, the following snippet is a simplified version of what I have included in my resource. Just place a local script in ReplicatedFirst and any calls you make with SetCoreGuiEnabled should work.
--//===================== Services =====================-//-
local StarterGui = game:GetService("StarterGui")
--//===================== Utility =====================-//-
local GetCoreGuiEnabled = function(coreGuiType: Enum.CoreGuiType) : boolean
return StarterGui:GetCoreGuiEnabled(coreGuiType)
end
local SetCoreGuiEnabled = function(coreGuiType: Enum.CoreGuiType, enabled: boolean): ()
StarterGui:SetCoreGuiEnabled(coreGuiType, enabled)
end
local GetCore = function(paramaterName: string): any
local s = false
local v
repeat s = pcall(function() v = StarterGui:GetCore(paramaterName) end) if not s then task.wait() end until s
return v
end
local SetCore = function(paramaterName: string, value: any): ()
local s = false
repeat s = pcall(function() StarterGui:SetCore(paramaterName, value) end) if not s then task.wait() end until s
end
--//===================== CoreGuiChatConnections =====================-//-
local chatWindowVisibilityChangedBindable = Instance.new("BindableEvent")
local chatWindowVisibilityChanged = chatWindowVisibilityChangedBindable.Event
local chatWindowVisibilityBindable = Instance.new("BindableEvent")
local chatWindowVisibility = chatWindowVisibilityBindable.Event
local messagesChangedBindable = Instance.new("BindableEvent")
local messagesChanged = messagesChangedBindable.Event
local db = 2
local VisibilityChanged = function()
local active = GetCore("ChatActive")
local coreGuiEnabled = GetCoreGuiEnabled(Enum.CoreGuiType.Chat)
local visible = active and coreGuiEnabled
chatWindowVisibilityBindable:Fire(visible)
if visible then messagesChangedBindable:Fire(-1) end
if db < 2 then db += 1 return end
db = 0
SetCoreGuiEnabled(Enum.CoreGuiType.Chat, not coreGuiEnabled)
SetCoreGuiEnabled(Enum.CoreGuiType.Chat, coreGuiEnabled)
end
chatWindowVisibilityChanged:Connect(VisibilityChanged)
SetCore("CoreGuiChatConnections", {["ChatWindow"] = {["ToggleVisibility"] = chatWindowVisibilityChangedBindable, ["SetVisible"] = chatWindowVisibilityChangedBindable, ["TopbarEnabledChanged"] = chatWindowVisibilityChangedBindable, ["CoreGuiEnabled"] = chatWindowVisibilityChangedBindable, ["VisibilityStateChanged"] = chatWindowVisibilityBindable, ["MessagesChanged"] = messagesChangedBindable}})
VisibilityChanged()
There is literally no way to disable it. What I’ve noticed is that when a player joins a game that uses the default Roblox chat and leaves the chat window open when leaving the game, then joins a game that tries to disable the core Roblox chat, the topbar icon shows back up if you click Escape after it’s been disabled once. And if you disable it once and then change another core GUI, like the leaderboard, to be enabled or disabled, it will then update the chat icon and make it go away again (until you click Escape)—which, on Roblox’s end, basically closes and reopens the chat window, which updates the icon to show up again even when core chat is disabled.
This is a Roblox issue that devs cannot fix. It will always come back unless someone figures out a workaround to keep it permanently disabled. Also, I found that when the player clicks the useless chat icon that does nothing (to put it in the off state), it can be hidden again because clicking Escape can’t open the window if it was closed already. So the only way to fix this is to have the player manually click the chat icon to close it, and then force the core GUI to update the chat icon state to not show again.
Just replying now that things don’t seem to be working right here. I’ve started taking a look into this issue and am learning more about why things are they way they are.