more-auto-shoutouts-docs/README.md

700 lines
31 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Monster Hunter World - More Auto Shouts: Q&A
针对部分用户使用 MHW 更多定型文mod时遇到的问题提供可能的处理方式若尚未解决问题可加群*259616154*咨询
编写时mod版本0.2.0
## mod更新日志
特性:
支持单个动作内的多个伤害数据统计
所有内部实现全部采用async/await异步
单个trigger的执行转为创建异步任务支持内部长时间阻塞
由于主动式伤害收集模式的实现现在可以检查伤害为0的情况
Break Changes:
原配置文件 trigger_on.damage 条件取消,由 check.damage 替代
具体参考新配置文件样例
## 目录
### [1.安装类问题](#1-安装类问题)
[Q1.1:mod安装位置错误导致游戏无法加载mod的解决方法](#q-11-为什么我用狩技盒子安装了mod游戏正常启动但是mod没有生效)
[Q1.2:游戏加载mod时发生崩溃的处理方法](#q-12-为什么我安装了mod但是游戏崩溃了)
[Q1.3:对那些白嫖怪的声明](#q-13-为什么我没办法使用mod盒子安装mod打开下载的东西怎么和下图一样一堆不认识的)
### [2.使用类问题](#2-使用类问题)
[Q2.1:旧前置文件需要手动删除的问题](#q21-我在启动游戏时弹窗内出现如下情况怎么办)
[Q2.2:前置不完整或者前置未更新的问题](#q22-我在启动游戏时弹窗内出现如下情况怎么办)
[Q2.3:部分文件找不到的问题](#q23-我在启动游戏时弹窗内出现如下情况怎么办)
[Q2.4:旧版本mod无法通过debug方式检测fsm的问题](#q24-尝试通过日志获取fsm信息出现下面情况怎么办)
[Q2.5:配置文件名字不正确导致系统找不到配置文件的解决方式](#q25-我在启动游戏时弹窗内出现如下情况怎么办)
[Q2.6:配置文件内触发器格式有误,日志给出具体行列报错的解决方式](#q26-我在启动游戏时弹窗内出现如下情况怎么办)
[Q2.7:自动文本发送过多导致被系统禁言的解决方式](#q27-为什么我在游戏内发言过多被系统禁言然后禁言消息会自动弹出干扰战斗)
[Q2.8:怎么让配置文件方便观察和编辑](#q28-怎么让配置文件方便观察和编辑)
[Q2.9:没打开显示文件扩展名导致按Q2.5的步骤修改文件名后,系统找不到指定文件的解决方式](#q29-为什么我的文件名是mas-configtoml而情况和q25一样)
[Q2.10:游戏内可用的快捷指令](#q210-现在这个mod有什么游戏内的快捷指令吗)
[Q2.11:错误日志中关于文本行列数的报错的原理和机制举例](#q211-错误日志中关于文本行列数的报错有什么原理和机制吗)
### [3.编辑类和文本类问题](#3-编辑类和文本类问题)
[Q3.1:toml文件的打开方式](#q31-怎么打开toml文件)
[Q3.2:基础自动文本的创建](#q32-怎么创建一个完整的自动文本)
[Q3.3:文本的编辑](#q33-怎么编辑文本)
[Q3.4:寻找动作id即Fsm](#q34-怎么去寻找武器的动作即fsm)
[Q3.5:in函数的应用](#q35-怎么让一个触发器检测多个动作)
[Q3.6:文本不能丢的“尾巴”](#q36-为什么我的文本修饰了还是默认的文本)
[Q3.7:文本过长导致其不能完全加载的原因以及解释](#q37-为什么我的文本只说了一部分)
[Q3.8:复合字号与颜色文本的写法](#q38-怎么设置复合的颜色和字号文本比如alt-text这样的)
[Q3.9:发送间隔(全局与单个触发器)的插入方法](#q39-怎么设置发送间隔以防止说话太多刷屏)
[Q3.10:new和old合用以实现前后两个动作的检测](#q310-怎么设置动作前后检测实现一定程度上在某些情况下的受击检测)
[Q3.11:应用new和old来防止开电锯动作在超解动作内存在延迟输入帧的实例](#q311-为什么我盾斧开电锯会说超解的文本)
[Q3.12:伤害检测功能的使用方法](#q312-怎么给动作添加伤害检测)
# 下面根据问题类别进行分类,共分为三个板块
## 1. 安装类问题
### Q 1.1 为什么我用狩技盒子安装了mod游戏正常启动但是mod没有生效
A: 请检查相关前置是否按正确路径安装,`Stracker's loader` 及其配套的 `!CRCBypass.dll` 是否为最新的。
mod本体文件安装路径 `steamapps\common\Monster Hunter World\nativePC\plugins`
确保上述文件夹内至少存在这两个文件
![alt text](img/image-2.png)
前置安装路径如下
`Strack's Loader` 前置的压缩包解压,我们能看到如下内容
![alt text](img/image-3.png)
将其放入 `steamapps\common\Monster Hunter World` 中即可
`!CRCBypass.dll` 装在 `steamapps\common\Monster Hunter World\nativePC\plugins`
大部分情况下按正确路径安装mod可以保证mod正常生效
### Q 1.2 为什么我安装了mod但是游戏崩溃了
A:如果你已经按照 [Q1.1](#q-11-为什么我用狩技盒子安装了mod游戏正常启动但是mod没有生效) 中的安装路径正确安装了对应的前置与mod请检查你的狩技盒子中的mod或者手动安装的mod与本mod是否存在冲突。
检查方法删除所有mod一并将下图中所有的非文件夹文件除了启动程序![alt text](img/image-5.png)外以及文件夹nativePC![alt text](img/image-6.png)删除,并验证游戏完整性
![alt text](img/image-1.png)
在这里验证游戏完整性
![alt text](img/image-7.png)
完整性检查完毕后,重新按 [Q1.1](#q-11-为什么我用狩技盒子安装了mod游戏正常启动但是mod没有生效) 中的步骤安装前置和mod。
### Q 1.3 为什么我没办法使用mod盒子安装mod打开下载的东西怎么和下图一样一堆不认识的
![alt text](img/image-35.png)
A:你下载的是这个mod的**源码**,需要经过**基于Rust环境的编译**才能转换为二进制文件dll
## 编译相关的问题请自己解决
如果你有信心去试图编译,笔者以及作者概不承担编译过程中的问题对游戏产生的任何影响。
如果你没有信心去编译,还是乖乖掏影响力去买吧
## **这是试图不劳而获之人必将面临的问题。**
你很聪明,知道踩蘑菇帖子贴的主仓库的链接里面可能有你想要的东西,你也成功的把里面的东西下载下来了。
然而这个仓库里面可没有你想要的dll文件有的只是更加宝贵的东西——**源码**
你的无知认为这只不过是一个比较特殊的mod只要和那些mod一样把压缩包扔盒子再看看教程就能开始下头了。
当你发现这个"mod"拖不进盒子打开它只发现一大堆奇奇怪怪的东西而跑来mod群询问的时候你才会明白**不劳而获**的代价是什么。
要么去自己学习怎么搞,要么去掏影响力买。
## 2. 使用类问题
### Q2.1 我在启动游戏时弹窗内出现如下情况,怎么办?
![alt text](img/image-9.png)
A: 经典的过期前置问题。在去年mhw最后一次为支持新语言更新后一个叫`hid.dll`的文件在mhw根目录中会导致游戏崩溃请将其删除并更新前置。
### Q2.2 我在启动游戏时弹窗内出现如下情况,怎么办?
![alt text](img/image-8.png)
A类似的情况例如显示dll无法加载等文件加载失败说明mod安装路径或者前置可能存在问题请检查mod安装路径或者更新前置并按照 [Q1.1](#q-11-为什么我用狩技盒子安装了mod游戏正常启动但是mod没有生效) 中的安装路径正确安装前置和mod。
### Q2.3 我在启动游戏时弹窗内出现如下情况,怎么办?
![alt text](img/image-11.png)
A: 126错误是文件找不到此外该情况还出现了 [Q2.2](#q22-我在启动游戏时弹窗内出现如下情况怎么办) 的情况,首先按 [Q2.2](#q22-我在启动游戏时弹窗内出现如下情况怎么办) 处理过期文件再将mod按 [Q1.1](#q-11-为什么我用狩技盒子安装了mod游戏正常启动但是mod没有生效) 的方式正确安装mod
### Q2.4 尝试通过日志获取fsm信息出现下面情况怎么办
![alt text](img/image-10.png)
A该情况是因为前版本0.1.0未更新debug功能请更新版本
### Q2.5 我在启动游戏时弹窗内出现如下情况,怎么办?
![alt text](img/image-12.png)
A: ![alt text](img/image-13.png)
作者在踩蘑菇原文已经说的非常清楚了,请自己将**文件**![alt text](img/image-14.png)的*名字*修改为mas-config.toml。*改个名都有人能改错吗?真的有!*
### Q2.6 我在启动游戏时弹窗内出现如下情况,怎么办?
![alt text](img/image-15.png)![alt text](img/image-16.png)
A: 这些错误都是文本型错误说明你的配置文件中存在不正确的文本或者触发器格式导致mod加载时出现错误。请打开mas-config.toml并按日志内![alt text](img/image-17.png)![alt text](img/image-18.png)所显示的行列数找到相关的错误原因并按照[Q3.2]( #q32-怎么创建一个完整的自动文本?)进行修复。
### Q2.7 为什么我在游戏内发言过多被系统禁言然后禁言消息会自动弹出,干扰战斗?
A:这就要怪你自己咯,设那么多又发那么多,被禁言后做出触发自动文本动作导致游戏中的你强行发言被弹窗警告。*少说点吧,话痨*
### Q2.8 怎么让配置文件方便观察和编辑?
A: 请使用vscode打开mas-config.toml并安装toml插件即可方便的编辑和浏览配置文件。![alt text](image.png)
### Q2.9 为什么我的文件名是mas-config.toml而情况和Q2.5一样?
A: 你可能在![alt text](img/image.png)这个地方没把*显示扩展名*![alt text](img/image-23.png)打开把它打开然后再改名或者直接将配置文件名字改成mas-config再启动游戏。
**注无论是否开启文件扩展名dll文件是始终显示其扩展名的另外附在有无打开文件扩展名下正确的文件名字**
打开显示扩展名时:
![alt text](img/image.png)
当前文件名应为(上面的example是作为文件扩展名打开后的对比)
![alt text](img/image-32.png)
未打开显示扩展名时:
![alt text](img/image-33.png)
当前文件名应为(上面的example是作为文件扩展名关闭后的对比)
![alt text](img/image-34.png)
## 根据群内的调研绝大部分人在mod使用方面第一个遇到的就是这个问题从试图改盒子内的配置文件到找不到配置文件在哪类似的问题比比皆是。这里笔者严肃指明配置文件*必须*以正确的名字放置在plugins文件夹内否则系统是*一定*找不到配置文件的。
### Q2.10 现在这个mod有什么游戏内的快捷指令吗
A: 当前版本已添加三个快捷指令,直接在游戏内聊天栏输入对应指令即可
`!mas reload`: 重新加载自动文本配置,用于自动文本的热修改,效果如图
![alt text](img/image-26.png)
`!mas disable`: 游戏内禁用自动文本,输入后游戏将不会再发送自动文本,效果如图
![alt text](img/image-27.png)
`!mas enable`: 游戏内启用自动文本,在自动文本被禁用后输入,游戏将再次发送自动文本,效果如图
![alt text](img/image-28.png)
***特别注意***:快捷指令是**基于检测玩家发送的消息而执行的**,所以如果你发出的游戏内快捷指令**能被其他玩家接收到的话**那么其他安装了此mod的玩家也会**执行**你发送出去的快捷指令。同理,
其他安装了此mod的玩家发送mod的快捷指令的时候你的mhw程序也会**执行**他们发送的指令。(*这就是所谓的ddos攻击吧*
### Q2.11 错误日志中关于文本行列数的报错有什么原理和机制吗
A: 读懂日志只需要四级能过甚至高考及格的英语水平,再不懂可以用词典查或者机翻...
这里举两个例子:
**例一:**
![alt text](img/image-36.png)!
如图,错误的地点已经在下方使用符号`^`标记出来了,精确到每一个字母。
在错误字段后面给出了英文解释,比如上述错误的原因就是:***需要精确到一个元素,包含多个元素***
意思是:这段代码出现了冗余元素,导致只需要一个元素的部分因为检测到多个元素产生了冲突,从而引发报错并将其反馈到日志中。
引发类似错误的 ***错误代码*** 案例如下:
```toml
# ========== 真蓄造成伤害--常见错误代码 ==========
[[trigger]]
action_mode = "sequential_all"
[trigger.trigger_on.damage]
value = { lt = 1000 }
[trigger.trigger_on.fsm]
new = { target = 3, id = {in = [135,136,137]} }
[[trigger.check]]
weapon_type.value = 0
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_LIGHTBLUE_DEFAULT><SIZE 30>强击真蓄!造成了<SIZE 40>{{damage}}<SIZE 30>伤害</SIZE></STYL>"
```
上面的代码中,
```toml
[trigger.trigger_on.damage]
value = { lt = 1000 }
[trigger.trigger_on.fsm]
new = { target = 3, id = {in = [135,136,137]} }
```
是引发错误的原因,即`[trigger.trigger_on.damage]`和`[trigger.trigger_on.fsm]`的存在导致只需要一个元素的`trigger.on`部分因为检测到多个元素产生了冲突,从而引发报错并将其反馈到日志中。
**例二:**
![alt text](img/image-37.png)
该例子中,错误字段的英文解释是 ***未知变量`damage`,除了......(后面的都是合法的变量名)***
意思是:这段代码的`trigger.on`后面的变量是未知的,导致报错。*具体原因是mod版本为0.1.4及以下,未添加伤害检测,此时强行插入伤害检测变量`damage`并不会使系统检测到,而是将其视作未知变量处理,导致报错。*
***错误代码***案例如下 ***(假设该代码被写入配置文件并加载时mod版本低于0.1.5)***
```toml
# ========== 真蓄造成伤害 ==========
[[trigger]]
action_mode = "sequential_all"
[trigger.trigger_on.damage]
value = { lt = 1000 }
[[trigger.check]]
fsm.value = { target = 3, id = {in = [135,136,137]} }
[[trigger.check]]
weapon_type.value = 0
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_LIGHTBLUE_DEFAULT><SIZE 30>强击真蓄!造成了<SIZE 40>{{damage}}<SIZE 30>伤害</SIZE></STYL>"
```
上面的代码中
```toml
[trigger.trigger_on.damage]
```
是引发错误的原因因为mod在0.1.5版本前并未添加伤害检测,强行插入伤害检测变量`damage`并不会使系统检测到,而是将其视作未知变量处理,导致报错。
**注:在编辑文本时遇到报错的问题时一定要去观察并理解日志报错的原因,看懂了日志就可以找出错误并自行纠正,能有效减少甚至避免同样的错误再次发生。**
## 3. 编辑类和文本类问题
### Q3.1 怎么打开toml文件
A: 正常情况下可使用记事本打开mas-config.toml文件但作者建议使用vscode打开并安装toml相关插件以方便编辑。
### Q3.2 怎么创建一个完整的自动文本?
A**配置文件** `mas-config.toml` 存在可供参考的示例,请参考示例进行创建。
配置文件由多个`触发器`构成。每个触发器包含`触发条件(Condition)`和`行为(Action)`两个部分组成。
`行为`目前只支持发送游戏内消息
发送类型目前有如下形式:
**sequential_all: 顺序执行全部**
**sequential_one: 顺序执行下一个**
**random: 随机选取执行**
**触发条件**用于检测状态,只要源码允许,触发器可检测游戏内任何可能存在的状态并激活**发送器**
下面以一个自动文本案例举例说明。
```toml
[[trigger]]
action_mode = "random"
```
这是一个触发条件控制,其中*random*说明发送模式为随机选取发送器内文本发送。
```toml
[trigger.trigger_on.fsm]
new = { target = 3, id = 87 }
[[trigger.check]]
weapon_type.value = 3
```
这里用到了两个条件,第一个`trigger_on`表示这是一个触发器条件。
触发器条件**有且仅有一个**,表示当发生触发器所指示的事件时,若满足设置的条件,则执行触发器。
**注:现在可以使用另一种方式来检查武器动作,具体可参考如下代码**
```toml
[[trigger.check]]
fsm.value = { target = 3, id = 137 }
# 这块检测代码是作者添加伤害检测后原本用于fsm的触发器条件被伤害检测使用故添加此检测器以防止出现两个trigger_on导致冲突的情况
```
一个是检测玩家的动作,`{ target = 3, id = 87 }`为动作`气刃突刺`
另一个是检测玩家的武器,`trigger.check.weapon_type.value = 3`说明检测时玩家只有使用太刀才能触发。
```toml
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_GREEN_DEFAULT><SIZE 30>注意闪避,太刀侠要准备登龙了!</SIZE></STYL>"
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_GREEN_DEFAULT><SIZE 30>气刃突刺!</SIZE></STYL>"
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_GREEN_DEFAULT><SIZE 30>黑龙歼灭刀将要使用一种从天而降的刀法</SIZE></STYL>"
```
这个是行为,用于发送文本。
```toml
[[trigger]]
action_mode = "random"
[trigger.trigger_on.fsm]
new = { target = 3, id = 87 }
[[trigger.check]]
weapon_type.value = 3
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_GREEN_DEFAULT><SIZE 30>注意闪避,太刀侠要准备登龙了!</SIZE></STYL>"
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_GREEN_DEFAULT><SIZE 30>气刃突刺!</SIZE></STYL>"
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_GREEN_DEFAULT><SIZE 30>黑龙歼灭刀将要使用一种从天而降的刀法</SIZE></STYL>"
```
这个是完整的自动文本,自己创建时请以此作为参考。检测器类型可能根据需求变化较大,该部分建议参考`mas-config.toml`内触发器格式编辑。
### Q3.3 怎么编辑文本?
A彩色文本和字体大小都是游戏内置支持。标记格式参考如下
```text
<STYL MOJI_GREEN_DEFAULT><SIZE 30>黑龙歼灭刀将要使用一种从天而降的刀法</SIZE></STYL>
```
其中:`<STYL MOJI_GREEN_DEFAULT>`决定字体颜色,颜色参考如下:
![alt text](img/image-20.png)
mhw游戏中可用的字体颜色对应代码如下
```text
<STYL MOJI_RED_DEFAULT> </STYL> RED #FF0000 RGB(255, 0, 0)
<STYL MOJI_GREEN_DEFAULT> </STYL> GREEN #008000 RGB(0, 128, 0)
<STYL MOJI_BLUE_DEFAULT> </STYL> BLUE #0000FF RGB(0, 0, 255)
<STYL MOJI_PURPLE_DEFAULT> </STYL> MEDIUMPURPLE #9370DB RGB(147, 112, 219)
<STYL MOJI_YELLOW_DEFAULT> </STYL> YELLOW #FFFF00 RGB(255, 255, 0)
<STYL MOJI_ORANGE_DEFAULT> </STYL> ORANGE #FFA500 RGB(255, 165, 0)
<STYL MOJI_LIGHTBLUE_DEFAULT> </STYL> LIGHTBLUE #ADD8E6 RGB(173, 216, 230)
<STYL MOJI_LIGHTGREEN_DEFAULT> </STYL> LIGHTGREEN #90EE90 RGB(144, 238, 144)
<STYL MOJI_LIGHTYELLOW_DEFAULT> </STYL> LIGHTYELLOW #FFFFE0 RGB(255, 255, 224)
<STYL MOJI_SLGREEN_DEFAULT> </STYL> TEA GREEN #D0F0C0 RGB(208, 240, 192)
<STYL MOJI_BROWN_DEFAULT> </STYL> CHOCOLATE #2B1700 or darker
<STYL MOJI_WHITE_DEFAULT> </STYL> WHITE #FFFFFF RGB(255, 255, 255)
<STYL MOJI_WHITE_DEFAULT2> </STYL> GAINSBORO #DCDCDC RGB(220, 220, 220)
<STYL MOJI_WHITE_SELECTED2> </STYL> SILVER #C0C0C0 RGB(192, 192, 192)
<STYL MOJI_BLACK_DEFAULT> </STYL> BLACK #000000 RGB(0, 0, 0)
```
`<SIZE 30>`代表文本的字号,字号大小参考如下:
![alt text](img/image-21.png)
作者和编者都建议不要对长文本应用过大的字号,带来的观感并不会尽如人意的...
`黑龙歼灭刀将要使用一种从天而降的刀法`是一个示例文本,这个就是你触发条件后发在游戏里面的文本(*想怎么下头的写法就怎么下头吧,决定权在你*)
### Q3.4 怎么去寻找武器的动作即fsm
本文给出两种方案一种是基于0.1.1版本的更新debug一种是基于踩蘑菇大佬*Alcedo*所开发的luaengine框架。
*方案一*debug适合仅使用此mod编辑自动文本的用户
打开游戏根目录下的loader-config.json可以看到
```
{
"logfile": false,
"logcmd": true,
"logLevel": "ERROR",
"outputEveryPath": false,
"enablePluginLoader": true
}
```
将`"logLevel": "ERROR",`中的`ERROR`改为`DEBUG`,保存并重启游戏,此时游戏会输出大量日志,在进入训练场并使用武器执行动作后,在日志中找到如下内容
![alt text](img/image-22.png)
如红字所说后面那个fsmid对应的数值就是武器当前执行的动作id。有了这个id就可以参考[Q3.2](#q32-怎么创建一个完整的自动文本?)制作自动文本了
*方案二***luaengine**适合除了编辑自动文本的需求外存在其他数据获取需求对基于luaengine编写的mod感兴趣或有制作意图的用户
luaengine相关就不在这阐述了一切相关问题请移步踩蘑菇luaengine教程贴https://www.caimogu.cc/post/943219.html
## 注现在已添加简易fsmID表格, 如果不想自己去测可以参考[为Monster Hunter World - More Auto Shouts 制作的简易Fsm ID 表](fsmID.md)。但是该表内只录取部分笔者认为常用的fsm其他fsm请自行按照上述查找fsm的方法进行查找。
### Q3.5 怎么让一个触发器检测多个动作?
A:使用`in`函数以判断事件的值是否包含在数组内。
下面举个例子,以铳枪的龙杭炮为例。
```toml
[[trigger]]
action_mode = "sequential_all"
[trigger.trigger_on.fsm]
new = { target = 3, id = {in = [110,114]} }
# in是一个函数用于判断事件的值是否包含在数组内需要用花括号{}包起来。同理,你也可以在花括号内使用'nin'来排除动作
[[trigger.check]]
weapon_type.value = 7
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_LIGHTBLUE_DEFAULT><SIZE 25>龙杭炮发射</SIZE></STYL>"
```
龙杭炮有三个射击方向分别为正常派生的下段炮击突进上捞派生的中段炮击以及站姿上捞派生的上段炮击这三个炮击的动作fsmid是分开的分别为110下段112中段114上段
现在使用in函数将这三个fsmid放入一个数组内触发器检测到玩家使用铳枪时会检测到玩家当前执行的动作fsmid是否包含在数组内若包含则激活触发器并发送文本![alt text](img/image-25.png)。
**注in有对应的反函数nin可用于检测除内部动作之外的其他动作**
### Q3.6 为什么我的文本修饰了还是默认的文本?
A:请检查文本中是否含有`</SIZE>`和`</STYL>`,这两个标签是用于控制文本样式的,请检查文本段的末尾中否含有这两个标签, 如果没有会导致该文本无法被检测到颜色和字体的修改,并以默认形式的文本发送。
### Q3.7 为什么我的文本只说了一部分?
A:一个param内的文本所包含的字节数存在上限128个字节现举例说明
```toml
param = "<STYL MOJI_LIGHTGREEN_DEFAULT><SIZE 30>一二三四五六七八九十壹贰叄肆伍陆柒捌玖拾甲乙丙丁戊己庚辛壬癸</SIZE></STYL>"
#双引号中的内容"<STYL MOJI_LIGHTGREEN_DEFAULT><SIZE 30>一二三四五六七八九十壹贰叄肆伍陆柒捌玖拾甲乙丙丁戊己庚辛壬癸"是被计算进字符的部分
```
*汉字*和*全角标点符号*占**三个字节**,所有的*英文字母*,*数字*和*半角标点符号*占**一个字节**。
写入的字段中包含了30个汉字其他字母数字和半角符号合计39个合计字节是30*3+39=129个。让我们看看发出去的文本会是啥样
![alt text](img/image-4.png)
如图写入了30个汉字实际上只发出来了29个说明输入文本时字段包含的字节数超过上限129>128,导致文本中最后一个汉字的字符被截断无法被输出。笔者建议设置自动文本时不要使文本部分的汉字与中文标点符号数量超过30否则会使发送时文本因超过字节上限被截断。
### Q3.8 怎么设置复合的颜色和字号文本,比如![alt text](img/image-24.png)这样的?
A:gmd支持在同一句话中使用分隔的多个颜色和字号tag对不同的文本段标注具体可参考如下代码上图中三色字体飞圆斩的**发送器**
```toml
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_GREEN_DEFAULT><SIZE 40>飞!<STYL MOJI_LIGHTBLUE_DEFAULT><SIZE 45>圆!<STYL MOJI_RED_DEFAULT><SIZE 50>斩!</SIZE></STYL>"
```
每一段文本的前面都有一个控制样式的标签,标签的格式请参考[Q3.3](#q33-怎么编辑文本)中的编辑方式,每一段不同样式文本的标签排序**必须**按照颜色`<STYL MOJI_GREEN_DEFAULT>`在前字号`<SIZE 40>`在后顺序排列。
*这里将文本代码放入了一个发送器的param内可以复制粘贴放入任意param直接使用*
### Q3.9 怎么设置发送间隔以防止说话太多刷屏?
A:mas-config.toml内已经内置了全局间隔功能默认为1秒具体请参考配置文件(*mod作者贴心的给你放在了最前面还加了注释哦*)
如果想给单个触发器设置间隔发送,可以参考如下代码:
```toml
[[trigger]]
action_mode = "random"
cooldown = 1
# 设置该触发器发送间隔为1秒
[trigger.trigger_on.fsm]
new = { target = 3, id = 11 }
[[trigger.check]]
weapon_type.value = 2
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_RED_DEFAULT><SIZE 30>开启鬼人化</SIZE></STYL>"
```
在**触发条件**(详见[Q3.2](#q32-怎么创建一个完整的自动文本?))的代码
```toml
[[trigger]]
action_mode = "random"
```
下面添加`cooldown`字段,即可设置单触发器的发送间隔(以秒计算)。
### Q3.10 怎么设置动作前后检测,实现一定程度上在某些情况下的受击检测?
A:使用`old`和`new`字段,可检测执行该动作的上一个动作,具体请参考如下代码(这里贴出一段登龙被打导致登龙失败的自动文本)
```toml
# 登龙被打导致登龙失败
[[trigger]]
action_mode = "random"
[trigger.trigger_on.fsm]
old = { target = 3, id = {in = [87,89,90,91]} }
new = { target = 1, id = {nin = [87,89,90,91]} }
# 这里用了 in 和 nin 两个函数一个是检测登龙的动作一个检测玩家的状态fsmtarget = 1是纳刀态和硬直fsmtarget = 3是拔刀态基于笔者最新的发现即在检测前后两个动作时新动作检测的是硬直态的话就可以实现动作被打断的检测。
[[trigger.check]]
weapon_type.value = 3
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_WHITE_DEFAULT><SIZE 30>太刀侠登龙时<STYL MOJI_RED_DEFAULT><SIZE 40>被打飞了其他武器纳刀默哀30秒</SIZE></STYL>"
```
`old`用于检测当前动作的上一个动作`new`用于检测当前动作。当前的动作符合`new`内的动作且上一个符合`old`内包含的动作时,触发器才会触发。
比如上面`old`内是检测登龙的拆分动作(气刃突刺,起跳,空中抬刀预备动作,气刃兜割下劈),`new`内是检测玩家处于纳刀和硬直状态`target = 1`(*内部`fsmid`暂未完全测试建议填写一个不超过100的数字*), 当登龙被打断时,系统会先检测上一个动作是否是登龙中的动作,然后检测下一个动作是不是玩家的纳刀和硬直状态,若符合则触发该触发器并发送![alt text](img/image-29.png)
### Q3.11 为什么我盾斧开电锯会说超解的文本?
A目前因为开电锯时存在延迟输入帧就是可以在超解动作开始时的约0.2秒内按钩爪键可以把超解动作转换为开电锯的动作),导致开电锯按晚了会有超解文本发送。
目前笔者找到了一种基于[Q3.10](#q310-怎么设置动作前后检测,实现一定程度上在某些情况下的受击检测)的解决方法,具体请参考如下代码(**可以直接复制粘贴并应用**
```toml
# ========== 盾斧超解动作 ==========
[[trigger]]
action_mode = "random"
[trigger.trigger_on.fsm]
old = { target = 3, id = 120 }
new = { target = 3, id = {in = [0,1,3,6,19,20,21,22]} }
# 这里new把所有超解完毕后可能的派生站立移动回避都贴了出来并放在超解后的动作检测里借此以防止在超解的延迟输入帧内开电锯的的问题出现
[[trigger.check]]
weapon_type.value = 9
[[trigger.action]]
cmd = "SendChatMessage"
param = "*超解"
```
**注:该触发器是基于超解完毕后的动作判定触发的,所以使用时并不会在“理想的”时机内发送文本,延迟发送功能请期待后续更新**
### Q3.12 怎么给动作添加伤害检测?
A使用新的触发器条件`[trigger.check]`来检测,具体使用方式如下:
这里是使用真蓄作为检测
```toml
# ========== 真蓄造成伤害 ==========
[[trigger]]
action_mode = "sequential_all"
[trigger.trigger_on.fsm]
new = { target = 3, id = {in = [135,136,137]} }
[[trigger.check]]
weapon_type.value = 0
# 武器检测
[[trigger.check]]
[trigger.check.damage]
# damage和旧版本的伤害检测条件相同用于检测该动作的伤害是否大于一定值这里写200即真蓄伤害大于200则触发该触发器。你也可以把gt改为lt表示小于200则触发该触发器。
damage = { gt = 200 }
# fsm检测的目的是检测并累计该动作期间的伤害值(目前只能实现单个动作的检测,多个动作的检测需要后续更新)
fsm = { target = 3, id = 137 }
# timeout检测动作的延时毫秒计数2000为2秒
timeout = 2000
# mod作者已经将伤害检测改为可设置多个的`trigger.check`并放到这里,`trigger.trigger_on。damage`已经不再适用于新版本
[[trigger.action]]
cmd = "SendChatMessage"
param = "<STYL MOJI_LIGHTBLUE_DEFAULT><SIZE 30>强击真三蓄!造成了<SIZE 40>{{damage}}<SIZE 30>伤害</SIZE></STYL>"
```
上述代码若正常运行则在触发强击的真三蓄力斩伤害大于等于200时发送如下文本
![alt text](img/image-30.png)
#### 现在已经实现了伤害为空的检测条件即伤害统计的部分是基于时间段内造成的伤害进行检测可以设置大于0造成伤害或者小于等于0不造成伤害或者负伤害所以理论上总伤害为0时可以判定为未命中
未命中的代码如下:
```toml
# ========== 太刀登龙失败 ==========
[[trigger]]
action_mode = "sequential_all"
name = "太刀登龙失败"
# 动作检测
[trigger.trigger_on.fsm]
new = { target = 3, id = 92 }
# 武器检测
[[trigger.check]]
weapon_type.value = 3
[[trigger.check]]
[trigger.check.damage]
damage = { le = 0 }
# 伤害检测小于0时可以被视为未命中你用骰子剑造成负伤害也会被算进去lt=0的情况下总和为负值时也会触发
fsm = { target = 3, id = 92 }
timeout = 2000
[[trigger.action]]
cmd = "SendChatMessage"
param = "*悲报:太刀侠空登了"
```
**注:现在已经去除了:`trigger.trigger_on.damage`,现在使用该代码进行伤害检测时,会出现报错。**
![alt text](img/image-31.png)
*`trigger.trigger_on`只能检测一个元素,该触发器内检测到多个元素。* **报错如是说到...**
# 本文由Stellaraven 结合群内各种问题编写。还有问题请到群*259616154*内咨询。
# Thanks For Your Reading