From 91d9987c1faa3ef1945b46bf7f5e53ef6027a1f9 Mon Sep 17 00:00:00 2001 From: elcnesh Date: Wed, 22 Apr 2015 17:55:58 +0000 Subject: [PATCH] - Delegate network game communication to a new GameProtocol class - Rename a method to make it compatible with the new protocol --- .gitattributes | 1 + .../java/forge/screens/match/CMatchUI.java | 45 +-- .../src/main/java/forge/toolbox/FButton.java | 2 +- .../src/main/java/forge/toolbox/FLabel.java | 2 +- .../src/forge/menu/FMenuItem.java | 2 +- .../forge/screens/match/MatchController.java | 6 +- .../src/forge/toolbox/FButton.java | 2 +- .../src/forge/toolbox/FLabel.java | 2 +- .../main/java/forge/interfaces/IButton.java | 2 +- .../java/forge/match/AbstractGuiGame.java | 7 +- .../src/main/java/forge/net/GameProtocol.java | 136 +++++++++ .../forge/net/client/GameClientHandler.java | 260 ++++-------------- .../java/forge/net/server/FServerManager.java | 2 +- .../java/forge/net/server/NetGuiGame.java | 6 +- .../src/main/java/forge/quest/QuestUtil.java | 4 +- 15 files changed, 237 insertions(+), 242 deletions(-) create mode 100644 forge-gui/src/main/java/forge/net/GameProtocol.java diff --git a/.gitattributes b/.gitattributes index d4c7a252cfa..d0edddee1af 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17706,6 +17706,7 @@ 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/GameProtocol.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 diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index f051de5c0fc..e16fcd5149e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -193,6 +193,9 @@ public final class CMatchUI FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public final void run() { for (final VField f : getFieldViews()) { + f.updateDetails(); + f.updateZones(); + f.updateManaPool(); f.getTabletop().update(); } for (final VHand h : getHandViews()) { @@ -457,29 +460,31 @@ public final class CMatchUI } @Override - public void updateSingleCard(final CardView c) { - final ZoneType zone = c.getZone(); - if (zone == null) { return; } + public void updateCards(final Iterable cards) { + for (final CardView c : cards) { + final ZoneType zone = c.getZone(); + if (zone == null) { return; } - switch (zone) { - case Battlefield: - final VField battlefield = getFieldViewFor(c.getController()); - if (battlefield != null) { - battlefield.getTabletop().updateCard(c, false); - } - break; - case Hand: - final VHand hand = getHandFor(c.getController()); - if (hand != null) { - CardPanel cp = hand.getHandArea().getCardPanel(c.getId()); - if (cp != null) { - cp.setCard(c); //ensure card view updated - cp.repaintOverlays(); + switch (zone) { + case Battlefield: + final VField battlefield = getFieldViewFor(c.getController()); + if (battlefield != null) { + battlefield.getTabletop().updateCard(c, false); } + break; + case Hand: + final VHand hand = getHandFor(c.getController()); + if (hand != null) { + final CardPanel cp = hand.getHandArea().getCardPanel(c.getId()); + if (cp != null) { + cp.setCard(c); //ensure card view updated + cp.repaintOverlays(); + } + } + break; + default: + break; } - break; - default: - break; } } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FButton.java b/forge-gui-desktop/src/main/java/forge/toolbox/FButton.java index 2389a05db53..3ca3c8e7bb0 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FButton.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FButton.java @@ -251,7 +251,7 @@ public class FButton extends SkinnedButton implements ILocalRepaint, IButton { } @Override - public void setTextColor(FSkinProp color) { + public void setImage(FSkinProp color) { setForeground(FSkin.getColor(Colors.fromSkinProp(color))); } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FLabel.java b/forge-gui-desktop/src/main/java/forge/toolbox/FLabel.java index 6a573a593f3..0fefbdf09a8 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FLabel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FLabel.java @@ -644,7 +644,7 @@ public class FLabel extends SkinnedLabel implements ILocalRepaint, IButton { } @Override - public void setTextColor(FSkinProp color) { + public void setImage(FSkinProp color) { setForeground(FSkin.getColor(Colors.fromSkinProp(color))); } diff --git a/forge-gui-mobile/src/forge/menu/FMenuItem.java b/forge-gui-mobile/src/forge/menu/FMenuItem.java index a921368b6b3..d994eb633e8 100644 --- a/forge-gui-mobile/src/forge/menu/FMenuItem.java +++ b/forge-gui-mobile/src/forge/menu/FMenuItem.java @@ -143,7 +143,7 @@ public class FMenuItem extends FDisplayObject implements IButton { public void setCommand(UiCommand command0) { } @Override - public void setTextColor(FSkinProp color) { + public void setImage(FSkinProp color) { } @Override public void setTextColor(int r, int g, int b) { diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index d2664ea2d5b..b7ad9be6e69 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -331,8 +331,10 @@ public class MatchController extends AbstractGuiGame { } @Override - public void updateSingleCard(CardView card) { - view.updateSingleCard(card); + public void updateCards(Iterable cards) { + for (final CardView card : cards) { + view.updateSingleCard(card); + } } @Override diff --git a/forge-gui-mobile/src/forge/toolbox/FButton.java b/forge-gui-mobile/src/forge/toolbox/FButton.java index d3d2e16c6d4..72a04426d03 100644 --- a/forge-gui-mobile/src/forge/toolbox/FButton.java +++ b/forge-gui-mobile/src/forge/toolbox/FButton.java @@ -280,7 +280,7 @@ public class FButton extends FDisplayObject implements IButton { } @Override - public void setTextColor(FSkinProp color) { + public void setImage(FSkinProp color) { foreColor = FSkinColor.get(Colors.fromSkinProp(color)); } diff --git a/forge-gui-mobile/src/forge/toolbox/FLabel.java b/forge-gui-mobile/src/forge/toolbox/FLabel.java index 3142ebc9569..5e7ea726548 100644 --- a/forge-gui-mobile/src/forge/toolbox/FLabel.java +++ b/forge-gui-mobile/src/forge/toolbox/FLabel.java @@ -398,7 +398,7 @@ public class FLabel extends FDisplayObject implements IButton { } @Override - public void setTextColor(FSkinProp color) { + public void setImage(FSkinProp color) { setTextColor(FSkinColor.get(Colors.fromSkinProp(color))); } diff --git a/forge-gui/src/main/java/forge/interfaces/IButton.java b/forge-gui/src/main/java/forge/interfaces/IButton.java index 0232ffd1b95..252f3ee500f 100644 --- a/forge-gui/src/main/java/forge/interfaces/IButton.java +++ b/forge-gui/src/main/java/forge/interfaces/IButton.java @@ -11,6 +11,6 @@ public interface IButton { void setSelected(boolean b0); boolean requestFocusInWindow(); void setCommand(UiCommand command0); - void setTextColor(FSkinProp color); + void setImage(FSkinProp color); void setTextColor(int r, int g, int b); } diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index ccd9f4046cd..8e8db25faed 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -3,6 +3,7 @@ package forge.match; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -85,10 +86,8 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { } @Override - public void updateCards(final Iterable cards) { - for (final CardView card : cards) { - updateSingleCard(card); - } + public final void updateSingleCard(final CardView card) { + updateCards(Collections.singleton(card)); } @Override diff --git a/forge-gui/src/main/java/forge/net/GameProtocol.java b/forge-gui/src/main/java/forge/net/GameProtocol.java new file mode 100644 index 00000000000..a9acca2c091 --- /dev/null +++ b/forge-gui/src/main/java/forge/net/GameProtocol.java @@ -0,0 +1,136 @@ +package forge.net; + +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import com.google.common.base.Function; + +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.interfaces.IButton; +import forge.interfaces.IGuiGame; +import forge.match.MatchButtonType; +import forge.trackable.TrackableCollection; +import forge.util.ITriggerEvent; + +public final class GameProtocol { + + /** + * Private constructor to prevent instantiation. + */ + private GameProtocol() { + } + + public static ProtocolMethod getProtocolMethod(final String name) { + return ProtocolMethod.valueOf(name); + } + + /** + * The methods that can be sent through this protocol. + */ + public enum ProtocolMethod { + setGameView(Void.TYPE, GameView.class), + openView(Void.TYPE, TrackableCollection.class), + afterGameEnd(), + showCombat(), + showPromptMessage(Void.TYPE, PlayerView.class, String.class), + stopAtPhase(Boolean.TYPE, PlayerView.class, PhaseType.class), + focusButton(Void.TYPE, MatchButtonType.class), + flashIncorrectAction(), + updatePhase(), + updateTurn(Void.TYPE, PlayerView.class), + updatePlayerControl(), + enableOverlay(), + disableOverlay(), + finishGame(), + showManaPool(Void.TYPE, PlayerView.class), + hideManaPool(Void.TYPE, PlayerView.class), + updateStack(), + updateZones(Void.TYPE, Iterable.class), + updateCards(Void.TYPE, Iterable.class), + updateManaPool(Void.TYPE, Iterable.class), + updateLives(Void.TYPE, Iterable.class), + setPanelSelection(Void.TYPE, CardView.class), + getAbilityToPlay(SpellAbilityView.class, List.class, ITriggerEvent.class), + assignDamage(Map.class, CardView.class, List.class, Integer.TYPE, GameEntityView.class, Boolean.TYPE), + message(Void.TYPE, String.class, String.class), + showErrorDialog(Void.TYPE, String.class, String.class), + showConfirmDialog(Boolean.TYPE, String.class, String.class, String.class, String.class, Boolean.TYPE), + showOptionDialog(Integer.TYPE, String.class, String.class, FSkinProp.class, Array.class, Integer.TYPE), + showCardOptionDialog(Integer.TYPE, CardView.class, String.class, String.class, FSkinProp.class, String.class, Array.class), + showInputDialog(String.class, String.class, String.class, FSkinProp.class, String.class, Array.class), + confirm(Boolean.TYPE, CardView.class, String.class, Boolean.TYPE, Array.class), + getChoices(List.class, String.class, Integer.TYPE, Integer.TYPE, Collection.class, Object.class, Function.class), + order(List.class, String.class, String.class, Integer.TYPE, Integer.TYPE, List.class, List.class, CardView.class, Boolean.TYPE), + sideboard(List.class, CardPool.class, CardPool.class), + chooseSingleEntityForEffect(GameEntityView.class, String.class, TrackableCollection.class, DelayedReveal.class, Boolean.TYPE), + setCard(Void.TYPE, CardView.class), + // TODO case "setPlayerAvatar": + openZones(Boolean.TYPE, Collection.class, Map.class), + restoreOldZones(Void.TYPE, Map.class), + isUiSetToSkipPhase(Boolean.TYPE, PlayerView.class, PhaseType.class), + // BUTTONS + btn_setEnabled(Void.TYPE, Boolean.TYPE), + btn_setVisible(Void.TYPE, Boolean.TYPE), + btn_setText(Void.TYPE, String.class), + btn_isSelected(Boolean.TYPE), + btn_setSelected(Void.TYPE, Boolean.TYPE), + btn_requestFocusInWindows(Boolean.TYPE), + btn_setCommand(Void.TYPE, UiCommand.class), + btn_setImage(Void.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE), + btn_setTextImage(Void.TYPE, FSkinProp.class); + + private final Class returnType; + private final Class[] args; + + private ProtocolMethod() { + this(Void.TYPE); + } + private ProtocolMethod(final Class returnType) { + this(returnType, (Class[]) null); + } + @SafeVarargs + private ProtocolMethod(final Class returnType, final Class ... args) { + this.returnType = returnType; + this.args = args == null ? new Class[] {} : args; + } + + public Method getMethod() { + try { + final String name; + final Class toCall; + if (name().startsWith("btn_")) { + name = name().substring("btn_".length()); + toCall = IButton.class; + } else { + name = name(); + toCall = IGuiGame.class; + } + + final Method candidate = toCall.getMethod(name, args); + if (!candidate.getReturnType().equals(returnType)) { + throw new NoSuchMethodException(String.format("Wrong return type for method %s", name())); + } + return candidate; + } catch (final NoSuchMethodException | SecurityException e) { + System.err.println(String.format("Warning: class contains no method named %s", name())); + return null; + } + } + + public boolean invokeOnButton() { + return name().startsWith("btn_"); + } + } +} diff --git a/forge-gui/src/main/java/forge/net/client/GameClientHandler.java b/forge-gui/src/main/java/forge/net/client/GameClientHandler.java index 72ca8126ac7..6e421976ac2 100644 --- a/forge-gui/src/main/java/forge/net/client/GameClientHandler.java +++ b/forge-gui/src/main/java/forge/net/client/GameClientHandler.java @@ -1,37 +1,24 @@ package forge.net.client; 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.match.MatchButtonType; import forge.model.FModel; +import forge.net.GameProtocol; +import forge.net.GameProtocol.ProtocolMethod; import forge.net.event.GuiGameEvent; import forge.net.event.LoginEvent; import forge.net.event.ReplyEvent; -import forge.player.PlayerZoneUpdates; import forge.properties.ForgePreferences.FPref; import forge.trackable.TrackableCollection; -import forge.util.ITriggerEvent; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import java.io.Serializable; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import com.google.common.base.Function; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; class GameClientHandler extends ChannelInboundHandlerAdapter { private final FGameClient client; @@ -60,201 +47,66 @@ class GameClientHandler extends ChannelInboundHandlerAdapter { client.getReplyPool().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 String methodName = event.getMethod(); - final IButton btn; - if (method.startsWith("btn_") && args.length >= 2 && args[0] instanceof PlayerView && args[1] instanceof MatchButtonType) { - btn = args[1] == MatchButtonType.OK ? gui.getBtnOK((PlayerView) args[0]) : gui.getBtnCancel((PlayerView) args[0]); - } else { - btn = null; + final Object[] originalArgs = event.getObjects(); + final ProtocolMethod protocolMethod = GameProtocol.getProtocolMethod(methodName); + if (protocolMethod == null) { + throw new IllegalStateException(String.format("Protocol method %s unknown", methodName)); + } + final Method method = protocolMethod.getMethod(); + if (method == null) { + throw new IllegalStateException(String.format("Method %s not found", protocolMethod.name())); } - switch (method) { - case "setGameView": - gui.setGameView((GameView) args[0]); - break; - case "openView": + final Object toInvoke; + final Object[] args; + if (protocolMethod.invokeOnButton()) { + toInvoke = originalArgs[1] == MatchButtonType.OK ? gui.getBtnOK((PlayerView) originalArgs[0]) : gui.getBtnCancel((PlayerView) originalArgs[0]); + // Remove the player and button type from the args passed to the method + args = Arrays.copyOfRange(originalArgs, 2, originalArgs.length); + } else { + toInvoke = gui; + args = originalArgs; + } + + // Pre-call actions + switch (protocolMethod) { + case openView: final TrackableCollection myPlayers = (TrackableCollection) args[0]; client.setGameControllers(myPlayers); - FThreads.invokeInEdtNowOrLater(new Runnable() { - @Override public final void run() { - gui.openView(myPlayers); - } - }); - break; - case "afterGameEnd": - gui.afterGameEnd(); - break; - case "showCombat": - gui.showCombat(); - break; - case "showPromptMessage": - gui.showPromptMessage((PlayerView) args[0], (String) args[1]); - break; - case "stopAtPhase": - reply = gui.stopAtPhase((PlayerView) args[0], (PhaseType) args[1]); - doReply = true; - break; - case "focusButton": - gui.focusButton((MatchButtonType) args[0]); - break; - case "flashIncorrectAction": - gui.flashIncorrectAction(); - break; - case "updatePhase": - gui.updatePhase(); - break; - case "updateTurn": - FThreads.invokeInEdtNowOrLater(new Runnable() { - @Override public final void run() { - gui.updateTurn((PlayerView) args[0]); - } - }); - break; - case "udpdatePlayerControl": - gui.updatePlayerControl(); - break; - case "enableOverlay": - gui.enableOverlay(); - break; - case "disbleOverlay": - gui.disableOverlay(); - break; - case "finishGame": - gui.finishGame(); - break; - case "showManaPool": - gui.showManaPool((PlayerView) args[0]); - break; - case "hideManaPool": - gui.hideManaPool((PlayerView) args[0], args[1]); - break; - case "updateStack": - gui.updateStack(); - break; - case "updateZones": - FThreads.invokeInEdtNowOrLater(new Runnable() { - @Override public final void run() { - gui.updateZones((PlayerZoneUpdates) args[0]); - } - }); - break; - case "updateSingleCard": - gui.updateSingleCard((CardView) args[0]); - break; - case "updateManaPool": - gui.updateManaPool((Iterable) args[0]); - break; - case "updateLives": - gui.updateLives((Iterable) args[0]); - break; - case "setPanelSelection": - gui.setPanelSelection((CardView) args[0]); - break; - case "getAbilityToPlay": - reply = gui.getAbilityToPlay((List) args[0], (ITriggerEvent) args[1]); - doReply = true; - break; - case "assignDamage": - reply = (Serializable) gui.assignDamage((CardView) args[0], (List) args[1], (int) args[2], (GameEntityView) args[3], (boolean) args[4]); - doReply = true; - break; - case "message": - gui.message((String) args[0], (String) args[1]); - break; - case "showErrorDialog": - gui.showErrorDialog((String) args[0], (String) args[1]); - break; - case "showConfirmDialog": - reply = gui.showConfirmDialog((String) args[0], (String) args[1], (String) args[2], (String) args[3], (boolean) args[4]); - doReply = true; - break; - case "showOptionDialog": - reply = gui.showOptionDialog((String) args[0], (String) args[1], (FSkinProp) args[2], (String[]) args[3], (int) args[4]); - doReply = true; - break; - case "showCardOptionDialog": - reply = gui.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 = gui.showInputDialog((String) args[0], (String) args[1], (FSkinProp) args[2], (String) args[3], (String[]) args[4]); - doReply = true; - break; - case "confirm": - reply = gui.confirm((CardView) args[0], (String) args[1], (boolean) args[2], (String[]) args[3]); - doReply = true; - break; - case "getChoices": - reply = (Serializable) gui.getChoices((String) args[0], (int) args[1], (int) args[2], (Collection) args[3], args[4], (Function) args[5]); - doReply = true; - break; - case "order": - reply = (Serializable) gui.order((String) args[0], (String) args[1], (int) args[2], (int) args[3], (List) args[4], (List) args[5], (CardView) args[6], (boolean) args[7]); - doReply = true; - break; - case "sideboard": - reply = (Serializable) gui.sideboard((CardPool) args[0], (CardPool) args[1]); - doReply = true; - break; - case "chooseSingleEntityForEffect": - reply = gui.chooseSingleEntityForEffect((String) args[0], (TrackableCollection) args[1], (DelayedReveal) args[2], (boolean) args[3]); - doReply = true; - break; - case "setCard": - gui.setCard((CardView) args[0]); - break; - // TODO case "setPlayerAvatar": - case "openZones": - reply = gui.openZones((Collection) args[0], (Map) args[1]); - doReply = true; - break; - case "restoreOldZones": - gui.restoreOldZones((Map) args[0]); - break; - case "isUiSetToSkipPhase": - reply = gui.isUiSetToSkipPhase((PlayerView) args[0], (PhaseType) args[1]); - doReply = true; - break; - // BUTTONS - case "btn_setEnabled": - btn.setEnabled((boolean) args[2]); - break; - case "btn_setVisible": - btn.setVisible((boolean) args[2]); - break; - case "btn_setText": - btn.setText((String) args[2]); - break; - case "btn_isSelected": - reply = btn.isSelected(); - doReply = true; - break; - case "btn_setSelected": - btn.setSelected((boolean) args[2]); - break; - case "btn_requestFocusInWindows": - reply = btn.requestFocusInWindow(); - doReply = true; - break; - case "btn_setCommand": - btn.setCommand((UiCommand) args[2]); - break; - case "btn_setTextColor": - if (args.length == 3) { - btn.setTextColor((FSkinProp) args[2]); - } else { - btn.setTextColor((int) args[2], (int) args[3], (int) args[4]); - } break; default: - System.err.println("Unsupported game event " + event.getMethod()); break; } - if (doReply) { + + final Class returnType = method.getReturnType(); + if (returnType.equals(Void.TYPE)) { + FThreads.invokeInEdtNowOrLater(new Runnable() { + @Override public final void run() { + try { + method.invoke(toInvoke, args); + } catch (final IllegalAccessException | IllegalArgumentException e) { + System.err.println(String.format("Unknown protocol method %s with %d args", methodName, args == null ? 0 : args.length)); + } catch (final InvocationTargetException e) { + throw new RuntimeException(e); + } + } + }); + } else { + Serializable reply = null; + try { + final Object theReply = method.invoke(toInvoke, args); + if (theReply instanceof Serializable) { + reply = (Serializable) method.invoke(toInvoke, args); + } else { + System.err.println(String.format("Non-serializable return type %s for method %s", returnType.getName(), methodName)); + } + } catch (final IllegalAccessException | IllegalArgumentException e) { + System.err.println(String.format("Unknown protocol method %s with %d args, replying with null", methodName, args == null ? 0 : args.length)); + } catch (final InvocationTargetException e) { + throw new RuntimeException(e); + } client.send(new ReplyEvent(event.getId(), reply)); } } diff --git a/forge-gui/src/main/java/forge/net/server/FServerManager.java b/forge-gui/src/main/java/forge/net/server/FServerManager.java index 4331977c4d7..e2c505e0805 100644 --- a/forge-gui/src/main/java/forge/net/server/FServerManager.java +++ b/forge-gui/src/main/java/forge/net/server/FServerManager.java @@ -126,7 +126,7 @@ public final class FServerManager { } }).start(); - mapNatPort(port); + //mapNatPort(port); Runtime.getRuntime().addShutdownHook(shutdownHook); isHosting = true; } catch (final InterruptedException e) { diff --git a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java index 101214cc927..44923d46f8a 100644 --- a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java +++ b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java @@ -188,9 +188,9 @@ public class NetGuiGame extends AbstractGuiGame { } @Override - public void updateSingleCard(final CardView card) { + public void updateCards(final Iterable cards) { updateGameView(); - send(methodName(), card); + send(methodName(), cards); } @Override @@ -366,7 +366,7 @@ public class NetGuiGame extends AbstractGuiGame { } @Override - public void setTextColor(final FSkinProp color) { + public void setImage(final FSkinProp color) { send("btn_" + methodName(), playerView, type, color); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index 7c7428d81ec..841ab17af86 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -339,7 +339,7 @@ public class QuestUtil { } else { view.getLblZep().setEnabled(true); - view.getLblZep().setTextColor(FSkinProp.CLR_TEXT); + view.getLblZep().setImage(FSkinProp.CLR_TEXT); } } else { @@ -413,7 +413,7 @@ public class QuestUtil { lblCurrentDeck.setText("Build, then select a deck in the \"Quest Decks\" submenu."); } else { - lblCurrentDeck.setTextColor(FSkinProp.CLR_TEXT); + lblCurrentDeck.setImage(FSkinProp.CLR_TEXT); lblCurrentDeck.setText("Your current deck is \"" + getCurrentDeck().getName() + "\"."); }