Skip to content

Chat, scoreboard and settings

Configured in chat.yml, ui.yml and settings.yml.

Public chat

The public chat line is a template:

chat.yml
# The line everybody sees. Placeholders:
#
#   %player%    the player's name
#   %message%   what they said
#   %prefix%    their LuckPerms prefix, or nothing if LuckPerms is absent
#   %suffix%    their LuckPerms suffix, or nothing
#   %kills%     the kills-format below, or NOTHING when they have no kills -
#               a new player reading "[0]" beside their name is just noise
#
# %message% is substituted last, so a player typing "%player%" in chat does not
# get it expanded. And what they type is shown exactly as typed - their own "&c"
# stays the two characters "&c" - unless they hold hcfcore.chat.color (operators
# do by default). Colour and obfuscated text are the tools of spam and of lines
# dressed up as staff messages, so they are granted, not assumed. The same rule
# applies in team and ally chat.
format: "%kills%%prefix%{text}%player%%suffix%{dark}: {text}%message%"

# What %kills% expands to. %value% is the number. Separate from the template so
# the brackets and the colour can be changed - or the whole thing emptied - with
# no risk to the rest of the line. The trailing &r stops the prefix inheriting
# the bracket colour.
kills-format: "{dark}[{primary}%value%{dark}]&r "

which renders as the historic HCF format — [50] Rank Player: message:

  • %prefix% and %suffix% come from LuckPerms, read when the message is sent; empty without it.
  • %kills% is the player's kill count in kills-format — empty for a player with no kills, since a new player reading [0] beside their name is just noise.
  • %message% is substituted last, so a player typing %player% does not get it expanded. A format without %message% is refused when the file loads — it would silence the server without an error.

What a player types is shown as typed — their own &c stays the two characters &c — unless they hold hcfcore.chat.color (operators do). Colour and obfuscated text are the tools of spam and of lines dressed up as staff messages, so they are granted, not assumed. The same rule applies in team and ally chat, private messages, the staff channel and /broadcast.

Local chat: range-blocks above 0 makes public chat carry only that many blocks. 0 — the normal HCF setting — is the whole server. The console always receives every message.

enabled: false leaves chat exactly as the server renders it.

Team and ally chat

/team chat (alias c) cycles your channel: public → team → ally. /team chat team picks one directly. A player with no team talks in public rather than into the void.

Team and ally lines are also written to the console and the server log, with the team's name (log-team-chat) — a conversation staff cannot read back is a moderation problem. Staff chat wins over team chat: with both on, a staff member's lines go to staff.

Private messages

Command Aliases Does
/msg <player> <message> /tell, /w, /whisper, /m Private message
/reply <message> /r Answer the last one
/togglepm Turn private messages on or off
/ignore [player] Ignore a player, or list who you ignore
  • Someone who turned their messages off cannot send any either: a one-way conversation is worse than none.
  • Ignore lists last for the session only.
  • Vanished staff cannot be found by /msg, nor by name completion.

The look

Every message, menu, board and hologram follows one theme (theme.yml): eight colours by role — gold, cream, green for a success, red for a refusal... — a bold HCF » prefix on the announcements, titles in small capitals, menus framed in black panes with gold corners and their items centred inside, a ➥ between a scoreboard label and its value. Change a colour there, and the whole plugin follows — or design your own in the Theme Builder, which previews it live and writes the files.

Scoreboard

A flicker-free sidebar, redrawn once a second (update-ticks: 20). The board is a list of template lines in ui.yml, top to bottom:

