diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 1ac43dd5..162fbbbc 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,11 +1,14 @@ name: Publish on: - release: - types: [ published ] + push: + tags: + - "*.*.*" jobs: publish: + env: + TAG: ${{ github.ref_name }} name: Publish runs-on: ubuntu-latest permissions: @@ -22,36 +25,52 @@ jobs: distribution: 'temurin' cache: maven + - name: Verify Release Notes Exist + run: test -f "docs/release-notes/$TAG.md" + - name: Set version from release tag - run: mvn -B versions:set -DnewVersion=${{ github.event.release.tag_name }} -DgenerateBackupPoms=false + run: mvn -B versions:set -DnewVersion=$TAG -DgenerateBackupPoms=false - name: Build and package with Maven run: mvn -B clean package --file pom.xml - - name: Upload to GitHub Release + - name: Create GitHub Release env: GH_TOKEN: ${{secrets.GITHUB_TOKEN}} run: | - TAG="${{ github.event.release.tag_name }}" - - gh release upload "$TAG" \ + gh release create "$TAG" \ "plugin/target/displayentityutils-$TAG.jar" \ - --clobber + --verify-tag \ + --title "DEU $TAG" \ + --notes-file "docs/release-notes/$TAG.md" \ + --generate-notes + - name: Get Release body + id: release_notes + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + { + echo "body<> "$GITHUB_OUTPUT" - name: Upload to Modrinth uses: cloudnode-pro/modrinth-publish@v2 with: token: ${{ secrets.MODRINTH_TOKEN }} project: ${{ vars.MODRINTH_ID }} - name: ${{ github.event.release.name }} - version: ${{ github.event.release.tag_name }} - changelog: ${{ github.event.release.body }} + name: DEU ${{ env.TAG }} + version: ${{ env.TAG }} + changelog: ${{ steps.release_notes.outputs.body }} loaders: |- paper game-versions: |- - 1.20.x + 1.20.4 + 1.20.5 + 1.20.6 1.21.x 26.1.x 26.2 - files: plugin/target/displayentityutils-${{ github.event.release.tag_name }}.jar \ No newline at end of file + files: plugin/target/displayentityutils-${{ env.TAG }}.jar \ No newline at end of file diff --git a/api/pom.xml b/api/pom.xml index e8515c20..ff4df2a4 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -6,7 +6,7 @@ net.donnypz.displayentityutils deu - 3.6.0 + 3.7.0 api diff --git a/api/src/main/java/net/donnypz/displayentityutils/DisplayKeys.java b/api/src/main/java/net/donnypz/displayentityutils/DisplayKeys.java index 1a87b0b4..c4673253 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/DisplayKeys.java +++ b/api/src/main/java/net/donnypz/displayentityutils/DisplayKeys.java @@ -1,12 +1,20 @@ package net.donnypz.displayentityutils; import org.bukkit.NamespacedKey; +import org.jetbrains.annotations.ApiStatus; +@ApiStatus.Internal public final class DisplayKeys { + private DisplayKeys(){} + public static final class Group{ public static final NamespacedKey GROUP_TAG = new NamespacedKey(DisplayAPI.getPlugin(), "groupTag"); public static final NamespacedKey CHUNK_PACKET_GROUP = new NamespacedKey(DisplayAPI.getPlugin(), "chunkpacketgroups"); + public static final NamespacedKey GROUP_ROTATION = new NamespacedKey(DisplayAPI.getPlugin(), "group_rotation"); + public static final NamespacedKey CREATION_TIME = new NamespacedKey(DisplayAPI.getPlugin(), "creationtime"); + public static final NamespacedKey SCALE_MULTIPLIER = new NamespacedKey(DisplayAPI.getPlugin(), "scale"); + public static final NamespacedKey PERSISTENCE_OVERRIDE = new NamespacedKey(DisplayAPI.getPlugin(), "persistence_override"); } public static final class Part{ diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/Axis.java b/api/src/main/java/net/donnypz/displayentityutils/utils/Axis.java new file mode 100644 index 00000000..4b00e590 --- /dev/null +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/Axis.java @@ -0,0 +1,57 @@ +package net.donnypz.displayentityutils.utils; + +import org.jetbrains.annotations.NotNull; +import org.joml.Quaternionf; + +public enum Axis { + X, + Y, + Z; + + /** + * Rotate a quaternion on this {@link Axis}'s axis + * @param quaternionf the quaternion + * @param angleInDegrees the angle in degrees + * @return a new {@link Quaternionf} with the rotation applied + */ + public @NotNull Quaternionf rotate(@NotNull Quaternionf quaternionf, float angleInDegrees){ + Quaternionf newRot = new Quaternionf(quaternionf); + float angleDeg = (float) Math.toRadians(angleInDegrees); + switch(this){ + case X -> newRot.rotateX(angleDeg); + case Y -> newRot.rotateY(angleDeg); + case Z -> newRot.rotateZ(angleDeg); + } + return newRot; + } + + /** + * Set a quaternion's axis to a given angle + * @param quaternionf the quaternion + * @param angleInDegrees the angle in degrees + * @return a new {@link Quaternionf} with the axis representative of this set + */ + public @NotNull Quaternionf set(@NotNull Quaternionf quaternionf, float angleInDegrees){ + float angleRad = (float) Math.toRadians(angleInDegrees); + + Quaternionf q = new Quaternionf(); + switch (this){ + case X -> { + q.rotateX(angleRad); + q.rotateY(quaternionf.y); + q.rotateZ(quaternionf.z); + } + case Y -> { + q.rotateX(quaternionf.x); + q.rotateY(angleRad); + q.rotateZ(quaternionf.z); + } + case Z -> { + q.rotateX(quaternionf.x); + q.rotateY(quaternionf.y); + q.rotateZ(angleRad); + } + } + return q; + } +} diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/Active.java b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/Active.java index e2d8e9e4..05f6c000 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/Active.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/Active.java @@ -1,7 +1,7 @@ package net.donnypz.displayentityutils.utils.DisplayEntities; import net.donnypz.displayentityutils.utils.Direction; -import net.donnypz.displayentityutils.utils.PivotAxis; +import net.donnypz.displayentityutils.utils.Axis; import org.bukkit.Color; import org.bukkit.Location; import org.bukkit.entity.Display; @@ -60,18 +60,18 @@ public interface Active { void setYaw(float yaw, boolean pivot); - default void setRotation(float pitch, float yaw){ - setRotation(pitch, yaw, false, false); + default void setEntityRotation(float pitch, float yaw){ + setEntityRotation(pitch, yaw, false, false); } - void setRotation(float pitch, float yaw, boolean pivotPitch, boolean pivotYaw); + void setEntityRotation(float pitch, float yaw, boolean pivotPitch, boolean pivotYaw); /** * @param angleInDegrees the pivot angle - * @param pivotAxis the axis to perform the pivot on + * @param axis the axis to perform the pivot on * @param worldSpace whether the pivot should occur on world space axis */ - void pivot(float angleInDegrees, @NotNull PivotAxis pivotAxis, boolean worldSpace); + void pivot(float angleInDegrees, @NotNull Axis axis, boolean worldSpace); /** * @param rotation the rotation @@ -80,6 +80,18 @@ default void setRotation(float pitch, float yaw){ */ void pivot(@NotNull Quaternionf rotation, @NotNull Location pivotLocation, boolean worldSpace); + /** + * Rotate display transformation + * @param angleInDegrees the rotation angle + * @param axis the axis to rotate on + * @param worldSpace whether the rotation should occur on world space axis + */ + default void rotate(float angleInDegrees, @NotNull Axis axis, boolean worldSpace){ + Quaternionf q = new Quaternionf(); + axis.rotate(q, angleInDegrees); + this.rotate(q, worldSpace); + } + /** * @param rotation the rotation * @param worldSpace whether the rotation should occur on world space axis diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActiveGroup.java b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActiveGroup.java index ea8400b3..a286892a 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActiveGroup.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActiveGroup.java @@ -7,12 +7,10 @@ import net.donnypz.displayentityutils.managers.DEUUser; import net.donnypz.displayentityutils.managers.DisplayAnimationManager; import net.donnypz.displayentityutils.managers.LoadMethod; -import net.donnypz.displayentityutils.utils.Direction; +import net.donnypz.displayentityutils.utils.*; import net.donnypz.displayentityutils.utils.DisplayEntities.concurrent.GroupTeleportCompletableFuture; import net.donnypz.displayentityutils.utils.DisplayEntities.machine.DisplayStateMachine; import net.donnypz.displayentityutils.utils.DisplayEntities.machine.MachineState; -import net.donnypz.displayentityutils.utils.FollowType; -import net.donnypz.displayentityutils.utils.PacketUtils; import net.donnypz.displayentityutils.utils.controller.GroupFollowProperties; import org.bukkit.Bukkit; import org.bukkit.Color; @@ -23,8 +21,10 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; import org.joml.Vector3f; +import java.nio.ByteBuffer; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicInteger; @@ -49,13 +49,13 @@ public abstract class ActiveGroup extends ActivePartHolder protected MachineState currentMachineState; + protected Quaternionf rotation = new Quaternionf(); private volatile float scaleMultiplier = 1; private volatile Vector rideOffset = new Vector(); private volatile int lastAnimatedTick = -1; private boolean isSelectable = true; - /** * Get this group's unique ID created during the current game session * @return the group's ID @@ -175,6 +175,111 @@ public void removeCulling(){ } } + /** + * Set the transformation rotation of this group, optionally pivoting non-display entities as well + * @param axis the axis to rotate on + * @param pivotNonDisplays whether non-displays should be pivoted + */ + public void setRotation(float angleInDegrees, @NotNull Axis axis, boolean pivotNonDisplays){ + Quaternionf newRotation = new Quaternionf(this.rotation); + newRotation = axis.set(newRotation, angleInDegrees); + setRotation(newRotation, pivotNonDisplays); + } + + /** + * Set the transformation rotation of this group, optionally pivoting non-display entities as well + * @param rotation the local space rotation to set the group's orientation to + * @param pivotNonDisplays whether non-displays should be pivoted + */ + public void setRotation(@NotNull Quaternionf rotation, boolean pivotNonDisplays){ + Quaternionf delta = new Quaternionf(this.rotation) + .invert() + .mul(rotation); + + this.rotate(delta, false); + + if (pivotNonDisplays){ + this.pivot(delta, getLocation(), false); + } + } + + @Override + public void rotateAround(@NotNull Quaternionf rotation, @NotNull Location pivotLocation, boolean worldSpace) { + if (!worldSpace) { + this.rotation.mul(rotation); + } else { + Location groupLoc = getLocation(); + Quaternionf worldSpaceRot = MathUtils.applyWorldSpaceRotation(rotation, groupLoc.getPitch(), groupLoc.getYaw()); + worldSpaceRot.mul(this.rotation, this.rotation); + } + super.rotateAround(rotation, pivotLocation, worldSpace); + this.saveGroupRotation(); + } + + @Override + public void pivotOrRotateAround(@NotNull Quaternionf rotation, @NotNull Location pivotLocation, boolean worldSpace) { + if (!worldSpace) { + this.rotation.mul(rotation); + } else { + Location groupLoc = getLocation(); + Quaternionf worldSpaceRot = MathUtils.applyWorldSpaceRotation(rotation, groupLoc.getPitch(), groupLoc.getYaw()); + worldSpaceRot.mul(this.rotation, this.rotation); + } + super.pivotOrRotateAround(rotation, pivotLocation, worldSpace); + this.saveGroupRotation(); + } + + protected abstract void saveGroupRotation(); + + protected static byte @NotNull[] getRotationByteArray(@NotNull Quaternionf rotation){ + Quaternionf q = new Quaternionf(rotation); + + ByteBuffer buf = ByteBuffer.allocate(16); //4 bytes per quaternion val + buf.putFloat(q.x); + buf.putFloat(q.y); + buf.putFloat(q.z); + buf.putFloat(q.w); + return buf.array(); + } + + protected @NotNull Quaternionf getRotation(byte[] quaternionBytes){ + if (quaternionBytes == null || quaternionBytes.length != 16) return new Quaternionf(); + + ByteBuffer buf = ByteBuffer.wrap(quaternionBytes); + return new Quaternionf( + buf.getFloat(), + buf.getFloat(), + buf.getFloat(), + buf.getFloat() + ); + } + + protected void setRotation(PersistentDataContainer pdc){ + byte[] rotation = pdc.get(DisplayKeys.Group.GROUP_ROTATION, PersistentDataType.BYTE_ARRAY); + this.rotation = getRotation(rotation); + } + + + public @NotNull Quaternionf getRotation(){ + return new Quaternionf(this.rotation); + } + + /** + * Reset the group's rotation to its default orientation + * @param pivotNonDisplays whether non-displays should be pivoted + */ + public void resetRotation(boolean pivotNonDisplays){ + setRotation(new Quaternionf(), pivotNonDisplays); + } + + /** + * Make the group's current rotation its default orientation, resetting the group's + * stored rotation but retaining the current orientation + */ + public void rebaseRotation(){ + this.rotation = new Quaternionf(); + } + /** * Change the scale of all parts in this group by the given scale multiplier * @param newScaleMultiplier the scale multiplier to apply to this group diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActivePart.java b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActivePart.java index 9b3e41af..4da1c0ce 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActivePart.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActivePart.java @@ -8,6 +8,7 @@ import net.donnypz.displayentityutils.utils.DisplayUtils; import net.donnypz.displayentityutils.utils.InteractionCommand; import net.donnypz.displayentityutils.utils.PacketUtils; +import net.donnypz.displayentityutils.utils.Axis; import net.donnypz.displayentityutils.utils.packet.DisplayAttributeMap; import net.donnypz.displayentityutils.utils.packet.PacketAttributeContainer; import net.donnypz.displayentityutils.utils.packet.attributes.DisplayAttribute; @@ -360,6 +361,46 @@ public void unglow(@NotNull Player player) { */ public abstract void setTransformationMatrix(@NotNull Matrix4f matrix); + /** + * Change this display entity part's left rotation + * @param rotation The rotation to set + * @return false if this part is not a display entity + */ + public boolean setRotation(@NotNull Quaternionf rotation){ + if (!isDisplay()) return false; + Transformation t = getTransformation(); + setTransformation(new Transformation( + t.getTranslation(), + new Quaternionf(rotation), + t.getScale(), + t.getRightRotation() + )); + + return true; + } + + /** + * Change this display entity part's left rotation on a local axis + * @param angleInDegrees the angle in degrees + * @param axis the axis + * @return false if this part is not a display entity + */ + public boolean setRotation(float angleInDegrees, @NotNull Axis axis){ + if (!isDisplay()) return false; + Transformation t = getTransformation(); + Quaternionf existing = t.getLeftRotation(); + + setTransformation(new Transformation( + t.getTranslation(), + axis.set(existing, angleInDegrees), + t.getScale(), + t.getRightRotation() + )); + + return true; + } + + /** * Change this display entity part's X scale * @param scale The X scale to set diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActivePartHolder.java b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActivePartHolder.java index a466ec56..b6c224af 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActivePartHolder.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/ActivePartHolder.java @@ -1,6 +1,6 @@ package net.donnypz.displayentityutils.utils.DisplayEntities; -import net.donnypz.displayentityutils.utils.PivotAxis; +import net.donnypz.displayentityutils.utils.Axis; import org.bukkit.Color; import org.bukkit.Location; import org.bukkit.entity.Display; @@ -320,9 +320,9 @@ public void setYaw(float yaw, boolean pivot){ * @param pivotYaw whether non-display parts should pivot with the yaw change */ @Override - public void setRotation(float pitch, float yaw, boolean pivotPitch, boolean pivotYaw) { + public void setEntityRotation(float pitch, float yaw, boolean pivotPitch, boolean pivotYaw) { for (ActivePart part : getPartsRaw()) { - part.setRotation(pitch, yaw, pivotPitch, pivotYaw); + part.setEntityRotation(pitch, yaw, pivotPitch, pivotYaw); } } @@ -330,10 +330,10 @@ public void setRotation(float pitch, float yaw, boolean pivotPitch, boolean pivo * Pivot all non-display parts in this */ @Override - public void pivot(float angleInDegrees, @NotNull PivotAxis pivotAxis, boolean worldSpace) { + public void pivot(float angleInDegrees, @NotNull Axis axis, boolean worldSpace) { for (T part : getPartsRaw()){ if (part.isDisplay()) continue; - part.pivot(angleInDegrees, pivotAxis, worldSpace); + part.pivot(angleInDegrees, axis, worldSpace); } } diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/DisplayEntity.java b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/DisplayEntity.java index 409fd6fd..d8a963e7 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/DisplayEntity.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/DisplayEntity.java @@ -69,10 +69,13 @@ else if (type == Type.TEXT) { try{ PersistentDataContainer pdc = new ItemStack(Material.STICK).getItemMeta().getPersistentDataContainer(); pdc.set(DisplayKeys.Part.PART_TAGS, PersistentDataType.LIST.strings(), new ArrayList<>(part.getTags())); - if (part.isMaster && group.getSpawnAnimationTag() != null){ - pdc.set(DisplayKeys.SpawnAnimation.ANIMATION_TAG, PersistentDataType.STRING, group.spawnAnimationTag); - pdc.set(DisplayKeys.SpawnAnimation.TYPE, PersistentDataType.STRING, group.spawnAnimationType.name()); - pdc.set(DisplayKeys.SpawnAnimation.LOAD_METHOD, PersistentDataType.STRING, group.spawnAnimationLoadMethod.name()); + if (part.isMaster){ + if (group.getSpawnAnimationTag() != null){ + pdc.set(DisplayKeys.SpawnAnimation.ANIMATION_TAG, PersistentDataType.STRING, group.spawnAnimationTag); + pdc.set(DisplayKeys.SpawnAnimation.TYPE, PersistentDataType.STRING, group.spawnAnimationType.name()); + pdc.set(DisplayKeys.SpawnAnimation.LOAD_METHOD, PersistentDataType.STRING, group.spawnAnimationLoadMethod.name()); + } + pdc.set(DisplayKeys.Group.GROUP_ROTATION, PersistentDataType.BYTE_ARRAY, ActiveGroup.getRotationByteArray(group.getRotation())); } persistentDataContainer = pdc.serializeToBytes(); } @@ -115,8 +118,9 @@ Display createEntity(SpawnedDisplayEntityGroup group, Location location, GroupSp LoadMethod loadMethod = getSpawnAnimationLoadMethod(pdc); DisplayAnimator.AnimationType type = getSpawnAnimationType(pdc); if (animationTag != null){ - group.setSpawnAnimation(pdc, animationTag, type, loadMethod); + group.setSpawnAnimation(animationTag, type, loadMethod); } + group.setRotation(pdc); } return d; } @@ -140,6 +144,7 @@ PacketDisplayEntityPart createPacketPart(PacketDisplayEntityGroup group, Locatio if (group.masterPart == null && isMaster){ part.isMaster = true; group.setSpawnAnimation(pdc); + group.setRotation(pdc); } } } diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/InteractionEntity.java b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/InteractionEntity.java index 795980fa..682fa6f8 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/InteractionEntity.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/InteractionEntity.java @@ -3,7 +3,6 @@ import net.donnypz.displayentityutils.DisplayKeys; import net.donnypz.displayentityutils.utils.DisplayUtils; import net.donnypz.displayentityutils.utils.InteractionUtils; -import net.donnypz.displayentityutils.utils.PivotAxis; import net.donnypz.displayentityutils.utils.WorldUtils; import net.donnypz.displayentityutils.utils.packet.PacketAttributeContainer; import net.donnypz.displayentityutils.utils.packet.attributes.DisplayAttributes; diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/PacketDisplayEntityGroup.java b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/PacketDisplayEntityGroup.java index 8f52bdd4..dc231a17 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/PacketDisplayEntityGroup.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/PacketDisplayEntityGroup.java @@ -25,6 +25,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; import org.joml.Vector3f; import java.util.*; @@ -350,6 +351,9 @@ void updatePassengerIds(int passengerId, boolean add) { return new PacketPartSelection(this, partFilter); } + @Override + protected void saveGroupRotation() {} + @Override public GroupTeleportCompletableFuture scale(float newScaleMultiplier, int durationInTicks, boolean scaleNonDisplays) { diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/PacketDisplayEntityPart.java b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/PacketDisplayEntityPart.java index 0f0bb86e..ba28a84c 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/PacketDisplayEntityPart.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/PacketDisplayEntityPart.java @@ -8,6 +8,7 @@ import net.donnypz.displayentityutils.events.GroupSpawnedEvent; import net.donnypz.displayentityutils.managers.DEUUser; import net.donnypz.displayentityutils.utils.*; +import net.donnypz.displayentityutils.utils.Axis; import net.donnypz.displayentityutils.utils.packet.DisplayAttributeMap; import net.donnypz.displayentityutils.utils.packet.PacketAttributeContainer; import net.donnypz.displayentityutils.utils.packet.attributes.DisplayAttribute; @@ -1135,7 +1136,7 @@ public void setBrightness(Display.@Nullable Brightness brightness) { * @param pivotYaw whether the part should pivot, using the yaw value, around its group's location, if it has one */ @Override - public void setRotation(float pitch, float yaw, boolean pivotPitch, boolean pivotYaw){ + public void setEntityRotation(float pitch, float yaw, boolean pivotPitch, boolean pivotYaw){ pitch = Math.clamp(pitch, -90, 90); setPitchSilent(pitch, pivotPitch); setYawSilent(yaw, pivotYaw); @@ -1221,7 +1222,7 @@ private Location setPitchSilent(float pitch, boolean pivot){ packetLocation.pitch = pitch; if (!isDisplay() && pivot){ - return pivotSilent(delta, PivotAxis.X, false); + return pivotSilent(delta, Axis.X, false); } return packetLocation.toLocation(); } @@ -1232,7 +1233,7 @@ private Location setYawSilent(float yaw, boolean pivot){ packetLocation.yaw = yaw; if (!isDisplay() && pivot){ - return pivotSilent(delta, PivotAxis.Y, true); + return pivotSilent(delta, Axis.Y, true); } return packetLocation.toLocation(); @@ -1242,20 +1243,20 @@ private Location setYawSilent(float yaw, boolean pivot){ * Pivot a non-display entity around its group */ @Override - public void pivot(float angleInDegrees, @NotNull PivotAxis pivotAxis, boolean worldSpace) { + public void pivot(float angleInDegrees, @NotNull Axis axis, boolean worldSpace) { if (isDisplay() || group == null) return; - Location result = pivotSilent(angleInDegrees, pivotAxis, worldSpace); + Location result = pivotSilent(angleInDegrees, axis, worldSpace); this.teleport(result); } - private Location pivotSilent(float angleInDegrees, @NotNull PivotAxis pivotAxis, boolean worldSpace){ + private Location pivotSilent(float angleInDegrees, @NotNull Axis axis, boolean worldSpace){ if (angleInDegrees == 0.0f) return getLocation(); Location result = WorldUtils.getPivotLocation( getLocation(), group.getLocation(), angleInDegrees, - pivotAxis, + axis, worldSpace); packetLocation.setCoordinates(result); return result; diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/SinglePartSelection.java b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/SinglePartSelection.java index 50c58e9c..5a3ebacd 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/SinglePartSelection.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/SinglePartSelection.java @@ -1,7 +1,7 @@ package net.donnypz.displayentityutils.utils.DisplayEntities; import net.donnypz.displayentityutils.utils.Direction; -import net.donnypz.displayentityutils.utils.PivotAxis; +import net.donnypz.displayentityutils.utils.Axis; import org.bukkit.Color; import org.bukkit.Location; import org.bukkit.entity.Display; @@ -142,17 +142,17 @@ public void setYaw(float yaw, boolean pivot) { * @param pivotYaw whether the non-display parts should pivot, using the yaw value, around its group's location, if it has one */ @Override - public void setRotation(float pitch, float yaw, boolean pivotPitch, boolean pivotYaw) { - selectedPart.setRotation(pitch, yaw, pivotPitch, pivotYaw); + public void setEntityRotation(float pitch, float yaw, boolean pivotPitch, boolean pivotYaw) { + selectedPart.setEntityRotation(pitch, yaw, pivotPitch, pivotYaw); } /** * Pivot the part in this selection around this selection's group, if it's not a display */ @Override - public void pivot(float angleInDegrees, @NotNull PivotAxis pivotAxis, boolean worldSpace) { + public void pivot(float angleInDegrees, @NotNull Axis axis, boolean worldSpace) { if (selectedPart.isDisplay()) return; - selectedPart.pivot(angleInDegrees, pivotAxis, worldSpace); + selectedPart.pivot(angleInDegrees, axis, worldSpace); } /** diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/SpawnedDisplayEntityGroup.java b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/SpawnedDisplayEntityGroup.java index ed2a7159..9bf3eaaf 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/SpawnedDisplayEntityGroup.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/DisplayEntities/SpawnedDisplayEntityGroup.java @@ -35,14 +35,10 @@ public final class SpawnedDisplayEntityGroup extends ActiveGroup partSelections = new HashSet<>(); private final long creationTime; - boolean isVisibleByDefault; + private boolean isVisibleByDefault; private boolean isPersistent = DisplayConfig.defaultPersistence(); private boolean persistenceOverride = DisplayConfig.persistenceOverride(); - public static final NamespacedKey creationTimeKey = new NamespacedKey(DisplayAPI.getPlugin(), "creationtime"); - static final NamespacedKey scaleKey = new NamespacedKey(DisplayAPI.getPlugin(), "scale"); - static final NamespacedKey persistenceOverrideKey = new NamespacedKey(DisplayAPI.getPlugin(), "persistence_override"); - SpawnedDisplayEntityGroup(boolean isVisible) { this.isVisibleByDefault = isVisible; @@ -53,29 +49,18 @@ public final class SpawnedDisplayEntityGroup extends ActiveGroup players, boolean worldSpace, float pitch, float yaw){ - Quaternionf originalRot = transformation.getLeftRotation(); - Quaternionf appliedRotation = new Quaternionf(rotation); - - if (worldSpace) { - Quaternionf entityRot = new Quaternionf() - .rotateY((float) Math.toRadians(-yaw)) - .rotateX((float) Math.toRadians(pitch)); - - Quaternionf invertedEntityRot = new Quaternionf(entityRot).invert(); - - //world space to display's space - appliedRotation = invertedEntityRot - .mul(appliedRotation) - .mul(entityRot); - } - - Quaternionf finalRot = new Quaternionf(appliedRotation).mul(originalRot); + Quaternionf finalRot = MathUtils.calculateLeftRotation(transformation, rotation, worldSpace, pitch, yaw); new DisplayAttributeMap() .add(DisplayAttributes.Transform.LEFT_ROTATION, finalRot) diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/PivotAxis.java b/api/src/main/java/net/donnypz/displayentityutils/utils/PivotAxis.java deleted file mode 100644 index bb16b0b7..00000000 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/PivotAxis.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.donnypz.displayentityutils.utils; - -public enum PivotAxis { - X, - Y, - Z; -} diff --git a/api/src/main/java/net/donnypz/displayentityutils/utils/WorldUtils.java b/api/src/main/java/net/donnypz/displayentityutils/utils/WorldUtils.java index 411e6faf..df809b90 100644 --- a/api/src/main/java/net/donnypz/displayentityutils/utils/WorldUtils.java +++ b/api/src/main/java/net/donnypz/displayentityutils/utils/WorldUtils.java @@ -78,14 +78,14 @@ public static Set getNearbyChunkKeys(@NotNull Location origin, double radi * @param origin the pivoting location * @param pivotLocation the location to pivot around * @param angleInDegrees the pivot angle in degrees - * @param pivotAxis the axis to pivot around + * @param axis the axis to pivot around * @param worldSpace whether the pivot should occur on world space axis * @return a {@link Location} */ public static @NotNull Location getPivotLocation(@NotNull Location origin, @NotNull Location pivotLocation, double angleInDegrees, - @NotNull PivotAxis pivotAxis, + @NotNull Axis axis, boolean worldSpace){ Vector translationVector = pivotLocation .clone() @@ -96,7 +96,7 @@ public static Set getNearbyChunkKeys(@NotNull Location origin, double radi translationVector, pivotLocation, angleInDegrees, - pivotAxis, + axis, worldSpace, origin.getYaw(), origin.getPitch()); @@ -107,7 +107,7 @@ public static Set getNearbyChunkKeys(@NotNull Location origin, double radi * @param translationVector the translation offset vector from an origin, that will pivot * @param pivotLocation the location to pivot around * @param angleInDegrees the pivot angle in degrees - * @param pivotAxis the axis to pivot around + * @param axis the axis to pivot around * @param worldSpace whether the pivot should occur on world space axis * @param yaw the yaw to consider when pivoting * @param pitch the yaw to consider when pivoting @@ -116,7 +116,7 @@ public static Set getNearbyChunkKeys(@NotNull Location origin, double radi public static @NotNull Location getPivotLocation(@NotNull Vector translationVector, @NotNull Location pivotLocation, double angleInDegrees, - @NotNull PivotAxis pivotAxis, + @NotNull Axis axis, boolean worldSpace, float yaw, float pitch) { @@ -125,10 +125,10 @@ public static Set getNearbyChunkKeys(@NotNull Location origin, double radi Quaternionf rotation = new Quaternionf(); - if (pivotAxis == PivotAxis.X){ + if (axis == Axis.X){ rotation.rotateX(angleRad); } - else if (pivotAxis == PivotAxis.Y){ + else if (axis == Axis.Y){ rotation.rotateY(-angleRad); } else{ diff --git a/docs/release-notes/3.7.0.md b/docs/release-notes/3.7.0.md new file mode 100644 index 00000000..e35a8879 --- /dev/null +++ b/docs/release-notes/3.7.0.md @@ -0,0 +1,46 @@ +**Release Highlights** +- New Rotation Commands💻 +- New Skript Syntax📜 +- New and Breaking API Changes 🔨 + +## Command Changes + +### New Commands +- Added `/deu group setrotation` + - Set a group's rotation on a given local axis + - Permission: `deu.group.transform` +- Added `/deu display setrotation` + - Set a display's rotation on a given local axis + - Permission: `deu.display.transform` + + +## Skript +### New Syntax + +- Added `Active Group/Part - Rotation` + - Get/Set an active group or active part's display transformation rotation + ```yml + set {_activepart}'s deu y rotation to 90 degrees + set {_activegroup}'s deu rotation to {_vector} + set {_quaternion} to {_activepart}'s deu rotation + ``` + +[![SkriptHubViewTheDocs](http://skripthub.net/static/addon/ViewTheDocsButton.png)](http://skripthub.net/docs/?addon=DisplayEntityUtils) + +## API Changes +> [!NOTE] +>**New Version:** `3.7.0` + +### Additions/Changes +- Added `ActiveGroup#setRotation`, to change a group's transformation rotation, rather than entity pitch and yaws +- Added `getRotation`, `resetRotation`, and `rebaseRotation` to `ActiveGroup` +- Added `Active#rotate` using an `Axis` for rotation +- Added `ActivePart#setRotation` to change a display part's transformation rotation + +### Breaking Changes +- Removed `SpawnedDisplayEntityPart#getCreationTime` +- Changed `#setRotation` to `#setEntityRotation` in `Active` +- Renamed `PivotAxis` class to `Axis` + +## QOL +- Added group rotation info to `/deu group info` \ No newline at end of file diff --git a/plugin/pom.xml b/plugin/pom.xml index da30ac15..89a3cf69 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -6,7 +6,7 @@ net.donnypz.displayentityutils deu - 3.6.0 + 3.7.0 plugin diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/command/CMDUtils.java b/plugin/src/main/java/net/donnypz/displayentityutils/command/CMDUtils.java index f505ecd8..587b80c0 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/command/CMDUtils.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/command/CMDUtils.java @@ -5,7 +5,7 @@ import net.donnypz.displayentityutils.managers.DisplayGroupManager; import net.donnypz.displayentityutils.utils.DisplayEntities.*; import net.donnypz.displayentityutils.utils.DisplayUtils; -import net.donnypz.displayentityutils.utils.PivotAxis; +import net.donnypz.displayentityutils.utils.Axis; import net.donnypz.displayentityutils.utils.relativepoints.RelativePointSelector; import net.donnypz.displayentityutils.utils.relativepoints.RelativePointUtils; import net.kyori.adventure.text.Component; @@ -87,15 +87,15 @@ public static void tryAddEntityToGroup(Player player, String[] args, Entity enti } } - public static PivotAxis getPivotAxis(String arg, Player player) { + public static Axis getPivotAxis(String arg, Player player) { if (arg.equalsIgnoreCase("x")){ - return PivotAxis.X; + return Axis.X; } else if (arg.equalsIgnoreCase("y")){ - return PivotAxis.Y; + return Axis.Y; } else if (arg.equalsIgnoreCase("z")){ - return PivotAxis.Z; + return Axis.Z; } else{ player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("Invalid pivot axis!", NamedTextColor.RED))); diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplayCMD.java b/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplayCMD.java index 9e88e486..96671614 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplayCMD.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplayCMD.java @@ -14,6 +14,7 @@ public DisplayCMD(){ new DisplayTranslateCMD(this); new DisplayResetCMD(this); new DisplayRotateCMD(this); + new DisplaySetRotationCMD(this); new DisplayScaleCMD(this); new DisplaySetBlockCMD(this); } diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplayRotateCMD.java b/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplayRotateCMD.java index 96bdccf9..32c3cc92 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplayRotateCMD.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplayRotateCMD.java @@ -4,6 +4,7 @@ import net.donnypz.displayentityutils.command.DEUSubCommand; import net.donnypz.displayentityutils.command.PartsSubCommand; import net.donnypz.displayentityutils.command.Permission; +import net.donnypz.displayentityutils.utils.Axis; import net.donnypz.displayentityutils.utils.DisplayEntities.ActiveGroup; import net.donnypz.displayentityutils.utils.DisplayEntities.ActivePart; import net.donnypz.displayentityutils.utils.DisplayEntities.ActivePartSelection; @@ -32,16 +33,15 @@ class DisplayRotateCMD extends PartsSubCommand { @Override protected boolean executeAllPartsAction(@NotNull Player player, @Nullable ActiveGroup group, @NotNull MultiPartSelection selection, @NotNull String[] args) { try { + String axisInput = args[2]; + Axis axis = Axis.valueOf(axisInput.toUpperCase()); float rotation = Float.parseFloat(args[3]); if (rotation == 0.0f) { player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("Enter a non-zero number for the rotation, in degrees!", NamedTextColor.RED))); return false; } - Quaternionf q = getRotation(args[2], rotation); - if (q == null) { - incorrectUsage(player); - return false; - } + + Quaternionf q = axis.rotate(new Quaternionf(), rotation); boolean worldSpace = getOptionalArguments(player, args).hasFlag(WORLD_SPACE); for (ActivePart selectedPart : selection.getParts()) { @@ -56,7 +56,11 @@ protected boolean executeAllPartsAction(@NotNull Player player, @Nullable Active rotation)))); return true; } catch (NumberFormatException e) { - player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("Enter a valid number for the scale!", NamedTextColor.RED))); + player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("Enter a valid number for the rotation!", NamedTextColor.RED))); + return false; + } + catch(IllegalArgumentException e){ + super.incorrectUsage(player); return false; } } @@ -65,16 +69,16 @@ protected boolean executeAllPartsAction(@NotNull Player player, @Nullable Active protected boolean executeSinglePartAction(@NotNull Player player, @Nullable ActiveGroup group, @NotNull ActivePartSelection selection, @NotNull ActivePart selectedPart, @NotNull String[] args) { if (isNotDisplay(player, selectedPart)) return false; try { + String axisInput = args[2]; + Axis axis = Axis.valueOf(axisInput.toUpperCase()); float rotation = Float.parseFloat(args[3]); + if (rotation == 0.0f) { player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("Enter a non-zero number for the rotation, in degrees!", NamedTextColor.RED))); return false; } - Quaternionf q = getRotation(args[2], rotation); - if (q == null) { - incorrectUsage(player); - return false; - } + + Quaternionf q = axis.rotate(new Quaternionf(), rotation); boolean worldSpace = getOptionalArguments(player, args).hasFlag(WORLD_SPACE); selectedPart.rotate(q, worldSpace); @@ -86,28 +90,19 @@ protected boolean executeSinglePartAction(@NotNull Player player, @Nullable Acti rotation)))); return true; } catch (NumberFormatException e) { - player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("Enter a valid number for the scale!", NamedTextColor.RED))); + player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("Enter a valid number for the rotation!", NamedTextColor.RED))); + return false; + } + catch(IllegalArgumentException e){ + super.incorrectUsage(player); return false; } } @Override - protected void sendIncorrectUsage(@NotNull Player player) { - } + protected void sendIncorrectUsage(@NotNull Player player) {} - private Quaternionf getRotation(String arg, float angle) { - float angleRad = (float) Math.toRadians(angle); - if (arg.equalsIgnoreCase("x")) { - return new Quaternionf().rotateX(angleRad); - } else if (arg.equalsIgnoreCase("y")) { - return new Quaternionf().rotateY(angleRad); - } else if (arg.equalsIgnoreCase("z")) { - return new Quaternionf().rotateZ(angleRad); - } - return null; - } - @Override protected String getDescription() { return "Rotate your selected display on an axis"; diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplaySetRotationCMD.java b/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplaySetRotationCMD.java new file mode 100644 index 00000000..d9657de2 --- /dev/null +++ b/plugin/src/main/java/net/donnypz/displayentityutils/command/display/DisplaySetRotationCMD.java @@ -0,0 +1,90 @@ +package net.donnypz.displayentityutils.command.display; + +import net.donnypz.displayentityutils.DisplayAPI; +import net.donnypz.displayentityutils.command.DEUSubCommand; +import net.donnypz.displayentityutils.command.PartsSubCommand; +import net.donnypz.displayentityutils.command.Permission; +import net.donnypz.displayentityutils.utils.Axis; +import net.donnypz.displayentityutils.utils.DisplayEntities.ActiveGroup; +import net.donnypz.displayentityutils.utils.DisplayEntities.ActivePart; +import net.donnypz.displayentityutils.utils.DisplayEntities.ActivePartSelection; +import net.donnypz.displayentityutils.utils.DisplayEntities.MultiPartSelection; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +class DisplaySetRotationCMD extends PartsSubCommand { + + DisplaySetRotationCMD(@NotNull DEUSubCommand parentSubCommand) { + super("setrotation", parentSubCommand, Permission.DISPLAY_TRANSFORM, true); + setTabComplete(2, List.of("x", "y", "z")); + setTabComplete(3, ""); + } + + @Override + protected boolean executeAllPartsAction(@NotNull Player player, @Nullable ActiveGroup group, @NotNull MultiPartSelection selection, @NotNull String[] args) { + try { + String axisInput = args[2]; + Axis axis = Axis.valueOf(axisInput.toUpperCase()); + float rotation = Float.parseFloat(args[3]); + + for (ActivePart selectedPart : selection.getParts()) { + if (!selectedPart.isDisplay()) continue; + selectedPart.setRotation(rotation, axis); + } + + player.sendMessage(DisplayAPI.pluginPrefix.append(MiniMessage + .miniMessage() + .deserialize(String.format("Rotating your selected parts on their local %s axis by %s degrees!", + args[2].toUpperCase(), + rotation)))); + return true; + } catch (NumberFormatException e) { + player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("Enter a valid number for the scale!", NamedTextColor.RED))); + return false; + } + catch(IllegalArgumentException e){ + super.incorrectUsage(player); + return false; + } + } + + @Override + protected boolean executeSinglePartAction(@NotNull Player player, @Nullable ActiveGroup group, @NotNull ActivePartSelection selection, @NotNull ActivePart selectedPart, @NotNull String[] args) { + if (isNotDisplay(player, selectedPart)) return false; + try { + String axisInput = args[2]; + Axis axis = Axis.valueOf(axisInput.toUpperCase()); + float rotation = Float.parseFloat(args[3]); + + selectedPart.setRotation(rotation, axis); + + player.sendMessage(DisplayAPI.pluginPrefix.append(MiniMessage + .miniMessage() + .deserialize(String.format("Rotating your selected part on the local %s axis by %s degrees!", + args[2].toUpperCase(), + rotation)))); + return true; + } catch (NumberFormatException e) { + player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("Enter a valid number for the rotation!", NamedTextColor.RED))); + return false; + } + catch(IllegalArgumentException e){ + super.incorrectUsage(player); + return false; + } + } + + @Override + protected void sendIncorrectUsage(@NotNull Player player) {} + + @Override + protected String getDescription() { + return "Rotate your selected display on an axis"; + } +} diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupCMD.java b/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupCMD.java index 0ceae04e..4d0c3cc0 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupCMD.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupCMD.java @@ -44,6 +44,7 @@ public GroupCMD(){ new GroupPitchCMD(this); new GroupScaleCMD(this); new GroupRotateCMD(this); + new GroupSetRotationCMD(this); new GroupBrightnessCMD(this); new GroupMoveHereCMD(this); new GroupMoveCMD(this); diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupInfoCMD.java b/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupInfoCMD.java index 6ead1a41..a5536ca0 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupInfoCMD.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupInfoCMD.java @@ -14,6 +14,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import org.joml.Vector3f; public class GroupInfoCMD extends PlayerSubCommand { GroupInfoCMD(@NotNull DEUSubCommand parentSubCommand) { @@ -35,7 +36,8 @@ public void execute(Player player, String[] args) { player.sendMessage(MiniMessage.miniMessage().deserialize("Group Tag: "+groupTag)); player.sendMessage(MiniMessage.miniMessage().deserialize("Total Parts: "+(group.getParts().size()))); - String packetBased = group instanceof PacketDisplayEntityGroup ? "TRUE" : "FALSE"; + + Component persistence; if (group.isPersistent()){ persistence = MiniMessage.miniMessage().deserialize("Is Persistent: TRUE"); @@ -49,6 +51,7 @@ public void execute(Player player, String[] args) { persistence = MiniMessage.miniMessage().deserialize("Is Persistent: FALSE"); } + String packetBased = group instanceof PacketDisplayEntityGroup ? "TRUE" : "FALSE"; player.sendMessage(MiniMessage.miniMessage().deserialize("Is Packet Based: "+packetBased)); player.sendMessage(persistence); @@ -58,6 +61,14 @@ public void execute(Player player, String[] args) { Location loc = group.getLocation(); player.sendMessage(MiniMessage.miniMessage().deserialize("Pitch & Yaw: "+loc.getPitch()+", "+loc.getYaw())); + Vector3f euler = group.getRotation().getEulerAnglesXYZ(new Vector3f()); + float eulerXDeg = (float) Math.toDegrees(euler.x); + float eulerYDeg = (float) Math.toDegrees(euler.y); + float eulerZDeg = (float) Math.toDegrees(euler.z); + player.sendMessage(MiniMessage.miniMessage().deserialize("Group Rotation (X, Y, Z): " + +eulerXDeg+", " + +eulerYDeg+", " + +eulerZDeg)); player.sendMessage(MiniMessage.miniMessage().deserialize("Scale Multiplier: "+group.getScaleMultiplier())); String animTag = group.getSpawnAnimationTag(); diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupSetRotationCMD.java b/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupSetRotationCMD.java new file mode 100644 index 00000000..bb196f38 --- /dev/null +++ b/plugin/src/main/java/net/donnypz/displayentityutils/command/group/GroupSetRotationCMD.java @@ -0,0 +1,68 @@ +package net.donnypz.displayentityutils.command.group; + +import net.donnypz.displayentityutils.DisplayAPI; +import net.donnypz.displayentityutils.command.DEUSubCommand; +import net.donnypz.displayentityutils.command.GroupSubCommand; +import net.donnypz.displayentityutils.command.Permission; +import net.donnypz.displayentityutils.utils.DisplayEntities.ActiveGroup; +import net.donnypz.displayentityutils.utils.Axis; +import net.donnypz.displayentityutils.utils.relativepoints.RelativePointUtils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class GroupSetRotationCMD extends GroupSubCommand { + + private static final String DISPLAYS_ONLY_FLAG = "-displaysonly"; + + public GroupSetRotationCMD(@NotNull DEUSubCommand parentSubCommand) { + super("setrotation", parentSubCommand, Permission.GROUP_TRANSFORM, true); + setTabComplete(2, List.of("x", "y", "z")); + setTabComplete(3, ""); + addFlag(DISPLAYS_ONLY_FLAG); + } + + @Override + protected void sendIncorrectUsage(@NotNull Player player) {} + + @Override + protected void execute(@NotNull Player player, @Nullable ActiveGroup group, @NotNull String[] args) { + if (RelativePointUtils.isViewingRelativePoints(player)){ + player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("You cannot play do that while viewing points!", NamedTextColor.RED))); + return; + } + try{ + String axisInput = args[2]; + Axis axis = Axis.valueOf(axisInput.toUpperCase()); + float rotation = Float.parseFloat(args[3]); + + OptionalArguments oArgs = getOptionalArguments(player, args); + boolean displaysOnly = oArgs.hasFlag(DISPLAYS_ONLY_FLAG); + + group.setRotation(rotation, axis, !displaysOnly); + + player.sendMessage(DisplayAPI.pluginPrefix.append(MiniMessage + .miniMessage() + .deserialize(String.format("Set your selected group's local %s axis rotation to %s degrees!", + axis.name(), + rotation)))); + } + catch(NumberFormatException e){ + player.sendMessage(DisplayAPI.pluginPrefix.append(Component.text("Enter valid numbers!", NamedTextColor.RED))); + } + catch(IllegalArgumentException e){ + super.incorrectUsage(player); + } + } + + @Override + protected String getDescription() { + return "Rotate a group around a given local space axis. " + + "Use \""+DISPLAYS_ONLY_FLAG+"\" to only rotate display entities."; + } +} diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/command/interaction/InteractionCMD.java b/plugin/src/main/java/net/donnypz/displayentityutils/command/interaction/InteractionCMD.java index 663cdae4..820cb8b6 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/command/interaction/InteractionCMD.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/command/interaction/InteractionCMD.java @@ -107,12 +107,12 @@ void setResponsive(boolean responsive){ } } - void pivot(Location pivotLoc, float angle, PivotAxis pivotAxis, boolean worldSpace){ + void pivot(Location pivotLoc, float angle, Axis axis, boolean worldSpace){ if (interaction != null){ - DisplayUtils.pivot(interaction, pivotLoc, angle, pivotAxis, worldSpace); + DisplayUtils.pivot(interaction, pivotLoc, angle, axis, worldSpace); } else{ - interactionPart.pivot(angle, pivotAxis, worldSpace); + interactionPart.pivot(angle, axis, worldSpace); updatePacketGroup(); } } diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/command/interaction/InteractionPivotCMD.java b/plugin/src/main/java/net/donnypz/displayentityutils/command/interaction/InteractionPivotCMD.java index 809effa8..f74c82ef 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/command/interaction/InteractionPivotCMD.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/command/interaction/InteractionPivotCMD.java @@ -5,7 +5,7 @@ import net.donnypz.displayentityutils.command.parts.PartsCMD; import net.donnypz.displayentityutils.managers.DisplayGroupManager; import net.donnypz.displayentityutils.utils.DisplayEntities.*; -import net.donnypz.displayentityutils.utils.PivotAxis; +import net.donnypz.displayentityutils.utils.Axis; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.entity.Player; @@ -40,7 +40,7 @@ public void execute(Player player, String[] args) { return; } - PivotAxis axis = CMDUtils.getPivotAxis(args[2], player); + Axis axis = CMDUtils.getPivotAxis(args[2], player); if (axis == null) return; if (!hasMinimumArguments(player, args)) return; diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/command/mannequin/MannequinPivotCMD.java b/plugin/src/main/java/net/donnypz/displayentityutils/command/mannequin/MannequinPivotCMD.java index 173137a0..24797641 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/command/mannequin/MannequinPivotCMD.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/command/mannequin/MannequinPivotCMD.java @@ -6,7 +6,7 @@ import net.donnypz.displayentityutils.command.PartsSubCommand; import net.donnypz.displayentityutils.command.Permission; import net.donnypz.displayentityutils.utils.DisplayEntities.*; -import net.donnypz.displayentityutils.utils.PivotAxis; +import net.donnypz.displayentityutils.utils.Axis; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.entity.Player; @@ -28,7 +28,7 @@ protected void sendIncorrectUsage(@NotNull Player player) {} @Override protected boolean executeAllPartsAction(@NotNull Player player, @Nullable ActiveGroup group, @NotNull MultiPartSelection selection, @NotNull String[] args) { - PivotAxis axis = CMDUtils.getPivotAxis(args[2], player); + Axis axis = CMDUtils.getPivotAxis(args[2], player); if (axis == null) return false; try{ @@ -51,7 +51,7 @@ protected boolean executeAllPartsAction(@NotNull Player player, @Nullable Active protected boolean executeSinglePartAction(@NotNull Player player, @Nullable ActiveGroup group, @NotNull ActivePartSelection selection, @NotNull ActivePart selectedPart, @NotNull String[] args) { if (isInvalidType(player, selectedPart, SpawnedDisplayEntityPart.PartType.MANNEQUIN)) return false; - PivotAxis axis = CMDUtils.getPivotAxis(args[2], player); + Axis axis = CMDUtils.getPivotAxis(args[2], player); if (axis == null) return false; try{ diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/skript/active/ActiveModule.java b/plugin/src/main/java/net/donnypz/displayentityutils/skript/active/ActiveModule.java index 9a030964..84384c5d 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/skript/active/ActiveModule.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/skript/active/ActiveModule.java @@ -22,6 +22,7 @@ public void load(SkriptAddon addon) { ExprActiveDirection::register, ExprActiveGlowColor::register, ExprActiveInterpolation::register, + ExprActiveRotation::register, ExprActiveTeleportDuration::register, ExprActiveViewRange::register ); diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/skript/active/expressions/ExprActiveRotation.java b/plugin/src/main/java/net/donnypz/displayentityutils/skript/active/expressions/ExprActiveRotation.java new file mode 100644 index 00000000..52e3259f --- /dev/null +++ b/plugin/src/main/java/net/donnypz/displayentityutils/skript/active/expressions/ExprActiveRotation.java @@ -0,0 +1,171 @@ +package net.donnypz.displayentityutils.skript.active.expressions; + +import ch.njol.skript.classes.Changer; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser; +import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; +import net.donnypz.displayentityutils.utils.Axis; +import net.donnypz.displayentityutils.utils.DisplayEntities.Active; +import net.donnypz.displayentityutils.utils.DisplayEntities.ActiveGroup; +import net.donnypz.displayentityutils.utils.DisplayEntities.ActivePart; +import org.bukkit.event.Event; +import org.bukkit.util.Vector; +import org.joml.Quaternionf; +import org.skriptlang.skript.registration.SyntaxInfo; +import org.skriptlang.skript.registration.SyntaxRegistry; + + +@Name("Active Group/Part - Rotation") +@Description("Get/Set the local, transformation space rotation of an active group or active part. " + + "Vectors can be used to set the rotation, and its values must be in degrees.") +@Examples({ + "set {_activepart}'s deu y rotation to 90 degrees", + "set {_activegroup}'s deu x rotation to 45 degrees", + "", + "set {_activegroup}'s deu rotation to {_vector}", + "set {_activepart}'s deu rotation to {_quaternion}", + "", + "set {_quaternion} to {_activepart}'s deu rotation", + "set {_quaternion} to {_activegroup}'s deu display rotation", +}) +@Since("3.7.0") +public class ExprActiveRotation extends SimplePropertyExpression { + + Axis axis; + + public static void register(SyntaxRegistry registry){ + registry.register(SyntaxRegistry.EXPRESSION, + SyntaxInfo.Expression.builder(ExprActiveRotation.class, Quaternionf.class) + .addPatterns(getPatterns("deu [display|transform[ation]] [:x|:y|:z] rotation [degrees]", "activegroups/activeparts")) + .supplier(ExprActiveRotation::new) + .build() + ); + } + + @Override + public Quaternionf convert(Active from) { + Quaternionf q; + if (from instanceof ActivePart p && p.isDisplay()){ + q = p.getTransformation().getLeftRotation(); + } + else if (from instanceof ActiveGroup g){ + q = g.getRotation(); + } + else{ + q = null; + } + return q; + } + + @Override + protected String getPropertyName() { + return "deu rotation"; + } + + @Override + public Class getReturnType() { + return Quaternionf.class; + } + + @Override + public void change(Event event, Object[] delta, Changer.ChangeMode mode){ + Object[] active = getExpr().getArray(event); + if (active == null){ + return; + } + + switch (mode) { + case SET -> { + if (delta == null) return; + + Object o = delta[0]; + if (o == null) return; + + Quaternionf q; + Number n; + switch (o) { + case Quaternionf quaternionf -> { + q = quaternionf; + n = null; + } + case Vector vector -> { + q = new Quaternionf().rotationXYZ( + (float) Math.toRadians(vector.getX()), + (float) Math.toRadians(vector.getY()), + (float) Math.toRadians(vector.getZ()) + ); + n = null; + } + case Number number -> { + q = null; + n = number; + } + default -> { + return; + } + } + + if (q != null && !q.isFinite()) return; + + for (Object a : active){ + if (a instanceof ActiveGroup g){ + if (axis == null){ + if (q == null) return; + g.setRotation(q, true); + } + else{ + if (n == null) return; + g.setRotation(n.floatValue(), axis, true); + } + } + else if (a instanceof ActivePart p){ + if (axis == null){ + if (q == null) return; + p.setRotation(q); + } + else{ + if (n == null) return; + p.setRotation(n.floatValue(), axis); + } + } + } + } + case RESET -> { + for (Object a : active){ + if (a instanceof ActiveGroup g){ + if (axis == null) g.resetRotation(true); + else g.setRotation(0, axis, true); + } + else if (a instanceof ActivePart part){ + if (axis == null) part.setRotation(new Quaternionf()); + else part.setRotation(0, axis); + } + } + } + } + } + + @Override + public Class[] acceptChange(final Changer.ChangeMode mode) { + if (mode == Changer.ChangeMode.RESET) return CollectionUtils.array(); + if (mode == Changer.ChangeMode.SET) { + return CollectionUtils.array(Quaternionf.class, Vector.class, Number.class); + } + return null; + } + + @Override + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + if (parseResult.hasTag("x")) axis = Axis.X; + else if (parseResult.hasTag("y")) axis = Axis.Y; + else if (parseResult.hasTag("z")) axis = Axis.Z; + else axis = null; + return super.init(expressions, matchedPattern, isDelayed, parseResult); + } +} diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/GizmoSessionImpl.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/GizmoSessionImpl.java index 4c4ca517..94ec82af 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/GizmoSessionImpl.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/GizmoSessionImpl.java @@ -6,7 +6,7 @@ import net.donnypz.displayentityutils.managers.DisplayGroupManager; import net.donnypz.displayentityutils.managers.GizmoManager; import net.donnypz.displayentityutils.utils.DisplayEntities.*; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.controls.Control; import net.donnypz.displayentityutils.utils.gizmo.controls.drag.Drag; import net.donnypz.displayentityutils.utils.gizmo.controls.selector.RotationSelector; @@ -75,9 +75,9 @@ public GizmoSessionImpl(Player player, Location spawnLocation) { this.selectors.add(AxisSelector.yz()); //Scale Axis - this.selectors.add(new ScaleSelector(Axis.X)); - this.selectors.add(new ScaleSelector(Axis.Y)); - this.selectors.add(new ScaleSelector(Axis.Z)); + this.selectors.add(new ScaleSelector(GizmoAxis.X)); + this.selectors.add(new ScaleSelector(GizmoAxis.Y)); + this.selectors.add(new ScaleSelector(GizmoAxis.Z)); //Rotate Axis this.selectors.add(RotationSelector.x()); @@ -178,10 +178,10 @@ public void updateRotation() { switch (gizmoSpace) { case LOCAL -> { - gizmoModel.setRotation(selLoc.getPitch(), selLoc.getYaw(), false, false); + gizmoModel.setEntityRotation(selLoc.getPitch(), selLoc.getYaw(), false, false); } case WORLD -> { - gizmoModel.setRotation(0, 0, false, false); + gizmoModel.setEntityRotation(0, 0, false, false); } } diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/Control.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/Control.java index 0a8d78ce..be262d76 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/Control.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/Control.java @@ -5,11 +5,11 @@ public abstract class Control { - protected final Axis axis; + protected final GizmoAxis axis; public static final float MAX_DISTANCE = 15.0f; public static final float MAX_DISTANCE_SQUARED = MAX_DISTANCE*MAX_DISTANCE; - protected Control(Axis axis){ + protected Control(GizmoAxis axis){ this.axis = axis; } @@ -29,7 +29,7 @@ public void unglow(ActiveGroup gizmo) { }); } - public Axis getAxis() { + public GizmoAxis getAxis() { return axis; } diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/Axis.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/GizmoAxis.java similarity index 82% rename from plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/Axis.java rename to plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/GizmoAxis.java index 1988accd..5e7ee174 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/Axis.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/GizmoAxis.java @@ -5,7 +5,7 @@ import java.util.Arrays; -public enum Axis { +public enum GizmoAxis { //axes X(Color.RED, "move_x", new Vector3f(1, 0, 0)), Y(Color.LIME, "move_y", new Vector3f(0, 1, 0)), @@ -20,7 +20,7 @@ public enum Axis { private final Color baseColor; private final String tag; - Axis(Color baseColor, String tag, Vector3f... directions) { + GizmoAxis(Color baseColor, String tag, Vector3f... directions) { this.directions = directions; this.baseColor = baseColor; this.tag = tag; @@ -48,10 +48,10 @@ public String getRotationTag(){ return isPlane() ? null : "rotate_"+tag.substring(5); } - public Axis[] getRotationPlaneAxes(){ - if (this == X) return new Axis[]{Y,Z}; - if (this == Y) return new Axis[]{Z,X}; - if (this == Z) return new Axis[]{X,Y}; + public GizmoAxis[] getRotationPlaneAxes(){ + if (this == X) return new GizmoAxis[]{Y,Z}; + if (this == Y) return new GizmoAxis[]{Z,X}; + if (this == Z) return new GizmoAxis[]{X,Y}; return null; } diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/Drag.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/Drag.java index b603dce6..a37cd652 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/Drag.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/Drag.java @@ -1,12 +1,12 @@ package net.donnypz.displayentityutils.utils.gizmo.controls.drag; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.controls.Control; import org.bukkit.entity.Player; public abstract class Drag extends Control { - public Drag(Axis axis) { + public Drag(GizmoAxis axis) { super(axis); } diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/RotationDrag.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/RotationDrag.java index b6aed308..d32d608d 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/RotationDrag.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/RotationDrag.java @@ -5,7 +5,7 @@ import net.donnypz.displayentityutils.utils.gizmo.GizmoSelectionMode; import net.donnypz.displayentityutils.utils.gizmo.GizmoSessionImpl; import net.donnypz.displayentityutils.utils.gizmo.GizmoSpace; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.util.GizmoMathUtil; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -30,13 +30,13 @@ public class RotationDrag extends Drag { //prev dir from gizmo to player's looking dir private final Vector3f lastDirection = new Vector3f(); - public RotationDrag(Player player, GizmoSessionImpl gizmo, Axis axis) { + public RotationDrag(Player player, GizmoSessionImpl gizmo, GizmoAxis axis) { super(axis); this.gizmo = gizmo; this.originalAxis = axis.getDirections()[0]; this.pivotPoint = gizmo.getGizmoModel().getLocation().toVector().toVector3f(); - Axis[] rotPlaneAxes = axis.getRotationPlaneAxes(); + GizmoAxis[] rotPlaneAxes = axis.getRotationPlaneAxes(); planeAxis1.set( GizmoMathUtil.rotate( diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/ScaleDrag.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/ScaleDrag.java index eacc007f..9fef8e65 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/ScaleDrag.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/ScaleDrag.java @@ -6,7 +6,7 @@ import net.donnypz.displayentityutils.utils.gizmo.GizmoSelectionMode; import net.donnypz.displayentityutils.utils.gizmo.GizmoSessionImpl; import net.donnypz.displayentityutils.utils.gizmo.GizmoSpace; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.util.GizmoTitleUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -30,7 +30,7 @@ public class ScaleDrag extends Drag { private final Vector3f lastHitPoint; - public ScaleDrag(Player player, GizmoSessionImpl gizmo, Axis axis) { + public ScaleDrag(Player player, GizmoSessionImpl gizmo, GizmoAxis axis) { super(axis); this.gizmo = gizmo; @@ -134,7 +134,7 @@ private void applyScale(float movementAmount) { if (part.isDisplay()) { scaleDisplay(part, scaleDelta); } else if (part.getType() == SpawnedDisplayEntityPart.PartType.INTERACTION) { - if (axis == Axis.Y) { + if (axis == GizmoAxis.Y) { part.setInteractionHeight(part.getInteractionHeight() + scaleDelta); } else { part.setInteractionWidth(part.getInteractionWidth() + scaleDelta); @@ -165,10 +165,10 @@ private void applyScale(float movementAmount) { private void scaleDisplay(ActivePart part, float scaleDelta) { Transformation t = part.getTransformation(); - if (axis == Axis.X) { + if (axis == GizmoAxis.X) { float scale = t.getScale().x + scaleDelta; part.setDisplayXScale(scale); - } else if (axis == Axis.Y) { + } else if (axis == GizmoAxis.Y) { float scale = t.getScale().y + scaleDelta; part.setDisplayYScale(scale); } else { diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationAxisDrag.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationAxisDrag.java index 651e61d9..3cde0038 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationAxisDrag.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationAxisDrag.java @@ -1,7 +1,7 @@ package net.donnypz.displayentityutils.utils.gizmo.controls.drag; import net.donnypz.displayentityutils.utils.gizmo.GizmoSpace; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.GizmoSessionImpl; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -9,7 +9,7 @@ public class TranslationAxisDrag extends TranslationDrag { - public TranslationAxisDrag(Player player, GizmoSessionImpl gizmo, Axis axis) { + public TranslationAxisDrag(Player player, GizmoSessionImpl gizmo, GizmoAxis axis) { super(player, gizmo, axis); } diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationDrag.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationDrag.java index 882fe4f6..bdee48b2 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationDrag.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationDrag.java @@ -7,7 +7,7 @@ import net.donnypz.displayentityutils.utils.gizmo.GizmoSessionImpl; import net.donnypz.displayentityutils.utils.gizmo.GizmoSpace; import net.donnypz.displayentityutils.utils.gizmo.TranslationMode; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.util.GizmoTitleUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -33,7 +33,7 @@ public abstract class TranslationDrag extends Drag { protected final Vector3f[] originalAxes; protected final Vector3f[] currentAxesDir; - public TranslationDrag(Player player, GizmoSessionImpl gizmo, Axis axis) { + public TranslationDrag(Player player, GizmoSessionImpl gizmo, GizmoAxis axis) { super(axis); this.gizmo = gizmo; this.originalAxes = axis.getDirections(); diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationPlaneDrag.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationPlaneDrag.java index bd824490..67342488 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationPlaneDrag.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/drag/TranslationPlaneDrag.java @@ -1,16 +1,15 @@ package net.donnypz.displayentityutils.utils.gizmo.controls.drag; -import net.donnypz.displayentityutils.utils.DisplayEntities.*; import net.donnypz.displayentityutils.utils.gizmo.GizmoSessionImpl; import net.donnypz.displayentityutils.utils.gizmo.GizmoSpace; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import org.bukkit.Location; import org.bukkit.entity.Player; import org.joml.Vector3f; public class TranslationPlaneDrag extends TranslationDrag { - public TranslationPlaneDrag(Player player, GizmoSessionImpl gizmo, Axis axis) { + public TranslationPlaneDrag(Player player, GizmoSessionImpl gizmo, GizmoAxis axis) { super(player, gizmo, axis); } diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/AxisSelector.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/AxisSelector.java index 44187bf0..b8a35e6e 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/AxisSelector.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/AxisSelector.java @@ -1,34 +1,34 @@ package net.donnypz.displayentityutils.utils.gizmo.controls.selector; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; public abstract class AxisSelector extends Selector{ - AxisSelector(Axis axis) { + AxisSelector(GizmoAxis axis) { super(axis); } public static TranslationAxisSelector x() { - return new TranslationAxisSelector(Axis.X); + return new TranslationAxisSelector(GizmoAxis.X); } public static TranslationAxisSelector y() { - return new TranslationAxisSelector(Axis.Y); + return new TranslationAxisSelector(GizmoAxis.Y); } public static TranslationAxisSelector z() { - return new TranslationAxisSelector(Axis.Z); + return new TranslationAxisSelector(GizmoAxis.Z); } public static TranslationPlaneSelector xy() { - return new TranslationPlaneSelector(Axis.XY); + return new TranslationPlaneSelector(GizmoAxis.XY); } public static TranslationPlaneSelector xz() { - return new TranslationPlaneSelector(Axis.ZX); + return new TranslationPlaneSelector(GizmoAxis.ZX); } public static TranslationPlaneSelector yz() { - return new TranslationPlaneSelector(Axis.YZ); + return new TranslationPlaneSelector(GizmoAxis.YZ); } } diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/RotationSelector.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/RotationSelector.java index b3133643..c0c84162 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/RotationSelector.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/RotationSelector.java @@ -2,7 +2,7 @@ import net.donnypz.displayentityutils.utils.gizmo.GizmoSessionImpl; import net.donnypz.displayentityutils.utils.gizmo.GizmoSpace; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.controls.drag.Drag; import net.donnypz.displayentityutils.utils.gizmo.controls.drag.RotationDrag; import net.donnypz.displayentityutils.utils.gizmo.util.GizmoMathUtil; @@ -15,20 +15,20 @@ public class RotationSelector extends Selector { private float ringRadius = 1.125f; private float ringThickness = 0.075f; - RotationSelector(Axis axis) { + RotationSelector(GizmoAxis axis) { super(axis); } public static RotationSelector x() { - return new RotationSelector(Axis.X); + return new RotationSelector(GizmoAxis.X); } public static RotationSelector y() { - return new RotationSelector(Axis.Y); + return new RotationSelector(GizmoAxis.Y); } public static RotationSelector z() { - return new RotationSelector(Axis.Z); + return new RotationSelector(GizmoAxis.Z); } @Override @@ -78,7 +78,7 @@ public float intersect(GizmoSpace gizmoSpace, .fma(distanceAlongRay, ray); //keep selection ring as a quarter-circle - Axis[] rotPlaneAxes = axis.getRotationPlaneAxes(); + GizmoAxis[] rotPlaneAxes = axis.getRotationPlaneAxes(); Vector3f axis1 = GizmoMathUtil.rotate( rotPlaneAxes[0].getDirections()[0], gizmoSpace, diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/ScaleSelector.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/ScaleSelector.java index e4f315ba..71b7218b 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/ScaleSelector.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/ScaleSelector.java @@ -1,7 +1,7 @@ package net.donnypz.displayentityutils.utils.gizmo.controls.selector; import net.donnypz.displayentityutils.utils.gizmo.GizmoSpace; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.GizmoSessionImpl; import net.donnypz.displayentityutils.utils.gizmo.controls.drag.Drag; import net.donnypz.displayentityutils.utils.gizmo.controls.drag.ScaleDrag; @@ -16,7 +16,7 @@ public class ScaleSelector extends AxisSelector { private final Vector3f localEnd; private float radius = 0.125f; - public ScaleSelector(Axis axis) { + public ScaleSelector(GizmoAxis axis) { super(axis); this.localStart = axis.getDirections()[0] .mul(1.2f); diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/Selector.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/Selector.java index d6fa2f2a..64d29c18 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/Selector.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/Selector.java @@ -1,7 +1,7 @@ package net.donnypz.displayentityutils.utils.gizmo.controls.selector; import net.donnypz.displayentityutils.utils.gizmo.GizmoSpace; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.GizmoSessionImpl; import net.donnypz.displayentityutils.utils.gizmo.controls.Control; import net.donnypz.displayentityutils.utils.gizmo.controls.drag.Drag; @@ -10,7 +10,7 @@ public abstract class Selector extends Control { - public Selector(Axis axis) { + public Selector(GizmoAxis axis) { super(axis); } diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/TranslationAxisSelector.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/TranslationAxisSelector.java index 5c2eb84e..cc55c365 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/TranslationAxisSelector.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/TranslationAxisSelector.java @@ -1,7 +1,7 @@ package net.donnypz.displayentityutils.utils.gizmo.controls.selector; import net.donnypz.displayentityutils.utils.gizmo.GizmoSpace; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.GizmoSessionImpl; import net.donnypz.displayentityutils.utils.gizmo.controls.drag.Drag; import net.donnypz.displayentityutils.utils.gizmo.controls.drag.TranslationAxisDrag; @@ -16,7 +16,7 @@ public class TranslationAxisSelector extends AxisSelector { private final Vector3f localEnd; private float radius = 0.075f; - TranslationAxisSelector(Axis axis) { + TranslationAxisSelector(GizmoAxis axis) { super(axis); this.localStart = axis.getDirections()[0] .mul(0.1125f); diff --git a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/TranslationPlaneSelector.java b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/TranslationPlaneSelector.java index 60de7bb7..345cb85c 100644 --- a/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/TranslationPlaneSelector.java +++ b/plugin/src/main/java/net/donnypz/displayentityutils/utils/gizmo/controls/selector/TranslationPlaneSelector.java @@ -2,7 +2,7 @@ import net.donnypz.displayentityutils.utils.gizmo.GizmoSessionImpl; import net.donnypz.displayentityutils.utils.gizmo.GizmoSpace; -import net.donnypz.displayentityutils.utils.gizmo.controls.Axis; +import net.donnypz.displayentityutils.utils.gizmo.controls.GizmoAxis; import net.donnypz.displayentityutils.utils.gizmo.controls.drag.Drag; import net.donnypz.displayentityutils.utils.gizmo.controls.drag.TranslationPlaneDrag; import net.donnypz.displayentityutils.utils.gizmo.util.GizmoMathUtil; @@ -16,7 +16,7 @@ public class TranslationPlaneSelector extends Selector { private final Vector3f corner2; private float size = 0.25f; - TranslationPlaneSelector(Axis axis) { + TranslationPlaneSelector(GizmoAxis axis) { super(axis); Vector3f[] axes = axis.getDirections(); Vector3f axis1 = axes[0]; diff --git a/pom.xml b/pom.xml index d74d6e75..84da3df0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ net.donnypz.displayentityutils deu - 3.6.0 + 3.7.0 pom DisplayEntityUtils