Das Kampagnenobjekt speichert die Liste der im Spiel verfügbaren Spielmarker (integrierte und benutzerdefinierte). Diese Informationen werden als _token_markers gespeichert. Es ist schreibgeschützt. So rufst du es aus einem Mod-Skript auf:
Campaign().get("_token_markers");
Der Rückgabewert ist ein als String dargestelltes JSON-Array, das für jeden derzeit im Spiel befindlichen Spielmarker ein Objekt enthält.
{
"id": 59, // die Datenbank-ID für den Spielmarker
"name": "Bane", // der Name (nicht eindeutig) des Spielmarkers
"tag": "Bane::59", // wie der Spielmarker tatsächlich referenziert wird
// dies enthält die ID für benutzerdefinierte Spielmarker, aber nicht
// für Standard-Spielmarker.
"url": "https://s3.amazonaws.com/files.d20.io/images/59/yFnKXmhLTtbMtaq-Did1Yg/icon.png?1575153187"
// ^die URL für das Bild des Spielmarkers
}
Wir haben ein Beispielskript geschrieben, um zu zeigen, wie du damit die in deiner Kampagne verfügbaren Spielmarker finden kannst.
Füge dieses Skript zu deinem Spiel hinzu, dann kannst du diese Befehle nutzen:
!markernames gibt alle Spielmarker im Chat aus – mit Bild, name und id
!markerids gibt alle Spielmarker im Chat aus, die dem angegebenen Namen entsprechen
!settokenmarker fügt die angegebene Zeichenfolge zur statusmarkers-Liste des aktuell ausgewählten Spielmarkers hinzu. Beachte, dass hier keine Validierung stattfindet, ob der Spielmarker existiert; der angegebene Wert wird einfach zur Statusmarker-Liste hinzugefügt.
!gettokenmarkers gibt das statusmarkers-Attribut des aktuell ausgewählten Spielmarkers im Chat aus
on("ready", () => {
const tokenMarkers = JSON.parse(Campaign().get("_token_markers"));
const getChatMessageFromTokenMarkers = markers => {
let chatMessage = '';
_.each(markers, marker => {
chatMessage += `<p><img src='${marker.url}'> ${marker.id}: ${marker.name}</p>`;
});
return chatMessage;
};
on("chat:message", msg => {
if (msg.content.split(" ")[0].toLowerCase() === '!markernames') {
let chatMessage = getChatMessageFromTokenMarkers(tokenMarkers);
sendChat("Token Markers", chatMessage);
} else if (msg.content.split(" ")[0].toLowerCase() === '!markerids') {
const markerName = msg.content.split(" ")[1].toLowerCase();
let results = [];
_.each(tokenMarkers, marker => {
if (marker.name.toLowerCase() === markerName) results.push(marker);
});
log(results);
let chatMessage = getChatMessageFromTokenMarkers(results);
chatMessage = chatMessage || 'Unable to find any matching token markers'
sendChat("Token Markers", chatMessage);
} else if (msg.content.split(" ")[0].toLowerCase() === '!settokenmarker') {
const markerName = msg.content.split(" ")[1].toLowerCase();
if (!msg.selected && msg.selected[0]._type == "graphic") return;
obj = getObj(msg.selected[0]._type, msg.selected[0]._id);
currentMarkers = obj.get("statusmarkers").split(',');
currentMarkers.push(markerName);
obj.set("statusmarkers", currentMarkers.join(','));
} else if (msg.content.split(" ")[0].toLowerCase() === '!gettokenmarkers') {
if (!msg.selected) return;
if (msg.selected[0]._type !== "graphic") return;
obj = getObj(msg.selected[0]._type, msg.selected[0]._id);
currentMarkers = obj.get("statusmarkers");
sendChat("Token Markers", currentMarkers);
}
});
});