Skip to content

Data potions

Lyof429 edited this page Jan 17, 2026 · 5 revisions

< Back to homepage


The way potions work in vanilla is, to me, lacking. So let's tweak it to hell and back. And because I know nobody will agree on what I did is good, you can tweak it to your heart's content.

tl;dr All potions last for longer, stack to 8 and are faster to drink, but go on a short cooldown after being used.

Configuration

Some general changes affecting all potions.

  • brewing.potion.stack_size

Positive integer. How many potions can be held in a single slot (they must contain the same effects to be stackable).

  • brewing.potion.duration_multiplier *

Number to multiply all (all) potions' durations by. Only effects gained from potions will last longer.

Keep in mind this also affects negative effect tipped arrows, so refrain from making it too high (unless you are changing these in another way).

  • brewing.potion.drinking_time

Positive integer. How many ticks potions take to drink (20t = 1s).

  • brewing.potion.cooldown

Positive integer. How many ticks potions go on a cooldown after drinking or throwing (20t = 1s).

Structure

The options explained above are nice, sure. But what beats being able to change all these values for individual potions?

By making a datapack and adding files to the potions/ folder, you can add select overrides, change a potion's effects, and add custom textures for certain potions. This system even allows you to register entirely new potions at runtime.

{
  "potion": potionid,
  "effects": Array,
  "drinking_time": int,
  "cooldown": int,
  "create": boolean
}

  • potion

The id of the potion to be modified. If it doesn't exist and create is true, will register it as a new potion.

  • effects

A list of effects this potion should give. If unset, the potion's effects will not be changed.

Each element of this array must be of the form

{
    "effect": effectid,
    "amplifier": int,
    "duration": int (in ticks)
}
  • drinking_time

Positive integer. Defaults to brewing.potion.drinking_time. Defines a custom drinking time for this potion.

  • cooldown

Positive integer. Defaults to brewing.potion.cooldown. Defines a custom cooldown for this potion.

  • create

Boolean. Defaults to false.

Assets

So yes, changing how potions act is good. But while we are at it, why not be able to change how they look too?

When rendering, potion items containing modid:potionid will attempt to look for a model and texture in assets/<modid>/models/potions/<potionid>.json.

This model must be a valid item model json file.

For splash/lingering potions, the model will be searched in the subfolder splash/lingering.

For example, the potion item containing minecraft:long_poison will look for assets/minecraft/models/potions/long_poison.json, while the splash potion item containing that same potion will look for assets/minecraft/models/potions/splash/long_posion.json

If such a model exists and is found, it will be used in place of the default vanilla one.

And of course, this all works with custom data driven potions.


Additionally, long and strong potion variants have a built in model change. It is used only if no override described above is found.

Texture Demo

Clone this wiki locally