I don't understand the Roblox Chat Filter even with the wiki. If anyone has the time, please sit down and help me with this code and explain filtering to me. The code below is my current chat script but it has more in the GUI, I just need to know how to add a Filter. I appreciate it!
local Chat = {
ChatColors = {
BrickColor.new("Bright red");
BrickColor.new("Bright blue");
BrickColor.new("White");
BrickColor.new("Bright violet");
BrickColor.new("Bright orange");
BrickColor.new("Bright yellow");
BrickColor.new("Light reddish violet");
BrickColor.new("Brick yellow");
};
Gui = nil;
Frame = nil;
RenderFrame = nil;
TapToChatLabel = nil;
ClickToChatButton = nil;
Templates = nil;
EventListener = nil;
MessageQueue = {};
Configuration = {
FontSize = Enum.FontSize.Size12;
NumFontSize = 12;
HistoryLength = 20;
Size = UDim2.new(0.38, 0, 0.20, 0);
MessageColor = Color3.new(1, 1, 1);
AdminMessageColor = Color3.new(1, 215/255, 0);
XScale = 0.025;
LifeTime = 45;
Position = UDim2.new(0, 2, 0.05, 0);
DefaultTweenSpeed = 0.15;
};
CachedSpaceStrings_List = {};
Messages_List = {};
MessageThread = nil;
TempSpaceLabel = nil;
}
function GetNameValue(pName)
local value = 0
for index = 1, #pName do
local cValue = string.byte(string.sub(pName, index, index))
local reverseIndex = #pName - index + 1
if #pName%2 == 1 then
reverseIndex = reverseIndex - 1
end
if reverseIndex%4 >= 2 then
cValue = -cValue
end
value = value + cValue
end
return value%8
end
function Chat:ComputeChatColor(pName)
return self.ChatColors[GetNameValue(pName) + 1].Color
end
function Chat:UpdateQueue(field, diff)
for i = #self.MessageQueue, 1, -1 do
if self.MessageQueue[i] then
for _, label in pairs(self.MessageQueue[i]) do
if label and type(label) ~= 'table' and type(label) ~= 'number' then
if label:IsA('TextLabel') or label:IsA('TextButton') then
if diff then
label.Position = label.Position - UDim2.new(0, 0, diff, 0)
else
if field == self.MessageQueue[i] then
label.Position = UDim2.new(self.Configuration.XScale, 0, label.Position.Y.Scale - field['Message'].Size.Y.Scale , 0)
Spawn(function()
wait(0.05)
while label.TextTransparency >= 0 do
label.TextTransparency = label.TextTransparency - 0.2
wait()
end
label.TextStrokeTransparency = (label == field['Message']) and .8 or 1
end)
else
label.Position = UDim2.new(self.Configuration.XScale, 0, label.Position.Y.Scale - field['Message'].Size.Y.Scale, 0)
end
if label.Position.Y.Scale < -0.01 then
label.Visible = false
label:Destroy()
end
end
end
end
end
end
end
end
function Chat:ComputeSpaceString(pLabel)
local nString = " "
if not self.TempSpaceLabel then
self.TempSpaceLabel = self.Templates.SpaceButton
self.TempSpaceLabel.Size = UDim2.new(0, pLabel.AbsoluteSize.X, 0, pLabel.AbsoluteSize.Y);
end
self.TempSpaceLabel.Text = nString
while self.TempSpaceLabel.TextBounds.X < pLabel.TextBounds.X do
nString = nString .. " "
self.TempSpaceLabel.Text = nString
end
nString = nString .. " "
self.CachedSpaceStrings_List[pLabel.Text] = nString
self.TempSpaceLabel.Text = ""
return nString
end
function Chat:UpdateChat(cPlayer, message)
local messageField = {['Player'] = cPlayer,['Message'] = message}
if coroutine.status(Chat.MessageThread) == 'dead' then
table.insert(Chat.Messages_List, messageField)
Chat.MessageThread = coroutine.create(function ()
for i = 1, #Chat.Messages_List do
local field = Chat.Messages_List[i]
Chat:CreateMessage(field['Player'], field['Message'])
end
Chat.Messages_List = {}
end)
coroutine.resume(Chat.MessageThread)
else
table.insert(Chat.Messages_List, messageField)
end
end
function Chat:CreateMessage(cPlayer, message)
local pName = cPlayer ~= nil and cPlayer.Name or 'GAME'
message = message:gsub("^%s*(.-)%s*$", "%1")
self.MessageQueue[#self.MessageQueue] = (#self.MessageQueue > self.Configuration.HistoryLength) and nil or self.MessageQueue[#self.MessageQueue]
local pLabel = self.Templates.pLabel:clone()
pLabel.Name = pName;
pLabel.Text = pName .. ":";
pLabel.Parent = self.RenderFrame;
pLabel.TextColor3 = (cPlayer.Neutral) and Chat:ComputeChatColor(pName) or cPlayer.TeamColor.Color
local nString = self.CachedSpaceStrings_List[pName] or Chat:ComputeSpaceString(pLabel)
local mLabel = self.Templates.mLabel:clone()
mLabel.Name = pName .. ' - message';
mLabel.TextColor3 = Chat.Configuration.MessageColor;
mLabel.Text = nString .. message;
mLabel.Parent = self.RenderFrame;
local heightField = mLabel.TextBounds.Y
mLabel.Size = UDim2.new(1, 0, heightField/self.RenderFrame.AbsoluteSize.Y, 0)
pLabel.Size = mLabel.Size
local yPixels = self.RenderFrame.AbsoluteSize.Y
local yFieldSize = mLabel.TextBounds.Y
local queueField = {}
queueField['Player'] = pLabel
queueField['Message'] = mLabel
queueField['SpawnTime'] = tick()
table.insert(self.MessageQueue, 1, queueField)
Chat:UpdateQueue(queueField)
end
function Chat:CreateChatBar()
self.ClickToChatButton = self.Gui:WaitForChild("ClickToChat")
self.ChatBar = self.Gui:WaitForChild("ChatBar")
self.ClickToChatButton.Visible = true
self.ChatBar.Visible = true
local mouse = game.Players.LocalPlayer:GetMouse()
mouse.KeyDown:connect(function (key)
if key == '/' then
self.ClickToChatButton.Visible = false
self.ChatBar:CaptureFocus()
end
end)
self.ClickToChatButton.MouseButton1Click:connect(function ()
self.ClickToChatButton.Visible = false
self.ChatBar:CaptureFocus()
end)
end
function Chat:PlayerChat(message)
local m = Instance.new("StringValue")
m.Name = "NewMessage"
m.Value = message
m.Parent = game.Players.LocalPlayer
game:GetService("Debris"):AddItem(m,2)
end
function Chat:CreateGui()
self.Gui = script.Parent
self.Frame = self.Gui:WaitForChild("ChatFrame")
self.RenderFrame = self.Frame:WaitForChild("ChatRenderFrame")
self.Templates = self.Gui:WaitForChild("Templates")
Chat:CreateChatBar()
self.ChatBar.FocusLost:connect(function(enterPressed)
if enterPressed and self.ChatBar.Text ~= "" then
local cText = self.ChatBar.Text
if string.sub(self.ChatBar.Text, 1, 1) == '%' then
cText = '(TEAM) ' .. string.sub(cText, 2, #cText)
end
Chat:PlayerChat(cText)
if self.ClickToChatButton then
self.ClickToChatButton.Visible = true
end
self.ChatBar.Text = ""
self.ClickToChatButton.Visible = true
end
end)
end
function Chat:TrackPlayerChats()
local function chatRegister(p)
p.ChildAdded:connect(function (obj)
if obj:IsA("StringValue") and obj.Name == "NewMessage" then
if game.Players.LocalPlayer.Neutral or p.TeamColor == game.Players.LocalPlayer.TeamColor then
Chat:UpdateChat(p, obj.Value)
end
end
end)
end
for _,v in pairs(game.Players:GetPlayers()) do
chatRegister(v)
end
game.Players.PlayerAdded:connect(chatRegister)
end
function Chat:CullThread()
Spawn(function ()
while true do
if #self.MessageQueue > 0 then
for _, field in pairs(self.MessageQueue) do
if field['SpawnTime'] and field['Player'] and field['Message'] and tick() - field['SpawnTime'] > self.Configuration.LifeTime then
field['Player'].Visible = false
field['Message'].Visible = false
end
end
end
wait(5)
end
end)
end
function Chat:Initialize()
Chat:CreateGui()
Chat:TrackPlayerChats()
self.MessageThread = coroutine.create(function () end)
coroutine.resume(self.MessageThread)
Chat:CullThread()
end
Chat:Initialize()
Oh, if you also find any errors in this or something that could make it better, please let me know! I appreciate it!

7 comments
I take no credit for this Chat GUI as it is a collaboration between me and another Scripter.
I would help you if I had studio but rn I can't use it , but your script is really long and not many people will be willing to help ....
http://wiki.roblox.com/index.php?title=Custom_chat_GUI
246 lines of code with no comments....
I understand, I guess.....
It should be Color3 instead of BrickColor as it is normally used for Parts only
Does not matter. Both of them will work just fine.