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 无效同步。