Paper/Spigot-Server-Patches/0316-Make-portal-teleportation-adjustment-math-more-accur.patch
Shane Freeder ea855e2b46 Updated Upstream (Bukkit/CraftBukkit/Spigot)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Developers!: You will need to clean up your work/Minecraft/1.13.2 folder
for this

Also, restore a patch that was dropped in the last upstream

Bukkit Changes:
279eeab3 Fix command description not being set
96e2bb18 Remove debug print from SyntheticEventTest

CraftBukkit Changes:
d3ed1516 Fix dangerously threaded beacons
217a293d Don't relocate joptsimple to allow --help to work.
1be05a21 Prepare for imminent Java 12 release
a49270b2 Mappings Update
5259d80c SPIGOT-4669: Fix PlayerTeleportEvent coordinates for relative teleports

Spigot Changes:
e6eb36f2 Rebuild patches
2019-03-20 01:55:16 +00:00

96 lines
4.5 KiB
Diff

From 4b2173326c910bed90cac49417bf04e35389fef6 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 13f0fb0b6..ce7181127 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 52918b971..8bb2593aa 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 a24bd02d5..d30a8a6bd 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 8ba4da0ea..8716f5fd9 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