Example Custom Pack

Example Custom Pack

This example reflects the current pack layout used by the plugin.

Folder layout

/plugins/SkinEngine/packs/frostfall/
├ pack.yml
├ configs/
│  ├ skins/
│  │  ├ frostblade.yml
│  │  └ frostguard.yml
│  ├ images.yml
│  └ decorative_items.yml
└ resourcepack/
   ├ skins/
   │  └ frostfall/
   │     ├ sword.png
   │     ├ mace.png
   │     ├ trident.json
   │     ├ trident_throwing.json
   │     ├ axe.png
   │     ├ bow.png
   │     ├ bow_pulling_0.png
   │     ├ bow_pulling_1.png
   │     ├ bow_pulling_2.png
   │     ├ crossbow.png
   │     ├ crossbow_pulling_0.png
   │     ├ crossbow_pulling_1.png
   │     ├ crossbow_pulling_2.png
   │     ├ crossbow_charged.png
   │     ├ crossbow_firework.png
   │     ├ fishing_rod.png
   │     ├ fishing_rod_cast.png
   │     ├ shield.json
   │     ├ shield_blocking.json
   │     ├ spear.png
   │     ├ elytra.png
   │     ├ elytra_broken.png
   │     ├ elytra_wings.png
   │     ├ helmet.png
   │     ├ chestplate.png
   │     ├ leggings.png
   │     ├ boots.png
   │     ├ armor_layer_1.png
   │     └ armor_layer_2.png
   ├ images/
   │  ├ icons/
   │  │  └ logo.png
   │  └ titles_en.png
   └ decorative_items/
      ├ info.png
      ├ next.png
      └ back.png

pack.yml

display:
  name: "<aqua>Frostfall</aqua>"
  description:
    - "<gray>A cold-themed skin pack.</gray>"

icon:
  material: PAPER
  item-model: "{$decorative:frostfall_info}"
  name: "<aqua>Frostfall</aqua>"
  lore:
    - "<gray>Open the Frostfall pack.</gray>"

# If the icon config is wrong, the pack still loads.
# SkinEngine falls back to the icon material, then to CHEST if needed.

This file is explained in more detail here:

Tool and ranged skin example

configs/skins/frostblade.yml

id: "frostblade"

display:
  name: "<aqua>Frostblade</aqua>"
  description:
    - "<gray>An icy weapon set.</gray>"

content:
  folder: "frostfall"
  items:
    sword:
      materials:
        - iron
        - diamond
        - netherite
      type: generate
      cost: 500
      particle:
        effect: CRIT
      resources:
        main: "sword.png"

    mace:
      type: generate
      resources:
        main: "mace.png"

    trident:
      resources:
        main: "trident.json"
        throwing: "trident_throwing.json"

    axe:
      materials:
        - iron
        - diamond
        - netherite
      type: generate
      resources:
        main: "axe.png"

    bow:
      type: generate
      resources:
        main: "bow.png"
        pulling:
          - "bow_pulling_0.png"
          - "bow_pulling_1.png"
          - "bow_pulling_2.png"

    crossbow:
      type: generate
      resources:
        main: "crossbow.png"
        pulling:
          - "crossbow_pulling_0.png"
          - "crossbow_pulling_1.png"
          - "crossbow_pulling_2.png"
        charged: "crossbow_charged.png"
        firework: "crossbow_firework.png"

    fishing_rod:
      type: generate
      resources:
        main: "fishing_rod.png"
        cast: "fishing_rod_cast.png"

    shield:
      resources:
        main: "shield.json"
        blocking: "shield_blocking.json"

    spear:
      materials:
        - wooden
        - iron
        - diamond
      type: generate
      resources:
        main: "spear.png"

    elytra:
      cost: 900
      particle:
        effect: END_ROD
      resources:
        main: "elytra.png"
        broken: "elytra_broken.png"
        wings: "elytra_wings.png"

In that elytra example:

  • elytra.png is the normal item texture
  • elytra_broken.png is the optional broken item texture
  • elytra_wings.png is the wings texture used when the player is actually wearing the elytra

configs/skins/frostguard.yml

id: "frostguard"

display:
  name: "<aqua>Frostguard</aqua>"
  description:
    - "<gray>Heavy frozen armor.</gray>"

content:
  folder: "frostfall"
  armor:
    layer_1: "armor_layer_1.png"
    layer_2: "armor_layer_2.png"
    particle:
      effect: DUST
      data:
        color: "#8FE9FF"
        size: 1.2
    items:
      helmet:
        materials: "all"
        resources:
          main: "helmet.png"
      chestplate:
        materials: "all"
        resources:
          main: "chestplate.png"
      leggings:
        materials: "all"
        resources:
          main: "leggings.png"
      boots:
        materials: "all"
        resources:
          main: "boots.png"

Managed image example

configs/images.yml

bitmaps:
  titles_en:
    resource: "titles_en.png"
    rows: 4
    columns: 1
    ascent: 20
    height: 20

images:
  logo:
    resource: "icons/logo.png"
    ascent: 8
    height: 8

  title_main:
    bitmap:
      id: "titles_en"
      row: 1
      column: 1

This system is explained in:

Decorative item example

configs/decorative_items.yml

info:
  material: PAPER
  type: generate
  resource: "info.png"

next:
  material: PAPER
  type: generate
  resource: "next.png"

back:
  material: PAPER
  type: generate
  resource: "back.png"

This system is explained in:

After editing the pack:

  1. reload or restart
  2. run /se zip
  3. verify delivery or merge output

Why this example is split this way

This example shows the real SkinEngine pattern:

  • skins live in skin files and use resourcepack/skins/
  • decorative item-model helpers live in decorative_items.yml
  • title and inline text graphics live in images.yml

Keeping those separate is what makes larger packs maintainable.