From 182b6fbe1b2f691170566068ba9064efe2c2d6e0 Mon Sep 17 00:00:00 2001 From: Felix Cravic Date: Tue, 26 May 2020 18:25:35 +0200 Subject: [PATCH] Added Player#facePosition and Player#spectate --- .../net/minestom/server/entity/Player.java | 61 ++++++++++++++++++- .../packet/server/play/FacePlayerPacket.java | 2 +- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 28f8d3cd0..a775e627d 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -737,7 +737,7 @@ public class Player extends LivingEntity { * @param food the new food value */ public void setFood(int food) { - Check.argCondition(!MathUtils.isBetween(food, 0, 20), "Food needs to be between 0 and 20"); + Check.argCondition(!MathUtils.isBetween(food, 0, 20), "Food has to be between 0 and 20"); this.food = food; sendUpdateHealthPacket(); } @@ -842,6 +842,60 @@ public class Player extends LivingEntity { return !itemDropEvent.isCancelled(); } + /** + * Rotate the player to face {@code targetPosition} + * + * @param facePoint the point from where the player should aim + * @param targetPosition the target position to face + */ + public void facePosition(FacePoint facePoint, Position targetPosition) { + facePosition(facePoint, targetPosition, null, null); + } + + /** + * Rotate the player to face {@code entity} + * + * @param facePoint the point from where the player should aim + * @param entity the entity to face + * @param targetPoint the point to aim at {@code entity} position + */ + public void facePosition(FacePoint facePoint, Entity entity, FacePoint targetPoint) { + facePosition(facePoint, entity.getPosition(), entity, targetPoint); + } + + private void facePosition(FacePoint facePoint, Position targetPosition, Entity entity, FacePoint targetPoint) { + FacePlayerPacket facePlayerPacket = new FacePlayerPacket(); + facePlayerPacket.entityFacePosition = facePoint == FacePoint.EYE ? + FacePlayerPacket.FacePosition.EYES : FacePlayerPacket.FacePosition.FEET; + facePlayerPacket.targetX = targetPosition.getX(); + facePlayerPacket.targetY = targetPosition.getY(); + facePlayerPacket.targetZ = targetPosition.getZ(); + if (entity != null) { + facePlayerPacket.entityId = entity.getEntityId(); + facePlayerPacket.entityFacePosition = targetPoint == FacePoint.EYE ? + FacePlayerPacket.FacePosition.EYES : FacePlayerPacket.FacePosition.FEET; + } + playerConnection.sendPacket(facePlayerPacket); + } + + /** + * Set the camera at {@code entity} eyes + * + * @param entity the entity to spectate + */ + public void spectate(Entity entity) { + CameraPacket cameraPacket = new CameraPacket(); + cameraPacket.cameraId = entity.getEntityId(); + playerConnection.sendPacket(cameraPacket); + } + + /** + * Reset the camera at the player + */ + public void stopSpectating() { + spectate(this); + } + /** * Used to retrieve the default spawn point * can be altered by the {@link PlayerRespawnEvent#setRespawnPosition(Position)} @@ -1566,6 +1620,11 @@ public class Player extends LivingEntity { HIDDEN } + public enum FacePoint { + FEET, + EYE + } + public class PlayerSettings { private String locale; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/FacePlayerPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/FacePlayerPacket.java index 4f48655a1..bd390afe3 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/FacePlayerPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/FacePlayerPacket.java @@ -8,7 +8,6 @@ public class FacePlayerPacket implements ServerPacket { public FacePosition facePosition; public double targetX, targetY, targetZ; - public boolean isEntity; public int entityId; public FacePosition entityFacePosition; @@ -20,6 +19,7 @@ public class FacePlayerPacket implements ServerPacket { writer.writeDouble(targetY); writer.writeDouble(targetZ); + final boolean isEntity = entityId > 0; writer.writeBoolean(isEntity); if (isEntity) { writer.writeVarInt(entityId);