diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java index 0904442714..5476139daa 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java @@ -10,7 +10,7 @@ import com.denizenscript.denizen.objects.properties.material.MaterialDirectional; import com.denizenscript.denizen.objects.properties.material.MaterialDistance; import com.denizenscript.denizen.objects.properties.material.MaterialHalf; -import com.denizenscript.denizen.objects.properties.material.MaterialSwitchFace; +import com.denizenscript.denizen.objects.properties.material.MaterialAttachmentFace; import com.denizenscript.denizen.scripts.commands.world.SwitchCommand; import com.denizenscript.denizen.utilities.*; import com.denizenscript.denizen.utilities.blocks.SpawnableHelper; @@ -3902,8 +3902,8 @@ else if (PolygonTag.matches(attribute.getParam())) { else if (material.getMaterial() == Material.WALL_TORCH || material.getMaterial() == Material.REDSTONE_WALL_TORCH || material.getMaterial() == Material.SOUL_WALL_TORCH) { face = ((Directional) material.getModernData()).getFacing().getOppositeFace(); } - else if (MaterialSwitchFace.describes(material)) { - face = MaterialSwitchFace.getFrom(material).getAttachedTo(); + else if (MaterialAttachmentFace.describes(material)) { + face = new MaterialAttachmentFace(material).getAttachedTo(); } else if (material.hasModernData() && material.getModernData() instanceof org.bukkit.block.data.type.WallSign) { face = ((org.bukkit.block.data.type.WallSign) material.getModernData()).getFacing().getOppositeFace(); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java index efa391e1f7..de1e7009c2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java @@ -315,7 +315,7 @@ public static void register() { }); tagProcessor.registerTag(ElementTag.class, "is_switch", (attribute, object) -> { BukkitImplDeprecations.materialPropertyTags.warn(attribute.context); - return new ElementTag(MaterialSwitchFace.describes(object)); + return new ElementTag(MaterialAttachmentFace.describes(object)); }); tagProcessor.registerTag(ElementTag.class, "is_waterloggable", (attribute, object) -> { BukkitImplDeprecations.materialPropertyTags.warn(attribute.context); 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 37bbacee0f..ba75cce27d 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 @@ -243,6 +243,7 @@ public static void registerMainProperties() { // register core MaterialTag properties PropertyParser.registerProperty(MaterialAge.class, MaterialTag.class); PropertyParser.registerProperty(MaterialAttached.class, MaterialTag.class); + PropertyParser.registerProperty(MaterialAttachmentFace.class, MaterialTag.class); PropertyParser.registerProperty(MaterialBlockType.class, MaterialTag.class); PropertyParser.registerProperty(MaterialBrewingStand.class, MaterialTag.class); PropertyParser.registerProperty(MaterialCampfire.class, MaterialTag.class); @@ -267,7 +268,6 @@ public static void registerMainProperties() { PropertyParser.registerProperty(MaterialSides.class, MaterialTag.class); PropertyParser.registerProperty(MaterialSnowable.class, MaterialTag.class); PropertyParser.registerProperty(MaterialSwitchable.class, MaterialTag.class); - PropertyParser.registerProperty(MaterialSwitchFace.class, MaterialTag.class); PropertyParser.registerProperty(MaterialUnstable.class, MaterialTag.class); PropertyParser.registerProperty(MaterialWaterlogged.class, MaterialTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAttachmentFace.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAttachmentFace.java new file mode 100644 index 0000000000..f262182ec3 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAttachmentFace.java @@ -0,0 +1,91 @@ +package com.denizenscript.denizen.objects.properties.material; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; +import com.denizenscript.denizen.objects.MaterialTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.Mechanism; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Directional; +import org.bukkit.block.data.FaceAttachable; +import org.bukkit.block.data.type.Bell; + +public class MaterialAttachmentFace extends MaterialProperty { + + // <--[property] + // @object MaterialTag + // @name attachment_face + // @input ElementTag + // @description + // Controls the current attach direction for attachable materials such as switches, grindstones, and bells. + // For bell values, see <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/block/data/type/Bell.Attachment.html> + // For all other supported type values, see <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/block/data/FaceAttachable.AttachedFace.html> + // --> + + public static boolean describes(MaterialTag material) { + BlockData data = material.getModernData(); + return data instanceof FaceAttachable || data instanceof Bell; + } + + public MaterialAttachmentFace(MaterialTag material) { + super(material); + } + + @Override + public ElementTag getPropertyValue() { + if (getBlockData() instanceof FaceAttachable attachable) { + return new ElementTag(attachable.getAttachedFace()); + } + else if (getBlockData() instanceof Bell bell) { + return new ElementTag(bell.getAttachment()); + } + return null; + } + + @Override + public String getPropertyId() { + return "attachment_face"; + } + + @Override + public void setPropertyValue(ElementTag attachment, Mechanism mechanism) { + if (getBlockData() instanceof FaceAttachable attachable) { + if (mechanism.requireEnum(FaceAttachable.AttachedFace.class)) { + attachable.setAttachedFace(FaceAttachable.AttachedFace.valueOf(attachment.asString().toUpperCase())); + } + } + else if (getBlockData() instanceof Bell bell) { + if (mechanism.requireEnum(Bell.Attachment.class)) { + bell.setAttachment(Bell.Attachment.valueOf(attachment.asString().toUpperCase())); + } + } + } + + public BlockFace getAttachedTo() { + if (getBlockData() instanceof FaceAttachable attachable) { + return switch (attachable.getAttachedFace()) { + case WALL -> { + if (getBlockData() instanceof Directional) { + yield ((Directional) getBlockData()).getFacing().getOppositeFace(); + } + yield BlockFace.SELF; + } + case FLOOR -> BlockFace.DOWN; + case CEILING -> BlockFace.UP; + }; + } + else if (getBlockData() instanceof Bell bell) { + return switch (bell.getAttachment()) { + case SINGLE_WALL, DOUBLE_WALL -> ((Directional) getBlockData()).getFacing(); + case FLOOR -> BlockFace.DOWN; + case CEILING -> BlockFace.UP; + }; + } + return null; + } + + public static void register() { + autoRegister("attachment_face", MaterialAttachmentFace.class, ElementTag.class, false, "switch_face"); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchFace.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchFace.java deleted file mode 100644 index 2d8bd89b14..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchFace.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.denizenscript.denizen.objects.properties.material; - -import com.denizenscript.denizen.objects.MaterialTag; -import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.objects.properties.PropertyParser; -import org.bukkit.block.BlockFace; -import org.bukkit.block.data.Directional; -import org.bukkit.block.data.FaceAttachable; - -public class MaterialSwitchFace implements Property { - - public static boolean describes(ObjectTag material) { - return material instanceof MaterialTag - && ((MaterialTag) material).hasModernData() - && ((MaterialTag) material).getModernData() instanceof FaceAttachable; - } - - public static MaterialSwitchFace getFrom(ObjectTag _material) { - if (!describes(_material)) { - return null; - } - else { - return new MaterialSwitchFace((MaterialTag) _material); - } - } - - public static final String[] handledMechs = new String[] { - "switch_face" - }; - - public MaterialSwitchFace(MaterialTag _material) { - material = _material; - } - - MaterialTag material; - - public static void register() { - - // <--[tag] - // @attribute - // @returns ElementTag - // @mechanism MaterialTag.switch_face - // @group properties - // @description - // Returns the current attach direction for a switch or other attachable material. - // Output is "CEILING", "FLOOR", or "WALL". - // --> - PropertyParser.registerStaticTag(MaterialSwitchFace.class, ElementTag.class, "switch_face", (attribute, material) -> { - return new ElementTag(material.getFaceAttachable().getAttachedFace()); - }); - } - - public FaceAttachable getFaceAttachable() { - return (FaceAttachable) material.getModernData(); - } - - @Override - public String getPropertyString() { - return getFaceAttachable().getAttachedFace().name(); - } - - public BlockFace getAttachedTo() { - switch (getFaceAttachable().getAttachedFace()) { - case WALL: - if (material.getModernData() instanceof Directional) { - return ((Directional) material.getModernData()).getFacing().getOppositeFace(); - } - case FLOOR: - return BlockFace.DOWN; - case CEILING: - return BlockFace.UP; - default: - return BlockFace.SELF; - } - } - - @Override - public String getPropertyId() { - return "switch_face"; - } - - @Override - public void adjust(Mechanism mechanism) { - - // <--[mechanism] - // @object MaterialTag - // @name switch_face - // @input ElementTag - // @description - // Sets the current attach direction for a switch or other attachable material. - // @tags - // - // --> - if (mechanism.matches("switch_face") && mechanism.requireEnum(FaceAttachable.AttachedFace.class)) { - getFaceAttachable().setAttachedFace(FaceAttachable.AttachedFace.valueOf(mechanism.getValue().asString().toUpperCase())); - } - } -}