From e14ede8e0e2799cd730248905844cb35c42989e5 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Tue, 31 Jul 2018 19:32:57 -0500 Subject: [PATCH] Make portal teleportation adjustment math more accurate diff --git a/src/main/java/net/minecraft/server/EnumDirection.java b/src/main/java/net/minecraft/server/EnumDirection.java index 13f0fb0b67..ce71811271 100644 --- a/src/main/java/net/minecraft/server/EnumDirection.java +++ b/src/main/java/net/minecraft/server/EnumDirection.java @@ -82,6 +82,7 @@ public enum EnumDirection implements INamable { return this.i; } + public final EnumDirection.EnumAxisDirection getAxisDirection() { return c(); } // Paper - OBFHELPER public EnumDirection.EnumAxisDirection c() { return this.l; } @@ -90,6 +91,7 @@ public enum EnumDirection implements INamable { return fromType1(this.h); } + public final EnumDirection rotateY() { return e(); } // Paper - OBFHELPER public EnumDirection e() { switch (this) { case NORTH: @@ -255,6 +257,7 @@ public enum EnumDirection implements INamable { this.d = s; } + public final int getOffset() { return a(); } // Paper - OBFHELPER public int a() { return this.c; } diff --git a/src/main/java/net/minecraft/server/MathHelper.java b/src/main/java/net/minecraft/server/MathHelper.java index 52918b971f..8bb2593aa9 100644 --- a/src/main/java/net/minecraft/server/MathHelper.java +++ b/src/main/java/net/minecraft/server/MathHelper.java @@ -81,6 +81,7 @@ public class MathHelper { return f < f1 ? f1 : (f > f2 ? f2 : f); } + public static double clamp(double d0, double d1, double d2) { return a(d0, d1, d2); } // Paper - OBFHELPER public static double a(double d0, double d1, double d2) { return d0 < d1 ? d1 : (d0 > d2 ? d2 : d0); } diff --git a/src/main/java/net/minecraft/server/PortalTravelAgent.java b/src/main/java/net/minecraft/server/PortalTravelAgent.java index a24bd02d5b..d30a8a6bdd 100644 --- a/src/main/java/net/minecraft/server/PortalTravelAgent.java +++ b/src/main/java/net/minecraft/server/PortalTravelAgent.java @@ -208,11 +208,27 @@ public class PortalTravelAgent { ++d4; } + // Paper start - Prevent portal suffocation (and therefore getting teleported up in an attempt to avoid it) + // Based on work by CarpetMod - Licensed GPL-3.0 + double offset = (1.0D - entity.getPortalOffset().x) * (double) shapedetector_shapedetectorcollection.getWidth() * (double) shapedetector_shapedetectorcollection.getFacing().rotateY().getAxisDirection().getOffset(); + double adjustedRadius = 1.02 * entity.width / 2; + if (adjustedRadius >= shapedetector_shapedetectorcollection.getWidth() - adjustedRadius) { + // entity wider than portal, place it in the middle + adjustedRadius = (double) shapedetector_shapedetectorcollection.getWidth() / 2 - 0.001; + } + + if (offset >= 0) { + offset = MathHelper.clamp(offset, adjustedRadius, (double) shapedetector_shapedetectorcollection.getWidth() - adjustedRadius); + } else { + offset = MathHelper.clamp(offset, (double) -shapedetector_shapedetectorcollection.getWidth() + adjustedRadius, -adjustedRadius); + } + if (shapedetector_shapedetectorcollection.getFacing().k() == EnumDirection.EnumAxis.X) { - d3 = d4 + (1.0D - entity.getPortalOffset().x) * (double) shapedetector_shapedetectorcollection.d() * (double) shapedetector_shapedetectorcollection.getFacing().e().c().a(); + d3 = d4 + offset; } else { - d2 = d4 + (1.0D - entity.getPortalOffset().x) * (double) shapedetector_shapedetectorcollection.d() * (double) shapedetector_shapedetectorcollection.getFacing().e().c().a(); + d2 = d4 + offset; } + // Paper end float f1 = 0.0F; float f2 = 0.0F; diff --git a/src/main/java/net/minecraft/server/ShapeDetector.java b/src/main/java/net/minecraft/server/ShapeDetector.java index 8ba4da0ea0..8716f5fd95 100644 --- a/src/main/java/net/minecraft/server/ShapeDetector.java +++ b/src/main/java/net/minecraft/server/ShapeDetector.java @@ -140,6 +140,7 @@ public class ShapeDetector { return this.c; } + public final int getWidth() { return this.d(); } // Paper - OBFHELPER public int d() { return this.e; } -- 2.21.0