Cosmetics

Cosmetics live in cosmetics.yml and use config-version: 3.

AtlasLobby supports three cosmetic types:

  • Particles.
  • Hats.
  • Gadgets.

Cosmetics are organized into categories, tagged with rarities, and shown through an auto-generated cosmetics menu. A player can equip one cosmetic per slot at the same time: one particle, one hat, and one gadget.

File Structure

config-version: 3
enabled: true
gadget-slot: 3            # hotbar slot (0-8) the equipped gadget item occupies
# ... global particle settings ...

rarities:   # tier colour, glow, and sort order
categories: # the tabs shown in the cosmetics menu
status:     # the "click to..." hint line, per state
cosmetics:  # the cosmetics themselves

Global Settings

enabled: true
update-interval-ticks: 4
max-particles-per-player-update: 24
max-preview-particles: 32
disable-while-sneaking: true
disable-while-flying: false
gadget-slot: 3
worlds: []
disabled-worlds: []
select-sound:
  enabled: true
  sound: ENTITY_EXPERIENCE_ORB_PICKUP
  volume: 1
  pitch: 1.4
SettingMeaning
enabledTurns the cosmetics system on or off.
update-interval-ticksHow often particle cosmetics update.
max-particles-per-player-updateGlobal particle budget per player update.
max-preview-particlesParticle budget for previews.
disable-while-sneakingStops rendering while sneaking.
disable-while-flyingStops rendering while flying.
gadget-slotHotbar slot, 0-8, used by equipped gadgets.
worlds / disabled-worldsOptional world filters.
select-soundSound played when a cosmetic is selected.

Rarities

Rarities define the tier label, whether items glow, and the tier sort order.

rarities:
  common:    { display: "&fCommon",    glow: false, order: 1 }
  rare:      { display: "&bRare",      glow: true,  order: 3 }
  mythic:    { display: "<gradient:#ff5eae:#ffd45c>Mythic</gradient>", glow: true, order: 6 }
FieldPurpose
displayColored label used by %rarity_display%.
glowWhen true, available and selected cosmetics of this rarity show an enchant glint in the menu.
orderRarity sort reference. Cosmetic menu order still comes from each cosmetic’s order field, or file order when omitted.

Categories

Categories become tabs in the cosmetics menu.

categories:
  particles: { display: "<gradient:#55ccff:#8ae6ff>Particles</gradient>", icon: BLAZE_POWDER,    order: 1 }
  hats:      { display: "&#ffd45cHats",                                   icon: LEATHER_HELMET,  order: 2 }
  gadgets:   { display: "&#ff8af0Gadgets",                                icon: FIREWORK_ROCKET, order: 3 }

Category tabs are switched with the set_category: <id> menu action. See Menus and Actions.

Status Lines

The status map creates the %cosmetic_status% placeholder shown at the bottom of each cosmetic’s lore.

It supports one entry per state:

  • available
  • selected
  • purchasable
  • locked
  • disabled
  • default
status:
  available:   "&e▶ &7Click to equip &8• &7Shift-Right to preview"
  selected:    "&a✔ Equipped &8• &7Click to unequip"
  purchasable: "&6✦ Click to purchase for %cosmetic_cost%"
  locked:      "&c✖ Locked"
  disabled:    "&8Unavailable"

Cosmetic Definition

Each cosmetic is defined under cosmetics.

cosmetics:
  atlas-ring:
    type: particle          # particle | hat | gadget
    category: particles
    rarity: uncommon
    cost: 0                  # coin price (0 = free / permission only)
    permission: "atlaslobby.cosmetic.atlas-ring"
    # Particle tuning lives at the top level.
    particle: END_ROD
    animation: ring
    radius: 1.25
    speed: 0.2
    max-particles: 14
    # The menu item. For hats/gadgets, this is also the worn/held item.
    icon:
      material: ENDER_EYE
      name: "&bAtlas Ring"
      lore:
        - "&7A crisp orbit at your feet."
        - ""
        - "&8Rarity &7%rarity_display%"
        - "&8Price &7%cosmetic_cost%"
        - ""
        - "%cosmetic_status%"
