165 lines
		
	
	
	
		
			9.5 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
	
		
			9.5 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
						|
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
 | 
						|
Date: Fri, 3 Jul 2020 11:58:56 -0500
 | 
						|
Subject: [PATCH] Add PrepareResultEvent
 | 
						|
 | 
						|
Adds a new event for all crafting stations that generate a result slot item
 | 
						|
 | 
						|
Anvil, Grindstone and Smithing now extend this event
 | 
						|
 | 
						|
diff --git a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
 | 
						|
@@ -0,0 +0,0 @@ public class AnvilMenu extends ItemCombinerMenu {
 | 
						|
             }
 | 
						|
 
 | 
						|
             this.createResult();
 | 
						|
+            org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, RESULT_SLOT); // Paper
 | 
						|
             return true;
 | 
						|
         } else {
 | 
						|
             return false;
 | 
						|
diff --git a/src/main/java/net/minecraft/world/inventory/CartographyTableMenu.java b/src/main/java/net/minecraft/world/inventory/CartographyTableMenu.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/inventory/CartographyTableMenu.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/inventory/CartographyTableMenu.java
 | 
						|
@@ -0,0 +0,0 @@ public class CartographyTableMenu extends AbstractContainerMenu {
 | 
						|
             this.setupResultSlot(itemstack, itemstack1, itemstack2);
 | 
						|
         }
 | 
						|
 
 | 
						|
+        org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, RESULT_SLOT); // Paper
 | 
						|
     }
 | 
						|
 
 | 
						|
     private void setupResultSlot(ItemStack map, ItemStack item, ItemStack oldResult) {
 | 
						|
diff --git a/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java b/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/inventory/GrindstoneMenu.java
 | 
						|
@@ -0,0 +0,0 @@ public class GrindstoneMenu extends AbstractContainerMenu {
 | 
						|
         super.slotsChanged(inventory);
 | 
						|
         if (inventory == this.repairSlots) {
 | 
						|
             this.createResult();
 | 
						|
+            org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, RESULT_SLOT); // Paper
 | 
						|
         }
 | 
						|
 
 | 
						|
     }
 | 
						|
diff --git a/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java b/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/inventory/ItemCombinerMenu.java
 | 
						|
@@ -0,0 +0,0 @@ public abstract class ItemCombinerMenu extends AbstractContainerMenu {
 | 
						|
         super.slotsChanged(inventory);
 | 
						|
         if (inventory == this.inputSlots) {
 | 
						|
             this.createResult();
 | 
						|
+            org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, this instanceof SmithingMenu ? 3 : 2); // Paper
 | 
						|
         }
 | 
						|
 
 | 
						|
     }
 | 
						|
diff --git a/src/main/java/net/minecraft/world/inventory/LoomMenu.java b/src/main/java/net/minecraft/world/inventory/LoomMenu.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/inventory/LoomMenu.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/inventory/LoomMenu.java
 | 
						|
@@ -0,0 +0,0 @@ public class LoomMenu extends AbstractContainerMenu {
 | 
						|
                 this.resultSlot.set(ItemStack.EMPTY);
 | 
						|
             }
 | 
						|
 
 | 
						|
-            this.broadcastChanges();
 | 
						|
+            // this.broadcastChanges(); // Paper - done below
 | 
						|
+            org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, 3); // Paper
 | 
						|
         } else {
 | 
						|
             this.resultSlot.set(ItemStack.EMPTY);
 | 
						|
             this.selectablePatterns = List.of();
 | 
						|
diff --git a/src/main/java/net/minecraft/world/inventory/SmithingMenu.java b/src/main/java/net/minecraft/world/inventory/SmithingMenu.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/inventory/SmithingMenu.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/inventory/SmithingMenu.java
 | 
						|
@@ -0,0 +0,0 @@ public class SmithingMenu extends ItemCombinerMenu {
 | 
						|
             }
 | 
						|
         }
 | 
						|
 
 | 
						|
+        org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, RESULT_SLOT); // Paper
 | 
						|
     }
 | 
						|
 
 | 
						|
     @Override
 | 
						|
diff --git a/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java b/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/inventory/StonecutterMenu.java
 | 
						|
@@ -0,0 +0,0 @@ public class StonecutterMenu extends AbstractContainerMenu {
 | 
						|
             this.setupRecipeList(inventory, itemstack);
 | 
						|
         }
 | 
						|
 
 | 
						|