ui.yml — the shipped rows
# The rows, top to bottom. A scoreboard shows at most 15; anything past that is
# never drawn, and you are told so in the console.
#
# A row whose placeholders all come out empty is DROPPED rather than left blank.
# That is how a conditional row works: %combat_line% is nothing while you are
# not in combat, so the row simply is not there. It is also why a server that
# does not run a module needs no edits here - its placeholders are just empty.
#
# Placeholders:
#   %player%        your name              %online%    players online
#   %world%         world you are in       %ping%      your ping
#   %team%          your team, or "None"   %territory% team owning your chunk
#   %dtr%           your team's DTR        %dtr_coloured%  the same, coloured,
#                                          with a marker when raidable
#   %dtr_max%       your team's maximum DTR, which grows with its size
#   %kills% %deaths% %kdr% %killstreak% %playtime%
#   %balance%       your balance, formatted
#   %focus_line%    who your team is focusing (online players first, then teams)
#   %rally_line%    your team's rally point, while it lasts
#   %combat%        combat tag left        %combat_line%   a whole ready-made row
#   %pearl%         ender pearl cooldown   %pearl_line%    a whole ready-made row
#   %cooldown_<id>% %cooldown_<id>_line%   an item cooldown of pvp.yml
#                   (item-cooldowns), by its id: %cooldown_notch-apple_line%
#   %deathban% %deathban_line%   always empty: a deathbanned player is not online to
#                   read a board. Kept so a file that lists them still renders.
#   %phase_line%    SOTW/EOTW row, empty when neither runs
#   %event_line%    the running KOTH/Citadel closest to being captured
#   %king_line%     the King and their time left, during Kill the King
#   %king_location_line%  where the King is, during Kill the King
#   %conquest_line% the running Conquest's leader and points
#   %conquest_zone_1% to %conquest_zone_4%   each Conquest zone's countdown
#   %dtc_line%      the running DTC: common health, or PER_TEAM's leader
#   %dtc_team_line% your own team's breaks in the running DTC, empty otherwise
#   %last_break_line%  the running Last Break's common health
#   %slide_line%    the running Slide's leader and points
#   %totem_line%    the running Totem: the team on its way, and how many blocks
#   %slide_top_1% to %slide_top_3%   the Slide's live top 3 teams
#   %timer_1% %timer_2% %timer_3%   the custom timers (/timer, /keyall), the
#                   one ending soonest first - each a whole ready-made row
#   %class_line%    your class, or the class warming up and its time left
#   %class_energy_line%  your class's energy, for a class that has some (Bard)
#   %archer_tag_line%    how long you stay archer-tagged
#   %class%         your class's name, empty in none
#
# The *_line placeholders are whole rows from lang/en.yml, so the wording is
# translated in one place rather than written twice here.
#
# A row starting with a tag - [team], [stats], [balance], [combat],
# [cooldowns], [class], [events], [timers] - belongs to that section of the
# scoreboard, which each player may hide in /settings (settings.yml,
# "scoreboard-<section>"). Tag a row as you like; an untagged row always shows.
lines:
  - "{dark}▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪"
  - "[team]{primary}Team {dark}{bullet} {secondary}%team%"
  - "[team]{primary}DTR {dark}{bullet} %dtr_coloured%"
  - "[stats]{primary}Kills {dark}{bullet} {secondary}%kills%"
  - "[stats]{primary}Streak {dark}{bullet} {secondary}%killstreak%"
  - "[balance]{primary}Balance {dark}{bullet} {success}%balance%"
  - "[team]%focus_line%"
  - "[team]%rally_line%"
  - "[combat]%combat_line%"
  - "[cooldowns]%pearl_line%"
  - "[cooldowns]%cooldown_notch-apple_line%"
  - "[cooldowns]%cooldown_golden-apple_line%"
  - "[cooldowns]%cooldown_chorus-fruit_line%"
  - "[cooldowns]%cooldown_totem_line%"
  - "[class]%class_line%"
  - "[class]%class_energy_line%"
  - "[class]%archer_tag_line%"
  - "[events]%phase_line%"
  - "[events]%event_line%"
  - "[events]%king_line%"
  - "[events]%king_location_line%"
  - "[events]%conquest_line%"
  - "[events]%conquest_zone_1%"
  - "[events]%conquest_zone_2%"
  - "[events]%conquest_zone_3%"
  - "[events]%conquest_zone_4%"
  - "[events]%dtc_line%"
  - "[events]%dtc_team_line%"
  - "[events]%last_break_line%"
  - "[events]%slide_line%"
  - "[events]%slide_top_1%"
  - "[events]%slide_top_2%"
  - "[events]%slide_top_3%"
  - "[events]%totem_line%"
  - "[timers]%timer_1%"
  - "[timers]%timer_2%"
  - "[timers]%timer_3%"
  - "{dark}▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪"
  - "{muted}play.yourserver.net"

