Frostyh

Arcana

Twelve real custom enchantments in the enchanting table, plus wands, spell foods, glider capes and hats. No mods, no resource pack.

Price
Coming soon
Runs on
Paper, Java 21
Version
v1.0.0

Read the docs

Arcana coverComing soon

In game

See it on a real server

5 screenshots and a short clip, all taken on a real server. Click a screenshot to see it full size.

Clip
Arcana: enchanting table veinminer
Arcana: sword tooltip
Arcana: veinminer after
Arcana: spell shrink
Arcana: book enchantments

01 / 06

Overview

Custom enchantments that are real enchantments. They show up in the enchanting table, combine on anvils and glow like vanilla ones, and nobody needs a mod or a resource pack.

Most custom enchant plugins fake it: a line of lore, a menu of their own, an enchanting table that ignores them. Arcana registers its twelve enchantments in the game's own enchantment registry before the worlds load, the same way Mojang adds one. So a player gets Lifesteal from the enchanting table, finds a Veinminer book in a dungeon chest, buys Telekinesis from a librarian and combines them on an anvil, and the tooltip, the glint and the level numerals are all vanilla.

On top of that, Arcana adds wands, spell foods, glider capes and hats built from Minecraft's new item components, and physics spells that change a player's size, gravity and jump for a while.

In short

  • Real enchantments: in the enchanting table, loot chests, villager trades and anvils, with the vanilla glint and tooltip
  • Twelve balanced enchantments that players actually want: Veinminer, Timber, Telekinesis, Lifesteal, Magnet and more
  • Wands with a real cooldown sweep, spell foods you can eat on a full stomach, capes that glide like an elytra
  • Spells that change size, gravity and jumping, with hard limits so a typo can never break a player
  • Nothing to install for players, and nothing to host: no resource pack, no mod
Latest version
1.0.0
Runs on
Paper or Purpur, Java 21
BuiltByBit
Coming soon
What changed in 1.0.0
  • Twelve real enchantments registered in the game's enchantment registry: Lifesteal, Frostbite, Thunderstrike, Veinminer, Excavator, Timber, Telekinesis, Harvester, Magnet, Swiftness, Leaping and Soulbound. They appear in the enchanting table, loot chests and villager trades and combine on anvils.
  • Wands with a real cooldown, spell foods, glider capes and hats, all built from vanilla item components, with recipes.
  • Six physics spells (Gust, Shrink, Giant, Moonwalk, Stride, Phoenix) with hard safety limits; running spells survive a relog or restart and still end on time.
  • Rune ring effects made of display entities, and item pictures in chat for /arcana show, crafting and enchanting.
  • The Arcana book: dialog windows for enchantments, items and spells, with admin buttons.
  • Registry settings (enchantment on/off, name, max level, rarity, where it appears) need a full restart; everything else reloads with /arcana reload.

Features

  1. 01The twelve enchantments

    • Lifesteal I to III (swords, axes): heals you for part of the damage you deal, capped per hit
    • Frostbite I to II (swords, axes): a chance to slow and chill what you hit
    • Thunderstrike I to III (swords, axes): a chance to call lightning for extra damage, no fire; never on the same weapon as Frostbite
    • Veinminer I to III (pickaxes): mining one ore mines the connected vein, up to 8, 16 or 32 blocks
    • Excavator I to II (shovels): digs a 3x3 or 5x5 square
    • Timber I (axes): fells the whole tree, and leaves log walls in houses alone
    • Telekinesis I (tools): drops go straight into your inventory
    • Harvester I to II (hoes): ripe crops replant themselves; level II harvests the 3x3 around; young crops are protected
    • Magnet I to III (leggings): pulls nearby items to you
    • Swiftness I to II (leggings): faster walking; level II steps up full blocks
    • Leaping I to III (boots): higher jumps, softer landings
    • Soulbound I (anything with durability, treasure only): the item stays with you when you die

    Area enchantments work while standing; sneak to break a single block. Every break goes through the normal break event, so claim and protection plugins protect the whole vein too, and the tool wears down as usual.

  2. 02What you get

    • Registry enchantments: name, max level, rarity and where each one appears (table, loot, trades) set in config.yml
    • Wands: right click casts a spell, then the client draws the vanilla cooldown sweep over the item
    • Spell foods: eaten with their own animation and time, even when full, and cast their spell when finished
    • Glider capes: worn in the chest slot, glide like an elytra and show the wings, with durability you choose
    • Hats: any item made wearable on the head
    • Physics spells: Shrink, Giant, Moonwalk, Gust, Stride, Phoenix, or your own, built from size, gravity, jump strength, step height, speed and potion effects
    • Spell effects: a ring of glowing runes and a spinning book around the caster, made of display entities
    • Item pictures in chat: /arcana show, crafting an Arcana item and pulling an Arcana enchantment all post the item with its real picture and full tooltip on hover
    • Recipes for every item, in the recipe book, all editable
    • The Arcana book: native dialog windows listing every enchantment, item and spell, with admin buttons for books, items and test casts
    • Every word is yours: all messages and labels in config.yml, in MiniMessage, with one colour theme

