Configuration
AquaCore generates four kinds of file on first boot.
- config.yml
- messages.yml
- modules.yml
- welcome.yml
- vip.yml
Apply changes with /aqua reload. A file with invalid YAML is rejected and the previous values stay
loaded.
config.yml
settings:
# Prefix prepended to every plugin message.
prefix: "&ecff&lAqua�a84ffCore &8» &r"
# Language file to load from /lang. Falls back to 'en'.
language: en
# Check GitHub for new releases on startup.
check-updates: true
# Print timings for every broadcast into console.
debug: false
broadcast:
# Only console may run /aqua broadcast.
console-only: true
# Declared argument keys. Anything not listed here is rejected.
custom-args:
- player
- rank
- price
# Separator inserted between multi-value arguments.
separator: "&8, &r"
# Text used by /aqua preview for arguments you did not supply.
preview-fallback: "&7<none>"
# Seconds a sender must wait between broadcasts. 0 disables it.
cooldown: 3
heads:
# Pixels per head line. 8 is the classic look.
resolution: 8
# How long a fetched skin stays cached, in minutes.
cache-minutes: 60
# Character used to paint each pixel.
symbol: "█"| Key | Type | Default | Effect |
|---|---|---|---|
settings.prefix | string | &ecff&lAqua… | Prepended to plugin output, not to templates |
settings.language | string | en | File loaded from lang/<value>.yml |
settings.check-updates | boolean | true | One HTTPS call on startup, nothing else |
settings.debug | boolean | false | Verbose console timings |
broadcast.console-only | boolean | true | Blocks players even with the node |
broadcast.custom-args | list | 3 entries | Undeclared args reject the broadcast |
broadcast.separator | string | &8, &r | Used for a;b;c values |
broadcast.cooldown | integer | 3 | Seconds; aquacore.bypass.cooldown ignores it |
heads.resolution | integer | 8 | 8, 16 or 32; higher is slower |
heads.cache-minutes | integer | 60 | 0 disables caching |
heads.resolution: 32 produces 32 chat lines per head. It looks great in a screenshot and terrible
in a live chat. Keep it at 8 unless you know exactly what you are doing.
messages.yml
Every string the plugin can print. Set a value to "" to silence that message entirely.
general:
no-permission: "&cYou don't have permission to do that."
player-only: "&cThis command can only be executed by a player."
console-only: "&cThis command can only be executed from console."
reload-success: "&aReloaded &f{files} &afiles in &f{ms}ms&a."
reload-failed: "&cReload aborted — &f{file} &cline &f{line}&c: {reason}"
broadcast:
unknown-template: "&cUnknown template: &f{template}"
unknown-argument: "&cArgument does not exist: &f{argument}"
missing-argument: "&cMissing required argument: &f{argument}"
malformed: "&cMissing '(' or ')' in arguments."
cooldown: "&cWait &f{seconds}s &cbefore broadcasting again."| Placeholder | Available in |
|---|---|
{files}, {ms} | general.reload-success |
{file}, {line}, {reason} | general.reload-failed |
{template} | broadcast.unknown-template |
{argument} | broadcast.unknown-argument, broadcast.missing-argument |
{seconds} | broadcast.cooldown |
modules.yml
modules:
broadcast: true
messages: true
placeholders: true
heads: false
webhook: false
metrics: trueSee Overview → Modules for what each one provides.
Template files
One file per template, inside templates/. The file name is the template name — vip.yml is fired
with /aqua broadcast vip.
# Optional node required to fire this template.
permission: aquacore.template.welcome
# Arguments that MUST be supplied or the broadcast is rejected.
required-args:
- player
chat:
- ""
- " &ecff&l{player} &fjoined the server"
- " &7Rank: �a84ff{rank}"
- ""
title:
enabled: true
text: "&ecff{player}"
subtitle: "&7welcome aboard"
fade-in: 10
stay: 40
fade-out: 10
actionbar:
enabled: false
text: "&7{player} joined"
bossbar:
enabled: false
text: "&ecff{player} &fjoined as �a84ff{rank}"
color: BLUE
style: SOLID
seconds: 6
sound:
enabled: true
name: ENTITY_PLAYER_LEVELUP
volume: 1.0
pitch: 1.2
head:
enabled: false
# Chat lines are rendered to the right of the head.
lines:
- "&ecff&l{player}"
- "&7Rank: �a84ff{rank}"
webhook:
enabled: false
url: "https://discord.com/api/webhooks/…"
title: "New rank purchased"
description: "**{player}** bought **{rank}** for **{price}**"
color: "#38ecff"
thumbnail: "https://mc-heads.net/avatar/{player}"Field reference
| Section | Key | Type | Notes |
|---|---|---|---|
| — | permission | string | Optional. Omit for no restriction |
| — | required-args | list | Missing one rejects the broadcast |
chat | — | list | Empty strings render as blank lines |
title | fade-in / stay / fade-out | ticks | 20 ticks = 1 second |
bossbar | color | enum | PINK, BLUE, RED, GREEN, YELLOW, PURPLE, WHITE |
bossbar | style | enum | SOLID, SEGMENTED_6, SEGMENTED_10, SEGMENTED_12, SEGMENTED_20 |
sound | name | enum | Any Bukkit Sound constant |
sound | pitch | float | 0.5 – 2.0 |
head | lines | list | Max 8 lines, matches head height |
webhook | color | HEX | With or without the leading # |
Never commit a template containing a real webhook.url to a public repository. Discord invalidates
leaked webhooks, and anyone who finds it can post to your server’s channel until it is revoked.
A section with enabled: false is skipped entirely — its other keys are not even parsed, so you can
leave half-finished configuration in place while you work on it.