Configuration
config.yml key by key, how an older file is migrated, what messages.yml and scoreboards.yml hold, and where the menus and the database are set.
Everything is generated in plugins/ExyliaAimTrainer/ on first boot, with comments. Edit the files there,
never the copies in the jar. Times are seconds with decimals unless a key says ticks; twenty ticks are one
second. Distances and sizes are blocks. Colours use palette tokens such as {primary} or {success}.
config.yml
Sixteen drills ship; two are shown here. The whole list, and what each number does to a drill, is on Drills.
training:
countdown: 3.0
rest-seconds: 5.0
default-drill: gridshot
allowed-commands: [aim, aimtrainer, at, msg, r, tell, w]
drills:
gridshot:
display-name: Gridshot
icon: LIME_CONCRETE
description: Three targets on a 3×3 grid.
kind: FLICK
weight: 1.0
duration: 30.0
targets: 3
size: 0.8
height: 0.0
distance:
min: 6.0
max: 6.0
spread:
yaw: 0.0
pitch-min: 0.0
pitch-max: 0.0
grid:
columns: 3
rows: 3
spacing: 11.0
lifetime: 0.0
ordered: false
return-to-centre: false
min-separation: 0.0
weapon: ""
# scatter, sixshot, microshot, spidershot, flick, precision, decay, switch,
# strafe, reaction, tracking, evasive, combo …
combo_19:
display-name: Combo 1.9
icon: DIAMOND_SWORD
description: Hit only on a fully charged swing.
kind: COMBO
weight: 1.4
duration: 30.0
targets: 1
size: 0.6
height: 1.8
distance:
min: 3.0
max: 3.5
spread:
yaw: 0.0
pitch-min: 0.0
pitch-max: 0.0
lifetime: 0.0
ordered: false
return-to-centre: false
min-separation: 0.0
weapon: DIAMOND_SWORD
motion:
speed-min: 1.5
speed-max: 3.5
acceleration: 8.0
arc-degrees: 60.0
switch-min-ticks: 6
switch-max-ticks: 18
hop-chance: 0.0
hop-height: 0.0
hop-ticks: 10
combo:
knockback: 0.9
knockback-up: 0.4
approach-speed: 4.5
combo-window: 1.0
attack-cooldown: true
# axe …
settings:
size:
min: 0.1
max: 2.5
step: 0.05
default: 1.0
distance:
min: 0.25
max: 3.0
step: 0.05
default: 1.0
colours:
lime:
name: Lime
dye: LIME
glow: "#8fffc1"
# red, orange, yellow, cyan, blue, purple, magenta, white, black
styles:
concrete:
name: Concrete
suffix: CONCRETE
material: ""
# wool, glass, terracotta
lantern:
name: Sea lantern
suffix: ""
material: SEA_LANTERN
# target
default-colour: lime
default-style: concrete
spawn-animation-ticks: 2
scoring:
hit-points: 10
miss-penalty: 4
expire-penalty: 6
false-start-penalty-millis: 150
reaction-reference-millis: 250
reaction-scale: 1000
tracking-scale: 10
combo-points: 5
size-exponent: 1.0
distance-exponent: 0.75
min-difficulty: 0.25
max-difficulty: 6.0
performance:
flick:
perfect: 0.3
excellent: 0.45
good: 0.65
ok: 0.9
reaction:
perfect: 0.2
excellent: 0.26
good: 0.33
ok: 0.42
feedback:
perfect:
effect:
action-bar:
text: "{success}⚡ PERFECT {muted}· {letters}%time%s {muted}· {info}x%streak%"
duration: 1.5
time-style: auto
sound:
name: ENTITY_EXPERIENCE_ORB_PICKUP
volume: 0.7
pitch: 1.8
category: MASTER
chat: ""
# excellent, good, ok and slow have the same shape.
miss:
action-bar:
text: "{error}✘ MISS {muted}· {letters}%accuracy%% accuracy"
duration: 1.5
time-style: auto
sound:
name: ENTITY_PLAYER_ATTACK_NODAMAGE
volume: 1.0
pitch: 1.0
category: MASTER
# expired, false-start, armed, rushed, countdown, go, session-complete,
# personal-best, match-found, round-won, round-lost, round-draw,
# match-won and match-lost are effects of the same shape.
hud:
boss-bar:
enabled: true
text: "{primary}&l%drill% {muted}· {letters}%time% {muted}· {success}%hits% {letters}hits {muted}· {info}%accuracy%% {muted}· {highlight}%score% pts"
colour: PURPLE
overlay: PROGRESS
refresh-ticks: 5
experience-bar: true
hotbar: true
hit-particle: "ELECTRIC_SPARK|8|0.15|0.15|0.15|0.05"
match:
formats: [1, 3, 5]
default-format: 3
allow-even-formats: false
use-preferences: false
round-delay: 3.0
result-delay: 5.0
duel-request-expiry: 30.0
practice:
train-while-queued: true
queue-prompt: true
ranked-only: false
leaderboard:
entries: 10
cache-seconds: 300
accuracy-min-shots: 20
history:
entries: 20
retention-days: 30
prune-interval-minutes: 60
arena:
max-players-per-arena: 0
return-location: ""
chat:
isolation: true
debug: falsetraining
| Key | Default | What it does |
|---|---|---|
countdown | 3.0 | Seconds before the first target is live, in a drill and in every duel round. A punch skips it. |
rest-seconds | 5.0 | Seconds a player may stay idle in the arena after a drill ends before being sent home. Replaying from the summary or the hotbar starts the drill again; a screen the player opened themselves — settings, the drill list — keeps them there and starts the wait over. |
default-drill | gridshot | The drill /aim train starts without a name. An id that is not in drills falls back to the first drill listed. |
allowed-commands | [aim, aimtrainer, at, msg, r, tell, w] | Command labels a player may still run while in a drill or a duel. A plugin:command prefix is stripped before the check. Everything else is refused with command-blocked. |
drills
One block per drill; a new key is a new drill, no code involved. The key is the drill id used by
commands, records, boards and placeholders. Menus list drills in file order, and a duel sent with
/aim duel <player> and no drill plays the first one. See Drills
for how the four kinds use these numbers.
If drills is missing or empty when the file is read, the sixteen shipped drills are used. To offer
fewer, delete the blocks you do not want and keep at least one.
| Key | Rule | What it does |
|---|---|---|
display-name | What players see. Palette tokens allowed. | |
icon | Blank is TARGET. | Material or head used in menus. |
description | One line shown under the drill in menus. | |
kind | Missing is FLICK. | FLICK, REACTION, TRACK or COMBO. |
weight | Zero or less is 1.0. | How hard the drill is by itself; multiplies the rating of every session. |
duration | Zero or less is 30.0. | Seconds a session lasts. A REACTION drill ends on its attempts; this is its cap. |
targets | At least 1. | Targets on screen at once. FLICK only; the other kinds use one. |
size | Zero or less is 0.8. | Edge of a target in blocks, before the player's size setting. |
height | At least 0. | Height of a target, or 0 for a cube. The player-shaped targets ship with 1.8. |
distance.min, distance.max | min at least 1.0; max at least min. | How far from the eyes a target is placed, before the player's distance setting. |
spread.yaw | 0 to 340. | Total horizontal spread in degrees around where the player faces: 60 is 30 to either side. |
spread.pitch-min, spread.pitch-max | -80 to 80; max at least min. | Lowest and highest elevation; negative is below eye level. |
grid | Left out unless used. | columns, rows, spacing: targets on fixed cells straight ahead instead of anywhere in the spread. columns: 0 turns it off; with columns, rows is at least 1 and a spacing of zero or less is 10.0 degrees. |
lifetime | At least 0. | Seconds a FLICK target stays up before it counts as expired. 0 never expires. |
ordered | FLICK only: targets come in order and only the lit one counts; the rest are misses. | |
return-to-centre | FLICK only: every other target sits dead ahead. | |
min-separation | At least 0. | Degrees kept between two targets on screen. |
weapon | A material put in the player's hand for the drill. Empty keeps the hand empty. | |
motion | Left out unless used. | A strafing target: speed-min, speed-max (blocks per second; 0 turns it off), acceleration, arc-degrees, switch-min-ticks, switch-max-ticks, hop-chance (0 to 1), hop-height, hop-ticks. With a speed-max above zero, an acceleration of zero or less is 8.0, an arc-degrees of zero or less is 60.0, and the tick keys are at least 1. |
reaction | Left out unless used. | min-delay (at least 0.2), max-delay (at least min-delay), attempts. attempts: 0 turns it off. |
combo | Left out unless used. | knockback (0 turns it off), knockback-up (zero or less is 0.4, at most 1.0), approach-speed (zero or less is 4.0), combo-window (zero or less is 0.7), attack-cooldown. |
A section that is off is left out of the file when it is written.
settings
The ranges and choices a player picks from in /aim settings. See
Settings.
| Key | Default | What it does |
|---|---|---|
size | 0.1 – 2.5, step 0.05, default 1.0 | Target size as a multiplier of the drill's own. min is at least 0.01, max at least min; step is what one click moves, between 0.01 and the width of the range; default is what a player who never changed it uses, brought inside the ends. Anything between the ends can also be typed. |
distance | 0.25 – 3.0, step 0.05, default 1.0 | Target distance as a multiplier, with the same rules. |
colours | ten colours | One block per colour; the key is what the player's row stores. name is shown, dye is the Minecraft colour prefix a style is combined with, glow is the outline as #rrggbb. An empty map brings the shipped ten back. |
styles | six styles | One block per style. suffix is combined with the colour's dye (LIME + CONCRETE); a style with a material of its own ignores the colour and always draws that block. An empty map brings the shipped six back. |
default-colour, default-style | lime, concrete | What a new player gets. An id that does not exist is the first key of its map. |
spawn-animation-ticks | 2 | Ticks a target takes to grow in. 0 to 20; 0 pops it in at once. |
A player whose stored size, distance, colour or style falls outside what the file now offers is brought back inside it, so narrowing a range never strands anybody.
scoring
How a session becomes a score, and a score a rating. The formulas are on Scoring.
| Key | Default | Floor | What it does |
|---|---|---|---|
hit-points | 10 | 1 | FLICK and COMBO: points per hit. |
miss-penalty | 4 | 0 | Points lost per miss. |
expire-penalty | 6 | 0 | Points lost per target that expired. |
false-start-penalty-millis | 150 | 0 | REACTION: milliseconds added to the average per click before the light. |
reaction-reference-millis | 250 | 1 | REACTION: an average this fast scores exactly reaction-scale. |
reaction-scale | 1000 | 1 | |
tracking-scale | 10 | 1 | TRACK: points per percent of the session spent on target. |
combo-points | 5 | 0 | COMBO: extra points for a hit that extends a combo. |
size-exponent | 1.0 | Difficulty is (1 / size multiplier) to this power. | |
distance-exponent | 0.75 | …times distance multiplier to this power. | |
min-difficulty, max-difficulty | 0.25, 6.0 | 0.01; max at least min | The difficulty a session is clamped to, whatever the settings say. |
performance
How a single hit is graded, for feedback only; grades do not change the score. A threshold is the slowest
time, in seconds, that still earns that grade. Slower than ok is slow.
| Key | Default | Measures |
|---|---|---|
flick | 0.30 / 0.45 / 0.65 / 0.90 | The time from the previous hit to this one. |
reaction | 0.20 / 0.26 / 0.33 / 0.42 | The time from the target lighting up to the hit. |
feedback
Every entry is an ExyliaLib effect: title, action-bar, boss-bar, sound, particle and
firework, each optional. A sub-section that does nothing is left out of the file, and removing a section
keeps that channel quiet.
| Key | Fires when | Placeholders |
|---|---|---|
perfect, excellent, good, ok, slow | A hit earned that grade. Each has an effect and a chat line, empty for none. | %grade%, %time% (seconds, two decimals), %hits%, %streak%, %combo%, %accuracy% |
miss | A click that hit nothing. | the same, %grade% empty |
expired | A FLICK target ran out of time. | the same |
false-start | A REACTION click before the light. | the same |
rushed | A COMBO hit inside the attack cooldown. | the same |
armed | A REACTION target lit up. | — |
countdown | Counting down before the first target; refreshed with the time left. | %time% |
go | The first target is live. | — |
session-complete | A drill ended. | — |
personal-best | The run beat the player's best rating on that drill. | %rating% |
match-found | Both duellists have arrived in the arena. | — |
round-won, round-lost | A round was decided. | — |
round-draw | A round ended without a winner and is replayed. | — |
match-won, match-lost | The duel was decided. | — |
Players can switch channels off for themselves: with Hit feedback off, the action bar of the grade,
miss, expired, false-start, rushed and armed effects is dropped; with Hit sounds off, their
sound. The title, the boss bar, the particle, the firework and the grade's chat line are always played.
The very first hit of a session has no time to grade and plays only the sound of good.
The effect keys are ExyliaLib's; see the library's effects page.
hud
| Key | Default | What it does |
|---|---|---|
boss-bar.enabled | true | Whether a boss bar shows during a drill or a round. Each player can also turn it off. |
boss-bar.text | drill · time · hits · accuracy · score | Knows %drill%, %time%, %hits%, %misses%, %accuracy%, %score%, %streak% and %opponent_score%. Its progress is the time left. |
boss-bar.colour | PURPLE | PINK, BLUE, RED, GREEN, YELLOW, PURPLE or WHITE. |
boss-bar.overlay | PROGRESS | PROGRESS, NOTCHED_6, NOTCHED_10, NOTCHED_12 or NOTCHED_20. |
boss-bar.refresh-ticks | 5 | Ticks between two redraws. At least 1. |
experience-bar | true | The seconds left on the experience bar. One packet a second; the real experience is sent back on exit. |
hotbar | true | The Change drill, Settings, Play again and Leave buttons drawn over the hotbar, from menus/hotbar.yml. |
hit-particle | ELECTRIC_SPARK|8|0.15|0.15|0.15|0.05 | Particles where a target was hit, in ExyliaLib's particle notation. Empty for none. Each player can turn them off. |
The sidebar lives in scoreboards.yml. See HUD.
match
| Key | Default | What it does |
|---|---|---|
formats | [1, 3, 5] | Best-of lengths offered in the duel screen and accepted by /aim duel. An empty list is [3]. |
default-format | 3 | The length used when a command leaves it out and when a player has not picked one before. Keep it in formats: it is not corrected if it is not. |
allow-even-formats | false | Whether even lengths in formats are offered at all. |
use-preferences | false | Whether a duel keeps the challenger's size and distance. false plays the drill as written for both. |
round-delay | 3.0 | Seconds between a round ending and the next countdown. |
result-delay | 5.0 | Seconds the result stays on screen before both players are sent back. |
duel-request-expiry | 30.0 | Seconds a request stays open. Never less than one. |
See Duels.
practice
Only read when ExyliaPracticeCore is installed. See Compatibility.
| Key | Default | What it does |
|---|---|---|
train-while-queued | true | Lets a player waiting in a practice queue start a drill; they are handed back the moment a match is found. false refuses them with cannot-borrow. |
queue-prompt | true | Sends the practice.queue-prompt lines to a player who joins a queue. Needs train-while-queued on, and is skipped for a player already in a drill or a duel. |
ranked-only | false | Only prompt in ranked queues. |
leaderboard
| Key | Default | What it does |
|---|---|---|
entries | 10 | Rows shown per board. |
cache-seconds | 300 | Seconds a board is kept before the database is asked again. Never less than five. A new personal best drops the cached boards at once. |
accuracy-min-shots | 20 | Shots a session needs before its accuracy can become the player's best accuracy on that drill. |
history
| Key | Default | What it does |
|---|---|---|
entries | 20 | Rows shown in /aim sessions and in /aim history, each. |
retention-days | 30 | Session and duel rows older than this are deleted. 0 keeps everything. |
prune-interval-minutes | 60 | How often the prune runs. At least 1; the first sweep is a minute after start. |
arena
| Key | Default | What it does |
|---|---|---|
max-players-per-arena | 0 | Players one arena hosts at once: one per drill, two per duel. 0 is unlimited. A new drill goes to the ready arena with the fewest players. |
return-location | empty | Where a player is sent after leaving, as world,x,y,z or world,x,y,z,yaw,pitch. Empty sends them back to where they came from. |
chat
| Key | Default | What it does |
|---|---|---|
isolation | true | Keeps a drill's or a duel's chat inside it: whoever is in one reads only that one, and the rest of the server reads none of it. Read per message, so a reload applies it at once. false leaves chat as the server's chat plugin delivers it. |
debug
false by default. true prints debug lines to the console.
When the file is from an older version
config.yml carries a version, and a file written by an older release is migrated on load. Each step
only moves what is still exactly as shipped; a value you changed and a drill you added are never touched.
| From | What changes |
|---|---|
| 1 | Shipped drills still at their old duration (60 or 45 seconds) run 30 seconds. The quiet note-block miss and rushed sounds, if still at their old values, become ENTITY_PLAYER_ATTACK_NODAMAGE and ENTITY_PLAYER_ATTACK_WEAK. |
| 2 | Shipped drill descriptions still reading as shipped are replaced by the shorter lines. |
| 3 | A gridshot without a grid block is copied to a new scatter drill and gridshot becomes the 3×3 grid, unless scatter already exists. Every combo.cooldown-ticks becomes combo.attack-cooldown (true for any value above zero). combo and combo_19 get weapon: DIAMOND_SWORD if they have none, and their names and descriptions are updated if unchanged. sixshot, microshot, spidershot and axe are added if missing. |
| 4 | training.rest-seconds still at the old 20 becomes 5. |
messages.yml
Every line the plugin says. %prefix% expands to the prefix value at the top of the file,
{primary}&lAIM &8•&r by default. Colours are palette tokens; MiniMessage tags work too, and the duel
request uses <click> and <hover> for its Accept and Decline buttons.
A line may open with an effect tag, which never reaches the screen. [sound:NAME|volume|pitch] plays a
sound to whoever receives the line; the defaults use ENTITY_VILLAGER_NO for a refusal,
ENTITY_EXPERIENCE_ORB_PICKUP for something that worked and BLOCK_NOTE_BLOCK_PLING for something that
wants attention. [center] centres the line in chat, as the duel request and the queue prompt do; two tags
share one bracket, [center; sound:…].
| Section | Holds |
|---|---|
no-permission, player-only, player-not-found | The three command refusals. The last knows %player%. |
reload | started, done (%steps%, %ms%), failed. |
common | busy, busy-elsewhere (%plugin%), busy-advice (%reason%), not-in-anything, left, command-blocked, no-packets, no-arena, and the words yes and no. |
training | started (%drill%, %difficulty%), stopped, unknown-drill (%drill%), rest-hint (%seconds%), and the single line sent beside the summary screen: personal-best when the rating beat the player's best, below-best when it did not. Both know %drill%, %kind%, %score%, %rating%, %difficulty%, %hits%, %misses%, %expired%, %shots%, %accuracy%, %streak%, %precision%, %avg_flick%, %best_flick%, %avg_reaction%, %best_reaction%, %false_starts%, %on_target%, %longest_lock%, %combo%, %ping%, %duration%, %best_rating% and %delta%. |
settings | What the settings screen says when a value changes: size and distance (%value%, %difficulty%), colour and style (%value%), toggled (%setting%, %state%), the words on and off, applies-next-drill for a change made while in a drill, and input-title (%min%, %max%) for the window that asks for an exact value. |
match | starting (%opponent%), round-start (%round%, %rounds%, %drill%), round-won, round-lost, round-draw (%round%), ready and opponent-ready (%opponent%), no-arena, unknown-format (%format%), cancelled, opponent-left (%opponent%), forfeited; the round-summary list (%round%, %winner%, %score%, %opponent_score%, %hits%, %accuracy%, %score_for%, %score_against%) and the match-summary list (%winner%, %loser%, %score_winner%, %score_loser%, %format%, %drill%, %hits%, %accuracy%, %duration%). |
duel | request-sent (%target%), the request-received list (%player%, %drill%, %format%, %seconds%), accepted, expired (%player%, to whoever was challenged), expired-sent (%target%, to whoever challenged), no-pending, target-busy (%target%), target-not-ready (%target%, %reason%), self-duel, denied (%player%), denied-by (%target%), and awaiting-answer: the reason other plugins read while a request waits for an answer. |
practice | The queue-prompt list, whose button runs /aim; match-found; cannot-borrow. |
admin | What the admin screens confirm: arena-created, arena-removed, arena-exists, arena-not-found, arena-renamed (%arena%, %name%), spawn-set, arena-enabled, arena-disabled (all %arena%), match-cancelled (%id%), session-stopped and stats-reset (%player%), cancelled. |
menu | Words menus need that are not a whole line: victory-title, defeat-title, none (—), loading, the empty texts empty-history, empty-records, empty-leaderboard, empty-opponents, empty-arenas, empty-matches, empty-sessions; state-none, state-training, state-match for %exyliaaimtrainer_state_label%; reason-busy; set and not-set; overall-board; and the maps below. |
menu also holds four maps:
menu:
categories:
rating:
name: Rating
icon: NETHER_STAR
score:
name: Best score
icon: TARGET
accuracy:
name: Accuracy
icon: SPECTRAL_ARROW
streak:
name: Best streak
icon: BLAZE_POWDER
hits:
name: Most hits
icon: ARROW
reaction:
name: Fastest reaction
icon: CLOCK
combo:
name: Best combo
icon: IRON_SWORD
kinds:
flick: Flicking
reaction: Reaction
track: Tracking
combo: Combo
units:
flick: " pts/min"
reaction: " pts"
track: " pts"
combo: " pts/min"
toggles:
sidebar: Sidebar
boss_bar: Boss bar
action_bar: Hit feedback
hit_sounds: Hit sounds
particles: Hit particlescategories names and iconises the seven leaderboard categories, kinds names each drill kind on a row,
units is what follows a score of that kind, and toggles names the five switches in the settings screen.
A category missing from the map shows its key on a PAPER icon.
Two keys are written to the file and read by nothing: menu.reason-self and menu.difficulty-label.
scoreboards.yml
Two sidebars, training and match, each an ExyliaLib sidebar with enabled, title, lines and
update (interval in ticks, 10 by default, smart, cache). The lines are driven by the plugin's
%exyliaaimtrainer_*% placeholders. A player sees the board of what they are doing only while they are in a drill or
a duel, and only with their Sidebar switch on. See HUD and
Placeholders.
menus/
Every screen is a YAML file under menus/, plus hotbar.yml for the buttons shown during a drill.
menus/admin/ and menus/hotbar.yml are rewritten from the jar on every start and every reload; the
other files are kept up to date without undoing your edits. The file list, what each screen does and every
aimtrainer: action are on Menus.
database.yml
Written by ExyliaLib the first time the plugin starts: H2 by default, with MySQL, MariaDB, PostgreSQL and MongoDB as alternatives. Arenas, profiles, records, session history and duel history all live there. See the library's database page.
Something missing on this page? Tell us on Discord