Frostyh

Nameplates

Multi-line nametags on display entities: rows, conditions, animations, LuckPerms, PlaceholderAPI.

Price
$7.99
Runs on
Paper 1.21.11+, Java 21
Version
v1.2.0

Buy on BuiltByBitTry it liveRead the docs

Nameplates cover

In game

See it on a real server

5 screenshots and a short clip, all taken on a real server. Click a screenshot to see it full size.

Clip
Nameplates: lake rows
Nameplates: valley ranks
Nameplates: panel
Nameplates: rows editor
Nameplates: scene rows

01 / 06

Overview

Stack as many lines above a player's head as you want, each with its own text and condition

Vanilla gives you one line above a player's head, and a scoreboard team gives you a prefix on it. Nameplates gives you as many lines as you want, each one its own object with its own text, size, background, animation and the condition that decides whether it appears at all.

Built on Minecraft's own text display entities, so there is no packet library, no resource pack and nothing to break on the next update.

In short

  • As many rows as you want above every player
  • Each row has its own condition, size and animation
  • Built on display entities: no packet library, no resource pack
  • LuckPerms and PlaceholderAPI support
  • An editor in game
Latest version
1.2.0
Runs on
Paper or Purpur 1.21.11 (or newer 1.21.x), Java 21
What changed in 1.2.0
  • Fixed: LuckPerms prefixes, suffixes and group names written with & or § colour codes (including &#rrggbb hex) showed the codes as text above the head. They are now drawn in colour, and a bold or coloured prefix no longer spills onto the name after it. PlaceholderAPI values with colour codes are converted the same way.
  • Plates now go away while a player is invisible (potion), in spectator mode, or vanished by a vanish plugin (EssentialsX, SuperVanish, PremiumVanish and others that mark vanished players). Before, the plate floated on and gave the player away.
  • Sneaking players get a faint plate that does not show through walls, like the vanilla name. hide.sneaking can be dim, hide or none.
  • All of these are in the new hide: block in config.yml and on the Layout screen of /nameplates.
  • /plate is now remembered across relogs and restarts (stored in hidden-players.txt).
  • New permission nameplates.toggle (default: everyone) for /plate.
  • An existing config.yml does not get the hide: block written into it, but the new defaults apply anyway. Add the block by hand, or use the Layout screen, to change them.

Features

  1. 01What makes it different

    • Built on text display entities: no packet library and no resource pack
    • Every row has its own condition, permission, size and animation
    • LuckPerms prefix, suffix and group work without PlaceholderAPI installed
  2. 02What you get

    • New in v1.3.0: Hides when it should: plates go away for invisible, spectating and vanished players, and sneaking players get a faint plate like the vanilla name
    • New in v1.3.0: LuckPerms colour codes: & and hex codes in prefixes and suffixes are drawn in colour
    • New in v1.3.0: /plate remembered: a player's choice survives relogs and restarts
    • Rows: every line is a row in the config, stacked bottom to top, with its own scale and spacing
    • Conditions: a row appears only when its condition passes, for example a health row that shows up only when the player is hurt, or a badge that appears while a placeholder says so
    • Permissions per row: give a rank an extra line without touching the others
    • LuckPerms built in: {prefix}, {suffix}, {group} and {groupname} work with no PlaceholderAPI installed
    • PlaceholderAPI for everything else, refreshed on a timer you set
    • Animations: bob, pulse, wiggle and rainbow, per row, with a speed
    • Backgrounds: any ARGB colour, or none at all for floating text
    • See-through and shadow per row, and a view range so plates fade out at distance
    • The vanilla nametag is hidden automatically, so there is no doubled-up name
    • /plate lets a player hide their own, and nameplates.exempt keeps staff clean
    • Everything is MiniMessage: gradients, hex colours, bold, the lot
  3. 03How a row looks in the config

    rows:
      name:
        text: "{prefix}<white>{player}</white>{suffix}"
        scale: 1.0
        background: "#40000000"
      health:
        text: "<red>H</red> <white>{health}</white><gray>/{maxhealth}</gray>"
        scale: 0.7
        condition: "{health} < 20"      only while hurt
      rank:
        text: "<gradient:#ffd166:#ff7f50><bold>{groupname}</bold></gradient>"
        permission: "nameplates.row.rank"
        animate: pulse

    Conditions understand >, <, >=, <=, ==, !=, contains and startswith, on placeholders or plain text.

  4. 04The editor

    • /nameplates on its own opens a real Minecraft dialog window with every row in it
    • Open a row to edit its text and its permission in a field, switch the row off, step the scale and the gap, cycle the animation, and flip the shadow and see-through-walls switches
    • Every change is written to config.yml and the plates are rebuilt at once, so you watch the nameplate change above the heads while the window is still open
    • A layout screen holds the height, the line spacing, the view range and the vanilla nametag switch
    • menu: false puts the plain help line back

Installation

Requirements

Server
Paper, or a Paper fork such as Purpur. Spigot and CraftBukkit won't work, because it uses Paper-only APIs.
Minecraft
1.21.11 (or newer 1.21.x); plugin.yml api-version 1.21; built against Paper API 1.21.11
Java
21 or newer
Needs
No other plugin
Works with
PlaceholderAPI, LuckPerms, when installed

The listing also says:

  • LuckPerms and PlaceholderAPI are both optional
  • Display entities mean clients on 1.19.4+ see the plates
  • No DRM, no licence key and no licence server; the code is not obfuscated

Steps

  1. Download Nameplates.jar from BuiltByBit. There's no licence key to enter.
  2. Stop the server and put the jar in the plugins folder.
  3. Start the server. The plugin writes plugins/Nameplates/config.yml with the defaults listed under Configuration.
  4. Change config.yml to fit your server.
  5. Run /nameplates reload (reload the config and rebuild every plate) to apply your changes, or restart the server.

Setup guide

  1. Drop Nameplates.jar into /plugins and restart. The default config already shows a name row, a health row and a rank row.
  2. Edit the rows to your ranks and stats, then /nameplates reload.
  3. Use /nameplates preview to check the text without walking around.

SMP: name with the LuckPerms prefix, a health row that only appears when someone is hurt, a clan tag row driven by a placeholder.

RPG: a level row, a class row behind a permission, and a boss title that pulses.

PvP: a kill-streak row that only shows past three kills, and a rank row for donors.

Commands

Straight from plugin.yml. Where the permission column says "not set", plugin.yml puts no permission on the command itself; the nodes the plugin checks are under Permissions.

CommandAliasesUsageWhat it doesPermission
/nameplates/np/nameplates reload|refresh|rows|previewNameplates admin.not set
/platenone/plateHide or show your own nameplate.not set

Every subcommand

/plate                 Hide or show your own nameplate.
/nameplates reload     Reload the config and rebuild every plate.
/nameplates refresh    Rebuild every plate without reloading.
/nameplates rows       List the loaded rows.
/nameplates preview    Print your own rows in chat, for tuning text.

Permissions

From plugin.yml.

NodeDefaultWhat it allowsIncludes
nameplates.adminoperatorsReload and refresh.none
nameplates.toggleeveryoneUse /plate to hide or show your own nameplate.none
nameplates.exemptnobody until grantedNever gets a nameplate.none
nameplates.row.rankeveryoneShows the rank row from the default config.none

The listing also describes these groups and patterns:

  • nameplates.row.<id>: whatever you set on a row's permission

Placeholders

This plugin doesn't add any PlaceholderAPI placeholders.

If PlaceholderAPI is installed, it fills in other plugins' placeholders inside its own messages.

Configuration

The default files exactly as they ship in the jar, comments included. The plugin writes them to plugins/Nameplates/ the first time it starts.

config.yml

KeyDefaultThe comment above it
menutruebare /nameplates opens the editor instead of printing the help
update-ticks10how often the text is refreshed (20 = once a second)
base-height0.25how high the first row sits above the head
line-height0.28spacing between rows
mount-offset0none
view-range0.5how far away plates are visible (1.0 is about 64 blocks)
hide-vanilla-nametagtruenone
hidesection, 4 keysWhen a plate is taken down, so it never gives away a player who is meant to be hidden.
rowssection, 3 keysnone
themesection, 11 keysEvery message below is written against these names, not against hex codes: <accent>Open</accent> rather than <#4ad0c8>Open</#4ad0c8>. Change a colour here and it changes on every screen at once. Ordinary MiniMessage still works, so <gradient:#a:#b> and...
messagessection, 75 keysnone
review-remindertrueOne thank-you line with the BuiltByBit review link: once in the console after install and once in chat for the first operator who joins. It never repeats and sends nothing anywhere. false turns it off.
plugins/Nameplates/config.yml156 lines
# Nameplates - stacked nametags on display entities.
#
# Every row below is one line above the player's head, listed bottom to top. A row shows only when
# its permission and its condition both pass, so one config covers every rank.
#
# Text supports MiniMessage, {player} {world} {health} {maxhealth} {ping} {level},
# LuckPerms {prefix} {suffix} {group} {groupname}, and any PlaceholderAPI placeholder.

menu: true                # bare /nameplates opens the editor instead of printing the help
update-ticks: 10          # how often the text is refreshed (20 = once a second)
base-height: 0.25         # how high the first row sits above the head
line-height: 0.28         # spacing between rows
mount-offset: 0.0
view-range: 0.5           # how far away plates are visible (1.0 is about 64 blocks)
hide-vanilla-nametag: true

# When a plate is taken down, so it never gives away a player who is meant to be hidden.
hide:
  invisible: true         # while under an invisibility potion
  spectator: true         # while in spectator mode
  vanished: true          # while a vanish plugin hides them (EssentialsX, SuperVanish, PremiumVanish...)
  # While sneaking: dim (faint and not through walls, like the vanilla name), hide, or none.
  sneaking: dim

rows:
  name:
    enabled: true                   # a row can be switched off here or in the editor
    text: "{prefix}<white>{player}</white>{suffix}"
    scale: 1.0
    background: "#40000000"
    see-through: false
    shadow: false
    animate: none

  health:
    text: "<red>❤</red> <white>{health}</white><gray>/{maxhealth}</gray>"
    scale: 0.7
    gap: 0.02
    background: "#30000000"
    condition: "{health} < 20"      # only shows when they are hurt
    animate: none

  rank:
    text: "<gradient:#ffd166:#ff7f50><bold>{groupname}</bold></gradient>"
    scale: 0.8
    gap: 0.04
    background: none
    permission: "nameplates.row.rank"
    animate: pulse
    speed: 1.0

# ------------------------------------------------------------------------------------------------
# THEME
# ------------------------------------------------------------------------------------------------
# Every message below is written against these names, not against hex codes: <accent>Open</accent>
# rather than <#4ad0c8>Open</#4ad0c8>. Change a colour here and it changes on every screen at
# once. Ordinary MiniMessage still works, so <gradient:#a:#b> and <#ff0000> are fine anywhere.
theme:
  accent: "#4ad0c8"     # your colour: headings and anything the player is meant to click
  accent2: "#9be5e1"    # a lighter accent, for a second level of emphasis
  title: "#f4f7ff"      # screen titles
  text: "#c2ccdd"       # ordinary prose
  muted: "#6b7a94"      # hints, separators, anything the eye should skip
  value: "#ffffff"      # the numbers and names the player opened the screen to read
  good: "#57e08a"
  warn: "#ffc857"
  bad: "#ff6b6b"
  small-caps: false     # ᴇхᴀᴍᴘʟᴇ - a garnish; whole menus in it read badly
  # Real Minecraft item pictures beside the buttons and in the chest screens. Drawn from the
  # client's own textures, so there is nothing to install and no resource pack: it needs a
  # 1.21.9 or newer client, and older ones simply see the buttons as words.
  item-icons: true

messages:
  prefix: "<accent><bold>Plates</bold></accent> <muted>»</muted> "
  no-permission: "<bad>You cannot do that.</bad>"
  players-only: "<text>Players only.</text>"
  help: "<text>/nameplates reload · refresh · rows · preview  ·  /plate to hide your own</text>"
  reloaded: "<value>Reloaded {rows} row(s).</value>"
  refreshed: "<value>Every nameplate rebuilt.</value>"
  rows: "<text>Rows: </text><value>{list}</value>"
  own-hidden: "<text>Your nameplate is hidden.</text>"
  own-shown: "<text>Your nameplate is back.</text>"

  # The editor. Every line here is a screen title, a button label or a tooltip.
  menu-title: "<value>Nameplates</value>"
  menu-close: "<white><icon:close></white><text>Close</text>"
  menu-back: "<white><icon:back></white><text>Back</text>"
  menu-back-tip: "<text>Back to the screen before.</text>"
  menu-everyone: "everyone"
  menu-always: "always"
  menu-home-rows: "<text>Rows: </text><value>{on} on</value><text> of {count}</text>"
  menu-home-layout: "<text>Base {base} · line {line} · refresh every {ticks} ticks</text>"
  menu-rows: "<white><icon:layout></white><accent>Rows</accent>"
  menu-rows-tip: "<text>The lines above the head, bottom to top.</text>"
  menu-rows-title: "<value>Rows</value>"
  menu-rows-empty: "<text>No rows in the config.</text>"
  menu-row-line: "<text> - </text><value>{row}</value><text>: {text}</text>"
  menu-row-open-tip: "<text>Open the row {row}.</text>"
  menu-row-title: "<value>Row: {row}</value>"
  menu-row-preview: "<text>Text: </text>{text}"
  menu-row-facts: "<text>Scale {scale} · gap {gap} · {animate} · {permission} · {condition}</text>"
  menu-row-field-text: "<text>Text of this row</text>"
  menu-row-field-permission: "<text>Permission, empty for everyone</text>"
  menu-row-save: "<white><icon:yes></white><good>Save text and permission</good>"
  menu-row-save-tip: "<text>Write both fields to config.yml and rebuild the plates.</text>"
  menu-row-enabled: "<white><icon:yes></white>Row on"
  menu-row-enabled-tip: "<text>A row that is off never shows.</text>"
  menu-row-scale: "<white><icon:layout></white>Scale"
  menu-row-scale-tip: "<text>How big the line is.</text>"
  menu-row-gap: "<white><icon:layout></white>Gap"
  menu-row-gap-tip: "<text>Extra space above the row below.</text>"
  menu-row-animate: "<white><icon:fire></white><value>Animation: </value><accent>{animate}</accent>"
  menu-row-animate-tip: "<text>none, bob, pulse, wiggle, rainbow.</text>"
  menu-row-shadow: "<white><icon:layout></white>Shadow"
  menu-row-shadow-tip: "<text>Drop shadow behind the text.</text>"
  menu-row-see-through: "<white><icon:layout></white>See through walls"
  menu-row-see-through-tip: "<text>Show the row even behind blocks.</text>"
  menu-layout: "<white><icon:layout></white><accent>Layout</accent>"
  menu-layout-tip: "<text>Height, spacing and view range.</text>"
  menu-layout-title: "<value>Layout</value>"
  menu-layout-intro: "<text>Where the stack sits and how far away it can be seen.</text>"
  menu-layout-base: "<white><icon:layout></white>Height"
  menu-layout-base-tip: "<text>How high the first row sits above the head.</text>"
  menu-layout-line: "<white><icon:layout></white>Line spacing"
  menu-layout-line-tip: "<text>Distance between two rows.</text>"
  menu-layout-range: "<white><icon:layout></white>View range"
  menu-layout-range-tip: "<text>1.0 is about 64 blocks.</text>"
  menu-layout-vanilla: "<white><icon:layout></white>Hide vanilla nametag"
  menu-layout-vanilla-tip: "<text>Hide the plain name Minecraft draws itself.</text>"
  # The hide: switches on the layout screen.
  menu-hide-invisible: "Hide when invisible"
  menu-hide-invisible-tip: "<text>Take the plate down under an invisibility potion.</text>"
  menu-hide-spectator: "Hide in spectator"
  menu-hide-spectator-tip: "<text>Take the plate down in spectator mode.</text>"
  menu-hide-vanished: "Hide when vanished"
  menu-hide-vanished-tip: "<text>Take the plate down while a vanish plugin hides the player.</text>"
  menu-hide-sneaking: "<white><icon:layout></white><value>Sneaking: </value><accent>{mode}</accent>"
  menu-hide-sneaking-tip: "<text>none, dim (faint, not through walls) or hide.</text>"
  menu-preview: "<white><icon:layout></white><value>Preview mine</value>"
  menu-preview-tip: "<text>Print your own rows in chat.</text>"
  menu-mine-shown: "<good>■</good> <value>My plate is showing</value>"
  menu-mine-hidden: "<muted>■</muted> <text>My plate is hidden</text>"
  menu-mine-tip: "<text>Hide or show your own nameplate.</text>"
  menu-refresh: "<white><icon:reload></white><text>Rebuild all plates</text>"
  menu-refresh-tip: "<text>Tear every plate down and build it again.</text>"
  menu-reload: "<white><icon:reload></white><text>Reload config</text>"
  menu-reload-tip: "<text>Read config.yml again.</text>"
  switch-on: "<white><icon:yes></white><good><bold>ON</bold></good>  <value>{title}</value>"
  switch-off: "<white><icon:no></white><bad><bold>OFF</bold></bad> <text>{title}</text>"
  step-up: "<value>{title} +</value> <muted>({value})</muted>"
  step-down: "<value>{title} -</value> <muted>({value})</muted>"

# One thank-you line with the BuiltByBit review link: once in the console after install and once
# in chat for the first operator who joins. It never repeats and sends nothing anywhere. false turns it off.
review-reminder: true

Config guide

The short annotated version from the listing. If it and the files above disagree, the files are what actually ships.

update-ticks: 10       how often text is refreshed (20 = once a second)
base-height: 0.25      how high the first row sits
line-height: 0.28      spacing between rows
view-range: 0.5        1.0 is about 64 blocks
hide-vanilla-nametag: true
rows: ...              your lines

Text placeholders: {player} {world} {health} {maxhealth} {ping} {level} {prefix} {suffix} {group} {groupname}, plus every PlaceholderAPI placeholder.

FAQ

Which servers and versions does it run on?

It needs Paper or a Paper fork like Purpur, because it uses Paper-only APIs (the dialog API for its menus, Adventure text components). Spigot and CraftBukkit won't work. The listing says Minecraft 1.21.11 (or newer 1.21.x). plugin.yml declares api-version 1.21, the jar is built against Paper API 1.21.11, and it needs Java 21 or newer.

Does it need other plugins?

No, it runs without any other plugin (plugin.yml has no hard dependencies). Optional: PlaceholderAPI, LuckPerms (softdepend), used when it's there. The listing adds: LuckPerms and PlaceholderAPI are both optional.

How do I apply config changes?

Edit plugins/Nameplates/config.yml and run /nameplates reload (reload the config and rebuild every plate). Restarting works too.

Does it run on Folia, or for Bedrock players?

I haven't tested it on Folia, and plugin.yml doesn't declare folia-supported. I haven't tested Bedrock players through Geyser either.

Is there DRM or a licence key?

No. There is nothing to activate and no licence server to reach, and the code is not obfuscated.

How long does setup take?

Drop the jar into /plugins and restart. The setup guide above has 3 short steps.

Do vanished players give themselves away with their plate?

No. Plates hide for vanished players (EssentialsX, SuperVanish, PremiumVanish and others), for invisibility and in spectator mode.

Try it live

Play with it first

Nameplates runs on my public demo server, set up so you can use it yourself. Join, try it, then decide.

try.zeropvp.xyz:25570

Java Edition 1.21.11. In Minecraft: Multiplayer, Add Server, paste the address, Join. Type /demo go nameplates to land at its booth, or right-click the compass and pick it. The world resets every night.

Also mine

Run a Discord too?

ZeroBot is my Discord bot: moderation, tickets, welcome messages, logs, backups and raid protection, all set up from a web dashboard. It's free to add; Premium plans unlock more.

Its Minecraft Link connects your server to your Discord through the free ZeroBot Link plugin (coming to Modrinth soon): a live status card, a chat bridge, join and death lines, and account linking. Outgoing HTTPS only, no port to open.

See ZeroBot

Custom work

Need something that isn't here? I make custom Paper plugins, change these ones to fit your server, and do server setup and config work. Small plugins start at 50 EUR; bigger jobs get a quote.

How commissions work