From 956e59eaefccac3ad0260ed823f34c0d4cf72a2c Mon Sep 17 00:00:00 2001
From: viciscat <51047087+viciscat@users.noreply.github.com>
Date: Sat, 16 Mar 2024 20:28:50 +0100
Subject: [PATCH] Expand Hopper BlockState API (#10328)

---
 patches/api/Expanded-Hopper-API.patch    | 32 ++++++++++++++++++++++++
 patches/server/Expanded-Hopper-API.patch | 31 +++++++++++++++++++++++
 2 files changed, 63 insertions(+)
 create mode 100644 patches/api/Expanded-Hopper-API.patch
 create mode 100644 patches/server/Expanded-Hopper-API.patch

diff --git a/patches/api/Expanded-Hopper-API.patch b/patches/api/Expanded-Hopper-API.patch
new file mode 100644
index 0000000000..a3e18104c0
--- /dev/null
+++ b/patches/api/Expanded-Hopper-API.patch
@@ -0,0 +1,32 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: vicisacat <victor.branchu@gmail.com>
+Date: Fri, 15 Mar 2024 17:35:18 +0100
+Subject: [PATCH] Expanded Hopper API
+
+
+diff --git a/src/main/java/org/bukkit/block/Hopper.java b/src/main/java/org/bukkit/block/Hopper.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/block/Hopper.java
++++ b/src/main/java/org/bukkit/block/Hopper.java
+@@ -0,0 +0,0 @@ import org.bukkit.loot.Lootable;
+ /**
+  * Represents a captured state of a hopper.
+  */
+-public interface Hopper extends Container, LootableBlockInventory { } // Paper
++public interface Hopper extends Container, LootableBlockInventory { // Paper
++    // Paper start - Expanded Hopper API
++    /**
++     * Sets the cooldown before the hopper transfers or sucks in another item
++     * @param cooldown the cooldown in ticks
++     * @throws IllegalArgumentException if the passed cooldown value is negative.
++     */
++    void setTransferCooldown(@org.jetbrains.annotations.Range(from = 0, to = Integer.MAX_VALUE) int cooldown);
++
++    /**
++     * Returns the cooldown before the hopper transfers or sucks in another item
++     * @return the cooldown in ticks
++     */
++    int getTransferCooldown();
++    // Paper end - Expanded Hopper API
++}
++
diff --git a/patches/server/Expanded-Hopper-API.patch b/patches/server/Expanded-Hopper-API.patch
new file mode 100644
index 0000000000..0918858f77
--- /dev/null
+++ b/patches/server/Expanded-Hopper-API.patch
@@ -0,0 +1,31 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: vicisacat <victor.branchu@gmail.com>
+Date: Fri, 15 Mar 2024 17:35:40 +0100
+Subject: [PATCH] Expanded Hopper API
+
+== AT ==
+public net.minecraft.world.level.block.entity.HopperBlockEntity setCooldown(I)V
+public net.minecraft.world.level.block.entity.HopperBlockEntity cooldownTime
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftHopper.java b/src/main/java/org/bukkit/craftbukkit/block/CraftHopper.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/craftbukkit/block/CraftHopper.java
++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftHopper.java
+@@ -0,0 +0,0 @@ public class CraftHopper extends CraftLootable<HopperBlockEntity> implements Hop
+     public CraftHopper copy() {
+         return new CraftHopper(this);
+     }
++
++    // Paper start - Expanded Hopper API
++    @Override
++    public void setTransferCooldown(final int cooldown) {
++        com.google.common.base.Preconditions.checkArgument(cooldown >= 0, "Hooper transfer cooldown cannot be negative (" + cooldown + ")");
++        getSnapshot().setCooldown(cooldown);
++    }
++
++    @Override
++    public int getTransferCooldown() {
++        return getSnapshot().cooldownTime;
++    }
++    // Paper end - Expanded Hopper API
+ }