本篇教程由作者设定使用 CC BY-NC-ND 协议。
起因是今天下午作者收到了这样一个 issue
很快啊,作者就发现他忘把最新版本上传到curseforge上了(大雾
咳咳,当然问题的主要原因不是这个,这篇教程也不是来讨论问题是啥的;总之,弹幕聊天的新版本(2.0.0及以上)为消息转换添加了正则表达式的支持,换言之我们可以不用拘泥于消息内容和在聊天栏中显示的格式,直接对符合一定格式的消息进行转换让它们变成弹幕,这里的格式可以在配置文件中通过正则表达式进行定义,下面介绍一下配置方法:
首先进入游戏后点击 Mod 按钮进入模组列表界面,选择弹幕聊天后点击左下角的配置按钮,进入弹幕聊天配置界面后点击左下方的打开高级设置按钮,就可以打开弹幕聊天的高级配置文件了,如下图所示:
进入高级配置文件中以后我们可以看到有五个项目,其中前三个条目("stopWords", "blockUsers", "regExp")是弹幕聊天的敏感词、屏蔽用户和屏蔽正则表达式设置,如果没有相关需求可以不管。
我们需要重点关注的内容是下面两个条目,即 "chatRegCustomized" 和 "tellRegCustomized" 。
这两个条目均是使用正则表达式定义的自定义匹配模式,我们只需要修改这两个条目中的字符串即可实现自定义解析的功能。
还是以刚刚的 issue 为例子,这位用户在安装了 MineMention 之后,虽然发出的消息在聊天栏中的格式没有变化,但是弹幕却不能正常显示了(如图);
这时候我们只需要将配置文件中的 "chatRegCustomized" 修改为
"^<(?<sender>\\w{3,16})> (?<msg>.*$)"
并保存,就可以看到弹幕已经可以正常渲染了。
需要注意的是,位于小括号中的内容均不需要我们做任何修改,第一个小括号中的内容("(?<sender>\\w{3,16})")代表发送的玩家名称,第二个小括号中的内容("(?<msg>.*$)")代表发送的消息,所以理论上讲如果有其他 mod 或者服务器插件把玩家的消息改成了类似这种形式:
你好,我是丁真 - DingZhen 谁会这么改啊喂!
我们也可以通过把表达式修改为类似这种格式
"^(?<msg>.*$) - (?<sender>\\w{3,16})"
来让弹幕聊天识别消息并将其转换为弹幕(当然如果你真这么改有 99% 的概率会出问题)
需要注意的是,某些特殊字符(如 [() 等)在正则表达式中是需要转义使用的,具体方法是在对应字符前面添加反斜杠 \
关于正则表达式的更多使用细节可以参阅菜鸟教程,这里需要用到的特性不多,就不再赘述了
最后的最后,由于 Java Regex 库本身的限制,同一个正则表达式中出现两个同名的命名捕获组是不被允许的,因此如果你需要添加多条正则规则的话只能使用类似
"^(?:<|)(?<sender>\\w{3,16})(?:>|:) (?<msg>.*$)"
这样的写法,它会同时捕获类似 <Player> Ciallo! 和 Player: Ciallo! 格式的消息,
但也会出现错误捕获 <Player: Ciallo! 和 Player> Ciallo! 格式的消息(不过真的会有人用这种格式来格式化聊天栏消息么?)
作者目前还没想到什么更好的解决这个问题的办法
另:本功能一开始是为了适配 TeaCon 服务器奇怪的消息格式(没错,就是默认表达式对应的消息格式)制作的,但是适当使用可以达到许多意想不到的效果;
如跟 943 的直播弹幕模组(不是,943 怎么还没更新 1.20.1 啊)达成联动,这方面的配置方法就留给读者自行探索吧。