9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 09:59:20 +00:00

修复坐标系

This commit is contained in:
XiaoMoMi
2025-07-15 03:50:11 +08:00
parent 0550a6ac24
commit 10bb3d2e5e
5 changed files with 66 additions and 33 deletions

View File

@@ -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<Double, Double> xz = placement.alignmentRule().apply(Pair.of(clickedPosition.x(), clickedPosition.z()));
finalPlacePosition = new Vec3d(xz.left(), clickedPosition.y(), xz.right());
}

View File

@@ -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

View File

@@ -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;

View File

@@ -18,8 +18,8 @@ public class PlayerParameterProvider implements ChainParameterProvider<Player> {
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()));

View File

@@ -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);
}
}