Shield System

Shield System

一个提供简单盾牌系统的Minecraft模组

这是一个来自 SimpleRPG Core 的独立护盾系统。

它提供了一个类似于英雄联盟的护盾系统,并拥有完整的 kubejs 支持。

描述图片

目前适配 Overflow Bars

kubejs 使用方式:

StartupEvents.registry("shield_system:shield_type", event => {
    //创建一个简单的单体护盾,永久存在
    event.create("kubejs_test_unit")
        .createSimpleUnitShield()

    //创建一个简单的护盾组,该护盾组的单体护盾永久存在
    event.create("kubejs_test_group")
        .createSimpleGroupShield()

    //创建一个持续 5 秒的护盾,属于护盾组
    event.create("kubejs_test_time")
        .createTimeLimitedShield(20 * 5)

    //创建一个在 5 秒内持续衰减的护盾,属于护盾组
    event.create("kubejs_test_decay")
        .createDecayShield(20 * 5)

//接下来是高级部分
    event.create("kubejs_custom_1")
        //添加护盾工厂
        .shieldFactory(
            //使用单体护盾构造函数为构建器提供 kjs 对象,便于管理
            () => UnitShieldBuilder.of((initAmount) => new TestShield(initAmount))
                //tick
                .tick((kubeUnitShield, living) => {
                    kubeUnitShield.getKubeObject().tick(kubeUnitShield, living)
                })
                //保存
                .save((kubeUnitShield, living) => {
                    kubeUnitShield.getKubeObject().save(kubeUnitShield, living)
                })
                //加载
                .load((kubeUnitShield, living) => {
                    kubeUnitShield.getKubeObject().load(kubeUnitShield, living)
                })
                //因为是单体护盾,所以不提供单体护盾构造函数,而是直接提供一个单体护盾。因此,使用'.create(0)'</br>//注意: 原文中的'./ create(0)'可能为笔误,此处根据上下文修正为 '.build().create(0)'
                .build().create(0)
        )

    event.create("kubejs_cunstom_2")
        .shieldFactory(
            //使用护盾组
            () =&gt; new GroupShield(
                   //使用单体护盾构造函数为构建器提供 kjs 对象,便于管理
                UnitShieldBuilder.of((initAmount) =&gt; new TestShield(initAmount))
                    .tick((kubeUnitShield, living) =&gt; {
                        kubeUnitShield.getKubeObject().tick(kubeUnitShield, living)
                    })
                    .save((kubeUnitShield, living) =&gt; {
                        kubeUnitShield.getKubeObject().save(kubeUnitShield, living)
                    })
                    .load((kubeUnitShield, living) =&gt; {
                        kubeUnitShield.getKubeObject().load(kubeUnitShield, living)
                    })
                    //因为是护盾组,没有初始护盾,所以这里提供一个单体护盾构造函数,无需 '.create(0)'
                    .build()
            )
        )
})

function TestShield(initAmount) {
    this.initAmount = initAmount
}

/**
 * @param {$KubeUnitShield_&lt;TestShield} kubeUnitShield
 * @param {$LivingEntity_} living
 */
TestShield.prototype.tick = function (kubeUnitShield, living) {
    kubeUnitShield.reduceShieldAmount(this.initAmount / 100)

}

/**
 * @param {$KubeUnitShield_&lt;TestShield} kubeUnitShield
 * @param {$LivingEntity_} living
 */
TestShield.prototype.save = function (kubeUnitShield, living) {

}

/**
 * @param {$KubeUnitShield_&lt;TestShield} kubeUnitShield
 * @param {$LivingEntity_} living
 */
TestShield.prototype.load = function (kubeUnitShield, living) {

}
/**
 * @param {$LivingEntity_} living
 */

TestShield.prototype.sendMessage = function (living) {
    living.sendSystemMessage(this.initAmount)
}

ShieldSystemEvents.RegisterShieldPriority(event =&gt; {
    //注册护盾优先级,未注册优先级的护盾将不生效
    event.addShieldType("kubejs:kubejs_test_group")
    event.addShieldType("kubejs:kubejs_test_time")
    event.addShieldType("kubejs:kubejs_test_decay")
})

API 使用方式:

EntityEvents.afterHurt(event =&gt; {
//向护盾增加护盾值时有两种情况:
//如果目标护盾是护盾组,则会根据提供的护盾值创建一个单体护盾,然后将该单体护盾添加到护盾组中
//如果目标护盾是单体护盾,则会在原护盾值的基础上直接增加护盾值
    ShieldAPI.addShieldAmount(event.entity, "kubejs:kubejs_test_decay", 80)

    //减少护盾
    ShieldAPI.reduceShieldAmount(event.entity, "kubejs:kubejs_test_decay", 40)
    //获取护盾实例
    var shieldInstance = ShieldAPI.getShieldInstance(event.entity, "kubejs:kubejs_test_decay")

})