diff --git a/pom.xml b/pom.xml
index d1bc5b8..a387f1f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -96,6 +96,18 @@
+
+
+
+ com.intellectualsites.bom
+ bom-newest
+ 1.48
+ import
+ pom
+
+
+
+
com.destroystokyo.paper
@@ -151,5 +163,11 @@
0.100.1.0
provided
+
+ com.intellectualsites.plotsquared
+ plotsquared-core
+ 7.3.8
+ provided
+
diff --git a/src/main/java/me/youhavetrouble/yardwatch/YardWatch.java b/src/main/java/me/youhavetrouble/yardwatch/YardWatch.java
index 4e56624..75f8342 100644
--- a/src/main/java/me/youhavetrouble/yardwatch/YardWatch.java
+++ b/src/main/java/me/youhavetrouble/yardwatch/YardWatch.java
@@ -5,6 +5,7 @@ import me.youhavetrouble.yardwatch.commands.YardWatchCommand;
import me.youhavetrouble.yardwatch.hooks.FactionsUUIDProtection;
import me.youhavetrouble.yardwatch.hooks.GriefPreventionProtection;
import me.youhavetrouble.yardwatch.hooks.LWCXProtection;
+import me.youhavetrouble.yardwatch.hooks.PlotSquaredProtection;
import me.youhavetrouble.yardwatch.hooks.SuperiorSkyBlockProtection;
import me.youhavetrouble.yardwatch.hooks.TownyProtection;
import me.youhavetrouble.yardwatch.hooks.WorldGuardProtection;
@@ -83,6 +84,13 @@ public final class YardWatch extends JavaPlugin {
);
}
+ if (shouldRegisterService("PlotSquared")) {
+ getLogger().info("Registering PlotSquared service.");
+ getServer().getServicesManager().register(
+ Protection.class, new PlotSquaredProtection(this), this, ServicePriority.Normal
+ );
+ }
+
List> registrations = getServer().getServicesManager().getRegistrations(this);
if (registrations.isEmpty()) {
getLogger().info("Registered 0 services. This plugin can be safely removed.");
diff --git a/src/main/java/me/youhavetrouble/yardwatch/hooks/PlotSquaredProtection.java b/src/main/java/me/youhavetrouble/yardwatch/hooks/PlotSquaredProtection.java
new file mode 100644
index 0000000..dc9a4ea
--- /dev/null
+++ b/src/main/java/me/youhavetrouble/yardwatch/hooks/PlotSquaredProtection.java
@@ -0,0 +1,97 @@
+package me.youhavetrouble.yardwatch.hooks;
+
+import com.plotsquared.core.plot.Plot;
+import com.plotsquared.core.plot.flag.implementations.PvpFlag;
+import me.youhavetrouble.yardwatch.Protection;
+import me.youhavetrouble.yardwatch.YardWatch;
+import org.bukkit.Location;
+import org.bukkit.block.BlockState;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.checkerframework.checker.nullness.qual.NonNull;
+
+public class PlotSquaredProtection implements Protection {
+
+ private final YardWatch plugin;
+
+ public PlotSquaredProtection(YardWatch plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return this.plugin.getServer().getPluginManager().isPluginEnabled("PlotSquared");
+ }
+
+ @Override
+ public boolean isProtected(final Location location) {
+ if (!isEnabled()) return false;
+
+ final com.plotsquared.core.location.Location arg1 = getLocation(location);
+
+ return arg1.isPlotArea() || arg1.isPlotRoad() || arg1.isUnownedPlotArea() || arg1.getOwnedPlot() != null;
+ }
+
+ @Override
+ public boolean canBreakBlock(final Player player, final BlockState blockState) {
+ if (!isEnabled()) return true;
+
+ final Location blockLocation = blockState.getLocation();
+ final com.plotsquared.core.location.@NonNull Location location = getLocation(blockLocation);
+
+ final Plot plot = location.getOwnedPlot();
+
+ if (plot == null) return isProtected(blockLocation);
+
+ return plot.isAdded(player.getUniqueId());
+ }
+
+ @Override
+ public boolean canPlaceBlock(final Player player, final Location location) {
+ return canBreakBlock(player, location.getBlock().getState());
+ }
+
+ @Override
+ public boolean canInteract(final Player player, final BlockState blockState) {
+ if (!isEnabled()) return true;
+
+ final Location location = blockState.getLocation();
+
+ com.plotsquared.core.location.@NonNull Location plotLocation = getLocation(location);
+
+ final Plot plot = plotLocation.getOwnedPlot();
+
+ if (plot == null) return isProtected(location);
+
+ return plot.isAdded(player.getUniqueId());
+ }
+
+ @Override
+ public boolean canInteract(final Player player, final Entity target) {
+ return canInteract(player, target.getLocation().getBlock().getState());
+ }
+
+ @Override
+ public boolean canDamage(final Entity damager, final Entity target) {
+ if (!isEnabled() || !(damager instanceof Player)) return true;
+
+ final Location location = target.getLocation();
+
+ com.plotsquared.core.location.@NonNull Location plotLocation = getLocation(location);
+
+ final Plot plot = plotLocation.getOwnedPlot();
+
+ if (plot == null) return isProtected(location);
+
+ return plot.getFlag(PvpFlag.class);
+ }
+
+ private com.plotsquared.core.location.@NonNull Location getLocation(final Location location) {
+ final String world = location.getWorld().getName();
+ final int x = (int) location.getX();
+ final int y = (int) location.getY();
+ final int z = (int) location.getZ();
+
+ return com.plotsquared.core.location.Location.at(world, x, y, z);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/me/youhavetrouble/yardwatch/hooks/TownyProtection.java b/src/main/java/me/youhavetrouble/yardwatch/hooks/TownyProtection.java
index a8d2cf0..48b76e6 100644
--- a/src/main/java/me/youhavetrouble/yardwatch/hooks/TownyProtection.java
+++ b/src/main/java/me/youhavetrouble/yardwatch/hooks/TownyProtection.java
@@ -3,7 +3,6 @@ package me.youhavetrouble.yardwatch.hooks;
import com.palmergames.bukkit.towny.TownyAPI;
import com.palmergames.bukkit.towny.object.Resident;
import com.palmergames.bukkit.towny.object.TownBlock;
-import com.palmergames.bukkit.towny.object.TownyPermission;
import com.palmergames.bukkit.towny.utils.CombatUtil;
import me.youhavetrouble.yardwatch.Protection;
import me.youhavetrouble.yardwatch.YardWatch;
@@ -45,7 +44,7 @@ public class TownyProtection implements Protection {
@Override
public boolean canPlaceBlock(Player player, Location location) {
- return canInteract(player, location.getBlock().getState(true));
+ return canInteract(player, location.getBlock().getState());
}
@Override
@@ -63,7 +62,7 @@ public class TownyProtection implements Protection {
@Override
public boolean canInteract(Player player, Entity target) {
- return canInteract(player, target.getLocation().getBlock().getState(true));
+ return canInteract(player, target.getLocation().getBlock().getState());
}
@Override