Installation

Requirements

Server
Paper, or a Paper fork such as Purpur. Spigot and CraftBukkit won't work, because it uses Paper-only APIs.
Minecraft
plugin.yml api-version 1.21.11; built against Paper API 1.21.11
Java
21 or newer
Needs
No other plugin
Works with
Nothing optional

Steps

  1. Download Arcana.jar from BuiltByBit. There's no licence key to enter.
  2. Stop the server and put the jar in the plugins folder.
  3. Start the server. The plugin writes plugins/Arcana/config.yml with the defaults listed under Configuration.
  4. Change config.yml to fit your server.
  5. Run /arcana reload (read config.yml again) to apply your changes, or restart the server.

Setup guide

  1. Drop Arcana.jar into /plugins and restart the server (a full restart, not /reload).
  2. Open /arcana to see what is there. Enchant a book at the enchanting table and you will meet them.
  3. Optional: switch enchantments off, rename them or change their rarity in config.yml, then restart.

Commands

Straight from plugin.yml. Where the permission column says "not set", plugin.yml puts no permission on the command itself; the nodes the plugin checks are under Permissions.

CommandAliasesUsageWhat it doesPermission
/arcana/magic /arc/arcanaOpen the Arcana book: enchantments, items and spells. Registered in code, not in plugin.yml.not set

Every subcommand

/arcana                                  The Arcana book.
/arcana enchants | items | spells        A page of the book.
/arcana show                             Show the held item in chat.
/arcana give <player> <item> [amount]    Give an Arcana item.
/arcana book <enchant> [level] [player]  Give an enchanted book.
/arcana enchant <enchant> [level]        Put an enchantment on the held item (0 removes it).
/arcana cast <spell> [player]            Cast a spell (admin test).
/arcana end <spell> [player]             End a running spell.
/arcana reload                           Read config.yml again.

Permissions

From plugin.yml.

NodeDefaultWhat it allowsIncludes
arcana.useeveryoneOpen the Arcana book and read the enchantments, items and spells.none
arcana.casteveryoneCast spells with wands and spell foods.none
arcana.showeveryoneShow the held Arcana item in chat with its picture.none
arcana.giveoperatorsGive Arcana items and enchanted books.none
arcana.enchantoperatorsPut an Arcana enchantment on the held item at any level.none
arcana.adminoperatorsReload the config and use every admin button.arcana.use arcana.cast arcana.show arcana.give arcana.enchant

Placeholders

This plugin doesn't add any PlaceholderAPI placeholders.

Configuration

The default files exactly as they ship in the jar, comments included. The plugin writes them to plugins/Arcana/ the first time it starts.

config.yml

KeyDefaultThe comment above it
config-version1none
themesection, 12 keysnone
menusection, 1 keynone
chatsection, 3 keysnone
effectssection, 5 keysnone
recipessection, 1 keynone
disabled-worlds[] (empty list)Worlds where no spell can be cast (wands and spell foods do nothing there).
spell-limitssection, 8 keys███ ███ ████ █ █ █ ███ █ █ ███ ███ ███ █ █ █ █ █ █ █ █ ██ ██ █ █ █ ██ ███ ███ █ █ █ █ █ █ █ █ █ ██
enchantmentssection, 13 keys████ █ █ ███ █ █ ██ █ █ ███ █ █ ████ █ █ ███ ███ █ ██ █ █ █ █ █ █ ██ █ █ ██ ██ █ ██ █ █ █ ███ █ ██ █ ████ ████ █ ██ █ █ █ █ ███ █ ██ █ ██ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ████ █ █ ███ █ █ █ █ █ █ █ █ █ ████ █ █ █ ███ Twelve real enchantments. They...
spellssection, 6 keys███ ███ ████ █ █ ███ █ █ █ █ █ █ █ ██ ███ ███ █ █ ██
itemssection, 11 keys███ ███ ████ █ █ ███ █ █ █ ██ ██ █ █ █ ███ █ █ █ ██ █ █ █ █ █ █ ███ █ ████ █ █ ███ Built from vanilla item components, no resource pack:
messagessection, 109 keys█ █ ████ ███ ███ ██ ███ ████ ███ ██ ██ █ █ █ █ █ █ █ █ █ █ █ ███ ██ ██ ████ █ ██ ███ ██ █ █ █ █ █ █ █ █ █ █ █ █ █ ████ ███ ███ █ █ ███ ████ ███ Every word the plugin says. {placeholders} are filled in. An emptied message is switched off.
plugins/Arcana/config.yml644 lines
#  ██  ███   ███  ██  █  █  ██
# █  █ █  █ █    █  █ ██ █ █  █
# ████ ███  █    ████ █ ██ ████
# █  █ █ █  █    █  █ █  █ █  █
# █  █ █  █  ███ █  █ █  █ █  █
#
#  Arcana by Frostyh: magic without mods or a resource pack.
#  /arcana opens the book: the enchantments, the items and the spells.
#
#  Two kinds of setting live in this file:
#    LIVE settings (effects, chances, items, spells, messages) follow /arcana reload.
#    REGISTRY settings (the first block of each enchantment: enabled, name, max-level, weight,
#    in-enchanting-table, in-loot-chests, in-villager-trades) need a FULL SERVER RESTART. Paper
#    freezes the enchantment registry when the server starts, so /reload, /arcana reload and
#    plugin managers cannot add, remove or resize an enchantment. Each registry line says so.
#
#  Colours: messages use named tags (<accent>, <text>, <muted>, <value>, <good>, <warn>, <bad>)
#  that resolve to the theme below. Plain MiniMessage works everywhere too.

