营养工具提示

基本信息

属性 值
事件 net.minecraftforge.event.entity.player.ItemTooltipEvent
触发类 ca.wescook.nutrition.events.EventTooltip
触发开关 NutritionConfig.gui.enableTooltips = true(默认)
所需重启 RequiresMcRestart

功能

在任意食物的 tooltip 末尾追加一行 Nutrients: <nutrient list> (<calc>%),告诉玩家该食物含有哪些 Nutrient 以及按当前配置能获得多少营养值。

实现

@SubscribeEvent
public void tooltipEvent(ItemTooltipEvent event) {
    ItemStack itemStack = event.itemStack;
    String tooltip = null;

    // Get out if not a food item
    if (!AppleCoreAPI.accessor.isFood(itemStack)) return;

    // Create readable list of nutrients
    StringJoiner stringJoiner = new StringJoiner(", ");
    List<Nutrient> foundNutrients = NutrientUtils.getFoodNutrients(itemStack);
    for (Nutrient nutrient : foundNutrients)
        if (nutrient.visible) stringJoiner.add(I18n.format("nutrient." + "nutrition" + ":" + nutrient.name));
    String nutrientString = stringJoiner.toString();

    float nutritionValue;
    if (event.entityPlayer != null) {
        FoodValues foodValues = AppleCoreAPI.accessor.getFoodValuesForPlayer(itemStack, event.entityPlayer);
        nutritionValue = NutrientUtils.calculateNutrition(foodValues, foundNutrients);
    } else {
        nutritionValue = NutrientUtils.getNutrientValue(1, foundNutrients.size());
    }

    if (!nutrientString.equals("")) {
        tooltip = I18n.format("tooltip." + "nutrition" + ":nutrients") + " "
            + EnumChatFormatting.DARK_GREEN
            + nutrientString
            + EnumChatFormatting.DARK_AQUA
            + " ("
            + String.format("%.1f", nutritionValue)
            + "%)";
    }

    if (tooltip != null) event.toolTip.add(tooltip);
}

行为

  • 非食物 → 直接 return
  • 食物没匹配任何 Nutrient → nutrientString 为空,不追加 tooltip 行
  • 食物匹配 Nutrient 但所有 Nutrient 都 visible=false → 同上,不显示
  • 使用 String.format("%.1f", nutritionValue) 保留 1 位小数

数值来源差异

event.entityPlayer 数据源
非 null AppleCoreAPI.accessor.getFoodValuesForPlayer(itemStack, player) —— 考虑玩家个体 FoodValues(如饥饿修饰、Talisman of Nourishment 等)
null NutrientUtils.getNutrientValue(1, foundNutrients.size()) —— 用 hunger=1 占位,仅显示 Nutrient 数量

输出样式

Nutrients: <DARK_GREEN>Dairy, Fruit, Grain<DARK_AQUA> (4.5%)
  • DARK_GREEN:营养组名字段
  • DARK_AQUA:百分比字段
  • 本地化 key:tooltip.nutrition:nutrients(前置提示文本)+ nutrient.nutrition:<name>(每个营养组)

相关条目