Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
5ca19fa
remove spigot and bukkit from loaders
PZDonny Apr 2, 2026
ebcd425
update skript docs
PZDonny Apr 2, 2026
650dd13
update skript examples
PZDonny Apr 7, 2026
24a9be3
no changes
PZDonny Apr 7, 2026
26899cd
update syntax to require "deu"
PZDonny Apr 7, 2026
2b0d331
3.5.2-PRE
PZDonny Apr 15, 2026
a06597a
change #equals() and #hashCode() methods for groups
PZDonny Apr 18, 2026
c852a7c
update #canContinueAnimation
PZDonny Apr 18, 2026
6db2cd4
Use correct transformation in #applyDisplayTransformationWithPackets …
PZDonny Apr 19, 2026
2d728a8
no changes
PZDonny Apr 19, 2026
3208c4b
use spawn settings when creating a packet based display controller
PZDonny Apr 19, 2026
8e04688
move relocations in plugin module
PZDonny Apr 19, 2026
40ab88b
Include rideOffset in group autocull. autocull when group rides/dismo…
PZDonny Apr 19, 2026
bab8ed4
3.5.2-PRE-1
PZDonny Apr 19, 2026
ca31c6d
Don't attempt to respect entity if finalFollowType is null
PZDonny Apr 30, 2026
4c048f5
add "/deu group ridedespawn"
PZDonny Apr 30, 2026
7c7bd43
3.5.2-PRE-2
PZDonny Apr 30, 2026
a753631
remove usage of javax.annotation.Nullable
PZDonny May 2, 2026
a96eddc
Support 26.1.2 & Skript 2.15.2
PZDonny May 2, 2026
c870750
Update PacketEvents to 2.12.1
PZDonny May 2, 2026
9e532b4
Allow part's corresponding type to be used in syntax
PZDonny May 2, 2026
827e08a
require "deu" in entity id syntax
PZDonny May 2, 2026
523b192
correctly unregister group vehicle when invalid.
PZDonny May 2, 2026
ab7d212
respect group facing when updating position
PZDonny May 2, 2026
2079ee3
add PacketDisplayEntityGroup#resendLocation
PZDonny May 2, 2026
d251b80
change #updateChunkAndWorld to teleport group across worlds when loca…
PZDonny May 2, 2026
c8f4b81
Add ActivePartRegistry for holding parts by entityUUID and/or entityId.
PZDonny May 3, 2026
b5c0627
Fix ridden (spawned) groups not staying on player when teleporting/ch…
PZDonny May 3, 2026
23c686f
3.5.2-PRE-3
PZDonny May 3, 2026
e816e38
Use java 25 for building
PZDonny May 3, 2026
60cb814
Save part entity's UUID in all constructors
PZDonny May 6, 2026
60f7602
Add #setBlockReplacement and #setItemReplacement to GroupSpawnSettings
PZDonny May 6, 2026
83f82bd
Add allowDataChanges parameter to DisplayAnimators
PZDonny May 6, 2026
b085bb7
Move reading of DisplayController to DisplayControllerReader
PZDonny May 7, 2026
119bfc7
Update DisplayController & MachineState to optionally play animation …
PZDonny May 7, 2026
4a270fa
Update DEUAnimationMythicMechanic for optional data changes
PZDonny May 7, 2026
00bbeaa
Remove animation texture changes from animations
PZDonny May 7, 2026
1b4525f
Updated example
PZDonny May 7, 2026
e8e7df8
Add optional animation data changes to Skript syntax
PZDonny May 7, 2026
a0218a6
3.5.2-PRE-4
PZDonny May 7, 2026
79fb239
add additional config option for animation data changes
PZDonny May 7, 2026
29d9c3f
update jitpack.yml
PZDonny May 8, 2026
3b3cf55
update jitpack.yml to use java 25
PZDonny May 8, 2026
e7d2b42
3.5.2-PRE-5
PZDonny May 8, 2026
f66a02a
Added "/deu mannequin spawn" command
PZDonny May 24, 2026
c242d99
Remove duplicate listings in list cmds, add message showing that item…
PZDonny May 24, 2026
27a424c
refresh selection when adding mannequin to group. use correct selecti…
PZDonny May 24, 2026
fcde807
prevent mannequins dmg from creative players, if invulnerable
PZDonny May 24, 2026
72f1ada
fix plugin's listeners not loading if essentials isn't installed
PZDonny May 24, 2026
47ef622
Rework "/deu interaction spawnhere" to "spawn" w/ optional group addi…
PZDonny May 24, 2026
02b9513
no changes
PZDonny May 24, 2026
7778d3b
use java 25 when publishing release
PZDonny May 24, 2026
31121cc
Fix animations not converting in worlds other than the overworld. Ens…
PZDonny May 24, 2026
fed8cf8
ensure schedulers fallback to correct value for periods
PZDonny May 24, 2026
ad2c13d
3.5.2
PZDonny May 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ jobs:

