Witchery 吸血鬼兼容

基本信息

属性 值
事件 net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent
触发类 ca.wescook.nutrition.events.WitcheryEventHandler
依赖 Witchery mod(反射调用 com.emoniph.witchery.common.ExtendedPlayer)
默认开启 NutritionConfig.witchery.enable = true

功能

当玩家是 Witchery 吸血鬼时,每 tick 把 BloodPower(血量比例)线性映射到所有 Nutrient 的值,让吸血鬼不需要吃东西也能维持营养。

实现

@SubscribeEvent
public void livingTick(LivingUpdateEvent event) {
    if (event.entity.worldObj.isRemote) return;
    if ((event.entity instanceof EntityPlayer player)) {
        ExtendedPlayer exPlayer = (ExtendedPlayer) player.getExtendedProperties("WitcheryExtendedPlayer");
        if (exPlayer.isVampire()) {
            INutritionManager manager = NutritionManager.instance();
            Map<Nutrient, Float> newValues = new HashMap<>();

            float configMin = NutritionConfig.witchery.vampireMinNutrition;
            float configMax = NutritionConfig.witchery.vampireMaxNutrition;

            float maxNutrition = configMin + (configMax - configMin) * exPlayer.getVampireLevel() / 10;
            float nutritionValue = ((float) exPlayer.getBloodPower() / exPlayer.getMaxBloodPower()) * maxNutrition;

            for (Nutrient nutrient : NutrientList.get()) {
                if (MathHelper.abs(manager.get(player, nutrient) - nutritionValue) > 0.01f) {
                    newValues.put(nutrient, nutritionValue);
                }
            }
            manager.setAll(player, newValues);
        }
    }
}

数值映射

maxNutrition(满血时该等级的目标营养值)

maxNutrition = vampireMinNutrition + (vampireMaxNutrition - vampireMinNutrition) × vampireLevel / 10
吸血鬼等级 vampireMinNutrition=30, vampireMaxNutrition=90
1 30 + 60 × 0.1 = 36
5 30 + 60 × 0.5 = 60
10 30 + 60 × 1.0 = 90

nutritionValue(实际血量比例下当前应保持的营养值)

nutritionValue = (bloodPower / maxBloodPower) × maxNutrition

血量越满 → 营养越高。

性能优化

只有当现有值与目标值差距 > 0.01 时才更新(MathHelper.abs(...) > 0.01f),避免每 tick 无效同步。

相关条目

  • 配置文件 - witchery.enable / vampireMinNutrition / vampireMaxNutrition
  • 数据包同步 - setAll 后通过 SPacketNutrients 同步到客户端