How to Add Custom Player Icons to Chat

I can’t help you fix your script if you won’t provide it. If your code isn’t functioning the same way as mine, there must be a mistake somewhere. Try just using the free model and seeing if that works.

1 Like

So how would I add to the icons a roblox admin icon for example?

MY SCRIPT FOR THE EXTRADATAMODULE:

--	// Written by: Xsitsu
--	// Description: Module that sets some basic ExtraData such as name color, and chat color.

-- // Chat Icon Amendment by ChipioIndustries.
-- // Based on latest chat version as of 10/10/2019
-- // Edits on lines 32, 80, 110, 216

local SpecialChatColors = {
	Groups = {
		{
			--- ROBLOX Interns group
			GroupId = 2868472,
			Rank = 100,
			ChatColor = Color3.new(175/255, 221/255, 1),
		},
		{
			--- ROBLOX Admins group
			GroupId = 1200769,
			ChatColor = Color3.new(1, 215/255, 0),
		},
	},
	Players = {
		{
			--- Left as an example
			--  UserId = 2231221,
			--  ChatColor = Color3.new(205/255, 0, 0)
		}
	}
}

local SpecialChatIcons={
	Groups={
		{
			GroupId=7748598,
			Rank=254,
			Icons={"rbxasset://textures/ui/PlayerList/AdminIcon.png"},
		}
	},
	Players={
		{
			UserId= 2964877,94643687,42111501,1146407844,
			Icons= {"rbxasset://textures/ui/PlayerList/AdminIcon.png"},
		}
	}
}

local function MakeIsInGroup(groupId, requiredRank)
	assert(type(requiredRank) == "nil" or type(requiredRank) == "number", "requiredRank must be a number or nil")

	return function(player)
		if player and player.UserId then
			local userId = player.UserId

			local inGroup = false
			local success, err = pcall(function() -- Many things can error is the IsInGroup check
				if requiredRank then
					inGroup = player:GetRankInGroup(groupId) > requiredRank
				else
					inGroup = player:IsInGroup(groupId)
				end
			end)
			if not success and err then
				print("Error checking in group: " ..err)
			end

			return inGroup
		end

		return false
	end
end

local function ConstructIsInGroups()
	if SpecialChatColors.Groups then
		for _, group in pairs(SpecialChatColors.Groups) do
			group.IsInGroup = MakeIsInGroup(group.GroupId, group.Rank)
		end
	end
	if SpecialChatIcons.Groups then
		for _,group in pairs(SpecialChatIcons.Groups) do
			group.IsInGroup=MakeIsInGroup(group.GroupId,group.Rank)
		end
	end
end
ConstructIsInGroups()

local Players = game:GetService("Players")

local function GetSpecialChatColor(speakerName)
	if SpecialChatColors.Players then
		local playerFromSpeaker = Players:FindFirstChild(speakerName)
		if playerFromSpeaker then
			for _, player in pairs(SpecialChatColors.Players) do
				if playerFromSpeaker.UserId == player.UserId then
					return player.ChatColor
				end
			end
		end
	end
	if SpecialChatColors.Groups then
		for _, group in pairs(SpecialChatColors.Groups) do
			if group.IsInGroup(Players:FindFirstChild(speakerName)) then
				return group.ChatColor
			end
		end
	end
end

local function ProcessImageID(ID)
	if tonumber(ID) then
		return "rbxassetid://"..tostring(ID)
	else
		return ID
	end
end

local function GetSpecialChatIcons(speakerName)
	local chatIcons={}
	if SpecialChatIcons.Players then
		local playerFromSpeaker=Players:FindFirstChild(speakerName)
		if playerFromSpeaker then
			for _,player in pairs(SpecialChatIcons.Players) do
				if playerFromSpeaker.UserId==player.UserId then
					for __,icon in pairs(player.Icons) do
						table.insert(chatIcons,ProcessImageID(icon))
					end
				end
			end
		end
	end
	if SpecialChatColors.Groups then
		for _,group in pairs(SpecialChatIcons.Groups) do
			if group.IsInGroup(Players:FindFirstChild(speakerName)) then
				for __,icon in pairs(group.Icons) do
					table.insert(chatIcons,ProcessImageID(icon))
				end
			end
		end
	end
	return chatIcons
end

