From f3ee8a381c698836642a3d63ab9c7a60c1ce9a59 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 26 Nov 2022 18:20:14 -0800 Subject: [PATCH] Adds %Level_[gamemode]_island_level_max% placeholder This records the lifetime maximum level the island has ever had. Addresses #271 --- src/main/java/world/bentobox/level/Level.java | 3 +++ .../world/bentobox/level/LevelsManager.java | 13 +++++++++++++ .../bentobox/level/objects/IslandLevels.java | 17 +++++++++++++++++ .../world/bentobox/level/LevelsManagerTest.java | 9 +++++++++ 4 files changed, 42 insertions(+) diff --git a/src/main/java/world/bentobox/level/Level.java b/src/main/java/world/bentobox/level/Level.java index f41830d..ee2b70c 100644 --- a/src/main/java/world/bentobox/level/Level.java +++ b/src/main/java/world/bentobox/level/Level.java @@ -228,6 +228,9 @@ public class Level extends Addon { getPlugin().getPlaceholdersManager().registerPlaceholder(this, gm.getDescription().getName().toLowerCase() + "_points_to_next_level", user -> getManager().getPointsToNextString(gm.getOverWorld(), user.getUniqueId())); + getPlugin().getPlaceholdersManager().registerPlaceholder(this, + gm.getDescription().getName().toLowerCase() + "_island_level_max", + user -> String.valueOf(getManager().getIslandMaxLevel(gm.getOverWorld(), user.getUniqueId()))); // Visited Island Level getPlugin().getPlaceholdersManager().registerPlaceholder(this, diff --git a/src/main/java/world/bentobox/level/LevelsManager.java b/src/main/java/world/bentobox/level/LevelsManager.java index a7fc4a7..08352de 100644 --- a/src/main/java/world/bentobox/level/LevelsManager.java +++ b/src/main/java/world/bentobox/level/LevelsManager.java @@ -231,6 +231,19 @@ public class LevelsManager { return island == null ? 0L : getLevelsData(island).getLevel(); } + /** + * Get the maximum level ever given to this island + * @param world - world where the island is + * @param targetPlayer - target player UUID + * @return Max level of the player's island or zero if player is unknown or UUID is null + */ + public long getIslandMaxLevel(@NonNull World world, @Nullable UUID targetPlayer) { + if (targetPlayer == null) return 0L; + // Get the island + Island island = addon.getIslands().getIsland(world, targetPlayer); + return island == null ? 0L : getLevelsData(island).getMaxLevel(); + } + /** * Returns a formatted string of the target player's island level * @param world - world where the island is diff --git a/src/main/java/world/bentobox/level/objects/IslandLevels.java b/src/main/java/world/bentobox/level/objects/IslandLevels.java index 532b509..7dd0123 100644 --- a/src/main/java/world/bentobox/level/objects/IslandLevels.java +++ b/src/main/java/world/bentobox/level/objects/IslandLevels.java @@ -43,6 +43,11 @@ public class IslandLevels implements DataObject { */ @Expose private long pointsToNextLevel; + /** + * The maximum level this island has ever had + */ + @Expose + private long maxLevel; /** * Underwater count @@ -94,6 +99,10 @@ public class IslandLevels implements DataObject { */ public void setLevel(long level) { this.level = level; + // Track maximum level + if (level > this.maxLevel) { + maxLevel = level; + } } /** @@ -124,6 +133,14 @@ public class IslandLevels implements DataObject { this.pointsToNextLevel = pointsToNextLevel; } + /** + * Get the maximum level ever set using {@link #setLevel(long)} + * @return the maxLevel + */ + public long getMaxLevel() { + return maxLevel; + } + /** * @return the uwCount */ diff --git a/src/test/java/world/bentobox/level/LevelsManagerTest.java b/src/test/java/world/bentobox/level/LevelsManagerTest.java index 94ead55..f6b5d54 100644 --- a/src/test/java/world/bentobox/level/LevelsManagerTest.java +++ b/src/test/java/world/bentobox/level/LevelsManagerTest.java @@ -270,6 +270,15 @@ public class LevelsManagerTest { //Map tt = lm.getTopTen(world, 10); //assertEquals(1, tt.size()); //assertTrue(tt.get(uuid) == 10000); + assertEquals(10000L, lm.getIslandMaxLevel(world, uuid)); + + results.setLevel(5000); + lm.calculateLevel(uuid, island); + // Complete the pipelined completable future + cf.complete(results); + assertEquals(5000L, lm.getLevelsData(island).getLevel()); + // Still should be 10000 + assertEquals(10000L, lm.getIslandMaxLevel(world, uuid)); }