Content generated with AI — it may contain mistakes.

Reference

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.

plugins/ExyliaAimTrainer/config.yml
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: false

training

KeyDefaultWhat it does
countdown3.0Seconds before the first target is live, in a drill and in every duel round. A punch skips it.
rest-seconds5.0Seconds 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-drillgridshotThe 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.

An empty drills section brings the shipped ones back

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.

KeyRuleWhat it does
display-nameWhat players see. Palette tokens allowed.
iconBlank is TARGET.Material or head used in menus.
descriptionOne line shown under the drill in menus.
kindMissing is FLICK.FLICK, REACTION, TRACK or COMBO.
weightZero or less is 1.0.How hard the drill is by itself; multiplies the rating of every session.
durationZero or less is 30.0.Seconds a session lasts. A REACTION drill ends on its attempts; this is its cap.
targetsAt least 1.Targets on screen at once. FLICK only; the other kinds use one.
sizeZero or less is 0.8.Edge of a target in blocks, before the player's size setting.
heightAt least 0.Height of a target, or 0 for a cube. The player-shaped targets ship with 1.8.
distance.min, distance.maxmin at least 1.0; max at least min.How far from the eyes a target is placed, before the player's distance setting.
spread.yaw0 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.
gridLeft 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.
lifetimeAt least 0.Seconds a FLICK target stays up before it counts as expired. 0 never expires.
orderedFLICK only: targets come in order and only the lit one counts; the rest are misses.
return-to-centreFLICK only: every other target sits dead ahead.
min-separationAt least 0.Degrees kept between two targets on screen.
weaponA material put in the player's hand for the drill. Empty keeps the hand empty.
motionLeft 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.
reactionLeft out unless used.min-delay (at least 0.2), max-delay (at least min-delay), attempts. attempts: 0 turns it off.
comboLeft 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.

KeyDefaultWhat it does
size0.1 – 2.5, step 0.05, default 1.0Target 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.
distance0.25 – 3.0, step 0.05, default 1.0Target distance as a multiplier, with the same rules.
coloursten coloursOne 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.
stylessix stylesOne 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-stylelime, concreteWhat a new player gets. An id that does not exist is the first key of its map.
spawn-animation-ticks2Ticks 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.

KeyDefaultFloorWhat it does
hit-points101FLICK and COMBO: points per hit.
miss-penalty40Points lost per miss.
expire-penalty60Points lost per target that expired.
false-start-penalty-millis1500REACTION: milliseconds added to the average per click before the light.
reaction-reference-millis2501REACTION: an average this fast scores exactly reaction-scale.
reaction-scale10001
tracking-scale101TRACK: points per percent of the session spent on target.
combo-points50COMBO: extra points for a hit that extends a combo.
size-exponent1.0Difficulty is (1 / size multiplier) to this power.
distance-exponent0.75…times distance multiplier to this power.
min-difficulty, max-difficulty0.25, 6.00.01; max at least minThe 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.

KeyDefaultMeasures
flick0.30 / 0.45 / 0.65 / 0.90The time from the previous hit to this one.
reaction0.20 / 0.26 / 0.33 / 0.42The 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.

KeyFires whenPlaceholders
perfect, excellent, good, ok, slowA hit earned that grade. Each has an effect and a chat line, empty for none.%grade%, %time% (seconds, two decimals), %hits%, %streak%, %combo%, %accuracy%
missA click that hit nothing.the same, %grade% empty
expiredA FLICK target ran out of time.the same
false-startA REACTION click before the light.the same
rushedA COMBO hit inside the attack cooldown.the same
armedA REACTION target lit up.—
countdownCounting down before the first target; refreshed with the time left.%time%
goThe first target is live.—
session-completeA drill ended.—
personal-bestThe run beat the player's best rating on that drill.%rating%
match-foundBoth duellists have arrived in the arena.—
round-won, round-lostA round was decided.—
round-drawA round ended without a winner and is replayed.—
match-won, match-lostThe 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

KeyDefaultWhat it does
boss-bar.enabledtrueWhether a boss bar shows during a drill or a round. Each player can also turn it off.
boss-bar.textdrill · time · hits · accuracy · scoreKnows %drill%, %time%, %hits%, %misses%, %accuracy%, %score%, %streak% and %opponent_score%. Its progress is the time left.
boss-bar.colourPURPLEPINK, BLUE, RED, GREEN, YELLOW, PURPLE or WHITE.
boss-bar.overlayPROGRESSPROGRESS, NOTCHED_6, NOTCHED_10, NOTCHED_12 or NOTCHED_20.
boss-bar.refresh-ticks5Ticks between two redraws. At least 1.
experience-bartrueThe seconds left on the experience bar. One packet a second; the real experience is sent back on exit.
hotbartrueThe Change drill, Settings, Play again and Leave buttons drawn over the hotbar, from menus/hotbar.yml.
hit-particleELECTRIC_SPARK|8|0.15|0.15|0.15|0.05Particles 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

KeyDefaultWhat 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-format3The 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-formatsfalseWhether even lengths in formats are offered at all.
use-preferencesfalseWhether a duel keeps the challenger's size and distance. false plays the drill as written for both.
round-delay3.0Seconds between a round ending and the next countdown.
result-delay5.0Seconds the result stays on screen before both players are sent back.
duel-request-expiry30.0Seconds a request stays open. Never less than one.

See Duels.

practice

Only read when ExyliaPracticeCore is installed. See Compatibility.

KeyDefaultWhat it does
train-while-queuedtrueLets 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-prompttrueSends 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-onlyfalseOnly prompt in ranked queues.

leaderboard

KeyDefaultWhat it does
entries10Rows shown per board.
cache-seconds300Seconds 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-shots20Shots a session needs before its accuracy can become the player's best accuracy on that drill.

history

KeyDefaultWhat it does
entries20Rows shown in /aim sessions and in /aim history, each.
retention-days30Session and duel rows older than this are deleted. 0 keeps everything.
prune-interval-minutes60How often the prune runs. At least 1; the first sweep is a minute after start.

arena

KeyDefaultWhat it does
max-players-per-arena0Players 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-locationemptyWhere 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

KeyDefaultWhat it does
isolationtrueKeeps 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.

FromWhat changes
1Shipped 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.
2Shipped drill descriptions still reading as shipped are replaced by the shorter lines.
3A 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.
4training.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:…].

SectionHolds
no-permission, player-only, player-not-foundThe three command refusals. The last knows %player%.
reloadstarted, done (%steps%, %ms%), failed.
commonbusy, busy-elsewhere (%plugin%), busy-advice (%reason%), not-in-anything, left, command-blocked, no-packets, no-arena, and the words yes and no.
trainingstarted (%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%.
settingsWhat 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.
matchstarting (%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%).
duelrequest-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.
practiceThe queue-prompt list, whose button runs /aim; match-found; cannot-borrow.
adminWhat 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.
menuWords 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:

plugins/ExyliaAimTrainer/messages.yml
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 particles

categories 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.

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