papermc/Spigot-Server-Patches/0328-Make-portal-teleportation-adjustment-math-more-accur.patch
Aikar 05466e3b47
[Auto] Update Upstream
Upstream has released updates that appear to apply compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing.

Bukkit Changes:
d2834556 SPIGOT-4219: Event for PigZombies angering.

CraftBukkit Changes:
a9c796f1 SPIGOT-4184: Fix furnaces not matching Vanilla smelt or animations
195f071e SPIGOT-4219: Event for PigZombies angering.
5e3082c7 SPIGOT-4230: Improve legacy block types
2018-08-05 19:46:43 -04:00

95 lines
4.5 KiB
Diff

From f16f6209402ab43846255aabbbce6e4dbfca6197 Mon Sep 17 00:00:00 2001
From: Zach Brown <zach.brown@destroystokyo.com>
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 854ad49b6c..3ee310a9aa 100644
--- a/src/main/java/net/minecraft/server/EnumDirection.java
+++ b/src/main/java/net/minecraft/server/EnumDirection.java
@@ -85,6 +85,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;
}
@@ -93,6 +94,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:
@@ -272,6 +274,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 f52b9c6f0a..3adbfb8209 100644
--- a/src/main/java/net/minecraft/server/MathHelper.java
+++ b/src/main/java/net/minecraft/server/MathHelper.java
@@ -82,6 +82,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 7444f4621e..16ca3209cd 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 3faf74a22f..4e1f8c211d 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.18.0