Chat and 'player has joined' announcements work now.

This commit is contained in:
Maxmtg
2013-04-17 13:21:45 +00:00
parent 2ccb64efa3
commit dbcb86c62d
13 changed files with 85 additions and 24 deletions

2
.gitattributes vendored
View File

@@ -13914,6 +13914,7 @@ src/main/java/forge/card/trigger/TriggerWaiting.java -text
src/main/java/forge/card/trigger/WrappedAbility.java -text src/main/java/forge/card/trigger/WrappedAbility.java -text
src/main/java/forge/card/trigger/ZCTrigger.java svneol=native#text/plain src/main/java/forge/card/trigger/ZCTrigger.java svneol=native#text/plain
src/main/java/forge/card/trigger/package-info.java svneol=native#text/plain src/main/java/forge/card/trigger/package-info.java svneol=native#text/plain
src/main/java/forge/control/ChatArea.java -text
src/main/java/forge/control/ControlBazaarUI.java -text src/main/java/forge/control/ControlBazaarUI.java -text
src/main/java/forge/control/FControl.java -text src/main/java/forge/control/FControl.java -text
src/main/java/forge/control/KeyboardShortcuts.java -text src/main/java/forge/control/KeyboardShortcuts.java -text
@@ -14321,6 +14322,7 @@ src/main/java/forge/net/protocol/incoming/PacketOpcode.java -text
src/main/java/forge/net/protocol/incoming/UnknownPacket.java -text src/main/java/forge/net/protocol/incoming/UnknownPacket.java -text
src/main/java/forge/net/protocol/incoming/package-info.java -text src/main/java/forge/net/protocol/incoming/package-info.java -text
src/main/java/forge/net/protocol/outcoming/AuthorizationSuccessfulMessage.java -text src/main/java/forge/net/protocol/outcoming/AuthorizationSuccessfulMessage.java -text
src/main/java/forge/net/protocol/outcoming/ChatMessage.java -text
src/main/java/forge/net/protocol/outcoming/EchoMessage.java -text src/main/java/forge/net/protocol/outcoming/EchoMessage.java -text
src/main/java/forge/net/protocol/outcoming/IMessage.java -text src/main/java/forge/net/protocol/outcoming/IMessage.java -text
src/main/java/forge/net/protocol/outcoming/IncorrectPacketMessage.java -text src/main/java/forge/net/protocol/outcoming/IncorrectPacketMessage.java -text

View File

@@ -7,7 +7,7 @@ div.wrap { width: 640px; margin: 100px auto;}
.title input {width: 300px; } .title input {width: 300px; }
.title span { display: inline-block; width: 120px; text-align: right; } .title span { display: inline-block; width: 120px; text-align: right; }
.messages { height: 20ex; overflow: auto; background-color: #fff; padding: 4px; border: 1px solid black; list-style: none; } .messages { height: 30ex; overflow: auto; background-color: #fff; padding: 4px; border: 1px solid black; list-style: none; }
.messages .incoming { color: #006; } .messages .incoming { color: #006; }
.messages .incoming:before { content: "<< "} .messages .incoming:before { content: "<< "}
.messages .outcoming { color: #060; } .messages .outcoming { color: #060; }

View File

@@ -0,0 +1,9 @@
package forge.control;
/** How 'loudly' the message should sound */
public enum ChatArea {
Room,
Match,
Whisper, // that is private
Server
}

View File

@@ -9,6 +9,7 @@ import forge.game.player.LobbyPlayerAi;
import forge.game.player.LobbyPlayerHuman; import forge.game.player.LobbyPlayerHuman;
import forge.game.player.LobbyPlayerRemote; import forge.game.player.LobbyPlayerRemote;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.net.client.INetClient;
import forge.util.MyRandom; import forge.util.MyRandom;
/** /**
@@ -61,7 +62,7 @@ public class Lobby {
private Map<String, LobbyPlayerRemote> remotePlayers = new ConcurrentHashMap<String, LobbyPlayerRemote>(); private Map<String, LobbyPlayerRemote> remotePlayers = new ConcurrentHashMap<String, LobbyPlayerRemote>();
private final LobbyPlayerHuman guiPlayer = new LobbyPlayerHuman("Human"); private final LobbyPlayerHuman guiPlayer = new LobbyPlayerHuman("Human");
private final LobbyPlayerAi system = new LobbyPlayerAi("System");
public final LobbyPlayerHuman getGuiPlayer() { public final LobbyPlayerHuman getGuiPlayer() {
return guiPlayer; return guiPlayer;
@@ -99,13 +100,15 @@ public class Lobby {
* @param name * @param name
* @return * @return
*/ */
public synchronized LobbyPlayer findOrCreateRemotePlayer(String name) { public synchronized LobbyPlayer findOrCreateRemotePlayer(String name, INetClient client) {
if (remotePlayers.containsKey(name)) if (remotePlayers.containsKey(name))
return remotePlayers.get(name); return remotePlayers.get(name);
LobbyPlayerRemote res = new LobbyPlayerRemote(name); LobbyPlayerRemote res = new LobbyPlayerRemote(name, client);
speak(ChatArea.Room, system, res.getName() + " has joined the server.");
// have to load avatar from remote user's preferences here // have to load avatar from remote user's preferences here
remotePlayers.put(name, res); remotePlayers.put(name, res);
return res; return res;
} }
@@ -114,4 +117,10 @@ public class Lobby {
} }
public void speak(ChatArea room, LobbyPlayer player, String message) {
getGuiPlayer().hear(player, message);
for(LobbyPlayer remote : remotePlayers.values()) {
remote.hear(player, message);
}
}
} }

