本篇教程由作者设定使用 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类:
operate(continuation, stack, ravenmind, ctx): OperationResult,这是执行每个符文内部逻辑的位置,实测传入js的箭头函数也能运行
alwaysProcessGreatSpell、causesBlindDiversion、isGreat:三个均为kotlin getter的字段,仅在kotlin内部访问,传入()=><value>常量箭头函数即可
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/startup_scripts目录下,此处从StartupEvents选取一个幸运的事件以调用注册动作:
StartupEvents.postInit(e => {
PatternRegistry.mapPattern(
HexPattern.fromAngles("wwawwawwdwwdww", 0),
ResourceLocation('kubejs', 'tester'),
myAction, false
)
})
进入游戏测试
可以看到,在绘制了对应图案之后,游戏顺利执行了myAction.operate内的逻辑,玩家符合预期地似了(
从HexGloop提供的聊天框展示功能中也能看到图案对应的displayName字段
自此,由游戏内咒法学符文至执行kubejs逻辑的路径已经打通,后续就是想象力的问题了(咒法学爆改新生魔艺可能性微存)