本篇教程的视频

本篇教程的源代码

GitHub地址:TutorialMod-Tooltip-1.21

介绍

Tooltip是一种附加在物品或者方块上的提示信息,比如说在游戏中各个工具的攻击速度、攻击伤害等等,再如音乐唱片的信息、山羊角的信息等等,这些都属于工具信息

具体可见Wiki

编写Tooltip

查看源代码

在游戏中,我们其实不太好找关于Tooltip的源代码

原版工具(斧、镐等等)中的这些信息是在ItemStack类中的appendAttributeModifierTooltip方法中添加的,其逻辑还得理解理解才能搞明白

这里的话我们来找山羊角GoatHornItem的源代码,这个物品的信息是在GoatHornItem类中的appendTooltip方法中添加的

1
2
3
4
5
6
7
8
9
@Override
public void appendTooltip(ItemStack stack, Item.TooltipContext context, List<Text> tooltip, TooltipType type) {
super.appendTooltip(stack, context, tooltip, type);
Optional<RegistryKey<Instrument>> optional = this.getInstrument(stack).flatMap(RegistryEntry::getKey);
if (optional.isPresent()) {
MutableText mutableText = Text.translatable(Util.createTranslationKey("instrument", ((RegistryKey)optional.get()).getValue()));
tooltip.add(mutableText.formatted(Formatting.GRAY));
}
}

重写appendTooltip方法,这个方法是Item类中的方法

杂七杂八的不用看,其核心就在这里,tooltip.add(mutableText.formatted(Formatting.GRAY));,这里就是添加信息的地方

mutableText是一个MutableText对象,实质就是一串文本

Text.translatable方法创建一个可以被语言文件翻译的文本,后面的那个参数就是语言文件中的key(山羊角虽然很多个,但实例化的类是同一个,后面的代码是根据不同的注册值返回不同的提示信息)

另外我们可以通过formatted方法来设置文本的格式,比如说颜色、粗体等等,后面也可以直接在语言文件中使用颜色代码来写

编写Tooltip

这里我们以Prospector为例,我们在Prospector类中重写appendTooltip方法

1
2
3
4
5
6
7
8
9
@Override
public void appendTooltip(ItemStack stack, TooltipContext context, List<Text> tooltip, TooltipType type) {
super.appendTooltip(stack, context, tooltip, type);
if (Screen.hasShiftDown()) {
tooltip.add(Text.translatable("item.tutorialmod.prospector.shift_tooltip"));
} else {
tooltip.add(Text.translatable("item.tutorialmod.prospector.tooltip"));
}
}

这里我们添加了两个提示信息,一个是item.tutorialmod.prospector.shift_tooltip,一个是item.tutorialmod.prospector.tooltip

如果说你的物品和山羊角一样,可以仿照山羊角的写法,这里我们就写最简单的

上面一个是按下Shift时的提示信息,下面一个是未按下Shift时的提示信息

这个写法也是在很多模组里面常见的

翻译Tooltip

这里我们还是用DataGen来生成语言文件

1
2
translationBuilder.add("item.tutorialmod.prospector.shift_tooltip", "A tool used to find ores.");
translationBuilder.add("item.tutorialmod.prospector.tooltip", "Hold \u00A76SHIFT\u00A7r for more information.");

一个键对应一个值,这里的键就是上面的item.tutorialmod.prospector.shift_tooltipitem.tutorialmod.prospector.tooltip

值是实际你要展示的文本

这里的\u00A76是格式化代码,又称颜色代码。其中\u00A7是转义字符,即§(分节符),后面的6是颜色代码,这里是金黄色,具体颜色代码

而后,\u00A7r是重置颜色代码,即将颜色重置为白色,因为我们这里只设置了SHIFT的颜色

格式化数据及详细的颜色代码见Wiki

这里生成语言文件的时候,\u00A7会被转义为§,所以不用担心,也就是说最后长这样

1
2
3
4
{
"item.tutorialmod.prospector.shift_tooltip": "A tool used to find ores.",
"item.tutorialmod.prospector.tooltip": "Hold §6SHIFT§r for more information."
}

测试

最后我们就可以在游戏中看到我们的提示信息了,不按Shift键就可以看到Hold SHIFT for more information.的提示信息(其中SHIFT是金黄色的),按下Shift键就可以看到A tool used to find ores.的提示信息

物品可以,方块也是可以的,其要重写的方法是一样的,这里就不再赘述了