生命恢复类属性(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)处理器能力
| 接口 | 能力 |
|---|---|
HealthTracker | addHealth, getHealth, setHealth, multiplyHealth |
AttributeTracker | getRandomValue, getAttrData, trigger |
MetadataTracker | setMeta, getMeta, hasMeta |
Cancellable | setCancelled(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
}注意事项
HealthTracker使用的是getHealth/setHealth/addHealth,与DamageTracker的getDamage/setDamage/addDamage是两套独立的系统,不要混用- 治疗分源机制与伤害分源机制类似——可以按来源(
GENERIC、自定义标签)区分治疗量 - 设置负治疗量会产生伤害效果
