From c8556e521550d41e3040da0753f52cbe76c4496c Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 22 Mar 2023 02:38:25 -0700 Subject: [PATCH] update a few MaterialTag properties to new core property format --- .../events/block/BlockGrowsScriptEvent.java | 4 +- .../properties/material/MaterialAge.java | 157 ++++++--------- .../properties/material/MaterialAttached.java | 159 +++++----------- .../material/MaterialBlockType.java | 180 +++++------------- .../properties/material/MaterialProperty.java | 19 ++ 5 files changed, 179 insertions(+), 340 deletions(-) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialProperty.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockGrowsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockGrowsScriptEvent.java index 9b492d1f56..8889b3831a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockGrowsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockGrowsScriptEvent.java @@ -61,7 +61,7 @@ public boolean matches(ScriptPath path) { if (!MaterialAge.describes(new MaterialTag(location.getBlockState()))) { return false; } - int oldState = MaterialAge.getFrom(new MaterialTag(location.getBlockState())).getCurrent(); + int oldState = new MaterialAge(new MaterialTag(location.getBlockState())).getCurrent(); if (!path.checkSwitch("from", String.valueOf(oldState))) { return false; } @@ -70,7 +70,7 @@ public boolean matches(ScriptPath path) { if (!MaterialAge.describes(material)) { return false; } - int newState = MaterialAge.getFrom(material).getCurrent(); + int newState = new MaterialAge(material).getCurrent(); if (!path.checkSwitch("to", String.valueOf(newState))) { return false; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAge.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAge.java index 54c6024735..77bb4db7d5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAge.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAge.java @@ -1,43 +1,34 @@ package com.denizenscript.denizen.objects.properties.material; import com.denizenscript.denizen.objects.MaterialTag; +import com.denizenscript.denizencore.exceptions.Unreachable; 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.data.Ageable; +import org.bukkit.block.data.BlockData; import org.bukkit.block.data.type.Sapling; import org.bukkit.block.data.type.TurtleEgg; -public class MaterialAge implements Property { +public class MaterialAge extends MaterialProperty { - public static boolean describes(ObjectTag material) { - return material instanceof MaterialTag - && ((MaterialTag) material).hasModernData() - && (((MaterialTag) material).getModernData() instanceof Ageable - || ((MaterialTag) material).getModernData() instanceof TurtleEgg - || ((MaterialTag) material).getModernData() instanceof Sapling); + public static boolean describes(MaterialTag material) { + BlockData data = material.getModernData(); + return data instanceof Ageable || data instanceof TurtleEgg || data instanceof Sapling; } - public static MaterialAge getFrom(ObjectTag _material) { - if (!describes(_material)) { - return null; - } - else { - return new MaterialAge((MaterialTag) _material); - } + public MaterialAge(MaterialTag material) { // NOTE: BlockGrowsScriptEvent needs this available + super(material); } - public static final String[] handledMechs = new String[] { - "age", "plant_growth" - }; - - private MaterialAge(MaterialTag _material) { - material = _material; + @Override + public ElementTag getPropertyValue() { + return new ElementTag(getCurrent()); } - MaterialTag material; + @Override + public String getPropertyId() { + return "age"; + } public static void register() { @@ -48,8 +39,8 @@ public static void register() { // @description // Returns the maximum age for an ageable material. This includes plant growth. // --> - PropertyParser.registerStaticTag(MaterialAge.class, ElementTag.class, "maximum_age", (attribute, material) -> { - return new ElementTag(material.getMax()); + PropertyParser.registerStaticTag(MaterialAge.class, ElementTag.class, "maximum_age", (attribute, prop) -> { + return new ElementTag(prop.getMax()); }, "maximum_plant_growth"); // <--[tag] @@ -60,67 +51,9 @@ public static void register() { // @description // Returns the current age for an ageable material. This includes plant growth. // --> - PropertyParser.registerStaticTag(MaterialAge.class, ElementTag.class, "age", (attribute, material) -> { - return new ElementTag(material.getCurrent()); + PropertyParser.registerStaticTag(MaterialAge.class, ElementTag.class, "age", (attribute, prop) -> { + return new ElementTag(prop.getCurrent()); }, "plant_growth"); - } - - public TurtleEgg getTurtleEgg() { - return (TurtleEgg) material.getModernData(); - } - - public boolean isTurtleEgg() { - return material.getModernData() instanceof TurtleEgg; - } - - public Sapling getSapling() { - return (Sapling) material.getModernData(); - } - - public boolean isSapling() { - return material.getModernData() instanceof Sapling; - } - - public Ageable getAgeable() { - return (Ageable) material.getModernData(); - } - - public int getCurrent() { - if (isTurtleEgg()) { - return getTurtleEgg().getHatch(); - } - else if (isSapling()) { - return getSapling().getStage(); - } - else { - return getAgeable().getAge(); - } - } - - public int getMax() { - if (isTurtleEgg()) { - return getTurtleEgg().getMaximumHatch(); - } - else if (isSapling()) { - return getSapling().getMaximumStage(); - } - else { - return getAgeable().getMaximumAge(); - } - } - - @Override - public String getPropertyString() { - return String.valueOf(getCurrent()); - } - - @Override - public String getPropertyId() { - return "age"; - } - - @Override - public void adjust(Mechanism mechanism) { // <--[mechanism] // @object MaterialTag @@ -132,21 +65,53 @@ public void adjust(Mechanism mechanism) { // // // --> - if ((mechanism.matches("age") || mechanism.matches("plant_growth")) && mechanism.requireInteger()) { - int age = mechanism.getValue().asInt(); - if (age < 0 || age > getMax()) { - mechanism.echoError("Age value '" + age + "' is not valid. Must be between 0 and " + getMax() + " for material '" + material.name() + "'."); + PropertyParser.registerMechanism(MaterialAge.class, ElementTag.class, "age", (prop, mechanism, param) -> { + if (!mechanism.requireInteger()) { return; } - if (isTurtleEgg()) { - getTurtleEgg().setHatch(age); + int age = param.asInt(); + if (age < 0 || age > prop.getMax()) { + mechanism.echoError("Age value '" + age + "' is not valid. Must be between 0 and " + prop.getMax() + " for material '" + prop.object.name() + "'."); + return; } - else if (isSapling()) { - getSapling().setStage(age); + BlockData data = prop.getBlockData(); + if (data instanceof TurtleEgg turtle) { + turtle.setHatch(age); } - else { - getAgeable().setAge(age); + else if (data instanceof Sapling sapling) { + sapling.setStage(age); } + else if (data instanceof Ageable ageable) { + ageable.setAge(age); + } + }, "plant_growth"); + } + + public int getCurrent() { + BlockData data = getBlockData(); + if (data instanceof TurtleEgg turtle) { + return turtle.getHatch(); + } + else if (data instanceof Sapling sapling) { + return sapling.getStage(); + } + else if (data instanceof Ageable age) { + return age.getAge(); + } + throw new Unreachable(); + } + + public int getMax() { + BlockData data = getBlockData(); + if (data instanceof TurtleEgg turtle) { + return turtle.getMaximumHatch(); + } + else if (data instanceof Sapling sapling) { + return sapling.getMaximumStage(); + } + else if (data instanceof Ageable age) { + return age.getMaximumAge(); } + throw new Unreachable(); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAttached.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAttached.java index a02c69479d..33d42d9ce9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAttached.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialAttached.java @@ -3,46 +3,33 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.MaterialTag; -import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.exceptions.Unreachable; import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.properties.PropertyParser; import org.bukkit.block.data.Attachable; +import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Hangable; import org.bukkit.block.data.type.Gate; import org.bukkit.block.data.type.Lantern; -public class MaterialAttached implements Property { +public class MaterialAttached extends MaterialProperty { - public static boolean describes(ObjectTag material) { - return material instanceof MaterialTag - && ((MaterialTag) material).hasModernData() - && (((MaterialTag) material).getModernData() instanceof Gate - || ((MaterialTag) material).getModernData() instanceof Lantern - || ((MaterialTag) material).getModernData() instanceof Attachable - || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && ((MaterialTag) material).getModernData() instanceof Hangable)); + public static boolean describes(MaterialTag material) { + BlockData data = material.getModernData(); + return data instanceof Gate || data instanceof Lantern || data instanceof Attachable + || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && data instanceof Hangable); } - public static MaterialAttached getFrom(ObjectTag _material){ - if (!describes(_material)) { - return null; - } - else { - return new MaterialAttached((MaterialTag) _material); - } + @Override + public ElementTag getPropertyValue() { + return new ElementTag(isAttached()); } - public static final String[] handledMechs = new String[] { - "attached", "attached_to_wall" - }; - - private MaterialAttached(MaterialTag _material) { - material = _material; + @Override + public String getPropertyId() { + return "attached"; } - MaterialTag material; - public static void register() { // <--[tag] @@ -58,85 +45,9 @@ public static void register() { // For a tripwire, this returns whether a tripwire hook or string forms a complete tripwire circuit and is ready to trigger. // For a hanging sign, this returns whether it is hanging from the block above it. // --> - PropertyParser.registerStaticTag(MaterialAttached.class, ElementTag.class, "attached", (attribute, material) -> { - if (material.isGate()) { - return new ElementTag(material.getGate().isInWall()); - } - else if (material.isLantern()) { - return new ElementTag(material.getLantern().isHanging()); - } - else if (material.isAttachable()) { - return new ElementTag(material.getAttachable().isAttached()); - } - else if (material.isHangable()) { - return new ElementTag(((Hangable) material.material.getModernData()).isHanging()); - } - else { // Unreachable - return null; - } + PropertyParser.registerStaticTag(MaterialAttached.class, ElementTag.class, "attached", (attribute, prop) -> { + return new ElementTag(prop.isAttached()); }, "attached_to_wall"); - } - - public boolean isGate() { - return material.getModernData() instanceof Gate; - } - - public boolean isLantern() { // TODO: remove once 1.19 is the minimum - Lantern extends Hangable - return material.getModernData() instanceof Lantern; - } - - public boolean isHangable() { - return NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && material.getModernData() instanceof Hangable; - } - - public Gate getGate() { - return (Gate) material.getModernData(); - } - - public Lantern getLantern() { // TODO: remove once 1.19 is the minimum - Lantern extends Hangable - return (Lantern) material.getModernData(); - } - - public Attachable getAttachable() { - return (Attachable) material.getModernData(); - } - - public boolean isAttachable() { - return material.getModernData() instanceof Attachable; - } - - /*public Hangable getHangable() { // TODO: 1.19 - return (Hangable) material.getModernData(); - }*/ - - public boolean isAttached() { - if (isGate()) { - return getGate().isInWall(); - } - else if (isLantern()) { - return getLantern().isHanging(); - } - else if (isAttachable()) { - return getAttachable().isAttached(); - } - else if (isHangable()) { - return ((Hangable) material.getModernData()).isHanging(); // TODO: 1.19 - } - return false; // Unreachable - } - - @Override - public String getPropertyString() { - return String.valueOf(isAttached()); - } - - @Override - public String getPropertyId() { - return "attached"; - } - - @Override - public void adjust(Mechanism mechanism) { // <--[mechanism] // @object MaterialTag @@ -154,19 +65,41 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if ((mechanism.matches("attached") || mechanism.matches("attached_to_wall")) && mechanism.requireBoolean()) { - if (isGate()) { - getGate().setInWall(mechanism.getValue().asBoolean()); + PropertyParser.registerMechanism(MaterialAttached.class, ElementTag.class, "attached", (prop, mechanism, param) -> { + if (!mechanism.requireBoolean()) { + return; + } + boolean attach = param.asBoolean(); + BlockData data = prop.getBlockData(); + if (data instanceof Gate gate) { + gate.setInWall(attach); } - else if (isLantern()) { - getLantern().setHanging(mechanism.getValue().asBoolean()); + else if (data instanceof Lantern lantern) { // TODO: remove once 1.19 is the minimum - Lantern extends Hangable + lantern.setHanging(attach); } - else if (isAttachable()) { - getAttachable().setAttached(mechanism.getValue().asBoolean()); + else if (data instanceof Attachable attachable) { + attachable.setAttached(attach); } - else if (isHangable()) { - ((Hangable) material.getModernData()).setHanging(mechanism.getValue().asBoolean()); // TODO: 1.19 + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && data instanceof Hangable hangable) { + hangable.setHanging(attach); } + }, "attached_to_wall"); + } + + public boolean isAttached() { + BlockData data = getBlockData(); + if (data instanceof Gate gate) { + return gate.isInWall(); + } + else if (data instanceof Lantern lantern) { // TODO: remove once 1.19 is the minimum - Lantern extends Hangable + return lantern.isHanging(); // This is explicitly Hangable.isHanging, yet somehow it still works pre-1.19, rare moment of Java being nice about that stuff + } + else if (data instanceof Attachable attachable) { + return attachable.isAttached(); + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && data instanceof Hangable hangable) { + return hangable.isHanging(); } + throw new Unreachable(); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialBlockType.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialBlockType.java index 7544f2670c..cc4ee68d4b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialBlockType.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialBlockType.java @@ -1,53 +1,31 @@ package com.denizenscript.denizen.objects.properties.material; import com.denizenscript.denizen.objects.MaterialTag; -import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.exceptions.Unreachable; import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.properties.PropertyParser; import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.type.*; -public class MaterialBlockType implements Property { +public class MaterialBlockType extends MaterialProperty { - public static boolean describes(ObjectTag material) { - if (!(material instanceof MaterialTag)) { - return false; - } - MaterialTag mat = (MaterialTag) material; - if (!mat.hasModernData()) { - return false; - } - BlockData data = mat.getModernData(); - return data instanceof Slab - || data instanceof TechnicalPiston - || data instanceof Campfire - || data instanceof Scaffolding - || data instanceof PointedDripstone - || data instanceof CaveVinesPlant; + public static boolean describes(MaterialTag material) { + BlockData data = material.getModernData(); + return data instanceof Slab || data instanceof TechnicalPiston || data instanceof Campfire + || data instanceof Scaffolding || data instanceof PointedDripstone || data instanceof CaveVinesPlant; } - public static MaterialBlockType getFrom(ObjectTag _material) { - if (!describes(_material)) { - return null; - } - else { - return new MaterialBlockType((MaterialTag) _material); - } + @Override + public ElementTag getPropertyValue() { + return new ElementTag(getType()); } - public static final String[] handledMechs = new String[] { - "type", "slab_type" - }; - - private MaterialBlockType(MaterialTag _material) { - material = _material; + @Override + public String getPropertyId() { + return "type"; } - public MaterialTag material; - public static void register() { // <--[tag] @@ -64,89 +42,9 @@ public static void register() { // For cave vines, output is NORMAL or BERRIES. // For scaffolding, output is NORMAL or BOTTOM. // --> - PropertyParser.registerStaticTag(MaterialBlockType.class, ElementTag.class, "type", (attribute, material) -> { - return new ElementTag(material.getPropertyString()); + PropertyParser.registerStaticTag(MaterialBlockType.class, ElementTag.class, "type", (attribute, prop) -> { + return new ElementTag(prop.getPropertyString()); }, "slab_type"); - } - - public boolean isSlab() { - return material.getModernData() instanceof Slab; - } - - public boolean isPistonHead() { - return material.getModernData() instanceof TechnicalPiston; - } - - public boolean isCampfire() { - return material.getModernData() instanceof Campfire; - } - - public boolean isDripstone() { - return material.getModernData() instanceof PointedDripstone; - } - - public boolean isCaveVines() { - return material.getModernData() instanceof CaveVinesPlant; - } - - public boolean isScaffolding() { - return material.getModernData() instanceof Scaffolding; - } - - public Slab getSlab() { - return (Slab) material.getModernData(); - } - - public TechnicalPiston getPistonHead() { - return (TechnicalPiston) material.getModernData(); - } - - public Campfire getCampfire() { - return (Campfire) material.getModernData(); - } - - public Scaffolding getScaffolding() { - return (Scaffolding) material.getModernData(); - } - - public PointedDripstone getDripstone() { - return (PointedDripstone) material.getModernData(); - } - - public CaveVinesPlant getCaveVines() { - return (CaveVinesPlant) material.getModernData(); - } - - @Override - public String getPropertyString() { - if (isSlab()) { - return getSlab().getType().name(); - } - else if (isCampfire()) { - return getCampfire().isSignalFire() ? "SIGNAL" : "NORMAL"; - } - else if (isPistonHead()) { - return getPistonHead().getType().name(); - } - else if (isScaffolding()) { - return getScaffolding().isBottom() ? "BOTTOM" : "NORMAL"; - } - else if (isDripstone()) { - return getDripstone().getThickness().name(); - } - else if (isCaveVines()) { - return getCaveVines().isBerries() ? "BERRIES" : "NORMAL"; - } - return null; // Unreachable. - } - - @Override - public String getPropertyId() { - return "type"; - } - - @Override - public void adjust(Mechanism mechanism) { // <--[mechanism] // @object MaterialTag @@ -163,25 +61,49 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("type") || (mechanism.matches("slab_type"))) { - if (isSlab() && mechanism.requireEnum(Slab.Type.class)) { - getSlab().setType(Slab.Type.valueOf(mechanism.getValue().asString().toUpperCase())); + PropertyParser.registerMechanism(MaterialBlockType.class, ElementTag.class, "type", (prop, mechanism, param) -> { + BlockData data = prop.getBlockData(); + if (data instanceof Slab slab && mechanism.requireEnum(Slab.Type.class)) { + slab.setType(mechanism.value.asElement().asEnum(Slab.Type.class)); } - else if (isCampfire()) { - getCampfire().setSignalFire(CoreUtilities.equalsIgnoreCase(mechanism.getValue().asString(), "signal")); + else if (data instanceof TechnicalPiston piston && mechanism.requireEnum(TechnicalPiston.Type.class)) { + piston.setType(mechanism.value.asElement().asEnum(TechnicalPiston.Type.class)); } - else if (isPistonHead() && mechanism.requireEnum(TechnicalPiston.Type.class)) { - getPistonHead().setType(TechnicalPiston.Type.valueOf(mechanism.getValue().asString().toUpperCase())); + else if (data instanceof Campfire campfire) { + campfire.setSignalFire(CoreUtilities.equalsIgnoreCase(mechanism.getValue().asString(), "signal")); } - else if (isScaffolding()) { - getScaffolding().setBottom(CoreUtilities.equalsIgnoreCase(mechanism.getValue().asString(), "bottom")); + else if (data instanceof PointedDripstone dripstone && mechanism.requireEnum(PointedDripstone.Thickness.class)) { + dripstone.setThickness(mechanism.value.asElement().asEnum(PointedDripstone.Thickness.class)); } - else if (isDripstone() && mechanism.requireEnum(PointedDripstone.Thickness.class)) { - ((PointedDripstone) material.getModernData()).setThickness(PointedDripstone.Thickness.valueOf(mechanism.getValue().asString().toUpperCase())); + else if (data instanceof CaveVinesPlant vines) { + vines.setBerries(CoreUtilities.equalsIgnoreCase(mechanism.getValue().asString(), "berries")); } - else if (isCaveVines()) { - getCaveVines().setBerries(CoreUtilities.equalsIgnoreCase(mechanism.getValue().asString(), "berries")); + else if (data instanceof Scaffolding scaffolding) { + scaffolding.setBottom(CoreUtilities.equalsIgnoreCase(mechanism.getValue().asString(), "bottom")); } + }); + } + + public String getType() { + BlockData data = getBlockData(); + if (data instanceof Slab slab) { + return slab.getType().name(); + } + else if (data instanceof TechnicalPiston piston) { + return piston.getType().name(); + } + else if (data instanceof Campfire campfire) { + return campfire.isSignalFire() ? "SIGNAL" : "NORMAL"; + } + else if (data instanceof PointedDripstone dripstone) { + return dripstone.getThickness().name(); + } + else if (data instanceof CaveVinesPlant vines) { + return vines.isBerries() ? "BERRIES" : "NORMAL"; + } + else if (data instanceof Scaffolding scaffolding) { + return scaffolding.isBottom() ? "BOTTOM" : "NORMAL"; } + throw new Unreachable(); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialProperty.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialProperty.java new file mode 100644 index 0000000000..d3aca85086 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialProperty.java @@ -0,0 +1,19 @@ +package com.denizenscript.denizen.objects.properties.material; + +import com.denizenscript.denizen.objects.MaterialTag; +import com.denizenscript.denizencore.objects.properties.ObjectProperty; +import org.bukkit.block.data.BlockData; + +public abstract class MaterialProperty extends ObjectProperty { + + public MaterialProperty() { + } + + public MaterialProperty(MaterialTag material) { + object = material; + } + + public BlockData getBlockData() { + return object.getModernData(); + } +}