0. Before You Configure
Minimum requirements are Paper 1.21.11+, Java 21+, CoreToolsX installed on a Paper server, and a permission plugin only if progression locks are enabled.
Default behavior is conservative: progression locks, skin durability, and fire/lava stripping are disabled by default, foreign custom item transformations are blocked when detected, and VISUAL_SKIN mode works without a resource pack.
1. File Layout
plugins/CoreToolsX/
config.yml
tool-upgrades.yml
tool-skins.yml
messages.yml
resource-pack/ # optional addon for REAL_TIER inventory models
plugin.yml is bundled inside the jar and documents commands, aliases, permissions, and plugin identity.
2. Reload vs Restart
Use /coretoolsx reload for normal YAML edits, recipe changes, message edits, lore template changes, progression permission node changes in YAML, and recipe re-registration. Restart when replacing the jar, changing Paper/Minecraft version, or recovering from startup-only errors.
The optional resource-pack addon does not require a server restart after zip changes, but players must reload or reselect the pack client-side.
3. Clean Setup Checklist
- Install the jar and let defaults generate.
- Keep
tool-skin.inventory-model.mode: VISUAL_SKINunless the optional resource-pack addon is installed. - Decide whether to keep
recipes.override-vanilla-equipment-recipes: true. - Configure upgrade and skin permissions only if
progression-locks.enabled: true. - Keep custom item behavior on
BLOCK_IF_DETECTEDunless conversion is intentional. - Test recipes with separate one-item ingredient slots.
4. Runtime Model
CoreToolsX has two item modes. Normal upgraded tools use vanilla material as the source of truth and do not receive CoreToolsX PDC. Skinned netherite tools change material for the visual skin, keep netherite-equivalent tool behavior, and store clean material, skin identity, lore snapshot, model mode, and optional skin durability in PDC.
Already-skinned tools cannot be upgraded or skinned again until stripped. Supported types are sword, pickaxe, axe, shovel, hoe, and spear.
5. config.yml
Controls global debug mode, protected vanilla recipe behavior, recipe book discovery, ingredient groups, default upgrade behavior, generated lore, inventory model mode, skin removal, fire/lava stripping, progression locks, and custom item protection.
# CoreToolsX main configuration.
#
# CoreToolsX is designed as a Paper-only vanilla+ tool progression plugin.
# This file controls global behavior. Recipe definitions live in:
# - tool-upgrades.yml
# - tool-skins.yml
#
# All text shown to players is configured in messages.yml.
settings:
# Enables extra startup/reload diagnostic logs.
# Keep false on production unless you are debugging configuration or recipe behavior.
debug: false
tool-skin:
inventory-model:
# Controls the item model stored on skinned tools.
#
# VISUAL_SKIN:
# - Default and resource-pack-free mode.
# - A netherite tool skinned as iron becomes an IRON_* item with netherite
# tool components, so it looks iron both in inventory and in hand.
#
# REAL_TIER:
# - Requires the CoreToolsX resource-pack addon.
# - The real item Material still becomes the visual skin Material, but
# CoreToolsX sets item_model to coretoolsx:skinned/<material>.
# - The addon model shows netherite in GUI/ground contexts and the visual
# skin model in hand. Without the addon, the item will render as a
# missing/invalid custom model.
mode: VISUAL_SKIN
recipes:
# When true, CoreToolsX blocks protected vanilla direct tool recipe outputs at
# crafting time and uses progression recipes instead. It does not remove
# minecraft:* recipes from the server registry, so reload/disable is safe.
# Wooden tools and vanilla diamond -> netherite smithing are not touched.
override-vanilla-equipment-recipes: true
# Cooldown used by blocked-crafting messages to avoid chat spam.
# Value is in server ticks. 20 ticks = 1 second.
blocked-message-cooldown-ticks: 40
recipe-book:
# Registers static placeholder recipes so players can discover CoreToolsX
# recipes naturally in the vanilla recipe book.
enabled: true
ingredient-groups:
# Ingredient groups let upgrade/skin definitions reference a named set instead
# of a single Bukkit Material. Runtime matching is MATERIAL_ONLY, so any item
# whose Material is listed here can satisfy that ingredient cost.
#
# The static recipe-book entry still uses the first valid material as the
# representative ingredient; the runtime matcher accepts the whole group.
WOOD_TOOL_MATERIALS:
- OAK_PLANKS
STONE_TOOL_MATERIALS:
- COBBLESTONE
- COBBLED_DEEPSLATE
- BLACKSTONE
COPPER_TOOL_MATERIALS:
- COPPER_INGOT
IRON_TOOL_MATERIALS:
- IRON_INGOT
GOLD_TOOL_MATERIALS:
- GOLD_INGOT
DIAMOND_TOOL_MATERIALS:
- DIAMOND
upgrades:
# Master switch for tool upgrade crafting.
enabled: true
# Default cost behavior used when an tool-upgrades.yml entry does not override it.
# VANILLA_RECIPE_COST means shovel/spear 1, sword/hoe 2, pickaxe/axe 3.
cost-mode: VANILLA_RECIPE_COST
# Durability behavior after an upgrade:
# - REFILL: output item is fully repaired.
# - KEEP_DAMAGE: preserves the exact damage value when possible.
# - KEEP_PERCENTAGE: preserves the percentage of durability already used.
durability-mode: REFILL
# When true, anvil repair cost is preserved by Bukkit/Paper meta conversion
# whenever the target item supports it. When false, upgrade output repair cost
# is cleared.
preserve-repair-cost: true
skins:
# Master switch for visual skin recipes.
enabled: true
# V1 skin crafting is intentionally fixed to clean netherite tools in a
# vanilla crafting table. The output Material becomes the selected visual
# skin tier, but receives netherite-equivalent components. Already-skinned
# items must be stripped first.
lore:
# Adds generated CoreToolsX lore lines that identify the active visual skin.
# CoreToolsX snapshots the original item lore into PDC before rebuilding
# the final lore from generated-lines.
enabled: true
# Legacy single-line format. Used only if generated-lines is empty.
format: "<reset><gray>Skin: <white>{skin}"
# MiniMessage lines rendered from current config every time the item is
# refreshed, dyed, fixed, or skin durability changes.
# The final item lore is exactly this list after placeholder expansion.
# To display the saved original item lore, add a line that is exactly
# {item_lore}. If this line is missing, the saved original lore remains in
# PDC for skin removal/reset, but is not shown on the skinned item.
#
# Available placeholders:
# - {item_lore}: must be its own list entry; expands to the saved original lore
# - {skin}
# - {skin_id}
# - {real_tier}
# - {visual_skin}
# - {clean_material}
# - {skin_durability_current}
# - {skin_durability_max}
# - {skin_durability_damage}
# - {skin_durability_remaining}
# - {skin_durability_percent}
# - {skin_durability_bar}
generated-lines:
- "{item_lore}"
- "<gray>Skin: <white>{skin}"
# Example durability line. Uncomment it when skin-durability is enabled
# in tool-skins.yml and you want the skin durability shown in lore.
# - "<gray>Skin Durability: <white>{skin_durability_current}</white>/<white>{skin_durability_max}</white> {skin_durability_bar}"
skin-removal:
# Master switch for removing a skin through crafting.
enabled: true
# Tool required in the crafting matrix with a skinned tool.
# If damage-tool is true and consume-tool is false, this material must have
# durability. Otherwise removal recipes are skipped and a config warning is logged.
tool: SHEARS
# If true, one shears item is consumed.
consume-tool: false
# If true, shears take durability damage instead of being consumed.
damage-tool: true
# Durability damage applied to shears when damage-tool is true.
damage-amount: 1
skin-stripping:
# If false, dropped skinned tools are protected from configured fire/lava
# destruction causes and keeps the skin.
#
# If true, configured causes strip the skin and convert the item back into
# clean netherite instead of destroying it.
enabled: false
# Supported v1 causes:
# - LAVA
# - FIRE
causes:
- LAVA
- FIRE
# MVP supports STRIP_SKIN only.
mode: STRIP_SKIN
progression-locks:
# Master switch for permission-based progression locks.
# CoreToolsX does not store progression state internally.
enabled: false
blocks:
# Blocks protected direct crafting/skin recipes when permission checks fail.
crafting: true
# Blocks tool upgrade recipes when permission checks fail.
upgrades: true
# Default false: found/traded/given tools remain usable.
# If true, using tools requires coretoolsx.use.<tier>.
usage: false
permissions:
# Players with this permission bypass all CoreToolsX progression checks.
bypass: "coretoolsx.progression.bypass"
# Prefix used when usage locking is enabled.
# Example: coretoolsx.use.netherite
usage-prefix: "coretoolsx.use"
compatibility:
custom-items:
# Custom item protection mode:
# - BLOCK_IF_DETECTED: block transformation if foreign PDC data is found.
# - REPLACE_ANYWAY: allow CoreToolsX transformations even when foreign PDC
# data is present. Use only when you know those custom items are safe.
behavior: BLOCK_IF_DETECTED
{item_lore} must be its own generated lore entry. If it is missing, original lore remains stored in PDC but is not displayed.
6. tool-upgrades.yml
Defines normal tool progression recipes. Supported fields include enabled, from-tier, from-material, to-tier, to-material, ingredient, cost-mode, count, and permission.
# CoreToolsX tool upgrade definitions.
#
# These recipes change the real vanilla Material of the tool. Normal upgraded
# tools do not receive CoreToolsX PDC; the Material remains the source of truth.
#
# Supported fields:
# - enabled: true/false
# - from-tier: WOOD, STONE, COPPER, IRON, GOLD, DIAMOND, NETHERITE
# - from-material: exact Bukkit Material for a special one-tool recipe
# - to-tier: target tier for all configured tool types
# - to-material: exact Bukkit Material for a special one-tool recipe
# - ingredient: Bukkit Material or ingredient-groups.<id> from config.yml
# - cost-mode: VANILLA_RECIPE_COST or CUSTOM
# - count: explicit ingredient count, used only when cost-mode is CUSTOM
# - permission: permission required when progression locks are enabled
#
# VANILLA_RECIPE_COST means:
# - shovel: 1
# - spear: 1
# - sword: 2
# - hoe: 2
# - pickaxe: 3
# - axe: 3
upgrades:
wood_to_stone:
enabled: true
from-tier: WOOD
to-tier: STONE
ingredient: STONE_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.upgrade.wood_to_stone"
stone_to_copper:
enabled: true
from-tier: STONE
to-tier: COPPER
ingredient: COPPER_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.upgrade.stone_to_copper"
copper_to_iron:
enabled: true
from-tier: COPPER
to-tier: IRON
ingredient: IRON_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.upgrade.copper_to_iron"
iron_to_diamond:
enabled: true
from-tier: IRON
to-tier: DIAMOND
ingredient: DIAMOND_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.upgrade.iron_to_diamond"
iron_to_gold:
# Gold is an optional endpoint branch, separate from the main diamond path.
enabled: true
from-tier: IRON
to-tier: GOLD
ingredient: GOLD_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.upgrade.iron_to_gold"
The default upgrade chain is wood to stone, stone to copper, copper to iron, iron to diamond, and iron to gold. VANILLA_RECIPE_COST means shovel/spear 1, sword/hoe 2, pickaxe/axe 3.
7. tool-skins.yml
Defines netherite-only visual skin recipes and controls optional skin durability. Default skin ids are wood, stone, copper, iron, gold, and diamond.
# CoreToolsX netherite tool skin definitions.
#
# Skin recipes are netherite-only. A skin changes the real item Material to the
# visual tier, then CoreToolsX applies netherite-equivalent tool components.
#
# Example: a netherite pickaxe with the iron skin becomes an IRON_PICKAXE with
# netherite max damage, tool rules, weapon data, and CoreToolsX PDC.
#
# Supported fields:
# - enabled: true/false
# - display-name: name used in generated lore and messages
# - ingredient: Bukkit Material or ingredient-groups.<id> from config.yml
# - cost-mode: VANILLA_RECIPE_COST or CUSTOM
# - count: explicit ingredient count, used only when cost-mode is CUSTOM
# - permission: permission required when progression locks are enabled
#
# VANILLA_RECIPE_COST means:
# - shovel: 1
# - spear: 1
# - sword: 2
# - hoe: 2
# - pickaxe: 3
# - axe: 3
skins:
wood:
enabled: true
display-name: "Wood"
ingredient: WOOD_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.skin.wood"
stone:
enabled: true
display-name: "Stone"
ingredient: STONE_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.skin.stone"
copper:
enabled: true
display-name: "Copper"
ingredient: COPPER_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.skin.copper"
iron:
enabled: true
display-name: "Iron"
ingredient: IRON_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.skin.iron"
gold:
enabled: true
display-name: "Gold"
ingredient: GOLD_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.skin.gold"
diamond:
enabled: true
display-name: "Diamond"
ingredient: DIAMOND_TOOL_MATERIALS
cost-mode: VANILLA_RECIPE_COST
permission: "coretoolsx.skin.diamond"
skin-durability:
# Skin durability is stored in CoreToolsX PDC and applies only to skinned
# tools. It does not replace vanilla DAMAGE/MAX_DAMAGE on the real item.
#
# Supported v1 modes:
# - DISABLED: no skin durability is tracked.
# - GLOBAL: every skin uses global.max-durability.
# - BY_SKIN: each skin reads by-skin.materials.<skin>, then fallback values.
# - BY_ITEM: each tool reads by-item.materials.<skin>.<type>, then fallback values.
mode: DISABLED
global:
max-durability: 5000
by-skin:
default-max-durability: 5000
materials:
wood: 3500
stone: 4500
copper: 5000
iron: 6500
gold: 2500
diamond: 9000
by-item:
default-max-durability: 5000
materials:
wood:
default-max-durability: 3500
sword: 2500
pickaxe: 3200
axe: 3200
shovel: 1800
hoe: 2200
spear: 2500
stone:
default-max-durability: 4500
sword: 3200
pickaxe: 4100
axe: 4100
shovel: 2300
hoe: 2800
spear: 3200
copper:
default-max-durability: 5000
sword: 3600
pickaxe: 4550
axe: 4550
shovel: 2550
hoe: 3150
spear: 3600
iron:
default-max-durability: 6500
sword: 4700
pickaxe: 5900
axe: 5900
shovel: 3300
hoe: 4100
spear: 4700
gold:
default-max-durability: 2500
sword: 1800
pickaxe: 2250
axe: 2250
shovel: 1250
hoe: 1550
spear: 1800
diamond:
default-max-durability: 9000
sword: 6500
pickaxe: 8200
axe: 8200
shovel: 4600
hoe: 5700
spear: 6500
damage:
mode: MIRROR_REAL_DAMAGE
multiplier: 1.0
on-break: REMOVE_SKIN
mending:
mode: DISABLED
placeholders:
disabled-value: ""
bar-segments: 10
bar-full: "<green>|"
bar-empty: "<dark_gray>|"
Skin durability modes are DISABLED, GLOBAL, BY_SKIN, and BY_ITEM. Mending modes are DISABLED, SPLIT, and DOUBLE.
8. messages.yml
Messages use Adventure MiniMessage. The configured prefix is prepended automatically. Only documented placeholders near each message should be used.
Inspect messages are useful for checking current material, clean material, visual skin, inventory model mode, CoreToolsX data, generated lore state, original lore snapshot, skin durability, tier, and tool type.
# CoreToolsX messages.
#
# All user-facing text should live here.
# Messages use Adventure MiniMessage syntax:
# https://docs.advntr.dev/minimessage/format.html
#
# Placeholder format is {placeholder}. A message only receives placeholders
# that are meaningful for that specific command or event.
# Prefix is prepended automatically by MessageService to every configured message.
prefix: "<dark_gray>[<aqua>CoreToolsX</aqua>]</dark_gray> "
commands:
# Generic permission failure for commands.
no-permission: "<red>You do not have permission to do this."
# Sent when an unknown /coretoolsx subcommand is used.
unknown: "<red>Unknown command. Use <white>/coretoolsx help</white>."
# Sent after /coretoolsx reload successfully reloads configs and recipes.
reloaded: "<green>CoreToolsX reloaded."
# Placeholder:
# - {version}: plugin version from plugin.yml
version: "<gray>CoreToolsX version <white>{version}</white>."
# Help command lines. Permission-gated lines are only shown when the sender
# has the corresponding permission.
help-header: "<gray>CoreToolsX commands:"
help-version: "<dark_gray>- <aqua>/coretoolsx version</aqua>"
help-reload: "<dark_gray>- <aqua>/coretoolsx reload</aqua>"
help-inspect: "<dark_gray>- <aqua>/coretoolsx inspect</aqua>"
help-fixitem: "<dark_gray>- <aqua>/coretoolsx fixitem</aqua>"
# Sent when a player-only command is run from console.
player-only: "<red>This command can only be used by a player."
crafting:
# Sent when a protected vanilla tool recipe is blocked.
blocked-vanilla-craft: "<red>You must upgrade the previous tool tier first."
# Sent when permission-based progression blocks an upgrade or skin recipe.
no-permission: "<red>You do not have permission for this tool progression."
# Sent when compatibility mode blocks transformation of a detected custom item.
custom-item-blocked: "<red>This custom item cannot be modified by CoreToolsX."
progression:
# Sent when progression-locks.blocks.usage is true and the player lacks
# the required coretoolsx.use.<tier> permission.
usage-blocked: "<red>You do not have permission to use this tool tier."
admin:
# Sent by /coretoolsx inspect when the player has no held item.
inspect-empty-hand: "<red>Hold a tool item first."
# Sent by /coretoolsx fixitem when the player has no held item.
fix-empty-hand: "<red>Hold a tool item first."
# Sent by /coretoolsx fixitem when the held item is not CoreToolsX skinned tool.
fix-not-skinned: "<red>This item is not a CoreToolsX skinned tool item."
# Sent by /coretoolsx fixitem after the profile/lore/PDC refresh completes.
fixed: "<green>Item fixed."
inspect:
# Header for /coretoolsx inspect output.
header: "<gray>Item inspection:"
# Placeholder:
# - {material}: current Bukkit Material name
current-material: "<dark_gray>- <gray>Current Material: <white>{material}</white>"
# Placeholder:
# - {material}: saved clean netherite Material for skinned tool
clean-material: "<dark_gray>- <gray>Clean Material: <white>{material}</white>"
# Placeholder:
# - {skin}: saved visual skin tier
visual-skin: "<dark_gray>- <gray>Visual Skin: <white>{skin}</white>"
# Placeholder:
# - {mode}: REAL_TIER or VISUAL_SKIN
inventory-model-mode: "<dark_gray>- <gray>Inventory Model Mode: <white>{mode}</white>"
# Placeholder:
# - {value}: true/false
has-core-data: "<dark_gray>- <gray>Has CoreToolsX Data: <white>{value}</white>"
# Placeholder:
# - {value}: true/false
generated-lore: "<dark_gray>- <gray>Generated Skin Lore: <white>{value}</white>"
# Placeholder:
# - {value}: true/false
original-lore: "<dark_gray>- <gray>Original Lore Snapshot: <white>{value}</white>"
# Placeholder:
# - {damage}: skin durability damage stored in PDC
# - {max}: skin max durability stored in PDC
# - {remaining}: max minus damage
# - {percent}: remaining percent
skin-durability: "<dark_gray>- <gray>Skin Durability: <white>{remaining}</white>/<white>{max}</white> <dark_gray>({percent}%, damage {damage})"
# Sent when skin durability mode is disabled or the item has no skin
# durability PDC.
skin-durability-disabled: "<dark_gray>- <gray>Skin Durability: <white>disabled</white>"
# Placeholder:
# - {tier}: detected tool tier for normal tool
tier: "<dark_gray>- <gray>Tier: <white>{tier}</white>"
# Placeholder:
# - {piece}: detected tool type for normal tool
piece: "<dark_gray>- <gray>Type: <white>{piece}</white>"
9. plugin.yml
Complete bundled plugin descriptor. Maven resolves ${project.version} when the release jar is built.
name: CoreToolsX
main: it.icewolf23x.coretoolsx.CoreToolsXPlugin
version: ${project.version}
api-version: '1.21'
description: Vanilla+ tool progression and netherite tool skins for Paper.
author: IceWolf23X
prefix: CoreToolsX
commands:
coretoolsx:
description: CoreToolsX main command.
usage: /coretoolsx
aliases:
- ctx
permissions:
coretoolsx.admin:
description: Grants all CoreToolsX admin permissions.
default: op
children:
coretoolsx.admin.reload: true
coretoolsx.admin.inspect: true
coretoolsx.admin.fixitem: true
coretoolsx.progression.bypass: true
coretoolsx.admin.reload:
description: Allows reloading CoreToolsX configuration.
default: op
coretoolsx.admin.inspect:
description: Allows inspecting held CoreToolsX tool items.
default: op
coretoolsx.admin.fixitem:
description: Allows repairing CoreToolsX metadata/profile on the held item.
default: op
coretoolsx.progression.bypass:
description: Bypasses CoreToolsX permission progression locks.
default: op
coretoolsx.skin.*:
description: Allows every CoreToolsX tool skin.
default: op
children:
coretoolsx.skin.wood: true
coretoolsx.skin.stone: true
coretoolsx.skin.copper: true
coretoolsx.skin.iron: true
coretoolsx.skin.gold: true
coretoolsx.skin.diamond: true
coretoolsx.upgrade.*:
description: Allows every CoreToolsX tool upgrade.
default: op
children:
coretoolsx.upgrade.wood_to_stone: true
coretoolsx.upgrade.stone_to_copper: true
coretoolsx.upgrade.copper_to_iron: true
coretoolsx.upgrade.iron_to_gold: true
coretoolsx.upgrade.iron_to_diamond: true
coretoolsx.use.*:
description: Allows using every CoreToolsX tool tier when usage locks are enabled.
default: op
children:
coretoolsx.use.wood: true
coretoolsx.use.stone: true
coretoolsx.use.copper: true
coretoolsx.use.iron: true
coretoolsx.use.gold: true
coretoolsx.use.diamond: true
coretoolsx.use.netherite: true
10. Permissions
coretoolsx.admin
coretoolsx.admin.reload
coretoolsx.admin.inspect
coretoolsx.admin.fixitem
coretoolsx.progression.bypass
coretoolsx.upgrade.*
coretoolsx.skin.*
coretoolsx.use.*
Usage permissions matter only when both progression-locks.enabled and progression-locks.blocks.usage are true.
11. Troubleshooting Quick Reference
No recipe appears
- Check
recipes.recipe-book.enabled. - Check the relevant entry has
enabled: true. - Run
/coretoolsx reload. - Check console warnings for invalid materials or costs above 8.
Recipe output appears but clicking does nothing
- Check progression permissions if locks are enabled.
- Use separate one-item ingredient slots.
- Confirm the base item is not already skinned.
- Check custom item compatibility mode.
Skinned tool lost expected lore
Ensure {item_lore} exists in skins.lore.generated-lines, then hold the item and run /coretoolsx fixitem.
Missing texture or wrong inventory model
Use VISUAL_SKIN mode with no pack, or install the CoreToolsX resource-pack addon before enabling REAL_TIER.
Player cannot use tools
Check progression-locks.blocks.usage, then grant coretoolsx.use.<tier> or coretoolsx.progression.bypass.
12. Production Validation Checklist
- Run
/coretoolsx reload. - Confirm console has no CoreToolsX warnings.
- Craft one normal upgrade from each configured path.
- Craft one skin recipe.
- Remove one skin with shears.
- Inspect a skinned item with
/coretoolsx inspect. - Run
/coretoolsx fixitem. - Test fire/lava behavior if skin stripping changed.
- Test permissions with a non-op account if progression locks are enabled.