CustomiZer

CustomiZer

The all-in-one custom content plugin for Paper servers. No dependencies to fight. No format to memorize. Just configure and play.

✓ Automatic resource pack ✓ Hot-reload with /z reload ✓ ItemsAdder pack compatible ✓ Bedrock / Geyser auto-converter Custom items · Blocks · Armors Swords · Pickaxes · Hoes · Crops Mastery · Missions · Prestige Gem sockets · Reforge · Crafting Cosmetics · Backpacks

What Makes CustomiZer Different?

Most custom-content plugins make you manage resource packs by hand — manually zipping files, uploading them somewhere, and hoping nothing breaks. CustomiZer builds the pack for you, serves it from a built-in HTTP server, and pushes it to every player who joins. You never touch a ZIP file.

Configuration is done in plain YAML files that are designed to be readable by humans, not just developers. If you've used ItemsAdder before, you already know the pack format. If you haven't, the guides below will walk you through everything step by step.

CustomiZer main /zitems GUI

The /zitems main menu — a fully custom GUI that lets players browse every pack, weapon, tool, and item on your server. Admins can give items with a single click.

CustomiZer vs ItemsAdder & Nexo

If you've shopped around for custom-content plugins you've probably looked at ItemsAdder and Nexo (formerly Oraxen — Nexo is simply a paid continuation of the same project under a new name). Here's how CustomiZer stacks up:

FeatureCustomiZerItemsAdderNexo (ex-Oraxen)
Built-in resource pack server✓ Built-in HTTP server (requires URL/port config)Needs manual upload or external hostingNeeds manual upload or external hosting
Kill-based weapon levelling✓ Fully configurable rarity chain
Harvester hoes with XP levelling✓ Per-level abilities
Custom pickaxes with mining progression✓ Area mining, level-gated effects
Armor sets with set bonuses✓ Potion effects + commandsPartialPartial
Gem socket system✓ Built-in✗ (third-party)✗ (third-party)
Mastery / Missions / Prestige tracks✓ All three built-in
Ore generators✓ Per world, per biome, per height
ESC menu customization✓ + Lunar & Feather Client support
Custom crafting tables (GUI)✓ Built-inPartial
ItemsAdder pack format compatible✓ Drop-in compatible
Bedrock / Geyser conversion✓ Full auto-converter built-in (items, blocks, 3D models, GUIs, furniture, animations)Partial — manual Geyser mappings, no auto-converterPartial — basic Geyser support, manual setup required
Item-bound backpacks✓ Trade the item, transfer the contentsPartial (third-party)
PricingPaid (~25€)PaidPaid
The bottom line: ItemsAdder and Nexo are great at custom textures and items. CustomiZer does that and ships a full progression ecosystem (levelling weapons, mining pickaxes, harvester hoes, mastery tracks, missions, prestige, gem sockets, armor sets, backpacks) plus a full Bedrock/Geyser auto-converter — all in one plugin. Neither ItemsAdder nor Nexo has anything close to that breadth.

The Big Picture

There are two separate systems you'll be working with, and understanding the difference is the key to mastering this plugin:

📦
packs/ folder
Resource pack content — textures, models, and item definitions that go into the Minecraft resource pack downloaded by players.
📁
CustomiZe! folder
Game mechanics — swords with levelling, blocks with drops and rewards, pickaxes with mining progression, armor sets, and more.

Think of it this way: packs/ is about how things look. CustomiZe! is about how things behave. For many features you need both — a texture in packs/ and a behavior definition in CustomiZe!.

Everything This Plugin Can Do

💎
Custom Items
Clickable items with actions: commands, healing, money, buffs, food effects.
⚔️
Swords & Axes
Attributes, effects, lifesteal, and elemental damage. Optional kill-based levelling system with up to 5 rarity tiers.
🛡️
Custom Armors
Worn 3D models, attribute bonuses, potion effects, armor set bonuses.
🪨
Custom Blocks
Fully placeable blocks with mining requirements, custom drops, sounds, and Jobs XP rewards.
⛏️
Pickaxes
Level up by mining. Each level unlocks area mining, better effects, and a new texture.
🌾
Harvester Hoes
Auto-harvest, auto-replant, auto-sell, XP levelling with ability upgrades.
🌱
Custom Crops
Multi-stage growing plants with custom loot tables and food effects on harvest.
🔤
Font Glyphs
PNG images rendered as text characters — used for GUI backgrounds, rank icons, and ESC menu art.
🖼️
ESC Menu
Replace pause-menu text with custom logos and images.
💠
Gem Sockets
Socket gems into weapons and armor for permanent stat bonuses.
🧲
Armor Sets
Bonus effects when wearing 2 or 4 matching armor pieces.
⛰️
Ore Generators
Inject custom ores into world generation — per world, per biome, per height range.
Mastery Tracks
Persistent XP for mining, combat, farming. Milestone rewards at key levels.
📋
Missions
Daily and weekly objectives that reset automatically.
👑
Prestige
Max out mastery tracks and prestige for permanent bonus multipliers.
🔩
Custom Crafting
Custom workbench GUIs with configurable input/output slots.
🎭
Cosmetics
Wearable display items — hats, capes, wings — that players can equip without replacing armor.
🎒
Backpacks
Item-bound persistent inventories. Trade the physical backpack item to transfer all its contents to another player.
🔨
Reforge
Re-roll stat modifiers on weapons and armor with reforge stones. Configurable modifier pool and weights.
🟦
Bedrock / Geyser
Auto-convert your entire pack for Bedrock players via Geyser — 3D items, blocks, GUIs, furniture, and animations.

Installation

From zero to a running server with CustomiZer in five minutes.

Requirements

RequirementDetails
Server softwarePaper 1.21+ (Spigot is NOT supported)
JavaJava 21 or newer
PacketEventsRequired — list it under libraries: in plugin.yml or install separately
VaultOptional — needed for money rewards and repair costs

Step-by-Step Setup

1

Drop the JAR into plugins/

Copy CustomiZer.jar into your server's plugins/ folder. Start the server once. CustomiZer will generate all its config files and folder structure automatically. Then stop the server.

2

Set your public IP in config.yml

Open plugins/CustomiZer/config.yml and find the resourcepack section. Set url to your server's public IP address or domain name. This is the address players' Minecraft clients will download the pack from.

resourcepack:
  enabled: true
  url: "http://123.456.789.0"   # Your public IP
  port: 7270                     # Port for the pack HTTP server (open this in your firewall!)

The port 7270 (or whatever you set) must be open in your server's firewall. It's a separate port from your Minecraft server port.

3

Add your packs (optional at first)

If you have resource packs to add, put them in plugins/CustomiZer/packs/. You can skip this for now and come back to it — the plugin works fine with just the built-in content.

4

Start the server

Start the server. In the console you'll see messages like [ResourcePack] HTTP server started on port 7270 and [ResourcePack] Pack ready. When a player joins, they'll automatically receive a prompt to download the resource pack.

5

Make changes and reload

Any time you edit config files, run /z reload in-game or from console. This reloads all configs and rebuilds the resource pack in the background — no restart needed.

Folder Structure After First Start

