Skip to content

Adding Cosmetics and Skins

Cosmetics and item skins are defined as YAML files inside the ServerCosmetics/ config directory. The filename (minus .yml) becomes the cosmetic/skin ID, which is used to reference its texture and model.

Cosmetic Types

TypeDescriptionBase Item
HATA hat cosmetic rendered on the head slotCan be specified via material (e.g. minecraft:paper, minecraft:leather_horse_armor)
BODY_COSMETICA body cosmetic rendered as a passenger entityCan be specified via material
HELMET, CHESTPLATE, LEGGINGS, BOOTSArmor cosmetic — helmetAutomatically uses chain mail
CHESTPLATE_BODY_COSMETIC,LEGGINGS_BODY_COSMETIC, BOOTS_BODY_COSMETIC, HAT_BODY_COSMETICBody cosmetic occupying armor slotsAutomatically determined by type
(no type field)Item skinSpecified via material (can be a list)

Hats

File: ServerCosmetics/Cosmetics/hats/top_hat.yml

yaml
type: HAT
material: minecraft:leather_horse_armor   # Use leather_horse_armor to make it dyeable via the color picker
display-name: "&bFancy Paintable Hat"

permission: "cosmetics.hat.top_hat"

File: ServerCosmetics/Cosmetics/hats/shogun.yml

yaml
type: HAT
material: PAPER          # Short form without namespace defaults to minecraft:
display-name: "&bShogun"
sortingPriority: 1        # Lower priority number = sorted first. Default 0 means no sorting (appears last).
lore:
  - "Some description"

permission: "cosmetics.hat.shogun"

Fields

  • type (required): Must be HAT for hat cosmetics.
  • material (required for hats): The base Minecraft item. minecraft:leather_horse_armor makes the cosmetic dyeable via the color picker. You can omit the minecraft: prefix.
  • display-name (string): Name shown in the GUI. Supports QuickText tags and legacy color codes (see Formatting).
  • lore (list of strings, optional): Description lines shown in the GUI.
  • sortingPriority (integer, optional): Lower values are sorted first. 0 (default) pushes items to the end.
  • permission (required): Permission node required to equip this cosmetic.

Paintable hats

When material is minecraft:leather_horse_armor, clicking the cosmetic in the GUI opens a color picker instead of equipping it directly. The player can pick a color, then confirm to equip the dyed cosmetic.

Armor Cosmetics

Armor cosmetics ride on vanilla chainmail armor items using ArmorTrim overlays. Because of this, you do not specify material — it is automatically set to the corresponding chainmail armor piece.

File: ServerCosmetics/Cosmetics/armor/flamebringer_helmet.yml

yaml
type: HELMET
display-name: "<color #FF5555>Flame Bringer"
lore:
  - "<white>Author: <blue>Myllyd_Ogoy"

permission: "cosmetics.armor.flamebringer"

Texture naming convention

For a cosmetic set named flamebringer, you need these texture files:

ServerCosmetics/Assets/textures/armor/
├── flamebringer_helmet.png        (helmet icon)
├── flamebringer_chestplate.png     (chestplate icon)
├── flamebringer_leggings.png       (leggings icon)
├── flamebringer_boots.png          (boots icon)
├── flamebringer_layer_1.png        (armor on body — upper)
└── flamebringer_layer_2.png        (armor on body — lower/legs)