FieldPurpose
typeparticle, hat, or gadget. Defaults to particle.
categoryWhich tab it appears under. Defaults by type.
rarityOne of the configured rarities keys.
costCoin price. 0 means free, or permission-gated only.
priceLegacy Vault price fallback. Used only when cost is 0.
orderSort position inside the category.
permissionPermission required to equip. Defaults to atlaslobby.cosmetic.<id>.
iconThe item shown in the menu. For hats and gadgets, this is also the worn or held item.

Inside icon.name and icon.lore, you can use:

PlaceholderMeaning
%cosmetic_name%Cosmetic display name.
%rarity_display%Rarity display text.
%cosmetic_cost%Formatted cosmetic cost.
%cosmetic_status%Status line for the current player.
%cosmetic_state%Current cosmetic state.
%cosmetic_type%Cosmetic type.

Particle Cosmetics

Particles are rendered around the player on a regular update loop. Particle tuning fields live at the cosmetic’s top level.

Supported animations:

aura, ring, spiral, double_helix, orbit, trail, burst, steps, crown, pulse, sphere, glyph, comet, vortex, galaxy, wings, tornado, infinity, fountain, atom, nova, hurricane, heartbeat, star, beam, shield.

OptionPurpose
particleMinecraft particle name.
animationAnimation type. Use one of the supported animations above.
colorDust particle color as #rrggbb.
rainbowEnables animated rainbow dust.
sizeDust particle size.
radius / height / speedAnimation shape and speed.
bob / pulse-size / spreadPer-animation tuning.
count-per-point / max-particlesParticle budget.
worlds / disabled-worldsOptional world filtering.
disable-while-sneaking / disable-while-flyingRender conditions.

Hat Cosmetics

type: hat equips the cosmetic’s icon item into the player’s helmet slot.

The inventory sanitizer understands cosmetic hats, so it does not strip them. Hats are also re-applied on join and world change.

your-head:
  type: hat
  category: hats
  rarity: epic
  cost: 750
  icon:
    material: PLAYER_HEAD
    head-owner: "%player%"   # or head-texture / head-url
    name: "&dYour Head"
    lore: ["&7Wear your own face.", "", "%cosmetic_status%"]

Head icons support:

  • head-owner, including player names and %player%.
  • head-url.
  • head-texture, as a base64 value.

Gadget Cosmetics

type: gadget gives the player a tagged, right-clickable item in gadget-slot.

Right-clicking a gadget can trigger:

  • A particle burst, if the cosmetic has particle fields.
  • A list of actions.
  • A cooldown-seconds delay before it can be used again.
firework-blast:
  type: gadget
  category: gadgets
  rarity: rare
  cost: 600
  cooldown-seconds: 3
  particle: FIREWORK
  animation: burst
  max-particles: 24
  actions:
    - "sound: ENTITY_FIREWORK_ROCKET_BLAST"
  icon:
    material: FIREWORK_ROCKET
    name: "&eFirework Blast"
    lore: ["&7Right-click for a burst of sparks.", "", "%cosmetic_status%"]

Unlocking and Coins

If cost is greater than 0 and the player does not already own the cosmetic, equipping it purchases it with coins.

AtlasLobby stores:

  • Owned cosmetics in data/players.yml under unlocked-cosmetics.
  • Equipped cosmetics per slot under equipped.

If cost is 0 but a legacy price is set, AtlasLobby falls back to Vault for that cosmetic.

The Cosmetics Menu

The cosmetics menu in menus.yml is dynamic. It declares a content provider instead of listing cosmetics by hand.

See Menus and Actions for the menu layout, tabs, and pagination actions.

Performance and Validation

AtlasLobby renders equipped particles through one shared update system.

It skips:

  • Players with no equipped particle.
  • Players outside allowed worlds.
  • Players without permission.
  • Players who disabled particles.

Global particle budgets cap both configured points and count-per-point. Invalid particles, materials, or head textures are warned once and skipped instead of stopping cosmetic rendering.