From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Wed, 9 Jun 2021 11:03:40 -0500
Subject: [PATCH] Add toggle for end portal safe teleporting


diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 44330d19cf56a2efa46b98ff37c00a1aab50faf3..650de6e5ca9637b9034774feba8ef35ae6442b3a 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -2773,7 +2773,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, n
             }
 
             this.processPortalCooldown();
-            this.tickEndPortal(); // Paper - make end portalling safe
+            if (this.level.purpurConfig.endPortalSafeTeleporting) this.tickEndPortal(); // Paper - make end portalling safe // Purpur
         }
     }
 
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 197482e1ace23c3de002242097a68c6cc297cd3f..428875a6a99a619d337e2a7bbd2cb1828ca11d04 100644
--- a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
@@ -61,6 +61,22 @@ public class EndPortalBlock extends BaseEntityBlock {
                 // return; // CraftBukkit - always fire event in case plugins wish to change it
             }
 
+            // Purpur start
+            if (!world.purpurConfig.endPortalSafeTeleporting) {
+                // 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;
+                }
+                // CraftBukkit end
+                entity.changeDimension(worldserver);
+                return;
+            }
+            // Purpur end
+
             // Paper start - move all of this logic into portal tick
             entity.portalWorld = ((ServerLevel)world);
             entity.portalBlock = pos.immutable();
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 0b1098e17305d11e59e29e644ea4c32053fdc8cb..377bc91d341ff880b95576effbb55b1daceac6d2 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -649,6 +649,11 @@ public class PurpurWorldConfig {
         furnaceUseLavaFromUnderneath = getBoolean("blocks.furnace.use-lava-from-underneath", furnaceUseLavaFromUnderneath);
     }
 
+    public boolean endPortalSafeTeleporting = true;
+    private void endPortalSettings() {
+        endPortalSafeTeleporting = getBoolean("blocks.end_portal.safe-teleporting", endPortalSafeTeleporting);
+    }
+
     public boolean snowOnBlueIce = true;
     public boolean mobsSpawnOnPackedIce = true;
     public boolean mobsSpawnOnBlueIce = true;
