Example

示例

该示例已过时,实际开发请以导入依赖库显示为主,只有少部分方法更改,其他内容依旧可以参考当前示例。

属性说明

需求: 几率触发一次无法被 物理防御 护甲防御 所抵消的溟灭伤害,同时要求被攻击对象不为玩家才会触发 这样子的属性,我们至少需要注册 2 个新属性,它们分别为 溟灭几率(ATTACK) 溟灭伤害(OTHER)

属性类型列表 为什么 溟灭伤害 OTHER 类型呢? 因为主要触发是 溟灭几率 属性,而 溟灭伤害 只是提供伤害数值

代码

以下代码使用 Kotlin 语言,在看之前请先阅读 属性名

/* 属性默认名 */
const val TEST = "溟灭几率"
const val TEST_DAMAGE = "溟灭伤害"
const val TEST_DEFENSE = "溟灭防御"
@AutoRegister
class TestAttribute : SubAttribute(12, 5.0, TEST, AttributeType.ATTACK, "test") {

    override fun runAttack(attacker: LivingEntity, entity: LivingEntity): Boolean {
        //获取攻击者的 溟灭几率 属性值
        val chance = attacker.getRandomValue().toDouble()
        return chance.chance().apply {
            if (this){
                //获取攻击者的 溟灭伤害 属性值
                val damage = attacker.getRandomValue(TEST_DAMAGE).toDouble()

                //增加此次攻击者的伤害
                attacker.addDamage(damage)
            }
        }
    }

    @AutoRegister
    class TestDamageAttribute : SubAttribute(-1, 1.0, TEST_DAMAGE, AttributeType.OTHER, "test_damage")
}

这样子就简简单单的完成了一个属性,什么? 你想要再加个 溟灭防御 属性? 那很简单,这里 溟灭防御 也应该是个 OTHER 类属性,看下面代码

@AutoRegister
class TestAttribute : SubAttribute(12, 5.0, TEST, AttributeType.ATTACK, "test") {

    override fun runAttack(attacker: LivingEntity, entity: LivingEntity): Boolean {
        //获取攻击者的 溟灭几率 属性值
        val chance = attacker.getRandomValue().toDouble()
        return chance.chance().apply {
            if (this){
                //获取攻击者的 溟灭伤害 属性值
                var damage = attacker.getRandomValue(TEST_DAMAGE).toDouble()
                
                //获取被攻击者的 溟灭防御 属性值
                damage -= entity.getRandomValue(TEST_DEFENSE).toDouble()

                //增加此次攻击者的伤害
                attacker.addDamage(damage)
            }
        }
    }

    @AutoRegister
    class TestDamageAttribute : SubAttribute(-1, 1.0, TEST_DAMAGE, AttributeType.OTHER, "test_damage")

    @AutoRegister
    class TestDefenseAttribute : SubAttribute(-1, 1.0, TEST_DEFENSE, AttributeType.OTHER, "test_defense")
}

是不是很简单,什么? 你还行要给溟灭属性加个 提示消息

override fun onLoad(): SubAttribute {

    //每次调用 getRandomValue() 时,都会自动临时储存属性值,再通过 {变量名} 显示
    arrayListOf(
        /*攻击者*/    
        "溟灭! 你对对方造成 {test_damage} 点溟灭伤害",
        /*被攻击者*/    
        "溟灭! 对方对你造成 {test_damage} 点溟灭伤害,你抵消 {test_defense} 点溟灭伤害"
    ).setMessages()
    
    return this
}

什么?你想让 被攻击者 直接显示 最终所受到的溟灭伤害

override fun onLoad(): SubAttribute {
    //每次调用 getRandomValue() 时,都会自动临时储存属性值,再通过 {变量名} 显示
    arrayListOf(
        /*攻击者*/    
        "溟灭! 你对对方造成 {test_damage} 点溟灭伤害",
        /*被攻击者*/    
        "溟灭! 对方对你造成 {test_defense} 点溟灭伤害"
    ).setMessages()
    
    return this
}

override fun runAttack(attacker: LivingEntity, entity: LivingEntity): Boolean {
    //获取攻击者的 溟灭几率 属性值
    val chance = attacker.getRandomValue().toDouble()
    return chance.chance().apply {
        if (this){
            //获取攻击者的 溟灭伤害 属性值
            var damage = attacker.getRandomValue(TEST_DAMAGE).toDouble()
            //获取被攻击者的 溟灭防御 属性值
            damage -= entity.getRandomValue(TEST_DEFENSE).toDouble()

            //储存数据值,因为上方已经调用了 entity.getRandomValue(TEST_DEFENSE).toDouble() 方法
            //所以这里我们要初始化一下值
            ("test_defense" to damage).storageValue(true)
            
            //增加此次攻击者的伤害
            attacker.addDamage(damage)
        }
    }
}

