Hello! I’m making a RNG game and sends a global chat message if the player gets a 1 in 5M or more. I released my game, pulled it, and it didn’t go well… I got it, but it displays everyone in the server. I’m trying to find out what’s happening but I can’t. Below is my picture and all of my scripts, thank you for helping!
local c = game.ReplicatedStorage.ChatEvents.Chat
local FormatNumber = require(game.Workspace.FormatNumber.Main)
local formatter = FormatNumber.NumberFormatter.with()
local m = game:GetService("MessagingService")
c.GlobalMessages.OnClientEvent:Connect(function(Message)
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message.Data)
end)
c.DonationEvent.OnClientEvent:Connect(function(plr)
if plr then
local Message = `<font color="#00ff00">[DONATION] {plr} has donated 10 Robux!</font>`
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
end
end)
c.Over1K.OnClientEvent:Connect(function(plr, index)
if index >= 1000 and index < 10000 then
local displayer = formatter:Format(index)
-- Gold hex code: #ffaa00
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)
-- Cyan hex code: #04AFEC
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)
-- Pink hex code: ##FF00BF
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)
-- Red hex code: #FF0000
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 -- 1/5M+
local displayer = formatter:Format(index)
local Message = `<font color="#FF0000">{plr.Name} has rolled an 1/{displayer}! 🎉</font>`
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
game.ReplicatedStorage.ChatEvents.Chat.Global1:FireServer(displayer)
elseif index >= 10000000 and index < 100000000 then
local displayer = formatter:Format(index)
-- Purple hex code: #9D00FF
local Message = `<font color="#9D00FF">{plr.Name} has rolled an 1/{displayer}! ✨</font>`
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
game.ReplicatedStorage.ChatEvents.Chat.Global2:FireServer(displayer)
elseif index >= 100000000 and index < 1000000000 then
local displayer = formatter:Format(index)
-- Light Lime hex code: #98FB98
local Message = `<font color="#98FB98">OMG! {plr.Name} has rolled an 1/{displayer}!✨✨✨</font>`
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
game.ReplicatedStorage.ChatEvents.Chat.Global3:FireServer(displayer)
elseif index >= 1000000000 then
local displayer = formatter:Format(index)
-- Green hex code: #00FF00
local Message = `<font color="#00FF00">OMG! {plr.Name} has rolled an 1/{displayer}! 🔥🔥🔥</font>`
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
game.ReplicatedStorage.ChatEvents.Chat.Global4:FireServer(displayer)
end
end)
GlobalChat (Script) inside ServerScriptService:
local m = game:GetService("MessagingService")
local r = game.ReplicatedStorage.ChatEvents.Chat
m:SubscribeAsync("GlobalChat", function(Message)
game.ReplicatedStorage.ChatEvents.Chat.GlobalMessages:FireAllClients(Message)
game.Lighting.TimeOfDay = "00:17:00"
wait(0.1)
game.Lighting.TimeOfDay = "00:22:00"
wait(0.15)
game.Lighting.TimeOfDay = "00:00:00"
wait(9.5)
game.Lighting.TimeOfDay = "00:04:00"
wait(0.15)
game.Lighting.TimeOfDay = "00:09:00"
wait(0.1)
game.Lighting.TimeOfDay = "12:00:00"
end)
r.Global1.OnServerEvent:Connect(function(plr, displayer)
local Message = `<font color="#FF0000">[🌎GLOBAL] {plr.Name} has rolled an 1/{displayer}! 🎉</font>`
m:PublishAsync("GlobalChat", Message)
end)
r.Global2.OnServerEvent:Connect(function(plr, displayer)
local Message = `<font color="#9D00FF">[🌎GLOBAL] {plr.Name} has rolled an 1/{displayer}! ✨</font>`
m:PublishAsync("GlobalChat", Message)
end)
r.Global3.OnServerEvent:Connect(function(plr, displayer)
local Message = `<font color="#98FB98">[🌎GLOBAL] OMG! {plr.Name} has rolled an 1/{displayer}!✨✨✨</font>`
m:PublishAsync("GlobalChat", Message)
end)
r.Global4.OnServerEvent:Connect(function(plr, displayer)
local Message = `<font color="#00FF00">[🌎GLOBAL] OMG! {plr.Name} has rolled an 1/{displayer}! 🔥🔥🔥</font>`
m:PublishAsync("GlobalChat", Message)
end)
``
Each player in the server gets sent the non-global message saying what odds somebody rolled. You then checked if they rolled lucky odds and if they did you send it to the server again. However, you are not passing the player’s name who rolled the extreme odds and are instead only using each player who received the first, non-global message, which is everyone in the server.
I would personally handle the lucky rolls on the server-side but if you wanted to keep it on the client-side, you would do so by passing in the plr value into the :FireServer():
-- LocalScript
game.ReplicatedStorage.ChatEvents.Chat.Global4:FireServer(plr, displayer)
-- Script
r.Global3.OnServerEvent:Connect(function(plr, playerWhoRolled, displayer)
local Message = `<font color="#98FB98">[🌎GLOBAL] OMG! {playerWhoRolled.Name} has rolled an 1/{displayer}!✨✨✨</font>`
m:PublishAsync("GlobalChat", Message)
end)
However, this does lead to the problem of multiple clients requesting that the server send this global message, meaning that it will show up multiple times if you don’t stop it from being sent more than once.
I would just handle the global check directly on the server-side using BindableEvents or in the same script.
-- Script
...
local global = --[[path to bindable event]]
if index >= 5000000 and index < 10000000 then
global:Fire(playerWhoRolled, displayer)
end
...
-- GlobalChat Script
global.Event:Connect(function(playerWhoRolled, displayer)
local Message = `<font color="#FF0000">[🌎GLOBAL] {plr.Name} has rolled an 1/{displayer}! 🎉</font>`
m:PublishAsync("GlobalChat", Message)
end)
I tried to do it how you just said (turning events to bindable), but now it only shows it in the server.
ChatRolling(Cilent):
local c = game.ReplicatedStorage.ChatEvents.Chat
local FormatNumber = require(game.Workspace.FormatNumber.Main)
local formatter = FormatNumber.NumberFormatter.with()
local m = game:GetService("MessagingService")
c.GlobalMessages.OnClientEvent:Connect(function(Message)
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message.Data)
end)
c.DonationEvent.OnClientEvent:Connect(function(plr)
if plr then
local Message = `<font color="#00ff00">[DONATION] {plr} has donated 10 Robux!</font>`
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
end
end)
c.Over1K.OnClientEvent:Connect(function(plr, index)
if index >= 1000 and index < 10000 then
local displayer = formatter:Format(index)
-- Gold hex code: #ffaa00
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)
-- Cyan hex code: #04AFEC
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)
-- Pink hex code: ##FF00BF
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)
-- Red hex code: #FF0000
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 -- GLOBAL MESSAGES START
local displayer = formatter:Format(index)
local Message = `<font color="#FF0000">{plr.Name} has rolled an 1/{displayer}! 🎉</font>`
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
game.ReplicatedStorage.ChatEvents.Chat.Global1:Fire(plr, displayer)
elseif index >= 10000000 and index < 100000000 then
local displayer = formatter:Format(index)
-- Purple hex code: #9D00FF
local Message = `<font color="#9D00FF">{plr.Name} has rolled an 1/{displayer}! ✨</font>`
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
game.ReplicatedStorage.ChatEvents.Chat.Global2:Fire(plr, displayer)
elseif index >= 100000000 and index < 1000000000 then
local displayer = formatter:Format(index)
-- Light Lime hex code: #98FB98
local Message = `<font color="#98FB98">OMG! {plr.Name} has rolled an 1/{displayer}!✨✨✨</font>`
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
game.ReplicatedStorage.ChatEvents.Chat.Global3:Fire(plr, displayer)
elseif index >= 1000000000 then
local displayer = formatter:Format(index)
-- Green hex code: #00FF00
local Message = `<font color="#00FF00">OMG! {plr.Name} has rolled an 1/{displayer}! 🔥🔥🔥</font>`
game.TextChatService.TextChannels.RBXGeneral:DisplaySystemMessage(Message)
game.ReplicatedStorage.ChatEvents.Chat.Global4:Fire(plr, displayer)
end
end)
GlobalChat(In serverscriptserivce)
local m = game:GetService("MessagingService")
local r = game.ReplicatedStorage.ChatEvents.Chat
m:SubscribeAsync("GlobalChat", function(Message)
game.ReplicatedStorage.ChatEvents.Chat.GlobalMessages:FireAllClients(Message)
game.Lighting.TimeOfDay = "00:17:00"
wait(0.1)
game.Lighting.TimeOfDay = "00:22:00"
wait(0.15)
game.Lighting.TimeOfDay = "00:00:00"
wait(19.5)
game.Lighting.TimeOfDay = "00:04:00"
wait(0.15)
game.Lighting.TimeOfDay = "00:09:00"
wait(0.1)
game.Lighting.TimeOfDay = "12:00:00"
end)
r.Global1.Event:Connect(function(playerWhoRolled, displayer)
print(displayer)
local Message = `<font color="#FF0000">[🌎GLOBAL] {playerWhoRolled.Name} has rolled an 1/{displayer}! 🎉</font>`
m:PublishAsync("GlobalChat", Message)
end)
r.Global2.Event:Connect(function(playerWhoRolled, displayer)
local Message = `<font color="#9D00FF">[🌎GLOBAL] {playerWhoRolled.Name} has rolled an 1/{displayer}! ✨</font>`
m:PublishAsync("GlobalChat", Message)
end)
r.Global3.Event:Connect(function(playerWhoRolled, displayer)
local Message = `<font color="#98FB98">[🌎GLOBAL] OMG! {playerWhoRolled.Name} has rolled an 1/{displayer}!✨✨✨</font>`
m:PublishAsync("GlobalChat", Message)
end)
r.Global4.Event:Connect(function(playerWhoRolled, displayer)
local Message = `<font color="#00FF00">[🌎GLOBAL] OMG! {playerWhoRolled.Name} has rolled an 1/{displayer}! 🔥🔥🔥</font>`
m:PublishAsync("GlobalChat", Message)
end)
I the above section, have you tried just doing a print(Message) to confirm 1. the data is recieved by the event listener and 2. that the message data is valid?
Your function should work OK and I see no fundamental issues with it, but I advised to check the basics first. Print is always your friend.
So I used print and narrowed it down to finding out that the game.ReplicatedStorage.ChatEvents.Chat.Global1:Fire(plr, displayer), global2, global3, and global4 never fire. I have no idea how to fix it, but thank you again if you try to help.
But that would imply that the if statement is never matching the values to fire the event. Have you double checked what is happening in that statement and that the associated event is firing:
I tried to print “plr” and the displayer before the fire. It prints what I was expecting, and the fire still never works
And that index was from the index[2] from another script
tbh it’s quick and easy. There are better ways to debug but putting breakpoints on scripts is tedious and using the monitor for variable values is also slower. print is my friend