config-version: 1

#  ███ ████ █  █ ████ ███   ██  █
# █    █    ██ █ █    █  █ █  █ █
# █ ██ ███  █ ██ ███  ███  ████ █
# █  █ █    █  █ █    █ █  █  █ █
#  ███ ████ █  █ ████ █  █ █  █ ████
#  Look, sounds, the book's width, chat and the rune effects.

theme:
  accent: "#b48cff"
  accent2: "#e2d4ff"
  title: "#f4f1ff"
  text: "#cfc8e6"
  muted: "#7c7398"
  value: "#ffffff"
  good: "#7be0a3"
  warn: "#ffc857"
  bad: "#ff6b6b"
  # One quiet sound per button and action, played to that player only.
  sounds: true
  # Item pictures in menus and chat (Minecraft 1.21.9 and newer draw them; older clients show nothing).
  item-icons: true
  # The small font for menu text. Off: it reads worse in long menus.
  small-caps: false

menu:
  # Width of the text in the book, in pixels (200 to 1024).
  width: 320

chat:
  # /arcana show: seconds between two shows per player (admins skip it).
  show-cooldown-seconds: 10
  # Who sees a shown item: 0 = the whole server, otherwise players within this many blocks.
  show-range: 0
  # Tell everyone when someone pulls a treasure or max-level Arcana enchantment from the table.
  announce-rare-enchants: true

effects:
  # The rune ring and spinning book around a player who casts a spell.
  enabled: true
  # Rings running at the same time on the whole server; more are skipped, never queued.
  max-at-once: 24
  # Runes per ring (3 to 16).
  runes: 8
  # How long a ring lasts, in ticks (20 = one second).
  lifetime-ticks: 50
  # The small enchanted book above the caster's head.
  book: true

recipes:
  # Give every player the Arcana recipes in their recipe book when they join.
  unlock-on-join: true

# Worlds where no spell can be cast (wands and spell foods do nothing there).
disabled-worlds: []

#  ███ ███  ████ █    █       █    ███ █   █ ███ ███  ███
# █    █  █ █    █    █       █     █  ██ ██  █   █  █
#  ██  ███  ███  █    █       █     █  █ █ █  █   █   ██
#    █ █    █    █    █       █     █  █   █  █   █     █
# ███  █    ████ ████ ████    ████ ███ █   █ ███  █  ███
#  Hard limits on what any spell may do to a body, whatever a spell below says. The values are
#  the resulting multiplier: scale-min 0.4 means a spell can never make a player smaller than
#  40 percent of their normal size.
spell-limits:
  scale-min: 0.4
  scale-max: 1.5
  gravity-min: 0.25
  gravity-max: 2.0
  jump-max: 2.0
  speed-max: 1.6
  # Extra blocks of step height (normal is 0.6).
  step-extra-max: 1.5
  # Extra blocks of fall before damage (normal is 3).
  safe-fall-extra-max: 20

