LogoGenetics: Resequenced

KubeJS 支持

事件

虽然本模组没有直接集成KubeJS,但自己实现它相对简单!

GeneChangeEvent

有两个GeneChangeEvent:Pre和Post。

Pre在实体基因改变之前触发,可以被取消。Post在之后触发,不可取消。

两者都有以下属性:

  • entity — 基因正在变化的LivingEntity
  • geneHolder — 正在被添加或移除的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 — 正在被修改的EntityType
  • geneWeights — MutableMap<ResourceKey<Gene>, Double>,表示实体的基因权重
    • 在KubeJS中以JS对象表示,无法直接修改

方法:

  • getTotalWeights(): Int — 返回所有基因的总权重
  • getEntityTypeString(): String — 返回EntityType的字符串ID
  • getWeight(gene): Int — 返回特定基因的权重
  • setWeight(gene, weight) — 设置特定基因的权重
  • remove(gene) — 从实体的可能基因中移除一个基因

getWeightsetWeightremove 都可以接受 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)