From 5af8a3939a57d7c010e40331d75ae6567cdebe76 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 13 Aug 2022 08:41:51 +0800 Subject: [PATCH] prevent NPE when overriding CardView for HumanCostDecision --- .../java/forge/player/HumanCostDecision.java | 21 ++++++++++++------- .../forge/player/PlayerControllerHuman.java | 11 +++++++--- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 71fd421e317..b18470d7029 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -1170,14 +1170,19 @@ public class HumanCostDecision extends CostDecisionMakerBase { private boolean confirmAction(CostPart costPart, String message) { CardView cardView = ability.getCardView(); if (GuiBase.getInterface().isLibgdxPort()) { - //for cards like Sword-Point Diplomacy and others that uses imprinted as container for their ability - if (cardView != null && cardView.getImprintedCards() != null && cardView.getImprintedCards().size() == 1) - cardView = CardView.getCardForUi(ImageUtil.getPaperCardFromImageKey(cardView.getImprintedCards().get(0).getCurrentState().getImageKey())); - else if (ability.getTargets() != null && ability.getTargets().isTargetingAnyCard() && ability.getTargets().size() == 1) - cardView = CardView.get(ability.getTargetCard()); - else if (cardView.getZone() == null || cardView.getZone().isHidden()) { - if (!cardView.hasAlternateState()) //don't override if it has alternatestate since it maybe showing alternate view - cardView = CardView.getCardForUi(ImageUtil.getPaperCardFromImageKey(cardView.getCurrentState().getImageKey())); + try { + //for cards like Sword-Point Diplomacy and others that uses imprinted as container for their ability + if (cardView != null && cardView.getImprintedCards() != null && cardView.getImprintedCards().size() == 1) + cardView = CardView.getCardForUi(ImageUtil.getPaperCardFromImageKey(cardView.getImprintedCards().get(0).getCurrentState().getImageKey())); + else if (ability.getTargets() != null && ability.getTargets().isTargetingAnyCard() && ability.getTargets().size() == 1) + cardView = CardView.get(ability.getTargetCard()); + else if (cardView.getZone() == null || cardView.getZone().isHidden()) { + if (!cardView.hasAlternateState()) //don't override if it has alternatestate since it maybe showing alternate view + cardView = CardView.getCardForUi(ImageUtil.getPaperCardFromImageKey(cardView.getCurrentState().getImageKey())); + } + } catch (Exception e) { + //prevent NPE when overriding the cardView, the getPaperCardFromImageKey can return null making the GUI freeze, reset the view if error happens + cardView = ability.getCardView(); } return controller.getGui().confirm(cardView, message.replaceAll("\n", " ")); } else { diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index da4335e2db0..9eac358672a 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1786,9 +1786,14 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public boolean confirmPayment(final CostPart costPart, final String question, SpellAbility sa) { if (GuiBase.getInterface().isLibgdxPort()) { CardView cardView = sa.getView().getHostCard(); - if (cardView.getZone() == null || cardView.getZone().isHidden()) - cardView = CardView.getCardForUi(ImageUtil.getPaperCardFromImageKey(cardView.getCurrentState().getImageKey())); - return this.getGui().confirm(sa.getView().getHostCard(), question.replaceAll("\n", " ")); + try { + if (cardView.getZone() == null || cardView.getZone().isHidden()) + cardView = CardView.getCardForUi(ImageUtil.getPaperCardFromImageKey(cardView.getCurrentState().getImageKey())); + } catch (Exception e) { + //prevent NPE + cardView = sa.getView().getHostCard(); + } + return this.getGui().confirm(cardView, question.replaceAll("\n", " ")); } else { final InputConfirm inp = new InputConfirm(this, question, sa); inp.showAndWait();