Each row may carry a section tag — [team], [cooldowns]… — and each player can hide a section in /settings: the board is theirs to trim. The tags are yours to place in ui.yml.

A line whose placeholders all come out empty is dropped rather than left blank. That is how conditional lines work: %combat_line% is empty outside combat, so the line simply is not there — and why a server that does not run a module needs no edits: its placeholders are just empty. A scoreboard shows 15 lines at most; the console warns when more than 15 of yours are always shown.

Every placeholder is listed in Placeholders. The *_line placeholders are whole lines whose wording is in lang/en.yml under ui.scoreboard.

Tab list

Two styles, chosen by style in ui.yml:

  • hcf — the HCF grid. Four columns of twenty cells in place of the player list: your stats and where you stand, your team and its members (online first, ** the leader, * the co-leaders, + the officers), the server and running events, the teams with most points. Every cell is yours to write, with the scoreboard's placeholders and the tab list's own. A cell whose placeholders all come out empty is left blank, so the grid never shifts. Heads mark the headings and your team: an icon beside each category title — your own head beside Player Info, a chest beside Team, a question mark beside Server… — and each member's face beside their name. Every other cell shows a plain dark grey square, the classic HCF filler. Which cell shows which head is yours to choose. Nothing to install: HCFCore draws the grid itself, with the server's own tab list packets. Tab in the chat still completes the names of the players you can see, never the grid's cells.
  • classic — the player list. The real players, each written from a template: their LuckPerms prefix and suffix, their name, their team if you like; ordered by rank (the weight of their LuckPerms group), by kills or by name.
  • auto, as shipped: the grid on an HCF server, the classic list on a kitmap.

Each style has its own header and footer. Only what changed is sent again, once a second (update-ticks).

