2018-08-12 08:08:09 +02:00
|
|
|
From cb5d0df8f262c31ce24f9cd39a70d2974420b95f Mon Sep 17 00:00:00 2001
|
2018-03-20 19:56:44 +01:00
|
|
|
From: MiniDigger <admin@minidigger.me>
|
|
|
|
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
|
2018-08-12 08:08:09 +02:00
|
|
|
index 402d8d7d63..7444f4621e 100644
|
2018-03-20 19:56:44 +01:00
|
|
|
--- a/src/main/java/net/minecraft/server/PortalTravelAgent.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/PortalTravelAgent.java
|
2018-07-31 16:14:54 +02:00
|
|
|
@@ -48,6 +48,9 @@ public class PortalTravelAgent {
|
2018-03-20 19:56:44 +01:00
|
|
|
byte b0 = 1;
|
|
|
|
byte b1 = 0;
|
|
|
|
|
2018-07-31 16:14:54 +02:00
|
|
|
+ java.util.Collection<org.bukkit.block.Block> bukkitBlocks = new java.util.HashSet<>(); // Paper
|
2018-07-31 22:16:12 +02:00
|
|
|
+ java.util.Map<BlockPosition, IBlockData> nmsBlocks = new java.util.LinkedHashMap<>(); // Paper
|
2018-03-20 19:56:44 +01:00
|
|
|
+
|
|
|
|
for (int l = -2; l <= 2; ++l) {
|
|
|
|
for (int i1 = -2; i1 <= 2; ++i1) {
|
|
|
|
for (int j1 = -1; j1 < 3; ++j1) {
|
2018-07-31 16:14:54 +02:00
|
|
|
@@ -56,11 +59,22 @@ public class PortalTravelAgent {
|
2018-03-20 19:56:44 +01:00
|
|
|
int i2 = k + i1 * 0 - l * 1;
|
|
|
|
boolean flag2 = j1 < 0;
|
|
|
|
|
|
|
|
- this.world.setTypeUpdate(new BlockPosition(k1, l1, i2), flag2 ? Blocks.OBSIDIAN.getBlockData() : Blocks.AIR.getBlockData());
|
|
|
|
+ // Paper start
|
|
|
|
+ BlockPosition pos = new BlockPosition(k1, l1, i2);
|
2018-08-12 08:08:09 +02:00
|
|
|
+ nmsBlocks.putIfAbsent(pos, flag2 ? Blocks.OBSIDIAN.getBlockData() : Blocks.AIR.getBlockData());
|
2018-03-20 19:56:44 +01:00
|
|
|
+ bukkitBlocks.add(this.world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
|
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+ // Paper start
|
2018-07-31 16:14:54 +02:00
|
|
|
+ org.bukkit.event.world.PortalCreateEvent event = new org.bukkit.event.world.PortalCreateEvent(bukkitBlocks, this.world.getWorld(), org.bukkit.event.world.PortalCreateEvent.CreateReason.OBC_DESTINATION);
|
2018-08-03 10:26:10 +02:00
|
|
|
+ if (event.callEvent()) {
|
2018-03-20 19:56:44 +01:00
|
|
|
+ nmsBlocks.forEach(this.world::setTypeUpdate);
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
+
|
|
|
|
// CraftBukkit start
|
|
|
|
return new BlockPosition(i, k, k);
|
|
|
|
}
|
2018-07-31 16:14:54 +02:00
|
|
|
@@ -404,6 +418,9 @@ public class PortalTravelAgent {
|
2018-03-20 19:56:44 +01:00
|
|
|
l5 = -l5;
|
|
|
|
}
|
|
|
|
|
2018-07-31 16:14:54 +02:00
|
|
|
+ java.util.Collection<org.bukkit.block.Block> bukkitBlocks = new java.util.HashSet<>(); // Paper
|
2018-07-31 22:16:12 +02:00
|
|
|
+ java.util.Map<BlockPosition, IBlockData> nmsBlocks = new java.util.LinkedHashMap<>(); // Paper
|
2018-03-20 19:56:44 +01:00
|
|
|
+
|
|
|
|
if (d0 < 0.0D) {
|
2018-07-18 20:55:52 +02:00
|
|
|
i1 = MathHelper.clamp(i1, 70, this.world.aa() - 10);
|
2018-03-20 19:56:44 +01:00
|
|
|
j5 = i1;
|
2018-07-31 16:14:54 +02:00
|
|
|
@@ -416,8 +433,11 @@ public class PortalTravelAgent {
|
2018-03-20 19:56:44 +01:00
|
|
|
l3 = j2 + (l2 - 1) * l5 - k2 * k5;
|
|
|
|
boolean flag1 = i3 < 0;
|
|
|
|
|
2018-07-18 20:55:52 +02:00
|
|
|
- blockposition_mutableblockposition.c(j3, k3, l3);
|
|
|
|
- this.world.setTypeUpdate(blockposition_mutableblockposition, flag1 ? Blocks.OBSIDIAN.getBlockData() : Blocks.AIR.getBlockData());
|
2018-03-20 19:56:44 +01:00
|
|
|
+ // Paper start
|
|
|
|
+ BlockPosition pos = new BlockPosition(j3, k3, l3);
|
2018-08-12 08:08:09 +02:00
|
|
|
+ nmsBlocks.putIfAbsent(pos, flag1 ? Blocks.OBSIDIAN.getBlockData() : Blocks.AIR.getBlockData());
|
2018-03-20 19:56:44 +01:00
|
|
|
+ bukkitBlocks.add(this.world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
|
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-07-31 16:14:54 +02:00
|
|
|
@@ -427,7 +447,11 @@ public class PortalTravelAgent {
|
2018-07-18 20:55:52 +02:00
|
|
|
for (l2 = -1; l2 < 4; ++l2) {
|
|
|
|
if (k2 == -1 || k2 == 2 || l2 == -1 || l2 == 3) {
|
|
|
|
blockposition_mutableblockposition.c(i5 + k2 * k5, j5 + l2, j2 + k2 * l5);
|
|
|
|
- this.world.setTypeAndData(blockposition_mutableblockposition, Blocks.OBSIDIAN.getBlockData(), 3);
|
2018-03-20 19:56:44 +01:00
|
|
|
+ // Paper start
|
2018-07-18 20:55:52 +02:00
|
|
|
+ BlockPosition pos = new BlockPosition(blockposition_mutableblockposition.getX(), blockposition_mutableblockposition.getY(), blockposition_mutableblockposition.getZ());
|
2018-08-12 08:08:09 +02:00
|
|
|
+ nmsBlocks.putIfAbsent(pos, Blocks.OBSIDIAN.getBlockData());
|
2018-03-20 19:56:44 +01:00
|
|
|
+ bukkitBlocks.add(this.world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
|
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
}
|
2018-07-18 20:55:52 +02:00
|
|
|
}
|
2018-07-31 16:14:54 +02:00
|
|
|
@@ -437,10 +461,22 @@ public class PortalTravelAgent {
|
2018-07-18 20:55:52 +02:00
|
|
|
for (l2 = 0; l2 < 2; ++l2) {
|
|
|
|
for (i3 = 0; i3 < 3; ++i3) {
|
|
|
|
blockposition_mutableblockposition.c(i5 + l2 * k5, j5 + i3, j2 + l2 * l5);
|
|
|
|
- this.world.setTypeAndData(blockposition_mutableblockposition, iblockdata, 18);
|
|
|
|
+
|
|
|
|
+ // Paper start
|
|
|
|
+ BlockPosition pos = new BlockPosition(blockposition_mutableblockposition.getX(), blockposition_mutableblockposition.getY(), blockposition_mutableblockposition.getZ());
|
2018-08-12 08:08:09 +02:00
|
|
|
+ nmsBlocks.putIfAbsent(pos, iblockdata);
|
2018-07-18 20:55:52 +02:00
|
|
|
+ bukkitBlocks.add(this.world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
|
2018-08-03 10:26:10 +02:00
|
|
|
+ // Paper end
|
2018-03-20 19:56:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+ // Paper start
|
2018-07-31 16:14:54 +02:00
|
|
|
+ org.bukkit.event.world.PortalCreateEvent event = new org.bukkit.event.world.PortalCreateEvent(bukkitBlocks, this.world.getWorld(), org.bukkit.event.world.PortalCreateEvent.CreateReason.OBC_DESTINATION);
|
2018-08-03 10:26:10 +02:00
|
|
|
+ if (event.callEvent()) {
|
|
|
|
+ nmsBlocks.forEach((pos, data) -> this.world.setTypeAndData(pos, data, 18)); // keep flag in sync with removed call above
|
2018-03-20 19:56:44 +01:00
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
+
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
--
|
2018-08-12 08:08:09 +02:00
|
|
|
2.18.0
|
2018-03-20 19:56:44 +01:00
|
|
|
|