From 3875cf67129d1cceb03e3c6500121465ad92985c Mon Sep 17 00:00:00 2001 From: MiniDigger Date: Sun, 18 Mar 2018 15:44:44 +0100 Subject: [PATCH] Call PortalCreateEvent for exit portals diff --git a/src/main/java/net/minecraft/server/PortalTravelAgent.java b/src/main/java/net/minecraft/server/PortalTravelAgent.java index e7ca777c1..7807f7c41 100644 --- a/src/main/java/net/minecraft/server/PortalTravelAgent.java +++ b/src/main/java/net/minecraft/server/PortalTravelAgent.java @@ -259,6 +259,9 @@ public class PortalTravelAgent { l5 = -l5; } + java.util.Collection bukkitBlocks = new java.util.HashSet<>(); // Paper + java.util.Map nmsBlocks = new java.util.LinkedHashMap<>(); // Paper + if (d0 < 0.0D) { i1 = MathHelper.clamp(i1, 70, this.world.getHeight() - 10); j5 = i1; @@ -271,8 +274,11 @@ public class PortalTravelAgent { i4 = j2 + (i3 - 1) * l5 - k2 * k5; boolean flag1 = l2 < 0; - blockposition_mutableblockposition.d(j3, l3, i4); - this.world.setTypeUpdate(blockposition_mutableblockposition, flag1 ? Blocks.OBSIDIAN.getBlockData() : Blocks.AIR.getBlockData()); + // Paper start + BlockPosition pos = new BlockPosition(j3, l3, i4); + nmsBlocks.put(pos, flag1 ? Blocks.OBSIDIAN.getBlockData() : Blocks.AIR.getBlockData()); + bukkitBlocks.add(this.world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ())); + // Paper end } } } @@ -282,7 +288,11 @@ public class PortalTravelAgent { for (i3 = -1; i3 < 4; ++i3) { if (k2 == -1 || k2 == 2 || i3 == -1 || i3 == 3) { blockposition_mutableblockposition.d(i5 + k2 * k5, j5 + i3, j2 + k2 * l5); - this.world.setTypeAndData(blockposition_mutableblockposition, Blocks.OBSIDIAN.getBlockData(), 3); + // Paper start + BlockPosition pos = new BlockPosition(blockposition_mutableblockposition.getX(), blockposition_mutableblockposition.getY(), blockposition_mutableblockposition.getZ()); + nmsBlocks.put(pos, Blocks.OBSIDIAN.getBlockData()); + bukkitBlocks.add(this.world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ())); + // Paper end } } } @@ -292,10 +302,22 @@ public class PortalTravelAgent { for (i3 = 0; i3 < 2; ++i3) { for (l2 = 0; l2 < 3; ++l2) { blockposition_mutableblockposition.d(i5 + i3 * k5, j5 + l2, j2 + i3 * l5); - this.world.setTypeAndData(blockposition_mutableblockposition, iblockdata, 18); + + // Paper start + BlockPosition pos = new BlockPosition(blockposition_mutableblockposition.getX(), blockposition_mutableblockposition.getY(), blockposition_mutableblockposition.getZ()); + nmsBlocks.put(pos, iblockdata); + bukkitBlocks.add(this.world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ())); + // Paper end } } + // Paper start + org.bukkit.event.world.PortalCreateEvent event = new org.bukkit.event.world.PortalCreateEvent(bukkitBlocks, this.world.getWorld(), org.bukkit.event.world.PortalCreateEvent.CreateReason.OBC_DESTINATION); + if (event.callEvent()) { + nmsBlocks.forEach((pos, data) -> this.world.setTypeAndData(pos, data, 18)); // keep flag in sync with removed call above + } + // Paper end + return true; } -- 2.21.0