From 672a7dd9990f809d039a53c62d7f8a8579dc1c33 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Sat, 23 Aug 2025 18:14:50 +0200 Subject: [PATCH] Added migration for existing actor features --- module/data/actor/character.mjs | 3 ++- module/data/item/class.mjs | 9 ++++++++ module/systemRegistration/migrations.mjs | 26 ++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 7ddd878c..ddcc5bf5 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -444,7 +444,8 @@ export default class DhCharacter extends BaseDataActor { } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.subclass.id) { if (this.class.subclass) { const prop = item.system.multiclassOrigin ? 'multiclass' : 'class'; - const subclassState = this[prop].subclass.system.featureState; + const subclassState = this[prop].subclass?.system?.featureState; + if (!subclassState) continue; if ( item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.foundation || diff --git a/module/data/item/class.mjs b/module/data/item/class.mjs index 157f70c5..5e92d2fc 100644 --- a/module/data/item/class.mjs +++ b/module/data/item/class.mjs @@ -102,6 +102,15 @@ export default class DHClass extends BaseDataItem { if (allowed === false) return; } + _onDelete(options, userId) { + super._onDelete(options, userId); + + if (options.parent?.type === 'character') { + const path = `system.${this.isMulticlass ? 'multiclass' : 'class'}`; + foundry.utils.getProperty(options.parent, `${path}.subclass`)?.delete(); + } + } + async _preUpdate(changed, options, userId) { const allowed = await super._preUpdate(changed, options, userId); if (allowed === false) return false; diff --git a/module/systemRegistration/migrations.mjs b/module/systemRegistration/migrations.mjs index 9953e99c..da0dcb5d 100644 --- a/module/systemRegistration/migrations.mjs +++ b/module/systemRegistration/migrations.mjs @@ -37,14 +37,36 @@ export async function runMigrations() { if (foundry.utils.isNewerVersion('1.1.1', lastMigrationVersion)) { const compendiumClasses = []; + const compendiumActors = []; for (let pack of game.packs) { const documents = await pack.getDocuments(); compendiumClasses.push(...documents.filter(x => x.type === 'class')); + compendiumActors.push(...documents.filter(x => x.type === 'character')); } - for (let classVal of [...compendiumClasses, ...game.items]) { - if (classVal.type !== 'class') continue; + [...compendiumActors, ...game.actors.filter(x => x.type === 'character')].forEach(char => { + const multiclass = char.items.find(x => x.type === 'class' && x.system.isMulticlass); + const multiclassSubclass = multiclass.system.subclasses.length > 0 ? multiclass.system.subclasses[0] : null; + char.items.forEach(item => { + if (item.type === 'feature' && item.system.identifier === 'multiclass') { + const base = item.system.originItemType === 'class' ? multiclass : multiclassSubclass; + if (base) { + const baseFeature = base.system.features.find(x => x.item.name === item.name); + if (baseFeature) { + item.update({ + system: { + multiclassOrigin: true, + identifier: baseFeature.type + } + }); + } + } + } + }); + }); + const worldClasses = game.items.filter(x => x.type === 'class'); + for (let classVal of [...compendiumClasses, ...worldClasses]) { for (let subclass of classVal.system.subclasses) { await subclass.update({ 'system.linkedClass': classVal.uuid }); }