diff --git a/build.gradle.kts b/build.gradle.kts index 42d51472..0d06a7f7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -66,6 +66,10 @@ allprojects { name = "minecodes-repository-releases" url = uri("https://maven.minecodes.pl/releases") } + maven { + name = "william278Releases" + url = uri("https://repo.william278.net/releases") + } } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 588739ce..520bdbda 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -55,6 +55,7 @@ dependencies { implementation(platform("com.intellectualsites.bom:bom-newest:1.56")) compileOnly("com.intellectualsites.plotsquared:plotsquared-core") + compileOnly("net.william278.huskclaims:huskclaims-bukkit:1.5.10") compileOnly("org.projectlombok:lombok:1.18.44") annotationProcessor("org.projectlombok:lombok:1.18.44") diff --git a/core/src/main/java/github/nighter/smartspawner/hooks/IntegrationManager.java b/core/src/main/java/github/nighter/smartspawner/hooks/IntegrationManager.java index a1aee3d6..bbb879e4 100644 --- a/core/src/main/java/github/nighter/smartspawner/hooks/IntegrationManager.java +++ b/core/src/main/java/github/nighter/smartspawner/hooks/IntegrationManager.java @@ -36,6 +36,7 @@ public class IntegrationManager { private boolean hasIridiumSkyblock = false; private boolean hasPlotSquared = false; private boolean hasResidence = false; + private boolean hasHuskClaims = false; // Integration plugin flags private boolean hasAuraSkills = false; @@ -151,6 +152,11 @@ private void checkProtectionPlugins() { Plugin residence = Bukkit.getPluginManager().getPlugin("Residence"); return residence != null && residence.isEnabled(); }, true); + + hasHuskClaims = checkPlugin("HuskClaims", () -> { + Plugin hc = Bukkit.getPluginManager().getPlugin("HuskClaims"); + return hc != null && hc.isEnabled(); + }, true); } private void checkIntegrationPlugins() { diff --git a/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckBreakBlock.java b/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckBreakBlock.java index 05fb61de..ed917a4e 100644 --- a/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckBreakBlock.java +++ b/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckBreakBlock.java @@ -22,6 +22,7 @@ public static boolean CanPlayerBreakBlock(@NotNull final Player player, @NotNull if (integrationManager.isHasPlotSquared() && !PlotSquared.canInteract(player, location)) return false; if (integrationManager.isHasResidence() && !Residence.canPlayerBreakBlock(player, location)) return false; if (integrationManager.isHasMinePlots() && !MinePlots.canPlayerBreakBlock(player, location)) return false; + if (integrationManager.isHasHuskClaims() && !HuskClaims.canPlayerBreakBlock(player, location)) return false; return true; } } diff --git a/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckOpenMenu.java b/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckOpenMenu.java index 9fd51567..62836581 100644 --- a/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckOpenMenu.java +++ b/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckOpenMenu.java @@ -26,6 +26,7 @@ public static boolean CanPlayerOpenMenu(@NotNull final Player player, @NotNull L if (integrationManager.isHasIridiumSkyblock() && !IridiumSkyblock.canPlayerOpenMenu(player, location)) return false; if (integrationManager.isHasPlotSquared() && !PlotSquared.canInteract(player, location)) return false; if (integrationManager.isHasResidence() && !Residence.canInteract(player, location)) return false; + if (integrationManager.isHasHuskClaims() && !HuskClaims.canPlayerOpenMenu(player, location)) return false; return !integrationManager.isHasRedProtect() || RedProtectAPI.canPlayerOpenMenuOnClaim(player, location); } } \ No newline at end of file diff --git a/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckStackBlock.java b/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckStackBlock.java index 836a14c9..dbfd58b6 100644 --- a/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckStackBlock.java +++ b/core/src/main/java/github/nighter/smartspawner/hooks/protections/CheckStackBlock.java @@ -26,6 +26,7 @@ public static boolean CanPlayerPlaceBlock(@NotNull final Player player, @NotNull if (integrationManager.isHasIridiumSkyblock() && !IridiumSkyblock.canPlayerStackBlock(player, location)) return false; if (integrationManager.isHasPlotSquared() && !PlotSquared.canInteract(player, location)) return false; if (integrationManager.isHasResidence() && !Residence.canStack(player, location)) return false; + if (integrationManager.isHasHuskClaims() && !HuskClaims.canPlayerStackBlock(player, location)) return false; return !integrationManager.isHasRedProtect() || RedProtectAPI.canPlayerStackClaimBlock(player, location); } } \ No newline at end of file diff --git a/core/src/main/java/github/nighter/smartspawner/hooks/protections/api/HuskClaims.java b/core/src/main/java/github/nighter/smartspawner/hooks/protections/api/HuskClaims.java new file mode 100644 index 00000000..e57ba377 --- /dev/null +++ b/core/src/main/java/github/nighter/smartspawner/hooks/protections/api/HuskClaims.java @@ -0,0 +1,34 @@ +package github.nighter.smartspawner.hooks.protections.api; + +import net.william278.huskclaims.api.BukkitHuskClaimsAPI; +import net.william278.huskclaims.claim.Claim; +import net.william278.huskclaims.libraries.cloplib.operation.Operation; +import net.william278.huskclaims.libraries.cloplib.operation.OperationType; +import net.william278.huskclaims.position.Position; +import net.william278.huskclaims.user.OnlineUser; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class HuskClaims { + public static boolean canPlayerBreakBlock(@NotNull Player player, @NotNull Location location) { + return check(player, location, OperationType.BLOCK_BREAK); + } + + public static boolean canPlayerStackBlock(@NotNull Player player, @NotNull Location location) { + return check(player, location, OperationType.BLOCK_INTERACT); + } + + public static boolean canPlayerOpenMenu(@NotNull Player player, @NotNull Location location) { + return check(player, location, OperationType.BLOCK_INTERACT); + } + + private static boolean check(Player player, Location location, OperationType operationType) { + OnlineUser user = BukkitHuskClaimsAPI.getInstance().getOnlineUser(player); + if (user == null) return true; + Position position = BukkitHuskClaimsAPI.getInstance().getPosition(location); + Claim claim = BukkitHuskClaimsAPI.getInstance().getClaimAt(position).orElse(null); + if (claim == null) return true; + return BukkitHuskClaimsAPI.getInstance().isOperationAllowed(Operation.of(user, operationType, position, true)); + } +} diff --git a/core/src/main/java/github/nighter/smartspawner/hooks/protections/api/Residence.java b/core/src/main/java/github/nighter/smartspawner/hooks/protections/api/Residence.java index a801a5de..a7e4f3b6 100644 --- a/core/src/main/java/github/nighter/smartspawner/hooks/protections/api/Residence.java +++ b/core/src/main/java/github/nighter/smartspawner/hooks/protections/api/Residence.java @@ -1,13 +1,13 @@ package github.nighter.smartspawner.hooks.protections.api; import com.bekvon.bukkit.residence.api.ResidenceApi; +import com.bekvon.bukkit.residence.containers.Flags; import com.bekvon.bukkit.residence.protection.ClaimedResidence; +import com.bekvon.bukkit.residence.protection.FlagPermissions; import org.bukkit.Location; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.util.Map; - public class Residence { public static boolean canPlayerBreakBlock(@NotNull Player player, @NotNull Location location) { return check(player, location, "build"); @@ -24,12 +24,13 @@ public static boolean canStack(@NotNull Player player, @NotNull Location locatio private static boolean check(Player player, Location location, String flagName) { ClaimedResidence claimedResidence = ResidenceApi.getResidenceManager().getByLoc(location); if (claimedResidence == null) return true; - Map flags = claimedResidence.getPermissions().getPlayerFlags(player.getUniqueId()); - if (flags == null) return true; - for (String flag : flags.keySet()) { - if (flag.equalsIgnoreCase(flagName) && flags.get(flag)) - return true; + FlagPermissions perms = claimedResidence.getPermissions(); + if (perms == null) return true; + try { + boolean globalDefault = perms.has(Flags.valueOf(flagName), true); + return perms.playerHas(player, Flags.valueOf(flagName), globalDefault); + } catch (IllegalArgumentException ex) { + return true; } - return false; } } diff --git a/core/src/main/resources/paper-plugin.yml b/core/src/main/resources/paper-plugin.yml index 7821d635..b24de1ef 100644 --- a/core/src/main/resources/paper-plugin.yml +++ b/core/src/main/resources/paper-plugin.yml @@ -90,6 +90,10 @@ dependencies: load: BEFORE required: false join-classpath: true + HuskClaims: + load: BEFORE + required: false + join-classpath: true # World Management Plugins Multiverse-Core: diff --git a/core/src/main/resources/plugin.yml b/core/src/main/resources/plugin.yml index 6ca810df..258ff3bb 100644 --- a/core/src/main/resources/plugin.yml +++ b/core/src/main/resources/plugin.yml @@ -30,6 +30,7 @@ softdepend: - minePlots - PlotSquared - Residence + - HuskClaims # World Management Plugins - Multiverse-Core