diff --git a/src/main/java/world/bentobox/level/Level.java b/src/main/java/world/bentobox/level/Level.java index 06bd690..2cf79c3 100644 --- a/src/main/java/world/bentobox/level/Level.java +++ b/src/main/java/world/bentobox/level/Level.java @@ -36,8 +36,8 @@ import world.bentobox.level.config.BlockConfig; import world.bentobox.level.config.ConfigSettings; import world.bentobox.level.listeners.IslandActivitiesListeners; import world.bentobox.level.listeners.JoinLeaveListener; -import world.bentobox.level.objects.IslandLevels; import world.bentobox.level.listeners.MigrationListener; +import world.bentobox.level.objects.IslandLevels; import world.bentobox.level.objects.LevelsData; import world.bentobox.level.objects.TopTenData; import world.bentobox.level.requests.LevelRequestHandler; @@ -176,20 +176,14 @@ public class Level extends Addon { { this.visitHook = (VisitAddon) addon; this.log("Level Addon hooked into Visit addon."); - }, () -> - { - this.visitHook = null; - }); + }, () -> this.visitHook = null); // Try to find Warps addon and if it does not exist, display a warning this.getAddonByName("Warps").ifPresentOrElse(addon -> { this.warpHook = (Warp) addon; this.log("Level Addon hooked into Warps addon."); - }, () -> - { - this.warpHook = null; - }); + }, () -> this.warpHook = null); } @@ -230,9 +224,9 @@ public class Level extends Addon { getPlugin().getPlaceholdersManager().registerPlaceholder(this, gm.getDescription().getName().toLowerCase() + "_island_total_points", user -> { - IslandLevels data = getManager().getLevelsData(this.getIslands().getIsland(gm.getOverWorld(), user)); - return data.getTotalPoints()+""; - }); + IslandLevels data = getManager().getLevelsData(this.getIslands().getIsland(gm.getOverWorld(), user)); + return data.getTotalPoints()+""; + }); getPlugin().getPlaceholdersManager().registerPlaceholder(this, gm.getDescription().getName().toLowerCase() + "_points_to_next_level", @@ -478,7 +472,7 @@ public class Level extends Addon { * @param playerUUID - the target island member's UUID * @deprecated Do not use this anymore. Use getManager().calculateLevel(playerUUID, island) */ - @Deprecated + @Deprecated(since="2.3.0", forRemoval=true) public void calculateIslandLevel(World world, @Nullable User user, @NonNull UUID playerUUID) { Island island = getIslands().getIsland(world, playerUUID); if (island != null) getManager().calculateLevel(playerUUID, island); @@ -490,7 +484,7 @@ public class Level extends Addon { * @return LevelsData object or null if not found. Only island levels are set! * @deprecated Do not use this anymore. Use {@link #getIslandLevel(World, UUID)} */ - @Deprecated + @Deprecated(since="2.3.0", forRemoval=true) public LevelsData getLevelsData(UUID targetPlayer) { LevelsData ld = new LevelsData(targetPlayer); getPlugin().getAddonsManager().getGameModeAddons().stream() diff --git a/src/main/java/world/bentobox/level/LevelsManager.java b/src/main/java/world/bentobox/level/LevelsManager.java index 4c09796..e40ba49 100644 --- a/src/main/java/world/bentobox/level/LevelsManager.java +++ b/src/main/java/world/bentobox/level/LevelsManager.java @@ -152,8 +152,6 @@ public class LevelsManager { addon.getPipeliner().addIsland(island).thenAccept(r -> { // Results are irrelevant because the island is unowned or deleted, or IslandLevelCalcEvent is cancelled if (r == null || fireIslandLevelCalcEvent(targetPlayer, island, r)) { - System.out.println("results are null or event canceled"); - result.complete(null); } // Save result @@ -337,7 +335,7 @@ public class LevelsManager { .filter(e -> addon.getIslands().isOwner(world, e.getKey())) .filter(l -> l.getValue() > 0) .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())); - return stream.takeWhile(x -> !x.getKey().equals(uuid)).map(Map.Entry::getKey).collect(Collectors.toList()).size() + 1; + return (int) (stream.takeWhile(x -> !x.getKey().equals(uuid)).map(Map.Entry::getKey).count() + 1); } /** @@ -363,10 +361,7 @@ public class LevelsManager { addon.getIslands().getIslandById(il.getUniqueId()).ifPresent(i -> this.addToTopTen(i, il.getLevel())); } }); - topTenLists.keySet().forEach(w -> { - addon.log("Generated rankings for " + w.getName()); - }); - + topTenLists.keySet().forEach(w -> addon.log("Generated rankings for " + w.getName())); }); } diff --git a/src/main/java/world/bentobox/level/calculators/IslandLevelCalculator.java b/src/main/java/world/bentobox/level/calculators/IslandLevelCalculator.java index 35743c2..9d36dc8 100644 --- a/src/main/java/world/bentobox/level/calculators/IslandLevelCalculator.java +++ b/src/main/java/world/bentobox/level/calculators/IslandLevelCalculator.java @@ -1,11 +1,11 @@ package world.bentobox.level.calculators; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.EnumMap; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -65,9 +65,10 @@ public class IslandLevelCalculator { * @param str - equation to evaluate * @return value of equation */ - private static double eval(final String str) { + private static double eval(final String str) throws IOException { return new Object() { - int pos = -1, ch; + int pos = -1; + int ch; boolean eat(int charToEat) { while (ch == ' ') nextChar(); @@ -82,10 +83,10 @@ public class IslandLevelCalculator { ch = (++pos < str.length()) ? str.charAt(pos) : -1; } - double parse() { + double parse() throws IOException { nextChar(); double x = parseExpression(); - if (pos < str.length()) throw new RuntimeException("Unexpected: " + (char)ch); + if (pos < str.length()) throw new IOException("Unexpected: " + (char)ch); return x; } @@ -95,7 +96,7 @@ public class IslandLevelCalculator { // factor = `+` factor | `-` factor | `(` expression `)` // | number | functionName factor | factor `^` factor - double parseExpression() { + double parseExpression() throws IOException { double x = parseTerm(); for (;;) { if (eat('+')) x += parseTerm(); // addition @@ -104,7 +105,7 @@ public class IslandLevelCalculator { } } - double parseFactor() { + double parseFactor() throws IOException { if (eat('+')) return parseFactor(); // unary plus if (eat('-')) return -parseFactor(); // unary minus @@ -137,10 +138,10 @@ public class IslandLevelCalculator { x = Math.log(x); break; default: - throw new RuntimeException("Unknown function: " + func); + throw new IOException("Unknown function: " + func); } } else { - throw new RuntimeException("Unexpected: " + (char)ch); + throw new IOException("Unexpected: " + (char)ch); } if (eat('^')) x = Math.pow(x, parseFactor()); // exponentiation @@ -148,7 +149,7 @@ public class IslandLevelCalculator { return x; } - double parseTerm() { + double parseTerm() throws IOException { double x = parseFactor(); for (;;) { if (eat('*')) x *= parseFactor(); // multiplication @@ -161,7 +162,7 @@ public class IslandLevelCalculator { private final Level addon; private final Queue> chunksToCheck; private final Island island; - private final HashMap limitCount; + private final Map limitCount; private final CompletableFuture r; @@ -190,7 +191,7 @@ public class IslandLevelCalculator { results = new Results(); duration = System.currentTimeMillis(); chunksToCheck = getChunksToScan(island); - this.limitCount = new HashMap<>(addon.getBlockConfig().getBlockLimits()); + this.limitCount = new EnumMap<>(addon.getBlockConfig().getBlockLimits()); // Get the initial island level results.initialLevel.set(addon.getInitialIslandLevel(island)); // Set up the worlds @@ -221,7 +222,15 @@ public class IslandLevelCalculator { private long calculateLevel(long blockAndDeathPoints) { String calcString = addon.getSettings().getLevelCalc(); String withValues = calcString.replace("blocks", String.valueOf(blockAndDeathPoints)).replace("level_cost", String.valueOf(this.addon.getSettings().getLevelCost())); - return (long)eval(withValues) - (addon.getSettings().isZeroNewIslandLevels() ? results.initialLevel.get() : 0); + long evalWithValues; + try { + evalWithValues = (long)eval(withValues); + return evalWithValues - (addon.getSettings().isZeroNewIslandLevels() ? results.initialLevel.get() : 0); + + } catch (IOException e) { + addon.getPlugin().logStacktrace(e); + return 0L; + } } /** @@ -424,7 +433,7 @@ public class IslandLevelCalculator { private void scanChests(Chunk chunk) { // Count blocks in chests for (BlockState bs : chunk.getTileEntities()) { - if (bs instanceof Container) { + if (bs instanceof Container container) { if (addon.isAdvChestEnabled()) { AdvancedChest aChest = AdvancedChestsAPI.getChestManager().getAdvancedChest(bs.getLocation()); if (aChest != null && aChest.getChestType().getName().equals("NORMAL")) { @@ -437,7 +446,7 @@ public class IslandLevelCalculator { } } // Regular chest - ((Container)bs).getSnapshotInventory().forEach(this::countItemStack); + container.getSnapshotInventory().forEach(this::countItemStack); } } } @@ -513,7 +522,7 @@ public class IslandLevelCalculator { } // Hook for Wild Stackers (Blocks and Spawners Only) - this has to use the real chunk if (addon.isStackersEnabled() && (blockData.getMaterial().equals(Material.CAULDRON) || blockData.getMaterial().equals(Material.SPAWNER))) { - stackedBlocks.add(new Location(cp.world, x + cp.chunkSnapshot.getX() * 16,y,z + cp.chunkSnapshot.getZ() * 16)); + stackedBlocks.add(new Location(cp.world, (double)x + cp.chunkSnapshot.getX() * 16, y, (double)z + cp.chunkSnapshot.getZ() * 16)); } // Scan chests if (addon.getSettings().isIncludeChests() && CHESTS.contains(blockData.getMaterial())) { @@ -564,21 +573,21 @@ public class IslandLevelCalculator { } private Collection sortedReport(int total, Multiset materialCount) { - Collection r = new ArrayList<>(); + Collection result = new ArrayList<>(); Iterable> entriesSortedByCount = Multisets.copyHighestCountFirst(materialCount).entrySet(); for (Entry en : entriesSortedByCount) { Material type = en.getElement(); int value = getValue(type); - r.add(type.toString() + ":" + result.add(type.toString() + ":" + String.format("%,d", en.getCount()) + " blocks x " + value + " = " + (value * en.getCount())); total += (value * en.getCount()); } - r.add("Subtotal = " + total); - r.add(LINE_BREAK); - return r; + result.add("Subtotal = " + total); + result.add(LINE_BREAK); + return result; } @@ -638,7 +647,7 @@ public class IslandLevelCalculator { public void scanIsland(Pipeliner pipeliner) { // Scan the next chunk - scanNextChunk().thenAccept(r -> { + scanNextChunk().thenAccept(result -> { if (!Bukkit.isPrimaryThread()) { addon.getPlugin().logError("scanChunk not on Primary Thread!"); } @@ -653,7 +662,7 @@ public class IslandLevelCalculator { } return; } - if (Boolean.TRUE.equals(r) && !pipeliner.getTask().isCancelled()) { + if (Boolean.TRUE.equals(result) && !pipeliner.getTask().isCancelled()) { // scanNextChunk returns true if there are more chunks to scan scanIsland(pipeliner); } else { diff --git a/src/main/java/world/bentobox/level/commands/AdminTopRemoveCommand.java b/src/main/java/world/bentobox/level/commands/AdminTopRemoveCommand.java index 4e1c29a..b54ca3e 100644 --- a/src/main/java/world/bentobox/level/commands/AdminTopRemoveCommand.java +++ b/src/main/java/world/bentobox/level/commands/AdminTopRemoveCommand.java @@ -2,7 +2,6 @@ package world.bentobox.level.commands; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; @@ -60,6 +59,6 @@ public class AdminTopRemoveCommand extends CompositeCommand { @Override public Optional> tabComplete(User user, String alias, List args) { return Optional.of(addon.getManager().getTopTen(getWorld(), Level.TEN).keySet().stream().map(addon.getPlayers()::getName) - .filter(n -> !n.isEmpty()).collect(Collectors.toList())); + .filter(n -> !n.isEmpty()).toList()); } } diff --git a/src/main/java/world/bentobox/level/commands/IslandValueCommand.java b/src/main/java/world/bentobox/level/commands/IslandValueCommand.java index 7e04a53..e6de8e4 100644 --- a/src/main/java/world/bentobox/level/commands/IslandValueCommand.java +++ b/src/main/java/world/bentobox/level/commands/IslandValueCommand.java @@ -19,6 +19,7 @@ import world.bentobox.level.util.Utils; public class IslandValueCommand extends CompositeCommand { + private static final String MATERIAL = "[material]"; private final Level addon; @@ -45,7 +46,7 @@ public class IslandValueCommand extends CompositeCommand if (args.size() > 1) { this.showHelp(this, user); - return true; + return false; } if (args.isEmpty()) @@ -73,8 +74,8 @@ public class IslandValueCommand extends CompositeCommand if (material == null) { Utils.sendMessage(user, - user.getTranslation(this.getWorld(), "level.conversations.unknown-item", - "[material]", args.get(0))); + user.getTranslation(this.getWorld(), "level.conversations.unknown-item", + MATERIAL, args.get(0))); } else { @@ -98,24 +99,24 @@ public class IslandValueCommand extends CompositeCommand if (value != null) { Utils.sendMessage(user, - user.getTranslation(this.getWorld(), "level.conversations.value", - "[value]", String.valueOf(value), - "[material]", Utils.prettifyObject(material, user))); + user.getTranslation(this.getWorld(), "level.conversations.value", + "[value]", String.valueOf(value), + MATERIAL, Utils.prettifyObject(material, user))); double underWater = this.addon.getSettings().getUnderWaterMultiplier(); if (underWater > 1.0) { Utils.sendMessage(user, - user.getTranslation(this.getWorld(),"level.conversations.success-underwater", - "[value]", (underWater * value) + ""), - "[material]", Utils.prettifyObject(material, user)); + user.getTranslation(this.getWorld(),"level.conversations.success-underwater", + "[value]", (underWater * value) + ""), + MATERIAL, Utils.prettifyObject(material, user)); } } else { Utils.sendMessage(user, - user.getTranslation(this.getWorld(),"level.conversations.no-value")); + user.getTranslation(this.getWorld(),"level.conversations.no-value")); } } @@ -132,8 +133,8 @@ public class IslandValueCommand extends CompositeCommand } List options = new ArrayList<>(Arrays.stream(Material.values()). - filter(Material::isBlock). - map(Material::name).toList()); + filter(Material::isBlock). + map(Material::name).toList()); options.add("HAND"); diff --git a/src/main/java/world/bentobox/level/panels/DetailsPanel.java b/src/main/java/world/bentobox/level/panels/DetailsPanel.java index 5a13682..395e5ed 100644 --- a/src/main/java/world/bentobox/level/panels/DetailsPanel.java +++ b/src/main/java/world/bentobox/level/panels/DetailsPanel.java @@ -1,16 +1,23 @@ package world.bentobox.level.panels; -import com.google.common.base.Enums; +import java.io.File; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import org.bukkit.Material; import org.bukkit.World; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; -import java.io.File; -import java.util.*; -import java.util.stream.Collectors; + +import com.google.common.base.Enums; import lv.id.bonne.panelutils.PanelUtils; +import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.TemplatedPanel; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; @@ -18,7 +25,6 @@ import world.bentobox.bentobox.api.panels.builders.TemplatedPanelBuilder; import world.bentobox.bentobox.api.panels.reader.ItemTemplateRecord; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; -import world.bentobox.bentobox.hooks.LangUtilsHook; import world.bentobox.bentobox.util.Pair; import world.bentobox.level.Level; import world.bentobox.level.objects.IslandLevels; @@ -43,8 +49,8 @@ public class DetailsPanel * @param user User who opens panel */ private DetailsPanel(Level addon, - World world, - User user) + World world, + User user) { this.addon = addon; this.world = world; @@ -121,99 +127,93 @@ public class DetailsPanel switch (this.activeTab) { - case ALL_BLOCKS -> { - Map materialCountMap = new EnumMap<>(Material.class); + case ALL_BLOCKS -> { + Map materialCountMap = new EnumMap<>(Material.class); - materialCountMap.putAll(this.levelsData.getMdCount()); + materialCountMap.putAll(this.levelsData.getMdCount()); - // Add underwater blocks. - this.levelsData.getUwCount().forEach((material, count) -> { - materialCountMap.put(material, - materialCountMap.computeIfAbsent(material, key -> 0) + count); - }); + // Add underwater blocks. + this.levelsData.getUwCount().forEach((material, count) -> materialCountMap.put(material, + materialCountMap.computeIfAbsent(material, key -> 0) + count)); - materialCountMap.entrySet().stream().sorted((Map.Entry.comparingByKey())). - forEachOrdered(entry -> - this.materialCountList.add(new Pair<>(entry.getKey(), entry.getValue()))); - } - case ABOVE_SEA_LEVEL -> { - this.levelsData.getMdCount().entrySet().stream().sorted((Map.Entry.comparingByKey())). - forEachOrdered(entry -> - this.materialCountList.add(new Pair<>(entry.getKey(), entry.getValue()))); - } - case UNDERWATER -> { - this.levelsData.getUwCount().entrySet().stream().sorted((Map.Entry.comparingByKey())). - forEachOrdered(entry -> - this.materialCountList.add(new Pair<>(entry.getKey(), entry.getValue()))); - } - case SPAWNER -> { - int aboveWater = this.levelsData.getMdCount().getOrDefault(Material.SPAWNER, 0); - int underWater = this.levelsData.getUwCount().getOrDefault(Material.SPAWNER, 0); + materialCountMap.entrySet().stream().sorted((Map.Entry.comparingByKey())). + forEachOrdered(entry -> + this.materialCountList.add(new Pair<>(entry.getKey(), entry.getValue()))); + } + case ABOVE_SEA_LEVEL -> this.levelsData.getMdCount().entrySet().stream().sorted((Map.Entry.comparingByKey())) + .forEachOrdered(entry -> this.materialCountList.add(new Pair<>(entry.getKey(), entry.getValue()))); - // TODO: spawners need some touch... - this.materialCountList.add(new Pair<>(Material.SPAWNER, underWater + aboveWater)); - } + case UNDERWATER -> this.levelsData.getUwCount().entrySet().stream().sorted((Map.Entry.comparingByKey())) + .forEachOrdered(entry -> this.materialCountList.add(new Pair<>(entry.getKey(), entry.getValue()))); + + case SPAWNER -> { + int aboveWater = this.levelsData.getMdCount().getOrDefault(Material.SPAWNER, 0); + int underWater = this.levelsData.getUwCount().getOrDefault(Material.SPAWNER, 0); + + // TODO: spawners need some touch... + this.materialCountList.add(new Pair<>(Material.SPAWNER, underWater + aboveWater)); + } } Comparator> sorter; switch (this.activeFilter) { - case COUNT -> + case COUNT -> + { + sorter = (o1, o2) -> { - sorter = (o1, o2) -> - { - if (o1.getValue().equals(o2.getValue())) - { - String o1Name = Utils.prettifyObject(o1.getKey(), this.user); - String o2Name = Utils.prettifyObject(o2.getKey(), this.user); - - return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); - } - else - { - return Integer.compare(o2.getValue(), o1.getValue()); - } - }; - } - case VALUE -> - { - sorter = (o1, o2) -> - { - int blockLimit = this.addon.getBlockConfig().getBlockLimits().getOrDefault(o1.getKey(), 0); - int o1Count = blockLimit > 0 ? Math.min(o1.getValue(), blockLimit) : o1.getValue(); - - blockLimit = this.addon.getBlockConfig().getBlockLimits().getOrDefault(o2.getKey(), 0); - int o2Count = blockLimit > 0 ? Math.min(o2.getValue(), blockLimit) : o2.getValue(); - - long o1Value = (long) o1Count * - this.addon.getBlockConfig().getBlockValues().getOrDefault(o1.getKey(), 0); - long o2Value = (long) o2Count * - this.addon.getBlockConfig().getBlockValues().getOrDefault(o2.getKey(), 0); - - if (o1Value == o2Value) - { - String o1Name = Utils.prettifyObject(o1.getKey(), this.user); - String o2Name = Utils.prettifyObject(o2.getKey(), this.user); - - return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); - } - else - { - return Long.compare(o2Value, o1Value); - } - }; - } - default -> - { - sorter = (o1, o2) -> + if (o1.getValue().equals(o2.getValue())) { String o1Name = Utils.prettifyObject(o1.getKey(), this.user); String o2Name = Utils.prettifyObject(o2.getKey(), this.user); return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); - }; - } + } + else + { + return Integer.compare(o2.getValue(), o1.getValue()); + } + }; + } + case VALUE -> + { + sorter = (o1, o2) -> + { + int blockLimit = this.addon.getBlockConfig().getBlockLimits().getOrDefault(o1.getKey(), 0); + int o1Count = blockLimit > 0 ? Math.min(o1.getValue(), blockLimit) : o1.getValue(); + + blockLimit = this.addon.getBlockConfig().getBlockLimits().getOrDefault(o2.getKey(), 0); + int o2Count = blockLimit > 0 ? Math.min(o2.getValue(), blockLimit) : o2.getValue(); + + long o1Value = (long) o1Count * + this.addon.getBlockConfig().getBlockValues().getOrDefault(o1.getKey(), 0); + long o2Value = (long) o2Count * + this.addon.getBlockConfig().getBlockValues().getOrDefault(o2.getKey(), 0); + + if (o1Value == o2Value) + { + String o1Name = Utils.prettifyObject(o1.getKey(), this.user); + String o2Name = Utils.prettifyObject(o2.getKey(), this.user); + + return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); + } + else + { + return Long.compare(o2Value, o1Value); + } + }; + } + default -> + { + sorter = (o1, o2) -> + { + String o1Name = Utils.prettifyObject(o1.getKey(), this.user); + String o2Name = Utils.prettifyObject(o2.getKey(), this.user); + + return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); + }; + } } this.materialCountList.sort(sorter); @@ -222,9 +222,9 @@ public class DetailsPanel } -// --------------------------------------------------------------------- -// Section: Tab Button Type -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Tab Button Type + // --------------------------------------------------------------------- /** @@ -262,23 +262,21 @@ public class DetailsPanel List activeActions = new ArrayList<>(template.actions()); activeActions.removeIf(action -> - "VIEW".equalsIgnoreCase(action.actionType()) && this.activeTab == tab); + "VIEW".equalsIgnoreCase(action.actionType()) && this.activeTab == tab); // Add Click handler builder.clickHandler((panel, user, clickType, i) -> { for (ItemTemplateRecord.ActionRecords action : activeActions) { - if (clickType == action.clickType() || ClickType.UNKNOWN.equals(action.clickType())) + if ((clickType == action.clickType() || ClickType.UNKNOWN.equals(action.clickType())) + && "VIEW".equalsIgnoreCase(action.actionType())) { - if ("VIEW".equalsIgnoreCase(action.actionType())) - { - this.activeTab = tab; + this.activeTab = tab; - // Update filters. - this.updateFilters(); - this.build(); - } + // Update filters. + this.updateFilters(); + this.build(); } } @@ -287,10 +285,10 @@ public class DetailsPanel // Collect tooltips. List tooltips = activeActions.stream(). - filter(action -> action.tooltip() != null). - map(action -> this.user.getTranslation(this.world, action.tooltip())). - filter(text -> !text.isBlank()). - collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); + filter(action -> action.tooltip() != null). + map(action -> this.user.getTranslation(this.world, action.tooltip())). + filter(text -> !text.isBlank()). + collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); // Add tooltips. if (!tooltips.isEmpty()) @@ -398,10 +396,10 @@ public class DetailsPanel // Collect tooltips. List tooltips = activeActions.stream(). - filter(action -> action.tooltip() != null). - map(action -> this.user.getTranslation(this.world, action.tooltip())). - filter(text -> !text.isBlank()). - collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); + filter(action -> action.tooltip() != null). + map(action -> this.user.getTranslation(this.world, action.tooltip())). + filter(text -> !text.isBlank()). + collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); // Add tooltips. if (!tooltips.isEmpty()) @@ -417,9 +415,9 @@ public class DetailsPanel } -// --------------------------------------------------------------------- -// Section: Create common buttons -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Create common buttons + // --------------------------------------------------------------------- /** @@ -434,7 +432,7 @@ public class DetailsPanel long size = this.materialCountList.size(); if (size <= slot.amountMap().getOrDefault("BLOCK", 1) || - 1.0 * size / slot.amountMap().getOrDefault("BLOCK", 1) <= this.pageIndex + 1) + 1.0 * size / slot.amountMap().getOrDefault("BLOCK", 1) <= this.pageIndex + 1) { // There are no next elements return null; @@ -448,7 +446,7 @@ public class DetailsPanel { ItemStack clone = template.icon().clone(); - if ((Boolean) template.dataMap().getOrDefault("indexing", false)) + if (Boolean.TRUE.equals(template.dataMap().getOrDefault("indexing", false))) { clone.setAmount(nextPageIndex); } @@ -464,7 +462,7 @@ public class DetailsPanel if (template.description() != null) { builder.description(this.user.getTranslation(this.world, template.description(), - "[number]", String.valueOf(nextPageIndex))); + TextVariables.NUMBER, String.valueOf(nextPageIndex))); } // Add ClickHandler @@ -472,13 +470,11 @@ public class DetailsPanel { for (ItemTemplateRecord.ActionRecords action : template.actions()) { - if (clickType == action.clickType() || ClickType.UNKNOWN.equals(action.clickType())) + if ((clickType == action.clickType() || ClickType.UNKNOWN.equals(action.clickType())) && + "NEXT".equalsIgnoreCase(action.actionType())) { - if ("NEXT".equalsIgnoreCase(action.actionType())) - { - this.pageIndex++; - this.build(); - } + this.pageIndex++; + this.build(); } } @@ -488,10 +484,10 @@ public class DetailsPanel // Collect tooltips. List tooltips = template.actions().stream(). - filter(action -> action.tooltip() != null). - map(action -> this.user.getTranslation(this.world, action.tooltip())). - filter(text -> !text.isBlank()). - collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); + filter(action -> action.tooltip() != null). + map(action -> this.user.getTranslation(this.world, action.tooltip())). + filter(text -> !text.isBlank()). + collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); // Add tooltips. if (!tooltips.isEmpty()) @@ -528,7 +524,7 @@ public class DetailsPanel { ItemStack clone = template.icon().clone(); - if ((Boolean) template.dataMap().getOrDefault("indexing", false)) + if (Boolean.TRUE.equals(template.dataMap().getOrDefault("indexing", false))) { clone.setAmount(previousPageIndex); } @@ -544,7 +540,7 @@ public class DetailsPanel if (template.description() != null) { builder.description(this.user.getTranslation(this.world, template.description(), - "[number]", String.valueOf(previousPageIndex))); + TextVariables.NUMBER, String.valueOf(previousPageIndex))); } // Add ClickHandler @@ -552,13 +548,11 @@ public class DetailsPanel { for (ItemTemplateRecord.ActionRecords action : template.actions()) { - if (clickType == action.clickType() || ClickType.UNKNOWN.equals(action.clickType())) + if ((clickType == action.clickType() || ClickType.UNKNOWN.equals(action.clickType())) + && "PREVIOUS".equalsIgnoreCase(action.actionType())) { - if ("PREVIOUS".equalsIgnoreCase(action.actionType())) - { - this.pageIndex--; - this.build(); - } + this.pageIndex--; + this.build(); } } @@ -568,10 +562,10 @@ public class DetailsPanel // Collect tooltips. List tooltips = template.actions().stream(). - filter(action -> action.tooltip() != null). - map(action -> this.user.getTranslation(this.world, action.tooltip())). - filter(text -> !text.isBlank()). - collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); + filter(action -> action.tooltip() != null). + map(action -> this.user.getTranslation(this.world, action.tooltip())). + filter(text -> !text.isBlank()). + collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); // Add tooltips. if (!tooltips.isEmpty()) @@ -585,9 +579,9 @@ public class DetailsPanel } -// --------------------------------------------------------------------- -// Section: Create Material Button -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Create Material Button + // --------------------------------------------------------------------- /** @@ -625,7 +619,7 @@ public class DetailsPanel * @return PanelItem for generator tier. */ private PanelItem createMaterialButton(ItemTemplateRecord template, - Pair materialCount) + Pair materialCount) { PanelItemBuilder builder = new PanelItemBuilder(); @@ -646,30 +640,30 @@ public class DetailsPanel if (template.title() != null) { builder.name(this.user.getTranslation(this.world, template.title(), - "[number]", String.valueOf(materialCount.getValue()), - "[material]", Utils.prettifyObject(materialCount.getKey(), this.user))); + TextVariables.NUMBER, String.valueOf(materialCount.getValue()), + "[material]", Utils.prettifyObject(materialCount.getKey(), this.user))); } String description = Utils.prettifyDescription(materialCount.getKey(), this.user); final String reference = "level.gui.buttons.material."; String blockId = this.user.getTranslationOrNothing(reference + "id", - "[id]", materialCount.getKey().name()); + "[id]", materialCount.getKey().name()); int blockValue = this.addon.getBlockConfig().getBlockValues().getOrDefault(materialCount.getKey(), 0); String value = blockValue > 0 ? this.user.getTranslationOrNothing(reference + "value", - "[number]", String.valueOf(blockValue)) : ""; + TextVariables.NUMBER, String.valueOf(blockValue)) : ""; int blockLimit = this.addon.getBlockConfig().getBlockLimits().getOrDefault(materialCount.getKey(), 0); String limit = blockLimit > 0 ? this.user.getTranslationOrNothing(reference + "limit", - "[number]", String.valueOf(blockLimit)) : ""; + TextVariables.NUMBER, String.valueOf(blockLimit)) : ""; String count = this.user.getTranslationOrNothing(reference + "count", - "[number]", String.valueOf(materialCount.getValue())); + TextVariables.NUMBER, String.valueOf(materialCount.getValue())); long calculatedValue = (long) Math.min(blockLimit > 0 ? blockLimit : Integer.MAX_VALUE, materialCount.getValue()) * blockValue; String valueText = calculatedValue > 0 ? this.user.getTranslationOrNothing(reference + "calculated", - "[number]", String.valueOf(calculatedValue)) : ""; + TextVariables.NUMBER, String.valueOf(calculatedValue)) : ""; if (template.description() != null) { @@ -680,18 +674,18 @@ public class DetailsPanel "[calculated]", valueText, "[limit]", limit, "[count]", count). - replaceAll("(?m)^[ \\t]*\\r?\\n", ""). - replaceAll("(? { - Island island = this.addon.getIslandsManager().getIsland(this.world, entry.getKey()); - return new IslandTopRecord(island, entry.getValue()); - }). - collect(Collectors.toList()); + map(entry -> { + Island island = this.addon.getIslandsManager().getIsland(this.world, entry.getKey()); + return new IslandTopRecord(island, entry.getValue()); + }). + collect(Collectors.toList()); } @@ -82,9 +88,9 @@ public class TopLevelPanel } -// --------------------------------------------------------------------- -// Section: Methods -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Methods + // --------------------------------------------------------------------- /** @@ -100,8 +106,6 @@ public class TopLevelPanel return null; } - final String reference = "level.gui.buttons.island."; - PanelItemBuilder builder = new PanelItemBuilder(); if (template.icon() != null) @@ -112,18 +116,18 @@ public class TopLevelPanel if (template.title() != null) { builder.name(this.user.getTranslation(this.world, template.title(), - "[name]", String.valueOf(index))); + TextVariables.NAME, String.valueOf(index))); } else { - builder.name(this.user.getTranslation(this.world, reference, - "[name]", String.valueOf(index))); + builder.name(this.user.getTranslation(this.world, REFERENCE, + TextVariables.NAME, String.valueOf(index))); } if (template.description() != null) { builder.description(this.user.getTranslation(this.world, template.description(), - "[number]", String.valueOf(index))); + TextVariables.NUMBER, String.valueOf(index))); } builder.amount(index != 0 ? (int) index : 1); @@ -189,23 +193,23 @@ public class TopLevelPanel { switch (action.actionType().toUpperCase()) { - case "WARP" -> { - return island.getOwner() == null || + case "WARP" -> { + return island.getOwner() == null || this.addon.getWarpHook() == null || !this.addon.getWarpHook().getWarpSignsManager().hasWarp(this.world, island.getOwner()); - } - case "VISIT" -> { - return island.getOwner() == null || + } + case "VISIT" -> { + return island.getOwner() == null || this.addon.getVisitHook() == null || !this.addon.getVisitHook().getAddonManager().preprocessTeleportation(this.user, island); - } - case "VIEW" -> { - return island.getOwner() == null || + } + case "VIEW" -> { + return island.getOwner() == null || !island.getMemberSet(RanksManager.MEMBER_RANK).contains(this.user.getUniqueId()); - } - default -> { - return false; - } + } + default -> { + return false; + } } }); @@ -218,33 +222,38 @@ public class TopLevelPanel { switch (action.actionType().toUpperCase()) { - case "WARP" -> { - this.user.closeInventory(); - this.addon.getWarpHook().getWarpSignsManager().warpPlayer(this.world, this.user, island.getOwner()); - } - case "VISIT" -> { - // The command call implementation solves necessity to check for all visits options, - // like cool down, confirmation and preprocess in single go. Would it be better to write - // all logic here? + case "WARP" -> { + this.user.closeInventory(); + this.addon.getWarpHook().getWarpSignsManager().warpPlayer(this.world, this.user, island.getOwner()); + } + case "VISIT" -> + // The command call implementation solves necessity to check for all visits options, + // like cool down, confirmation and preprocess in single go. Would it be better to write + // all logic here? - this.addon.getPlugin().getIWM().getAddon(this.world). - flatMap(GameModeAddon::getPlayerCommand).ifPresent(command -> - { - String mainCommand = - this.addon.getVisitHook().getSettings().getPlayerMainCommand(); + this.addon.getPlugin().getIWM().getAddon(this.world). + flatMap(GameModeAddon::getPlayerCommand).ifPresent(command -> + { + String mainCommand = + this.addon.getVisitHook().getSettings().getPlayerMainCommand(); - if (!mainCommand.isBlank()) - { - this.user.closeInventory(); - this.user.performCommand(command.getTopLabel() + " " + mainCommand + " " + island.getOwner()); - } - }); - } - case "VIEW" -> { + if (!mainCommand.isBlank()) + { this.user.closeInventory(); - // Open Detailed GUI. - DetailsPanel.openPanel(this.addon, this.world, this.user); + this.user.performCommand(command.getTopLabel() + " " + mainCommand + " " + island.getOwner()); } + }); + + case "VIEW" -> { + this.user.closeInventory(); + // Open Detailed GUI. + DetailsPanel.openPanel(this.addon, this.world, this.user); + } + // Catch default + default -> { + this.user.closeInventory(); + addon.logError("Unknown action type " + action.actionType().toUpperCase()); + } } } } @@ -254,10 +263,10 @@ public class TopLevelPanel // Collect tooltips. List tooltips = activeActions.stream(). - filter(action -> action.tooltip() != null). - map(action -> this.user.getTranslation(this.world, action.tooltip())). - filter(text -> !text.isBlank()). - collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); + filter(action -> action.tooltip() != null). + map(action -> this.user.getTranslation(this.world, action.tooltip())). + filter(text -> !text.isBlank()). + collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); // Add tooltips. if (!tooltips.isEmpty()) @@ -278,22 +287,21 @@ public class TopLevelPanel * @param template the template * @param island the island */ - private void populateIslandTitle(PanelItemBuilder builder, - ItemTemplateRecord template, - Island island) + private void populateIslandTitle(PanelItemBuilder builder, + ItemTemplateRecord template, + Island island) { - final String reference = "level.gui.buttons.island."; // Get Island Name String nameText; if (island.getName() == null || island.getName().isEmpty()) { - nameText = this.user.getTranslation(reference + "owners-island", - "[player]", - island.getOwner() == null ? - this.user.getTranslation(reference + "unknown") : - this.addon.getPlayers().getName(island.getOwner())); + nameText = this.user.getTranslation(REFERENCE + "owners-island", + PLAYER, + island.getOwner() == null ? + this.user.getTranslation(REFERENCE + "unknown") : + this.addon.getPlayers().getName(island.getOwner())); } else { @@ -304,11 +312,11 @@ public class TopLevelPanel if (template.title() != null && !template.title().isBlank()) { builder.name(this.user.getTranslation(this.world, template.title(), - "[name]", nameText)); + TextVariables.NAME, nameText)); } else { - builder.name(this.user.getTranslation(reference + "name", "[name]", nameText)); + builder.name(this.user.getTranslation(REFERENCE + "name", TextVariables.NAME, nameText)); } } @@ -321,11 +329,11 @@ public class TopLevelPanel * @param island the island */ private void populateIslandIcon(PanelItemBuilder builder, - ItemTemplateRecord template, - Island island) + ItemTemplateRecord template, + Island island) { User owner = island.getOwner() == null ? null : User.getInstance(island.getOwner()); - + // Get permission or island icon String permissionIcon = owner == null ? null : Utils.getPermissionValue(owner, this.iconPermission, null); @@ -376,20 +384,18 @@ public class TopLevelPanel * @param islandTopRecord the top record object * @param index place index. */ - private void populateIslandDescription(PanelItemBuilder builder, - ItemTemplateRecord template, - Island island, - IslandTopRecord islandTopRecord, - int index) + private void populateIslandDescription(PanelItemBuilder builder, + ItemTemplateRecord template, + Island island, + IslandTopRecord islandTopRecord, + int index) { - final String reference = "level.gui.buttons.island."; - // Get Owner Name - String ownerText = this.user.getTranslation(reference + "owner", - "[player]", - island.getOwner() == null ? - this.user.getTranslation(reference + "unknown") : - this.addon.getPlayers().getName(island.getOwner())); + String ownerText = this.user.getTranslation(REFERENCE + "owner", + PLAYER, + island.getOwner() == null ? + this.user.getTranslation(REFERENCE + "unknown") : + this.addon.getPlayers().getName(island.getOwner())); // Get Members Text String memberText; @@ -397,11 +403,11 @@ public class TopLevelPanel if (island.getMemberSet().size() > 1) { StringBuilder memberBuilder = new StringBuilder( - this.user.getTranslationOrNothing(reference + "members-title")); + this.user.getTranslationOrNothing(REFERENCE + "members-title")); for (UUID uuid : island.getMemberSet()) { - User user = User.getInstance(uuid); + User member = User.getInstance(uuid); if (memberBuilder.length() > 0) { @@ -409,8 +415,8 @@ public class TopLevelPanel } memberBuilder.append( - this.user.getTranslationOrNothing(reference + "member", - "[player]", user.getName())); + this.user.getTranslationOrNothing(REFERENCE + "member", + PLAYER, member.getName())); } memberText = memberBuilder.toString(); @@ -420,11 +426,11 @@ public class TopLevelPanel memberText = ""; } - String placeText = this.user.getTranslation(reference + "place", - "[number]", String.valueOf(index)); + String placeText = this.user.getTranslation(REFERENCE + "place", + TextVariables.NUMBER, String.valueOf(index)); - String levelText = this.user.getTranslation(reference + "level", - "[number]", this.addon.getManager().formatLevel(islandTopRecord.level())); + String levelText = this.user.getTranslation(REFERENCE + "level", + TextVariables.NUMBER, this.addon.getManager().formatLevel(islandTopRecord.level())); // Template specific description is always more important than custom one. if (template.description() != null && !template.description().isBlank()) @@ -434,26 +440,26 @@ public class TopLevelPanel "[members]", memberText, "[level]", levelText, "[place]", placeText). - replaceAll("(?m)^[ \\t]*\\r?\\n", ""). - replaceAll("(? level to island -> level. @@ -505,9 +516,9 @@ public class TopLevelPanel private record IslandTopRecord(Island island, Long level) {} -// --------------------------------------------------------------------- -// Section: Variables -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Variables + // --------------------------------------------------------------------- /** * This variable allows to access addon object. diff --git a/src/main/java/world/bentobox/level/panels/ValuePanel.java b/src/main/java/world/bentobox/level/panels/ValuePanel.java index fdc04ae..e97ca54 100644 --- a/src/main/java/world/bentobox/level/panels/ValuePanel.java +++ b/src/main/java/world/bentobox/level/panels/ValuePanel.java @@ -1,25 +1,29 @@ package world.bentobox.level.panels; -import com.google.common.base.Enums; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Collectors; + import org.bukkit.Material; import org.bukkit.World; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; -import java.io.File; -import java.util.*; -import java.util.function.Consumer; -import java.util.stream.Collectors; + +import com.google.common.base.Enums; import lv.id.bonne.panelutils.PanelUtils; +import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.TemplatedPanel; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.panels.builders.TemplatedPanelBuilder; import world.bentobox.bentobox.api.panels.reader.ItemTemplateRecord; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.hooks.LangUtilsHook; -import world.bentobox.bentobox.util.Pair; import world.bentobox.level.Level; import world.bentobox.level.util.ConversationUtils; import world.bentobox.level.util.Utils; @@ -30,6 +34,7 @@ import world.bentobox.level.util.Utils; */ public class ValuePanel { + // --------------------------------------------------------------------- // Section: Internal Constructor // --------------------------------------------------------------------- @@ -43,8 +48,8 @@ public class ValuePanel * @param user User who opens panel */ private ValuePanel(Level addon, - World world, - User user) + World world, + User user) { this.addon = addon; this.world = world; @@ -52,18 +57,18 @@ public class ValuePanel this.activeFilter = Filter.NAME_ASC; this.materialRecordList = Arrays.stream(Material.values()). - filter(Material::isBlock). - filter(m -> !m.name().startsWith("LEGACY_")). - map(material -> - { - Integer value = this.addon.getBlockConfig().getValue(this.world, material); - Integer limit = this.addon.getBlockConfig().getBlockLimits().get(material); + filter(Material::isBlock). + filter(m -> !m.name().startsWith("LEGACY_")). + map(material -> + { + Integer value = this.addon.getBlockConfig().getValue(this.world, material); + Integer limit = this.addon.getBlockConfig().getBlockLimits().get(material); - return new MaterialRecord(material, - value != null ? value : 0, - limit != null ? limit : 0); - }). - collect(Collectors.toList()); + return new MaterialRecord(material, + value != null ? value : 0, + limit != null ? limit : 0); + }). + collect(Collectors.toList()); this.elementList = new ArrayList<>(Material.values().length); this.searchText = ""; @@ -86,7 +91,7 @@ public class ValuePanel panelBuilder.registerTypeBuilder("NEXT", this::createNextButton); panelBuilder.registerTypeBuilder("PREVIOUS", this::createPreviousButton); - panelBuilder.registerTypeBuilder("BLOCK", this::createMaterialButton); + panelBuilder.registerTypeBuilder(BLOCK, this::createMaterialButton); panelBuilder.registerTypeBuilder("FILTER", this::createFilterButton); panelBuilder.registerTypeBuilder("SEARCH", this::createSearchButton); @@ -105,60 +110,60 @@ public class ValuePanel switch (this.activeFilter) { - case VALUE_ASC -> - { - sorter = (o1, o2) -> - { - if (o1.value().equals(o2.value())) - { - String o1Name = Utils.prettifyObject(o1.material(), this.user); - String o2Name = Utils.prettifyObject(o2.material(), this.user); + case VALUE_ASC -> - return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); - } - else - { - return Integer.compare(o1.value(), o2.value()); - } - }; - } - case VALUE_DESC -> + sorter = (o1, o2) -> + { + if (o1.value().equals(o2.value())) { - sorter = (o1, o2) -> - { - if (o1.value().equals(o2.value())) - { - String o1Name = Utils.prettifyObject(o1.material(), this.user); - String o2Name = Utils.prettifyObject(o2.material(), this.user); + String o1Name = Utils.prettifyObject(o1.material(), this.user); + String o2Name = Utils.prettifyObject(o2.material(), this.user); - return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); - } - else - { - return Integer.compare(o2.value(), o1.value()); - } - }; + return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); } - case NAME_DESC -> + else { - sorter = (o1, o2) -> - { - String o1Name = Utils.prettifyObject(o1.material(), this.user); - String o2Name = Utils.prettifyObject(o2.material(), this.user); - - return String.CASE_INSENSITIVE_ORDER.compare(o2Name, o1Name); - }; + return Integer.compare(o1.value(), o2.value()); } - default -> + }; + + case VALUE_DESC -> + + sorter = (o1, o2) -> + { + if (o1.value().equals(o2.value())) { - sorter = (o1, o2) -> - { - String o1Name = Utils.prettifyObject(o1.material(), this.user); - String o2Name = Utils.prettifyObject(o2.material(), this.user); + String o1Name = Utils.prettifyObject(o1.material(), this.user); + String o2Name = Utils.prettifyObject(o2.material(), this.user); - return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); - }; + return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); } + else + { + return Integer.compare(o2.value(), o1.value()); + } + }; + + case NAME_DESC -> + + sorter = (o1, o2) -> + { + String o1Name = Utils.prettifyObject(o1.material(), this.user); + String o2Name = Utils.prettifyObject(o2.material(), this.user); + + return String.CASE_INSENSITIVE_ORDER.compare(o2Name, o1Name); + }; + + default -> + + sorter = (o1, o2) -> + { + String o1Name = Utils.prettifyObject(o1.material(), this.user); + String o2Name = Utils.prettifyObject(o2.material(), this.user); + + return String.CASE_INSENSITIVE_ORDER.compare(o1Name, o2Name); + }; + } this.materialRecordList.sort(sorter); @@ -168,12 +173,12 @@ public class ValuePanel this.elementList = new ArrayList<>(this.materialRecordList.size()); final String text = this.searchText.toLowerCase(); - this.materialRecordList.forEach(record -> + this.materialRecordList.forEach(rec -> { - if (record.material.name().toLowerCase().contains(text) || - Utils.prettifyObject(record.material(), this.user).toLowerCase().contains(text)) + if (rec.material.name().toLowerCase().contains(text) || + Utils.prettifyObject(rec.material(), this.user).toLowerCase().contains(text)) { - this.elementList.add(record); + this.elementList.add(rec); } }); } @@ -186,9 +191,9 @@ public class ValuePanel } -// --------------------------------------------------------------------- -// Section: Tab Button Type -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Tab Button Type + // --------------------------------------------------------------------- /** @@ -224,7 +229,7 @@ public class ValuePanel List activeActions = new ArrayList<>(template.actions()); activeActions.removeIf(action -> - "CLEAR".equalsIgnoreCase(action.actionType()) && this.searchText.isBlank()); + "CLEAR".equalsIgnoreCase(action.actionType()) && this.searchText.isBlank()); // Add Click handler builder.clickHandler((panel, user, clickType, i) -> @@ -257,9 +262,9 @@ public class ValuePanel // start conversation ConversationUtils.createStringInput(consumer, - user, - user.getTranslation("level.conversations.write-search"), - user.getTranslation("level.conversations.search-updated")); + user, + user.getTranslation("level.conversations.write-search"), + user.getTranslation("level.conversations.search-updated")); } } } @@ -269,10 +274,10 @@ public class ValuePanel // Collect tooltips. List tooltips = activeActions.stream(). - filter(action -> action.tooltip() != null). - map(action -> this.user.getTranslation(this.world, action.tooltip())). - filter(text -> !text.isBlank()). - collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); + filter(action -> action.tooltip() != null). + map(action -> this.user.getTranslation(this.world, action.tooltip())). + filter(text -> !text.isBlank()). + collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); // Add tooltips. if (!tooltips.isEmpty()) @@ -336,7 +341,7 @@ public class ValuePanel if (this.activeFilter.name().startsWith(filterName)) { return this.activeFilter.name().endsWith("ASC") && "ASC".equalsIgnoreCase(action.actionType()) || - this.activeFilter.name().endsWith("DESC") && "DESC".equalsIgnoreCase(action.actionType()); + this.activeFilter.name().endsWith("DESC") && "DESC".equalsIgnoreCase(action.actionType()); } else { @@ -375,10 +380,10 @@ public class ValuePanel // Collect tooltips. List tooltips = activeActions.stream(). - filter(action -> action.tooltip() != null). - map(action -> this.user.getTranslation(this.world, action.tooltip())). - filter(text -> !text.isBlank()). - collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); + filter(action -> action.tooltip() != null). + map(action -> this.user.getTranslation(this.world, action.tooltip())). + filter(text -> !text.isBlank()). + collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); // Add tooltips. if (!tooltips.isEmpty()) @@ -394,9 +399,9 @@ public class ValuePanel } -// --------------------------------------------------------------------- -// Section: Create common buttons -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Create common buttons + // --------------------------------------------------------------------- /** @@ -410,8 +415,8 @@ public class ValuePanel { long size = this.elementList.size(); - if (size <= slot.amountMap().getOrDefault("BLOCK", 1) || - 1.0 * size / slot.amountMap().getOrDefault("BLOCK", 1) <= this.pageIndex + 1) + if (size <= slot.amountMap().getOrDefault(BLOCK, 1) || + 1.0 * size / slot.amountMap().getOrDefault(BLOCK, 1) <= this.pageIndex + 1) { // There are no next elements return null; @@ -425,7 +430,7 @@ public class ValuePanel { ItemStack clone = template.icon().clone(); - if ((Boolean) template.dataMap().getOrDefault("indexing", false)) + if (Boolean.TRUE.equals(template.dataMap().getOrDefault("indexing", false))) { clone.setAmount(nextPageIndex); } @@ -441,7 +446,7 @@ public class ValuePanel if (template.description() != null) { builder.description(this.user.getTranslation(this.world, template.description(), - "[number]", String.valueOf(nextPageIndex))); + TextVariables.NUMBER, String.valueOf(nextPageIndex))); } // Add ClickHandler @@ -449,13 +454,11 @@ public class ValuePanel { for (ItemTemplateRecord.ActionRecords action : template.actions()) { - if (clickType == action.clickType() || ClickType.UNKNOWN.equals(action.clickType())) + if ((clickType == action.clickType() || ClickType.UNKNOWN.equals(action.clickType())) + && "NEXT".equalsIgnoreCase(action.actionType())) { - if ("NEXT".equalsIgnoreCase(action.actionType())) - { - this.pageIndex++; - this.build(); - } + this.pageIndex++; + this.build(); } } @@ -465,10 +468,10 @@ public class ValuePanel // Collect tooltips. List tooltips = template.actions().stream(). - filter(action -> action.tooltip() != null). - map(action -> this.user.getTranslation(this.world, action.tooltip())). - filter(text -> !text.isBlank()). - collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); + filter(action -> action.tooltip() != null). + map(action -> this.user.getTranslation(this.world, action.tooltip())). + filter(text -> !text.isBlank()). + collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); // Add tooltips. if (!tooltips.isEmpty()) @@ -505,7 +508,7 @@ public class ValuePanel { ItemStack clone = template.icon().clone(); - if ((Boolean) template.dataMap().getOrDefault("indexing", false)) + if (Boolean.TRUE.equals(template.dataMap().getOrDefault("indexing", false))) { clone.setAmount(previousPageIndex); } @@ -521,7 +524,7 @@ public class ValuePanel if (template.description() != null) { builder.description(this.user.getTranslation(this.world, template.description(), - "[number]", String.valueOf(previousPageIndex))); + TextVariables.NUMBER, String.valueOf(previousPageIndex))); } // Add ClickHandler @@ -529,13 +532,11 @@ public class ValuePanel { for (ItemTemplateRecord.ActionRecords action : template.actions()) { - if (clickType == action.clickType() || ClickType.UNKNOWN.equals(action.clickType())) + if ((clickType == action.clickType() || ClickType.UNKNOWN.equals(action.clickType())) + && "PREVIOUS".equalsIgnoreCase(action.actionType())) { - if ("PREVIOUS".equalsIgnoreCase(action.actionType())) - { - this.pageIndex--; - this.build(); - } + this.pageIndex--; + this.build(); } } @@ -545,10 +546,10 @@ public class ValuePanel // Collect tooltips. List tooltips = template.actions().stream(). - filter(action -> action.tooltip() != null). - map(action -> this.user.getTranslation(this.world, action.tooltip())). - filter(text -> !text.isBlank()). - collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); + filter(action -> action.tooltip() != null). + map(action -> this.user.getTranslation(this.world, action.tooltip())). + filter(text -> !text.isBlank()). + collect(Collectors.toCollection(() -> new ArrayList<>(template.actions().size()))); // Add tooltips. if (!tooltips.isEmpty()) @@ -562,9 +563,9 @@ public class ValuePanel } -// --------------------------------------------------------------------- -// Section: Create Material Button -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Create Material Button + // --------------------------------------------------------------------- /** @@ -582,7 +583,7 @@ public class ValuePanel return null; } - int index = this.pageIndex * slot.amountMap().getOrDefault("BLOCK", 1) + slot.slot(); + int index = this.pageIndex * slot.amountMap().getOrDefault(BLOCK, 1) + slot.slot(); if (index >= this.elementList.size()) { @@ -602,7 +603,7 @@ public class ValuePanel * @return PanelItem for generator tier. */ private PanelItem createMaterialButton(ItemTemplateRecord template, - MaterialRecord materialRecord) + MaterialRecord materialRecord) { PanelItemBuilder builder = new PanelItemBuilder(); @@ -623,24 +624,24 @@ public class ValuePanel if (template.title() != null) { builder.name(this.user.getTranslation(this.world, template.title(), - "[material]", Utils.prettifyObject(materialRecord.material(), this.user))); + "[material]", Utils.prettifyObject(materialRecord.material(), this.user))); } String description = Utils.prettifyDescription(materialRecord.material(), this.user); final String reference = "level.gui.buttons.material."; String blockId = this.user.getTranslationOrNothing(reference + "id", - "[id]", materialRecord.material().name()); + "[id]", materialRecord.material().name()); String value = this.user.getTranslationOrNothing(reference + "value", - "[number]", String.valueOf(materialRecord.value())); + TextVariables.NUMBER, String.valueOf(materialRecord.value())); String underWater; if (this.addon.getSettings().getUnderWaterMultiplier() > 1.0) { underWater = this.user.getTranslationOrNothing(reference + "underwater", - "[number]", String.valueOf(materialRecord.value() * this.addon.getSettings().getUnderWaterMultiplier())); + TextVariables.NUMBER, String.valueOf(materialRecord.value() * this.addon.getSettings().getUnderWaterMultiplier())); } else { @@ -648,7 +649,7 @@ public class ValuePanel } String limit = materialRecord.limit() > 0 ? this.user.getTranslationOrNothing(reference + "limit", - "[number]", String.valueOf(materialRecord.limit())) : ""; + TextVariables.NUMBER, String.valueOf(materialRecord.limit())) : ""; if (template.description() != null) { @@ -658,13 +659,13 @@ public class ValuePanel "[value]", value, "[underwater]", underWater, "[limit]", limit). - replaceAll("(?m)^[ \\t]*\\r?\\n", ""). - replaceAll("(? { - System.out.println("Material: " + materialRecord.material()); + addon.log("Material: " + materialRecord.material()); return true; }); @@ -672,9 +673,9 @@ public class ValuePanel } -// --------------------------------------------------------------------- -// Section: Other Methods -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Other Methods + // --------------------------------------------------------------------- /** @@ -686,16 +687,16 @@ public class ValuePanel * @param user User who opens panel */ public static void openPanel(Level addon, - World world, - User user) + World world, + User user) { new ValuePanel(addon, world, user).build(); } -// --------------------------------------------------------------------- -// Section: Enums -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Enums + // --------------------------------------------------------------------- /** @@ -726,10 +727,15 @@ public class ValuePanel { } + // --------------------------------------------------------------------- + // Section: Constants + // --------------------------------------------------------------------- -// --------------------------------------------------------------------- -// Section: Variables -// --------------------------------------------------------------------- + private static final String BLOCK = "BLOCK"; + + // --------------------------------------------------------------------- + // Section: Variables + // --------------------------------------------------------------------- /** * This variable allows to access addon object. diff --git a/src/main/java/world/bentobox/level/util/ConversationUtils.java b/src/main/java/world/bentobox/level/util/ConversationUtils.java index ad9dbcc..968f19e 100644 --- a/src/main/java/world/bentobox/level/util/ConversationUtils.java +++ b/src/main/java/world/bentobox/level/util/ConversationUtils.java @@ -7,10 +7,16 @@ package world.bentobox.level.util; -import org.bukkit.conversations.*; +import java.util.function.Consumer; + +import org.bukkit.conversations.ConversationAbandonedListener; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.ConversationFactory; +import org.bukkit.conversations.MessagePrompt; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import java.util.function.Consumer; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.user.User; @@ -18,10 +24,11 @@ import world.bentobox.bentobox.api.user.User; public class ConversationUtils { -// --------------------------------------------------------------------- -// Section: Conversation API implementation -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Conversation API implementation + // --------------------------------------------------------------------- + private ConversationUtils() {} // Private constructor as this is a utility class only with static methods /** * This method will close opened gui and writes question in chat. After players answers on question in chat, message @@ -32,9 +39,9 @@ public class ConversationUtils * @param user User who is targeted with current confirmation. */ public static void createStringInput(Consumer consumer, - User user, - @NonNull String question, - @Nullable String successMessage) + User user, + @NonNull String question, + @Nullable String successMessage) { // Text input message. StringPrompt stringPrompt = new StringPrompt() @@ -56,16 +63,16 @@ public class ConversationUtils }; new ConversationFactory(BentoBox.getInstance()). - withPrefix(context -> user.getTranslation("level.conversations.prefix")). - withFirstPrompt(stringPrompt). - // On cancel conversation will be closed. - withLocalEcho(false). - withTimeout(90). - withEscapeSequence(user.getTranslation("level.conversations.cancel-string")). - // Use null value in consumer to detect if user has abandoned conversation. - addConversationAbandonedListener(ConversationUtils.getAbandonListener(consumer, user)). - buildConversation(user.getPlayer()). - begin(); + withPrefix(context -> user.getTranslation("level.conversations.prefix")). + withFirstPrompt(stringPrompt). + // On cancel conversation will be closed. + withLocalEcho(false). + withTimeout(90). + withEscapeSequence(user.getTranslation("level.conversations.cancel-string")). + // Use null value in consumer to detect if user has abandoned conversation. + addConversationAbandonedListener(ConversationUtils.getAbandonListener(consumer, user)). + buildConversation(user.getPlayer()). + begin(); } @@ -111,7 +118,7 @@ public class ConversationUtils consumer.accept(null); // send cancell message abandonedEvent.getContext().getForWhom().sendRawMessage( - user.getTranslation("level.conversations.prefix") + + user.getTranslation("level.conversations.prefix") + user.getTranslation("level.conversations.cancelled")); } }; diff --git a/src/main/java/world/bentobox/level/util/Utils.java b/src/main/java/world/bentobox/level/util/Utils.java index 6d177a1..1433666 100644 --- a/src/main/java/world/bentobox/level/util/Utils.java +++ b/src/main/java/world/bentobox/level/util/Utils.java @@ -7,10 +7,10 @@ package world.bentobox.level.util; +import java.util.List; + import org.bukkit.Material; import org.bukkit.permissions.PermissionAttachmentInfo; -import java.util.List; -import java.util.stream.Collectors; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.hooks.LangUtilsHook; @@ -18,6 +18,10 @@ import world.bentobox.bentobox.hooks.LangUtilsHook; public class Utils { + private static final String LEVEL_MATERIALS = "level.materials."; + + private Utils() {} // Private constructor as this is a utility class only with static methods + /** * This method sends a message to the user with appended "prefix" text before message. * @param user User who receives message. @@ -27,7 +31,7 @@ public class Utils public static void sendMessage(User user, String translationText, String... parameters) { user.sendMessage(user.getTranslation( "level.conversations.prefix") + - user.getTranslation( translationText, parameters)); + user.getTranslation( translationText, parameters)); } @@ -52,9 +56,9 @@ public class Utils String permPrefix = permissionPrefix + "."; List permissions = user.getEffectivePermissions().stream(). - map(PermissionAttachmentInfo::getPermission). - filter(permission -> permission.startsWith(permPrefix)). - collect(Collectors.toList()); + map(PermissionAttachmentInfo::getPermission). + filter(permission -> permission.startsWith(permPrefix)). + toList(); for (String permission : permissions) { @@ -154,7 +158,7 @@ public class Utils // materials: // [material]: // name: [name] - String translation = user.getTranslationOrNothing("level.materials." + object.name().toLowerCase() + ".name"); + String translation = user.getTranslationOrNothing(LEVEL_MATERIALS + object.name().toLowerCase() + ".name"); if (!translation.isEmpty()) { @@ -167,7 +171,7 @@ public class Utils // materials: // [material]: [name] - translation = user.getTranslationOrNothing("level.materials." + object.name().toLowerCase()); + translation = user.getTranslationOrNothing(LEVEL_MATERIALS + object.name().toLowerCase()); if (!translation.isEmpty()) { @@ -211,7 +215,7 @@ public class Utils // materials: // [material]: // description: [text] - String translation = user.getTranslationOrNothing("level.materials." + object.name().toLowerCase() + ".description"); + String translation = user.getTranslationOrNothing(LEVEL_MATERIALS + object.name().toLowerCase() + ".description"); if (!translation.isEmpty()) { diff --git a/src/test/java/world/bentobox/level/LevelsManagerTest.java b/src/test/java/world/bentobox/level/LevelsManagerTest.java index f6b5d54..5b18aa5 100644 --- a/src/test/java/world/bentobox/level/LevelsManagerTest.java +++ b/src/test/java/world/bentobox/level/LevelsManagerTest.java @@ -166,7 +166,7 @@ public class LevelsManagerTest { // Default to uuid's being island owners when(im.isOwner(eq(world), any())).thenReturn(true); when(im.getOwner(any(), any(UUID.class))).thenAnswer(in -> in.getArgument(1, UUID.class)); - when(im.getIsland(eq(world), eq(uuid))).thenReturn(island); + when(im.getIsland(world, uuid)).thenReturn(island); when(im.getIslandById(anyString())).thenReturn(Optional.of(island)); // Player @@ -392,8 +392,8 @@ public class LevelsManagerTest { Bukkit.getScheduler(); verify(scheduler).runTaskAsynchronously(eq(plugin), task.capture()); task.getValue().run(); - verify(addon).log(eq("Generating rankings")); - verify(addon).log(eq("Generated rankings for bskyblock-world")); + verify(addon).log("Generating rankings"); + verify(addon).log("Generated rankings for bskyblock-world"); } diff --git a/src/test/java/world/bentobox/level/commands/admin/AdminTopRemoveCommandTest.java b/src/test/java/world/bentobox/level/commands/admin/AdminTopRemoveCommandTest.java index 4d02459..71070a4 100644 --- a/src/test/java/world/bentobox/level/commands/admin/AdminTopRemoveCommandTest.java +++ b/src/test/java/world/bentobox/level/commands/admin/AdminTopRemoveCommandTest.java @@ -164,7 +164,7 @@ public class AdminTopRemoveCommandTest { @Test public void testCanExecuteWrongArgs() { assertFalse(atrc.canExecute(user, "delete", Collections.emptyList())); - verify(user).sendMessage(eq("commands.help.header"), eq(TextVariables.LABEL), eq("BSkyBlock")); + verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } /** @@ -174,7 +174,7 @@ public class AdminTopRemoveCommandTest { public void testCanExecuteUnknown() { when(pm.getUser(anyString())).thenReturn(null); assertFalse(atrc.canExecute(user, "delete", Collections.singletonList("tastybento"))); - verify(user).sendMessage(eq("general.errors.unknown-player"), eq(TextVariables.NAME), eq("tastybento")); + verify(user).sendMessage("general.errors.unknown-player", TextVariables.NAME, "tastybento"); } /** @@ -193,7 +193,7 @@ public class AdminTopRemoveCommandTest { testCanExecuteKnown(); assertTrue(atrc.execute(user, "delete", Collections.singletonList("tastybento"))); verify(manager).removeEntry(any(World.class), eq(uuid)); - verify(user).sendMessage(eq("general.success")); + verify(user).sendMessage("general.success"); } }