+        org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, RESULT_SLOT); // Paper
 | 
						|
     }
 | 
						|
 
 | 
						|
     private void setupRecipeList(Container input, ItemStack stack) {
 | 
						|
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 | 
						|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 | 
						|
@@ -0,0 +0,0 @@ public class CraftEventFactory {
 | 
						|
         return event;
 | 
						|
     }
 | 
						|
 
 | 
						|
-    public static PrepareAnvilEvent callPrepareAnvilEvent(InventoryView view, ItemStack item) {
 | 
						|
-        PrepareAnvilEvent event = new PrepareAnvilEvent(view, CraftItemStack.asCraftMirror(item).clone());
 | 
						|
-        event.getView().getPlayer().getServer().getPluginManager().callEvent(event);
 | 
						|
+    // Paper start - disable this method, handled below
 | 
						|
+    public static void callPrepareAnvilEvent(InventoryView view, ItemStack item) { // Paper - verify nothing uses return - handled below in PrepareResult
 | 
						|
+        PrepareAnvilEvent event = new PrepareAnvilEvent(view, CraftItemStack.asCraftMirror(item)); // Paper - remove clone
 | 
						|
+        //event.getView().getPlayer().getServer().getPluginManager().callEvent(event); // Paper - disable event
 | 
						|
         event.getInventory().setItem(2, event.getResult());
 | 
						|
-        return event;
 | 
						|
+        //return event; // Paper
 | 
						|
     }
 | 
						|
+    // Paper end
 | 
						|
 
 | 
						|
-    public static PrepareGrindstoneEvent callPrepareGrindstoneEvent(InventoryView view, ItemStack item) {
 | 
						|
-        PrepareGrindstoneEvent event = new PrepareGrindstoneEvent(view, CraftItemStack.asCraftMirror(item).clone());
 | 
						|
-        event.getView().getPlayer().getServer().getPluginManager().callEvent(event);
 | 
						|
+    // Paper start - disable this method, handled below
 | 
						|
+    public static void callPrepareGrindstoneEvent(InventoryView view, ItemStack item) {
 | 
						|
+        PrepareGrindstoneEvent event = new PrepareGrindstoneEvent(view, CraftItemStack.asCraftMirror(item)); // Paper - remove clone
 | 
						|
+        // event.getView().getPlayer().getServer().getPluginManager().callEvent(event); // Paper - disable event
 | 
						|
         event.getInventory().setItem(2, event.getResult());
 | 
						|
-        return event;
 | 
						|
+        // return event; // Paper
 | 
						|
     }
 | 
						|
+    // Paper end
 | 
						|
 
 | 
						|
-    public static PrepareSmithingEvent callPrepareSmithingEvent(InventoryView view, ItemStack item) {
 | 
						|
-        PrepareSmithingEvent event = new PrepareSmithingEvent(view, CraftItemStack.asCraftMirror(item).clone());
 | 
						|
-        event.getView().getPlayer().getServer().getPluginManager().callEvent(event);
 | 
						|
+    // Paper start - disable this method, handled in callPrepareResultEvent
 | 
						|
+    public static void callPrepareSmithingEvent(InventoryView view, ItemStack item) { // Paper - verify nothing uses return - handled below in PrepareResult
 | 
						|
+        PrepareSmithingEvent event = new PrepareSmithingEvent(view, CraftItemStack.asCraftMirror(item)); // Paper - remove clone
 | 
						|
+        //event.getView().getPlayer().getServer().getPluginManager().callEvent(event); // Paper - disable event
 | 
						|
         event.getInventory().setResult(event.getResult());
 | 
						|
-        return event;
 | 
						|
+        //return event; // Paper
 | 
						|
     }
 | 
						|
+    // Paper end
 | 
						|
+
 | 
						|
+    // Paper start - support specific overrides for prepare result
 | 
						|
+    public static void callPrepareResultEvent(AbstractContainerMenu container, int resultSlot) {
 | 
						|
+        com.destroystokyo.paper.event.inventory.PrepareResultEvent event;
 | 
						|
+        InventoryView view = container.getBukkitView();
 | 
						|
+        org.bukkit.inventory.ItemStack origItem = view.getTopInventory().getItem(resultSlot);
 | 
						|
+        CraftItemStack result = origItem != null ? CraftItemStack.asCraftCopy(origItem) : null;
 | 
						|
+        if (view.getTopInventory() instanceof org.bukkit.inventory.AnvilInventory) {
 | 
						|
+            event = new PrepareAnvilEvent(view, result);
 | 
						|
+        } else if (view.getTopInventory() instanceof org.bukkit.inventory.GrindstoneInventory) {
 | 
						|
+            event = new PrepareGrindstoneEvent(view, result);
 | 
						|
+        } else if (view.getTopInventory() instanceof org.bukkit.inventory.SmithingInventory) {
 | 
						|
+            event = new PrepareSmithingEvent(view, result);
 | 
						|
+        } else {
 | 
						|
+            event = new com.destroystokyo.paper.event.inventory.PrepareResultEvent(view, result);
 | 
						|
+        }
 | 
						|
+        event.callEvent();
 | 
						|
+        event.getInventory().setItem(resultSlot, event.getResult());
 | 
						|
+        container.broadcastChanges();;
 | 
						|
+    }
 | 
						|
+    // Paper end
 | 
						|
 
 | 
						|
     /**
 | 
						|
      * Mob spawner event.
 |