Configuration
A walk through config.yml section by section, plus how the self-updating version keys work.
config.yml holds behaviour, storage, limits and sounds. Menus live in
gui.yml and chat text lives in lang/. The split is
deliberate: restyling a menu means editing one file, not three.
/ah reloadre-reads all three files. The one exception is DATABASE.TYPE, which needs a full server
restart.
A reload closes every open menu first. Any item a player had handed to a menu is given back before the files are re-read.
Config versions
At the top of each file sits a version key: CONFIG-VERSION in config.yml,
GUI-VERSION in gui.yml and LANG-VERSION in each language file.
When you install a newer build, the copy bundled in the jar is compared against yours. New keys and their explanatory comments are merged into your file, your values are kept exactly as you set them, and keys that no longer exist are removed. Then the version number is written back.
Do not edit a version key by hand. Lowering it forces the old layout to be re-applied.
Two things follow from this that are worth knowing:
- A deleted key is not a broken key. Defaults are served from the jar's own copy, so a key you removed resolves to the shipped value instead of nothing.
- You can force a re-merge by lowering the version number deliberately, if you ever need to.
GENERAL
GENERAL:
LANGUAGE: english
METRICS: true| Key | What it does | Default |
|---|---|---|
LANGUAGE | Which file inside lang/ supplies player-facing text, without the .yml | english |
METRICS | Anonymous usage reporting to ArrowStats | true |
LANGUAGE accepts english, spanish, french, japanese or the name of any file you
drop into lang/ yourself. An unknown name falls back to English with a warning rather
than failing startup. See Languages.
METRICS reports server and player count, Minecraft version, server software and plugin
version once every 30 minutes on a background thread. No player data, no IPs, nothing
identifying. Turning it off is fine and has no effect on anything else.
DATABASE
DATABASE:
TYPE: SQLITE| Value | Use it for |
|---|---|
SQLITE | A single server. One file, zero setup |
MYSQL | A shared server, required if several servers share listings |
MONGODB | A shared server, document storage |
An unknown TYPE falls back to SQLITE with a warning.
Changing TYPE needs a full restart and does not migrate existing data. See
Storage for the full breakdown of each backend, including the MySQL TLS
keys.
CROSS-SERVER
CROSS-SERVER:
ENABLED: false
SERVER-ID: "auction-server-1"Off by default. When you turn it on, every server must share one database and one Redis,
and every server needs a unique SERVER-ID.
The REDIS block and the four SYNC switches are covered in full on
Cross-server.
SERVER-ID is used even with cross-server mode off. It is attached to every listing and
every payout, and it shows up in /ah about.
AUCTION
This is the section most servers actually tune.
AUCTION:
DEFAULT-DURATION-SECONDS: 86400
MIN-PRICE: 10.0
MAX-PRICE: 1000000.0
MAX-LISTINGS-PER-PLAYER: 10
BROADCAST-PRICE-THRESHOLD: 500000.0
BUY-CONFIRMATION: true
COMPACT-PRICE-INPUT: false
EXPIRY-SWEEP-INTERVAL-SECONDS: 60
BLACKLIST:
- "AIR"
# ...| Key | What it does | Default |
|---|---|---|
DEFAULT-DURATION-SECONDS | How long a new listing stays up before it expires and returns to the seller | 86400 (24 hours) |
MIN-PRICE | Lowest price accepted when creating a listing | 10.0 |
MAX-PRICE | Highest price accepted | 1000000.0 |
MAX-LISTINGS-PER-PLAYER | Baseline active listings per player, raised per rank by permission | 10 |
BROADCAST-PRICE-THRESHOLD | Listings at or above this price are announced server-wide | 500000.0 |
BUY-CONFIRMATION | Show a confirm screen before money changes hands | true |
COMPACT-PRICE-INPUT | Accept 1.5k, 10k, 1m, 2.5b as prices | false |
EXPIRY-SWEEP-INTERVAL-SECONDS | How often the server sweeps for expired listings | 60 |
BLACKLIST | Bukkit material names that may never be listed | See below |
Useful durations: 3600 is one hour, 86400 is a day, 604800 is a week.
EXPIRY-SWEEP-INTERVAL-SECONDS is clamped to a minimum of 5 seconds internally. Below 20
is not useful in practice, since a listing expiring a few seconds late costs nobody
anything.
If MIN-PRICE ends up above MAX-PRICE, the plugin swaps them at load time and logs a
warning, so listings stay possible.
The shipped BLACKLIST covers bundles, command blocks, structure blocks, barriers, light
blocks, debug sticks, knowledge books and AIR. Add your own custom-item materials to it.
Matching is on the Bukkit material name and is case-insensitive. See
Selling.
FORMATTING
How prices are written wherever the plugin shows one: {price} in gui.yml, {min} and
{max} in your language file, and the broadcast line.
FORMATTING:
CURRENCY-SYMBOL: "$"
MAGNITUDE-SUFFIXES:
- ""
- "K"
- "M"
- "B"
- "T"
- "Q"| Key | What it does | Default |
|---|---|---|
CURRENCY-SYMBOL | Written in front of every price | "$" |
MAGNITUDE-SUFFIXES | Short forms for thousands, millions and up | "", K, M, B, T, Q |
CURRENCY-SYMBOL
Set it to "" for bare numbers. A player may type it or leave it out, so $1500 and
1500 are both accepted at the price prompt. Only a leading symbol is stripped. Anywhere
else in the number it is treated as a typo and the price is refused.
MAGNITUDE-SUFFIXES
The list is positional. Each entry is one step of 1000.
| Position | Stands for | Example |
|---|---|---|
| 1 | Ones. Leave it empty | 500 renders as $500 |
| 2 | Thousands | 1000 renders as $1K |
| 3 | Millions | 1000000 renders as $1M |
| 4 | Billions | 1000000000 renders as $1B |
Add as many entries as you like. A price above the last entry stops scaling, so keep the list long enough for your economy. The shipped list reaches a quadrillion.
The list needs at least two entries, the empty ones slot plus one more. A shorter list is refused with a warning and the built-in list is kept, because the entries are positional and half a list would misread what players type.
Whatever you put here is also what the price prompt understands, so renaming K to mil
makes 2.5mil a valid thing for a player to type. Matching ignores case, and the longest
suffix wins, so a short m never shadows a longer mil.
Suffixes are only accepted as input when AUCTION.COMPACT-PRICE-INPUT is on. Display
always uses them. See Selling.
Why these two are not in the language files
The currency symbol and the magnitude suffixes are read back when a player types a price, so they are part of what the plugin accepts rather than only how it displays.
Time unit labels are the other way round. Nothing ever parses a duration back from a
player, so they are display only and genuinely translatable. They live in the TIME block
of your language file instead. See Languages.
SEARCH
SEARCH:
METHOD: ANVIL
CHAT-TIMEOUT-SECONDS: 60| Key | What it does | Default |
|---|---|---|
METHOD | How the in-menu Search button asks for text: ANVIL, SIGN or CHAT | ANVIL |
CHAT-TIMEOUT-SECONDS | CHAT method only. Seconds to wait before the prompt expires. 0 waits indefinitely | 60 |
An unknown METHOD falls back to ANVIL with a warning. /ah search <query> works
regardless of this setting. The three methods are compared side by side on
Auction house.
SOUNDS
SOUNDS:
BUY-SUCCESS: "ENTITY_EXPERIENCE_ORB_PICKUP|1.0|1.0"The format is SOUND_NAME|volume|pitch.
SOUND_NAMEis any sound key your server version knows. Both the Bukkit constant name (ENTITY_VILLAGER_NO) and the namespaced key (minecraft:entity.villager.no) work.volumeis1.0for normal. Above1.0increases the audible range.pitchruns from0.5(low) through1.0(normal) to2.0(high).
Set any entry to "" to play nothing.
| Key | Plays when | Default |
|---|---|---|
BUY-SUCCESS | A purchase completed | ENTITY_EXPERIENCE_ORB_PICKUP |
LISTING-COLLECT | An item was taken out of the collection box | UI_LOOM_TAKE_RESULT |
LISTING-SUCCESS | A listing was created | UI_CARTOGRAPHY_TABLE_TAKE_RESULT |
ERROR-SOUND | Any refusal: no funds, blacklisted item, listing gone | ENTITY_VILLAGER_NO |
MENU-INTERACTION | Generic button press | UI_BUTTON_CLICK |
MENU-REFRESH | Listings were re-pulled from the database | UI_TOAST_IN |
MENU-NEXT-PAGE | Paging forward | ITEM_BOOK_PAGE_TURN |
MENU-BACK-PAGE | Paging back | ITEM_BOOK_PAGE_TURN |
COMMAND-HELP | /ah help was shown | ENTITY_EXPERIENCE_ORB_PICKUP |
SALE-NOTIFY | Played to the seller when their item sells | ENTITY_PLAYER_LEVELUP |
An unknown sound name is skipped and logged exactly once, not once per click. Sounds are read live, so an edit takes effect on the next click without a reload.
Colours
Anywhere text is configurable, in config.yml, gui.yml and lang/, you can use:
| Form | Example |
|---|---|
| Legacy codes | &a, &b, &l |
| Hex | &#ff8800 |
| Hex tag | <#ff8800>text</#ff8800> |
| Gradient | <gradient:#ff0000:#0000ff>text</gradient> |
| Rainbow | <rainbow>text</rainbow> |
There is also a named palette of 125 colours.
Dead keys
There are none. Every key shipped in config.yml, gui.yml and lang/english.yml is
read by the plugin at runtime. Nothing in the shipped configuration is decorative.