diff --git a/pom.xml b/pom.xml
index 6e46c24..5ee89db 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,10 @@
Altitude Maven Repo
https://repo.destro.xyz/snapshots
+
+ jitpack.io
+ https://jitpack.io
+
@@ -202,6 +206,12 @@
mypet
3.11-SNAPSHOT
+
+
+ com.github.NeumimTo
+ Pl3xMap
+ 1.18-2
+
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java b/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java
index b099311..79ade15 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java
@@ -24,6 +24,7 @@ import me.ryanhamshire.GriefPrevention.events.PreventBlockBreakEvent;
import me.ryanhamshire.GriefPrevention.events.SaveTrappedPlayerEvent;
import me.ryanhamshire.GriefPrevention.events.TrustChangedEvent;
import me.ryanhamshire.GriefPrevention.alttd.listeners.AltitudeListener;
+import me.ryanhamshire.GriefPrevention.alttd.hook.Pl3xMapHook;
import me.ryanhamshire.GriefPrevention.metrics.MetricsHandler;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder;
@@ -243,6 +244,7 @@ public class GriefPrevention extends JavaPlugin
private String databaseUserName;
private String databasePassword;
+ private Pl3xMapHook pl3xmapHook;
//how far away to search from a tree trunk for its branch blocks
public static final int TREE_RADIUS = 5;
@@ -398,6 +400,9 @@ public class GriefPrevention extends JavaPlugin
}
new AltitudeListener(this.dataStore, this);
+ if (getServer().getPluginManager().isPluginEnabled("Pl3xMap")) {
+ pl3xmapHook = new Pl3xMapHook(this);
+ }
AddLogEntry("Boot finished.");
try
@@ -3328,6 +3333,10 @@ public class GriefPrevention extends JavaPlugin
//dump any remaining unwritten log entries
this.customLogger.WriteEntries();
+ if (pl3xmapHook != null) {
+ pl3xmapHook.disable();
+ }
+
AddLogEntry("GriefPrevention disabled.");
}
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/alttd/config/AlttdConfig.java b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/config/AlttdConfig.java
index ddbd2dc..250d62a 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/alttd/config/AlttdConfig.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/config/AlttdConfig.java
@@ -5,6 +5,7 @@ import me.ryanhamshire.GriefPrevention.GriefPrevention;
import me.ryanhamshire.GriefPrevention.alttd.util.Logger;
import org.spongepowered.configurate.ConfigurationNode;
+import java.awt.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@@ -44,6 +45,24 @@ public class AlttdConfig extends AbstractConfiguration
return map;
}
+ Color getColor(String path, Color def) {
+ config.set(path, colorToHex(def));
+ return hexToColor(config.getString(path, colorToHex(def)));
+ }
+
+ String colorToHex(final Color color) {
+ return Integer.toHexString(color.getRGB() & 0x00FFFFFF);
+ }
+
+ Color hexToColor(final String hex) {
+ if (hex == null) {
+ return Color.RED;
+ }
+ String stripped = hex.replace("#", "");
+ int rgb = (int) Long.parseLong(stripped, 16);
+ return new Color(rgb);
+ }
+
public static boolean DEBUG_MODE = false;
public static boolean alternativeClaimExpiring = false;
public static int alternativeClaimExpireDays = 1;
@@ -71,4 +90,79 @@ public class AlttdConfig extends AbstractConfiguration
config.saveConfig();
}
+ public static String CONTROL_LABEL = "GriefPrevention";
+ public static boolean CONTROL_SHOW = true;
+ public static boolean CONTROL_HIDE = false;
+ public static String GRID_CONTROL_LABEL = "Gridlines";
+ public static boolean GRID_CONTROL_SHOW = true;
+ public static boolean GRID_CONTROL_HIDE = true;
+ public static int UPDATE_INTERVAL = 300;
+ public static Color STROKE_COLOR = Color.GREEN;
+ public static int STROKE_WEIGHT = 1;
+ public static double STROKE_OPACITY = 1.0D;
+ public static Color FILL_COLOR = Color.GREEN;
+ public static double FILL_OPACITY = 0.2D;
+
+ public static Color ADMIN_STROKE_COLOR = Color.BLUE;
+ public static int ADMIN_STROKE_WEIGHT = 1;
+ public static double ADMIN_STROKE_OPACITY = 1.0D;
+ public static Color ADMIN_FILL_COLOR = Color.BLUE;
+ public static double ADMIN_FILL_OPACITY = 0.2D;
+
+ public static Color EXPIRING_STROKE_COLOR = Color.PINK;
+ public static int EXPIRING_STROKE_WEIGHT = 1;
+ public static double EXPIRING_STROKE_OPACITY = 1.0D;
+ public static Color EXPIRING_FILL_COLOR = Color.PINK;
+ public static double EXPIRING_FILL_OPACITY = 0.2D;
+
+ public static String STRINGS_PUBLIC = "Public";
+ public static String CLAIM_TOOLTIP = "Claim Owner: {owner}
" +
+ "Permission Trust: {managers}
" +
+ "Trust: {builders}
" +
+ "Container Trust: {containers}
" +
+ "Access Trust: {accessors}";
+ public static String ADMIN_CLAIM_TOOLTIP = "Administrator Claim
" +
+ "Permission Trust: {managers}
" +
+ "Trust: {builders}
" +
+ "Container Trust: {containers}
" +
+ "Access Trust: {accessors}";
+ public static String EXPIRING_CLAIM_TOOLTIP = "Temporary Claim
" +
+ "Permission Trust: {managers}
" +
+ "Trust: {builders}
" +
+ "Container Trust: {containers}
" +
+ "Access Trust: {accessors}
" +
+ "Expires: {expiretime}" ;
+ private static void mapSettings() {
+ CONTROL_LABEL = config.getString("settings.control.label", CONTROL_LABEL);
+ CONTROL_SHOW = config.getBoolean("settings.control.show", CONTROL_SHOW);
+ CONTROL_HIDE = config.getBoolean("settings.control.hide-by-default", CONTROL_HIDE);
+ GRID_CONTROL_LABEL = config.getString("settings.grid.label", GRID_CONTROL_LABEL);
+ GRID_CONTROL_SHOW = config.getBoolean("settings.grid.show", GRID_CONTROL_SHOW);
+ GRID_CONTROL_HIDE = config.getBoolean("settings.grid.hide-by-default", GRID_CONTROL_HIDE);
+ UPDATE_INTERVAL = config.getInt("settings.update-interval", UPDATE_INTERVAL);
+
+ STROKE_COLOR = config.getColor("settings.style.regular-claim.stroke.color", STROKE_COLOR);
+ STROKE_WEIGHT = config.getInt("settings.style.regular-claim.stroke.weight", STROKE_WEIGHT);
+ STROKE_OPACITY = config.getDouble("settings.regular-claim.style.stroke.opacity", STROKE_OPACITY);
+ FILL_COLOR = config.getColor("settings.style.regular-claim.fill.color", FILL_COLOR);
+ FILL_OPACITY = config.getDouble("settings.style.regular-claim.fill.opacity", FILL_OPACITY);
+
+ ADMIN_STROKE_COLOR = config.getColor("settings.style.admin-claim.stroke.color", ADMIN_STROKE_COLOR);
+ ADMIN_STROKE_WEIGHT = config.getInt("settings.style.admin-claim.stroke.weight", ADMIN_STROKE_WEIGHT);
+ ADMIN_STROKE_OPACITY = config.getDouble("settings.admin-claim.style.stroke.opacity", ADMIN_STROKE_OPACITY);
+ ADMIN_FILL_COLOR = config.getColor("settings.style.admin-claim.fill.color", ADMIN_FILL_COLOR);
+ ADMIN_FILL_OPACITY = config.getDouble("settings.style.admin-claim.fill.opacity", ADMIN_FILL_OPACITY);
+
+ EXPIRING_STROKE_COLOR = config.getColor("settings.style.expiring-claim.stroke.color", EXPIRING_STROKE_COLOR);
+ EXPIRING_STROKE_WEIGHT = config.getInt("settings.style.expiring-claim.stroke.weight", EXPIRING_STROKE_WEIGHT);
+ EXPIRING_STROKE_OPACITY = config.getDouble("settings.expiring-claim.style.stroke.opacity", EXPIRING_STROKE_OPACITY);
+ EXPIRING_FILL_COLOR = config.getColor("settings.style.expiring-claim.fill.color", EXPIRING_FILL_COLOR);
+ EXPIRING_FILL_OPACITY = config.getDouble("settings.style.expiring-claim.fill.opacity", EXPIRING_FILL_OPACITY);
+
+ STRINGS_PUBLIC = config.getString("settings.strings.public", STRINGS_PUBLIC);
+ CLAIM_TOOLTIP = config.getString("settings.region.tooltip.regular-claim", CLAIM_TOOLTIP);
+ ADMIN_CLAIM_TOOLTIP = config.getString("settings.region.tooltip.admin-claim", ADMIN_CLAIM_TOOLTIP);
+ EXPIRING_CLAIM_TOOLTIP = config.getString("settings.region.tooltip.expiring-claim", EXPIRING_CLAIM_TOOLTIP);
+ }
+
}
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/alttd/hook/GPHook.java b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/hook/GPHook.java
new file mode 100644
index 0000000..3eef67b
--- /dev/null
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/hook/GPHook.java
@@ -0,0 +1,20 @@
+package me.ryanhamshire.GriefPrevention.alttd.hook;
+
+import me.ryanhamshire.GriefPrevention.Claim;
+import me.ryanhamshire.GriefPrevention.GriefPrevention;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+
+import java.util.Collection;
+import java.util.UUID;
+
+public class GPHook {
+ public static boolean isWorldEnabled(UUID uuid) {
+ World world = Bukkit.getWorld(uuid);
+ return GriefPrevention.instance.claimsEnabledForWorld(world);
+ }
+
+ public static Collection getClaims() {
+ return GriefPrevention.instance.dataStore.getClaims();
+ }
+}
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/alttd/hook/Pl3xMapHook.java b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/hook/Pl3xMapHook.java
new file mode 100644
index 0000000..13be45c
--- /dev/null
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/hook/Pl3xMapHook.java
@@ -0,0 +1,39 @@
+package me.ryanhamshire.GriefPrevention.alttd.hook;
+
+import me.ryanhamshire.GriefPrevention.alttd.config.AlttdConfig;
+import me.ryanhamshire.GriefPrevention.alttd.tasks.Pl3xMapTask;
+import net.pl3x.map.api.Key;
+import net.pl3x.map.api.Pl3xMapProvider;
+import net.pl3x.map.api.SimpleLayerProvider;
+import org.bukkit.plugin.Plugin;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class Pl3xMapHook {
+ private final Map provider = new HashMap<>();
+
+ public Pl3xMapHook(Plugin plugin) {
+ plugin.getLogger().info("Started Pl3xMapHook...");
+ Pl3xMapProvider.get().mapWorlds().forEach(world -> {
+ if (GPHook.isWorldEnabled(world.uuid())) {
+ SimpleLayerProvider provider = SimpleLayerProvider
+ .builder(AlttdConfig.CONTROL_LABEL)
+ .showControls(AlttdConfig.CONTROL_SHOW)
+ .defaultHidden(AlttdConfig.CONTROL_HIDE)
+ .build();
+ world.layerRegistry().register(Key.of("griefprevention_" + world.uuid()), provider);
+ Pl3xMapTask task = new Pl3xMapTask(world, provider);
+ task.runTaskTimerAsynchronously(plugin, 0, 20L * AlttdConfig.UPDATE_INTERVAL);
+ this.provider.put(world.uuid(), task);
+ }
+ });
+ }
+
+ public void disable() {
+ provider.values().forEach(Pl3xMapTask::disable);
+ provider.clear();
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/alttd/tasks/Pl3xMapTask.java b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/tasks/Pl3xMapTask.java
new file mode 100644
index 0000000..5939fbf
--- /dev/null
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/tasks/Pl3xMapTask.java
@@ -0,0 +1,126 @@
+package me.ryanhamshire.GriefPrevention.alttd.tasks;
+
+import me.ryanhamshire.GriefPrevention.Claim;
+import me.ryanhamshire.GriefPrevention.alttd.config.AlttdConfig;
+import me.ryanhamshire.GriefPrevention.alttd.hook.GPHook;
+import net.pl3x.map.api.Key;
+import net.pl3x.map.api.MapWorld;
+import net.pl3x.map.api.Point;
+import net.pl3x.map.api.SimpleLayerProvider;
+import net.pl3x.map.api.marker.Marker;
+import net.pl3x.map.api.marker.MarkerOptions;
+import net.pl3x.map.api.marker.Rectangle;
+import org.bukkit.Location;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class Pl3xMapTask extends BukkitRunnable {
+ private final MapWorld world;
+ private final SimpleLayerProvider provider;
+
+ private boolean stop;
+
+ public Pl3xMapTask(MapWorld world, SimpleLayerProvider provider) {
+ this.world = world;
+ this.provider = provider;
+ }
+
+ @Override
+ public void run() {
+ if (stop) {
+ cancel();
+ }
+ updateClaims();
+ }
+
+ void updateClaims() {
+ provider.clearMarkers();
+ Collection topLevelClaims = GPHook.getClaims();
+ if (topLevelClaims != null) {
+ topLevelClaims.stream()
+ .filter(claim -> claim.getGreaterBoundaryCorner().getWorld().getUID().equals(this.world.uuid()))
+ .filter(claim -> claim.parent == null)
+ .forEach(this::handleClaim);
+ }
+ }
+
+ private void handleClaim(Claim claim) {
+ Location min = claim.getLesserBoundaryCorner();
+ Location max = claim.getGreaterBoundaryCorner();
+ if (min == null) {
+ return;
+ }
+
+ Rectangle rect = Marker.rectangle(Point.of(min.getBlockX(), min.getBlockZ()), Point.of(max.getBlockX() + 1, max.getBlockZ() + 1));
+
+ ArrayList builders = new ArrayList<>();
+ ArrayList containers = new ArrayList<>();
+ ArrayList accessors = new ArrayList<>();
+ ArrayList managers = new ArrayList<>();
+ claim.getPermissions(builders, containers, accessors, managers);
+
+ String worldName = min.getWorld().getName();
+ String toolTip = AlttdConfig.CLAIM_TOOLTIP;
+ MarkerOptions.Builder options = MarkerOptions.builder()
+ .strokeColor(AlttdConfig.STROKE_COLOR)
+ .strokeWeight(AlttdConfig.STROKE_WEIGHT)
+ .strokeOpacity(AlttdConfig.STROKE_OPACITY)
+ .fillColor(AlttdConfig.FILL_COLOR)
+ .fillOpacity(AlttdConfig.FILL_OPACITY)
+ .clickTooltip((claim.isAdminClaim() ? (AlttdConfig.expiringClaims.containsKey(claim.getID()) ? AlttdConfig.EXPIRING_CLAIM_TOOLTIP : AlttdConfig.ADMIN_CLAIM_TOOLTIP) : AlttdConfig.CLAIM_TOOLTIP)
+ .replace("{world}", worldName)
+ .replace("{id}", Long.toString(claim.getID()))
+ .replace("{owner}", claim.getOwnerName())
+ .replace("{managers}", getNames(managers))
+ .replace("{builders}", getNames(builders))
+ .replace("{containers}", getNames(containers))
+ .replace("{accessors}", getNames(accessors))
+ .replace("{area}", Integer.toString(claim.getArea()))
+ .replace("{width}", Integer.toString(claim.getWidth()))
+ .replace("{height}", Integer.toString(claim.getHeight()))
+ .replace("{expiretime}", parseExpireTime(claim.getID()))
+ );
+
+ if (claim.isAdminClaim()) {
+ if (AlttdConfig.expiringClaims.containsKey(claim.getID())) {
+ options.strokeColor(AlttdConfig.EXPIRING_STROKE_COLOR)
+ .strokeWeight(AlttdConfig.EXPIRING_STROKE_WEIGHT)
+ .strokeOpacity(AlttdConfig.EXPIRING_STROKE_OPACITY)
+ .fillColor(AlttdConfig.EXPIRING_FILL_COLOR)
+ .fillOpacity(AlttdConfig.EXPIRING_FILL_OPACITY);
+ } else {
+ options.strokeColor(AlttdConfig.ADMIN_STROKE_COLOR)
+ .strokeWeight(AlttdConfig.ADMIN_STROKE_WEIGHT)
+ .strokeOpacity(AlttdConfig.ADMIN_STROKE_OPACITY)
+ .fillColor(AlttdConfig.ADMIN_FILL_COLOR)
+ .fillOpacity(AlttdConfig.ADMIN_FILL_OPACITY);
+ }
+ }
+
+ rect.markerOptions(options);
+
+ String markerid = "griefprevention_" + worldName + "_region_" + Long.toHexString(claim.getID());
+ this.provider.addMarker(Key.of(markerid), rect);
+ }
+
+ private static String getNames(List list) {
+ return String.join(", ", list);
+ }
+
+ public void disable() {
+ cancel();
+ this.stop = true;
+ this.provider.clearMarkers();
+ }
+
+ private String parseExpireTime(Long claimId) {
+ if(AlttdConfig.expiringClaims.containsKey(claimId)) {
+ return DateFormat.getInstance().format(AlttdConfig.expiringClaims.get(claimId));
+ }
+ return "";
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index a3994cf..7ca0d54 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,6 +1,6 @@
name: GriefPrevention
main: me.ryanhamshire.GriefPrevention.GriefPrevention
-softdepend: [Vault, Multiverse-Core, My_Worlds, MystCraft, Transporter, TheUnderground, WorldGuard, WorldEdit, RoyalCommands, MultiWorld, Denizen]
+softdepend: [Vault, Multiverse-Core, My_Worlds, MystCraft, Transporter, TheUnderground, WorldGuard, WorldEdit, RoyalCommands, MultiWorld, Denizen, Pl3xMap]
dev-url: https://dev.bukkit.org/projects/grief-prevention
loadbefore: [TheUnderground]
version: '${git.commit.id.describe}'