How to Make a Tier

A tier is a set of attribute modifiers applied to a single armor piece, e.g. extra armor, toughness, or movement speed. Tiers apply per piece, even without the full set, and players move between them with Upgrade Crystals. Each tier is one YAML file in the /tiers/ folder. This page builds one and explains every part.

Quick start

  1. Create a file in plugins/EcoArmor/tiers/, e.g. netherite.yml (copy _example.yml as a starting point). The file name becomes the tier ID.

  2. Set the display name and any requiresTiers prerequisites.

  3. Fill in the properties for each piece with the attribute values you want.

  4. Run /ecoarmor reload.

  5. Give yourself a crystal with /ecoarmor give <you> crystal:netherite, drop it onto a piece, and check the piece's stats change.

Naming and IDs

The file name without .yml is the tier ID. You use it in commands and in the defaultTier field of a set config. Crystal items resolve through the Item Lookup System as ecoarmor:upgrade_crystal_<id>.

The structure of a tier

A tier config has three parts:

PartWhat it controls
InfoThe display name and which tier must come before this one.
Upgrade crystalThe in-game item that applies the tier.
PropertiesThe per-piece attribute modifiers the tier grants.

Here is a complete tier with every part in place:

# === Info: display name and prerequisites ===
display: "&c&lNETHERITE" # In-game tier display name
requiresTiers: # Tiers a piece must already have before this one can be applied
  - diamond
additive: false # If true, applying this tier ADDS its modifiers on top of the piece's current ones instead of replacing them, and allows the tier to be stacked more than once
stack-limit: -1 # Only used when additive is true. Max number of times this tier can be stacked onto one piece. -1 = unlimited

# === Upgrade crystal: the item that applies this tier ===
crystal:
  item: end_crystal # Crystal item, see https://hub.auxilor.io/wiki/eco/the-item-lookup-system-the-item-lookup-system
  name: "&cNetherite Upgrade Crystal" # In-game name
  lore: # Set to `lore: []` to remove lore
    - "&8Drop this onto an armor piece"
    - "&8to set its tier to:"
    - "&c&lNETHERITE"
    - ''
    - "&8&oRequires the armor to already have Diamond tier"
  craftable: true # Whether the crystal is craftable
  recipe: # See https://hub.auxilor.io/wiki/eco/the-item-lookup-system-the-item-lookup-system/recipes
    - air
    - netherite_ingot
    - air
    - netherite_ingot
    - ecoarmor:upgrade_crystal_diamond
    - netherite_ingot
    - air
    - netherite_ingot
    - air
  giveAmount: 1 # Optional; how many crystals the recipe yields

# === Properties: per-piece attribute modifiers (helmet shown; repeat per piece) ===
properties:
  helmet:
    armor: 3 # Armor points (≈8 = netherite; >20 per piece has heavy diminishing returns)
    toughness: 3 # Armor toughness (≈3 = netherite; >12 to 15 per piece has little benefit)
    knockbackResistance: 1 # Knockback resist 0 to 100 (100 = immune; 40 to 60 ≈ netherite)
    speedPercentage: 0 # Move speed % (-50 to +50 recommended)
    attackSpeedPercentage: 0 # Attack speed % (-50 to +100; very high values can feel broken)
    attackDamagePercentage: 0 # Damage % (-50 to +100; high values trivialize combat)
    attackKnockbackPercentage: 0 # Knockback dealt % (-100 to +100; negative = less knockback)
    maxHealth: 0 # Extra max health (0 to 40 total across set; +20 = +10 hearts)
    attackDamageFlat: 0 # Flat damage bonus (0 to 6; +6 ≈ Sharp V extra)
    attackSpeedFlat: 0 # Flat attack speed (0 to 4; base is 4.0, +4 = double speed)
    jumpStrength: 0 # Jump strength % (0 to 100; +100 ≈ double jump height)
    gravityPercentage: 0 # Gravity % (-80 to +100; negative = floatier, positive = heavier)
    burningTimePercentage: 0 # Fire duration % (-100 to +100; -100 = fire immune)
    explosionKnockbackResistance: 0 # Explosion knockback resist 0 to 100
    oxygenBonus: 0 # Extra oxygen ticks (0 to 600; +300 ≈ +15s underwater)
    movementEfficiency: 0 # Slowdown resistance 0 to 100 (100 = ignore soul sand/webs)
    safeFallDistance: 0 # Extra safe fall blocks (0 to 20; +3 = vanilla, +10 ≈ 13 blocks)
    entityInteractionRangePercentage: 0 # Entity reach % (0 to 100; +50 = noticeably longer)
    blockInteractionRangePercentage: 0 # Block reach % (0 to 100; creative ≈ +50)
    components: # Optional; attribute modifiers as vanilla components, the modern replacement for the options above
      attribute_modifiers:
        - type: "minecraft:armor"
          amount: 3
          operation: "add_value"

