Skip to content

Commit

Permalink
fix(macro): adjust the getMacroTarget to catch `allAplicableEffects…
Browse files Browse the repository at this point in the history
…` instead of `actor.effects`
  • Loading branch information
SouOWendel committed Mar 28, 2024
1 parent 6ecd988 commit 5f2fe88
Showing 1 changed file with 47 additions and 45 deletions.
92 changes: 47 additions & 45 deletions module/documents/macro.mjs
@@ -1,41 +1,43 @@
/* eslint-disable indent */
/**
* Attempt to create a macro from the dropped data. Will use an existing macro if one exists.
* @param {object} dropData The dropped data
* @param {number} slot The hotbar slot to use
*/
export async function createOPMacro(dropData, slot) {
const macroData = { type: 'script', scope: 'actor' };
switch ( dropData.type ) {
case 'Item': {
const itemData = await Item.implementation.fromDropData(dropData);
if ( !itemData ) return ui.notifications.warn(game.i18n.localize('MACRO.opUnownedWarn'));
foundry.utils.mergeObject(macroData, {
name: itemData.name,
img: itemData.img,
command: `ordemparanormal.documents.macro.rollItem('${itemData.name}')`,
flags: {'dnd5e.itemMacro': true}
});
break;
switch (dropData.type) {
case 'Item': {
const itemData = await Item.implementation.fromDropData(dropData);
if (!itemData) return ui.notifications.warn(game.i18n.localize('MACRO.opUnownedWarn'));
foundry.utils.mergeObject(macroData, {
name: itemData.name,
img: itemData.img,
command: `ordemparanormal.documents.macro.rollItem('${itemData.name}')`,
flags: { 'ordemparanormal.itemMacro': true },
});
break;
}
case 'ActiveEffect': {
const effectData = await ActiveEffect.implementation.fromDropData(dropData);
if (!effectData) return ui.notifications.warn(game.i18n.localize('MACRO.opUnownedWarn'));
foundry.utils.mergeObject(macroData, {
name: effectData.name,
img: effectData.icon,
command: `ordemparanormal.documents.macro.toggleEffect('${effectData.name}')`,
flags: { 'ordemparanormal.effectMacro': true },
});
break;
}
default:
return;
}
case 'ActiveEffect': {
const effectData = await ActiveEffect.implementation.fromDropData(dropData);
if ( !effectData ) return ui.notifications.warn(game.i18n.localize('MACRO.opUnownedWarn'));
foundry.utils.mergeObject(macroData, {
name: effectData.label,
img: effectData.icon,
command: `ordemparanormal.documents.macro.toggleEffect('${effectData.label}')`,
flags: {'dnd5e.effectMacro': true}
});
break;
}
default:
return;
}


// Assign the macro to the hotbar
const macro = game.macros.find(m => {
return (m.name === macroData.name) && (m.command === macroData.command) && m.isAuthor;
}) || await Macro.create(macroData);
const macro =
game.macros.find((m) => {
return m.name === macroData.name && m.command === macroData.command && m.isAuthor;
}) || (await Macro.create(macroData));
game.user.assignHotbarMacro(macro, slot);
}

Expand All @@ -50,23 +52,23 @@ export async function createOPMacro(dropData, slot) {
function getMacroTarget(name, documentType) {
let actor;
const speaker = ChatMessage.getSpeaker();
if ( speaker.token ) actor = game.actors.tokens[speaker.token];
if (speaker.token) actor = game.actors.tokens[speaker.token];
actor ??= game.actors.get(speaker.actor);
if ( !actor ) return ui.notifications.warn(game.i18n.localize('MACRO.opNoActorSelected'));

const collection = (documentType === 'Item') ? actor.items : actor.effects;
const nameKeyPath = (documentType === 'Item') ? 'name' : 'label';

if (!actor) return ui.notifications.warn(game.i18n.localize('MACRO.opNoActorSelected'));

const collection = documentType === 'Item' ? actor.items : Array.from(actor.allApplicableEffects());

// Find item in collection
const documents = collection.filter(i => foundry.utils.getProperty(i, nameKeyPath) === name);
const documents = collection.filter((i) => i.name === name);
const type = game.i18n.localize(`DOCUMENT.${documentType}`);
if ( documents.length === 0 ) {
return ui.notifications.warn(game.i18n.format('MACRO.opMissingTargetWarn', { actor: actor.name, type, name }));
if (documents.length === 0) {
ui.notifications.warn(game.i18n.format('MACRO.opMissingTargetWarn', { actor: actor.name, type, name }));
return null;
}
if ( documents.length > 1 ) {
ui.notifications.warn(game.i18n.format('MACRO.opMultipleTargetsWarn', { actor: actor.name, type, name }));
if (documents.length > 1) {
ui.notifications.warn(game.i18n.format('MACRO.opMultipleTargetsWarn', { actor: actor.name, type, name }));
}

return documents[0];
}

Expand All @@ -80,15 +82,15 @@ function getMacroTarget(name, documentType) {
export function rollItem(itemName) {
return getMacroTarget(itemName, 'Item').use();
}

/* -------------------------------------------- */

/**
* Toggle an effect on and off when a macro is clicked.
* @param {string} effectName Name of the effect to be toggled.
* @returns {Promise<ActiveEffect>} The effect after it has been toggled.
*/
export function toggleEffect(effectName) {
const effect = getMacroTarget(effectName, 'ActiveEffect');
return effect?.update({disabled: !effect.disabled});
}
return effect?.update({ disabled: !effect.disabled });
}

0 comments on commit 5f2fe88

Please sign in to comment.