diff --git a/src/main/java/forge/control/Lobby.java b/src/main/java/forge/control/Lobby.java index 22afea2c727..cc072b03102 100644 --- a/src/main/java/forge/control/Lobby.java +++ b/src/main/java/forge/control/Lobby.java @@ -1,6 +1,8 @@ package forge.control; +import java.util.Map; import java.util.Random; +import java.util.concurrent.ConcurrentHashMap; import forge.game.player.LobbyPlayer; import forge.game.player.PlayerType; @@ -55,31 +57,22 @@ public class Lobby { "Walter", "Wilfred", "William", "Winston" }; - /** - * TODO: Write javadoc for this method. - * @param human - * @return - */ - public LobbyPlayer findLocalPlayer(PlayerType type, String name) { + private Map remotePlayers = new ConcurrentHashMap(); + private final LobbyPlayer guiPlayer = new LobbyPlayer(PlayerType.HUMAN, "Human"); + - return new LobbyPlayer(type, name); + public final LobbyPlayer getGuiPlayer() { + return guiPlayer; } - /** - * TODO: Write javadoc for this method. - * @param human - * @return - */ - public LobbyPlayer findLocalPlayer(PlayerType type) { - if (type == PlayerType.HUMAN) { - return new LobbyPlayer(type, "Human"); // need to get name! - } - - LobbyPlayer player = findLocalPlayer(type, getRandomName()); + public final LobbyPlayer getAiPlayer() { return getAiPlayer(getRandomName()); } + public final LobbyPlayer getAiPlayer(String name) { + LobbyPlayer player = new LobbyPlayer(PlayerType.COMPUTER, name); player.setAvatarIndex(MyRandom.getRandom().nextInt(FSkin.getAvatars().size())); return player; } + /** * TODO: Write javadoc for this method. * @param nextInt @@ -96,7 +89,26 @@ public class Lobby { * @return */ public LobbyPlayer getQuestPlayer() { - return new LobbyPlayer(PlayerType.HUMAN, "Human"); // need to get name! + return guiPlayer; + } + + /** + * TODO: Write javadoc for this method. + * @param name + * @return + */ + public synchronized LobbyPlayer findOrCreateRemotePlayer(String name) { + if (remotePlayers.containsKey(name)) + return remotePlayers.get(name); + + LobbyPlayer res = new LobbyPlayer(PlayerType.REMOTE, name); + // have to load avatar from remote user's preferences here + remotePlayers.put(name, res); + return res; + } + + public void disconnectPlayer(LobbyPlayer player) { + // Should set up a timer here to discard player and all of his games after 20 minutes of being offline } diff --git a/src/main/java/forge/game/limited/GauntletMini.java b/src/main/java/forge/game/limited/GauntletMini.java index b4a438edf87..ae4b9a8bdd0 100644 --- a/src/main/java/forge/game/limited/GauntletMini.java +++ b/src/main/java/forge/game/limited/GauntletMini.java @@ -30,7 +30,6 @@ import forge.game.GameType; import forge.game.MatchController; import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions; -import forge.game.player.PlayerType; import forge.gui.SOverlayUtils; /** @@ -170,8 +169,8 @@ public class GauntletMini { MatchStartHelper starter = new MatchStartHelper(); Lobby lobby = Singletons.getControl().getLobby(); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), humanDeck); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiOpponents.get(currentRound - 1)); + starter.addPlayer(lobby.getGuiPlayer(), humanDeck); + starter.addPlayer(lobby.getAiPlayer(), aiOpponents.get(currentRound - 1)); MatchController mc = Singletons.getModel().getMatch(); mc.initMatch(gauntletType, starter.getPlayerMap()); diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java index 65cc04ca230..d876b724f7f 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java @@ -253,8 +253,9 @@ public enum CSubmenuGauntletContests implements ICDoc { MatchStartHelper starter = new MatchStartHelper(); Lobby lobby = Singletons.getControl().getLobby(); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), gd.getUserDeck()); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiDeck); + + starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck()); + starter.addPlayer(lobby.getAiPlayer(), aiDeck); MatchController mc = Singletons.getModel().getMatch(); mc.initMatch(GameType.Gauntlet, starter.getPlayerMap()); diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java index 79b7f06f1a0..ea13326863f 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java @@ -17,7 +17,6 @@ import forge.deck.Deck; import forge.game.GameType; import forge.game.MatchController; import forge.game.MatchStartHelper; -import forge.game.player.PlayerType; import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletIO; import forge.gui.SOverlayUtils; @@ -116,9 +115,9 @@ public enum CSubmenuGauntletLoad implements ICDoc { MatchStartHelper starter = new MatchStartHelper(); Lobby lobby = Singletons.getControl().getLobby(); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), gd.getUserDeck()); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiDeck); - + starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck()); + starter.addPlayer(lobby.getAiPlayer(), aiDeck); + MatchController mc = Singletons.getModel().getMatch(); mc.initMatch(GameType.Gauntlet, starter.getPlayerMap()); mc.startRound(); diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java index 3a080fbdd9f..b5c4b507bf5 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java @@ -299,8 +299,9 @@ public enum CSubmenuGauntletQuick implements ICDoc { MatchStartHelper starter = new MatchStartHelper(); Lobby lobby = Singletons.getControl().getLobby(); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), gd.getUserDeck()); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiDeck); + + starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck()); + starter.addPlayer(lobby.getAiPlayer(), aiDeck); MatchController mc = Singletons.getModel().getMatch(); mc.initMatch(GameType.Gauntlet, starter.getPlayerMap()); diff --git a/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java b/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java index bd808e1b730..eb0a6d6c51c 100644 --- a/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java +++ b/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java @@ -19,7 +19,6 @@ import forge.game.GameType; import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions; import forge.game.player.LobbyPlayer; -import forge.game.player.PlayerType; import forge.gui.GuiChoose; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; @@ -418,7 +417,7 @@ public class SSubmenuQuestUtil { MatchStartHelper msh = new MatchStartHelper(); msh.addPlayer(Singletons.getControl().getLobby().getQuestPlayer(), humanStart); - LobbyPlayer aiPlayer = Singletons.getControl().getLobby().findLocalPlayer(PlayerType.COMPUTER, event.getOpponent() == null ? event.getTitle() : event.getOpponent()); + LobbyPlayer aiPlayer = Singletons.getControl().getLobby().getAiPlayer(event.getOpponent() == null ? event.getTitle() : event.getOpponent()); aiPlayer.setIconImageKey(event.getIconImageKey()); msh.addPlayer(aiPlayer, aiStart); diff --git a/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java b/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java index e6bd57f091c..2a6574906da 100644 --- a/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java +++ b/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java @@ -14,7 +14,6 @@ import forge.deck.Deck; import forge.game.GameType; import forge.game.MatchController; import forge.game.MatchStartHelper; -import forge.game.player.PlayerType; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; import forge.properties.ForgePreferences; @@ -120,8 +119,8 @@ public enum CSubmenuConstructed implements ICDoc { MatchStartHelper starter = new MatchStartHelper(); Lobby lobby = Singletons.getControl().getLobby(); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), humanDeck); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiDeck); + starter.addPlayer(lobby.getGuiPlayer(), humanDeck); + starter.addPlayer(lobby.getAiPlayer(), aiDeck); MatchController mc = Singletons.getModel().getMatch(); mc.initMatch(gameType, starter.getPlayerMap()); diff --git a/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java b/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java index 3e9067c5fca..3885a20f69f 100644 --- a/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java +++ b/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java @@ -21,7 +21,6 @@ import forge.game.MatchController; import forge.game.MatchStartHelper; import forge.game.limited.BoosterDraft; import forge.game.limited.CardPoolLimitation; -import forge.game.player.PlayerType; import forge.gui.GuiChoose; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; @@ -136,8 +135,8 @@ public enum CSubmenuDraft implements ICDoc { MatchStartHelper starter = new MatchStartHelper(); Lobby lobby = Singletons.getControl().getLobby(); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), humanDeck); - starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiDeck); + starter.addPlayer(lobby.getGuiPlayer(), humanDeck); + starter.addPlayer(lobby.getAiPlayer(), aiDeck); MatchController mc = Singletons.getModel().getMatch(); mc.initMatch(GameType.Draft, starter.getPlayerMap()); diff --git a/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java index b8d286ec76f..2ce121d3681 100644 --- a/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java +++ b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java @@ -22,7 +22,6 @@ import forge.game.GameType; import forge.game.MatchController; import forge.game.MatchStartHelper; import forge.game.player.LobbyPlayer; -import forge.game.player.PlayerType; import forge.gui.GuiDialog; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; @@ -227,7 +226,7 @@ public enum CSubmenuArchenemy implements ICDoc { Lobby lobby = Singletons.getControl().getLobby(); MatchStartHelper helper = new MatchStartHelper(); for (int i = 0; i < view.getNumPlayers(); i++) { - LobbyPlayer player = lobby.findLocalPlayer(i == 0 ? PlayerType.HUMAN : PlayerType.COMPUTER); + LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer(); if (i == 0) { diff --git a/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java b/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java index 83b43d98aee..1cdb768018c 100644 --- a/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java +++ b/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java @@ -22,7 +22,6 @@ import forge.game.GameType; import forge.game.MatchController; import forge.game.MatchStartHelper; import forge.game.player.LobbyPlayer; -import forge.game.player.PlayerType; import forge.gui.GuiDialog; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; @@ -221,9 +220,7 @@ public enum CSubmenuPlanechase implements ICDoc { GuiDialog.message("Player " + (i+1) + " will use a default planar deck."); } - - LobbyPlayer player = lobby.findLocalPlayer(i == 0 ? PlayerType.HUMAN : PlayerType.COMPUTER); - + LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer(); helper.addPlanechasePlayer(player, playerDecks.get(i), planes); } diff --git a/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java b/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java index 5516c4b7566..f0e336fb20d 100644 --- a/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java +++ b/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java @@ -20,7 +20,6 @@ import forge.game.GameType; import forge.game.MatchController; import forge.game.MatchStartHelper; import forge.game.player.LobbyPlayer; -import forge.game.player.PlayerType; import forge.gui.GuiDialog; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; @@ -178,7 +177,7 @@ public enum CSubmenuVanguard implements ICDoc { Lobby lobby = Singletons.getControl().getLobby(); MatchStartHelper helper = new MatchStartHelper(); for (int i = 0; i < view.getNumPlayers(); i++) { - LobbyPlayer player = lobby.findLocalPlayer(i == 0 ? PlayerType.HUMAN : PlayerType.COMPUTER); + LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer(); helper.addVanguardPlayer(player, playerDecks.get(i), playerAvatars.get(i)); } diff --git a/src/main/java/forge/net/client/INetClient.java b/src/main/java/forge/net/client/INetClient.java index fca8fdc04c2..46798a53c54 100644 --- a/src/main/java/forge/net/client/INetClient.java +++ b/src/main/java/forge/net/client/INetClient.java @@ -17,7 +17,7 @@ public interface INetClient { void send(IMessage message); - void setPlayer(LobbyPlayer lobbyPlayer); + void createPlayer(String playerName); LobbyPlayer getPlayer(); diff --git a/src/main/java/forge/net/client/NetClient.java b/src/main/java/forge/net/client/NetClient.java index 3349de242ed..835ade2ad6b 100644 --- a/src/main/java/forge/net/client/NetClient.java +++ b/src/main/java/forge/net/client/NetClient.java @@ -3,6 +3,7 @@ package forge.net.client; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; +import forge.Singletons; import forge.game.player.LobbyPlayer; import forge.net.IClientSocket; import forge.net.IConnectionObserver; @@ -35,6 +36,7 @@ public class NetClient implements IConnectionObserver, INetClient{ @Override public void onConnectionClosed() { // Tell the game, the client is gone. + if ( player != null ) Singletons.getControl().getLobby().disconnectPlayer(player); } @@ -63,8 +65,8 @@ public class NetClient implements IConnectionObserver, INetClient{ * @see forge.net.client.INetClient#setPlayer(forge.game.player.LobbyPlayer) */ @Override - public final void setPlayer(LobbyPlayer lobbyPlayer) { - player = lobbyPlayer; + public final void createPlayer(String name) { + player = Singletons.getControl().getLobby().findOrCreateRemotePlayer(name); } /* (non-Javadoc) diff --git a/src/main/java/forge/net/client/state/InLobbyClientState.java b/src/main/java/forge/net/client/state/InLobbyClientState.java index 79d691fc215..a5b301590a3 100644 --- a/src/main/java/forge/net/client/state/InLobbyClientState.java +++ b/src/main/java/forge/net/client/state/InLobbyClientState.java @@ -1,7 +1,10 @@ package forge.net.client.state; import forge.net.client.INetClient; +import forge.net.protocol.incoming.ChatPacket; import forge.net.protocol.incoming.IPacket; +import forge.net.protocol.incoming.PacketOpcode; +import forge.net.protocol.outcoming.EchoMessage; /** * TODO: Write javadoc for this type. @@ -16,6 +19,13 @@ public class InLobbyClientState implements IClientState { @Override public boolean processPacket(IPacket data) { + if( data.getOpCode() == PacketOpcode.Chat) + { + ChatPacket cp = (ChatPacket) data; + // should actually find all players in a lobby and send it to them + client.send(new EchoMessage("chat - " + cp.getMessage())); + return true; + } return false; } } \ No newline at end of file diff --git a/src/main/java/forge/net/client/state/UnauthorizedClientState.java b/src/main/java/forge/net/client/state/UnauthorizedClientState.java index 5998ee6b070..5cd40ba9294 100644 --- a/src/main/java/forge/net/client/state/UnauthorizedClientState.java +++ b/src/main/java/forge/net/client/state/UnauthorizedClientState.java @@ -1,7 +1,5 @@ package forge.net.client.state; -import forge.game.player.LobbyPlayer; -import forge.game.player.PlayerType; import forge.net.client.INetClient; import forge.net.protocol.incoming.AuthorizePacket; import forge.net.protocol.incoming.IPacket; @@ -32,7 +30,7 @@ public class UnauthorizedClientState implements IClientState { client.send(new AuthorizationSuccessfulMessage(p.getUsername())); - client.setPlayer(new LobbyPlayer(PlayerType.REMOTE, p.getUsername())); + client.createPlayer(p.getUsername()); client.replaceState(this, new InLobbyClientState(client)); return true; } diff --git a/src/main/java/forge/net/protocol/outcoming/EchoMessage.java b/src/main/java/forge/net/protocol/outcoming/EchoMessage.java index 1452d98e8ea..915c9594eb2 100644 --- a/src/main/java/forge/net/protocol/outcoming/EchoMessage.java +++ b/src/main/java/forge/net/protocol/outcoming/EchoMessage.java @@ -20,7 +20,7 @@ public class EchoMessage implements IMessage { @Override public String toNetString() { - return String.format("System: %s", message); + return String.format("Echo: %s", message); } }