ui.yml — the HCF grid
hcf:
  header:
    - ""
    - "{primary}&lHCF"
    - ""
  footer:
    - ""
    - "{muted}play.yourserver.net"
    - ""
  # The connection bars every cell shows, in milliseconds: 0 is full bars,
  # below 0 is none.
  latency: 0
  # The default head - of every cell without a [head:...] of its own: the
  # "value" and "signature" of a Mojang texture, as mineskin.org gives them.
  # As shipped, a plain dark grey square (mineskin.org, "soju-tab-gray8").
  # Empty: the game's default head, the same one in every cell.
  skin:
    texture: "ewogICJ0aW1lc3RhbXAiIDogMTYyMTcwNTk1MDY4MCwKICAicHJvZmlsZUlkIiA6ICJjZGM5MzQ0NDAzODM0ZDdkYmRmOWUyMmVjZmM5MzBiZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJSYXdMb2JzdGVycyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS80ZDk5NDhkODUyNWQyNzU4YWY1YzFiNmJhMzIyZmZiMzgzM2Q5Nzk3NDUwMGQ0YTZhYTliZjkxODU4MjNlOGVjIgogICAgfQogIH0KfQ=="
    signature: "IoKU9gDR+OW5f4AKhJyU6v16kCr4Efu0+s4SRAUaFtcccSKVxjg8TKW35MbOFkOsEagzXgiRcxDFV3E5k7GEaSqVl/YxiWkJ3oxts+hcz5zKsLyOfb6uvefSfAkCLPdQOGS/XYU2jZCLsmxynUG33B7suf/uEsRobNoKbdYDAvqDiKYMkmLK8qJTMoQgQJqRTf31wJShTNLFcFkTr/NdfsPQQhRl9Ayf8VtbClEVEpxZRtgO2LwJtrIgRQezS6Ie4GHD5hBpgLe678UQHvcSnMZqurI0QU4afH4J4Frmv0LW9DTF3KaxEsHf5eQLNelUZ+ywY81Xjb8JBAf+HdmRuVRGd5Gjt13OYecItODhLcWsmh0f9PJZR7EwFdk/nBeCkAwgGXg9SgIt+S8GGbDfQqvrgBCHWvl/iGjSl2wIPRyUpjDHJ3p4+k5HMqTRVA6JY6rNutj+tpEGuVh2hvRLgzXdsEs67diJ3Bvdxi2mam3dtCR/BIxzG5lg8P1S5tiIIEnuiynjwPmprylSjU61L0BZj+o0xlIT3jEqLGZUlZq/8vZuydLDGSLO0Ims78HwlYo08n18lfSeMG7zpN3RSv7VkAf5mGus+IPeInzWFkZ6XDI0fzaYDeHj12o6AxmQxB9U6uCjVi/JAYffAByFc8+oD1+tBCjpfV257efV4Wk="
  # The columns, left to right, twenty cells each, top to bottom. A cell whose
  # placeholders all come out empty is left blank, so the grid never shifts.
  #
  # Every scoreboard placeholder works here, and these besides:
  #   %prefix% %suffix%       your LuckPerms prefix and suffix
  #   %x% %y% %z%             where you are          %direction%   N, NE, E...
  #   %location%              the claim you stand in, or the wilderness
  #   %team_name_line%        your team's name, or how to make one
  #   %members_online% %members_total% %team_balance% %team_points% %team_leader%
  #   %members_title%         the members heading, only with a team
  #   %member_1% to %member_20%   your team's members, online first
  #   %top_team_1% to %top_team_10%   the teams with most points
  #   %no_event_line%         a row saying nothing runs, when nothing does
  # The wording of the ready-made rows is in lang/en.yml, under ui.tab.
  #
  # A cell may start with the head it shows:
  #   [head:self]        your own head
  #   [head:member:3]    the head of %member_3%
  #   [head:top:1]       the head of %top_team_1%'s leader
  #   [head:MHF_Chest]   any Minecraft account's skin, by name - the MHF_
  #                      accounts are the classic icons: MHF_Chest, MHF_Question,
  #                      MHF_Exclamation, MHF_ArrowRight, MHF_Present1, MHF_TNT...
  #   [head:mineskin:<id>]  a skin of mineskin.org, by the id of its page - or the
  #                      page's link itself: [head:https://mineskin.org/skins/<id>]
  # Heads are asked of Mojang once and remembered; until then, and in a cell
  # that is blank, the default head shows.
  column-1:
    - ""
    - "[head:self]{primary}&lPlayer Info"
    - "{text}Kills {dark}{bullet} {secondary}%kills%"
    - "{text}Deaths {dark}{bullet} {secondary}%deaths%"
    - "{text}K/D {dark}{bullet} {secondary}%kdr%"
    - "{text}Streak {dark}{bullet} {secondary}%killstreak%"
    - "{text}Balance {dark}{bullet} {success}%balance%"
    - ""
    - "[head:MHF_ArrowRight]{primary}&lLocation"
    - "%location%"
    - "{secondary}%x%{muted}, {secondary}%z% {muted}(%direction%)"
    - ""
    - "%combat_line%"
    - "%pearl_line%"
    - "%class_line%"
    - "%class_energy_line%"
  column-2:
    - ""
    - "[head:MHF_Chest]{primary}&lTeam"
    - "%team_name_line%"
    - "{text}DTR {dark}{bullet} %dtr_coloured%"
    - "{text}Online {dark}{bullet} {secondary}%members_online%{muted}/{secondary}%members_total%"
    - "{text}Balance {dark}{bullet} {success}%team_balance%"
    - "{text}Points {dark}{bullet} {secondary}%team_points%"
    - ""
    - "[head:MHF_Villager]%members_title%"
    - "[head:member:1]%member_1%"
    - "[head:member:2]%member_2%"
    - "[head:member:3]%member_3%"
    - "[head:member:4]%member_4%"
    - "[head:member:5]%member_5%"
    - "[head:member:6]%member_6%"
    - "[head:member:7]%member_7%"
    - "[head:member:8]%member_8%"
    - "[head:member:9]%member_9%"
    - "[head:member:10]%member_10%"
    - "[head:member:11]%member_11%"
  column-3:
    - ""
    - "[head:MHF_Question]{primary}&lServer"
    - "{text}Online {dark}{bullet} {secondary}%online%"
    - "{text}Ping {dark}{bullet} {secondary}%ping%ms"
    - ""
    - "[head:MHF_Exclamation]{primary}&lEvents"
    - "%no_event_line%"
    - "%phase_line%"
    - "%event_line%"
    - "%king_line%"
    - "%conquest_line%"
    - "%dtc_line%"
    - "%last_break_line%"
    - "%slide_line%"
    - "%totem_line%"
    - "%timer_1%"
    - "%timer_2%"
    - "%timer_3%"
  column-4:
    - ""
    - "[head:MHF_Present1]{primary}&lTop Teams"
    - "%top_team_1%"
    - "%top_team_2%"
    - "%top_team_3%"
    - "%top_team_4%"
    - "%top_team_5%"
    - "%top_team_6%"
    - "%top_team_7%"
    - "%top_team_8%"
    - "%top_team_9%"
    - "%top_team_10%"
