predicate, @NotNull EquipmentSlot example) {
+ return new EquipmentSlotGroup(key, predicate, example);
+ }
+}
diff --git a/paper-api/src/main/java/org/bukkit/inventory/ItemRarity.java b/paper-api/src/main/java/org/bukkit/inventory/ItemRarity.java
new file mode 100644
index 0000000000..e7931f73f1
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/inventory/ItemRarity.java
@@ -0,0 +1,25 @@
+package org.bukkit.inventory;
+
+/**
+ * A item's rarity determines the default color of its name. This enum is
+ * ordered from least rare to most rare.
+ */
+public enum ItemRarity {
+
+ /**
+ * White item name.
+ */
+ COMMON,
+ /**
+ * Yellow item name.
+ */
+ UNCOMMON,
+ /**
+ * Aqua item name.
+ */
+ RARE,
+ /**
+ * Light purple item name.
+ */
+ EPIC;
+}
diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/BannerMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/BannerMeta.java
index 4739d2ecc2..64ddcba57d 100644
--- a/paper-api/src/main/java/org/bukkit/inventory/meta/BannerMeta.java
+++ b/paper-api/src/main/java/org/bukkit/inventory/meta/BannerMeta.java
@@ -1,32 +1,11 @@
package org.bukkit.inventory.meta;
import java.util.List;
-import org.bukkit.DyeColor;
import org.bukkit.block.banner.Pattern;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
public interface BannerMeta extends ItemMeta {
- /**
- * Returns the base color for this banner
- *
- * @return the base color
- * @deprecated banner color is now stored as the data value, not meta.
- */
- @Deprecated
- @Nullable
- DyeColor getBaseColor();
-
- /**
- * Sets the base color for this banner
- *
- * @param color the base color
- * @deprecated banner color is now stored as the data value, not meta.
- */
- @Deprecated
- void setBaseColor(@Nullable DyeColor color);
-
/**
* Returns a list of patterns on this banner
*
diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/BookMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/BookMeta.java
index d14f725734..1be27b04c5 100644
--- a/paper-api/src/main/java/org/bukkit/inventory/meta/BookMeta.java
+++ b/paper-api/src/main/java/org/bukkit/inventory/meta/BookMeta.java
@@ -1,15 +1,14 @@
package org.bukkit.inventory.meta;
-import java.util.List;
import org.bukkit.Material;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
- * Represents a book ({@link Material#WRITABLE_BOOK} or {@link
- * Material#WRITTEN_BOOK}) that can have a title, an author, and pages.
+ * Represents a {@link Material#WRITTEN_BOOK}) that can have a title, an author,
+ * and pages.
*/
-public interface BookMeta extends ItemMeta {
+public interface BookMeta extends WritableBookMeta {
/**
* Represents the generation (or level of copying) of a written book
@@ -111,77 +110,6 @@ public interface BookMeta extends ItemMeta {
*/
void setGeneration(@Nullable Generation generation);
- /**
- * Checks for the existence of pages in the book.
- *
- * @return true if the book has pages
- */
- boolean hasPages();
-
- /**
- * Gets the specified page in the book. The given page must exist.
- *
- * Pages are 1-indexed.
- *
- * @param page the page number to get, in range [1, getPageCount()]
- * @return the page from the book
- */
- @NotNull
- String getPage(int page);
-
- /**
- * Sets the specified page in the book. Pages of the book must be
- * contiguous.
- *
- * The data can be up to 1024 characters in length, additional characters
- * are truncated.
- *
- * Pages are 1-indexed.
- *
- * @param page the page number to set, in range [1, getPageCount()]
- * @param data the data to set for that page
- */
- void setPage(int page, @NotNull String data);
-
- /**
- * Gets all the pages in the book.
- *
- * @return list of all the pages in the book
- */
- @NotNull
- List getPages();
-
- /**
- * Clears the existing book pages, and sets the book to use the provided
- * pages. Maximum 100 pages with 1024 characters per page.
- *
- * @param pages A list of pages to set the book to use
- */
- void setPages(@NotNull List pages);
-
- /**
- * Clears the existing book pages, and sets the book to use the provided
- * pages. Maximum 100 pages with 1024 characters per page.
- *
- * @param pages A list of strings, each being a page
- */
- void setPages(@NotNull String... pages);
-
- /**
- * Adds new pages to the end of the book. Up to a maximum of 100 pages with
- * 1024 characters per page.
- *
- * @param pages A list of strings, each being a page
- */
- void addPage(@NotNull String... pages);
-
- /**
- * Gets the number of pages in the book.
- *
- * @return the number of pages in the book
- */
- int getPageCount();
-
@Override
@NotNull
BookMeta clone();
diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/Damageable.java b/paper-api/src/main/java/org/bukkit/inventory/meta/Damageable.java
index 61ae4cba01..ff6818b6d9 100644
--- a/paper-api/src/main/java/org/bukkit/inventory/meta/Damageable.java
+++ b/paper-api/src/main/java/org/bukkit/inventory/meta/Damageable.java
@@ -1,6 +1,7 @@
package org.bukkit.inventory.meta;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* Represents an item that has durability and can take damage.
@@ -28,6 +29,29 @@ public interface Damageable extends ItemMeta {
*/
void setDamage(int damage);
+ /**
+ * Checks to see if this item has a maximum amount of damage.
+ *
+ * @return true if this has maximum amount of damage
+ */
+ boolean hasMaxDamage();
+
+ /**
+ * Gets the maximum amount of damage.
+ *
+ * Plugins should check {@link #hasMaxDamage()} before calling this method.
+ *
+ * @return the maximum amount of damage
+ */
+ int getMaxDamage();
+
+ /**
+ * Sets the maximum amount of damage.
+ *
+ * @param maxDamage maximum amount of damage
+ */
+ void setMaxDamage(@Nullable Integer maxDamage);
+
@NotNull
@Override
Damageable clone();
diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/ItemMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
index 9f159ac909..255f79d5bc 100644
--- a/paper-api/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
+++ b/paper-api/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
@@ -11,6 +11,8 @@ import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemFlag;
+import org.bukkit.inventory.ItemRarity;
+import org.bukkit.inventory.meta.components.FoodComponent;
import org.bukkit.inventory.meta.tags.CustomItemTagContainer;
import org.bukkit.persistence.PersistentDataHolder;
import org.jetbrains.annotations.ApiStatus;
@@ -50,11 +52,47 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
*/
void setDisplayName(@Nullable String name);
+ /**
+ * Checks for existence of an item name.
+ *
+ * Item name differs from display name in that it is cannot be edited by an
+ * anvil, is not styled with italics, and does not show labels.
+ *
+ * @return true if this has an item name
+ */
+ boolean hasItemName();
+
+ /**
+ * Gets the item name that is set.
+ *
+ * Item name differs from display name in that it is cannot be edited by an
+ * anvil, is not styled with italics, and does not show labels.
+ *
+ * Plugins should check that hasItemName() returns true
before
+ * calling this method.
+ *
+ * @return the item name that is set
+ */
+ @NotNull
+ String getItemName();
+
+ /**
+ * Sets the item name.
+ *
+ * Item name differs from display name in that it is cannot be edited by an
+ * anvil, is not styled with italics, and does not show labels.
+ *
+ * @param name the name to set
+ */
+ void setItemName(@Nullable String name);
+
/**
* Checks for existence of a localized name.
*
* @return true if this has a localized name
+ * @deprecated meta no longer exists
*/
+ @Deprecated(forRemoval = true)
boolean hasLocalizedName();
/**
@@ -64,15 +102,19 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
* before calling this method.
*
* @return the localized name that is set
+ * @deprecated meta no longer exists
*/
@NotNull
+ @Deprecated(forRemoval = true)
String getLocalizedName();
/**
* Sets the localized name.
*
* @param name the name to set
+ * @deprecated meta no longer exists
*/
+ @Deprecated(forRemoval = true)
void setLocalizedName(@Nullable String name);
/**
@@ -231,6 +273,22 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
*/
boolean hasItemFlag(@NotNull ItemFlag flag);
+ /**
+ * Gets if this item has hide_tooltip set. An item with this set will not
+ * show any tooltip whatsoever.
+ *
+ * @return hide_tooltip
+ */
+ boolean isHideTooltip();
+
+ /**
+ * Sets if this item has hide_tooltip set. An item with this set will not
+ * show any tooltip whatsoever.
+ *
+ * @param hideTooltip new hide_tooltip
+ */
+ void setHideTooltip(boolean hideTooltip);
+
/**
* Return if the unbreakable tag is true. An unbreakable item will not lose
* durability.
@@ -246,6 +304,120 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
*/
void setUnbreakable(boolean unbreakable);
+ /**
+ * Gets if an enchantment_glint_override is set.
+ *
+ * @return if an enchantment_glint_override is set
+ */
+ boolean hasEnchantmentGlintOverride();
+
+ /**
+ * Sets the enchantment_glint_override. If true, the item will glint, even
+ * without enchantments; if false, the item will not glint, even with
+ * enchantments.
+ *
+ * Plugins should check {@link #hasEnchantmentGlintOverride()} before
+ * calling this method.
+ *
+ * @return enchantment_glint_override
+ */
+ @NotNull
+ Boolean getEnchantmentGlintOverride();
+
+ /**
+ * Sets the enchantment_glint_override. If true, the item will glint, even
+ * without enchantments; if false, the item will not glint, even with
+ * enchantments. If null, the override will be cleared.
+ *
+ * @param override new enchantment_glint_override
+ */
+ void setEnchantmentGlintOverride(@Nullable Boolean override);
+
+ /**
+ * Checks if this item is fire_resistant. If true, it will not burn in fire
+ * or lava.
+ *
+ * @return fire_resistant
+ */
+ boolean isFireResistant();
+
+ /**
+ * Sets if this item is fire_resistant. If true, it will not burn in fire
+ * or lava.
+ *
+ * @param fireResistant fire_resistant
+ */
+ void setFireResistant(boolean fireResistant);
+
+ /**
+ * Gets if the max_stack_size is set.
+ *
+ * @return if a max_stack_size is set.
+ */
+ boolean hasMaxStackSize();
+
+ /**
+ * Gets the max_stack_size. This is the maximum amount which an item will
+ * stack.
+ *
+ * @return max_stack_size
+ */
+ int getMaxStackSize();
+
+ /**
+ * Sets the max_stack_size. This is the maximum amount which an item will
+ * stack.
+ *
+ * @param max max_stack_size, between 1 and 99 (inclusive)
+ */
+ void setMaxStackSize(@Nullable Integer max);
+
+ /**
+ * Gets if the rarity is set.
+ *
+ * @return rarity
+ */
+ boolean hasRarity();
+
+ /**
+ * Gets the item rarity.
+ *
+ * Plugins should check {@link #hasRarity()} before calling this method.
+ *
+ * @return rarity
+ */
+ @NotNull
+ ItemRarity getRarity();
+
+ /**
+ * Sets the item rarity.
+ *
+ * @param rarity new rarity
+ */
+ void setRarity(@Nullable ItemRarity rarity);
+
+ /**
+ * Checks if the food is set.
+ *
+ * @return if a food is set
+ */
+ boolean hasFood();
+
+ /**
+ * Gets the food set on this item, or creates an empty food instance.
+ *
+ * @return food
+ */
+ @NotNull
+ FoodComponent getFood();
+
+ /**
+ * Sets the item food.
+ *
+ * @param food new food
+ */
+ void setFood(@Nullable FoodComponent food);
+
/**
* Checks for the existence of any AttributeModifiers.
*
diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/OminousBottleMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/OminousBottleMeta.java
new file mode 100644
index 0000000000..43f0df04f3
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/inventory/meta/OminousBottleMeta.java
@@ -0,0 +1,37 @@
+package org.bukkit.inventory.meta;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Represents a map that can be scalable.
+ */
+public interface OminousBottleMeta extends ItemMeta {
+
+ /**
+ * Checks for the presence of an amplifier.
+ *
+ * @return true if a customer amplifier is applied
+ */
+ boolean hasAmplifier();
+
+ /**
+ * Gets the amplifier amount for an Ominous Bottle's bad omen effect.
+ *
+ * Plugins should check that hasAmplifier() returns true before calling this
+ * method.
+ *
+ * @return amplifier
+ */
+ int getAmplifier();
+
+ /**
+ * Sets the amplifier amount for an Ominous Bottle's bad omen effect.
+ *
+ * @param amplifier between 0 and 4
+ */
+ void setAmplifier(int amplifier);
+
+ @Override
+ @NotNull
+ OminousBottleMeta clone();
+}
diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/PotionMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/PotionMeta.java
index 1113c40fb3..b94ac6266f 100644
--- a/paper-api/src/main/java/org/bukkit/inventory/meta/PotionMeta.java
+++ b/paper-api/src/main/java/org/bukkit/inventory/meta/PotionMeta.java
@@ -2,7 +2,6 @@ package org.bukkit.inventory.meta;
import java.util.List;
import org.bukkit.Color;
-import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
@@ -14,40 +13,28 @@ import org.jetbrains.annotations.Nullable;
*/
public interface PotionMeta extends ItemMeta {
- /**
- * Sets the underlying potion data
- *
- * @param data PotionData to set the base potion state to
- * @deprecated Upgraded / extended potions are now their own {@link PotionType} use {@link #setBasePotionType} instead.
- */
- @Deprecated
- void setBasePotionData(@NotNull PotionData data);
-
- /**
- * Returns the potion data about the base potion
- *
- * @return a PotionData object
- * @deprecated Upgraded / extended potions are now their own {@link PotionType} use {@link #getBasePotionType()} instead.
- */
- @NotNull
- @Deprecated
- PotionData getBasePotionData();
-
/**
* Sets the underlying potion type
*
* @param type PotionType to set the base potion state to
*/
- void setBasePotionType(@NotNull PotionType type);
+ void setBasePotionType(@Nullable PotionType type);
/**
* Returns the potion type about the base potion
*
* @return a PotionType object
*/
- @NotNull
+ @Nullable
PotionType getBasePotionType();
+ /**
+ * Checks for the presence of a base potion type
+ *
+ * @return true if a base potion type is present
+ */
+ boolean hasBasePotionType();
+
/**
* Checks for the presence of custom potion effects.
*
diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/WritableBookMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/WritableBookMeta.java
new file mode 100644
index 0000000000..1259553608
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/inventory/meta/WritableBookMeta.java
@@ -0,0 +1,87 @@
+package org.bukkit.inventory.meta;
+
+import java.util.List;
+import org.bukkit.Material;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Represents a book ({@link Material#WRITABLE_BOOK} or {@link
+ * Material#WRITTEN_BOOK}) that can have pages.
+ */
+public interface WritableBookMeta extends ItemMeta {
+
+ /**
+ * Checks for the existence of pages in the book.
+ *
+ * @return true if the book has pages
+ */
+ boolean hasPages();
+
+ /**
+ * Gets the specified page in the book. The given page must exist.
+ *
+ * Pages are 1-indexed.
+ *
+ * @param page the page number to get, in range [1, getPageCount()]
+ * @return the page from the book
+ */
+ @NotNull
+ String getPage(int page);
+
+ /**
+ * Sets the specified page in the book. Pages of the book must be
+ * contiguous.
+ *
+ * The data can be up to 1024 characters in length, additional characters
+ * are truncated.
+ *
+ * Pages are 1-indexed.
+ *
+ * @param page the page number to set, in range [1, getPageCount()]
+ * @param data the data to set for that page
+ */
+ void setPage(int page, @NotNull String data);
+
+ /**
+ * Gets all the pages in the book.
+ *
+ * @return list of all the pages in the book
+ */
+ @NotNull
+ List getPages();
+
+ /**
+ * Clears the existing book pages, and sets the book to use the provided
+ * pages. Maximum 100 pages with 1024 characters per page.
+ *
+ * @param pages A list of pages to set the book to use
+ */
+ void setPages(@NotNull List pages);
+
+ /**
+ * Clears the existing book pages, and sets the book to use the provided
+ * pages. Maximum 100 pages with 1024 characters per page.
+ *
+ * @param pages A list of strings, each being a page
+ */
+ void setPages(@NotNull String... pages);
+
+ /**
+ * Adds new pages to the end of the book. Up to a maximum of 100 pages with
+ * 1024 characters per page.
+ *
+ * @param pages A list of strings, each being a page
+ */
+ void addPage(@NotNull String... pages);
+
+ /**
+ * Gets the number of pages in the book.
+ *
+ * @return the number of pages in the book
+ */
+ int getPageCount();
+
+ @Override
+ @NotNull
+ WritableBookMeta clone();
+}
diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/components/FoodComponent.java b/paper-api/src/main/java/org/bukkit/inventory/meta/components/FoodComponent.java
new file mode 100644
index 0000000000..8b9f2f1ac4
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/inventory/meta/components/FoodComponent.java
@@ -0,0 +1,130 @@
+package org.bukkit.inventory.meta.components;
+
+import java.util.List;
+import org.bukkit.configuration.serialization.ConfigurationSerializable;
+import org.bukkit.potion.PotionEffect;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Represents a component which can turn any item into food.
+ */
+@ApiStatus.Experimental
+public interface FoodComponent extends ConfigurationSerializable {
+
+ /**
+ * Gets the food restored by this item when eaten.
+ *
+ * @return nutrition value
+ */
+ int getNutrition();
+
+ /**
+ * Sets the food restored by this item when eaten.
+ *
+ * @param nutrition new nutrition value, must be non-negative
+ */
+ void setNutrition(int nutrition);
+
+ /**
+ * Gets the saturation restored by this item when eaten.
+ *
+ * @return saturation value
+ */
+ float getSaturationModifier();
+
+ /**
+ * Sets the saturation restored by this item when eaten.
+ *
+ * @param saturationModifier new saturation value
+ */
+ void setSaturationModifier(float saturationModifier);
+
+ /**
+ * Gets if this item can be eaten even when not hungry.
+ *
+ * @return true if always edible
+ */
+ boolean canAlwaysEat();
+
+ /**
+ * Sets if this item can be eaten even when not hungry.
+ *
+ * @param canAlwaysEat whether always edible
+ */
+ void setCanAlwaysEat(boolean canAlwaysEat);
+
+ /**
+ * Gets the time in seconds it will take for this item to be eaten.
+ *
+ * @return eat time
+ */
+ float getEatSeconds();
+
+ /**
+ * Sets the time in seconds it will take for this item to be eaten.
+ *
+ * @param eatSeconds new eat time
+ */
+ void setEatSeconds(float eatSeconds);
+
+ /**
+ * Gets the effects which may be applied by this item when eaten.
+ *
+ * @return food effects
+ */
+ @NotNull
+ List getEffects();
+
+ /**
+ * Sets the effects which may be applied by this item when eaten.
+ *
+ * @param effects new effects
+ */
+ void setEffects(@NotNull List effects);
+
+ /**
+ * Adds an effect which may be applied by this item when eaten.
+ *
+ * @param effect the effect
+ * @param probability the probability of the effect being applied
+ * @return the added effect
+ */
+ @NotNull
+ FoodEffect addEffect(@NotNull PotionEffect effect, float probability);
+
+ /**
+ * An effect which may be applied by this item when eaten.
+ */
+ public interface FoodEffect extends ConfigurationSerializable {
+
+ /**
+ * Gets the effect which may be applied.
+ *
+ * @return the effect
+ */
+ @NotNull
+ PotionEffect getEffect();
+
+ /**
+ * Sets the effect which may be applied.
+ *
+ * @param effect the new effect
+ */
+ void setEffect(@NotNull PotionEffect effect);
+
+ /**
+ * Gets the probability of this effect being applied.
+ *
+ * @return probability
+ */
+ float getProbability();
+
+ /**
+ * Sets the probability of this effect being applied.
+ *
+ * @param probability between 0 and 1 inclusive.
+ */
+ void setProbability(float probability);
+ }
+}
diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/components/package-info.java b/paper-api/src/main/java/org/bukkit/inventory/meta/components/package-info.java
new file mode 100644
index 0000000000..402555ac5c
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/inventory/meta/components/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * Isolated components which may form part of item meta.
+ */
+@org.jetbrains.annotations.ApiStatus.Experimental
+package org.bukkit.inventory.meta.components;
diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/trim/TrimPattern.java b/paper-api/src/main/java/org/bukkit/inventory/meta/trim/TrimPattern.java
index ccf02c79e2..bd512a7840 100644
--- a/paper-api/src/main/java/org/bukkit/inventory/meta/trim/TrimPattern.java
+++ b/paper-api/src/main/java/org/bukkit/inventory/meta/trim/TrimPattern.java
@@ -75,4 +75,12 @@ public interface TrimPattern extends Keyed, Translatable {
* {@link Material#HOST_ARMOR_TRIM_SMITHING_TEMPLATE}.
*/
public static final TrimPattern HOST = Registry.TRIM_PATTERN.get(NamespacedKey.minecraft("host"));
+ /**
+ * {@link Material#FLOW_ARMOR_TRIM_SMITHING_TEMPLATE}.
+ */
+ public static final TrimPattern FLOW = Registry.TRIM_PATTERN.get(NamespacedKey.minecraft("flow"));
+ /**
+ * {@link Material#BOLT_ARMOR_TRIM_SMITHING_TEMPLATE}.
+ */
+ public static final TrimPattern BOLT = Registry.TRIM_PATTERN.get(NamespacedKey.minecraft("bolt"));
}
diff --git a/paper-api/src/main/java/org/bukkit/loot/LootTables.java b/paper-api/src/main/java/org/bukkit/loot/LootTables.java
index fe1af164da..0a3bce3b9d 100644
--- a/paper-api/src/main/java/org/bukkit/loot/LootTables.java
+++ b/paper-api/src/main/java/org/bukkit/loot/LootTables.java
@@ -37,6 +37,20 @@ public enum LootTables implements Keyed {
@MinecraftExperimental
TRIAL_CHAMBERS_REWARD("chests/trial_chambers/reward"),
@MinecraftExperimental
+ TRIAL_CHAMBERS_REWARD_COMMON("chests/trial_chambers/reward_common"),
+ @MinecraftExperimental
+ TRIAL_CHAMBERS_REWARD_RARE("chests/trial_chambers/reward_rare"),
+ @MinecraftExperimental
+ TRIAL_CHAMBERS_REWARD_UNIQUE("chests/trial_chambers/reward_unique"),
+ @MinecraftExperimental
+ TRIAL_CHAMBERS_REWARD_OMINOUS("chests/trial_chambers/reward_ominous"),
+ @MinecraftExperimental
+ TRIAL_CHAMBERS_REWARD_OMINOUS_COMMON("chests/trial_chambers/reward_ominous_common"),
+ @MinecraftExperimental
+ TRIAL_CHAMBERS_REWARD_OMINOUS_RARE("chests/trial_chambers/reward_ominous_rare"),
+ @MinecraftExperimental
+ TRIAL_CHAMBERS_REWARD_OMINOUS_UNIQUE("chests/trial_chambers/reward_ominous_unique"),
+ @MinecraftExperimental
TRIAL_CHAMBERS_SUPPLY("chests/trial_chambers/supply"),
@MinecraftExperimental
TRIAL_CHAMBERS_CORRIDOR("chests/trial_chambers/corridor"),
@@ -54,6 +68,12 @@ public enum LootTables implements Keyed {
TRIAL_CHAMBERS_WATER_DISPENSER("dispensers/trial_chambers/water"),
@MinecraftExperimental
TRIAL_CHAMBERS_CORRIDOR_POT("pots/trial_chambers/corridor"),
+ @MinecraftExperimental
+ EQUIPMENT_TRIAL_CHAMBER("equipment/trial_chamber"),
+ @MinecraftExperimental
+ EQUIPMENT_TRIAL_CHAMBER_RANGED("equipment/trial_chamber_ranged"),
+ @MinecraftExperimental
+ EQUIPMENT_TRIAL_CHAMBER_MELEE("equipment/trial_chamber_melee"),
SHIPWRECK_MAP("chests/shipwreck_map"),
SHIPWRECK_SUPPLY("chests/shipwreck_supply"),
SHIPWRECK_TREASURE("chests/shipwreck_treasure"),
@@ -177,12 +197,21 @@ public enum LootTables implements Keyed {
TOOLSMITH_GIFT("gameplay/hero_of_the_village/toolsmith_gift"),
WEAPONSMITH_GIFT("gameplay/hero_of_the_village/weaponsmith_gift"),
SNIFFER_DIGGING("gameplay/sniffer_digging"),
+ PANDA_SNEEZE("gameplay/panda_sneeze"),
PIGLIN_BARTERING("gameplay/piglin_bartering"),
// Spawners
@MinecraftExperimental
TRIAL_CHAMBER_KEY("spawners/trial_chamber/key"),
@MinecraftExperimental
TRIAL_CHAMBER_CONSUMABLES("spawners/trial_chamber/consumables"),
+ @MinecraftExperimental
+ OMINOUS_TRIAL_CHAMBER_KEY("spawners/ominous/trial_chamber/key"),
+ @MinecraftExperimental
+ OMINOUS_TRIAL_CHAMBER_CONSUMABLES("spawners/ominous/trial_chamber/consumables"),
+ @MinecraftExperimental
+ TRIAL_CHAMBER_ITEMS_TO_DROP_WHEN_OMINOUS("spawners/trial_chamber/items_to_drop_when_ominous"),
+ // Shearing
+ SHEARING_BOGGED("shearing/bogged"),
// Archaeology
DESERT_WELL_ARCHAEOLOGY("archaeology/desert_well"),
DESERT_PYRAMID_ARCHAEOLOGY("archaeology/desert_pyramid"),
diff --git a/paper-api/src/main/java/org/bukkit/map/MapCursor.java b/paper-api/src/main/java/org/bukkit/map/MapCursor.java
index b90fd819a7..4ddddc5d91 100644
--- a/paper-api/src/main/java/org/bukkit/map/MapCursor.java
+++ b/paper-api/src/main/java/org/bukkit/map/MapCursor.java
@@ -1,5 +1,7 @@
package org.bukkit.map;
+import org.bukkit.Keyed;
+import org.bukkit.NamespacedKey;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -225,47 +227,56 @@ public final class MapCursor {
* index in the file './assets/minecraft/textures/map/map_icons.png' from minecraft.jar or from a
* resource pack.
*/
- public enum Type {
- WHITE_POINTER(0),
- GREEN_POINTER(1),
- RED_POINTER(2),
- BLUE_POINTER(3),
- WHITE_CROSS(4),
- RED_MARKER(5),
- WHITE_CIRCLE(6),
- SMALL_WHITE_CIRCLE(7),
- MANSION(8),
- TEMPLE(9),
- BANNER_WHITE(10),
- BANNER_ORANGE(11),
- BANNER_MAGENTA(12),
- BANNER_LIGHT_BLUE(13),
- BANNER_YELLOW(14),
- BANNER_LIME(15),
- BANNER_PINK(16),
- BANNER_GRAY(17),
- BANNER_LIGHT_GRAY(18),
- BANNER_CYAN(19),
- BANNER_PURPLE(20),
- BANNER_BLUE(21),
- BANNER_BROWN(22),
- BANNER_GREEN(23),
- BANNER_RED(24),
- BANNER_BLACK(25),
- RED_X(26),
- DESERT_VILLAGE(27),
- PLAINS_VILLAGE(28),
- SAVANNA_VILLAGE(29),
- SNOWY_VILLAGE(30),
- TAIGA_VILLAGE(31),
- JUNGLE_TEMPLE(32),
- SWAMP_HUT(33),
+ public enum Type implements Keyed {
+ WHITE_POINTER(0, "player"),
+ GREEN_POINTER(1, "frame"),
+ RED_POINTER(2, "red_marker"),
+ BLUE_POINTER(3, "blue_marker"),
+ WHITE_CROSS(4, "target_x"),
+ RED_MARKER(5, "target_point"),
+ WHITE_CIRCLE(6, "player_off_map"),
+ SMALL_WHITE_CIRCLE(7, "player_off_limits"),
+ MANSION(8, "mansion"),
+ TEMPLE(9, "monument"),
+ BANNER_WHITE(10, "banner_white"),
+ BANNER_ORANGE(11, "banner_orange"),
+ BANNER_MAGENTA(12, "banner_magenta"),
+ BANNER_LIGHT_BLUE(13, "banner_light_blue"),
+ BANNER_YELLOW(14, "banner_yellow"),
+ BANNER_LIME(15, "banner_lime"),
+ BANNER_PINK(16, "banner_pink"),
+ BANNER_GRAY(17, "banner_gray"),
+ BANNER_LIGHT_GRAY(18, "banner_light_gray"),
+ BANNER_CYAN(19, "banner_cyan"),
+ BANNER_PURPLE(20, "banner_purple"),
+ BANNER_BLUE(21, "banner_blue"),
+ BANNER_BROWN(22, "banner_brown"),
+ BANNER_GREEN(23, "banner_green"),
+ BANNER_RED(24, "banner_red"),
+ BANNER_BLACK(25, "banner_black"),
+ RED_X(26, "red_x"),
+ DESERT_VILLAGE(27, "village_desert"),
+ PLAINS_VILLAGE(28, "village_plains"),
+ SAVANNA_VILLAGE(29, "village_savanna"),
+ SNOWY_VILLAGE(30, "village_snowy"),
+ TAIGA_VILLAGE(31, "village_taiga"),
+ JUNGLE_TEMPLE(32, "jungle_temple"),
+ SWAMP_HUT(33, "swamp_hut"),
+ TRIAL_CHAMBERS(34, "trial_chambers")
;
private byte value;
+ private final NamespacedKey key;
- private Type(int value) {
+ private Type(int value, String key) {
this.value = (byte) value;
+ this.key = NamespacedKey.minecraft(key);
+ }
+
+ @NotNull
+ @Override
+ public NamespacedKey getKey() {
+ return key;
}
/**
diff --git a/paper-api/src/main/java/org/bukkit/potion/Potion.java b/paper-api/src/main/java/org/bukkit/potion/Potion.java
deleted file mode 100644
index 266547c6da..0000000000
--- a/paper-api/src/main/java/org/bukkit/potion/Potion.java
+++ /dev/null
@@ -1,395 +0,0 @@
-package org.bukkit.potion;
-
-import com.google.common.base.Preconditions;
-import java.util.Collection;
-import org.bukkit.Material;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.PotionMeta;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Potion Adapter for pre-1.9 data values
- * see @PotionMeta for 1.9+
- */
-@Deprecated
-public class Potion {
- private boolean extended = false;
- private boolean splash = false;
- private int level = 1;
- private PotionType type;
-
- /**
- * Construct a new potion of the given type. Unless the type is {@link
- * PotionType#WATER}, it will be level one, without extended duration.
- * Don't use this constructor to create a no-effect potion other than
- * water bottle.
- *
- * @param type The potion type
- */
- public Potion(@NotNull PotionType type) {
- Preconditions.checkArgument(type != null, "Null PotionType");
- this.type = type;
- }
-
- /**
- * Create a new potion of the given type and level.
- *
- * @param type The type of potion.
- * @param level The potion's level.
- */
- public Potion(@NotNull PotionType type, int level) {
- this(type);
- Preconditions.checkArgument(type != null, "Type cannot be null");
- Preconditions.checkArgument(level > 0 && level < 3, "Level must be 1 or 2");
- this.level = level;
- }
-
- /**
- * Create a new potion of the given type and level.
- *
- * @param type The type of potion.
- * @param level The potion's level.
- * @param splash Whether it is a splash potion.
- * @deprecated In favour of using {@link #Potion(PotionType)} with {@link
- * #splash()}.
- */
- @Deprecated
- public Potion(@NotNull PotionType type, int level, boolean splash) {
- this(type, level);
- this.splash = splash;
- }
-
- /**
- * Create a new potion of the given type and level.
- *
- * @param type The type of potion.
- * @param level The potion's level.
- * @param splash Whether it is a splash potion.
- * @param extended Whether it has an extended duration.
- * @deprecated In favour of using {@link #Potion(PotionType)} with {@link
- * #extend()} and possibly {@link #splash()}.
- */
- @Deprecated
- public Potion(@NotNull PotionType type, int level, boolean splash, boolean extended) {
- this(type, level, splash);
- this.extended = extended;
- }
-
- /**
- * Chain this to the constructor to make the potion a splash potion.
- *
- * @return The potion.
- */
- @NotNull
- public Potion splash() {
- setSplash(true);
- return this;
- }
-
- /**
- * Chain this to the constructor to extend the potion's duration.
- *
- * @return The potion.
- */
- @NotNull
- public Potion extend() {
- setHasExtendedDuration(true);
- return this;
- }
-
- /**
- * Applies the effects of this potion to the given {@link ItemStack}. The
- * ItemStack must be a potion.
- *
- * @param to The itemstack to apply to
- */
- public void apply(@NotNull ItemStack to) {
- Preconditions.checkArgument(to != null, "itemstack cannot be null");
- Preconditions.checkArgument(to.hasItemMeta(), "given itemstack is not a potion");
- Preconditions.checkArgument(to.getItemMeta() instanceof PotionMeta, "given itemstack is not a potion");
- PotionMeta meta = (PotionMeta) to.getItemMeta();
- meta.setBasePotionData(new PotionData(type, extended, level == 2));
- to.setItemMeta(meta);
- }
-
- /**
- * Applies the effects that would be applied by this potion to the given
- * {@link LivingEntity}.
- *
- * @param to The entity to apply the effects to
- * @see LivingEntity#addPotionEffects(Collection)
- */
- public void apply(@NotNull LivingEntity to) {
- Preconditions.checkArgument(to != null, "entity cannot be null");
- to.addPotionEffects(getEffects());
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null || getClass() != obj.getClass()) {
- return false;
- }
- Potion other = (Potion) obj;
- return extended == other.extended && splash == other.splash && level == other.level && type == other.type;
- }
-
- /**
- * Returns a collection of {@link PotionEffect}s that this {@link Potion}
- * would confer upon a {@link LivingEntity}.
- *
- * @return The effects that this potion applies
- * @see PotionBrewer#getEffectsFromDamage(int)
- * @see Potion#toDamageValue()
- */
- @NotNull
- public Collection getEffects() {
- return getBrewer().getEffects(type, level == 2, extended);
- }
-
- /**
- * Returns the level of this potion.
- *
- * @return The level of this potion
- */
- public int getLevel() {
- return level;
- }
-
- /**
- * Returns the {@link PotionType} of this potion.
- *
- * @return The type of this potion
- */
- @NotNull
- public PotionType getType() {
- return type;
- }
-
- /**
- * Returns whether this potion has an extended duration.
- *
- * @return Whether this potion has extended duration
- */
- public boolean hasExtendedDuration() {
- return extended;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = prime + level;
- result = prime * result + (extended ? 1231 : 1237);
- result = prime * result + (splash ? 1231 : 1237);
- result = prime * result + ((type == null) ? 0 : type.hashCode());
- return result;
- }
-
- /**
- * Returns whether this potion is a splash potion.
- *
- * @return Whether this is a splash potion
- */
- public boolean isSplash() {
- return splash;
- }
-
- /**
- * Set whether this potion has extended duration. This will cause the
- * potion to have roughly 8/3 more duration than a regular potion.
- *
- * @param isExtended Whether the potion should have extended duration
- */
- public void setHasExtendedDuration(boolean isExtended) {
- Preconditions.checkArgument(type == null || !type.isInstant(), "Instant potions cannot be extended");
- extended = isExtended;
- }
-
- /**
- * Sets whether this potion is a splash potion. Splash potions can be
- * thrown for a radius effect.
- *
- * @param isSplash Whether this is a splash potion
- */
- public void setSplash(boolean isSplash) {
- splash = isSplash;
- }
-
- /**
- * Sets the {@link PotionType} of this potion.
- *
- * @param type The new type of this potion
- */
- public void setType(@NotNull PotionType type) {
- this.type = type;
- }
-
- /**
- * Sets the level of this potion.
- *
- * @param level The new level of this potion
- */
- public void setLevel(int level) {
- Preconditions.checkArgument(this.type != null, "No-effect potions don't have a level.");
- Preconditions.checkArgument(level > 0 && level <= 2, "Level must be between 1 and 2 for this potion");
- this.level = level;
- }
-
- /**
- * Converts this potion to a valid potion damage short, usable for potion
- * item stacks.
- *
- * @return The damage value of this potion
- * @deprecated Non-functional
- */
- @Deprecated
- public short toDamageValue() {
- return 0;
- }
-
- /**
- * Converts this potion to an {@link ItemStack} with the specified amount
- * and a correct damage value.
- *
- * @param amount The amount of the ItemStack
- * @return The created ItemStack
- */
- @NotNull
- public ItemStack toItemStack(int amount) {
- Material material;
- if (isSplash()) {
- material = Material.SPLASH_POTION;
- } else {
- material = Material.POTION;
- }
- ItemStack itemStack = new ItemStack(material, amount);
- PotionMeta meta = (PotionMeta) itemStack.getItemMeta();
- meta.setBasePotionData(new PotionData(type, level == 2, extended));
- itemStack.setItemMeta(meta);
- return itemStack;
- }
-
- private static PotionBrewer brewer;
-
- private static final int EXTENDED_BIT = 0x40;
- private static final int POTION_BIT = 0xF;
- private static final int SPLASH_BIT = 0x4000;
- private static final int TIER_BIT = 0x20;
- private static final int TIER_SHIFT = 5;
-
- /**
- * Gets the potion from its damage value.
- *
- * @param damage the damage value
- * @return the produced potion
- */
- @NotNull
- public static Potion fromDamage(int damage) {
- PotionType type;
- switch (damage & POTION_BIT) {
- case 0:
- type = PotionType.WATER;
- break;
- case 1:
- type = PotionType.REGEN;
- break;
- case 2:
- type = PotionType.SPEED;
- break;
- case 3:
- type = PotionType.FIRE_RESISTANCE;
- break;
- case 4:
- type = PotionType.POISON;
- break;
- case 5:
- type = PotionType.INSTANT_HEAL;
- break;
- case 6:
- type = PotionType.NIGHT_VISION;
- break;
- case 8:
- type = PotionType.WEAKNESS;
- break;
- case 9:
- type = PotionType.STRENGTH;
- break;
- case 10:
- type = PotionType.SLOWNESS;
- break;
- case 11:
- type = PotionType.JUMP;
- break;
- case 12:
- type = PotionType.INSTANT_DAMAGE;
- break;
- case 13:
- type = PotionType.WATER_BREATHING;
- break;
- case 14:
- type = PotionType.INVISIBILITY;
- break;
- default:
- type = PotionType.WATER;
- }
- Potion potion;
- if (type == null || type == PotionType.WATER) {
- potion = new Potion(PotionType.WATER);
- } else {
- int level = (damage & TIER_BIT) >> TIER_SHIFT;
- level++;
- potion = new Potion(type, level);
- }
- if ((damage & SPLASH_BIT) != 0) {
- potion = potion.splash();
- }
- if ((damage & EXTENDED_BIT) != 0) {
- potion = potion.extend();
- }
- return potion;
- }
-
- @NotNull
- public static Potion fromItemStack(@NotNull ItemStack item) {
- Preconditions.checkArgument(item != null, "item cannot be null");
- if (item.getType() != Material.POTION)
- throw new IllegalArgumentException("item is not a potion");
- return fromDamage(item.getDurability());
- }
-
- /**
- * Returns an instance of {@link PotionBrewer}.
- *
- * @return An instance of PotionBrewer
- */
- @NotNull
- public static PotionBrewer getBrewer() {
- return brewer;
- }
-
- /**
- * Sets the current instance of {@link PotionBrewer}. Generally not to be
- * used from within a plugin.
- *
- * @param other The new PotionBrewer
- */
- public static void setPotionBrewer(@NotNull PotionBrewer other) {
- if (brewer != null)
- throw new IllegalArgumentException("brewer can only be set internally");
- brewer = other;
- }
-
- /**
- * Gets the potion from its name id.
- *
- * @return the name id
- * @deprecated Non-functional
- */
- @Deprecated
- public int getNameId() {
- return 0;
- }
-}
diff --git a/paper-api/src/main/java/org/bukkit/potion/PotionData.java b/paper-api/src/main/java/org/bukkit/potion/PotionData.java
deleted file mode 100644
index 3852a092fa..0000000000
--- a/paper-api/src/main/java/org/bukkit/potion/PotionData.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.bukkit.potion;
-
-import com.google.common.base.Preconditions;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * @deprecated Upgraded / extended potions are now their own {@link PotionType} use them instead.
- */
-@Deprecated
-public final class PotionData {
-
- private final PotionType type;
- private final boolean extended;
- private final boolean upgraded;
-
- /**
- * Instantiates a final PotionData object to contain information about a
- * Potion
- *
- * @param type the type of the Potion
- * @param extended whether the potion is extended PotionType#isExtendable()
- * must be true
- * @param upgraded whether the potion is upgraded PotionType#isUpgradable()
- * must be true
- */
- public PotionData(@NotNull PotionType type, boolean extended, boolean upgraded) {
- Preconditions.checkArgument(type != null, "Potion Type must not be null");
- Preconditions.checkArgument(!upgraded || type.isUpgradeable(), "Potion Type is not upgradable");
- Preconditions.checkArgument(!extended || type.isExtendable(), "Potion Type is not extendable");
- Preconditions.checkArgument(!upgraded || !extended, "Potion cannot be both extended and upgraded");
- Preconditions.checkArgument(!type.getKey().getKey().startsWith("strong_"), "Strong potion type cannot be used directly, got %s", type.getKey());
- Preconditions.checkArgument(!type.getKey().getKey().startsWith("long_"), "Extended potion type cannot be used directly, got %s", type.getKey());
- this.type = type;
- this.extended = extended;
- this.upgraded = upgraded;
- }
-
- public PotionData(@NotNull PotionType type) {
- this(type, false, false);
- }
-
- /**
- * Gets the type of the potion, Type matches up with each kind of craftable
- * potion
- *
- * @return the potion type
- */
- @NotNull
- public PotionType getType() {
- return type;
- }
-
- /**
- * Checks if the potion is in an upgraded state. This refers to whether or
- * not the potion is Tier 2, such as Potion of Fire Resistance II.
- *
- * @return true if the potion is upgraded;
- */
- public boolean isUpgraded() {
- return upgraded;
- }
-
- /**
- * Checks if the potion is in an extended state. This refers to the extended
- * duration potions
- *
- * @return true if the potion is extended
- */
- public boolean isExtended() {
- return extended;
- }
-
- @Override
- public int hashCode() {
- int hash = 7;
- hash = 23 * hash + (this.type != null ? this.type.hashCode() : 0);
- hash = 23 * hash + (this.extended ? 1 : 0);
- hash = 23 * hash + (this.upgraded ? 1 : 0);
- return hash;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null || getClass() != obj.getClass()) {
- return false;
- }
- PotionData other = (PotionData) obj;
- return (this.upgraded == other.upgraded) && (this.extended == other.extended) && (this.type == other.type);
- }
-}
diff --git a/paper-api/src/main/java/org/bukkit/potion/PotionEffectType.java b/paper-api/src/main/java/org/bukkit/potion/PotionEffectType.java
index 28dd05c706..b6afe1cff5 100644
--- a/paper-api/src/main/java/org/bukkit/potion/PotionEffectType.java
+++ b/paper-api/src/main/java/org/bukkit/potion/PotionEffectType.java
@@ -173,7 +173,7 @@ public abstract class PotionEffectType implements Keyed, Translatable {
public static final PotionEffectType DOLPHINS_GRACE = getPotionEffectType(30, "dolphins_grace");
/**
- * Triggers a raid when the player enters a village.
+ * Triggers an ominous event when the player enters a village or trial chambers.
* oof.
*/
public static final PotionEffectType BAD_OMEN = getPotionEffectType(31, "bad_omen");
@@ -189,6 +189,36 @@ public abstract class PotionEffectType implements Keyed, Translatable {
*/
public static final PotionEffectType DARKNESS = getPotionEffectType(33, "darkness");
+ /**
+ * Causes trial spawners to become ominous.
+ */
+ public static final PotionEffectType TRIAL_OMEN = getPotionEffectType(34, "trial_omen");
+
+ /**
+ * Triggers a raid when a player enters a village.
+ */
+ public static final PotionEffectType RAID_OMEN = getPotionEffectType(35, "raid_omen");
+
+ /**
+ * Emits a wind burst upon death.
+ */
+ public static final PotionEffectType WIND_CHARGED = getPotionEffectType(36, "wind_charged");
+
+ /**
+ * Creates cobwebs upon death.
+ */
+ public static final PotionEffectType WEAVING = getPotionEffectType(37, "weaving");
+
+ /**
+ * Causes slimes to spawn upon death.
+ */
+ public static final PotionEffectType OOZING = getPotionEffectType(38, "oozing");
+
+ /**
+ * Chance of spawning silverfish when hurt.
+ */
+ public static final PotionEffectType INFESTED = getPotionEffectType(39, "infested");
+
@NotNull
private static PotionEffectType getPotionEffectType(int typeId, @NotNull String key) {
NamespacedKey namespacedKey = NamespacedKey.minecraft(key);
diff --git a/paper-api/src/main/java/org/bukkit/potion/PotionType.java b/paper-api/src/main/java/org/bukkit/potion/PotionType.java
index 70456f0866..783c1a9a2b 100644
--- a/paper-api/src/main/java/org/bukkit/potion/PotionType.java
+++ b/paper-api/src/main/java/org/bukkit/potion/PotionType.java
@@ -5,6 +5,7 @@ import java.util.List;
import java.util.function.Supplier;
import org.bukkit.Bukkit;
import org.bukkit.Keyed;
+import org.bukkit.MinecraftExperimental;
import org.bukkit.NamespacedKey;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
@@ -15,7 +16,6 @@ import org.jetbrains.annotations.Nullable;
* the Creative mode inventory
*/
public enum PotionType implements Keyed {
- UNCRAFTABLE("empty"),
WATER("water"),
MUNDANE("mundane"),
THICK("thick"),
@@ -58,6 +58,14 @@ public enum PotionType implements Keyed {
STRONG_TURTLE_MASTER("strong_turtle_master"),
SLOW_FALLING("slow_falling"),
LONG_SLOW_FALLING("long_slow_falling"),
+ @MinecraftExperimental
+ WIND_CHARGED("wind_charged"),
+ @MinecraftExperimental
+ WEAVING("weaving"),
+ @MinecraftExperimental
+ OOZING("oozing"),
+ @MinecraftExperimental
+ INFESTED("infested"),
;
private final NamespacedKey key;