Skip to content

扩展属性类型

概述

如果 7 种系统属性类型无法满足你的需求,第三方插件可以注册自定义的属性类型,并提供对应的触发器和处理器。

警告

本文档面向使用第三方扩展属性类型的开发者。如果你是插件开发者想要创建新的属性类型,请参考 开发文档 - 扩展属性类型

工作原理

第三方插件注册一个自定义属性类型后,你的属性脚本可以像使用系统类型一样使用它。区别在于:

  • 系统类型的方法名是固定的(如 onAttackAndDefenseonUpdateAfter
  • 扩展类型的方法名由第三方插件定义,但统一通过 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
}

注意事项

  1. 一定要查阅第三方插件的文档——data 参数的个数和类型完全由作者决定
  2. handler 对象通常实现了 AttributeTracker,所以可以使用 getRandomValue 等方法
  3. 扩展类型的 handler 可能还实现了额外的接口,具体需要查阅第三方文档
  4. 在 JS 中,onExtHandler 的参数列表不固定——最后一个参数永远是 handler,前面的参数由第三方定义