The _layer_1 / _layer_2 textures are used as trim pattern textures on chainmail armor. Config filenames must follow: <name>_<armortype>.yml (e.g. flamebringer_helmet.yml.

Armor types

HELMET, CHESTPLATE, LEGGINGS, BOOTS — each requires its own .yml file.

Body Cosmetics

Body cosmetics are rendered as invisible passenger entities on the player.

File: ServerCosmetics/Cosmetics/body/body_cosmetic.yml

yaml
type: BODY_COSMETIC
material: PAPER
display-name: "<blue>Body cosmetic"
lore:
  - "Some description"

# Body cosmetic model options (all default to false)
isMirrored: true        # Mirror the model (flip 180° on Y axis)
autoAlignment: true     # Auto-position the model on the player body
offsetWhenSneaking: true # Apply a Y-offset when player is sneaking
autoscale: true          # Auto-scale the model to fit the player

permission: "cosmetics.body.body_cosmetic"

Body cosmetic sub-types

  • BODY_COSMETIC — standalone body cosmetic (no armor slot)
  • HAT_BODY_COSMETIC — body cosmetic that occupies the hat slot
  • CHESTPLATE_BODY_COSMETIC — body cosmetic that occupies the chestplate slot
  • LEGGINGS_BODY_COSMETIC — body cosmetic that occupies the leggings slot
  • BOOTS_BODY_COSMETIC — body cosmetic that occupies the boots slot

Sneaking models

Body cosmetics with autoAlignment or offsetWhenSneaking require a second model file with the _sneaking suffix. For body_cosmetic.yml, the mod expects:

ServerCosmetics/Assets/models/item/
├── body_cosmetic.json             (standing model)
└── body_cosmetic_sneaking.json     (sneaking model)

These sneaking model files are automatically generated at runtime by ConfigManager — it takes the base model JSON and applies the display transform offsets. You only need to provide the standing model; the sneaking variant is created automatically.

Item Skins

Item skins override the appearance of vanilla items (like swords, axes, etc.) for players who have the skin equipped. Unlike cosmetics, item skins do not have a type field.

File: ServerCosmetics/ItemSkins/swords/sword_ruby.yml

yaml
material: netherite_sword       # Can be a single item or a list (see below)
display-name: "&dRuby Sword"

permission: "itemskins.sword.sword_ruby"

Multi-material skins

A single skin can apply to multiple item types:

yaml
material:
  - minecraft:diamond_sword
  - minecraft:netherite_sword
display-name: "&cFlaming Sword Skin"
lore:
  - "A Sword"
  - ""
  - "<red>Makes your sword hot!"
permission: "servercosmetics.skin.flaming_sword"

When material is a list, each material gets its own internal ID (<filename>_<material>), e.g. flaming_sword_minecraft:diamond_sword. Textures/models must match each generated ID.

Fields

  • material (required): The Minecraft item ID(s) this skin applies to. Can be a string or a list.
  • display-name (string): Name shown in the Item Skins GUI.
  • lore (list of strings, optional): Description lines.
  • sortingPriority (integer, optional): Lower values sorted first.
  • permission (required): Permission node required to use this skin.

Adding Textures and Models

ServerCosmetics uses Polymer to generate a server-side resource pack. Custom textures and models are placed in the Assets/ directory.

Directory structure

ServerCosmetics/Assets/
├── textures/
│   ├── item/            # Standard item textures (placed here by default)
│   ├── item/armor/      # Armor icon textures (*_helmet.png, *_chestplate.png, etc.)
│   ├── hats/            # Hat textures
│   ├── body/            # Body cosmetic textures
│   ├── swords/          # Sword skin textures
│   ├── axes/            # Axe skin textures
│   └── ui/              # GUI background textures
├── models/
│   ├── item/            # Standard item models (placed here by default)
│   ├── item/armor/      # Armor item models
│   ├── hats/            # Hat models
│   ├── body/            # Body cosmetic models
│   ├── swords/          # Sword skin models
│   ├── axes/            # Axe skin models
│   └── ui/              # GUI button models

Files can technically be placed in any subdirectory of Assets/ — the mod scans recursively for .png, .json, and .mcmeta files and routes them to the correct resource pack path based on their filename pattern.

Filename routing rules

Filename patternResource pack target path
*_helmet.png, *_chestplate.png, *_leggings.png, *_boots.pngassets/servercosmetics/textures/item/armor/
*_layer_1.pngassets/servercosmetics/textures/trims/models/armor/ (renamed to <name>_<material>.png)
*_layer_2.pngassets/servercosmetics/textures/trims/models/armor/ (renamed to <name>_leggings_<material>.png)
Other .pngassets/servercosmetics/textures/item/
.json (body cosmetic)Processed to generate standing + sneaking variants
.json (other)assets/servercosmetics/models/item/
.mcmetaassets/servercosmetics/textures/item/

Texture/model naming

The cosmetic/skin ID (YAML filename without .yml) must match the texture and model filenames. For example:

  • top_hat.yml expects top_hat.png and top_hat.json in the Asset directories.
  • Armor set flamebringer_helmet.yml expects flamebringer_helmet.png, plus the shared flamebringer_layer_1.png / flamebringer_layer_2.png.

Model JSON format

Item models must reference textures using the servercosmetics:item/<id> path:

json
{
  "textures": {
    "0": "servercosmetics:item/cool_hat"
  }
}

Animations are also supported (via .mcmeta files alongside textures).

Button textures

GUI buttons defined in config with a textureName property will look for a corresponding model at assets/servercosmetics/models/item/<textureName>.json. The built-in button textures (next, previous, remove, paint_button) are provided by the demo assets.

Polymer Autohost

To automatically serve the resource pack to players, see the Official Polymer Documentation.