Re-added Spout stats board in a more compact format, with messages now coming underneath the stats board at the top left of the screen. Added notification when flag is dropped.

This commit is contained in:
taoneill 2012-01-08 23:45:45 -05:00
parent 9ff98d0bbf
commit 2adb328115
8 changed files with 192 additions and 142 deletions

View File

@ -64,7 +64,7 @@ public class WarBlockListener extends BlockListener {
if (sp.isSpoutCraftEnabled()) {
sp.sendNotification(
SpoutMessenger.cleanForNotification("Monument " + ChatColor.WHITE + monument.getName()),
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "capped by " + team.getKind().getColor() + player.getName()),
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "capped by " + team.getKind().getColor() + player.getName() + ChatColor.YELLOW + "!"),
team.getKind().getMaterial(),
team.getKind().getData(),
5000);
@ -218,7 +218,7 @@ public class WarBlockListener extends BlockListener {
if (sp.isSpoutCraftEnabled()) {
sp.sendNotification(
SpoutMessenger.cleanForNotification("Monument " + ChatColor.WHITE + monument.getName()),
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "freed by " + team.getKind().getColor() + player.getName()),
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "freed by " + team.getKind().getColor() + player.getName() + ChatColor.YELLOW + "!"),
Material.OBSIDIAN,
(short)0,
5000);
@ -278,7 +278,7 @@ public class WarBlockListener extends BlockListener {
if (sp.isSpoutCraftEnabled()) {
sp.sendNotification(
SpoutMessenger.cleanForNotification(team.getKind().getColor() + player.getName() + ChatColor.YELLOW + " stole"),
SpoutMessenger.cleanForNotification("your flag!"),
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "your flag!"),
lostFlagTeam.getKind().getMaterial(),
lostFlagTeam.getKind().getData(),
5000);

View File

@ -150,6 +150,13 @@ public class WarEntityListener extends EntityListener {
team.teamcast(killMessage);
}
defenderWarzone.handleDeath(d);
if (War.war.isSpoutServer()) {
// make sure score is updated
War.war.getSpoutMessenger().updateStats(defenderWarzone);
}
event.setCancelled(true);
}
} else if (attackerTeam != null && defenderTeam != null && attackerTeam == defenderTeam && attackerWarzone == defenderWarzone && attacker.getEntityId() != defender.getEntityId()) {

View File

@ -517,7 +517,7 @@ public class WarPlayerListener extends PlayerListener {
if (sp.isSpoutCraftEnabled()) {
sp.sendNotification(
SpoutMessenger.cleanForNotification(playerTeam.getKind().getColor() + player.getName() + ChatColor.YELLOW + " captured"),
SpoutMessenger.cleanForNotification(victim.getKind().getColor() + victim.getName() + ChatColor.YELLOW + " flag"),
SpoutMessenger.cleanForNotification(victim.getKind().getColor() + victim.getName() + ChatColor.YELLOW + " flag!"),
victim.getKind().getMaterial(),
victim.getKind().getData(),
5000);

View File

@ -1,21 +1,8 @@
package bukkit.tommytony.war;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.event.spout.SpoutCraftEnableEvent;
import org.getspout.spoutapi.event.spout.SpoutListener;
import org.getspout.spoutapi.gui.Color;
import org.getspout.spoutapi.gui.GenericLabel;
import org.getspout.spoutapi.gui.WidgetAnchor;
import org.getspout.spoutapi.player.SpoutPlayer;
import com.tommytony.war.Team;
import com.tommytony.war.Warzone;
import com.tommytony.war.config.TeamConfig;
public class WarSpoutListener extends SpoutListener {
static Plugin plugin;
@ -31,101 +18,4 @@ public class WarSpoutListener extends SpoutListener {
return;
}
}
public static void updateStats(Warzone zone) {
if (false) {
List<GenericLabel> teamlines = new ArrayList<GenericLabel>();
List<GenericLabel> playerlines = new ArrayList<GenericLabel>();
List<GenericLabel> scorelines = new ArrayList<GenericLabel>();
List<GenericLabel> lifelines = new ArrayList<GenericLabel>();
int teammax = -15, playmax = -15, scoremax = -15;
GenericLabel line;
// First, we collect all the team names
int linecounter = 0;
for (Team t : zone.getTeams()) {
// team name
line = new GenericLabel(t.getName());
if (t.getPlayers().size()==0) line.setTextColor(new Color(100,100,100));
else line.setTextColor(t.getKind().getSpoutColor());
line.setTooltip("Warzone: "+zone.getName()).setAnchor(WidgetAnchor.TOP_LEFT);
line.setAlign(WidgetAnchor.TOP_LEFT).setX(3).setY(3+linecounter*(GenericLabel.getStringHeight("O")+3)).setWidth(GenericLabel.getStringWidth(line.getText())).setHeight(GenericLabel.getStringHeight(line.getText()));
teamlines.add(line);
linecounter++;
}
// We need to find the longest name
for (GenericLabel l : teamlines) {
if (GenericLabel.getStringWidth(l.getText()) > teammax) teammax=GenericLabel.getStringWidth(l.getText());
}
// Now for the players
linecounter = 0;
for (Team t : zone.getTeams()) {
// player number
line = new GenericLabel("Players: "+t.getPlayers().size());
if (t.getPlayers().size()==0) line.setTextColor(new Color(100,100,100));
line.setTooltip("Warzone: "+zone.getName()).setAnchor(WidgetAnchor.TOP_LEFT);
line.setAlign(WidgetAnchor.TOP_LEFT).setX(3+teammax+15).setY(3+linecounter*(GenericLabel.getStringHeight("O")+3)).setWidth(GenericLabel.getStringWidth(line.getText())).setHeight(GenericLabel.getStringHeight(line.getText()));
playerlines.add(line);
linecounter++;
}
// Again, we need the longest entry
for (GenericLabel l : playerlines) {
if (GenericLabel.getStringWidth(l.getText()) > playmax) playmax=GenericLabel.getStringWidth(l.getText());
}
// is there even a score cap (or is it just 1 point)?
linecounter = 0;
for (Team t : zone.getTeams()) {
// scores
line = new GenericLabel(t.getPoints()+"/"+t.getTeamConfig().resolveInt(TeamConfig.MAXSCORE)+" points");
if (t.getPlayers().size()==0) line.setTextColor(new Color(100,100,100));
line.setTooltip("Warzone: "+zone.getName()).setAnchor(WidgetAnchor.TOP_LEFT);
line.setAlign(WidgetAnchor.TOP_LEFT).setX(3+teammax+15+playmax+15).setY(3+linecounter*(GenericLabel.getStringHeight("O")+3)).setWidth(GenericLabel.getStringWidth(line.getText())).setHeight(GenericLabel.getStringHeight(line.getText()));
scorelines.add(line);
linecounter++;
}
// I bet you know what is done here!
for (GenericLabel l : scorelines) {
if (GenericLabel.getStringWidth(l.getText()) > scoremax) scoremax=GenericLabel.getStringWidth(l.getText());
}
// and finally, lives.
linecounter = 0;
for (Team t : zone.getTeams()) {
line = new GenericLabel(t.getRemainingLifes()+"/"+t.getTeamConfig().resolveInt(TeamConfig.LIFEPOOL)+" lives");
if (t.getPlayers().size()==0) line.setTextColor(new Color(100,100,100));
line.setTooltip("Warzone: "+zone.getName()).setAnchor(WidgetAnchor.TOP_LEFT);
line.setAlign(WidgetAnchor.TOP_LEFT).setX(3+teammax+15+playmax+15+scoremax+15).setY(3+linecounter*(GenericLabel.getStringHeight("O")+3)).setWidth(GenericLabel.getStringWidth(line.getText())).setHeight(GenericLabel.getStringHeight(line.getText()));
scorelines.add(line);
linecounter++;
}
// Now to print it to the Spout players!
List<GenericLabel> lines = new ArrayList<GenericLabel>();
for (GenericLabel l : teamlines) lines.add(l);
for (GenericLabel l : playerlines) lines.add(l);
for (GenericLabel l : scorelines) lines.add(l);
for (GenericLabel l : lifelines) lines.add(l);
for (Team team : zone.getTeams()) {
for (Player player : team.getPlayers()) {
SpoutPlayer sp = SpoutManager.getPlayer(player);
if (sp.isSpoutCraftEnabled()) {
drawStats(sp, lines);
}
}
}
}
}
private static void drawStats(SpoutPlayer sp, List<GenericLabel> lines) {
// remove old stats first
removeStats(sp);
for (GenericLabel l : lines) sp.getMainScreen().attachWidget(plugin, l.copy());
}
public static void removeStats(SpoutPlayer sp) {
//sp.getMainScreen().removeWidgets(plugin);
}
}

View File

@ -323,10 +323,6 @@ public class Team {
SignHelper.setToSign(War.war, signBlock, (byte) signData, lines);
}
if (War.war.isSpoutServer()) {
WarSpoutListener.updateStats(warzone);
}
}
private void setBlock(int x, int y, int z, TeamKind kind) {

View File

@ -787,6 +787,21 @@ public class Warzone {
victim.getFlagVolume().resetBlocks();
victim.initializeTeamFlag();
playerWarzone.removeThief(player.getName());
if (War.war.isSpoutServer()) {
for (Player p : victim.getPlayers()) {
SpoutPlayer sp = SpoutManager.getPlayer(p);
if (sp.isSpoutCraftEnabled()) {
sp.sendNotification(
SpoutMessenger.cleanForNotification(playerTeam.getKind().getColor() + player.getName() + ChatColor.YELLOW + " dropped"),
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "your flag."),
playerTeam.getKind().getMaterial(),
playerTeam.getKind().getData(),
5000);
}
}
}
for (Team t : playerWarzone.getTeams()) {
t.teamcast(player.getName() + " died and dropped team " + victim.getName() + "'s flag.");
}
@ -843,15 +858,9 @@ public class Warzone {
}
player.setFireTicks(0);
player.setRemainingAir(300);
if (War.war.isSpoutServer()) {
SpoutPlayer sp = SpoutManager.getPlayer(player);
if (sp.isSpoutCraftEnabled()) {
WarSpoutListener.removeStats(sp);
sp.setTitle(ChatColor.WHITE + player.getName());
}
sp.resetTitle();
}
// To hide stats
War.war.getSpoutMessenger().updateStats(player);
War.war.msg(player, "Your inventory is being restored.");
if (War.war.getWarHub() != null) {

View File

@ -41,16 +41,9 @@ public class ScoreCapReachedJob implements Runnable {
}
String winnersStrAndExtra = "Score cap reached. Game is over! Winning team(s): " + this.winnersStr;
winnersStrAndExtra += ". Resetting warzone and your inventory...";
t.teamcast(winnersStr);
t.teamcast(winnersStrAndExtra);
boolean isSpoutServer = War.war.isSpoutServer();
for (Player tp : t.getPlayers()) {
if (isSpoutServer) {
SpoutPlayer sp = SpoutManager.getPlayer(tp);
if (sp.isSpoutCraftEnabled()) {
WarSpoutListener.removeStats(sp);
}
}
// Send everyone to rally point (or zone lobby if not rally point)
if (this.zone.getRallyPoint() != null) {
tp.teleport(this.zone.getRallyPoint());

View File

@ -18,6 +18,7 @@ import bukkit.tommytony.war.War;
import com.tommytony.war.Team;
import com.tommytony.war.TeamKind;
import com.tommytony.war.Warzone;
import com.tommytony.war.config.TeamConfig;
public class SpoutMessenger {
@ -28,9 +29,13 @@ public class SpoutMessenger {
playerMessages.put(sp.getName(), new ArrayList<PlayerMessage>());
}
playerMessages.get(sp.getName()).add(new PlayerMessage(message));
drawMessages(sp.getName());
List<Integer> statsOffset = new ArrayList<Integer>();
List<GenericLabel> lines = getStatsLines(Warzone.getZoneByPlayerName(sp.getName()), statsOffset);
drawMessages(sp.getName(), lines, statsOffset.get(1));
}
public void fadeOutOldMessages() {
for (String playerName : playerMessages.keySet()) {
List<PlayerMessage> messages = playerMessages.get(playerName);
@ -48,7 +53,9 @@ public class SpoutMessenger {
}
if (toRemove.size() > 0) {
drawMessages(playerName);
List<Integer> statsOffset = new ArrayList<Integer>();
List<GenericLabel> lines = getStatsLines(Warzone.getZoneByPlayerName(playerName), statsOffset);
drawMessages(playerName, lines, statsOffset.get(1));
}
}
}
@ -82,7 +89,153 @@ public class SpoutMessenger {
return toNotify;
}
private void drawMessages(String playerName) {
public void updateStats(Warzone zone) {
List<Integer> statsOffset = new ArrayList<Integer>();
List<GenericLabel> statsLines = getStatsLines(zone, statsOffset);
for (Team t : zone.getTeams()) {
for (Player p : t.getPlayers()) {
SpoutPlayer sp = SpoutManager.getPlayer(p);
if (sp.isSpoutCraftEnabled()) {
drawMessages(sp.getName(), statsLines, statsOffset.get(1));
}
}
}
}
public void updateStats(Player player) {
SpoutPlayer sp = SpoutManager.getPlayer(player);
List<Integer> statsOffset = new ArrayList<Integer>();
Warzone zone = Warzone.getZoneByPlayerName(player.getName());
List<GenericLabel> statsLines = getStatsLines(zone, statsOffset);
if (sp.isSpoutCraftEnabled()) {
drawMessages(sp.getName(), statsLines, statsOffset.get(1));
}
}
private static List<GenericLabel> getStatsLines(Warzone zone, List<Integer> offset) {
List<GenericLabel> lines = new ArrayList<GenericLabel>();
offset.add(0);
offset.add(0);
if (zone != null) {
offset.clear();
List<GenericLabel> teamlines = new ArrayList<GenericLabel>();
List<GenericLabel> playerlines = new ArrayList<GenericLabel>();
List<GenericLabel> scorelines = new ArrayList<GenericLabel>();
List<GenericLabel> lifelines = new ArrayList<GenericLabel>();
int teamMax = 5, scoreMax = 5, lifeMax = 5;
GenericLabel line;
GenericLabel teamsHeader = new GenericLabel(ChatColor.GRAY + "War> " + ChatColor.WHITE + zone.getName());
int teamsHeaderWidth = GenericLabel.getStringWidth(teamsHeader.getText());
teamsHeader.setAlign(WidgetAnchor.TOP_LEFT).setX(2).setY(2).setWidth(teamsHeaderWidth);
lines.add(teamsHeader);
// First, we collect all the team names
int lineCounter = 1;
for (Team t : zone.getTeams()) {
// team name
String teamStr = t.getName() + "-" + t.getPlayers().size() + "/" + t.getTeamConfig().resolveInt(TeamConfig.TEAMSIZE);
line = new GenericLabel(teamStr);
if (t.getPlayers().size() == 0) {
line.setText(teamStr.replace("-", " "));
line.setTextColor(new Color(100,100,100));
}
else {
line.setText(t.getKind().getColor() + teamStr.replace("-", " " + ChatColor.WHITE));
}
line.setTooltip("Warzone: " + zone.getName()).setAnchor(WidgetAnchor.TOP_LEFT);
line.setAlign(WidgetAnchor.TOP_LEFT).setX(2).setY(4 + lineCounter * 8).setWidth(GenericLabel.getStringWidth(line.getText())).setHeight(GenericLabel.getStringHeight(line.getText()));
teamlines.add(line);
lineCounter++;
}
// We need to find the longest name
for (GenericLabel l : teamlines) {
if (GenericLabel.getStringWidth(l.getText()) > teamMax) {
teamMax = GenericLabel.getStringWidth(l.getText());
}
if (teamsHeaderWidth > teamMax) {
teamMax = teamsHeaderWidth;
}
}
// First line with headers
int headerOffset = teamMax - 2;
GenericLabel livesHeader = new GenericLabel(ChatColor.GRAY + "points");
int pointsHeaderWidth = GenericLabel.getStringWidth(livesHeader.getText());
livesHeader.setAlign(WidgetAnchor.TOP_LEFT).setX(headerOffset).setY(2).setWidth(pointsHeaderWidth);
headerOffset += pointsHeaderWidth + 6;
lines.add(livesHeader);
GenericLabel pointsHeader = new GenericLabel(ChatColor.GRAY + "lives");
int livesHeaderWidth = GenericLabel.getStringWidth(pointsHeader.getText());
pointsHeader.setAlign(WidgetAnchor.TOP_LEFT).setX(headerOffset).setY(2).setWidth(livesHeaderWidth);
lines.add(pointsHeader);
lineCounter = 1;
for (Team t : zone.getTeams()) {
// scores
line = new GenericLabel(t.getPoints() + "/" + t.getTeamConfig().resolveInt(TeamConfig.MAXSCORE));
if (t.getPlayers().size() == 0) line.setTextColor(new Color(100, 100, 100));
line.setTooltip("Warzone: " + zone.getName()).setAnchor(WidgetAnchor.TOP_LEFT);
line.setAlign(WidgetAnchor.TOP_LEFT).setX(2 + teamMax + 2).setY(4 + lineCounter * 8).setWidth(GenericLabel.getStringWidth(line.getText())).setHeight(GenericLabel.getStringHeight(line.getText()));
scorelines.add(line);
lineCounter++;
}
for (GenericLabel l : scorelines) {
if (GenericLabel.getStringWidth(l.getText()) > scoreMax) {
scoreMax = GenericLabel.getStringWidth(l.getText());
}
}
if (pointsHeaderWidth > scoreMax) {
scoreMax = pointsHeaderWidth;
}
// and finally, lives.
lineCounter = 1;
for (Team t : zone.getTeams()) {
line = new GenericLabel(t.getRemainingLifes() + "/" + t.getTeamConfig().resolveInt(TeamConfig.LIFEPOOL));
if (t.getPlayers().size() == 0) line.setTextColor(new Color(100, 100, 100));
line.setTooltip("Warzone: " + zone.getName()).setAnchor(WidgetAnchor.TOP_LEFT);
line.setAlign(WidgetAnchor.TOP_LEFT).setX(2 + teamMax + 2 + scoreMax + 2).setY(4 + lineCounter * 8).setWidth(GenericLabel.getStringWidth(line.getText())).setHeight(GenericLabel.getStringHeight(line.getText()));
lifelines.add(line);
lineCounter++;
}
for (GenericLabel l : lifelines) {
if (GenericLabel.getStringWidth(l.getText()) > lifeMax) {
lifeMax = GenericLabel.getStringWidth(l.getText());
}
}
if (livesHeaderWidth > lifeMax) {
lifeMax = livesHeaderWidth;
}
for (GenericLabel l : teamlines) { lines.add(l); }
for (GenericLabel l : playerlines) { lines.add(l); }
for (GenericLabel l : scorelines) { lines.add(l); }
for (GenericLabel l : lifelines) { lines.add(l); }
offset.add(2 + teamMax + 2 + scoreMax + 2 + lifeMax + 2);
offset.add(2 + lineCounter * 8);
}
return lines;
}
private static void drawStats(SpoutPlayer sp, List<GenericLabel> lines) {
for (GenericLabel l : lines) {
sp.getMainScreen().attachWidget(War.war, l.copy());
}
}
private void drawMessages(String playerName, List<GenericLabel> statsLines, Integer statsOffset) {
Player bukkitPlayer = War.war.getServer().getPlayer(playerName);
if (bukkitPlayer != null) {
SpoutPlayer player = SpoutManager.getPlayer(bukkitPlayer);
@ -91,20 +244,22 @@ public class SpoutMessenger {
// remove old widgets
clear(player);
drawStats(player, statsLines);
if (messages.size() > 0) {
int rank = 0;
Warzone zone = Warzone.getZoneByPlayerName(playerName);
int verticalOffset = 2;
int verticalOffset = statsOffset + 4;
for (PlayerMessage message : messages) {
int horizontalOffset = 2;
String messageStr = "War> " + message.getMessage();
String messageStr = ChatColor.GRAY + ">" + ChatColor.WHITE + " " + message.getMessage();
String[] words = messageStr.split(" ");
for (String word : words) {
if (horizontalOffset > 230) {
if (horizontalOffset > 160) {
horizontalOffset = 2;
verticalOffset += 8;
}