# ████ █  █  ███ █  █  ██  █  █ ███ █   █ ████ █  █ ███  ███
# █    ██ █ █    █  █ █  █ ██ █  █  ██ ██ █    ██ █  █  █
# ███  █ ██ █    ████ ████ █ ██  █  █ █ █ ███  █ ██  █   ██
# █    █  █ █    █  █ █  █ █  █  █  █   █ █    █  █  █     █
# ████ █  █  ███ █  █ █  █ █  █  █  █   █ ████ █  █  █  ███
#  Twelve real enchantments. They appear in the enchanting table, combine on anvils, come out of
#  loot chests and villager trades and show the vanilla glint. Put them on items with books from
#  the table, or /arcana book <enchant> [level] [player].
#
#  REGISTRY lines (restart): enabled, name, max-level, weight (1 rare to 10 common),
#  in-enchanting-table, in-loot-chests, in-villager-trades.
#  Everything else in a section is LIVE.
#
#  CAREFUL: switching off an enchantment (or removing Arcana) after players have it means it no
#  longer exists on the next start, and items carrying it can lose it. Back up your worlds first.
enchantments:
  area-tools:
    # Veinminer, Excavator, Timber and Harvester II stop before the tool drops to this durability,
    # so an area break never destroys a good tool by surprise.
    stop-at-durability: 5

  lifesteal:
    enabled: true            # restart
    name: "Lifesteal"        # restart
    max-level: 3             # restart
    weight: 2                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "Heals you for part of the damage you deal."
    heal-percent-per-level: 4
    # The most health one hit can give back (2.0 = one heart).
    max-heal-per-hit: 4.0
    particles: true

  frostbite:
    enabled: true            # restart
    name: "Frostbite"        # restart
    max-level: 2             # restart
    weight: 3                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "A chance to slow and chill what you hit. Never on the same weapon as Thunderstrike."
    chance-per-level: 20
    slow-seconds-per-level: 1.5
    slowness-level: 2
    # Powder snow freezing added per proc (140 ticks starts the freeze damage).
    freeze-ticks: 80

  thunderstrike:
    enabled: true            # restart
    name: "Thunderstrike"    # restart
    max-level: 3             # restart
    weight: 1                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "A chance to call lightning on a hit: extra damage, no fire."
    chance-per-level: 4
    bonus-damage-per-level: 1.5
    cooldown-seconds: 3
    affects-players: true

  veinminer:
    enabled: true            # restart
    name: "Veinminer"        # restart
    max-level: 3             # restart
    weight: 2                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "Mining one ore mines the whole connected vein."
    # Extra ores per level (I, II, III).
    blocks-per-level: [8, 16, 32]
    # standing: works unless sneaking (sneak to mine one block). sneaking: only while sneaking. always.
    activation: standing

  excavator:
    enabled: true            # restart
    name: "Excavator"        # restart
    max-level: 2             # restart
    weight: 2                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "Digs a 3x3 (I) or 5x5 (II) square with a shovel."
    # 1 = 3x3, 2 = 5x5.
    radius-per-level: [1, 2]
    activation: standing

  timber:
    enabled: true            # restart
    name: "Timber"           # restart
    max-level: 1             # restart
    weight: 3                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "Chopping one log fells the whole tree."
    max-logs: 96
    # A tree needs at least this many natural leaves, so a log wall in a house is never felled.
    min-natural-leaves: 6
    activation: standing

  telekinesis:
    enabled: true            # restart
    name: "Telekinesis"      # restart
    max-level: 1             # restart
    weight: 3                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "Drops go straight into your inventory. Tools only; full inventory drops the rest."
    # Also collect mob drops when the killing blow is made with the tool.
    mob-drops: true

  harvester:
    enabled: true            # restart
    name: "Harvester"        # restart
    max-level: 2             # restart
    weight: 5                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "Ripe crops replant themselves. Level II harvests the 3x3 around."
    # Right click a ripe crop to harvest and replant it.
    right-click-harvest: true
    # A hoe with Harvester never breaks a crop that is not ripe yet.
    protect-young-crops: true

  magnet:
    enabled: true            # restart
    name: "Magnet"           # restart
    max-level: 3             # restart
    weight: 4                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "Leggings that pull nearby items to you."
    radius-per-level: [3, 5, 7]
    pull-speed: 0.35

  swiftness:
    enabled: true            # restart
    name: "Swiftness"        # restart
    max-level: 2             # restart
    weight: 3                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "Leggings that make you walk faster. Level II also steps up full blocks."
    speed-percent-per-level: 6
    step-height-at-level-2: 0.4

  leaping:
    enabled: true            # restart
    name: "Leaping"          # restart
    max-level: 3             # restart
    weight: 4                # restart
    in-enchanting-table: true
    in-loot-chests: true
    in-villager-trades: true
    description: "Boots that jump higher and fall softer."
    jump-percent-per-level: 10
    safe-fall-blocks-per-level: 1

  soulbound:
    enabled: true            # restart
    name: "Soulbound"        # restart
    max-level: 1             # restart
    weight: 1                # restart
    # Treasure: never in the enchanting table, only loot chests, trades and books.
    in-enchanting-table: false
    in-loot-chests: true
    in-villager-trades: true
    description: "The item stays with you when you die. Never on the same item as Curse of Vanishing."
    # True: the enchantment is used up when it saves the item (one save per enchant).
    used-up-on-death: true

