Skip to content

Commit fd20a9e

Browse files
authored
Merge pull request #323 from BentoBoxWorld/develop
Release 2.15.0
2 parents a685bc8 + 61719cd commit fd20a9e

File tree

8 files changed

+227
-130
lines changed

8 files changed

+227
-130
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
<!-- Do not change unless you want different name for local builds. -->
7272
<build.number>-LOCAL</build.number>
7373
<!-- This allows to change between versions. -->
74-
<build.version>2.14.1</build.version>
74+
<build.version>2.15.0</build.version>
7575
<sonar.projectKey>BentoBoxWorld_Level</sonar.projectKey>
7676
<sonar.organization>bentobox-world</sonar.organization>
7777
<sonar.host.url>https://sonarcloud.io</sonar.host.url>

src/main/java/world/bentobox/level/LevelsManager.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,15 +216,32 @@ public long getInitialLevel(Island island) {
216216
*
217217
* @param world - world where the island is
218218
* @param targetPlayer - target player UUID
219+
* @param ownerOnly - return level only if the target player is the owner
219220
* @return Level of the player's island or zero if player is unknown or UUID is
220221
* null
221222
*/
222223
public long getIslandLevel(@NonNull World world, @Nullable UUID targetPlayer) {
224+
return getIslandLevel(world, targetPlayer, false);
225+
}
226+
227+
/**
228+
* Get level of island from cache for a player.
229+
*
230+
* @param world - world where the island is
231+
* @param targetPlayer - target player UUID
232+
* @param ownerOnly - return level only if the target player is the owner
233+
* @return Level of the player's island or zero if player is unknown or UUID is
234+
* null
235+
*/
236+
public long getIslandLevel(@NonNull World world, @Nullable UUID targetPlayer, boolean ownerOnly) {
223237
if (targetPlayer == null)
224238
return 0L;
225239
// Get the island
226240
Island island = addon.getIslands().getIsland(world, targetPlayer);
227-
return island == null ? 0L : getLevelsData(island).getLevel();
241+
if (island == null || island.getOwner() == null || (ownerOnly && !island.getOwner().equals(targetPlayer))) {
242+
return 0L;
243+
}
244+
return getLevelsData(island).getLevel();
228245
}
229246

230247
/**

src/main/java/world/bentobox/level/PlaceholderManager.java

Lines changed: 123 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -30,69 +30,72 @@ public class PlaceholderManager {
3030
private final BentoBox plugin;
3131

3232
public PlaceholderManager(Level addon) {
33-
this.addon = addon;
34-
this.plugin = addon.getPlugin();
33+
this.addon = addon;
34+
this.plugin = addon.getPlugin();
3535
}
3636

3737
protected void registerPlaceholders(GameModeAddon gm) {
38-
if (plugin.getPlaceholdersManager() == null)
39-
return;
40-
PlaceholdersManager bpm = plugin.getPlaceholdersManager();
41-
// Island Level
42-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_island_level",
43-
user -> addon.getManager().getIslandLevelString(gm.getOverWorld(), user.getUniqueId()));
44-
// Unformatted island level
45-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_island_level_raw",
46-
user -> String.valueOf(addon.getManager().getIslandLevel(gm.getOverWorld(), user.getUniqueId())));
47-
// Total number of points counted before applying level formula
48-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_island_total_points", user -> {
49-
IslandLevels data = addon.getManager().getLevelsData(addon.getIslands().getIsland(gm.getOverWorld(), user));
50-
return data.getTotalPoints() + "";
51-
});
52-
// Points to the next level for player
53-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_points_to_next_level",
54-
user -> addon.getManager().getPointsToNextString(gm.getOverWorld(), user.getUniqueId()));
55-
// Maximum level this island has ever been. Current level maybe lower.
56-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_island_level_max",
57-
user -> String.valueOf(addon.getManager().getIslandMaxLevel(gm.getOverWorld(), user.getUniqueId())));
58-
59-
// Visited Island Level
60-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_visited_island_level",
61-
user -> getVisitedIslandLevel(gm, user));
62-
63-
// Register Top Ten Placeholders
64-
for (int i = 1; i < 11; i++) {
65-
final int rank = i;
66-
// Name
67-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_name_" + i,
68-
u -> getRankName(gm.getOverWorld(), rank, false));
69-
// Island Name
70-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_island_name_" + i,
71-
u -> getRankIslandName(gm.getOverWorld(), rank, false));
72-
// Members
73-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_members_" + i,
74-
u -> getRankMembers(gm.getOverWorld(), rank, false));
75-
// Level
76-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_value_" + i,
77-
u -> getRankLevel(gm.getOverWorld(), rank, false));
78-
// Weighted Level Name (Level / number of members)
79-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_weighted_name_" + i,
80-
u -> getRankName(gm.getOverWorld(), rank, true));
81-
// Weighted Island Name
82-
bpm.registerPlaceholder(addon,
83-
gm.getDescription().getName().toLowerCase() + "_top_weighted_island_name_" + i,
84-
u -> getRankIslandName(gm.getOverWorld(), rank, true));
85-
// Weighted Members
86-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_weighted_members_" + i,
87-
u -> getRankMembers(gm.getOverWorld(), rank, true));
88-
// Weighted Level (Level / number of members)
89-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_weighted_value_" + i,
90-
u -> getRankLevel(gm.getOverWorld(), rank, true));
91-
}
92-
93-
// Personal rank
94-
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_rank_value",
95-
u -> getRankValue(gm.getOverWorld(), u));
38+
if (plugin.getPlaceholdersManager() == null)
39+
return;
40+
PlaceholdersManager bpm = plugin.getPlaceholdersManager();
41+
// Island Level
42+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_island_level",
43+
user -> addon.getManager().getIslandLevelString(gm.getOverWorld(), user.getUniqueId()));
44+
// Island Level owner only
45+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_island_level_owner",
46+
user -> String.valueOf(addon.getManager().getIslandLevel(gm.getOverWorld(), user.getUniqueId(), true)));
47+
// Unformatted island level
48+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_island_level_raw",
49+
user -> String.valueOf(addon.getManager().getIslandLevel(gm.getOverWorld(), user.getUniqueId())));
50+
// Total number of points counted before applying level formula
51+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_island_total_points", user -> {
52+
IslandLevels data = addon.getManager().getLevelsData(addon.getIslands().getIsland(gm.getOverWorld(), user));
53+
return data.getTotalPoints() + "";
54+
});
55+
// Points to the next level for player
56+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_points_to_next_level",
57+
user -> addon.getManager().getPointsToNextString(gm.getOverWorld(), user.getUniqueId()));
58+
// Maximum level this island has ever been. Current level maybe lower.
59+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_island_level_max",
60+
user -> String.valueOf(addon.getManager().getIslandMaxLevel(gm.getOverWorld(), user.getUniqueId())));
61+
62+
// Visited Island Level
63+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_visited_island_level",
64+
user -> getVisitedIslandLevel(gm, user));
65+
66+
// Register Top Ten Placeholders
67+
for (int i = 1; i < 11; i++) {
68+
final int rank = i;
69+
// Name
70+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_name_" + i,
71+
u -> getRankName(gm.getOverWorld(), rank, false));
72+
// Island Name
73+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_island_name_" + i,
74+
u -> getRankIslandName(gm.getOverWorld(), rank, false));
75+
// Members
76+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_members_" + i,
77+
u -> getRankMembers(gm.getOverWorld(), rank, false));
78+
// Level
79+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_value_" + i,
80+
u -> getRankLevel(gm.getOverWorld(), rank, false));
81+
// Weighted Level Name (Level / number of members)
82+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_weighted_name_" + i,
83+
u -> getRankName(gm.getOverWorld(), rank, true));
84+
// Weighted Island Name
85+
bpm.registerPlaceholder(addon,
86+
gm.getDescription().getName().toLowerCase() + "_top_weighted_island_name_" + i,
87+
u -> getRankIslandName(gm.getOverWorld(), rank, true));
88+
// Weighted Members
89+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_weighted_members_" + i,
90+
u -> getRankMembers(gm.getOverWorld(), rank, true));
91+
// Weighted Level (Level / number of members)
92+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_top_weighted_value_" + i,
93+
u -> getRankLevel(gm.getOverWorld(), rank, true));
94+
}
95+
96+
// Personal rank
97+
bpm.registerPlaceholder(addon, gm.getDescription().getName().toLowerCase() + "_rank_value",
98+
u -> getRankValue(gm.getOverWorld(), u));
9699
}
97100

98101
/**
@@ -104,17 +107,17 @@ protected void registerPlaceholders(GameModeAddon gm) {
104107
* @return rank name
105108
*/
106109
String getRankName(World world, int rank, boolean weighted) {
107-
// Ensure rank is within bounds
108-
rank = Math.max(1, Math.min(rank, Level.TEN));
109-
if (weighted) {
110-
return addon.getManager().getWeightedTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L)
111-
.findFirst().map(Island::getOwner).map(addon.getPlayers()::getName).orElse("");
112-
}
113-
@Nullable
114-
UUID owner = addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L)
115-
.findFirst().flatMap(addon.getIslands()::getIslandById).map(Island::getOwner).orElse(null);
116-
117-
return addon.getPlayers().getName(owner);
110+
// Ensure rank is within bounds
111+
rank = Math.max(1, Math.min(rank, Level.TEN));
112+
if (weighted) {
113+
return addon.getManager().getWeightedTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L)
114+
.findFirst().map(Island::getOwner).map(addon.getPlayers()::getName).orElse("");
115+
}
116+
@Nullable
117+
UUID owner = addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L)
118+
.findFirst().flatMap(addon.getIslands()::getIslandById).map(Island::getOwner).orElse(null);
119+
120+
return addon.getPlayers().getName(owner);
118121
}
119122

