本篇教程由作者设定使用 CC BY-NC-SA 协议。

注:以下内容均基于咒法学1.19.2发布版(hexcasting-forge-1.19.2-0.10.3.jar),及github内1.19分支

注2:以下js代码段中使用到的咒法学类默认由Java.loadClass以原名称引入

咒法学本体的法术图案注册接口位于PatternRegistry类之中;注意到其中的Action参数为接口而非类,并且基础定义来自于Kotlin而非Java那如果我们向其中放入由kubejs创建的对象……

理论存在,实际开始:

创建施法动作(Action)

接口分析

Action.kt内,可以看到一共定义了5个字段,其中可以分为3类:

  1. operate(continuation, stack, ravenmind, ctx): OperationResult,这是执行每个符文内部逻辑的位置,实测传入js的箭头函数也能运行

  2. alwaysProcessGreatSpell、causesBlindDiversion、isGreat:三个均为kotlin getter的字段,仅在kotlin内部访问,传入()=><value>常量箭头函数即可

  3. displayName:第一个坑来了,这个字段在kotlin内部和java侧均有访问,内部访问依然等价为.displayName()即可,但java侧是使用getDisplayName()来获取的;因此需要将两个字段同时定义箭头函数

基于此,可以定义一个基础的JS Action如下:

let myAction={
    getDisplayName: () => Text.gold('TEST'),
    displayName: () => Text.gold('TEST'),
    isGreat: () => false,
    alwaysProcessGreatSpell: () => true,
    causesBlindDiversion: () => true,
    operate: (continuation, stack, ravenmind, ctx) => {
        ctx.caster.runCommandSilent('kill @s') // 执行一下原地自爆指令,测试是否已读取
        return OperationResult(continuation, stack, ravenmind, [])
    }
}

注册施法动作

除了簿记员之策略数字之精思使用了PatternRegistry.addSpecialHandler外,官方本体的所有静态图案注册均使用了PatternRegistry.mapPattern实现,其中入参pattern由HexPattern.fromAngles创建,所需的序列(只要不涉及原地调头方向)可以在Hex Studio中绘制,并通过左侧菜单File - Export Patterns导出后复制序列

使用KubeJS添加自定义法术-第1张图片

注册动作只可发生一次,因而相应脚本需置于kubejs/startup_scripts目录下,此处从StartupEvents选取一个幸运的事件以调用注册动作:

StartupEvents.postInit(e => {
    PatternRegistry.mapPattern(
        HexPattern.fromAngles("wwawwawwdwwdww", 0), 
        ResourceLocation('kubejs', 'tester'), 
        myAction, false
    )
})

进入游戏测试

使用KubeJS添加自定义法术-第2张图片使用KubeJS添加自定义法术-第3张图片

可以看到,在绘制了对应图案之后,游戏顺利执行了myAction.operate内的逻辑,玩家符合预期地似了(

使用KubeJS添加自定义法术-第4张图片


从HexGloop提供的聊天框展示功能中也能看到图案对应的displayName字段

自此,由游戏内咒法学符文至执行kubejs逻辑的路径已经打通,后续就是想象力的问题了(咒法学爆改新生魔艺可能性微存)