Files
Foundry-VTT-Docker/resources/app/client-esm/data/region-behaviors/execute-macro.mjs
2025-01-04 00:34:03 +01:00

62 lines
2.1 KiB
JavaScript

import RegionBehaviorType from "./base.mjs";
import * as fields from "../../../common/data/fields.mjs";
/**
* The data model for a behavior that executes a Macro.
*
* @property {string} uuid The Macro UUID.
*/
export default class ExecuteMacroRegionBehaviorType extends RegionBehaviorType {
/** @override */
static LOCALIZATION_PREFIXES = ["BEHAVIOR.TYPES.executeMacro", "BEHAVIOR.TYPES.base"];
/* ---------------------------------------- */
/** @override */
static defineSchema() {
return {
events: this._createEventsField(),
uuid: new fields.DocumentUUIDField({type: "Macro"}),
everyone: new fields.BooleanField()
};
}
/* ---------------------------------------- */
/** @override */
async _handleRegionEvent(event) {
if ( !this.uuid ) return;
const macro = await fromUuid(this.uuid);
if ( !(macro instanceof Macro) ) {
console.error(`${this.uuid} does not exist`);
return;
}
if ( !this.#shouldExecute(macro, event.user) ) return;
const {scene, region, behavior} = this;
const token = event.data.token;
const speaker = token
? {scene: token.parent?.id ?? null, actor: token.actor?.id ?? null, token: token.id, alias: token.name}
: {scene: scene.id, actor: null, token: null, alias: region.name};
await macro.execute({speaker, actor: token?.actor, token: token?.object, scene, region, behavior, event});
}
/* ---------------------------------------- */
/**
* Should the client execute the macro?
* @param {Macro} macro The macro.
* @param {User} user The user that triggered the event.
* @returns {boolean} Should the client execute the macro?
*/
#shouldExecute(macro, user) {
if ( this.everyone ) return true;
if ( macro.canUserExecute(user) ) return user.isSelf;
const eligibleUsers = game.users.filter(u => u.active && macro.canUserExecute(u));
if ( eligibleUsers.length === 0 ) return false;
eligibleUsers.sort((a, b) => (b.role - a.role) || a.id.compare(b.id));
const designatedUser = eligibleUsers[0];
return designatedUser.isSelf;
}
}