From 2fa1146af55a15dd908044710bb5c70a5e554fac Mon Sep 17 00:00:00 2001
From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com>
Date: Sun, 25 Aug 2024 21:19:40 +0200
Subject: [PATCH] Properly destroy placed blocks on the end platform (#11292)

---
 ...oy-placed-blocks-on-the-end-platform.patch | 40 +++++++++++++++++++
 1 file changed, 40 insertions(+)
 create mode 100644 patches/server/Properly-destroy-placed-blocks-on-the-end-platform.patch

diff --git a/patches/server/Properly-destroy-placed-blocks-on-the-end-platform.patch b/patches/server/Properly-destroy-placed-blocks-on-the-end-platform.patch
new file mode 100644
index 0000000000..426d974bd1
--- /dev/null
+++ b/patches/server/Properly-destroy-placed-blocks-on-the-end-platform.patch
@@ -0,0 +1,40 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com>
+Date: Sun, 18 Aug 2024 13:05:31 +0200
+Subject: [PATCH] Properly destroy placed blocks on the end platform
+
+The craftbukkit provided implementation of LevelAccessor,
+BlockStateListPopulator, does not support destroyBlock calls, simply
+ignoring them.
+
+This causes the destroyBlock calls during the generation of the end
+platform to be lost. The patch moves the destroy calls and executes them
+on the actual world access.
+
+diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java
++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java
+@@ -0,0 +0,0 @@ public class EndPlatformFeature extends Feature<NoneFeatureConfiguration> {
+                     // CraftBukkit start
+                     if (!blockList.getBlockState(blockposition_mutableblockposition1).is(block)) {
+                         if (flag) {
+-                            blockList.destroyBlock(blockposition_mutableblockposition1, true, (Entity) null);
++                            // blockList.destroyBlock(blockposition_mutableblockposition1, true, (Entity) null); // Paper - moved down - cb implementation of LevelAccessor does not support destoryBlock
+                         }
+ 
+                         blockList.setBlock(blockposition_mutableblockposition1, block.defaultBlockState(), 3);
+@@ -0,0 +0,0 @@ public class EndPlatformFeature extends Feature<NoneFeatureConfiguration> {
+ 
+         worldaccess.getLevel().getCraftServer().getPluginManager().callEvent(portalEvent);
+         if (!portalEvent.isCancelled()) {
++            // Paper start - Properly destroy placed blocks on the end platform
++            if (flag) {
++                for (org.bukkit.craftbukkit.block.CraftBlockState state : blockList.getList()) {
++                    worldaccess.destroyBlock(state.getPosition(), true);
++                }
++            }
++            // Paper end - Properly destroy placed blocks on the end platform
+             blockList.updateList();
+         }
+         // CraftBukkit end