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)