Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Custom chat script returns error. How can I fix this?

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

1 answer

✓ Accepted answer

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.

This discussion is preserved as it was. New answers, comments, and votes are closed.