diff --git a/.gitignore b/.gitignore
index 4788b4b..1e28e50 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,8 @@
*.ipr
*.iws
+server
+
# IntelliJ
out/
diff --git a/pom.xml b/pom.xml
index 451102d..152fa53 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,6 +52,10 @@
+
+ bg-software
+ https://repo.bg-software.com/repository/api/
+
papermc-repo
https://repo.papermc.io/repository/maven-public/
@@ -76,6 +80,10 @@
ender-zone
https://ci.ender.zone/plugin/repository/everything/
+
+ glaremasters repo
+ https://repo.glaremasters.me/repository/towny/
+
@@ -109,6 +117,12 @@
16.18.2
provided
+
+ com.bgsoftware
+ SuperiorSkyblockAPI
+ 2023.3
+ provided
+
com.griefcraft
lwc
@@ -121,5 +135,11 @@
1.6.9.5-U0.6.33
provided
+
+ com.palmergames.bukkit.towny
+ towny
+ 0.100.1.0
+ provided
+
diff --git a/readme.md b/readme.md
index 6bcae85..3a2857a 100644
--- a/readme.md
+++ b/readme.md
@@ -12,10 +12,12 @@ If you're a developer looking for information how to implement YardWatchAPI in y
- Minecraft 1.16+
## Implementations for:
-- GriefPrevention (v16+)
-- WorldGuard (7.0.0+)
+- [GriefPrevention (v16+)](https://www.spigotmc.org/resources/griefprevention.1884/)
+- [WorldGuard (7.0.0+)](https://enginehub.org/worldguard#downloads)
- LWCX
-- FactionsUUID
+- [FactionsUUID](https://www.spigotmc.org/resources/factionsuuid.1035/)
+- [SuperiorSkyBlock](https://bg-software.com/superiorskyblock/)
+- [Towny](https://github.com/TownyAdvanced/Towny)
## Plugin you're using is not implementing YardWatchAPI?
Contact the plugin developer and send them [here](https://github.com/YouHaveTrouble/YardWatchAPI/blob/master/readme.md)!
diff --git a/src/main/java/me/youhavetrouble/yardwatch/YardWatch.java b/src/main/java/me/youhavetrouble/yardwatch/YardWatch.java
index c76b258..ffa0ba0 100644
--- a/src/main/java/me/youhavetrouble/yardwatch/YardWatch.java
+++ b/src/main/java/me/youhavetrouble/yardwatch/YardWatch.java
@@ -3,6 +3,8 @@ package me.youhavetrouble.yardwatch;
import me.youhavetrouble.yardwatch.hooks.FactionsUUIDProtection;
import me.youhavetrouble.yardwatch.hooks.GriefPreventionProtection;
import me.youhavetrouble.yardwatch.hooks.LWCXProtection;
+import me.youhavetrouble.yardwatch.hooks.SuperiorSkyBlockProtection;
+import me.youhavetrouble.yardwatch.hooks.TownyProtection;
import me.youhavetrouble.yardwatch.hooks.WorldGuardProtection;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
@@ -15,7 +17,6 @@ public final class YardWatch extends JavaPlugin {
@Override
public void onEnable() {
-
if (shouldRegisterService("WorldGuard")) {
getServer().getServicesManager().register(
Protection.class, new WorldGuardProtection(this), this, ServicePriority.Normal
@@ -40,6 +41,18 @@ public final class YardWatch extends JavaPlugin {
);
}
+ if (shouldRegisterService("SuperiorSkyblock2")) {
+ getServer().getServicesManager().register(
+ Protection.class, new SuperiorSkyBlockProtection(this), this, ServicePriority.Normal
+ );
+ }
+
+ if (shouldRegisterService("Towny")) {
+ getServer().getServicesManager().register(
+ Protection.class, new TownyProtection(this), this, ServicePriority.Normal
+ );
+ }
+
}
/**
diff --git a/src/main/java/me/youhavetrouble/yardwatch/hooks/SuperiorSkyBlockProtection.java b/src/main/java/me/youhavetrouble/yardwatch/hooks/SuperiorSkyBlockProtection.java
new file mode 100644
index 0000000..cbe7c87
--- /dev/null
+++ b/src/main/java/me/youhavetrouble/yardwatch/hooks/SuperiorSkyBlockProtection.java
@@ -0,0 +1,93 @@
+package me.youhavetrouble.yardwatch.hooks;
+
+import com.bgsoftware.superiorskyblock.api.SuperiorSkyblockAPI;
+import com.bgsoftware.superiorskyblock.api.island.BlockChangeResult;
+import com.bgsoftware.superiorskyblock.api.island.Island;
+import com.bgsoftware.superiorskyblock.api.island.IslandPrivilege;
+import com.bgsoftware.superiorskyblock.api.wrappers.SuperiorPlayer;
+import me.youhavetrouble.yardwatch.Protection;
+import me.youhavetrouble.yardwatch.YardWatch;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockState;
+import org.bukkit.block.banner.PatternType;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+
+public class SuperiorSkyBlockProtection implements Protection {
+
+ private final YardWatch plugin;
+
+ public SuperiorSkyBlockProtection(YardWatch plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return this.plugin.getServer().getPluginManager().isPluginEnabled("SuperiorSkyblock2");
+ }
+
+ @Override
+ public boolean isProtected(Location location) {
+ if (!isEnabled()) return false;
+
+ Island island = SuperiorSkyblockAPI.getIslandAt(location);
+
+ return island != null;
+ }
+
+ @Override
+ public boolean canBreakBlock(Player player, BlockState blockState) {
+ if (!isEnabled()) return true;
+
+ Location location = blockState.getLocation();
+
+ Island island = SuperiorSkyblockAPI.getIslandAt(location);
+
+ return island == null || island.hasPermission(player, IslandPrivilege.getByName("BREAK"));
+ }
+
+ @Override
+ public boolean canPlaceBlock(Player player, Location location) {
+ if (!isEnabled()) return true;
+
+ Island island = SuperiorSkyblockAPI.getIslandAt(location);
+
+ return island == null || island.hasPermission(player, IslandPrivilege.getByName("INTERACT"));
+ }
+
+ @Override
+ public boolean canInteract(Player player, BlockState blockState) {
+ if (!isEnabled()) return true;
+
+ Location location = blockState.getLocation();
+
+ Island island = SuperiorSkyblockAPI.getIslandAt(location);
+
+ return island == null || island.hasPermission(player, IslandPrivilege.getByName("INTERACT"));
+ }
+
+ @Override
+ public boolean canInteract(Player player, Entity target) {
+ if (!isEnabled()) return true;
+
+ Location location = target.getLocation();
+
+ Island island = SuperiorSkyblockAPI.getIslandAt(location);
+
+ return island == null || island.hasPermission(player, IslandPrivilege.getByName("INTERACT")) || island.hasPermission(player, IslandPrivilege.getByName("USE"));
+ }
+
+ @Override
+ public boolean canDamage(Entity damager, Entity target) {
+ if (!isEnabled()) return true;
+ if (!(damager instanceof Player attacker)) return true;
+
+ Location location = target.getLocation();
+
+ Island island = SuperiorSkyblockAPI.getIslandAt(location);
+
+ return island == null || island.hasPermission(attacker, IslandPrivilege.getByName("INTERACT"));
+ }
+}
diff --git a/src/main/java/me/youhavetrouble/yardwatch/hooks/TownyProtection.java b/src/main/java/me/youhavetrouble/yardwatch/hooks/TownyProtection.java
new file mode 100644
index 0000000..a8d2cf0
--- /dev/null
+++ b/src/main/java/me/youhavetrouble/yardwatch/hooks/TownyProtection.java
@@ -0,0 +1,80 @@
+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;
+import org.bukkit.Location;
+import org.bukkit.block.BlockState;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+
+public class TownyProtection implements Protection {
+
+ private final YardWatch plugin;
+
+ private final TownyAPI api;
+
+ public TownyProtection(YardWatch plugin) {
+ this.plugin = plugin;
+
+ this.api = TownyAPI.getInstance();
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return this.plugin.getServer().getPluginManager().isPluginEnabled("Towny");
+ }
+
+ @Override
+ public boolean isProtected(Location location) {
+ if (!isEnabled()) return false;
+
+ TownBlock town = this.api.getTownBlock(location);
+
+ return town != null;
+ }
+
+ @Override
+ public boolean canBreakBlock(Player player, BlockState blockState) {
+ return canInteract(player, blockState);
+ }
+
+ @Override
+ public boolean canPlaceBlock(Player player, Location location) {
+ return canInteract(player, location.getBlock().getState(true));
+ }
+
+ @Override
+ public boolean canInteract(Player player, BlockState blockState) {
+ if (!isEnabled()) return true;
+
+ Location location = blockState.getLocation();
+
+ TownBlock town = this.api.getTownBlock(location);
+
+ Resident resident = this.api.getResident(player.getUniqueId());
+
+ return town == null || town.hasResident(resident) || town.hasTrustedResident(resident);
+ }
+
+ @Override
+ public boolean canInteract(Player player, Entity target) {
+ return canInteract(player, target.getLocation().getBlock().getState(true));
+ }
+
+ @Override
+ public boolean canDamage(Entity damager, Entity target) {
+ if (!isEnabled()) return true;
+ if (!(damager instanceof Player)) return true;
+
+ Location location = target.getLocation();
+
+ TownBlock town = this.api.getTownBlock(location);
+
+ return town == null || CombatUtil.preventPvP(town.getWorld(), town);
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index cff1352..4293bd2 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -12,3 +12,4 @@ softdepend:
- "GriefPrevention"
- "Towny"
- "Factions"
+ - "SuperiorSkyblock2"