plugins_message_motion.js
import { EEvent, FHelp } from '../../utils/index.js';
import { FBasePlugin } from '../base.js';
/**
* @class
* @summary motion 消息
* @classdesc 模型触发 motion 时的消息提示插件
* @hideconstructor
* @extends {FBasePlugin}
* @memberof module:plugins
* @alias FMotionMessagePlugin
*/
export class FMotionMessagePlugin extends FBasePlugin {
/**
* @default 'motionMessage'
* @override
*/
_name = 'motionMessage';
/**
* @default 22
* @override
*/
_priority = 22;
/**
* @override
* @listens EEvent#motionStart 模型运动开始事件
*/
install(live2d) {
super.install(live2d);
if (!this._enable) {
return;
}
this._live2d.event.on(EEvent.motionStart, this.motion, this);
}
/**
* @override
*/
uninstall(live2d) {
if (!this._enable) {
return;
}
this._live2d.event.off(EEvent.motionStart, this.motion, this);
}
/**
* @override
*/
isEnable() {
return this._live2d.tips.data.motionMessage;
}
/**
* 当 motion 开始时显示对应的消息
* @summary 通知 motion 消息
* @param {string} group motion 分组名
* @param {number} index motion 分组中的索引
* @param {HTMLAudioElement | null} audio 音频元素
* @async
*/
async motion(group, index, audio) {
// 不包括 idle
if (/idle/.test(group)) return;
const { tips, model } = this._live2d;
/** @type {ModelJSON} */
const json = model.model.internalModel.settings.json;
const motions = json.motions || json.FileReferences.Motions;
const text = motions[group][index].text;
if (FHelp.isNotValid(text)) return;
// 设置持续时间
const old = tips.duration;
const pre = FHelp.isValid(audio) ? audio.duration * 1000 : old;
tips.data.duration = Math.max(pre, old);
await tips.notify(text).finally(() => tips.data.duration = old);
}
}