Fix getters in item roll data

This commit is contained in:
Carlos Fernandez 2026-04-25 16:47:40 -04:00
parent c3b1ad271c
commit 79e54b4999
3 changed files with 37 additions and 9 deletions

View file

@ -7,7 +7,12 @@
* @property {boolean} isInventoryItem- Indicates whether items of this type is a Inventory Item * @property {boolean} isInventoryItem- Indicates whether items of this type is a Inventory Item
*/ */
import { addLinkedItemsDiff, getScrollTextData, updateLinkedItemApps } from '../../helpers/utils.mjs'; import {
addLinkedItemsDiff,
getScrollTextData,
shallowCopyWithGetters,
updateLinkedItemApps
} from '../../helpers/utils.mjs';
import { ActionsField } from '../fields/actionField.mjs'; import { ActionsField } from '../fields/actionField.mjs';
import FormulaField from '../fields/formulaField.mjs'; import FormulaField from '../fields/formulaField.mjs';
@ -159,9 +164,8 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
* @returns {object} * @returns {object}
*/ */
getRollData(options = {}) { getRollData(options = {}) {
const actorRollData = this.actor?.getRollData() ?? {}; const data = this.actor?.getRollData() ?? {};
const data = Object.assign(actorRollData, {}); data.item = this;
data.item = Object.assign(this, {});
return data; return data;
} }

View file

@ -1,7 +1,7 @@
import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs'; import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs';
import { LevelOptionType } from '../data/levelTier.mjs'; import { LevelOptionType } from '../data/levelTier.mjs';
import DHFeature from '../data/item/feature.mjs'; import DHFeature from '../data/item/feature.mjs';
import { createScrollText, damageKeyToNumber, getDamageKey } from '../helpers/utils.mjs'; import { createScrollText, damageKeyToNumber, getDamageKey, shallowCopyWithGetters } from '../helpers/utils.mjs';
import DhCompanionLevelUp from '../applications/levelup/companionLevelup.mjs'; import DhCompanionLevelUp from '../applications/levelup/companionLevelup.mjs';
import { ResourceUpdateMap } from '../data/action/baseAction.mjs'; import { ResourceUpdateMap } from '../data/action/baseAction.mjs';
import { abilities } from '../config/actorConfig.mjs'; import { abilities } from '../config/actorConfig.mjs';
@ -595,10 +595,7 @@ export default class DhpActor extends Actor {
/**@inheritdoc */ /**@inheritdoc */
getRollData() { getRollData() {
const rollData = foundry.utils.deepClone(super.getRollData()); const rollData = shallowCopyWithGetters(super.getRollData());
/* system gets repeated infinately which causes issues when trying to use the data for document creation */
delete rollData.system;
rollData.id = this.id; rollData.id = this.id;
rollData.name = this.name; rollData.name = this.name;
rollData.system = this.system.getRollData(); rollData.system = this.system.getRollData();

View file

@ -809,3 +809,30 @@ export function sortBy(arr, fn) {
}; };
return arr.sort(cmp); return arr.sort(cmp);
} }
/**
* Returns a shallow copy including getters of the given object.
* Generally used for expanding roll data without side effects
*/
export function shallowCopyWithGetters(obj) {
function getAllPropertyDescriptors(obj) {
if (!obj) {
return Object.create(null);
}
return {
...getAllPropertyDescriptors(Object.getPrototypeOf(obj)),
...Object.getOwnPropertyDescriptors(obj)
};
}
const props = getAllPropertyDescriptors(obj);
const result = {};
for (const key of Object.keys(props)) {
const value = obj[key];
if (key !== '__proto__' && typeof value !== 'function') {
result[key] = obj[key];
}
}
return result;
}