Skip to content

Commit 9d1a5c7

Browse files
authored
Changed top ten internally to use islands instead of players as keys (#295)
Added %[gamemode]_top_weighted_value_x% placeholder #294
1 parent 26d4839 commit 9d1a5c7

12 files changed

+1662
-1725
lines changed

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

+415-438
Large diffs are not rendered by default.

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

+140-106
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
import java.util.Collections;
44
import java.util.Map;
5+
import java.util.Map.Entry;
6+
import java.util.Optional;
57
import java.util.UUID;
68
import java.util.stream.Collectors;
79

810
import org.bukkit.World;
11+
import org.eclipse.jdt.annotation.Nullable;
912

1013
import world.bentobox.bentobox.BentoBox;
1114
import world.bentobox.bentobox.api.addons.GameModeAddon;
@@ -18,6 +21,7 @@
1821

1922
/**
2023
* Handles Level placeholders
24+
*
2125
* @author tastybento
2226
*
2327
*/
@@ -27,150 +31,180 @@ public class PlaceholderManager {
2731
private final BentoBox plugin;
2832

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

8489
/**
85-
* Get the name of the player who holds the rank in this world
90+
* Get the name of the owner of the island who holds the rank in this world.
91+
*
8692
* @param world world
87-
* @param rank rank 1 to 10
93+
* @param rank rank 1 to 10
8894
* @return rank name
8995
*/
9096
String getRankName(World world, int rank) {
91-
if (rank < 1) rank = 1;
92-
if (rank > Level.TEN) rank = Level.TEN;
93-
return addon.getPlayers().getName(addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L).findFirst().orElse(null));
97+
// Ensure rank is within bounds
98+
rank = Math.max(1, Math.min(rank, Level.TEN));
99+
@Nullable
100+
UUID owner = addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L)
101+
.findFirst().flatMap(addon.getIslands()::getIslandById).map(Island::getOwner).orElse(null);
102+
103+
return addon.getPlayers().getName(owner);
94104
}
95105

96106
/**
97107
* Get the island name for this rank
108+
*
98109
* @param world world
99-
* @param rank rank 1 to 10
110+
* @param rank rank 1 to 10
100111
* @return name of island or nothing if there isn't one
101112
*/
102113
String getRankIslandName(World world, int rank) {
103-
if (rank < 1) rank = 1;
104-
if (rank > Level.TEN) rank = Level.TEN;
105-
UUID owner = addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L).findFirst().orElse(null);
106-
if (owner != null) {
107-
Island island = addon.getIslands().getIsland(world, owner);
108-
if (island != null) {
109-
return island.getName() == null ? "" : island.getName();
110-
}
111-
}
112-
return "";
114+
// Ensure rank is within bounds
115+
rank = Math.max(1, Math.min(rank, Level.TEN));
116+
return addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L).findFirst()
117+
.flatMap(addon.getIslands()::getIslandById).map(Island::getName).orElse("");
113118
}
114119

