diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java index b4b6ab8047..224eed1ded 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java @@ -3,6 +3,9 @@ import com.denizenscript.denizen.objects.notable.NotableManager; import com.denizenscript.denizen.utilities.debugging.Debug; import com.denizenscript.denizen.utilities.depends.Depends; +import com.denizenscript.denizencore.flags.AbstractFlagTracker; +import com.denizenscript.denizencore.flags.FlaggableObject; +import com.denizenscript.denizencore.flags.SavableMapFlagTracker; import com.denizenscript.denizencore.objects.*; import com.denizenscript.denizen.utilities.Settings; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -20,6 +23,8 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.util.Vector; @@ -27,7 +32,7 @@ import java.util.ArrayList; import java.util.List; -public class CuboidTag implements ObjectTag, Cloneable, Notable, Adjustable, AreaContainmentObject { +public class CuboidTag implements ObjectTag, Cloneable, Notable, Adjustable, AreaContainmentObject, FlaggableObject { // <--[language] // @name CuboidTag Objects @@ -59,6 +64,7 @@ public CuboidTag clone() { cuboid = new CuboidTag(); } cuboid.noteName = null; + cuboid.flagTracker = null; cuboid.pairs = new ArrayList<>(pairs.size()); for (LocationPair pair : pairs) { cuboid.pairs.add(new LocationPair(pair.low.clone(), pair.high.clone())); @@ -302,6 +308,8 @@ public void regenerate(LocationTag point_1, LocationTag point_2) { public String noteName = null; + public AbstractFlagTracker flagTracker = null; + /** * Construct the cuboid without adding pairs * ONLY use this if addPair will be called immediately after! @@ -632,20 +640,25 @@ public boolean isUnique() { @Override @Note("Cuboids") - public String getSaveObject() { - return identifyFull().substring(3); + public Object getSaveObject() { + ConfigurationSection section = new YamlConfiguration(); + section.set("object", identifyFull()); + section.set("flags", flagTracker.toString()); + return section; } @Override public void makeUnique(String id) { CuboidTag toNote = clone(); toNote.noteName = id; + toNote.flagTracker = new SavableMapFlagTracker(); NotableManager.saveAs(toNote, id); } @Override public void forget() { noteName = null; + flagTracker = null; NotableManager.remove(this); } @@ -711,12 +724,34 @@ public String toString() { return identify(); } + @Override + public AbstractFlagTracker getFlagTracker() { + return flagTracker; + } + + @Override + public void reapplyTracker(AbstractFlagTracker tracker) { + if (noteName != null) { + this.flagTracker = tracker; + } + } + + @Override + public String getReasonNotFlaggable() { + if (noteName == null) { + return "the area is not noted - only noted areas can hold flags"; + } + return "unknown reason - something went wrong"; + } + ///////////////////// // ObjectTag Tag Management ///////////////////// public static void registerTags() { + AbstractFlagTracker.registerFlagHandlers(tagProcessor); + // <--[tag] // @attribute // @returns LocationTag diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EllipsoidTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EllipsoidTag.java index 08ed5cb75b..be326957b4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EllipsoidTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EllipsoidTag.java @@ -3,6 +3,9 @@ import com.denizenscript.denizen.objects.notable.NotableManager; import com.denizenscript.denizen.utilities.debugging.Debug; import com.denizenscript.denizen.utilities.depends.Depends; +import com.denizenscript.denizencore.flags.AbstractFlagTracker; +import com.denizenscript.denizencore.flags.FlaggableObject; +import com.denizenscript.denizencore.flags.SavableMapFlagTracker; import com.denizenscript.denizencore.objects.*; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; @@ -17,6 +20,8 @@ import net.citizensnpcs.api.npc.NPC; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.util.Vector; @@ -24,7 +29,7 @@ import java.util.ArrayList; import java.util.List; -public class EllipsoidTag implements ObjectTag, Notable, Cloneable, AreaContainmentObject { +public class EllipsoidTag implements ObjectTag, Notable, Cloneable, AreaContainmentObject, FlaggableObject { // <--[language] // @name EllipsoidTag Objects @@ -112,14 +117,14 @@ public static boolean matches(String arg) { } @Override public EllipsoidTag clone() { - if (noteName != null) { - return this; - } return new EllipsoidTag(center.clone(), size.clone()); } @Override public ObjectTag duplicate() { + if (noteName != null) { + return this; + } return clone(); } @@ -142,6 +147,8 @@ public EllipsoidTag(LocationTag center, LocationTag size) { public String noteName = null; + public AbstractFlagTracker flagTracker = null; + public ListTag getBlocks(Attribute attribute) { return getBlocks(null, attribute); } @@ -274,13 +281,17 @@ public boolean isUnique() { @Override @Note("Ellipsoids") public Object getSaveObject() { - return identifyFull().substring(10); + ConfigurationSection section = new YamlConfiguration(); + section.set("object", identifyFull()); + section.set("flags", flagTracker.toString()); + return section; } @Override public void makeUnique(String id) { EllipsoidTag toNote = clone(); toNote.noteName = id; + toNote.flagTracker = new SavableMapFlagTracker(); NotableManager.saveAs(toNote, id); } @@ -288,6 +299,7 @@ public void makeUnique(String id) { public void forget() { NotableManager.remove(this); noteName = null; + flagTracker = null; } @Override public int hashCode() { @@ -359,8 +371,30 @@ public ObjectTag setPrefix(String prefix) { return this; } + @Override + public AbstractFlagTracker getFlagTracker() { + return flagTracker; + } + + @Override + public void reapplyTracker(AbstractFlagTracker tracker) { + if (noteName != null) { + this.flagTracker = tracker; + } + } + + @Override + public String getReasonNotFlaggable() { + if (noteName == null) { + return "the area is not noted - only noted areas can hold flags"; + } + return "unknown reason - something went wrong"; + } + public static void registerTags() { + AbstractFlagTracker.registerFlagHandlers(tagProcessor); + // <--[tag] // @attribute // @returns LocationTag diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java index 1d2d8cf58e..fff94da6cf 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java @@ -9,6 +9,9 @@ import com.denizenscript.denizen.utilities.inventory.RecipeHelper; import com.denizenscript.denizen.utilities.inventory.SlotHelper; import com.denizenscript.denizen.utilities.nbt.CustomNBT; +import com.denizenscript.denizencore.flags.AbstractFlagTracker; +import com.denizenscript.denizencore.flags.FlaggableObject; +import com.denizenscript.denizencore.flags.SavableMapFlagTracker; import com.denizenscript.denizencore.objects.*; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer; @@ -34,6 +37,8 @@ import org.bukkit.Material; import org.bukkit.block.BlockState; import org.bukkit.block.DoubleChest; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; @@ -43,7 +48,7 @@ import java.util.*; -public class InventoryTag implements ObjectTag, Notable, Adjustable { +public class InventoryTag implements ObjectTag, Notable, Adjustable, FlaggableObject { // <--[language] // @name InventoryTag Objects @@ -122,11 +127,16 @@ public boolean isUnique() { public boolean isSaving = false; + public AbstractFlagTracker flagTracker = null; + @Note("Inventories") - public String getSaveObject() { + public Object getSaveObject() { isSaving = true; try { - return "in@" + idType + PropertyParser.getPropertiesString(this); + ConfigurationSection section = new YamlConfiguration(); + section.set("object", "in@" + idType + PropertyParser.getPropertiesString(this)); + section.set("flags", flagTracker.toString()); + return section; } finally { isSaving = false; @@ -160,14 +170,36 @@ public void makeUnique(String id) { idType = "generic"; idHolder = new ElementTag(CoreUtilities.toLowerCase(getInventoryType().name())); } + flagTracker = new SavableMapFlagTracker(); NotableManager.saveAs(this, id); } public void forget() { + flagTracker = null; NotableManager.remove(this); InventoryScriptHelper.notedInventories.remove(inventory); } + @Override + public AbstractFlagTracker getFlagTracker() { + return flagTracker; + } + + @Override + public void reapplyTracker(AbstractFlagTracker tracker) { + if (NotableManager.getSavedId(this) != null) { + this.flagTracker = tracker; + } + } + + @Override + public String getReasonNotFlaggable() { + if (NotableManager.getSavedId(this) == null) { + return "the inventory is not noted - only noted inventories can hold flags"; + } + return "unknown reason - something went wrong"; + } + public static InventoryTag valueOf(String string, PlayerTag player, NPCTag npc, boolean silent) { return valueOf(string, new BukkitTagContext(player, npc, null, !silent, null)); } @@ -1081,6 +1113,8 @@ public String toString() { public static void registerTags() { + AbstractFlagTracker.registerFlagHandlers(tagProcessor); + // <--[tag] // @attribute // @returns ElementTag(Number) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/PolygonTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/PolygonTag.java index 38afc3257c..7247191c7b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/PolygonTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/PolygonTag.java @@ -4,6 +4,9 @@ import com.denizenscript.denizen.utilities.Settings; import com.denizenscript.denizen.utilities.debugging.Debug; import com.denizenscript.denizen.utilities.depends.Depends; +import com.denizenscript.denizencore.flags.AbstractFlagTracker; +import com.denizenscript.denizencore.flags.FlaggableObject; +import com.denizenscript.denizencore.flags.SavableMapFlagTracker; import com.denizenscript.denizencore.objects.*; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; @@ -18,13 +21,15 @@ import net.citizensnpcs.api.npc.NPC; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; -public class PolygonTag implements ObjectTag, Cloneable, Notable, Adjustable, AreaContainmentObject { +public class PolygonTag implements ObjectTag, Cloneable, Notable, Adjustable, AreaContainmentObject, FlaggableObject { // <--[language] // @name PolygonTag Objects @@ -58,6 +63,8 @@ public class PolygonTag implements ObjectTag, Cloneable, Notable, Adjustable, Ar public String noteName = null; + public AbstractFlagTracker flagTracker = null; + public static class Corner { public double x, z; @@ -395,20 +402,25 @@ public boolean isUnique() { @Override @Note("Polygons") - public String getSaveObject() { - return identifyFull().substring("polygon@".length()); + public Object getSaveObject() { + ConfigurationSection section = new YamlConfiguration(); + section.set("object", identifyFull()); + section.set("flags", flagTracker.toString()); + return section; } @Override public void makeUnique(String id) { PolygonTag toNote = clone(); toNote.noteName = id; + toNote.flagTracker = new SavableMapFlagTracker(); NotableManager.saveAs(toNote, id); } @Override public void forget() { noteName = null; + flagTracker = null; NotableManager.remove(this); } @@ -472,8 +484,30 @@ public String toString() { return identify(); } + @Override + public AbstractFlagTracker getFlagTracker() { + return flagTracker; + } + + @Override + public void reapplyTracker(AbstractFlagTracker tracker) { + if (noteName != null) { + this.flagTracker = tracker; + } + } + + @Override + public String getReasonNotFlaggable() { + if (noteName == null) { + return "the area is not noted - only noted areas can hold flags"; + } + return "unknown reason - something went wrong"; + } + public static void registerTags() { + AbstractFlagTracker.registerFlagHandlers(tagProcessor); + // <--[tag] // @attribute ]> // @returns ElementTag(Boolean) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/notable/NotableManager.java b/plugin/src/main/java/com/denizenscript/denizen/objects/notable/NotableManager.java index da1feb07d8..29bb95b0ea 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/notable/NotableManager.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/notable/NotableManager.java @@ -3,6 +3,8 @@ import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.objects.*; import com.denizenscript.denizen.utilities.debugging.Debug; +import com.denizenscript.denizencore.flags.FlaggableObject; +import com.denizenscript.denizencore.flags.SavableMapFlagTracker; import com.denizenscript.denizencore.objects.ObjectFetcher; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.notable.Notable; @@ -119,9 +121,22 @@ private static void _recallNotables() { } for (String notableRaw : section.getKeys(false)) { String notable = EscapeTagBase.unEscape(notableRaw.replace("DOT", ".")); - Notable obj = (Notable) ObjectFetcher.getObjectFrom(clazz, section.getString(notableRaw), CoreUtilities.errorButNoDebugContext); + String objText; + String flagText = null; + if (section.isConfigurationSection(notableRaw)) { + objText = section.getConfigurationSection(notableRaw).getString("object"); + flagText = section.getConfigurationSection(notableRaw).getString("flags"); + } + else { + objText = section.getString(notableRaw); + } + Notable obj = (Notable) ObjectFetcher.getObjectFrom(clazz, objText, CoreUtilities.errorButNoDebugContext); if (obj != null) { obj.makeUnique(notable); + obj = getSavedObject(notable); + if (flagText != null && obj instanceof FlaggableObject) { + ((FlaggableObject) obj).reapplyTracker(new SavableMapFlagTracker(flagText)); + } } else { Debug.echoError("Notable '" + notable + "' failed to load!"); @@ -139,10 +154,8 @@ private static void _saveNotables() { notables.set(key, null); } for (Map.Entry notable : notableObjects.entrySet()) { - try { - notables.set(getClassId(getClass(notable.getValue())) + "." + EscapeTagBase.escape(CoreUtilities.toLowerCase(notable.getKey())), - notable.getValue().getSaveObject()); + notables.set(getClassId(getClass(notable.getValue())) + "." + EscapeTagBase.escape(CoreUtilities.toLowerCase(notable.getKey())), notable.getValue().getSaveObject()); } catch (Exception e) { Debug.echoError("Notable '" + notable.getKey() + "' failed to save!");