steps:
- uses: actions/checkout@v4
- name: Set up JDK 21
- name: Set up JDK 25
uses: actions/setup-java@v4
with:
java-version: '21'
java-version: '25'
distribution: 'temurin'
cache: maven
- name: Build with Maven
Expand Down
7 changes: 3 additions & 4 deletions .github/workflows/modrinth.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ jobs:
- name: Set up JDK
uses: actions/setup-java@v5
with:
java-version: 21
distribution: temurin
java-version: '25'
distribution: 'temurin'
cache: maven

- name: Set version from release tag
Expand All @@ -35,9 +35,8 @@ jobs:
changelog: ${{ github.event.release.body }}
loaders: |-
paper
spigot
bukkit
game-versions: |-
1.20.x
1.21.x
26.1.x
files: plugin/target/displayentityutils-${{ github.event.release.tag_name }}.jar
4 changes: 2 additions & 2 deletions api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>net.donnypz.displayentityutils</groupId>
<artifactId>deu</artifactId>
<version>3.5.1</version>
<version>3.5.2</version>
</parent>

<artifactId>api</artifactId>
Expand All @@ -21,7 +21,7 @@
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21.10-R0.1-SNAPSHOT</version>
<version>26.1.2.build.53-stable</version>
<scope>provided</scope>
</dependency>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public final class DisplayAPI {
static boolean isSkriptInstalled;
static boolean isWorldEditInstalled;
static boolean isPAPIInstalled;
static boolean isEssentialsInstalled;

private static final String legacyPartTagPrefix = "deu.parttag_";

Expand Down Expand Up @@ -198,6 +199,14 @@ public static boolean isPAPIInstalled() {
return isPAPIInstalled;
}

/**
* Get whether EssentialsX is installed on this server
* @return true if EssentialsX is present
*/
public static boolean isEssentialsInstalled() {
return isEssentialsInstalled;
}

public static DisplayStorage getStorage(@NotNull LoadMethod method){
switch(method){
case LOCAL -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public static String getExecuteCommandWorldName(@NotNull World w){
worldName = "overworld";
}
else{
worldName = w.getName();
worldName = w.getKey().toString();
}
return worldName;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.donnypz.displayentityutils.utils.DisplayEntities;

import net.donnypz.displayentityutils.DisplayAPI;
import net.donnypz.displayentityutils.DisplayConfig;
import net.donnypz.displayentityutils.events.AnimationStateChangeEvent;
import net.donnypz.displayentityutils.managers.DEUUser;
import net.donnypz.displayentityutils.managers.DisplayAnimationManager;
Expand Down Expand Up @@ -120,6 +121,21 @@ public boolean hasTag(){
*/
public abstract @NotNull MultiPartSelection<T> createPartSelection(@NotNull PartFilter partFilter);

/**
* Attempt to automatically set the culling bounds for all parts within this group, using config culling values.
* @param includeRideOffset whether the group's rideOffset should be included in calculation
*/
public void autoCull(boolean includeRideOffset){
float widthAdder = DisplayConfig.widthCullingAdder();
float heightAdder = DisplayConfig.heightCullingAdder();
if (includeRideOffset){
widthAdder += (float) Math.max(Math.abs(rideOffset.getX()), Math.abs(rideOffset.getZ()));
heightAdder += (float) Math.abs(rideOffset.getY());
}

autoCull(widthAdder, heightAdder);
}

/**
* Attempt to automatically set the culling bounds for all parts within this group.
* @param widthAdder The amount of width to be added to the culling range
Expand Down Expand Up @@ -783,15 +799,35 @@ public boolean hasAnimated(){
* @param animation the animation this group should play
* @return the {@link DisplayAnimator} that will control the playing of the given animation
*/
public abstract @NotNull DisplayAnimator animate(@NotNull SpawnedDisplayAnimation animation);
public @NotNull DisplayAnimator animate(@NotNull SpawnedDisplayAnimation animation){
return animate(animation, true);
}

/**
* Make a group perform an animation
* @param animation the animation this group should play
* @param allowDataChanges whether block/item display textures and text display text should change based on animation frame data
* @return the {@link DisplayAnimator} that will control the playing of the given animation
*/
public abstract @NotNull DisplayAnimator animate(@NotNull SpawnedDisplayAnimation animation, boolean allowDataChanges);


/**
* Make a group perform a looping animation.
* @param animation the animation this group should play
* @return the {@link DisplayAnimator} that will control the playing of the given animation
*/
public abstract @NotNull DisplayAnimator animateLooping(@NotNull SpawnedDisplayAnimation animation);
public @NotNull DisplayAnimator animateLooping(@NotNull SpawnedDisplayAnimation animation){
return animateLooping(animation, true);
}

/**
* Make a group perform a looping animation.
* @param animation the animation this group should play
* @param allowDataChanges whether block/item display textures and text display text should change based on animation frame data
* @return the {@link DisplayAnimator} that will control the playing of the given animation
*/
public abstract @NotNull DisplayAnimator animateLooping(@NotNull SpawnedDisplayAnimation animation, boolean allowDataChanges);

/**
* Manually stop an animation from playing on this group
Expand Down Expand Up @@ -1084,44 +1120,13 @@ static int next() {

@Override
public boolean equals(Object o) {
if (!(o instanceof ActiveGroup<?> group)) return false;
return ID == group.ID
&& Float.compare(scaleMultiplier, group.scaleMultiplier) == 0
&& lastAnimatedTick == group.lastAnimatedTick
&& Objects.equals(masterPart, group.masterPart)
&& Objects.equals(groupParts, group.groupParts)
&& Objects.equals(tag, group.tag)
&& Objects.equals(followers, group.followers)
&& Objects.equals(followerLock, group.followerLock)
&& Objects.equals(defaultFollower, group.defaultFollower)
&& Objects.equals(animatorLock, group.animatorLock)
&& Objects.equals(activeAnimators, group.activeAnimators)
&& Objects.equals(spawnAnimationTag, group.spawnAnimationTag)
&& spawnAnimationLoadMethod == group.spawnAnimationLoadMethod
&& spawnAnimationType == group.spawnAnimationType
&& Objects.equals(currentMachineState, group.currentMachineState)
&& Objects.equals(rideOffset, group.rideOffset);
if (this == o) return true;
if (!(o instanceof ActiveGroup<?> other)) return false;
return ID == other.ID;
}

@Override
public int hashCode() {
return Objects.hash(
ID,
masterPart,
groupParts,
tag,
followers,
followerLock,
defaultFollower,
animatorLock,
activeAnimators,
spawnAnimationTag,
spawnAnimationLoadMethod,
spawnAnimationType,
currentMachineState,
scaleMultiplier,
rideOffset,
lastAnimatedTick
);
return Integer.hashCode(ID);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
import java.util.concurrent.ConcurrentHashMap;

public abstract class ActivePart implements Active{
protected static final ConcurrentHashMap<Integer, ActivePart> partsById = new ConcurrentHashMap<>();

protected SpawnedDisplayEntityPart.PartType type;
protected UUID partUUID;
private int entityId;
Expand All @@ -43,12 +43,12 @@ public abstract class ActivePart implements Active{
protected ActivePart(int entityId, boolean autoMap){
this.entityId = entityId;
if (autoMap) {
partsById.put(entityId, this);
ActivePartRegistry.register(this);
}
}

protected synchronized void unregister(){
partsById.remove(entityId);
ActivePartRegistry.unregister(this);
valid = false;
}

Expand All @@ -66,7 +66,7 @@ public boolean isValid(){
* @return an {@link ActivePart} or null
*/
public static @Nullable ActivePart getPart(int entityId){
return partsById.get(entityId);
return ActivePartRegistry.getPart(entityId);
}

public boolean isAnimatingForPlayers(){
Expand Down Expand Up @@ -113,10 +113,8 @@ public int getEntityId(){
return entityId;
}

protected synchronized void refreshEntityId(int newEntityId){
partsById.remove(entityId);
entityId = newEntityId;
partsById.put(newEntityId, this);
void setEntityId(int entityId){
this.entityId = entityId;
}


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package net.donnypz.displayentityutils.utils.DisplayEntities;

import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

class ActivePartRegistry {

private static final ConcurrentHashMap<UUID, SpawnedDisplayEntityPart> partsByUUID = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<Integer, ActivePart> partsByEntityId = new ConcurrentHashMap<>();

static void register(ActivePart activePart){
partsByEntityId.put(activePart.getEntityId(), activePart);
if (activePart instanceof SpawnedDisplayEntityPart spawnedPart){
partsByUUID.put(spawnedPart.getEntity().getUniqueId(), spawnedPart);
}
}

static void updateEntityId(SpawnedDisplayEntityPart spawnedPart, int newEntityId){
partsByEntityId.remove(spawnedPart.getEntityId());
spawnedPart.setEntityId(newEntityId);
partsByEntityId.put(newEntityId, spawnedPart);

}

static SpawnedDisplayEntityPart getPart(UUID entityUUID){
return partsByUUID.get(entityUUID);
}

static ActivePart getPart(int entityID){
return partsByEntityId.get(entityID);
}

static void unregister(ActivePart part){
if (part instanceof SpawnedDisplayEntityPart sp){
partsByUUID.remove(sp.getEntity().getUniqueId());
}
partsByEntityId.remove(part.getEntityId());
}
}
Loading
Loading