115120
/**
116121
* Gets a comma separated string of island member names
122+
*
117123
* @param world world
118-
* @param rank rank to request
124+
* @param rank rank to request
119125
* @return comma separated string of island member names
120126
*/
121127
String getRankMembers(World world, int rank) {
122-
if (rank < 1) rank = 1;
123-
if (rank > Level.TEN) rank = Level.TEN;
124-
UUID owner = addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L).findFirst().orElse(null);
125-
if (owner != null) {
126-
Island island = addon.getIslands().getIsland(world, owner);
127-
if (island != null) {
128-
// Sort members by rank
129-
return island.getMembers().entrySet().stream()
130-
.filter(e -> e.getValue() >= RanksManager.MEMBER_RANK)
131-
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
132-
.map(Map.Entry::getKey)
133-
.map(addon.getPlayers()::getName)
134-
.collect(Collectors.joining(","));
135-
}
136-
}
137-
return "";
128+
// Ensure rank is within bounds
129+
rank = Math.max(1, Math.min(rank, Level.TEN));
130+
Optional<Island> island = addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L)
131+
.limit(1L).findFirst().flatMap(addon.getIslands()::getIslandById);
132+
133+
if (island.isPresent()) {
134+
// Sort members by rank
135+
return island.get().getMembers().entrySet().stream().filter(e -> e.getValue() >= RanksManager.MEMBER_RANK)
136+
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).map(Map.Entry::getKey)
137+
.map(addon.getPlayers()::getName).collect(Collectors.joining(","));
138+
}
139+
return "";
140+
}
141+
142+
/**
143+
* Gets the weighted level, which is the level / number of players
144+
*
145+
* @param world world
146+
* @param rank level
147+
* @return weighted level
148+
*/
149+
String getWeightedRankLevel(World world, int rank) {
150+
// Ensure rank is within bounds
151+
rank = Math.max(1, Math.min(rank, Level.TEN));
152+
153+
// Retrieve the top ten entries
154+
Map<String, Long> topTen = addon.getManager().getTopTen(world, Level.TEN);
155+
if (topTen.isEmpty()) {
156+
return "";
157+
}
158+
159+
// Find the entry corresponding to the rank
160+
Entry<String, Long> entry = topTen.entrySet().stream().skip(rank - 1).findFirst().orElse(null);
161+
if (entry == null) {
162+
return "";
163+
}
164+
165+
// Calculate the score
166+
Island island = addon.getIslands().getIslandById(entry.getKey()).orElse(null);
167+
if (island == null || island.getMemberSet().isEmpty()) {
168+
return "";
169+
}
170+
171+
double score = (double) entry.getValue() / island.getMemberSet().size();
172+
173+
// Format and return the level
174+
return addon.getManager().formatLevel((long) score);
175+
138176
}
139177

140178
String getRankLevel(World world, int rank) {
141-
if (rank < 1) rank = 1;
142-
if (rank > Level.TEN) rank = Level.TEN;
143-
return addon.getManager()
144-
.formatLevel(addon.getManager()
145-
.getTopTen(world, Level.TEN)
146-
.values()
147-
.stream()
148-
.skip(rank - 1L)
149-
.limit(1L)
150-
.findFirst()
151-
.orElse(null));
179+
// Ensure rank is within bounds
180+
rank = Math.max(1, Math.min(rank, Level.TEN));
181+
return addon.getManager().formatLevel(addon.getManager().getTopTen(world, Level.TEN).values().stream()
182+
.skip(rank - 1L).limit(1L).findFirst().orElse(null));
152183
}
153-
184+
154185
/**
155186
* Return the rank of the player in a world
187+
*
156188
* @param world world
157-
* @param user player
189+
* @param user player
158190
* @return rank where 1 is the top rank.
159191
*/
160192
private String getRankValue(World world, User user) {
161-
if (user == null) {
162-
return "";
163-
}
164-
// Get the island level for this user
165-
long level = addon.getManager().getIslandLevel(world, user.getUniqueId());
166-
return String.valueOf(addon.getManager().getTopTenLists().getOrDefault(world, new TopTenData(world)).getTopTen().values().stream().filter(l -> l > level).count() + 1);
193+
if (user == null) {
194+
return "";
195+
}
196+
// Get the island level for this user
197+
long level = addon.getManager().getIslandLevel(world, user.getUniqueId());
198+
return String.valueOf(addon.getManager().getTopTenLists().getOrDefault(world, new TopTenData(world)).getTopTen()
199+
.values().stream().filter(l -> l > level).count() + 1);
167200
}
168201

169202
String getVisitedIslandLevel(GameModeAddon gm, User user) {
170-
if (user == null || !gm.inWorld(user.getWorld())) return "";
171-
return addon.getIslands().getIslandAt(user.getLocation())
172-
.map(island -> addon.getManager().getIslandLevelString(gm.getOverWorld(), island.getOwner()))
173-
.orElse("0");
203+
if (user == null || !gm.inWorld(user.getWorld()))
204+
return "";
205+
return addon.getIslands().getIslandAt(user.getLocation())
206+
.map(island -> addon.getManager().getIslandLevelString(gm.getOverWorld(), island.getOwner()))
207+
.orElse("0");
174208
}
175209

176210
}

0 commit comments

Comments
 (0)