# Monster Hunter World - More Auto Shouts: Q&A 针对部分用户使用 MHW 更多定型文mod时遇到的问题提供可能的处理方式,若尚未解决问题可加群*259616154*咨询 编写时mod版本:0.1.5 ## 目录 ### [1.安装类问题](#1-安装类问题) [Q1.1:mod安装位置错误导致游戏无法加载mod的解决方法](#q-11-为什么我用狩技盒子安装了mod游戏正常启动但是mod没有生效) [Q1.2:游戏加载mod时发生崩溃的处理方法](#q-12-为什么我安装了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有什么游戏内的快捷指令吗) ### [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。 ## 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插件,即可方便的编辑和浏览配置文件。 ### Q2.9 为什么我的文件名是mas-config.toml,而情况和Q2.5一样? A: 你可能在![alt text](img/image.png)这个地方没把*显示扩展名*![alt text](img/image-23.png)打开,把它打开然后再改名或者直接将配置文件名字改成mas-config再启动游戏。 ### 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攻击吧*) ## 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 = "注意闪避,太刀侠要准备登龙了!" [[trigger.action]] cmd = "SendChatMessage" param = "气刃突刺!" [[trigger.action]] cmd = "SendChatMessage" param = "黑龙歼灭刀将要使用一种从天而降的刀法" ``` 这个是行为,用于发送文本。 ```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 = "注意闪避,太刀侠要准备登龙了!" [[trigger.action]] cmd = "SendChatMessage" param = "气刃突刺!" [[trigger.action]] cmd = "SendChatMessage" param = "黑龙歼灭刀将要使用一种从天而降的刀法" ``` 这个是完整的自动文本,自己创建时请以此作为参考。检测器类型可能根据需求变化较大,该部分建议参考`mas-config.toml`内触发器格式编辑。 ### Q3.3 怎么编辑文本? A:彩色文本和字体大小都是游戏内置支持。标记格式参考如下: ```text 黑龙歼灭刀将要使用一种从天而降的刀法 ``` 其中:``决定字体颜色,颜色参考如下: ![alt text](img/image-20.png) mhw游戏中可用的字体颜色对应代码如下: ```text RED #FF0000 RGB(255, 0, 0) GREEN #008000 RGB(0, 128, 0) BLUE #0000FF RGB(0, 0, 255) MEDIUMPURPLE #9370DB RGB(147, 112, 219) YELLOW #FFFF00 RGB(255, 255, 0) ORANGE #FFA500 RGB(255, 165, 0) LIGHTBLUE #ADD8E6 RGB(173, 216, 230) LIGHTGREEN #90EE90 RGB(144, 238, 144) LIGHTYELLOW #FFFFE0 RGB(255, 255, 224) TEA GREEN #D0F0C0 RGB(208, 240, 192) CHOCOLATE #2B1700 or darker WHITE #FFFFFF RGB(255, 255, 255) GAINSBORO #DCDCDC RGB(220, 220, 220) SILVER #C0C0C0 RGB(192, 192, 192) BLACK #000000 RGB(0, 0, 0) ``` ``代表文本的字号,字号大小参考如下: ![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 = "龙杭炮发射" ``` 龙杭炮有三个射击方向,分别为正常派生的下段炮击,突进上捞派生的中段炮击,以及站姿上捞派生的上段炮击,这三个炮击的动作fsmid是分开的,分别为110(下段),112(中段),114(上段)。 现在使用in函数将这三个fsmid放入一个数组内,触发器检测到玩家使用铳枪时,会检测到玩家当前执行的动作fsmid是否包含在数组内,若包含则激活触发器并发送文本![alt text](img/image-25.png)。 **注:in有对应的反函数nin,可用于检测除内部动作之外的其他动作** ### Q3.6 为什么我的文本修饰了还是默认的文本? A:请检查文本中是否含有``和``,这两个标签是用于控制文本样式的,请检查文本段的末尾中否含有这两个标签, 如果没有会导致该文本无法被检测到颜色和字体的修改,并以默认形式的文本发送。 ### Q3.7 为什么我的文本只说了一部分? A:一个param内的文本所包含的字节数存在上限(128个字节),现举例说明: ```toml param = "一二三四五六七八九十壹贰叄肆伍陆柒捌玖拾甲乙丙丁戊己庚辛壬癸" #双引号中的内容"一二三四五六七八九十壹贰叄肆伍陆柒捌玖拾甲乙丙丁戊己庚辛壬癸"是被计算进字符的部分 ``` *汉字*和*全角标点符号*占**三个字节**,所有的*英文字母*,*数字*和*半角标点符号*占**一个字节**。 写入的字段中包含了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 = "飞!圆!斩!" ``` 每一段文本的前面都有一个控制样式的标签,标签的格式请参考[Q3.3](#q33-怎么编辑文本)中的编辑方式,每一段不同样式文本的标签排序**必须**按照颜色``在前字号``在后顺序排列。 *这里将文本代码放入了一个发送器的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 = "开启鬼人化" ``` 在**触发条件**(详见[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是持刀和硬直时的 d)基于笔者最新的发现,即在检测前后两个动作时,新动作检测的是硬直态的话就可以实现动作被打断的检测。 [[trigger.check]] weapon_type.value = 3 [[trigger.action]] cmd = "SendChatMessage" param = "太刀侠登龙时被打飞了,其他武器纳刀默哀30秒" ``` `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.trigger_on.damage]`来检测,具体使用方式如下: ```toml # ========== 真蓄造成伤害 ========== [[trigger]] action_mode = "sequential_all" [trigger.trigger_on.damage] value = { gt = 200 } # 这是mod作者与0.1.5版本添加的新的触发器条件,用于检测该动作的伤害是否大于一定值(这里写200),即真蓄伤害大于200则触发该触发器。你也可以把gt改为lt,表示小于200则触发该触发器。 [[trigger.check]] weapon_type.value = 0 # 武器检测 [[trigger.check]] fsm.value = { target = 3, id = {in = [135,136,137]} } # 鉴于伤害检测会占用触发器条件检测,故mod作者将动作检测改为可设置多个的`trigger.check`并放到这里,以防止出现两个trigger_on导致加载配置时出现冲突的情况 [[trigger.action]] cmd = "SendChatMessage" param = "强击真蓄!造成了{{damage}}伤害" ``` 上述代码若正常运行,则在任意触发强击的真蓄力斩伤害大于等于200时发送如下文本: ![alt text](img/image-30.png) **注:任何动作要添加伤害检测时请务必使用上述的格式来编写自动文本,否则当一个触发器内同时存在两个`trigger.trigger_on`结构时,mod会报错并触发如下警告:** ![alt text](img/image-31.png) *`trigger.trigger_on`只能检测一个元素,该触发器内检测到多个元素。* **报错如是说到...** # 本文由Stellaraven 结合群内各种问题编写。还有问题请到群*259616154*内咨询。 # Thanks For Your Reading