Skip to content

生物基础属性

所有生物都默认拥有一些属性,可自行修改

考虑到可能不是所有人都有 Groovy 的开发能力,所以特此说明

实体默认属性

在前篇 系统属性 中说到 attributes\update 下有一个名为 实体默认属性.groovy 的脚本文件,它负责管理实体默认拥有的基础属性集合

实体默认属性.groovy 的脚本中,我们可以看到这些代码,生物身上默认就有的属性,就是在这里配置的,可自行修改或删除

Groovy
if (entity.getType() == EntityType.PLAYER) {
    // 玩家默认属性
    double power = AttributeName.HEALTH.power * AttributeOptions.INSTANCE.healthBaseValue
    // 为什么会额外添加一个 AttributeName.ATTRIBUTE_POWER.name + ":" + power 属性呢?
    // 因为原版自带的生命值(attribute.yml 中 options 下 health 下 base value)不提供生命值这个属性的战斗力
    // 会导致,战斗力看上去缺少一些,所以我们手动添加战斗力来弥补
    FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
            AttributeName.ATTRIBUTE_POWER.name + ":" + power,
            AttributeName.HEALTH.name + ":80",
            AttributeName.HIT_CHANCE.name + ":100",
            AttributeName.CRIT_MULTIPLIER.name + ":100"
    ), -1)
    data.addAttributeSource(source)
} else {
    // 非玩家默认属性
    FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
            AttributeName.HIT_CHANCE.name + ":100",
            AttributeName.CRIT_MULTIPLIER.name + ":100"
    ), -1)
    data.addAttributeSource(source)
}

提示

// 后面的字是注释,不会在代码中生效,就像 YAML 中的 # 一样

修改默认属性

修改生物默认属性主要是在以下代码中

Groovy
// 玩家属性
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    AttributeName.ATTRIBUTE_POWER.name + ":" + power,
    AttributeName.HEALTH.name + ":80",
    AttributeName.HIT_CHANCE.name + ":100",
    AttributeName.CRIT_MULTIPLIER.name + ":100"
), -1)

// 非玩家属性
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    AttributeName.HIT_CHANCE.name + ":100",
    AttributeName.CRIT_MULTIPLIER.name + ":100"
), -1)

可以看到,相同部分如下

Groovy
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    //
), -1)

所以我们只需要修改,从 ...., Arrays.asList( 开始,到 ), -1) 结束的中间部分,也就是上面代码中 // 的部分,下面是示例

Groovy
// 一个属性
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    "一个属性:100"
), -1)

// 两个属性,使用英文逗号 , 分割参数
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    "一个属性:100",
    "两个属性:100"
), -1)

// 使用 AttributeName ,不知道 AttributeName 是什么的话,请看前篇 [系统属性]
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    AttributeName.HIT_CHANCE.name + ":100"
), -1)

// 无属性
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(), -1)

提示

  • 属性源使用的是 FormatListAttributeSource 须按照 属性名:属性值属性名:最小值-最大值(注意是英文符号 : -)的格式
  • 多个属性必须使用 , 分割,比如 "一个属性:100", "两个属性:100",换不换行取决于你的习惯,格式正确即可
  • Groovy 中最后一个参数后可以加 ,,比如"一个属性:100", "两个属性:100",

以下为错误示范

Groovy
// 没有 "" 包裹,错误
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    一个属性:100
), -1)

// "" 没有包裹全,也没有拼接字符串,错误
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    "一个属性:"100
), -1)

// "" 胡乱包裹,且不拼接,错误
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    "一个属性:""100"
), -1)

// 没有 : ,格式不对,错误
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    "一个属性100"
), -1)

// 没有 , 分割参数,错误
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    "一个属性:100"
    "两个属性:100"
), -1)

// 不解析 PlaceholderAPI 变量,直接塞进去,错误
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    "一个属性:%player_level%"
), -1)

// 数值不是数值或范围值,错误
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    "一个属性:abc"
), -1)

// 把持续时间改了,这样属性过一会就没了,错误
FormatListAttributeSource source = new FormatListAttributeSource(AttributeName.ENTITY_ATTRIBUTE.name, Arrays.asList(
    // 正确的属性
), 100)