#  ███ ███  ████ █    █     ███
# █    █  █ █    █    █    █
#  ██  ███  ███  █    █     ██
#    █ █    █    █    █       █
# ███  █    ████ ████ ████ ███
#  Physics spells: timed changes to how a player's body works, using vanilla attributes, so the
#  client draws them itself (a shrunk player really is small). Wands and spell foods cast them.
#
#  body: (offsets; the limits above always win)
#    scale: -0.5 = half size, 0.4 = 1.4x       gravity: -0.6 = 40 percent gravity
#    jump-strength: 0.5 = 1.5x jump            movement-speed: 0.15 = 15 percent faster
#    step-height: 1.0 = one extra block        safe-fall-distance: 10 = ten more blocks
#  potion-effects: "effect level" for the spell's whole duration, e.g. "slow_falling 1".
#  push-forward / push-up: a shove when cast (-3 to 3).
#  A running spell is stored on the player: it survives a relog or a restart and still ends on time.
spells:
  gust:
    name: "<#9fe7ff>Gust</#9fe7ff>"
    description: "A burst of wind throws you forward; you float down slowly."
    duration-seconds: 6
    cooldown-seconds: 0
    body:
      gravity: -0.6
      safe-fall-distance: 12
    push-forward: 1.3
    push-up: 0.7
    ring-colour: "#9fe7ff"
    sound: "minecraft:entity.breeze.wind_burst"

  shrink:
    name: "<#c58bff>Shrink</#c58bff>"
    description: "Half size: fit through one-block gaps, harder to hit."
    duration-seconds: 30
    cooldown-seconds: 0
    body:
      scale: -0.5
    ring-colour: "#c58bff"
    sound: "minecraft:entity.illusioner.mirror_move"

  giant:
    name: "<#ffb35c>Giant</#ffb35c>"
    description: "Grow to one and a half times your size and step over blocks."
    duration-seconds: 20
    cooldown-seconds: 0
    body:
      scale: 0.5
      step-height: 0.5
    ring-colour: "#ffb35c"
    sound: "minecraft:block.beacon.power_select"

  moonwalk:
    name: "<#e2e8ff>Moonwalk</#e2e8ff>"
    description: "Low gravity and high jumps, like walking on the moon."
    duration-seconds: 25
    cooldown-seconds: 0
    body:
      gravity: -0.7
      jump-strength: 0.4
      safe-fall-distance: 15
    ring-colour: "#e2e8ff"
    sound: "minecraft:block.amethyst_block.resonate"

  stride:
    name: "<#7be0a3>Stride</#7be0a3>"
    description: "Walk faster and step straight up full blocks."
    duration-seconds: 60
    cooldown-seconds: 0
    body:
      step-height: 0.5
      movement-speed: 0.15
    ring-colour: "#7be0a3"
    sound: "minecraft:entity.horse.gallop"

  phoenix:
    name: "<#ff7a4d>Phoenix</#ff7a4d>"
    description: "Fire cannot touch you for a minute."
    duration-seconds: 60
    cooldown-seconds: 0
    potion-effects:
      - "fire_resistance 1"
    ring-colour: "#ff7a4d"
    sound: "minecraft:item.firecharge.use"

