Make portal teleportation adjustment math more accurate
Fixes GH-1295 Non-standard sized portals exacerbate a flaw in the vanilla portal teleportation adjustment logic. As a result, an entity can end up slightly inside of the surrounding portal blocks. In vanilla, this issue is minor and you are adjusted out as if it never happened. In CraftBukkit and derivatives, the anti-suffocation behavior activates and players end up teleported on top of their portals. This improves the offset so as to keep the issue from ever occurring in the first place. Special thanks to CarpetMod who appears to have had this fixed for some time, and has licensed their code such that we can use it as needed.
This commit is contained in:
parent
9939390df7
commit
6a48a4529b
2 changed files with 186 additions and 1 deletions
|
@ -1,4 +1,4 @@
|
|||
From d50ec96bb408e2663c832c8855519eb623fb0e07 Mon Sep 17 00:00:00 2001
|
||||
From 7d151ab9a57541eb1cace4e484d444406f66f86f Mon Sep 17 00:00:00 2001
|
||||
From: Aikar <aikar@aikar.co>
|
||||
Date: Wed, 30 Mar 2016 19:36:20 -0400
|
||||
Subject: [PATCH] MC Dev fixes
|
||||
|
@ -126,6 +126,70 @@ index a661789c1..785a1a218 100644
|
|||
}
|
||||
|
||||
public Iterator<IBlockData> iterator() {
|
||||
diff --git a/src/main/java/net/minecraft/server/EnumDirection.java b/src/main/java/net/minecraft/server/EnumDirection.java
|
||||
index 188d49d82..854ad49b6 100644
|
||||
--- a/src/main/java/net/minecraft/server/EnumDirection.java
|
||||
+++ b/src/main/java/net/minecraft/server/EnumDirection.java
|
||||
@@ -255,7 +255,7 @@ public enum EnumDirection implements INamable {
|
||||
return Iterators.forArray(this.c);
|
||||
}
|
||||
|
||||
- public boolean test(@Nullable Object object) {
|
||||
+ public boolean test(@Nullable EnumDirection object) { // Paper - Decompile fix
|
||||
return this.a((EnumDirection) object);
|
||||
}
|
||||
}
|
||||
@@ -293,9 +293,10 @@ public enum EnumDirection implements INamable {
|
||||
return d0;
|
||||
}
|
||||
|
||||
- public boolean test(@Nullable Object object) {
|
||||
- return super.a((EnumDirection) object);
|
||||
- }
|
||||
+ // Paper - Decompile fix
|
||||
+ //public boolean test(@Nullable Object object) {
|
||||
+ // return super.a((EnumDirection) object);
|
||||
+ //}
|
||||
},
|
||||
Y("y") {
|
||||
;
|
||||
@@ -307,9 +308,10 @@ public enum EnumDirection implements INamable {
|
||||
return d1;
|
||||
}
|
||||
|
||||
- public boolean test(@Nullable Object object) {
|
||||
- return super.a((EnumDirection) object);
|
||||
- }
|
||||
+ // Paper - Decompile fix
|
||||
+ //public boolean test(@Nullable Object object) {
|
||||
+ // return super.a((EnumDirection) object);
|
||||
+ //}
|
||||
},
|
||||
Z("z") {
|
||||
;
|
||||
@@ -321,9 +323,10 @@ public enum EnumDirection implements INamable {
|
||||
return d2;
|
||||
}
|
||||
|
||||
- public boolean test(@Nullable Object object) {
|
||||
- return super.a((EnumDirection) object);
|
||||
- }
|
||||
+ // Paper - Decompile fix
|
||||
+ //public boolean test(@Nullable Object object) {
|
||||
+ // return super.a((EnumDirection) object);
|
||||
+ //}
|
||||
};
|
||||
|
||||
private static final Map<String, EnumDirection.EnumAxis> d = (Map) Arrays.stream(values()).collect(Collectors.toMap(EnumDirection.EnumAxis::a, (enumdirection_enumaxis) -> {
|
||||
@@ -377,7 +380,7 @@ public enum EnumDirection implements INamable {
|
||||
|
||||
public abstract double a(double d0, double d1, double d2);
|
||||
|
||||
- public boolean test(@Nullable Object object) {
|
||||
+ public boolean test(@Nullable EnumDirection object) { // Paper - Decompile fix
|
||||
return this.a((EnumDirection) object);
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/LocaleLanguage.java b/src/main/java/net/minecraft/server/LocaleLanguage.java
|
||||
index 8f06c5848..4361b2cee 100644
|
||||
--- a/src/main/java/net/minecraft/server/LocaleLanguage.java
|
||||
|
@ -139,6 +203,19 @@ index 8f06c5848..4361b2cee 100644
|
|||
}
|
||||
|
||||
this.e = SystemUtils.b();
|
||||
diff --git a/src/main/java/net/minecraft/server/MathHelper.java b/src/main/java/net/minecraft/server/MathHelper.java
|
||||
index 86585a13f..f52b9c6f0 100644
|
||||
--- a/src/main/java/net/minecraft/server/MathHelper.java
|
||||
+++ b/src/main/java/net/minecraft/server/MathHelper.java
|
||||
@@ -8,7 +8,7 @@ import java.util.function.IntPredicate;
|
||||
public class MathHelper {
|
||||
|
||||
public static final float a = c(2.0F);
|
||||
- private static final float[] b = (float[]) SystemUtils.a((Object) (new float[65536]), (afloat) -> {
|
||||
+ private static final float[] b = (float[]) SystemUtils.a((new float[65536]), (afloat) -> { // Paper - Decompile fix
|
||||
for (int i = 0; i < afloat.length; ++i) {
|
||||
afloat[i] = (float) Math.sin((double) i * 3.141592653589793D * 2.0D / 65536.0D);
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/RegistryID.java b/src/main/java/net/minecraft/server/RegistryID.java
|
||||
index 3b8f6ec16..bde5714dd 100644
|
||||
--- a/src/main/java/net/minecraft/server/RegistryID.java
|
||||
|
@ -180,6 +257,19 @@ index 3b8f6ec16..bde5714dd 100644
|
|||
this.e = 0;
|
||||
this.f = 0;
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/ShapeDetector.java b/src/main/java/net/minecraft/server/ShapeDetector.java
|
||||
index 43596cb2d..3faf74a22 100644
|
||||
--- a/src/main/java/net/minecraft/server/ShapeDetector.java
|
||||
+++ b/src/main/java/net/minecraft/server/ShapeDetector.java
|
||||
@@ -171,7 +171,7 @@ public class ShapeDetector {
|
||||
return new ShapeDetectorBlock(this.a, blockposition, this.b);
|
||||
}
|
||||
|
||||
- public Object load(Object object) throws Exception {
|
||||
+ public ShapeDetectorBlock load(BlockPosition object) throws Exception { // Paper - Decompile fix
|
||||
return this.a((BlockPosition) object);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/VoxelShape.java b/src/main/java/net/minecraft/server/VoxelShape.java
|
||||
index 4b5463cca..53c9f2188 100644
|
||||
--- a/src/main/java/net/minecraft/server/VoxelShape.java
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
From 7a62941977f7d8b8ebb5ca2742e389fed0763274 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 854ad49b6..3ee310a9a 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 f52b9c6f0..3adbfb820 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 ba8d15431..6d2f5faf2 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 3faf74a22..4e1f8c211 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.17.1
|
||||
|
Loading…
Reference in a new issue