
PotionCombine
Shapeless, UI-free potion brewing inside vanilla water cauldrons. No GUIs, no NMS.
📖About PotionCombine
PotionCombine
A water cauldron. A handful of ingredients. A bit of patience. That's the whole plugin.
Shapeless potion brewing in vanilla cauldrons — no GUI, no NMS.
Paper 1.20.4 – 1.21.x · Java 17
Every "advanced brewing" plugin I tried felt like a spreadsheet wearing a wizard hat. So I built the one I actually
wanted.
You shift-click stuff into a cauldron, the cauldron does its thing, you walk away with a potion. No menus to design
around, no brewing-stand timers to babysit, no NMS hacks waiting to break on the next Paper update. The plugin uses
only the public Paper API, so it survives Mojang's minor updates without a recompile. If you've ever wanted a brewing
system that feels like it belongs in vanilla — not bolted on with command blocks — you're in the right place.
How it actually plays
Plop down a vanilla cauldron, fill it with water, and hold an ingredient. Shift + left-click to toss it in;
recipes are shapeless, so order never matters — only what's inside. Want something back? Shift + right-click
pulls the last thing you added, LIFO, like an undo stack.
Stop adding, and after a short grace period the cauldron decides what to do:
- matches a recipe exactly → brewing starts, with bubbles, particles, and a live progress bar floating over the water;
- on the way to a recipe but not there yet → the brew fails, and your ingredients sink as alchemical sludge;
- nothing matches at all → same fate, faster.
When the brew finishes, a glowing potion bottle hovers and slowly spins above the cauldron. Right-click to grab
it. Don't dawdle, though — leave it sitting too long and it spoils into whatever you've set (or just evaporates, your
call).
Cauldrons that talk to each other
This is the part you'll actually show your players. Turn synergy on and a finished brew stops waiting to be
carried by hand — it pours itself straight into the cauldron beside it, the one loaded with the rest of a higher-tier
recipe and waiting on exactly that bottle.
Brew a Phoenix Elixir in one cauldron. Load ghast tear and glowstone dust into the cauldron next door, one
ingredient short of a Phoenix Crown. Walk away. The elixir flows over, the Crown starts on its own. The downstream
cauldron even waits for its neighbour to finish instead of failing as "incomplete," so you're not standing there
timing the hand-off. And the matcher knows the difference between a healing potion and the elixir you brewed three
minutes ago — nobody's substituting a vanilla bottle.
A block under the cauldron matters
Stand a cauldron over a campfire, magma block, or pool of lava and that heat speeds the brew up — and softens the
spoil-roll from accumulated grime. Defaults are sane (campfire a small win, lava the most generous), and the whole
list lives in the config. Flip on area heat and the search widens past the single block underneath, so a ring of
lava around the base beats one block under it.
Cauldrons get dirty (if you want them to)
Every brew leaves a little residue; failures and spoiled brews leave a lot more. Past a threshold the cauldron refuses
new ingredients until you right-click it with a brush to scrub it down. A clean cauldron behaves exactly like it
always did; a filthy one tells you so. It's off by default — switch it on when you actually want brewing to have
consequences.
Make it yours
The recipe schema is small on purpose. Each ingredient is either a vanilla item, a specific potion variant, or
another of your own recipes — that last one is how chains exist. No conditions, no scripting, no quest tags.
phoenix_crown:
display_name: "&e&lPhoenix Crown"
brew_time_ticks: 320
color: "#ffd24a"
ingredients:
- { recipe: phoenix_elixir } # a finished potion as an ingredient
- { material: GHAST_TEAR }
- { material: GLOWSTONE_DUST, amount: 2 }
effects:
- { type: FIRE_RESISTANCE, duration: 9600, amplifier: 0 }
- { type: STRENGTH, duration: 3600, amplifier: 1 }
And everything else is a single line in the config — most of it shipped off by default so a fresh install just
brews:
# PotionCombine 1.2.0 — every feature is a toggle
# settings — language, cooldowns, world filter, notifications
# brewing — timings, sludge and spoil materials, break-stage drops
# automation — hopper auto-extract
# heat — heat sources under (and around) the cauldron
# synergy — multi-cauldron brewing chains (off by default)
# sounds — every sound key the plugin plays
# display — visuals, progress bar template, particle bursts
# pollution — grime mechanic (off by default)
# cleaning — brush rules for the pollution mechanic
There's a table of contents at the top of the file, so you're never grepping for a section name.
Commands
Aliases: /pc and /pcombine. Tab-completion works for player names and recipe IDs.
| Command | What it does |
|---|---|
/pc help |
the cheat sheet |
/pc info |
version, recipe count, active brews, PAPI hook state |
/pc reload |
reload config, recipes & locale on the fly (active brews left alone on purpose) |
/pc give <player> <recipe_id> [amount] |
hand out a finished custom potion — handy for testing chains |
What you need
- Paper 1.20.4 → 1.21.x. No NMS, no shaded libraries, no reflection.
- Java 17. Same as Paper itself.
- Spigot / CraftBukkit are not supported — the plugin relies on Adventure, MiniMessage and display entities. Run
real Paper. - PlaceholderAPI is optional. If it's on the server, the expansion registers itself. If it isn't, nothing happens.
For developers
A small, stable public API — events (BrewStartEvent, BrewSuccessEvent, BrewFailEvent, BrewCollectEvent,
BrewChainEvent, PollutionChangeEvent) plus a static PotionCombineAPI facade. Nothing in those packages gets a
breaking change across 1.x patches.
Permissions are the obvious three: potioncombine.use (default true), potioncombine.admin and
potioncombine.cooldown.bypass (both op).
Open-source, MIT. Built because every "advanced brewing" plugin I'd tried felt like a spreadsheet in a wizard hat —
this one tries to feel like brewing.
Bug reports, recipe ideas, and "this broke because…" messages all welcome.