62 lines
2.1 KiB
JavaScript
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;
|
|
}
|
|
}
|