diff --git a/paper-api/src/main/java/org/bukkit/event/world/PortalCreateEvent.java b/paper-api/src/main/java/org/bukkit/event/world/PortalCreateEvent.java index 0bf1d29747be..8046ee1ec1cc 100644 --- a/paper-api/src/main/java/org/bukkit/event/world/PortalCreateEvent.java +++ b/paper-api/src/main/java/org/bukkit/event/world/PortalCreateEvent.java @@ -107,6 +107,11 @@ public enum CreateReason { * When the target end platform is created as a result of a player * entering an end portal. */ - END_PLATFORM + END_PLATFORM, + /** + * When the blocks inside an end portal are created due to an end portal + * frame being completed with all ender eyes. + */ + ENDER_EYE } } diff --git a/paper-server/patches/sources/net/minecraft/world/item/EnderEyeItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/EnderEyeItem.java.patch index 2e3644f19f92..07c61a24104a 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/EnderEyeItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/EnderEyeItem.java.patch @@ -12,9 +12,29 @@ Block.pushEntitiesUp(targetState, newState, level, pos); level.setBlock(pos, newState, Block.UPDATE_CLIENTS); level.updateNeighbourForOutputSignal(pos, Blocks.END_PORTAL_FRAME); -@@ -64,7 +_,27 @@ +@@ -56,15 +_,45 @@ + if (match != null) { + BlockPos blockPos = match.getFrontTopLeft().offset(-3, 0, -3); + ++ org.bukkit.craftbukkit.util.BlockStateListPopulator populator = new org.bukkit.craftbukkit.util.BlockStateListPopulator(level.getMinecraftWorld()); // Paper + for (int x = 0; x < 3; x++) { + for (int z = 0; z < 3; z++) { + BlockPos portalBlockPos = blockPos.offset(x, 0, z); +- level.destroyBlock(portalBlockPos, true, null); +- level.setBlock(portalBlockPos, Blocks.END_PORTAL.defaultBlockState(), Block.UPDATE_CLIENTS); ++ populator.destroyBlock(portalBlockPos, true, null); // Paper ++ populator.setBlock(portalBlockPos, Blocks.END_PORTAL.defaultBlockState(), Block.UPDATE_CLIENTS); // Paper } } ++ // Paper start - Trigger PortalCreateEvent on end portal creation ++ Player portalCreator = context.getPlayer(); ++ org.bukkit.World bworld = level.getMinecraftWorld().getWorld(); ++ org.bukkit.event.world.PortalCreateEvent event = new org.bukkit.event.world.PortalCreateEvent((java.util.List) (java.util.List) populator.getSnapshotBlocks(), bworld, (portalCreator == null) ? null : portalCreator.getBukkitEntity(), org.bukkit.event.world.PortalCreateEvent.CreateReason.ENDER_EYE); ++ if (!event.callEvent()) { ++ return InteractionResult.PASS; ++ } ++ populator.placeBlocks(state -> level.destroyBlock(state.getPosition(), true, null)); ++ // Paper end - Trigger PortalCreateEvent on end portal creation - level.globalLevelEvent(LevelEvent.SOUND_END_PORTAL_SPAWN, blockPos.offset(1, 0, 1), 0); + // CraftBukkit start - Use relative location for far away sounds