Add PrepareResultEvent

Adds a new event for all crafting stations that generate a result slot item

Anvil, Grindstone and Smithing now extend this event
This commit is contained in:
William Blake Galbreath 2020-07-03 11:58:56 -05:00
parent e3bd1e8117
commit ea5eaa7503
8 changed files with 121 additions and 27 deletions

View file

@ -126,7 +126,15 @@
}
public static int calculateIncreasedRepairCost(int cost) {
@@ -329,4 +349,19 @@
@@ -313,6 +333,7 @@
}
this.createResult();
+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, RESULT_SLOT); // Paper - Add PrepareResultEvent
return true;
} else {
return false;
@@ -329,4 +350,19 @@
public int getCost() {
return this.cost.get();
}

View file

@ -109,7 +109,15 @@
return stillValid(this.access, player, Blocks.CARTOGRAPHY_TABLE);
}
@@ -147,7 +183,7 @@
@@ -104,6 +140,7 @@
this.setupResultSlot(itemstack, itemstack1, itemstack2);
}
+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, RESULT_SLOT); // Paper - Add PrepareResultEvent
}
private void setupResultSlot(ItemStack map, ItemStack item, ItemStack oldResult) {
@@ -147,7 +184,7 @@
}
@Override
@ -118,7 +126,7 @@
ItemStack itemstack = ItemStack.EMPTY;
Slot slot1 = (Slot) this.slots.get(slot);
@@ -199,7 +235,7 @@
@@ -199,7 +236,7 @@
}
@Override

View file

