/* -------------------------------------------- */ /* Hotbar Macros */ /* -------------------------------------------- */ /** * Create a Macro from an Item drop. * Get an existing item macro if one exists, otherwise create a new one. * @param {Object} data The dropped data * @param {number} slot The hotbar slot to use * @returns {Promise} */ export async function create5eMacro(data, slot) { if (data.type !== "Item") return; if (!("data" in data)) return ui.notifications.warn("You can only create macro buttons for owned Items"); const item = data.data; // Create the macro command const command = `game.sw5e.rollItemMacro("${item.name}");`; let macro = game.macros.entities.find((m) => m.name === item.name && m.command === command); if (!macro) { macro = await Macro.create({ name: item.name, type: "script", img: item.img, command: command, flags: {"sw5e.itemMacro": true} }); } game.user.assignHotbarMacro(macro, slot); return false; } /* -------------------------------------------- */ /** * Create a Macro from an Item drop. * Get an existing item macro if one exists, otherwise create a new one. * @param {string} itemName * @return {Promise} */ export function rollItemMacro(itemName) { const speaker = ChatMessage.getSpeaker(); let actor; if (speaker.token) actor = game.actors.tokens[speaker.token]; if (!actor) actor = game.actors.get(speaker.actor); // Get matching items const items = actor ? actor.items.filter((i) => i.name === itemName) : []; if (items.length > 1) { ui.notifications.warn( `Your controlled Actor ${actor.name} has more than one Item with name ${itemName}. The first matched item will be chosen.` ); } else if (items.length === 0) { return ui.notifications.warn(`Your controlled Actor does not have an item named ${itemName}`); } const item = items[0]; // Trigger the item roll return item.roll(); }