Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for map IDs in macro functions #4127

Merged
merged 6 commits into from
Jun 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import net.rptools.lib.MD5Key;
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.MapToolUtil;
import net.rptools.maptool.client.ui.zone.ZoneRenderer;
import net.rptools.maptool.language.I18N;
import net.rptools.maptool.model.GUID;
import net.rptools.maptool.model.Zone;
Expand Down Expand Up @@ -210,24 +209,6 @@ protected Layer getLayer(String layer) {
return Layer.TOKEN;
}

/**
* Find the map/zone for a given map name
*
* @param functionName String Name of the calling function.
* @param mapName String Name of the searched for map.
* @return ZoneRenderer The map/zone.
* @throws ParserException if the map is not found
*/
protected ZoneRenderer getNamedMap(String functionName, String mapName) throws ParserException {
for (ZoneRenderer zr : MapTool.getFrame().getZoneRenderers()) {
if (mapName.equals(zr.getZone().getName())) {
return zr;
}
}
throw new ParserException(
I18N.getText("macro.function.moveTokenMap.unknownMap", functionName, mapName));
}

/**
* Looks for a drawing on a specific map that matches a specific id and returns its pen. Throws a
* <code>ParserException</code> if the drawing is not found.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public Object childEvaluate(
FunctionUtil.checkNumberParam(functionName, parameters, 2, 2);
String mapName = parameters.get(0).toString();
String id = parameters.get(1).toString();
Zone map = getNamedMap(functionName, mapName).getZone();
Zone map = FunctionUtil.getZoneRenderer(functionName, mapName).getZone();
GUID guid = getGUID(functionName, id);
if ("getDrawingLayer".equalsIgnoreCase(functionName)) {
return getDrawable(functionName, map, guid).getLayer().name();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public Object childEvaluate(
checkTrusted(functionName);
String mapName = parameters.get(0).toString();
String drawing = parameters.get(1).toString();
Zone map = getNamedMap(functionName, mapName).getZone();
Zone map = FunctionUtil.getZoneRenderer(functionName, mapName).getZone();
if ("movedOverDrawing".equalsIgnoreCase(functionName)) {
FunctionUtil.checkNumberParam(functionName, parameters, 3, 3);
String jsonPath = parameters.get(2).toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public Object childEvaluate(
FunctionUtil.checkNumberParam(functionName, parameters, 3, 3);
String mapName = parameters.get(0).toString();
String id = parameters.get(1).toString();
Zone map = getNamedMap(functionName, mapName).getZone();
Zone map = FunctionUtil.getZoneRenderer(functionName, mapName).getZone();
GUID guid = getGUID(functionName, id);
if ("setDrawingLayer".equalsIgnoreCase(functionName)) {
Layer layer = getLayer(parameters.get(2).toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -872,21 +872,35 @@ private String findTokenId(String identifier, String zoneName) {
* Finds the specified token.
*
* @param identifier the identifier of the token (name, GM name, or GUID).
* @param zoneName the name of the zone. If null, check current zone.
* @param zoneNameOrId the name or ID of the zone. If null, check current zone.
* @return the token, or null if none found.
*/
public static Token findToken(String identifier, String zoneName) {
public static Token findToken(String identifier, String zoneNameOrId) {
if (identifier == null) {
return null;
}
if (zoneName == null || zoneName.length() == 0) {
if (zoneNameOrId == null || zoneNameOrId.length() == 0) {
ZoneRenderer zr = MapTool.getFrame().getCurrentZoneRenderer();
return zr == null ? null : zr.getZone().resolveToken(identifier);
} else {
if (!GUID.isNotGUID(zoneNameOrId)) {
try {
final var zr = MapTool.getFrame().getZoneRenderer(GUID.valueOf(zoneNameOrId));
if (zr != null) {
Token token = zr.getZone().resolveToken(identifier);
if (token != null) {
return token;
}
}
} catch (InvalidGUIDException ignored) {
// Wasn't a GUID after all. Fall back to looking up by name.
}
}

List<ZoneRenderer> zrenderers = MapTool.getFrame().getZoneRenderers();
for (ZoneRenderer zr : zrenderers) {
Zone zone = zr.getZone();
if (zone.getName().equalsIgnoreCase(zoneName)) {
if (zone.getName().equalsIgnoreCase(zoneNameOrId)) {
Token token = zone.resolveToken(identifier);
if (token != null) {
return token;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import net.rptools.maptool.model.GUID;
import net.rptools.maptool.model.Token;
import net.rptools.maptool.model.Zone;
import net.rptools.maptool.util.FunctionUtil;
import net.rptools.parser.Parser;
import net.rptools.parser.ParserException;
import net.rptools.parser.VariableResolver;
Expand Down Expand Up @@ -75,17 +76,7 @@ public Object childEvaluate(
parameters.size()));
}

ZoneRenderer zoneRenderer;
if (parameters.size() >= 1) {
String mapName = parameters.get(0).toString();
zoneRenderer = MapTool.getFrame().getZoneRenderer(mapName);
if (zoneRenderer == null) {
throw new ParserException(
I18N.getText("macro.function.moveTokenMap.unknownMap", functionName, mapName));
}
} else {
zoneRenderer = MapTool.getFrame().getCurrentZoneRenderer();
}
final var zoneRenderer = FunctionUtil.getZoneRendererFromParam(functionName, parameters, 0);

/*
* String empty = exposePCOnlyArea(optional String mapName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.ui.zone.ZoneRenderer;
import net.rptools.maptool.language.I18N;
import net.rptools.maptool.model.GUID;
import net.rptools.maptool.model.InvalidGUIDException;
import net.rptools.maptool.model.Zone;
import net.rptools.maptool.util.FunctionUtil;
import net.rptools.parser.Parser;
Expand All @@ -34,10 +36,14 @@ private MapFunctions() {
super(
0,
2,
"getCurrentMapID",
"getAllMapIDs",
"getMapIDs",
"getAllMapNames",
"getAllMapDisplayNames",
"getCurrentMapName",
"getMapDisplayName",
"getVisibleMapIDs",
"getVisibleMapNames",
"getVisibleMapDisplayNames",
"setCurrentMap",
Expand All @@ -58,7 +64,25 @@ public static MapFunctions getInstance() {
public Object childEvaluate(
Parser parser, VariableResolver resolver, String functionName, List<Object> parameters)
throws ParserException {
if (functionName.equalsIgnoreCase("getCurrentMapName")) {
if (functionName.equalsIgnoreCase("getCurrentMapID")) {
FunctionUtil.checkNumberParam(functionName, parameters, 0, 0);
ZoneRenderer currentZR = MapTool.getFrame().getCurrentZoneRenderer();
if (currentZR == null) {
throw new ParserException(I18N.getText("macro.function.map.none", functionName));
}
return currentZR.getZone().getId().toString();
} else if (functionName.equalsIgnoreCase("getMapIDs")) {
FunctionUtil.checkNumberParam(functionName, parameters, 1, 2);
final var mapName = parameters.get(0).toString();
final var delim = parameters.size() < 2 ? "," : parameters.get(1).toString();
final var zoneIds =
MapTool.getCampaign().getZones().stream()
.filter(zone -> mapName.equals(zone.getName()))
.map(Zone::getId)
.map(GUID::toString)
.toList();
return FunctionUtil.delimitedResult(delim, zoneIds);
} else if (functionName.equalsIgnoreCase("getCurrentMapName")) {
FunctionUtil.checkNumberParam(functionName, parameters, 0, 0);
ZoneRenderer currentZR = MapTool.getFrame().getCurrentZoneRenderer();
if (currentZR == null) {
Expand All @@ -75,10 +99,10 @@ public Object childEvaluate(
} else if (functionName.equalsIgnoreCase("setCurrentMap")) {
FunctionUtil.blockUntrustedMacro(functionName);
FunctionUtil.checkNumberParam(functionName, parameters, 1, 1);
String mapName = parameters.get(0).toString();
final var zr = FunctionUtil.getZoneRenderer(functionName, mapName);
String mapNameOrId = parameters.get(0).toString();
final var zr = FunctionUtil.getZoneRenderer(functionName, mapNameOrId);
MapTool.getFrame().setCurrentZoneRenderer(zr);
return mapName;
return mapNameOrId;

} else if ("getMapVisible".equalsIgnoreCase(functionName)) {
FunctionUtil.checkNumberParam(functionName, parameters, 0, 1);
Expand All @@ -101,9 +125,9 @@ public Object childEvaluate(
} else if ("setMapName".equalsIgnoreCase(functionName)) {
FunctionUtil.blockUntrustedMacro(functionName);
FunctionUtil.checkNumberParam(functionName, parameters, 2, 2);
String oldMapName = parameters.get(0).toString();
String mapNameOrId = parameters.get(0).toString();
String newMapName = parameters.get(1).toString();
Zone zone = FunctionUtil.getZoneRenderer(functionName, oldMapName).getZone();
Zone zone = FunctionUtil.getZoneRenderer(functionName, mapNameOrId).getZone();
zone.setName(newMapName);
MapTool.serverCommand().renameZone(zone.getId(), newMapName);
if (zone == MapTool.getFrame().getCurrentZoneRenderer().getZone()) {
Expand All @@ -114,10 +138,10 @@ public Object childEvaluate(
} else if ("setMapDisplayName".equalsIgnoreCase(functionName)) {
FunctionUtil.blockUntrustedMacro(functionName);
FunctionUtil.checkNumberParam(functionName, parameters, 2, 2);
String mapName = parameters.get(0).toString();
String mapNameOrId = parameters.get(0).toString();
String newMapDisplayName = parameters.get(1).toString();

Zone zone = FunctionUtil.getZoneRenderer(functionName, mapName).getZone();
Zone zone = FunctionUtil.getZoneRenderer(functionName, mapNameOrId).getZone();
if (newMapDisplayName.equals(zone.getDisplayName())) {
// The name is the same, so nothing to do.
return newMapDisplayName;
Expand All @@ -134,15 +158,35 @@ public Object childEvaluate(
} else if ("copyMap".equalsIgnoreCase(functionName)) {
FunctionUtil.blockUntrustedMacro(functionName);
FunctionUtil.checkNumberParam(functionName, parameters, 2, 2);
String oldName = parameters.get(0).toString();
String oldMapNameOrId = parameters.get(0).toString();
String newName = parameters.get(1).toString();
Zone oldMap = FunctionUtil.getZoneRenderer(functionName, oldName).getZone();
Zone oldMap = FunctionUtil.getZoneRenderer(functionName, oldMapNameOrId).getZone();
Zone newMap = new Zone(oldMap);
newMap.setName(newName);
MapTool.addZone(newMap, false);
MapTool.serverCommand().putZone(newMap);
return newMap.getName();

} else if ("getVisibleMapIDs".equalsIgnoreCase(functionName)
|| "getAllMapIDs".equalsIgnoreCase(functionName)) {
FunctionUtil.checkNumberParam(functionName, parameters, 0, 1);
String delim = parameters.size() > 0 ? parameters.get(0).toString() : ",";

boolean allMaps = functionName.equalsIgnoreCase("getAllMapIDs");

if (allMaps) {
FunctionUtil.blockUntrustedMacro(functionName);
}

List<String> mapIds = new LinkedList<>();
for (ZoneRenderer zr : MapTool.getFrame().getZoneRenderers()) {
if (allMaps || zr.getZone().isVisible()) {
mapIds.add(zr.getZone().getId().toString());
}
}

return FunctionUtil.delimitedResult(delim, mapIds);

} else if ("getVisibleMapNames".equalsIgnoreCase(functionName)
|| "getAllMapNames".equalsIgnoreCase(functionName)) {
FunctionUtil.checkNumberParam(functionName, parameters, 0, 1);
Expand Down Expand Up @@ -182,15 +226,34 @@ public Object childEvaluate(
return FunctionUtil.delimitedResult(delim, mapNames);

} else if ("getMapName".equalsIgnoreCase(functionName)) {
FunctionUtil.checkNumberParam(functionName, parameters, 1, 1);
String displayName = parameters.get(0).toString();
FunctionUtil.blockUntrustedMacro(functionName);
FunctionUtil.checkNumberParam(functionName, parameters, 1, 1);

for (ZoneRenderer zr : MapTool.getFrame().getZoneRenderers()) {
if (displayName.equals(zr.getZone().getDisplayName())) {
return zr.getZone().getName();
final var map = parameters.get(0).toString();

// First try treat it as a map ID.
ZoneRenderer match = null;
if (!GUID.isNotGUID(map)) {
try {
match = MapTool.getFrame().getZoneRenderer(GUID.valueOf(map));
} catch (InvalidGUIDException ignored) {
// Wasn't a GUID after all.
}
}

if (match == null) {
// Fall back to look up by display name.
for (ZoneRenderer zr : MapTool.getFrame().getZoneRenderers()) {
if (map.equals(zr.getZone().getDisplayName())) {
match = zr;
break;
}
}
}
if (match != null) {
return match.getZone().getName();
}

throw new ParserException(I18N.getText("macro.function.map.notFound", functionName));

} else if ("setMapSelectButton".equalsIgnoreCase(functionName)) {
Expand Down
Loading