From 4048d3ec68fa6f9483b843cbf5b6e910395216c9 Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Sat, 26 Nov 2022 03:42:30 +0200 Subject: [PATCH] Allow using degrees for ArmorStand rotations (#7847) --- patches/api/0131-Expand-ArmorStand-API.patch | 244 +++++++++++++++++- ...32-Implement-Expanded-ArmorStand-API.patch | 77 +++++- 2 files changed, 315 insertions(+), 6 deletions(-) diff --git a/patches/api/0131-Expand-ArmorStand-API.patch b/patches/api/0131-Expand-ArmorStand-API.patch index a05dd67b88..418a52b6ee 100644 --- a/patches/api/0131-Expand-ArmorStand-API.patch +++ b/patches/api/0131-Expand-ArmorStand-API.patch @@ -3,12 +3,154 @@ From: willies952002 Date: Thu, 26 Jul 2018 02:22:44 -0400 Subject: [PATCH] Expand ArmorStand API -Add the following: +Adds the following: - Add proper methods for getting and setting items in both hands. Deprecates old methods - Enable/Disable slot interactions +- Allow using degrees for ArmorStand rotations (via new Rotations class) +Co-authored-by: SoSeDiK + +diff --git a/src/main/java/io/papermc/paper/math/Rotations.java b/src/main/java/io/papermc/paper/math/Rotations.java +new file mode 100644 +index 0000000000000000000000000000000000000000..0ac1618113699ac50b9c35294bf23fb9fb7cfbad +--- /dev/null ++++ b/src/main/java/io/papermc/paper/math/Rotations.java +@@ -0,0 +1,100 @@ ++package io.papermc.paper.math; ++ ++import org.jetbrains.annotations.NotNull; ++ ++/** ++ * Rotations is an immutable object that stores rotations ++ * in degrees on each axis (X, Y, Z). ++ */ ++public interface Rotations { ++ ++ /** ++ * Rotations instance with every axis set to 0 ++ */ ++ Rotations ZERO = ofDegrees(0, 0, 0); ++ ++ /** ++ * Creates a new Rotations instance holding the provided rotations ++ * ++ * @param x the angle for the X axis in degrees ++ * @param y the angle for the Y axis in degrees ++ * @param z the angle for the Z axis in degrees ++ * @return Rotations instance holding the provided rotations ++ */ ++ static @NotNull Rotations ofDegrees(double x, double y, double z) { ++ return new RotationsImpl(x, y, z); ++ } ++ ++ /** ++ * Returns the angle on the X axis in degrees ++ * ++ * @return the angle in degrees ++ */ ++ double x(); ++ ++ /** ++ * Returns the angle on the Y axis in degrees ++ * ++ * @return the angle in degrees ++ */ ++ double y(); ++ ++ /** ++ * Returns the angle on the Z axis in degrees ++ * ++ * @return the angle in degrees ++ */ ++ double z(); ++ ++ /** ++ * Returns a new Rotations instance which is the result ++ * of changing the X axis to the passed angle ++ * ++ * @param x the angle in degrees ++ * @return the resultant Rotations ++ */ ++ @NotNull Rotations withX(double x); ++ ++ /** ++ * Returns a new Rotations instance which is the result ++ * of changing the Y axis to the passed angle ++ * ++ * @param y the angle in degrees ++ * @return the resultant Rotations ++ */ ++ @NotNull Rotations withY(double y); ++ ++ /** ++ * Returns a new Rotations instance which is the result ++ * of changing the Z axis to the passed angle ++ * ++ * @param z the angle in degrees ++ * @return the resultant Rotations ++ */ ++ @NotNull Rotations withZ(double z); ++ ++ /** ++ * Returns a new Rotations instance which is the result of adding ++ * the x, y, z components to this Rotations ++ * ++ * @param x the angle to add to the X axis in degrees ++ * @param y the angle to add to the Y axis in degrees ++ * @param z the angle to add to the Z axis in degrees ++ * @return the resultant Rotations ++ */ ++ @NotNull Rotations add(double x, double y, double z); ++ ++ /** ++ * Returns a new Rotations instance which is the result of subtracting ++ * the x, y, z components from this Rotations ++ * ++ * @param x the angle to subtract from the X axis in degrees ++ * @param y the angle to subtract from the Y axis in degrees ++ * @param z the angle to subtract from the Z axis in degrees ++ * @return the resultant Rotations ++ */ ++ default @NotNull Rotations subtract(double x, double y, double z) { ++ return add(-x, -y, -z); ++ } ++ ++} +diff --git a/src/main/java/io/papermc/paper/math/RotationsImpl.java b/src/main/java/io/papermc/paper/math/RotationsImpl.java +new file mode 100644 +index 0000000000000000000000000000000000000000..53359ab4a6659bce895deef6a21cde848d3cadcd +--- /dev/null ++++ b/src/main/java/io/papermc/paper/math/RotationsImpl.java +@@ -0,0 +1,27 @@ ++package io.papermc.paper.math; ++ ++import org.jetbrains.annotations.NotNull; ++ ++record RotationsImpl(double x, double y, double z) implements Rotations { ++ ++ @Override ++ public @NotNull RotationsImpl withX(double x) { ++ return new RotationsImpl(x, y, z); ++ } ++ ++ @Override ++ public @NotNull RotationsImpl withY(double y) { ++ return new RotationsImpl(x, y, z); ++ } ++ ++ @Override ++ public @NotNull RotationsImpl withZ(double z) { ++ return new RotationsImpl(x, y, z); ++ } ++ ++ @Override ++ public @NotNull RotationsImpl add(double x, double y, double z) { ++ return new RotationsImpl(this.x + x, this.y + y, this.z + z); ++ } ++ ++} diff --git a/src/main/java/org/bukkit/entity/ArmorStand.java b/src/main/java/org/bukkit/entity/ArmorStand.java -index 2ee3814a52945f541e049b621b9552f8ae9e261d..707639096657f995cc812c7b50108eeed48e8181 100644 +index 2ee3814a52945f541e049b621b9552f8ae9e261d..7530eb5d2a506e13e2bc7e189fd6e957c013cdf5 100644 --- a/src/main/java/org/bukkit/entity/ArmorStand.java +++ b/src/main/java/org/bukkit/entity/ArmorStand.java @@ -14,7 +14,7 @@ public interface ArmorStand extends LivingEntity { @@ -29,7 +171,7 @@ index 2ee3814a52945f541e049b621b9552f8ae9e261d..707639096657f995cc812c7b50108eee */ @Deprecated void setItemInHand(@Nullable ItemStack item); -@@ -379,5 +379,71 @@ public interface ArmorStand extends LivingEntity { +@@ -379,5 +379,167 @@ public interface ArmorStand extends LivingEntity { * @param tick {@code true} if this armour stand can tick, {@code false} otherwise */ void setCanTick(final boolean tick); @@ -99,5 +241,101 @@ index 2ee3814a52945f541e049b621b9552f8ae9e261d..707639096657f995cc812c7b50108eee + * @return {@code true} if the slot is disabled, else {@code false}. + */ + boolean isSlotDisabled(@NotNull org.bukkit.inventory.EquipmentSlot slot); ++ ++ /** ++ * Returns the ArmorStand's body rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @return the current rotations ++ */ ++ @NotNull io.papermc.paper.math.Rotations getBodyRotations(); ++ ++ /** ++ * Sets the ArmorStand's body rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @param rotations the current rotations ++ */ ++ void setBodyRotations(@NotNull io.papermc.paper.math.Rotations rotations); ++ ++ /** ++ * Returns the ArmorStand's left arm rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @return the current rotations ++ */ ++ @NotNull io.papermc.paper.math.Rotations getLeftArmRotations(); ++ ++ /** ++ * Sets the ArmorStand's left arm rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @param rotations the current rotations ++ */ ++ void setLeftArmRotations(@NotNull io.papermc.paper.math.Rotations rotations); ++ ++ /** ++ * Returns the ArmorStand's right arm rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @return the current rotations ++ */ ++ @NotNull io.papermc.paper.math.Rotations getRightArmRotations(); ++ ++ /** ++ * Sets the ArmorStand's right arm rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @param rotations the current rotations ++ */ ++ void setRightArmRotations(@NotNull io.papermc.paper.math.Rotations rotations); ++ ++ /** ++ * Returns the ArmorStand's left leg rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @return the current rotations ++ */ ++ @NotNull io.papermc.paper.math.Rotations getLeftLegRotations(); ++ ++ /** ++ * Sets the ArmorStand's left leg rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @param rotations the current rotations ++ */ ++ void setLeftLegRotations(@NotNull io.papermc.paper.math.Rotations rotations); ++ ++ /** ++ * Returns the ArmorStand's right leg rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @return the current rotations ++ */ ++ @NotNull io.papermc.paper.math.Rotations getRightLegRotations(); ++ ++ /** ++ * Sets the ArmorStand's right leg rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @param rotations the current rotations ++ */ ++ void setRightLegRotations(@NotNull io.papermc.paper.math.Rotations rotations); ++ ++ /** ++ * Returns the ArmorStand's head rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @return the current rotations ++ */ ++ @NotNull io.papermc.paper.math.Rotations getHeadRotations(); ++ ++ /** ++ * Sets the ArmorStand's head rotations as ++ * {@link io.papermc.paper.math.Rotations}. ++ * ++ * @param rotations the current rotations ++ */ ++ void setHeadRotations(@NotNull io.papermc.paper.math.Rotations rotations); // Paper end } diff --git a/patches/server/0232-Implement-Expanded-ArmorStand-API.patch b/patches/server/0232-Implement-Expanded-ArmorStand-API.patch index 647c8e3e0e..646e0ab722 100644 --- a/patches/server/0232-Implement-Expanded-ArmorStand-API.patch +++ b/patches/server/0232-Implement-Expanded-ArmorStand-API.patch @@ -3,18 +3,21 @@ From: willies952002 Date: Thu, 26 Jul 2018 02:25:46 -0400 Subject: [PATCH] Implement Expanded ArmorStand API -Add the following: +Adds the following: - Add proper methods for getting and setting items in both hands. Deprecates old methods - Enable/Disable slot interactions +- Allow using degrees for ArmorStand rotations (via new Rotations class) == AT == public net.minecraft.world.entity.decoration.ArmorStand isDisabled(Lnet/minecraft/world/entity/EquipmentSlot;)Z +Co-authored-by: SoSeDiK + diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java -index 82b9ee993b0d2e7e0685231f7bad2b85756ec959..f4065938bbfd04519d1363ee8781c316aca468ab 100644 +index 82b9ee993b0d2e7e0685231f7bad2b85756ec959..f80cafe3544c7e6c3c29073ba6539783adf6666c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java -@@ -239,6 +239,79 @@ public class CraftArmorStand extends CraftLivingEntity implements ArmorStand { +@@ -239,6 +239,147 @@ public class CraftArmorStand extends CraftLivingEntity implements ArmorStand { getHandle().canMove = move; } @@ -90,6 +93,74 @@ index 82b9ee993b0d2e7e0685231f7bad2b85756ec959..f4065938bbfd04519d1363ee8781c316 + public boolean isSlotDisabled(org.bukkit.inventory.EquipmentSlot slot) { + return getHandle().isDisabled(org.bukkit.craftbukkit.CraftEquipmentSlot.getNMS(slot)); + } ++ ++ @Override ++ public io.papermc.paper.math.Rotations getBodyRotations() { ++ return fromNMSRotations(getHandle().bodyPose); ++ } ++ ++ @Override ++ public void setBodyRotations(io.papermc.paper.math.Rotations rotations) { ++ getHandle().setBodyPose(toNMSRotations(rotations)); ++ } ++ ++ @Override ++ public io.papermc.paper.math.Rotations getLeftArmRotations() { ++ return fromNMSRotations(getHandle().leftArmPose); ++ } ++ ++ @Override ++ public void setLeftArmRotations(io.papermc.paper.math.Rotations rotations) { ++ getHandle().setLeftArmPose(toNMSRotations(rotations)); ++ } ++ ++ @Override ++ public io.papermc.paper.math.Rotations getRightArmRotations() { ++ return fromNMSRotations(getHandle().rightArmPose); ++ } ++ ++ @Override ++ public void setRightArmRotations(io.papermc.paper.math.Rotations rotations) { ++ getHandle().setRightArmPose(toNMSRotations(rotations)); ++ } ++ ++ @Override ++ public io.papermc.paper.math.Rotations getLeftLegRotations() { ++ return fromNMSRotations(getHandle().leftLegPose); ++ } ++ ++ @Override ++ public void setLeftLegRotations(io.papermc.paper.math.Rotations rotations) { ++ getHandle().setLeftLegPose(toNMSRotations(rotations)); ++ } ++ ++ @Override ++ public io.papermc.paper.math.Rotations getRightLegRotations() { ++ return fromNMSRotations(getHandle().rightLegPose); ++ } ++ ++ @Override ++ public void setRightLegRotations(io.papermc.paper.math.Rotations rotations) { ++ getHandle().setRightLegPose(toNMSRotations(rotations)); ++ } ++ ++ @Override ++ public io.papermc.paper.math.Rotations getHeadRotations() { ++ return fromNMSRotations(getHandle().headPose); ++ } ++ ++ @Override ++ public void setHeadRotations(io.papermc.paper.math.Rotations rotations) { ++ getHandle().setHeadPose(toNMSRotations(rotations)); ++ } ++ ++ private static io.papermc.paper.math.Rotations fromNMSRotations(Rotations old) { ++ return io.papermc.paper.math.Rotations.ofDegrees(old.getX(), old.getY(), old.getZ()); ++ } ++ ++ private static Rotations toNMSRotations(io.papermc.paper.math.Rotations old) { ++ return new Rotations((float) old.x(), (float) old.y(), (float) old.z()); ++ } + @Override public boolean canTick() {