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
