From a797fca1b9f56fb2ded1232a0393cb55af74cede Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Fri, 27 Nov 2020 17:15:15 -0800
Subject: [PATCH] Added PlayerStonecutterRecipeSelectEvent

Co-Authored-By: MiniDigger | Martin <admin@minidigger.dev>
---
 ...d-PlayerStonecutterRecipeSelectEvent.patch |  71 ++++++++++++
 ...d-PlayerStonecutterRecipeSelectEvent.patch | 109 ++++++++++++++++++
 2 files changed, 180 insertions(+)
 create mode 100644 Spigot-API-Patches/Added-PlayerStonecutterRecipeSelectEvent.patch
 create mode 100644 Spigot-Server-Patches/Added-PlayerStonecutterRecipeSelectEvent.patch

diff --git a/Spigot-API-Patches/Added-PlayerStonecutterRecipeSelectEvent.patch b/Spigot-API-Patches/Added-PlayerStonecutterRecipeSelectEvent.patch
new file mode 100644
index 0000000000..9fda4e2755
--- /dev/null
+++ b/Spigot-API-Patches/Added-PlayerStonecutterRecipeSelectEvent.patch
@@ -0,0 +1,71 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <jake.m.potrebic@gmail.com>
+Date: Fri, 27 Nov 2020 17:13:59 -0800
+Subject: [PATCH] Added PlayerStonecutterRecipeSelectEvent
+
+
+diff --git a/src/main/java/io/papermc/paper/event/player/PlayerStonecutterRecipeSelectEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerStonecutterRecipeSelectEvent.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
+--- /dev/null
++++ b/src/main/java/io/papermc/paper/event/player/PlayerStonecutterRecipeSelectEvent.java
+@@ -0,0 +0,0 @@
++package io.papermc.paper.event.player;
++
++import org.bukkit.entity.Player;
++import org.bukkit.event.Cancellable;
++import org.bukkit.event.HandlerList;
++import org.bukkit.event.player.PlayerEvent;
++import org.bukkit.inventory.StonecutterInventory;
++import org.bukkit.inventory.StonecuttingRecipe;
++import org.jetbrains.annotations.NotNull;
++
++public class PlayerStonecutterRecipeSelectEvent extends PlayerEvent implements Cancellable {
++
++    private static final HandlerList HANDLER_LIST = new HandlerList();
++
++    private boolean cancelled;
++    private final StonecutterInventory stonecutterInventory;
++    private StonecuttingRecipe stonecuttingRecipe;
++
++    public PlayerStonecutterRecipeSelectEvent(@NotNull Player player, @NotNull StonecutterInventory stonecutterInventory, @NotNull StonecuttingRecipe stonecuttingRecipe) {
++        super(player);
++        this.stonecutterInventory = stonecutterInventory;
++        this.stonecuttingRecipe = stonecuttingRecipe;
++    }
++
++    @NotNull
++    public StonecutterInventory getStonecutterInventory() {
++        return stonecutterInventory;
++    }
++
++    @NotNull
++    public StonecuttingRecipe getStonecuttingRecipe() {
++        return stonecuttingRecipe;
++    }
++
++    public void setStonecuttingRecipe(@NotNull StonecuttingRecipe stonecuttingRecipe) {
++        this.stonecuttingRecipe = stonecuttingRecipe;
++    }
++
++    @Override
++    public boolean isCancelled() {
++        return cancelled;
++    }
++
++    @Override
++    public void setCancelled(boolean cancel) {
++        this.cancelled = cancel;
++    }
++
++    @NotNull
++    @Override
++    public HandlerList getHandlers() {
++        return HANDLER_LIST;
++    }
++
++    @NotNull
++    public static HandlerList getHandlerList() {
++        return HANDLER_LIST;
++    }
++}
diff --git a/Spigot-Server-Patches/Added-PlayerStonecutterRecipeSelectEvent.patch b/Spigot-Server-Patches/Added-PlayerStonecutterRecipeSelectEvent.patch
new file mode 100644
index 0000000000..ea5fea46e1
--- /dev/null
+++ b/Spigot-Server-Patches/Added-PlayerStonecutterRecipeSelectEvent.patch
@@ -0,0 +1,109 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <jake.m.potrebic@gmail.com>
+Date: Fri, 27 Nov 2020 17:14:27 -0800
+Subject: [PATCH] Added PlayerStonecutterRecipeSelectEvent
+
+Co-Authored-By: MiniDigger | Martin <admin@minidigger.dev>
+
+diff --git a/src/main/java/net/minecraft/server/Container.java b/src/main/java/net/minecraft/server/Container.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/Container.java
++++ b/src/main/java/net/minecraft/server/Container.java
+@@ -0,0 +0,0 @@ public abstract class Container {
+         return slot;
+     }
+ 
+-    protected ContainerProperty a(ContainerProperty containerproperty) {
++    protected ContainerProperty addDataSlot(ContainerProperty containerproperty) { return a(containerproperty); } protected ContainerProperty a(ContainerProperty containerproperty) { // Paper - OBFHELPER
+         this.d.add(containerproperty);
+         return containerproperty;
+     }
+diff --git a/src/main/java/net/minecraft/server/ContainerProperty.java b/src/main/java/net/minecraft/server/ContainerProperty.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/ContainerProperty.java
++++ b/src/main/java/net/minecraft/server/ContainerProperty.java
+@@ -0,0 +0,0 @@ public abstract class ContainerProperty {
+         };
+     }
+ 
+-    public static ContainerProperty a(final int[] aint, final int i) {
++    public static ContainerProperty shared(final int[] aint, final int i) { return a(aint, i); } public static ContainerProperty a(final int[] aint, final int i) { // Paper - OBFHELPER
+         return new ContainerProperty() {
+             @Override
+             public int get() {
+@@ -0,0 +0,0 @@ public abstract class ContainerProperty {
+ 
+     public abstract void set(int i);
+ 
+-    public boolean c() {
++    public boolean checkAndClearUpdateFlag() { return c(); } public boolean c() { // Paper - OBFHELPER
+         int i = this.get();
+         boolean flag = i != this.a;
+ 
+diff --git a/src/main/java/net/minecraft/server/ContainerStonecutter.java b/src/main/java/net/minecraft/server/ContainerStonecutter.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/ContainerStonecutter.java
++++ b/src/main/java/net/minecraft/server/ContainerStonecutter.java
+@@ -0,0 +0,0 @@ import org.bukkit.craftbukkit.inventory.CraftInventoryStonecutter;
+ import org.bukkit.craftbukkit.inventory.CraftInventoryView;
+ import org.bukkit.entity.Player;
+ // CraftBukkit end
++import io.papermc.paper.event.player.PlayerStonecutterRecipeSelectEvent; // Paper
+ 
+ public class ContainerStonecutter extends Container {
+ 
+     private final ContainerAccess containerAccess;
+     private final ContainerProperty containerProperty;
+     private final World world;
+-    private List<RecipeStonecutting> i;
++    private List<RecipeStonecutting> i; public final List<RecipeStonecutting> getRecipes() { return this.i; } // Paper - OBFHELPER
+     private ItemStack j;
+     private long k;
+     final Slot c;
+@@ -0,0 +0,0 @@ public class ContainerStonecutter extends Container {
+ 
+     public ContainerStonecutter(int i, PlayerInventory playerinventory, final ContainerAccess containeraccess) {
+         super(Containers.STONECUTTER, i);
+-        this.containerProperty = ContainerProperty.a();
++        this.containerProperty = addDataSlot(ContainerProperty.shared(new int[1], 0)); // Paper - allow replication
+         this.i = Lists.newArrayList();
+         this.j = ItemStack.b;
+         this.l = () -> {
+@@ -0,0 +0,0 @@ public class ContainerStonecutter extends Container {
+     @Override
+     public boolean a(EntityHuman entityhuman, int i) {
+         if (this.d(i)) {
+-            this.containerProperty.set(i);
++            // Paper start
++            int recipeIndex = i;
++            this.containerProperty.set(recipeIndex);
++            this.containerProperty.checkAndClearUpdateFlag(); // mark as changed
++            if (this.isValidRecipeIndex(i)) {
++                PlayerStonecutterRecipeSelectEvent event = new PlayerStonecutterRecipeSelectEvent((Player) entityhuman.getBukkitEntity(), (org.bukkit.inventory.StonecutterInventory) getBukkitView().getTopInventory(), (org.bukkit.inventory.StonecuttingRecipe) this.getRecipes().get(i).toBukkitRecipe());
++                if (!event.callEvent()) {
++                    ((Player) entityhuman.getBukkitEntity()).updateInventory();
++                    return false;
++                }
++                int newRecipeIndex;
++                if (!this.getRecipes().get(recipeIndex).getKey().equals(org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(event.getStonecuttingRecipe().getKey()))) { // If the recipe did NOT stay the same
++                    for (newRecipeIndex = 0; newRecipeIndex < this.getRecipes().size(); newRecipeIndex++) {
++                        if (this.getRecipes().get(newRecipeIndex).getKey().equals(org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(event.getStonecuttingRecipe().getKey()))) {
++                            recipeIndex = newRecipeIndex;
++                            break;
++                        }
++                    }
++                }
++            }
++            ((Player) entityhuman.getBukkitEntity()).updateInventory();
++            this.containerProperty.set(recipeIndex); // set new index, so that listeners can read it
++            // Paper end
+             this.i();
+         }
+ 
+         return true;
+     }
+ 
++    private boolean isValidRecipeIndex(int index) { return this.d(index); } // Paper - OBFHELPER
+     private boolean d(int i) {
+         return i >= 0 && i < this.i.size();
+     }