diff --git a/.gitattributes b/.gitattributes
index 3b8b5a846da..fe6a40338d4 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -17671,6 +17671,7 @@ forge-gui/src/main/java/forge/match/AbstractGuiGame.java -text
forge-gui/src/main/java/forge/match/GameLobby.java -text
forge-gui/src/main/java/forge/match/HostedMatch.java -text
forge-gui/src/main/java/forge/match/LobbySlot.java -text
+forge-gui/src/main/java/forge/match/LobbySlotType.java -text
forge-gui/src/main/java/forge/match/LocalLobby.java -text
forge-gui/src/main/java/forge/match/MatchButtonType.java -text
forge-gui/src/main/java/forge/match/MatchConstants.java -text
@@ -17705,14 +17706,24 @@ forge-gui/src/main/java/forge/model/MetaSet.java -text
forge-gui/src/main/java/forge/model/MultipleForgeJarsFoundError.java -text
forge-gui/src/main/java/forge/model/UnOpenedMeta.java -text
forge-gui/src/main/java/forge/model/package-info.java svneol=native#text/plain
-forge-gui/src/main/java/forge/net/ClientGameLobby.java -text
-forge-gui/src/main/java/forge/net/FGameClient.java -text
-forge-gui/src/main/java/forge/net/FServerManager.java -text
-forge-gui/src/main/java/forge/net/LobbyUpdateEvent.java -text
-forge-gui/src/main/java/forge/net/NetGameController.java -text
-forge-gui/src/main/java/forge/net/NetGuiGame.java -text
-forge-gui/src/main/java/forge/net/ServerGameLobby.java -text
+forge-gui/src/main/java/forge/net/IRemote.java -text
+forge-gui/src/main/java/forge/net/ReplyPool.java -text
+forge-gui/src/main/java/forge/net/client/ClientGameLobby.java -text
+forge-gui/src/main/java/forge/net/client/FGameClient.java -text
+forge-gui/src/main/java/forge/net/client/GameClientHandler.java -text
+forge-gui/src/main/java/forge/net/client/IToServer.java -text
+forge-gui/src/main/java/forge/net/client/NetGameController.java -text
+forge-gui/src/main/java/forge/net/client/package-info.java -text
+forge-gui/src/main/java/forge/net/event/ReplyEvent.java -text
+forge-gui/src/main/java/forge/net/event/UpdateLobbyPlayerEvent.java -text
+forge-gui/src/main/java/forge/net/event/package-info.java -text
forge-gui/src/main/java/forge/net/package-info.java -text
+forge-gui/src/main/java/forge/net/server/FServerManager.java -text
+forge-gui/src/main/java/forge/net/server/IToClient.java -text
+forge-gui/src/main/java/forge/net/server/NetGuiGame.java -text
+forge-gui/src/main/java/forge/net/server/RemoteClient.java -text
+forge-gui/src/main/java/forge/net/server/ServerGameLobby.java -text
+forge-gui/src/main/java/forge/net/server/package-info.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestAction.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestController.java -text
diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml
index 4df10ee44cf..d986bd78054 100644
--- a/forge-gui-android/pom.xml
+++ b/forge-gui-android/pom.xml
@@ -62,11 +62,6 @@
forge-ai
${project.version}
-
- forge
- forge-net
- ${project.version}
-
forge
forge-gui
diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml
index 39b06391a87..e26617a73a6 100644
--- a/forge-gui-desktop/pom.xml
+++ b/forge-gui-desktop/pom.xml
@@ -174,11 +174,6 @@
forge-ai
${project.version}
-
- forge
- forge-net
- ${project.version}
-
forge
forge-gui
diff --git a/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java b/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java
index 52e35b3aa5f..c77d81f5a96 100644
--- a/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java
+++ b/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java
@@ -18,8 +18,8 @@ import org.apache.commons.lang3.StringUtils;
import forge.Singletons;
import forge.gui.framework.SDisplayUtil;
import forge.model.FModel;
-import forge.net.game.IRemote;
-import forge.net.game.MessageEvent;
+import forge.net.IRemote;
+import forge.net.event.MessageEvent;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.toolbox.FLabel;
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/CHomeUI.java b/forge-gui-desktop/src/main/java/forge/screens/home/CHomeUI.java
index b56d8bce60e..199982c4c4a 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/CHomeUI.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/CHomeUI.java
@@ -6,14 +6,11 @@ import javax.swing.JMenu;
import forge.Singletons;
import forge.UiCommand;
-import forge.gui.FNetOverlay;
import forge.gui.framework.EDocID;
import forge.gui.framework.ICDoc;
import forge.menus.IMenuProvider;
import forge.menus.MenuUtil;
import forge.model.FModel;
-import forge.net.FServer;
-import forge.net.FServerManager;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.screens.home.sanctioned.VSubmenuConstructed;
@@ -83,31 +80,6 @@ public enum CHomeUI implements ICDoc, IMenuProvider {
Singletons.getControl().getForgeMenu().setProvider(this);
selectPrevious();
-
- VHomeUI.SINGLETON_INSTANCE.getLblStartServer().setCommand(new Runnable() {
- @Override
- public void run() {
- //final NetServer srv = FServer.getServer();
- //srv.listen(ForgeConstants.SERVER_PORT_NUMBER);
-
- VHomeUI.SINGLETON_INSTANCE.getLblStopServer().setEnabled(true);
- VHomeUI.SINGLETON_INSTANCE.getLblStartServer().setEnabled(false);
-
- FNetOverlay.SINGLETON_INSTANCE.showUp("");//"Server listening on port " + srv.getPortNumber());
- }
- });
-
- VHomeUI.SINGLETON_INSTANCE.getLblStopServer().setCommand(new Runnable() {
- @Override
- public void run() {
- FServer.getServer().stop();
- FServerManager.getInstance().stopServer();
- VHomeUI.SINGLETON_INSTANCE.getLblStopServer().setEnabled(false);
- VHomeUI.SINGLETON_INSTANCE.getLblStartServer().setEnabled(true);
-
- FNetOverlay.SINGLETON_INSTANCE.getWindow().setVisible(false);
- }
- });
}
/* (non-Javadoc)
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java
index 673209314ad..85aa49d3a8a 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java
@@ -30,8 +30,8 @@ import forge.game.GameType;
import forge.gui.framework.FScreen;
import forge.item.PaperCard;
import forge.match.LobbySlot;
+import forge.match.LobbySlotType;
import forge.model.FModel;
-import forge.net.game.LobbySlotType;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.screens.deckeditor.CDeckEditorUI;
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java b/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java
index 5e83e8300fa..38ad108cedd 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java
@@ -41,7 +41,6 @@ import forge.gui.framework.ICDoc;
import forge.gui.framework.ILocalRepaint;
import forge.gui.framework.IVTopLevelUI;
import forge.model.FModel;
-import forge.properties.ForgeConstants;
import forge.properties.ForgePreferences.FPref;
import forge.screens.home.gauntlet.VSubmenuGauntletBuild;
import forge.screens.home.gauntlet.VSubmenuGauntletContests;
@@ -97,35 +96,17 @@ public enum VHomeUI implements IVTopLevelUI {
.iconAlignX(SwingConstants.CENTER)
.iconInBackground(true).iconScaleFactor(1.0).build();
- private final FLabel lblStartServer = new FLabel.ButtonBuilder().text("Start Server").fontSize(14).build();
- private final FLabel lblStopServer = new FLabel.ButtonBuilder().text("Stop Server").fontSize(14).build();
-
private VHomeUI() {
// Add main menu containing logo and menu buttons
final JPanel pnlMainMenu = new JPanel(new MigLayout("w 200px!, ax center, insets 0, gap 0, wrap"));
pnlMainMenu.setOpaque(false);
- final List mainMenuButtons = new ArrayList();
- if (ForgeConstants.SERVER_PORT_NUMBER >= 80) {
- mainMenuButtons.add(lblStartServer);
- mainMenuButtons.add(lblStopServer);
- lblStopServer.setEnabled(false);
- }
-
final int logoSize = 170;
final int logoBottomGap = 4;
- final int buttonHeight = 30;
- final int buttonBottomGap = 8;
- final int pnlMainMenuHeight = logoSize + logoBottomGap +
- mainMenuButtons.size() * (buttonHeight + buttonBottomGap);
+ final int pnlMainMenuHeight = logoSize + logoBottomGap;
pnlMainMenu.add(lblLogo, "w " + logoSize + "px!, h " + logoSize +
"px!, gap 0 4px 0 " + logoBottomGap + "px");
- String buttonLayout = "w 170px!, h " + buttonHeight +
- "px!, gap 0 0 0 " + buttonBottomGap + "px";
- for (FLabel button : mainMenuButtons) {
- pnlMainMenu.add(button, buttonLayout);
- }
pnlMenu.add(pnlMainMenu);
pnlSubmenus = new FScrollPanel(new MigLayout("insets 0, gap 0, wrap, hidemode 3"), true,
@@ -137,7 +118,7 @@ public enum VHomeUI implements IVTopLevelUI {
allSubmenus.add(VSubmenuSealed.SINGLETON_INSTANCE);
//allSubmenus.add(VSubmenuWinston.SINGLETON_INSTANCE);
- //allSubmenus.add(VSubmenuOnlineLobby.SINGLETON_INSTANCE);
+ allSubmenus.add(VSubmenuOnlineLobby.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuDuels.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuChallenges.SINGLETON_INSTANCE);
@@ -189,14 +170,6 @@ public enum VHomeUI implements IVTopLevelUI {
pnlDisplay.setBackground(l00.alphaColor(100));
}
- public final FLabel getLblStartServer() {
- return lblStartServer;
- }
-
- public final FLabel getLblStopServer() {
- return lblStopServer;
- }
-
/** @return {@link javax.swing.JPanel} */
public JPanel getPnlMenu() {
return pnlMenu;
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java
index 7a48bf81c62..c984915c782 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java
@@ -42,9 +42,9 @@ import forge.interfaces.IUpdateable;
import forge.item.PaperCard;
import forge.match.GameLobby;
import forge.match.LobbySlot;
+import forge.match.LobbySlotType;
import forge.model.FModel;
-import forge.net.game.LobbySlotType;
-import forge.net.game.UpdateLobbyPlayerEvent;
+import forge.net.event.UpdateLobbyPlayerEvent;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.toolbox.FCheckBox;
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java
index b3f64f8f9b3..157d1221557 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java
@@ -20,15 +20,15 @@ import forge.match.GameLobby.GameLobbyData;
import forge.menus.IMenuProvider;
import forge.menus.MenuUtil;
import forge.model.FModel;
-import forge.net.ClientGameLobby;
-import forge.net.FGameClient;
-import forge.net.FServerManager;
-import forge.net.ServerGameLobby;
-import forge.net.game.IRemote;
-import forge.net.game.IdentifiableNetEvent;
-import forge.net.game.MessageEvent;
-import forge.net.game.NetEvent;
-import forge.net.game.UpdateLobbyPlayerEvent;
+import forge.net.IRemote;
+import forge.net.client.ClientGameLobby;
+import forge.net.client.FGameClient;
+import forge.net.event.IdentifiableNetEvent;
+import forge.net.event.MessageEvent;
+import forge.net.event.NetEvent;
+import forge.net.event.UpdateLobbyPlayerEvent;
+import forge.net.server.FServerManager;
+import forge.net.server.ServerGameLobby;
import forge.properties.ForgePreferences.FPref;
import forge.screens.home.VLobby;
import forge.screens.home.sanctioned.ConstructedGameMenu;
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/VOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/VOnlineLobby.java
index 08338b5b5ef..a9c53d27721 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/online/VOnlineLobby.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/VOnlineLobby.java
@@ -14,8 +14,8 @@ import forge.gui.framework.FScreen;
import forge.gui.framework.IVDoc;
import forge.gui.framework.IVTopLevelUI;
import forge.match.GameLobby;
-import forge.net.FGameClient;
-import forge.net.FServerManager;
+import forge.net.client.FGameClient;
+import forge.net.server.FServerManager;
import forge.screens.home.VLobby;
import forge.toolbox.FPanel;
import forge.util.gui.SOptionPane;
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java
index 0d8255eaefd..2fa6399bd43 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java
@@ -12,7 +12,7 @@ import forge.gui.framework.EDocID;
import forge.interfaces.IPlayerChangeListener;
import forge.match.GameLobby;
import forge.match.LocalLobby;
-import forge.net.game.UpdateLobbyPlayerEvent;
+import forge.net.event.UpdateLobbyPlayerEvent;
import forge.screens.home.EMenuGroup;
import forge.screens.home.IVSubmenu;
import forge.screens.home.VHomeUI;
diff --git a/forge-gui-ios/.classpath b/forge-gui-ios/.classpath
index 0424fe8e344..ed9f6578cf4 100644
--- a/forge-gui-ios/.classpath
+++ b/forge-gui-ios/.classpath
@@ -10,7 +10,6 @@
-
@@ -24,7 +23,9 @@
+
-
+
+
diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml
index b5d0f0ca7de..114619ac944 100644
--- a/forge-gui-ios/pom.xml
+++ b/forge-gui-ios/pom.xml
@@ -56,11 +56,6 @@
forge-ai
${project.version}
-
- forge
- forge-net
- ${project.version}
-
forge
forge-gui
diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml
index a6d4d533ab1..4f50834d96d 100644
--- a/forge-gui-mobile/pom.xml
+++ b/forge-gui-mobile/pom.xml
@@ -35,11 +35,6 @@
forge-ai
${project.version}
-
- forge
- forge-net
- ${project.version}
-
forge
forge-gui
diff --git a/forge-gui/CHANGES.txt b/forge-gui/CHANGES.txt
index 3a387647e2e..15e3215768c 100644
--- a/forge-gui/CHANGES.txt
+++ b/forge-gui/CHANGES.txt
@@ -8,7 +8,7 @@ Forge Beta: #-#-2015 ver 1.5.39
Release Notes
-------------
-Interface Update
+- Interface Update -
The interface has received several small changes.
- The "Players" panel has been removed. This information can now be viewed by
hovering the cursor over a player's avatar.
@@ -17,6 +17,14 @@ The interface has received several small changes.
- The poison counters button has been replaced with a Command Zone button.
The command zone panels have been removed.
+- Network play (BETA) -
+This version of Forge includes a preliminary version of peer-to-peer (P2P)
+network support. If one player hosts, other players can connect to that
+player's machine by filling out the corresponding IP address and port number
+(default 36743), provided the lobby contains one or more open player slots.
+Do not expect network support to work reliably yet, any bug reports or other
+comments are welcome!
+
- Smarter Deck Color Determination -
When determining the color of decks, colors of hybrid and phyrexian cards are no
longer considered unless they can be produced by a land in the deck
diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml
index e2af288c748..0bbc37acf6e 100644
--- a/forge-gui/pom.xml
+++ b/forge-gui/pom.xml
@@ -35,11 +35,6 @@
forge
forge-ai
${project.version}
-
-
- forge
- forge-net
- ${project.version}
com.google.guava
diff --git a/forge-gui/src/main/java/forge/interfaces/ILobby.java b/forge-gui/src/main/java/forge/interfaces/ILobby.java
index 054dd0f3f37..65dddf747f8 100644
--- a/forge-gui/src/main/java/forge/interfaces/ILobby.java
+++ b/forge-gui/src/main/java/forge/interfaces/ILobby.java
@@ -1,7 +1,7 @@
package forge.interfaces;
import forge.match.GameLobby;
-import forge.net.game.server.RemoteClient;
+import forge.net.server.RemoteClient;
public interface ILobby {
GameLobby getState();
diff --git a/forge-gui/src/main/java/forge/interfaces/IPlayerChangeListener.java b/forge-gui/src/main/java/forge/interfaces/IPlayerChangeListener.java
index 373f50e03e4..61146fe105e 100644
--- a/forge-gui/src/main/java/forge/interfaces/IPlayerChangeListener.java
+++ b/forge-gui/src/main/java/forge/interfaces/IPlayerChangeListener.java
@@ -1,6 +1,6 @@
package forge.interfaces;
-import forge.net.game.UpdateLobbyPlayerEvent;
+import forge.net.event.UpdateLobbyPlayerEvent;
public interface IPlayerChangeListener {
void update(int index, UpdateLobbyPlayerEvent event);
diff --git a/forge-gui/src/main/java/forge/match/GameLobby.java b/forge-gui/src/main/java/forge/match/GameLobby.java
index b559b0e8d87..816fbab934f 100644
--- a/forge-gui/src/main/java/forge/match/GameLobby.java
+++ b/forge-gui/src/main/java/forge/match/GameLobby.java
@@ -30,8 +30,7 @@ import forge.interfaces.IGuiGame;
import forge.interfaces.IUpdateable;
import forge.item.PaperCard;
import forge.model.FModel;
-import forge.net.game.LobbySlotType;
-import forge.net.game.UpdateLobbyPlayerEvent;
+import forge.net.event.UpdateLobbyPlayerEvent;
import forge.player.GamePlayerUtil;
import forge.properties.ForgePreferences.FPref;
import forge.util.NameGenerator;
diff --git a/forge-gui/src/main/java/forge/match/LobbySlot.java b/forge-gui/src/main/java/forge/match/LobbySlot.java
index 055095fce95..9bdff9edc15 100644
--- a/forge-gui/src/main/java/forge/match/LobbySlot.java
+++ b/forge-gui/src/main/java/forge/match/LobbySlot.java
@@ -7,8 +7,7 @@ import com.google.common.collect.ImmutableSet;
import forge.AIOption;
import forge.deck.Deck;
-import forge.net.game.LobbySlotType;
-import forge.net.game.UpdateLobbyPlayerEvent;
+import forge.net.event.UpdateLobbyPlayerEvent;
public final class LobbySlot implements Serializable {
private static final long serialVersionUID = 6918205436608794289L;
diff --git a/forge-gui/src/main/java/forge/match/LobbySlotType.java b/forge-gui/src/main/java/forge/match/LobbySlotType.java
new file mode 100644
index 00000000000..8e764b232b4
--- /dev/null
+++ b/forge-gui/src/main/java/forge/match/LobbySlotType.java
@@ -0,0 +1,8 @@
+package forge.match;
+
+public enum LobbySlotType {
+ LOCAL,
+ AI,
+ OPEN,
+ REMOTE;
+}
\ No newline at end of file
diff --git a/forge-gui/src/main/java/forge/match/LocalLobby.java b/forge-gui/src/main/java/forge/match/LocalLobby.java
index 63e9857b65d..3fc2e23182e 100644
--- a/forge-gui/src/main/java/forge/match/LocalLobby.java
+++ b/forge-gui/src/main/java/forge/match/LocalLobby.java
@@ -5,7 +5,6 @@ import java.util.Collections;
import forge.AIOption;
import forge.GuiBase;
import forge.interfaces.IGuiGame;
-import forge.net.game.LobbySlotType;
public final class LocalLobby extends GameLobby {
diff --git a/forge-gui/src/main/java/forge/net/FGameClient.java b/forge-gui/src/main/java/forge/net/FGameClient.java
deleted file mode 100644
index 1e0c6c09c8b..00000000000
--- a/forge-gui/src/main/java/forge/net/FGameClient.java
+++ /dev/null
@@ -1,398 +0,0 @@
-package forge.net;
-
-import io.netty.bootstrap.Bootstrap;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelPipeline;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioSocketChannel;
-import io.netty.handler.codec.serialization.ClassResolvers;
-import io.netty.handler.codec.serialization.ObjectDecoder;
-import io.netty.handler.codec.serialization.ObjectEncoder;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeoutException;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-
-import forge.FThreads;
-import forge.UiCommand;
-import forge.assets.FSkinProp;
-import forge.deck.CardPool;
-import forge.game.GameEntityView;
-import forge.game.GameView;
-import forge.game.card.CardView;
-import forge.game.phase.PhaseType;
-import forge.game.player.DelayedReveal;
-import forge.game.player.PlayerView;
-import forge.game.spellability.SpellAbilityView;
-import forge.game.zone.ZoneType;
-import forge.interfaces.IButton;
-import forge.interfaces.IGuiGame;
-import forge.interfaces.ILobbyListener;
-import forge.match.MatchButtonType;
-import forge.model.FModel;
-import forge.net.game.GuiGameEvent;
-import forge.net.game.IdentifiableNetEvent;
-import forge.net.game.LoginEvent;
-import forge.net.game.MessageEvent;
-import forge.net.game.NetEvent;
-import forge.net.game.ReplyEvent;
-import forge.net.game.client.IToServer;
-import forge.player.PlayerZoneUpdates;
-import forge.properties.ForgePreferences.FPref;
-import forge.trackable.TrackableCollection;
-import forge.util.ITriggerEvent;
-
-public class FGameClient implements IToServer {
- private final IGuiGame clientGui;
- public FGameClient(final String username, final String roomKey, final IGuiGame clientGui) {
- this.clientGui = clientGui;
- }
-
- private final List lobbyListeners = Lists.newArrayList();
- private final ReplyPool replies = new ReplyPool();
-
- static final int SIZE = Integer.parseInt(System.getProperty("size", "256"));
-
- private Channel channel;
- public void connect(final String host, final int port) {
- final EventLoopGroup group = new NioEventLoopGroup();
- try {
- final Bootstrap b = new Bootstrap()
- .group(group)
- .channel(NioSocketChannel.class)
- .handler(new ChannelInitializer() {
- @Override
- public void initChannel(final SocketChannel ch) throws Exception {
- final ChannelPipeline pipeline = ch.pipeline();
- pipeline.addLast(
- new ObjectEncoder(),
- new ObjectDecoder(ClassResolvers.cacheDisabled(null)),
- new MessageHandler(),
- new LobbyUpdateHandler(),
- new GameClientHandler());
- }
- });
-
- // Start the connection attempt.
- channel = b.connect(host, port).sync().channel();
- final ChannelFuture ch = channel.closeFuture();
- new Thread(new Runnable() {
- @Override public void run() {
- try {
- ch.sync();
- } catch (final InterruptedException e) {
- e.printStackTrace();
- } finally {
- group.shutdownGracefully();
- }
- }
- }).start();
- } catch (final InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- public void close() {
- channel.close();
- }
-
- @Override
- public void send(final NetEvent event) {
- System.out.println("Client sent " + event);
- channel.writeAndFlush(event);
- }
-
- @Override
- public Object sendAndWait(final IdentifiableNetEvent event) throws TimeoutException {
- replies.initialize(event.getId());
-
- send(event);
-
- // Wait for reply
- return replies.get(event.getId());
- }
-
- public void addLobbyListener(final ILobbyListener listener) {
- lobbyListeners.add(listener);
- }
-
- private void setGameControllers(final Iterable myPlayers) {
- for (final PlayerView p : myPlayers) {
- clientGui.setGameController(p, new NetGameController(this));
- }
- }
-
- private class GameClientHandler extends ChannelInboundHandlerAdapter {
- /**
- * Creates a client-side handler.
- */
- public GameClientHandler() {
- }
-
- @Override
- public void channelActive(final ChannelHandlerContext ctx) {
- // Don't use send() here, as this.channel is not yet set!
- ctx.channel().writeAndFlush(new LoginEvent(FModel.getPreferences().getPref(FPref.PLAYER_NAME), Integer.parseInt(FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",")[0])));
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public void channelRead(final ChannelHandlerContext ctx, final Object msg) {
- System.out.println("Client received: " + msg);
- if (msg instanceof ReplyEvent) {
- final ReplyEvent event = (ReplyEvent) msg;
- replies.complete(event.getIndex(), event.getReply());
- } else if (msg instanceof GuiGameEvent) {
- final GuiGameEvent event = (GuiGameEvent) msg;
- final String method = event.getMethod();
- final Object[] args = event.getObjects();
- Serializable reply = null;
- boolean doReply = false;
-
- final IButton btn;
- if (method.startsWith("btn_") && args.length >= 2 && args[0] instanceof PlayerView && args[1] instanceof MatchButtonType) {
- btn = args[1] == MatchButtonType.OK ? clientGui.getBtnOK((PlayerView) args[0]) : clientGui.getBtnCancel((PlayerView) args[0]);
- } else {
- btn = null;
- }
-
- switch (method) {
- case "setGameView":
- clientGui.setGameView((GameView) args[0]);
- break;
- case "openView":
- final TrackableCollection myPlayers = (TrackableCollection) args[0];
- setGameControllers(myPlayers);
- FThreads.invokeInEdtNowOrLater(new Runnable() {
- @Override public final void run() {
- //clientGui.setGameView(new NetGameView(FGameClient.this));
- clientGui.openView(myPlayers);
- }
- });
- break;
- case "afterGameEnd":
- clientGui.afterGameEnd();
- break;
- case "showCombat":
- clientGui.showCombat();
- break;
- case "showPromptMessage":
- clientGui.showPromptMessage((PlayerView) args[0], (String) args[1]);
- break;
- case "stopAtPhase":
- reply = clientGui.stopAtPhase((PlayerView) args[0], (PhaseType) args[1]);
- doReply = true;
- break;
- case "focusButton":
- clientGui.focusButton((MatchButtonType) args[0]);
- break;
- case "flashIncorrectAction":
- clientGui.flashIncorrectAction();
- break;
- case "updatePhase":
- clientGui.updatePhase();
- break;
- case "updateTurn":
- FThreads.invokeInEdtNowOrLater(new Runnable() {
- @Override public final void run() {
- clientGui.updateTurn((PlayerView) args[0]);
- }
- });
- break;
- case "udpdatePlayerControl":
- clientGui.updatePlayerControl();
- break;
- case "enableOverlay":
- clientGui.enableOverlay();
- break;
- case "disbleOverlay":
- clientGui.disableOverlay();
- break;
- case "finishGame":
- clientGui.finishGame();
- break;
- case "showManaPool":
- clientGui.showManaPool((PlayerView) args[0]);
- break;
- case "hideManaPool":
- clientGui.hideManaPool((PlayerView) args[0], args[1]);
- break;
- case "updateStack":
- clientGui.updateStack();
- break;
- case "updateZones":
- FThreads.invokeInEdtNowOrLater(new Runnable() {
- @Override public final void run() {
- clientGui.updateZones((PlayerZoneUpdates) args[0]);
- }
- });
- break;
- case "updateSingleCard":
- clientGui.updateSingleCard((CardView) args[0]);
- break;
- case "updateManaPool":
- clientGui.updateManaPool((Iterable) args[0]);
- break;
- case "updateLives":
- clientGui.updateLives((Iterable) args[0]);
- break;
- case "setPanelSelection":
- clientGui.setPanelSelection((CardView) args[0]);
- break;
- case "getAbilityToPlay":
- reply = clientGui.getAbilityToPlay((List) args[0], (ITriggerEvent) args[1]);
- doReply = true;
- break;
- case "assignDamage":
- reply = (Serializable) clientGui.assignDamage((CardView) args[0], (List) args[1], (int) args[2], (GameEntityView) args[3], (boolean) args[4]);
- doReply = true;
- break;
- case "message":
- clientGui.message((String) args[0], (String) args[1]);
- break;
- case "showErrorDialog":
- clientGui.showErrorDialog((String) args[0], (String) args[1]);
- break;
- case "showConfirmDialog":
- reply = clientGui.showConfirmDialog((String) args[0], (String) args[1], (String) args[2], (String) args[3], (boolean) args[4]);
- doReply = true;
- break;
- case "showOptionDialog":
- reply = clientGui.showOptionDialog((String) args[0], (String) args[1], (FSkinProp) args[2], (String[]) args[3], (int) args[4]);
- doReply = true;
- break;
- case "showCardOptionDialog":
- reply = clientGui.showCardOptionDialog((CardView) args[0], (String) args[1], (String) args[2], (FSkinProp) args[3], (String[]) args[4], (int) args[5]);
- doReply = true;
- break;
- case "showInputDialog":
- reply = clientGui.showInputDialog((String) args[0], (String) args[1], (FSkinProp) args[2], (String) args[3], (String[]) args[4]);
- doReply = true;
- break;
- case "confirm":
- reply = clientGui.confirm((CardView) args[0], (String) args[1], (boolean) args[2], (String[]) args[3]);
- doReply = true;
- break;
- case "getChoices":
- reply = (Serializable) clientGui.getChoices((String) args[0], (int) args[1], (int) args[2], (Collection