Skip to content

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

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: ""

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.

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_ATTRIBUTES

Tokens: {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 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.

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.

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"

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: [ ]

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!" ]

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}"

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: { }

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"