Skip to content
ShadowMC

Configuration

ShadowCustomizer

Items, blocks, mobs, enchantments and recipes that Minecraft does not have.

Premium v1.0.4

Where the files are

plugins/ShadowCustomizer/

The plugin creates them on first start and updates them by itself on new versions, keeping your changes.

Applying changes

/scus reload

Reloads the files without restarting the server.

What’s inside

23 files · 574 settings

Start with: config.yml

Settings

The files that decide how the plugin behaves. Start here.

config.yml

General settings
33 settings
plugins/ShadowCustomizer/config.yml

This file explains the why of every option, not just the what

A wrong value never stops the plugin: it is replaced with the default and reported in console with the path and what was expected, so you fix one line instead of guessing.

Keep reading

UPDATES: when a new version changes this file, or one of the files it ships in lang/, menus/, items/, mobs/, enchants/, blocks/ or recipes/, it is moved to the new version for you. Everything you changed or added is carried over; the settings you never touched take the new defaults. Your previous file is kept in backup/<date>/, and if something could not be carried over (an option that no longer exists, a value of a different kind) you find it in PORTING-<version>.txt, with what to do.

EVERY KEY IN EVERY FILE IS ENGLISH. A configuration file is code: a key that can be written in two languages shows up in two forms in every guide, every copied example and every support question. What gets translated is what a PLAYER reads - messages, item names, lore - and that lives in lang/, where there are two languages on purpose.

Where the content lives:

