diff --git a/src/main/java/world/bentobox/limits/Limits.java b/src/main/java/world/bentobox/limits/Limits.java index b4ed394..5a9f089 100644 --- a/src/main/java/world/bentobox/limits/Limits.java +++ b/src/main/java/world/bentobox/limits/Limits.java @@ -1,12 +1,17 @@ package world.bentobox.limits; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import org.bukkit.Material; import org.bukkit.World; +import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.api.addons.Addon; import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.database.objects.Island; import world.bentobox.limits.commands.AdminCommand; import world.bentobox.limits.commands.PlayerCommand; import world.bentobox.limits.listeners.BlockLimitsListener; @@ -48,6 +53,7 @@ public class Limits extends Addon { // Register commands gm.getAdminCommand().ifPresent(a -> new AdminCommand(this, a)); gm.getPlayerCommand().ifPresent(a -> new PlayerCommand(this, a)); + registerPlaceholders(gm); log("Limits will apply to " + gm.getDescription().getName()); } ); @@ -125,4 +131,64 @@ public class Limits extends Addon { return joinListener; } + private void registerPlaceholders(GameModeAddon gm) { + if (getPlugin().getPlaceholdersManager() == null) return; + Arrays.stream(Material.values()) + .filter(m -> m.isBlock()) + .forEach(m -> registerCountAndLimitPlaceholders(m, gm)); + } + + /** + * Registers placeholders for the count and limit of the material + * in the format of %Limits_(gamemode prefix)_island_(lowercase material name)_count% + * and %Limits_(gamemode prefix)_island_(lowercase material name)_limit% + * + * Example: registerCountAndLimitPlaceholders("HOPPER", gm); + * Placeholders: + * "Limits_bskyblock_island_hopper_count" + * "Limits_bskyblock_island_hopper_limit" + * + * @param m + * @param gm + */ + private void registerCountAndLimitPlaceholders(Material m, GameModeAddon gm) { + getPlugin().getPlaceholdersManager().registerPlaceholder(this, + gm.getDescription().getName().toLowerCase() + "_island_" + m.toString().toLowerCase() + "_count", + user -> String.valueOf(getCount(user, m, gm))); + getPlugin().getPlaceholdersManager().registerPlaceholder(this, + gm.getDescription().getName().toLowerCase() + "_island_" + m.toString().toLowerCase() + "_limit", + user -> getLimit(user, m, gm)); + } + + /** + * @param user - Used to identify the island the user belongs to + * @param m - The material we are trying to count on the island + * @param gm + * @return Number of blocks of the specified material on the given user's island + */ + private int getCount(@Nullable User user, Material m, GameModeAddon gm) { + Island is = gm.getIslands().getIsland(gm.getOverWorld(), user); + if (is == null) { + return 0; + } + return getBlockLimitListener().getIsland(gm.getIslands().getIsland(gm.getOverWorld(), user).getUniqueId()). + getBlockCount(m); + } + + /** + * @param user - Used to identify the island the user belongs to + * @param m - The material whose limit we are querying + * @param gm + * @return The limit of the specified material on the given user's island + */ + private String getLimit(@Nullable User user, Material m, GameModeAddon gm) { + Island is = gm.getIslands().getIsland(gm.getOverWorld(), user); + if (is == null) { + return "Limit not set"; + } + int limit = getBlockLimitListener().getIsland(gm.getIslands().getIsland(gm.getOverWorld(), user).getUniqueId()). + getBlockLimit(m); + return limit == -1 ? "Limit not set" : String.valueOf(limit); + } + } diff --git a/src/main/java/world/bentobox/limits/commands/LimitTab.java b/src/main/java/world/bentobox/limits/commands/LimitTab.java index f21f035..62782ab 100644 --- a/src/main/java/world/bentobox/limits/commands/LimitTab.java +++ b/src/main/java/world/bentobox/limits/commands/LimitTab.java @@ -179,7 +179,7 @@ public class LimitTab implements Tab { // Adjust icon pib.icon(B2M.getOrDefault(en.getKey(), en.getKey())); - int count = ibc == null ? 0 : ibc.getBlockCount().getOrDefault(en.getKey(), 0); + int count = ibc == null ? 0 : ibc.getBlockCounts().getOrDefault(en.getKey(), 0); String color = count >= en.getValue() ? user.getTranslation("island.limits.max-color") : user.getTranslation("island.limits.regular-color"); pib.description(color + user.getTranslation("island.limits.block-limit-syntax", diff --git a/src/main/java/world/bentobox/limits/commands/LimitsCalc.java b/src/main/java/world/bentobox/limits/commands/LimitsCalc.java index 056b414..24f6c65 100644 --- a/src/main/java/world/bentobox/limits/commands/LimitsCalc.java +++ b/src/main/java/world/bentobox/limits/commands/LimitsCalc.java @@ -143,7 +143,7 @@ public class LimitsCalc { if (ibc == null) { ibc = new IslandBlockCount(); } - ibc.setBlockCount(blockCount.entrySet().stream() + ibc.setBlockCounts(blockCount.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> entry.getValue().get()))); diff --git a/src/main/java/world/bentobox/limits/listeners/BlockLimitsListener.java b/src/main/java/world/bentobox/limits/listeners/BlockLimitsListener.java index 70895bd..f9defaa 100644 --- a/src/main/java/world/bentobox/limits/listeners/BlockLimitsListener.java +++ b/src/main/java/world/bentobox/limits/listeners/BlockLimitsListener.java @@ -85,7 +85,7 @@ public class BlockLimitsListener implements Listener { handler.loadObjects().forEach(ibc -> { // Clean up if (addon.isCoveredGameMode(ibc.getGameMode())) { - ibc.getBlockCount().keySet().removeIf(DO_NOT_COUNT::contains); + ibc.getBlockCounts().keySet().removeIf(DO_NOT_COUNT::contains); // Store islandCountMap.put(ibc.getUniqueId(), ibc); } else { diff --git a/src/main/java/world/bentobox/limits/objects/IslandBlockCount.java b/src/main/java/world/bentobox/limits/objects/IslandBlockCount.java index df79857..3a357ea 100644 --- a/src/main/java/world/bentobox/limits/objects/IslandBlockCount.java +++ b/src/main/java/world/bentobox/limits/objects/IslandBlockCount.java @@ -26,7 +26,7 @@ public class IslandBlockCount implements DataObject { private String gameMode = ""; @Expose - private Map blockCount = new EnumMap<>(Material.class); + private Map blockCounts = new EnumMap<>(Material.class); private boolean changed; @@ -74,24 +74,33 @@ public class IslandBlockCount implements DataObject { /** * @return the blockCount */ - public Map getBlockCount() { - return blockCount; + public Map getBlockCounts() { + return blockCounts; } /** - * @param blockCount the blockCount to set + * @param blockCounts the blockCount to set */ - public void setBlockCount(Map blockCount) { - this.blockCount = blockCount; + public void setBlockCounts(Map blockCounts) { + this.blockCounts = blockCounts; setChanged(); } + /** + * Get the block count for this material for this island + * @param m - material + * @return count + */ + public Integer getBlockCount(Material m) { + return blockCounts.getOrDefault(m, 0); + } + /** * Add a material to the count * @param material - material */ public void add(Material material) { - blockCount.merge(material, 1, Integer::sum); + blockCounts.merge(material, 1, Integer::sum); setChanged(); } @@ -100,8 +109,8 @@ public class IslandBlockCount implements DataObject { * @param material - material */ public void remove(Material material) { - blockCount.put(material, blockCount.getOrDefault(material, 0) - 1); - blockCount.values().removeIf(v -> v <= 0); + blockCounts.put(material, blockCounts.getOrDefault(material, 0) - 1); + blockCounts.values().removeIf(v -> v <= 0); setChanged(); } @@ -112,7 +121,7 @@ public class IslandBlockCount implements DataObject { * @return true if count is >= limit */ public boolean isAtLimit(Material material, int limit) { - return blockCount.getOrDefault(material, 0) >= limit; + return blockCounts.getOrDefault(material, 0) >= limit; } /** @@ -122,7 +131,7 @@ public class IslandBlockCount implements DataObject { */ public boolean isAtLimit(Material m) { // Check island limits first - return blockLimits.containsKey(m) && blockCount.getOrDefault(m, 0) >= blockLimits.get(m); + return blockLimits.containsKey(m) && blockCounts.getOrDefault(m, 0) >= blockLimits.get(m); } public boolean isBlockLimited(Material m) {