Info

The info block names the tier and gates it behind a prior tier.

display: "&c&lNETHERITE" # In-game tier display name
requiresTiers: # Tiers a piece must already have before this one can be applied
  - diamond
additive: false # If true, applying this tier ADDS its modifiers on top of the piece's current ones instead of replacing them, and allows the tier to be stacked more than once
stack-limit: -1 # Only used when additive is true. Max number of times this tier can be stacked onto one piece. -1 = unlimited

requiresTiers builds a progression: in the example, the Netherite tier can only be applied to a piece that already has the Diamond tier. The default config ships this tier tree as an example:

                                            /-> exotic
default --> iron --> diamond --> netherite --> manyullyn
         \-> cobalt --> osmium

ancient --> mythic

Additive tiers

By default, applying a tier's crystal replaces every modifier currently on the piece with that tier's own modifiers — this is how the progression in the tree above normally works. Setting additive: true changes that: the tier's modifiers are added on top of whatever is already on the piece, up to stack-limit applications.

requiresTiers still gates every application, additive or not — it is checked first, against the piece's current tier. After a tier is applied once, the piece's current tier becomes that tier's own id, so to let a crystal be dropped onto a piece that already has it, requiresTiers must either be empty or include the tier's own id:

# id: enhancement.yml
requiresTiers:
  - enhancement # allows re-applying this same tier onto a piece that already has it
additive: true
stack-limit: 3 # This tier can be stacked at most 3 times on one piece; -1 for unlimited

Use this for crystals meant to layer bonuses (e.g. a repeatable "enhancement" crystal) rather than to move a piece up a fixed tier tree. stack-limit counts only applications of this tier — stacking three different additive tiers onto one piece is unaffected by any one tier's own limit.

When a piece has more than one tier applied (because one or more were additive), the %tier% placeholder in that piece's lore lists every distinct applied tier instead of just one — see the placeholder table on the set page, armor-display.tier-list-separator to control how they're joined, and armor-display.tier-stack-format to control how a tier stacked more than once is shown (e.g. 4x ANCIENT or ANCIENT IV instead of ANCIENT, ANCIENT, ANCIENT, ANCIENT).

Applying a non-additive tier to a piece always resets it back to that single tier, clearing any previously stacked additive tiers.

Upgrade crystal

The crystal is the in-game item players drop onto a piece to apply this tier.

crystal:
  item: end_crystal # Crystal item, see https://hub.auxilor.io/wiki/eco/the-item-lookup-system-the-item-lookup-system
  name: "&cNetherite Upgrade Crystal" # In-game name
  lore: # Set to `lore: []` to remove lore
    - "&8Drop this onto an armor piece"
    - "&8to set its tier to:"
    - "&c&lNETHERITE"
    - ''
    - "&8&oRequires the armor to already have Diamond tier"
  craftable: true # Whether the crystal is craftable
  recipe: # See https://hub.auxilor.io/wiki/eco/the-item-lookup-system-the-item-lookup-system/recipes
    - air
    - netherite_ingot
    - air
    - netherite_ingot
    - ecoarmor:upgrade_crystal_diamond
    - netherite_ingot
    - air
    - netherite_ingot
    - air
  giveAmount: 1 # Optional; how many crystals the recipe yields