ui.yml — the classic list
classic:
  header:
    - ""
    - "{primary}&lKITMAP"
    - "{muted}Online {dark}{bullet} {secondary}%online%"
    - ""
  footer:
    - ""
    - "{muted}play.yourserver.net"
    - ""
  # How each player is written in the list. These are that player's own:
  #   %prefix% %suffix%   their LuckPerms prefix and suffix (empty without it)
  #   %player%            their name
  #   %team%              their team's name, empty without one
  #   %team_tag%          their team as a tag, from lang/en.yml (ui.tab.team-tag)
  #   %kills% %ping%
  name: "%prefix%{secondary}%player%%suffix%"
  # rank   the weight of their LuckPerms primary group, heaviest first
  # kills  most kills first
  # name   alphabetical, the game's own order
  sort: rank

enabled: false leaves the tab list as the game draws it. The Theme Builder previews both styles and writes the section for you.

Statistics and leaderboards

/stats [player]                                            # kills, deaths, K/D, killstreak, playtime
/leaderboard                                               # a window with every board; aliases /lb, /top10
/leaderboard [kills|deaths|kdr|killstreak|playtime|team-kills|team-points]   # one board in the chat

/leaderboard alone opens a window with every board at once — kills, deaths, K/D, best killstreak, playtime, and the teams' kills (their members' kills added up) and points — each item listing its top 10 (ui.yml, leaderboard-menu).

  • K/D of a player with no death is their number of kills, not infinity.
  • Playtime is accumulated session by session, and a shutdown closes every session before the final save.
  • Leaderboards break ties by name. For a leaderboard in the world, use a hologram.

Player settings

Each player can switch parts of the game off for themselves:

/settings                         # a menu: green is on, grey is off, click to toggle
/settings list
/settings <setting> [on|off]
/cobble [on|off]                  # the classic shortcut (alias /cobblestone)
Setting Controls
scoreboard The HCF scoreboard
private-messages /msg both ways — the same switch as /togglepm
tips The rotating tips of schedule.yml
cobblestone Picking up cobblestone (and cobbled deepslate), for mining without filling up
scoreboard-team · -stats · -balance · -combat · -cooldowns · -class · -events · -timers A section of the scoreboard: its team and DTR rows, statistics, balance, combat tag, pearl and item cooldowns, class, events, custom timers

Choices are stored, so they survive restarts. Removing a setting from settings.yml's offered list takes it away: it is then on for everybody. cobblestone.materials sets what the cobblestone switch leaves on the ground.