From 10bb3d2e5e91ee341a76ad3c7bb7b12ef52a1c07 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 15 Jul 2025 03:50:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9D=90=E6=A0=87=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/behavior/FurnitureItemBehavior.java | 2 +- .../plugin/user/BukkitServerPlayer.java | 4 +- .../craftengine/core/entity/Entity.java | 2 + .../parameter/PlayerParameterProvider.java | 4 +- .../craftengine/core/util/Direction.java | 87 +++++++++++++------ 5 files changed, 66 insertions(+), 33 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java index 50da7de61..c7caee0a0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -100,7 +100,7 @@ public class FurnitureItemBehavior extends ItemBehavior { finalPlacePosition = new Vec3d(xz.left(), xz.right(), clickedPosition.z()); } } else { - furnitureYaw = placement.rotationRule().apply(180 + (player != null ? player.xRot() : 0)); + furnitureYaw = placement.rotationRule().apply(180 + (player != null ? player.yRot() : 0)); Pair xz = placement.alignmentRule().apply(Pair.of(clickedPosition.x(), clickedPosition.z())); finalPlacePosition = new Vec3d(xz.left(), clickedPosition.y(), xz.right()); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index a6be8c3b8..74430caf7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -746,12 +746,12 @@ public class BukkitServerPlayer extends Player { @Override public float yRot() { - return platformPlayer().getPitch(); + return platformPlayer().getYaw(); } @Override public float xRot() { - return platformPlayer().getYaw(); + return platformPlayer().getPitch(); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java index aac181c4b..8a43adf97 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java @@ -2,8 +2,10 @@ package net.momirealms.craftengine.core.entity; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MCUtils; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldPosition; +import net.momirealms.sparrow.nbt.util.MathUtil; import java.util.UUID; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java index 042b08c05..7ed66aff2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java @@ -18,8 +18,8 @@ public class PlayerParameterProvider implements ChainParameterProvider { CONTEXT_FUNCTIONS.put(DirectContextParameters.X, Entity::x); CONTEXT_FUNCTIONS.put(DirectContextParameters.Y, Entity::y); CONTEXT_FUNCTIONS.put(DirectContextParameters.Z, Entity::z); - CONTEXT_FUNCTIONS.put(DirectContextParameters.YAW, Entity::xRot); - CONTEXT_FUNCTIONS.put(DirectContextParameters.PITCH, Entity::yRot); + CONTEXT_FUNCTIONS.put(DirectContextParameters.PITCH, Entity::xRot); + CONTEXT_FUNCTIONS.put(DirectContextParameters.YAW, Entity::yRot); CONTEXT_FUNCTIONS.put(DirectContextParameters.POSITION, Entity::position); CONTEXT_FUNCTIONS.put(DirectContextParameters.BLOCK_X, p -> MCUtils.fastFloor(p.x())); CONTEXT_FUNCTIONS.put(DirectContextParameters.BLOCK_Y, p -> MCUtils.fastFloor(p.y())); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java b/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java index a48bfdc14..636d84a0b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java @@ -93,38 +93,69 @@ public enum Direction { }; } +// public static Direction[] orderedByNearest(AbstractEntity entity) { +// float xRotation = entity.xRot() * (float) (Math.PI / 180.0); +// float yRotation = -entity.yRot() * (float) (Math.PI / 180.0); +// float sinX = (float) Math.sin(xRotation); +// float cosX = (float) Math.cos(xRotation); +// float sinY = (float) Math.sin(yRotation); +// float cosY = (float) Math.cos(yRotation); +// boolean isFacingPositiveY = sinY > 0.0F; +// boolean isFacingNegativeX = sinX < 0.0F; +// boolean isFacingPositiveX = cosY > 0.0F; +// float adjustedSinY = isFacingPositiveY ? sinY : -sinY; +// float adjustedSinX = isFacingNegativeX ? -sinX : sinX; +// float adjustedCosY = isFacingPositiveX ? cosY : -cosY; +// float horizontalProjection = adjustedSinY * cosX; +// float verticalProjection = adjustedCosY * cosX; +// Direction horizontalDirection = isFacingPositiveY ? EAST : WEST; +// Direction verticalDirection = isFacingNegativeX ? UP : DOWN; +// Direction depthDirection = isFacingPositiveX ? SOUTH : NORTH; +// if (adjustedSinY > adjustedCosY) { +// if (adjustedSinX > horizontalProjection) { +// return createDirectionArray(verticalDirection, horizontalDirection, depthDirection); +// } else { +// return verticalProjection > adjustedSinX +// ? createDirectionArray(horizontalDirection, depthDirection, verticalDirection) +// : createDirectionArray(horizontalDirection, verticalDirection, depthDirection); +// } +// } else if (adjustedSinX > verticalProjection) { +// return createDirectionArray(verticalDirection, depthDirection, horizontalDirection); +// } else { +// return horizontalProjection > adjustedSinX +// ? createDirectionArray(depthDirection, horizontalDirection, verticalDirection) +// : createDirectionArray(depthDirection, verticalDirection, horizontalDirection); +// } +// } + public static Direction[] orderedByNearest(AbstractEntity entity) { - float xRotation = entity.xRot() * (float) (Math.PI / 180.0); - float yRotation = -entity.yRot() * (float) (Math.PI / 180.0); - float sinX = (float) Math.sin(xRotation); - float cosX = (float) Math.cos(xRotation); - float sinY = (float) Math.sin(yRotation); - float cosY = (float) Math.cos(yRotation); - boolean isFacingPositiveY = sinY > 0.0F; - boolean isFacingNegativeX = sinX < 0.0F; - boolean isFacingPositiveX = cosY > 0.0F; - float adjustedSinY = isFacingPositiveY ? sinY : -sinY; - float adjustedSinX = isFacingNegativeX ? -sinX : sinX; - float adjustedCosY = isFacingPositiveX ? cosY : -cosY; - float horizontalProjection = adjustedSinY * cosX; - float verticalProjection = adjustedCosY * cosX; - Direction horizontalDirection = isFacingPositiveY ? EAST : WEST; - Direction verticalDirection = isFacingNegativeX ? UP : DOWN; - Direction depthDirection = isFacingPositiveX ? SOUTH : NORTH; - if (adjustedSinY > adjustedCosY) { - if (adjustedSinX > horizontalProjection) { - return createDirectionArray(verticalDirection, horizontalDirection, depthDirection); + float f = entity.xRot() * ((float)Math.PI / 180F); + float f1 = -entity.yRot() * ((float)Math.PI / 180F); + float sin = MCUtils.sin(f); + float cos = MCUtils.cos(f); + float sin1 = MCUtils.sin(f1); + float cos1 = MCUtils.cos(f1); + boolean flag = sin1 > 0.0F; + boolean flag1 = sin < 0.0F; + boolean flag2 = cos1 > 0.0F; + float f2 = flag ? sin1 : -sin1; + float f3 = flag1 ? -sin : sin; + float f4 = flag2 ? cos1 : -cos1; + float f5 = f2 * cos; + float f6 = f4 * cos; + Direction direction = flag ? EAST : WEST; + Direction direction1 = flag1 ? UP : DOWN; + Direction direction2 = flag2 ? SOUTH : NORTH; + if (f2 > f4) { + if (f3 > f5) { + return createDirectionArray(direction1, direction, direction2); } else { - return verticalProjection > adjustedSinX - ? createDirectionArray(horizontalDirection, depthDirection, verticalDirection) - : createDirectionArray(horizontalDirection, verticalDirection, depthDirection); + return f6 > f3 ? createDirectionArray(direction, direction2, direction1) : createDirectionArray(direction, direction1, direction2); } - } else if (adjustedSinX > verticalProjection) { - return createDirectionArray(verticalDirection, depthDirection, horizontalDirection); + } else if (f3 > f6) { + return createDirectionArray(direction1, direction2, direction); } else { - return horizontalProjection > adjustedSinX - ? createDirectionArray(depthDirection, horizontalDirection, verticalDirection) - : createDirectionArray(depthDirection, verticalDirection, horizontalDirection); + return f5 > f3 ? createDirectionArray(direction2, direction, direction1) : createDirectionArray(direction2, direction1, direction); } }