插件默认属性
插件提供了一些属性,供大家使用和参考
所有属性均可更改或删除,也可在 config.yml 中关闭 create system resource file 来取消创建默认文件(libs expansions attributes 都不会创建)
默认属性
attributes\attack 下
| 文件名 | 属性 | 属性类型 | 描述 |
|---|---|---|---|
| 命中几率.groovy | 命中几率 | ATTACK_AND_DEFENSE | 多少几率命中目标 |
| 命中几率.groovy | 闪避几率 | DEFAULT | 对应1:1减少命中几率 |
| 物理攻击.groovy | 物理攻击 | ATTACK_AND_DEFENSE | 攻击力 |
| 物理攻击.groovy | 物理护甲 | DEFAULT | 防御力 |
| 物理攻击.groovy | 物理穿透 | DEFAULT | 对应1:1减少防御力 |
| 物理攻击.groovy | 暴击几率 | DEFAULT | 暴击的几率 |
| 物理攻击.groovy | 暴击伤害 | DEFAULT | 暴击造成的伤害倍数 |
| 物理攻击.groovy | 暴击规避 | DEFAULT | 对应1:1减少暴击几率 |
| 物理攻击.groovy | 暴伤抵抗 | DEFAULT | 对应1:1减少暴击伤害 |
| 物理攻击.groovy | 吸血几率 | DEFAULT | 生命窃取的几率 |
| 物理攻击.groovy | 吸血倍率 | DEFAULT | 生命窃取的倍率 |
| 物理攻击.groovy | 吸血规避 | DEFAULT | 对应1:1减少吸血几率 |
| 物理攻击.groovy | 吸血抵抗 | DEFAULT | 对应1:1减少吸血倍率 |
| 减速几率.groovy | 减速几率 | ATTACK_AND_DEFENSE | 使目标受到药水减速效果 |
| 减速几率.groovy | 减速效果 | DEFAULT | 目标受到减速效果时的效果 |
| 减速几率.groovy | 减速时间 | DEFAULT | 目标受到减速效果时的时间 |
attributes\update 下
| 文件名 | 属性 | 属性类型 | 描述 |
|---|---|---|---|
| 默认属性.groovy | 默认属性 | UPDATE_AFTER | 实体默认拥有的的属性 |
| 生命值.groovy | 生命值 | UPDATE_AFTER | 实体的最大生命值 |
| 移速加成.groovy | 移速加成 | UPDATE_AFTER | 实体基础移速的加成 |
attributes\update 下
| 文件名 | 属性 | 属性类型 | 描述 |
|---|---|---|---|
| 生命恢复.groovy | 生命恢复 | RUNTIME_AFTER | 玩家每隔几秒恢复多少生命值 |
GroovyAttribute
随便打开一个文件,都可以看到它有着 ... extends GroovyAttribute 这样的内容,这是它继承了 GroovyAttribute 这个类,是位于 libs 文件夹下的一个抽象类
它额外提供了一个 GroovyAttribute(AttributeType type, AttributeName attributeName) 构造方法
点我查看代码
截止至 2025/11/29,它的代码是这样的
Groovy
package libs
import cn.org.bukkit.craneattribute.api.attribute.AttributeType
import cn.org.bukkit.craneattribute.core.attribute.Attribute
import groovy.transform.CompileStatic
@CompileStatic
abstract class GroovyAttribute extends Attribute {
GroovyAttribute(AttributeType type, AttributeName attributeName) {
this(type, attributeName.id, attributeName.name, attributeName.priority, attributeName.power, attributeName.max)
}
GroovyAttribute(AttributeType type, String id, String name, int priority, double power, double max) {
super(type, id, name, priority, power, max)
}
GroovyAttribute(String type, String id, String name, double power, double max) {
super(type, id, name, power, max)
}
}AttributeName
随便打开一个文件,都可以看到 AttributeName.xxxx 之类的东西,AttributeName 是位于 libs 文件夹下的一个枚举类
它记录了属性的 id name priority power max,这样非常便于我们管理属性
点我查看代码
截止至 2025/11/29,它的代码是这样的
Groovy
package libs
import groovy.transform.CompileStatic
@CompileStatic
enum AttributeName {
// ATTACK_AND_DEFENSE 类
HIT_CHANCE("HIT_CHANCE", "命中几率", 1, 1.0D, -1),
DOGE_CHANCE("DOGE_CHANCE", "闪避几率", -1, 1.0D, -1),
PHYSICAL_ATTACK("PHYSICAL_ATTACK", "物理攻击", 2, 1.0D, 66.66),
// MAGICAL_ATTACK("MAGICAL", "法术攻击", 3, 1.0D),
PHYSICAL_ARMOR("ARMOR", "物理护甲", -1, 1.0D, -1),
PHYSICAL_ARMOR_PENETRATION("ARMOR_PENETRATION", "物理穿透", -1, 1.0D, -1),
// MAGICAL_ARMOR("MAGICAL_ARMOR", "法术护甲", -1, 1.0D),
// MAGICAL_ARMOR_PENETRATION("MAGICAL_ARMOR_PENETRATION", "法术穿透", -1, 1.0D),
CRIT_CHANCE("CRIT_CHANCE", "暴击几率", -1, 1.0D, -1),
CRIT_MULTIPLIER("CRIT_MULTIPLIER", "暴击伤害", -1, 1.0D, -1),
CRIT_EVASION("CRIT_EVASION", "暴击规避", -1, 1.0D, -1),
CRIT_MULTIPLIER_RESISTANCE("CRIT_MULTIPLIER_RESISTANCE", "暴伤抵抗", -1, 1.0D, -1),
LIFESTEAL_CHANCE("LIFESTEAL_CHANCE", "吸血几率", -1, 1.0D, -1),
LIFESTEAL_MULTIPLIER("LIFESTEAL_MULTIPLIER", "吸血倍率", -1, 1.0D, -1),
LIFESTEAL_EVASION("LIFESTEAL_EVASION", "吸血规避", -1, 1.0D, -1),
LIFESTEAL_MULTIPLIER_RESISTANCE("LIFESTEAL_MULTIPLIER_RESISTANCE", "吸血抵抗", -1, 1.0D, -1),
SLOW_CHANCE("SLOW_CHANCE", "减速几率", 10, 1.0D, -1),
SLOW_POWER("SLOW_POWER", "减速效果", -1, 1.0D, -1),
SLOW_DURATION("SLOW_DURATION", "减速时间", -1, 1.0D, -1),
TEST_ATTRIBUTE("TEST_ATTRIBUTE", "测试脚本属性", 1, 1.0D, -1),
// UPDATE_AFTER 类
ENTITY_ATTRIBUTE("ENTITY_ATTRIBUTE", "默认属性", 2, 1.0D, -1),
HEALTH("HEALTH", "生命值", 10001, 1.0D, -1),
SPEED("SPEED", "移动速度", 10002, 1.0D, -1),
// RUNTIME_AFTER 类
HEALTH_REGEN("HEALTH_REGEN", "生命回复", 1, 1.0D, -1),
//
ATTRIBUTE_POWER("ATTRIBUTE_POWER", "战斗力", -1, 1.0D, -1)
final String id
final String name
final int priority
final double power
final double max
AttributeName(String id, String name, int priority, double power, double max) {
this.id = id
this.name = name
this.priority = priority
this.power = power
this.max = max
}
}AttributeName 的应用
以 命中几率.groovy 为例,AttributeName.HIT_CHANCE.name 就可以调用 AttributeName 这个枚举类中的 HIT_CHANCE 的 name
Groovy
package attributes.attack
import cn.org.bukkit.craneattribute.core.attribute.AttributeTypes
import cn.org.bukkit.craneattribute.core.attribute.handler.AttackAndDefenseHandler
import libs.GroovyAttribute
import libs.Utils
import groovy.transform.CompileStatic
import libs.AttributeName
import org.bukkit.entity.LivingEntity
@CompileStatic
class HitChance extends GroovyAttribute {
HitChance() {
super(AttributeTypes.ATTACK_AND_DEFENSE, AttributeName.HIT_CHANCE);
}
@Override
void onEnable() {
this.setSkipFilter(true)
Utils.registerDefaultAttribute(AttributeName.DOGE_CHANCE)
}
@Override
boolean onAttackAndDefense(LivingEntity attacker, LivingEntity entity, AttackAndDefenseHandler handler) {
double v = handler.getRandomValue(attacker, AttributeName.HIT_CHANCE.name) - handler.getRandomValue(entity, AttributeName.DOGE_CHANCE.name)
if (!Utils.chance(v)) {
handler.trigger(entity, AttributeName.DOGE_CHANCE.name)
handler.setCancelled(true)
attacker.sendMessage("§e${entity.getName()} 闪避了你的攻击!")
return false
}
return true
}
}