View File

@@ -7,9 +7,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import com.google.common.collect.Iterables;
import forge.Constant.Preferences; import forge.Constant.Preferences;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
@@ -188,12 +185,6 @@ public class MatchController {
currentGame.setAge(GameAge.Mulligan); currentGame.setAge(GameAge.Mulligan);
getInput().clearInput(); getInput().clearInput();
//getInput().setNewInput(currentGame);
// Thread thGame = new GameInputUpdatesThread(this, currentGame);
// thGame.setName("Game input updater");
// thGame.start();
// TODO restore this functionality!!! // TODO restore this functionality!!!
//VMatchUI.SINGLETON_INSTANCE.getViewDevMode().getDocument().setVisible(Preferences.DEV_MODE); //VMatchUI.SINGLETON_INSTANCE.getViewDevMode().getDocument().setVisible(Preferences.DEV_MODE);

View File

@@ -77,4 +77,6 @@ public abstract class LobbyPlayer implements IHasIcon {
} }
public abstract Player getPlayer(GameState gameState); // factory method to create player public abstract Player getPlayer(GameState gameState); // factory method to create player
public abstract void hear(LobbyPlayer player, String message);
} }

View File

@@ -22,11 +22,11 @@ public class LobbyPlayerAi extends LobbyPlayer {
return PlayerType.COMPUTER; return PlayerType.COMPUTER;
} }
/* (non-Javadoc)
* @see forge.game.player.LobbyPlayer#getPlayer(forge.game.GameState)
*/
@Override @Override
public Player getPlayer(GameState game) { public Player getPlayer(GameState game) {
return new AIPlayer(this, game); return new AIPlayer(this, game);
} }
@Override
public void hear(LobbyPlayer player, String message) { /* Local AI is deaf. */ }
} }

View File

