ENTITY_TYPES_CAN_TURN_IN_BOATS = Bukkit.getTag(REGISTRY_ENTITY_TYPES, NamespacedKey.minecraft("can_turn_in_boats"), EntityType.class);
/**
* Returns whether or not this tag has an entry for the specified item.
diff --git a/paper-api/src/main/java/org/bukkit/block/Crafter.java b/paper-api/src/main/java/org/bukkit/block/Crafter.java
new file mode 100644
index 0000000000..fda6e8965e
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/block/Crafter.java
@@ -0,0 +1,63 @@
+package org.bukkit.block;
+
+import org.bukkit.MinecraftExperimental;
+import org.bukkit.loot.Lootable;
+import org.jetbrains.annotations.ApiStatus;
+
+/**
+ * Represents a captured state of a crafter.
+ */
+@ApiStatus.Experimental
+@MinecraftExperimental
+public interface Crafter extends Container, Lootable {
+
+ /**
+ * Gets the number of ticks which this block will remain in the crafting
+ * state for.
+ *
+ * @return number of ticks remaining
+ * @see org.bukkit.block.data.type.Crafter#isCrafting()
+ */
+ int getCraftingTicks();
+
+ /**
+ * Sets the number of ticks which this block will remain in the crafting
+ * state for.
+ *
+ * @param ticks number of ticks remaining
+ * @see org.bukkit.block.data.type.Crafter#isCrafting()
+ */
+ void setCraftingTicks(int ticks);
+
+ /**
+ * Gets whether the slot at the specified index is disabled and will not
+ * have items placed in it.
+ *
+ * @param slot slot index
+ * @return disabled status
+ */
+ boolean isSlotDisabled(int slot);
+
+ /**
+ * Sets whether the slot at the specified index is disabled and will not
+ * have items placed in it.
+ *
+ * @param slot slot index
+ * @param disabled disabled status
+ */
+ void setSlotDisabled(int slot, boolean disabled);
+
+ /**
+ * Gets whether this Crafter is powered.
+ *
+ * @return powered status
+ */
+ boolean isTriggered();
+
+ /**
+ * Sets whether this Crafter is powered.
+ *
+ * @param triggered powered status
+ */
+ void setTriggered(boolean triggered);
+}
diff --git a/paper-api/src/main/java/org/bukkit/block/TrialSpawner.java b/paper-api/src/main/java/org/bukkit/block/TrialSpawner.java
new file mode 100644
index 0000000000..66ce87d236
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/block/TrialSpawner.java
@@ -0,0 +1,12 @@
+package org.bukkit.block;
+
+import org.bukkit.MinecraftExperimental;
+import org.jetbrains.annotations.ApiStatus;
+
+/**
+ * Represents a captured state of a trial spawner.
+ */
+@MinecraftExperimental
+@ApiStatus.Experimental
+public interface TrialSpawner extends TileState {
+}
diff --git a/paper-api/src/main/java/org/bukkit/block/data/type/CopperBulb.java b/paper-api/src/main/java/org/bukkit/block/data/type/CopperBulb.java
new file mode 100644
index 0000000000..2257f23c2e
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/block/data/type/CopperBulb.java
@@ -0,0 +1,11 @@
+package org.bukkit.block.data.type;
+
+import org.bukkit.MinecraftExperimental;
+import org.bukkit.block.data.Lightable;
+import org.bukkit.block.data.Powerable;
+import org.jetbrains.annotations.ApiStatus;
+
+@MinecraftExperimental
+@ApiStatus.Experimental
+public interface CopperBulb extends Lightable, Powerable {
+}
diff --git a/paper-api/src/main/java/org/bukkit/block/data/type/Crafter.java b/paper-api/src/main/java/org/bukkit/block/data/type/Crafter.java
new file mode 100644
index 0000000000..bc29b8aea7
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/block/data/type/Crafter.java
@@ -0,0 +1,81 @@
+package org.bukkit.block.data.type;
+
+import org.bukkit.MinecraftExperimental;
+import org.bukkit.block.data.BlockData;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * 'orientation' is the direction the block is facing.
+ *
+ * Similar to {@link Powerable}, 'triggered' indicates whether or not the
+ * dispenser is currently activated.
+ *
+ * 'crafting' is whether crafter's mouth is open and top is glowing.
+ */
+@ApiStatus.Experimental
+@MinecraftExperimental
+public interface Crafter extends BlockData {
+
+ /**
+ * Gets the value of the 'crafting' property.
+ *
+ * @return the 'crafting' value
+ */
+ boolean isCrafting();
+
+ /**
+ * Sets the value of the 'crafting' property.
+ *
+ * @param crafting the new 'crafting' value
+ */
+ void setCrafting(boolean crafting);
+
+ /**
+ * Gets the value of the 'triggered' property.
+ *
+ * @return the 'triggered' value
+ */
+ boolean isTriggered();
+
+ /**
+ * Sets the value of the 'triggered' property.
+ *
+ * @param triggered the new 'triggered' value
+ */
+ void setTriggered(boolean triggered);
+
+ /**
+ * Gets the value of the 'orientation' property.
+ *
+ * @return the 'orientation' value
+ */
+ @NotNull
+ Orientation getOrientation();
+
+ /**
+ * Sets the value of the 'orientation' property.
+ *
+ * @param orientation the new 'orientation' value
+ */
+ void setOrientation(@NotNull Orientation orientation);
+
+ /**
+ * The directions the Crafter can be oriented.
+ */
+ public enum Orientation {
+
+ DOWN_EAST,
+ DOWN_NORTH,
+ DOWN_SOUTH,
+ DOWN_WEST,
+ UP_EAST,
+ UP_NORTH,
+ UP_SOUTH,
+ UP_WEST,
+ WEST_UP,
+ EAST_UP,
+ NORTH_UP,
+ SOUTH_UP;
+ }
+}
diff --git a/paper-api/src/main/java/org/bukkit/block/data/type/TrialSpawner.java b/paper-api/src/main/java/org/bukkit/block/data/type/TrialSpawner.java
new file mode 100644
index 0000000000..2a20529067
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/block/data/type/TrialSpawner.java
@@ -0,0 +1,39 @@
+package org.bukkit.block.data.type;
+
+import org.bukkit.MinecraftExperimental;
+import org.bukkit.block.data.BlockData;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * 'trial_spawner_state' indicates the current operational phase of the spawner.
+ */
+@MinecraftExperimental
+@ApiStatus.Experimental
+public interface TrialSpawner extends BlockData {
+
+ /**
+ * Gets the value of the 'trial_spawner_state' property.
+ *
+ * @return the 'trial_spawner_state' value
+ */
+ @NotNull
+ State getTrialSpawnerState();
+
+ /**
+ * Sets the value of the 'trial_spawner_state' property.
+ *
+ * @param state the new 'trial_spawner_state' value
+ */
+ void setTrialSpawnerState(@NotNull State state);
+
+ public enum State {
+
+ INACTIVE,
+ WAITING_FOR_PLAYERS,
+ ACTIVE,
+ WAITING_FOR_REWARD_EJECTION,
+ EJECTING_REWARD,
+ COOLDOWN;
+ }
+}
diff --git a/paper-api/src/main/java/org/bukkit/entity/Breeze.java b/paper-api/src/main/java/org/bukkit/entity/Breeze.java
new file mode 100644
index 0000000000..03d9e1f5b1
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/entity/Breeze.java
@@ -0,0 +1,12 @@
+package org.bukkit.entity;
+
+import org.bukkit.MinecraftExperimental;
+import org.jetbrains.annotations.ApiStatus;
+
+/**
+ * Represents a Breeze. Whoosh!
+ */
+@MinecraftExperimental
+@ApiStatus.Experimental
+public interface Breeze extends Monster {
+}
diff --git a/paper-api/src/main/java/org/bukkit/entity/EntityType.java b/paper-api/src/main/java/org/bukkit/entity/EntityType.java
index bb9ae81870..e3f440c9d9 100644
--- a/paper-api/src/main/java/org/bukkit/entity/EntityType.java
+++ b/paper-api/src/main/java/org/bukkit/entity/EntityType.java
@@ -6,6 +6,7 @@ import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Keyed;
import org.bukkit.Location;
+import org.bukkit.MinecraftExperimental;
import org.bukkit.NamespacedKey;
import org.bukkit.Translatable;
import org.bukkit.World;
@@ -18,6 +19,7 @@ import org.bukkit.entity.minecart.SpawnerMinecart;
import org.bukkit.entity.minecart.StorageMinecart;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffectType;
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -284,6 +286,12 @@ public enum EntityType implements Keyed, Translatable {
ITEM_DISPLAY("item_display", ItemDisplay.class, -1),
SNIFFER("sniffer", Sniffer.class, -1),
TEXT_DISPLAY("text_display", TextDisplay.class, -1),
+ @MinecraftExperimental
+ @ApiStatus.Experimental
+ BREEZE("breeze", Breeze.class, -1),
+ @MinecraftExperimental
+ @ApiStatus.Experimental
+ WIND_CHARGE("wind_charge", WindCharge.class, -1),
/**
* A fishing line and bobber.
*/
diff --git a/paper-api/src/main/java/org/bukkit/entity/Player.java b/paper-api/src/main/java/org/bukkit/entity/Player.java
index 3cf31b08c6..57fee6b6f4 100644
--- a/paper-api/src/main/java/org/bukkit/entity/Player.java
+++ b/paper-api/src/main/java/org/bukkit/entity/Player.java
@@ -7,6 +7,7 @@ import java.time.Instant;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
+import java.util.UUID;
import org.bukkit.BanEntry;
import org.bukkit.DyeColor;
import org.bukkit.Effect;
@@ -1525,6 +1526,53 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
public void setResourcePack(@NotNull String url, @Nullable byte[] hash, @Nullable String prompt, boolean force);
+ /**
+ * Request that the player's client download and switch resource packs.
+ *
+ * The player's client will download the new resource pack asynchronously
+ * in the background, and will automatically switch to it once the
+ * download is complete. If the client has downloaded and cached a
+ * resource pack with the same hash in the past it will not download but
+ * directly apply the cached pack. If the hash is null and the client has
+ * downloaded and cached the same resource pack in the past, it will
+ * perform a file size check against the response content to determine if
+ * the resource pack has changed and needs to be downloaded again. When
+ * this request is sent for the very first time from a given server, the
+ * client will first display a confirmation GUI to the player before
+ * proceeding with the download.
+ *
+ * Notes:
+ *
+ * - Players can disable server resources on their client, in which
+ * case this method will have no affect on them. Use the
+ * {@link PlayerResourcePackStatusEvent} to figure out whether or not
+ * the player loaded the pack!
+ *
- There is no concept of resetting resource packs back to default
+ * within Minecraft, so players will have to relog to do so or you
+ * have to send an empty pack.
+ *
- The request is sent with empty string as the hash when the hash is
+ * not provided. This might result in newer versions not loading the
+ * pack correctly.
+ *
+ *
+ * @param id Unique resource pack ID.
+ * @param url The URL from which the client will download the resource
+ * pack. The string must contain only US-ASCII characters and should
+ * be encoded as per RFC 1738.
+ * @param hash The sha1 hash sum of the resource pack file which is used
+ * to apply a cached version of the pack directly without downloading
+ * if it is available. Hast to be 20 bytes long!
+ * @param prompt The optional custom prompt message to be shown to client.
+ * @param force If true, the client will be disconnected from the server
+ * when it declines to use the resource pack.
+ * @throws IllegalArgumentException Thrown if the URL is null.
+ * @throws IllegalArgumentException Thrown if the URL is too long. The
+ * length restriction is an implementation specific arbitrary value.
+ * @throws IllegalArgumentException Thrown if the hash is not 20 bytes
+ * long.
+ */
+ public void setResourcePack(@NotNull UUID id, @NotNull String url, @Nullable byte[] hash, @Nullable String prompt, boolean force);
+
/**
* Gets the Scoreboard displayed to this player
*
diff --git a/paper-api/src/main/java/org/bukkit/entity/WindCharge.java b/paper-api/src/main/java/org/bukkit/entity/WindCharge.java
new file mode 100644
index 0000000000..9294de1688
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/entity/WindCharge.java
@@ -0,0 +1,12 @@
+package org.bukkit.entity;
+
+import org.bukkit.MinecraftExperimental;
+import org.jetbrains.annotations.ApiStatus;
+
+/**
+ * Represents a Wind Charge.
+ */
+@MinecraftExperimental
+@ApiStatus.Experimental
+public interface WindCharge extends Fireball {
+}
diff --git a/paper-api/src/main/java/org/bukkit/event/inventory/InventoryType.java b/paper-api/src/main/java/org/bukkit/event/inventory/InventoryType.java
index ec9f58ea22..a2e9bedc4d 100644
--- a/paper-api/src/main/java/org/bukkit/event/inventory/InventoryType.java
+++ b/paper-api/src/main/java/org/bukkit/event/inventory/InventoryType.java
@@ -1,6 +1,8 @@
package org.bukkit.event.inventory;
+import org.bukkit.MinecraftExperimental;
import org.bukkit.inventory.InventoryHolder;
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
/**
@@ -142,6 +144,12 @@ public enum InventoryType {
* Pseudo jukebox inventory with 1 slot of undefined type.
*/
JUKEBOX(1, "Jukebox", false),
+ /**
+ * A crafter inventory, with 9 CRAFTING slots.
+ */
+ @MinecraftExperimental
+ @ApiStatus.Experimental
+ CRAFTER(9, "Crafter"),
/**
* The new smithing inventory, with 3 CRAFTING slots and 1 RESULT slot.
*
diff --git a/paper-api/src/main/java/org/bukkit/generator/structure/Structure.java b/paper-api/src/main/java/org/bukkit/generator/structure/Structure.java
index ca310cfea0..1a766e6871 100644
--- a/paper-api/src/main/java/org/bukkit/generator/structure/Structure.java
+++ b/paper-api/src/main/java/org/bukkit/generator/structure/Structure.java
@@ -47,6 +47,7 @@ public abstract class Structure implements Keyed {
public static final Structure RUINED_PORTAL_NETHER = getStructure("ruined_portal_nether");
public static final Structure ANCIENT_CITY = getStructure("ancient_city");
public static final Structure TRAIL_RUINS = getStructure("trail_ruins");
+ public static final Structure TRIAL_CHAMBERS = getStructure("trial_chambers");
private static Structure getStructure(String name) {
return Registry.STRUCTURE.get(NamespacedKey.minecraft(name));
diff --git a/paper-api/src/main/java/org/bukkit/inventory/CrafterInventory.java b/paper-api/src/main/java/org/bukkit/inventory/CrafterInventory.java
new file mode 100644
index 0000000000..7cdcd45e2b
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/inventory/CrafterInventory.java
@@ -0,0 +1,11 @@
+package org.bukkit.inventory;
+
+import org.bukkit.MinecraftExperimental;
+import org.jetbrains.annotations.ApiStatus;
+
+/**
+ * Interface to the inventory of a Crafter.
+ */
+@ApiStatus.Experimental
+@MinecraftExperimental
+public interface CrafterInventory extends Inventory { }
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 4e8479dc74..ddf71b0ee2 100644
--- a/paper-api/src/main/java/org/bukkit/loot/LootTables.java
+++ b/paper-api/src/main/java/org/bukkit/loot/LootTables.java
@@ -33,6 +33,16 @@ public enum LootTables implements Keyed {
ANCIENT_CITY("chests/ancient_city"),
ANCIENT_CITY_ICE_BOX("chests/ancient_city_ice_box"),
RUINED_PORTAL("chests/ruined_portal"),
+ TRIAL_CHAMBERS_REWARD("chests/trial_chambers/reward"),
+ TRIAL_CHAMBERS_SUPPLY("chests/trial_chambers/supply"),
+ TRIAL_CHAMBERS_CORRIDOR("chests/trial_chambers/corridor"),
+ TRIAL_CHAMBERS_INTERSECTION("chests/trial_chambers/intersection"),
+ TRIAL_CHAMBERS_INTERSECTION_BARREL("chests/trial_chambers/intersection_barrel"),
+ TRIAL_CHAMBERS_ENTRANCE("chests/trial_chambers/entrance"),
+ TRIAL_CHAMBERS_CORRIDOR_DISPENSER("dispensers/trial_chambers/corridor"),
+ TRIAL_CHAMBERS_CHAMBER_DISPENSER("dispensers/trial_chambers/chamber"),
+ TRIAL_CHAMBERS_WATER_DISPENSER("dispensers/trial_chambers/water"),
+ TRIAL_CHAMBERS_CORRIDOR_POT("pots/trial_chambers/corridor"),
SHIPWRECK_MAP("chests/shipwreck_map"),
SHIPWRECK_SUPPLY("chests/shipwreck_supply"),
SHIPWRECK_TREASURE("chests/shipwreck_treasure"),
@@ -157,6 +167,9 @@ public enum LootTables implements Keyed {
WEAPONSMITH_GIFT("gameplay/hero_of_the_village/weaponsmith_gift"),
SNIFFER_DIGGING("gameplay/sniffer_digging"),
PIGLIN_BARTERING("gameplay/piglin_bartering"),
+ // Spawners
+ TRIAL_CHAMBER_KEY("spawners/trial_chamber/key"),
+ RIAL_CHAMBER_CONSUMABLES("spawners/trial_chamber/consumables"),
// Archaeology
DESERT_WELL_ARCHAEOLOGY("archaeology/desert_well"),
DESERT_PYRAMID_ARCHAEOLOGY("archaeology/desert_pyramid"),