ff14高级触发器不正经教程(6)

您所在的位置:网站首页 ff14奥丁怎么触发 ff14高级触发器不正经教程(6)

ff14高级触发器不正经教程(6)

2023-11-18 14:53| 来源: 网络整理| 查看: 265

前言

如果不正经系列教程中有哪篇勉强配得上高阶教程的话,那大概就是这篇了。本篇涵盖如下内容:

官方FAQScripting章节导读(附翻译)

一些小tips,方便接下来的学习

标量变量、列表变量、表格变量取值与赋值

全局变量Storage浅析(附示例与少量源码)

创建WebSocket连接及使用

像触发器那样创建动作(custom action)

综合示例AuraCanVTS——创建一个VTube Studio插件

后记、致谢与卖萌

1.官方FAQScripting章节导读

先附上链接,链接以下部分为个人翻译,灰色字体部分为up自己的理解或注释:

https://github.com/paissaheavyindustries/Triggernometry/wiki/Triggernometry-FAQ-and-examples#scripting

执行代码

“执行代码”动作允许你运行C#代码,高级触发器内的所有动作通常都可以被调用。高级触发器将自动在代码环境中添加所有当前已加载程序集的引用,因此你同城不需要添加任何引用。最后,高级触发器将自动为每段代码隐式添加“using System;”。

全局命名空间中还有工具类TriggernometryHelpers,它包含不少实用的状态变量与方法。(第四部分列出了当前版本可用的工具与属性)

安全问题

代码脚本能实现十分强大的功能,但由于容易造成危害的命名空间与API默认被设置为“用户可选”,因此人们理论上不会无意间运行恶意脚本。脚本安全设置位于高级触发器的“编辑配置”菜单下,“本地触发器”与“远程触发器”允许启用不同的命名空间。此外,如果ACT是由管理员身份运行的,那么触发器会由于执行权限的升高而增加更多的潜在危险-故用户作为管理员时需要单独设置允许启用的API。

同理,默认情况下不允许远程仓库执行脚本,用户需要确认每个远程仓库允许执行的脚本。

属性(位于TriggernometryHelpers中)

Dictionary Storage:一个允许在脚本中使用的字典变量,持续存在并且每个脚本公用。你可以存储链接句柄、准备稍后使用的变量或准备在其他脚本中使用的数据。脚本自行负责锁定字典(这里我并未深究过其源码,不确定是这里的锁定指变量持久化还是事务锁。相关内容在第四部分会给出示例)。

Triggernometry.RealPlugin Plugin:高级触发器实际上的实例(未深究)。

Triggernometry.Context CurrentContext:执行脚本的上下文实例。

方法(位于TriggernometryHelpers中)

依照高级触发器的ACT接口设置播放声音文件或使用TTS。(编辑配置-声音-ACT接口下)

高级触发器有专用的求值方法,如:EvaluateStringExpression("${_ffxivplayer}")

我通常直接在C#代码里拼触发器表达式,这个方法可能是为了方便使用编辑器的各位编辑器中不要频繁报错影响心情而准备的。

操作高级触发器变量。第一个参数表示该变量是否为持久变量。(第三部分细讲)

通过索引或名称获取触发器捕获组中的值(并运行脚本)。

示例

弹出一个包含角色名字的消息框:

如果当前玩家名称与捕获组中名为playername的捕获内容匹配,则使用TTS合成如下内容:

这个脚本看起来不能跑,实际跑了一下也确实报错了。String.Compare方法的返回值为数字,而非布尔值。

创建自定义操作并将其排入队列或执行,正如高级触发器所做的:

自定义操作会在第六部分给出一个更为详细的示例,并指导如何在源码中查询其他操作如何定义。

创建一个到本地主机的WebSocket链接(第五部分会详细介绍):

第一部分结束~

2.一些小tips,方便接下来的学习

本篇专栏的大部分知识点拆分自在下github上的项目-AuraCanVTS,这是一个使用ACT高级触发器中触发器作为VTube Studio插件的实例,如果信任我可以下载下来对照学习。

https://github.com/raine01/AuraCanVTS/blob/main/AuraCanVTS.xml

VTube Studio可以在Steam上购买(无水印版本)或免费获取(有水印版本),其官方插件GitHub如下:

https://github.com/DenchiSoft/VTubeStudio

高级触发器源码,建议下载源码方便了解功能实现原理

