Skip to content

Poções

Poções são consumíveis que concedem efeitos a uma entidade. Um jogador pode preparar poções usando um Suporte de Poções ou obtê-las como itens através de várias outras mecânicas do jogo.

Poções Personalizadas

Adicionar uma poção é um processo similar ao de adicionar um item. Você criará uma instância de sua poção e a registrará chamando BrewingRecipeRegistry.registerPotionRecipe.

INFO

Quando o Fabric API está presente, BrewingRecipeRegistry.registerPotionRecipe se torna acessível através de um Acess Widener.

Criando a Poção

Vamos começar declarando um campo para armazenar sua instância de Potion. Utilizaremos a classe inicializadora diretamente para segurar isso.

java
public static final Potion TATER_POTION =
		Registry.register(
				Registries.POTION,
				new Identifier("fabric-docs-reference", "tater"),
				new Potion(
						new StatusEffectInstance(
								FabricDocsReferenceEffects.TATER_EFFECT,
								3600,
								0)));

Passamos uma instância de StatusEffectInstance, que leva 3 parâmetros:

  • StatusEffect type - Um efeito. Usamos nosso efeito personalizado aqui. Você também pode acessar efeitos vanilla através de net.minecraft.entity.effect.StatusEffects.
  • int duration - Duração do efeito em ticks do jogo.
  • int amplifier - Um amplificador para o efeito. Por exemplo, Pressa II teria um amplificador de 1.

INFO

Para criar seu próprio efeito, consulte o guia de Efeitos.

Registrando a Poção

No nosso inicializador, chamamos BrewingRecipeRegistry.registerPotionRecipe.

java
BrewingRecipeRegistry.registerPotionRecipe(Potions.WATER, Items.POTATO, TATER_POTION);

registerPotionRecipe leva 3 parâmetros:

  • Potion input - A poção inicial. Normalmente isso pode ser uma Garrafa de Água ou uma Poção Estranha.
  • Item item - O item que é o ingrediente principal da poção.
  • Potion output - A poção resultante.

Se você usa a Fabric API, o invocador de mixin não é necessário e uma chamada direta do BrewingRecipeRegistry.registerPotionRecipe pode ser feita.

O exemplo completo:

java
public class FabricDocsReferencePotions implements ModInitializer {
	public static final Potion TATER_POTION =
			Registry.register(
					Registries.POTION,
					new Identifier("fabric-docs-reference", "tater"),
					new Potion(
							new StatusEffectInstance(
									FabricDocsReferenceEffects.TATER_EFFECT,
									3600,
									0)));

	@Override
	public void onInitialize() {
		BrewingRecipeRegistry.registerPotionRecipe(Potions.WATER, Items.POTATO, TATER_POTION);

		// Use the mixin invoker if you are not using Fabric API
		// BrewingRecipeRegistryInvoker.invokeRegisterPotionRecipe(Potions.WATER, Items.POTATO, TATER_POTION);
	}
}

Assim que registrada, você pode preparar uma poção Tater usando uma batata.

Efeito no inventário do jogador

Registrando Poções usando um Ingredient

Com ajuda do Fabric API, é possível registrar uma poção usando um Ingredient em vez de um Item usando net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.

Registrando a Poção Sem o Fabric API

Sem o Fabric API, BrewingRecipeRegistry.registerPotionRecipe será privado. Para acessar este método, use o seguinte invocador de mixin ou use um Acess Widener.

java
@Mixin(BrewingRecipeRegistry.class)
public interface BrewingRecipeRegistryInvoker {
	@Invoker("registerPotionRecipe")
	static void invokeRegisterPotionRecipe(Potion input, Item item, Potion output) {
		throw new AssertionError();
	}
}