config.yml
Global settings. After editing, run /cosmeticsadmin reload. This is the largest file; the top of it
holds behavior, the rest is menu theming (rarities, lore, sounds). Sections you don’t touch keep their
defaults.
Settings
Section titled “Settings”Settings: Save-Interval: 60 Show-Locked: true Database: "SQLite" Economy: "Vault" Placeholder-Format: "Legacy" Paint-Chat-Message: true| Key | Default | Description |
|---|---|---|
Save-Interval |
60 |
Seconds between player-data write-behind flushes to the database. |
Show-Locked |
true |
true shows cosmetics the player doesn’t own (locked) in the menu; false shows only owned cosmetics. The Owned filter always shows owned only. |
Database |
SQLite |
Storage backend. Only MySQL (case-insensitive) uses MySQL; anything else uses SQLite. |
Economy |
Vault |
Currency provider for the market and cases: Vault, PlayerPoints or RivalCredits. If it’s missing or the plugin isn’t installed, buying is disabled. |
Placeholder-Format |
Legacy |
How text placeholders are returned: Legacy (§/§x codes) or MiniMessage (MiniMessage tags). Match this to your chat/nametag plugin. |
Paint-Chat-Message |
true |
When true, the plugin recolors a player’s own chat message with their equipped chat color (the chat-color Value must contain {context}). When false, the plugin never touches chat - render chat colors through your chat plugin using the placeholder instead. |
Currency-Formats
Section titled “Currency-Formats”How money amounts are displayed everywhere in the market and cases. One entry per economy provider;
the entry matching Settings.Economy is used. This formatting is always applied to the raw amount -
the underlying economy’s own number formatting is not used for display.
Currency-Formats: Vault: Format: "&a{amount} &2Money" Amount-Format: "comma" PlayerPoints: Format: "&e{amount} &6Points" Amount-Format: "abbreviated" RivalCredits: Format: "&c{amount} &4Credits" Amount-Format: "plain"| Key | Description |
|---|---|
Format |
Template for the money string. {amount} is the only token. |
Amount-Format |
How {amount} is rendered: comma (1,234,567, default), plain (1234.5, up to 2 decimals, no grouping), or abbreviated (1.5k, 2.0M, 1.0B, …). Aliases: short/compact = abbreviated; none/raw = plain. |
Used only when Settings.Database: "MySQL". Point several servers at the same database and player
ownership, equips and listings sync between them (so equips carry across gamemodes).
MySQL: Host: "localhost" Port: 3306 Database: "optimalcosmetics" Username: "root" Password: ""Market
Section titled “Market”The player-to-player market. See the Market guide for the full flow.
Market: Listing-Fee: 0 Sale-Tax: 0.0 Min-Price: 1 Max-Price: 1000000 Max-Listings: 10 Expiry-Days: 7 Confirm-Purchase: true| Key | Default | Description |
|---|---|---|
Listing-Fee |
0 |
Currency charged to the seller when a listing is created. Charged only if > 0 and an economy is available. |
Sale-Tax |
0.0 |
Percentage taken from the seller’s proceeds. The buyer pays the full price; the seller receives price - price × tax ÷ 100. |
Min-Price |
1 |
Minimum listing price. Enforced only when > 0. |
Max-Price |
1000000 |
Maximum listing price. 0 disables the cap. |
Max-Listings |
10 |
Default number of active listings a player may have. 0 = unlimited. Override per player with /cosmeticsadmin maxlistings. |
Expiry-Days |
7 |
Days before a listing expires and returns to the seller. 0 = never expire. Expired listings are swept about once a minute. |
Confirm-Purchase |
true |
Show the confirm menu before buying. false buys on the first click. |
Prices are whole numbers. Listing-Fee and Sale-Tax are the only decimals.
Voucher
Section titled “Voucher”A global fallback voucher template. A cosmetic’s own
Voucher block (in its cosmetic file) always wins over this; this is used only for cosmetics that have
no Voucher block of their own. If a cosmetic has neither, it can’t be given as a voucher.
Voucher: Material: PAPER Name: "&f{cosmetic}" Lore: - "&8Cosmetic [{count} exist]" - "" - "&7You can claim this cosmetic voucher" - "&7and equip this cosmetic in &f/cosmetics&7." - "" - "{primary}Information:" - "{secondary} - &7Type: &f{type}" - "{secondary} - &7Created: &f{date}" - "" - "&e➥ Click to redeem!" Item-Flags: - HIDE_ATTRIBUTESTokens: {cosmetic} (name), {rarity}, {type}, {count} (how many cosmetics of that type exist),
{date} (MM/dd/yyyy), {primary} / {secondary} (rarity colors). It’s a standard
item definition.
Categories & Types
Section titled “Categories & Types”Categories sets the two built-in filter names; Types toggles each cosmetic type and names its
filter category. A disabled type is hidden from the menu, the market and the filter.
Categories: All: "All" Owned: "Owned Cosmetics"
Types: Chat-Colors: Enabled: true Name: "Chat Colors" Tags: Enabled: true Name: "Tags" # Name-Paints, Glow, Tab-Icon, Join-Message, Leave-Message …The menu filter cycles through: All, Owned, then the Name of each enabled type.
Sort-Types & Sort-Types-Market
Section titled “Sort-Types & Sort-Types-Market”Keyed maps of sort-key: "Display Name". The key drives the sort; the value is the label shown.
Remove an entry to drop that sort option.
Sort-Types: Item: "Item" Rarity: "Rarity" Alphabetical: "Alphabetical"
Sort-Types-Market: Recent: "Recent" Price-Low: "Price Low to High" Price-High: "Price High to Low" Alphabetical: "Alphabetical"| Menu key | Orders by |
|---|---|
item |
The cosmetic Order field (configured order). Any unrecognized key behaves like this. |
rarity |
Rarity rank (highest-ranked rarity first). |
alphabetical |
Cosmetic id, case-insensitive. |
| Market key | Orders by |
|---|---|
recent |
Newest listing first. Any unrecognized key behaves like this. |
price-low |
Price ascending. |
price-high |
Price descending. |
alphabetical |
Cosmetic id, case-insensitive. |
Rarity-Colors
Section titled “Rarity-Colors”Rarities are fully dynamic - add or remove any you like. Config order is rank: the first entry is
the highest. Each has a Primary and Secondary color used to fill {primary} / {secondary}
wherever they appear (cosmetic names, lore, vouchers). An unknown rarity falls back to gray and sorts
last.
Rarity-Colors: Exotic: Primary: "<#fa2590>" Secondary: "<#9c1357>" Legendary: Primary: "&e" Secondary: "&6" Epic: Primary: "&d" Secondary: "&5" Rare: Primary: "&b" Secondary: "&3" Common: Primary: "&a" Secondary: "&2"Lore-Addons
Section titled “Lore-Addons”Extra lore appended to a cosmetic’s own Lore in the menu, chosen by the viewer’s state: Equipped,
Unequipped or Locked (not owned). Tokens: {primary}, {secondary}, {type}, {rarity},
{count}.
Lore-Addons: Equipped: - "&7This cosmetic is currently equipped." - "" - "{primary}Information:" - "{secondary} - &7Type: &f{type}" - "{secondary} - &7Rarity: &f{rarity}" - "{secondary} - &7Exists: &f{count}" - "" - "&e➥ Click to unequip!" Unequipped: [ … ] Locked: [ … ]Market-Listing-Lore
Section titled “Market-Listing-Lore”Lore for market listings, chosen by the viewer’s relationship to the listing: Own-Listing,
Already-Owned, or Buyable. Tokens: {seller}, {price}, {type}, {expires}.
Market-Listing-Lore: Buyable: - "&8Cosmetic Market" - "" - "&eInformation:" - "&6 - &7Seller: &f{seller}" - "&6 - &7Price: &f{price}" - "&6 - &7Type: &f{type}" - "&6 - &7Expires in: &c{expires}" - "" - "&e➥ Click to buy!" Own-Listing: [ … "&e➥ Click to remove!" ] Already-Owned: [ … "&c➥ You already have this cosmetic!" ]Selection formats
Section titled “Selection formats”Filter-Item, Sort-Item and Sort-Item-Market are the per-line templates that build the option
lists printed on the filter/sort buttons (the {print-categories} / {print-sort-types} /
{print-sort-types-market} tokens). Selected renders the current choice, Unselected the rest.
Filter-Item: Selected: "&3 - &3> &f{category} &3<" Unselected: "&3 - &7{category}"Sort-Item: Selected: "&5 - &5> &f{sort} &5<" Unselected: "&5 - &7{sort}"Sort-Item-Market: Selected: "&5 - &5> &f{sort-market} &5<" Unselected: "&5 - &7{sort-market}"Temporary-Icons
Section titled “Temporary-Icons”Feedback icons that flash for about two seconds in the clicked slot. No-Previous-Page and
No-Next-Page are required; Locked, Insufficient-Funds and Already-Owned are optional (they
flash on a blocked click when present). Each is a standard
item definition.
Temporary-Icons: No-Previous-Page: Material: BARRIER Name: "&c&lError!" Lore: - "&7You are already on the first page!" No-Next-Page: { … } Locked: { … } Insufficient-Funds: { … } Already-Owned: { … }Inventories-Sounds
Section titled “Inventories-Sounds”Named sounds in "NAME;volume;pitch" form (XSound names, stable across versions), played by the
menus. Keys: MENU-OPEN, MARKET-OPEN, PAGE-CHANGED, NO-PAGE-FOUND, FILTER-CYCLE,
SORT-CYCLE, EQUIP, UNEQUIP, DENY.
Inventories-Sounds: "MENU-OPEN": "ENTITY_BAT_TAKEOFF;1;1" "EQUIP": "ENTITY_PLAYER_LEVELUP;1;1.5" "UNEQUIP": "BLOCK_NOTE_BLOCK_BASS;1;1" "DENY": "BLOCK_NOTE_BLOCK_PLING;1;0.5"