diff --git a/MobArena.jar b/MobArena.jar index c084f82..f4ff4f3 100644 Binary files a/MobArena.jar and b/MobArena.jar differ diff --git a/resources/plugin.yml b/resources/plugin.yml index da3d156..72d10c0 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,6 +1,6 @@ name: MobArena main: com.garbagemule.MobArena.MobArena -version: 0.94.3.15 +version: 0.94.3.16 softdepend: [Spout,Permissions,MultiVerse,XcraftGate,Towny,Heroes,MagicSpells] commands: ma: diff --git a/src/com/garbagemule/MobArena/Arena.java b/src/com/garbagemule/MobArena/Arena.java index 476d3de..0b3c9cf 100644 --- a/src/com/garbagemule/MobArena/Arena.java +++ b/src/com/garbagemule/MobArena/Arena.java @@ -674,6 +674,7 @@ public class Arena arenaPlayers.remove(p); lobbyPlayers.remove(p); classMap.remove(p); + arenaPlayerMap.remove(p); } /** @@ -703,9 +704,10 @@ public class Arena if (dead) restoreInvAndGiveRewardsDelayed(p); else restoreInvAndGiveRewards(p); - - if (log != null && spawnThread != null) - arenaPlayerMap.get(p).getStats().lastWave = spawnThread.getWave() - 1; + + ArenaPlayer ap = arenaPlayerMap.get(p); + if (ap != null) + ap.setDead(true); } public void repairBlocks() diff --git a/src/com/garbagemule/MobArena/ArenaPlayer.java b/src/com/garbagemule/MobArena/ArenaPlayer.java index 119acab..359eae8 100644 --- a/src/com/garbagemule/MobArena/ArenaPlayer.java +++ b/src/com/garbagemule/MobArena/ArenaPlayer.java @@ -18,7 +18,7 @@ public class ArenaPlayer private ArenaPlayerStatistics stats; - protected boolean inArena, inLobby, inSpec, isReady; + protected boolean isDead, inArena, inLobby, inSpec, isReady; public ArenaPlayer(Player player, Arena arena, MobArena plugin) { @@ -36,5 +36,24 @@ public class ArenaPlayer public Player getPlayer() { return player; } public Arena getArena() { return arena; } public String getClassName() { return className; } + + /** + * Check if the player is "dead", i.e. died or not. + * @return true, if the player is either a spectator or played and died, false otherwise + */ + public boolean isDead() + { + return isDead; + } + + /** + * Set the player's death status. + * @param value true, if the player is dead, false otherwise + */ + public void setDead(boolean value) + { + isDead = value; + } + public ArenaPlayerStatistics getStats() { return stats; } } diff --git a/src/com/garbagemule/MobArena/leaderboards/LeaderboardColumn.java b/src/com/garbagemule/MobArena/leaderboards/LeaderboardColumn.java index 9893491..756a410 100644 --- a/src/com/garbagemule/MobArena/leaderboards/LeaderboardColumn.java +++ b/src/com/garbagemule/MobArena/leaderboards/LeaderboardColumn.java @@ -3,21 +3,25 @@ package com.garbagemule.MobArena.leaderboards; import java.lang.reflect.Field; import java.util.List; +import org.bukkit.ChatColor; import org.bukkit.block.Sign; import com.garbagemule.MobArena.ArenaPlayerStatistics; +import com.garbagemule.MobArena.util.TextUtils; public class LeaderboardColumn { private Field field; + private boolean isPlayerName; private Sign header; private List signs; private LeaderboardColumn(String statname, Sign header, List signs) throws Exception { - this.field = ArenaPlayerStatistics.class.getDeclaredField(statname); - this.header = header; - this.signs = signs; + this.field = ArenaPlayerStatistics.class.getDeclaredField(statname); + this.isPlayerName = statname.equals("playerName"); + this.header = header; + this.signs = signs; } /** @@ -48,19 +52,41 @@ public class LeaderboardColumn try { - for (int i = 0; i < range; i++) + if (isPlayerName) { - // Grab the right sign. - Sign s = signs.get(i/4); - - // Get the stat value. - field.setAccessible(true); - Object o = field.get(stats.get(i)); - field.setAccessible(false); - - // Set the value on the right line. - s.setLine(i % 4, o.toString()); - s.update(); + for (int i = 0; i < range; i++) + { + // Grab the right sign. + Sign s = signs.get(i/4); + + // Get the stat value. + field.setAccessible(true); + ArenaPlayerStatistics aps = stats.get(i); + Object o = field.get(aps); + field.setAccessible(false); + String name = aps.getArenaPlayer().isDead() ? o.toString() : ChatColor.GREEN + o.toString(); + + // Set the value on the right line. + s.setLine(i % 4, TextUtils.truncate(name)); + s.update(); + } + } + else + { + for (int i = 0; i < range; i++) + { + // Grab the right sign. + Sign s = signs.get(i/4); + + // Get the stat value. + field.setAccessible(true); + Object o = field.get(stats.get(i)); + field.setAccessible(false); + + // Set the value on the right line. + s.setLine(i % 4, o.toString()); + s.update(); + } } } catch (Exception e) { e.printStackTrace(); } diff --git a/src/com/garbagemule/MobArena/util/TextUtils.java b/src/com/garbagemule/MobArena/util/TextUtils.java index 85cda7d..8b3dcb2 100644 --- a/src/com/garbagemule/MobArena/util/TextUtils.java +++ b/src/com/garbagemule/MobArena/util/TextUtils.java @@ -39,4 +39,18 @@ public class TextUtils public static String padLeft(String s, int length) { return padLeft(s, length, ' '); } public static String padLeft(int s, int length) { return padLeft(Integer.toString(s), length, ' '); } public static String padLeft(double s, int length) { return padLeft(Double.toString(s), length, ' '); } + + /** + * Truncate the input string to be at most the input length + * @param s The string to truncate + * @param length The maximum length + * @return A truncated string with length 15, or the input string + */ + public static String truncate(String s, int length) + { + if (s.length() <= length) + return s; + return s.substring(0, length); + } + public static String truncate(String s) { return truncate(s, 15); } }