@ -39,17 +39,16 @@
public static final int MAX_NAME_LENGTH = 35;
public static final int INPUT_SLOT = 0;
public static final int ADDITIONAL_SLOT = 1;
@@ -46,16 +66,23 @@
public void setChanged() {
@@ -47,15 +67,22 @@
super.setChanged();
GrindstoneMenu.this.slotsChanged(this);
+ }
}
+
+ // CraftBukkit start
+ @Override
+ public Location getLocation() {
+ return context.getLocation();
}
+ }
+ // CraftBukkit end
};
this.access = context;
@ -86,7 +85,13 @@
}
@Override
@@ -125,7 +153,8 @@
@@ -120,12 +148,14 @@
super.slotsChanged(inventory);
if (inventory == this.repairSlots) {
this.createResult();
+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, RESULT_SLOT); // Paper - Add PrepareResultEvent
}
}
private void createResult() {
@ -96,7 +101,7 @@
this.broadcastChanges();
}
@@ -218,7 +247,7 @@
@@ -218,7 +248,7 @@
}
@Override
@ -105,7 +110,7 @@
super.removed(player);
this.access.execute((world, blockposition) -> {
this.clearContainer(player, this.repairSlots);
@@ -226,12 +255,13 @@
@@ -226,12 +256,13 @@
}
@Override

View file

@ -9,7 +9,15 @@
@Override
public boolean mayPlace(ItemStack stack) {
return itemcombinermenuslotdefinition_b.mayPlace().test(stack);
@@ -110,6 +110,7 @@
@@ -96,6 +96,7 @@
super.slotsChanged(inventory);
if (inventory == this.inputSlots) {
this.createResult();
+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, this instanceof SmithingMenu ? 3 : 2); // Paper - Add PrepareResultEvent
}
}
@@ -110,6 +111,7 @@
@Override
public boolean stillValid(Player player) {

View file

@ -39,7 +39,7 @@
private static final int PATTERN_NOT_SET = -1;
private static final int INV_SLOT_START = 4;
private static final int INV_SLOT_END = 31;
@@ -60,6 +80,13 @@
@@ -60,28 +80,42 @@
LoomMenu.this.slotsChanged(this);
LoomMenu.this.slotUpdateListener.run();
}
@ -53,16 +53,16 @@
};
this.outputContainer = new SimpleContainer(1) {
@Override
@@ -67,21 +94,28 @@
public void setChanged() {
super.setChanged();
LoomMenu.this.slotUpdateListener.run();
}
+ }
+
+ // CraftBukkit start
+ @Override
+ public Location getLocation() {
+ return context.getLocation();
+ }
}
+ // CraftBukkit end
};
this.access = context;
@ -123,7 +123,17 @@
if (id >= 0 && id < this.selectablePatterns.size()) {
this.selectedBannerPatternIndex.set(id);
this.setupResultSlot((Holder) this.selectablePatterns.get(id));
@@ -222,7 +258,7 @@
@@ -201,7 +237,8 @@
this.resultSlot.set(ItemStack.EMPTY);
}
- this.broadcastChanges();
+ // this.broadcastChanges(); // Paper - Add PrepareResultEvent; done below
+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, 3); // Paper - Add PrepareResultEvent
} else {
this.resultSlot.set(ItemStack.EMPTY);
this.selectablePatterns = List.of();
@@ -222,7 +259,7 @@
}
@Override
@ -132,7 +142,7 @@
ItemStack itemstack = ItemStack.EMPTY;
Slot slot1 = (Slot) this.slots.get(slot);
@@ -277,7 +313,7 @@
@@ -277,7 +314,7 @@
}
@Override
@ -141,7 +151,7 @@
super.removed(player);
this.access.execute((world, blockposition) -> {
this.clearContainer(player, this.inputContainer);
@@ -294,6 +330,11 @@
@@ -294,6 +331,11 @@
DyeColor enumcolor = ((DyeItem) itemstack1.getItem()).getDyeColor();
itemstack2.update(DataComponents.BANNER_PATTERNS, BannerPatternLayers.EMPTY, (bannerpatternlayers) -> {

View file

@ -18,7 +18,14 @@
public SmithingMenu(int syncId, Inventory playerInventory) {
this(syncId, playerInventory, ContainerLevelAccess.NULL);
@@ -117,7 +121,7 @@
@@ -111,13 +115,14 @@
this.hasRecipeError.set(flag ? 1 : 0);
}
+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, RESULT_SLOT); // Paper - Add PrepareResultEvent
}
@Override
public void createResult() {
SmithingRecipeInput smithingrecipeinput = this.createRecipeInput();
Level world = this.level;
@ -27,7 +34,7 @@
if (world instanceof ServerLevel worldserver) {
optional = worldserver.recipeAccess().getRecipeFor(RecipeType.SMITHING, smithingrecipeinput, worldserver);
@@ -129,7 +133,9 @@
@@ -129,7 +134,9 @@
ItemStack itemstack = ((SmithingRecipe) recipeholder.value()).assemble(smithingrecipeinput, this.level.registryAccess());
this.resultSlots.setRecipeUsed(recipeholder);
@ -38,7 +45,7 @@
}, () -> {
this.resultSlots.setRecipeUsed((RecipeHolder) null);
this.resultSlots.setItem(0, ItemStack.EMPTY);
@@ -149,4 +155,18 @@
@@ -149,4 +156,18 @@
public boolean hasRecipeError() {
return this.hasRecipeError.get() > 0;
}

View file

@ -22,14 +22,14 @@
public class StonecutterMenu extends AbstractContainerMenu {
public static final int INPUT_SLOT = 0;
@@ -36,6 +42,21 @@
@@ -36,7 +42,22 @@
Runnable slotUpdateListener;
public final Container container;
final ResultContainer resultContainer;
+ // CraftBukkit start
+ private CraftStonecutterView bukkitEntity = null;
+ private Player player;
+
+ @Override
+ public CraftStonecutterView getBukkitView() {
+ if (this.bukkitEntity != null) {
@ -41,9 +41,10 @@
+ return this.bukkitEntity;
+ }
+ // CraftBukkit end
+
public StonecutterMenu(int syncId, Inventory playerInventory) {
this(syncId, playerInventory, ContainerLevelAccess.NULL);
}
@@ -55,6 +76,13 @@
StonecutterMenu.this.slotsChanged(this);
StonecutterMenu.this.slotUpdateListener.run();
@ -100,7 +101,15 @@
if (this.selectedRecipeIndex.get() == id) {
return false;
} else {
@@ -158,7 +188,7 @@
@@ -144,6 +174,7 @@
this.setupRecipeList(itemstack);
}
+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareResultEvent(this, RESULT_SLOT); // Paper - Add PrepareResultEvent
}
private void setupRecipeList(ItemStack stack) {
@@ -158,7 +189,7 @@
}
void setupResultSlot(int selectedId) {
@ -109,7 +118,7 @@
if (!this.recipesForInput.isEmpty() && this.isValidRecipeIndex(selectedId)) {
SelectableRecipe.SingleInputEntry<StonecutterRecipe> selectablerecipe_a = (SelectableRecipe.SingleInputEntry) this.recipesForInput.entries().get(selectedId);
@@ -193,7 +223,7 @@
@@ -193,7 +224,7 @@
}
@Override
@ -118,7 +127,7 @@
ItemStack itemstack = ItemStack.EMPTY;
Slot slot1 = (Slot) this.slots.get(slot);
@@ -246,7 +276,7 @@
@@ -246,7 +277,7 @@
}
@Override

View file

@ -1679,6 +1679,12 @@ public class CraftEventFactory {
}
public static PrepareAnvilEvent callPrepareAnvilEvent(AnvilView view, ItemStack item) {
// Paper start - Add PrepareResultEvent
if (true) {
view.getTopInventory().setItem(net.minecraft.world.inventory.AnvilMenu.RESULT_SLOT, CraftItemStack.asCraftMirror(item));
return null; // verify nothing uses return - disable event: handled below in PrepareResult
}
// Paper end - Add PrepareResultEvent
PrepareAnvilEvent event = new PrepareAnvilEvent(view, CraftItemStack.asCraftMirror(item).clone());
event.getView().getPlayer().getServer().getPluginManager().callEvent(event);
event.getInventory().setItem(2, event.getResult());
@ -1686,6 +1692,12 @@ public class CraftEventFactory {
}
public static PrepareGrindstoneEvent callPrepareGrindstoneEvent(InventoryView view, ItemStack item) {
// Paper start - Add PrepareResultEvent
if (true) {
view.getTopInventory().setItem(net.minecraft.world.inventory.GrindstoneMenu.RESULT_SLOT, CraftItemStack.asCraftMirror(item));
return null; // verify nothing uses return - disable event: handled below in PrepareResult
}
// Paper end - Add PrepareResultEvent
PrepareGrindstoneEvent event = new PrepareGrindstoneEvent(view, CraftItemStack.asCraftMirror(item).clone());
event.getView().getPlayer().getServer().getPluginManager().callEvent(event);
event.getInventory().setItem(2, event.getResult());
@ -1693,12 +1705,39 @@ public class CraftEventFactory {
}
public static PrepareSmithingEvent callPrepareSmithingEvent(InventoryView view, ItemStack item) {
// Paper start - Add PrepareResultEvent
if (true) {
view.getTopInventory().setItem(net.minecraft.world.inventory.SmithingMenu.RESULT_SLOT, CraftItemStack.asCraftMirror(item));
return null; // verify nothing uses return - disable event: handled below in PrepareResult
}
// Paper end - Add PrepareResultEvent
PrepareSmithingEvent event = new PrepareSmithingEvent(view, CraftItemStack.asCraftMirror(item).clone());
event.getView().getPlayer().getServer().getPluginManager().callEvent(event);
event.getInventory().setResult(event.getResult());
return event;
}
// Paper start - Add PrepareResultEvent
public static void callPrepareResultEvent(AbstractContainerMenu container, int resultSlot) {
final 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 && view instanceof AnvilView anvilView) {
event = new PrepareAnvilEvent(anvilView, 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 - Add PrepareResultEvent
/**
* Mob spawner event.
*/