items/*.yml       the items
mobs/*.yml        the mobs and bosses
enchants/*.yml    the enchantments
blocks/*.yml      the blocks
recipes/*.yml     the recipes
menus/*.yml       the GUIs: rows, slots, materials and text
lang/*.yml        the messages

Put as many files as you like in those folders: they are picked up on their own, in name order, with nothing to register anywhere.

Two more show up after an update:

backup/<date>/          your files as they were before it
PORTING-<version>.txt   only if something needs your attention

You can delete both once you no longer need them.

config-version1

The format number of this file. Do not touch it: an update always writes the one of the new version.

core

core1 key
server-ip''

The address this server is known by from the outside.

Only the licence needs it: a Premium key is tied to the addresses of the server that claimed it, and a server behind a proxy cannot see any of its own public addresses. If the licence says "wrong server" but the server is right, this is almost always what is missing.

Empty is perfectly fine for the vast majority of servers.

messages

messages2 keys
default-localeen_US

The language to use when the player's own is not available.

The plugin ships with en_US and it_IT. Add a file to lang/ and it is picked up: this is the one place where a language other than English belongs, because these are the words your players read.

follow-client-localetrue

Whether to follow the language each player's client is set to.

With true an Italian player and an English one each read their own without anybody having to do anything. With false everybody reads the default, which is what you want if you have rewritten the messages your own way and do not want half your players to miss them.

models - how an item tells the client which model to draw

models2 keys

The way Minecraft ties a model to an item HAS CHANGED, and it will change again. This section exists so that changing it does not mean rewriting your definitions.

bindingauto

How to bind models. One of:

Keep reading
auto              decides on its own by looking at what each
                  definition declares, AND above all by looking at
                  whether anything on this server actually delivers
                  a resource pack - the models extension, or a
                  resource-pack set in server.properties.
If nothing does, models are NOT bound and items
look like the material they are made of. This is
not laziness: an item that declares a model the
client does not have does not look like its
material, it looks like the PURPLE AND BLACK CUBE
of a missing model. Better a diamond sword called
Ruby Sword than a sword that looks like an error.
This is the right choice and the default.
item-model        the item_model component only, that is the modern
                  mechanism: one model by name, no numbers and no
                  possible clash with other plugins. It is what the
                  3D models extension generates.
custom-model-data the custom_model_data component in its string
                  form. For anyone who already has a pack built
                  that way and does not want to redo it.
legacy-number     the old numeric custom_model_data. It still works
                  and it is deprecated: it is here so a pack from
                  three years ago can keep working while you redo
                  it at your own pace.
none              no models at all. Items stay the material they
                  are made of, and everything else - attributes,
                  behaviours, enchantments - works identically.
namespaceshadow

The namespace to put in front of a model written without one.

"model: ruby_sword" becomes "shadow:ruby_sword". Change it if your resource pack uses a different namespace: it has to match, otherwise the client cannot find the model and draws the purple and black cube.

What can carry a custom look, and how - the whole map

There is not one mechanism, there are four, and using the wrong one is why custom content so often looks right in one place and vanilla in another. Each line below says which key does it and where.

1. AN ITEM IN YOUR HAND OR IN THE INVENTORY

'model' on the item. Flat image or full 3D model, the same key
either way. This is the one everybody knows.

2. A BLOCK IN THE WORLD

'model' on the block. Underneath it is a note block using one of
its states, and the pack points that state at your model - which
DOES NOT HAVE TO BE A CUBE. A chest, a lamp, a tombstone: that is
all furniture is here, and blocks/furniture.yml ships two.
The limit is the hitbox: it stays a full block, and a note block
has no facing, so no free rotation.

3. ARMOUR ON YOUR BACK, AND AN ELYTRA IN FLIGHT

'equipment' on the item, NOT 'model'. Once armour is worn the
game stops drawing the item model and lays texture layers over the
body: 'humanoid' for the body, 'humanoid_leggings' for the legs,
'wings' for an elytra. This is the single most common mistake in
custom sets - a model alone gives you a beautiful sword-and-shield
look in the inventory and plain netherite on your back.
The layers are declared in equipment.yml, models extension.

4. A HEAD - a player's, or a mob's

'model', and nothing else. The head slot is the one place the game
draws the ITEM'S model instead of a layer. It is how hats work,
and it is how the bosses in mobs/mobs.yml get a face of their own
without a separate model plugin: they wear an item.

A MOB'S BODY is none of these. Reshaping the mob itself needs a model plugin (ModelEngine and the like), which this plugin does not talk to and does not pretend to: what it gives you is equipment slots, which is enough for a boss that reads as a boss.

ALL FOUR NEED SOMEBODY TO DELIVER THE PACK. With 'binding: auto' and nothing delivering one, neither 'model' nor 'equipment' is applied, and everything falls back to plain materials - on purpose. Half- applied is worse than not applied: it is how you get purple cubes and invisible armour.

AND IT IS ASKED PER MODEL, not once for the whole server. A pack can be served and still not contain a particular model - the models extension without its key generates the flat textures and not the 3D ones. Those items are left unbound and look like their material. So an item never points at a model the pack does not have, which is the only way the purple cube can appear.

items

items1 key
hold-period-ticks10

How many ticks between runs of the "hold" behaviour.

Ten is half a second. Raising it saves work, lowering it makes a continuous effect more precise. This task does not start at all if no definition has a "hold" behaviour, so if you do not use that feature this number has no effect on anything.

mobs

mobs2 keys
ability-period-ticks10

How many ticks between sweeps of the boss service over live mobs.

It is the loop that updates health bars, switches phases and fires timed abilities. Ten ticks - half a second - is a good compromise: abilities stay accurate to the half second and the cost does not show.

This one also does not start if no mob has abilities, phases or a boss bar.

max-live500

How many custom mobs may be alive at once across the whole server.

Keep reading

It is a safety net against a mistake you can write in three lines: a boss with an ability that spawns two helpers every twenty seconds, and the helpers being the same definition as the boss. The growth is exponential and you find out from your TPS.

No server has five hundred custom mobs alive at once by choice. If the cap is reached you will find it in /scus diag: it almost always means there is a spawning ability missing a limit.

abilities - the limits on area actions

abilities1 key
max-radius32.0

The maximum radius of an area action (pull, push, damage-nearby).

A large radius asks the server to examine hundreds of entities on every use, and on Folia it almost certainly reaches outside the region owned by the thread - which means it does not work at all. Better a ceiling written here than a feature that sometimes works.

blocks

blocks1 key
track-placedtrue

Whether to keep a record of where the custom blocks are placed.

Keep reading

LEAVE IT ON. It is not an extra feature: it is how this plugin tells one of its own blocks from a player's note block, and it is the reason the thing that happens elsewhere does not happen here.

The problem, briefly. A custom block is a note block tuned to a certain instrument and note combination. But a player's note block can have that same combination: they place one, tune it with right clicks, and sooner or later land exactly on one of ours. A plugin that recognises its own blocks by the note alone mistakes it for its own from that moment on, and starts "defending" it: it cancels the physics update, which is also how a note block receives a redstone signal. From then on that block no longer plays when you power it, no longer tunes, and breaking it drops an item the player never crafted. It is why on many servers with custom blocks the musical circuits stop working and nobody understands why.

With this record on, the question is not "does it have the right note?" but "did we place it?", and for a player's note block the answer is always no: its redstone works, it tunes, and it breaks into a note block.

Turn it off and the plugin no longer knows which blocks are its own, so it TURNS THE DEFENCES OFF rather than guessing: custom blocks are still visible, but they behave like note blocks - they change note on a right click and drop a note block. It is the trade-off chosen on purpose, because between "one of our blocks loses its defences" and "a player's circuit stops working", the second hits someone who asked for none of this.

It also tells you WHERE the blocks of a definition you just deleted are, and makes a migration possible the day Minecraft changes the available combinations.

Every write to the database is asynchronous: a player placing a hundred blocks in a minute never waits for it. The question "is it ours?" is answered in memory instead, eight bytes per placed block.

recipes

recipes1 key
protect-from-vanillatrue

Whether to stop a custom item from being used in a vanilla recipe.

Keep reading

Leaving it on is almost always right, and it is the hole that custom item plugins have historically left open: a "Dragon Sword" built on a DIAMOND_SWORD is, as far as a crafting table is concerned, a diamond and a stick. It can be smelted into an ingot. It can be used as an ingredient in place of an ordinary item. Whoever spent a month earning it can destroy it with a shift click.

Turn it off only if you genuinely need your items to go into the game's own recipes, and knowing what that means.

ui

ui1 key
confirm-timeout30s

How long a confirmation button is good for before it expires.

In this plugin - as across the whole suite - nobody is ever asked to retype a command to confirm: you click [ CONFIRM ] or [ CANCEL ]. The token behind the button is single use and tied to whoever was asked, so a button left in the chat history cannot start anything again.

storage

storage5 keys

Your definitions are NOT in here. Items, mobs, enchantments, blocks and recipes are YAML files and stay YAML files: you read them, copy them from one server to another, put them in a repository, open them in a text editor.

The database holds only three things the game produces while it runs: where the placed blocks are, which definitions no longer exist but are still in circulation, and a few counters.

table-prefix'sc_'

The table prefix. Change it only if you share a database with something else: two servers on the same database with the same prefix write into the same rows.

storage.mysql7 keys
enabledfalse

false uses an H2 file inside the plugin folder: nothing to install, no user, no password. It is what makes the plugin work the moment it is copied into plugins/.

MySQL is only for people with more than one server that need to see the same data. It is a Premium feature: on the free version this line is ignored and the local file is used, said in console.

host127.0.0.1
port3306
databaseshadowcustomizer
usernameroot
password''
parameters'useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8'
storage
fallback-to-localtrue

If MySQL does not answer, fall back to the local file instead of refusing to start.

true is almost always right: a server that will not start is far worse than a server that starts writing somewhere else. Set false only if the data MUST be on the shared MySQL and you would rather find out immediately.

storage.h21 key
auto-serverfalse

Lets more than one process open the same H2 file. Only needed if you want to look at the database while the server runs; it costs a little.

storage.pool5 keys
maximum-pool-size10
minimum-idle2
connection-timeout-ms10000
idle-timeout-ms600000
max-lifetime-ms1800000

license

license3 keys

THE KEY LIVES IN license.yml (same folder as this file), or in the central plugins/ShadowControl/licenses.yml for the whole suite. The 'key' below is only a fallback for deploy systems that generate config.yml: leave it empty.

The key does NOT live here: it lives in license.yml, in this folder, written at first start (or in plugins/ShadowControl/licenses.yml for the whole suite). The key. Better NOT to put it here.

The command /scus license activate <key> writes it into license.yml, which is a separate file on purpose: a support request that says "send me your config" should not arrive with your licence inside it.

This line exists for anyone distributing configurations from a template who would rather keep everything in one file.

grace-days7

How many days of grace before falling back to free.

Two situations do not switch anything off immediately: a subscription that just expired (the renewal has almost always already gone through) and an address that does not match (far more often a NAT or a proxy than a thief).

activation-url'https://shadow-licences.riccardobotins.workers.dev'

The address of the activation service.

It is what /scus license claim <code> uses, that is, what turns the code you got when you bought into a signed licence tied to YOUR server, without anybody having to email IP addresses around.

Empty disables claim and the periodic recheck: a key you already hold keeps working, even with no network.

resolve-public-iptrue

Ask the licence service above how this server looks from outside (activation-url + /ip: it answers with the address it sees, and nothing about the server is sent).

It is the only reliable way to know your own public address from behind a NAT, and it is what makes a licence sold for "play.example.com" work on a machine whose addresses are all 10.x. A failure is silent and changes nothing. Only when a licence is installed: a server without a key asks nobody. false = never ask.

debug

debug1 key
log-sqlfalse

Writes every SQL statement to the console. Useful to whoever is chasing a fault and to nobody else: on a live server it floods the log.

bStats (anonymous usage statistics, https://bStats.org)

What is sent, every 30 minutes: a random server id (serverUuid, not derived from anything), the plugin version, the Minecraft/Paper and Java versions, the operating system and core count, the online mode, how many players are online (a number only) and the licence tier (free/premium/creator). NO player data: no names, no UUIDs, no addresses. Nothing is sent while the plugin waits for a licence.

Keep reading

false switches off this plugin only. enabled: false in plugins/bStats/config.yml switches off every bStats plugin on the server at once.

metrics1 key
enabledtrue

enchants/enchants.yml

Custom enchantments
152 settings
plugins/ShadowCustomizer/enchants/enchants.yml
File notes

These are REAL enchantments: they go into the server's enchantment registry, the same one Sharpness lives in. The anvil combines them, the table offers them, books hold them, /enchant knows them.

THE PRICE: the registry is written once, at start-up. Adding or changing one of these needs a RESTART. /scus reload does everything else - items, mobs, blocks, recipes - and says so when an enchantment is waiting.

NAMES AND DESCRIPTIONS. The ones below have no 'name:' and no 'description:': they come from lang/<language>.yml, section 'enchantments', so each player reads them in their own language in the windows and in chat. The name written on the item is the one of the server's default language (messages.default-locale in config.yml), because the registry holds only one. Write 'name:' or 'description:' here and yours wins, for everybody. Your own enchantments need a name: here, or in the lang files.

WHAT IT GOES ON. 'supported-items' is the truth: the windows, the books and /scus enchant info show it in words ("Swords, Spears, Axes"), worked out from what the server registered.

In the free version the first three are registered and their weight is forced down to the minimum: they exist and work exactly the same, they are just as rare as an enchantment can be.

LEVELS. Every number in an effect may depend on the level of the book: "0.5*<level>", "2+<level>", "60*<level>". Potion durations and amplifiers scale the same way ("SPEED 60 <level>"). A trigger can also say how OFTEN it fires, and on WHICH BLOCKS, in its long form:

break-block:
  chance: '0.1*<level>'      # 0..1, may grow with the level; left out = always
  blocks: [ '#minecraft:logs' ]   # tags or blocks; left out = every block
  actions:
    - 'xp: 1*<level>'

"max-level" is the ceiling: 1 for a Mending-like enchantment that has nothing to scale, 3 to 5 for the rest. Two equal books combine on the anvil into the next level, and the GUI (/scus enchant list) hands out a book at any level up to the ceiling.

ACTIONS ADDED FOR ENCHANTMENTS (the others are the item behaviours'):

smelt:                       break-block only: the block's drops come
                             out smelted, with the furnace experience.
                             Fortune is already in the drops.
multiply-drops: 2            break-block only: the drops times 2.
                             Never with Silk Touch, never on a block
                             that drops itself. ALWAYS give it a
                             'blocks:' filter (ores): on any block it
                             is a duplication machine.
pull: 0.4 on=target          pulls the target towards you
push: 0.6 on=target          pushes the target away from you
damage: 4 on=target below=0.34   only if the target has 34% health or less
damage-nearby: 2 radius=3 skip-target=true   not the target again
potion: GLOWING 60 1 radius=8    on whoever is around, not on you

UPDATES: when a new version changes this file, it is moved to the new version at start-up, before the enchantments are registered. Everything you changed or added (a weight, an effect, an enchantment of your own) is carried over; what you never touched takes the new version's fixes. Your previous file is kept in backup/<date>/, and if something could not be carried over you find it in PORTING-<version>.txt, with what to do.

config-version3

Swords

Rubavita / Life Steal - every hit gives you some life back

bloodthirst10 keys
max-level5
weight4
anvil-cost4
minimum-cost'10 11'
maximum-cost'60 11'
supported-items["#minecraft:swords"]
primary-items["#minecraft:swords"]
slot[mainhand]
exclusive-with["minecraft:fire_aspect"]
bloodthirst.effects1 key
hit-entity
["heal: 0.5*<level>", "particle: DAMAGE_INDICATOR 6 0.3"]+1

Health points, not hearts: 0.5 is a quarter of a heart per level, a heart and a quarter at the fifth.

Colpo di grazia / Finishing Blow - finishes off whoever is almost down

execution8 keys
max-level3
weight2
anvil-cost6
minimum-cost'20 14'
maximum-cost'70 14'
supported-items["#minecraft:swords"]
slot[mainhand]
execution.effects1 key
hit-entity
["damage: 2*<level> on=target below=0.34", "sound: entity.player.attack_crit 1 0.7"]+1

below=0.34: only when the target is down to a third of its health. Without it this was just Sharpness under another name.

Fulmine / Lightning Strike - a lightning bolt now and then

chain_lightning8 keys
max-level3
weight2
anvil-cost6
minimum-cost'22 15'
maximum-cost'75 15'
supported-items["#minecraft:enchantable/sharp_weapon"]

Swords, spears and axes: the game's own tag for them. The hand-written list this replaces had forgotten the copper sword and axe and every spear.

slot[mainhand]
chain_lightning.effects1 key
chain_lightning.effects.hit-entity2 keys
chance'0.15*<level>'

"Now and then": the chance grows with the level, 15% at the first and 45% at the third. Without "chance" an effect fires on every hit.

actions["lightning:", "damage: 1.5*<level> on=target"]

The lightning is an effect only: it deals no damage of its own. The damage is decided by the line below. Adding it twice is the mistake that turns an enchantment from spectacular into unbearable.

6 more entries shaped like config-version: wildfire, tempest, undertow, swiftstep, midas_touch, soulreaper

Axes

Colpo ampio / Cleave - also hits whoever stands around

cleave9 keys
max-level4
weight3
anvil-cost5
minimum-cost'15 13'
maximum-cost'65 13'
supported-items["#minecraft:axes"]
primary-items["#minecraft:axes"]
slot[mainhand]
cleave.effects1 key
hit-entity
["damage-nearby: 1.5*<level> radius=3 skip-target=true", "sound: entity.player.attack_sweep 1 0.8"]+1

skip-target: the one you hit already took the blow.

lumberjack8 keys

Esperienza del boscaiolo / Lumberjack's Experience - every log is worth some experience

max-level3
weight5
anvil-cost3
minimum-cost'8 9'
maximum-cost'58 9'
supported-items["#minecraft:axes"]
slot[mainhand]
lumberjack.effects1 key
lumberjack.effects.break-block2 keys
blocks["#minecraft:logs"]

Logs only. On every block, placing and breaking the same dirt block was an experience farm.

actions["xp: 1*<level>"]

Pickaxes

Minerale doppio / Double Ore - now and then an ore drops double

vein_miner9 keys
max-level3
weight3
anvil-cost4
minimum-cost'15 10'
maximum-cost'65 10'
supported-items["#minecraft:pickaxes"]
primary-items["#minecraft:pickaxes"]
slot[mainhand]
vein_miner.effects1 key
vein_miner.effects.break-block3 keys
chance'0.1*<level>'

10% per level. Ores only, like Fortune: on any block, a placed and broken diamond block would be a duplication.

blocks
["#minecraft:coal_ores", "#minecraft:iron_ores", "#minecraft:copper_ores", "#minecraft:gold_ores", "#minecraft:redstone_ores", "#minecraft:lapis_ores", "#minecraft:diamond_ores", "#minecraft:emerald_ores", nether_quartz …+7
actions
["multiply-drops: 2", "particle: HAPPY_VILLAGER 5 0.3"]+1

Visione notturna / Night Vision - you see in the dark while you hold it

prospector8 keys
max-level1
weight2
anvil-cost4
minimum-cost'20 0'
maximum-cost'60 0'
supported-items["#minecraft:enchantable/mining"]
slot[mainhand]
prospector.effects1 key
hold["potion: NIGHT_VISION 300 1"]

Every round of the global task, half a second. 300 ticks and not less: the game makes night vision FLICKER in its last 200 ticks, and with 100 the screen flickered the whole time.

Fusione automatica / Auto Smelt - what you dig comes out smelted

smelting_touch9 keys
max-level1
weight2
anvil-cost8
minimum-cost'25 0'
maximum-cost'75 0'
supported-items["#minecraft:pickaxes"]
slot[mainhand]
exclusive-with["minecraft:silk_touch"]
smelting_touch.effects1 key
break-block
["smelt:", "particle: FLAME 6 0.2", "sound: block.furnace.fire_crackle 0.6 1.4"]+1

'smelt:' is what does it: the drops (Fortune included) come out as the server's furnace recipes make them - raw iron into ingots, cobblestone into stone - plus the furnace's experience. Before this line the enchantment only made sparks.

Bows and crossbows

volley9 keys

Esperienza del tiratore / Marksman's Experience - experience for every target hit

max-level3
weight4
anvil-cost4
minimum-cost'12 11'
maximum-cost'62 11'
supported-items["#minecraft:enchantable/bow"]
primary-items["#minecraft:enchantable/bow"]
slot[mainhand]
volley.effects1 key
hit-entity["xp: 2*<level>", "particle: CRIT 8 0.3"]

Arpione / Harpoon - the arrow drags the target towards you

homing8 keys
max-level3
weight2
anvil-cost6
minimum-cost'22 13'
maximum-cost'72 13'
supported-items["#minecraft:enchantable/bow"]
slot[mainhand]
homing.effects1 key
hit-entity
["pull: 0.4*<level> on=target", "sound: entity.arrow.hit_player 1 1.6"]+1

on=target: the target, towards you. The old 'radius=6' form pulled what stood around the target towards the target - and the target itself, at distance zero, not at all.

Dardo esplosivo / Explosive Bolt - the bolt explodes

siege9 keys
max-level3
weight2
anvil-cost7
minimum-cost'25 14'
maximum-cost'75 14'
supported-items["#minecraft:enchantable/crossbow"]
primary-items["#minecraft:enchantable/crossbow"]
slot[mainhand]
siege.effects1 key
hit-entity
["explode: 1*<level> blocks=false", "damage-nearby: 2*<level> radius=3"]+1

blocks=false: the explosion makes a show and damage, not holes in the world. It is the line that decides whether this enchantment can stay on on a server with builds.

Tridents

Shields

Repulsione / Repulsion - whoever hits you is pushed back

bulwark9 keys
max-level3
weight3
anvil-cost5
minimum-cost'15 12'
maximum-cost'65 12'
supported-items[shield]

There is no vanilla tag for shields - they only take Unbreaking and Mending - so the item is written by hand.

primary-items[shield]
slot[mainhand, offhand]

A shield lives in the off hand: both hands count.

bulwark.effects1 key
take-damage
["push: 0.6*<level> on=target", "sound: item.shield.block 1 0.8"]+1

on=target: whoever hit you, away from you.

Armour

Spine d'ombra / Shadow Thorns - whoever hits you regrets it

shadow_thorns10 keys
max-level4
weight3
anvil-cost5
minimum-cost'12 12'
maximum-cost'62 12'
supported-items["#minecraft:enchantable/armor"]
primary-items["#minecraft:enchantable/armor"]
slot[armor]
exclusive-with["minecraft:thorns"]
shadow_thorns.effects1 key
take-damage
["damage: 1*<level> on=target", "particle: SOUL 12 0.4"]+1

Once per hit at the highest level you wear, not once per piece. Against an archer, the damage goes to the archer.

Secondo fiato / Second Wind - a bit of life when you get hit

second_wind8 keys
max-level3
weight2
anvil-cost6
minimum-cost'20 13'
maximum-cost'70 13'
supported-items["#minecraft:enchantable/chest_armor"]
slot[chest]
second_wind.effects1 key
second_wind.effects.take-damage2 keys
chance'0.1*<level>'

"Now and then", as the description says: 10% per level. On every hit it healed a little each time, which against small mobs is close to immortal.

actions["heal: 2*<level>", "particle: HEART 5 0.3"]

Caduta lenta / Slow Falling - you fall slowly

featherfall8 keys
max-level2
weight4
anvil-cost3
minimum-cost'10 10'
maximum-cost'60 10'
supported-items["#minecraft:enchantable/foot_armor"]
slot[feet]
featherfall.effects1 key
hold["potion: SLOW_FALLING 60*<level> 1"]

While the boots are worn (not held). Lasts longer at every level after taking them off.

Anything that wears out

Rivelazione / Reveal - whoever is around you glows

beacon8 keys
max-level1
weight2
anvil-cost4
minimum-cost'18 0'
maximum-cost'68 0'
supported-items["#minecraft:enchantable/equippable"]
slot[any]
beacon.effects1 key
hold["potion: GLOWING 60 1 radius=8"]

radius=8: on whoever is around you. Without it the effect went on the wearer, the opposite of what the enchantment says.

Sazietà / Satiety - you do not get hungry

temper8 keys

The weight goes from 1 to 1024 and says how likely an enchantment is to come out compared to the others: vanilla values go from 1 (Luck of the Sea) to 10 (Protection). ONE is the minimum the game accepts - zero is not a valid value and makes the registration fail.

With one, this is the rarest of all: a reward enchantment, usually applied by hand with /scus enchant or with a book.

max-level1

One level: the saturation effect fills the hunger bar at any strength, so levels two to five did nothing more.

weight1
anvil-cost10
minimum-cost'30 15'
maximum-cost'80 15'
supported-items["#minecraft:enchantable/durability"]
slot[any]
temper.effects1 key
hold["potion: SATURATION 40 1"]

mobs/mobs.yml

Custom mobs
114 settings
plugins/ShadowCustomizer/mobs/mobs.yml
File notes

A custom mob is a vanilla mob dressed up: stats, equipment, name, behaviour and drops. You cannot add entity types to Minecraft from a plugin - nobody can - and you do not need to: a Pumpkin King with six hundred health, a carved head, three abilities and a bar is a boss, and nobody cares that underneath it is a wither skeleton.

WHAT MAKES THEM LOOK CUSTOM is what they wear. The head slot changes the silhouette, and the heads are items with a 3D model - see items/heads.yml. Without a resource pack the mobs still work, they just look like what they are made of.

BOSSES: the health bar, the phases and the timed abilities are Premium. On a free server a boss still spawns with its stats, its equipment and its drops.

Spawn one with: /scus mob spawn <id>

IN ITALIAN: the Italian version of this file is in esempi/it_IT/mobs/mobs.yml, in the plugin folder. It is not loaded: to use it, copy it over this file, or copy the entries you want.

config-version1

Ordinary mobs

Lost Miner - digs where it should not, and finds you

lost_miner9 keys
typeZOMBIE
name'<gray>Lost Miner'
health40
damage6
armor6
lost_miner.equipment3 keys
headIRON_HELMET
chestIRON_CHESTPLATE
handIRON_PICKAXE
lost_miner
drops
["antracite_raw 1 3 0.7", "arcadium_raw 1 1 0.10", "IRON_INGOT 1 2 0.4"]+2

Every line is: id, minimum, maximum, chance, then the details. The id can be one of our items or a vanilla material.

experience25
lost_miner.on1 key
death["particle: LARGE_SMOKE 12 0.4"]

Ash Archer - does not burn at dawn, and moves fast

ash_archer8 keys
typeSKELETON
name'<dark_gray>Ash Archer'
ash_archer.stats3 keys
health30
speed0.32
follow-range40
ash_archer
burns-in-daylightfalse

Without this line the skeleton burns at dawn, and an event mob that incinerates itself is the mistake you discover the day after you put it in.

ash_archer.equipment2 keys
handBOW
ash_archer.equipment.head2 keys
materialdarkflame_helmet
drop-chance0.05
ash_archer
potions["SPEED 1"]
drops
["ARROW 4 12 1.0", "antracite_dust 1 2 0.5", "BONE 1 3 0.8"]+1
experience35

Bosses

Pumpkin King - the boss with the 3D head

pumpkin_king14 keys
typeWITHER_SKELETON
name'<gold>Pumpkin King'
name-visibletrue
bosstrue
pumpkin_king.stats7 keys
health600
damage14
speed0.28
armor14
knockback-resistance0.8
follow-range44
scale1.5

One is normal. One and a half is big and visible from afar.

pumpkin_king
burns-in-daylightfalse
persistenttrue

A boss that is not persistent disappears when the last player moves a bit away, that is exactly when somebody runs off to heal. For bosses it is true by default, but it is written here so that it shows.

pumpkin_king.equipment3 keys
pumpkin_king.equipment.head2 keys
materialpumpkin_king_head
drop-chance0.20
pumpkin_king.equipment
chestNETHERITE_CHESTPLATE
pumpkin_king.equipment.hand2 keys
materialdarkflame_axe
drop-chance0.10
pumpkin_king.boss-bar4 keys
title'<gold>Pumpkin King'
colorYELLOW
styleNOTCHED_10
range48
pumpkin_king.on2 keys
spawn
["broadcast: <gray>The <gold>Pumpkin King <gray>has woken up.", "sound: entity.wither.spawn 1 0.6"]+1
death
["broadcast: <gray>The <gold>Pumpkin King <gray>has fallen.", "sound: ui.toast.challenge_complete 1 1"]+1
pumpkin_king.abilities2 keys

The abilities of the opening phase.

pumpkin_king.abilities.fangs4 keys
every8s
chance0.7
radius12
actions
["damage: 6 on=target", "particle: FLAME 25 0.5", "sound: entity.evoker.fangs_attack 1 0.8"]+2
pumpkin_king.abilities.call3 keys
every22s
needs-targetfalse
actions
["spawn: ash_archer 2", "sound: entity.wither.ambient 1 0.7"]+1
pumpkin_king.phases2 keys

The phases. The order you write them in does not matter: they are sorted by descending threshold. They are crossed once only and downwards - healing the boss does not bring it back.

Keep reading

Two placeholders on top of <player>, <target>, <x> <y> <z> and <world>:

<phase>    in on-enter, the name of the phase just entered
<ability>  in the actions of an ability, its id (fangs, call...)

The Italian names <fase> and <abilita> work too. For example:

- 'broadcast: <gray>The <gold>Pumpkin King <gray>enters <red><phase><gray>.'
pumpkin_king.phases.burning5 keys
below0.5
name'Burning'
bar-colorRED
on-enter
["broadcast: <gray>The <gold>Pumpkin King <red>catches fire<gray>.", "potion: SPEED 999999 2", "sound: entity.ender_dragon.growl 1 0.8"]+2
pumpkin_king.phases.burning.abilities2 keys
pumpkin_king.phases.burning.abilities.fangs4 keys
every4s
chance1.0
radius14
actions
["damage: 8 on=target", "fire: 80 on=target", "particle: FLAME 40 0.6"]+1
pumpkin_king.phases.burning.abilities.shockwave3 keys
every12s
needs-targetfalse
actions
["push: 1.4 radius=6", "damage-nearby: 5 radius=6", "explode: 2 blocks=false"]+2
pumpkin_king.phases.last_stand5 keys
below0.2
name'Last Flame'
bar-colorWHITE
on-enter
["broadcast: <gray>The <gold>Pumpkin King <gray>has nothing left to lose.", "lightning:"]+1
pumpkin_king.phases.last_stand.abilities1 key
pumpkin_king.phases.last_stand.abilities.volley3 keys
every3s
radius16
actions["damage: 7 on=target", "pull: 1.0 radius=10"]
pumpkin_king
drops
["pumpkin_king_head 1 1 1.0 player-only=true", "darkflame_sword 1 1 0.35 player-only=true", "oricalco_rod 2 5 1.0", "NETHER_STAR 1 1 0.30 player-only=true"]+3
experience800

Steel Warden - the slow boss that hits hard

steel_warden13 keys
typeIRON_GOLEM
name'<gray>Steel Warden'
name-visibletrue
bosstrue
steel_warden.model4 keys

A real 3D body: an item model of ShadowCustomizerModels worn by a display that rides the (invisible) golem. Static, not animated. "scale" sizes the model, "y-offset" lifts it off the feet, "hide-base" hides the golem.

item'shadow:steel_warden_model'
scale2.0

2.0 and not 1.3: the body is drawn at 0.65 of its size, because at full size it went past the 32-pixel box Minecraft accepts and the client rejected the whole model. 0.65 x 2.0 = 1.3, the size it had before.

y-offset0.5
hide-basetrue
steel_warden.stats7 keys
health500
damage18
speed0.22
armor18
knockback-resistance1.0
follow-range36
scale1.3
steel_warden
persistenttrue
steel_warden.boss-bar4 keys
title'<gray>Steel Warden'
colorWHITE
styleNOTCHED_6
range44
steel_warden.on2 keys
spawn
["broadcast: <gray>The <white>Steel Warden <gray>has risen.", "sound: entity.iron_golem.repair 1 0.6"]+1
death
["broadcast: <gray>The <white>Steel Warden <gray>has stopped.", "sound: block.anvil_land 1 0.6"]+1
steel_warden.abilities1 key
steel_warden.abilities.slam4 keys
every7s
chance0.8
radius10
actions
["damage: 8 on=target", "push: 1.2 radius=4", "sound: entity.iron_golem.attack 1 0.7"]+1
steel_warden.phases1 key
steel_warden.phases.overheated5 keys
below0.4
name'Overheated'
bar-colorRED
on-enter
["broadcast: <gray>The <white>Warden <red>overheats<gray>.", "potion: SPEED 999999 1"]+1
steel_warden.phases.overheated.abilities2 keys
steel_warden.phases.overheated.abilities.slam4 keys
every4s
chance1.0
radius12
actions
["damage: 11 on=target", "push: 1.6 radius=5", "particle: ELECTRIC_SPARK 30 0.6"]+1
steel_warden.phases.overheated.abilities.magnet3 keys
every14s
needs-targetfalse
actions
["pull: 1.2 radius=10", "sound: block.beacon.activate 1 0.7"]+1
steel_warden
drops
["shadowsteel_shield 1 1 0.40 player-only=true", "elektron_ingot 2 4 1.0", "arcadium_ingot 2 4 1.0", "IRON_BLOCK 2 5 1.0"]+3
experience700

recipes/recipes.yml

Recipes
63 settings
plugins/ShadowCustomizer/recipes/recipes.yml
File notes

Every ingredient and result can be one of our ids or a vanilla material. Ours are looked up first.

config.yml has recipes.protect-from-vanilla on by default: it stops a custom item from being used in one of the game's own recipes. It is the hole that custom item plugins have historically left open - a legendary sword built on a netherite sword is, to a crafting table, a netherite ingot and a stick.

config-version1

The furnace: raw into refined

antracite_smelt6 keys
typefurnace
inputantracite_raw
resultantracite_dust
amount1
cook-time200

In ticks. Two hundred is ten seconds, like a normal furnace.

experience0.7
arcadium_smelt5 keys
typefurnace
inputarcadium_raw
resultarcadium_ingot
cook-time220
experience1.0
elektron_smelt5 keys
typefurnace
inputelektron_raw
resultelektron_ingot
cook-time220
experience1.0
oricalco_smelt5 keys
typeblasting
inputoricalco_raw
resultoricalco_rod
cook-time160
experience1.5

Shadowsteel - the crafting table

shadowsteel_sword_craft5 keys
typeshaped
shape[" A ", " A ", " O "]
shadowsteel_sword_craft.ingredients2 keys
Aarcadium_ingot
Ooricalco_rod
shadowsteel_sword_craft
resultshadowsteel_sword
group'shadowsteel'

The group collects the variants together in the recipe book.

shadowsteel_axe_craft5 keys
typeshaped
shape["AA ", "AO ", " O "]
shadowsteel_axe_craft.ingredients2 keys
Aarcadium_ingot
Ooricalco_rod
shadowsteel_axe_craft
resultshadowsteel_axe
group'shadowsteel'
shadowsteel_pickaxe_craft5 keys
typeshaped
shape[AAA, " O ", " O "]
shadowsteel_pickaxe_craft.ingredients2 keys
Aarcadium_ingot
Ooricalco_rod
shadowsteel_pickaxe_craft
resultshadowsteel_pickaxe
group'shadowsteel'
shadowsteel_shield_craft5 keys
typeshaped
shape[AEA, AAA, " A "]
shadowsteel_shield_craft.ingredients2 keys
Aarcadium_ingot
Eelektron_ingot
shadowsteel_shield_craft
resultshadowsteel_shield
group'shadowsteel'

Darkflame - the smithing table

darkflame_sword_forge3 keys

The first ingredient is the base, the second the addition, the third (optional) the template. Without the third the netherite template applies.

typesmithing
inputs
[shadowsteel_sword, oricalco_rod, NETHERITE_UPGRADE_SMITHING_TEMPLATE]+1
resultdarkflame_sword
darkflame_axe_forge3 keys
typesmithing
inputs
[shadowsteel_axe, oricalco_rod, NETHERITE_UPGRADE_SMITHING_TEMPLATE]+1
resultdarkflame_axe
darkflame_pickaxe_forge3 keys
typesmithing
inputs
[shadowsteel_pickaxe, oricalco_rod, NETHERITE_UPGRADE_SMITHING_TEMPLATE]+1
resultdarkflame_pickaxe

The anvil

elektron_crossbow_anvil4 keys

The anvil is not a Minecraft recipe: it knows how to combine, repair and rename, and that is all. An "anvil recipe" is therefore the plugin that looks at the two slots and decides what to put in the third. For you writing the file it is the same thing; for the server it is not, which is why it does not appear in the recipe book.

typeanvil
inputs[CROSSBOW, elektron_ingot]
resultshadowsteel_crossbow
level-cost12
oricalco_bow_anvil4 keys
typeanvil
inputs[BOW, oricalco_rod]
resultdarkflame_bow
level-cost14

Languages

The texts the plugin shows to players, one file per language.

lang/

Texts and messages
2 files
plugins/ShadowCustomizer/lang/
File notes

ShadowCustomizer - english

Every message the plugin shows to players, one file per language. The keys are not listed one by one: here are the files, how many texts they hold and the placeholders they use.

FileLanguageTexts
lang/en_US.yml reference English 366
lang/it_IT.yml Italiano 366

Most used placeholders

The plugin replaces them with the right value: leave them written as they are.

  • <prefix>
  • <id>
  • <label>
  • <count>
  • <value>
  • <name>
  • <list>
  • <n>
  • <level>
  • <targets>
  • <max>
  • <state>
  • <mobs>
  • <amount>

Message groups

  • prefix 1
  • common 6
  • command 6
  • confirm 6
  • help 11
  • item 34
  • mob 22
  • enchant 22
  • block 8
  • recipe 17
  • diag 7
  • status 8
  • reload 3
  • license 39
  • prompt 2
  • menu 100
  • enchantments 46
  • enchant-target 28

Other

Ready-made content, examples, imports: the files you copy and edit as a model.

blocks/

Custom blocks
2 files
plugins/ShadowCustomizer/blocks/

2 files with the same structure. Below, 2 of them in full, one for each different shape; the others are listed by name.

  • furniture.yml
  • ores.yml

Example blocks/furniture.yml

Furniture - decorative blocks with a shape of their own

File notes

These are the same machinery as the ores next door - a note block underneath, one state each - with one difference that changes what you can build: their model is a Blockbench file, not a cube.

SO A CUSTOM BLOCK IS NOT STUCK BEING A CUBE. A chest, a tombstone, a lamp, a chair: anything you can draw fits in a block model, and the pack draws it in the world exactly as drawn. That is what furniture is here, and it needs nothing beyond what is already in the box.

THE ONE HONEST LIMIT: the block you walk into is still a full note block. A tombstone half a block wide looks half a block wide and collides like a whole one, and it cannot be rotated by placing it from a different side - a note block has no facing. Furniture that needs a real hitbox or free rotation is a different mechanism (display entities), and this plugin does not do it today.

Set 'placeable: false' on an item and it can never be put down; these are the opposite - they exist to be placed.

IN ITALIAN: the Italian version of this file is in esempi/it_IT/blocks/furniture.yml, in the plugin folder. It is not loaded: to use it, copy it over this file, or copy the entries you want.

config-version1
runic_chest9 keys
name'<light_purple>Runic Chest'
lore
["<gray>Decorative. Nothing fits inside.", <dark_gray>Furniture]+1
item-materialCHEST

The material of the item in hand when there is no pack.

model'shadow:runic_chest'
required-toolaxe

A chest breaks with an axe, not with a pickaxe.

drops["runic_chest 1 1 1.0"]
break-sound'block.wood.break'
place-sound'block.wood.place'
runic_chest.on1 key
interact
["sound: block.chest.locked 1 1.4", "particle: ENCHANT 8 0.4"]+1
crypt_tombstone9 keys
name'<gray>Crypt Tombstone'
lore
["<gray>Someone wrote something on it, once.", <dark_gray>Furniture]+1
item-materialSTONE_BRICKS
model'shadow:crypt_tombstone'
required-toolpickaxe
drops["crypt_tombstone 1 1 1.0"]
break-sound'block.deepslate_bricks.break'
place-sound'block.deepslate_bricks.place'
crypt_tombstone.on1 key
interact
["sound: particle.soul_escape 0.7 0.6", "particle: SOUL 10 0.3"]+1

Example blocks/ores.yml

The four ore blocks

How this works, in short. a plugin cannot add blocks to Minecraft

What it can do - and what every plugin that has custom blocks does - is take a vanilla block with many visually identical states and use one of them per custom block. Here it is the note block: 27 instruments times 25 notes, of which 648 are handed out.

Keep reading

WHICH STATE BELONGS TO WHICH BLOCK is recorded in blocks-state.yml. Do not edit it and do not delete it: changing it silently turns the blocks already placed in your worlds into different blocks.

YOUR PLAYERS' OWN NOTE BLOCKS KEEP WORKING. A block is ours because we placed it, not because it has the right note - blocks.track-placed in config.yml. It is why redstone note blocks do not mysteriously stop playing on this server.

Every ore needs a pickaxe: the real block underneath is a note block, and a note block breaks with anything.

IN ITALIAN: the Italian version of this file is in esempi/it_IT/blocks/ores.yml, in the plugin folder. It is not loaded: to use it, copy it over this file, or copy the entries you want.

config-version1
antracite_ore8 keys
name'<gray>Anthracite Ore'
lore["<gray>Black, and heavier than it looks."]
item-materialCOAL_ORE

The material of the item in hand. The block in the world is a note block anyway: this is only how the item looks when there is no resource pack.

model'shadow:antracite_ore'
required-toolpickaxe
drops
["antracite_raw 1 3 1.0", "antracite_raw 1 1 0.15"]+1
break-sound'block.deepslate.break'
place-sound'block.deepslate.place'
3 more entries shaped like config-version: arcadium_ore, elektron_ore, oricalco_ore

items/

Custom items
4 files
plugins/ShadowCustomizer/items/

4 files with the same structure. Below, 4 of them in full, one for each different shape; the others are listed by name.

  • armor.yml
  • heads.yml
  • ores.yml
  • weapons.yml

Example items/armor.yml

Shadowsteel - the armour set

Four pieces

Helmet and chestplate carry a 3D model; leggings and boots are flat images, because the set these came from has no model for those two.

Keep reading

WHAT YOU SEE AND WHAT YOU WEAR ARE TWO DIFFERENT THINGS, and both are covered here. 'model' is the item's model: what you see in the inventory and in your hand. 'equipment' is the worn look: the game stops drawing the model once the armour is ON and lays texture layers over the body instead, and that line says which ones. Take it out and the piece goes back to looking like netherite on your back.

The helmet is the exception: on the head slot the game draws the ITEM'S MODEL, so the 3D helmet is worn exactly as it looks in hand. It is how hats work in resource packs.

Every piece asks for a permission: they are meant as a reward, not as something anyone crafts. Take the line out and everybody can use them.

IN ITALIAN: the Italian version of this file is in esempi/it_IT/items/armor.yml, in the plugin folder. It is not loaded: to use it, copy it over this file, or copy the entries you want.

config-version1
shadowsteel_helmet11 keys
materialNETHERITE_HELMET
name'<gray>Shadowsteel Helmet'
lore
["<dark_gray>Legendary armour", "<gray>Whoever hits you regrets it."]+1
model'shadow:shadowsteel_helmet'
equipment'shadow:shadowsteel'

The worn look. See equipment.yml in the models extension.

tags[armor, shadowsteel]
unbreakabletrue
flags[UNBREAKABLE, ATTRIBUTES]
permissionshadowcustomizer.kit.shadowsteel
shadowsteel_helmet.attributes2 keys
armor4
shadowsteel_helmet.attributes.armor_toughness2 keys
value3
slothead
shadowsteel_helmet.enchantments5 keys
protection6
respiration4
unbreaking5
shadow_thorns3
beacon1
shadowsteel_chestplate12 keys
materialNETHERITE_CHESTPLATE
name'<gray>Shadowsteel Chestplate'
lore
["<dark_gray>Legendary armour", "<gray>It puts you back on your feet when you are hit."]+1
model'shadow:shadowsteel_chestplate'
equipment'shadow:shadowsteel'

The worn look. See equipment.yml in the models extension.

tags[armor, shadowsteel]
unbreakabletrue
flags[UNBREAKABLE, ATTRIBUTES]
permissionshadowcustomizer.kit.shadowsteel
shadowsteel_chestplate.attributes2 keys
armor9
shadowsteel_chestplate.attributes.armor_toughness2 keys
value4
slotchest
shadowsteel_chestplate.enchantments4 keys
protection6
unbreaking5
shadow_thorns4
second_wind2
shadowsteel_chestplate.behaviours1 key
shadowsteel_chestplate.behaviours.take-damage4 keys
chance0.2
cooldown4s
cancelfalse
actions
["damage: 3 on=target", "particle: SOUL 16 0.4", "sound: particle.soul_escape 0.8 0.8"]+1
shadowsteel_leggings11 keys
materialNETHERITE_LEGGINGS
name'<gray>Shadowsteel Leggings'
lore
["<dark_gray>Legendary armour", "<gray>You always move a little faster."]+1
model'shadow:shadowsteel_leggings'
equipment'shadow:shadowsteel'

The worn look. See equipment.yml in the models extension.

tags[armor, shadowsteel]
unbreakabletrue
flags[UNBREAKABLE, ATTRIBUTES]
permissionshadowcustomizer.kit.shadowsteel
shadowsteel_leggings.attributes2 keys
armor7
shadowsteel_leggings.attributes.armor_toughness2 keys
value3
slotlegs
shadowsteel_leggings.enchantments3 keys
protection6
unbreaking5
swiftstep2
shadowsteel_boots11 keys
materialNETHERITE_BOOTS
name'<gray>Shadowsteel Boots'
lore
["<dark_gray>Legendary armour", "<gray>You fall slower than you should."]+1
model'shadow:shadowsteel_boots'
equipment'shadow:shadowsteel'

The worn look. See equipment.yml in the models extension.

tags[armor, shadowsteel]
unbreakabletrue
flags[UNBREAKABLE, ATTRIBUTES]
permissionshadowcustomizer.kit.shadowsteel
shadowsteel_boots.attributes2 keys
armor4
shadowsteel_boots.attributes.armor_toughness2 keys
value3
slotfeet
shadowsteel_boots.enchantments5 keys
protection6
feather_falling4
depth_strider3
unbreaking5
featherfall2
The elytra
shadowsteel_elytra10 keys

An elytra is worn on the chest like a chestplate, so it takes the same two lines - and they still mean two different things.

Keep reading

'model' is the item: what you see in your hand and in the inventory, a real 3D model here.

'equipment' is the wings on your back once it is on. They are their own layer - 'wings' - because the wing geometry is not the body's, and it is the reason an elytra with only a model looks custom in the inventory and vanilla in flight. See equipment.yml in the models extension.

materialELYTRA
name'<light_purple>Shadowsteel Wings'
lore
["<dark_gray>Legendary armour", "<gray>The void under your feet stops being a problem."]+1
model'shadow:shadowsteel_elytra'
equipment'shadow:shadowsteel_wings'

The look in flight: the 'wings' layer, see equipment.yml.

tags[armor, shadowsteel]
unbreakabletrue
flags[UNBREAKABLE, ATTRIBUTES]
permissionshadowcustomizer.kit.shadowsteel
shadowsteel_elytra.enchantments3 keys
unbreaking5
mending1
featherfall3

Example items/weapons.yml

Two weapon sets, ready to use

File notes

SHADOWSTEEL is the balanced set: strong, sober, no tricks beyond a good number. DARKFLAME is the loud one: it burns, it explodes, and it costs durability every time it does.

Every piece here has a 3D model. Without the models extension - or on a server with no resource pack - they still work exactly the same and look like the material they are made of.

ONE THING WORTH READING, because it is the most common mistake with custom items: the moment an item declares one attribute, the material's own modifiers DISAPPEAR. A netherite sword that only says "+2 attack speed" deals one damage. keep-default-attributes: true - the default - puts the material's back before yours, which is what you want here.

Every key is English, and so are the names and the lore.

IN ITALIAN: the Italian version of this file is in esempi/it_IT/items/weapons.yml, in the plugin folder. It is not loaded: to use it, copy it over this file, or copy the entries you want.

config-version1
Shadowsteel
shadowsteel_sword10 keys
materialNETHERITE_SWORD
name'<gray>Shadowsteel Sword'
lore
["<dark_gray>Legendary weapon", "", "<gray>Right click: <white>a leap forward"]+1
model'shadow:shadowsteel_sword'
tags[weapon, shadowsteel]
keep-default-attributestrue
shadowsteel_sword.attributes2 keys
attack_damage4
shadowsteel_sword.attributes.attack_speed3 keys
value-0.2
operationadd_number
slotmainhand
shadowsteel_sword.enchantments5 keys

Enchantments past the vanilla maximum: Sharpness 10, where the game stops at 5. Just write them, and the anvil respects them.

sharpness10
looting4
unbreaking5
bloodthirst3
execution2
shadowsteel_sword
flags[ATTRIBUTES]
shadowsteel_sword.behaviours1 key
shadowsteel_sword.behaviours.right-click3 keys
cooldown6s
durability-cost2
actions
["velocity: 1.5 0.5", "sound: entity.ender_dragon.flap 0.7 1.4", "particle: CLOUD 24 0.4"]+2
11 more entries shaped like config-version: shadowsteel_axe, shadowsteel_pickaxe, shadowsteel_bow, shadowsteel_crossbow, shadowsteel_trident, shadowsteel_shield, darkflame_axe, darkflame_pickaxe, darkflame_bow, ranger_crossbow, darkflame_spear
Darkflame
darkflame_sword9 keys
materialNETHERITE_SWORD
name'<dark_red>Darkflame Sword'
lore
["<dark_gray>Legendary weapon", "", "<gray>Every hit: <white>flames", "<gray>Right click: <white>a wave of fire"]+2
model'shadow:darkflame_sword'
tags[weapon, darkflame]
darkflame_sword.attributes1 key
attack_damage5
darkflame_sword.enchantments5 keys
sharpness10
fire_aspect3
unbreaking5
wildfire3
soulreaper2
darkflame_sword
flags[ATTRIBUTES]
darkflame_sword.behaviours2 keys
darkflame_sword.behaviours.hit-entity2 keys
chance0.4
actions["fire: 80 on=target", "particle: FLAME 12 0.3"]
darkflame_sword.behaviours.right-click3 keys
cooldown12s
durability-cost15

The wear is what keeps a strong ability fair: you can use it, but it costs. Without it, a free right click becomes the only thing anyone holding this weapon ever does.

actions
["damage-nearby: 6 radius=5", "particle: FLAME 60 1.0", "sound: entity.blaze.shoot 1 0.7"]+2
darkflame_shield7 keys
materialSHIELD
name'<dark_red>Darkflame Shield'
lore
["<dark_gray>Legendary defence", "<gray>Whoever hits you gets burnt."]+1
model'shadow:darkflame_shield'
tags[shield, darkflame]
darkflame_shield.enchantments3 keys
unbreaking6
mending1
bulwark2
darkflame_shield.behaviours1 key
darkflame_shield.behaviours.take-damage4 keys
chance0.3
cooldown2s
cancelfalse

On this trigger there is nothing to cancel - the game decides the damage and we answer - and false is already the default.

actions["fire: 60 on=target", "particle: FLAME 14 0.4"]

Example items/ores.yml

The four minerals - raw and refined

File notes

Four minerals, each with three forms: the ore block (in blocks/), the raw drop, and what comes out of the furnace. The recipes that turn one into the other are in recipes/.

Names and lore are written here and every player reads them as they are written. Every key on this page is English.

None of these can be placed: they are made of REDSTONE, QUARTZ and other placeable materials, and a right click on the ground would turn them into that material and take the item away. See 'placeable'.

IN ITALIAN: the Italian version of this file is in esempi/it_IT/items/ores.yml, in the plugin folder. It is not loaded: to use it, copy it over this file, or copy the entries you want.

config-version1
8 more entries shaped like config-version: antracite_raw, antracite_dust, arcadium_raw, arcadium_ingot, elektron_raw, elektron_ingot, oricalco_raw, oricalco_rod

Example items/heads.yml

The heads the bosses wear

File notes

A mob in this plugin is a vanilla mob dressed up: you cannot add entity types to Minecraft, and nobody can. What makes a boss look like a boss instead of a wither skeleton with more health is what it WEARS - and the head slot is the piece that changes the silhouette.

So these are items, with a 3D model, that mobs/mobs.yml puts on a mob's head. You can also hand one to a player: they are ordinary items and they work like any other.

Without a resource pack they look like the material they are made of, and the mob still behaves exactly the same.

IN ITALIAN: the Italian version of this file is in esempi/it_IT/items/heads.yml, in the plugin folder. It is not loaded: to use it, copy it over this file, or copy the entries you want.

config-version1
pumpkin_king_head7 keys
materialCARVED_PUMPKIN
name'<gold>Pumpkin King''s Head'
lore
[<dark_gray>Trophy, "<gray>It still watches, and it does not", "<gray>like what it sees."]+2
model'shadow:pumpkin_king_head'
tags[head, trophy]
placeablefalse

A carved pumpkin can be placed, and placing it would make the item disappear with everything it is. See 'placeable' in ores.yml.

max-stack1
darkflame_helmet9 keys
materialNETHERITE_HELMET
name'<dark_red>Darkflame Helmet'
lore[<dark_gray>Trophy, "<gray>Still warm."]
model'shadow:darkflame_helmet'
tags[head, trophy, darkflame]
unbreakabletrue
flags[UNBREAKABLE, ATTRIBUTES]
darkflame_helmet.attributes1 key
armor3
darkflame_helmet.enchantments3 keys
protection4
fire_protection4
unbreaking5

All the documentation