120123
/**
@@ -126,14 +129,14 @@ String getRankName(World world, int rank, boolean weighted) {
126129
* @return name of island or nothing if there isn't one
127130
*/
128131
String getRankIslandName(World world, int rank, boolean weighted) {
129-
// Ensure rank is within bounds
130-
rank = Math.max(1, Math.min(rank, Level.TEN));
131-
if (weighted) {
132-
return addon.getManager().getWeightedTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L)
133-
.findFirst().map(Island::getName).orElse("");
134-
}
135-
return addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L).findFirst()
136-
.flatMap(addon.getIslands()::getIslandById).map(Island::getName).orElse("");
132+
// Ensure rank is within bounds
133+
rank = Math.max(1, Math.min(rank, Level.TEN));
134+
if (weighted) {
135+
return addon.getManager().getWeightedTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L)
136+
.findFirst().map(Island::getName).orElse("");
137+
}
138+
return addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L).findFirst()
139+
.flatMap(addon.getIslands()::getIslandById).map(Island::getName).orElse("");
137140
}
138141

139142
/**
@@ -145,27 +148,27 @@ String getRankIslandName(World world, int rank, boolean weighted) {
145148
* @return comma separated string of island member names
146149
*/
147150
String getRankMembers(World world, int rank, boolean weighted) {
148-
// Ensure rank is within bounds
149-
rank = Math.max(1, Math.min(rank, Level.TEN));
150-
if (weighted) {
151-
return addon.getManager().getWeightedTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L)
152-
.findFirst()
153-
.map(is -> is.getMembers().entrySet().stream().filter(e -> e.getValue() >= RanksManager.MEMBER_RANK)
154-
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).map(Map.Entry::getKey)
155-
.map(addon.getPlayers()::getName).collect(Collectors.joining(",")))
156-
.orElse("");
157-
}
158-
159-
Optional<Island> island = addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L)
160-
.limit(1L).findFirst().flatMap(addon.getIslands()::getIslandById);
161-
162-
if (island.isPresent()) {
163-
// Sort members by rank
164-
return island.get().getMembers().entrySet().stream().filter(e -> e.getValue() >= RanksManager.MEMBER_RANK)
165-
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).map(Map.Entry::getKey)
166-
.map(addon.getPlayers()::getName).collect(Collectors.joining(","));
167-
}
168-
return "";
151+
// Ensure rank is within bounds
152+
rank = Math.max(1, Math.min(rank, Level.TEN));
153+
if (weighted) {
154+
return addon.getManager().getWeightedTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L)
155+
.findFirst()
156+
.map(is -> is.getMembers().entrySet().stream().filter(e -> e.getValue() >= RanksManager.MEMBER_RANK)
157+
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).map(Map.Entry::getKey)
158+
.map(addon.getPlayers()::getName).collect(Collectors.joining(",")))
159+
.orElse("");
160+
}
161+
162+
Optional<Island> island = addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L)
163+
.limit(1L).findFirst().flatMap(addon.getIslands()::getIslandById);
164+
165+
if (island.isPresent()) {
166+
// Sort members by rank
167+
return island.get().getMembers().entrySet().stream().filter(e -> e.getValue() >= RanksManager.MEMBER_RANK)
168+
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).map(Map.Entry::getKey)
169+
.map(addon.getPlayers()::getName).collect(Collectors.joining(","));
170+
}
171+
return "";
169172
}
170173