# ███ ███ ████ █   █  ███
#  █   █  █    ██ ██ █
#  █   █  ███  █ █ █  ██
#  █   █  █    █   █    █
# ███  █  ████ █   █ ███
#  Built from vanilla item components, no resource pack:
#    wand  right click casts its spell, then recharges (the client draws the cooldown sweep)
#    food  eaten even on a full stomach, casts its spell when finished
#    cape  worn in the chest slot, glides like an elytra and shows the wings
#    hat   any item worn on the head
#  name and lore are MiniMessage. recipe: up to three rows of three; a space is an empty slot.
#  Items keep working when renamed here: they are recognised by an id stored on the item.
items:
  wind_wand:
    type: wand
    material: BREEZE_ROD
    name: "<#9fe7ff>Wand of Wind</#9fe7ff>"
    lore:
      - "<muted>Right click: Gust."
    spell: gust
    cooldown-seconds: 8
    recipe:
      shape: [" W ", " A ", " B "]
      ingredients: {W: WIND_CHARGE, A: AMETHYST_SHARD, B: BREEZE_ROD}

  shrinking_wand:
    type: wand
    material: AMETHYST_SHARD
    name: "<#c58bff>Shrinking Wand</#c58bff>"
    lore:
      - "<muted>Right click: Shrink."
    spell: shrink
    cooldown-seconds: 45
    recipe:
      shape: [" A ", " E ", " S "]
      ingredients: {A: AMETHYST_SHARD, E: ENDER_PEARL, S: STICK}

  giant_staff:
    type: wand
    material: BLAZE_ROD
    name: "<#ffb35c>Giant's Staff</#ffb35c>"
    lore:
      - "<muted>Right click: Giant."
    spell: giant
    cooldown-seconds: 60
    recipe:
      shape: [" G ", " B ", " B "]
      ingredients: {G: GOLD_BLOCK, B: BLAZE_ROD}

  moon_staff:
    type: wand
    material: END_ROD
    name: "<#e2e8ff>Moon Staff</#e2e8ff>"
    lore:
      - "<muted>Right click: Moonwalk."
    spell: moonwalk
    cooldown-seconds: 40
    recipe:
      shape: [" P ", " E ", " S "]
      ingredients: {P: PHANTOM_MEMBRANE, E: END_ROD, S: STICK}

  shrinking_cookie:
    type: food
    material: COOKIE
    name: "<#c58bff>Shrinking Cookie</#c58bff>"
    lore:
      - "<muted>Eat: Shrink."
    spell: shrink
    eat-seconds: 0.8
    animation: eat
    nutrition: 2
    recipe:
      shape: ["CAC"]
      ingredients: {C: COOKIE, A: AMETHYST_SHARD}

  moon_bread:
    type: food
    material: BREAD
    name: "<#e2e8ff>Moon Bread</#e2e8ff>"
    lore:
      - "<muted>Eat: Moonwalk."
    spell: moonwalk
    eat-seconds: 1.2
    animation: eat
    nutrition: 4
    recipe:
      shape: ["BPB"]
      ingredients: {B: BREAD, P: PHANTOM_MEMBRANE}

  stride_stew:
    type: food
    material: RABBIT_STEW
    name: "<#7be0a3>Stride Stew</#7be0a3>"
    lore:
      - "<muted>Eat: Stride."
    spell: stride
    eat-seconds: 1.6
    animation: eat
    nutrition: 6
    recipe:
      shape: ["SRS"]
      ingredients: {S: SUGAR, R: RABBIT_STEW}

  phoenix_pepper:
    type: food
    material: BLAZE_POWDER
    name: "<#ff7a4d>Phoenix Pepper</#ff7a4d>"
    lore:
      - "<muted>Eat: Phoenix."
    spell: phoenix
    eat-seconds: 1.0
    animation: eat
    nutrition: 1
    recipe:
      shape: ["BMB"]
      ingredients: {B: BLAZE_POWDER, M: MAGMA_CREAM}

  glider_cape:
    type: cape
    material: PHANTOM_MEMBRANE
    name: "<#b48cff>Glider Cape</#b48cff>"
    lore:
      - "<muted>Wear it in the chest slot and glide."
    # Uses before it breaks (an elytra has 432). 0 = never breaks.
    durability: 432
    glint: true
    # Gliding changes a survival server; switch the recipe off to keep capes admin-only.
    recipe:
      enabled: true
      shape: ["MBM", "MDM", "M M"]
      ingredients: {M: PHANTOM_MEMBRANE, B: BREEZE_ROD, D: DIAMOND_BLOCK}

  sunflower_crown:
    type: hat
    material: SUNFLOWER
    name: "<#ffd75e>Sunflower Crown</#ffd75e>"
    lore:
      - "<muted>Wear it on your head."
    recipe:
      shape: ["SGS"]
      ingredients: {S: SUNFLOWER, G: GOLD_INGOT}

  lantern_hat:
    type: hat
    material: LANTERN
    name: "<#ffcf7a>Lantern Hat</#ffcf7a>"
    lore:
      - "<muted>Wear it on your head."
    recipe:
      shape: ["ILI"]
      ingredients: {I: IRON_NUGGET, L: LANTERN}