https://github.com/paissaheavyindustries/Triggernometry/

最好能有一个高级点的C#编辑器,我个人比较推荐Microsoft Visual Studio。

不靠谱系列的入门教程,也许你们会有兴趣看看

https://www.bilibili.com/read/cv17010294

3.标量变量、列表变量、表格变量取值与赋值

以下部分默认大家:

会使用常规方法查看与操作变量(包括普通变量与持久化变量)

熟悉标量变量、列表变量、表格变量的区别

知道高级触发器中列表变量与表格变量的索引从1而不是多数编程语言中的0开始

会创建触发器并新增动作

示例1,新增持久化标量变量。创建触发器并新增“执行脚本”动作,写入如下代码:

参数1:是否持久化变量

参数2:变量名

参数3:变量值

效果如下:

新建持久化标量变量

示例2,新增非持久化表格变量:

拆分自https://www.bilibili.com/read/cv21768599,感兴趣可以看看表格变量的应用实例。VariableTable变量还有其他的属性与方法,去高级触发器源码中搜VariableTable即可。记住,高级触发器变量的索引是从1开始的。

新建非持久化表格变量

列表变量应该也是类似的用法,我没用过。沿着VariableList搜索即可。

4.全局变量Storage浅析(附示例与少量源码)

新建触发器,输入代码:

右键执行一下,看看日志是否报错,如果没报错那么你大概率成功了。接下来新建另一个触发器,输入代码:

如果顺利的话会弹出一个对话框,内容为“变量值”,如下图:

弹出对话框

写法多种多样,我仅提供一个示例。我们来简单看一下高级触发器Storage的内部实现:

TriggernometryHelpers内部属性与方法

大部分源码已经被我折叠起来了,这里是TriggernometryHelpers的可用属性与方法。Storage是C#的Dictionary数据结构,即key为字符串,value为object。你可以往里面放几乎所有的数据类型,取出来时转换一下类型即可使用。第5部分的综合示例中我会将新建立起的WebSocket连接存入Storage供其他触发器调用。

5.创建WebSocket连接及使用

有关WebSocket的资料很多,我简单说两句:

它不是post请求或者get请求,和当前版本触发器内的“通用JSON操作”不一样。

WebSocket区分客户端与服务端,我们接下来要用高级触发器作为客户端、VTubeStudio作为服务端。

请确保你的VTubeStudioAPI是启用的

启用API左面的选择框要像图中那样是打开的,端口默认是8001,如果你想修改为其他端口也是可以的,触发器的代码保持一致即可。

新建触发器,新增执行脚本动作,代码如下:

附上C#WebSocketSharp文档(看起来是官方的,但我不是十分确定):

https://github.com/sta/websocket-sharp/#usage

触发器创建完毕后直接右键执行一下,会有一个弹出框提示“开启”,VTubeStudio也会提示“插件已连接:1”。

连接建立成功

好的,连接已经建立成功了。我们再一次右键执行触发器,由于连接已经建立了,所以这一次走的是代码中的if部分,高级成触发器会通过websocket连接发送一个请求。关于发送的json串的详细解释,请参照VTubeStudio插件官方文档:

https://github.com/DenchiSoft/VTubeStudio#api-details

返回的消息中我关注的部分只有:"active": true,这表示我已经建立链接了。

我高级触发器中的代码还有一个关闭时执行的方法,我也来做个示例:

关闭连接

把“启用API”旁边的按钮关掉即可。

6.像触发器那样创建动作(custom action)

我在最初做这个插件时没注意到TriggernometryHelpers中有一个打印日志的方法,因此手写了一个调用。写专栏时才注意到自带了一个日志打印方法,而且很简单。接下来我以我手写的方法作为示例粗略讲解下如何创建动作。先来回顾下官方文档中给出的例子:

虽然一行解释都没有,但也能猜大概:

使用高级触发器的命名空间

定义一个Action对象

设置动作的类别(见下方)

塞点其他需要的东西进去(见下方)

把动作排入动作队列

Action类在Action.cs中,我们创建一个动作时首先要确认的是ActionType(动作类型),这个值可以在ActionProps.cs的ActionTypeEnum中找到。

ActionTypeEnum枚举类

接下来塞点其他东西进去,这个其他东西取决于你的动作类别。来看看我们的LogMessage需要什么。

全局搜一下LogMessage或你的类型,然后找一个看起来像的。大概都在Action.cs里,前面用case进行匹配(我这里是的1836行):

