mirror of
https://github.com/BentoBoxWorld/Level.git
synced 2024-12-17 22:17:38 +01:00
Added top ten functionality.
Still needs more testing, but works on mysql.
This commit is contained in:
parent
393d4f7c83
commit
dc416e9176
@ -12,4 +12,9 @@
|
|||||||
island:
|
island:
|
||||||
islandLevelIs: "Island level is"
|
islandLevelIs: "Island level is"
|
||||||
requiredPointsToNextLevel: "[points] points required until the next level"
|
requiredPointsToNextLevel: "[points] points required until the next level"
|
||||||
levelDeaths: "([number] deaths)"
|
levelDeaths: "([number] deaths)"
|
||||||
|
topten:
|
||||||
|
guiTitle: "Top Ten"
|
||||||
|
guiHeading: "[name]:[rank]"
|
||||||
|
islandLevel: "Level [level]"
|
||||||
|
|
@ -22,7 +22,7 @@ public class Commands extends CalculateLevel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setupCommands() {
|
private void setupCommands() {
|
||||||
BSkyBlock bSkyBlock = BSkyBlock.getPlugin();
|
// level command
|
||||||
bSkyBlock.addSubCommand(new ArgumentHandler("island") {
|
bSkyBlock.addSubCommand(new ArgumentHandler("island") {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -32,17 +32,17 @@ public class Commands extends CalculateLevel {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(CommandSender sender, String[] args) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
plugin.getLogger().info("DEBUG: " + args);
|
//getLogger().info("DEBUG: " + args);
|
||||||
if (args.length > 0) {
|
if (args.length > 0) {
|
||||||
// Asking for another player's level?
|
// Asking for another player's level?
|
||||||
// Convert name to a UUID
|
// Convert name to a UUID
|
||||||
final UUID playerUUID = bSkyBlock.getPlayers().getUUID(args[0], true);
|
final UUID playerUUID = bSkyBlock.getPlayers().getUUID(args[0], true);
|
||||||
plugin.getLogger().info("DEBUG: console player info UUID = " + playerUUID);
|
//getLogger().info("DEBUG: console player info UUID = " + playerUUID);
|
||||||
if (playerUUID == null) {
|
if (playerUUID == null) {
|
||||||
Util.sendMessage(sender, ChatColor.RED + plugin.getLocale(sender).get("error.UnknownPlayer"));
|
sendMessage(sender, ChatColor.RED + getLocale(sender).get("error.UnknownPlayer"));
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
Util.sendMessage(sender, ChatColor.GREEN + "Level is " + plugin.getIslandLevel(playerUUID));
|
sendMessage(sender, ChatColor.GREEN + "Level is " + plugin.getIslandLevel(playerUUID));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -76,7 +76,36 @@ public class Commands extends CalculateLevel {
|
|||||||
}
|
}
|
||||||
}.alias("level"));
|
}.alias("level"));
|
||||||
|
|
||||||
// Admin command
|
// top command
|
||||||
|
bSkyBlock.addSubCommand(new ArgumentHandler("island") {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CanUseResp canUse(CommandSender sender) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
VaultHelper.hasPerm((Player)sender, Settings.PERMPREFIX + "island.topten");
|
||||||
|
return new CanUseResp(true);
|
||||||
|
}
|
||||||
|
return new CanUseResp(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
plugin.getTopTen().topTenShow((Player)sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> tabComplete(CommandSender sender, String[] args) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] usage(CommandSender sender) {
|
||||||
|
return new String[]{"", "View top ten"};
|
||||||
|
}
|
||||||
|
}.alias("top"));
|
||||||
|
|
||||||
|
// Admin level command
|
||||||
bSkyBlock.addSubCommand(new ArgumentHandler("bsadmin") {
|
bSkyBlock.addSubCommand(new ArgumentHandler("bsadmin") {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -91,7 +120,7 @@ public class Commands extends CalculateLevel {
|
|||||||
} else {
|
} else {
|
||||||
// Convert name to a UUID
|
// Convert name to a UUID
|
||||||
final UUID playerUUID = bSkyBlock.getPlayers().getUUID(args[0], true);
|
final UUID playerUUID = bSkyBlock.getPlayers().getUUID(args[0], true);
|
||||||
plugin.getLogger().info("DEBUG: console player info UUID = " + playerUUID);
|
//plugin.getLogger().info("DEBUG: console player info UUID = " + playerUUID);
|
||||||
if (playerUUID == null) {
|
if (playerUUID == null) {
|
||||||
Util.sendMessage(sender, ChatColor.RED + plugin.getLocale(sender).get("error.UnknownPlayer"));
|
Util.sendMessage(sender, ChatColor.RED + plugin.getLocale(sender).get("error.UnknownPlayer"));
|
||||||
return;
|
return;
|
||||||
|
@ -3,6 +3,8 @@ package bskyblock.addin.level;
|
|||||||
import java.beans.IntrospectionException;
|
import java.beans.IntrospectionException;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@ -17,50 +19,59 @@ import us.tastybento.bskyblock.config.BSBLocale;
|
|||||||
import us.tastybento.bskyblock.database.BSBDatabase;
|
import us.tastybento.bskyblock.database.BSBDatabase;
|
||||||
import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler;
|
import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Addin to BSkyBlock that enables island level scoring and top ten functionality
|
||||||
|
* @author tastybento
|
||||||
|
*
|
||||||
|
*/
|
||||||
public class Level extends JavaPlugin {
|
public class Level extends JavaPlugin {
|
||||||
|
|
||||||
|
|
||||||
|
// The BSkyBlock plugin instance.
|
||||||
private BSkyBlock bSkyBlock;
|
private BSkyBlock bSkyBlock;
|
||||||
|
|
||||||
// Level calc checker
|
// Level calc checker
|
||||||
BukkitTask checker = null;
|
BukkitTask checker = null;
|
||||||
|
|
||||||
|
// Locale manager for this plugin
|
||||||
private LocaleManager localeManager;
|
private LocaleManager localeManager;
|
||||||
|
|
||||||
|
// Database handler for level data
|
||||||
private AbstractDatabaseHandler<Levels> handler;
|
private AbstractDatabaseHandler<Levels> handler;
|
||||||
|
|
||||||
|
// The BSkyBlock database object
|
||||||
private BSBDatabase database;
|
private BSBDatabase database;
|
||||||
|
|
||||||
private Levels levelsCache;
|
// A cache of island levels. Island levels are not kept in memory unless required.
|
||||||
|
// The cache is saved when the server shuts down and the plugin is disabled.
|
||||||
|
// TODO: Save regularly to avoid crash issues.
|
||||||
|
private HashMap<UUID, Long> levelsCache;
|
||||||
|
|
||||||
|
// The Top Ten object
|
||||||
|
private TopTen topTen;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
// Load the plugin's config
|
// Load the plugin's config
|
||||||
new PluginConfig(this);
|
new PluginConfig(this);
|
||||||
// Get the BSkyBlock plugin
|
// Get the BSkyBlock plugin. This will be available because this plugin depends on it in plugin.yml.
|
||||||
bSkyBlock = BSkyBlock.getPlugin();
|
bSkyBlock = BSkyBlock.getPlugin();
|
||||||
|
// Check if it is enabled - it might be loaded, but not enabled.
|
||||||
if (!bSkyBlock.isEnabled()) {
|
if (!bSkyBlock.isEnabled()) {
|
||||||
this.setEnabled(false);
|
this.setEnabled(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Set up database
|
// Get the BSkyBlock database
|
||||||
database = BSBDatabase.getDatabase();
|
database = BSBDatabase.getDatabase();
|
||||||
// Set up the database handler to store and retrieve Island classes
|
// Set up the database handler to store and retrieve Island classes
|
||||||
// Note that these are saved by the BSkyBlock database
|
// Note that these are saved by the BSkyBlock database
|
||||||
handler = (AbstractDatabaseHandler<Levels>) database.getHandler(bSkyBlock, Levels.class);
|
handler = (AbstractDatabaseHandler<Levels>) database.getHandler(bSkyBlock, Levels.class);
|
||||||
// Load the levels to a cache
|
// Initialize the cache
|
||||||
levelsCache = new Levels();
|
levelsCache = new HashMap<>();
|
||||||
try {
|
// Start the top ten and register it for clicks
|
||||||
levelsCache = handler.loadObject("addon-levels");
|
topTen = new TopTen(this);
|
||||||
if (levelsCache == null) {
|
getServer().getPluginManager().registerEvents(topTen, this);
|
||||||
levelsCache = new Levels();
|
|
||||||
}
|
|
||||||
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
|
|
||||||
| InvocationTargetException | SecurityException | ClassNotFoundException | IntrospectionException
|
|
||||||
| SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
// Start the top ten
|
|
||||||
new TopTen(this);
|
|
||||||
// Local locales
|
// Local locales
|
||||||
localeManager = new LocaleManager(this);
|
localeManager = new LocaleManager(this);
|
||||||
// Register commands
|
// Register commands
|
||||||
@ -83,7 +94,12 @@ public class Level extends JavaPlugin {
|
|||||||
public void save(boolean async){
|
public void save(boolean async){
|
||||||
Runnable save = () -> {
|
Runnable save = () -> {
|
||||||
try {
|
try {
|
||||||
handler.saveObject(levelsCache);
|
for (Entry<UUID, Long> en : levelsCache.entrySet()) {
|
||||||
|
Levels lv = new Levels();
|
||||||
|
lv.setLevel(en.getValue());
|
||||||
|
lv.setUniqueId(en.getKey().toString());
|
||||||
|
handler.saveObject(lv);
|
||||||
|
}
|
||||||
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException
|
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException
|
||||||
| InstantiationException | NoSuchMethodException | IntrospectionException | SQLException e) {
|
| InstantiationException | NoSuchMethodException | IntrospectionException | SQLException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
@ -102,20 +118,39 @@ public class Level extends JavaPlugin {
|
|||||||
* @param targetPlayer
|
* @param targetPlayer
|
||||||
* @return Level of player
|
* @return Level of player
|
||||||
*/
|
*/
|
||||||
public Long getIslandLevel(UUID targetPlayer) {
|
public long getIslandLevel(UUID targetPlayer) {
|
||||||
//getLogger().info("DEBUG: getting island level for " + bSkyBlock.getPlayers().getName(targetPlayer));
|
//getLogger().info("DEBUG: getting island level for " + bSkyBlock.getPlayers().getName(targetPlayer));
|
||||||
return levelsCache.getLevel(targetPlayer);
|
if (levelsCache.containsKey(targetPlayer)) {
|
||||||
|
return levelsCache.get(targetPlayer);
|
||||||
|
}
|
||||||
|
// Get from database
|
||||||
|
Levels level;
|
||||||
|
try {
|
||||||
|
level = handler.loadObject(targetPlayer.toString());
|
||||||
|
if (level == null) {
|
||||||
|
// We do not know this player, set to zero
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
levelsCache.put(targetPlayer, level.getLevel());
|
||||||
|
return level.getLevel();
|
||||||
|
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
|
||||||
|
| SecurityException | ClassNotFoundException | IntrospectionException | SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save the player's level in the local cache
|
* Save the player's level
|
||||||
* @param targetPlayer
|
* @param targetPlayer
|
||||||
* @param level
|
* @param level
|
||||||
*/
|
*/
|
||||||
public void setIslandLevel(UUID targetPlayer, long level) {
|
public void setIslandLevel(UUID targetPlayer, long level) {
|
||||||
//getLogger().info("DEBUG: set island level to " + level + " for " + bSkyBlock.getPlayers().getName(targetPlayer));
|
//getLogger().info("DEBUG: set island level to " + level + " for " + bSkyBlock.getPlayers().getName(targetPlayer));
|
||||||
levelsCache.addLevel(targetPlayer, level);
|
// Add to cache
|
||||||
save(true);
|
levelsCache.put(targetPlayer, level);
|
||||||
|
topTen.topTenAddEntry(targetPlayer, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -136,4 +171,12 @@ public class Level extends JavaPlugin {
|
|||||||
return localeManager.getLocale(uuid);
|
return localeManager.getLocale(uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AbstractDatabaseHandler<Levels> getHandler() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TopTen getTopTen() {
|
||||||
|
return topTen;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ public class LevelCalcByChunk {
|
|||||||
plugin.getLogger().info("Block is outside protected area - z = " + (chunk.getZ() * 16 + z));
|
plugin.getLogger().info("Block is outside protected area - z = " + (chunk.getZ() * 16 + z));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int y = 0; y < worldHeight; y++) {
|
for (int y = 0; y < worldHeight; y++) {
|
||||||
int type = chunk.getBlockTypeId(x, y, z);
|
int type = chunk.getBlockTypeId(x, y, z);
|
||||||
int data = chunk.getBlockData(x, y, z);
|
int data = chunk.getBlockData(x, y, z);
|
||||||
@ -359,7 +359,7 @@ public class LevelCalcByChunk {
|
|||||||
reportLines.add(type.getElement().toString() + ": " + String.format("%,d",type.getCount()) + " blocks (max " + limit + explain);
|
reportLines.add(type.getElement().toString() + ": " + String.format("%,d",type.getCount()) + " blocks (max " + limit + explain);
|
||||||
}
|
}
|
||||||
reportLines.add("==================================");
|
reportLines.add("==================================");
|
||||||
reportLines.add("Blocks on island that are not in blockvalues.yml");
|
reportLines.add("Blocks on island that are not in config.yml");
|
||||||
reportLines.add("Total number = " + String.format("%,d",ncCount.size()));
|
reportLines.add("Total number = " + String.format("%,d",ncCount.size()));
|
||||||
//entriesSortedByCount = Multisets.copyHighestCountFirst(ncCount).entrySet();
|
//entriesSortedByCount = Multisets.copyHighestCountFirst(ncCount).entrySet();
|
||||||
entriesSortedByCount = ncCount.entrySet();
|
entriesSortedByCount = ncCount.entrySet();
|
||||||
@ -393,13 +393,10 @@ public class LevelCalcByChunk {
|
|||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
plugin.getLogger().info("DEBUG: updating player");
|
plugin.getLogger().info("DEBUG: updating player");
|
||||||
|
|
||||||
if (oldLevel != event.getLevel()) {
|
//if (oldLevel != event.getLevel()) {
|
||||||
// Update player and team mates
|
// Update player and team mates
|
||||||
plugin.setIslandLevel(targetPlayer, event.getLevel());
|
plugin.setIslandLevel(targetPlayer, event.getLevel());
|
||||||
if (DEBUG)
|
//}
|
||||||
plugin.getLogger().info("DEBUG: set island level, now trying to save player");
|
|
||||||
bSkyBlock.getPlayers().save(targetPlayer);
|
|
||||||
}
|
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
plugin.getLogger().info("DEBUG: save player, now looking at team members");
|
plugin.getLogger().info("DEBUG: save player, now looking at team members");
|
||||||
// Update any team members too
|
// Update any team members too
|
||||||
@ -415,15 +412,6 @@ public class LevelCalcByChunk {
|
|||||||
}
|
}
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
plugin.getLogger().info("DEBUG: finished team member saving");
|
plugin.getLogger().info("DEBUG: finished team member saving");
|
||||||
plugin.getLogger().info("DEBUG: updating top ten");
|
|
||||||
}
|
|
||||||
if (bSkyBlock.getPlayers().inTeam(targetPlayer)) {
|
|
||||||
UUID leader = bSkyBlock.getIslands().getTeamLeader(targetPlayer);
|
|
||||||
if (leader != null) {
|
|
||||||
TopTen.topTenAddEntry(leader, event.getLevel());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
TopTen.topTenAddEntry(targetPlayer, event.getLevel());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,36 @@
|
|||||||
package bskyblock.addin.level;
|
package bskyblock.addin.level;
|
||||||
|
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
|
||||||
import us.tastybento.bskyblock.BSkyBlock;
|
import us.tastybento.bskyblock.BSkyBlock;
|
||||||
|
import us.tastybento.bskyblock.config.BSBLocale;
|
||||||
|
import us.tastybento.bskyblock.util.Util;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes code look nicer
|
* Makes code look nicer
|
||||||
* @author ben
|
* @author ben
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class LevelPlugin {
|
public abstract class LevelPlugin {
|
||||||
protected Level plugin;
|
protected final Level plugin;
|
||||||
protected BSkyBlock bSkyBlock;
|
protected final BSkyBlock bSkyBlock;
|
||||||
|
|
||||||
public LevelPlugin(Level plugin) {
|
public LevelPlugin(Level plugin) {
|
||||||
super();
|
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
this.bSkyBlock = BSkyBlock.getPlugin();
|
this.bSkyBlock = BSkyBlock.getPlugin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final Logger getLogger() {
|
||||||
|
return plugin.getLogger();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void sendMessage(CommandSender sender, String message) {
|
||||||
|
Util.sendMessage(sender, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final BSBLocale getLocale(CommandSender sender) {
|
||||||
|
return plugin.getLocale(sender);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,10 @@
|
|||||||
|
|
||||||
package bskyblock.addin.level;
|
package bskyblock.addin.level;
|
||||||
|
|
||||||
import java.io.File;
|
import java.beans.IntrospectionException;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -30,7 +31,6 @@ import org.bukkit.Bukkit;
|
|||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
@ -43,8 +43,11 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import org.bukkit.inventory.meta.SkullMeta;
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
|
|
||||||
import bskyblock.addin.level.config.Settings;
|
import bskyblock.addin.level.config.Settings;
|
||||||
import bskyblock.addin.level.util.MapUtil;
|
import bskyblock.addin.level.database.object.Levels;
|
||||||
|
import bskyblock.addin.level.database.object.TopTenList;
|
||||||
import us.tastybento.bskyblock.BSkyBlock;
|
import us.tastybento.bskyblock.BSkyBlock;
|
||||||
|
import us.tastybento.bskyblock.database.BSBDatabase;
|
||||||
|
import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles all Top Ten List functions
|
* Handles all Top Ten List functions
|
||||||
@ -52,18 +55,27 @@ import us.tastybento.bskyblock.BSkyBlock;
|
|||||||
* @author tastybento
|
* @author tastybento
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class TopTen implements Listener{
|
public class TopTen implements Listener {
|
||||||
private static Level plugin;
|
private Level plugin;
|
||||||
// Top ten list of players
|
// Top ten list of players
|
||||||
private static Map<UUID, Long> topTenList = new HashMap<UUID, Long>();
|
private TopTenList topTenList;
|
||||||
private static final int GUISIZE = 27; // Must be a multiple of 9
|
private final int GUISIZE = 27; // Must be a multiple of 9
|
||||||
private static final int[] SLOTS = new int[] {4, 12, 14, 19, 20, 21, 22, 23, 24, 25};
|
private final int[] SLOTS = new int[] {4, 12, 14, 19, 20, 21, 22, 23, 24, 25};
|
||||||
private static final boolean DEBUG = false;
|
private final boolean DEBUG = false;
|
||||||
// Store this as a static because it's the same for everyone and saves memory cleanup
|
// Store this as a because it's the same for everyone and saves memory cleanup
|
||||||
private static Inventory gui;
|
private Inventory gui;
|
||||||
|
private BSBDatabase database;
|
||||||
|
private AbstractDatabaseHandler<TopTenList> handler;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public TopTen(Level plugin) {
|
public TopTen(Level plugin) {
|
||||||
TopTen.plugin = plugin;
|
this.plugin = plugin;
|
||||||
|
// Set up database
|
||||||
|
database = BSBDatabase.getDatabase();
|
||||||
|
// Set up the database handler to store and retrieve the TopTenList class
|
||||||
|
// Note that these are saved in the BSkyBlock database
|
||||||
|
handler = (AbstractDatabaseHandler<TopTenList>) database.getHandler(BSkyBlock.getPlugin(), TopTenList.class);
|
||||||
|
topTenLoad();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -72,15 +84,7 @@ public class TopTen implements Listener{
|
|||||||
* @param ownerUUID
|
* @param ownerUUID
|
||||||
* @param l
|
* @param l
|
||||||
*/
|
*/
|
||||||
public static void topTenAddEntry(UUID ownerUUID, long l) {
|
public void topTenAddEntry(UUID ownerUUID, long l) {
|
||||||
// Special case for removals. If a level of zero is given the player
|
|
||||||
// needs to be removed from the list
|
|
||||||
if (l < 1) {
|
|
||||||
if (topTenList.containsKey(ownerUUID)) {
|
|
||||||
topTenList.remove(ownerUUID);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Try and see if the player is online
|
// Try and see if the player is online
|
||||||
Player player = plugin.getServer().getPlayer(ownerUUID);
|
Player player = plugin.getServer().getPlayer(ownerUUID);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
@ -90,8 +94,8 @@ public class TopTen implements Listener{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
topTenList.put(ownerUUID, l);
|
topTenList.addLevel(ownerUUID, l);
|
||||||
topTenList = MapUtil.sortByValue(topTenList);
|
topTenSave();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -99,7 +103,7 @@ public class TopTen implements Listener{
|
|||||||
*
|
*
|
||||||
* @param ownerUUID
|
* @param ownerUUID
|
||||||
*/
|
*/
|
||||||
public static void topTenRemoveEntry(UUID ownerUUID) {
|
public void topTenRemoveEntry(UUID ownerUUID) {
|
||||||
topTenList.remove(ownerUUID);
|
topTenList.remove(ownerUUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,7 +111,7 @@ public class TopTen implements Listener{
|
|||||||
* Generates a sorted map of islands for the Top Ten list from all player
|
* Generates a sorted map of islands for the Top Ten list from all player
|
||||||
* files
|
* files
|
||||||
*/
|
*/
|
||||||
public static void topTenCreate() {
|
public void topTenCreate() {
|
||||||
topTenCreate(null);
|
topTenCreate(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,44 +121,58 @@ public class TopTen implements Listener{
|
|||||||
* Runs asynchronously from the main thread.
|
* Runs asynchronously from the main thread.
|
||||||
* @param sender
|
* @param sender
|
||||||
*/
|
*/
|
||||||
public static void topTenCreate(final CommandSender sender) {
|
public void topTenCreate(final CommandSender sender) {
|
||||||
// TODO
|
// Obtain all the levels for each known player
|
||||||
|
AbstractDatabaseHandler<Levels> levelHandler = plugin.getHandler();
|
||||||
|
try {
|
||||||
|
long index = 0;
|
||||||
|
for (Levels lv : levelHandler.loadObjects()) {
|
||||||
|
if (index++ % 1000 == 0) {
|
||||||
|
plugin.getLogger().info("Processed " + index + " players for top ten");
|
||||||
|
}
|
||||||
|
// Convert to UUID
|
||||||
|
UUID playerUUID = UUID.fromString(lv.getUniqueId());
|
||||||
|
// Check if the player is an owner or team leader
|
||||||
|
if (BSkyBlock.getPlugin().getIslands().isOwner(playerUUID)) {
|
||||||
|
topTenList.addLevel(playerUUID, lv.getLevel());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
|
||||||
|
| SecurityException | ClassNotFoundException | IntrospectionException | SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
topTenSave();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void topTenSave() {
|
public void topTenSave() {
|
||||||
|
//plugin.getLogger().info("Saving top ten list");
|
||||||
if (topTenList == null) {
|
if (topTenList == null) {
|
||||||
|
//plugin.getLogger().info("DEBUG: toptenlist = null!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
plugin.getLogger().info("Saving top ten list");
|
|
||||||
// Make file
|
|
||||||
File topTenFile = new File(plugin.getDataFolder(), "topten.yml");
|
|
||||||
// Make configuration
|
|
||||||
YamlConfiguration config = new YamlConfiguration();
|
|
||||||
// Save config
|
|
||||||
|
|
||||||
int rank = 0;
|
|
||||||
for (Map.Entry<UUID, Long> m : topTenList.entrySet()) {
|
|
||||||
if (rank++ == 10) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
config.set("topten." + m.getKey().toString(), m.getValue());
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
config.save(topTenFile);
|
handler.saveObject(topTenList);
|
||||||
plugin.getLogger().info("Saved top ten list");
|
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException
|
||||||
} catch (Exception e) {
|
| InstantiationException | NoSuchMethodException | IntrospectionException | SQLException e) {
|
||||||
plugin.getLogger().severe("Could not save top ten list!");
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads the top ten from the file system topten.yml. If it does not exist
|
* Loads the top ten from the database
|
||||||
* then the top ten is created
|
|
||||||
*/
|
*/
|
||||||
public static void topTenLoad() {
|
public void topTenLoad() {
|
||||||
topTenList.clear();
|
try {
|
||||||
// TODO
|
topTenList = handler.loadObject("topten");
|
||||||
|
if (topTenList == null) {
|
||||||
|
topTenList = new TopTenList();
|
||||||
|
}
|
||||||
|
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
|
||||||
|
| SecurityException | ClassNotFoundException | IntrospectionException | SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -164,23 +182,22 @@ public class TopTen implements Listener{
|
|||||||
* - the requesting player
|
* - the requesting player
|
||||||
* @return - true if successful, false if no Top Ten list exists
|
* @return - true if successful, false if no Top Ten list exists
|
||||||
*/
|
*/
|
||||||
public static boolean topTenShow(final Player player) {
|
public boolean topTenShow(final Player player) {
|
||||||
|
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
plugin.getLogger().info("DEBUG: new GUI display");
|
plugin.getLogger().info("DEBUG: new GUI display");
|
||||||
// New GUI display (shown by default)
|
// New GUI display (shown by default)
|
||||||
if (topTenList == null) topTenCreate();
|
if (topTenList == null) topTenCreate();
|
||||||
topTenList = MapUtil.sortByValue(topTenList);
|
|
||||||
// Create the top ten GUI if it does not exist
|
// Create the top ten GUI if it does not exist
|
||||||
if (gui == null) {
|
if (gui == null) {
|
||||||
gui = Bukkit.createInventory(null, GUISIZE, plugin.getLocale(player.getUniqueId()).get("topTenGuiTitle"));
|
gui = Bukkit.createInventory(null, GUISIZE, plugin.getLocale(player.getUniqueId()).get("topten.guiTitle"));
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
plugin.getLogger().info("DEBUG: creating GUI for the first time");
|
plugin.getLogger().info("DEBUG: creating GUI for the first time");
|
||||||
}
|
}
|
||||||
// Reset
|
// Reset
|
||||||
gui.clear();
|
gui.clear();
|
||||||
int i = 1;
|
int i = 1;
|
||||||
Iterator<Entry<UUID, Long>> it = topTenList.entrySet().iterator();
|
Iterator<Entry<UUID, Long>> it = topTenList.getTopTen().entrySet().iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
Map.Entry<UUID, Long> m = it.next();
|
Map.Entry<UUID, Long> m = it.next();
|
||||||
UUID playerUUID = m.getKey();
|
UUID playerUUID = m.getKey();
|
||||||
@ -210,7 +227,7 @@ public class TopTen implements Listener{
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ItemStack getSkull(int rank, Long long1, UUID player){
|
ItemStack getSkull(int rank, Long long1, UUID player){
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
plugin.getLogger().info("DEBUG: Getting the skull");
|
plugin.getLogger().info("DEBUG: Getting the skull");
|
||||||
String playerName = BSkyBlock.getPlugin().getPlayers().getName(player);
|
String playerName = BSkyBlock.getPlugin().getPlayers().getName(player);
|
||||||
@ -223,10 +240,10 @@ public class TopTen implements Listener{
|
|||||||
if (playerName == null) return null;
|
if (playerName == null) return null;
|
||||||
SkullMeta meta = (SkullMeta) playerSkull.getItemMeta();
|
SkullMeta meta = (SkullMeta) playerSkull.getItemMeta();
|
||||||
meta.setOwner(playerName);
|
meta.setOwner(playerName);
|
||||||
meta.setDisplayName((plugin.getLocale(player).get("topTenGuiHeading").replace("[name]", BSkyBlock.getPlugin().getIslands().getIslandName(player))).replace("[rank]", String.valueOf(rank)));
|
meta.setDisplayName((plugin.getLocale(player).get("topten.guiHeading").replace("[name]", BSkyBlock.getPlugin().getIslands().getIslandName(player))).replace("[rank]", String.valueOf(rank)));
|
||||||
//meta.setDisplayName(ChatColor.YELLOW + "" + ChatColor.BOLD + "<!> " + ChatColor.YELLOW + "Island: " + ChatColor.GOLD + ChatColor.UNDERLINE + plugin.getGrid().getIslandName(player) + ChatColor.GRAY + " (#" + rank + ")");
|
//meta.setDisplayName(ChatColor.YELLOW + "" + ChatColor.BOLD + "<!> " + ChatColor.YELLOW + "Island: " + ChatColor.GOLD + ChatColor.UNDERLINE + plugin.getGrid().getIslandName(player) + ChatColor.GRAY + " (#" + rank + ")");
|
||||||
List<String> lore = new ArrayList<String>();
|
List<String> lore = new ArrayList<String>();
|
||||||
lore.add(ChatColor.YELLOW + plugin.getLocale(player).get("levelislandLevel") + " " + long1);
|
lore.add(ChatColor.YELLOW + plugin.getLocale(player).get("topten.islandLevel").replace("[level]", String.valueOf(long1)));
|
||||||
if (BSkyBlock.getPlugin().getPlayers().inTeam(player)) {
|
if (BSkyBlock.getPlugin().getPlayers().inTeam(player)) {
|
||||||
List<String> memberList = new ArrayList<>();
|
List<String> memberList = new ArrayList<>();
|
||||||
for (UUID members : BSkyBlock.getPlugin().getIslands().getMembers(player)) {
|
for (UUID members : BSkyBlock.getPlugin().getIslands().getMembers(player)) {
|
||||||
@ -241,7 +258,7 @@ public class TopTen implements Listener{
|
|||||||
return playerSkull;
|
return playerSkull;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void remove(UUID owner) {
|
void remove(UUID owner) {
|
||||||
topTenList.remove(owner);
|
topTenList.remove(owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,7 +271,7 @@ public class TopTen implements Listener{
|
|||||||
}
|
}
|
||||||
// The player that clicked the item
|
// The player that clicked the item
|
||||||
Player player = (Player) event.getWhoClicked();
|
Player player = (Player) event.getWhoClicked();
|
||||||
if (!inventory.getTitle().equals(plugin.getLocale(player).get("topTenGuiTitle"))) {
|
if (!inventory.getTitle().equals(plugin.getLocale(player).get("topten.guiTitle"))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
@ -275,11 +292,4 @@ public class TopTen implements Listener{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a sorted descending map of the top players
|
|
||||||
* @return the topTenList - may be more or less than ten
|
|
||||||
*/
|
|
||||||
public static Map<UUID, Long> getTopTenList() {
|
|
||||||
return topTenList;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,40 +1,28 @@
|
|||||||
package bskyblock.addin.level.database.object;
|
package bskyblock.addin.level.database.object;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import us.tastybento.bskyblock.database.objects.DataObject;
|
import us.tastybento.bskyblock.database.objects.DataObject;
|
||||||
|
|
||||||
public class Levels extends DataObject {
|
public class Levels extends DataObject {
|
||||||
|
|
||||||
private String uniqueId = "addon-levels";
|
private String uniqueId = "";
|
||||||
private HashMap<UUID, Long> islandLevel = new HashMap<>();
|
private long level = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUniqueId() {
|
public String getUniqueId() {
|
||||||
return "addon-levels";
|
return uniqueId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setUniqueId(String uniqueId) {
|
public void setUniqueId(String uniqueId) {
|
||||||
// do nothing
|
this.uniqueId = uniqueId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HashMap<UUID, Long> getIslandLevel() {
|
public long getLevel() {
|
||||||
return islandLevel;
|
return level;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIslandLevel(HashMap<UUID, Long> islandLevel) {
|
public void setLevel(long level) {
|
||||||
this.islandLevel = islandLevel;
|
this.level = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addLevel(UUID uuid, Long level) {
|
|
||||||
this.islandLevel.put(uuid, level);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getLevel(UUID uuid) {
|
|
||||||
if (islandLevel.containsKey(uuid))
|
|
||||||
return (long)islandLevel.get(uuid);
|
|
||||||
return 0L;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,77 @@
|
|||||||
|
package bskyblock.addin.level.database.object;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import us.tastybento.bskyblock.database.objects.DataObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class stores and sorts the top ten.
|
||||||
|
* @author ben
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TopTenList extends DataObject {
|
||||||
|
|
||||||
|
private String uniqueId = "topten";
|
||||||
|
private HashMap<UUID, Long> topTen = new HashMap<>();
|
||||||
|
|
||||||
|
public HashMap<UUID, Long> getTopTen() {
|
||||||
|
return topTen;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTopTen(HashMap<UUID, Long> topTen) {
|
||||||
|
this.topTen = topTen;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUniqueId() {
|
||||||
|
return uniqueId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUniqueId(String uniqueId) {
|
||||||
|
this.uniqueId = uniqueId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add level for this island owner or team leader, sort the top ten and limit to ten entries
|
||||||
|
* @param uuid - UUID of owner or team leader
|
||||||
|
* @param level - island level
|
||||||
|
*/
|
||||||
|
public void addLevel(UUID uuid, Long level) {
|
||||||
|
this.topTen.put(uuid, level);
|
||||||
|
sortTopTen();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the level for this UUID, or zero if the UUID is not found
|
||||||
|
* @param uuid
|
||||||
|
* @return island level
|
||||||
|
*/
|
||||||
|
public long getLevel(UUID uuid) {
|
||||||
|
if (topTen.containsKey(uuid))
|
||||||
|
return topTen.get(uuid);
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes ownerUUID from the top ten
|
||||||
|
* @param ownerUUID
|
||||||
|
*/
|
||||||
|
public void remove(UUID ownerUUID) {
|
||||||
|
this.topTen.remove(ownerUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the top ten and limits it to 10 entries
|
||||||
|
*/
|
||||||
|
void sortTopTen() {
|
||||||
|
topTen = (HashMap<UUID, Long>) topTen.entrySet().stream()
|
||||||
|
.sorted(Map.Entry.comparingByKey(Comparator.reverseOrder()))
|
||||||
|
.limit(10)
|
||||||
|
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user