TabListDeluxe v1.6
This plugin can let you change player name color, prefix and suffix in the TAB list, even beyond original 16-character limit. You may also specify dead player's special format.
This plugin uses Vault to read your chat formatting and Protocollib for packets.
Spoiler: Developers: How do This Plugin Work?
It is just a little trick I discovered with Protocollib. Upon 1.8, clients receive player tab packets in JSON format, and there is no longer a length check of the player name. Changing the players' name in that JSON part will change their appearance in the player list. See this:
public void onPacketSending(PacketEvent event) {
if (event.getPacketType() == PacketType.Play.Server.PLAYER_INFO) {
PacketContainer packet = event.getPacket();
PlayerInfoAction act = packet.getPlayerInfoAction().read(0);
if (act == PlayerInfoAction.UPDATE_DISPLAY_NAME || act == PlayerInfoAction.ADD_PLAYER) {
List<PlayerInfoData> infoList = (List<PlayerInfoData>) packet.getPlayerInfoDataLists().read(0);
List<PlayerInfoData> newList = new ArrayList<PlayerInfoData>();
PlayerInfoData pid = (PlayerInfoData) infoList.get(0);
if (pid.getDisplayName() == null) return;
Player p = Bukkit.getPlayerExact(pid.getProfile().getName());
String pname = p.getDisplayName(); // This is the player name string example
pid.getDisplayName().setJson("{\"text\":\"" + pname + "\"}"); // This is how to set the player name in packet
for (int i = 0; i < infoList.size(); i++) {
pid = (PlayerInfoData) infoList.get(i);
newList.add(new PlayerInfoData(pid.getProfile(), pid.getPing(), pid.getGameMode(), pid.getDisplayName()));
}
packet.getPlayerInfoDataLists().write(0, newList);
event.setPacket(packet);
}
}
}
Code (Text):
public void onPacketSending(PacketEvent event) {
if (event.getPacketType() == PacketType.Play.Server.PLAYER_INFO) {
PacketContainer packet = event.getPacket();
PlayerInfoAction act = packet.getPlayerInfoAction().read(0);
if (act == PlayerInfoAction.UPDATE_DISPLAY_NAME || act == PlayerInfoAction.ADD_PLAYER) {
List<PlayerInfoData> infoList = (List<PlayerInfoData>) packet.getPlayerInfoDataLists().read(0);
List<PlayerInfoData> newList = new ArrayList<PlayerInfoData>();
PlayerInfoData pid = (PlayerInfoData) infoList.get(0);
if (pid.getDisplayName() == null) return;
Player p = Bukkit.getPlayerExact(pid.getProfile().getName());
String pname = p.getDisplayName(); // This is the player name string example
pid.getDisplayName().setJson("{\"text\":\"" + pname + "\"}"); // This is how to set the player name in packet
for (int i = 0; i < infoList.size(); i++) {
pid = (PlayerInfoData) infoList.get(i);
newList.add(new PlayerInfoData(pid.getProfile(), pid.getPing(), pid.getGameMode(), pid.getDisplayName()));
}
packet.getPlayerInfoDataLists().write(0, newList);
event.setPacket(packet);
}
}
}
Features:
- Change your Tab List header and footer.
- Header and footer in tab list has several placeholders, such as player name, time, day, and ping etc.
- Change the player names in Tab List. You may use Vault's prefix+suffix or bring your own. See configuration for more details.
- Dead player may appear as a special format. See image above.
Requirements & How to make it work:
You need those two plugins as dependency:
Vault and Protocollib
This plugin reads your prefix/suffix from vault, which should usually become your player's chat prefix/suffix already.
For instance, if a player "abc" already has a prefix of [ADMIN] on your server, this plugin will simply reads this. See configuration part for more information.
Protocollib is for packet handling.
Configuration:
Code (Text):
# *pre* prefix
# *suf* suffix
# *name* plain player name
# *dname* player's display name (such as essential's /nick name)
# Defines name to display
# There is no length limit of names!
# But seriously don't overdo it.
# Strip means to ignore all color from any sources, except this config itself.
# Remember to use & as a color char
normal: ' *pre**name**suf* '
normal-strip: false
dead: ' [DEAD] &7*pre**name**suf* '
dead-strip: true
# *suf* suffix
# *name* plain player name
# *dname* player's display name (such as essential's /nick name)
# Defines name to display
# There is no length limit of names!
# But seriously don't overdo it.
# Strip means to ignore all color from any sources, except this config itself.
# Remember to use & as a color char
normal: ' *pre**name**suf* '
normal-strip: false
dead: ' [DEAD] &7*pre**name**suf* '
dead-strip: true
Pro Tip: Add an extra space in the beginning of player's list name will make it look much better.
Commands:
- /chattab reload: reload current configuration
- chattab.admin: access to /chattab reload
I am not so creative. Why not leave a suggestion below?
Disclaimer:
- This plugin was made months ago, originally released as "ChatTab" as a premium resource. Since ideas are not protected in here, I took it down myself.
- This plugin used to be a private plugin for myself.
- This plugin is 100% original.
- My English is bad, don't get mad at me.

Use Permission:
When I have more free time I will make it open source on GitHub.
You are not allowed to redistribute it without my permission. Contact me using PM.
Quick facts
- Edition: Minecraft Java
- File type: .jar
- How to install: Install the matching mod loader (Forge, Fabric or NeoForge) for your Minecraft version. → Download the .jar. → Put it in the .minecraft/mods folder and launch that loader profile.
- Where to get it: Opens on Spigot — not every file is mirrored on our own servers.
Install steps are the general flow for this file type — How to install Minecraft Java mods & modpacks walks through it step by step.
TabListDeluxe (Originally ChatTab) [Abandoned] is a free Minecraft Java mod. Downloaded 4,300 times (via Spigot). Download it and open it directly in the game.