Global Chat Bad Display

I was trying to make a GlobalChat system, but it doesn’t work properly.

The chat was supposed to display for players in the server:
Player1 has rolled an 1/345,000,000!
[GLOBAL] Player1 has rolled an 1/345,000,000!

But it didn’t really work like in the picture…
Picture 1


Picture 2(continued chat from Picture 1)

These are my scripts below:

ServerScriptService Script:

local m = game:GetService("MessagingService")
local r = game.ReplicatedStorage.ChatEvents.Chat
local RainbowGradient = require(game.ReplicatedStorage.Modules.RainbowGradient)

-- Track processed global messages to avoid duplicates
local processedMessages = {}

-- Subscribe to GlobalChat messages (for cross-server communication)
m:SubscribeAsync("GlobalChat", function(Message)
	local messageId = Message.Data.id
	if not processedMessages[messageId] then
		processedMessages[messageId] = true
		r.GlobalMessages:FireAllClients(Message.Data.message)
	end
end)

-- Function to send a global message to all servers and all players in the server
local function SendGlobalMessage(plr, displayer, message)
	-- Generate a unique ID for the global message
	local messageId = tostring(os.time()) .. plr.UserId
	local globalMessageData = {
		id = messageId, -- Unique identifier
		message = message -- The actual message
	}

	-- Publish the global message to MessagingService (broadcast to all servers)
	local success, err = pcall(function()
		m:PublishAsync("GlobalChat", globalMessageData)
	end)
	if not success then
		warn("[Server] Failed to publish global message:", err)
	end
end

-- Global1 Event
r.Global1.OnServerEvent:Connect(function(plr, displayer)
	-- Server message for all players
	local serverMessage = `<font color="#FF0000">{plr.Name} has rolled an 1/{displayer}! 🎉</font>`
	r.GlobalMessages:FireAllClients(serverMessage)

	-- Global message for all players (broadcast via MessagingService)
	local globalMessage = `<font color="#FF0000">[🌎GLOBAL] {plr.Name} has rolled an 1/{displayer}! 🎉</font>`
	SendGlobalMessage(plr, displayer, globalMessage)
end)

-- Global2 Event
r.Global2.OnServerEvent:Connect(function(plr, displayer)
	-- Server message for all players
	local serverMessage = `<font color="#9D00FF">{plr.Name} has rolled an 1/{displayer}! ✨</font>`
	r.GlobalMessages:FireAllClients(serverMessage)

	-- Global message for all players (broadcast via MessagingService)
	local globalMessage = `<font color="#9D00FF">[🌎GLOBAL] {plr.Name} has rolled an 1/{displayer}! ✨</font>`
	SendGlobalMessage(plr, displayer, globalMessage)
end)

-- Global3 Event
r.Global3.OnServerEvent:Connect(function(plr, displayer)
	-- Server message for all players
	local serverMessage = `<font color="#98FB98">OMG! {plr.Name} has rolled an 1/{displayer}!✨✨✨</font>`
	r.GlobalMessages:FireAllClients(serverMessage)

	-- Global message for all players (broadcast via MessagingService)
	local globalMessage = `<font color="#98FB98">[🌎GLOBAL] OMG! {plr.Name} has rolled an 1/{displayer}!✨✨✨</font>`
	SendGlobalMessage(plr, displayer, globalMessage)
end)

-- Global4 Event
r.Global4.OnServerEvent:Connect(function(plr, displayer)
	-- Server message for all players
	local serverMessage = `<font color="#00FF00">OMG! {plr.Name} has rolled an 1/{displayer}! 🔥🔥🔥</font>`
	r.GlobalMessages:FireAllClients(serverMessage)

	-- Global message for all players (broadcast via MessagingService)
	local globalMessage = `<font color="#00FF00">[🌎GLOBAL] OMG! {plr.Name} has rolled an 1/{displayer}! 🔥🔥🔥</font>`
	SendGlobalMessage(plr, displayer, globalMessage)
end)

-- Global5 Event
r.Global5.OnServerEvent:Connect(function(plr, displayer)
	-- Server message for all players
	local serverMessage = `<font color="#FF0000">NO WAY! {plr.Name} has rolled an 1/{displayer}! 🎉</font>`
	r.GlobalMessages:FireAllClients(serverMessage)

	-- Global message for all players (broadcast via MessagingService)
	local messageText = string.format("[🌎GLOBAL] NO WAY! %s has rolled an 1/%s!", plr.Name, displayer)
	local rainbowMessage = RainbowGradient.applyRainbowGradient(messageText)
	SendGlobalMessage(plr, displayer, rainbowMessage)
end)

Client Script(inside StarterPlayerScripts)(LocalScript):

local c = game.ReplicatedStorage.ChatEvents.Chat
local FormatNumber = require(game.Workspace.FormatNumber.Main)
local formatter = FormatNumber.NumberFormatter.with()
local RainbowGradient = require(game.ReplicatedStorage.Modules.RainbowGradient)

-- Listen for global messages
c.GlobalMessages.OnClientEvent:Connect(function(Message)
	if type(Message) == "string" then
		game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
	else
		warn("Received invalid message format:", Message)
	end
end)