case匹配动作类型

来瞧瞧它写了什么……嗯,说实话我看不懂,但大概凡是会一点C#的盆友看起来都会很轻松。

现在我们来自己写一个:

右键运行:

动作执行效果

这几行代码让我写的,还真是狼狈呢……我这没有自定义动作的需求,否则我能讲出来的东西还会多点。

7.综合示例AuraCanVTS——创建一个VTube Studio插件

读了读VTube Studio(下面简称VTS)插件的文档,我们要做的事情不算太难:

建立一个websocket链接

发送特定格式的报文并在软件内通过认证,VTS会返回一个token字符串。下次建立websocket链接的时候就不用在软件内进行认证了

将一些功能进行封装,我这边实现了触发热键、参数新增、参数设置、参数删除

我们来逐步实现上述步骤,代码很多就不全贴上来了。可以对照第二步第一条链接中的代码下载一份导入触发器查看。

建立连接与获取token

这个最厉害的触发器里包含了两个动作:建立连接与获取token。

先来看下第一个动作

建立连接触发器代码

我做了不少额外工作来应对非常规情况(比如触发器还在跑着,使用者从VTS中把插件禁用了):

6~7行是为了减少代码量定义的变量;

第8行是一个验证,如果已经建立了websocket链接则所有代码均不执行;

红框内是链接方法的定义,其中gjv(getJsonValue)是26行定义的方法。我使用正则来获取一个json串中的值,不是很全能但在这里足够了。

log与print是我傻了吧唧特意写的日志打印方法,见27至32行。

13~16行用于处理返回报文中包含errorID的情况。第14行“5”和“8”是VTS在不同种情况下的认证不通过的返回码,详见:https://github.com/DenchiSoft/VTubeStudio/blob/master/Files/ErrorID.cs

17行表示第一次发起认证的情况,此时VTS会返回token。我将token存储为持久化标量变量,这样就不用每次连接都在VTS中认证了。认证时的效果如下图(认证的代码在第一个触发器第二个动作中):

发起认证

要点击允许哦,也可以试试点拒绝,晚些重新认证就好

认证通过后保存的token

再来看看第一个触发器中的第二个动作

第一个触发器中的第二个动作

第二个动作就简单多了,检测是否有链接,检测是否有token,没有的话就发送一条认证(上面那个花里胡哨带一个龙娘头像的那种图)。

附上三个链接:

json处理网站,它的压缩与转义方法十分好用:

https://www.sojson.com/

图片转base64的工具,它帮我将图标转为了一个长字符串:

https://c.runoob.com/front-end/59/

VTS插件关于认证的章节,你们可能想知道如何用这个长字符串:

https://github.com/DenchiSoft/VTubeStudio#authentication

别把图片搞的太高清了,触发器代码有字符上限,如果图片太高清的话触发器的一个动作放不下。不知道用什么处理图片的话,sai就不错~

其余的几个触发器嘛……参数新增、参数删除、触发热键都没什么好说的,你们看一眼就懂了。参数设置也许能对大家有所启发:

参数设置

思路放开扩点朋友们,一个捕获组完全可以对应多个变量~特别是当你使用C#来处理捕获组时,天地万象皆随我意!

示例

最后放点示例,如果你使用我的这套框架,你需要实际编写的触发器会简单到只有一两条。我使用“触发指定的触发器”这个动作来调用框架,而且将除了“建立连接”以外的触发器都设置为不会被日志触发,这样能最大程度提升使用时的便利性。

8.后记、致谢与卖萌

这可能是不正经系列最后一篇教程了,未来我可能会花时间去尝试攻略零式万魔殿及绝欧米茄。也可能会试着去了解深度学习,我一直想创造一个能在ff14中开rp店并能够接受指名的ai。我也可能会试着搭建一个基于ff14世界观的oc网站,想要这种网站很久了。

感谢我的亲友,陪伴了我十一年之久的纸鸢。他数次直接或间接地帮我解决了游戏、生活、编程方面稀奇古怪的问题

感谢慕星Mux的JK系猫猫,袜子甚至还带摩尔纹

感谢陪我做了无数实验的亲友们。点名感谢须须,她的奶茶帮我度过了寒冷的冬天

卖萌……有些晚了,好困了……有机会吧

有创意,有点子,有我能帮忙解答的问题都可以在专栏留言或者私戳我~

爱你们❤



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3