From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Date: Sun, 5 Dec 2021 14:58:55 -0500
Subject: [PATCH] Expand FallingBlock API

- add auto expire setting
- add setter for block data
- add accessors for block state

Co-authored-by: Lukas Planz <lukas.planz@web.de>

diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
@@ -0,0 +0,0 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
      * @return The spawned {@link FallingBlock} instance
      * @throws IllegalArgumentException if {@link Location} or {@link
      *     MaterialData} are null or {@link Material} of the {@link MaterialData} is not a block
+     * @deprecated Use {@link #spawn(Location, Class, Consumer)} (or a variation thereof) in combination with {@link FallingBlock#setBlockData(BlockData)}
      */
     @NotNull
+    @Deprecated(since = "1.20.2") // Paper
     public FallingBlock spawnFallingBlock(@NotNull Location location, @NotNull MaterialData data) throws IllegalArgumentException;
 
     /**
@@ -0,0 +0,0 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
      * @return The spawned {@link FallingBlock} instance
      * @throws IllegalArgumentException if {@link Location} or {@link
      *     BlockData} are null
+     * @deprecated Use {@link #spawn(Location, Class, Consumer)} (or a variation thereof) in combination with {@link FallingBlock#setBlockData(BlockData)}
      */
     @NotNull
+    @org.jetbrains.annotations.ApiStatus.Obsolete(since = "1.20.2") // Paper
     public FallingBlock spawnFallingBlock(@NotNull Location location, @NotNull BlockData data) throws IllegalArgumentException;
 
     /**
@@ -0,0 +0,0 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
      * @return The spawned {@link FallingBlock} instance
      * @throws IllegalArgumentException if {@link Location} or {@link
      *     Material} are null or {@link Material} is not a block
-     * @deprecated Magic value
+     * @deprecated Magic value. Use {@link #spawn(Location, Class, Consumer)} (or a variation thereof) in combination with {@link FallingBlock#setBlockData(BlockData)}
      */
     @Deprecated
     @NotNull
diff --git a/src/main/java/org/bukkit/entity/FallingBlock.java b/src/main/java/org/bukkit/entity/FallingBlock.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/entity/FallingBlock.java
+++ b/src/main/java/org/bukkit/entity/FallingBlock.java
@@ -0,0 +0,0 @@ public interface FallingBlock extends Entity {
      */
     @NotNull
     BlockData getBlockData();
+    // Paper start
+    /**
+     * Sets the data for the falling block.
+     * <br>
+     * Any potential additional data currently stored in the falling blocks {@link #getBlockState()} will be
+     * purged by calling this setter.
+     *
+     * @param blockData the data to use as the block
+     */
+    void setBlockData(@NotNull BlockData blockData);
+
+    /**
+     * Get the data of the falling block represented as a {@link org.bukkit.block.BlockState BlockState}
+     * which includes potential NBT data that gets applied when the block gets placed on landing.
+     *
+     * @return the BlockState representing this block
+     */
+    @NotNull
+    org.bukkit.block.BlockState getBlockState();
+
+    /**
+     * Sets the {@link BlockData} and possibly present tile entity data for the falling block.
+     *
+     * @param blockState the BlockState to use
+     */
+    void setBlockState(@NotNull org.bukkit.block.BlockState blockState);
+    // Paper end
 
     /**
      * Get if the falling block will break into an item if it cannot be placed.
@@ -0,0 +0,0 @@ public interface FallingBlock extends Entity {
     default org.bukkit.Location getSourceLoc() {
         return this.getOrigin();
     }
+    // Paper start - Auto expire setting
+    /**
+     * Sets if this falling block should expire after:
+     * - 30 seconds
+     * - 5 seconds and is outside of the world
+     *
+     * @return if this behavior occurs
+     */
+    boolean doesAutoExpire();
+
+    /**
+     * Sets if this falling block should expire after:
+     * - 30 seconds
+     * - 5 seconds and is outside of the world
+     *
+     * @param autoExpires if this behavior should occur
+     */
+    void shouldAutoExpire(boolean autoExpires);
+    // Paper end - Auto expire setting
 }
