diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 5e72cd9fdf4..dcf79e209af 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -891,7 +891,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { // ensure that selection is within maximum allowed changeNum do { selectedCards = decider.getController().chooseCardsForZoneChange(destination, origin, sa, fetchList, delayedReveal, selectPrompt, decider); - } while (selectedCards.size() > changeNum); + } while (selectedCards != null && selectedCards.size() > changeNum); for (Card card : selectedCards) { chosenCards.add(card); }; 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 2a266eca88a..76ecd651a30 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 @@ -1,5 +1,6 @@ package forge.screens.home.online; +import java.net.BindException; import java.util.ArrayList; import java.util.List; @@ -7,6 +8,7 @@ import javax.swing.JMenu; import javax.swing.SwingUtilities; import forge.FThreads; +import forge.error.BugReporter; import forge.gui.FNetOverlay; import forge.gui.SOverlayUtils; import forge.gui.framework.EDocID; @@ -19,6 +21,7 @@ import forge.screens.home.CHomeUI; import forge.screens.home.CLobby; import forge.screens.home.VLobby; import forge.screens.home.sanctioned.ConstructedGameMenu; +import forge.util.gui.SOptionPane; public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { SINGLETON_INSTANCE; @@ -41,7 +44,18 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { join(url); } else { - host(); + try { + host(); + } catch (Exception ex) { + // IntelliJ swears that BindException isn't thrown in this try block, but it is! + if (ex.getClass() == BindException.class) { + SOptionPane.showErrorDialog("Unable to start server, port already in use!"); + SOverlayUtils.hideOverlay(); + } else { + BugReporter.reportException(ex); + } + ; + } } } }); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index c86b17dc87f..27641f27c17 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -18,6 +18,7 @@ import forge.control.FControlGamePlayback; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.error.BugReporter; import forge.events.UiEventNextGameDecision; import forge.game.*; import forge.game.ability.AbilityFactory; @@ -60,6 +61,7 @@ import forge.util.TextUtil; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; import forge.util.gui.SOptionPane; +import io.sentry.Sentry; import org.apache.commons.lang3.Range; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -458,6 +460,11 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public List chooseEntitiesForEffect(final FCollectionView optionList, final DelayedReveal delayedReveal, final SpellAbility sa, final String title, final Player targetedPlayer) { + + // useful details for debugging problems with the mass select logic + Sentry.getContext().addExtra("Card", sa.getCardView().toString()); + Sentry.getContext().addExtra("SpellAbility", sa.toString()); + // Human is supposed to read the message and understand from it what to // choose if (optionList.isEmpty()) { @@ -493,7 +500,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont input.setCancelAllowed(true); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); input.showAndWait(); - return (List) Iterables.getFirst(input.getSelected(), null); + return (List) input.getSelected(); } tempShow(optionList);