mc.pvpers.us
Online
← The Frontier Suite

FrontierEnderTracker

v1.0.0World

Who actually killed the dragon? Per-player damage credit, live sidebar and a ranked leaderboard for every Ender Dragon fight.

What it does

From the moment a dragon spawns, every hit a player lands is credited to them — melee, arrows, TNT and tamed pets are all traced back to the responsible player, and non-player damage (crystals, environment) is ignored.

A scoreboard sidebar shows the top contributors live during the fight; when the dragon dies the plugin broadcasts a ranked leaderboard with percentages (and a "Final blow" line if the killer wasn’t the top damager), updates lifetime stats, appends a JSON record to a fight log, and can run reward console commands for the top contributor(s). By default it counts *final* damage (after the dragon’s armor and effects) so the numbers reflect true contribution, and it is reload-safe: a dragon already alive when the plugin loads is adopted on the first hit.

Requires & integrates with

Required
Paper 26.2+, Java 25+
Optional
None.
Used by
None — its stats.yml and fights.jsonl are stable, readable files for outside tools.

Commands

/dragondmg also answers to /ddmg and /dragondamage.

CommandWhoWhat it does
/dragondmgEveryoneYour damage in the current fight, or in the last completed one (player only)
/dragondmg topEveryoneTop 10 for the current fight, or the last fight if none is running
/dragondmg stats [player]EveryoneLifetime total damage / fights joined / killing blows (defaults to you; console must name a player)
/dragondmg history [n]EveryoneLast n (1–20, default 5) logged fights: id, time, killer, top damager
/dragondmg resetAdminClear the current fight’s totals and drop the sidebar (does not touch stats.yml)
/dragondmg reloadAdminReload config.yml

Permissions

Player features default to true, staff features to op. Every node follows frontier.<plugin>.<action>, so a LuckPerms setup is e.g. lp group default permission set frontier.shop.use true. Wildcards work: frontier.reputation.*.

NodeDefaultGrants
frontier.endertracker.usetrue/dragondmg, top, history (base command node)
frontier.endertracker.statstrue/dragondmg stats
frontier.endertracker.adminop/dragondmg reset, /dragondmg reload

Config reference

File

plugins/FrontierEnderTracker/config.yml

To apply changes

/dragondmg reload — keys are read live; a running fight keeps its sidebar title until the next fight

KeyDefaultWhat it controls
use-final-damagetruetrue = damage after armor and effects (true contribution); false = raw pre-mitigation damage
show-sidebartrueLive scoreboard sidebar during a fight
sidebar-top-n5Rows shown on the sidebar (min 1)
sidebar-refresh-ticks20Sidebar refresh period in ticks (min 5); 20 = 1 s
sidebar-title'&5&lDragon Damage'Sidebar title (& colour codes)
broadcast-on-deathtrueRanked chat leaderboard when the dragon dies
show-percenttrueAppend each player’s share of total damage to the broadcast
reward-commands[]Console commands run for the top contributor(s); placeholders {player}, {rank}, {damage} (e.g. give {player} diamond 3)
reward-top-n1How many top players receive the reward commands
persist-statstrueWrite lifetime totals to stats.yml
storageyamlStorage backend; only yaml is implemented (sqlite is accepted but ignored)
log-fightstrueAppend a per-fight record to fights.jsonl on each dragon death
max-history200Trim fights.jsonl to this many lines (0 = unlimited)

Good to know

  • +During a fight the sidebar is set on every online player (not just those in the End) and any other plugin’s sidebar is overridden until the fight ends — set show-sidebar: false if another scoreboard plugin matters more.
  • +Only one dragon is tracked at a time; a second dragon (another End world, or a respawn while the first lives) is ignored until the active one dies or /dragondmg reset is run.
  • +stats.yml is <uuid>: {name, total, fights, kills}; fights.jsonl is one JSON object per line (id, time, world, killer, durationMs, total, ranked participants[]) — append-only, trimmed from the head.
  • +Both files are written on the main thread and history reads the whole log each call — fine at the default max-history, so don’t set it to 0 on a busy server.

Looking for something specific? Search the whole suite.