属性组成
每个属性都继承自SubAttribute,而SubAttribute又实现了AttributeComponent接口。
你无需关注什么是继承和实现接口。
你只需知道,我们可以使用SubAttribute和AttributeComponent中的所有方法。
脚本属性基本变量
注册属性时,必须声明以下变量才可以注册
//这里可以先随便设,最后需要去 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
这个参数本身。
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插件调用的。attr
同 onLoad
中的 attr
一样attacker
是 攻击者,它是一个 LivingEntity
对象entity
是 被攻击者,它是一个 LivingEntity
对象handle
是 属性处理器,它是一个 AttributeHandle
对象runAttack
函数必须返回一个 布尔值。如果为 true
则代表这个属性触发了,反之则代表没有触发。
function runAttack(attr, attacker, entity, handle) {
...
return true
}
DEFENSE 示例
runDefense
函数需要 attr, attacker, entity, handle
四个参数,但你无需关心它,因为这个函数是由AttributePlus插件调用的。attr
同 onLoad
中的 attr
一样entity
是 被攻击者,它是一个 LivingEntity
对象killer
是 攻击者,它是一个 LivingEntity
对象handle
是 属性处理器,它是一个 AttributeHandle
对象runAttack
函数必须返回一个 布尔值。如果为 true
则代表这个属性触发了,反之则代表没有触发。
function runDefense(attr, entity, killer, handle) {
...
return true
}
UPDATE 示例
run
函数需要 attr, entity, handle
三个参数,但你无需关心它,因为这个函数是由AttributePlus插件调用的。attr
同 onLoad
中的 attr
一样entity
是 触发者,它是一个 LivingEntity
对象handle
是 属性处理器,它是一个 AttributeHandle
对象run
函数必须返回一个 布尔值。如果为 true
则代表这个属性触发了,反之则代表没有触发。
function run(attr, entity, handle) {
...
return true
}
RUNTIME 示例
它的写法与UPDATE是相同的,只是触发方法不同
KILLER 示例
runKiller
函数需要 attr, killer, entity, handle
四个参数,但你无需关心它,因为这个函数是由AttributePlus插件调用的。attr
同 onLoad
中的 attr
一样killer
是 击杀者,它是一个 LivingEntity
对象entity
是 被击杀者,它是一个 LivingEntity
对象handle
是 属性处理器,它是一个 AttributeHandle
对象runKiller
函数必须返回一个 布尔值。如果为 true
则代表这个属性触发了,反之则代表没有触发。
function runKiller(attr, killer, entity, handle) {
...
return true
}
CUSTOM 示例
runCustom
函数需要 attr, caster, target, params, source, handle
六个参数,但你无需关心它,因为这个函数是由AttributePlus插件调用的。
此类属性必须在 onLoad
中绑定一个触发器,这个触发器由AttributePlus本身或第三方开发者提供,使用AttributeMM可以自己自定义这个触发器attr
同 onLoad
中的 attr
一样caster
是 触发者,它是一个 LivingEntity
对象target
是 被触发者,它是一个 LivingEntity
对象或 null
params
是 触发器事件传入的参数,它是一个 Object[]
,这和此类属性绑定的触发器相关source
是 触发器此次事件对象,这和此类属性绑定的触发器相关handle
是 属性处理器,它是一个 AttributeHandle
对象runCustom
函数必须返回一个 布尔值。如果为 true
则代表这个属性触发了,反之则代表没有触发。
他的完整代码应该如下
function onLoad(attr) {
attr.setCustomTrigger("触发器名")
return attr
}
function runCustom(attr, caster, target, params, source, handle) {
...
return true
}
一个完整的属性长什么样?
假设我们要写一个 ATTACK
类型的属性
//这里可以先随便设,最后需要去 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
类型的属性
//这里可以先随便设,最后需要去 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
技能攻击玩家实体