37 lines
1.4 KiB
JavaScript
37 lines
1.4 KiB
JavaScript
export async function executeUseInventoryItemAction(action, context) {
|
|
const token = resolveUserToken(action, context);
|
|
const actor = token?.actor;
|
|
if (!actor) return { success: false, consumed: false, reason: "NO_USER" };
|
|
|
|
const item = await resolveItem(actor, action.itemSelection);
|
|
if (!item) return { success: false, consumed: false, reason: "NO_ITEM" };
|
|
|
|
if (action.activationMode === "openSheet" || !item.use) {
|
|
item.sheet?.render(true);
|
|
return { success: true, consumed: true };
|
|
}
|
|
|
|
if (action.activationMode === "autoUse" && typeof item.use === "function") {
|
|
await item.use();
|
|
return { success: true, consumed: true };
|
|
}
|
|
|
|
item.sheet?.render(true);
|
|
return { success: true, consumed: true };
|
|
}
|
|
|
|
function resolveUserToken(action, context) {
|
|
switch (action.userMode ?? "affectedToken") {
|
|
case "sourceToken": return context.sourceToken ?? null;
|
|
case "assignedToken": return context.assignedToken ?? context.targetToken ?? null;
|
|
case "affectedToken":
|
|
default: return context.targetToken ?? context.tokenDocument?.object ?? null;
|
|
}
|
|
}
|
|
|
|
async function resolveItem(actor, selection = {}) {
|
|
if (selection.mode === "itemUuid" && selection.itemUuid) return fromUuid(selection.itemUuid);
|
|
if (selection.mode === "itemName" && selection.itemName) return actor.items.find(item => item.name === selection.itemName);
|
|
return null;
|
|
}
|