From 84ee81f25e45c973a0af567d6dcf31718b71f1cf Mon Sep 17 00:00:00 2001 From: SamB440 Date: Sun, 6 Nov 2022 20:21:55 +0000 Subject: [PATCH] Add passthrough setting to regions --- .../api/integrations/IntegrationManager.java | 3 +- .../data/region/ConfiguredRegion.java | 10 ++ .../GriefPreventionIntegration.java | 2 +- .../integrations/lands/LandsIntegration.java | 2 +- .../residence/ResidenceIntegration.java | 2 +- .../ultraregions/UltraRegionsIntegration.java | 2 +- .../worldguard/WorldGuardIntegration.java | 4 +- .../rpgregions/RPGRegionsIntegration.java | 4 +- .../rpgregions/region/RPGRegionsRegion.java | 5 + .../rpgregions/listener/RegionListener.java | 137 ++++++++++-------- 10 files changed, 100 insertions(+), 71 deletions(-) diff --git a/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java b/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java index f18afed..4a3e682 100644 --- a/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java +++ b/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java @@ -61,7 +61,8 @@ public interface IntegrationManager { */ Set getAllRegionNames(World world); - default boolean checkRequirements(PlayerMoveEvent event, String region) { + default boolean checkRequirements(PlayerMoveEvent event, ConfiguredRegion priority, String region) { + if (priority.disablesPassthrough() && !region.equals(priority.getId())) return true; Player player = event.getPlayer(); IRPGRegionsAPI plugin = RPGRegionsAPI.getAPI(); Optional configuredRegion = plugin.getManagers().getRegionsCache().getConfiguredRegion(region); diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java index 8310cd7..c7b208f 100644 --- a/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java @@ -78,6 +78,8 @@ public class ConfiguredRegion { private final String lineColour; @NeedsGUI private final boolean dynmap; private int secondsInsideToDiscover; + // If this is the prioritised region and disablePassthrough is set to true, only the prioritised region shall run + private boolean disablePassthrough; public ConfiguredRegion(@Nullable World world, String id, String customName, List rewards, List effects) { @@ -378,6 +380,14 @@ public class ConfiguredRegion { return secondsInsideToDiscover != 0; } + public boolean disablesPassthrough() { + return disablePassthrough; + } + + public void setDisablePassthrough(boolean disablePassthrough) { + this.disablePassthrough = disablePassthrough; + } + public File getFile(IRPGRegionsAPI plugin) { File file = null; try { 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 3c7e378..f71e78a 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 @@ -42,7 +42,7 @@ public class GriefPreventionIntegration implements IntegrationManager { if (oldClaim == null || claim == null) return; List stringClaim = new ArrayList<>(); - if (!checkRequirements(pme, "" + claim.getID())) return; + if (!checkRequirements(pme, getPrioritisedRegion(pme.getTo()).get(), "" + claim.getID())) return; stringClaim.add("" + claim.getID()); Bukkit.getPluginManager().callEvent(new RegionsEnterEvent(player, stringClaim, !oldClaim.equals(claim))); diff --git a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/lands/LandsIntegration.java b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/lands/LandsIntegration.java index 8856800..b7ea4e0 100644 --- a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/lands/LandsIntegration.java +++ b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/lands/LandsIntegration.java @@ -55,7 +55,7 @@ public class LandsIntegration implements IntegrationManager { Land oldLand = lands.getLand(pme.getFrom()); Land land = lands.getLand(pme.getTo()); if (oldLand == null || land == null || !land.exists()) return; - if (!checkRequirements(pme, land.getName())) return; + if (!checkRequirements(pme, getPrioritisedRegion(pme.getTo()).get(), land.getName())) return; Bukkit.getPluginManager().callEvent(new RegionsEnterEvent(player, land.getName(), !oldLand.equals(land))); } 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 5b9ac66..0198dc3 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 @@ -39,7 +39,7 @@ public class ResidenceIntegration implements IntegrationManager { ClaimedResidence oldResidence = Residence.getInstance().getResidenceManager().getByLoc(pme.getFrom()); ClaimedResidence residence = Residence.getInstance().getResidenceManager().getByLoc(pme.getTo()); if (oldResidence == null || residence == null) return; - if (!checkRequirements(pme, residence.getName())) return; + if (!checkRequirements(pme, getPrioritisedRegion(pme.getTo()).get(), residence.getName())) return; Bukkit.getPluginManager().callEvent(new RegionsEnterEvent(player, residence.getName(), !oldResidence.equals(residence))); } diff --git a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/ultraregions/UltraRegionsIntegration.java b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/ultraregions/UltraRegionsIntegration.java index 52a758c..f2cf393 100644 --- a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/ultraregions/UltraRegionsIntegration.java +++ b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/ultraregions/UltraRegionsIntegration.java @@ -51,7 +51,7 @@ public class UltraRegionsIntegration implements IntegrationManager { List stringRegions = new ArrayList<>(); regions.forEach(region -> { - if (checkRequirements(pme, region.getName())) stringRegions.add(region.getName()); + if (checkRequirements(pme, getPrioritisedRegion(pme.getTo()).get(), region.getName())) stringRegions.add(region.getName()); }); Bukkit.getPluginManager().callEvent(new RegionsEnterEvent(player, stringRegions, !oldRegions.equals(regions))); 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 94a526f..cb902a1 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 @@ -57,10 +57,10 @@ public class WorldGuardIntegration implements IntegrationManager { List stringRegions = new ArrayList<>(); regions.forEach(region -> { if (!prioritisedRegion.getId().equals(region.getId()) - && checkRequirements(pme, region.getId())) stringRegions.add(region.getId()); + && checkRequirements(pme, prioritisedRegion, region.getId())) stringRegions.add(region.getId()); }); - if (checkRequirements(pme, prioritisedRegion.getId())) { + if (checkRequirements(pme, prioritisedRegion, prioritisedRegion.getId())) { plugin.debug("Requirements passed, calling"); stringRegions.add(0, prioritisedRegion.getId()); Bukkit.getPluginManager().callEvent(new RegionsEnterEvent(player, stringRegions, !oldRegions.equals(regions))); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/RPGRegionsIntegration.java b/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/RPGRegionsIntegration.java index 8e00469..ad876ef 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/RPGRegionsIntegration.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/RPGRegionsIntegration.java @@ -119,10 +119,10 @@ public class RPGRegionsIntegration implements IntegrationManager { List stringRegions = new ArrayList<>(); regions.forEach(region -> { if (!prioritisedRegion.getId().equals(region.getName()) - && checkRequirements(pme, region.getName())) stringRegions.add(region.getName()); + && checkRequirements(pme, prioritisedRegion, region.getName())) stringRegions.add(region.getName()); }); - if (checkRequirements(pme, prioritisedRegion.getId())) { + if (checkRequirements(pme, prioritisedRegion, prioritisedRegion.getId())) { plugin.debug("Requirements passed, calling"); stringRegions.add(0, prioritisedRegion.getId()); Bukkit.getPluginManager().callEvent(new RegionsEnterEvent(player, stringRegions, !oldRegions.equals(regions))); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/region/RPGRegionsRegion.java b/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/region/RPGRegionsRegion.java index 85742f5..5d00bdc 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/region/RPGRegionsRegion.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/region/RPGRegionsRegion.java @@ -47,4 +47,9 @@ public abstract class RPGRegionsRegion { } public abstract boolean isWithinBounds(final Location location); + + @Override + public String toString() { + return "{name=" + name + ", priority=" + priority + ", points=" + points + "}"; + } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java b/rpgregions/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java index a9f858a..86d04c1 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java @@ -4,6 +4,7 @@ import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.api.events.RegionDiscoverEvent; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.managers.data.IRPGRegionsCache; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import net.islandearth.rpgregions.managers.data.region.Discovery; import net.islandearth.rpgregions.managers.data.region.WorldDiscovery; @@ -24,6 +25,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -46,76 +48,87 @@ public class RegionListener implements Listener { public void onEnter(RegionsEnterEvent event) { Player player = event.getPlayer(); plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).thenAccept(account -> { + final Optional prioritised = plugin.getManagers().getRegionsCache().getConfiguredRegion(event.getPriority()); + if (prioritised.isPresent() && prioritised.get().disablesPassthrough()) { + plugin.debug("Checking prioritised region only: " + event.getPriority()); + runRegionCheck(player, event.getPriority(), prioritised.get(), event, account); + return; + } + for (String region : event.getRegions()) { plugin.debug("Checking region: " + region); plugin.getManagers().getRegionsCache().getConfiguredRegion(region).ifPresent(configuredRegion -> { - boolean has = false; - boolean prioritised = event.getPriority().equals(region); - for (Discovery discoveredRegion : account.getDiscoveredRegions().values()) { - if (discoveredRegion.getRegion().equals(region)) { - has = true; - break; - } - } - plugin.debug("Has the player discovered this region? " + has); - plugin.debug("Is this the prioritised region? " + prioritised); - - Bukkit.getScheduler().runTask(plugin, () -> this.checkEffects(configuredRegion, player)); - - if (configuredRegion.alwaysShowTitles() && event.hasChanged() && has && prioritised) { - this.sendTitles(player, configuredRegion, false); - } - - if (configuredRegion.showActionbar() && event.hasChanged() && prioritised) { - player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(Translations.REGION_ENTER_ACTIONBAR.get(player, configuredRegion.getCustomName()).get(0))); - } - - if (!has && configuredRegion.isDiscoverable() && prioritised) { - if (configuredRegion.isTimedRegion()) { - final long currentTimeMillis = System.currentTimeMillis(); - if (account.getTimeEntryInRegion(region).isEmpty()) { - account.addTimeEntryInRegion(region, currentTimeMillis); - } - - final TimeEntry entry = account.getTimeEntryInRegion(region).get(); - long lostTime = System.currentTimeMillis() - entry.getLatestEntry(); - if (lostTime >= 1000) { - entry.setStart(entry.getStart() + lostTime); - - plugin.debug("Lost time from standing still: " + lostTime); - } - - long time = TimeUnit.MILLISECONDS.toSeconds(currentTimeMillis - entry.getStart()); - entry.setLatestEntry(currentTimeMillis); - - final int secondsInsideToDiscover = configuredRegion.getSecondsInsideToDiscover(); - if (time < secondsInsideToDiscover) { - plugin.debug(String.format("Unable to discover region for %s because they have not reached the time requirement (c: %d, e: %d, t: %d).", player.getName(), secondsInsideToDiscover, entry, time)); - return; - } - } - - // Remove as we are now discovering it. - account.removeStartTimeInRegion(region); - - plugin.debug("Discovering region."); - LocalDateTime date = LocalDateTime.now(); - String formattedDate = date.format(format); - Discovery discovery = new WorldDiscovery(formattedDate, region); - account.addDiscovery(discovery); - Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, region, discovery)); - } else if (prioritised && configuredRegion.isDiscoverable() && has) { - if (configuredRegion.getRewards() != null) configuredRegion.getRewards().forEach(reward -> { - if (reward.isAlwaysAward() && reward.canAward()) { - reward.award(player); - } - }); - } + runRegionCheck(player, region, configuredRegion, event, account); }); } }); } + private void runRegionCheck(Player player, String region, ConfiguredRegion configuredRegion, RegionsEnterEvent event, RPGRegionsAccount account) { + boolean has = false; + boolean prioritised = event.getPriority().equals(region); + for (Discovery discoveredRegion : account.getDiscoveredRegions().values()) { + if (discoveredRegion.getRegion().equals(region)) { + has = true; + break; + } + } + plugin.debug("Has the player discovered this region? " + has); + plugin.debug("Is this the prioritised region? " + prioritised); + + Bukkit.getScheduler().runTask(plugin, () -> this.checkEffects(configuredRegion, player)); + + if (configuredRegion.alwaysShowTitles() && event.hasChanged() && has && prioritised) { + this.sendTitles(player, configuredRegion, false); + } + + if (configuredRegion.showActionbar() && event.hasChanged() && prioritised) { + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(Translations.REGION_ENTER_ACTIONBAR.get(player, configuredRegion.getCustomName()).get(0))); + } + + if (!has && configuredRegion.isDiscoverable() && prioritised) { + if (configuredRegion.isTimedRegion()) { + final long currentTimeMillis = System.currentTimeMillis(); + if (account.getTimeEntryInRegion(region).isEmpty()) { + account.addTimeEntryInRegion(region, currentTimeMillis); + } + + final TimeEntry entry = account.getTimeEntryInRegion(region).get(); + long lostTime = System.currentTimeMillis() - entry.getLatestEntry(); + if (lostTime >= 1000) { + entry.setStart(entry.getStart() + lostTime); + + plugin.debug("Lost time from standing still: " + lostTime); + } + + long time = TimeUnit.MILLISECONDS.toSeconds(currentTimeMillis - entry.getStart()); + entry.setLatestEntry(currentTimeMillis); + + final int secondsInsideToDiscover = configuredRegion.getSecondsInsideToDiscover(); + if (time < secondsInsideToDiscover) { + plugin.debug(String.format("Unable to discover region for %s because they have not reached the time requirement (c: %d, e: %d, t: %d).", player.getName(), secondsInsideToDiscover, entry, time)); + return; + } + } + + // Remove as we are now discovering it. + account.removeStartTimeInRegion(region); + + plugin.debug("Discovering region."); + LocalDateTime date = LocalDateTime.now(); + String formattedDate = date.format(format); + Discovery discovery = new WorldDiscovery(formattedDate, region); + account.addDiscovery(discovery); + Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, region, discovery)); + } else if (prioritised && configuredRegion.isDiscoverable() && has) { + if (configuredRegion.getRewards() != null) configuredRegion.getRewards().forEach(reward -> { + if (reward.isAlwaysAward() && reward.canAward()) { + reward.award(player); + } + }); + } + } + @EventHandler public void onDiscover(RegionDiscoverEvent rde) { Player player = rde.getPlayer();