-- Over1K Event
c.Over1K.OnClientEvent:Connect(function(plr, index)
	if index >= 1000 and index < 10000 then
		local displayer = formatter:Format(index)
		local Message = `<font color="#ffaa00">{plr.Name} has rolled an 1/{displayer}</font>`
		game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
	elseif index >= 10000 and index < 100000 then
		local displayer = formatter:Format(index)
		local Message = `<font color="#04AFEC">{plr.Name} has rolled an 1/{displayer}!</font>`
		game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
	elseif index >= 100000 and index < 1000000 then
		local displayer = formatter:Format(index)
		local Message = `<font color="##FF00BF">WOW! {plr.Name} has rolled an 1/{displayer}!</font>`
		game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
	elseif index >= 1000000 and index < 5000000 then
		local displayer = formatter:Format(index)
		local Message = `<font color="#FF0000">{plr.Name} has rolled an 1/{displayer}! 🎉</font>`
		game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
	elseif index >= 5000000 and index < 10000000 then
		local displayer = formatter:Format(index)
		local Message = `<font color="#FF0000">{plr.Name} has rolled an 1/{displayer}! 🎉</font>`
		game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
		c.Global1:FireServer(displayer)
	elseif index >= 10000000 and index < 100000000 then
		local displayer = formatter:Format(index)
		local Message = `<font color="#9D00FF">{plr.Name} has rolled an 1/{displayer}! ✨</font>`
		game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
		c.Global2:FireServer(displayer)
	elseif index >= 100000000 and index < 1000000000 then
		local displayer = formatter:Format(index)
		local Message = `<font color="#98FB98">OMG! {plr.Name} has rolled an 1/{displayer}!✨✨✨</font>`
		game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
		c.Global3:FireServer(displayer)
	elseif index >= 1000000000 and index < 10000000000 then
		local displayer = formatter:Format(index)
		local Message = `<font color="#00FF00">OMG! {plr.Name} has rolled an 1/{displayer}! 🔥🔥🔥</font>`
		game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
		c.Global4:FireServer(displayer)
	elseif index >= 10000000000 then
		local displayer = formatter:Format(index)
		local messageText = string.format("NO WAY! %s has rolled an 1/%s!", plr.Name, displayer)
		local rainbowMessage = RainbowGradient.applyRainbowGradient(messageText)
		game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(rainbowMessage)
		c.Global5:FireServer(plr, displayer)
	end
end)

(I don’t think this will help, but if you’re interested to know) RainbowGradient Module Script:

-- ModuleScript: RainbowGradient
local RainbowGradient = {}

-- Rainbow color sequence (hex codes)
local rainbowColors = {
	"#FF0000", -- Red
	"#FF7F00", -- Orange
	"#FFFF00", -- Yellow
	"#00FF00", -- Green
	"#0000FF", -- Blue
	"#4B0082", -- Indigo
	"#9400D3"  -- Violet
}

-- Function to interpolate between two colors
function RainbowGradient.lerpColor(color1, color2, t)
	local r1, g1, b1 = color1:match("#(%x%x)(%x%x)(%x%x)")
	local r2, g2, b2 = color2:match("#(%x%x)(%x%x)(%x%x)")

	r1, g1, b1 = tonumber(r1, 16), tonumber(g1, 16), tonumber(b1, 16)
	r2, g2, b2 = tonumber(r2, 16), tonumber(g2, 16), tonumber(b2, 16)

	local r = math.floor(r1 + (r2 - r1) * t)
	local g = math.floor(g1 + (g2 - g1) * t)
	local b = math.floor(b1 + (b2 - b1) * t)

	return string.format("#%02X%02X%02X", r, g, b)
end

-- Function to apply a single rainbow gradient to text (excluding spaces)
function RainbowGradient.applyRainbowGradient(text)
	local rainbowText = ""
	local textLength = #text
	local nonSpaceCount = 0

	-- Count non-space characters
	for i = 1, textLength do
		if text:sub(i, i) ~= " " then
			nonSpaceCount = nonSpaceCount + 1
		end
	end

	local currentNonSpaceIndex = 0

	for i = 1, textLength do
		local char = text:sub(i, i)
		if char ~= " " then
			-- Calculate the position in the gradient (0 to 1)
			currentNonSpaceIndex = currentNonSpaceIndex + 1
			local t = (currentNonSpaceIndex - 1) / (nonSpaceCount - 1)
			-- Determine which two colors to interpolate between
			local colorIndex = math.floor(t * (#rainbowColors - 1)) + 1
			local color1 = rainbowColors[colorIndex]
			local color2 = rainbowColors[(colorIndex % #rainbowColors) + 1] -- Wrap around using modulo
			-- Interpolate the color
			local color = RainbowGradient.lerpColor(color1, color2, t * (#rainbowColors - 1) % 1)
			-- Wrap the character in a font tag with the interpolated color
			rainbowText = rainbowText .. string.format('<font color="%s">%s</font>', color, char)
		else
			-- Add spaces without modification
			rainbowText = rainbowText .. " "
		end
	end

	return rainbowText
end

return RainbowGradient

I tried to use AI to help, but it didn’t work. So I came here for help. Any attempts to making this work is greatly appreciated!