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 <jake.m.potrebic@gmail.com>
+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.
++ * <p>
++ * 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<Block> 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<Block> 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<Block> 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.
++     * <p>
++     * 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
++ * <p>
++ * 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<DamageModifier, Double> modifiers, @NotNull final Map<DamageModifier, ? extends Function<? super Double, Double>> 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<DamageModifier, Double> modifiers, @NotNull final Map<DamageModifier, ? extends Function<? super Double, Double>> 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.
++    * <p>
++    * 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 <jake.m.potrebic@gmail.com>
-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.
-+ * <p>
-+ * 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<Block> blocks;
-     private float yield;
-+    private final org.bukkit.block.BlockState explodedBlockState; // Paper
- 
-     public BlockExplodeEvent(@NotNull final Block what, @NotNull final List<Block> blocks, final float yield) {
-+        // Paper start
-+        this(what, blocks, yield, null);
-+    }
-+    public BlockExplodeEvent(@NotNull final Block what, @NotNull final List<Block> 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.
-+     * <p>
-+     * 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 <jake.m.potrebic@gmail.com>
 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 {