@@ -1,6 +1,7 @@
package forge.game.player; package forge.game.player;
import forge.game.GameState; import forge.game.GameState;
import forge.gui.FNetOverlay;
public class LobbyPlayerHuman extends LobbyPlayer { public class LobbyPlayerHuman extends LobbyPlayer {
public LobbyPlayerHuman(String name) { public LobbyPlayerHuman(String name) {
@@ -16,4 +17,8 @@ public class LobbyPlayerHuman extends LobbyPlayer {
public Player getPlayer(GameState game) { public Player getPlayer(GameState game) {
return new HumanPlayer(this, game); return new HumanPlayer(this, game);
} }
public void hear(LobbyPlayer player, String message) {
FNetOverlay.SINGLETON_INSTANCE.addMessage(player.getName(), message);
}
} }

View File

@@ -3,10 +3,16 @@ package forge.game.player;
import org.apache.commons.lang.NotImplementedException; import org.apache.commons.lang.NotImplementedException;
import forge.game.GameState; import forge.game.GameState;
import forge.net.client.INetClient;
import forge.net.protocol.outcoming.ChatMessage;
public class LobbyPlayerRemote extends LobbyPlayer { public class LobbyPlayerRemote extends LobbyPlayer {
public LobbyPlayerRemote(String name) {
private final INetClient connection;
public LobbyPlayerRemote(String name, INetClient netClient) { // This is actually a doubtful idea - this means 1 window per player.
super(name); super(name);
connection = netClient;
} }
@Override @Override
@@ -22,4 +28,9 @@ public class LobbyPlayerRemote extends LobbyPlayer {
// Cannot create remote players yet // Cannot create remote players yet
throw new NotImplementedException(); throw new NotImplementedException();
} }
@Override
public void hear(LobbyPlayer player, String message) {
connection.send(new ChatMessage(player.getName(), message));
}
} }

View File

@@ -20,6 +20,9 @@ import javax.swing.ScrollPaneConstants;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.Singletons;
import forge.control.ChatArea;
import forge.control.Lobby;
import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTextArea; import forge.gui.toolbox.FTextArea;
@@ -56,7 +59,9 @@ public enum FNetOverlay {
txtInput.setText(""); txtInput.setText("");
if ( StringUtils.isBlank(message) ) if ( StringUtils.isBlank(message) )
return; return;
addMessage("You", message);
Lobby lobby = Singletons.getControl().getLobby();
lobby.speak(ChatArea.Room, lobby.getGuiPlayer(), message);
} }
}; };
@@ -98,7 +103,7 @@ public enum FNetOverlay {
} }
public void showUp(String message) { public void showUp(String message) {
txtLog.setText(message + "\n"); txtLog.setText(message);
pnl.setVisible(true); pnl.setVisible(true);
} }
@@ -135,7 +140,7 @@ public enum FNetOverlay {
SimpleDateFormat inFormat = new SimpleDateFormat("HH:mm:ss"); SimpleDateFormat inFormat = new SimpleDateFormat("HH:mm:ss");
public void addMessage(String origin, String message) { public void addMessage(String origin, String message) {
String toAdd = String.format("[%s] %s: %s%n", inFormat.format(new Date()), origin, message); String toAdd = String.format("%n[%s] %s: %s", inFormat.format(new Date()), origin, message);
txtLog.append(toAdd); txtLog.append(toAdd);
} }
} }

View File

@@ -66,7 +66,7 @@ public class NetClient implements IConnectionObserver, INetClient{
*/ */
@Override @Override
public final void createPlayer(String name) { public final void createPlayer(String name) {
player = Singletons.getControl().getLobby().findOrCreateRemotePlayer(name); player = Singletons.getControl().getLobby().findOrCreateRemotePlayer(name, this);
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -1,10 +1,11 @@
package forge.net.client.state; package forge.net.client.state;
import forge.Singletons;
import forge.control.ChatArea;
import forge.net.client.INetClient; import forge.net.client.INetClient;
import forge.net.protocol.incoming.ChatPacket; import forge.net.protocol.incoming.ChatPacket;
import forge.net.protocol.incoming.IPacket; import forge.net.protocol.incoming.IPacket;
import forge.net.protocol.incoming.PacketOpcode; import forge.net.protocol.incoming.PacketOpcode;
import forge.net.protocol.outcoming.EchoMessage;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
@@ -22,8 +23,10 @@ public class InLobbyClientState implements IClientState {
if( data.getOpCode() == PacketOpcode.Chat) if( data.getOpCode() == PacketOpcode.Chat)
{ {
ChatPacket cp = (ChatPacket) data; ChatPacket cp = (ChatPacket) data;
// should actually find all players in a lobby and send it to them // if ( not muted )
client.send(new EchoMessage("chat - " + cp.getMessage())); Singletons.getControl().getLobby().speak(ChatArea.Room, client.getPlayer(), cp.getMessage());
// else
// client.send("You are banned and cannot speak");
return true; return true;
} }
return false; return false;

View File

@@ -0,0 +1,24 @@
package forge.net.protocol.outcoming;
/**
* TODO: Write javadoc for this type.
*
*/
public class ChatMessage implements IMessage {
private final String player;
private final String message;
public ChatMessage(String playerName, String message) {
// TODO Auto-generated constructor stub
this.message = message;
this.player = playerName;
}
@Override
public String toNetString() {
// TODO Auto-generated method stub
return String.format("%s: %s", player, message);
}
}