What SkillTrees does
SkillTrees gives every player two skill trees. Combatant grows from fighting. Voyager grows from exploring. Points turn into levels, levels pay out rewards, and a /profile menu shows all of it.
Combatant
Points for hits, kills, shield blocks, boss fights and fighting with a variety of weapons. Hit strength, target type and farm protection all change the payout.
Voyager
Points for mining blocks, entering new areas and biomes, visiting new dimensions, holding new items and spotting new mobs. Every block is priced in its own file.
Everything at a glance
- Levels 1 to 100 per tree, with a curve you set per tree (base, exponent, max level).
- Action bar feedback while you play. Mining and fighting show a running session total, then a summary when you stop.
- Level rewards per level: sounds, items (with names, lore, enchantments), money, console commands and LuckPerms permissions. Rewards can be reclaimed on a cooldown.
- /profile GUI with a configurable size, slot for every item, material for every state, glow per item, titles per window, and automatic paging.
- Leaderboards with
/skilltopand PlaceholderAPI placeholders. - Anti-abuse: spawner and egg penalties, a grinder limiter, PvP repeat cooldown, boss repeat decay, a placed-block filter for mining, and creative or world blocking.
- Storage in YAML files, SQLite or MySQL, with async loading and atomic saves.
- Every text and look is editable: five yaml files, MiniMessage colours, hex colours and gradients.
- Integrations: PlaceholderAPI, WorldGuard (region flag), Vault (money rewards), LuckPerms (permission rewards) and Folia-style scheduling.
Install and first start
One jar, no required dependencies. Drop it in, start the server and edit the files it creates.
| Requirement | Value |
|---|---|
| Server | Paper 26.3 (the plugin declares api-version: 26.3 and folia-supported: true) |
| Java | 25 |
| Optional plugins | LuckPerms, PlaceholderAPI, WorldGuard, Vault (declared as softdepend, so they load first when present) |
| Database drivers | SQLite and MySQL need the matching JDBC driver on the server. Paper ships common ones; if yours does not, stay on yaml storage. |
- Stop the server and put
SkillTrees.jarinplugins/. - Start the server. The plugin writes its files into
plugins/SkillTrees/. - Edit what you want, then run
/skilladmin reload. Storage, hook and autosave settings need a restart (see the tables). - Join, mine a block, and open
/profile.
Files the plugin creates
| File | Purpose |
|---|---|
config.yml | Points, level curves, anti-abuse, sessions, storage, hooks, leaderboard, multipliers. |
messages.yml | Every text the plugin shows: tree names and colours, action bar, chat, titles, GUI names and lore. |
rewards.yml | What each level gives. Layout is <tree>.<level>.<option>. |
gui.yml | Size, slots, materials, glow and window titles of the /profile menus, plus the progress bar style. |
voyager-blocks.yml | Voyager points per block for mining and for the first time a block type is used. |
playerdata/<uuid>.yml | Player data when storage.type is yaml. |
data.db | Player data when storage.type is sqlite. |
A missing file is recreated from the jar the next time the plugin starts. A missing key inside messages.yml falls back to the jar default, so you can delete lines you do not want to change.
Ten-minute tour
A guided path through the settings most servers change first.
Pick the pace
Edit levels.combatant and levels.voyager in config.yml. Use the level calculator below to see what a base and exponent mean in points. Lower base for a faster server.
Set event multipliers
multipliers.combatant and multipliers.voyager scale every award. Set 2.0 for a double points weekend and /skilladmin reload.
Add rewards
Open rewards.yml, copy a level block and change the items, money, commands or permissions. Players who already passed that level get it with /skilladmin claim all.
Make it yours
Change colours and wording in messages.yml and the menu layout in gui.yml. Every colour is a MiniMessage tag such as <#38bdf8>.
Protect the economy
Leave anti-farm on. Set settings.disabled-worlds for creative or event worlds, and use the WorldGuard flag skilltrees-points for single regions.
Check storage
Small servers can stay on yaml. Networks should use mysql so every server reads the same points. Changing the type needs a restart and does not move old data.
Points, levels and the curve
Each tree has its own point total. Your level is worked out from that total, so changing the curve later re-levels everyone on the next calculation without losing points.
The formula
Level 1 is where everyone starts and costs 0 points. To go from level n-1 to level n a player needs:
cost(n) = max(1, round(base * (n - 1) ^ exponent)) total points for level n = cost(2) + cost(3) + ... + cost(n)
With the defaults, Combatant uses base 100 and Voyager uses base 80, both with exponent 1.5 and max-level 100. An exponent of 1 makes every level cost the same. Higher exponents make late levels steeper. Max-level is a hard stop: points keep counting but the level does not rise.
A single award can jump several levels (a boss kill, for example). Every skipped level pays its reward, and the level-up message shows the jump as +N levels.
What happens on a level up
- A chat line with the old and new level (
level-up.chat) and a hint line (level-up.hint). - A title and subtitle (
level-up.title,level-up.subtitle), shown for about 2 seconds. - A sound: the toast sound when 3 or more levels are gained at once, the classic level-up sound otherwise. Turn this off with
settings.default-level-up-sound: falsewhen you only want sounds fromrewards.yml. - The rewards of every level reached (see Rewards).
- On milestone levels, a server broadcast (see below).
- A
SkillLevelUpEventfor other plugins (see Developer API).
Milestones
Every milestones.every levels (default 10) is a milestone. Milestone levels use their own GUI items and a ✦ tag in the title. When milestones.broadcast is true, reaching a milestone at or above milestones.min-level announces it to the whole server. Set every to 0 to switch milestones off.
Global multipliers
multipliers.<tree> multiplies every gameplay award after all other rules, rounded, with a minimum of 1 point. It applies to hits, kills, blocks, exploration and discoveries.
Who can earn points
- Spectators never earn. Creative players earn only if
settings.allow-creativeis true. - Nobody earns in worlds listed in
settings.disabled-worlds(use world folder names). - Nobody earns inside a WorldGuard region where the flag
skilltrees-pointsis set todeny.
Combatant tree
Every hit, kill and shield block pays points. The payout depends on how you fought, who you fought and whether the target came from a farm.
Hit points
A hit pays the base for its type, multiplied by the target modifiers, then rounded with a minimum of 1. Hits that deal less than combatant.min-damage (1.0) final damage pay nothing, so weak spam swings are ignored. Armor stands and yourself never count. Damage from thorns and other indirect sources is ignored.
| Hit type | Base points | How it is detected |
|---|---|---|
| Sweep hit | 1 | The extra targets of a sword sweep (damage cause ENTITY_SWEEP_ATTACK). |
| Normal hit | 2 | A standing melee hit that is not one of the types below. |
| Sprint hit | 3 | A melee hit while sprinting. |
| Critical hit | 5 | The vanilla critical conditions: falling, not on the ground, not sprinting, not climbing, swimming, riding or blinded. |
| Ranged hit | 3 | An arrow, crossbow bolt or trident that you shot or threw. Snowballs, eggs and other projectiles are ignored. |
| Mace smash | 8 | A mace hit after falling more than 1.5 blocks while not gliding. Checked before the critical rule. |
Target modifiers
- Players pay
hit.player-multiplier(x1.5). - Passive mobs (anything that is not hostile, such as cows and sheep) pay
hit.passive-multiplier(x0.25). Hostile means a vanillaEnemy, a boss, or a player. - Farm-spawned mobs (spawners, eggs, dispensers) multiply by
anti-farm.spawner-multiplier(x0.1). See Anti-abuse.
Weapon variety
The weapon you hold sorts into a style: sword, axe, spear, pickaxe, shovel, hoe, trident, mace, bow, crossbow, fishing rod, fist, or improvised:<item> for anything else (a stick, a fish, a block). Hits add bonus points on top of the hit payout:
- First use: the first time you ever hit with a style, +25 (
weapons.first-use). For an improvised item the bonus is +40 (weapons.improvised-first-use). The action bar names it, for example New Weapon Style: Mace. - Switching: using a style that is not among your last
weapons.recent-window(3) styles gives +4 (weapons.switch-bonus), at most once everyweapons.switch-cooldown-ms(3000 ms).
Kill points
Killing a regular mob pays kill.base (10) plus kill.per-max-health (1.0) times the victim's max health, capped at kill.max-regular (200). Passive mobs multiply by kill.passive-multiplier (0.25). Killing a player pays the flat kill.player (75).
Regular kills are also scaled by the farm multiplier and the grinder limiter (see Anti-abuse). Boss, player and override kills are not.
Bosses
Any entity listed under kill.overrides is a boss and pays its flat value. The defaults are Ender Dragon 6000, Wither 15000 (more than the Dragon), Warden 3000 and Elder Guardian 800. Add any entity type id to make it a boss; remove one to make it a normal mob.
- Everyone who damaged the boss gets the points, not only the killer. Damage is tracked from the first hit.
- Boss kills also send a chat line (
announcemessage) as well as the action bar text. - Repeat decay: with
kill.repeat-decay.enabled, each player's repeat kills of a listed boss paypoints / n(1st full, 2nd half, 3rd a third...). The kill count is stored per player. Other players keep their own full first kill. Default bosses:ender_dragon, wither.
Shield blocking
When a shield absorbs an attack that dealt at least block.min-raw-damage (1.0), the defender gets block.base (3) plus block.per-damage-blocked (1.0) per point of damage blocked, capped at block.max (25), at most once per block.cooldown-ms (1000 ms). Partial blocks count. Self damage never counts.
Minecraft does not expose a clean "shield blocked this" event. The plugin reads the blocking damage modifier and falls back to "the player is blocking and final damage is 0". It is reliable in normal play, but a future server change could affect it.
Voyager tree
Voyager pays for going places and seeing things for the first time, plus steady points for mining. Everything "new" is remembered per player, so each thing pays once.
Exploration
Position, biome and dimension are checked every second (starting 2 seconds after joining). One award combines everything new at that moment, for example New Biome: Cherry Grove + New Area.
- New area: the world is cut into squares of
exploration.region-sizeblocks (256, minimum 16). The first time you stand in a square, you earnnew-region(6). Squares are tracked per dimension. - New biome:
new-biome(40) the first time you stand in a biome. - New dimension:
new-dimension(100), or the value indimension-overrides. Defaults: normal 0, nether 150, the_end 300. Custom worlds use their lower-case world name as the key. A value of 0 pays nothing (the Overworld is free because everyone starts there).
Discoveries
- New item: the first time an item is anywhere in your inventory, armor, offhand or cursor (scanned every second). It pays
item-overrides.<id>ornew-item(10). Several items found in the same second combine into 3 New Items. - New mob: the first time a mob type is within
mob-scan-radius(32) blocks and in your line of sight (scanned every 2 seconds). It paysmob-overrides.<id>ornew-mob(20). Players and armor stands never count. - Ignored items: ids in
ignored-itemsnever count (command blocks, barriers, structure blocks and similar).
Items handed out by rewards.yml can themselves count as a "new item". If you give diamonds as a reward, add diamond to ignored-items or accept the small bonus.
Mining and blocks
Breaking a block pays its mining value from voyager-blocks.yml (default 1). The first time you break or place a type of block you also earn a first-time bonus (default 8, higher for ores). Both come from one award, shown on the action bar as Mining: Diamond Ore with a ✦ mark when a first-time bonus was included. See voyager-blocks.yml for every rule.
- Match order for one block: exact id, then wildcard (
*_ore), then block tag (logs,leaves), thendefault. The first match wins. - Player-placed blocks pay only
player-placed-multiplierof the mining value (default 0, so place-and-break farming gives nothing). The plugin remembers placed blocks inside each chunk's data, so it survives restarts. - Placed blocks are tracked even for creative players, so creative-placed blocks do not pay survival players later.
Action bar and sessions
The action bar tells players what they earned without flooding the chat. Mining and fighting use sessions: a running total that ends with a short summary.
Running total
While you keep mining or fighting, the action bar shows +184 · Diamond Ore: the points gathered so far in this session, then the block you just broke or the action you just did. Blocks that include a first-time bonus get a marker.
Summary line
After timeout-seconds (5) without a new gain, the session ends and shows Congrats! You mined 23 blocks and obtained 312 XP (Combatant: Nice fight! You scored 9 combat actions and obtained 120 XP).
Session rules
- One session per player and tree. Mining belongs to Voyager and combat (hits, kills, blocks, weapon bonuses) belongs to Combatant. Exploration and discoveries are not part of a session.
- Switch parts off independently with
session.miningandsession.combat, or everything withsession.enabled. session.summarychooses where the summary goes:actionbar,chat,bothornone.- Sessions need
settings.actionbar-feedback: true. - If a player leaves mid session, the session is dropped without a summary. The points are already saved.
Gains outside a session
- Shown as
+12 · Critical Hit(actionbarmessage). - Repeating the same thing shows only
+12(actionbar-compact). Afteractionbar-compact-reset-secondswithout it the full text returns. The default is 0: never go back. actionbar-min-gainhides awards below that many points (0 shows everything). Session gains always show the running total.- Boss kills additionally send a chat line (
announcemessage) because they are rare.
Anti-abuse
Every shortcut a player might try has a rule. All of them are configurable, and most can be switched off.
| Abuse | Rule | Where to change it |
|---|---|---|
| Spawner and egg farms | Mobs from the listed spawn reasons are tagged when they appear. Hits and regular kills on them pay x0.1. Bosses and players are not scaled. | anti-farm.reduced-spawn-reasons, anti-farm.spawner-multiplier |
| Mob grinders | After free-kills (20) regular kills inside window-seconds (60), further kills pay x0.25 until the window clears. | anti-farm.kill-rate.* |
| PvP boosting | Killing the same player again within victim-cooldown-seconds (600) pays nothing and sends anti-farm.pvp-cooldown. | anti-farm.pvp.victim-cooldown-seconds |
| Farming the same boss | A player's repeat kills of a listed boss pay points / n. | combatant.kill.repeat-decay.* |
| Weak swing spam | Hits under the minimum damage pay nothing. | combatant.min-damage |
| Shield spam | Block points have a cooldown and a cap. | combatant.block.* |
| Place and break mining | Player-placed blocks pay a fraction (default none). | voyager-blocks.yml player-placed-multiplier |
| Creative and test worlds | Creative and spectator do not earn, listed worlds do not earn. | settings.allow-creative, settings.disabled-worlds |
| Single regions | A WorldGuard region with skilltrees-points deny pays nothing. | WorldGuard flag |
Valid values for reduced-spawn-reasons are the names of Bukkit's CreatureSpawnEvent.SpawnReason, for example SPAWNER, TRIAL_SPAWNER, SPAWNER_EGG, DISPENSE_EGG, BREEDING, RAID. The tag is stored on the mob, so it survives restarts.
The /profile menu
Two screens. The main menu shows both trees. A tree view shows one item per level, with pages when there are more levels than slots.
Main menu
One item per tree (Combatant and Voyager) with level, points and a progress bar. Click one to open its levels. The title changes when you look at someone else: menu.title.own or menu.title.other.
Tree view
One item per level, in the order the slots are written. The tree opens on the page that holds your current level. Previous and next buttons appear only when there is another page.
Level states
Each level item is in one of four states, each with its own material, glow, title and lore. Milestone levels have a second set of four materials.
| State | Meaning | Default material | Lore shows |
|---|---|---|---|
locked | Not reached yet, and not the next level. | GRAY_DYE | Required total, points still missing, rewards. |
reached | You are past this level. | LIME_DYE | Cost of the level, rewards, and reclaim status when the reward is reclaimable. |
current | The level you are on. | tree-icon (a diamond sword or compass) | Your points, a progress bar to the next level, rewards. |
next | The next level to reach. | YELLOW_DYE | Points to go, percent bar, rewards. |
Buttons
- prev / next: page arrows. Hidden when there is no such page.
- back: returns to the main menu.
- summary: the tree item again, with extra counters. Combatant shows how many weapon styles you used. Voyager shows items, mobs, blocks, biomes and areas discovered.
Clicking a level
Clicking one of your own reached levels claims its reward again when that reward is reclaimable and off cooldown. Otherwise the plugin answers with the matching message (can only be claimed once, claim again in 1h 12m, reach this level first, this level has no reward). Viewing another player's profile never claims anything.
Looking at other players
/profile <player> works for online players and for offline players the server has seen before. Their data loads from storage in the background, so a short Loading profile... line may show first. Needs skilltrees.profile.others.
Live content and safety
- Menus cannot be taken from. Clicks, drags and shift-clicks are cancelled.
- After
/skilladmin reload, a menu that is already open keeps the old layout until it is reopened.
A single slot accepts a number, a range (10-16), a descending range (17-9) or a list mixing them. auto uses the default. A button always wins over a level on the same slot. Slots outside the inventory are skipped with a console warning. If no level slot is left, slot 0 is used.
Level rewards
A level can give a sound, items, money, console commands and permissions. Each level pays once per player, and can optionally be claimed again on a cooldown.
How rewards are paid
- Rewards are given when the level is reached. A multi-level jump pays every skipped level, but only the highest level's sound plays.
- If the inventory is full, extra items drop at the player's feet and
rewards.inventory-fullis sent. - Players who passed levels before a reward existed are paid with
/skilladmin claim <player|all>, or automatically on join withsettings.auto-claim-on-join: true. - Chat feedback per reward (
rewards.item-received,rewards.money-received) can be turned off withsettings.reward-messages: false. - Rewards are shown in the GUI lore automatically: items and money are listed by the plugin, and
displayadds your own lines for permissions or commands.
Reclaiming
With reclaimable: true, the player clicks that level in /profile and gets the items, money, commands and sound again. Permissions are never given twice. The first claim is the normal level-up payout and starts the cooldown clock for later claims.
cooldownsets how long the player waits between claims. The clock starts at the player's last claim.- The GUI lore shows Reclaimable every 12h, then Click to claim again or Claim again in 3h 20m.
| Unit | Meaning | Example |
|---|---|---|
Xs | Seconds | 30s |
Xm | Minutes | 15m |
Xh | Hours | 12h |
Xd | Real days | 7d |
Xmd | Minecraft days (1 day = 20 real minutes) | 2md = 40 real minutes |
Decimals work (1.5h). none or 0 means no cooldown. An unreadable value disables reclaiming for that level and prints a warning in the console.
Commands and permissions
Three commands. Tab completion offers trees, online players and sub-commands.
| Command | Aliases | Permission | What it does |
|---|---|---|---|
/profile | /skills | skilltrees.profile | Opens your main menu. |
/profile <combatant|voyager> | skilltrees.profile | Opens that tree directly, on the page of your current level. | |
/profile <player> [tree] | skilltrees.profile.others | Opens another player's menu, or one of their trees. Works for offline players the server has cached. | |
/skilltop [tree] | /sktop | skilltrees.top | Shows the leaderboard of both trees, or one tree. Shows a loading line until the first refresh finishes. |
/skilladmin reload | skilltrees.admin | Reloads config, messages, rewards, block points and the GUI layout. | |
/skilladmin add <player> <tree> <points> | skilltrees.admin | Adds points to an online player, as an Admin award (levels and rewards trigger). | |
/skilladmin set <player> <tree> <points> | skilltrees.admin | Sets the point total of an online player. Points must be a whole number, 0 or higher. | |
/skilladmin reset <player> | skilltrees.admin | Deletes all skill data of an online player: points, discoveries, boss kills and claim times. | |
/skilladmin claim <player|all> | skilltrees.admin | Pays every reward the player has reached but never received. all means everyone online. |
Permissions
| Permission | Default | Gives |
|---|---|---|
skilltrees.profile | everyone | /profile |
skilltrees.profile.others | everyone | Viewing other players with /profile <player> |
skilltrees.top | everyone | /skilltop |
skilltrees.admin | operators | /skilladmin, all sub-commands |
Take away skilltrees.profile.others in your permissions plugin if you want profiles to stay private.
Every yaml option
Five files, every key. Defaults come straight from the files that ship with the plugin. Type in the box to search across all five.
The main file. /skilladmin reload applies everything except the options marked needs a restart. Points are whole numbers; decimals are rounded.
| Option | Type | Default | What it does |
|---|---|---|---|
| settings | |||
settings.allow-creative | boolean | false | Creative players earn points only when true. Spectators never earn. |
settings.disabled-worlds | list of world names | [] | No points in these worlds. Use the world folder names, case-insensitive. |
settings.actionbar-feedback | boolean | true | Show the action bar on gains. Sessions need this on. |
settings.actionbar-min-gain | whole number | 0 | Hide non-session awards below this many points. 0 shows all. |
settings.actionbar-compact-reset-seconds | seconds | 0 | Repeats show only +N. After this many quiet seconds the full text shows again. 0 = never. |
settings.session.enabled | boolean | true | Master switch for mining and combat sessions. |
settings.session.timeout-seconds | seconds | 5 | Seconds without a gain before a session ends and the summary shows. |
settings.session.mining | boolean | true | Voyager block mining uses sessions. |
settings.session.combat | boolean | true | Combatant hits, kills and blocks use sessions. |
settings.session.summary | <code>actionbar</code> | <code>chat</code> | <code>both</code> | <code>none</code> | actionbar | Where the end-of-session summary is shown. |
settings.autosave-minutes | minutes | 5 | How often online players are saved. Players are also saved on quit and on shutdown. needs a restart |
settings.default-level-up-sound | boolean | true | Play the built-in level-up sound. Set false if you only want reward sounds. |
settings.reward-messages | boolean | true | Send a chat line for each reward received. |
settings.auto-claim-on-join | boolean | false | On join, pay rewards for levels passed before those rewards existed. |
| hooks | |||
hooks.worldguard | boolean | true | Registers the region flag skilltrees-points. Set it to deny in a region to stop points there. needs a restart |
hooks.placeholderapi | boolean | true | Registers the %skilltrees_...% placeholders. needs a restart |
hooks.vault | boolean | true | Lets money rewards pay through your economy plugin. needs a restart |
| storage | |||
storage.type | <code>yaml</code> | <code>sqlite</code> | <code>mysql</code> | yaml | Where player data lives. Existing data is not converted when you change it. If the chosen backend cannot start, the plugin falls back to YAML and logs an error. needs a restart |
storage.table-prefix | text | skilltrees_ | Prefix for the SQL table. The table is <prefix>players. needs a restart |
storage.mysql.host | text | localhost | MySQL host. needs a restart |
storage.mysql.port | number | 3306 | MySQL port. needs a restart |
storage.mysql.database | text | minecraft | Database name. needs a restart |
storage.mysql.username | text | root | Database user. needs a restart |
storage.mysql.password | text | "" | Database password. needs a restart |
storage.mysql.use-ssl | boolean | false | Use SSL for the connection. needs a restart |
| leaderboard | |||
leaderboard.top-size | whole number | 10 | How many players /skilltop and the top placeholders list (minimum 1). |
leaderboard.refresh-seconds | seconds | 120 | How often the leaderboard is rebuilt from storage (minimum 10). needs a restart |
| milestones | |||
milestones.every | whole number | 10 | Every Nth level is a milestone with special GUI items. 0 = off. |
milestones.broadcast | boolean | true | Announce milestone levels to the whole server. |
milestones.min-level | level | 10 | Do not broadcast milestones below this level. |
| multipliers | |||
multipliers.combatant | decimal | 1.0 | Multiplies every Combatant award. 2.0 = double points. |
multipliers.voyager | decimal | 1.0 | Multiplies every Voyager award. |
| levels | |||
levels.combatant.max-level | level | 100 | Highest Combatant level. Points still count after it. |
levels.combatant.base | number | 100 | Curve scale for Combatant: points for level 2 equal base. |
levels.combatant.exponent | decimal | 1.5 | Curve steepness for Combatant. 1 = every level costs the same. |
levels.voyager.max-level | level | 100 | Highest Voyager level. Points still count after it. |
levels.voyager.base | number | 80 | Curve scale for Voyager: points for level 2 equal base. |
levels.voyager.exponent | decimal | 1.5 | Curve steepness for Voyager. 1 = every level costs the same. |
| anti-farm | |||
anti-farm.reduced-spawn-reasons | list of spawn reasons | [SPAWNER, TRIAL_SPAWNER, SPAWNER_EGG, DISPENSE_EGG] | Mobs that appear through these reasons are tagged and pay reduced points. |
anti-farm.spawner-multiplier | decimal | 0.1 | Multiplier for hits and regular kills on tagged mobs. |
anti-farm.kill-rate.enabled | boolean | true | Switch the grinder limiter on or off. |
anti-farm.kill-rate.window-seconds | seconds | 60 | Length of the rolling window. |
anti-farm.kill-rate.free-kills | whole number | 20 | Kills inside the window that pay full points. |
anti-farm.kill-rate.over-limit-multiplier | decimal | 0.25 | Multiplier for kills beyond the free kills. |
anti-farm.pvp.victim-cooldown-seconds | seconds | 600 | Killing the same player again within this time pays nothing. |
| combatant | |||
combatant.min-damage | decimal | 1.0 | Hits that deal less final damage than this pay nothing. |
combatant.hit.sweep | points | 1 | Sword sweep hit. |
combatant.hit.normal | points | 2 | Standing melee hit. |
combatant.hit.sprint | points | 3 | Melee hit while sprinting. |
combatant.hit.critical | points | 5 | Vanilla critical hit. |
combatant.hit.ranged | points | 3 | Arrow, crossbow or trident hit. |
combatant.hit.mace-smash | points | 8 | Mace hit after a real fall. |
combatant.hit.player-multiplier | decimal | 1.5 | Multiplier when the target is a player. |
combatant.hit.passive-multiplier | decimal | 0.25 | Multiplier when the target is not hostile (cows, sheep and so on). |
combatant.kill.base | points | 10 | Flat part of a regular kill. |
combatant.kill.per-max-health | decimal | 1.0 | Added per point of victim max health. |
combatant.kill.max-regular | points | 200 | Cap for non-boss kills before multipliers. |
combatant.kill.player | points | 75 | Flat points for killing a player. |
combatant.kill.passive-multiplier | decimal | 0.25 | Multiplier for killing a non-hostile mob. |
combatant.kill.overrides | map: entity id to points | {ender_dragon: 6000, wither: 15000, warden: 3000, elder_guardian: 800} | Flat kill points per entity type. Every entry is also a boss: all players who damaged it are paid. Remove an entry to make the mob normal again. |
combatant.kill.repeat-decay.enabled | boolean | true | Repeat kills of listed bosses by the same player pay points / n. |
combatant.kill.repeat-decay.bosses | list of entity ids | [ender_dragon, wither] | Bosses the decay applies to. |
combatant.block.base | points | 3 | Flat part of a shield block. |
combatant.block.per-damage-blocked | decimal | 1.0 | Added per point of damage the shield absorbed. |
combatant.block.max | points | 25 | Cap for one block award. |
combatant.block.min-raw-damage | decimal | 1.0 | Attacks absorbing less than this pay nothing. |
combatant.block.cooldown-ms | milliseconds | 1000 | Minimum time between block awards per player. |
combatant.weapons.first-use | points | 25 | Bonus the first time you hit with a weapon style. |
combatant.weapons.improvised-first-use | points | 40 | Bonus the first time you hit with a non-weapon item. |
combatant.weapons.switch-bonus | points | 4 | Bonus for switching to a style not used recently. |
combatant.weapons.recent-window | whole number | 3 | How many of your latest styles count as "recent". |
combatant.weapons.switch-cooldown-ms | milliseconds | 3000 | Minimum time between switch bonuses. |
| voyager | |||
voyager.exploration.region-size | blocks | 256 | Side length of an exploration square (minimum 16). |
voyager.exploration.new-region | points | 6 | Points for the first visit to a square. |
voyager.exploration.new-biome | points | 40 | Points for the first visit to a biome. |
voyager.exploration.new-dimension | points | 100 | Default points for a new dimension. |
voyager.exploration.dimension-overrides | map: dimension to points | {normal: 0, nether: 150, the_end: 300} | Per dimension. Keys: normal, nether, the_end, or a custom world's lower-case name. 0 pays nothing. |
voyager.discovery.new-item | points | 10 | Default points for holding an item for the first time. |
voyager.discovery.new-mob | points | 20 | Default points for seeing a mob type for the first time. |
voyager.discovery.mob-scan-radius | blocks | 32 | How close, and in line of sight, a mob must be to be discovered. |
voyager.discovery.item-overrides | map: item id to points | {diamond: 40, emerald: 30, netherite_ingot: 100, netherite_scrap: 60, elytra: 150, nether_star: 200, totem_of_undying: 80, enchanted_golden_apple: 120, heart_of_the_sea: 100, dragon_egg: 500, dragon_head: 150, trident: 80, mace: 120, beacon: 150} | Points for specific items. Ids are Minecraft ids without the namespace. |
voyager.discovery.mob-overrides | map: entity id to points | {ender_dragon: 300, wither: 400, warden: 250, elder_guardian: 150, evoker: 60, ravager: 60} | Points for specific mobs. |
voyager.discovery.ignored-items | list of item ids | [command_block, chain_command_block, repeating_command_block, command_block_minecart, barrier, light, structure_block, structure_void, jigsaw, debug_stick, knowledge_book, test_block, test_instance_block] | Items that never count as discoveries. |
# --------------------------------------------------------------- # SkillTrees configuration (/skilladmin reload applies most changes) # Texts live in messages.yml, level rewards in rewards.yml, block points in voyager-blocks.yml, # the /profile GUI layout in gui.yml. # --------------------------------------------------------------- settings: # Creative players never earn points unless this is true. Spectators never earn. allow-creative: false # No points are earned in these worlds (world folder names) disabled-worlds: [] # Show "+X points | reason" on the action bar actionbar-feedback: true # Only show the action bar for awards of at least this many points (0 = show every gain). # (Not used for session gains, they always show the running total.) actionbar-min-gain: 0 # For gains that are not part of a session (exploration, discoveries, or everything when sessions are off): # repeating the same thing shows just "+N". After this many seconds without it, the full text # is shown again (0 = never go back to the full text) actionbar-compact-reset-seconds: 0 # SESSIONS: while you keep mining (Voyager) or fighting (Combatant), the action bar shows the running # total of the session plus the block / action you just did, instead of "+N" every time. # When you stop, a summary ("Congrats! You mined n blocks and obtained r XP") is shown. # Texts are in messages.yml (session.*). Needs actionbar-feedback: true. session: enabled: true timeout-seconds: 5 # stop for this long and the session ends (1 mined dirt every 2s = one session) mining: true # Voyager: block mining sessions combat: true # Combatant: hits, kills, blocks... summary: actionbar # actionbar | chat | both | none autosave-minutes: 5 # Play the built-in level-up sound (set false if you only want sounds from rewards.yml) default-level-up-sound: true # Chat line for each reward received reward-messages: true # On join, hand out rewards for levels the player passed before rewards existed auto-claim-on-join: false hooks: # Registers the region flag "skilltrees-points" (set it to deny in a region = no points there) worldguard: true placeholderapi: true vault: true storage: type: yaml # yaml | sqlite | mysql (needs a restart to change) table-prefix: skilltrees_ mysql: host: localhost port: 3306 database: minecraft username: root password: "" use-ssl: false leaderboard: top-size: 10 refresh-seconds: 120 milestones: every: 10 # every Nth level gets special GUI items (0 = off) broadcast: true # announce milestone levels to the whole server min-level: 10 # don't broadcast below this level # Global multipliers per tree (handy for events: 2.0 = double points) multipliers: combatant: 1.0 voyager: 1.0 # Level curve. Level 1 is the starting level (0 points). # Points needed to go from level (n-1) to level n = round(base * (n-1) ^ exponent) levels: combatant: max-level: 100 base: 100 exponent: 1.5 voyager: max-level: 100 base: 80 exponent: 1.5 # GUI size, slots, materials and glow are in gui.yml # --------------------------------------------------------------- # ANTI-ABUSE # --------------------------------------------------------------- anti-farm: # Mobs that appeared via these spawn reasons give reduced points (hits and kills) reduced-spawn-reasons: [SPAWNER, TRIAL_SPAWNER, SPAWNER_EGG, DISPENSE_EGG] spawner-multiplier: 0.1 # Grinder limiter: after "free-kills" kills inside the window, further kills are scaled down kill-rate: enabled: true window-seconds: 60 free-kills: 20 over-limit-multiplier: 0.25 pvp: # The same player killing the same victim again within this time gives no points victim-cooldown-seconds: 600 # --------------------------------------------------------------- # COMBATANT # --------------------------------------------------------------- combatant: # Hits dealing less final damage than this give nothing (stops weak spam swings) min-damage: 1.0 hit: sweep: 1 # least normal: 2 sprint: 3 # medium critical: 5 # most ranged: 3 # arrow / crossbow / trident hits mace-smash: 8 # mace hit after a real fall player-multiplier: 1.5 # hitting another player passive-multiplier: 0.25 # hitting non-hostile mobs (cows, sheep...) kill: base: 10 per-max-health: 1.0 # + this * victim max health max-regular: 200 # cap for non-boss mobs player: 75 passive-multiplier: 0.25 # Entity type -> flat points. Presence of an entry marks it as a boss: # every player who damaged it receives the points, not just the killer. overrides: ender_dragon: 6000 wither: 15000 # larger than the Ender Dragon warden: 3000 elder_guardian: 800 # Repeat kills by the SAME player: 1st kill = full, 2nd = x/2, 3rd = x/3, 4th = x/4 ... # Other players fighting the same boss still get their own full first-kill points. repeat-decay: enabled: true bosses: [ender_dragon, wither] block: # shield blocking base: 3 per-damage-blocked: 1.0 max: 25 min-raw-damage: 1.0 cooldown-ms: 1000 weapons: # being creative with weapons first-use: 25 # first time you hit with a new weapon style (sword, axe, mace, trident, bow...) improvised-first-use: 40 # first time you hit with a non-weapon item (stick, fish, etc.) switch-bonus: 4 # switching to a style not used in your last N styles recent-window: 3 switch-cooldown-ms: 3000 # --------------------------------------------------------------- # VOYAGER # --------------------------------------------------------------- voyager: exploration: region-size: 256 # blocks; entering an unvisited square area gives points new-region: 6 new-biome: 40 new-dimension: 100 dimension-overrides: # keys: normal, nether, the_end (or custom world name) normal: 0 nether: 150 the_end: 300 discovery: new-item: 10 new-mob: 20 mob-scan-radius: 32 # a mob is "discovered" when you see it within this range item-overrides: # item id -> points for the first time you hold it diamond: 40 emerald: 30 netherite_ingot: 100 netherite_scrap: 60 elytra: 150 nether_star: 200 totem_of_undying: 80 enchanted_golden_apple: 120 heart_of_the_sea: 100 dragon_egg: 500 dragon_head: 150 trident: 80 mace: 120 beacon: 150 mob-overrides: # mob id -> points for first sighting ender_dragon: 300 wither: 400 warden: 250 elder_guardian: 150 evoker: 60 ravager: 60 ignored-items: # never count as discoveries - command_block - chain_command_block - repeating_command_block - command_block_minecart - barrier - light - structure_block - structure_void - jigsaw - debug_stick - knowledge_book - test_block - test_instance_block
Every text uses MiniMessage: <#rrggbb> hex colours, <gradient:#start:#end>text</gradient>, <b>, <i>, <u>, <st>, <rainbow> and more. {placeholders} are filled in by the plugin, so keep them in your text. Lines that are exactly {rewards} or {progress} expand into several lines. A missing key falls back to the built-in default.
The preview under each row uses sample values, so you can see the colours before you edit.
| Colour | Hex | Used for |
|---|---|---|
| text | #f3f4f6 | Bright emphasis |
| bright | #e5e7eb | Normal text |
| normal | #9ca3af | Soft text |
| soft | #6b7280 | Muted separators |
| success | #4ade80 | Done and claimed |
| warning | #fbbf24 | Hints, next level, milestones |
| error | #f87171 | Errors and cooldowns |
| milestone | #a78bfa | Milestone tag |
| Key | Type | Default | What it does |
|---|---|---|---|
| trees | |||
trees.combatant.name | text | Combatant | Display name of the tree, used in chat, GUI, leaderboard and placeholders. |
trees.combatant.color | text | <#ef4444> | Accent colour, inserted wherever a message says {color}. Use one colour tag, not a gradient, because it is also used as an opening tag mid-line.Sample |
trees.combatant.icon | text | DIAMOND_SWORD | Material for every GUI item set to tree-icon. |
trees.combatant.description | text | Fight to grow: hits, kills, bosses, blocking and weapon variety. | Line shown on the tree item in the main menu.Fight to grow: hits, kills, bosses, blocking and weapon variety. |
trees.voyager.name | text | Voyager | Display name of the tree, used in chat, GUI, leaderboard and placeholders. |
trees.voyager.color | text | <#38bdf8> | Accent colour, inserted wherever a message says {color}. Use one colour tag, not a gradient, because it is also used as an opening tag mid-line.Sample |
trees.voyager.icon | text | COMPASS | Material for every GUI item set to tree-icon. |
trees.voyager.description | text | Explore to grow: mining, new places, new items and new mobs. | Line shown on the tree item in the main menu.Explore to grow: mining, new places, new items and new mobs. |
| action bar | |||
actionbar | text | {color}+{amount} <#6b7280>· <#e5e7eb>{reason} | Action bar for a gain outside a session. {color} {amount} {reason}+12 · Critical Hit |
actionbar-compact | text | {color}+{amount} | Short form when the same thing repeats. {color} {amount}+12 |
announce | text | <#9ca3af>{reason} <#6b7280>› {color}+{amount} {tree} | Chat line for boss kills. {reason} {color} {amount} {tree}Critical Hit › +12 Combatant |
| session | |||
session.actionbar | text | {color}<b>+{total}</b> <#6b7280>· <#e5e7eb>{name} | Running session total while mining or fighting. {color} {total} {count} {name}+184 · Diamond Ore |
session.new-block-suffix | text | <#fbbf24>✦ | Added after the block name when that break included a first-time bonus. ✦ |
session.summary.voyager | text | <#4ade80>✔ <#f3f4f6>Congrats! <#9ca3af>You mined <#f3f4f6>{count} <#9ca3af>blocks and obtained {color}{xp} XP | Summary after the session ends. {color} {count} {xp}✔ Congrats! You mined 23 blocks and obtained 312 XP |
session.summary.voyager-one | text | <#4ade80>✔ <#f3f4f6>Congrats! <#9ca3af>You mined <#f3f4f6>1 <#9ca3af>block and obtained {color}{xp} XP | Summary when the session had exactly one action. {color} {xp}✔ Congrats! You mined 1 block and obtained 312 XP |
session.summary.combatant | text | <#4ade80>✔ <#f3f4f6>Nice fight! <#9ca3af>You scored <#f3f4f6>{count} <#9ca3af>combat actions and obtained {color}{xp} XP | Summary after the session ends. {color} {count} {xp}✔ Nice fight! You scored 23 combat actions and obtained 312 XP |
session.summary.combatant-one | text | <#4ade80>✔ <#f3f4f6>Nice fight! <#9ca3af>You scored <#f3f4f6>1 <#9ca3af>combat action and obtained {color}{xp} XP | Summary when the session had exactly one action. {color} {xp}✔ Nice fight! You scored 1 combat action and obtained 312 XP |
| level-up | |||
level-up.chat | text | {color}▎ <b>{tree}</b> <#9ca3af>level up <#6b7280>{old} › {color}<b>{new}</b>{bonus} | Chat line on level up. {color} {tree} {TREE} (upper case) {old} {new} {bonus}▎ Combatant level up 9 › 10 +2 levels |
level-up.bonus | text | <#fbbf24>+{levels} levels | Added to the chat line when several levels were gained. {levels} +2 levels |
level-up.hint | text | <#6b7280>▎ <#6b7280>/profile <#6b7280>to see your progress | Second chat line after a level up.▎ /profile to see your progress |
level-up.title | text | {color}<b>Level {level}</b> | Screen title. {color} {tree} {level}Level 10 |
level-up.subtitle | text | <#9ca3af>{tree} | Screen subtitle. {color} {tree} {level}Combatant |
| milestone | |||
milestone.broadcast | text | <#fbbf24>✦ <#f3f4f6>{player} <#9ca3af>reached {color}{tree} level {level} | Server broadcast for a milestone. {player} {color} {tree} {level}✦ Steve reached Combatant level 10 |
| reasons | |||
reasons.separator | text | + | Text between several reasons in one award, for example "New Biome + New Area". + |
reasons.hit | text | Hit | Reason label shown on the action bar.Hit |
reasons.sweep-hit | text | Sweep Hit | Reason label shown on the action bar.Sweep Hit |
reasons.sprint-hit | text | Sprint Hit | Reason label shown on the action bar.Sprint Hit |
reasons.critical-hit | text | Critical Hit | Reason label shown on the action bar.Critical Hit |
reasons.ranged-hit | text | Ranged Hit | Reason label shown on the action bar.Ranged Hit |
reasons.mace-smash | text | Mace Smash | Reason label shown on the action bar.Mace Smash |
reasons.shield-block | text | Shield Block | Reason label shown on the action bar.Shield Block |
reasons.new-weapon | text | New Weapon Style: {name} | Reason label shown on the action bar. {name} is the weapon, mob, block, item, biome or dimension.New Weapon Style: Diamond Ore |
reasons.weapon-switch | text | Weapon Switch | Reason label shown on the action bar.Weapon Switch |
reasons.player-kill | text | Player Kill | Reason label shown on the action bar.Player Kill |
reasons.boss-defeated | text | Boss Defeated: {name} | Reason label shown on the action bar. {name} is the weapon, mob, block, item, biome or dimension.Boss Defeated: Diamond Ore |
reasons.boss-repeat | text | (kill #{n}) | Added to a boss reason on repeat kills. {n} is the kill number.(kill #3) |
reasons.kill | text | Kill: {name} | Reason label shown on the action bar. {name} is the weapon, mob, block, item, biome or dimension.Kill: Diamond Ore |
reasons.mining | text | Mining: {name} | Reason label shown on the action bar. {name} is the weapon, mob, block, item, biome or dimension.Mining: Diamond Ore |
reasons.new-block | text | New Block: {name} | Reason label shown on the action bar. {name} is the weapon, mob, block, item, biome or dimension.New Block: Diamond Ore |
reasons.new-item | text | New Item: {name} | Reason label shown on the action bar. {name} is the weapon, mob, block, item, biome or dimension.New Item: Diamond Ore |
reasons.new-items | text | {count} New Items | Reason when several are found at once. {count}23 New Items |
reasons.new-mob | text | New Mob: {name} | Reason label shown on the action bar. {name} is the weapon, mob, block, item, biome or dimension.New Mob: Diamond Ore |
reasons.new-mobs | text | {count} New Mobs | Reason when several are found at once. {count}23 New Mobs |
reasons.new-biome | text | New Biome: {name} | Reason label shown on the action bar. {name} is the weapon, mob, block, item, biome or dimension.New Biome: Diamond Ore |
reasons.new-dimension | text | New Dimension: {name} | Reason label shown on the action bar. {name} is the weapon, mob, block, item, biome or dimension.New Dimension: Diamond Ore |
reasons.new-area | text | New Area | Reason label shown on the action bar.New Area |
reasons.admin | text | Admin | Reason label shown on the action bar.Admin |
| anti-farm | |||
anti-farm.pvp-cooldown | text | <#fbbf24>! <#9ca3af>No points, you recently defeated this player. | Sent to the killer when the PvP repeat cooldown blocks the points.! No points, you recently defeated this player. |
| rewards | |||
rewards.item-received | text | <#4ade80>✔ <#9ca3af>Reward <#6b7280>› <#f3f4f6>{amount}× {item} | Chat line per item reward. {amount} {item}✔ Reward › 12× Cooked Beef |
rewards.money-received | text | <#4ade80>✔ <#9ca3af>Reward <#6b7280>› <#f3f4f6>{money} | Chat line for a money reward. {money}✔ Reward › $500 |
rewards.inventory-full | text | <#fbbf24>! <#9ca3af>Inventory full, some rewards were dropped at your feet. | Sent when reward items dropped at the player's feet.! Inventory full, some rewards were dropped at your feet. |
rewards.claim-done | text | <#4ade80>✔ <#9ca3af>Claimed rewards for <#f3f4f6>{count} <#9ca3af>level(s). | After /skilladmin claim. {count} levels paid.✔ Claimed rewards for 23 level(s). |
rewards.claim-none | text | <#9ca3af>No unclaimed level rewards. | Nothing was left to claim.No unclaimed level rewards. |
rewards.reclaim-success | text | <#4ade80>✔ <#9ca3af>Claimed the <#f3f4f6>{tree} level {level} <#9ca3af>reward. | A reclaim worked. {tree} {level}✔ Claimed the Combatant level 10 reward. |
rewards.reclaim-cooldown | text | <#f87171>↻ <#9ca3af>Claim again in <#f3f4f6>{time} | A reclaim is on cooldown. {time} remaining.↻ Claim again in 1h 12m |
rewards.reclaim-not-reclaimable | text | <#f87171>This reward can only be claimed once. | The level reward is not reclaimable.This reward can only be claimed once. |
rewards.reclaim-not-reached | text | <#f87171>Reach this level first. | Clicked a level that is not reached yet.Reach this level first. |
rewards.reclaim-no-reward | text | <#9ca3af>This level has no reward. | Clicked a level with no reward.This level has no reward. |
| command | |||
command.player-only | text | <#f87171>Only players can use this command. | Command feedback message.Only players can use this command. |
command.no-permission | text | <#f87171>You don't have permission to do that. | Command feedback message.You don't have permission to do that. |
command.unknown-tree | text | <#f87171>Unknown skill tree. Use <#f3f4f6>combatant <#f87171>or <#f3f4f6>voyager<#f87171>. | Command feedback message.Unknown skill tree. Use combatant or voyager. |
command.player-not-found | text | <#f87171>Player not found. | Command feedback message.Player not found. |
command.no-data | text | <#f87171>That player has no skill data yet. | Command feedback message.That player has no skill data yet. |
command.loading | text | <#9ca3af>Loading profile... | Command feedback message.Loading profile... |
command.top-loading | text | <#9ca3af>The leaderboard is still loading, try again in a moment. | Command feedback message.The leaderboard is still loading, try again in a moment. |
command.top-header | text | {color}▎ <b>Top {tree}</b> | Heading of /skilltop. {color} {tree}▎ Top Combatant |
command.top-line | text | <#6b7280>{rank} <#f3f4f6>{name} <#6b7280>· {color}Lv {level} <#6b7280>({points}) | One leaderboard row. {rank} {name} {color} {level} {points}1 Diamond Ore · Lv 10 (8,420) |
command.top-empty | text | <#9ca3af>No data yet. | Command feedback message.No data yet. |
| admin | |||
admin.usage | text | <#fbbf24>Usage: <#e5e7eb>/skilladmin add|set [player] [tree] [points] <#6b7280>· <#e5e7eb>reset [player] <#6b7280>· <#e5e7eb>claim [player|all] <#6b7280>· <#e5e7eb>reload | Shown when /skilladmin is used wrongly.Usage: /skilladmin add|set [player] [tree] [points] · reset [player] · claim [player|all] · reload |
admin.reloaded | text | <#4ade80>✔ <#9ca3af>Config, messages, rewards, block points and GUI layout reloaded. | Admin command feedback message.✔ Config, messages, rewards, block points and GUI layout reloaded. |
admin.bad-target | text | <#f87171>Unknown player (must be online) or skill tree. | Admin command feedback message.Unknown player (must be online) or skill tree. |
admin.bad-number | text | <#f87171>Points must be a whole number, 0 or higher. | Admin command feedback message.Points must be a whole number, 0 or higher. |
admin.added | text | <#4ade80>✔ <#9ca3af>Added <#f3f4f6>{amount} {tree} <#9ca3af>points to <#f3f4f6>{player} | Confirmation. {amount} {tree} {player}✔ Added 12 Combatant points to Steve |
admin.set | text | <#4ade80>✔ <#9ca3af>Set <#f3f4f6>{player}'s {tree} <#9ca3af>points to <#f3f4f6>{amount} | Confirmation. {amount} {tree} {player}✔ Set Steve's Combatant points to 12 |
admin.reset | text | <#4ade80>✔ <#9ca3af>Reset all skill data for <#f3f4f6>{player} | Confirmation. {player}✔ Reset all skill data for Steve |
admin.claimed | text | <#4ade80>✔ <#9ca3af>Claimed rewards for <#f3f4f6>{player}<#9ca3af>: {count} level(s) | Result of a claim. {player} {count}✔ Claimed rewards for Steve: 23 level(s) |
| gui | |||
gui.milestone-tag | text | <#a78bfa>✦ | Inserted as {milestone} in titles of milestone levels. ✦ |
gui.cost-note-start | text | <#6b7280>(start) | Inserted as {cost_note} for level 1. (start) |
gui.cost-note | text | <#6b7280>(+{cost}) | Inserted as {cost_note} for other levels. {cost} (+1,200) |
gui.tree-icon.title | text | {color}<b>{tree}</b> | Name of a tree item in the main menu. {color} {tree}Combatant |
gui.tree-icon.lore | list | <#9ca3af>{description}
<#6b7280>Level <#f3f4f6>{level}<#6b7280> / {max}
<#6b7280>Points <#f3f4f6>{points}
{progress}
{color}› <#e5e7eb>View levels | Lore of a tree item. {description} {level} {max} {points}, and a {progress} line that expands.Fight to grow.
Level 10 / 100
Points 8,420
{progress}
› View levels |
gui.progress.lines | list | <#6b7280>Next · level {next_level}
{bar} <#f3f4f6>{percent}%
<#9ca3af>{current}<#6b7280> / {span} · {remaining} to go | The {progress} block while a next level exists. {next_level} {bar} {percent} {current} {span} {remaining}Next · level 11
━━━━━━━━━━━━━━━━━━ 62%
740 / 1,200 · 460 to go |
gui.progress.max | list | <#fbbf24>✦ <#e5e7eb>Max level reached | The {progress} block at max level.✦ Max level reached |
gui.level.reached.title | text | <#4ade80>✔ <#e5e7eb>Level {level}{milestone} | Item name for this level state. {level} {milestone} {color} {tree}✔ Level 10 ✦ |
gui.level.reached.lore | list | <#6b7280>Completed
<#6b7280>Required <#9ca3af>{required}{cost_note}
{rewards} | Item lore for this level state. {required} {cost} {cost_note} {points} {remaining} {bar} {percent}, plus {rewards} and {progress} lines that expand.Completed
Required 8,420 (+1,200)
{rewards} |
gui.level.current.title | text | {color}<b>Level {level}</b>{milestone} <#6b7280>· you are here | Item name for this level state. {level} {milestone} {color} {tree}Level 10 ✦ · you are here |
gui.level.current.lore | list | <#6b7280>Required <#9ca3af>{required}
<#6b7280>Your points {color}{points}
{progress}
{rewards} | Item lore for this level state. {required} {cost} {cost_note} {points} {remaining} {bar} {percent}, plus {rewards} and {progress} lines that expand.Required 8,420
Your points 8,420
{progress}
{rewards} |
gui.level.next.title | text | <#fbbf24>Level {level}{milestone} <#6b7280>· next | Item name for this level state. {level} {milestone} {color} {tree}Level 10 ✦ · next |
gui.level.next.lore | list | <#6b7280>Required <#9ca3af>{required} <#6b7280>({cost} this level)
<#6b7280>Your points {color}{points}
{bar} <#f3f4f6>{percent}%
<#9ca3af>{remaining} <#6b7280>points to go
{rewards} | Item lore for this level state. {required} {cost} {cost_note} {points} {remaining} {bar} {percent}, plus {rewards} and {progress} lines that expand.Required 8,420 (1,200 this level)
Your points 8,420
━━━━━━━━━━━━━━━━━━ 62%
460 points to go
{rewards} |
gui.level.locked.title | text | <#6b7280>Level {level}{milestone} | Item name for this level state. {level} {milestone} {color} {tree}Level 10 ✦ |
gui.level.locked.lore | list | <#6b7280>Locked
<#6b7280>Required <#9ca3af>{required}
<#6b7280>{remaining} more points
{rewards} | Item lore for this level state. {required} {cost} {cost_note} {points} {remaining} {bar} {percent}, plus {rewards} and {progress} lines that expand.Locked
Required 8,420
460 more points
{rewards} |
gui.nav.prev.title | text | <#e5e7eb>‹ Previous | Button name.‹ Previous |
gui.nav.prev.lore | list | <#6b7280>Page {page} | Button lore. {page} is the target page.Page 1 |
gui.nav.next.title | text | <#e5e7eb>Next › | Button name.Next › |
gui.nav.next.lore | list | <#6b7280>Page {page} | Button lore. {page} is the target page.Page 1 |
gui.nav.back.title | text | <#f87171>Back | Button name.Back |
gui.nav.back.lore | list | <#6b7280>Return to the menu | Button lore. {page} is the target page.Return to the menu |
gui.summary.title | text | {color}<b>{tree}</b> <#6b7280>· summary | Name of the summary button. {color} {tree}Combatant · summary |
gui.summary.lore-combatant | list | <#6b7280>Level <#f3f4f6>{level}<#6b7280> / {max}
<#6b7280>Points <#f3f4f6>{points}
{progress}
<#6b7280>Weapon styles <#f3f4f6>{weapons} | Summary lore for Combatant. {weapons} counts weapon styles.Level 10 / 100
Points 8,420
{progress}
Weapon styles 5 |
gui.summary.lore-voyager | list | <#6b7280>Level <#f3f4f6>{level}<#6b7280> / {max}
<#6b7280>Points <#f3f4f6>{points}
{progress}
<#6b7280>Items <#f3f4f6>{items}
<#6b7280>Mobs <#f3f4f6>{mobs}
<#6b7280>Blocks <#f3f4f6>{blocks}
<#6b7280>Biomes <#f3f4f6>{biomes}
<#6b7280>Areas <#f3f4f6>{areas} | Summary lore for Voyager. {items} {mobs} {blocks} {biomes} {areas}Level 10 / 100
Points 8,420
{progress}
Items 212
Mobs 38
Blocks 64
Biomes 21
Areas 37 |
gui.rewards.header | text | <#6b7280>Rewards | Heading above the reward list.Rewards |
gui.rewards.none | text | <#6b7280>Rewards · none | Shown when the level has no reward.Rewards · none |
gui.rewards.bullet | text | <#6b7280>› <#e5e7eb>{text} | Wraps each reward line. {text}› Special perk |
gui.rewards.item | text | {amount}× {item} | One item reward. {amount} {item}12× Cooked Beef |
gui.rewards.money | text | {amount} | The money reward line. {amount}12 |
gui.rewards.perk | text | Special perk | Line for rewards that only give permissions or commands and have no display.Special perk |
gui.rewards.reclaim-every | text | <#6b7280>↻ Reclaimable every <#9ca3af>{cooldown} | Shown for reclaimable rewards with a cooldown. {cooldown}↻ Reclaimable every 12h |
gui.rewards.reclaim-anytime | text | <#6b7280>↻ Reclaimable | Shown for reclaimable rewards with no cooldown.↻ Reclaimable |
gui.rewards.reclaim-ready | text | <#4ade80>› <#e5e7eb>Click to claim again | Shown when the player can claim again now.› Click to claim again |
gui.rewards.reclaim-wait | text | <#6b7280>↻ Claim again in <#f3f4f6>{time} | Shown while on cooldown. {time}↻ Claim again in 1h 12m |
Layout is <tree>.<level>.<option>, with the trees combatant and voyager. A level with no entry gives nothing. Level 1 is the starting level, so begin at 2. The shipped file lists every option under each level, active or commented out. It gives Combatant level 5 (16 cooked beef) and level 10 (a named, enchanted iron sword), and Voyager level 5 (16 bread).
| Option | Type | Default | What it does |
|---|---|---|---|
| Level options (under <tree>.<level>) | |||
sound | none | id | list | none | Minecraft sound ids, optionally with volume and pitch: ui.toast.challenge_complete 1.0 1.2. A list plays all of them. |
permissions | none | node | list | none | LuckPerms nodes added permanently. Prefix a node with - to set it to false. Given on the first claim only, never on a reclaim. Needs LuckPerms. |
remove-permissions | none | node | list | none | LuckPerms nodes removed when the level is reached. |
items | none | list | none | Items as "diamond 3" or as a customised item map (below). Leftovers drop at the player's feet when the inventory is full. |
money | none | number | none | Money through Vault. Needs an economy plugin. A bad number is skipped with a warning. |
commands | none | list | none | Console commands. Placeholders: {player} {level} {tree}. |
display | none | list | none | Extra MiniMessage lines shown under the rewards in /profile. Use it to describe permissions and commands. |
reclaimable | boolean | false | True lets the player claim this level again by clicking it. Items, money, commands and sound repeat. Permissions do not. |
cooldown | none | Xs | Xm | Xh | Xd | Xmd | none | Wait between claims, from the last claim. Only used when reclaimable is true. |
| Customised item (an entry under items) | |||
item | item id | required | Minecraft item id. An unknown id skips that entry with a warning. |
amount | number | 1 | Stack size. |
name | MiniMessage | none | Custom display name. Placeholders: {player} {level} {tree}. |
lore | list of MiniMessage | none | Lore lines. Same placeholders. |
glow | boolean | false | Adds an enchantment glow. |
unbreakable | boolean | false | Makes the item unbreakable. |
custom-model-data | number | none | For resource pack models. |
enchantments | map: enchantment to level | none | For example sharpness: 3. An unknown enchantment is skipped with a warning. |
combatant: 20: sound: [entity.player.levelup, entity.experience_orb.pickup] permissions: - some.plugin.perk remove-permissions: - some.old.perk items: - "golden_apple 4" - item: iron_sword amount: 1 name: "<red><bold>{player}'s Blade" lore: - "<gray>Forged at {tree} level {level}" glow: true unbreakable: true enchantments: sharpness: 3 unbreaking: 2 money: 500 commands: - "broadcast {player} is a true Combatant!" display: - "<gray>Unlocks <white>/perk" reclaimable: true cooldown: 2md
Console commands run as the server. Example: - "lp user {{player}} parent add vip". If you give permissions, prefer the permissions option so they show up in LuckPerms with the right context and are removed cleanly with remove-permissions.
Layout of the menus. Titles and lore text are in messages.yml. Materials can be any Minecraft item name (DIAMOND_SWORD) or tree-icon. An unknown name falls back to the default with a console warning. See the slot map to try layouts.
| Option | Type | Default | What it does |
|---|---|---|---|
| progress-bar | |||
progress-bar.length | whole number | 18 | Number of characters in the bar. |
progress-bar.filled | text | ━ | Character for the filled part. Try ━ ▰ ■ █. |
progress-bar.empty | text | ━ | Character for the empty part. |
progress-bar.empty-color | MiniMessage colour | <#374151> | Colour of the empty part. |
progress-bar.next-color | MiniMessage colour | <#fbbf24> | Fill colour on the "next level" item. Other items use the tree colour. |
| menu (main menu) | |||
menu.rows | 1 to 6 | 3 | Inventory rows. |
menu.title.own | MiniMessage | <gradient:#ef4444:#38bdf8>Profile</gradient> | Window title of your own profile. {player} |
menu.title.other | MiniMessage | <gradient:#ef4444:#38bdf8>{player}</gradient> <#6b7280>· Profile | Window title when you view someone else. {player} |
menu.filler.enabled | boolean | false | Fill every empty slot with a filler item. Off keeps the menu clean and minimal. |
menu.filler.material | material | BLACK_STAINED_GLASS_PANE | Filler item. Only used when enabled. |
menu.filler.enchanted | boolean | false | Glow on the filler. |
menu.items.combatant.enabled | boolean | true | Show the Combatant item. |
menu.items.combatant.slot | slot | 11 | Slot of the Combatant item. |
menu.items.combatant.material | material | <code>tree-icon</code> | tree-icon | Item shape. tree-icon uses the icon from messages.yml. |
menu.items.combatant.enchanted | boolean | true | Enchantment glow. |
menu.items.voyager.enabled | boolean | true | Show the Voyager item. |
menu.items.voyager.slot | slot | 15 | Slot of the Voyager item. |
menu.items.voyager.material | material | <code>tree-icon</code> | tree-icon | Item shape. tree-icon uses the icon from messages.yml. |
menu.items.voyager.enchanted | boolean | true | Enchantment glow. |
| tree (level screen) | |||
tree.title.combatant | MiniMessage | <gradient:#ef4444:#fb923c>{tree}</gradient> <#6b7280>· {page}/{pages} | Window title for Combatant. {tree} {color} {page} {pages} {level} {max} {points} {player} |
tree.title.voyager | MiniMessage | <gradient:#38bdf8:#818cf8>{tree}</gradient> <#6b7280>· {page}/{pages} | Window title for Voyager. Same placeholders. |
tree.rows | 1 to 6 | 6 | Inventory rows. With level-slots: auto, the bottom row is for buttons. |
tree.level-slots | <code>auto</code> | slot list | auto | Slots that show levels, in order. More slots mean more levels per page. Pages are added automatically. |
tree.filler.enabled | boolean | false | Fill every slot that is not a level slot. |
tree.filler.material | material | BLACK_STAINED_GLASS_PANE | Filler item. Only used when enabled. |
tree.filler.enchanted | boolean | false | Glow on the filler. |
tree.levels.locked.material | material | <code>tree-icon</code> | GRAY_DYE | Item for the locked state. |
tree.levels.locked.enchanted | boolean | false | Glow for the locked state. False also removes a glow items have by themselves. |
tree.levels.reached.material | material | <code>tree-icon</code> | LIME_DYE | Item for the reached state. |
tree.levels.reached.enchanted | boolean | false | Glow for the reached state. False also removes a glow items have by themselves. |
tree.levels.current.material | material | <code>tree-icon</code> | tree-icon | Item for the current state. |
tree.levels.current.enchanted | boolean | true | Glow for the current state. False also removes a glow items have by themselves. |
tree.levels.next.material | material | <code>tree-icon</code> | YELLOW_DYE | Item for the next state. |
tree.levels.next.enchanted | boolean | false | Glow for the next state. False also removes a glow items have by themselves. |
tree.levels.milestone-locked.material | material | <code>tree-icon</code> | PURPLE_DYE | Item for the milestone-locked state. |
tree.levels.milestone-locked.enchanted | boolean | true | Glow for the milestone-locked state. False also removes a glow items have by themselves. |
tree.levels.milestone-reached.material | material | <code>tree-icon</code> | CYAN_DYE | Item for the milestone-reached state. |
tree.levels.milestone-reached.enchanted | boolean | true | Glow for the milestone-reached state. False also removes a glow items have by themselves. |
tree.levels.milestone-current.material | material | <code>tree-icon</code> | tree-icon | Item for the milestone-current state. |
tree.levels.milestone-current.enchanted | boolean | true | Glow for the milestone-current state. False also removes a glow items have by themselves. |
tree.levels.milestone-next.material | material | <code>tree-icon</code> | ORANGE_DYE | Item for the milestone-next state. |
tree.levels.milestone-next.enchanted | boolean | true | Glow for the milestone-next state. False also removes a glow items have by themselves. |
tree.buttons.prev.enabled | boolean | true | Show the prev button. False removes it completely. |
tree.buttons.prev.slot | <code>auto</code> | slot | auto | Slot of the prev button. Auto = bottom row first slot. |
tree.buttons.prev.material | material | <code>tree-icon</code> | ARROW | Item for the prev button. |
tree.buttons.prev.enchanted | boolean | false | Enchantment glow. |
tree.buttons.back.enabled | boolean | true | Show the back button. False removes it completely. |
tree.buttons.back.slot | <code>auto</code> | slot | auto | Slot of the back button. Auto = bottom row 3rd slot. |
tree.buttons.back.material | material | <code>tree-icon</code> | OAK_DOOR | Item for the back button. |
tree.buttons.back.enchanted | boolean | false | Enchantment glow. |
tree.buttons.summary.enabled | boolean | true | Show the summary button. False removes it completely. |
tree.buttons.summary.slot | <code>auto</code> | slot | auto | Slot of the summary button. Auto = bottom row middle slot. |
tree.buttons.summary.material | material | <code>tree-icon</code> | tree-icon | Item for the summary button. |
tree.buttons.summary.enchanted | boolean | true | Enchantment glow. |
tree.buttons.next.enabled | boolean | true | Show the next button. False removes it completely. |
tree.buttons.next.slot | <code>auto</code> | slot | auto | Slot of the next button. Auto = bottom row last slot. |
tree.buttons.next.material | material | <code>tree-icon</code> | ARROW | Item for the next button. |
tree.buttons.next.enchanted | boolean | false | Enchantment glow. |
tree: rows: 6 level-slots: [0-53] # every slot shows a level buttons: prev: { slot: 0 } # a button wins over a level on the same slot next: { slot: 8 } back: { slot: 45 } summary: { slot: 53 }
Voyager points per block. Ids are Minecraft block ids (the minecraft: prefix is optional). Keys with * are wildcards. A match order applies: exact id, wildcard, tag, default. An unknown block or tag is skipped with a console warning.
| Option | Type | Default | What it does |
|---|---|---|---|
| Global | |||
player-placed-multiplier | decimal 0 to 1 | 0 | Share of the mining value paid for blocks a player placed. 0 pays nothing. Values are clamped between 0 and 1. |
| mining (breaking a block) | |||
mining.default | points | 1 | Points for any block with no matching rule. |
mining.blocks | map: block id to points | see the table below | Exact ids (diamond_ore) or wildcards with * (*_ore). Exact beats wildcard. |
mining.tags | map: block tag to points | {logs: 2, leaves: 1} | Minecraft block tags such as logs, leaves, mineable/pickaxe. |
| first-time (first break or placement of a block type) | |||
first-time.default | points | 8 | Bonus for a block type the player never used before. |
first-time.blocks | map: block id to points | see the table below | Same syntax as mining.blocks. |
first-time.tags | map: block tag to points | {} | Same syntax as mining.tags. Empty by default. |
Shipped block values
| Block | Mining points | First-time bonus |
|---|---|---|
coal_ore | 4 | default 8 |
deepslate_coal_ore | 5 | default 8 |
copper_ore | 4 | default 8 |
deepslate_copper_ore | 5 | default 8 |
iron_ore | 6 | default 8 |
deepslate_iron_ore | 7 | default 8 |
gold_ore | 10 | default 8 |
deepslate_gold_ore | 12 | default 8 |
nether_gold_ore | 5 | default 8 |
nether_quartz_ore | 5 | default 8 |
redstone_ore | 6 | default 8 |
deepslate_redstone_ore | 7 | default 8 |
lapis_ore | 8 | default 8 |
deepslate_lapis_ore | 9 | default 8 |
diamond_ore | 25 | 40 |
deepslate_diamond_ore | 30 | 40 |
emerald_ore | 30 | 40 |
deepslate_emerald_ore | 35 | 40 |
ancient_debris | 60 | 80 |
obsidian | 8 | default 8 |
crying_obsidian | 10 | default 8 |
amethyst_cluster | 6 | default 8 |
*_ore | 5 | 12 |
logs (tag) | 2 | default 8 |
leaves (tag) | 1 | default 8 |
player-placed-multiplier: 0 mining: default: 1 blocks: diamond_ore: 25 "*_ore": 5 # wildcard, matches every other ore tags: logs: 2 # any log type leaves: 1 first-time: default: 8 blocks: ancient_debris: 80 "*_ore": 12 tags: {}
PlaceholderAPI, WorldGuard, Vault, LuckPerms
All four are optional. Each hook is checked on start, and a failed hook logs one warning and never stops the plugin.
PlaceholderAPI
Registered when hooks.placeholderapi is true. The expansion identifier is skilltrees and it stays registered across /papi reload. Trees are combatant and voyager. Data comes from the online player cache; an unknown player returns zeros.
| Placeholder | Returns |
|---|---|
%skilltrees_<tree>_level% | Current level |
%skilltrees_<tree>_points% | Total points |
%skilltrees_<tree>_max_level% | Max level of that tree |
%skilltrees_<tree>_next_required% | Total points needed for the next level (the current requirement at max level) |
%skilltrees_<tree>_points_to_next% | Points still missing for the next level, 0 at max |
%skilltrees_<tree>_percent% | Whole-number progress to the next level, 100 at max |
%skilltrees_total_level% | Combatant level plus Voyager level |
%skilltrees_top_<tree>_<rank>_name% | Name at that leaderboard rank |
%skilltrees_top_<tree>_<rank>_points% | Points at that rank |
%skilltrees_top_<tree>_<rank>_level% | Level at that rank. A rank beyond the list returns -. |
%skilltrees_combatant_level% -> 27 %skilltrees_voyager_percent% -> 62 %skilltrees_top_combatant_1_name% -> Steve %skilltrees_top_voyager_3_points% -> 18240
WorldGuard
When hooks.worldguard is true, the plugin registers a state flag named skilltrees-points when it loads. Set it to deny in a region to stop all point gains for players standing there.
/rg flag spawn skilltrees-points deny
If another plugin already uses that flag name, the plugin logs a warning and continues without the flag.
Vault
Needed only for money rewards. Without an economy the plugin logs rewards.yml gives money, but no Vault economy was found and skips the money. The economy may load after SkillTrees; the plugin looks again when rewards are paid.
LuckPerms
Needed only for permissions and remove-permissions. Nodes are added and removed through the LuckPerms API as permanent nodes. Without LuckPerms the plugin logs a warning on reload and the permission rewards do nothing. For other permission plugins use the commands option instead.
Folia
The plugin declares folia-supported: true and schedules work on the entity, region, global or async scheduler as appropriate: each player's scans and awards run on that player's own thread. Folia support is built to the documented rules but has had less real-world testing than Paper, so test on a copy of your server first.
Storage
Player data is loaded asynchronously when a player joins and saved when they leave, on the autosave timer, and on shutdown.
| Type | Where | Good for |
|---|---|---|
yaml | plugins/SkillTrees/playerdata/<uuid>.yml, written atomically (temp file, then move) | Small servers, no setup |
sqlite | plugins/SkillTrees/data.db | One server, faster leaderboards |
mysql | Your database, table <prefix>players | Several servers sharing one profile |
What is stored
- Points for each tree and the highest level whose reward was paid.
- Everything discovered: items, mobs, blocks, biomes, exploration squares, weapon styles and dimensions.
- Boss kill counts per boss, and the last claim time per reclaimable reward.
- SQL tables hold
uuid,name,combatant_points,voyager_points(for fast leaderboards) and adatatext column with the rest. - Placed-block memory is stored separately, inside each chunk's own data.
Behaviour to know
- All disk and database work runs on one background thread, so the game thread never waits for storage.
- If the chosen backend cannot start, the plugin logs an error and falls back to YAML so players keep earning points.
- Changing
storage.typeneeds a restart, and existing data is not converted automatically. - On shutdown the plugin waits for pending saves, and warns if they time out.
Developer API
One public event, fired on every level up. It is a plain Bukkit event, so any plugin can listen to it.
| Method | Returns |
|---|---|
getPlayer() | The player who levelled up |
getTree() | SkillTree.COMBATANT or SkillTree.VOYAGER |
getOldLevel() | Level before the award |
getNewLevel() | Level after the award. More than old + 1 when levels were skipped. |
@EventHandler
public void onLevelUp(SkillLevelUpEvent e) {
if (e.getTree() == SkillTree.COMBATANT && e.getNewLevel() >= 50) {
e.getPlayer().sendMessage("You reached the Combatant elite.");
}
}The event is informational and cannot be cancelled. The class is me.arx160.skilltrees.event.SkillLevelUpEvent. For anything else (leaderboards, scoreboards, tab lists), use the placeholders above.
Troubleshooting
Start with the console. Almost every config mistake prints one line naming the file, the path and what was skipped.
I mine blocks but get no points
- Creative mode earns nothing unless
settings.allow-creativeis true. Spectators never earn. - Check
settings.disabled-worldsand any WorldGuard region withskilltrees-points deny. - Blocks you placed pay
player-placed-multiplier(default 0). - A block can be set to 0 in
voyager-blocks.yml. - Run
/skilladmin add <you> voyager 10. If that shows the action bar, the earning rules are the cause.
The action bar shows nothing
Check settings.actionbar-feedback and settings.actionbar-min-gain. Session gains always show the running total, but only when settings.session.enabled and the matching mining or combat switch are on.
The action bar shows only +N
That is the compact form for repeats outside sessions. Raise actionbar-compact-reset-seconds so the full text returns after a pause, or use sessions.
A reward did not arrive
- Read the console for
rewards.yml ...warnings: unknown item, unknown enchantment, bad money amount, invalid sound. - Money needs Vault and an economy plugin. Permissions need LuckPerms.
- For a level reached before the reward existed, run
/skilladmin claim <player|all>or turn onauto-claim-on-join. - Rewards pay once per level. Use
reclaimableto allow repeats.
Level rewards after I changed the level curve
Points are kept, so levels are recalculated from them. Run /skilladmin claim all to pay rewards for levels that players now count as having reached.
Reclaiming does not work for one level
An unreadable cooldown disables reclaiming for that level, with a console warning. Use the units s, m, h, d or md with a number, like 12h.
My GUI layout looks wrong
- Run
/skilladmin reloadand reopen the menu. Open menus keep the old layout. - A button wins over a level on the same slot. Move one of them.
- Slots are numbered from 0. A 3-row menu has slots 0 to 26.
- The console tells you about unknown materials and out-of-range slots.
/skilltop says the leaderboard is loading
The first build runs right after startup. Wait a moment and try again. The list refreshes every leaderboard.refresh-seconds.
Storage did not start
The console says Could not start 'mysql' storage with the reason, and the plugin runs on YAML instead. Check host, port, user, password and that the JDBC driver is available, then restart. Data saved in the YAML fallback is not moved to MySQL automatically.
Placeholders show as text
PlaceholderAPI must be installed and hooks.placeholderapi true. The log line PlaceholderAPI expansion registered confirms it.
Console messages
| Message starts with | Meaning |
|---|---|
gui.yml tree.level-slots: slot N ... | A level slot is invalid or outside the inventory, skipped. |
gui.yml: no free slot for levels, using slot 0 | Every level slot is used by buttons or out of range. |
gui.yml ... unknown item | A material name was not recognised. The default is used. |
rewards.yml ... bad cooldown | Cooldown text could not be read. That level cannot be reclaimed. |
rewards.yml ... unknown item / enchantment / invalid sound | That one entry is skipped, the rest of the reward still pays. |
rewards.yml changes permissions, but LuckPerms was not found | Permission rewards do nothing until LuckPerms is installed. |
rewards.yml gives money, but no Vault economy was found | Money rewards are skipped until an economy exists. |
voyager-blocks.yml ... | An unknown block, unknown tag or non-number was skipped. |
Could not load / save data for ... | A storage read or write failed for that player. Check disk space and database access. |
Another plugin already uses the WorldGuard flag | The flag name is taken, so region control is off. |
Good to know
The behaviours below are intentional or unavoidable. Reading them now saves a support question later.
Built for Paper 26.3
The plugin targets the Paper 26.3 API on Java 25. It has not been run on Spigot or older Paper versions.
Block detection is indirect
Shield blocks are found by reading the blocking damage modifier, with a fallback for fully blocked hits. A server change to damage handling could affect it.
Doors and beds
Only the placed position of a block is remembered. For two-part blocks such as doors and beds, only the main half reported by the placement is tracked, so breaking the other half can pay normal mining points.
Reward items count
Items from rewards.yml can trigger the "new item" bonus. Add them to ignored-items if you do not want that.
No automatic migration
Changing storage type starts a new data set. Copy data yourself if you need to keep it.
Online players only
add, set, reset and claim work on online players. /profile can still view offline players.
Frequently asked
Can I change every value?
Yes. Every number, text, material, slot and colour listed on this page is in a yaml file. Keys the plugin does not recognise are ignored.
Can I add more bosses?
Add any entity id to combatant.kill.overrides with its points. It becomes a boss: everyone who hurt it is paid. Add it to repeat-decay.bosses too if repeat kills should decay.
Can I make a point-less world?
Yes: add the world folder name to settings.disabled-worlds, or use the WorldGuard flag for a single region.
How do I run a double points event?
Set multipliers.combatant and multipliers.voyager to 2.0 and run /skilladmin reload. Set them back to 1.0 afterwards.
How do I give a prize every few days?
Give that level reclaimable: true and a cooldown such as 3d. Players click the level in /profile to claim it again.
Can I use a custom item as a menu button?
Any Minecraft item name works for material. Menus use plain items, so custom model data on GUI items is not supported. Reward items do support custom-model-data.
How do I reset one player?
/skilladmin reset <player> deletes all of their skill data. To only change points use /skilladmin set.