扩展属性类型
概述
如果 7 种系统属性类型无法满足你的需求,第三方插件可以注册自定义的属性类型,并提供对应的触发器和处理器。
警告
本文档面向使用第三方扩展属性类型的开发者。如果你是插件开发者想要创建新的属性类型,请参考 开发文档 - 扩展属性类型。
工作原理
第三方插件注册一个自定义属性类型后,你的属性脚本可以像使用系统类型一样使用它。区别在于:
- 系统类型的方法名是固定的(如
onAttackAndDefense、onUpdateAfter) - 扩展类型的方法名由第三方插件定义,但统一通过
onExtHandler入口调用
需要重写的方法
Groovy
@Override
void onEnable()
/**
* @param handler 第三方提供的处理器(继承自 AttributeHandler)
* @param data 由第三方插件传入的一个或多个参数(Object 数组)
* @return 属性是否触发
*/
@Override
boolean onExtHandler(AttributeHandler handler, Object... data)JavaScript
function onEnable(attr)
/**
* @param ... 由第三方插件传入的参数(数量与类型由插件作者定义)
* @param handler 第三方提供的处理器
*/
function onExtHandler(attr, ..., handler)重要: data(或 ...)参数的个数和类型完全由第三方插件的作者决定。你需要查阅该插件的文档来了解会传入什么参数。
通用扩展示例
假设你注册了一个简单的扩展类型,在某个事件发生时调用属性(比如玩家升级时触发):
Groovy
@CompileStatic
class ExtLevelUp extends GroovyAttribute {
ExtLevelUp() {
// CUSTOM_LEVEL_UP 是假设的第三方类型
super("CUSTOM_LEVEL_UP", "ext_level_up", "扩展升级奖励", 1, 0.0D, -1.0D)
}
@Override
boolean onExtHandler(AttributeHandler handler, Object... data) {
// 假设 data[0] 是玩家
if (data.length >= 1 && data[0] instanceof Player) {
Player player = data[0] as Player
double bonus = handler.getRandomValue(player, "扩展升级奖励")
if (bonus > 0) {
player.sendMessage("§6升级奖励!获得 ${String.format("%.2f", bonus)} 点属性加成")
return true
}
}
return false
}
}JavaScript 示例
JavaScript
var type = "CUSTOM_TYPE" // 第三方定义的类型名
var id = "my_ext_attr"
var name = "我的扩展属性"
var priority = 1
var power = 0.0
var max = -1.0
// onExtHandler 的参数列表由第三方插件决定
function onExtHandler(attr, arg1, arg2, handler) {
// arg1, arg2 的用途由第三方插件文档说明
var value = handler.getRandomValue(arg1, "我的扩展属性")
if (value > 0) {
arg1.sendMessage("扩展属性触发!")
return true
}
return false
}注意事项
- 一定要查阅第三方插件的文档——
data参数的个数和类型完全由作者决定 handler对象通常实现了AttributeTracker,所以可以使用getRandomValue等方法- 扩展类型的
handler可能还实现了额外的接口,具体需要查阅第三方文档 - 在 JS 中,
onExtHandler的参数列表不固定——最后一个参数永远是handler,前面的参数由第三方定义
