From 2be1fe3cb848b2cfa517c5844e246edb9b580aff Mon Sep 17 00:00:00 2001 From: SamB440 Date: Sun, 5 Jun 2022 22:05:15 +0100 Subject: [PATCH] feature: Add %rpgregions_region_timed%, fix: timed regions being timed globally instead of individually --- .../data/account/RPGRegionsAccount.java | 16 ++++++++++ .../rpgregions/translation/Translations.java | 3 +- api/src/main/resources/lang/en_gb.yml | 3 +- .../hooks/PlaceholderRegionHook.java | 32 +++++++++++++++++++ .../rpgregions/listener/RegionListener.java | 13 +++----- 5 files changed, 56 insertions(+), 11 deletions(-) diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java index d132a32..84611e0 100644 --- a/api/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java @@ -3,8 +3,10 @@ package net.islandearth.rpgregions.managers.data.account; import net.islandearth.rpgregions.managers.data.region.Discovery; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; public class RPGRegionsAccount { @@ -12,11 +14,13 @@ public class RPGRegionsAccount { private final UUID uuid; private final Map discoveredRegions; private final List cooldowns; + private final Map secondsInRegion; public RPGRegionsAccount(UUID uuid, Map discoveredRegions) { this.uuid = uuid; this.discoveredRegions = discoveredRegions; this.cooldowns = new ArrayList<>(); + this.secondsInRegion = new HashMap<>(); } public UUID getUuid() { @@ -35,6 +39,18 @@ public class RPGRegionsAccount { return cooldowns; } + public Optional getStartTimeInRegion(String region) { + return Optional.ofNullable(secondsInRegion.getOrDefault(region, null)); + } + + public void addStartTimeInRegion(String region, long time) { + secondsInRegion.put(region, time); + } + + public void removeStartTimeInRegion(String region) { + secondsInRegion.remove(region); + } + public enum AccountCooldown { ICON_COMMAND, TELEPORT diff --git a/api/src/main/java/net/islandearth/rpgregions/translation/Translations.java b/api/src/main/java/net/islandearth/rpgregions/translation/Translations.java index 6be0fe7..e8b97b7 100644 --- a/api/src/main/java/net/islandearth/rpgregions/translation/Translations.java +++ b/api/src/main/java/net/islandearth/rpgregions/translation/Translations.java @@ -36,7 +36,8 @@ public enum Translations { EXIT_LORE(TranslationKey.of("exit_lore")), CANNOT_ENTER(TranslationKey.of("cannot_enter")), COOLDOWN(TranslationKey.of("cooldown")), - REGION_ENTER_ACTIONBAR(TranslationKey.of("region_enter_actionbar")); + REGION_ENTER_ACTIONBAR(TranslationKey.of("region_enter_actionbar")), + DISCOVERING_AREA_PLACEHOLDER(TranslationKey.of("discovering_area_placeholder")); private final TranslationKey key; private final boolean isList; diff --git a/api/src/main/resources/lang/en_gb.yml b/api/src/main/resources/lang/en_gb.yml index 60e2d10..8d847ef 100644 --- a/api/src/main/resources/lang/en_gb.yml +++ b/api/src/main/resources/lang/en_gb.yml @@ -23,4 +23,5 @@ next_page_lore: exit_lore: - "&fExit the GUI" cooldown: "&cThat is currently on cooldown." -region_enter_actionbar: "&a%0" \ No newline at end of file +region_enter_actionbar: "&a%0" +discovering_area_placeholder: "&6Discovering a new area (%0%)..." \ No newline at end of file diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/hooks/PlaceholderRegionHook.java b/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/hooks/PlaceholderRegionHook.java index 0d59460..67bdc05 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/hooks/PlaceholderRegionHook.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/hooks/PlaceholderRegionHook.java @@ -3,11 +3,14 @@ package net.islandearth.rpgregions.api.integrations.hooks; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; +import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import net.islandearth.rpgregions.thread.Blocking; import net.islandearth.rpgregions.translation.Translations; import org.bukkit.entity.Player; +import java.util.Optional; import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; public class PlaceholderRegionHook extends PlaceholderExpansion implements Blocking { @@ -84,6 +87,35 @@ public class PlaceholderRegionHook extends PlaceholderExpansion implements Block } case "region_total": return String.valueOf(plugin.getManagers().getRegionsCache().getConfiguredRegions().size()); + case "region_timed": { + final Optional region = plugin.getManagers().getIntegrationManager().getPrioritisedRegion(player.getLocation()); + if (region.isEmpty()) { + return Translations.UNKNOWN_REGION.get(player).get(0); + } + + final ConfiguredRegion configuredRegion = region.get(); + if (!configuredRegion.isTimedRegion()) return region.get().getCustomName(); + + // We have to do a blocking operation :( + try { + RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).get(); + if (account.getDiscoveredRegions().containsKey(region.get().getId())) { + return region.get().getCustomName(); + } + + final Optional startTimeInRegion = account.getStartTimeInRegion(region.get().getId()); + if (startTimeInRegion.isEmpty()) return region.get().getCustomName(); + + final double entry = startTimeInRegion.get(); + final double time = TimeUnit.MILLISECONDS.toSeconds((long) (System.currentTimeMillis() - entry)); + final double secondsInsideToDiscover = configuredRegion.getSecondsInsideToDiscover(); + final double percent = (time / secondsInsideToDiscover) * 100; + return Translations.DISCOVERING_AREA_PLACEHOLDER.get(player, (int) percent, region.get().getId()).get(0); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + default: return null; } 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 37fc3be..4747756 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java @@ -22,9 +22,7 @@ import org.bukkit.inventory.ItemStack; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -32,13 +30,11 @@ public class RegionListener implements Listener { private final RPGRegions plugin; private final List titleCooldown; - private final Map secondsInRegion; private final DateTimeFormatter format; public RegionListener(RPGRegions plugin) { this.plugin = plugin; this.titleCooldown = new ArrayList<>(); - this.secondsInRegion = new HashMap<>(); this.format = DateTimeFormatter.ofPattern(plugin.getConfig().getString("settings.server.discoveries.date.format")); } @@ -73,15 +69,14 @@ public class RegionListener implements Listener { 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 (!secondsInRegion.containsKey(player.getUniqueId())) { - secondsInRegion.put(player.getUniqueId(), currentTimeMillis); + if (account.getStartTimeInRegion(region).isEmpty()) { + account.addStartTimeInRegion(region, currentTimeMillis); } - final long entry = secondsInRegion.get(player.getUniqueId()); + final long entry = account.getStartTimeInRegion(region).get(); long time = TimeUnit.MILLISECONDS.toSeconds(currentTimeMillis - entry); final int secondsInsideToDiscover = configuredRegion.getSecondsInsideToDiscover(); if (time < secondsInsideToDiscover) { @@ -91,7 +86,7 @@ public class RegionListener implements Listener { } // Remove as we are now discovering it. - secondsInRegion.remove(player.getUniqueId()); + account.removeStartTimeInRegion(region); plugin.debug("Discovering region."); LocalDateTime date = LocalDateTime.now();