# █   █ ████  ███  ███  ██   ███ ████  ███
# ██ ██ █    █    █    █  █ █    █    █
# █ █ █ ███   ██   ██  ████ █ ██ ███   ██
# █   █ █       █    █ █  █ █  █ █       █
# █   █ ████ ███  ███  █  █  ███ ████ ███
#  Every word the plugin says. {placeholders} are filled in. An emptied message is switched off.
messages:
  prefix: "<accent>Arcana</accent> <muted>|</muted> "
  no-permission: "<bad>You do not have permission for that."
  players-only: "<bad>Only a player can do that."
  usage: "<text>/arcana <muted>[enchants|items|spells|show|help]</muted>"
  usage-give: "<text>/arcana give <value><player> <item> [amount]"
  usage-book: "<text>/arcana book <value><enchant> [level] [player]"
  usage-enchant: "<text>/arcana enchant <value><enchant> [level]</value> <muted>(level 0 removes it)"
  usage-cast: "<text>/arcana cast|end <value><spell> [player]"
  reloaded: "<good>Reloaded. Enchantment registry changes still need a restart."
  player-not-found: "<bad>No player online named <value>{player}</value>."
  item-not-found: "<bad>No Arcana item called <value>{item}</value>."
  enchant-not-found: "<bad>No Arcana enchantment <value>{enchant}</value> is active."
  spell-not-found: "<bad>No spell called <value>{spell}</value>."
  bad-number: "<bad>That is not a number."
  given: "<good>Gave <value>{amount}x</value> {item} <good>to <value>{player}</value>."
  given-self: "<good>You got {item}<good>."
  book-given: "<good>Gave a <value>{enchant} {level}</value> book to <value>{player}</value>."
  enchant-added: "<good>Added <value>{enchant} {level}</value> to the item in your hand."
  enchant-removed: "<good>Removed <value>{enchant}</value> from the item in your hand."
  spell-cast: "<text>{spell} <muted>for {seconds}s"
  spell-ended: "<muted>{spell} <muted>wore off."
  spell-cooldown: "<warn>{spell} <warn>is ready in <value>{seconds}s</value>."
  spell-world-off: "<warn>Spells do not work in this world."
  spell-cast-on: "<good>Cast {spell} <good>on <value>{player}</value>."
  spell-ended-by: "<good>Ended {spell} <good>for <value>{player}</value>."
  spell-not-running: "<warn>{spell} <warn>is not running on <value>{player}</value>."
  wand-empty: "<warn>This wand has no spell set in the config."
  show-empty: "<warn>Hold an item first."
  show-cooldown: "<warn>You can show another item in <value>{seconds}s</value>."
  # The item (its picture, name and tooltip on hover) is added at the end of these two.
  show-item: "<accent>{player}</accent> <text>shows "
  crafted: "<good>You crafted "
  enchant-pulled: "<text>The magic took: <accent>{enchant} {level}</accent>"
  enchant-pulled-all: "<accent>{player}</accent> <text>pulled <accent>{enchant} {level}</accent> <text>from the table!"
  soulbound-kept: "<good>Soulbound kept <value>{count}</value> item(s) safe. You get them back when you respawn."
  soulbound-kept-used: "<good>Soulbound kept <value>{count}</value> item(s) safe and was used up. You get them back when you respawn."

  # ---- the book ----
  home-title: "<title>Arcana"
  home-intro: "<text>Magic without mods. Real enchantments, wands, spell foods, capes and hats, all made from vanilla Minecraft."
  home-counts: "<value>{enchants}</value> <muted>enchantments</muted>  <value>{items}</value> <muted>items</muted>  <value>{spells}</value> <muted>spells</muted>"
  home-running: "<text>Running on you: {list}"
  running-entry: "<accent>{spell}</accent> <muted>{seconds}s</muted>"
  list-separator: "<muted>, </muted>"
  btn-enchants: "<white><icon:enchant></white>Enchantments"
  btn-enchants-tip: "What each enchantment does and where it goes."
  btn-items: "<white><icon:wand></white>Items"
  btn-items-tip: "Wands, spell foods, capes and hats."
  btn-spells: "<white><icon:spell></white>Spells"
  btn-spells-tip: "Every spell and what it does to you."
  btn-show: "<white><icon:chat></white>Show held item"
  btn-show-tip: "Show the item in your hand in chat, picture and all."
  btn-help: "<white><icon:help></white>Help"
  btn-help-tip: "Commands and how to get everything."
  btn-books: "<white><icon:book></white>Enchanted books"
  btn-books-tip: "Admin: take a max-level book of any enchantment."
  btn-reload: "<white><icon:reload></white>Reload"
  btn-reload-tip: "Reload the config. Registry changes still need a restart."
  btn-home: "<white><icon:back></white>Back"
  btn-home-tip: "Back to the start."
  btn-back: "<white><icon:back></white>Back"
  btn-back-tip: "Back one page."
  btn-close: "Close"
  btn-book: "{icon}{name} {level}"
  btn-book-tip: "Put the book in your inventory."
  btn-give: "{icon}{name}"
  btn-give-tip: "Admin: put one in your inventory."
  btn-cast: "Cast {name}"
  btn-cast-tip: "Admin: cast it on yourself to try it."

  enchants-title: "<title>Enchantments"
  enchants-intro: "<text>Real enchantments: they come from the enchanting table, books, loot chests and villagers, and combine on anvils."
  enchant-row: "{icon}<accent>{name}</accent> <muted>I to {max}  {items}  {source}</muted><newline><text>{description}"
  enchant-row-off: "{icon}<muted><st>{name}</st> switched off on this server"
  source-table: "table"
  source-treasure: "treasure only"
  where-lifesteal: "swords, axes"
  where-frostbite: "swords, axes"
  where-thunderstrike: "swords, axes"
  where-veinminer: "pickaxes"
  where-excavator: "shovels"
  where-timber: "axes"
  where-telekinesis: "pickaxes, axes, shovels, hoes"
  where-harvester: "hoes"
  where-magnet: "leggings"
  where-swiftness: "leggings"
  where-leaping: "boots"
  where-soulbound: "anything with durability"
  books-title: "<title>Enchanted books"
  books-intro: "<text>Each button puts a max-level book in your inventory. Combine it with an item on an anvil."

  items-title: "<title>Items"
  items-intro: "<text>Craft them (see your recipe book) or ask an admin. Hover an item for its tooltip."
  items-none: "<muted>No items are set up in the config."
  item-row: "{name}<newline><text>{what}"
  kind-wand: "Wand: right click casts {spell}<text>, then recharges for {seconds}s."
  kind-food: "Spell food: eat it to cast {spell}<text>, even when full."
  kind-cape: "Cape: wear it in the chest slot and glide like an elytra."
  kind-hat: "Hat: wear it on your head."
  no-spell: "<muted>nothing"

  spells-title: "<title>Spells"
  spells-intro: "<text>Spells change how your body works for a while. They end on time, even if you log out."
  spell-row: "<accent>{name}</accent> <muted>{seconds}s</muted><newline><text>{description}<newline><muted>{changes}"
  spell-row-running: "<accent>{name}</accent> <good>running</good> <muted>{seconds}s</muted><newline><text>{description}<newline><muted>{changes}"
  spell-has-effects: "{count} potion effect(s)"
  body-scale: "size {percent}%"
  body-gravity: "gravity {percent}%"
  body-jump: "jump {percent}%"
  body-speed: "speed {percent}%"
  body-step: "+{blocks} step height"
  body-fall: "+{blocks} blocks safe fall"

  help-title: "<title>Help"
  help-lines:
    - "<accent>/arcana</accent> <text>opens this book."
    - "<accent>/arcana show</accent> <text>shows the item in your hand in chat."
    - "<text>Enchantments come from the <value>enchanting table</value>, books in <value>loot chests</value> and <value>villager trades</value>. Combine books on an anvil."
    - "<text>Area enchantments (Veinminer, Excavator, Timber) work while standing. <value>Sneak</value> to break a single block."
    - "<text>Every item has a recipe in your <value>recipe book</value>."
  help-admin-lines:
    - "<accent>/arcana give</accent> <text>player item [amount]"
    - "<accent>/arcana book</accent> <text>enchant [level] [player]"
    - "<accent>/arcana enchant</accent> <text>enchant [level] on the held item (0 removes it)"
    - "<accent>/arcana cast | end</accent> <text>spell [player]"
    - "<accent>/arcana reload</accent> <text>reloads everything except the enchantment registry"

