From 34964d30cd72a3a1cc50bf120b331fae56867bee Mon Sep 17 00:00:00 2001 From: Ryder Belserion Date: Tue, 16 Apr 2024 13:57:08 -0400 Subject: [PATCH] Adds towny and superiorskyblock support (#1) * Stash changes * Add superiorskyblock2 support * Add as a soft depend * Fix skyblock support * Add palmers towny support * Turned off wildcard imports * Update readme * Update .gitignore * Add new line * Add new line --- .gitignore | 2 + pom.xml | 20 ++++ readme.md | 8 +- .../youhavetrouble/yardwatch/YardWatch.java | 15 ++- .../hooks/SuperiorSkyBlockProtection.java | 93 +++++++++++++++++++ .../yardwatch/hooks/TownyProtection.java | 80 ++++++++++++++++ src/main/resources/plugin.yml | 1 + 7 files changed, 215 insertions(+), 4 deletions(-) create mode 100644 src/main/java/me/youhavetrouble/yardwatch/hooks/SuperiorSkyBlockProtection.java create mode 100644 src/main/java/me/youhavetrouble/yardwatch/hooks/TownyProtection.java 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"