属性运行逻辑
不同类型属性的触发
我们前面说过属性分为 ATTACK
DEFENSE
RUNTIME
UPDATE
KILLER
CUSTOM
OTHER
几种类型
他们都是这么被触发的呢?我们复习一下。
属性类型 | 说明 |
---|---|
ATTACK | 对生物造成伤害时触发 |
DEFENSE | 被生物攻击时时触发 |
UPDATE | 属性更新时触发,例如切换装备 |
RUNTIME | 每隔多少秒触发一次 |
KILLER | 击杀其他生物时触发 |
CUSTOM | 不同触发器自定义的的触发方式 |
OTHER | 不会触发 |
AttributePlus会在对应属性类型应该触发的时候触发它们,比如你打了一下身边的生物,此时你触发了 ATTACK
这个行为,那个生物触发了 DEFENSE
。AttributePlus插件会将所有有效的 ATTACK
类型的属性筛选出来为按照优先级你运行,所有有效的 DEFENSE
类型的属性按照优先级为那个生物运行。
反之,如果一个生物攻击了你,那么将为你运行所有有效的 DEFENSE
类型的属性,为那个生物运行所有有效的 ATTACK
类型的属性。
但 ATTACK
和 DEFENSE
是同时在一次攻击行为中触发的,因为攻击行为中存在攻击和被攻击两种行为。
属性类型严格按照触发方式运行。
属性优先级
每个非 OTHER
类属性都有一个优先级可以配置,它是应该是一个从 0
开始的整数,属性运行的顺序会按照这个优先级的顺序升序运行,这个数字越小,运行的越早。若这个属性的优先级为 -1
则无论如何都不会被运行。
优先级的配置以 attribute.yml
中配置的为准,并非以JavaScript文件中配置的为准。若两个优先级相同,则加载时会根据加载顺序重新分配优先级,具体优先级情况可以在控制台显示(当插件重载时和加载时候都会显示)。
若你的优先级错乱,可能导致的情况如下
- 暴击但数值不对
- 吸血但数值不对
- 闪避失效
- 破甲失效
- 等一系列诡异的行为
什么是有效的属性
刚刚提到,“有效的 ATTACK
类型的属性”这个概念,什么是有效的属性呢?
你拥有这个属性就会被视为有效的属性,即属性值(变量%ap_属性%
)大于 0
。
跳过过滤
刚刚解释了什么是有效的属性,我们现在知道这个属性的属性值大于 0
才是有效的属性。那么,我想让这个属性无论如何都会生效,让它一直被视为有效的属性呢?
在 onLoad(attr)
中设置 attr.setSkipFilter(true)
,即跳过过滤,此时筛选属性时,这个属性将会跳过筛选,无论是否拥有此属性,均会生效。
function onLoad(attr) {
attr.setSkipFilter(true)
return attr
}
取消处理
在属性的执行逻辑中使用 attr.setCancelled(true)
后,会取消本次的属性处理,取消对应触发的事件。
比如我们有一个叫做 命中几率 的属性,我们想让它有几率命中,有几率无法命中,无法命中的时候不会造成任何伤害,也不执行任何属性。 我们就得在一个优先级最靠前,也就是第一个触发的属性中编写 runAttack(attr, attacker, entity, handle)
函数。
function runAttack(attr, attacker, entity, handle) {
if (!命中率判断是否命中逻辑) {
attr.setCancelled(true)
return true
}
return false
}
无视取消属性
有了取消属性,当然也有无视取消属性。
在 onLoad(attr)
中设置 attr.setIgnoreCancelled(true)
即无限取消属性。这个属性将会无视 attr.setCancelled(true)
的取消。也就是说,无论此次处理是否取消,这个属性都将可能运行(是否运行还取决于属性是否有效)。
function onLoad(attr) {
attr.setIgnoreCancelled(true)
return attr
}
异步
我们熟知,Minecraft是一款著名的“单线程游戏”。有很多事情在异步操作都非常危险,在 onLoad(attr)
中设置 attr.setAsync(false)
即可。反之则为异步。
function onLoad(attr) {
attr.setAsync(false)
return attr
}
CUSTOM 类型属性的触发器
每个 CUSTOM
类型都必须绑定一个 触发器
,否则无法生效。
function onLoad(attr) {
attr.setCustomTrigger("触发器名")
return attr
}