Properties

Each piece gets its own attribute block under properties. The helmet is shown here; repeat the same block for chestplate, leggings, boots, and elytra. You can read how vanilla attributes work on the Minecraft Wiki.

properties:
  helmet:
    armor: 3 # Armor points (≈8 = netherite; >20 per piece has heavy diminishing returns)
    toughness: 3 # Armor toughness (≈3 = netherite; >12 to 15 per piece has little benefit)
    knockbackResistance: 1 # Knockback resist 0 to 100 (100 = immune; 40 to 60 ≈ netherite)
    speedPercentage: 0 # Move speed % (-50 to +50 recommended)
    attackSpeedPercentage: 0 # Attack speed % (-50 to +100; very high values can feel broken)
    attackDamagePercentage: 0 # Damage % (-50 to +100; high values trivialize combat)
    attackKnockbackPercentage: 0 # Knockback dealt % (-100 to +100; negative = less knockback)
    maxHealth: 0 # Extra max health (0 to 40 total across set; +20 = +10 hearts)
    attackDamageFlat: 0 # Flat damage bonus (0 to 6; +6 ≈ Sharp V extra)
    attackSpeedFlat: 0 # Flat attack speed (0 to 4; base is 4.0, +4 = double speed)
    jumpStrength: 0 # Jump strength % (0 to 100; +100 ≈ double jump height)
    gravityPercentage: 0 # Gravity % (-80 to +100; negative = floatier, positive = heavier)
    burningTimePercentage: 0 # Fire duration % (-100 to +100; -100 = fire immune)
    explosionKnockbackResistance: 0 # Explosion knockback resist 0 to 100
    oxygenBonus: 0 # Extra oxygen ticks (0 to 600; +300 ≈ +15s underwater)
    movementEfficiency: 0 # Slowdown resistance 0 to 100 (100 = ignore soul sand/webs)
    safeFallDistance: 0 # Extra safe fall blocks (0 to 20; +3 = vanilla, +10 ≈ 13 blocks)
    entityInteractionRangePercentage: 0 # Entity reach % (0 to 100; +50 = noticeably longer)
    blockInteractionRangePercentage: 0 # Block reach % (0 to 100; creative ≈ +50)
    components: # Optional; attribute modifiers as vanilla components, the modern replacement for the options above
      attribute_modifiers:
        - type: "minecraft:armor"
          amount: 3
          operation: "add_value"

Components

The stat options above cover a fixed list of attributes with whole-number values. components replaces them with vanilla attribute modifiers, which reach every attribute the game has, take decimals, and choose their own slot group and operation:

properties:
  helmet:
    components:
      attribute_modifiers:
        - type: "minecraft:armor"
          amount: 3.5 # Decimals work here; the options above are whole numbers only
          operation: "add_value"
        - type: "minecraft:water_movement_efficiency"
          amount: 0.35 # An attribute the options above can't reach at all
          operation: "add_value"
FieldWhat it does
typeThe attribute, e.g. minecraft:armor. Required.
amountHow much the modifier applies. Required.
operationadd_value, add_multiplied_base, or add_multiplied_total. Defaults to add_value.
slotThe slot group the modifier applies in. Defaults to the piece's own slot.
idThe modifier's id. Defaults to one derived from the tier, attribute, and piece.

Only attribute_modifiers can be set on a tier. A tier's modifiers are rewritten every time the piece's tier changes, and attribute modifiers are the only components that can be cleanly removed again; anything else belongs on the piece itself. Modifier ids are always placed under the ecoarmor namespace for the same reason, so an id you give here has its namespace replaced.

When a tier is additive, the modifiers of every applied tier are combined, and two tiers configuring the same id collapse into one - the last applied wins.


Where to go next

  • Sets: How to Make an Armor Set to attach tiers to pieces via defaultTier.

  • Default tiers: the shipped configs live on GitHub.

  • Commands: Commands and Permissions for giving crystals in-game.