From 8e5db9955271f9c152d8f529e92f9d987ec3814c Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Fri, 20 Jul 2018 23:37:40 -0500 Subject: [PATCH] AnvilDamageEvent --- .../0125-AnvilDamageEvent.patch | 154 ++++++++++++++++++ .../0299-AnvilDamageEvent.patch | 30 ++++ 2 files changed, 184 insertions(+) create mode 100644 Spigot-API-Patches/0125-AnvilDamageEvent.patch create mode 100644 Spigot-Server-Patches/0299-AnvilDamageEvent.patch diff --git a/Spigot-API-Patches/0125-AnvilDamageEvent.patch b/Spigot-API-Patches/0125-AnvilDamageEvent.patch new file mode 100644 index 000000000..373ec00be --- /dev/null +++ b/Spigot-API-Patches/0125-AnvilDamageEvent.patch @@ -0,0 +1,154 @@ +From 198c7f80a47519d8bb675f7338d0a6c9f3e03c2f Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Fri, 20 Jul 2018 23:36:55 -0500 +Subject: [PATCH] AnvilDamageEvent + + +diff --git a/src/main/java/com/destroystokyo/paper/event/block/AnvilDamagedEvent.java b/src/main/java/com/destroystokyo/paper/event/block/AnvilDamagedEvent.java +new file mode 100644 +index 00000000..fd3c5c02 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/event/block/AnvilDamagedEvent.java +@@ -0,0 +1,139 @@ ++package com.destroystokyo.paper.event.block; ++ ++import org.bukkit.Material; ++import org.bukkit.block.data.BlockData; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.inventory.InventoryEvent; ++import org.bukkit.inventory.AnvilInventory; ++import org.bukkit.inventory.InventoryView; ++ ++/** ++ * Called when an anvil is damaged from being used ++ */ ++public class AnvilDamagedEvent extends InventoryEvent implements Cancellable { ++ private static final HandlerList handlers = new HandlerList(); ++ private boolean cancel; ++ private DamageState damageState; ++ ++ public AnvilDamagedEvent(InventoryView inventory, BlockData blockData) { ++ super(inventory); ++ this.damageState = DamageState.getState(blockData); ++ } ++ ++ @Override ++ public AnvilInventory getInventory() { ++ return (AnvilInventory) super.getInventory(); ++ } ++ ++ /** ++ * Gets the new state of damage on the anvil ++ * ++ * @return Damage state ++ */ ++ public DamageState getDamageState() { ++ return damageState; ++ } ++ ++ /** ++ * Sets the new state of damage on the anvil ++ * ++ * @param damageState Damage state ++ */ ++ public void setDamageState(DamageState damageState) { ++ this.damageState = damageState; ++ } ++ ++ /** ++ * Gets if anvil is breaking on this use ++ * ++ * @return True if breaking ++ */ ++ public boolean isBreaking() { ++ return damageState == DamageState.BROKEN; ++ } ++ ++ /** ++ * Sets if anvil is breaking on this use ++ * ++ * @param breaking True if breaking ++ */ ++ public void setBreaking(boolean breaking) { ++ if (breaking) { ++ damageState = DamageState.BROKEN; ++ } else if (damageState == DamageState.BROKEN) { ++ damageState = DamageState.DAMAGED; ++ } ++ } ++ ++ public boolean isCancelled() { ++ return cancel; ++ } ++ ++ public void setCancelled(boolean cancel) { ++ this.cancel = cancel; ++ } ++ ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++ ++ /** ++ * Represents the amount of damage on an anvil block ++ */ ++ public enum DamageState { ++ FULL(Material.ANVIL), ++ CHIPPED(Material.CHIPPED_ANVIL), ++ DAMAGED(Material.DAMAGED_ANVIL), ++ BROKEN(Material.AIR); ++ ++ private Material material; ++ ++ DamageState(Material material) { ++ this.material = material; ++ } ++ ++ /** ++ * Get block material of this state ++ * ++ * @return Material ++ */ ++ public Material getMaterial() { ++ return material; ++ } ++ ++ /** ++ * Get damaged state by block data ++ * ++ * @param blockData Block data ++ * @return DamageState ++ * @throws IllegalArgumentException If non anvil block data is given ++ */ ++ public static DamageState getState(BlockData blockData) { ++ return blockData == null ? BROKEN : getState(blockData.getMaterial()); ++ } ++ ++ /** ++ * Get damaged state by block material ++ * ++ * @param material Block material ++ * @return DamageState ++ * @throws IllegalArgumentException If non anvil material is given ++ */ ++ public static DamageState getState(Material material) { ++ if (material == null) { ++ return BROKEN; ++ } ++ for (DamageState state : values()) { ++ if (state.material == material) { ++ return state; ++ } ++ } ++ throw new IllegalArgumentException("Material not an anvil"); ++ } ++ } ++} +-- +2.11.0 + diff --git a/Spigot-Server-Patches/0299-AnvilDamageEvent.patch b/Spigot-Server-Patches/0299-AnvilDamageEvent.patch new file mode 100644 index 000000000..e11511cff --- /dev/null +++ b/Spigot-Server-Patches/0299-AnvilDamageEvent.patch @@ -0,0 +1,30 @@ +From eeae913b5048f0d0694f3c0f5877f08461bc4e09 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Fri, 20 Jul 2018 23:37:03 -0500 +Subject: [PATCH] AnvilDamageEvent + + +diff --git a/src/main/java/net/minecraft/server/ContainerAnvil.java b/src/main/java/net/minecraft/server/ContainerAnvil.java +index c252ff6d5..1f0a46aaf 100644 +--- a/src/main/java/net/minecraft/server/ContainerAnvil.java ++++ b/src/main/java/net/minecraft/server/ContainerAnvil.java +@@ -73,6 +73,16 @@ public class ContainerAnvil extends Container { + if (!world.isClientSide) { + if (!entityhuman.abilities.canInstantlyBuild && iblockdata.a(TagsBlock.x) && entityhuman.getRandom().nextFloat() < 0.12F) { + IBlockData iblockdata1 = BlockAnvil.a_(iblockdata); ++ // Paper start ++ com.destroystokyo.paper.event.block.AnvilDamagedEvent event = new com.destroystokyo.paper.event.block.AnvilDamagedEvent(getBukkitView(), org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(iblockdata1)); ++ if (!event.callEvent()) { ++ return itemstack; ++ } else if (event.getDamageState() == com.destroystokyo.paper.event.block.AnvilDamagedEvent.DamageState.BROKEN) { ++ iblockdata1 = null; ++ } else { ++ iblockdata1 = ((org.bukkit.craftbukkit.block.data.CraftBlockData) event.getDamageState().getMaterial().createBlockData()).getState().set(BlockAnvil.FACING, iblockdata.get(BlockAnvil.FACING)); ++ } ++ // Paper end + + if (iblockdata1 == null) { + world.setAir(blockposition); +-- +2.11.0 +