你还想要支持自定义公式

//属性注册后会在 attribute.yml 配置生成对应的配置节点

override fun onLoad(): SubAttribute {
    //每次调用 getRandomValue() 时,都会自动临时储存属性值,再通过 {变量名} 显示
    arrayListOf(
        /*攻击者*/
        "溟灭! 你对对方造成 {test_damage} 点溟灭伤害",
        /*被攻击者*/
        "溟灭! 对方对你造成 {test_defense} 点溟灭伤害"
    ).setMessages()

    //设置默认的属性公式
    "{entityA:溟灭伤害}+({entityB:生命力}*0.5)".setFormula()
    return this
}

override fun runAttack(attacker: LivingEntity, entity: LivingEntity): Boolean {
    //获取攻击者的 溟灭几率 属性值
    val chance = attacker.getRandomValue().toDouble()
    return chance.chance().apply {
        if (this){
            //获取公式计算后的值
            var damage = getFormulaValue {
                //这里面是默认公式的计算方法,由于 1.7.10 无法使用公式计算,所以会执行这里来获取计算值
                val health = entity.getRandomValue(AttributeName.HEALTH.toDefaultName()).toDouble()
                //返回值 (Kotlin 就是这么方便)
                attacker.getRandomValue(TEST_DAMAGE).toDouble()+(health * 0.5)
            }

            //获取被攻击者的 溟灭防御 属性值
            damage -= entity.getRandomValue(TEST_DEFENSE).toDouble()

            //储存数据值,因为上方已经调用了 entity.getRandomValue(TEST_DEFENSE).toDouble() 方法
            //所以这里我们要初始化一下值
            ("test_defense" to damage).storageValue(true)

            //增加此次攻击者的伤害
            attacker.addDamage(damage)
        }
    }
}

后续

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

写完属性后,当然就是注册属性了,这里请使用 @AutoRegister 注释进行自动注册,最后再插件是在plugin.yml 依赖上加 AttributePlus 这样子就完成了

最终代码

package org.serverct.ersha.attribute.sub.attack

import org.bukkit.entity.LivingEntity
import org.serverct.ersha.api.annotations.AutoRegister
import org.serverct.ersha.api.component.SubAttribute
import org.serverct.ersha.api.enums.AttributeName
import org.serverct.ersha.attribute.enums.AttributeType

const val TEST = "溟灭几率"
const val TEST_DAMAGE = "溟灭伤害"
const val TEST_DEFENSE = "溟灭防御"

@AutoRegister
//属性注册后会在 attribute.yml 配置生成对应的配置节点
class TestAttribute : SubAttribute(12, 5.0, TEST, AttributeType.ATTACK, "test") {

    override fun onLoad(): SubAttribute {
        //每次调用 getRandomValue() 时,都会自动临时储存属性值,再通过 {变量名} 显示
        arrayListOf(
            /*攻击者*/
            "溟灭! 你对对方造成 {test_damage} 点溟灭伤害",
            /*被攻击者*/
            "溟灭! 对方对你造成 {test_defense} 点溟灭伤害"
        ).setMessages()

        //设置默认的属性公式
        "{entityA:溟灭伤害}+({entityB:生命力}*0.5)".setFormula()
        return this
    }

    override fun runAttack(attacker: LivingEntity, entity: LivingEntity): Boolean {
        //获取攻击者的 溟灭几率 属性值
        val chance = attacker.getRandomValue().toDouble()
        return chance.chance().apply {
            if (this){
                //获取公式计算后的值
                var damage = getFormulaValue {
                    //这里面是默认公式的计算方法,由于 1.7.10 无法使用公式计算,所以会执行这里来获取计算值
                    val health = entity.getRandomValue(AttributeName.HEALTH.toDefaultName()).toDouble()
                    //返回值 (Kotlin 就是这么方便)
                    attacker.getRandomValue(TEST_DAMAGE).toDouble()+(health * 0.5)
                }

                //获取被攻击者的 溟灭防御 属性值
                damage -= entity.getRandomValue(TEST_DEFENSE).toDouble()

                //储存数据值,因为上方已经调用了 entity.getRandomValue(TEST_DEFENSE).toDouble() 方法
                //所以这里我们要初始化一下值
                ("test_defense" to damage).storageValue(true)

                //增加此次攻击者的伤害
                attacker.addDamage(damage)
            }
        }
    }

    @AutoRegister
    class TestDamageAttribute : SubAttribute(-1, 1.0, TEST_DAMAGE, AttributeType.OTHER, "test_damage")

    @AutoRegister
    class TestDefenseAttribute : SubAttribute(-1, 1.0, TEST_DEFENSE, AttributeType.OTHER, "test_defense")
}

最后更新于