脚本教学

属性说明

需求: 几率触发一次无法被 物理防御 护甲防御 所抵消的溟灭伤害,同时要求被攻击对象不为玩家才会触发 这样子的属性,我们至少需要注册 2 个新属性,它们分别为 溟灭几率(ATTACK) 溟灭伤害(OTHER) 属性类型列表 为什么 溟灭伤害OTHER 类型呢? 因为主要触发是 溟灭几率 属性,而 溟灭伤害 只是提供伤害数值

代码

script/ 文件夹内新建 溟灭属性.js 文件,然后先写属性的基本内容

/* 每个脚本必须先写几个变量,否则属性无法注册 */

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

/* 每个属性再注册时都会调用该方法,也可以忽略不写 */
function onLoad(attr) {
    /* 溟灭属性需要通过 溟灭伤害 来提供伤害值,所以我们得注册一个 OTHER 的 溟灭伤害 属性 */
    /* 这里注册的属性 attribute.yml 也会生成相对应的配置内容*/
    Utils.registerOtherAttribute("溟灭伤害", 1.0, "testAttributeDamage")
    
    /* 必须返回 attr */
    return attr
}

/* 因为属性是 ATTACK 类型,所以我们需要写 runAttack 方法 */
/* attacker 为攻击者,entity 为被攻击者*/
function runAttack(attr, attacker, entity, handle) {
    /* 判断是否非玩家 */
    if (!Utils.isType(entity, Arrays.asList(EntityType.PLAYER))){
        /* 前面提过 Attr 代表这个属性类的本身,所以可以用来调用 AttributeComponent 内的方法 */
        var value = attr.getRandomValue(attacker, handle)
        /* 通过 Attr 内提供的方法,决定此次属性是否触发 */
        var chance = attr.chance(value)
    
        if (chance) {
            /* 当触发时获取攻击者身上的 溟灭伤害 属性值,这次范围随机 */
            var damage = attr.getRandomValue(attacker, "溟灭伤害", handle)
            attr.addDamage(attacker, damage, handle)
        }
    }

    /* true 则会显示提示语 */
    /* false 则不会显示提示语*/
    return chance
}

以上,简单的 溟灭 属性就写好了,脚本属性也可以设置提示消息,与 Java 或 Kotlin 开发的一样,我们只需要在 onLoad() 方法内写就可以了,例如以下

function onLoad(attr) {
    Utils.registerOtherAttribute("溟灭伤害", 1.0, "testAttributeDamage")
    
    /* 调用 Attr 内的 setMessages 方法*/
    attr.setMessages(Arrays.asList(
        /*攻击者*/
        "溟灭! 你对对方造成 {testAttributeDamage} 点溟灭伤害",
        /*被攻击者*/    
        "溟灭! 对方对你造成 {testAttributeDamage} 点溟灭伤害"
    ))
    return attr
}

以上 setMessages 方法调用后就可以设置提示消息了,同时属性脚本也可以使用自定义公式的功能,具体如下

function onLoad(attr) {
    Utils.registerOtherAttribute("溟灭伤害", 1.0, "testAttributeDamage")
    
    attr.setMessages(Arrays.asList(
        /*攻击者*/
        "溟灭! 你对对方造成 {testAttributeDamage} 点溟灭伤害",
        /*被攻击者*/    
        "溟灭! 对方对你造成 {testAttributeDamage} 点溟灭伤害"
	  ))
	
	  /*
	    伤害 = 攻击者的溟灭伤害 + 被攻击者的生命力*0.5 
	    默认公式设置后 attribute.yml 也会生成对应配置节点,可在配置重复修改,这里是生成时默认公式
	  */
	  attr.setFormula("{entityA:溟灭伤害}+({entityB:生命力}*0.5)")
    return attr
}

function runAttack(attr, attacker, entity, handle) {
    if (!Utils.isType(entity, Arrays.asList(EntityType.PLAYER))){
        var value = attr.getRandomValue(attacker, handle)
        var chance = attr.chance(value)
    
        if (chance) {
            /* 将 var damage = Attr.getRandomValue(attacker, "溟灭伤害") 改为以下 */
            var damage = attr.getFormulaValue(function(){
                //这里面是默认公式的计算方法,由于 1.7.10 无法使用公式计算,所以会执行这里来获取计算值
                
                var health = attr.getRandomValue(entity, "生命力", handle)
                return attr.getRandomValue(attacker, "溟灭伤害", handle) + (health * 0.5)
            })
            attr.addDamage(attacker, damage, handle)
        }
    }
    
    return chance
}

后续

为了确保 溟灭伤害 不会被 物理防御 护甲防御 所抵消,你需要把 溟灭几率 属性的优先级调至 物理防御 护甲防御 属性 之后 这个可以由用户自行调整

最后更新于