plugins/CustomiZer/
packs/ ← Put resource packs here
CustomiZe!/ ← Configure gameplay mechanics here
__global__/ ← Server-wide configs (always loaded)
my_pack/ ← Per-pack config overrides
includes/ ← Highest-priority pack overrides
lang/ ← en.yml, fr.yml (plugin messages)
gui/ ← GUI appearance config
main_menu.yml ← /z gui category browser (title, background, border, Browse All Items button)
items_shop.yml ← /zitems nav buttons
all_items.yml ← "Browse All Items" paginated GUI
db/ ← Database files
backpacks.db ← Backpack inventory storage (SQLite)
custom_crafting_recipes.db
import_export/ ← All import/export folders
item_input/ ← Drop items here for import
geyser_output/ ← Bedrock pack output (/zpack geyser)
config.yml ← Main configuration
settings.yml ← Debug, integrations, ESC menu toggles
output.zip ← Generated pack (auto-created, don't edit)

config.yml

The main configuration file — resource pack server, language, messages, economy boosts.

This file is at plugins/CustomiZer/config.yml. Changes take effect after /z reload.

Resource Pack Settings

This is the most important section. It controls how the pack is built and served to players.

resourcepack:
  enabled: true

  # The public URL players will download the pack from.
  # Must be reachable from the internet. Use your server's public IP or domain.
  url: "http://YOUR.PUBLIC.IP"

  # The HTTP port the plugin listens on. Open this port in your firewall.
  port: 7270

  # Resource pack format version. 46 = Minecraft 1.21.x
  format: 46

  # Optional: merge external resource pack ZIPs into the generated pack.
  # Paths are relative to your plugins/ folder.
  merge-packs:
    - "ModelEngine/resource pack.zip"

Language & Messages

language: en   # "en" or "fr"

# Whether to show a hotbar message when players earn rewards
hotbar_message_enabled: true
hotbar_message_format: "&a{job} XP: &b{jobsxp}  &aMoney: &b{money}"

# Whether to show a bossbar message
bossbar_message_enabled: true
bossbar_message_format: "{job} | XP: {jobsxp} | Money: {money}"
bossbar_color: BLUE     # BLUE, PURPLE, YELLOW, GREEN, WHITE
bossbar_style: SOLID    # SOLID, SEGMENTED_6, SEGMENTED_10, SEGMENTED_12, SEGMENTED_20

WorldGuard Region Boosts

If WorldGuard is installed and enabled in settings.yml, you can multiply or divide rewards in specific regions:

# Players in "vip_mine" earn 2x XP and money
Multiplier:
  vip_mine: 2.0
  elite_zone: 3.0

# Players in "noob_area" earn half rewards
Diviser:
  noob_area: 2.0

# Time-based global boost (all players)
GlobalBoost:
  start: "18:00"
  end: "20:00"
  multiplier: 1.5

settings.yml

Debug mode, optional integration toggles, and client-specific pack settings.

# Set to true for detailed debug logs in console. Leave false on production.
debug: false

dependencies:
  # Enable if you have ItemsAdder AND want its custom blocks to give
  # CustomiZer rewards (Jobs XP, money, etc.)
  itemsadder_support: false

  # Enable if you have WorldGuard AND want region-based multipliers.
  worldguard_integration_support: false

  # Enable if you have Jobs Reborn AND want custom blocks to give Jobs XP.
  jobs_support: false

esc_menu:
  # When true: Feather Client players get the pack WITHOUT ESC menu art.
  # Feather Client is auto-detected. No setup needed.
  ignore_feather_client: false

  # When true: Lunar Client players get the pack WITHOUT ESC menu art.
  # Requires Apollo-Bukkit plugin.
  ignore_lunar_client: false
All settings in this file take effect immediately on /z reload — no server restart needed.

How the Resource Pack Works

Understanding what happens automatically so you know what you DON'T have to do.

The Automatic Process

When the server starts (or when you run /z reload), CustomiZer does all of this automatically:

1

Starts an HTTP server

A lightweight web server starts on the port you configured (default 7270). This server will serve your resource pack file to players when they join.

2

Scans all your packs

Every folder in plugins/CustomiZer/packs/ is scanned. All YAML files inside their configs/ subfolders are read and all items, blocks, fonts, and ESC menu overrides are registered.

3

Generates model and blockstate files

For every item defined with generate: true, CustomiZer creates the JSON model file automatically from your texture. For custom blocks, it creates the note-block blockstate overrides. You never write JSON manually.

4

Builds and serves the pack

Everything is bundled into a ZIP file and kept in memory. The pack is served from your.ip:7270/<hash>.zip. The hash changes every time the pack changes, so players always get the latest version.

5

Pushes the pack to joining players

2 seconds after a player joins, they receive a prompt asking them to accept the resource pack. Once accepted, all your custom textures, blocks, and GUI art is visible to them.

Content Priority

When two sources try to define the same file, this order determines which wins:

PrioritySourceWhen to use
1st (highest)plugins/CustomiZer/includes/Put your manual overrides here. Always wins.
2ndAuto-generated files (models, blockstates, fonts)Created automatically from your YAML configs.
3rdmerge-packs in config.ymlExternal ZIPs like ModelEngine output.
4th (lowest)packs/ folder assetsYour pack textures and models.

Creating a Pack

A beginner-friendly walkthrough for adding your first custom pack.

What Is a "Pack"?

A pack is a folder inside plugins/CustomiZer/packs/ that contains two things:

  • An assets/ folder with your texture and model files (just like a standard Minecraft resource pack)
  • A configs/ folder with YAML files that tell CustomiZer what items and blocks exist in this pack

Step-by-Step: Your First Pack

1

Create the folder structure

Create this structure inside plugins/CustomiZer/packs/:

packs/my_first_pack/
assets/
my_first_pack/ ← must match your namespace
textures/
models/
configs/
items.yml
2

Add your texture

Put a PNG file in assets/my_first_pack/textures/items/. For example: ruby.png. It should be a 16×16 (or 32×32) pixel image.

3

Create items.yml

Open configs/items.yml and define your item:

info:
  namespace: my_first_pack   # Must match your assets folder name

items:
  ruby:
    display_name: "Ruby"
    resource:
      generate: true          # Auto-generate the model from the texture
      material: PAPER         # Vanilla item used as the base
      model_id: 200350        # Unique number — must not clash with other packs
      textures:
        - items/ruby.png      # Relative to assets/my_first_pack/textures/
4

Register it in /zitems GUI (optional)

Create items/my_first_pack/gui.yml to make functional items show up in /zitems. Optionally also create packs/my_first_pack/gui.yml to show raw visuals in /z gui.

# items/my_first_pack/gui.yml  ← shown in /zitems (admin give tool)
name: "My First Pack"
slot: 20   # Position in the /zitems main menu

icon:
  pack: my_first_pack
  id: ruby
  lore:
    - "My custom items"

gui:
  title: "My First Pack"
  size: 6

items:
  - type: pack_item
    pack: my_first_pack
    id: ruby

For the /z gui display browser, create packs/my_first_pack/gui.yml with type: pack_item or type: raw entries (same format, different file).

5

Reload

Run /z reload. The resource pack rebuilds in the background. After a few seconds, reconnect or run /zpack push to send the new pack to online players.

You can now give the item with /z give ruby or find it in /zitems.

The model_id (Custom Model Data) must be unique across ALL packs on your server. Keep a spreadsheet or use large number ranges per pack to avoid collisions. For example: pack A uses 200000–200999, pack B uses 201000–201999.

Namespace Rules

  • The namespace in info.namespace must be lowercase, no spaces, no special characters
  • It must match the folder name inside assets/
  • You reference items from this pack as namespace:item_key — for example my_first_pack:ruby

Pack Items

Define custom items inside your pack. These are the visual layer — textures, models, and materials.

How items are split across two files

Like blocks, items live in two config files. The pack file controls appearance; the CustomiZe! file controls behaviour.

FileControls
packs/your_pack/configs/items.ymlTexture, model, base material — what the item looks like
CustomiZe!/your_pack/items.ymlAction on use, cooldown, number of uses, food properties, display name & lore shown in-game
Not every item needs a CustomiZe! entry. Items used only as block drops or pack drops work with just the packs/configs file. You only need the CustomiZe! side when the item should do something when a player uses it (command, heal, food, etc.).

Simple Item with Auto-Generated Model

Use this when you have a flat PNG texture and want CustomiZer to automatically make a Minecraft item model:

info:
  namespace: my_pack

items:
  # The key "ruby" is how you reference this item everywhere else.
  # Format: namespace:key → "my_pack:ruby"
  ruby:
    display_name: "Ruby"   # Shown in-game (supports color codes)
    resource:
      generate: true        # true = auto-generate model from textures
      material: PAPER       # Vanilla material (PAPER is a common choice for flat items)
      model_id: 200350      # Custom Model Data (must be globally unique)
      textures:
        - items/ruby.png    # In assets/my_pack/textures/items/ruby.png

Item with a Hand-Crafted Model

Use this when you have a pre-made 3D model JSON (e.g. from Blockbench):

  dragon_sword:
    display_name: "Dragon Sword"
    resource:
      generate: false                        # false = use the model at model_path
      material: IRON_SWORD                   # Use a sword material for handheld animation
      model_path: weapons/dragon_sword       # In assets/my_pack/models/weapons/dragon_sword.json

Item with Permission

Only players with the specified permission can see or use this item:

  vip_gem:
    display_name: "VIP Gem"
    permission: myserver.vip.gem   # Optional permission node
    resource:
      generate: true
      material: PAPER
      model_id: 200351
      textures:
        - items/vip_gem.png

Item Field Reference

FieldRequired?Description
display_namerequiredName shown in-game. Use &a for green, &6 for gold, etc.
permissionoptionalPermission node needed to use/see this item.
resource.generaterequiredtrue = auto-generate flat model. false = use model_path.
resource.materialrequiredVanilla Minecraft material (PAPER, IRON_SWORD, etc.)
resource.model_idif generate=trueCustom Model Data integer. Must be globally unique.
resource.texturesif generate=trueList of texture paths relative to assets/namespace/textures/
resource.model_pathif generate=falsePath to model JSON (without .json extension)
behaviours.hatoptionaltrue = can be worn on head slot

Pack Blocks

Custom blocks that can be placed in the world, using note-block states under the hood for real solid placement with custom textures.

Minecraft doesn't support custom block types natively. CustomiZer uses a trick: it assigns custom textures to specific "states" of the note block (which has hundreds of unused states). Players never see the note block — they see your custom texture. The block is fully solid and behaves like a real block.

How blocks are split across two files

Custom blocks use two config files that work together — one for visuals, one for gameplay. This is the same pattern used by every other pack content type.

FileControls
packs/your_pack/configs/blocks.ymlTextures, placement type, break sounds and particles
CustomiZe!/your_pack/blocks.ymlDisplay name, lore, which tools can break it, drops, hardness, blast resistance, Jobs XP, CaveBlock config

packs/your_pack/configs/blocks.yml

This file registers the block in the resource pack — textures, placement type, and break sounds. The material is the base item players hold to place the block (use BRICK for most blocks). The model ID is assigned automatically from the texture.

# packs/my_pack/configs/blocks.yml

info:
  namespace: my_pack

items:
  silver_ore:
    display_name: "Silver Ore"
    material: BRICK               # Base item held in hand to place the block
    resource:
      generate: true
      textures:
        - blocks/silver_ore.png   # Path inside assets/my_pack/textures/

    specific_properties:
      block:
        placed_model:
          type: REAL_NOTE         # Uses the note-block trick for real solid placement
        sound:
          break:
            name: "BLOCK_STONE_BREAK"
            volume: 1
            pitch: 1

  deepslate_silver_ore:
    display_name: "Deepslate Silver Ore"
    material: BRICK
    resource:
      generate: true
      textures:
        - blocks/deepslate_silver_ore.png
    specific_properties:
      block:
        placed_model:
          type: REAL_NOTE
        sound:
          break:
            name: "BLOCK_DEEPSLATE_BREAK"
            volume: 1
            pitch: 1

CustomiZe!/your_pack/blocks.yml

This file links the pack block to its gameplay behaviour. The pack_id uses the format namespace:item_id and matches the entry in your packs/configs file. See the Custom Blocks (CustomiZe!) page for all available options.

# CustomiZe!/my_pack/blocks.yml

blocks:

  silver_ore:
    pack_id: "my_pack:silver_ore"      # namespace:item_id from packs/configs
    display_name: "&fSilver Ore"
    lore:
      - "&7A rare silver deposit."
    drop_self: true                    # Block drops itself when broken
    break_with:
      - HAND
      - WOODEN_PICKAXE
      - STONE_PICKAXE
      - IRON_PICKAXE
      - GOLDEN_PICKAXE
      - DIAMOND_PICKAXE
      - NETHERITE_PICKAXE
    drops:
      - type: plugin_item             # Drop a plugin custom item
        item: silver_ingot
        amount: 1
        chance: 100
      - type: vanilla                 # Drop a vanilla item
        item: IRON_NUGGET
        amount_min: 1
        amount_max: 3
        chance: 50
      - type: command                 # Run a console command on break
        command: "eco give %player% 5"
        chance: 25

  deepslate_silver_ore:
    pack_id: "my_pack:deepslate_silver_ore"
    display_name: "&8Deepslate Silver Ore"
    lore:
      - "&7A rare silver deposit in deepslate."
    drop_self: false
    break_with:
      - IRON_PICKAXE
      - DIAMOND_PICKAXE
      - NETHERITE_PICKAXE
    drops:
      - type: plugin_item
        item: silver_ingot
        amount_min: 1
        amount_max: 2
        chance: 100
You can also add hardness, blast_resistance, soundeffectonmined, visualeffectonmined, and CaveBlock config to the CustomiZe! blocks.yml entry. See Custom Blocks for the full reference.

Pack Tools

Retextured vanilla tools and weapons — custom appearance, with optional advanced mechanics in the CustomiZe! folder.

How tools are split across two files

Simple retextured tools only need the packs/configs file. If you want rarity progression, custom durability, level-up systems, or special effects — add the mechanics side in CustomiZe!.

FileControls
packs/your_pack/configs/tools.ymlTexture per rarity or level, base material — what the tool looks like
CustomiZe!/your_pack/swords.ymlSwords: rarity tiers, attack damage, lifesteal, elemental damage, on-hit effects
CustomiZe!/your_pack/axes.ymlAxes: same structure as swords — rarity tiers, kills required, on-hit effects
CustomiZe!/your_pack/pickaxes.ymlPickaxes: levels, mining radius, custom durability, blocks required to level up
CustomiZe!/your_pack/harvesterhoes.ymlHarvester hoes: auto-harvest radius, replant behavior
A retextured sword with no special mechanics needs only the packs/configs entry. The CustomiZe! files are only needed when you want the advanced systems (rarity upgrade, leveling, custom stats).

Tools in packs/configs follow the same format as pack items — same material, generate, and textures fields:

info:
  namespace: my_pack

items:
  silver_sword:
    display_name: "Silver Sword"
    resource:
      generate: true
      material: IRON_SWORD    # Stats of an iron sword, custom texture
      model_id: 200500
      textures:
        - tools/silver_sword.png

  silver_pickaxe:
    display_name: "Silver Pickaxe"
    resource:
      generate: true
      material: IRON_PICKAXE  # Stats of an iron pickaxe, custom texture
      model_id: 200501
      textures:
        - tools/silver_pickaxe.png

  mythril_axe:
    display_name: "Mythril Axe"
    resource:
      generate: true
      material: DIAMOND_AXE   # Diamond stats
      model_id: 200502
      textures:
        - tools/mythril_axe.png
These are display-only retextures. If you want tools that level up, have custom mechanics, or give different damage — use Custom Swords or Custom Pickaxes in the CustomiZe! folder instead.

Good material choices by tool type

Tool typeRecommended material
SwordWOODEN_SWORD, STONE_SWORD, IRON_SWORD, DIAMOND_SWORD
PickaxeWOODEN_PICKAXE, IRON_PICKAXE, DIAMOND_PICKAXE, NETHERITE_PICKAXE
AxeWOODEN_AXE, IRON_AXE, DIAMOND_AXE
ShovelIRON_SHOVEL, DIAMOND_SHOVEL
HoeIRON_HOE, DIAMOND_HOE
Generic itemPAPER (most common — no durability bar, flat texture)

Font Images (Glyphs)

PNG images rendered as text characters — used for GUI backgrounds, rank badges, icons in lore, and ESC menu art.

What Is a Font Image?

Minecraft supports custom fonts where each character can be replaced with a PNG image. CustomiZer uses this to render images anywhere text is shown — including inventory titles, item lore, chat, scoreboards, and the ESC menu.

This is how the fancy GUI backgrounds, the rank icons in chat, and the ESC menu logos work. They're all just carefully positioned PNG images rendered as "characters".

Defining Font Images in a Pack

Create a font.yml (or any .yml file) in your pack's configs/ folder:

info:
  namespace: my_pack

font_images:
  my_icon:                           # Key used to display this image
    path: "font/my_icon.png"         # In assets/my_pack/textures/font/my_icon.png
    scale_ratio: 11                  # Size of the image in pixels (height)
    y_position: 9                    # Vertical offset from the text baseline

Using a Font Image in Text

Once defined, you display the image using the MiniMessage <font_image> tag:

title: "<font_image:my_pack:my_icon>"
# or in item lore:
lore:
  - "<font_image:my_pack:my_coin> 500 coins"

The image appears inline wherever text appears — in inventory titles, item names, lore lines, chat messages, etc.

Rank Badge Glyphs (gem_ranks example)

Font images can be permission-gated. When show_in_gui: true is set, players with the required permission see their rank badge displayed in the GUI:

info:
  namespace: gem_ranks

font_images:
  bronze_amethyst_i:
    permission: bronze_amethyst_i     # Player needs this permission to see this glyph
    show_in_gui: true                 # Show in the rank GUI
    path: "bronze_amethyst_i"         # assets/gem_ranks/textures/bronze_amethyst_i.png
    scale_ratio: 12
    y_position: 9.5

  gold_diamond_iii:
    permission: gold_diamond_iii
    show_in_gui: true
    path: "gold_diamond_iii"
    scale_ratio: 12
    y_position: 9.5

Give a player the permission gem_ranks.bronze_amethyst_i and they'll see that badge appear next to their name or in the rank GUI.

GUI Background Font Images

The GUI background (the image behind the inventory grid) is also a font image. It's rendered in the inventory title with special pixel-offset characters:

info:
  namespace: CustomiZerInternal

font_images:
  "1":
    path: custom/30main_gui/1    # The GUI background image
    scale_ratio: 255             # Large scale = full inventory background
    y_position: 46
    x_position: -6.5

Then in the GUI title:

title: "<white><shift:-8><font_image:CustomiZerInternal:1>"

The <shift:-8> is a pixel offset that positions the background image correctly.

Tips for Font Images

  • scale_ratio: The height of the image in game pixels. 11–12 is good for small icons. 255 is used for full-screen GUI backgrounds.
  • y_position: Move the image up or down relative to the text line. Positive = up, negative = down.
  • Always use PNG with transparency for icons and badges.
  • Test your glyphs by giving yourself a paper item with the font tag in its name.

In-Game Glyph Commands

CustomiZer includes a full set of admin commands to browse, search, preview, and manage glyphs directly in-game. All of these require the cxp.admin permission.

/zpack fonts

Lists every registered font image across all packs. Shows the pack name, font ID, Unicode codepoint, and the exact tag you need to paste into gui.yml:

# Example output in chat:
# [CustomiZer] Registered font images (12):
#   gem_ranks:bronze_amethyst_i  U+E000  → gui.yml: <font_image:gem_ranks:bronze_amethyst_i>
#   my_pack:my_icon              U+E001  → gui.yml: <font_image:my_pack:my_icon>

/zpack font <packName> <fontId>

Previews a single glyph. Sends it to your action bar so you can see exactly how it looks in-game. Run this whenever you add a new font image and want to check its size and position.

/zpack glyph list [packName]

Lists all registered glyphs (with the Glyph API metadata). Add a pack name to filter to just that pack's glyphs:

# All glyphs:
/zpack glyph list

# Only glyphs from "gem_ranks":
/zpack glyph list gem_ranks
In-game glyph list output

Each entry shows the pack name, font ID, Unicode codepoint, and two clickable links — [copy tag] copies the full <font_image:pack:id> tag ready to paste into any YAML, and [copy char] copies the rendered Unicode character itself. No need to open any YAML file — find the glyph you want in chat, click copy, paste it wherever you need it.

/zpack glyph <packName> <fontId>

Shows detailed info about one specific glyph — its codepoint, the Unicode character, and the YAML tag to use it.

/zpack glyph search <query>

Searches all registered glyphs by name. Useful when you have many font images and can't remember the exact ID:

/zpack glyph search bronze

/zpack glyph export

Prints YAML snippets for every registered glyph. Useful if you want to lock codepoints so they don't change after a reload (copy the output into your pack configs).

/zpack glyph regenerate

Clears the entire glyph codepoint registry and reassigns all codepoints from scratch. Use this if codepoints have gotten misaligned after adding or removing glyphs. Warning: players must re-download the resource pack after running this.

PlaceholderAPI Integration

If PlaceholderAPI is installed, you can use glyphs as placeholders anywhere that supports PAPI:

PlaceholderReturns
%customizer_glyph_<pack>_<id>%The rendered character (use in chat, lore, etc.)
%customizer_glyph_unicode_<pack>_<id>%Unicode escape (e.g. \uEC00)
%customizer_glyph_hex_<pack>_<id>%Hex codepoint (e.g. EC00)

Example in a LuckPerms prefix: [%customizer_glyph_gem_ranks_gold_i%] — this renders the gold rank icon next to the player's name in chat.

ESC Menu Customization

Replace the vanilla pause menu text (like "Game Menu" and "Disconnect") with custom PNG images.

How It Works

Minecraft's ESC menu buttons show text from language files — for example, the title reads whatever the translation of menu.game says. CustomiZer injects custom font characters into those translation strings, replacing the text with your PNG image characters.

The result: players open their ESC menu and instead of "Game Menu" they see your server's logo image.

Setting It Up

Create a YAML config file in your pack's configs/ folder:

info:
  namespace: my_esc_pack

minecraft_lang_overwrite:
  esc_menu_texts:
    entries:
      # Replace the "Game Menu" title with your logo image
      "menu.game": ":top_logo_1::offset_-1:"

      # Replace the "Disconnect" button text with a custom banner image
      "menu.disconnect": ":offset_-10::offset_-256::bottom_banner::offset_-256:"

    # Apply to all language files (ALL), or specific ones: [en_us, fr_fr]
    languages:
      - ALL

    # For Lunar Client players (requires Apollo-Bukkit):
    # Set this to the resource location of the same logo image
    apollo_icon: "my_esc_pack:textures/top_logo_1.png"

The Token Syntax

Inside the string value, you use colon-wrapped tokens:

  • :my_image_key: — renders the font image defined as my_image_key in your font.yml
  • :offset_-256: — moves the cursor left by 256 pixels (used to position images)
  • :offset_10: — moves the cursor right by 10 pixels

Client Compatibility

ClientESC menu works?How
Vanilla Minecraft✅ YesLang override (automatic)
Lunar Client✅ YesVia apollo_icon + Apollo-Bukkit plugin
Feather Client⚠️ ConfigurableSet ignore_feather_client: true in settings.yml to skip ESC art for Feather players

The CustomiZe! Folder

Where you configure gameplay mechanics — completely separate from the visual pack system.

Why Is It Separate?

The packs/ folder handles appearance — textures, models, sounds. The CustomiZe!/ folder handles behavior — how items work in the game.

This separation exists because many servers want to use third-party resource packs (bought or downloaded) exactly as-is, without modifying them. By keeping behavior config separate, you can use any pack's textures while fully controlling how those items work on your server.

Folder Structure

plugins/CustomiZer/CustomiZe!/
__global__/ ← Server-wide config (always loaded first)
items.yml ← Custom usable items with actions
swords.yml ← Custom swords with rarity and progression
axes.yml ← Custom axes (same format as swords)
armors.yml ← Custom armor pieces
blocks.yml ← Custom blocks with drops and rewards
pickaxes.yml ← Levelling pickaxes
harvesterhoes.yml ← Harvester hoes with auto-harvest
cosmetics.yml ← Wearable cosmetic items
gems.yml ← Gem socket definitions
sets.yml ← Armor set bonuses
defaulkttools/ ← Pack-specific overrides for "defaulkttools" pack
swords.yml ← Swords specific to this pack only
pickaxes.yml
gui.yml ← Functional items shown in /zitems for this pack
barrel_knight/
armors.yml
blocks.yml
packs/ ← Per-pack display browser files for /z gui
defaulkttools/
gui.yml ← Raw visual items shown in /z gui for this pack

How Merging Works

All CustomiZe!/*/swords.yml files are deep-merged together at load time. __global__ loads first, then each pack folder alphabetically. This means:

  • You can add pack-specific swords in CustomiZe!/my_pack/swords.yml without touching the global file
  • All packs' items/blocks/swords/etc. are combined into one big list
  • If two files define the same key, the later-loading file wins (alphabetical order)

Quick Reference — Which file for what?

I want to configure...File to edit
A clickable item with effects/commandsCustomiZe!/__global__/items.yml
A sword that levels up and changes textureCustomiZe!/__global__/swords.yml
An armor piece with attributesCustomiZe!/__global__/armors.yml
A placeable block with drops and Jobs XPCustomiZe!/__global__/blocks.yml
A levelling pickaxe with area miningCustomiZe!/__global__/pickaxes.yml
A harvester hoe with auto-replantCustomiZe!/__global__/harvesterhoes.yml
How a pack appears in /zitems (functional items)items/my_pack/gui.yml
How a pack appears in /z gui (display browser)packs/my_pack/gui.yml
/zitems nav buttonsplugins/CustomiZer/gui/items_shop.yml
/z gui category browser appearanceplugins/CustomiZer/gui/main_menu.yml

Custom Items

Usable items with click actions, cooldowns, limited uses, and food effects.

File: plugins/CustomiZer/CustomiZe!/__global__/items.yml
Or per-pack: CustomiZe!/my_pack/items.yml

What Is a Custom Item?

A custom item is any item that does something special when right-clicked (or eaten). Examples: a scroll that runs a command, a health potion that restores hearts, a money bag that gives currency, a food item that applies potion effects.

Custom items are defined here. The texture comes from a pack item in packs/. You connect them by matching the MODELDATA number to the model_id in your pack.

Full Example

items:
  teleport_scroll:
    TYPE: PAPER                     # Vanilla material (must match the pack item's material)
    NAME: "&d✦ Teleport Scroll"
    LORE:
      - "&7Right-click to teleport to spawn."
      - "&8Cooldown: 30 seconds"
      - "&8Uses: &f%uses% &8remaining"
    MODELDATA: 12000               # Must match the model_id in your pack item definition
    COOLDOWN: 30                   # Seconds between uses
    USE: 5                         # Item breaks after 5 uses (-1 = unlimited)
    INTERACTS:
      - RIGHT_CLICK_AIR
      - RIGHT_CLICK_BLOCK
    ACTION:
      TYPE: COMMAND
      COMMAND: "spawn %player%"    # %player% is replaced with the player's name

All ACTION Types

TYPEExtra Fields NeededWhat It Does
COMMANDCOMMAND: "command here"Runs a console command. Use %player% for player name.
HEALRestores 2 hearts (4 health points) instantly.
JUMPDURATION: 10Gives Jump Boost II for N seconds.
SPEEDDURATION: 10Gives Speed II for N seconds.
REGENDURATION: 10Gives Regeneration II for N seconds.
STRENGTHDURATION: 10Gives Strength II for N seconds.
LUCKDURATION: 10Gives Luck II for N seconds.
GODMakes player invulnerable (god mode).
FLYEnables creative-mode flight.
MONEYAMOUNT: 500Gives exactly that amount via Vault economy.
RANDOMMONEYAMOUNT: 100 + MAX_AMOUNT: 500Gives a random amount between min and max.
JOBSBOOSTERJOB_BOOST_MULTIPLIER: 1.5 + JOB_BOOST_DURATION: 300Boosts Jobs XP gains temporarily.
EATUses the FOOD block belowItem is eaten. Effects apply after consuming.
NONEDisplay-only item. Nothing happens on click.

INTERACTS Options

Controls which clicks trigger the action:

ValueWhen it triggers
RIGHT_CLICK_AIRRight-click while looking at the sky
RIGHT_CLICK_BLOCKRight-click while looking at a block
SHIFT_RIGHT_CLICK_AIRShift + right-click in the air
SHIFT_RIGHT_CLICK_BLOCKShift + right-click on a block

Food Items

Any item can be made edible — even PAPER. Add a FOOD block and set ACTION TYPE: EAT:

items:
  magic_herb:
    TYPE: PAPER
    NAME: "&aMagic Herb"
    LORE:
      - "&7Eat to gain Regeneration and Speed."
    MODELDATA: 12010
    COOLDOWN: 0
    USE: -1
    INTERACTS: []       # Empty — eating triggers the action, not clicking
    ACTION:
      TYPE: EAT
    FOOD:
      NUTRITION: 4              # Hunger bars restored (2 = one drumstick)
      SATURATION: 0.6           # Saturation added (0.0–1.0)
      CAN_ALWAYS_EAT: true      # Player can eat this even when not hungry
      EFFECTS:
        - effect: REGENERATION
          duration: 200          # ticks (20 ticks = 1 second, so 200 = 10 seconds)
          amplifier: 1           # 0 = Level I, 1 = Level II, 2 = Level III
          chance: 1.0            # 100% chance
        - effect: SPEED
          duration: 100          # 5 seconds
          amplifier: 0           # Speed I
          chance: 0.5            # 50% chance — might not apply!

Lore Placeholders

In item lore you can use %uses% to show remaining uses dynamically. Color codes (&a, &6, etc.) and MiniMessage tags work in both NAME and LORE.

Custom Swords & Axes

Custom weapons with attributes, enchants, hit effects, elemental damage, and lifesteal. Every feature listed below is optional — a sword needs zero special config to work as a plain custom item.

Files: CustomiZe!/__global__/swords.yml and CustomiZe!/__global__/axes.yml. Axes use the exact same format under an axes: root key instead of swords:.
The rarity / kill-based levelling system is 100% optional. See the Levelling System page. You can skip the rarity: block entirely and the sword works fine.

All Config Keys

KeyTypeRequired?DefaultDescription
typeStringOptionalIRON_SWORDVanilla material. Must match the pack item material.
pack_idStringOptionalFormat: packName:itemId. If set, material and CMD are resolved from PackManager — skip type and custom_model_data.
display_nameStringOptional"Custom Sword"Default name when no rarity tier is active.
custom_model_dataIntOptional0Fallback CMD when no rarity block is present.
durabilityIntOptionalMaterial maxCustom durability tracked by the plugin (independent of vanilla damage). Stored in item NBT.
HIDE-ENCHANTSBooleanOptionalfalseHides the enchantment glint and tooltip lines.
loreList<String>Optional[]Base lore lines. Supports placeholders listed below and MiniMessage color tags.
enchantmentsSectionOptionalMap of enchantment name → level (see below).
attributesSectionOptionalMap of attribute name → flat value (see below).
effects-enemySectionOptionalPotion effects applied to the hit enemy on each attack.
effects-selfSectionOptionalPotion effects applied to the attacker on each hit.
elemental_damageStringOptional"None"Cosmetic/functional element: Fire, Ice, Lightning, Shadow, or None.
raritySectionOptionalKill-based upgrade system. Remove this block entirely for a static sword. See Levelling System.

Attributes

Written as a flat map under attributes:. Values are added on top of the base material's default stats. All are optional — include only what you need.

Attribute nameEffectExample value
GENERIC_ATTACK_DAMAGEFlat attack damage added to hits8.0
GENERIC_ATTACK_SPEEDAttack speed (vanilla default ≈ 1.6)1.6
GENERIC_MAX_HEALTHBonus max health (2.0 = 1 extra heart)4.0
GENERIC_MOVEMENT_SPEEDMovement speed multiplier bonus0.02
GENERIC_KNOCKBACK_RESISTANCEReduces knockback received (1.0 = immune)0.5
GENERIC_LUCKLuck modifier (affects loot tables)2.0
Attribute values are bound to the main-hand slot. The plugin adds them as flat modifiers using ADD_NUMBER operation.

Enchantments

Written as enchantments: section with enchantment name (Bukkit Registry key) → level:

enchantments:
  sharpness: 5
  unbreaking: 3
  looting: 2
  fire_aspect: 2
  knockback: 2
  sweeping_edge: 3

Hit Effects (effects-enemy / effects-self)

Each entry under effects-enemy or effects-self is a potion effect key with two sub-keys:

Sub-keyTypeDefaultDescription
chanceDouble (0.0–1.0)0.0Probability per hit. 1.0 = 100%, 0.5 = 50%.
durationInt (ticks)100How long the effect lasts. 20 ticks = 1 second.

The effect name is the Bukkit PotionEffectType registry key. Common ones:

Effect keyWhat it does
slownessSlows movement speed
weaknessReduces attack damage
poisonDeals damage over time (won't kill below 1hp)
witherDeals damage over time (can kill)
blindnessNarrows player's vision
nauseaScreen wobble effect
levitationLifts entity into the air
strength(self only) Increases your damage
speed(self only) Increases movement speed
regeneration(self only) Heals over time
absorption(self only) Adds absorption hearts
resistance(self only) Reduces incoming damage

Elemental Damage

Set elemental_damage to one of these values. Each triggers a different effect on hit:

ValueEffect on enemy
FireSets the target on fire
IceApplies Slowness to the target
LightningStrikes lightning at the target's location
ShadowApplies Blindness to the target
NoneNo elemental effect (default)

Lifesteal

Lifesteal is automatic when the rarity block is present — you do not configure it manually. The amount scales with the current rarity tier:

Rarity tierLifesteal
Common0.01 HP flat per hit
Rare15% of damage dealt
Epic25% of damage dealt
Legendary35% of damage dealt
Mythic50% of damage dealt
Lifesteal only activates when the rarity system is enabled (the sword has a rarity: block). Static swords without a rarity block have no lifesteal.

Lore Placeholders

PlaceholderReplaced with
%custom_durability%Current remaining durability
%max_custom_durability%Maximum durability at this tier
%rarity%Current rarity tier name (only when rarity block exists)
%progress%Kills toward next upgrade
%required%Total kills required for next upgrade
%total_kills%All-time kills with this weapon
%total_blocks%Blocks broken with this sword

Minimal Example (No Levelling)

swords:
  fire_sword:
    type: IRON_SWORD
    display_name: "&c&l🔥 Fire Sword"
    durability: 3000
    HIDE-ENCHANTS: true
    lore:
      - "&7A sword kissed by flame."
      - "&8Durability: %custom_durability% / %max_custom_durability%"
    attributes:
      GENERIC_ATTACK_DAMAGE: 8.0
      GENERIC_ATTACK_SPEED: 1.8
    enchantments:
      unbreaking: 3
      looting: 2
    effects-enemy:
      slowness:
        chance: 0.5        # 50% chance per hit
        duration: 60       # 3 seconds
    elemental_damage: Fire

Full Example (With Rarity Levelling)

swords:
  dragon_blade:
    type: IRON_SWORD
    display_name: "&4Dragon Blade"
    durability: 5000
    HIDE-ENCHANTS: true
    lore:
      - "&8Rarity: %rarity%"
      - "&8Progress: %progress% / %required% kills"
      - "&8Durability: %custom_durability% / %max_custom_durability%"
    attributes:
      GENERIC_ATTACK_DAMAGE: 10.0
      GENERIC_ATTACK_SPEED: 1.6
    enchantments:
      sharpness: 3
      looting: 2
    effects-enemy:
      slowness:
        chance: 0.40
        duration: 60
      weakness:
        chance: 0.25
        duration: 100
    effects-self:
      strength:
        chance: 0.15
        duration: 120
    elemental_damage: Fire

    # Remove this entire rarity block if you don't want levelling
    rarity:
      common:
        custom_model_data: 32001
        name: "&7Common Dragon Blade"
      rare:
        custom_model_data: 32002
        name: "&9Rare Dragon Blade"
      epic:
        custom_model_data: 32003
        name: "&5Epic Dragon Blade"
      legendary:
        custom_model_data: 32004
        name: "&6Legendary Dragon Blade"
      mythical:
        custom_model_data: 32005
        name: "&dMythical Dragon Blade"

Custom Armors

Armor pieces with stat bonuses, potion effects while worn, armor trim cosmetics, and 3D equippable models.

File: CustomiZe!/__global__/armors.yml

All Config Keys

KeyTypeRequired?Description
typeStringRequired (native mode)Vanilla armor material, e.g. DIAMOND_HELMET. Used when NOT using pack_id.
pack_idStringOptionalFormat: packName:itemId. If set, material and CMD are pulled from PackManager automatically — skip type, model_data.
base_materialStringOptionalOverride the underlying vanilla material for attribute slot binding only. E.g. set base_material: NETHERITE_CHESTPLATE so your custom leather chest gets netherite attribute slots.
display_nameStringRequiredItem name shown to players. Supports MiniMessage.
loreList<String>OptionalLore lines. Supports MiniMessage color tags.
model_dataIntOptionalCustom Model Data. Used in native mode (without pack_id).
item_modelStringOptional1.21.4+ item model component (namespace:path). Alternative to CMD for newer Minecraft versions.
attributesList<Map>OptionalStat bonuses applied while the piece is worn. Each entry has attribute, amount, and operation.
potion_effectsList<Map>OptionalPotion effects applied while the armor is equipped; removed when it's taken off.
trimSectionOptionalCosmetic armor trim. Keys: material and pattern.
equippableSectionOptional1.21.4+ equippable component for 3D worn models. Keys: model and equip_sound.

Attributes

Attributes are a list. Each entry is a map with three keys: attribute, amount, and operation. All are bound to the armor's equipment slot automatically.

Attribute nameEffectNotes
GENERIC_MAX_HEALTHBonus max health2.0 = 1 extra heart
GENERIC_ARMORArmor points2.0 = 1 armor bar segment
GENERIC_ARMOR_TOUGHNESSArmor toughnessReduces damage from high-damage hits
GENERIC_MOVEMENT_SPEEDWalk speed bonus0.01 ≈ small speed increase
GENERIC_KNOCKBACK_RESISTANCEReduces knockback1.0 = completely immune to knockback
GENERIC_ATTACK_DAMAGEMelee damage bonusWorks on armor too (rare use case)
GENERIC_LUCKLuck modifierAffects loot table rolls

Attribute Operations

operationEffect
ADD_NUMBERAdds a flat value. Most common for armor/health bonuses.
ADD_SCALARAdds a percentage of the base attribute value.
MULTIPLY_SCALAR_1Multiplies the base value by the given amount.

Potion Effects (While Worn)

Each entry in potion_effects is a map with three keys:

KeyTypeDescription
effectStringBukkit PotionEffectType key, e.g. fire_resistance, strength, speed, regeneration, night_vision, water_breathing
durationInt (ticks)How long the effect lasts. Use a very large number like 999999 for permanent-while-worn.
amplifierIntEffect level. 0 = Level I, 1 = Level II, 2 = Level III.
Potion effects are applied when the player equips the armor and removed when they take it off. The plugin refreshes them periodically so they stay active while worn.

Armor Trim

Adds a purely cosmetic pattern overlay on the armor texture. Both keys are required if you include the trim section.

trim:
  material: GOLD         # Trim color material (GOLD, IRON, DIAMOND, NETHERITE, etc.)
  pattern: WAVY          # Trim pattern (SENTRY, DUNE, COAST, WILD, WARD, EYE, VEX, TIDE,
                         # SNOUT, RIB, SPIRE, SILENCE, FLOW, BOLT, WAVY, SHAPER, RAISER, HOST)

Equippable (3D Worn Model)

The equippable section sets a 3D model that appears on the player's body when they wear the armor. Requires Minecraft 1.21.4+ clients.

equippable:
  model: "my_pack:dragon_armor"               # Resource location of the equippable model
  equip_sound: "minecraft:item.armor.equip_diamond"  # Sound when equipping
When using pack_id, the equippable.model and equippable.equip_sound from the pack item are used by default. The equippable section in armors.yml overrides those values.

Full Example

custom_armors:
  dragon_helmet:
    pack_id: "my_pack:dragon_helmet"   # Pulls material + CMD from PackManager

    display_name: "&4&lDragon Helmet"
    lore:
      - "&7Forged from dragonscale."
      - "&8+4 Max Health | +3 Armor"

    attributes:
      - attribute: GENERIC_MAX_HEALTH
        amount: 4.0
        operation: ADD_NUMBER        # +2 extra hearts
      - attribute: GENERIC_ARMOR
        amount: 3.0
        operation: ADD_NUMBER

    potion_effects:
      - effect: fire_resistance
        duration: 999999             # Permanent while worn
        amplifier: 0                 # Level I
      - effect: night_vision
        duration: 999999
        amplifier: 0

    trim:
      material: GOLD
      pattern: WAVY

    equippable:
      model: "my_pack:dragon_armor"
      equip_sound: "minecraft:item.armor.equip_diamond"

Custom Blocks — Gameplay Side

This file controls everything that happens when a custom block is placed or mined — hardness, blast resistance, drops, required tools, light emission, display name, lore, sounds, particles, and Jobs XP. It is the companion to packs/blocks.yml which only handles textures.

Files: CustomiZe!/your_pack/blocks.yml (per-pack, recommended) or CustomiZe!/__global__/blocks.yml (global catch-all)

The Two-File Rule (Quick Reminder)

packs/your_pack/configs/blocks.ymlCustomiZe!/your_pack/blocks.yml
Texture, model ID, placement type, break soundsDisplay name, lore, hardness, blast_resistance, break_with, drops, light_level, particles, XP rewards
All gameplay properties — including hardness and blast_resistance — belong in CustomiZe!. The packs/ folder is strictly for visuals.

Full Block Configuration

Here is a complete example showing every available option for one block. Use only the fields you need — most are optional.

# CustomiZe!/my_pack/blocks.yml

blocks:
  silver_ore:
    # Links this entry to packs/my_pack/configs/blocks.yml → silver_ore
    # Format: "namespace:item_key"  (namespace = pack's info.namespace value)
    pack_id: "my_pack:silver_ore"

    # Rich display name shown in lore and break messages.
    # Supports MiniMessage tags (gradients, colours, bold, etc.)
    display_name: "Silver Ore"

    # Lore lines shown when the block item is in the player's hand.
    lore:
      - "A pale metallic ore."
      - "Drops Raw Silver when mined."

    # Mining time — mirrors vanilla hardness values.
    # Higher = slower to mine. Omit to use vanilla NOTE_BLOCK timing (very fast).
    # Reference: stone=1.5, iron_ore=3.0, deepslate_ore=4.5, obsidian=50.0
    hardness: 3.0

    # Explosion resistance. Blocks with this set are fully protected from
    # TNT, creeper, and other explosion damage. Omit to allow destruction.
    blast_resistance: 3.0

    # Light emission level (0 = no light, 15 = full torch-level light).
    # When set above 0, the server places a hidden LIGHT block so real
    # light propagates. Players still see the ore texture, not the light block.
    light_level: 8

    # Whether the block drops its own block item when broken.
    # false = use the drops list below instead (recommended for ores)
    # true  = the block item itself drops (good for decorative blocks)
    drop_self: false

    # ── Which tools can break this block ──────────────────────────────────
    # List vanilla material names and/or custom pickaxe IDs from pickaxes.yml.
    # Omit this key entirely → any tool works (including bare hand).
    # Set to an empty list [] → completely indestructible in survival.
    break_with:
      - IRON_PICKAXE
      - GOLDEN_PICKAXE
      - DIAMOND_PICKAXE
      - NETHERITE_PICKAXE
      - silver_lithium_pickaxe    # A custom pickaxe key from CustomiZe!/pickaxes.yml

    # ── What the block drops when broken ──────────────────────────────────
    # Multiple drops are all rolled independently (each has its own chance).
    drops:
      # type: plugin_item — a custom item defined in CustomiZe!/items.yml
      - type: plugin_item
        item: "my_pack:raw_silver"   # format: "pack_namespace:item_key"
        amount: 1                     # exact amount
        chance: 100                   # 100 = always drops

      # Use amount_min / amount_max for a random range:
      - type: plugin_item
        item: "my_pack:silver_shard"
        amount_min: 0
        amount_max: 2
        chance: 40                    # 40% chance to drop 0–2 shards

      # type: vanilla — any standard Bukkit material name
      - type: vanilla
        item: EXPERIENCE_BOTTLE
        amount_min: 1
        amount_max: 1
        chance: 20                    # 20% chance

      # type: command — runs a console command when this block is broken
      # %player% is replaced with the breaker's name
      - type: command
        command: "eco give %player% 5"
        chance: 50                    # 50% chance to give 5 coins

    # Optional sound played to the breaker when the block is mined.
    # Use any Minecraft sound key (tab-complete with /playsound).
    soundeffectonmined: "block.amethyst_block.break"

    # Optional particle effect shown when the block is mined.
    # Use any Bukkit Particle enum name.
    visualeffectonmined: "VILLAGER_HAPPY"


  # ── Decorative block example (drop_self: true) ──────────────────────────
  oak_beam:
    pack_id: "my_pack:oak_beam"
    display_name: "&fOak Beam"
    lore:
      - "&7A decorative oak wood beam."
    hardness: 2.0            # Mines at log speed
    blast_resistance: 2.0
    drop_self: true          # Drops the block item itself (no drops list needed)
    break_with:
      - HAND                 # Can be broken by bare hand
      - WOODEN_AXE
      - STONE_AXE
      - IRON_AXE
      - GOLDEN_AXE
      - DIAMOND_AXE
      - NETHERITE_AXE


# ── XP and money rewards ─────────────────────────────────────────────────────
# Works for BOTH your custom pack blocks AND vanilla Minecraft blocks.
# Add this section anywhere in the file (or in __global__/blocks.yml).
xp_values:

  # Custom block: use "namespace:item_key" (same as pack_id above)
  my_pack:silver_ore:
    name: "Silver Ore"
    jobsxp: 8.0              # XP given to the Jobs plugin job
    job: "Miner"             # The Jobs job name (must match your jobs config)
    money: 5.0               # Vault economy money given to the player
    points: 2.0              # Server points / custom currency
    cancel-vanilla-drops: false   # true = stop vanilla drops (useful for custom ores)

  # Vanilla block: use the Bukkit material name
  COAL_ORE:
    name: "Coal Ore"
    jobsxp: 2.0
    job: "Miner"
    money: 1.0
    points: 0.5
    cancel-vanilla-drops: false

All Fields at a Glance

FieldRequired?Description
pack_idrequiredLinks to the packs/ entry. Format: "namespace:item_key"
display_nameoptionalMiniMessage display name shown in break messages and lore
loreoptionalList of lore lines on the block item
hardnessoptionalMining time. stone≈1.5, iron_ore≈3.0, deepslate≈4.5, obsidian≈50. Omit = instant (vanilla NOTE_BLOCK speed)
blast_resistanceoptionalWhen set, the block is fully protected from explosions. Omit = can be blown up
light_leveloptional0–15 light emission. Uses a hidden LIGHT block server-side
drop_selfoptionaltrue = drops its own block item. false = use drops list
break_withoptionalList of tool materials + custom pickaxe IDs. Omit = any tool. [] = indestructible
dropsoptionalList of drop entries. Each has type, item, amount/amount_min/amount_max, chance
soundeffectonminedoptionalMinecraft sound key played to the breaker on break
visualeffectonminedoptionalBukkit Particle enum name shown on break
iscaveblockoptionalSpecial CaveBlock config (see the CaveBlock section)

Drop Types

typeitem value formatExample
plugin_item"pack_namespace:item_key"A custom item configured in CustomiZe!/items.yml
vanillaBukkit Material nameDIAMOND, EXPERIENCE_BOTTLE, IRON_INGOT
commandConsole command string (%player% is replaced)"eco give %player% 50"
Multiple drops stack. All drop entries are rolled independently. A block can simultaneously try to drop a raw ore (100% chance), bonus shards (40% chance), and run an economy command (25% chance) — each roll happens separately on every break.

Custom Pickaxes

Pickaxes that level up as players mine — each level unlocks new textures, area mining, and Haste effects.

File: CustomiZe!/__global__/pickaxes.yml

How Pickaxe Levelling Works

Each pickaxe tracks how many blocks the player has mined with it. When the count reaches blocks_required for the current level, the pickaxe automatically upgrades to the next level. The upgrade:

  • Changes the Custom Model Data → new texture appears
  • Increases durability, mining radius, and effect level
  • Updates the lore to show the new stats
  • Notifies the player

Full Configuration Example

pickaxes:
  tier_pickaxe:
    type: DIAMOND_PICKAXE
    display_name: "⛏ Tier Pickaxe"
    lore:
      - "⛏ Level: %level% / %max_level%"
      - "Blocks mined: %blocks_mined% / %blocks_required%"
      - "Durability: %current_durability% / %max_durability%"
      - "Mining area: %radius%×%radius%"
      - "%bonuses%"

    levels:
      # Level 1 — Starting tier
      1:
        name: "⛏ Tier Pickaxe [Lvl. 1]"
        custom_model_data: 30041        # Texture for level 1 (wooden-looking)
        durability: 2000
        radius: 1                       # Mines 1×1 (just the block you click)
        height_radius: 0                # 0 = only the exact height level mined
        effect_on_hold: haste
        effect_amplifier: 0             # 0 = Haste I
        blocks_required: 200            # Mine 200 blocks to reach level 2
        bonus:
          - "• Haste I while held"

      # Level 2
      2:
        name: "⛏ Tier Pickaxe [Lvl. 2]"
        custom_model_data: 30042        # New texture (stone-looking)
        durability: 4000
        radius: 1
        height_radius: 1               # Mines 1 block above and below too (3 tall)
        effect_on_hold: haste
        effect_amplifier: 0
        blocks_required: 500
        bonus:
          - "• Haste I while held"
          - "• 1×3 column mining"

      # Level 3
      3:
        name: "⛏ Tier Pickaxe [Lvl. 3]"
        custom_model_data: 30043        # New texture (iron-looking)
        durability: 7000
        radius: 3                       # Mines 3×3 area
        height_radius: 1
        effect_on_hold: haste
        effect_amplifier: 1             # Haste II
        blocks_required: 1000
        bonus:
          - "• Haste II while held"
          - "• 3×3 area mining"

      # Level 4 — Final tier
      4:
        name: "⛏ Tier Pickaxe [Lvl. 4]"
        custom_model_data: 30044        # New texture (diamond/netherite-looking)
        durability: 12000
        radius: 3
        height_radius: 3               # Mines 3×7 tall area
        effect_on_hold: haste
        effect_amplifier: 1
        blocks_required: 0             # 0 = MAX LEVEL, no further upgrade
        bonus:
          - "• Haste II while held"
          - "• 3×7 area mining"
          - "• MAX LEVEL"

All Per-Level Config Keys

KeyTypeRequired?DefaultDescription
nameStringOptionalDisplay name at this level. Supports MiniMessage.
loreList<String>OptionalLore lines at this level. Supports all placeholders below.
custom_model_dataIntOptional0CMD for the texture at this level.
pack_idStringOptionalPer-level pack item override (format: packName:itemId).
durabilityIntOptionalMaterial maxCustom durability for this level. The plugin tracks it independently of vanilla damage.
blocks_requiredIntOptional0Blocks to mine to advance to the next level. Set to 0 on the last level — this signals it is the max level.
radiusIntOptional1Horizontal mining radius. 1 = 1×1 (single block), 3 = 3×3 area.
height_radiusIntOptional0Vertical mining radius. 0 = only the exact block, 1 = one block above and below (3 tall), 3 = 7 tall.
two_blocksBooleanOptionalfalseShortcut for height_radius: 1. Set to true to mine 1×3 (one block above + below target).
down_depthIntOptional0Column depth mined downward from the clicked block. Useful for column-mining hoes or shaft pickaxes.
effect_on_holdStringOptionalPotion effect type applied while this pickaxe is held in the main hand (e.g. haste, speed).
effect_amplifierIntOptional0Effect amplifier. 0 = Level I, 1 = Level II.
bonusList<String>OptionalFlavor lines shown via the %bonuses% lore placeholder at this level.

Lore Placeholders

PlaceholderShows
%level%Current level number
%max_level%Highest defined level
%blocks_mined%Blocks mined toward the next level
%blocks_required%Blocks needed for next level (0 at max)
%total_blocks%All-time blocks mined with this pickaxe
%current_durability%Remaining custom durability
%max_durability%Maximum durability at current level
%radius%Horizontal mining radius number (e.g. 3 for 3×3)
%height_radius%Vertical mining radius number
%down_depth%Column depth mined downward
%bonuses%All bonus lines for current level (multi-line)

Harvester Hoes

Auto-harvesting, auto-replanting hoes with an XP-based levelling system, custom drop tables, and Vault economy auto-sell. The levelling system is built-in.

File: CustomiZe!/__global__/harvesterhoes.yml

How Harvester Hoes Work

When a player right-clicks a crop with a configured harvester hoe, the plugin:

  1. Checks if the crop type is in supported-crops for this hoe
  2. Harvests the crop and optionally drops custom items (from the drops table)
  3. If auto-replant is enabled, replants the crop at replant-growth-stage
  4. If auto-sell is enabled, deposits money for the harvest directly to the player's balance
  5. Grants XP from xp-values and checks experience.level-up-requirements for a level-up
  6. Decrements uses by 1. When uses hit 0, the hoe breaks.

Top-Level Hoe Keys

KeyTypeRequired?Description
base-itemStringOptionalVanilla hoe material. Default: WOODEN_HOE. Use any hoe type: WOODEN_HOE, STONE_HOE, IRON_HOE, GOLDEN_HOE, DIAMOND_HOE, NETHERITE_HOE.
pack_idStringOptionalFormat: packName:itemId. If set, material and CMD are resolved from PackManager. Per-level pack_id inside abilities overrides this.
custom-model-dataIntOptionalDefault CMD. Overridden by the active ability level's model-data.
nameStringOptionalFallback display name used when the active ability level has no name. Default: "Harvester Hoe".
usesIntOptionalBase number of uses at level-0. Default: 10. This is multiplied by each level's use-multiplier on level-up.
loreList<String>OptionalFallback lore. Each ability level can have its own lore that overrides this.
supported-cropsList<String>RequiredVanilla crop block types this hoe can harvest. See list below.
xp-valuesSectionOptionalXP granted per harvested crop type. Key is material name, value is XP amount. Special key CUSTOM_CROP covers custom crops. Default: 1 per harvest.
dropsSectionOptionalCustom drop table per crop type. If defined, overrides vanilla drops. If not defined, vanilla drops are used.
experienceSectionOptionalXP level-up threshold configuration. Required only if you want levelling.
abilitiesSectionRequiredPer-level ability configuration. Must contain at least level-0.

Supported Crops (supported-crops)

Use vanilla Minecraft block material names:

Material nameCrop
WHEATWheat stalks
CARROTSCarrot plants
POTATOESPotato plants
BEETROOTSBeetroot plants
NETHER_WARTNether wart
MELON_STEMMelon stem (the growing stalk)
PUMPKIN_STEMPumpkin stem
COCOACocoa beans
SWEET_BERRY_BUSHSweet berry bushes
Any other crop blockAny full-grown vanilla crop block
The hoe only harvests crops at their maximum growth stage. Immature crops are ignored and left to continue growing.

Abilities (Levelling System)

The abilities section is where the levelling system lives. Each sub-key is a level name (e.g. level-0, level-1). level-0 is the starting state when the hoe is first created. The plugin upgrades to the next level name when XP thresholds are hit.

Per-Level Ability Keys

KeyTypeRequired?Description
nameStringOptionalDisplay name for the hoe at this level. Supports MiniMessage.
loreList<String>OptionalLore lines for this level. Use <uses> for remaining uses.
model-dataIntOptionalCustom Model Data at this level. Allows the texture to change per level.
pack_idStringOptionalPer-level pack item override (format: packName:itemId). Overrides top-level pack_id.
use-multiplierIntOptionalOn level-up, new uses = base_uses × use-multiplier. Default: 1 (no change). Set to 2 to double the uses at this level.
drop-multiplierIntOptionalMultiplies the quantity of drops from the drops table. Default: 1. Set to 2 for double drops.
auto-sellBooleanOptionalIf true, harvested crops are automatically sold for money via Vault instead of dropping on the ground. Default: false.
auto-replantBooleanOptionalIf true, the crop is automatically replanted after harvest. Default: false.
replant-growth-stageIntOptionalThe growth stage the crop is reset to after replanting. Default: 0 (seed stage). Use higher values to skip early growth stages.

XP Levelling (experience)

The experience.level-up-requirements section maps level names to cumulative XP totals. When the player's accumulated XP reaches the threshold, the hoe upgrades to that level automatically:

experience:
  level-up-requirements:
    level-1: 100     # Reach 100 XP → upgrade to level-1
    level-2: 300     # Reach 300 total XP → upgrade to level-2
    level-3: 600     # Reach 600 total XP → upgrade to level-3

XP is gained per harvest. The amount comes from xp-values:

xp-values:
  WHEAT: 5           # +5 XP per wheat harvested
  CARROTS: 7         # +7 XP per carrot
  POTATOES: 6        # +6 XP per potato
  CUSTOM_CROP: 3     # XP for any custom crop (from CustomiZer's crop system)
If a crop type is not in xp-values, the default XP is 1 per harvest. You don't need to list every crop — only the ones you want custom XP for.

Custom Drop Table (drops)

Defines what items drop when a crop is harvested. Organized by crop material → named drop entries:

drops:
  WHEAT:                          # Crop type
    wheat_item:                   # Any unique key for this drop entry
      item: WHEAT                 # Vanilla material name OR vanilla mapping
      chance: 1.0                 # 0.0–1.0 probability (1.0 = 100%)
      quantity: 1                 # How many to drop
    seeds:
      item: WHEAT_SEEDS           # Wheat seeds as a bonus drop
      chance: 0.5                 # 50% chance
      quantity: 2

  CARROTS:
    carrot_drop:
      item: CARROT                # Note: plugin auto-maps CARROTS block → CARROT item
      chance: 1.0
      quantity: 1
    bonus_carrot:
      item: CARROT
      chance: 0.3
      quantity: 3
The plugin automatically maps crop block names to their item equivalents: CARROTSCARROT, POTATOESPOTATO, BEETROOTSBEETROOT. Use the item name in the item: field.

Auto-Sell Prices (economy)

Required if any ability level has auto-sell: true. Price is per unit, multiplied by the current level's drop-multiplier:

economy:
  sell-prices:
    WHEAT: 50.0        # 50 coins per wheat
    CARROTS: 75.0
    POTATOES: 60.0
    BEETROOTS: 45.0

Messages

All message keys are optional. If not defined, no message is sent for that event.

KeyAvailable placeholdersWhen shown
messages.exp-gain{amount}, {total}, {hoe}After each harvest grants XP
messages.level-up{level}, {hoe}When the hoe levels up
messages.auto-sell{amount}, {item}When crops are auto-sold

Lore Placeholders

Only one special placeholder exists for hoe lore:

PlaceholderFormatReplaced with
<uses>Angle bracketsRemaining uses before the hoe breaks
The placeholder format is <uses> with angle brackets — not the percent-sign format used by swords and pickaxes. This is intentional.

Full Example

hoes:
  harvest_hoe:
    base-item: GOLDEN_HOE
    custom-model-data: 10000        # Starting CMD (level-0 CMD overrides this)
    name: "🌾 Harvest Hoe"
    uses: 100                       # Base uses at level-0

    supported-crops:
      - WHEAT
      - CARROTS
      - POTATOES
      - BEETROOTS

    xp-values:
      WHEAT: 5
      CARROTS: 7
      POTATOES: 6
      BEETROOTS: 4

    experience:
      level-up-requirements:
        level-1: 100
        level-2: 300
        level-3: 700

    drops:
      WHEAT:
        wheat:
          item: WHEAT
          chance: 1.0
          quantity: 1
        seeds:
          item: WHEAT_SEEDS
          chance: 0.4
          quantity: 1

    abilities:
      level-0:
        name: "&7🌾 Harvest Hoe [Lv.0]"
        lore:
          - "&8Uses: &f<uses>"
          - "&7Harvest crops automatically."
        model-data: 10000
        use-multiplier: 1
        drop-multiplier: 1
        auto-sell: false
        auto-replant: true
        replant-growth-stage: 0

      level-1:
        name: "&a🌾 Harvest Hoe [Lv.1]"
        lore:
          - "&8Uses: &f<uses>"
          - "&7+50% drops | Auto-replant"
        model-data: 10001           # New texture
        use-multiplier: 2           # 100 × 2 = 200 uses at this level
        drop-multiplier: 2          # 50% more drops (int, so effectively doubles)
        auto-sell: false
        auto-replant: true

      level-2:
        name: "&6🌾 Harvest Hoe [Lv.2]"
        lore:
          - "&8Uses: &f<uses>"
          - "&7Auto-sell enabled | Double drops"
        model-data: 10002
        use-multiplier: 3           # 100 × 3 = 300 uses
        drop-multiplier: 2
        auto-sell: true             # Crops sold directly to wallet
        auto-replant: true

economy:
  sell-prices:
    WHEAT: 50.0
    CARROTS: 75.0
    POTATOES: 60.0
    BEETROOTS: 45.0

messages:
  exp-gain: "&aGained &f{amount} &aXP! &8Total: &f{total}"
  level-up: "&6🎉 Your {hoe} levelled up to &e{level}&6!"
  auto-sell: "&aAuto-sold crops for &6{amount} coins."

Cosmetics

Wearable display items — hats, back items, wings — that players can equip without replacing armor.

File: CustomiZe!/__global__/cosmetics.yml
cosmetics:
  cool_hat:
    pack_id: "my_pack:cool_hat"      # References the pack item for texture
    display_name: "✦ Cool Hat"
    slot: hat                         # Where to equip: hat | back | wings | offhand
    lore:
      - "A very stylish hat."
      - "Right-click to equip or swap!"
    permission: "myserver.hats.cool"  # Optional — only players with this perm can use it

  angel_wings:
    pack_id: "my_pack:angel_wings"
    display_name: "🪶 Angel Wings"
    slot: back
SlotInventory PositionUsage
hatHEAD slotHats, crowns, helmets
backCHESTPLATE slotCapes, backpacks, wings
wingsCHESTPLATE slotAlias for back
offhandOFF_HAND slotCarried cosmetics

Backpacks

Physical backpack items that open a persistent inventory. The inventory is bound to the item, not the player — trade the backpack to transfer all its contents.

File: CustomiZe!/<pack>/backpacks.yml

How it works

  • Every backpack item gets a unique UUID stamped in its PDC (customizer:backpack_instance_uuid) when given.
  • The inventory is stored by that UUID (SQLite or MongoDB) — so two backpacks of the same type have separate inventories.
  • Players run /backpack while holding the backpack in their offhand (or wearing it on their chestplate) to open it.
  • Hoppers and plugins cannot move items into or out of an open backpack inventory.
storage:
  type: sqlite          # "sqlite" or "mongodb"
  sqlite:
    file: db/backpacks.db  # stored in plugins/CustomiZer/db/

backpacks:
  adventure_backpack_1:
    pack_id: "elitecreatures:adventure_backpack_cosmetic_backpack_1"
    display_name: "<gold><bold>🎒 Adventure Backpack I"
    slots: 18           # 9, 18, 27, 36, 45, or 54  (or use rows: 1-6)
    permission: "myserver.backpack.tier1"   # optional
    lore:
      - "<dark_gray>18 slots"
      - "<gray>Wear on chest or hold in offhand, run <yellow>/backpack"

  large_backpack:
    pack_id: "elitecreatures:large_backpack"
    display_name: "<green>🎒 Large Backpack"
    rows: 4             # equivalent to slots: 36
KeyDefaultDescription
pack_idrequiredThe CustomiZer pack item ID that provides the texture/model.
display_namerequiredMiniMessage title shown in the inventory and on the item.
slots27Total slots — must be a multiple of 9, max 54. Alternatively use rows: 1–6.
permissionnoneIf set, only players with this permission can open the backpack.
lorenoneList of MiniMessage lore lines added to the item.

Giving backpacks

Add the backpack as a type: backpack entry in your gui.yml — it will appear in /zitems and clicking gives the physical item (with UUID stamped and lore applied):

items:
  - type: backpack
    pack: elitecreatures
    id: adventure_backpack_cosmetic_backpack_1
    name: "<gold><bold>🎒 Adventure Backpack I"
    lore:
      - "<dark_gray>18 slots"
      - "<gray>Hold in offhand → /backpack"

Storage backends

TypeConfig keyNotes
SQLitetype: sqliteDefault. Single file, zero setup. Fine for most servers.
MongoDBtype: mongodbBetter for very large player counts or shared clusters. Requires a mongodb: sub-section with uri, database, and collection.

Gem Sockets

A socketing system where players insert gems into weapons and armor for stat bonuses that wear down over time.

Files: CustomiZe!/__global__/gems.yml  ·  per-pack: CustomiZe!/<pack>/gems.yml

Example — Steve sockets a 🔥 Fire Rune into his sword

A full walkthrough of how a player uses /zsocket from start to finish. The Fire Rune adds +2.5 Attack Damage, so it goes into a weapon.

Gems work in any socketed item — armor, weapons, tools. The stat applies whenever the item is equipped in any slot. A fire rune socketed into armor still gives +2.5 attack damage, but it makes more thematic sense in a sword.
1

Steve has a 🔥 Fire Rune in his inventory

He obtained it from a pack reward or /z give weekly_dot1 fire_rune. Hovering it shows:

🔥 Fire Rune
Tier: Awakened
+2.5 Attack Damage when socketed.
Scorched with ancient flame.
────────────
Max Uses: 100
2

Steve runs /zsocket

🧑
/zsocket

The Gem Socket Station GUI opens. The top half is the socket interface; the bottom half is his personal gem bag showing every gem currently in his inventory.

3

Steve drags his sword into the center target slot

He picks up his sword from his inventory and drops it into slot 4 (the center top slot). An admin had already added 1 socket with /zsocket add 1.

⬡ Gem Socket Station
⚔️
✂️
── Your Gems ──
🔥
📖

The sword has 1 socket — it glows green. Sockets 2–4 are red (locked). The 🔥 Fire Rune appears in the gem bag below because it's in Steve's inventory.

4

Steve clicks the 🔥 Fire Rune in the gem bag

🧑
*clicks the Fire Rune*

The plugin removes the gem from his inventory, inserts it into Socket 1, and immediately applies +2.5 Attack Damage as an attribute modifier on the sword. Chat confirms:

Gem socketed into slot 1!
5

The GUI updates — socket 1 now shows the gem with 100 uses

⬡ Gem Socket Station
⚔️
🔥100
✂️
── Your Gems ──
📖

Hovering Socket 1 shows:

🔥 Fire Rune
Tier: Awakened
+2.5 Attack Damage when socketed.
────────────
⬡ Socketed in Slot 1
Uses remaining: 100
Durability: 100 uses
Click to extract (gem is destroyed)
6

Steve closes the GUI and holds his sword

The sword is returned to his inventory on close. Its lore and Minecraft attribute tooltip now show the bonus:

Iron Sword
────────────
🔥 Fire Rune (100 uses)
────────────
When in Main Hand:
+2.5 Attack Damage (Fire Rune)
+7 Attack Damage (base iron sword)

Every 60 seconds while the sword is held or equipped, the Fire Rune loses 1 use. At 0 uses the gem crumbles, the +2.5 damage is removed, and Steve sees:

⬡ A gem has worn out and crumbled from your item!

Time does not tick while the item is sitting in the Socket Station GUI.

Admin: Use /zsocket add <count> (requires cxp.socket.add) while holding an item to add socket slots to it. Then share the item with players — they use /zsocket to open the GUI and socket their own gems.

Config Reference

socket_char: "◈"
empty_socket_lore: "◈ Empty Socket"
max_sockets: 4

# Default uses for gems that don't set their own. -1 = unlimited.
default_max_uses: -1

gem_decay:
  enabled: true
  interval_seconds: 60   # 1 use consumed per minute of equip time

gems:
  water_rune:
    display_name: "💧 Water Rune"
    type: PAPER
    model_data: 200377
    tier: 2
    stat: armor
    value: 1.5
    max_uses: 100          # -1 for unlimited
    lore:
      - "Tier: Awakened"
      - "+1.5 Armor when socketed."
stat valueEffect
attack_damageFlat attack damage (+1.5 = 1.5 more damage)
armorArmor points (1.0 = one half-armor pip)
armor_toughnessReduces armor penetration
movement_speedSpeed multiplier (0.01 ≈ 1%)
max_healthExtra hearts (2.0 = 1 full heart)
luckVanilla luck attribute

Armor Sets

Equip N matching armor pieces to unlock bonuses — potion effects, console commands, and messages. Bonuses activate and deactivate automatically as pieces are equipped or removed.

File: CustomiZe!/__global__/sets.yml

How Sets Work

Each armor piece registered in armors.yml has a unique key (e.g. dragon_helmet). The sets.yml file groups those keys into sets and defines what happens at each threshold (2 pieces equipped, 3 pieces, 4 pieces, etc.).

Every time a player equips or unequips armor, the plugin:

  1. Counts how many pieces of each set the player has equipped
  2. Compares the new count to the previous count
  3. If the count crossed a threshold upward → applies effects, runs commands, sends activation message
  4. If the count crossed a threshold downward → removes effects, sends deactivation message

Config Keys

KeyTypeRequired?Description
sets.{id}.piecesList<String>RequiredArmor piece keys from armors.yml that form this set. The plugin counts how many of these the player is wearing.
sets.{id}.bonusesSectionOptionalMap of piece-count threshold → bonus config. Key is a number string: "2", "3", or "4".
bonuses.{N}.messageStringOptionalSent to the player when they cross this threshold (up or down). Supports MiniMessage.
bonuses.{N}.potion_effectsList<Map>OptionalPotion effects applied when threshold is crossed upward. Removed when crossed downward.
bonuses.{N}.commandsList<String>OptionalConsole commands run when the threshold is crossed upward. Use {player} for the player name.

Potion Effect Map Keys

KeyTypeDescription
effectStringBukkit PotionEffectType key (e.g. strength, fire_resistance, speed, regeneration, resistance)
durationInt (ticks)Effect duration. Use 999999 for effectively permanent while the set is worn.
amplifierInt0 = Level I, 1 = Level II, 2 = Level III
You can mix potion effects and commands in the same bonus. Effects are applied directly by the plugin; commands are run as console so you can trigger anything — give items, run economy commands, add permissions, etc.
Commands run only when the threshold is crossed upward (gaining pieces). They do NOT automatically undo themselves when pieces are removed — for reversible bonuses, use potion_effects instead, which the plugin removes automatically.

Full Example

sets:
  dragon:
    pieces:
      - dragon_helmet
      - dragon_chestplate
      - dragon_leggings
      - dragon_boots

    bonuses:
      "2":                                         # Wearing 2 out of 4 pieces
        message: "&c&l★ 2-Piece Dragon: &fStrength I active!"
        potion_effects:
          - effect: strength
            duration: 999999                       # Permanent while worn
            amplifier: 0                           # Strength I

      "4":                                         # Full set bonus
        message: "&4&l★ Full Dragon Set! &cFire Resistance + Strength II!"
        potion_effects:
          - effect: fire_resistance
            duration: 999999
            amplifier: 0
          - effect: strength
            duration: 999999
            amplifier: 1                           # Strength II (overrides 2-piece Strength I)
        commands:
          - "broadcast &4{player} &chas assembled the full Dragon Set!"

Custom Crops

Persistent, multi-stage crops with generated or custom models, configurable growth conditions, dynamic hitboxes, stage effects, age-aware loot tables, edible harvest items, and plugin events.

Runtime folder: Crop packs are loaded from plugins/CustomiZer/packs/<pack-id>/. The bundled example is plugins/CustomiZer/packs/customcrops/. A crop is discovered from its model or texture folder; a YAML file by itself does not register a crop.

What the Crop System Does

  1. Scans every folder inside plugins/CustomiZer/packs/ for a Models/ or Textures/ crop layout.
  2. Detects each crop's stages from correctly named model or texture files.
  3. Assigns stable CustomModelData values for the seed and every stage. The assignments are saved and reused after restarts.
  4. Creates a plantable seed item tagged with the crop ID.
  5. Displays the planted crop with a packet-based ItemDisplay and uses an invisible Interaction entity as its clickable hitbox.
  6. Checks growth every 30 seconds, changes the model and hitbox as the age increases, and saves placed crops across restarts.
  7. Rolls an age-aware loot table when the crop is right-clicked or broken.

Crop Lifecycle In Game

The following screenshots show the complete visible lifecycle: planting a seed, growing through the configured models, reaching the final stage, and breaking a mature tomato crop to receive its configured tomato drop.

1. Planting the Seed (Age 0)

Right-click the configured placement.bottom_block with the crop's tagged seed. The seed is consumed in Survival mode and the first crop model appears in the empty block above.

A newly planted custom crop seed showing its age 0 model on farmland

2. Growing Through the Stages

As growth checks succeed, each crop advances one age at a time. Its model and clickable hitbox update to match the new stage. This example field shows several custom crops at different growth stages.

A field of custom crops showing early and intermediate growth stages

3. Final Stage (Ready to Harvest)

When a crop reaches its highest detected age, it uses the final stage model. If ready_effect is configured, particles mark the crop as mature and continue appearing every growth check while it remains ready.

Fully grown custom crops displaying their final models and ready particles

Tomato Drop Example

In this example, the highlighted mature tomato plant matches a loot entry configured with item: "pack:my_farm_pack:tomato" and a final-stage age condition.

Before Breaking

The mature tomato crop is still planted and displaying its final model.

A mature tomato crop highlighted before it is broken

After Breaking

The crop is removed and the configured custom tomato item drops naturally at its location.

The custom tomato item dropped after breaking the mature tomato crop
The dropped tomato is controlled by the matching entry under item_drops:. Its item, amount range, chance, and allowed crop ages all come from that entry.

Creating a Crop Pack

Create one pack folder and choose one of the two supported visual layouts. If a pack contains a Models/ directory, the scanner prefers it and does not scan that pack's Textures/ directory for crops.

Option A: PNG Textures (Automatic Models)

plugins/CustomiZer/packs/my_farm_pack/
├── Textures/
│   └── tomato/
│       ├── tomato_crop_stage0.png
│       ├── tomato_crop_stage1.png
│       └── tomato_crop_stage2.png
└── configs/
    └── tomato.yml

The exact texture pattern is <crop-id>_crop_stage<age>.png. CustomiZer generates:

  • A flat seed item model using the stage 0 texture.
  • A crossed-plane crop model for every detected stage.
  • Resource-pack textures under assets/customizer/textures/crop/<crop-id>_<age>.png.

Option B: Pre-Built JSON Models

plugins/CustomiZer/packs/my_farm_pack/
├── Models/
│   └── tomato/
│       ├── tomato_seed.json
│       ├── tomato_crop_stage_0.json
│       ├── tomato_crop_stage_1.json
│       └── tomato_crop_stage_2.json
├── configs/
│   └── tomato.yml
└── resourcepack/
    └── assets/
        └── my_farm_pack/
            ├── models/
            └── textures/

The exact stage model pattern is <crop-id>_crop_stage_<age>.json. The seed model is <crop-id>_seed.json. Missing seed or stage models fall back to generated models. Model JSON may reference namespaced textures and parent models; place those assets in the pack's normal resourcepack/assets/ structure.

Stage count is file-driven: the highest detected stage number becomes maxAge. For files 0, 1, and 2, the crop has three visual stages and a maximum age of 2. Keep stages continuous from 0. The current loader does not use growth.max_age to create stages.
Each crop reserves 20 CustomModelData slots: one seed plus up to 19 stage models. Therefore the supported stage ages are 0 through 18. Higher detected stages are truncated.

Pack Items for Harvests and Seeds

If loot should drop a textured pack item, define that item in a normal pack item config. The item ID used by the crop must match the ID under items:.

# plugins/CustomiZer/packs/my_farm_pack/configs/farm_items.yml
info:
  namespace: my_farm_pack

items:
  tomato:
    display_name: "Tomato"
    resource:
      generate: false
      material: APPLE
      model_path: custom/items/tomato

  tomato_seed:
    display_name: "Tomato Seed"
    resource:
      generate: false
      material: WHEAT_SEEDS
      model_path: custom/items/tomato_seed
Use item: "pack:my_farm_pack:tomato" in crop loot. The full pack:<pack-id>:<item-id> prefix is required. For a plantable seed, use item: "crop_seed"; this creates the correctly tagged seed for the current crop.

Complete Crop Configuration

# plugins/CustomiZer/packs/my_farm_pack/configs/tomato.yml
seed:
  id: tomato_seed                    # Logical seed ID; default: tomato_seed
  material: WHEAT_SEEDS              # Vanilla base material of the generated seed

growth:
  max_age: 2                         # Informational in the current loader; files determine max age
  avg_seconds_per_stage: 120         # Average target time for each stage
  min_light: 7                       # Growth pauses below this block light level

placement:
  bottom_block: FARMLAND             # Exact Bukkit material that must be clicked

hitbox:
  auto_height_step: 0.1              # Default height = max(0.2, step * (age + 1))

# Optional exact hitboxes override the automatic size for listed ages
hitboxes:
  "0":
    width: 0.75
    height: 0.25
  "2":
    width: 0.9
    height: 0.8

sounds:
  place: minecraft:item.crop.plant   # Successful planting
  break: minecraft:block.crop.break  # Left-click or environmental break
  interact: minecraft:block.crop.hit # Right-click harvest
  grow: minecraft:block.grass.place  # Optional; every successful age increase

loot:
  drop_seed_if_immature: true        # Currently stored but not used by loot rolling
  decrease_age_on_harvest: -1        # -1 removes crop; 0 keeps same age; N subtracts N ages

multipliers:
  bonemeal: 0.3                      # Present in config, but currently not used by interaction code
  max_moisture: 0.2                  # +20% in swamp, jungle, or forest biome names
  rain: 0.1                          # +10% while storming without thunder
  thunderstorm: -0.3                 # -30% while thundering
  snow: -0.5                         # -50% in snow, frozen, or ice biome names

ready_effect:
  particle: HAPPY_VILLAGER           # Bukkit Particle enum name; omit for no ready particles
  count: 6                           # Ambient count; maturity burst uses count * 3

stage_effects:
  "1":
    particle: COMPOSTER               # Bukkit Particle enum name
    particle_count: 4                 # Default: 5
    sound: minecraft:block.grass.place
  "2":
    particle: CRIMSON_SPORE
    particle_count: 10
    sound: minecraft:entity.experience_orb.pickup

item_drops:
  ripe_tomato:
    item: "pack:my_farm_pack:tomato"
    min_amount: 1
    max_amount: 3
    chance: 1.0
    trigger_min_age: 2
    trigger_max_age: -1
    food:
      nutrition: 3
      saturation: 0.5
      can_always_eat: true
      effects:
        - effect: HASTE
          duration: 120
          amplifier: 0
          chance: 0.3

  immature_seed_return:
    item: "crop_seed"
    min_amount: 1
    max_amount: 1
    chance: 1.0
    trigger_min_age: 0
    trigger_max_age: 1

Configuration Reference

PathDefaultExact behavior
seed.id<crop-id>_seedLogical seed ID used to match this crop with pack item browsing.
seed.materialWHEAT_SEEDSVanilla material used by the generated plantable seed. Invalid names fall back to wheat seeds.
growth.max_ageDetected valueWritten into generated configs, but runtime maximum age is currently detected from the highest stage file.
growth.avg_seconds_per_stage240Controls the probability of advancing one age during each 30-second growth check.
growth.min_light9No growth roll occurs when the crop location's light level is lower.
placement.bottom_blockFARMLANDThe exact block material that must be right-clicked with the tagged seed. The block above must be air.
hitbox.auto_height_step0.1Creates width 0.75 and height max(0.2, step × (age + 1)) unless an age override exists.
hitboxes.<age>.width/heightAutomaticOverrides both dimensions of the invisible clickable Interaction entity at that exact age.
sounds.placeCrop plantPlayed after successful placement.
sounds.breakCrop breakPlayed when the crop is broken or removed by an environmental break.
sounds.interactCrop hitPlayed after a successful right-click harvest.
sounds.growNoneOptional sound played on every successful age change, in addition to a matching stage effect sound.
loot.decrease_age_on_harvest-1-1 removes the crop. 0 leaves it mature. A positive value subtracts that many ages, never below 0.
loot.drop_seed_if_immaturetrueLoaded by the crop definition, but the current loot manager does not act on it. Configure an explicit age-limited crop_seed drop instead.
ready_effectNoneAt maturity it produces a triple-count burst, then the normal count every 30 seconds while mature.
stage_effects.<age>NoneParticle and/or sound fired once whenever normal scheduled growth enters that age.

Exact Growth Calculation

Growth is checked once every 600 ticks (30 seconds). A crop can advance by at most one age per check. Crops already at maximum age are skipped.

base chance = 30 / avg_seconds_per_stage
final chance = base chance + (base chance × each active multiplier)
final chance is clamped between 0.0 and 1.0

Example: with avg_seconds_per_stage: 120, the base roll is 30 / 120 = 0.25, or 25% every 30 seconds. During ordinary rain with rain: 0.1, it becomes 0.25 + 0.025 = 0.275, or 27.5%.

  • rain applies when the world has a storm and is not thundering.
  • thunderstorm applies instead of rain while the world is thundering.
  • max_moisture currently checks whether the biome name contains swamp, jungle, or forest; it does not inspect farmland moisture.
  • snow applies when the biome name contains snow, frozen, or ice.
  • bonemeal is not currently read by planting or interaction code, so bone meal does not force or accelerate a crop.
Growth is probabilistic. avg_seconds_per_stage is a target average, not a guaranteed timer. A configured value of 30 or less produces a 100% base chance each check after clamping.

Planting, Harvesting, and Breaking

Player actionResult
Right-click the configured bottom block with a tagged crop seedPlants age 0 if the block above is air. One seed is consumed unless the player is in Creative mode.
Right-click the crop hitboxRolls matching loot, fires the harvest event, drops approved items, plays the interact sound, then removes or reduces the crop according to decrease_age_on_harvest.
Left-click the cropRolls matching loot, fires the break event, plays the break sound, and always removes the crop.
Break or trample the supporting blockBreaks the crop and rolls its current-age loot.
Water or lava flows into the crop locationThe fluid is allowed to flow; the crop is broken and its current-age loot is rolled.
Right-click harvesting is not restricted to mature crops. The crop's current age is passed to every loot entry. Use trigger_min_age and trigger_max_age to control exactly what can drop at each age.

When WorldGuard integration is available, planting is denied where the player cannot build. Crop place, grow, harvest, break, and remove lifecycle events are also exposed to other plugins; cancellable events can stop the corresponding action, and the grow event can change the target age.

Drop Table Reference

Every child under item_drops: is an independent roll. Multiple entries can match and drop together.

FieldDefaultExact behavior
itemRequiredItem reference to build. Invalid or unresolved references are skipped and logged.
min_amount1Inclusive minimum. Negative values are clamped to 0.
max_amount1Inclusive maximum. It is raised to at least min_amount.
chance1.0Independent probability from 0.0 to 1.0, clamped to that range.
trigger_min_age-1Minimum matching age. -1 means no lower limit.
trigger_max_age-1Maximum matching age. -1 means no upper limit.

Supported Item References

FormatExampleResult
Current crop seedcrop_seedBuilds this crop's plantable, PDC-tagged seed with its assigned seed model.
Vanilla materialWHEATCreates a normal Bukkit material item.
CustomiZer gameplay itemcustomizer:blood_ingotLoads an item by key from the CustomiZer custom item handler.
Pack itempack:my_farm_pack:tomatoBuilds the item ID from the named pack through the pack manager.

Recommended Mature and Immature Drops

item_drops:
  mature_produce:
    item: "pack:my_farm_pack:tomato"
    min_amount: 1
    max_amount: 3
    chance: 1.0
    trigger_min_age: 2
    trigger_max_age: -1

  mature_seed:
    item: "crop_seed"
    min_amount: 1
    max_amount: 2
    chance: 0.7
    trigger_min_age: 2
    trigger_max_age: -1

  immature_seed:
    item: "crop_seed"
    min_amount: 1
    max_amount: 1
    chance: 1.0
    trigger_min_age: 0
    trigger_max_age: 1

Edible Crop Drops

Add food: to any loot entry to apply a Paper food component to that generated drop.

FieldDefaultBehavior
nutrition2Food points restored by the item.
saturation0.2Saturation value assigned to the food component.
can_always_eatfalseAllows eating while full. It also becomes true globally when crops.can_always_eat: true is set in config.yml.
effects[].effectRequired per effectBukkit potion effect name such as SPEED, HASTE, or REGENERATION.
effects[].duration100Duration in ticks. 20 ticks = 1 second.
effects[].amplifier0Zero-based level: 0 = level I, 1 = level II.
effects[].chance1.0Independent chance checked when the tagged food is consumed.
# plugins/CustomiZer/config.yml
crops:
  can_always_eat: false
Food effects are linked to the loot entry's YAML key. Keep loot entry IDs unique across crops when they use different eat effects, because the consume listener searches definitions by entry ID.

Persistence and Reloading

  • Placed crop type, location, current age, timestamps, and planter UUID are persisted.
  • Crop visuals and hitboxes are recreated after restart and when their chunk loads.
  • CustomModelData allocations are stored in a registry so adding crops does not renumber existing crops.
  • /zcrop reload rescans crop definitions and refreshes displays. Rebuild or resend the resource pack when adding or changing textures/models.

Crop Commands

CommandPermissionPurpose
/zcrop reloadcustomizer.crops.adminRescan crop packs and reload definitions.
/zcrop give <player> <cropId>customizer.crops.admin or customizer.crops.giveGive the correctly tagged plantable seed.
/zcrop listcustomizer.crops.adminList registered crop IDs, pack IDs, and maximum ages.
/zcrop infocustomizer.crops.adminShow the ID, age, pack, and location of the targeted crop within 5 blocks.
/zcrop setage <age>customizer.crops.adminSet the targeted crop's age, clamped between 0 and its maximum age.
/zcrop removecustomizer.crops.adminRemove the targeted crop without rolling loot.
/zcrop purge [radius]customizer.crops.adminRemove saved crops in a radius; default 10, clamped from 1 to 200.
/zcrop cleanentities [radius]customizer.crops.adminRemove orphaned crop Interaction/ItemDisplay entities; default 20, clamped from 1 to 200.

Creation Checklist

  1. Choose a lowercase crop ID such as tomato.
  2. Create either continuous PNG stages in Textures/tomato/ or JSON stages in Models/tomato/.
  3. Create configs/tomato.yml. If omitted, CustomiZer generates a basic config after detecting the visual files.
  4. Define harvest and seed pack items if you want custom inventory textures.
  5. Use explicit age ranges for every mature and immature drop.
  6. Run /zcrop reload, then /zcrop list to confirm registration.
  7. Use /zcrop give <player> tomato, plant it, and test stages with /zcrop setage <age>.
  8. Rebuild/distribute the resource pack whenever visual assets change.

GUI System

CustomiZer has two in-game menus. They look similar but show completely different things. Read this page first — it will save you hours of confusion.

The One-Sentence Explanation

/z gui = a display browser — players browse raw pack visuals (custom textures, models) from packs/<packId>/gui.yml. Clicking gives the raw item (just the texture, no special mechanics).
/zitems = an admin give tool — admins browse and left-click to give fully functional items (swords with stats, pickaxes, seeds, armor, etc.) from items/<packId>/gui.yml.

Each menu reads from its own separate file. /z gui reads packs/<packId>/gui.yml; /zitems reads items/<packId>/gui.yml.

The Most Important Thing to Understand

/z gui and /zitems now read from two separate files per pack:

packs/<packId>/gui.yml    ← raw visual items shown in /z gui (type: pack_item, raw)
items/<packId>/gui.yml   ← functional items shown in /zitems (type: sword, pickaxe, armor, etc.)

The slot: at the top of each pack's yml controls where the category icon appears in the menu. There is no longer a pack_overrides section for slot assignments.

The item's type: field determines what kind of item it is:

type valueFile it belongs inShows in /z gui?Shows in /zitems?Can be given on click?
pack_itempacks/<packId>/gui.yml✅ Yes❌ No❌ No (browse only, raw texture)
rawpacks/<packId>/gui.yml✅ Yes❌ No❌ No
sworditems/<packId>/gui.yml❌ No✅ Yes✅ Yes
pickaxeitems/<packId>/gui.yml❌ No✅ Yes✅ Yes
harvesteritems/<packId>/gui.yml❌ No✅ Yes✅ Yes
armoritems/<packId>/gui.yml❌ No✅ Yes✅ Yes
blockitems/<packId>/gui.yml❌ No✅ Yes✅ Yes
cosmeticitems/<packId>/gui.yml❌ No✅ Yes✅ Yes
staffitems/<packId>/gui.yml❌ No✅ Yes✅ Yes

Side-by-Side Comparison

🏪 /z gui📦 /zitems
Who uses it?All players — browse what's on the serverAdmins — give functional items to themselves
What does it show?Raw pack visuals — pack_item / raw type entries. Clicking gives the raw item (texture only).Functional items — swords, pickaxes, seeds, armor, blocks, etc. Clicking gives a fully configured item.
Config that drives itpacks/<packId>/gui.ymlitems/<packId>/gui.yml
Category slot configslot: field in packs/<packId>/gui.ymlslot: field in items/<packId>/gui.yml
Nav buttons configplugins/CustomiZer/gui/main_menu.ymlplugins/CustomiZer/gui/items_shop.yml
Browse All Items buttonOpens paginated browser of all raw items — configured in gui/all_items.ymlN/A
Give on click?❌ No (raw item only)✅ Yes (admin only)

Inventory Slot Reference

Both GUIs use standard Minecraft slot numbering — left to right, top to bottom, starting at 0. A 6-row inventory has 54 slots (0–53):

Row 1:  [ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8]
Row 2:  [ 9][10][11][12][13][14][15][16][17]
Row 3:  [18][19][20][21][22][23][24][25][26]
Row 4:  [27][28][29][30][31][32][33][34][35]
Row 5:  [36][37][38][39][40][41][42][43][44]
Row 6:  [45][46][47][48][49][50][51][52][53]  ← nav buttons row
Slots 0–8 (top row) and 45–53 (bottom row) are used for the border/navigation. Place your pack category icons in rows 2–5 (slots 9–44) to avoid overlapping nav buttons.

/z gui — Pack Browser

The player-facing menu. Shows raw resource pack items (custom textures and models) so players can see what's available on the server. Browse only — no items are given.

How It Works

When a player runs /z gui, they see one icon per registered pack. Clicking a pack icon opens a second page listing all items of type pack_item or raw from that pack's packs/<packId>/gui.yml. A "Browse All Items" button also lets players see all raw items from all packs on one paginated page.

Common confusion: The pack category icons in /z gui do NOT come from packs/*/configs/. They come from packs/<packId>/gui.yml — a dedicated display browser file separate from the /zitems file. The resource pack's packs/ folder holds textures and item definitions; the GUI display file lives at the plugin root level under packs/<packId>/gui.yml.

Config 1 — Shell layout: plugins/CustomiZer/gui/main_menu.yml

Controls the outer frame of the /z gui category browser: title, size, background filler, border, and the "Browse All Items" button. The Prev/Back/Next navigation buttons when browsing items inside a pack are also configured here.

# plugins/CustomiZer/gui/main_menu.yml

categories:
  title: "<white><shift:-8><font_image:CustomiZerInternal:1>"
  size: 6
  background:
    enabled: true
    material: PAPER
    model_data: 29999
    name: " "
  border:
    enabled: true
    material: PAPER
    model_data: 29999
    name: " "

pack_gui:
  prev_button:
    slot: 47
    material: PAPER
    model_data: 29999
    name: "&c◀ Previous"
  back_button:
    slot: 49
    material: PAPER
    model_data: 29999
    name: "&c✖ Back"
  next_button:
    slot: 51
    material: PAPER
    model_data: 29999
    name: "&aNext ▶"
  page_info:
    enabled: true
    slot: 48
    material: PAPER
    model_data: 29999
    name: "&7Page &f%page% &7/ &f%total%"

The "Browse All Items" button (new) opens a paginated browser showing ALL raw items from ALL packs. It is configured in plugins/CustomiZer/gui/all_items.yml.

Config 2 — Pack display items: packs/<packId>/gui.yml

This is the file you create to make a pack appear in /z gui. It contains the raw visual items (type: pack_item or type: raw) displayed in the browser. The plugin automatically scans for these files. No other registration needed.

For /zitems, create a separate file at items/<packId>/gui.yml with functional item types (sword, pickaxe, armor, etc.).

Changing a pack's slot in /z gui

Edit the slot: at the top of the pack's packs/<packId>/gui.yml. That number controls where the pack's icon sits in the /z gui category grid. If no packs/ file exists for a pack, the slot is read from items/<packId>/gui.yml instead.

# packs/my_gem_pack/gui.yml  ← display browser for /z gui

name: "<gradient:#ffd700:#ff9a3c><bold>Gem Pack</bold></gradient>"
slot: 11    # ← Change this to move the icon in /z gui

icon:
  pack: my_gem_pack   # pack namespace
  id: ruby            # item id used as the icon

gui:
  size: 6

# Only pack_item / raw types appear in /z gui
items:
  - type: pack_item
    pack: my_gem_pack
    id: ruby
    name: "&cRuby"
    lore:
      - "&7A precious red gem"

  - type: pack_item
    pack: my_gem_pack
    id: emerald_gem
    name: "&aEmerald Gem"
    lore:
      - "&7A brilliant green gem"
Slot map for category icons — best slots for pack icons in the 6-row grid:
Row 2: 11 12 13 14 15  |  Row 3: 20 21 22 23 24  |  Row 4: 29 30 31 32 33  |  Row 5: 38 39 40 41 42
Avoid rows 1 and 6 (border/nav area).

Adding a Pack to /z gui (summary)

  1. Create packs/my_pack/gui.yml with a free slot: and pack_item entries
  2. Run /zpack reloadpacks in-game

That's it. No other file needs to be touched for the pack to appear in /z gui.

/zitems — Functional Items Browser

The admin tool for browsing and giving functional items — swords with levelling, pickaxes, cosmetics, harvesters, and more. Left-click any item to receive it instantly.

CustomiZer /zitems main GUI

The /zitems main menu — each icon is a registered pack. Click a pack to browse its functional items.

Key point: /zitems and /z gui now read from separate files. /zitems reads items/<packId>/gui.yml and only shows functional item types (sword, pickaxe, armor, etc.). /z gui reads packs/<packId>/gui.yml and shows raw visuals (pack_item, raw). If you see an item in /z gui but not /zitems, you need to add it to items/<packId>/gui.yml with a functional type.

Config 1 — Nav buttons: plugins/CustomiZer/gui/items_shop.yml

This file controls the Prev / Back / Next navigation buttons and page info shown when browsing items inside a category. It does not control which packs appear as categories — that comes from each pack's items/<packId>/gui.yml.

# plugins/CustomiZer/gui/items_shop.yml

pack_gui:
  prev_button:
    slot: 47
    material: PAPER
    model_data: 29999
    name: "&c◀ Previous"
  back_button:
    slot: 49
    material: PAPER
    model_data: 29999
    name: "&c✖ Back"
  next_button:
    slot: 51
    material: PAPER
    model_data: 29999
    name: "&aNext ▶"
  page_info:
    enabled: true
    slot: 48
    material: PAPER
    model_data: 29999
    name: "&7Page &f%page% &7/ &f%total%"

Config 2 — Pack functional items: items/<packId>/gui.yml

This is the file that registers functional items in /zitems. It is a separate file from the packs/<packId>/gui.yml used by /z gui. You need both files if you want a pack to appear in both menus.

Changing a category's slot in /zitems

Edit slot: at the top of items/<packId>/gui.yml. This controls the pack icon position in /zitems. The equivalent packs/<packId>/gui.yml controls the slot in /z gui independently.

Controlling item placement inside a category

Each item entry in items/<packId>/gui.yml supports an optional slot: field that pins it to a specific position:

# items/my_pack/gui.yml  ← functional items for /zitems

name: "<gradient:#5cc8ff:#7ee787><bold>My Pack</bold></gradient>"
slot: 11
icon:
  pack: my_pack
  id: silver_sword
gui:
  size: 6

items:
  # Functional items → appear in /zitems (clicking gives the fully configured item)
  - type: sword
    id: silver_sword
    slot: 11          # ← pin to exact slot inside the /zitems category page
    name: "&7⚔ Silver Sword"
    lore:
      - "&7A levelling sword"
      - "&aLeft-click to receive"

  - type: pickaxe
    id: silver_pickaxe
    slot: 12          # ← pin to slot 12
    name: "&7⛏ Silver Pickaxe"
    lore:
      - "&7Radius mining pickaxe"

  - type: harvester
    id: silver_hoe
    # no slot: → placed automatically after the pinned items

For the display browser (/z gui), create a separate packs/my_pack/gui.yml with type: pack_item entries for the same items.

Slot rules inside a category:
• If slot: is set → item is placed at that exact slot
• If no slot: → placed automatically left-to-right after already-pinned items
• If the pack has more items than fit one page → all slot: values are ignored and items paginate sequentially (the last row becomes Prev/Back/Next buttons)

Item Types Reference

typeShows inGives on clickConfigured in
pack_item/z gui onlypacks/<pack>/configs/*.yml
raw/z gui onlypacks/<pack>/configs/*.yml
sword/zitems onlyCustomiZe!/<pack>/swords.yml
pickaxe/zitems onlyCustomiZe!/<pack>/pickaxes.yml
harvester/zitems onlyCustomiZe!/<pack>/harvesterhoes.yml
armor/zitems onlyCustomiZe!/<pack>/armors.yml
block/zitems onlyCustomiZe!/<pack>/blocks.yml
cosmetic/zitems onlyCustomiZe!/<pack>/cosmetics.yml
staff/zitems onlyCustomiZe!/<pack>/staves.yml

Converting ItemsAdder Packs Automatically

If you have ItemsAdder content packs you want to move to CustomiZer, the built-in converter handles it automatically — it creates the gui.yml, copies assets, and classifies items.

  1. Drop the ItemsAdder content folder (must contain configs/ and resourcepack/) into:
    plugins/CustomiZer/converters/itemsadder/input/<packName>/
  2. Run in-game: /zpack convert itemsadder <packName>
  3. Run /zpack zip to rebuild the resource pack
The converter auto-classifies items by name/material: hats, wings, swords, staves, etc. All items appear as pack_item in /z gui. Cosmetics, swords, and staves also get functional yml files so they appear in /zitems.

Pack GUI — gui.yml Reference

Two separate files per pack: one for the /z gui display browser, one for the /zitems admin give tool. Each file controls which slot the pack occupies, what icon it shows, and which items appear inside it.

Where the files live

packs/<packId>/gui.yml    ← display browser for /z gui (type: pack_item, raw)
items/<packId>/gui.yml   ← admin give tool for /zitems (type: sword, pickaxe, armor, etc.)

The plugin automatically detects these files. No other registration is needed — just create the file and reload. The slot: at the top of each file controls where the category icon appears. If only one file exists for a pack, its slot: is used for both menus.

packs/<packId>/gui.yml — display browser (/z gui)

# packs/my_pack/gui.yml  ← raw visual items shown in /z gui

# Display name shown as the pack's label in /z gui.
name: "<gradient:#5cc8ff:#7ee787><bold>My Pack</bold></gradient>"

# Slot in the /z gui category grid.
# Use slots 11–15, 20–24, 29–33, or 38–42 for best results.
slot: 11

# The icon shown for this pack in the /z gui category grid.
icon:
  pack: my_pack     # pack namespace
  id: silver_ore    # item id within that pack

# The title and size of the pack's browsing page.
gui:
  title: "<white><shift:-8><font_image:CustomiZerInternal:1>"
  size: 6   # rows (1–6); last row = nav buttons if size > 1

# Only pack_item / raw types belong here
items:

  # Raw visual item — shows in /z gui (clicking gives the raw item)
  - type: pack_item
    pack: my_pack
    id: silver_ore
    name: "&7Silver Ore"
    lore:
      - "&7A raw ore texture"
    # slot: 0    ← optional: pin to exact position

items/<packId>/gui.yml — admin give tool (/zitems)

# items/my_pack/gui.yml  ← functional items shown in /zitems

name: "<gradient:#5cc8ff:#7ee787><bold>My Pack</bold></gradient>"
slot: 11

icon:
  pack: my_pack
  id: silver_ore

gui:
  size: 6

# Functional item types belong here
items:

  # Functional sword — shows in /zitems
  - type: sword
    id: silver_sword
    slot: 11      # optional: pin to slot 11 in the /zitems category page
    name: "&7⚔ Silver Sword"
    lore:
      - "&7A levelling sword"
      - "&aLeft-click to receive"

  # Functional pickaxe — shows in /zitems
  - type: pickaxe
    id: silver_pickaxe
    slot: 12
    name: "&7⛏ Silver Pickaxe"

  # Functional harvester hoe — shows in /zitems
  - type: harvester
    id: silver_hoe
    name: "&7🌾 Silver Hoe"

  # Functional cosmetic hat — shows in /zitems
  - type: cosmetic
    id: silver_crown
    name: "&7👑 Silver Crown"

Common Mistakes & Fixes

ProblemCauseFix
Pack doesn't appear in either GUINo packs/<packId>/gui.yml or items/<packId>/gui.yml, or plugin not reloadedCreate the appropriate file(s); run /zpack reloadpacks
Pack icon is in the wrong slotslot: at top of the gui.yml conflicts with another packChange slot: to a free number (11–42 range)
Item appears in /z gui but not /zitemsItem type is pack_item or raw, or it's not in items/<packId>/gui.ymlAdd it to items/<packId>/gui.yml with a functional type (sword, cosmetic, etc.)
Item appears in /zitems but not /z guiNo pack_item entry in packs/<packId>/gui.ymlAdd a pack_item entry in packs/<packId>/gui.yml for the same item id
Item slot: is ignored / items overlapPack has more items than fit one page → pagination overrides slot: valuesReduce item count to fit one page, or remove slot: and let items paginate automatically
Functional sword shows but does nothingid: in gui.yml doesn't match the key in swords.ymlMake sure both files use the exact same id string

Mastery System

Persistent XP tracks that reward players for mining, combat, farming, and exploration with milestone rewards.

File: plugins/CustomiZer/mastery.yml

What Is Mastery?

Mastery tracks give players a long-term progression goal separate from levelling. Breaking ore gives Mining Mastery XP. Killing mobs gives Combat Mastery XP. Reaching milestones (level 10, 25, 50, 100) triggers reward commands and messages.

max_level: 100     # Maximum mastery level for all tracks

tracks:
  mining:
    display: "⛏ Mining Mastery"

    # XP earned per block broken
    xp_per_block:
      COAL_ORE: 3
      IRON_ORE: 5
      GOLD_ORE: 7
      DIAMOND_ORE: 15
      ANCIENT_DEBRIS: 40
      DEEPSLATE_COAL_ORE: 4
      my_pack:ruby_ore: 12       # Custom pack blocks use namespace:key

    xp_per_level: 1000           # XP needed per level (same for all levels)

    milestones:
      10:
        message: "⛏ Mining Mastery 10 reached!"
        commands:
          - "give {player} diamond 5"
      25:
        message: "⛏ Mining Mastery 25! You're a real miner."
      50:
        message: "⛏ Mining Mastery 50!"
        commands:
          - "cxp give {player} item prestige_token 1"
      100:
        message: "⛏ MINING MASTER! Maximum level achieved!"
        commands:
          - "cxp give {player} item elite_pickaxe 1"

  combat:
    display: "⚔ Combat Mastery"
    xp_per_kill:
      ZOMBIE: 3
      SKELETON: 4
      SPIDER: 3
      CREEPER: 6
      ENDER_DRAGON: 200
      WITHER: 100
    xp_per_level: 1500

  farming:
    display: "🌿 Farming Mastery"
    xp_per_harvest:
      WHEAT: 2
      CARROTS: 2
      POTATOES: 2
      PUMPKIN: 5
    xp_per_level: 800

Commands

CommandDescription
/zmasteryView your own mastery levels
/zmastery <player>View another player's mastery

Missions

Daily and weekly objectives that reset on a schedule and reward players with money and items.

File: plugins/CustomiZer/missions.yml
daily_reset_hour: 0       # Hour of day to reset daily missions (0 = midnight)
weekly_reset_day: MONDAY  # Day of week to reset weekly missions

daily:
  mine_iron:
    display: "⛏ Iron Miner"
    description: "Mine 30 Iron Ore"
    objective: MINE_BLOCK   # Objective type (see table below)
    target: IRON_ORE        # What to mine/kill/harvest
    amount: 30              # How many needed to complete
    rewards:
      money: 200
      commands:
        - "cxp give {player} item mission_token 2"
      message: "Daily Complete: Iron Miner! +$200"

  kill_zombies:
    display: "⚔ Zombie Slayer"
    description: "Kill 25 Zombies"
    objective: KILL_MOB
    target: ZOMBIE
    amount: 25
    rewards:
      money: 150

weekly:
  nether_run:
    display: "🔥 Nether Runner"
    description: "Mine 5 Ancient Debris this week"
    objective: MINE_BLOCK
    target: ANCIENT_DEBRIS
    amount: 5
    rewards:
      money: 2000
      commands:
        - "cxp give {player} item mission_token 10"

Objective Types

Objectivetarget examplesNotes
MINE_BLOCKIRON_ORE, COAL_OREAny vanilla block material
MINE_CUSTOM_BLOCKmy_pack:ruby_oreA custom pack block
MINE_BLOCK_WITH_TOOLSTONEAlso add tool: pickaxe_key
KILL_MOBZOMBIE, ENDER_DRAGON, ANY_HOSTILEEntityType or ANY_HOSTILE
HARVEST_CROPWHEAT, ANY_CROPMaterial or ANY_CROP
EAT_ITEMitem key from items.ymlCustomiZer food item
USE_ITEMitem key from items.ymlCustomiZer usable item

Prestige

Max out your mastery tracks to prestige — earning permanent reward multiplier bonuses that stack.

File: plugins/CustomiZer/prestige.yml
max_prestige: 10

# Which mastery tracks must be at max level to prestige
mastery_tracks_required:
  - mining
  - combat

mastery_level_required: 100    # All listed tracks must reach this level

levels:
  1:
    display: "✦ Prestige I"
    permanent_bonus_percent: 2    # +2% to all XP and rewards, permanently
    rewards:
      money: 5000
      commands:
        - "cxp give {player} item prestige_token 2"
      message: "★ Prestige I achieved! +2% permanent bonus!"

  2:
    display: "✦ Prestige II"
    permanent_bonus_percent: 4
    rewards:
      money: 8000

  10:
    display: "✦ ASCENDANT"
    permanent_bonus_percent: 20
    rewards:
      money: 100000
      commands:
        - "cxp give {player} sword celestial_blade"

Reforge

Re-roll stat modifiers on weapons and armor using reforge stones.

File: plugins/CustomiZer/reforge.yml
reforge_cost_item: "reforge_stone"    # CustomiZer item key consumed each reforge
reforge_cost_amount: 3               # How many stones consumed
reforge_cost_money: 250.0            # Money cost (in addition to items)
use_money_cost: true

modifiers:
  savage:
    display: "Savage"
    stats:
      GENERIC_ATTACK_DAMAGE: 2.0
      GENERIC_ATTACK_SPEED: 0.1
    lore_line: "✦ Savage: +2 ATK, +0.1 SPD"
    weight: 20       # Higher weight = more commonly rolled

  ancient:
    display: "Ancient"
    stats:
      GENERIC_MAX_HEALTH: 4.0
      GENERIC_ARMOR: 1.0
    lore_line: "✦ Ancient: +4 HP, +1 Armor"
    weight: 15

  celestial:
    display: "Celestial"
    stats:
      GENERIC_ATTACK_DAMAGE: 4.0
      GENERIC_MAX_HEALTH: 6.0
      GENERIC_ARMOR: 2.0
    weight: 2         # Rare modifier

  void:
    display: "Void"
    stats:
      GENERIC_ATTACK_DAMAGE: 6.0
      GENERIC_ATTACK_SPEED: 0.3
    weight: 1         # Very rare modifier

Repair

Restore custom durability on swords and tools with rank-based discounts and cooldowns.

File: plugins/CustomiZer/repair.yml
repair-rate-per-10%: 1000          # Base cost (money) to restore 10% durability

# Cost per 10% durability for swords, per rarity tier
swords-repair-rate-per-10%:
  common: 1000
  rare:   2000
  epic:   3000
  legendary: 4000
  mythic: 5000

# Different cooldowns and discounts per player rank
# Rank is determined by LuckPerms group name
general-cooldown-per-rank:
  Default:
    Cooldown: 10000    # Milliseconds between repairs (10000 = 10 seconds)
    Discount: 0        # Percent discount on cost
  VIP:
    Cooldown: 5000
    Discount: 10
  MVP:
    Cooldown: 3000
    Discount: 15
  ELITE:
    Cooldown: 2000
    Discount: 20

messages:
  no-money: "&cNot enough money."
  repaired-successfully: "&aRepaired {count} items for &6${cost}&a."
  no-items-to-repair: "&eNo items need repairs."
  cooldown-message: "&cWait {time} seconds before repairing again."

This page has moved. Click here for the Levelling System page.

The Levelling System

CustomiZer supports kill-based levelling for swords and axes, and block-based levelling for pickaxes. Both are optional add-ons to normal weapons and tools.

This entire system is optional. You can create swords, axes, and pickaxes without any levelling — they work fine as plain custom items. Only add levelling if you want players to upgrade their tools over time.

Overview — Two Types of Levelling

Item TypeWhat Triggers a Level-UpConfig File
Swords & AxesPlayer kills mobs with the weaponswords.yml / axes.yml + rarity.yml
PickaxesPlayer mines blocks with the pickaxepickaxes.yml (self-contained)

Sword & Axe Rarity (Kill-Based)

Swords and axes can have a rarity: block in their config. The plugin tracks kills in item NBT data. When the kill count hits the configured threshold, the weapon upgrades to the next tier automatically — no commands needed.

CommonRareEpicLegendaryMythical

What happens when a sword/axe upgrades:

  • The Custom Model Data changes to the next tier's value → Minecraft loads a different texture from the resource pack
  • The item's display name changes to the tier's name
  • A Buff% multiplier is applied to all attributes (so a Legendary sword is stronger than a Common one)
  • The player receives an upgrade notification

Step 1 — Define a texture per tier in your pack

Each rarity tier needs its own pack item entry with a unique model_id pointing to a different texture file:

# packs/my_pack/configs/items.yml
items:
  dragon_blade_common:
    resource:
      generate: true
      material: IRON_SWORD
      model_id: 32001           # CMD for Common tier
      textures: [weapons/dragon_blade_common.png]

  dragon_blade_rare:
    resource:
      generate: true
      material: IRON_SWORD
      model_id: 32002           # CMD for Rare tier — different PNG!
      textures: [weapons/dragon_blade_rare.png]

  dragon_blade_epic:
    resource:
      generate: true
      material: IRON_SWORD
      model_id: 32003
      textures: [weapons/dragon_blade_epic.png]

  dragon_blade_legendary:
    resource:
      generate: true
      material: IRON_SWORD
      model_id: 32004
      textures: [weapons/dragon_blade_legendary.png]

  dragon_blade_mythical:
    resource:
      generate: true
      material: IRON_SWORD
      model_id: 32005
      textures: [weapons/dragon_blade_mythical.png]

Step 2 — Add the rarity block to your sword

Point each rarity tier to the correct CMD:

# CustomiZe!/__global__/swords.yml
swords:
  dragon_blade:
    type: IRON_SWORD
    display_name: "&4Dragon Blade"
    durability: 5000
    attributes:
      GENERIC_ATTACK_DAMAGE: 10.0

    lore:
      - "&8Rarity: %rarity%"
      - "&8Kills: %progress% / %required%"

    # The rarity block — remove this entirely if you don't want levelling
    rarity:
      common:
        custom_model_data: 32001    # Matches dragon_blade_common model_id
        name: "&7Common Dragon Blade"
      rare:
        custom_model_data: 32002
        name: "&9Rare Dragon Blade"
      epic:
        custom_model_data: 32003
        name: "&5Epic Dragon Blade"
      legendary:
        custom_model_data: 32004
        name: "&6Legendary Dragon Blade"
      mythical:
        custom_model_data: 32005
        name: "&dMythical Dragon Blade"

Step 3 — Configure rarity.yml

plugins/CustomiZer/rarity.yml is the global rarity chain. Every sword and axe on the server shares this file — it defines the tier names, kill thresholds, and stat buffs. Your per-sword rarity: block in swords.yml only controls the CMD (texture) and display name per tier; the actual upgrade logic lives here.

rarity.yml — All Config Keys

KeyTypeRequired?Description
NameStringRequiredDisplay name for this rarity tier. Supports & color codes (e.g. &6Legendary). Shown via the %rarity% lore placeholder.
BuffIntRequiredPercentage stat multiplier applied to all sword attributes when the item reaches this tier. Formula: final_value = configured_value × (1 + Buff ÷ 100). Set to 0 for no buff.
EvolutionKillsRequiredIntRequiredNumber of kills needed at this tier to advance to the next one. The counter resets to 0 after each upgrade — it is per-tier, not cumulative. Set to 0 on your final tier (though NextRarity: null already stops upgrades).
NextRarityString or nullRequiredThe rarity ID to upgrade to when the kill count is met. Must match the YAML key of another entry in rarities:. Set to null (no quotes) to mark this as the final tier — no further upgrades will occur.
Model_data is also parsed from this file but is not used for texture changes. Textures are controlled by custom_model_data inside the sword's own rarity: block in swords.yml. You can safely ignore Model_data in rarity.yml.

How the Buff Works Exactly

When a sword upgrades to a new tier, the plugin reads all attribute values from the sword's attributes: config block and reapplies them with the tier's Buff multiplier:

# Sword config:
attributes:
  GENERIC_ATTACK_DAMAGE: 10.0
  GENERIC_ATTACK_SPEED: 1.6

# At Rare (Buff: 10):
#   attack_damage = 10.0 × (1 + 10/100) = 11.0
#   attack_speed  = 1.6  × (1 + 10/100) = 1.76

# At Epic (Buff: 20):
#   attack_damage = 10.0 × (1 + 20/100) = 12.0
#   attack_speed  = 1.6  × (1 + 20/100) = 1.92

# At Legendary (Buff: 30):
#   attack_damage = 10.0 × 1.30 = 13.0

# At Mythic (Buff: 40):
#   attack_damage = 10.0 × 1.40 = 14.0
The Buff always applies to the original configured value, not compounded. A Buff of 40 always means +40% of the base stat — it does not stack multiplicatively across tiers.

How the Kill Counter Works

  • The counter tracks kills per tier. After an upgrade it resets to 0.
  • A separate total kills counter tracks all-time kills with the weapon and is never reset — this is what %total_kills% shows in lore.
  • At the final tier (NextRarity: null), the evolution counter is frozen. Total kills continue to increment.
  • The upgrade fires the instant a kill pushes the counter to or past EvolutionKillsRequired.

You Can Create Completely Custom Tier Chains

The rarity system is not limited to the five default tiers. You can create any number of tiers with any names. The YAML key is the tier's internal ID — it must match what you write in NextRarity and in your sword's rarity: block.

Example — 3-tier custom chain

# rarity.yml — a totally custom 3-tier chain
rarities:
  bronze:
    Name: "&6Bronze"
    Buff: 0
    EvolutionKillsRequired: 25
    NextRarity: "silver"

  silver:
    Name: "&fSilver"
    Buff: 15
    EvolutionKillsRequired: 75
    NextRarity: "gold"

  gold:
    Name: "&e&lGold"
    Buff: 35
    EvolutionKillsRequired: 0    # Irrelevant — NextRarity is null
    NextRarity: null              # Max tier

Then in your sword's config, your rarity: block uses those same IDs:

rarity:
  bronze:
    custom_model_data: 50001
    name: "&6Bronze Blade"
  silver:
    custom_model_data: 50002
    name: "&fSilver Blade"
  gold:
    custom_model_data: 50003
    name: "&e&lGolden Blade"

Example — 7-tier progression for a long-term server

rarities:
  novice:
    Name: "&7Novice"
    Buff: 0
    EvolutionKillsRequired: 50
    NextRarity: "apprentice"

  apprentice:
    Name: "&aApprentice"
    Buff: 8
    EvolutionKillsRequired: 150
    NextRarity: "adept"

  adept:
    Name: "&2Adept"
    Buff: 16
    EvolutionKillsRequired: 300
    NextRarity: "expert"

  expert:
    Name: "&bExpert"
    Buff: 25
    EvolutionKillsRequired: 500
    NextRarity: "master"

  master:
    Name: "&9Master"
    Buff: 35
    EvolutionKillsRequired: 750
    NextRarity: "grandmaster"

  grandmaster:
    Name: "&5Grandmaster"
    Buff: 45
    EvolutionKillsRequired: 1000
    NextRarity: "legend"

  legend:
    Name: "&6&lLEGEND"
    Buff: 60
    EvolutionKillsRequired: 0
    NextRarity: null
rarity.yml is global. Every sword and axe on your server shares the same rarity chain. You cannot give different swords different kill thresholds or different numbers of tiers. If you want sword A to upgrade faster than sword B, your only option is to set lower thresholds globally and accept that all weapons share them.

Important — rarity.yml vs swords.yml rarity block

Configured inControls
rarity.ymlTier names (Name), stat buff multipliers (Buff), kill thresholds (EvolutionKillsRequired), upgrade chain (NextRarity). Global for all swords.
swords.ymlrarity: blockWhich texture (CMD) to use per tier, and the display name override per tier. Per-sword.

The tier IDs (e.g. common, rare, bronze) must be identical in both files — the name in rarity.yml's rarities: map must match the name in the sword's rarity: block.

Sword Lore Placeholders (with rarity)

PlaceholderReplaced with
%rarity%Current tier's Name value from rarity.yml (with color codes applied)
%progress%Kills toward the next upgrade (resets after each upgrade)
%required%Kills needed to reach the next tier (EvolutionKillsRequired)
%total_kills%All-time lifetime kills with this specific item (never resets)
%custom_durability%Current durability
%max_custom_durability%Max durability at this rarity tier

Pickaxe Levelling (Block-Based)

Pickaxes use a completely self-contained levelling system defined inside pickaxes.yml — there is no separate rarity.yml involved. Each pickaxe definition contains a levels: map. The plugin counts blocks mined and upgrades when the threshold is met.

What happens when a pickaxe levels up:

  • Custom Model Data changes → new texture
  • Mining radius expands (e.g. 1×1 → 3×3 → 3×7)
  • Haste level can increase per tier
  • Custom durability increases
  • The player is notified
# CustomiZe!/__global__/pickaxes.yml
pickaxes:
  tier_pickaxe:
    type: DIAMOND_PICKAXE
    display_name: "⛏ Tier Pickaxe"
    lore:
      - "Level: %level% / %max_level%"
      - "Blocks mined: %blocks_mined% / %blocks_required%"
      - "Mining area: %radius%×%radius%"
      - "%bonuses%"

    levels:
      1:
        name: "⛏ Tier Pickaxe [Lvl. 1]"
        custom_model_data: 30041        # Texture for level 1
        durability: 2000
        radius: 1                       # Mines 1×1 (just the single block)
        height_radius: 0
        effect_on_hold: haste
        effect_amplifier: 0             # Haste I
        blocks_required: 200            # Mine 200 blocks → level 2
        bonus:
          - "• Haste I while held"

      2:
        name: "⛏ Tier Pickaxe [Lvl. 2]"
        custom_model_data: 30042        # Different texture
        durability: 4000
        radius: 1
        height_radius: 1               # Now mines 1×3 tall
        effect_on_hold: haste
        effect_amplifier: 0
        blocks_required: 500
        bonus:
          - "• Haste I"
          - "• 1×3 column mining"

      3:
        name: "⛏ Tier Pickaxe [Lvl. 3]"
        custom_model_data: 30043
        durability: 7000
        radius: 3                       # 3×3 area!
        height_radius: 1
        effect_on_hold: haste
        effect_amplifier: 1             # Haste II
        blocks_required: 1000
        bonus:
          - "• Haste II"
          - "• 3×3 area mining"

      4:
        name: "⛏ Tier Pickaxe [MAX]"
        custom_model_data: 30044
        durability: 12000
        radius: 3
        height_radius: 3               # 3×7 area
        effect_on_hold: haste
        effect_amplifier: 1
        blocks_required: 0             # 0 = this is the max level
        bonus:
          - "• Haste II"
          - "• 3×7 area mining"
          - "• MAX LEVEL"
Set blocks_required: 0 on the last level entry. The plugin treats 0 as "no further upgrade" — it's the max level indicator.

Pickaxe Lore Placeholders

PlaceholderShows
%level%Current level number
%max_level%Highest defined level
%blocks_mined%Blocks mined with this pickaxe
%blocks_required%Blocks needed for next level (0 at max)
%current_durability%Remaining custom durability
%max_durability%Max durability at current level
%radius%Current mining area side (e.g. 3 = 3×3)
%height_radius%Vertical mining radius
%bonuses%All bonus lines for current level

Ore Generators

Automatically inject custom blocks into world generation — no external world editor needed.

File: plugins/CustomiZer/generators.yml

What This Does

When a chunk is loaded for the first time (or generated fresh), CustomiZer places your custom ores into it — just like how Minecraft naturally generates diamond ore veins. Players mine them just like vanilla ores.

Configuration

worlds_populators:
  # A unique key for this generator entry
  ruby_ore_overworld:
    block: my_pack:ruby_ore      # The block to place ("namespace:key" or "minecraft:stone")
    worlds:
      - world                     # Overworld
      - world_caves               # Cave world if you have one
    replaceable_blocks:           # Only replaces these blocks when placing
      - STONE
      - ANDESITE
      - GRANITE
      - TUFF
    biomes:                       # Empty list = spawn in ALL biomes
      - PLAINS
      - FOREST
      - JUNGLE
      - MOUNTAINS
    chance: 60.0                  # Percent chance of spawning a vein per chunk (0–100)
    amount: 5                     # Number of ore veins per chunk
    min_height: 15                # Minimum Y level to spawn at
    max_height: 55                # Maximum Y level to spawn at

  deepslate_ruby_ore:
    block: my_pack:deepslate_ruby_ore
    worlds:
      - world
    replaceable_blocks:
      - DEEPSLATE
      - COBBLED_DEEPSLATE
    biomes: []                    # Empty = any biome
    chance: 35.0
    amount: 3
    min_height: -60
    max_height: 0                 # Only in deepslate level

Tips

  • Already-generated chunks are NOT retroactively populated. New ore configs only affect chunks generated after the config was applied.
  • To force-populate existing chunks use /zworld generate <world> (admin command).
  • Use a low chance and small amount for rare ores. A chance of 100 with amount 10 would make them very common.
  • The replaceable_blocks list prevents ores from floating in air or water — always include the natural blocks for that layer.

Commands

CommandPermissionDescription
/zworld reloadcxp.adminReload generator config without restarting
/zworld generate <world>cxp.adminForce-populate all loaded chunks in a world

Custom Crafting Tables

Custom workbench blocks or furniture with configurable slot layouts, permissions, and recipe storage. Create and delete tables entirely in-game — no config editing required.

File: plugins/CustomiZer/custom_crafting_tables.yml — or use /zcraft newtable to create tables from a GUI wizard without touching the file.
custom_crafting_tables:
  enabled: true

  storage:
    type: "sqlite"             # "sqlite" (file-based) or "mongodb"
    sqlite:
      file: "custom_crafting_recipes.db"
      table: "custom_crafting_recipes"

  default_table: "basic_workbench"

  tables:
    basic_workbench:
      enabled: true
      display_name: "&aBasic Workbench"

      # Open this GUI when a player right-clicks this custom block
      assigned_block: "my_pack:workbench_block"
      # OR open when a player right-clicks this placed furniture (can use both at once)
      assigned_furniture: "my_pack:workbench_item"

      permission:
        required: false
        node: "customizer.craftingtable.basic_workbench"

      gui:
        title: "&8⚒ Basic Workbench"
        rows: 5
        # Slots where players put input items
        input_slots: [10, 11, 12, 19, 20, 21, 28, 29, 30]
        # Slots where the output appears
        output_slots: [24]

      behavior:
        return_items_on_close: true   # Return inputs if GUI is closed without crafting
        consume_inputs: true          # Remove input items when crafting
        allow_partial_outputs: false

Table management

CommandDescription
/zcraft newtableOpen the in-game wizard to create a new crafting table — set ID, title, rows, triggers, and paint input/output slots. Saves to config and hot-reloads instantly.
/zcraft deletetable <tableId>Delete a table definition from config and hot-reload. Saved recipes for that table are kept in the database.
/zcraft tablesList all currently loaded table definitions.
/zcraft reloadReload table definitions and recipes from disk without restarting.
/zcraft newtable — setup wizard GUI
📚Table ID
🏷️GUI Title
🎵Block
🖼️Furniture
1row
2rows
3rows
4rows ✓
5rows
6rows
🎨Layout →
💎Save ✓

Adding recipes to a table

Each table has its own independent recipe list. Recipes are added per-table using the table's ID — the same ID you set in the wizard or in the config.

The vanilla table is a special reserved table whose recipes fire in the real Minecraft workbench — the one players open by right-clicking any normal crafting table in the world. Add recipes to it with /zcraft create vanilla <name> and they work in every vanilla workbench on the server, with no custom block or furniture required.
Note: basic_workbench is just an example custom table in the default config — it is not the vanilla crafting table. It only opens when a player right-clicks the specific custom block/furniture you assign to it.
  1. Run /zcraft create <tableId> <recipeName> — e.g. /zcraft create my_forge iron_to_steel.
    This opens the recipe designer pre-loaded with that table's exact slot layout.
  2. Place ingredients in the blue input slots in the arrangement you want.
  3. Place the result item in the red output slot.
  4. Optionally toggle Shaped / Shapeless mode or add a permission node using the control buttons in the bottom row.
  5. Close the GUI — the recipe saves automatically and is live immediately. No reload needed.

To edit an existing recipe, run the same /zcraft create <tableId> <recipeName> command again — it loads the current ingredients so you can change them.

Recipe Designer — /zcraft create basic_workbench my_recipe (5-row table)
🌾input
🌾input
input
🌾input
🌾input
input
⚔️output
input
input
input
🔀Shaped
🔑Perm
💾Save
Input slot — place ingredients Output slot — place result Locked — not part of this table

Recipe commands

CommandDescription
/zcraft open [tableId]Open a crafting table GUI by name (no physical block needed).
/zcraft create <tableId> <name>Open the recipe designer for a new or existing recipe on the given table.
/zcraft delete <tableId> <name>Delete a saved recipe by table and recipe name.
/zcraft list [tableId]List all saved recipes, optionally filtered to one table.
/zcraft browse [tableId]Open the recipe browser GUI, optionally filtered to one table.

→ Full documentation: Custom Crafting module page

Commands

Every command available in CustomiZer.

Player Commands

CommandPermissionWhat it does
/z guicxp.guiOpen the main category browser GUI
/zitemscxp.itemsBrowse all packs and their items
/z get <name>cxp.useGive yourself an item by its key
/zrepaircxp.repairRepair custom durability on held items
/zmasterycxp.masteryView your mastery progress
/zmastery <player>cxp.masteryView another player's mastery
/zmissionscxp.missionsOpen your daily/weekly mission board
/zprestigecxp.prestigeOpen the prestige interface
/zreforgecxp.reforgeOpen the reforge GUI
/zsocket infocxp.socketView gem socket info on held item
/zcraftcxp.craftOpen custom crafting
/backpackOpen the backpack held in offhand or worn on chestplate
/zcropCrop-related player commands

Admin Commands

CommandPermissionWhat it does
/z reloadcxp.reloadReload all configs and rebuild the resource pack
/z give <player> <name>cxp.giveGive any player a configured item
/z info <name>cxp.adminShow debug info about an item
/zsocket add <gem>cxp.socket.addAdd a socket to the held item
/zsocket extractcxp.socket.addRemove a socketed gem
/zworld reloadcxp.adminReload generator configuration
/zworld generate <world>cxp.adminForce-populate chunks with new ores
/zcrop reloadcustomizer.crops.adminReload crop definitions
/zcrop give <player> <cropId>customizer.crops.admin or customizer.crops.giveGive a tagged, plantable crop seed item
/zcraft newtablecxp.craft.adminOpen the in-game table creation wizard
/zcraft deletetable <tableId>cxp.craft.adminDelete a table definition from config and hot-reload
/zcraft open [table]cxp.craftOpen a custom crafting table by name
/zcraft create <table> <name>cxp.craft.adminOpen the recipe designer for a new or existing recipe
/zcraft delete <table> <name>cxp.craft.adminDelete a saved recipe
/zcraft list [table]cxp.craft.adminList all saved crafting recipes
/zcraft reloadcxp.craft.adminReload tables and recipes from disk

/zpack Commands (Glyph & Pack Management)

The /zpack command group is the main toolkit for managing the resource pack from in-game. All subcommands require cxp.admin.

CommandWhat it does
/zpack reloadpacksScan all packs and re-register model IDs without rebuilding the ZIP
/zpack zipBuild the resource pack ZIP and push it to all online players
/zpack linkPrint a clickable URL to the hosted Java resource pack
/zpack geyserBuild the Bedrock resource pack + Geyser mappings into geyser_output/ — see Bedrock guide
/zpack bedrock gui <name> …Adjust GUI position for Bedrock (offset from Java position)
/zpack bedrock item <name> …Fine-tune 3D item position/scale/rotation per slot on Bedrock
/zpack bedrock furniturescale …Set furniture size globally or per piece on Bedrock
/zpack fontsList every registered glyph — shows pack, ID, Unicode codepoint, and the <font_image:pack:id> tag to use in gui.yml
/zpack font <pack> <id>Preview a glyph in your action bar so you can check its size and position (player only)
/zpack glyph list [pack]List all glyphs; add a pack name to filter
/zpack glyph <pack> <id>Detailed info about one glyph (codepoint, Unicode, YAML tag)
/zpack glyph search <query>Search glyphs by name — useful when you have dozens of font images
/zpack glyph exportPrint YAML snippets for all glyphs (use to lock codepoints so they don't shift)
/zpack glyph regenerateClear the glyph registry and reassign all codepoints from scratch
/zpack gui [pack]Debug GUI configuration for a pack
/zpack rank [pack]Debug rank / glyph permission configuration
/zpack block <pack> <key>Show block registration info
/zpack item <pack> <key>Show item registration info (CMD, material, texture path)
/zpack armor <pack> <key>Show armor registration info

Permissions

All permission nodes and their defaults.

Permission NodeDefaultDescription
cxp.reloadOP onlyRun /z reload to reload all configs and rebuild the pack
cxp.useEveryoneBasic /z command access
cxp.giveOP onlyGive items to other players via /z give
cxp.guiEveryoneOpen /z gui (main category browser)
cxp.itemsEveryoneOpen /zitems (pack item browser)
cxp.repairEveryoneUse /zrepair to repair custom items
cxp.masteryEveryoneView mastery progress with /zmastery
cxp.missionsEveryoneView mission board with /zmissions
cxp.prestigeEveryoneAccess prestige with /zprestige
cxp.reforgeEveryoneOpen reforge GUI with /zreforge
cxp.socketEveryoneView gem socket info with /zsocket info
cxp.socket.addOP onlyAdd/remove sockets from items
cxp.craftEveryoneUse custom crafting tables
cxp.craft.adminOP onlyManage crafting recipes
cxp.adminOP onlyAdmin commands (/z info, /zpack, /zworld)
customizer.crops.adminOP onlyCrop admin commands
customizer.crops.giveOP onlyGive crop seeds via /zcrop give
customizer.craftingtable.<name>OP onlyAccess a specific crafting table (when permission.required: true)
gem_ranks.<rank_key>Assigned by adminShows the rank glyph for that rank key (e.g. gem_ranks.bronze_amethyst_i)
LuckPerms is the recommended permissions plugin. Give players groups like VIP, MVP, ELITE and the repair cooldown/discount system will pick up the group name automatically.