mirror of
https://github.com/BentoBoxWorld/Level.git
synced 2024-09-29 16:17:30 +02:00
200 lines
6.8 KiB
Java
200 lines
6.8 KiB
Java
package world.bentobox.level;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map.Entry;
|
|
import java.util.UUID;
|
|
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.ChatColor;
|
|
import org.bukkit.World;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.event.Listener;
|
|
import org.eclipse.jdt.annotation.NonNull;
|
|
import org.eclipse.jdt.annotation.Nullable;
|
|
|
|
import world.bentobox.bentobox.api.panels.PanelItem;
|
|
import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
|
|
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
|
|
import world.bentobox.bentobox.api.user.User;
|
|
import world.bentobox.bentobox.database.Database;
|
|
import world.bentobox.level.objects.TopTenData;
|
|
|
|
/**
|
|
* Handles all Top Ten List functions
|
|
*
|
|
* @author tastybento
|
|
*
|
|
*/
|
|
public class TopTen implements Listener {
|
|
private final Level addon;
|
|
// Top ten list of players
|
|
private Map<World,TopTenData> topTenList;
|
|
private final int[] SLOTS = new int[] {4, 12, 14, 19, 20, 21, 22, 23, 24, 25};
|
|
private final Database<TopTenData> handler;
|
|
|
|
public TopTen(Level addon) {
|
|
this.addon = addon;
|
|
// Set up the database handler to store and retrieve the TopTenList class
|
|
// Note that these are saved in the BSkyBlock database
|
|
handler = new Database<>(addon, TopTenData.class);
|
|
loadTopTen();
|
|
}
|
|
|
|
/**
|
|
* Loads all the top tens from the database
|
|
*/
|
|
private void loadTopTen() {
|
|
topTenList = new HashMap<>();
|
|
handler.loadObjects().forEach(tt -> {
|
|
World world = Bukkit.getWorld(tt.getUniqueId());
|
|
if (world != null) {
|
|
topTenList.put(world, tt);
|
|
addon.log("Loaded TopTen for " + world.getName());
|
|
} else {
|
|
addon.logError("TopTen world " + tt.getUniqueId() + " is not known on server. Skipping...");
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Adds a player to the top ten, if the level is good enough
|
|
*
|
|
* @param ownerUUID - owner UUID
|
|
* @param l - level
|
|
*/
|
|
public void addEntry(World world, UUID ownerUUID, long l) {
|
|
// Check if player is an island owner or not
|
|
if (!addon.getIslands().isOwner(world, ownerUUID)) {
|
|
return;
|
|
}
|
|
// Set up world data
|
|
topTenList.putIfAbsent(world, new TopTenData());
|
|
topTenList.get(world).setUniqueId(world.getName());
|
|
|
|
// Try and see if the player is online
|
|
Player player = Bukkit.getServer().getPlayer(ownerUUID);
|
|
if (player != null && !player.hasPermission(addon.getPlugin().getIWM().getPermissionPrefix(world) + "intopten")) {
|
|
topTenList.get(world).remove(ownerUUID);
|
|
return;
|
|
}
|
|
topTenList.get(world).addLevel(ownerUUID, l);
|
|
}
|
|
|
|
/**
|
|
* Displays the Top Ten list
|
|
* @param world - world
|
|
* @param user - the requesting player
|
|
*/
|
|
public void getGUI(World world, final User user, String permPrefix) {
|
|
// Check world
|
|
topTenList.putIfAbsent(world, new TopTenData());
|
|
topTenList.get(world).setUniqueId(world.getName());
|
|
|
|
PanelBuilder panel = new PanelBuilder()
|
|
.name(user.getTranslation("island.top.gui-title"))
|
|
.user(user);
|
|
|
|
int i = 1;
|
|
Iterator<Entry<UUID, Long>> it = topTenList.get(world).getTopTen().entrySet().iterator();
|
|
while (it.hasNext()) {
|
|
Map.Entry<UUID, Long> m = it.next();
|
|
UUID topTenUUID = m.getKey();
|
|
// Remove from TopTen if the player is online and has the permission
|
|
Player entry = Bukkit.getServer().getPlayer(topTenUUID);
|
|
boolean show = true;
|
|
if (entry != null) {
|
|
if (!entry.hasPermission(permPrefix + "intopten")) {
|
|
it.remove();
|
|
show = false;
|
|
// Remove from Top Ten completely
|
|
topTenList.get(world).remove(topTenUUID);
|
|
}
|
|
}
|
|
if (show) {
|
|
panel.item(SLOTS[i-1], getHead(i, m.getValue(), topTenUUID, user, world));
|
|
if (i++ == 10) break;
|
|
}
|
|
}
|
|
panel.build();
|
|
}
|
|
|
|
/**
|
|
* Get the head panel item
|
|
* @param rank - the top ten rank of this player/team. Can be used in the name of the island for vanity.
|
|
* @param level - the level of the island
|
|
* @param playerUUID - the UUID of the top ten player
|
|
* @param asker - the asker of the top ten
|
|
* @return PanelItem
|
|
*/
|
|
private PanelItem getHead(int rank, long level, UUID playerUUID, User asker, World world) {
|
|
final String name = addon.getPlayers().getName(playerUUID);
|
|
List<String> description = new ArrayList<>();
|
|
description.add(asker.getTranslation("island.top.gui-heading", "[name]", name, "[rank]", String.valueOf(rank)));
|
|
description.add(asker.getTranslation("island.top.island-level","[level]", addon.getLevelPresenter().getLevelString(level)));
|
|
if (addon.getIslands().inTeam(world, playerUUID)) {
|
|
List<String> memberList = new ArrayList<>();
|
|
for (UUID members : addon.getIslands().getMembers(world, playerUUID)) {
|
|
memberList.add(ChatColor.AQUA + addon.getPlayers().getName(members));
|
|
}
|
|
description.addAll(memberList);
|
|
}
|
|
|
|
PanelItemBuilder builder = new PanelItemBuilder()
|
|
.icon(name)
|
|
.name(name)
|
|
.description(description);
|
|
return builder.build();
|
|
}
|
|
|
|
/**
|
|
* Get the top ten list for this world
|
|
* @param world - world
|
|
* @return top ten data object
|
|
*/
|
|
@NonNull
|
|
public TopTenData getTopTenList(World world) {
|
|
return topTenList.computeIfAbsent(world, k -> new TopTenData());
|
|
}
|
|
|
|
/**
|
|
* Get the UUID for this rank in this world
|
|
* @param world - world
|
|
* @param rank - rank between 1 and 10
|
|
* @return UUID or null
|
|
*/
|
|
@Nullable
|
|
public UUID getTopTenUUID(World world, int rank) {
|
|
return getTopTenList(world).getTopTenUUID(rank);
|
|
}
|
|
|
|
/**
|
|
* Get the island level for this rank in this world
|
|
* @param world - world
|
|
* @param rank - rank between 1 and 10
|
|
* @return level or 0
|
|
*/
|
|
public long getTopTenLevel(World world, int rank) {
|
|
return getTopTenList(world).getTopTenLevel(rank);
|
|
}
|
|
|
|
/**
|
|
* Removes ownerUUID from the top ten list
|
|
*
|
|
* @param ownerUUID - uuid to remove
|
|
*/
|
|
public void removeEntry(World world, UUID ownerUUID) {
|
|
topTenList.putIfAbsent(world, new TopTenData());
|
|
topTenList.get(world).setUniqueId(world.getName());
|
|
topTenList.get(world).remove(ownerUUID);
|
|
}
|
|
|
|
public void saveTopTen() {
|
|
topTenList.values().forEach(handler::saveObject);
|
|
}
|
|
|
|
}
|