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!