Files
Foundry-VTT-Docker/resources/app/client/data/documents/item.js
2025-01-04 00:34:03 +01:00

133 lines
4.2 KiB
JavaScript

/**
* The client-side Item document which extends the common BaseItem model.
* @extends foundry.documents.BaseItem
* @mixes ClientDocumentMixin
*
* @see {@link Items} The world-level collection of Item documents
* @see {@link ItemSheet} The Item configuration application
*/
class Item extends ClientDocumentMixin(foundry.documents.BaseItem) {
/**
* A convenience alias of Item#parent which is more semantically intuitive
* @type {Actor|null}
*/
get actor() {
return this.parent instanceof Actor ? this.parent : null;
}
/* -------------------------------------------- */
/**
* Provide a thumbnail image path used to represent this document.
* @type {string}
*/
get thumbnail() {
return this.img;
}
/* -------------------------------------------- */
/**
* A legacy alias of Item#isEmbedded
* @type {boolean}
*/
get isOwned() {
return this.isEmbedded;
}
/* -------------------------------------------- */
/**
* Return an array of the Active Effect instances which originated from this Item.
* The returned instances are the ActiveEffect instances which exist on the Item itself.
* @type {ActiveEffect[]}
*/
get transferredEffects() {
return this.effects.filter(e => e.transfer === true);
}
/* -------------------------------------------- */
/* Methods */
/* -------------------------------------------- */
/**
* Return a data object which defines the data schema against which dice rolls can be evaluated.
* By default, this is directly the Item's system data, but systems may extend this to include additional properties.
* If overriding or extending this method to add additional properties, care must be taken not to mutate the original
* object.
* @returns {object}
*/
getRollData() {
return this.system;
}
/* -------------------------------------------- */
/* Event Handlers */
/* -------------------------------------------- */
/** @inheritdoc */
async _preCreate(data, options, user) {
if ( (this.parent instanceof Actor) && !CONFIG.ActiveEffect.legacyTransferral ) {
for ( const effect of this.effects ) {
if ( effect.transfer ) effect.updateSource(ActiveEffect.implementation.getInitialDuration());
}
}
return super._preCreate(data, options, user);
}
/* -------------------------------------------- */
/** @override */
static async _onCreateOperation(documents, operation, user) {
if ( !(operation.parent instanceof Actor) || !CONFIG.ActiveEffect.legacyTransferral || !user.isSelf ) return;
const cls = getDocumentClass("ActiveEffect");
// Create effect data
const toCreate = [];
for ( let item of documents ) {
for ( let e of item.effects ) {
if ( !e.transfer ) continue;
const effectData = e.toJSON();
effectData.origin = item.uuid;
toCreate.push(effectData);
}
}
// Asynchronously create transferred Active Effects
operation = {...operation};
delete operation.data;
operation.renderSheet = false;
// noinspection ES6MissingAwait
cls.createDocuments(toCreate, operation);
}
/* -------------------------------------------- */
/** @inheritdoc */
static async _onDeleteOperation(documents, operation, user) {
const actor = operation.parent;
const cls = getDocumentClass("ActiveEffect");
if ( !(actor instanceof Actor) || !CONFIG.ActiveEffect.legacyTransferral || !user.isSelf ) return;
// Identify effects that should be deleted
const deletedUUIDs = new Set(documents.map(i => {
if ( actor.isToken ) return i.uuid.split(".").slice(-2).join(".");
return i.uuid;
}));
const toDelete = [];
for ( const e of actor.effects ) {
let origin = e.origin || "";
if ( actor.isToken ) origin = origin.split(".").slice(-2).join(".");
if ( deletedUUIDs.has(origin) ) toDelete.push(e.id);
}
// Asynchronously delete transferred Active Effects
operation = {...operation};
delete operation.ids;
delete operation.deleteAll;
// noinspection ES6MissingAwait
cls.deleteDocuments(toDelete, operation);
}
}