Skip to content

属性组成

每个属性都继承自SubAttribute,而SubAttribute又实现了AttributeComponent接口。
你无需关注什么是继承和实现接口。
你只需知道,我们可以使用SubAttribute和AttributeComponent中的所有方法。

脚本属性基本变量

注册属性时,必须声明以下变量才可以注册

JavaScript
//这里可以先随便设,最后需要去 attribute.yml 按实际情况调整优先级
var priority = 13
//默认的战斗力
var combatPower = 5.0
//默认属性名
var attributeName = "溟灭几率"
//属性类型 这里写的是字符串
var attributeType = "ATTACK"
//属性的laceholderAPI变量 (%ap_testAttribute%)
var placeholder = "testAttribute"

onLoad 函数

每个属性都可以写一个 onLoad 函数,当属性被服务器加载时会触发它。
onLoad 函数需要一个 attr 参数,但你无需关心它,因为这个函数是由AttributePlus插件调用的。
onLoad 必须返回 attr 这个参数本身。

JavaScript
function onLoad(attr) {
    return attr
}

attr 是什么?

其实就是这个属性本身,也就是他自己,也就是SubAttribute和AttributeComponent。所以我们可以使用attr.方法名调用他们中的所有方法。

方法(名)是什么?

方法可以理解为函数在Java中的称呼。方法名就对应函数名。

属性类型

属性分为 ATTACK DEFENSE RUNTIME UPDATE KILLER CUSTOM OTHER 几种类型
不同的属性类型需要编写不同函数名内的逻辑作为属性执行逻辑

属性类型说明
ATTACK攻击时触发,需要写 runAttack 函数
DEFENSE被攻击时触发,需要写 runDefense 函数
UPDATE属性更新时触发,需要写 run 函数
RUNTIME每隔多少秒触发一次,需要写 run 函数
KILLER击杀目标时触发,需要写 runKiller 函数
CUSTOM自定义属性触发器,需要写 runCustom 函数
OTHER无,该类型主要为其他类型的属性提供属性值

ATTACK 示例

runAttack 函数需要 attr, attacker, entity, handle 四个参数,但你无需关心它,因为这个函数是由AttributePlus插件调用的。
attronLoad 中的 attr 一样
attacker 是 攻击者,它是一个 LivingEntity 对象
entity 是 被攻击者,它是一个 LivingEntity 对象
handle 是 属性处理器,它是一个 AttributeHandle 对象
runAttack 函数必须返回一个 布尔值。如果为 true 则代表这个属性触发了,反之则代表没有触发。

JavaScript
function runAttack(attr, attacker, entity, handle) {
    ...
    return true
}

DEFENSE 示例

runDefense 函数需要 attr, attacker, entity, handle 四个参数,但你无需关心它,因为这个函数是由AttributePlus插件调用的。
attronLoad 中的 attr 一样
entity 是 被攻击者,它是一个 LivingEntity 对象
killer 是 攻击者,它是一个 LivingEntity 对象
handle 是 属性处理器,它是一个 AttributeHandle 对象
runAttack 函数必须返回一个 布尔值。如果为 true 则代表这个属性触发了,反之则代表没有触发。

JavaScript
function runDefense(attr, entity, killer, handle) {
    ...
    return true
}

UPDATE 示例

run 函数需要 attr, entity, handle 三个参数,但你无需关心它,因为这个函数是由AttributePlus插件调用的。
attronLoad 中的 attr 一样
entity 是 触发者,它是一个 LivingEntity 对象
handle 是 属性处理器,它是一个 AttributeHandle 对象
run 函数必须返回一个 布尔值。如果为 true 则代表这个属性触发了,反之则代表没有触发。

JavaScript
function run(attr, entity, handle) {
    ...
    return true
}

RUNTIME 示例

它的写法与UPDATE是相同的,只是触发方法不同

KILLER 示例

runKiller 函数需要 attr, killer, entity, handle 四个参数,但你无需关心它,因为这个函数是由AttributePlus插件调用的。
attronLoad 中的 attr 一样
killer 是 击杀者,它是一个 LivingEntity 对象
entity 是 被击杀者,它是一个 LivingEntity 对象
handle 是 属性处理器,它是一个 AttributeHandle 对象
runKiller 函数必须返回一个 布尔值。如果为 true 则代表这个属性触发了,反之则代表没有触发。

JavaScript
function runKiller(attr, killer, entity, handle) {
    ...
    return true
}

CUSTOM 示例

runCustom 函数需要 attr, caster, target, params, source, handle 六个参数,但你无需关心它,因为这个函数是由AttributePlus插件调用的。
此类属性必须在 onLoad 中绑定一个触发器,这个触发器由AttributePlus本身或第三方开发者提供,使用AttributeMM可以自己自定义这个触发器
attronLoad 中的 attr 一样
caster 是 触发者,它是一个 LivingEntity 对象
target 是 被触发者,它是一个 LivingEntity 对象或 null
params 是 触发器事件传入的参数,它是一个 Object[],这和此类属性绑定的触发器相关
source 是 触发器此次事件对象,这和此类属性绑定的触发器相关
handle 是 属性处理器,它是一个 AttributeHandle 对象
runCustom 函数必须返回一个 布尔值。如果为 true 则代表这个属性触发了,反之则代表没有触发。
他的完整代码应该如下

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

function runCustom(attr, caster, target, params, source, handle) {
    ...
    return true
}

一个完整的属性长什么样?

假设我们要写一个 ATTACK 类型的属性

JavaScript
//这里可以先随便设,最后需要去 attribute.yml 按实际情况调整优先级
var priority = 13
//默认的战斗力
var combatPower = 5.0
//默认属性名
var attributeName = "溟灭几率"
//属性类型 这里写的是字符串
var attributeType = "ATTACK"
//属性的laceholderAPI变量 (%ap_testAttribute%)
var placeholder = "testAttribute"

//onLoad函数,当属性被服务器加载时会触发它
function onLoad(attr) {
    return attr
}

//需要根据不同属性类型单独写的执行函数
function runAttack(attr, attacker, entity, handle) {
    ...
    return true
}

假设我们要写一个 CUSTOM 类型的属性

JavaScript
//这里可以先随便设,最后需要去 attribute.yml 按实际情况调整优先级
var priority = 100
//默认的战斗力
var combatPower = 5.0
//默认属性名
var attributeName = "溟灭几率"
//属性类型 这里写的是字符串
var attributeType = "CUSTOM"
//属性的laceholderAPI变量 (%ap_testAttribute%)
var placeholder = "testAttribute"

//onLoad函数,当属性被服务器加载时会触发它
function onLoad(attr) {
	attr.setCustomTrigger("触发器名")
    return attr
}

//需要根据不同属性类型单独写的执行函数
function runCustom(attr, caster, target, params, source, handle) {
    ...
    return true
}

我们只需要根据不同的属性类型修改对应的执行函数即可。

AttributePlus提供的触发器

以下触发器需要 SkillAPI 插件支持

SKILL CAST 技能释放
SKILL DAMAGE ENTITY 技能攻击非玩家实体
SKILL DAMAGE PLAYER 技能攻击玩家实体