171174
/**
@@ -177,14 +180,14 @@ String getRankMembers(World world, int rank, boolean weighted) {
177180
* @return level for the rank requested
178181
*/
179182
String getRankLevel(World world, int rank, boolean weighted) {
180-
// Ensure rank is within bounds
181-
rank = Math.max(1, Math.min(rank, Level.TEN));
182-
if (weighted) {
183-
return addon.getManager().formatLevel(addon.getManager().getWeightedTopTen(world, Level.TEN).values()
184-
.stream().skip(rank - 1L).limit(1L).findFirst().orElse(null));
185-
}
186-
return addon.getManager().formatLevel(addon.getManager().getTopTen(world, Level.TEN).values().stream()
187-
.skip(rank - 1L).limit(1L).findFirst().orElse(null));
183+
// Ensure rank is within bounds
184+
rank = Math.max(1, Math.min(rank, Level.TEN));
185+
if (weighted) {
186+
return addon.getManager().formatLevel(addon.getManager().getWeightedTopTen(world, Level.TEN).values()
187+
.stream().skip(rank - 1L).limit(1L).findFirst().orElse(null));
188+
}
189+
return addon.getManager().formatLevel(addon.getManager().getTopTen(world, Level.TEN).values().stream()
190+
.skip(rank - 1L).limit(1L).findFirst().orElse(null));
188191
}
189192

