From 56c0d9ed838e2ea36a0084c3c8b7d2c7dd5a10a9 Mon Sep 17 00:00:00 2001 From: Merudo Date: Mon, 29 Jul 2019 18:07:08 -0500 Subject: [PATCH] Fixes #513 Null Pointer Exception on apply change to token macro Fixed issue caused by two functions related to macro edit window that were looking for token only on current map. However, token macro edit window remains open even if the token is no longer on the current map. This fix make the two functions look for the token across all maps. --- .../maptool/model/MacroButtonProperties.java | 13 +++++++++++- .../java/net/rptools/maptool/model/Token.java | 20 +++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/rptools/maptool/model/MacroButtonProperties.java b/src/main/java/net/rptools/maptool/model/MacroButtonProperties.java index a3af956f93..1a9f84a32a 100644 --- a/src/main/java/net/rptools/maptool/model/MacroButtonProperties.java +++ b/src/main/java/net/rptools/maptool/model/MacroButtonProperties.java @@ -462,7 +462,18 @@ private String[] parseMultiLineCommand(String multiLineCommand) { } public Token getToken() { - return MapTool.getFrame().getCurrentZoneRenderer().getZone().getToken(this.tokenId); + Token token = MapTool.getFrame().getCurrentZoneRenderer().getZone().getToken(this.tokenId); + + // If token not in current map, look for token in other maps. + if (token == null) { + List zrenderers = MapTool.getFrame().getZoneRenderers(); + for (ZoneRenderer zr : zrenderers) { + if (token == null) { + token = zr.getZone().getToken(this.tokenId); + } + } + } + return token; } public void setTokenId(Token token) { diff --git a/src/main/java/net/rptools/maptool/model/Token.java b/src/main/java/net/rptools/maptool/model/Token.java index f3e241f001..496b1c5297 100644 --- a/src/main/java/net/rptools/maptool/model/Token.java +++ b/src/main/java/net/rptools/maptool/model/Token.java @@ -47,6 +47,7 @@ import net.rptools.maptool.client.MapTool; import net.rptools.maptool.client.MapToolVariableResolver; import net.rptools.maptool.client.functions.JSONMacroFunctions; +import net.rptools.maptool.client.ui.zone.ZoneRenderer; import net.rptools.maptool.client.ui.zone.ZoneRenderer.SelectionSet; import net.rptools.maptool.language.I18N; import net.rptools.maptool.util.ImageManager; @@ -961,6 +962,22 @@ public GUID getId() { return id; } + public ZoneRenderer getZoneRenderer() { // Returns the ZoneRenderer the token is on + ZoneRenderer zoneRenderer = MapTool.getFrame().getCurrentZoneRenderer(); + Token token = zoneRenderer.getZone().getToken(getId()); + + if (token == null) { + List zrenderers = MapTool.getFrame().getZoneRenderers(); + for (ZoneRenderer zr : zrenderers) { + token = zr.getZone().getToken(getId()); + if (token != null) { + zoneRenderer = zr; + } + } + } + return zoneRenderer; + } + public void setId(GUID id) { this.id = id; } @@ -1531,8 +1548,7 @@ public boolean hasMacros(boolean secure) { public void saveMacroButtonProperty(MacroButtonProperties prop) { getMacroPropertiesMap(false).put(prop.getIndex(), prop); MapTool.getFrame().resetTokenPanels(); - MapTool.serverCommand() - .putToken(MapTool.getFrame().getCurrentZoneRenderer().getZone().getId(), this); + MapTool.serverCommand().putToken(getZoneRenderer().getZone().getId(), this); // Lets the token macro panels update only if a macro changes fireModelChangeEvent(new ModelChangeEvent(this, ChangeEvent.MACRO_CHANGED, id));