From f6b1f872faa368783c79af87bd1b3649bf6e845e Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Thu, 25 Dec 2025 09:53:05 -0800 Subject: [PATCH 1/2] Added EntityTag.State property for armadillo rolling --- .../denizen/nms/interfaces/EntityHelper.java | 9 ++++ .../objects/properties/PropertyRegistry.java | 3 ++ .../properties/entity/EntityState.java | 43 +++++++++++++++++++ .../nms/v1_20/helpers/EntityHelperImpl.java | 17 ++++++++ .../nms/v1_21/helpers/EntityHelperImpl.java | 17 ++++++++ 5 files changed, 89 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityState.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index 0501930cd7..8cfbbd784c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -5,6 +5,7 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.MapTag; import net.kyori.adventure.nbt.CompoundBinaryTag; @@ -514,4 +515,12 @@ public void onEntityMount(EntityDismountEvent event) { public Class getExitsVehicleEventImpl() { // TODO: once 1.20 is the minimum supported version, implement in the ScriptEvent class as usual return EntityExitsVehicleScriptEventImpl.class; } + + public ElementTag getArmadilloState(Armadillo entity) { + throw new UnsupportedOperationException(); + } + + public void setArmadilloState(Armadillo entity, Mechanism mechanism, ElementTag state) { + throw new UnsupportedOperationException(); + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 477c8bb129..abfdd8ef35 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -173,6 +173,9 @@ public static void registerMainProperties() { } PropertyParser.registerProperty(EntitySpeed.class, EntityTag.class); PropertyParser.registerProperty(EntitySpell.class, EntityTag.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + PropertyParser.registerProperty(EntityState.class, EntityTag.class); + } if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { PropertyParser.registerProperty(EntityStepHeight.class, EntityTag.class); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityState.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityState.java new file mode 100644 index 0000000000..38772d6525 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityState.java @@ -0,0 +1,43 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.entity.Armadillo; + +public class EntityState extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name state + // @input ElementTag + // @description + // Controls the current state of an armadillo. + // Valid states are IDLE, ROLLING, SCARED, and UNROLLING. + // The entity may roll or unroll due to normal vanilla conditions. If this is not desired, disable <@link mechanism EntityTag.has_ai>. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Armadillo; + } + + @Override + public ElementTag getPropertyValue() { + return NMSHandler.entityHelper.getArmadilloState(as(Armadillo.class)); + } + + @Override + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + NMSHandler.entityHelper.setArmadilloState(as(Armadillo.class), mechanism, param); + } + + @Override + public String getPropertyId() { + return "state"; + } + + public static void register() { + autoRegister("state", EntityState.class, ElementTag.class, false); + } +} diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java index 58fb9ba367..84eb878db6 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java @@ -8,7 +8,9 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; +import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.MapTag; import com.denizenscript.denizencore.scripts.commands.core.ReflectionSetCommand; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -43,6 +45,7 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.animal.armadillo.Armadillo; import net.minecraft.world.entity.item.FallingBlockEntity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.PrimedTnt; @@ -848,4 +851,18 @@ public void modifyRawNBT(Entity entity, CompoundBinaryTag tag) { nmsEntity.load(nmsMergedTag); nmsEntity.setUUID(uuid); } + + @Override + public ElementTag getArmadilloState(org.bukkit.entity.Armadillo entity) { + net.minecraft.world.entity.animal.armadillo.Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); + return new ElementTag(armadillo.getState()); + } + + @Override + public void setArmadilloState(org.bukkit.entity.Armadillo entity, Mechanism mechanism, ElementTag state) { + if (mechanism.requireEnum(Armadillo.ArmadilloState.class)) { + net.minecraft.world.entity.animal.armadillo.Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); + armadillo.switchToState(state.asEnum(Armadillo.ArmadilloState.class)); + } + } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index 8899ea0572..3f18f70ccc 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -9,7 +9,9 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; +import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.MapTag; import com.denizenscript.denizencore.scripts.commands.core.ReflectionSetCommand; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -45,6 +47,7 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.animal.armadillo.Armadillo; import net.minecraft.world.entity.item.FallingBlockEntity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.PrimedTnt; @@ -843,4 +846,18 @@ public void modifyRawNBT(Entity entity, CompoundBinaryTag tag) { Handler.useValueInput(nmsMergedTag, nmsEntity::load); nmsEntity.setUUID(uuid); } + + @Override + public ElementTag getArmadilloState(org.bukkit.entity.Armadillo entity) { + net.minecraft.world.entity.animal.armadillo.Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); + return new ElementTag(armadillo.getState()); + } + + @Override + public void setArmadilloState(org.bukkit.entity.Armadillo entity, Mechanism mechanism, ElementTag state) { + if (mechanism.requireEnum(Armadillo.ArmadilloState.class)) { + net.minecraft.world.entity.animal.armadillo.Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); + armadillo.switchToState(state.asEnum(Armadillo.ArmadilloState.class)); + } + } } From 02d5d45db47b8cc67985055fffa86cb139227cdf Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Mon, 12 Jan 2026 14:44:08 -0800 Subject: [PATCH 2/2] NMS updates --- .../denizen/nms/interfaces/EntityHelper.java | 6 ++--- .../properties/entity/EntityState.java | 10 +++++-- .../nms/v1_20/helpers/EntityHelperImpl.java | 26 ++++++++++++------- .../nms/v1_21/helpers/EntityHelperImpl.java | 25 ++++++++++++------ 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index 8cfbbd784c..f18202f90e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -5,7 +5,7 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.Utilities; -import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizen.objects.properties.entity.EntityState; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.MapTag; import net.kyori.adventure.nbt.CompoundBinaryTag; @@ -516,11 +516,11 @@ public Class getExitsVehicleEventImpl() return EntityExitsVehicleScriptEventImpl.class; } - public ElementTag getArmadilloState(Armadillo entity) { + public EntityState.ArmadilloState getArmadilloState(Armadillo entity) { throw new UnsupportedOperationException(); } - public void setArmadilloState(Armadillo entity, Mechanism mechanism, ElementTag state) { + public void setArmadilloState(Armadillo entity, EntityState.ArmadilloState state) { throw new UnsupportedOperationException(); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityState.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityState.java index 38772d6525..5b3e5d6799 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityState.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityState.java @@ -22,14 +22,20 @@ public static boolean describes(EntityTag entity) { return entity.getBukkitEntity() instanceof Armadillo; } + public enum ArmadilloState { + IDLE, ROLLING, SCARED, UNROLLING; + } + @Override public ElementTag getPropertyValue() { - return NMSHandler.entityHelper.getArmadilloState(as(Armadillo.class)); + return new ElementTag(NMSHandler.entityHelper.getArmadilloState(as(Armadillo.class))); } @Override public void setPropertyValue(ElementTag param, Mechanism mechanism) { - NMSHandler.entityHelper.setArmadilloState(as(Armadillo.class), mechanism, param); + if (mechanism.requireEnum(ArmadilloState.class)) { + NMSHandler.entityHelper.setArmadilloState(as(Armadillo.class), param.asEnum(ArmadilloState.class)); + } } @Override diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java index 84eb878db6..6d4227026b 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java @@ -6,9 +6,9 @@ import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.properties.entity.EntityState; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; -import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.MapTag; @@ -853,16 +853,24 @@ public void modifyRawNBT(Entity entity, CompoundBinaryTag tag) { } @Override - public ElementTag getArmadilloState(org.bukkit.entity.Armadillo entity) { - net.minecraft.world.entity.animal.armadillo.Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); - return new ElementTag(armadillo.getState()); + public EntityState.ArmadilloState getArmadilloState(org.bukkit.entity.Armadillo entity) { + Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); + return switch (armadillo.getState()) { + case IDLE -> EntityState.ArmadilloState.IDLE; + case ROLLING -> EntityState.ArmadilloState.ROLLING; + case SCARED -> EntityState.ArmadilloState.SCARED; + case UNROLLING -> EntityState.ArmadilloState.UNROLLING; + }; } @Override - public void setArmadilloState(org.bukkit.entity.Armadillo entity, Mechanism mechanism, ElementTag state) { - if (mechanism.requireEnum(Armadillo.ArmadilloState.class)) { - net.minecraft.world.entity.animal.armadillo.Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); - armadillo.switchToState(state.asEnum(Armadillo.ArmadilloState.class)); - } + public void setArmadilloState(org.bukkit.entity.Armadillo entity, EntityState.ArmadilloState state) { + Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); + armadillo.switchToState(switch (state) { + case IDLE -> Armadillo.ArmadilloState.IDLE; + case ROLLING -> Armadillo.ArmadilloState.ROLLING; + case SCARED -> Armadillo.ArmadilloState.SCARED; + case UNROLLING -> Armadillo.ArmadilloState.UNROLLING; + }); } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index 3f18f70ccc..1a9938010b 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -7,6 +7,7 @@ import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.properties.entity.EntityState; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; import com.denizenscript.denizencore.objects.Mechanism; @@ -848,16 +849,24 @@ public void modifyRawNBT(Entity entity, CompoundBinaryTag tag) { } @Override - public ElementTag getArmadilloState(org.bukkit.entity.Armadillo entity) { - net.minecraft.world.entity.animal.armadillo.Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); - return new ElementTag(armadillo.getState()); + public EntityState.ArmadilloState getArmadilloState(org.bukkit.entity.Armadillo entity) { + Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); + return switch (armadillo.getState()) { + case IDLE -> EntityState.ArmadilloState.IDLE; + case ROLLING -> EntityState.ArmadilloState.ROLLING; + case SCARED -> EntityState.ArmadilloState.SCARED; + case UNROLLING -> EntityState.ArmadilloState.UNROLLING; + }; } @Override - public void setArmadilloState(org.bukkit.entity.Armadillo entity, Mechanism mechanism, ElementTag state) { - if (mechanism.requireEnum(Armadillo.ArmadilloState.class)) { - net.minecraft.world.entity.animal.armadillo.Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); - armadillo.switchToState(state.asEnum(Armadillo.ArmadilloState.class)); - } + public void setArmadilloState(org.bukkit.entity.Armadillo entity, EntityState.ArmadilloState state) { + Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); + armadillo.switchToState(switch (state) { + case IDLE -> Armadillo.ArmadilloState.IDLE; + case ROLLING -> Armadillo.ArmadilloState.ROLLING; + case SCARED -> Armadillo.ArmadilloState.SCARED; + case UNROLLING -> Armadillo.ArmadilloState.UNROLLING; + }); } }