From fbd31c1bf8d692f493e7f4cf0decb6990c4cff34 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Thu, 3 Aug 2023 13:42:01 -0700 Subject: [PATCH] Fix display entities being upside down on 1.20.x This was due to Mojang flipping them 180 on the y-axis in the 1.20 update --- gradle/wrapper/gradle-wrapper.properties | 2 +- .../xyz/jpenilla/chesscraft/PieceHandler.java | 52 +++++++++++++++---- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 62f495d..9f4197d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/xyz/jpenilla/chesscraft/PieceHandler.java b/src/main/java/xyz/jpenilla/chesscraft/PieceHandler.java index 926e492..a22bd1b 100644 --- a/src/main/java/xyz/jpenilla/chesscraft/PieceHandler.java +++ b/src/main/java/xyz/jpenilla/chesscraft/PieceHandler.java @@ -40,6 +40,7 @@ import org.bukkit.profile.PlayerTextures; import org.bukkit.util.Transformation; import org.joml.AxisAngle4f; +import org.joml.Quaternionf; import org.joml.Vector3f; import xyz.jpenilla.chesscraft.config.PieceOptions; import xyz.jpenilla.chesscraft.data.CardinalDirection; @@ -70,16 +71,7 @@ public void applyToWorld(final ChessBoard board, final BoardStateHolder game, fi return; } world.spawn(pos.toLocation(world), ItemDisplay.class, itemDisplay -> { - itemDisplay.setTransformation(new Transformation( - // center - new Vector3f(0.5f * board.scale(), 0, 0.5f * board.scale()), - // flip upwards - new AxisAngle4f((float) Math.toRadians(90.0D), 1, 0, 0), - // scale - new Vector3f(0.5f * board.scale()), - // rotate - new AxisAngle4f((float) Math.toRadians(rotation(board.facing(), piece)), 0, 0, 1) - )); + itemDisplay.setTransformation(transformationFor(board, piece)); itemDisplay.setItemDisplayTransform(ItemDisplay.ItemDisplayTransform.FIXED); itemDisplay.setItemStack(this.options.item(piece)); itemDisplay.setInvulnerable(true); @@ -95,6 +87,46 @@ public void applyToWorld(final ChessBoard board, final BoardStateHolder game, fi }); } + private static Transformation transformationFor(final ChessBoard board, final Piece piece) { + // flip upwards + final Quaternionf left = new Quaternionf(new AxisAngle4f((float) Math.toRadians(90.0D), 1, 0, 0)); + transformForVersion(left); + // rotate + final Quaternionf right = new Quaternionf(new AxisAngle4f((float) Math.toRadians(rotation(board.facing(), piece)), 0, 0, 1)); + + return new Transformation( + // center + new Vector3f(0.5f * board.scale(), 0, 0.5f * board.scale()), + left, + // scale + new Vector3f(0.5f * board.scale()), + right + ); + } + + private static void transformForVersion(final Quaternionf left) { + if (Bukkit.getServer().getMinecraftVersion().startsWith("1.19")) { + // 1.19.x - nothing to do + return; + } + // 1.20+ - account for 180 flip on y-axis + rotateYFlip(left); + } + + /** + * Transforms the given quaternion in-place to account for the + * changes Mojang made to item displays in 1.20. + * + * @param q quaternion + */ + private static void rotateYFlip(final Quaternionf q) { + final float x = q.x, y = q.y, z = q.z, w = q.w; + q.x = z; + q.y = w; + q.z = x; + q.w = -y; + } + private static float rotation(final CardinalDirection facing, final Piece piece) { final double deg = facing.radians() * 180 / Math.PI; if (piece.color() == PieceColor.WHITE) {