20.5 反射与Java access
KubeJS对反射的支持很有限。一般情况下不推荐使用反射(除非KubeJS不支持某些功能)。
在1.18.2中,Minecraft的类会在运行时被重映射为MojMaps,因此你无需使用srg名。
在以下示例中,我们将使用通过反射获得的MaterialJS创建新的包含紫水晶破坏声音和Material的实例,并将其用于自定义方块注册。
const MaterialJS = java("dev.latvian.mods.kubejs.block.MaterialJS")
const Material = java('net.minecraft.world.level.material.Material')
const SoundType = java('net.minecraft.world.level.block.SoundType')
amethystMaterial = new MaterialJS('amethyst', Material.AMETHYST, SoundType.AMETHYST) // 字段对应的srg名:f_164531_和f_154654_
onEvent('block.registry', event => {
event.create('amethyst_slab', 'slab')
.material(amethystMaterial)// 使用amethystMaterial作为material的值。
.tagBlock('minecraft:crystal_sound_blocks')
.tagBlock('minecraft:mineable/pickaxe')
.requiresTool(true)
.texture('texture', 'minecraft:block/amethyst_block')
})
该过程会延长游戏启动时间约1~2秒(其他类型脚本的加载时间以毫秒计)。你应当在脚本开头导入你需要的类,而不是在事件当中,尤其是在事件多次触发的情况下。
本节参考了Reflection / Java access | latvian.dev
KubeJS-Mods/KubeJS at eol/1.16 (github.com)
KubeJS-Mods/KubeJS at 1.18/main (github.com)