FAQ

Which servers and versions does it run on?

It needs Paper or a Paper fork like Purpur, because it uses Paper-only APIs (the dialog API for its menus, Adventure text components). Spigot and CraftBukkit won't work. plugin.yml declares api-version 1.21.11, the jar is built against Paper API 1.21.11, and it needs Java 21 or newer.

Does it need other plugins?

No, it runs without any other plugin (plugin.yml has no hard dependencies).

How do I apply config changes?

Edit plugins/Arcana/config.yml and run /arcana reload (read config.yml again). Restarting works too.

Does it run on Folia, or for Bedrock players?

I haven't tested it on Folia, and plugin.yml doesn't declare folia-supported. I haven't tested Bedrock players through Geyser either.

Why does changing an enchantment need a restart?

Because it is a real enchantment. Paper freezes the enchantment registry when the server starts, so switching one on or off, renaming it, or changing its max level or rarity takes effect on the next full start. Effect numbers, chances, items, spells and messages reload live with /arcana reload.

Does it work with /reload or plugin managers?

Not for the enchantments, for the reason above. Restart the server instead.

What happens to enchanted items if I remove the plugin or switch an enchantment off?

The enchantment stops existing on the next start, so items that carry it can lose it when the server loads them. Back up your worlds before removing Arcana or switching off an enchantment your players already have.

Will Veinminer get around my claims?

No. Every extra block is broken through the same event a normal break uses, so a protected block stays protected.

Is there DRM or a licence key?

No. There is nothing to activate and no licence server to reach, and the code is not obfuscated.

Get it

Not on sale yet

Arcana is finished and waiting for its BuiltByBit listing. This page gets a buy button the day it goes up.

Ask about it on Discord

Also mine

Run a Discord too?

ZeroBot is my Discord bot: moderation, tickets, welcome messages, logs, backups and raid protection, all set up from a web dashboard. It's free to add; Premium plans unlock more.

Its Minecraft Link connects your server to your Discord through the free ZeroBot Link plugin (coming to Modrinth soon): a live status card, a chat bridge, join and death lines, and account linking. Outgoing HTTPS only, no port to open.

See ZeroBot

Custom work

Need something that isn't here? I make custom Paper plugins, change these ones to fit your server, and do server setup and config work. Small plugins start at 50 EUR; bigger jobs get a quote.

How commissions work