177 lines
7.2 KiB
Java
177 lines
7.2 KiB
Java
package world.bentobox.level;
|
|
|
|
import java.util.Collections;
|
|
import java.util.Map;
|
|
import java.util.UUID;
|
|
import java.util.stream.Collectors;
|
|
|
|
import org.bukkit.World;
|
|
|
|
import world.bentobox.bentobox.BentoBox;
|
|
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
|
import world.bentobox.bentobox.api.user.User;
|
|
import world.bentobox.bentobox.database.objects.Island;
|
|
import world.bentobox.bentobox.managers.PlaceholdersManager;
|
|
import world.bentobox.bentobox.managers.RanksManager;
|
|
import world.bentobox.level.objects.IslandLevels;
|
|
import world.bentobox.level.objects.TopTenData;
|
|
|
|
/**
|
|
* Handles Level placeholders
|
|
* @author tastybento
|
|
*
|
|
*/
|
|
public class PlaceholderManager {
|
|
|
|
private final Level addon;
|
|
private final BentoBox plugin;
|
|
|
|
public PlaceholderManager(Level addon) {
|
|
this.addon = addon;
|
|
this.plugin = addon.getPlugin();
|
|
}
|
|
|
|
protected void registerPlaceholders(GameModeAddon gm) {
|
|
if (plugin.getPlaceholdersManager() == null) return;
|
|
PlaceholdersManager bpm = plugin.getPlaceholdersManager();
|
|
// Island Level
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_island_level",
|
|
user -> addon.getManager().getIslandLevelString(gm.getOverWorld(), user.getUniqueId()));
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_island_level_raw",
|
|
user -> String.valueOf(addon.getManager().getIslandLevel(gm.getOverWorld(), user.getUniqueId())));
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_island_total_points",
|
|
user -> {
|
|
IslandLevels data = addon.getManager().getLevelsData(addon.getIslands().getIsland(gm.getOverWorld(), user));
|
|
return data.getTotalPoints()+"";
|
|
});
|
|
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_points_to_next_level",
|
|
user -> addon.getManager().getPointsToNextString(gm.getOverWorld(), user.getUniqueId()));
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_island_level_max",
|
|
user -> String.valueOf(addon.getManager().getIslandMaxLevel(gm.getOverWorld(), user.getUniqueId())));
|
|
|
|
// Visited Island Level
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_visited_island_level", user -> getVisitedIslandLevel(gm, user));
|
|
|
|
// Register Top Ten Placeholders
|
|
for (int i = 1; i < 11; i++) {
|
|
final int rank = i;
|
|
// Name
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_top_name_" + i, u -> getRankName(gm.getOverWorld(), rank));
|
|
// Island Name
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_top_island_name_" + i, u -> getRankIslandName(gm.getOverWorld(), rank));
|
|
// Members
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_top_members_" + i, u -> getRankMembers(gm.getOverWorld(), rank));
|
|
// Level
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_top_value_" + i, u -> getRankLevel(gm.getOverWorld(), rank));
|
|
}
|
|
|
|
// Personal rank
|
|
bpm.registerPlaceholder(addon,
|
|
gm.getDescription().getName().toLowerCase() + "_rank_value", u -> getRankValue(gm.getOverWorld(), u));
|
|
}
|
|
|
|
/**
|
|
* Get the name of the player who holds the rank in this world
|
|
* @param world world
|
|
* @param rank rank 1 to 10
|
|
* @return rank name
|
|
*/
|
|
String getRankName(World world, int rank) {
|
|
if (rank < 1) rank = 1;
|
|
if (rank > Level.TEN) rank = Level.TEN;
|
|
return addon.getPlayers().getName(addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L).findFirst().orElse(null));
|
|
}
|
|
|
|
/**
|
|
* Get the island name for this rank
|
|
* @param world world
|
|
* @param rank rank 1 to 10
|
|
* @return name of island or nothing if there isn't one
|
|
*/
|
|
String getRankIslandName(World world, int rank) {
|
|
if (rank < 1) rank = 1;
|
|
if (rank > Level.TEN) rank = Level.TEN;
|
|
UUID owner = addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L).findFirst().orElse(null);
|
|
if (owner != null) {
|
|
Island island = addon.getIslands().getIsland(world, owner);
|
|
if (island != null) {
|
|
return island.getName() == null ? "" : island.getName();
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
/**
|
|
* Gets a comma separated string of island member names
|
|
* @param world world
|
|
* @param rank rank to request
|
|
* @return comma separated string of island member names
|
|
*/
|
|
String getRankMembers(World world, int rank) {
|
|
if (rank < 1) rank = 1;
|
|
if (rank > Level.TEN) rank = Level.TEN;
|
|
UUID owner = addon.getManager().getTopTen(world, Level.TEN).keySet().stream().skip(rank - 1L).limit(1L).findFirst().orElse(null);
|
|
if (owner != null) {
|
|
Island island = addon.getIslands().getIsland(world, owner);
|
|
if (island != null) {
|
|
// Sort members by rank
|
|
return island.getMembers().entrySet().stream()
|
|
.filter(e -> e.getValue() >= RanksManager.MEMBER_RANK)
|
|
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
|
|
.map(Map.Entry::getKey)
|
|
.map(addon.getPlayers()::getName)
|
|
.collect(Collectors.joining(","));
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
String getRankLevel(World world, int rank) {
|
|
if (rank < 1) rank = 1;
|
|
if (rank > Level.TEN) rank = Level.TEN;
|
|
return addon.getManager()
|
|
.formatLevel(addon.getManager()
|
|
.getTopTen(world, Level.TEN)
|
|
.values()
|
|
.stream()
|
|
.skip(rank - 1L)
|
|
.limit(1L)
|
|
.findFirst()
|
|
.orElse(null));
|
|
}
|
|
|
|
/**
|
|
* Return the rank of the player in a world
|
|
* @param world world
|
|
* @param user player
|
|
* @return rank where 1 is the top rank.
|
|
*/
|
|
private String getRankValue(World world, User user) {
|
|
if (user == null) {
|
|
return "";
|
|
}
|
|
// Get the island level for this user
|
|
long level = addon.getManager().getIslandLevel(world, user.getUniqueId());
|
|
return String.valueOf(addon.getManager().getTopTenLists().getOrDefault(world, new TopTenData(world)).getTopTen().values().stream().filter(l -> l > level).count() + 1);
|
|
}
|
|
|
|
String getVisitedIslandLevel(GameModeAddon gm, User user) {
|
|
if (user == null || !gm.inWorld(user.getWorld())) return "";
|
|
return addon.getIslands().getIslandAt(user.getLocation())
|
|
.map(island -> addon.getManager().getIslandLevelString(gm.getOverWorld(), island.getOwner()))
|
|
.orElse("0");
|
|
}
|
|
|
|
}
|