diff --git a/langs/en-ca.json b/langs/en-ca.json index b0418db..3c23e4a 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -133,7 +133,8 @@ "error": { "missing-id": "An ID must be provided", "invalid-socket": "Invalid socket data received, this means a module or system bug is present.", - "unknown-socket-event": "An unknown socket event was received: {event}" + "unknown-socket-event": "An unknown socket event was received: {event}", + "duplicate-attribute-key": "Cannot create an Attribute with a key (\"{key}\") that already exists on the Actor" }, "warn": { "migration-in-progress": "Applying data migrations for version {version}. Please do NOT refresh the window while this warning is present." diff --git a/module/data/Actor/player.mjs b/module/data/Actor/player.mjs index 26ed8e1..81a197e 100644 --- a/module/data/Actor/player.mjs +++ b/module/data/Actor/player.mjs @@ -59,9 +59,9 @@ export class PlayerData extends foundry.abstract.TypeDataModel { }; // #endregion Lifecycle - // #region Getters + // #region Methods get hasAttributes() { return Object.keys(this.attr).length > 0; }; - // #endregion Getters + // #endregion Methods }; diff --git a/module/data/Item/attribute.mjs b/module/data/Item/attribute.mjs index afc8999..833c2c8 100644 --- a/module/data/Item/attribute.mjs +++ b/module/data/Item/attribute.mjs @@ -1,4 +1,5 @@ export class AttributeItemData extends foundry.abstract.TypeDataModel { + // #region Schema static defineSchema() { const fields = foundry.data.fields; return { @@ -32,8 +33,33 @@ export class AttributeItemData extends foundry.abstract.TypeDataModel { }), }; }; + // #endregion Schema + // #region Lifecycle + async _preCreate(data, options, user) { + + // Prevent duplicate Attribute keys from existing on a single Actor + if (this.parent.isEmbedded) { + const attr = this.parent.parent?.getAttribute(this.key); + if (attr) { + ui.notifications.error( + `taf.notifs.error.duplicate-attribute-key`, + { + localize: true, + format: { key: this.key }, + }, + ); + return false; + }; + }; + + return super._preCreate(data, options, user); + }; + // #endregion Lifecycle + + // #region Methods get isRange() { return this.max !== null; }; + // #endregion Methods };