local function Run(ChatService)
	local NAME_COLORS =
	{
		Color3.new(253/255, 41/255, 67/255), -- BrickColor.new("Bright red").Color,
		Color3.new(1/255, 162/255, 255/255), -- BrickColor.new("Bright blue").Color,
		Color3.new(2/255, 184/255, 87/255), -- BrickColor.new("Earth green").Color,
		BrickColor.new("Bright violet").Color,
		BrickColor.new("Bright orange").Color,
		BrickColor.new("Bright yellow").Color,
		BrickColor.new("Light reddish violet").Color,
		BrickColor.new("Brick yellow").Color,
	}

	local 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
	end

	local color_offset = 0
	local function ComputeNameColor(pName)
		return NAME_COLORS[((GetNameValue(pName) + color_offset) % #NAME_COLORS) + 1]
	end

	local function GetNameColor(speaker)
		local player = speaker:GetPlayer()
		if player then
			if player.Team ~= nil then
				return player.TeamColor.Color
			end
		end
		return ComputeNameColor(speaker.Name)
	end

	local function onNewSpeaker(speakerName)
		local speaker = ChatService:GetSpeaker(speakerName)
		if not speaker:GetExtraData("NameColor") then
			speaker:SetExtraData("NameColor", GetNameColor(speaker))
		end
		if not speaker:GetExtraData("ChatColor") then
			local specialChatColor = GetSpecialChatColor(speakerName)
			if specialChatColor then
				speaker:SetExtraData("ChatColor", specialChatColor)
			end
		end
		if not speaker:GetExtraData("Tags") then
			--// Example of how you would set tags
			--[[
			local tags = {
				{
					TagText = "VIP",
					TagColor = Color3.new(1, 215/255, 0)
				},
				{
					TagText = "Alpha Tester",
					TagColor = Color3.new(205/255, 0, 0)
				}
			}
			speaker:SetExtraData("Tags", tags)
			]]
			speaker:SetExtraData("Tags", {})
		end
		if not speaker:GetExtraData("Icons") then
			local specialIcons=GetSpecialChatIcons(speakerName)
			if specialIcons then
				speaker:SetExtraData("Icons",specialIcons)
			end
		end
	end

	ChatService.SpeakerAdded:connect(onNewSpeaker)

	for _, speakerName in pairs(ChatService:GetSpeakerList()) do
		onNewSpeaker(speakerName)
	end

	local PlayerChangedConnections = {}
	Players.PlayerAdded:connect(function(player)
		local changedConn = player.Changed:connect(function(property)
			local speaker = ChatService:GetSpeaker(player.Name)
			if speaker then
				if property == "TeamColor" or property == "Neutral" or property == "Team" then
					speaker:SetExtraData("NameColor", GetNameColor(speaker))
				end
			end
		end)
		PlayerChangedConnections[player] = changedConn
	end)

	Players.PlayerRemoving:connect(function(player)
		local changedConn = PlayerChangedConnections[player]
		if changedConn then
			changedConn:Disconnect()
		end
		PlayerChangedConnections[player] = nil
	end)
end

return Run```

_______________________________________


The lines of code i'm trying to add it to is this one:

```Players={
		{
			UserId= 2964877,94643687,42111501,1146407844,
			Icons= {"rbxasset://textures/ui/PlayerList/AdminIcon.png"},
		}```

(also sorry for the red and stuff i've tried fixing it)
1 Like

If you’re asking how to add an icon for Roblox admins, you would add another entry to the Groups section of SpecialChatIcons using the admins group:

local SpecialChatIcons = {
	Groups = {
		{
			GroupId = 1200769;
			Icons = {}; --icon here
		}
	}
}
4 Likes

Alrighty, thanks! I’ll try that later.

How would I give players the Admin icon by UserId?

EXAMPLE:

UserId = 1,
Icon = {0},

Yeah, that’s how you’d do it. Just add it as an entry to the Players section of SpecialChatIcons.

1 Like

Great tutorial, thanks!! I’ve always tried to add in my own elements but was only restricted to text, now I can add icons!

what about the leaderboard? To identify if they are a moderator for a game?

1 Like

The default player leaderboard can’t be modified, unfortunately.

I’ve got it to work, thank you though.

is there any way to do this with the new chat system? and how?

I doubt it due to the fact you can’t fork the new chat directly. Roblox internally applies icons to players for example if you have the blue roblox verified badge it shows in the chat but I don’t think devs can apply them.

oh yeah, i forgot that the chat is part of the coregui now and not the normal playergui.

Can someone please make this work on the new chat.

Unfortunately the new chat can’t be modified.

1 Like

Why would Roblox do that? I don’t understand…

I recently saw the game SpongeBob Simulator implement a premium icon next to premium players names in chat. So there must be a way to do this!

1 Like

I believe they’re using this and adding the built-in Premium emoji as the prefix string.

How would I go about doing the same thing as them? Where can I find the built-in prefix string?