From 4f1d0788f8d777fa4ed41f9f7af37f5028f9ee25 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 13 Jun 2022 08:57:14 +0300 Subject: [PATCH] Add `EntityTag.auto_expire` property (#2340) --- .../denizen/paper/PaperModule.java | 5 ++ .../paper/properties/EntityAutoExpire.java | 88 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityAutoExpire.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index 2d9e64f443..0010d2e07e 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -1,6 +1,8 @@ package com.denizenscript.denizen.paper; import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.PlayerTag; @@ -52,6 +54,9 @@ public static void init() { // Properties PropertyParser.registerProperty(EntityArmsRaised.class, EntityTag.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { + PropertyParser.registerProperty(EntityAutoExpire.class, EntityTag.class); + } PropertyParser.registerProperty(EntityCanTick.class, EntityTag.class); PropertyParser.registerProperty(EntityCarryingEgg.class, EntityTag.class); PropertyParser.registerProperty(EntityDrinkingPotion.class, EntityTag.class); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityAutoExpire.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityAutoExpire.java new file mode 100644 index 0000000000..c70fdb4cef --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityAutoExpire.java @@ -0,0 +1,88 @@ +package com.denizenscript.denizen.paper.properties; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.properties.Property; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.properties.PropertyParser; +import org.bukkit.entity.FallingBlock; + +public class EntityAutoExpire implements Property { + + public static boolean describes(ObjectTag entity) { + return entity instanceof EntityTag + && ((EntityTag) entity).getBukkitEntity() instanceof FallingBlock; + } + + public static EntityAutoExpire getFrom(ObjectTag _entity) { + if (!describes(_entity)) { + return null; + } + else { + return new EntityAutoExpire((EntityTag) _entity); + } + } + + public static final String[] handledMechs = new String[] { + "auto_expire" + }; + + private EntityAutoExpire(EntityTag _entity) { + entity = _entity; + } + + EntityTag entity; + + public static void registerTags() { + + // <--[tag] + // @attribute + // @returns ElementTag(Boolean) + // @mechanism EntityTag.auto_expire + // @group properties + // @Plugin Paper + // @description + // Returns whether a falling_block will auto-expire (after 30 seconds, or 5 when outside the world). + PropertyParser.registerTag(ElementTag.class, "auto_expire", (attribute, object) -> { + return new ElementTag(object.doesAutoExpire()); + }); + } + + public FallingBlock getFallingBlock() { + return (FallingBlock) entity.getBukkitEntity(); + } + + public boolean doesAutoExpire() { + return getFallingBlock().doesAutoExpire(); + } + + @Override + public String getPropertyString() { + return doesAutoExpire() ? null : "false"; + } + + @Override + public String getPropertyId() { + return "auto_expire"; + } + + + @Override + public void adjust(Mechanism mechanism) { + + // <--[mechanism] + // @object EntityTag + // @name auto_expire + // @input ElementTag(Boolean) + // @Plugin Paper + // @description + // Sets whether a falling_block will auto-expire (after 30 seconds, or 5 when outside the world). + // @tags + // + // --> + if (mechanism.matches("auto_expire") && mechanism.requireBoolean()) { + getFallingBlock().shouldAutoExpire(mechanism.getValue().asBoolean()); + } + } +}