aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0566-Fix-dangerous-end-portal-logic.patch
diff options
context:
space:
mode:
authorJake Potrebic <[email protected]>2024-04-27 15:50:33 -0700
committerJake Potrebic <[email protected]>2024-04-27 15:50:38 -0700
commitd02bb811de6f9d7e42001137b93d6a6f88359ab6 (patch)
treea396cbb1f0ada45b98703f8125f06f17334dc080 /patches/server/0566-Fix-dangerous-end-portal-logic.patch
parentdd571d89f2202bda719a40fd15f92cc754b6ade1 (diff)
downloadPaper-d02bb811de6f9d7e42001137b93d6a6f88359ab6.tar.gz
Paper-d02bb811de6f9d7e42001137b93d6a6f88359ab6.zip
proper migration to gamerules for keep spawn loaded distance
Diffstat (limited to 'patches/server/0566-Fix-dangerous-end-portal-logic.patch')
-rw-r--r--patches/server/0566-Fix-dangerous-end-portal-logic.patch88
1 files changed, 88 insertions, 0 deletions
diff --git a/patches/server/0566-Fix-dangerous-end-portal-logic.patch b/patches/server/0566-Fix-dangerous-end-portal-logic.patch
new file mode 100644
index 0000000000..94e78d0600
--- /dev/null
+++ b/patches/server/0566-Fix-dangerous-end-portal-logic.patch
@@ -0,0 +1,88 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Fri, 4 Jun 2021 17:06:52 -0400
+Subject: [PATCH] Fix dangerous end portal logic
+
+End portals could teleport entities during move calls. Stupid
+logic given the caller will never expect that kind of thing,
+and will result in all kinds of dupes.
+
+Move the tick logic into the post tick, where portaling was
+designed to happen in the first place.
+
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 04581cd90272775208a0192ef36f9c7458ad3a0c..aac47d2de2825b46e54ad936a48c96ef7f6703e1 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -423,6 +423,36 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+ return this.originWorld;
+ }
+ // Paper end - Entity origin API
++ // Paper start - make end portalling safe
++ public BlockPos portalBlock;
++ public ServerLevel portalWorld;
++ public void tickEndPortal() {
++ BlockPos pos = this.portalBlock;
++ ServerLevel world = this.portalWorld;
++ this.portalBlock = null;
++ this.portalWorld = null;
++
++ if (pos == null || world == null || world != this.level) {
++ return;
++ }
++
++ if (this.isPassenger() || this.isVehicle() || !this.canChangeDimensions() || this.isRemoved() || !this.valid || !this.isAlive()) {
++ return;
++ }
++
++ ResourceKey<Level> resourcekey = world.getTypeKey() == LevelStem.END ? Level.OVERWORLD : Level.END; // CraftBukkit - SPIGOT-6152: send back to main overworld in custom ends
++ ServerLevel worldserver = world.getServer().getLevel(resourcekey);
++
++ org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(this.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()));
++ event.callEvent();
++
++ if (this instanceof ServerPlayer) {
++ ((ServerPlayer) this).changeDimension(worldserver, PlayerTeleportEvent.TeleportCause.END_PORTAL);
++ return;
++ }
++ this.teleportTo(worldserver, null);
++ }
++ // Paper end - make end portalling safe
+ public float getBukkitYaw() {
+ return this.yRot;
+ }
+@@ -2828,6 +2858,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+ }
+
+ this.processPortalCooldown();
++ if (!io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowUnsafeEndPortalTeleportation) this.tickEndPortal(); // Paper - make end portalling safe
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
+index a2de13a366e4a462b746dab035372838127f4994..7272d70c672b54dcf595beafd7a2ed33c96e35cb 100644
+--- a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
+@@ -61,16 +61,13 @@ public class EndPortalBlock extends BaseEntityBlock {
+ // return; // CraftBukkit - always fire event in case plugins wish to change it
+ }
+
+- // CraftBukkit start - Entity in portal
+- EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()));
+- world.getCraftServer().getPluginManager().callEvent(event);
+-
+- if (entity instanceof ServerPlayer) {
+- ((ServerPlayer) entity).changeDimension(worldserver, PlayerTeleportEvent.TeleportCause.END_PORTAL);
+- return;
++ // Paper start - move all of this logic into portal tick
++ entity.portalWorld = ((ServerLevel)world);
++ entity.portalBlock = pos.immutable();
++ if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowUnsafeEndPortalTeleportation) {
++ entity.tickEndPortal();
+ }
+- // CraftBukkit end
+- entity.changeDimension(worldserver);
++ // Paper end - move all of this logic into portal tick
+ }
+
+ }