RepairShop
A Minecraft plugin that turns a Citizens NPC into a blacksmith. Players right-click the NPC and a menu lists every damaged item they are carrying, each priced individually on how worn it is, what it is made of, and what is enchanted on it. Payment goes through Vault.
The interaction model is borrowed from dtlTradersPlus click an NPC, get a shop window but for repairs instead of trades.
What players do
Right-click a blacksmith NPC. The menu shows every damaged item across their main inventory, hotbar, armour slots and offhand, with its remaining durability, its price, and how many times it has been repaired before.
- Repair one item click it.
- Repair everything one button prices the lot. If they cannot afford the total, it repairs cheapest-first, so they get the largest number of items fixed for the money they have.
- Check a price first
/repairshop quoteprices the item in hand and shows the full breakdown;/repairshop priceslists the cost of a full repair for every material tier.
Nothing is a flat fee. A wooden axe at 95% durability costs the 2₽ minimum; the same axe in netherite, enchanted and nearly broken runs past 2,000₽.
What admins get
- Multiple shops. Each NPC points at a shop definition with its own title, price multiplier, permission, accepted tiers and refused materials so a village smith can turn away netherite while a capital-city master smith handles anything at a premium.
- An in-game editor.
/repairshop shopsbrowses, creates and edits shops in a GUI. It writesshops/<id>.ymlwith the same explanatory comments a hand-written file has. Nothing is saved until Save is pressed, and a saved shop is live immediately with no reload. - Rank discounts. Permission-driven multipliers; the cheapest one a player qualifies for wins.
- Per-shop audit logs. Every paid repair appends to
shops/<id>/logs/<date>.logas a fixed-column, pipe-separated table greppable and spreadsheet-friendly. Created by the first paid repair, never before. - Fully configurable text. 179 message keys in
messages.yml, all MiniMessage. Missing keys fall back to the copy bundled in the jar, so a plugin update never breaks an edited file.
How pricing works
Entirely config-driven no numbers are baked into the code. Every term is a key in config.yml.
damageRatio = damage / maxDurability
baseValue = item-values[MATERIAL] OR tiers[TIER]
enchantAdd = SUM( enchantment value * level )
cost = (baseValue * typeMultiplier + enchantAdd)
* damageRatio ^ curve
* shopMultiplier
* rankDiscount
* workPenalty
cost = max(cost, minimum-cost)
The work penalty is the term worth understanding. Plugin repairs bypass vanilla's anvil "Too Expensive" cap entirely, which would let enchanted gear last forever so every repair the plugin has already performed on an item adds a compounding surcharge, +15% per repair, capped at 4×. The count is stored on the item itself.
Supported platforms
The plugin uses no NMS and no CraftBukkit internals at all nothing below the Bukkit API. That is what makes it portable across forks: there are no server internals for a fork to change out from under it.
| Platform | Support |
|---|---|
| Paper | Full. The native target developed, tuned and boot-tested here. |
| Purpur, Pufferfish, Leaf and other Paper forks | Full. They keep the entire Paper API. |
| Spigot | Full features, with two automatic downgrades see below. |
| CraftBukkit | Same as Spigot. |
| Mohist, Arclight, CatServer, Ketting (Forge/Fabric hybrids) | Should work they implement the Bukkit API, and nothing here reaches below it. Untested, and hybrids are flakier in general. |
On Spigot and CraftBukkit two things resolve differently. Both are detected at startup and need no configuration:
- Text Spigot has never shipped Adventure, so MiniMessage is rendered through the built-in
legacy
§translator instead. Colours, hex and the five decorations all survive; gradients collapse to their first colour, and hover/click text is dropped while keeping its contents. - Chat prompts
AsyncPlayerChatEventis used instead of Paper'sAsyncChatEvent.
/repairshop compat reports which route the running server took.
Not supported
- Folia Folia's regionised threading removes
Bukkit.getScheduler(), which this plugin uses for chat-prompt timeouts, reopening menus and async log writes. Folia also refuses to load plugins that do not declarefolia-supported: true, so it fails cleanly rather than misbehaving. Supporting it would mean porting those call sites to Folia's schedulers and auditing the "everything runs on the main thread" assumption the repair flow is built on. - BungeeCord / Velocity proxies, not Bukkit servers.
- Vanilla, Forge or Fabric without a Bukkit bridge no Bukkit API at all.
Supported Minecraft versions
One jar runs on Minecraft 1.9 through 26.2. The plugin works out at startup which flavour of
each moved-around API the server has, always by asking whether a class or method exists rather
than by parsing a version string which matters, because Minecraft moved to year-based versioning
in 2026, so comparing 1.21 against 26.2 is actively wrong.
api-version is pinned at 1.13: the oldest value any modern server accepts, and a key that
1.9–1.12 ignore entirely. That, plus compiling to Java 8 bytecode, is what lets a single jar cover
the whole range.
What changes on older servers:
| Full version | Elsewhere | |
|---|---|---|
| MiniMessage gradients, hover, click | Paper 1.16.5+ | Legacy § codes; colours and decorations survive |
| The work penalty | 1.14+ | Inactive. It needs the persistent data container to store a per-item repair count; below 1.14 there is nowhere to keep one, so every repair is priced as a first repair. The console says so once at startup. |
| Per-item max durability | 1.20.5+ | The material's value is used, which is the only answer those versions have |
| Enchanted-glint buttons | 1.20.5+ | The older hidden-enchantment trick. Looks identical. |
Comments in shops/*.yml |
1.18.1+ | Same values, header kept, per-key notes omitted |
| GUI titles over 32 characters | 1.13+ | Trimmed to fit, never mid-colour-code |
Material and enchantment names are handled rather than degraded: config files are read in both the
pre- and post-flattening vocabularies, so one file prices GOLDEN_AXE and GOLD_AXE, or
DIG_SPEED and efficiency, as the same thing.
Requirements
| Server | Minecraft 1.9 – 26.2, on any Bukkit-API implementation (see above) |
| Java | Whatever your server already needs the jar is Java 8 bytecode, which every later JVM loads, so it adds no requirement of its own |
| Required | Vault plus any economy provider (EssentialsX is the tested one) |
| Optional | Citizens without it the NPC trait is unavailable and /repairshop open still works |
If no Vault economy provider is registered, the plugin logs an error and disables itself, since it has no way to charge for anything.
Commands and permissions
/repairshop, aliases /rshop and /repairnpc.
| Command | Does | Permission |
|---|---|---|
/repairshop help |
Help page, showing only what the sender may run | |
/repairshop quote [shop] |
Price the item in hand, with the full breakdown | repairshop.quote (default: true) |
/repairshop prices |
Cost of a full repair for every material tier | repairshop.quote (default: true) |
/repairshop shops |
Browse, create and edit shops in a GUI | repairshop.admin (default: op) |
/repairshop create|edit|delete <shop> |
Manage one shop | repairshop.admin |
/repairshop assign <shop> / unassign |
Turn the selected NPC into a repair shop, or stop it being one | repairshop.admin |
/repairshop open [shop] [player] |
Open a shop menu | repairshop.admin |
/repairshop list |
List the configured shops | repairshop.admin |
/repairshop compat |
Show how this server's API differences were resolved | repairshop.admin |
/repairshop reload |
Reload config, messages and shops | repairshop.admin |
Opening a shop from an NPC needs repairshop.use (default: true).
EssentialsX owns /repair (plus fix, efix, erepair), and RepairShop deliberately does not
claim it.
Setup
Drop Vault, an economy provider, Citizens and RepairShop-<version>.jar into plugins/, start
the server, then:
/npc create Blacksmith
/repairshop assign default
That is the whole setup.
See CHANGELOG.md for release history. The project home at
C:\Coding\Java\Repair Shop Plugin carries the full documentation set
docs/PRICING.md, docs/CONFIGURATION.md, docs/ARCHITECTURE.md, docs/BUILDING.md and
docs/COMPATIBILITY.md.

