From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Fri, 27 Nov 2020 17:14:27 -0800 Subject: [PATCH] Added PlayerStonecutterRecipeSelectEvent Co-Authored-By: MiniDigger diff --git a/src/main/java/net/minecraft/world/inventory/Container.java b/src/main/java/net/minecraft/world/inventory/Container.java index cd30924d2b7768bbc9a429462319c8ca0822444d..eddd35c91f590755fe11a05c73f3b75a89294175 100644 --- a/src/main/java/net/minecraft/world/inventory/Container.java +++ b/src/main/java/net/minecraft/world/inventory/Container.java @@ -117,7 +117,7 @@ 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/world/inventory/ContainerProperty.java b/src/main/java/net/minecraft/world/inventory/ContainerProperty.java index 67c3b7ddb0b0f10c82577cbea7506c9d80d41368..b9c82e68a811c2ef6bf2d5ce3ae9f858bcb263d5 100644 --- a/src/main/java/net/minecraft/world/inventory/ContainerProperty.java +++ b/src/main/java/net/minecraft/world/inventory/ContainerProperty.java @@ -20,7 +20,7 @@ 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() { @@ -54,7 +54,7 @@ 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/world/inventory/ContainerStonecutter.java b/src/main/java/net/minecraft/world/inventory/ContainerStonecutter.java index 1589d9ca201d386d11d9fd57fa8ba6848bae215c..dc667dd5d8514ae4c8a2087cb913f44320ebfc48 100644 --- a/src/main/java/net/minecraft/world/inventory/ContainerStonecutter.java +++ b/src/main/java/net/minecraft/world/inventory/ContainerStonecutter.java @@ -22,13 +22,14 @@ 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 i; + private List i; public final List getRecipes() { return this.i; } // Paper - OBFHELPER private ItemStack j; private long k; final Slot c; @@ -58,7 +59,7 @@ 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 = () -> { @@ -136,13 +137,36 @@ 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(); }