Skip to content

生命恢复类属性(REGAIN_HEALTH)

概述

REGAIN_HEALTH 在实体恢复生命值时触发。这包括:

  • 自然回血(饱食度满时)
  • 药水治疗
  • 金苹果等物品治疗
  • 其他插件调用 EntityRegainHealthEvent 的治疗

需要重写的方法

Groovy
@Override
void onEnable()

/**
 * @param entity  被治疗者
 * @param handler 处理器
 * @return 属性是否触发
 */
@Override
boolean onRegainHeal(LivingEntity entity, RegainHealthHandler handler)
JavaScript
function onEnable(attr)

function onRegainHeal(attr, entity, handler)

处理器能力

接口能力
HealthTrackeraddHealth, getHealth, setHealth, multiplyHealth
AttributeTrackergetRandomValue, getAttrData, trigger
MetadataTrackersetMeta, getMeta, hasMeta
CancellablesetCancelled(true)

值得注意:这里用的是 HealthTracker(治疗追踪),而非 DamageTracker(伤害追踪)。两者的方法名类似但对象不同。

示例:治疗加成

提升所有治疗效果:

Groovy
package scripts.attributes.regain_health

import cn.org.bukkit.craneattribute.core.attribute.AttributeTypes
import cn.org.bukkit.craneattribute.core.attribute.handler.RegainHealthHandler
import groovy.transform.CompileStatic
import org.bukkit.entity.LivingEntity
import scripts.libs.GroovyAttribute

@CompileStatic
class HealBonus extends GroovyAttribute {

    HealBonus() {
        super(AttributeTypes.REGAIN_HEALTH, "heal_bonus", "治疗加成", 1, 0.0D, -1.0D)
    }

    @Override
    boolean onRegainHeal(LivingEntity entity, RegainHealthHandler handler) {
        // 获取治疗加成面板值(百分比)
        double bonus = handler.getRandomValue(entity, "治疗加成")

        if (bonus > 0) {
            // 获取当前治疗量
            double currentHeal = handler.getHealth(entity)

            // 计算加成后的治疗量
            double newHeal = currentHeal * (1 + bonus / 100)

            // 设置新的治疗量
            handler.setHealth(entity, newHeal)

            entity.sendMessage("§a治疗加成!恢复量 ${String.format("%.2f", currentHeal)} → ${String.format("%.2f", newHeal)}")
            return true
        }
        return false
    }
}

示例:治疗转为伤害(反治疗)

一个有趣的属性——将治疗效果反转:

Groovy
@CompileStatic
class AntiHeal extends GroovyAttribute {

    AntiHeal() {
        super(AttributeTypes.REGAIN_HEALTH, "anti_heal", "反治疗", 1, 0.0D, -1.0D)
    }

    @Override
    boolean onRegainHeal(LivingEntity entity, RegainHealthHandler handler) {
        double antiHealRate = handler.getRandomValue(entity, "反治疗")

        if (antiHealRate > 0) {
            double currentHeal = handler.getHealth(entity)

            // 反治疗率 >= 100% → 全部治疗转为伤害
            if (antiHealRate >= 100) {
                handler.setHealth(entity, -currentHeal) // 负治疗 = 伤害
                entity.sendMessage("§c反治疗触发!治疗转为伤害!")
                return true
            }
        }
        return false
    }
}

示例:通过脚本设置治疗量

插件自带的 饱食恢复.groovy 是更典型的使用方式——不修改原有的治疗量,而是直接设置新的治疗值:

Groovy
@CompileStatic
class SatiatedRegainHealth extends GroovyAttribute {

    SatiatedRegainHealth() {
        super(AttributeTypes.REGAIN_HEALTH, "satiated_regain_health", "饱食恢复", 1, 0.0D, -1.0D)
    }

    @Override
    boolean onRegainHeal(LivingEntity entity, RegainHealthHandler handler) {
        // 通过面板值直接设置本次恢复量
        double value = handler.getRandomValue(entity, "饱食恢复")
        handler.setHealth(entity, value)
        return true
    }
}

这种方式下,治疗量完全由面板属性决定,与饱食度等原版机制无关。

JavaScript 示例

JavaScript
var type = "REGAIN_HEALTH"
var id = "heal_bonus"
var name = "治疗加成"
var priority = 1
var power = 0.0
var max = -1.0

function onRegainHeal(attr, entity, handler) {
    var bonus = handler.getRandomValue(entity, "治疗加成")
    if (bonus > 0) {
        var currentHeal = handler.getHealth(entity)
        var newHeal = currentHeal * (1 + bonus / 100)
        handler.setHealth(entity, newHeal)
        entity.sendMessage("治疗加成!恢复量提升到 " + newHeal.toFixed(2))
        return true
    }
    return false
}

注意事项

  1. HealthTracker 使用的是 getHealth/setHealth/addHealth,与 DamageTrackergetDamage/setDamage/addDamage 是两套独立的系统,不要混用
  2. 治疗分源机制与伤害分源机制类似——可以按来源(GENERIC、自定义标签)区分治疗量
  3. 设置负治疗量会产生伤害效果