83 lines
2.5 KiB
JavaScript
83 lines
2.5 KiB
JavaScript
// SPDX-FileCopyrightText: 2021 Johannes Loher
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import { DS4Item } from "../documents/item/item";
|
|
import { notifications } from "../ui/notifications";
|
|
import { getGame } from "../utils/utils";
|
|
import { getActiveActorAndToken } from "./helpers";
|
|
|
|
/**
|
|
* Create a macro from an item drop.
|
|
* Get an existing roll item macro if one exists, otherwise create a new one.
|
|
* @param {object} data The item drop data
|
|
* @param {string} slot The hotbar slot to use
|
|
* @returns {Promise<void>} A promise that resolves once the macro has been created.
|
|
*/
|
|
export async function createRollItemMacro(data, slot) {
|
|
const item = await Item.implementation.fromDropData(data);
|
|
if (!item.parent) {
|
|
return notifications.warn(getGame().i18n.localize("DS4.WarningMacrosCanOnlyBeCreatedForOwnedItems"));
|
|
}
|
|
if (!DS4Item.rollableItemTypes.includes(item.type)) {
|
|
return notifications.warn(
|
|
getGame().i18n.format("DS4.WarningItemIsNotRollable", {
|
|
name: item.name,
|
|
id: item.id,
|
|
type: item.type,
|
|
}),
|
|
);
|
|
}
|
|
|
|
const macro = await getOrCreateRollItemMacro(item);
|
|
await getGame().user?.assignHotbarMacro(macro ?? null, slot);
|
|
}
|
|
|
|
/**
|
|
* @param {object} item The item
|
|
* @returns {Promise<Macro | undefined>} A promise that resolves to the created macro
|
|
*/
|
|
async function getOrCreateRollItemMacro(item) {
|
|
const command = `game.ds4.macros.rollItem("${item.id}");`;
|
|
|
|
const existingMacro = getGame().macros?.find((m) => m.name === item.name && m.command === command);
|
|
if (existingMacro) {
|
|
return existingMacro;
|
|
}
|
|
|
|
return Macro.create(
|
|
{
|
|
command,
|
|
name: item.name,
|
|
type: "script",
|
|
img: item.img,
|
|
flags: { "ds4.itemMacro": true },
|
|
},
|
|
{ renderSheet: false },
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Executes the roll item macro for the item associated to the given `itemId`.
|
|
* @param {string} itemId The id of the item to roll
|
|
* @returns {Promise<void>} A promise that resolves once the item has been rolled.
|
|
*/
|
|
export async function rollItem(itemId) {
|
|
const { actor, token } = getActiveActorAndToken();
|
|
if (!actor) {
|
|
return notifications.warn(getGame().i18n.localize("DS4.WarningMustControlActorToUseRollItemMacro"));
|
|
}
|
|
|
|
const item = actor.items.get(itemId);
|
|
if (!item) {
|
|
return notifications.warn(
|
|
getGame().i18n.format("DS4.WarningControlledActorDoesNotHaveItem", {
|
|
actorName: actor.name,
|
|
actorId: actor.id,
|
|
itemId,
|
|
}),
|
|
);
|
|
}
|
|
|
|
return item.roll({ speaker: { token } }).catch((e) => notifications.error(e, { log: true }));
|
|
}
|