diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/DependencyRequirement.java b/api/src/main/java/net/islandearth/rpgregions/requirements/DependencyRequirement.java new file mode 100644 index 0000000..2558b11 --- /dev/null +++ b/api/src/main/java/net/islandearth/rpgregions/requirements/DependencyRequirement.java @@ -0,0 +1,47 @@ +package net.islandearth.rpgregions.requirements; + +import com.google.common.collect.ImmutableList; +import org.bukkit.entity.Player; + +import java.util.Arrays; +import java.util.List; + +public class DependencyRequirement extends RegionRequirement { + + private final List requiredRegions; + + public DependencyRequirement(List requiredRegions) { + this.requiredRegions = requiredRegions; + } + + /** + * Returns an immutable list of required regions by their ID. + * @return immutable list of required regions + */ + public ImmutableList getRequiredRegions() { + return ImmutableList.copyOf(requiredRegions); + } + + public boolean meetsRequirements(Player player, List discoveries) { + for (String discovery : discoveries) { + if (!requiredRegions.contains(discovery)) return false; + } + return true; + } + + @Override + @Deprecated + public boolean meetsRequirements(Player player) { + return meetsRequirements(player, Arrays.asList()); + } + + @Override + public String getName() { + return "Dependency"; + } + + @Override + public String getText(Player player) { + return "regions " + String.join(", ", requiredRegions); + } +} diff --git a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/griefprevention/GriefPreventionIntegration.java b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/griefprevention/GriefPreventionIntegration.java index 64a7fb2..7c141f2 100644 --- a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/griefprevention/GriefPreventionIntegration.java +++ b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/griefprevention/GriefPreventionIntegration.java @@ -1,13 +1,12 @@ package net.islandearth.rpgregions.api.integrations.griefprevention; -import com.bekvon.bukkit.residence.Residence; -import com.bekvon.bukkit.residence.protection.ClaimedResidence; import me.ryanhamshire.GriefPrevention.Claim; import me.ryanhamshire.GriefPrevention.GriefPrevention; import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.requirements.DependencyRequirement; import net.islandearth.rpgregions.requirements.RegionRequirement; import net.islandearth.rpgregions.translation.Translations; import org.bukkit.Bukkit; @@ -44,10 +43,27 @@ public class GriefPreventionIntegration implements IntegrationManager { ConfiguredRegion configuredRegion = plugin.getManagers().getRegionsCache().getConfiguredRegion("" + claim.getID()); if (configuredRegion != null && configuredRegion.getRequirements() != null) { for (RegionRequirement requirement : configuredRegion.getRequirements()) { - if (!player.hasPermission("rpgregions.bypassentry") && !requirement.meetsRequirements(player)) { - requirement.getPreventType().prevent(pme); - Translations.CANNOT_ENTER.send(player, requirement.getText(player)); - return; + if (requirement instanceof DependencyRequirement) { + DependencyRequirement dependencyRequirement = (DependencyRequirement) requirement; + List discoveries = new ArrayList<>(); + RPGRegions.getAPI().getManagers().getStorageManager().getAccount(player.getUniqueId()).whenComplete((account, error) -> { + discoveries.addAll(account.getDiscoveredRegions().keySet()); + }).exceptionally(error -> { + error.printStackTrace(); + return null; + }); + + if (!player.hasPermission("rpgregions.bypassentry") && !dependencyRequirement.meetsRequirements(player, discoveries)) { + requirement.getPreventType().prevent(pme); + Translations.CANNOT_ENTER.send(player, requirement.getText(player)); + return; + } + } else { + if (!player.hasPermission("rpgregions.bypassentry") && !requirement.meetsRequirements(player)) { + requirement.getPreventType().prevent(pme); + Translations.CANNOT_ENTER.send(player, requirement.getText(player)); + return; + } } } } diff --git a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/residence/ResidenceIntegration.java b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/residence/ResidenceIntegration.java index 43cbdb7..ac49985 100644 --- a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/residence/ResidenceIntegration.java +++ b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/residence/ResidenceIntegration.java @@ -6,6 +6,7 @@ import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.requirements.DependencyRequirement; import net.islandearth.rpgregions.requirements.RegionRequirement; import net.islandearth.rpgregions.translation.Translations; import org.bukkit.Bukkit; @@ -42,10 +43,27 @@ public class ResidenceIntegration implements IntegrationManager { ConfiguredRegion configuredRegion = plugin.getManagers().getRegionsCache().getConfiguredRegion(residence.getName()); if (configuredRegion != null && configuredRegion.getRequirements() != null) { for (RegionRequirement requirement : configuredRegion.getRequirements()) { - if (!player.hasPermission("rpgregions.bypassentry") && !requirement.meetsRequirements(player)) { - requirement.getPreventType().prevent(pme); - Translations.CANNOT_ENTER.send(player, requirement.getText(player)); - return; + if (requirement instanceof DependencyRequirement) { + DependencyRequirement dependencyRequirement = (DependencyRequirement) requirement; + List discoveries = new ArrayList<>(); + RPGRegions.getAPI().getManagers().getStorageManager().getAccount(player.getUniqueId()).whenComplete((account, error) -> { + discoveries.addAll(account.getDiscoveredRegions().keySet()); + }).exceptionally(error -> { + error.printStackTrace(); + return null; + }); + + if (!player.hasPermission("rpgregions.bypassentry") && !dependencyRequirement.meetsRequirements(player, discoveries)) { + requirement.getPreventType().prevent(pme); + Translations.CANNOT_ENTER.send(player, requirement.getText(player)); + return; + } + } else { + if (!player.hasPermission("rpgregions.bypassentry") && !requirement.meetsRequirements(player)) { + requirement.getPreventType().prevent(pme); + Translations.CANNOT_ENTER.send(player, requirement.getText(player)); + return; + } } } } diff --git a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardIntegration.java b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardIntegration.java index 209fc22..9a54722 100644 --- a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardIntegration.java +++ b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardIntegration.java @@ -8,6 +8,7 @@ import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.requirements.DependencyRequirement; import net.islandearth.rpgregions.requirements.RegionRequirement; import net.islandearth.rpgregions.translation.Translations; import org.bukkit.Bukkit; @@ -50,10 +51,27 @@ public class WorldGuardIntegration implements IntegrationManager { ConfiguredRegion configuredRegion = plugin.getManagers().getRegionsCache().getConfiguredRegion(region.getId()); if (configuredRegion != null && configuredRegion.getRequirements() != null) { for (RegionRequirement requirement : configuredRegion.getRequirements()) { - if (!player.hasPermission("rpgregions.bypassentry") && !requirement.meetsRequirements(player)) { - requirement.getPreventType().prevent(pme); - Translations.CANNOT_ENTER.send(player, requirement.getText(player)); - return; + if (requirement instanceof DependencyRequirement) { + DependencyRequirement dependencyRequirement = (DependencyRequirement) requirement; + List discoveries = new ArrayList<>(); + RPGRegions.getAPI().getManagers().getStorageManager().getAccount(player.getUniqueId()).whenComplete((account, error) -> { + discoveries.addAll(account.getDiscoveredRegions().keySet()); + }).exceptionally(error -> { + error.printStackTrace(); + return null; + }); + + if (!player.hasPermission("rpgregions.bypassentry") && !dependencyRequirement.meetsRequirements(player, discoveries)) { + requirement.getPreventType().prevent(pme); + Translations.CANNOT_ENTER.send(player, requirement.getText(player)); + return; + } + } else { + if (!player.hasPermission("rpgregions.bypassentry") && !requirement.meetsRequirements(player)) { + requirement.getPreventType().prevent(pme); + Translations.CANNOT_ENTER.send(player, requirement.getText(player)); + return; + } } } }