D&D Beyond Integration

Hey there :wave:

We’ve found the root of that issue and it will be fixed soon in an upcoming update.
To fix the model validation issues, please run this macro / script in your world.

for (const id of game.actors.invalidDocumentIds) {
    const actor = game.actors.getInvalid(id);

    ui.notifications.info(`Fixing ${actor.name} (${actor.uuid})`);

    await actor.update(actor.toObject(), { diff: false })
}

for (const scene of game.scenes) {
    for (const token of scene.tokens) {
        if (!token.id) {
            continue;
        }

        const actorId = token.actorId;
        const baseActor = game.actors.get(actorId)
            ?? (game.actors.invalidDocumentIds.has(actorId)
                ? game.actors.getInvalid(actorId) : null);

        if (!baseActor) {
            continue;
        }

        const overrides = getDocumentClass("Actor").schema.clean(token.actorData, { partial: true });
        const actorData = foundry.utils.mergeObject(baseActor.toObject(), overrides);
        const actor = getDocumentClass("Actor").fromSource(foundry.utils.deepClone(actorData), { parent: token });
        const fixedActorData = foundry.utils.filterObject(actor.toObject(), token.actorData);
        const diffActorData = foundry.utils.diffObject(token.actorData, fixedActorData);

        if (foundry.utils.isEmpty(diffActorData)) {
            continue;
        }

        ui.notifications.info(`Fixing ${token.name} (${token.uuid})`);

        if (token.actorLink) {
            await token.update({ actorData: diffActorData }, { diff: false });
        } else {
            await token.update({ actorLink: true }, { diff: false });
            await token.update({ actorLink: false, actorData: diffActorData }, { diff: false });
        }
    }
}

foundry.utils.debouncedReload();

(Thanks to the folks over on the Foundry Discord for the script!)