aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0239-Call-PortalCreateEvent-for-exit-portals.patch
blob: 5d89f7626212c4af789fd157c11a973cc057360b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
From bdaa9d012700842538d78f99bbdcdbaf26688753 Mon Sep 17 00:00:00 2001
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
index aca407142..a24bd02d5 100644
--- a/src/main/java/net/minecraft/server/PortalTravelAgent.java
+++ b/src/main/java/net/minecraft/server/PortalTravelAgent.java
@@ -48,6 +48,9 @@ public class PortalTravelAgent {
             byte b0 = 1;
             byte b1 = 0;
 
+            java.util.Collection<org.bukkit.block.Block> bukkitBlocks = new java.util.HashSet<>(); // Paper
+            java.util.Map<BlockPosition, IBlockData> nmsBlocks = new java.util.LinkedHashMap<>(); // Paper
+
             for (int l = -2; l <= 2; ++l) {
                 for (int i1 = -2; i1 <= 2; ++i1) {
                     for (int j1 = -1; j1 < 3; ++j1) {
@@ -56,11 +59,22 @@ public class PortalTravelAgent {
                         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);
+                        nmsBlocks.put(pos, flag2 ? Blocks.OBSIDIAN.getBlockData() : Blocks.AIR.getBlockData());
+                        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(this.world::setTypeUpdate);
+            }
+            // Paper end
+
         // CraftBukkit start
         return new BlockPosition(i, k, k);
     }
@@ -404,6 +418,9 @@ public class PortalTravelAgent {
             l5 = -l5;
         }
 
+        java.util.Collection<org.bukkit.block.Block> bukkitBlocks = new java.util.HashSet<>(); // Paper
+        java.util.Map<BlockPosition, IBlockData> nmsBlocks = new java.util.LinkedHashMap<>(); // Paper
+
         if (d0 < 0.0D) {
             i1 = MathHelper.clamp(i1, 70, this.world.ab() - 10);
             j5 = i1;
@@ -416,8 +433,11 @@ public class PortalTravelAgent {
                         i4 = j2 + (i3 - 1) * l5 - k2 * k5;
                         boolean flag1 = l2 < 0;
 
-                        blockposition_mutableblockposition.c(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
                     }
                 }
             }
@@ -427,7 +447,11 @@ public class PortalTravelAgent {
             for (i3 = -1; i3 < 4; ++i3) {
                 if (k2 == -1 || k2 == 2 || i3 == -1 || i3 == 3) {
                     blockposition_mutableblockposition.c(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
                 }
             }
         }
@@ -437,10 +461,22 @@ public class PortalTravelAgent {
         for (i3 = 0; i3 < 2; ++i3) {
             for (l2 = 0; l2 < 3; ++l2) {
                 blockposition_mutableblockposition.c(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