190193
/**
@@ -195,21 +198,21 @@ String getRankLevel(World world, int rank, boolean weighted) {
195198
* @return rank where 1 is the top rank.
196199
*/
197200
private String getRankValue(World world, User user) {
198-
if (user == null) {
199-
return "";
200-
}
201-
// Get the island level for this user
202-
long level = addon.getManager().getIslandLevel(world, user.getUniqueId());
203-
return String.valueOf(addon.getManager().getTopTenLists().getOrDefault(world, new TopTenData(world)).getTopTen()
204-
.values().stream().filter(l -> l > level).count() + 1);
201+
if (user == null) {
202+
return "";
203+
}
204+
// Get the island level for this user
205+
long level = addon.getManager().getIslandLevel(world, user.getUniqueId());
206+
return String.valueOf(addon.getManager().getTopTenLists().getOrDefault(world, new TopTenData(world)).getTopTen()
207+
.values().stream().filter(l -> l > level).count() + 1);
205208
}
206209

207210
String getVisitedIslandLevel(GameModeAddon gm, User user) {
208-
if (user == null || !gm.inWorld(user.getWorld()))
209-
return "";
210-
return addon.getIslands().getIslandAt(user.getLocation())
211-
.map(island -> addon.getManager().getIslandLevelString(gm.getOverWorld(), island.getOwner()))
212-
.orElse("0");
211+
if (user == null || !gm.inWorld(user.getWorld()))
212+
return "";
213+
return addon.getIslands().getIslandAt(user.getLocation())
214+
.map(island -> addon.getManager().getIslandLevelString(gm.getOverWorld(), island.getOwner()))
215+
.orElse("0");
213216
}
214217

215218
}

src/main/java/world/bentobox/level/commands/IslandValueCommand.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
import org.bukkit.Material;
99
import org.bukkit.entity.Player;
1010
import org.bukkit.inventory.PlayerInventory;
11+
import org.eclipse.jdt.annotation.NonNull;
1112

1213
import world.bentobox.bentobox.api.commands.CompositeCommand;
14+
import world.bentobox.bentobox.api.localization.TextVariables;
1315
import world.bentobox.bentobox.api.user.User;
1416
import world.bentobox.bentobox.util.Util;
1517
import world.bentobox.level.Level;
18+
import world.bentobox.level.objects.IslandLevels;
1619
import world.bentobox.level.panels.ValuePanel;
1720
import world.bentobox.level.util.Utils;
1821

@@ -112,6 +115,19 @@ private void printValue(User user, Material material)
112115
"[value]", (underWater * value) + ""),
113116
MATERIAL, Utils.prettifyObject(material, user));
114117
}
118+
119+
// Show how many have been placed and how many are allowed
120+
@NonNull
121+
IslandLevels lvData = this.addon.getManager()
122+
.getLevelsData(getIslands().getPrimaryIsland(getWorld(), user.getUniqueId()));
123+
int count = lvData.getMdCount().getOrDefault(material, 0) + lvData.getUwCount().getOrDefault(material, 0);
124+
user.sendMessage("level.conversations.you-have", TextVariables.NUMBER,
125+
String.valueOf(count));
126+
int limit = this.addon.getBlockConfig().getBlockLimits().getOrDefault(material, -1);
127+
if (limit > 0) {
128+
user.sendMessage("level.conversations.you-can-place", TextVariables.NUMBER,
129+
String.valueOf(limit));
130+
}
115131
}
116132
else
117133
{

0 commit comments

Comments
 (0)