From a63c195cb38efb639f1a0fff1747b729f53b137b Mon Sep 17 00:00:00 2001 From: Jay Hopkins Date: Sat, 20 Aug 2022 02:38:40 -0400 Subject: [PATCH] Towny and GriefPrevention additions (#382) * Add new towny features, fix some existing issues * Replace towny claimed_cuboid with cuboids * Add GP claim events, fix issues from PR review * Register new gpclaim events * Modernize gp claim tag * Modernize towny world properties --- lib | 2 +- pom.xml | 2 +- .../bukkit/bridges/GriefPreventionBridge.java | 11 +- .../depenizen/bukkit/bridges/TownyBridge.java | 9 +- .../GPClaimChangedScriptEvent.java | 87 ++++++++++ .../GPClaimCreatedScriptEvent.java | 73 +++++++++ .../GPClaimDeletedScriptEvent.java | 53 +++++++ .../towny/PlayerClaimsPlotScriptEvent.java | 103 ++++++++++++ .../towny/PlayerCreatesTownScriptEvent.java | 97 ++++++++++++ .../events/towny/TownCreatedScriptEvent.java | 53 +++++++ .../GriefPreventionClaimTag.java | 149 +++++++++++------- .../bukkit/objects/towny/TownTag.java | 36 ++++- .../GriefPreventionWorldProperties.java | 69 ++++++++ .../towny/TownyWorldProperties.java | 62 ++++++++ 14 files changed, 736 insertions(+), 70 deletions(-) create mode 100644 src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimChangedScriptEvent.java create mode 100644 src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimCreatedScriptEvent.java create mode 100644 src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimDeletedScriptEvent.java create mode 100644 src/main/java/com/denizenscript/depenizen/bukkit/events/towny/PlayerClaimsPlotScriptEvent.java create mode 100644 src/main/java/com/denizenscript/depenizen/bukkit/events/towny/PlayerCreatesTownScriptEvent.java create mode 100644 src/main/java/com/denizenscript/depenizen/bukkit/events/towny/TownCreatedScriptEvent.java create mode 100644 src/main/java/com/denizenscript/depenizen/bukkit/properties/griefprevention/GriefPreventionWorldProperties.java create mode 100644 src/main/java/com/denizenscript/depenizen/bukkit/properties/towny/TownyWorldProperties.java diff --git a/lib b/lib index 7e918d50a..1d861c057 160000 --- a/lib +++ b/lib @@ -1 +1 @@ -Subproject commit 7e918d50a96e331d3d887006be2794af010ed92c +Subproject commit 1d861c0578a875a352d18507fd79e91c93a453fe diff --git a/pom.xml b/pom.xml index f653ae7c5..6285c3350 100644 --- a/pom.xml +++ b/pom.xml @@ -146,7 +146,7 @@ me.ryanhamshire GriefPrevention - 16.10 + 16.18 system ${basedir}/lib/GriefPrevention.jar diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bridges/GriefPreventionBridge.java b/src/main/java/com/denizenscript/depenizen/bukkit/bridges/GriefPreventionBridge.java index 04e2386d8..21c5dbb06 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bridges/GriefPreventionBridge.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bridges/GriefPreventionBridge.java @@ -1,11 +1,15 @@ package com.denizenscript.depenizen.bukkit.bridges; +import com.denizenscript.denizen.objects.WorldTag; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.tags.Attribute; import com.denizenscript.denizencore.tags.ReplaceableTagEvent; import com.denizenscript.denizencore.tags.TagManager; import com.denizenscript.denizencore.tags.TagRunnable; import com.denizenscript.depenizen.bukkit.Bridge; +import com.denizenscript.depenizen.bukkit.events.griefprevention.GPClaimChangedScriptEvent; +import com.denizenscript.depenizen.bukkit.events.griefprevention.GPClaimCreatedScriptEvent; +import com.denizenscript.depenizen.bukkit.events.griefprevention.GPClaimDeletedScriptEvent; import com.denizenscript.depenizen.bukkit.properties.griefprevention.GriefPreventionPlayerProperties; import com.denizenscript.depenizen.bukkit.objects.griefprevention.GriefPreventionClaimTag; import com.denizenscript.denizen.objects.LocationTag; @@ -15,6 +19,7 @@ import com.denizenscript.denizencore.events.ScriptEvent; import com.denizenscript.denizencore.objects.ObjectFetcher; import com.denizenscript.denizencore.objects.properties.PropertyParser; +import com.denizenscript.depenizen.bukkit.properties.griefprevention.GriefPreventionWorldProperties; import me.ryanhamshire.GriefPrevention.Claim; import me.ryanhamshire.GriefPrevention.GriefPrevention; @@ -22,9 +27,13 @@ public class GriefPreventionBridge extends Bridge { @Override public void init() { - ObjectFetcher.registerWithObjectFetcher(GriefPreventionClaimTag.class); + ObjectFetcher.registerWithObjectFetcher(GriefPreventionClaimTag.class, GriefPreventionClaimTag.tagProcessor); PropertyParser.registerProperty(GriefPreventionPlayerProperties.class, PlayerTag.class); PropertyParser.registerProperty(GriefPreventionLocationProperties.class, LocationTag.class); + PropertyParser.registerProperty(GriefPreventionWorldProperties.class, WorldTag.class); + ScriptEvent.registerScriptEvent(GPClaimChangedScriptEvent.class); + ScriptEvent.registerScriptEvent(GPClaimCreatedScriptEvent.class); + ScriptEvent.registerScriptEvent(GPClaimDeletedScriptEvent.class); ScriptEvent.registerScriptEvent(GPClaimEnterEvent.class); TagManager.registerTagHandler(new TagRunnable.RootForm() { @Override diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bridges/TownyBridge.java b/src/main/java/com/denizenscript/depenizen/bukkit/bridges/TownyBridge.java index fb8b13622..7e40b167a 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bridges/TownyBridge.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bridges/TownyBridge.java @@ -1,13 +1,14 @@ package com.denizenscript.depenizen.bukkit.bridges; -import com.denizenscript.depenizen.bukkit.events.towny.PlayerEntersTownScriptEvent; -import com.denizenscript.depenizen.bukkit.events.towny.PlayerExitsTownScriptEvent; +import com.denizenscript.denizen.objects.WorldTag; +import com.denizenscript.depenizen.bukkit.events.towny.*; import com.denizenscript.depenizen.bukkit.properties.towny.TownyCuboidProperties; import com.denizenscript.depenizen.bukkit.properties.towny.TownyLocationProperties; import com.denizenscript.depenizen.bukkit.objects.towny.NationTag; import com.denizenscript.depenizen.bukkit.objects.towny.TownTag; import com.denizenscript.depenizen.bukkit.Bridge; import com.denizenscript.depenizen.bukkit.properties.towny.TownyPlayerProperties; +import com.denizenscript.depenizen.bukkit.properties.towny.TownyWorldProperties; import com.palmergames.bukkit.towny.TownyAPI; import com.palmergames.bukkit.towny.object.Nation; import com.palmergames.bukkit.towny.object.Town; @@ -34,8 +35,12 @@ public void init() { PropertyParser.registerProperty(TownyPlayerProperties.class, PlayerTag.class); PropertyParser.registerProperty(TownyLocationProperties.class, LocationTag.class); PropertyParser.registerProperty(TownyCuboidProperties.class, CuboidTag.class); + PropertyParser.registerProperty(TownyWorldProperties.class, WorldTag.class); + ScriptEvent.registerScriptEvent(PlayerClaimsPlotScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerCreatesTownScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerEntersTownScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerExitsTownScriptEvent.class); + ScriptEvent.registerScriptEvent(TownCreatedScriptEvent.class); TagManager.registerTagHandler(new TagRunnable.RootForm() { @Override public void run(ReplaceableTagEvent event) { diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimChangedScriptEvent.java b/src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimChangedScriptEvent.java new file mode 100644 index 000000000..792bccaa9 --- /dev/null +++ b/src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimChangedScriptEvent.java @@ -0,0 +1,87 @@ +package com.denizenscript.depenizen.bukkit.events.griefprevention; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import com.denizenscript.depenizen.bukkit.objects.griefprevention.GriefPreventionClaimTag; +import me.ryanhamshire.GriefPrevention.events.ClaimChangeEvent; +import me.ryanhamshire.GriefPrevention.events.ClaimExtendEvent; +import me.ryanhamshire.GriefPrevention.events.ClaimResizeEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class GPClaimChangedScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // gp claim changed + // + // @Cancellable true + // + // @Triggers when a Grief Prevention claim is modified. + // + // @Context + // returns the GriefPreventionClaimTag of the old claim. + // returns the GriefPreventionClaimTag of the new claim. + // returns the source of the change. Can be: PLAYER, SERVER, or AUTO_DEEPEN. + // + // @Plugin Depenizen, GriefPrevention + // + // @Player when source_type is player. + // + // @Group Depenizen + // + // --> + + public GPClaimChangedScriptEvent() { + instance = this; + registerCouldMatcher("gp claim changed"); + } + + public static GPClaimChangedScriptEvent instance; + public ClaimChangeEvent event; + public Player player; + public String sourceType; + + @Override + public String getName() { + return "GPClaimChanged"; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(player != null ? PlayerTag.mirrorBukkitPlayer(player) : null, null); + } + + @Override + public ObjectTag getContext(String name) { + switch (name) { + case "old_claim": + return new GriefPreventionClaimTag(event.getFrom()); + case "new_claim": + return new GriefPreventionClaimTag(event.getTo()); + case "source_type": + return new ElementTag(sourceType); + } + return super.getContext(name); + } + + @EventHandler + public void onClaimChanged(ClaimChangeEvent event) { + this.event = event; + this.player = null; + this.sourceType = "server"; + if (event instanceof ClaimExtendEvent) { + this.sourceType = "auto_deepen"; + } + else if (event instanceof ClaimResizeEvent && ((ClaimResizeEvent) event).getModifier() instanceof Player) { + this.player = (Player) ((ClaimResizeEvent) event).getModifier(); + this.sourceType = "player"; + } + fire(event); + } +} diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimCreatedScriptEvent.java b/src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimCreatedScriptEvent.java new file mode 100644 index 000000000..1d34bc87e --- /dev/null +++ b/src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimCreatedScriptEvent.java @@ -0,0 +1,73 @@ +package com.denizenscript.depenizen.bukkit.events.griefprevention; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import com.denizenscript.depenizen.bukkit.objects.griefprevention.GriefPreventionClaimTag; +import me.ryanhamshire.GriefPrevention.events.ClaimCreatedEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class GPClaimCreatedScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // gp claim created + // + // @Cancellable true + // + // @Triggers when a Grief Prevention claim is created. + // + // @Context + // returns the GriefPreventionClaimTag that is being created. + // returns the source of the creation. Can be PLAYER or SERVER. + // + // @Plugin Depenizen, GriefPrevention + // + // @Player when source_type is player. + // + // @Group Depenizen + // + // --> + + public GPClaimCreatedScriptEvent() { + instance = this; + registerCouldMatcher("gp claim created"); + } + + public static GPClaimCreatedScriptEvent instance; + public ClaimCreatedEvent event; + public String sourceType; + + @Override + public String getName() { + return "GPClaimCreated"; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getCreator() instanceof Player ? PlayerTag.mirrorBukkitPlayer((Player) event.getCreator()) : null, null); + } + + @Override + public ObjectTag getContext(String name) { + switch (name) { + case "claim": + return new GriefPreventionClaimTag(event.getClaim()); + case "source_type": + return new ElementTag(sourceType); + } + return super.getContext(name); + } + + @EventHandler + public void onClaimCreated(ClaimCreatedEvent event) { + this.event = event; + this.sourceType = event.getCreator() instanceof Player ? "player" : "server"; + fire(event); + } +} diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimDeletedScriptEvent.java b/src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimDeletedScriptEvent.java new file mode 100644 index 000000000..6be1b2b38 --- /dev/null +++ b/src/main/java/com/denizenscript/depenizen/bukkit/events/griefprevention/GPClaimDeletedScriptEvent.java @@ -0,0 +1,53 @@ +package com.denizenscript.depenizen.bukkit.events.griefprevention; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.depenizen.bukkit.objects.griefprevention.GriefPreventionClaimTag; +import me.ryanhamshire.GriefPrevention.events.ClaimDeletedEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class GPClaimDeletedScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // gp claim deleted + // + // @Triggers when a Grief Prevention claim is deleted. + // + // @Context + // returns the GriefPreventionClaimTag being deleted. + // + // @Plugin Depenizen, GriefPrevention + // + // @Group Depenizen + // + // --> + + public GPClaimDeletedScriptEvent() { + instance = this; + registerCouldMatcher("gp claim deleted"); + } + + public static GPClaimDeletedScriptEvent instance; + public ClaimDeletedEvent event; + + @Override + public String getName() { + return "GPClaimDeleted"; + } + + @Override + public ObjectTag getContext(String name) { + if (name.equals("claim")) { + return new GriefPreventionClaimTag(event.getClaim()); + } + return super.getContext(name); + } + + @EventHandler + public void onClaimDeleted(ClaimDeletedEvent event) { + this.event = event; + fire(event); + } +} diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/events/towny/PlayerClaimsPlotScriptEvent.java b/src/main/java/com/denizenscript/depenizen/bukkit/events/towny/PlayerClaimsPlotScriptEvent.java new file mode 100644 index 000000000..f1a2e5f5d --- /dev/null +++ b/src/main/java/com/denizenscript/depenizen/bukkit/events/towny/PlayerClaimsPlotScriptEvent.java @@ -0,0 +1,103 @@ +package com.denizenscript.depenizen.bukkit.events.towny; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.CuboidTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.depenizen.bukkit.objects.towny.TownTag; +import com.palmergames.bukkit.towny.event.TownPreClaimEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PlayerClaimsPlotScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // towny player claims plot + // + // @Location true + // + // @Cancellable true + // + // @Triggers when a player tries to claim a new Towny plot or outpost. + // + // @Context + // Returns whether the new plot is an outpost (not connected to the main town). + // Returns whether this is a new town. New towns may not have certain tags available. + // Returns a TownTag of the town. + // Returns the cuboid that will be claimed by the town. + // + // @Determine + // "CANCEL_MESSAGE:" + ElementTag to set the message Towny sends when cancelled. + // + // @Plugin Depenizen, Towny + // + // @Player Always. + // + // @Group Depenizen + // + // --> + + public PlayerClaimsPlotScriptEvent() { + instance = this; + registerCouldMatcher("towny player claims plot"); + } + + public static PlayerClaimsPlotScriptEvent instance; + public TownPreClaimEvent event; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, event.getPlayer().getLocation())) { + return false; + } + return super.matches(path); + } + + @Override + public String getName() { + return "TownyPlayerClaimsPlot"; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getPlayer()); + } + + @Override + public ObjectTag getContext(String name) { + switch (name) { + case "is_outpost": + return new ElementTag(event.isOutpost()); + case "is_new_town": + return new ElementTag(event.isHomeBlock()); + case "town": + return new TownTag(event.getTown()); + case "cuboid": + return TownTag.getCuboid(event.getPlayer().getWorld(), event.getTownBlock().getX(), event.getTownBlock().getZ()); + } + return super.getContext(name); + } + + @Override + public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { + if (determinationObj instanceof ElementTag) { + String determination = determinationObj.toString(); + String lower = CoreUtilities.toLowerCase(determination); + if (lower.startsWith("cancel_message:")) { + event.setCancelMessage(determination.substring("cancel_message:".length())); + return true; + } + } + return super.applyDetermination(path, determinationObj); + } + + @EventHandler + public void onTownyPlayerClaimsPlot(TownPreClaimEvent event) { + this.event = event; + fire(event); + } +} diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/events/towny/PlayerCreatesTownScriptEvent.java b/src/main/java/com/denizenscript/depenizen/bukkit/events/towny/PlayerCreatesTownScriptEvent.java new file mode 100644 index 000000000..2dd2b14cd --- /dev/null +++ b/src/main/java/com/denizenscript/depenizen/bukkit/events/towny/PlayerCreatesTownScriptEvent.java @@ -0,0 +1,97 @@ +package com.denizenscript.depenizen.bukkit.events.towny; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.CuboidTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.depenizen.bukkit.objects.towny.TownTag; +import com.palmergames.bukkit.towny.event.PreNewTownEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PlayerCreatesTownScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // towny player creates town + // + // @Location true + // + // @Cancellable true + // + // @Triggers when a player tries to create a Towny town. + // + // @Context + // Returns the name of the town the player is creating. + // Returns the cuboid that will be claimed by the town. + // + // @Determine + // "CANCEL_MESSAGE:" + ElementTag to set the message Towny sends when cancelled. + // + // @Plugin Depenizen, Towny + // + // @Player Always. + // + // @Group Depenizen + // + // --> + + public PlayerCreatesTownScriptEvent() { + instance = this; + registerCouldMatcher("towny player creates town"); + } + + public static PlayerCreatesTownScriptEvent instance; + public PreNewTownEvent event; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, event.getPlayer().getLocation())) { + return false; + } + return super.matches(path); + } + + @Override + public String getName() { + return "TownyPlayerCreatesTown"; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getPlayer()); + } + + @Override + public ObjectTag getContext(String name) { + switch (name) { + case "town_name": + return new ElementTag(event.getTownName()); + case "cuboid": + return TownTag.getCuboid(event.getTownLocation().getWorld(), event.getTownWorldCoord().getX(), event.getTownWorldCoord().getZ()); + } + return super.getContext(name); + } + + @Override + public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { + if (determinationObj instanceof ElementTag) { + String determination = determinationObj.toString(); + String lower = CoreUtilities.toLowerCase(determination); + if (lower.startsWith("cancel_message:")) { + event.setCancelMessage(determination.substring("cancel_message:".length())); + return true; + } + } + return super.applyDetermination(path, determinationObj); + } + + @EventHandler + public void onTownyPlayerCreatesTown(PreNewTownEvent event) { + this.event = event; + fire(event); + } +} diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/events/towny/TownCreatedScriptEvent.java b/src/main/java/com/denizenscript/depenizen/bukkit/events/towny/TownCreatedScriptEvent.java new file mode 100644 index 000000000..49343a329 --- /dev/null +++ b/src/main/java/com/denizenscript/depenizen/bukkit/events/towny/TownCreatedScriptEvent.java @@ -0,0 +1,53 @@ +package com.denizenscript.depenizen.bukkit.events.towny; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.depenizen.bukkit.objects.towny.TownTag; +import com.palmergames.bukkit.towny.event.NewTownEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class TownCreatedScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // towny town created + // + // @Triggers after all checks are complete and a Towny town is fully created. + // + // @Context + // Returns the town that was created. + // + // @Plugin Depenizen, Towny + // + // @Group Depenizen + // + // --> + + public TownCreatedScriptEvent() { + instance = this; + registerCouldMatcher("towny town created"); + } + + public static TownCreatedScriptEvent instance; + public NewTownEvent event; + + @Override + public String getName() { + return "TownyTownCreated"; + } + + @Override + public ObjectTag getContext(String name) { + if (name.equals("town")) { + return new TownTag(event.getTown()); + } + return super.getContext(name); + } + + @EventHandler + public void onTownyTownCreated(NewTownEvent event) { + this.event = event; + fire(event); + } +} diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/objects/griefprevention/GriefPreventionClaimTag.java b/src/main/java/com/denizenscript/depenizen/bukkit/objects/griefprevention/GriefPreventionClaimTag.java index 9a750af39..917a42f5f 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/objects/griefprevention/GriefPreventionClaimTag.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/objects/griefprevention/GriefPreventionClaimTag.java @@ -1,15 +1,17 @@ package com.denizenscript.depenizen.bukkit.objects.griefprevention; +import com.denizenscript.denizen.objects.*; +import com.denizenscript.denizencore.DenizenCore; +import com.denizenscript.denizencore.flags.AbstractFlagTracker; +import com.denizenscript.denizencore.flags.FlaggableObject; +import com.denizenscript.denizencore.flags.RedirectionFlagTracker; import com.denizenscript.denizencore.objects.*; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; +import com.denizenscript.denizencore.tags.ObjectTagProcessor; import me.ryanhamshire.GriefPrevention.Claim; import me.ryanhamshire.GriefPrevention.DataStore; import me.ryanhamshire.GriefPrevention.GriefPrevention; -import com.denizenscript.denizen.objects.ChunkTag; -import com.denizenscript.denizen.objects.CuboidTag; -import com.denizenscript.denizen.objects.LocationTag; -import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.properties.PropertyParser; import com.denizenscript.denizencore.tags.Attribute; @@ -20,12 +22,13 @@ import java.util.ArrayList; import java.util.UUID; -public class GriefPreventionClaimTag implements ObjectTag, Adjustable { +public class GriefPreventionClaimTag implements ObjectTag, Adjustable, FlaggableObject { // <--[ObjectType] // @name GriefPreventionClaimTag // @prefix gpclaim // @base ElementTag + // @implements FlaggableObject // @format // The identity format for claims is // For example, 'gpclaim@1234'. @@ -34,6 +37,9 @@ public class GriefPreventionClaimTag implements ObjectTag, Adjustable { // @description // A GriefPreventionClaimTag represents a GriefPrevention claim. // + // This object type is flaggable. + // Flags on this object type will be stored in the server saves file, under special sub-key "__depenizen_gp_claims_id" + // // --> static DataStore dataStore = GriefPrevention.instance.dataStore; @@ -101,6 +107,16 @@ public String toString() { return identify(); } + @Override + public AbstractFlagTracker getFlagTracker() { + return new RedirectionFlagTracker(DenizenCore.serverFlagMap, "__depenizen_gp_claims_id." + claim.getID()); + } + + @Override + public void reapplyTracker(AbstractFlagTracker tracker) { + // Nothing to do. + } + public String simple() { return String.valueOf(claim.getID()); } @@ -110,11 +126,16 @@ public String identifySimple() { return identify(); } + public static ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); + @Override public ObjectTag getObjectAttribute(Attribute attribute) { - if (attribute == null) { - return null; - } + return tagProcessor.getObjectAttribute(this, attribute); + } + + public static void registerTags() { + + AbstractFlagTracker.registerFlagHandlers(tagProcessor); // <--[tag] // @attribute @@ -123,9 +144,9 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // @description // Returns the GriefPreventionClaim's ID. // --> - if (attribute.startsWith("id")) { - return new ElementTag(claim.getID()).getObjectAttribute(attribute.fulfill(1)); - } + tagProcessor.registerTag(ElementTag.class, "id", (attribute, object) -> { + return new ElementTag(object.claim.getID()); + }); // <--[tag] // @attribute @@ -134,13 +155,13 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // @description // Returns the GriefPreventionClaim's managers. // --> - if (attribute.startsWith("managers")) { + tagProcessor.registerTag(ListTag.class, "managers", (attribute, object) -> { ListTag managers = new ListTag(); - for (String manager : claim.managers) { + for (String manager : object.claim.managers) { managers.addObject(new PlayerTag(UUID.fromString(manager))); } - return managers.getObjectAttribute(attribute.fulfill(1)); - } + return managers; + }); // <--[tag] // @attribute @@ -149,15 +170,15 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // @description // Returns the GriefPreventionClaim's trusted. // --> - if (attribute.startsWith("trusted")) { + tagProcessor.registerTag(ListTag.class, "trusted", (attribute, object) -> { ListTag trusted = new ListTag(); ArrayList b = new ArrayList<>(); - claim.getPermissions(b, new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + object.claim.getPermissions(b, new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); for (String trust : b) { trusted.addObject(new PlayerTag(UUID.fromString(trust))); } - return trusted.getObjectAttribute(attribute.fulfill(1)); - } + return trusted; + }); // <--[tag] // @attribute @@ -166,15 +187,15 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // @description // Returns the GriefPreventionClaim's builders. // --> - if (attribute.startsWith("builders")) { + tagProcessor.registerTag(ListTag.class, "builders", (attribute, object) -> { ListTag trusted = new ListTag(); ArrayList b = new ArrayList<>(); - claim.getPermissions(b, new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + object.claim.getPermissions(b, new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); for (String trust : b) { trusted.addObject(new PlayerTag(UUID.fromString(trust))); } - return trusted.getObjectAttribute(attribute.fulfill(1)); - } + return trusted; + }); // <--[tag] // @attribute @@ -183,15 +204,15 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // @description // Returns the GriefPreventionClaim's containers. // --> - if (attribute.startsWith("containers")) { + tagProcessor.registerTag(ListTag.class, "containers", (attribute, object) -> { ListTag trusted = new ListTag(); ArrayList c = new ArrayList<>(); - claim.getPermissions(new ArrayList<>(), c, new ArrayList<>(), new ArrayList<>()); + object.claim.getPermissions(new ArrayList<>(), c, new ArrayList<>(), new ArrayList<>()); for (String container : c) { trusted.addObject(new PlayerTag(UUID.fromString(container))); } - return trusted.getObjectAttribute(attribute.fulfill(1)); - } + return trusted; + }); // <--[tag] // @attribute @@ -200,15 +221,15 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // @description // Returns the GriefPreventionClaim's accessors. // --> - if (attribute.startsWith("accessors")) { + tagProcessor.registerTag(ListTag.class, "accessors", (attribute, object) -> { ListTag trusted = new ListTag(); ArrayList a = new ArrayList<>(); - claim.getPermissions(new ArrayList<>(), new ArrayList<>(), a, new ArrayList<>()); + object.claim.getPermissions(new ArrayList<>(), new ArrayList<>(), a, new ArrayList<>()); for (String access : a) { trusted.addObject(new PlayerTag(UUID.fromString(access))); } - return trusted.getObjectAttribute(attribute.fulfill(1)); - } + return trusted; + }); // <--[tag] // @attribute @@ -219,13 +240,12 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // Returns the GriefPreventionClaim's owner. // Can be "Admin" or a PlayerTag. // --> - else if (attribute.startsWith("owner")) { - if (claim.isAdminClaim()) { - return new ElementTag("Admin").getObjectAttribute(attribute.fulfill(1)); + tagProcessor.registerTag(ObjectTag.class, "owner", (attribute, object) -> { + if (object.claim.isAdminClaim()) { + return new ElementTag("Admin"); } - return new PlayerTag(claim.ownerID) - .getObjectAttribute(attribute.fulfill(1)); - } + return new PlayerTag(object.claim.ownerID); + }); // <--[tag] // @attribute @@ -234,13 +254,23 @@ else if (attribute.startsWith("owner")) { // @description // Returns the GriefPreventionClaim's cuboid area. // --> - else if (attribute.startsWith("cuboid")) { - LocationTag lower = new LocationTag(claim.getLesserBoundaryCorner()); - lower.setY(0); - LocationTag upper = new LocationTag(claim.getGreaterBoundaryCorner()); - upper.setY(255); - return new CuboidTag(lower, upper).getObjectAttribute(attribute.fulfill(1)); - } + tagProcessor.registerTag(CuboidTag.class, "cuboid", (attribute, object) -> { + LocationTag lower = new LocationTag(object.claim.getLesserBoundaryCorner()); + LocationTag upper = new LocationTag(object.claim.getGreaterBoundaryCorner()); + upper.setY(upper.getWorld().getMaxHeight()); + return new CuboidTag(lower, upper); + }); + + // <--[tag] + // @attribute + // @returns WorldTag + // @Plugin Depenizen, GriefPrevention + // @description + // Returns the world this GriefPreventionClaim is in. + // --> + tagProcessor.registerTag(WorldTag.class, "world", (attribute, object) -> { + return new WorldTag(object.claim.getLesserBoundaryCorner().getWorld()); + }); // <--[tag] // @attribute @@ -249,9 +279,9 @@ else if (attribute.startsWith("cuboid")) { // @description // Returns whether GriefPreventionClaim is an Admin Claim. // --> - else if (attribute.startsWith("is_adminclaim") || attribute.startsWith("is_admin_claim")) { - return new ElementTag(claim.isAdminClaim()).getObjectAttribute(attribute.fulfill(1)); - } + tagProcessor.registerTag(ElementTag.class, "is_adminclaim", (attribute, object) -> { + return new ElementTag(object.claim.isAdminClaim()); + }); // <--[tag] // @attribute @@ -260,13 +290,13 @@ else if (attribute.startsWith("is_adminclaim") || attribute.startsWith("is_admin // @description // Returns a list of all chunks in the GriefPreventionClaim. // --> - else if (attribute.startsWith("chunks")) { + tagProcessor.registerTag(ListTag.class, "chunks", (attribute, object) -> { ListTag chunks = new ListTag(); - for (Chunk chunk : claim.getChunks()) { + for (Chunk chunk : object.claim.getChunks()) { chunks.addObject(new ChunkTag(chunk)); } - return chunks.getObjectAttribute(attribute.fulfill(1)); - } + return chunks; + }); // <--[tag] // @attribute ]> @@ -275,13 +305,16 @@ else if (attribute.startsWith("chunks")) { // @description // Returns whether the GriefPreventionClaim can siege the player. // --> - else if (attribute.startsWith("can_siege") && attribute.hasParam()) { + tagProcessor.registerTag(ElementTag.class, "can_siege", (attribute, object) -> { + if (!attribute.hasParam()) { + return null; + } PlayerTag defender = attribute.paramAsType(PlayerTag.class); if (defender == null || defender.getPlayerEntity() == null) { return null; } - return new ElementTag(claim.canSiege(defender.getPlayerEntity())).getObjectAttribute(attribute.fulfill(1)); - } + return new ElementTag(object.claim.canSiege(defender.getPlayerEntity())); + }); // <--[tag] // @attribute @@ -290,11 +323,9 @@ else if (attribute.startsWith("can_siege") && attribute.hasParam()) { // @description // Returns whether the GriefPreventionClaim is currently under siege. // --> - else if (attribute.startsWith("is_sieged")) { - return new ElementTag(claim.siegeData != null).getObjectAttribute(attribute.fulfill(1)); - } - - return new ElementTag(identify()).getObjectAttribute(attribute); + tagProcessor.registerTag(ElementTag.class, "is_sieged", (attribute, object) -> { + return new ElementTag(object.claim.siegeData != null); + }); } @Override diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/objects/towny/TownTag.java b/src/main/java/com/denizenscript/depenizen/bukkit/objects/towny/TownTag.java index d4e5d36c1..b4a038f3e 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/objects/towny/TownTag.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/objects/towny/TownTag.java @@ -1,7 +1,6 @@ package com.denizenscript.depenizen.bukkit.objects.towny; -import com.denizenscript.denizen.objects.ChunkTag; -import com.denizenscript.denizen.objects.WorldTag; +import com.denizenscript.denizen.objects.*; import com.denizenscript.denizencore.DenizenCore; import com.denizenscript.denizencore.flags.AbstractFlagTracker; import com.denizenscript.denizencore.flags.FlaggableObject; @@ -12,8 +11,6 @@ import com.palmergames.bukkit.towny.exceptions.TownyException; import com.palmergames.bukkit.towny.object.*; import com.palmergames.bukkit.towny.TownyUniverse; -import com.denizenscript.denizen.objects.LocationTag; -import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.tags.Attribute; @@ -21,6 +18,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.OfflinePlayer; +import org.bukkit.World; import java.util.UUID; @@ -108,6 +106,14 @@ public static TownTag fromWorldCoord(WorldCoord coord) { } } + public static CuboidTag getCuboid(World world, int townCoordX, int townCoordZ) { + int x = townCoordX * Coord.getCellSize(); + int z = townCoordZ * Coord.getCellSize(); + return new CuboidTag( + new LocationTag(world, x, world.getMinHeight(), z), + new LocationTag(world, x + Coord.getCellSize() - 1, world.getMaxHeight(), z + Coord.getCellSize() - 1)); + } + ///////////////////// // ObjectTag Methods ///////////////// @@ -463,10 +469,12 @@ public static void registerTags() { // <--[tag] // @attribute - // @returns ListTag(LocationTag) + // @returns ListTag(ChunkTag) // @plugin Depenizen, Towny // @description - // Returns a list of the names of town plots. + // Returns a list of chunks the town has claimed. + // Note that this will not be accurate if the plot size has been changed in your Towny config. + // Generally, use <@link tag TownTag.cuboids> instead. // --> tagProcessor.registerTag(ListTag.class, "plots", (attribute, object) -> { ListTag output = new ListTag(); @@ -476,6 +484,22 @@ public static void registerTags() { return output; }); + // <--[tag] + // @attribute + // @returns ListTag(CuboidTag) + // @plugin Depenizen, Towny + // @description + // Returns a list of plot cuboids claimed by the town. + // Note that the cuboids may be in separate worlds if the town has outposts. + // --> + tagProcessor.registerTag(ListTag.class, "cuboids", (attribute, object) -> { + ListTag output = new ListTag(); + for (TownBlock block : object.town.getTownBlocks()) { + output.addObject(getCuboid(object.town.getWorld(), block.getX(), block.getZ())); + } + return output; + }); + // <--[tag] // @attribute // @returns ElementTag(Decimal) diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/properties/griefprevention/GriefPreventionWorldProperties.java b/src/main/java/com/denizenscript/depenizen/bukkit/properties/griefprevention/GriefPreventionWorldProperties.java new file mode 100644 index 000000000..7bc217eb2 --- /dev/null +++ b/src/main/java/com/denizenscript/depenizen/bukkit/properties/griefprevention/GriefPreventionWorldProperties.java @@ -0,0 +1,69 @@ +package com.denizenscript.depenizen.bukkit.properties.griefprevention; + +import com.denizenscript.denizen.objects.WorldTag; +import com.denizenscript.denizencore.objects.core.ListTag; +import com.denizenscript.denizencore.objects.properties.Property; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.properties.PropertyParser; +import com.denizenscript.depenizen.bukkit.objects.griefprevention.GriefPreventionClaimTag; +import me.ryanhamshire.GriefPrevention.Claim; +import me.ryanhamshire.GriefPrevention.GriefPrevention; +import com.denizenscript.denizencore.objects.ObjectTag; + +public class GriefPreventionWorldProperties implements Property { + + @Override + public String getPropertyString() { + return null; + } + + @Override + public String getPropertyId() { + return "GriefPreventionWorld"; + } + + public static boolean describes(ObjectTag object) { + return object instanceof WorldTag; + } + + public static GriefPreventionWorldProperties getFrom(ObjectTag object) { + if (!describes(object)) { + return null; + } + else { + return new GriefPreventionWorldProperties((WorldTag) object); + } + } + + public static final String[] handledMechs = new String[] { + }; // None + + private GriefPreventionWorldProperties(WorldTag world) { + this.world = world; + } + + WorldTag world; + + public static void registerTags() { + // <--[tag] + // @attribute + // @returns ListTag(GriefPreventionClaimTag) + // @plugin Depenizen, GriefPrevention + // @description + // Returns a list of GriefPreventionClaim in this world. + // --> + PropertyParser.registerTag(ListTag.class, "griefprevention_claims", (attribute, property) -> { + ListTag result = new ListTag(); + for (Claim claim : GriefPrevention.instance.dataStore.getClaims()) { + if (property.world.getWorld().equals(claim.getLesserBoundaryCorner().getWorld())) { + result.addObject(new GriefPreventionClaimTag(claim)); + } + } + return result; + }); + } + + @Override + public void adjust(Mechanism mechanism) { + } +} diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/properties/towny/TownyWorldProperties.java b/src/main/java/com/denizenscript/depenizen/bukkit/properties/towny/TownyWorldProperties.java new file mode 100644 index 000000000..6ffd91fac --- /dev/null +++ b/src/main/java/com/denizenscript/depenizen/bukkit/properties/towny/TownyWorldProperties.java @@ -0,0 +1,62 @@ +package com.denizenscript.depenizen.bukkit.properties.towny; + +import com.denizenscript.denizen.objects.WorldTag; +import com.denizenscript.denizencore.objects.properties.Property; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.properties.PropertyParser; +import com.palmergames.bukkit.towny.TownyAPI; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.ObjectTag; + +public class TownyWorldProperties implements Property { + + @Override + public String getPropertyString() { + return null; + } + + @Override + public String getPropertyId() { + return "TownyWorld"; + } + + @Override + public void adjust(Mechanism mechanism) { + } + + public static boolean describes(ObjectTag object) { + return object instanceof WorldTag; + } + + public static TownyWorldProperties getFrom(ObjectTag object) { + if (!describes(object)) { + return null; + } + else { + return new TownyWorldProperties((WorldTag) object); + } + } + + public static final String[] handledMechs = new String[] { + }; // None + + private TownyWorldProperties(WorldTag world) { + this.world = world; + } + + public WorldTag world; + + public static void registerTags() { + + // <--[tag] + // @attribute + // @returns ElementTag(Boolean) + // @plugin Depenizen, Towny + // @description + // Returns whether this world has Towny enabled. + // --> + PropertyParser.registerTag(ElementTag.class, "towny_enabled", (attribute, property) -> { + return new ElementTag(TownyAPI.getInstance().isTownyWorld(property.world.getWorld())); + }); + } +}