Skip to content

从 AttributePlus 迁移

如果你之前使用 AttributePlus 插件,将脚本属性迁移到 CraneAttribute 只需修改少量内容。本文以 JavaScript 为例说明。

属性类型对照

AttributePlusCraneAttribute说明
ATTACKATTACK_AND_DEFENSE攻击和防御合并为同一类型
DEFENSEATTACK_AND_DEFENSE同上,在方法中区分攻防
UPDATEUPDATE_AFTER属性更新后触发
RUNTIMERUNTIME_AFTER周期性触发
KILLPLAYER_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 中处理,通过 attackerentity 参数区分攻防双方。

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 为不限制
函数重命名runXxxonXxx,参数名 handlehandler
合并攻防ATTACK + DEFENSE → ATTACK_AND_DEFENSE
操作入口变化attr.xxx()handler.xxx()
新增生命周期init(原 onLoad)、onEnableonDisable
注册子属性需在 init 中显式调用 registerDefaultAttribute

Groovy 用户

如果你在 AttributePlus 中使用的是 Groovy(通过 APMM 等方式),迁移到 CraneAttribute 的 Groovy 脚本基本不需要改语法,只需要调整 API 调用方式(attr.xxxhandler.xxx)和方法名。详见各属性类型教程中的 Groovy 示例。