从 AttributePlus 迁移
如果你之前使用 AttributePlus 插件,将脚本属性迁移到 CraneAttribute 只需修改少量内容。本文以 JavaScript 为例说明。
属性类型对照
| AttributePlus | CraneAttribute | 说明 |
|---|---|---|
ATTACK | ATTACK_AND_DEFENSE | 攻击和防御合并为同一类型 |
DEFENSE | ATTACK_AND_DEFENSE | 同上,在方法中区分攻防 |
UPDATE | UPDATE_AFTER | 属性更新后触发 |
RUNTIME | RUNTIME_AFTER | 周期性触发 |
KILL | PLAYER_KILL_ENTITY | 击杀触发 |
| 无对应 | ACCIDENTAL_DAMAGED | 新增:意外受伤 |
| 无对应 | REGAIN_HEALTH | 新增:生命恢复 |
| 无对应 | DEFAULT | 新增:纯数值属性 |
变量与函数名对照
基础声明
JavaScript
// AttributePlus(旧)
var priority = 1
var combatPower = 1.0
var attributeName = "测试脚本属性"
var attributeType = "ATTACK"
var placeholder = "testAttribute"
// ↓ 改为 ↓
// CraneAttribute(新)
var priority = 1
var power = 1.0 // 原名 combatPower
var name = "测试脚本属性" // 原名 attributeName
var type = "ATTACK_AND_DEFENSE" // 原名 attributeType
var id = "TEST_ATTRIBUTE" // 新增:唯一ID,全大写+下划线
var max = -1.0 // 新增:最大值限制生命周期函数
JavaScript
// AttributePlus(旧)
function onLoad(attr) {
// 初始化代码
return attr // 必须返回 attr
}
// ↓ 改为 ↓
// CraneAttribute(新)
function init(attr) {
// 初始化代码
// 不需要返回任何东西
}
// 新增:启用函数
function onEnable(attr) {
// 属性加载时运行
}
// 新增:禁用函数(卸载/重载时会调用)
function onDisable(attr) {
// 清理资源
}攻击/防御处理函数
JavaScript
// AttributePlus(旧)——攻击和防御是分开的两个函数
function runAttack(attr, attacker, entity, handle) {
// 攻击逻辑
return true
}
function runDefense(attr, killer, entity, handle) {
// 防御逻辑
return true
}
// ↓ 改为 ↓
// CraneAttribute(新)——攻击和防御合并为一个函数
function onAttackAndDefense(attr, attacker, entity, handler) {
// 通过参数位置区分:
// attacker = 攻击方
// entity = 被攻击方(防御方)
return true
}ATTACK 和 DEFENSE 合并意味着如果你之前有单独的「攻击时造成伤害」和「防御时减免伤害」两个脚本属性,现在它们都是在 onAttackAndDefense 中处理,通过 attacker 和 entity 参数区分攻防双方。
UPDATE 处理函数
JavaScript
// AttributePlus(旧)
function run(attr, entity, handle) {
return true
}
// ↓ 改为 ↓
// CraneAttribute(新)
function onUpdateAfter(attr, entity, handler) {
return true
}RUNTIME 处理函数
JavaScript
// AttributePlus(旧)
function run(attr, entity, handle) {
return true
}
// ↓ 改为 ↓
// CraneAttribute(新)
function onRuntimeAfter(attr, entity, handler) {
return true
}KILL 处理函数
JavaScript
// AttributePlus(旧)
function runKiller(attr, killer, entity, handle) {
return true
}
// ↓ 改为 ↓
// CraneAttribute(新)
function onPlayerKillEntity(attr, killer, entity, handler) {
return true
}API 调用方式变化
在 AttributePlus 中,大部分操作通过 attr 对象调用:
JavaScript
// AttributePlus(旧)
var value = attr.getRandomValue(entity, "属性名", handle)
attr.addDamage(attacker, 10.0, handle)在 CraneAttribute 中,改为通过 handler 对象调用:
JavaScript
// CraneAttribute(新)
var value = handler.getRandomValue(entity, "属性名")
handler.addDamage(attacker, 10.0)完整迁移示例
迁移前(AttributePlus):
JavaScript
var priority = 1
var combatPower = 1.0
var attributeName = "物理攻击"
var attributeType = "ATTACK"
var placeholder = "physicalAttack"
function onLoad(attr) {
return attr
}
function runAttack(attr, attacker, entity, handle) {
var attack = attr.getRandomValue(attacker, "物理攻击", handle)
var armor = attr.getRandomValue(entity, "物理护甲", handle)
var damage = attack - armor
if (damage > 0) {
attr.addDamage(attacker, damage, handle)
attacker.sendMessage("造成 " + damage.toFixed(2) + " 点伤害")
}
return true
}迁移后(CraneAttribute):
JavaScript
var type = "ATTACK_AND_DEFENSE"
var id = "PHYSICAL_ATTACK"
var name = "物理攻击"
var priority = 1
var power = 1.0
var max = -1.0
function init(attr) {
AttributeAPI.registerDefaultAttribute("PHYSICAL_ARMOR", "物理护甲", 0.0, -1.0)
}
function onAttackAndDefense(attr, attacker, entity, handler) {
var attack = handler.getRandomValue(attacker, "物理攻击")
var armor = handler.getRandomValue(entity, "物理护甲")
var damage = attack - armor
if (damage > 0) {
handler.addDamage(attacker, damage)
attacker.sendMessage("造成 " + damage.toFixed(2) + " 点伤害")
}
return true
}主要变化总结
| 变化 | 说明 |
|---|---|
移除 placeholder | 属性 ID 即变量名 |
新增 id | 全大写+下划线,作为唯一标识和 PlaceholderAPI 变量名 |
新增 max | 限制面板最大生效值,-1 为不限制 |
| 函数重命名 | runXxx → onXxx,参数名 handle → handler |
| 合并攻防 | ATTACK + DEFENSE → ATTACK_AND_DEFENSE |
| 操作入口变化 | attr.xxx() → handler.xxx() |
| 新增生命周期 | init(原 onLoad)、onEnable、onDisable |
| 注册子属性 | 需在 init 中显式调用 registerDefaultAttribute |
Groovy 用户
如果你在 AttributePlus 中使用的是 Groovy(通过 APMM 等方式),迁移到 CraneAttribute 的 Groovy 脚本基本不需要改语法,只需要调整 API 调用方式(attr.xxx → handler.xxx)和方法名。详见各属性类型教程中的 Groovy 示例。
