From 95fa3274e961821a3df3967a187c5e3ae0e90384 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Tue, 14 Mar 2023 17:06:28 -0700
Subject: [PATCH] readd exploded block state patch

---
 ...ded-block-state-to-BlockExplodeEvent.patch | 129 ++++++++++++++++++
 patches/server/Adventure.patch                |  16 ---
 patches/server/MC-Dev-fixes.patch             |  13 --
 patches/server/Remap-fixes.patch              |  22 ---
 4 files changed, 129 insertions(+), 51 deletions(-)
 create mode 100644 patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch

diff --git a/patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch b/patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch
new file mode 100644
index 0000000000..1020485044
--- /dev/null
+++ b/patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch
@@ -0,0 +1,129 @@
+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
+
+
+diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java
++++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
+@@ -0,0 +0,0 @@ public class DamageSource {
+         return this;
+     }
+     // CraftBukkit end
++    public @Nullable org.bukkit.block.BlockState explodedBlockState; // Paper - add exploded state
+ 
+     public String toString() {
+         return "DamageSource (" + this.type().msgId() + ")";
+diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSources.java b/src/main/java/net/minecraft/world/damagesource/DamageSources.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/damagesource/DamageSources.java
++++ b/src/main/java/net/minecraft/world/damagesource/DamageSources.java
+@@ -0,0 +0,0 @@ public class DamageSources {
+         return this.source(DamageTypes.SONIC_BOOM, attacker);
+     }
+ 
++    @Deprecated @io.papermc.paper.annotation.DoNotUse // Paper
+     public DamageSource badRespawnPointExplosion(Vec3 position) {
+-        return new DamageSource(this.damageTypes.getHolderOrThrow(DamageTypes.BAD_RESPAWN_POINT), position);
++        // Paper start
++        return this.badRespawnPointExplosion(position, null);
++    }
++
++    public DamageSource badRespawnPointExplosion(Vec3 position, @Nullable org.bukkit.block.BlockState explodedBlockState) {
++        DamageSource source = new DamageSource(this.damageTypes.getHolderOrThrow(DamageTypes.BAD_RESPAWN_POINT), position);
++        source.explodedBlockState = explodedBlockState;
++        return source;
++        // Paper end
+     }
+ }
+diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/Explosion.java
++++ b/src/main/java/net/minecraft/world/level/Explosion.java
+@@ -0,0 +0,0 @@ public class Explosion {
+                 bukkitBlocks = event.blockList();
+                 yield = event.getYield();
+             } else {
+-                BlockExplodeEvent event = new BlockExplodeEvent(location.getBlock(), blockList, this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F);
++                BlockExplodeEvent event = new BlockExplodeEvent(location.getBlock(), blockList, this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F, this.damageSource.explodedBlockState); // Paper - exploded block state
+                 this.level.getCraftServer().getPluginManager().callEvent(event);
+                 cancelled = event.isCancelled();
+                 bukkitBlocks = event.blockList();
+diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/BedBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java
+@@ -0,0 +0,0 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
+ 
+             // CraftBukkit - moved world and biome check into EntityHuman
+             if (false && !BedBlock.canSetSpawn(world)) {
++                final org.bukkit.block.BlockState explodedBlockState = org.bukkit.craftbukkit.block.CraftBlockStates.getUnplacedBlockState(world, pos, state); // Paper - exploded block state (this won't be called due to the false, but it's good for reference)
+                 world.removeBlock(pos, false);
+                 BlockPos blockposition1 = pos.relative(((Direction) state.getValue(BedBlock.FACING)).getOpposite());
+ 
+@@ -0,0 +0,0 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
+ 
+                 Vec3 vec3d = pos.getCenter();
+ 
+-                world.explode((Entity) null, world.damageSources().badRespawnPointExplosion(vec3d), (ExplosionDamageCalculator) null, vec3d, 5.0F, true, Level.ExplosionInteraction.BLOCK);
++                world.explode((Entity) null, world.damageSources().badRespawnPointExplosion(vec3d, explodedBlockState), (ExplosionDamageCalculator) null, vec3d, 5.0F, true, Level.ExplosionInteraction.BLOCK);
+                 return InteractionResult.SUCCESS;
+             } else if ((Boolean) state.getValue(BedBlock.OCCUPIED)) {
+                 if (!this.kickVillagerOutOfBed(world, pos)) {
+@@ -0,0 +0,0 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
+     private InteractionResult explodeBed(BlockState iblockdata, Level world, BlockPos blockposition) {
+         {
+             {
++                final org.bukkit.block.BlockState explodedBlockState = org.bukkit.craftbukkit.block.CraftBlockStates.getUnplacedBlockState(world, blockposition, iblockdata); // Paper - exploded block state
+                 world.removeBlock(blockposition, false);
+                 BlockPos blockposition1 = blockposition.relative(((Direction) iblockdata.getValue(BedBlock.FACING)).getOpposite());
+ 
+@@ -0,0 +0,0 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
+ 
+                 Vec3 vec3d = blockposition.getCenter();
+ 
+-                world.explode((Entity) null, world.damageSources().badRespawnPointExplosion(vec3d), (ExplosionDamageCalculator) null, vec3d, 5.0F, true, Level.ExplosionInteraction.BLOCK);
++                world.explode((Entity) null, world.damageSources().badRespawnPointExplosion(vec3d, explodedBlockState), (ExplosionDamageCalculator) null, vec3d, 5.0F, true, Level.ExplosionInteraction.BLOCK);
+                 return InteractionResult.SUCCESS;
+             }
+         }
+diff --git a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
+@@ -0,0 +0,0 @@ public class RespawnAnchorBlock extends Block {
+     }
+ 
+     private void explode(BlockState state, Level world, final BlockPos explodedPos) {
++        final org.bukkit.block.BlockState explodedBlockState = org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(explodedPos, state, null); // Paper - exploded block state
+         world.removeBlock(explodedPos, false);
+         boolean bl = Direction.Plane.HORIZONTAL.stream().map(explodedPos::relative).anyMatch((pos) -> {
+             return isWaterThatWouldFlow(pos, world);
+@@ -0,0 +0,0 @@ public class RespawnAnchorBlock extends Block {
+             }
+         };
+         Vec3 vec3 = explodedPos.getCenter();
+-        world.explode((Entity)null, world.damageSources().badRespawnPointExplosion(vec3), explosionDamageCalculator, vec3, 5.0F, true, Level.ExplosionInteraction.BLOCK);
++        world.explode((Entity)null, world.damageSources().badRespawnPointExplosion(vec3, explodedBlockState), explosionDamageCalculator, vec3, 5.0F, true, Level.ExplosionInteraction.BLOCK);
+     }
+ 
+     public static boolean canSetSpawn(Level world) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java
++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java
+@@ -0,0 +0,0 @@ public final class CraftBlockStates {
+         BlockEntity tileEntity = (blockEntityTag == null) ? null : BlockEntity.loadStatic(blockPosition, blockData, blockEntityTag);
+         return CraftBlockStates.getBlockState(null, blockPosition, blockData, tileEntity);
+     }
++    // Paper start
++    public static BlockState getUnplacedBlockState(net.minecraft.world.level.BlockGetter levelAccessor, BlockPos blockPos, net.minecraft.world.level.block.state.BlockState blockData) {
++        BlockEntity tileEntity = levelAccessor.getBlockEntity(blockPos);
++        return CraftBlockStates.getBlockState(null, blockPos, blockData, tileEntity);
++    }
++    // Paper end
+ 
+     // 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/patches/server/Adventure.patch b/patches/server/Adventure.patch
index a6538ccb78..50cd8e1ffa 100644
--- a/patches/server/Adventure.patch
+++ b/patches/server/Adventure.patch
@@ -2570,22 +2570,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          return message.hasSignature() && !message.hasExpiredServer(Instant.now());
      }
  
-diff --git a/src/main/java/net/minecraft/util/ExtraCodecs.java b/src/main/java/net/minecraft/util/ExtraCodecs.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/util/ExtraCodecs.java
-+++ b/src/main/java/net/minecraft/util/ExtraCodecs.java
-@@ -0,0 +0,0 @@ public class ExtraCodecs {
-         }
-     }, (text) -> {
-         try {
-+            // Paper start
-+            if (text instanceof io.papermc.paper.adventure.AdventureComponent adventureComponent) {
-+                return DataResult.success(net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson().serializeToTree(adventureComponent.adventure$component()));
-+            }
-+            // Paper end
-             return DataResult.success(Component.Serializer.toJsonTree(text));
-         } catch (IllegalArgumentException var2) {
-             return DataResult.error(var2::getMessage);
 diff --git a/src/main/java/net/minecraft/world/BossEvent.java b/src/main/java/net/minecraft/world/BossEvent.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/BossEvent.java
diff --git a/patches/server/MC-Dev-fixes.patch b/patches/server/MC-Dev-fixes.patch
index 0745a0bc4c..0ae0fb5310 100644
--- a/patches/server/MC-Dev-fixes.patch
+++ b/patches/server/MC-Dev-fixes.patch
@@ -119,19 +119,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          }
      }
  
-diff --git a/src/main/java/net/minecraft/util/ExtraCodecs.java b/src/main/java/net/minecraft/util/ExtraCodecs.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/util/ExtraCodecs.java
-+++ b/src/main/java/net/minecraft/util/ExtraCodecs.java
-@@ -0,0 +0,0 @@ public class ExtraCodecs {
-         }, (pair) -> {
-             return ImmutableList.of(leftFunction.apply(pair), rightFunction.apply(pair));
-         });
--        Codec<I> codec3 = RecordCodecBuilder.<Pair>create((instance) -> {
-+        Codec<I> codec3 = RecordCodecBuilder.<Pair<P, P>>create((instance) -> { // Paper - decompile fix
-             return instance.group(codec.fieldOf(leftFieldName).forGetter(Pair::getFirst), codec.fieldOf(rightFieldName).forGetter(Pair::getSecond)).apply(instance, Pair::of);
-         }).comapFlatMap((pair) -> {
-             return combineFunction.apply((P)pair.getFirst(), (P)pair.getSecond());
 diff --git a/src/main/java/net/minecraft/util/SortedArraySet.java b/src/main/java/net/minecraft/util/SortedArraySet.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/util/SortedArraySet.java
diff --git a/patches/server/Remap-fixes.patch b/patches/server/Remap-fixes.patch
index 2dc51bebfb..d1d3e16cd4 100644
--- a/patches/server/Remap-fixes.patch
+++ b/patches/server/Remap-fixes.patch
@@ -41,28 +41,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                              }
                          }
  
-diff --git a/src/main/java/net/minecraft/util/ExtraCodecs.java b/src/main/java/net/minecraft/util/ExtraCodecs.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/util/ExtraCodecs.java
-+++ b/src/main/java/net/minecraft/util/ExtraCodecs.java
-@@ -0,0 +0,0 @@ public class ExtraCodecs {
-                 Optional<Pair<A, T>> optional = dataResult.resultOrPartial(mutableObject::setValue);
-                 return optional.isPresent() ? dataResult : DataResult.error(() -> {
-                     return "(" + (String)mutableObject.getValue() + " -> using default)";
--                }, Pair.of(object, object));
-+                }, Pair.of(object, objectx)); // Paper - remapping fix
-             }
- 
-             public <T> DataResult<T> coApply(DynamicOps<T> dynamicOps, A objectx, DataResult<T> dataResult) {
-@@ -0,0 +0,0 @@ public class ExtraCodecs {
- 
-     static record LazyInitializedCodec<A>(Supplier<Codec<A>> delegate) implements Codec<A> {
-         LazyInitializedCodec {
--            supplier = Suppliers.memoize(supplier::get);
-+            delegate = Suppliers.memoize(delegate::get); // Paper - remapping fix
-         }
- 
-         public <T> DataResult<Pair<A, T>> decode(DynamicOps<T> dynamicOps, T object) {
 diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorUtils.java b/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorUtils.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorUtils.java