Skip to content

属性运行逻辑

不同类型属性的触发

我们前面说过属性分为 ATTACK DEFENSE RUNTIME UPDATE KILLER CUSTOM OTHER 几种类型
他们都是这么被触发的呢?我们复习一下。

属性类型说明
ATTACK对生物造成伤害时触发
DEFENSE被生物攻击时时触发
UPDATE属性更新时触发,例如切换装备
RUNTIME每隔多少秒触发一次
KILLER击杀其他生物时触发
CUSTOM不同触发器自定义的的触发方式
OTHER不会触发

AttributePlus会在对应属性类型应该触发的时候触发它们,比如你打了一下身边的生物,此时你触发了 ATTACK 这个行为,那个生物触发了 DEFENSE。AttributePlus插件会将所有有效的 ATTACK 类型的属性筛选出来为按照优先级你运行,所有有效的 DEFENSE 类型的属性按照优先级为那个生物运行。

反之,如果一个生物攻击了你,那么将为你运行所有有效的 DEFENSE 类型的属性,为那个生物运行所有有效的 ATTACK 类型的属性。

ATTACKDEFENSE 是同时在一次攻击行为中触发的,因为攻击行为中存在攻击和被攻击两种行为。

属性类型严格按照触发方式运行。

属性优先级

每个非 OTHER 类属性都有一个优先级可以配置,它是应该是一个从 0 开始的整数,属性运行的顺序会按照这个优先级的顺序升序运行,这个数字越小,运行的越早。若这个属性的优先级为 -1 则无论如何都不会被运行。

优先级的配置以 attribute.yml 中配置的为准,并非以JavaScript文件中配置的为准。若两个优先级相同,则加载时会根据加载顺序重新分配优先级,具体优先级情况可以在控制台显示(当插件重载时和加载时候都会显示)。

若你的优先级错乱,可能导致的情况如下

  • 暴击但数值不对
  • 吸血但数值不对
  • 闪避失效
  • 破甲失效
  • 等一系列诡异的行为

什么是有效的属性

刚刚提到,“有效的 ATTACK 类型的属性”这个概念,什么是有效的属性呢?

你拥有这个属性就会被视为有效的属性,即属性值(变量%ap_属性%)大于 0

跳过过滤

刚刚解释了什么是有效的属性,我们现在知道这个属性的属性值大于 0 才是有效的属性。那么,我想让这个属性无论如何都会生效,让它一直被视为有效的属性呢?

onLoad(attr) 中设置 attr.setSkipFilter(true),即跳过过滤,此时筛选属性时,这个属性将会跳过筛选,无论是否拥有此属性,均会生效。

JavaScript
function onLoad(attr) {
  attr.setSkipFilter(true)
  return attr
}

取消处理

在属性的执行逻辑中使用 attr.setCancelled(true) 后,会取消本次的属性处理,取消对应触发的事件。

比如我们有一个叫做 命中几率 的属性,我们想让它有几率命中,有几率无法命中,无法命中的时候不会造成任何伤害,也不执行任何属性。 我们就得在一个优先级最靠前,也就是第一个触发的属性中编写 runAttack(attr, attacker, entity, handle) 函数。

JavaScript
function runAttack(attr, attacker, entity, handle) {
    if (!命中率判断是否命中逻辑) {
        attr.setCancelled(true)
        return true
    }
    return false
}

无视取消属性

有了取消属性,当然也有无视取消属性。

onLoad(attr) 中设置 attr.setIgnoreCancelled(true) 即无限取消属性。这个属性将会无视 attr.setCancelled(true) 的取消。也就是说,无论此次处理是否取消,这个属性都将可能运行(是否运行还取决于属性是否有效)。

JavaScript
function onLoad(attr) {
  attr.setIgnoreCancelled(true)
  return attr
}

异步

我们熟知,Minecraft是一款著名的“单线程游戏”。有很多事情在异步操作都非常危险,在 onLoad(attr) 中设置 attr.setAsync(false) 即可。反之则为异步。

JavaScript
function onLoad(attr) {
  attr.setAsync(false)
  return attr
}

CUSTOM 类型属性的触发器

每个 CUSTOM 类型都必须绑定一个 触发器,否则无法生效。

JavaScript
function onLoad(attr) {
  attr.setCustomTrigger("触发器名")
  return attr
}