I made a custom chat for my game. When I use team test to test it, it returns an error saying "attempt to index local 'info' (a nil value)". The script that it is erroring from is localscript "ChatScriptLocal" in the ScreenGui object that contains the chat gui. I looked through it, and I can't tell exactly what is wrong with it.
Here is ChatScriptLocal:
--Made by AppleBLOXIAN --//Variabes local main = script.Parent:WaitForChild("Main") local chatframe = main:WaitForChild("Chat") local chatbox = main:WaitForChild("ChatBox") local sendbutton = main:WaitForChild("Send") local rep = game:GetService("ReplicatedStorage") local userinput = game:GetService("UserInputService") local serverchat = rep:WaitForChild("ServerChat") local chat = rep:WaitForChild("Chat") local adminchat = rep:WaitForChild("AdminChat") local settings = require(rep:WaitForChild("ChatSettings")) --//Functions function addchat(name,msg,isserver,isadmin,iscontinued) --Create message object local chatmsg = Instance.new("Frame",chatframe) chatmsg.Name = "ChatMsg" chatmsg.BackgroundColor3 = Color3.fromRGB(255,255,255) chatmsg.BackgroundTransparency = 1 chatmsg.Size = UDim2.new(1,0,0,15) if not isserver or iscontinued then local namelabel = Instance.new("TextLabel",chatmsg) namelabel.Name = "Name" namelabel.BackgroundColor3 = Color3.fromRGB(255,255,255) namelabel.BackgroundTransparency = 1 namelabel.Position = UDim2.new(0,0,0,0) namelabel.Font = Enum.Font.Arial namelabel.TextSize = 15 if isadmin then if not name == "AppleBLOXIAN" then namelabel.Text = "[Admin]" .. name .. ":" namelabel.TextColor3 = Color3.fromRGB(255,0,0) else namelabel.Text = "[Owner]" .. name .. ":" namelabel.TextColor3 = Color3.fromRGB(0,0,255) end else namelabel.Text = name .. ":" namelabel.TextColor3 = Color3.fromRGB(0,255,0) end namelabel.Size = UDim2.new(0,namelabel.TextBounds.X,0,15) local msglabel = Instance.new("TextLabel",chatmsg) msglabel.Name = "Message" msglabel.BackgroundTransparency = 1 msglabel.Position = UDim2.new(0,namelabel.TextBounds.X+2,0,0) msglabel.Size = UDim2.new(0,128,0,15) msglabel.Font = Enum.Font.Arial msglabel.Text = (function() local function isadmin(plr) for i,v in pairs(settings.Admins) do if plr.name == v then return true else return false end end end msglabel.Text = msg if msglabel.TextBounds.X > chatmsg.AbsoluteSize.X then addchat("",msg:sub(msglabel.TextBounds.X+1),false,isadmin(game.Players.LocalPlayer),true) msglabel.Text = "" return msg:sub(1,chatmsg.AbsoluteSize.X) else return msg end end)() msglabel.TextColor3 = Color3.fromRGB(0,0,0) msglabel.TextSize = 15 else if isserver then local msglabel = Instance.new("TextLabel",chatmsg) msglabel.Name = "Message" msglabel.BackgroundTransparency = 1 msglabel.Position = UDim2.new(0,0,0,0) msglabel.Size = UDim2.new(0,128,0,15) msglabel.Font = Enum.Font.Arial msglabel.Text = (function() local function isadmin(plr) for i,v in pairs(settings.Admins) do if plr.Name == v then return true else return false end end end msglabel.Text = msg if msglabel.TextBounds.X > chatmsg.AbsoluteSize.X then addchat("",msg:sub(msglabel.TextBounds.X+1),true,isadmin(game.Players.LocalPlayer),true) msglabel.Text = "" return msg:sub(1,chatmsg.AbsoluteSize.X) else return msg end end)() msglabel.TextColor3 = Color3.fromRGB(153,153,153) msglabel.TextSize = 15 else local msglabel = Instance.new("TextLabel",chatmsg) msglabel.Name = "Message" msglabel.BackgroundTransparency = 1 msglabel.Position = UDim2.new(0,0,0,0) msglabel.Size = UDim2.new(0,128,0,15) msglabel.Font = Enum.Font.Arial msglabel.Text = (function() local function isadmin(plr) for i,v in pairs(settings.Admins) do if plr.Name == v then return true else return false end end end msglabel.Text = msg if msglabel.TextBounds.X > chatmsg.AbsoluteSize.X then addchat("",msg:sub(msglabel.TextBounds.X+1),false,isadmin(game.Players.LocalPlayer),true) msglabel.Text = "" return msg:sub(1,chatmsg.AbsoluteSize.X) else return msg end end)() msglabel.TextColor3 = Color3.fromRGB(0,0,0) msglabel.TextSize = 15 end end --Push other messages chatmsg.Position = UDim2.new(0,0,0,chatframe.Size.Y.Offset) for i,v in pairs(chatframe:GetChildren()) do v:TweenPosition(v.Position - UDim2.new(0,0,0,15),"Out","Linear") if v.Position < 0 then v:Destroy() end end end function sendchat(msg) --Check if admin local function isadmin(plr) for i,v in pairs(settings.Admins) do if plr.Name == v then return true else return false end end end --Fire specific RemoteEvent for admin and non-admin accounts if isadmin(game.Players.LocalPlayer) then adminchat:FireServer(msg) else chat:FireServer(msg) end end function inputbegan(i,g) --End if game didnt process event if g then return end --Focus on chatbox if slash pressed, send message when enter pressed if i.KeyCode == Enum.KeyCode.Slash then if not chatbox:IsFocused() then chatbox:CaptureFocus() end elseif i.KeyCode == Enum.KeyCode.KeypadEnter then if chatbox:IsFocused() then if not chatbox.Text == "" then sendchat(chatbox.Text) chatbox.Text = "" end end end end function buttonclicked() --Spam prevention if not chatbox.Text == "" then sendchat(chatbox.Text) chatbox.Text = "" end end function onclientevent(info) --Check if admin local function isadmin(plr) for i,v in pairs(settings.Admins) do if plr.Name == v then return true else return false end end end --Check if server message if info.isserver then addchat("",info.message,true,false,false) else addchat(info.name,info.message,false,isadmin(info.sender),false) end end --//Connect events chat.OnClientEvent:connect(onclientevent()) adminchat.OnClientEvent:connect(onclientevent()) serverchat.OnClientEvent:connect(onclientevent()) sendbutton.MouseButton1Click:connect(buttonclicked()) userinput.InputBegan:connect(inputbegan()) --//Disable core gui game.StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Chat,false)
This is a server sided script used to post chat messages:
--Made by AppleBLOXIAN --//Variables local rep = game:GetService("ReplicatedStorage") local serverchat = rep:WaitForChild("ServerChat") local chat = rep:WaitForChild("Chat") local adminchat = rep:WaitForChild("AdminChat") local settings = require(rep:WaitForChild("ChatSettings")) --//Functions function postmessage(info) if info.isserver == true then serverchat:FireAllClients(info) elseif info.isadmin == true then adminchat:FireAllClients(info) else chat:FireAllClients(info) end end function onserverevent(plr,msg) --Check if admin local function isadmin(plr) for i,v in pairs(settings.Admins) do if plr.Name == v then return true else return false end end end --Post message postmessage({ sender = plr, name = plr.Name, message = msg, isserver = false, isadmin = isadmin(plr) }) end function onplayerjoined(plr) postmessage({ sender = "Server", name = "Server", message = plr .. " joined the game.", isserver = true, isadmin = false }) end function onplayerleft(plr) postmessage({ sender = "Server", name = "Server", message = plr .. " left the game.", isserver = true, isadmin = false }) end --//Connect events adminchat.OnServerEvent:connect(onserverevent) serverchat.OnServerEvent:connect(onserverevent) chat.OnServerEvent:connect(onserverevent) game.Players.PlayerAdded:connect(onplayerjoined) game.Players.PlayerRemoving:connect(onplayerleft)
This is a module containing settings for the chat:
local settings = { admins = {"AppleBLOXIAN","BlizzardBOY390","Cyrusthegreat2008","MythiicalPhoenix"}, banned = {}, msgonjoingame = true, msgonleftgame = true } return settings
I went through and it might be because your function onclientevent has a parameter call info that when called, wasn't provided a parameter so it errors at the first attempt to use it because the parameter is nil. The only time info is mentioned on the client script is on this event:
function onclientevent(info) -- Maybe you didn't provide the info this function needs. Line 185 --Check if admin local function isadmin(plr) for i,v in pairs(settings.Admins) do if plr.Name == v then return true else return false end end end --Check if server message if info.isserver then -- error probably occurs here, where info is first mentioned in the script. addchat("",info.message,true,false,false) else addchat(info.name,info.message,false,isadmin(info.sender),false) end end
There's also only one place onclientevent is called, which is here:
chat.OnClientEvent:connect(onclientevent()) -- Line 205 adminchat.OnClientEvent:connect(onclientevent()) serverchat.OnClientEvent:connect(onclientevent())
One of those must've called it, but they didn't provide parameters so info is nil. The if function tries to detect if info.isserver is true, but since info is nil, it errors because it isn't true, and it isn't false. You either add the info for the parameter info, or you find a way around it.