事件
虽然本模组没有直接集成KubeJS,但自己实现它相对简单!
GeneChangeEvent
有两个GeneChangeEvent:Pre和Post。
Pre在实体基因改变之前触发,可以被取消。Post在之后触发,不可取消。
两者都有以下属性:
entity— 基因正在变化的LivingEntitygeneHolder— 正在被添加或移除的Gene的Holder<Gene>geneId— 正在被添加或移除的Gene的ResourceKey<Gene>isAddition()— Boolean值,表示基因是被添加(true)还是移除(false)
NativeEvents.onEvent("dev.aaronhowser.mods.geneticsresequenced.event.custom.GeneChangeEvent$Pre", (event) => {let entity = event.entity;if (entity.level.isClientSide()) return;if (!event.isAddition() && entity.name.getString() == "1aaron5" && event.geneId == "geneticsresequenced:cringe") {event.canceled = true;}});
NativeEvents.onEvent("dev.aaronhowser.mods.geneticsresequenced.event.custom.GeneChangeEvent$Post", event => {event.entity.tell("你的基因已改变!")})
ModifyEntityGenesEvent
此事件在每次检查实体可拥有哪些基因时触发,例如使用基因检测器时,或DNA解码器分析DNA螺旋的基因时。
属性:
entityType— 正在被修改的EntityTypegeneWeights— MutableMap<ResourceKey<Gene>, Double>,表示实体的基因权重- 在KubeJS中以JS对象表示,无法直接修改
方法:
getTotalWeights(): Int — 返回所有基因的总权重getEntityTypeString(): String — 返回EntityType的字符串IDgetWeight(gene): Int — 返回特定基因的权重setWeight(gene, weight)— 设置特定基因的权重remove(gene)— 从实体的可能基因中移除一个基因
getWeight、setWeight 和 remove 都可以接受 ResourceKey<Gene> 或表示基因ID的字符串。
NativeEvents.onEvent("dev.aaronhowser.mods.geneticsresequenced.event.custom.ModifyEntityGenesEvent", (event) => {if (event.entityTypeString == "minecraft:cow") {event.setWeight("geneticsresequenced:lay_egg", 999);event.remove("geneticsresequenced:milky");}});
ModifyGeneRequirementsEvent
此事件在模组检查实体是否可以拥有特定基因时触发,通常只在实体基因改变时发生。
属性:
gene— 正在被检查的ResourceKey<Gene>requirements— MutableSet<ResourceKey<Gene>>,表示拥有该基因所需的前置基因
NativeEvents.onEvent("dev.aaronhowser.mods.geneticsresequenced.event.custom.ModifyGeneRequirementsEvent", (event) => {if (event.gene == "geneticsresequenced:cringe") {event.requirements.add("geneticsresequenced:cursed")}})
添加、移除和查询基因
const $GenesData = Java.loadClass('dev.aaronhowser.mods.geneticsresequenced.attachment.GenesData')$GenesData.addGene(livingEntity, "geneticsresequenced:chatterbox")$GenesData.removeGene(livingEntity, "geneticsresequenced:lay_egg")let hasSlimyDeath = $GenesData.hasGene(livingEntity, "geneticsresequenced:slimy_death")
这里使用反射加载GenesData类,从而使用其方法。
(在Kotlin中,形如 fun Example.doSomething(int: Int) 的函数实际编译为Java中的 doSomething(Example, Int))