From a0765eb7dfa111485ad0840c0e879cc6edff3ed1 Mon Sep 17 00:00:00 2001 From: Pedro <3602279+Doc94@users.noreply.github.com> Date: Wed, 12 Jul 2023 15:12:12 -0400 Subject: [PATCH] Handle block state in EntityDamageByBlockEvent (#9396) --- ...ck-state-to-BlockExplodeEvent-and-En.patch | 130 ++++++++++++++++++ ...ded-block-state-to-BlockExplodeEvent.patch | 63 --------- ...k-state-to-BlockExplodeEvent-and-En.patch} | 16 ++- 3 files changed, 145 insertions(+), 64 deletions(-) create mode 100644 patches/api/Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch delete mode 100644 patches/api/Add-exploded-block-state-to-BlockExplodeEvent.patch rename patches/server/{Add-exploded-block-state-to-BlockExplodeEvent.patch => Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch} (87%) diff --git a/patches/api/Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch b/patches/api/Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch new file mode 100644 index 0000000000..4b2b2a4912 --- /dev/null +++ b/patches/api/Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch @@ -0,0 +1,130 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Fri, 22 Oct 2021 16:24:17 -0700 +Subject: [PATCH] Add exploded block state to BlockExplodeEvent and + EntityDamageByBlockEvent + + +diff --git a/src/main/java/org/bukkit/event/block/BlockExplodeEvent.java b/src/main/java/org/bukkit/event/block/BlockExplodeEvent.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/event/block/BlockExplodeEvent.java ++++ b/src/main/java/org/bukkit/event/block/BlockExplodeEvent.java +@@ -0,0 +0,0 @@ import org.jetbrains.annotations.NotNull; + * Called when a block explodes interacting with blocks. The + * event isn't called if the {@link org.bukkit.GameRule#MOB_GRIEFING} + * is disabled as no block interaction will occur. ++ *

++ * The {@link Block} returned by this event is not necessarily ++ * the block that caused the explosion, just the block at the location where ++ * the explosion originated. See {@link #getExplodedBlockState()} + */ + public class BlockExplodeEvent extends BlockEvent implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + private boolean cancel; + private final List blocks; + private float yield; ++ private final org.bukkit.block.BlockState explodedBlockState; // Paper + ++ @Deprecated @io.papermc.paper.annotation.DoNotUse // Paper + public BlockExplodeEvent(@NotNull final Block what, @NotNull final List blocks, final float yield) { ++ // Paper start ++ this(what, blocks, yield, null); ++ } ++ @org.jetbrains.annotations.ApiStatus.Internal ++ public BlockExplodeEvent(@NotNull final Block what, @NotNull final List blocks, final float yield, @org.jetbrains.annotations.Nullable org.bukkit.block.BlockState explodedBlockState) { ++ // Paper end + super(what); + this.blocks = blocks; + this.yield = yield; + this.cancel = false; ++ this.explodedBlockState = explodedBlockState; // Paper + } + + @Override +@@ -0,0 +0,0 @@ public class BlockExplodeEvent extends BlockEvent implements Cancellable { + this.cancel = cancel; + } + ++ // Paper start ++ /** ++ * Get a capture of the block that directly caused ++ * the explosion, like a bed or respawn anchor. This ++ * block state is not placed so {@link org.bukkit.block.BlockState#isPlaced} ++ * will be false. ++ *

++ * Can be null if no block directly caused the explosion. ++ * ++ * @return the exploded block state or null if not applicable ++ */ ++ public @org.jetbrains.annotations.Nullable org.bukkit.block.BlockState getExplodedBlockState() { ++ return this.explodedBlockState; ++ } ++ // Paper end ++ + /** + * Returns the list of blocks that would have been removed or were removed + * from the explosion event. +diff --git a/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java b/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java ++++ b/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java +@@ -0,0 +0,0 @@ import org.jetbrains.annotations.Nullable; + + /** + * Called when an entity is damaged by a block ++ *

++ * For explosions, the Block returned by {@link #getDamager()} has ++ * already been cleared. See {@link #getDamagerBlockState()} for a snapshot ++ * of the block if it has already been changed. + */ + public class EntityDamageByBlockEvent extends EntityDamageEvent { + private final Block damager; ++ private final org.bukkit.block.BlockState damagerBlockState; // Paper + + public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, final double damage) { ++ // Paper start ++ this(damager, damagee, cause, damage, null); ++ } ++ @org.jetbrains.annotations.ApiStatus.Internal ++ public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, final double damage, final @Nullable org.bukkit.block.BlockState damagerBlockState) { ++ // Paper end + super(damagee, cause, damage); + this.damager = damager; ++ this.damagerBlockState = damagerBlockState; // Paper + } + + public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final Map modifiers, @NotNull final Map> modifierFunctions) { ++ // Paper start ++ this(damager, damagee, cause, modifiers, modifierFunctions, null); ++ } ++ ++ @org.jetbrains.annotations.ApiStatus.Internal ++ public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final Map modifiers, @NotNull final Map> modifierFunctions, final @Nullable org.bukkit.block.BlockState damagerBlockState) { ++ // Paper end + super(damagee, cause, modifiers, modifierFunctions); + this.damager = damager; ++ this.damagerBlockState = damagerBlockState; // Paper + } + + /** +@@ -0,0 +0,0 @@ public class EntityDamageByBlockEvent extends EntityDamageEvent { + public Block getDamager() { + return damager; + } ++ ++ // Paper start ++ /** ++ * Get a capture of the block that directly caused ++ * the damage, like a bed or respawn anchor. This ++ * block state is not placed so {@link org.bukkit.block.BlockState#isPlaced} ++ * will be false. ++ *

++ * Can be null if the block wasn't changed before the event ++ * ++ * @return the damager block state or null if not applicable ++ */ ++ public @Nullable org.bukkit.block.BlockState getDamagerBlockState() { ++ return this.damagerBlockState; ++ } ++ // Paper end + } diff --git a/patches/api/Add-exploded-block-state-to-BlockExplodeEvent.patch b/patches/api/Add-exploded-block-state-to-BlockExplodeEvent.patch deleted file mode 100644 index c6e29729d6..0000000000 --- a/patches/api/Add-exploded-block-state-to-BlockExplodeEvent.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Jake Potrebic -Date: Fri, 22 Oct 2021 16:24:17 -0700 -Subject: [PATCH] Add exploded block state to BlockExplodeEvent - - -diff --git a/src/main/java/org/bukkit/event/block/BlockExplodeEvent.java b/src/main/java/org/bukkit/event/block/BlockExplodeEvent.java -index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 ---- a/src/main/java/org/bukkit/event/block/BlockExplodeEvent.java -+++ b/src/main/java/org/bukkit/event/block/BlockExplodeEvent.java -@@ -0,0 +0,0 @@ import org.jetbrains.annotations.NotNull; - * Called when a block explodes interacting with blocks. The - * event isn't called if the {@link org.bukkit.GameRule#MOB_GRIEFING} - * is disabled as no block interaction will occur. -+ *

-+ * The {@link Block} returned by this event is not necessarily -+ * the block that caused the explosion, just the block at the location where -+ * the explosion originated. See {@link #getExplodedBlockState()} - */ - public class BlockExplodeEvent extends BlockEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - private boolean cancel; - private final List blocks; - private float yield; -+ private final org.bukkit.block.BlockState explodedBlockState; // Paper - - public BlockExplodeEvent(@NotNull final Block what, @NotNull final List blocks, final float yield) { -+ // Paper start -+ this(what, blocks, yield, null); -+ } -+ public BlockExplodeEvent(@NotNull final Block what, @NotNull final List blocks, final float yield, @org.jetbrains.annotations.Nullable org.bukkit.block.BlockState explodedBlockState) { -+ // Paper end - super(what); - this.blocks = blocks; - this.yield = yield; - this.cancel = false; -+ this.explodedBlockState = explodedBlockState; // Paper - } - - @Override -@@ -0,0 +0,0 @@ public class BlockExplodeEvent extends BlockEvent implements Cancellable { - this.cancel = cancel; - } - -+ // Paper start -+ /** -+ * Get a capture of the block that directly caused -+ * the explosion, like a bed or respawn anchor. This -+ * block state is not placed so {@link org.bukkit.block.BlockState#isPlaced} -+ * will be false. -+ *

-+ * Can be null if no block directly caused the explosion. -+ * -+ * @return the exploded block state or null if not applicable -+ */ -+ public @org.jetbrains.annotations.Nullable org.bukkit.block.BlockState getExplodedBlockState() { -+ return this.explodedBlockState; -+ } -+ // Paper end -+ - /** - * Returns the list of blocks that would have been removed or were removed - * from the explosion event. diff --git a/patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch b/patches/server/Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch similarity index 87% rename from patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch rename to patches/server/Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch index 5ed94643e9..285af3dac1 100644 --- a/patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch +++ b/patches/server/Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch @@ -1,7 +1,8 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Fri, 22 Oct 2021 16:25:07 -0700 -Subject: [PATCH] Add exploded block state to BlockExplodeEvent +Subject: [PATCH] Add exploded block state to BlockExplodeEvent and + EntityDamageByBlockEvent diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java @@ -128,3 +129,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 // See BlockStateFactory#createBlockState(World, BlockPosition, IBlockData, TileEntity) private static CraftBlockState getBlockState(World world, BlockPos blockPosition, net.minecraft.world.level.block.state.BlockState blockData, BlockEntity tileEntity) { +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 { + CraftEventFactory.entityDamage = null; + EntityDamageEvent event; + if (damager == null) { +- event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.BLOCK_EXPLOSION, modifiers, modifierFunctions); ++ event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.BLOCK_EXPLOSION, modifiers, modifierFunctions, source.explodedBlockState); // Paper - handle block state in damage + } else if (entity instanceof EnderDragon && /*PAIL FIXME ((EntityEnderDragon) entity).target == damager*/ false) { + event = new EntityDamageEvent(entity.getBukkitEntity(), DamageCause.ENTITY_EXPLOSION, modifiers, modifierFunctions); + } else {