feat: use new ActiveEffect transferral system

Closes #68
This commit is contained in:
Johannes Loher 2023-06-25 23:55:08 +02:00
parent 032b006dd5
commit 62065a8d31
No known key found for this signature in database
GPG key ID: 7CB0A9FB553DA045
1793 changed files with 64779 additions and 67933 deletions

View file

@ -48,15 +48,15 @@ export class DS4ActorSheet extends ActorSheet {
}),
);
const enrichedEffectPromises = this.actor.effects.map(async (effect) => {
const enrichedEffects = [...this.actor.allApplicableEffects()].map((effect) => {
return {
...effect.toObject(),
sourceName: effect.sourceName,
sourceName: effect.parent instanceof Item ? effect.parent.name : effect.sourceName,
factor: effect.factor,
active: effect.active,
uuid: effect.uuid,
};
});
const enrichedEffects = await Promise.all(enrichedEffectPromises);
const context = {
...this.addTooltipsToData(await super.getData(options)),
@ -127,7 +127,7 @@ export class DS4ActorSheet extends ActorSheet {
disableOverriddenFields(
this.form,
item.overrides,
(key) => `[data-item-id="${item.id}"] .change-item[data-property="${key}"]`,
(key) => `[data-item-uuid="${item.uuid}"] .change-item[data-property="${key}"]`,
);
}
}
@ -161,7 +161,7 @@ export class DS4ActorSheet extends ActorSheet {
const { type } = foundry.utils.deepClone(event.currentTarget.dataset);
const name = getGame().i18n.localize(`DS4.New${type.capitalize()}Name`);
const itemData = { name, type };
Item.create(itemData, { parent: this.actor, pack: this.actor.pack ?? undefined });
Item.create(itemData, { parent: this.actor });
}
/**
@ -170,14 +170,15 @@ export class DS4ActorSheet extends ActorSheet {
* @param {JQuery.ClickEvent} event The originating click event
* @protected
*/
onEditItem(event) {
const id = $(event.currentTarget)
.parents(embeddedDocumentListEntryProperties.Item.selector)
.data(embeddedDocumentListEntryProperties.Item.idDataAttribute);
const item = this.actor.items.get(id);
enforce(item, getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
enforce(item.sheet);
item.sheet.render(true);
async onEditItem(event) {
const li = event.currentTarget.closest(embeddedDocumentListEntryProperties.Item.selector);
const uuid = li.dataset[embeddedDocumentListEntryProperties.Item.uuidDataAttribute];
const item = await fromUuid(uuid);
enforce(
item && item.parent === this.actor,
getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { uuid, actor: this.actor.name }),
);
item.sheet?.render(true);
}
/**
@ -186,10 +187,16 @@ export class DS4ActorSheet extends ActorSheet {
* @param {JQuery.ClickEvent} event The originating click event
* @protected
*/
onDeleteItem(event) {
const li = $(event.currentTarget).parents(embeddedDocumentListEntryProperties.Item.selector);
this.actor.deleteEmbeddedDocuments("Item", [li.data(embeddedDocumentListEntryProperties.Item.idDataAttribute)]);
li.slideUp(200, () => this.render(false));
async onDeleteItem(event) {
const li = event.currentTarget.closest(embeddedDocumentListEntryProperties.Item.selector);
const uuid = li.dataset[embeddedDocumentListEntryProperties.Item.uuidDataAttribute];
const item = await fromUuid(uuid);
enforce(
item && item.parent === this.actor,
getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { uuid, actor: this.actor.name }),
);
item.delete();
$(li).slideUp(200, () => this.render(false));
}
/**
@ -239,12 +246,14 @@ export class DS4ActorSheet extends ActorSheet {
* @param {JQuery.ClickEvent} event The originating click event
* @protected
*/
onEditEffect(event) {
const id = $(event.currentTarget)
.parents(embeddedDocumentListEntryProperties.ActiveEffect.selector)
.data(embeddedDocumentListEntryProperties.ActiveEffect.idDataAttribute);
const effect = this.actor.effects.get(id);
enforce(effect, getGame().i18n.format("DS4.ErrorActorDoesNotHaveEffect", { id, actor: this.actor.name }));
async onEditEffect(event) {
const li = event.currentTarget.closest(embeddedDocumentListEntryProperties.ActiveEffect.selector);
const uuid = li.dataset[embeddedDocumentListEntryProperties.ActiveEffect.uuidDataAttribute];
const effect = await fromUuid(uuid);
enforce(
effect && (effect.parent === this.actor || effect.parent.parent === this.actor),
getGame().i18n.format("DS4.ErrorActorDoesNotHaveEffect", { uuid, actor: this.actor.name }),
);
effect.sheet?.render(true);
}
@ -254,11 +263,16 @@ export class DS4ActorSheet extends ActorSheet {
* @param {JQuery.ClickEvent} event The originating click event
* @protected
*/
onDeleteEffect(event) {
const li = $(event.currentTarget).parents(embeddedDocumentListEntryProperties.ActiveEffect.selector);
const id = li.data(embeddedDocumentListEntryProperties.ActiveEffect.idDataAttribute);
this.actor.deleteEmbeddedDocuments("ActiveEffect", [id]);
li.slideUp(200, () => this.render(false));
async onDeleteEffect(event) {
const li = event.currentTarget.closest(embeddedDocumentListEntryProperties.ActiveEffect.selector);
const uuid = li.dataset[embeddedDocumentListEntryProperties.ActiveEffect.uuidDataAttribute];
const effect = await fromUuid(uuid);
enforce(
effect && (effect.parent === this.actor || effect.parent.parent === this.actor),
getGame().i18n.format("DS4.ErrorActorDoesNotHaveEffect", { uuid, actor: this.actor.name }),
);
effect.delete();
$(li).slideUp(200, () => this.render(false));
}
/**
@ -280,20 +294,32 @@ export class DS4ActorSheet extends ActorSheet {
* @param {"Item" | "ActiveEffect"} documentName The name of the embedded document to be changed.
* @protected
*/
onChangeEmbeddedDocument(event, documentName) {
async onChangeEmbeddedDocument(event, documentName) {
event.preventDefault();
const element = $(event.currentTarget).get(0);
enforce(element instanceof HTMLInputElement);
if (element.disabled) return;
const documentElement = element.closest(embeddedDocumentListEntryProperties[documentName].selector);
enforce(documentElement instanceof HTMLElement);
const id = documentElement.dataset[embeddedDocumentListEntryProperties[documentName].idDataAttribute];
const uuid = documentElement.dataset[embeddedDocumentListEntryProperties[documentName].uuidDataAttribute];
const property = element.dataset["property"];
enforce(property !== undefined, TypeError("HTML element does not provide 'data-property' attribute"));
const newValue = this.parseValue(element);
this.actor.updateEmbeddedDocuments(documentName, [{ _id: id, [property]: newValue }]);
const document = await fromUuid(uuid);
if (documentName === "Item") {
enforce(
document && document.parent === this.actor,
getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { uuid, actor: this.actor.name }),
);
} else {
enforce(
document && (document.parent === this.actor || document.parent.parent === this.actor),
getGame().i18n.format("DS4.ErrorActorDoesNotHaveEffect", { uuid, actor: this.actor.name }),
);
}
document.update({ [property]: newValue });
}
/**
@ -335,13 +361,15 @@ export class DS4ActorSheet extends ActorSheet {
* @param {JQuery.ClickEvent} event The originating click event
* @protected
*/
onRollItem(event) {
async onRollItem(event) {
event.preventDefault();
const id = $(event.currentTarget)
.parents(embeddedDocumentListEntryProperties.Item.selector)
.data(embeddedDocumentListEntryProperties.Item.idDataAttribute);
const item = this.actor.items.get(id);
enforce(item, getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
const li = event.currentTarget.closest(embeddedDocumentListEntryProperties.Item.selector);
const uuid = li.dataset[embeddedDocumentListEntryProperties.Item.uuidDataAttribute];
const item = await fromUuid(uuid);
enforce(
item && item.parent === this.actor,
getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { uuid, actor: this.actor.name }),
);
item.roll().catch((e) => notifications.error(e, { log: true }));
}
@ -464,11 +492,11 @@ export class DS4ActorSheet extends ActorSheet {
const embeddedDocumentListEntryProperties = Object.freeze({
ActiveEffect: {
selector: ".effect",
idDataAttribute: "effectId",
uuidDataAttribute: "effectUuid",
},
Item: {
selector: ".item",
idDataAttribute: "itemId",
uuidDataAttribute: "itemUuid",
},
});

View file

@ -6,7 +6,6 @@
import { DS4 } from "../config";
import { DS4ActiveEffect } from "../documents/active-effect";
import { notifications } from "../ui/notifications";
import { enforce, getGame } from "../utils/utils";
import { disableOverriddenFields } from "./sheet-helpers";
@ -92,9 +91,6 @@ export class DS4ItemSheet extends ItemSheet {
*/
onControlEffect(event) {
event.preventDefault();
if (this.item.isOwned) {
return notifications.warn(getGame().i18n.localize("DS4.WarningManageActiveEffectOnOwnedItem"));
}
const a = event.currentTarget;
switch (a.dataset["action"]) {
case "create":