Playing around with Spoutcraft notifications at the top left of the screen, so that War messages don't spam the chat anymore.

This commit is contained in:
taoneill 2012-01-07 17:26:27 -05:00
parent 6eeb5be673
commit 5c3fca5001
11 changed files with 321 additions and 86 deletions

View File

@ -40,8 +40,10 @@ import com.tommytony.war.config.WarConfigBag;
import com.tommytony.war.config.WarzoneConfig;
import com.tommytony.war.config.WarzoneConfigBag;
import com.tommytony.war.jobs.HelmetProtectionTask;
import com.tommytony.war.jobs.SpoutFadeOutMessageJob;
import com.tommytony.war.mappers.WarYmlMapper;
import com.tommytony.war.mappers.WarzoneYmlMapper;
import com.tommytony.war.spout.SpoutMessenger;
import com.tommytony.war.utils.ChatFixUtil;
import com.tommytony.war.utils.PlayerState;
@ -88,6 +90,7 @@ public class War extends JavaPlugin {
private final WarConfigBag warConfig = new WarConfigBag();
private final WarzoneConfigBag warzoneDefaultConfig = new WarzoneConfigBag();
private final TeamConfigBag teamDefaultConfig = new TeamConfigBag();
private SpoutMessenger spoutMessenger = new SpoutMessenger();
public War() {
super();
@ -260,6 +263,9 @@ public class War extends JavaPlugin {
// Start tasks
HelmetProtectionTask helmetProtectionTask = new HelmetProtectionTask();
this.getServer().getScheduler().scheduleSyncRepeatingTask(this, helmetProtectionTask, 250, 100);
SpoutFadeOutMessageJob fadeOutMessagesTask = new SpoutFadeOutMessageJob();
this.getServer().getScheduler().scheduleSyncRepeatingTask(this, fadeOutMessagesTask, 100, 100);
this.log("War v" + this.desc.getVersion() + " is on.", Level.INFO);
}
@ -1007,4 +1013,8 @@ public class War extends JavaPlugin {
public WarConfigBag getWarConfig() {
return this.warConfig;
}
public SpoutMessenger getSpoutMessenger() {
return this.spoutMessenger ;
}
}

View File

@ -15,6 +15,7 @@ import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.inventory.ItemStack;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.player.SpoutPlayer;
import com.tommytony.war.FlagReturn;
@ -245,7 +246,7 @@ public class WarBlockListener extends BlockListener {
if (t.getName().equals(lostFlagTeam.getName())) {
if (War.war.isSpoutServer()) {
for (Player p : t.getPlayers()) {
SpoutPlayer sp = (SpoutPlayer) p;
SpoutPlayer sp = SpoutManager.getPlayer(p);
if (sp.isSpoutCraftEnabled()) {
String tn = team.getName();
sp.sendNotification(tn.substring(0,1).toUpperCase()+tn.substring(1).toLowerCase()+" stole your Flag!","Stolen by "+player.getName(),lostFlagTeam.getKind().getMaterial(),lostFlagTeam.getKind().getData(),3000);

View File

@ -25,6 +25,7 @@ import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.player.SpoutPlayer;
import com.tommytony.war.FlagReturn;
@ -519,7 +520,7 @@ public class WarPlayerListener extends PlayerListener {
for (Team t : playerWarzone.getTeams()) {
if (War.war.isSpoutServer()) {
for (Player p : t.getPlayers()) {
SpoutPlayer sp = (SpoutPlayer) p;
SpoutPlayer sp = SpoutManager.getPlayer(p);
if (sp.isSpoutCraftEnabled()) {
String tn = playerTeam.getName();
sp.sendNotification(tn.substring(0,1).toUpperCase()+tn.substring(1).toLowerCase()+" captures Flag!","Capped by "+player.getName(),victim.getKind().getMaterial(),victim.getKind().getData(),3000);

View File

@ -3,6 +3,7 @@ package bukkit.tommytony.war;
import org.bukkit.entity.Player;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.event.server.ServerListener;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.player.SpoutPlayer;
public class WarServerListener extends ServerListener {
@ -11,11 +12,12 @@ public class WarServerListener extends ServerListener {
if (event.getPlugin().getDataFolder().getName().equals("Spout")) {
if (War.war.isSpoutServer()) {
for (Player player : War.war.getServer().getOnlinePlayers()) {
SpoutPlayer sp = (SpoutPlayer) player;
SpoutPlayer sp = SpoutManager.getPlayer(player);
if (sp.isSpoutCraftEnabled()) {
sp.getMainScreen().removeWidgets(War.war);
}
}
War.war.getSpoutMessenger().clearAll();
}
}
}

View File

@ -5,6 +5,7 @@ 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;
@ -32,85 +33,87 @@ public class WarSpoutListener extends SpoutListener {
}
public static void updateStats(Warzone zone) {
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 = (SpoutPlayer) player;
if (sp.isSpoutCraftEnabled()) {
drawStats(sp, lines);
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);
}
}
}
}

View File

@ -10,6 +10,8 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.player.SpoutPlayer;
import bukkit.tommytony.war.War;
import bukkit.tommytony.war.WarSpoutListener;
@ -357,7 +359,12 @@ public class Team {
public void teamcast(String message) {
for (Player player : this.players) {
War.war.msg(player, message);
SpoutPlayer sp = SpoutManager.getPlayer(player);
if (sp.isSpoutCraftEnabled()) {
War.war.getSpoutMessenger().msg(sp, message);
} else {
War.war.msg(player, message);
}
}
}

View File

@ -21,6 +21,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.player.SpoutPlayer;
import bukkit.tommytony.war.War;
@ -315,7 +316,7 @@ public class Warzone {
// Spout
if (War.war.isSpoutServer()) {
((SpoutPlayer) player).setTitle(team.getKind().getColor() + player.getName());
SpoutManager.getPlayer(player).setTitle(team.getKind().getColor() + player.getName());
}
final LoadoutResetJob job = new LoadoutResetJob(this, team, player, isFirstRespawn, false);
@ -830,7 +831,7 @@ public class Warzone {
player.setRemainingAir(300);
if (War.war.isSpoutServer()) {
SpoutPlayer sp = (SpoutPlayer) player;
SpoutPlayer sp = SpoutManager.getPlayer(player);
if (sp.isSpoutCraftEnabled()) {
WarSpoutListener.removeStats(sp);
sp.setTitle(ChatColor.WHITE + player.getName());

View File

@ -2,6 +2,7 @@ package com.tommytony.war.jobs;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.player.SpoutPlayer;
import bukkit.tommytony.war.War;
@ -26,7 +27,7 @@ public class ScoreCapReachedJob implements Runnable {
boolean isSpoutServer = War.war.isSpoutServer();
for (Player tp : t.getPlayers()) {
if (isSpoutServer) {
SpoutPlayer sp = (SpoutPlayer) tp;
SpoutPlayer sp = SpoutManager.getPlayer(tp);
if (sp.isSpoutCraftEnabled()) {
WarSpoutListener.removeStats(sp);
}

View File

@ -0,0 +1,14 @@
package com.tommytony.war.jobs;
import bukkit.tommytony.war.War;
public class SpoutFadeOutMessageJob implements Runnable {
public SpoutFadeOutMessageJob() {
}
public void run() {
War.war.getSpoutMessenger().fadeOutOldMessages();
}
}

View File

@ -0,0 +1,20 @@
package com.tommytony.war.spout;
public class PlayerMessage {
private final String message;
private final long sendTime;
public PlayerMessage(String message) {
this.message = message;
this.sendTime = System.currentTimeMillis();
}
public String getMessage() {
return message;
}
public long getSendTime() {
return sendTime;
}
}

View File

@ -0,0 +1,175 @@
package com.tommytony.war.spout;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.bukkit.entity.Player;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.gui.Color;
import org.getspout.spoutapi.gui.Container;
import org.getspout.spoutapi.gui.ContainerType;
import org.getspout.spoutapi.gui.GenericContainer;
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.TeamKind;
import com.tommytony.war.Warzone;
import bukkit.tommytony.war.War;
public class SpoutMessenger {
Map<String, List<PlayerMessage>> playerMessages = new HashMap<String, List<PlayerMessage>>();
public void msg(SpoutPlayer sp, String message) {
if (!playerMessages.containsKey(sp.getName())) {
playerMessages.put(sp.getName(), new ArrayList<PlayerMessage>());
}
playerMessages.get(sp.getName()).add(new PlayerMessage(message));
drawMessages(sp.getName());
}
public void fadeOutOldMessages() {
for (String playerName : playerMessages.keySet()) {
List<PlayerMessage> messages = playerMessages.get(playerName);
List<PlayerMessage> toRemove = new ArrayList<PlayerMessage>();
for (PlayerMessage message : messages) {
if (System.currentTimeMillis() - message.getSendTime() > 10000) {
toRemove.add(message);
}
}
for (PlayerMessage removing : toRemove) {
messages.remove(removing);
}
drawMessages(playerName);
}
}
public void remove(String playerName) {
Player player = War.war.getServer().getPlayer(playerName);
if (player != null && playerMessages.containsKey(playerName)) {
clear(SpoutManager.getPlayer(player));
playerMessages.remove(playerName);
}
}
private void clear(SpoutPlayer player) {
player.getMainScreen().removeWidgets(War.war);
}
public void clearAll() {
for (String name : playerMessages.keySet()) {
Player player = War.war.getServer().getPlayer(name);
if (player != null && playerMessages.containsKey(name)) {
clear(SpoutManager.getPlayer(player));
}
playerMessages.remove(name);
}
}
private void drawMessages(String playerName) {
SpoutPlayer player = SpoutManager.getPlayer(War.war.getServer().getPlayer(playerName));
List<PlayerMessage> messages = playerMessages.get(playerName);
clear(player);
if (messages.size() > 0) {
// Container msgListContainer = new GenericContainer();
// msgListContainer.setAlign(WidgetAnchor.TOP_LEFT);
// msgListContainer.setLayout(ContainerType.VERTICAL);
int rank = 0;
int maxLineWidth = 0;
int verticalOffset = 2;
for (PlayerMessage message : messages) {
// Container msgContainer = new GenericContainer();
// msgContainer.setLayout(ContainerType.VERTICAL);
int horizontalOffset = 2;
String messageStr = "War> " + message.getMessage();
String[] words = messageStr.split(" ");
int noOfLetters = 0;
for (String word : words) {
noOfLetters += word.length() + 1;
if (noOfLetters > 50) {
horizontalOffset = 2;
verticalOffset += 12;
}
GenericLabel label = new GenericLabel(word);
label.setTextColor(getWordColor(word, playerName));
int width = GenericLabel.getStringWidth(word);
label.setAlign(WidgetAnchor.TOP_LEFT);
label.setWidth(width);
label.setHeight(GenericLabel.getStringHeight(word));
label.setX(horizontalOffset);
label.setY(verticalOffset);
player.getMainScreen().attachWidget(War.war, label);
//label.shiftXPos(horizOffset);
//lineContainer.addChild(label);
//lineWidth += GenericLabel.getStringWidth(word);
horizontalOffset += width + 2;
}
// lineContainer.setWidth(lineWidth + 50);
// lineContainer.setHeight(12);
// msgContainer.addChild(lineContainer);
//
// msgContainer.setWidth(maxLineWidth + 50);
// msgContainer.setHeight(40);
// msgListContainer.addChild(msgContainer);
verticalOffset += 12;
rank++;
}
// remove old message list
// new message list
// msgListContainer.setWidth(maxLineWidth);
// msgListContainer.setHeight(200);
// player.getMainScreen().attachWidget(War.war, msgListContainer);
}
}
private Color getWordColor(String word, String playerName) {
Warzone zone = Warzone.getZoneByPlayerName(playerName);
for (Team team : zone.getTeams()) {
for (Player player : team.getPlayers()) {
if (word.contains(player.getName())) {
return team.getKind().getSpoutColor();
}
}
}
for (TeamKind kind : TeamKind.values()) {
if (word.contains(kind.toString())) {
return kind.getSpoutColor();
}
}
if (word.equals("War>")) {
return new Color(200,200,200);
}
// white by default
return new Color(255,255,255);
}
}