diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 35b9e32f..68602db5 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -9,6 +9,46 @@ export default class DHItem extends foundry.documents.Item { for (const action of this.system.actions ?? []) action.prepareData(); } + /** + * @inheritdoc + */ + async _preUpdate(changed, options, user) { + const result = await super._preUpdate(changed, options, user); + + // Store the previous equipped status for attachment handling + if (changed.system?.equipped !== undefined) { + options.previousEquipped = this.system.equipped; + } + + return result; + } + + /** + * @inheritdoc + */ + async _onUpdate(changed, options, user) { + await super._onUpdate(changed, options, user); + + // Handle attachment effects when equipped status changes + if (changed.system?.equipped !== undefined && options.previousEquipped !== changed.system.equipped) { + const newEquippedStatus = changed.system.equipped; + const parentType = this.type === 'armor' ? 'armor' : this.type === 'weapon' ? 'weapon' : null; + + if (parentType) { + try { + const { handleAttachmentEffectsOnEquipChange } = await import('../helpers/attachmentHelper.mjs'); + await handleAttachmentEffectsOnEquipChange({ + parentItem: this, + newEquippedStatus, + parentType + }); + } catch (error) { + console.error('DH | Error in handleAttachmentEffectsOnEquipChange:', error); + } + } + } + } + /** * @inheritdoc * @param {object} options - Options which modify the getRollData method. diff --git a/module/helpers/attachmentHelper.mjs b/module/helpers/attachmentHelper.mjs index 0e209881..c456d2e4 100644 --- a/module/helpers/attachmentHelper.mjs +++ b/module/helpers/attachmentHelper.mjs @@ -105,22 +105,24 @@ export async function removeAttachmentFromItem({ parentItem, attachedUuid, paren * @returns {Promise} */ export async function handleAttachmentEffectsOnEquipChange({ parentItem, newEquippedStatus, parentType }) { - const actor = parentItem.parent?.parent; - if (!actor || !parentItem.system.attached?.length) return; + // Try to get the actor - it might be parentItem.parent instead of parentItem.parent.parent + const actor = parentItem.parent?.type === 'character' ? parentItem.parent : parentItem.parent?.parent; + + if (!actor || !parentItem.system.attached?.length) { + return; + } if (newEquippedStatus) { // Item is being equipped - add attachment effects - const effectsToCreate = []; for (const attachedUuid of parentItem.system.attached) { const attachedItem = await fromUuid(attachedUuid); if (attachedItem && attachedItem.effects.size > 0) { - const newEffects = await copyAttachmentEffectsToActor({ + await copyAttachmentEffectsToActor({ parentItem, attachedItem, attachedUuid, parentType }); - effectsToCreate.push(...newEffects); } } } else {