From cc791152b1f8dba4b04071cd776a341fe83bbe6e Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Thu, 8 Jul 2021 22:46:38 -0700 Subject: [PATCH] Added PlayerAngerPiglinByInteractionEvent --- ...-PlayerAngerPiglinByInteractionEvent.patch | 105 ++++++++++++ ...-PlayerAngerPiglinByInteractionEvent.patch | 162 ++++++++++++++++++ 2 files changed, 267 insertions(+) create mode 100644 patches/api/0424-Added-PlayerAngerPiglinByInteractionEvent.patch create mode 100644 patches/server/1003-Added-PlayerAngerPiglinByInteractionEvent.patch diff --git a/patches/api/0424-Added-PlayerAngerPiglinByInteractionEvent.patch b/patches/api/0424-Added-PlayerAngerPiglinByInteractionEvent.patch new file mode 100644 index 000000000..211d236de --- /dev/null +++ b/patches/api/0424-Added-PlayerAngerPiglinByInteractionEvent.patch @@ -0,0 +1,105 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Mon, 4 Jan 2021 23:47:38 -0800 +Subject: [PATCH] Added PlayerAngerPiglinByInteractionEvent + + +diff --git a/src/main/java/io/papermc/paper/event/player/PlayerAngerPiglinByInteractionEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerAngerPiglinByInteractionEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..baf1d83a6eed9daf45a2620e74f5355130ccc8e9 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/event/player/PlayerAngerPiglinByInteractionEvent.java +@@ -0,0 +1,93 @@ ++package io.papermc.paper.event.player; ++ ++import org.bukkit.Location; ++import org.bukkit.entity.Piglin; ++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.InventoryHolder; ++import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; ++ ++import java.util.List; ++ ++/** ++ * Called when a player interacts with a chest-like block ++ * or destroys a block tagged as guarded by piglins. ++ */ ++public class PlayerAngerPiglinByInteractionEvent extends PlayerEvent implements Cancellable { ++ ++ private static final HandlerList HANDLER_LIST = new HandlerList(); ++ ++ private final Location location; ++ private final boolean openBlock; ++ private final InventoryHolder source; ++ private final List piglinsToBeAngered; ++ private boolean cancelled; ++ ++ public PlayerAngerPiglinByInteractionEvent(@NotNull Player player, @NotNull Location location, boolean openBlock, @Nullable InventoryHolder source, @NotNull List piglinsToBeAngered) { ++ super(player); ++ this.location = location; ++ this.openBlock = openBlock; ++ this.source = source; ++ this.piglinsToBeAngered = piglinsToBeAngered; ++ } ++ ++ /** ++ * Gets the list of piglins that will be angered by this interaction. ++ * This list is mutable and changes to it will be reflected on the server. ++ * ++ * @return the list of piglins. ++ */ ++ public @NotNull List getPiglinsToBeAngered() { ++ return piglinsToBeAngered; ++ } ++ ++ /** ++ * Gets the location of the source. ++ * ++ * @return the location of the source ++ */ ++ public @NotNull Location getLocation() { ++ return location; ++ } ++ ++ /** ++ * Gets if the interaction was the opening of a block. ++ * ++ * @return true if open a block, false if breaking a block ++ */ ++ public boolean isOpenBlock() { ++ return openBlock; ++ } ++ ++ /** ++ * If the interaction was opening of a inventory, this returns the block or entities ++ * associated with that inventory. ++ * ++ * @return the inventory holder ++ */ ++ public @Nullable InventoryHolder getSource() { ++ return source; ++ } ++ ++ @Override ++ public boolean isCancelled() { ++ return cancelled; ++ } ++ ++ @Override ++ public void setCancelled(boolean cancel) { ++ this.cancelled = cancel; ++ } ++ ++ @Override ++ public @NotNull HandlerList getHandlers() { ++ return HANDLER_LIST; ++ } ++ ++ public static @NotNull HandlerList getHandlerList() { ++ return HANDLER_LIST; ++ } ++} diff --git a/patches/server/1003-Added-PlayerAngerPiglinByInteractionEvent.patch b/patches/server/1003-Added-PlayerAngerPiglinByInteractionEvent.patch new file mode 100644 index 000000000..d6c1d2eb4 --- /dev/null +++ b/patches/server/1003-Added-PlayerAngerPiglinByInteractionEvent.patch @@ -0,0 +1,162 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Mon, 4 Jan 2021 23:47:30 -0800 +Subject: [PATCH] Added PlayerAngerPiglinByInteractionEvent + + +diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java +index d98c526676202741e628d5e317b8cdd3f4d3be0a..d52752a9c616a1bc9832fb66472fb97d61dc9b2c 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java ++++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java +@@ -480,13 +480,31 @@ public class PiglinAi { + } + } + ++ @io.papermc.paper.annotation.DoNotUse // Paper - do not use outdated method. + public static void angerNearbyPiglins(Player player, boolean blockOpen) { ++ // Paper start - add PlayerAngerPiglinEvent ++ PiglinAi.angerNearbyPiglins(player, blockOpen, null, null); ++ } ++ ++ public static void angerNearbyPiglins(Player player, boolean blockOpen, @javax.annotation.Nullable org.bukkit.Location location, @javax.annotation.Nullable org.bukkit.inventory.InventoryHolder inventoryHolder) { ++ // Paper end - add PlayerAngerPiglinEvent + if (!player.level().paperConfig().entities.behavior.piglinsGuardChests) return; // Paper + List list = player.level().getEntitiesOfClass(Piglin.class, player.getBoundingBox().inflate(16.0D)); + +- list.stream().filter(PiglinAi::isIdle).filter((entitypiglin) -> { +- return !blockOpen || BehaviorUtils.canSee(entitypiglin, player); +- }).forEach((entitypiglin) -> { ++ // Paper start - replace streams and call event ++ List piglinsToBeAngered = com.google.common.collect.Lists.newArrayList(); ++ for (AbstractPiglin entitypiglin : list) { ++ if (PiglinAi.isIdle(entitypiglin) && (!blockOpen || BehaviorUtils.canSee(entitypiglin, player))) { ++ piglinsToBeAngered.add((org.bukkit.entity.Piglin) entitypiglin.getBukkitEntity()); // safe cast because the original list gets the Piglin class ++ } ++ } ++ if (location != null) { ++ io.papermc.paper.event.player.PlayerAngerPiglinByInteractionEvent event = new io.papermc.paper.event.player.PlayerAngerPiglinByInteractionEvent((org.bukkit.entity.Player) player.getBukkitEntity(), location, blockOpen, inventoryHolder, piglinsToBeAngered); ++ if (!event.callEvent()) return; ++ } ++ piglinsToBeAngered.forEach((bukkitPiglin) -> { ++ Piglin entitypiglin = ((org.bukkit.craftbukkit.entity.CraftPiglin) bukkitPiglin).getHandle(); ++ // Paper end + if (entitypiglin.level().getGameRules().getBoolean(GameRules.RULE_UNIVERSAL_ANGER)) { + PiglinAi.setAngerTargetToNearestTargetablePlayerIfFound(entitypiglin, player); + } else { +diff --git a/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java b/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java +index e88c39d405fc7068db64ad34a03dec8d559e749e..b684057cb334f8fbcf1b1e6b7da528f8ba5b01c1 100644 +--- a/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java ++++ b/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java +@@ -100,7 +100,7 @@ public class ChestBoat extends Boat implements HasCustomInventoryScreen, Contain + + if (enuminteractionresult.consumesAction()) { + this.gameEvent(GameEvent.CONTAINER_OPEN, player); +- PiglinAi.angerNearbyPiglins(player, true); ++ PiglinAi.angerNearbyPiglins(player, true, this.getLocation(), this.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder ? (org.bukkit.inventory.InventoryHolder) this.getBukkitEntity() : null); // Paper - add PlayerAngerPiglinEvent + } + + return enuminteractionresult; +@@ -112,7 +112,7 @@ public class ChestBoat extends Boat implements HasCustomInventoryScreen, Contain + player.openMenu(this); + if (!player.level().isClientSide) { + this.gameEvent(GameEvent.CONTAINER_OPEN, player); +- PiglinAi.angerNearbyPiglins(player, true); ++ PiglinAi.angerNearbyPiglins(player, true, this.getLocation(), this.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder ? (org.bukkit.inventory.InventoryHolder) this.getBukkitEntity() : null); // Paper - add PlayerAngerPiglinEvent + } + + } +diff --git a/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java b/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java +index 7529751afa2932fd16bc4591189b0358268a7b14..ceda4df827dfb83738bd1b81be6f41d713aa1311 100644 +--- a/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java ++++ b/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java +@@ -80,7 +80,7 @@ public interface ContainerEntity extends Container, MenuProvider { + if (!world.isClientSide) { + Entity entity = source.getDirectEntity(); + if (entity != null && entity.getType() == EntityType.PLAYER) { +- PiglinAi.angerNearbyPiglins((Player)entity, true); ++ PiglinAi.angerNearbyPiglins((Player)entity, true, getLocation(), this.getEntity().getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder ? (org.bukkit.inventory.InventoryHolder) this.getEntity().getBukkitEntity() : null); // Paper - add PlayerAngerPiglinEvent + } + } + +diff --git a/src/main/java/net/minecraft/world/entity/vehicle/MinecartChest.java b/src/main/java/net/minecraft/world/entity/vehicle/MinecartChest.java +index fd2238f33cf61ca432f69d95455a9524b162f431..88940fe8e928005c1be7af1f8e549a9c6817601e 100644 +--- a/src/main/java/net/minecraft/world/entity/vehicle/MinecartChest.java ++++ b/src/main/java/net/minecraft/world/entity/vehicle/MinecartChest.java +@@ -66,7 +66,7 @@ public class MinecartChest extends AbstractMinecartContainer { + InteractionResult interactionResult = this.interactWithContainerVehicle(player); + if (interactionResult.consumesAction()) { + this.gameEvent(GameEvent.CONTAINER_OPEN, player); +- PiglinAi.angerNearbyPiglins(player, true); ++ PiglinAi.angerNearbyPiglins(player, true, this.getLocation(), this.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder ? (org.bukkit.inventory.InventoryHolder) this.getBukkitEntity() : null); // Paper - add PlayerAngerPiglinEvent + } + + return interactionResult; +diff --git a/src/main/java/net/minecraft/world/level/block/BarrelBlock.java b/src/main/java/net/minecraft/world/level/block/BarrelBlock.java +index 79f19bc122f08d276d96b4490327e228224576fc..d4fe6a0993d66bdf6b297f47fc3937cf803e199e 100644 +--- a/src/main/java/net/minecraft/world/level/block/BarrelBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/BarrelBlock.java +@@ -45,7 +45,8 @@ public class BarrelBlock extends BaseEntityBlock { + if (blockEntity instanceof BarrelBlockEntity) { + player.openMenu((BarrelBlockEntity)blockEntity); + player.awardStat(Stats.OPEN_BARREL); +- PiglinAi.angerNearbyPiglins(player, true); ++ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(world, pos); // Paper ++ PiglinAi.angerNearbyPiglins(player, true, block.getLocation(), block.getState() instanceof org.bukkit.inventory.InventoryHolder ? (org.bukkit.inventory.InventoryHolder) block.getState() : null); // Paper - add PlayerAngerPiglinEvent + } + + return InteractionResult.CONSUME; +diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java +index 9522e646529f3d849471931b4b3c0d133e7fcfc5..1c1ea199dc971d806f113565f347f5fadd2618d2 100644 +--- a/src/main/java/net/minecraft/world/level/block/Block.java ++++ b/src/main/java/net/minecraft/world/level/block/Block.java +@@ -471,7 +471,7 @@ public class Block extends BlockBehaviour implements ItemLike { + public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { + this.spawnDestroyParticles(world, player, pos, state); + if (state.is(BlockTags.GUARDED_BY_PIGLINS)) { +- PiglinAi.angerNearbyPiglins(player, false); ++ PiglinAi.angerNearbyPiglins(player, false, io.papermc.paper.util.MCUtil.toLocation(world, pos), null); // Paper - add PlayerAngerPiglinEvent + } + + world.gameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Context.of(player, state)); +diff --git a/src/main/java/net/minecraft/world/level/block/ChestBlock.java b/src/main/java/net/minecraft/world/level/block/ChestBlock.java +index 5e22d175b1048a58802cdf64ac70a8b56329e915..2bd71be57a74e79d87583ea2277ba8fb33945605 100644 +--- a/src/main/java/net/minecraft/world/level/block/ChestBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/ChestBlock.java +@@ -268,7 +268,8 @@ public class ChestBlock extends AbstractChestBlock implements + if (itileinventory != null) { + player.openMenu(itileinventory); + player.awardStat(this.getOpenChestStat()); +- PiglinAi.angerNearbyPiglins(player, true); ++ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(world, pos); // Paper - add PlayerAngerPiglinEvent ++ PiglinAi.angerNearbyPiglins(player, true, block.getLocation(), block.getState() instanceof org.bukkit.inventory.InventoryHolder ? (org.bukkit.inventory.InventoryHolder) block.getState() : null); // Paper - add PlayerAngerPiglinEvent + } + + return InteractionResult.CONSUME; +diff --git a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java +index 7385e91f32f070e86a4e0fd3d214f55d832c7979..bad23da20785a0821548beb034e34dd6e2ec14d0 100644 +--- a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java +@@ -88,7 +88,8 @@ public class EnderChestBlock extends AbstractChestBlock i + return ChestMenu.threeRows(syncId, inventory, playerEnderChestContainer); + }, CONTAINER_TITLE)); + player.awardStat(Stats.OPEN_ENDERCHEST); +- PiglinAi.angerNearbyPiglins(player, true); ++ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(world, pos); // Paper - add PlayerAngerPiglinEvent ++ PiglinAi.angerNearbyPiglins(player, true, block.getLocation(), null); // Paper - add PlayerAngerPiglinEvent + return InteractionResult.CONSUME; + } + } else { +diff --git a/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java b/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java +index b51155ad12515b2d0dd0f202580b9f455c114d9a..caf33b7884d7e5309e2b07713e8ff483c7879eaa 100644 +--- a/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java +@@ -104,7 +104,8 @@ public class ShulkerBoxBlock extends BaseEntityBlock { + if (canOpen(state, world, pos, shulkerBoxBlockEntity)) { + player.openMenu(shulkerBoxBlockEntity); + player.awardStat(Stats.OPEN_SHULKER_BOX); +- PiglinAi.angerNearbyPiglins(player, true); ++ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(world, pos); // Paper - add PlayerAngerPiglinEvent ++ PiglinAi.angerNearbyPiglins(player, true, block.getLocation(), block.getState() instanceof org.bukkit.inventory.InventoryHolder ? (org.bukkit.inventory.InventoryHolder) block.getState() : null); // Paper - add PlayerAngerPiglinEvent + } + + return InteractionResult.CONSUME;