跳到主要内容

MxtElements:元素与附着

元素与附着是两件事:list/has 读的是灵根(这个身体是什么),amount/attach 读写的是一张按元素记数的附着表(这个身体攒了多少)。四个方法都在同一个对象上,但读的是两份不同的状态。

方法​

方法参数返回值说明
list(entity)EntityList<String>该实体当前生效的灵根所指的元素 ID,按 ID 排序。关闭的灵根不算,没有灵根则为空列表。
has(entity, element)Entity、元素 IDboolean该实体的灵根是否指向这个元素。
amount(entity, element)Entity、元素 IDdouble这个元素在该实体身上的附着量;没有则为 0,元素不存在也返回 0。客户端读同步过来的副本。
attach(entity, element, amount)Entity、元素 ID、有限数值double走与打击同一条管线给实体加上(负数则扣掉)该元素的附着,返回新的附着量。攒够时 element_reaction 照常触发。

attach 与实体行为 mxt:attach_element 等价,因此"泡在岩浆里""服丹""诅咒持续喂火"这类来源用脚本写也一样;负数可以用来净化。三个读方法两侧都能用(附着表是同步过来的附件,客户端脚本读的是本地副本,物品悬浮提示那类逻辑正是这么用的);只有 attach 是服务端操作,客户端、未知的元素、非有限值、0 一律返回 0 且不改动任何东西。

// kubejs/server_scripts/mxt_element.js
PlayerEvents.tick(event => {
const player = event.player
if (player.level().isClientSide()) return
// "身上有水灵根、且火气攒到 8 了" —— 反应还没触发就能先看到苗头。
if (MxtElements.has(player, 'mxt_test:water') && MxtElements.amount(player, 'mxt_test:fire') >= 8) {
console.info(`water cultivator carrying ${MxtElements.list(player)}`)
}
})

// 让一次自定义事件给目标攒火气;攒够时数据包里的 element_reaction 会自己结算。
MxtElements.attach(target, 'mxt_test:fire', 4)

相关​