
This is an independent shield system from SimpleRPG Core.
It provides a shield system similar to that of League of Legends and it has complete kubejs support.
for kubejs:
StartupEvents.registry("shield_system:shield_type", event => {
//Create a simple unit shield that exists permanently
event.create("kubejs_test_unit")
.createSimpleUnitShield()
//Create a simple shield group, where the unit shields of the shield group permanently exist
event.create("kubejs_test_group")
.createSimpleGroupShield()
//Create a shield that lasts for 5 seconds and belongs to the shield group
event.create("kubejs_test_time")
.createTimeLimitedShield(20 * 5)
//Create a shield that continuously decays within 5 seconds and belongs to the shield group
event.create("kubejs_test_decay")
.createDecayShield(20 * 5)
//Next is the advanced section
event.create("kubejs_custom_1")
//Add shield provider
.shieldFactory(
//Use the unit shield constructor to provide kjs objects for the builder, making it easier to manage
() => UnitShieldBuilder.of((initAmount) => new TestShield(initAmount))
//tick
.tick((kubeUnitShield, living) => {
kubeUnitShield.getKubeObject().tick(kubeUnitShield, living)
})
//save
.save((kubeUnitShield, living) => {
kubeUnitShield.getKubeObject().save(kubeUnitShield, living)
})
//load
.load((kubeUnitShield, living) => {
kubeUnitShield.getKubeObject().load(kubeUnitShield, living)
})
//Since it is a unit shield, a unit shield constructor should not be provided, but rather a unit shield should be provided directly. Therefore,. create (0)
.build().create(0)
)
event.create("kubejs_cunstom_2")
.shieldFactory(
//Use shield group
() => new GroupShield(
//Use the unit shield constructor to provide kjs objects for the builder, making it easier to manage
UnitShieldBuilder.of((initAmount) => new TestShield(initAmount))
.tick((kubeUnitShield, living) => {
kubeUnitShield.getKubeObject().tick(kubeUnitShield, living)
})
.save((kubeUnitShield, living) => {
kubeUnitShield.getKubeObject().save(kubeUnitShield, living)
})
.load((kubeUnitShield, living) => {
kubeUnitShield.getKubeObject().load(kubeUnitShield, living)
})
//Since it is a shield group, there is no initial shield, so a unit shield constructor is provided here without the need for. create (0)
.build()
)
)
})
function TestShield(initAmount) {
this.initAmount = initAmount
}
/**
* @param {$KubeUnitShield_<TestShield} kubeUnitShield
* @param {$LivingEntity_} living
*/
TestShield.prototype.tick = function (kubeUnitShield, living) {
kubeUnitShield.reduceShieldAmount(this.initAmount / 100)
}
/**
* @param {$KubeUnitShield_<TestShield} kubeUnitShield
* @param {$LivingEntity_} living
*/
TestShield.prototype.save = function (kubeUnitShield, living) {
}
/**
* @param {$KubeUnitShield_<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 => {
//Register shield priority, shields without registered priority will not take effect
event.addShieldType("kubejs:kubejs_test_group")
event.addShieldType("kubejs:kubejs_test_time")
event.addShieldType("kubejs:kubejs_test_decay")
})
for API use
EntityEvents.afterHurt(event => {
//There are two situations to add shield values to a shield:
//If the target shield is a shield group, a unit shield will be created based on the provided shield value, and then the unit shield will be added to the shield group
//If the target shield is a unit shield, the shield value will be directly increased on the basis of the original shield value
ShieldAPI.addShieldAmount(event.entity, "kubejs:kubejs_test_decay", 80)
//reduce shield
ShieldAPI.reduceShieldAmount(event.entity, "kubejs:kubejs_test_decay", 40)
//get shield instance
var shieldInstance = ShieldAPI.getShieldInstance(event.entity, "kubejs:kubejs_test_decay")
})