本篇教程的视频

本篇教程的源代码

GitHub地址:TutorialMod-Tooltips-1.20.1

本篇教程目标

  • 理解原版一些物品的提示信息添加方法
  • 学会为模组的物品、方块等添加提示信息

查看源代码

工具信息呢,也可以称为提示信息

像我们之前写的那些工具,当鼠标悬停在那些物品上的时候,会有在主手时...的一些提示信息,这也就是我们今天来学习的Tooltip

当然,工具信息并不是工具类独有的,任何物品都可以添加,方块亦可

另外结合别的方法,你也可以实现像机械动力那样的,按住某个键开始思索

这里我们先来看看原版的那些工具信息是怎么添加的,这里我们以山羊角为例,找到GoatHornItem

1
2
3
4
5
6
7
8
9
@Override
public void appendTooltip(ItemStack stack, @Nullable World world, List<Text> tooltip, TooltipContext context) {
super.appendTooltip(stack, world, tooltip, context);
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方法,这个方法就是用来添加提示信息

山羊角在游戏中是可以拿来吹的,不同的山羊角吹出的声音也是不一样的,而它能够吹出的声音是有工具信息来提示的

那么在这里,我们要看的其实就tooltip.add这个方法

上面的这一串呢,其实是就是按照不同山羊角对应的不同声音来添加不同的提示信息

tooltip.add方法接受的是一个MutableText类型的参数

Text.translatable是我们之前写物品栏的时候也接触过的一个方法,这个就是提供翻译键

add方法里面的formatted方法呢,就是用来设置提示信息的颜色的

那么,原版的工具类的话,它的提示信息添加方法或许有点麻烦,它是在ItemStack这个类中添加的

添加工具信息

那么接下来我们就来为我们之前写的物品添加提示信息

我们来到PickaxeAxeItem这个类,然后重写appendTooltip方法

1
2
3
4
5
@Override
public void appendTooltip(ItemStack stack, @Nullable World world, List<Text> tooltip, TooltipContext context) {
super.appendTooltip(stack, world, tooltip, context);
tooltip.add(Text.translatable("tooltip.tutorial.pickaxe_axe"));
}

简单一点就像这样直接加就可以了,然后到语言文件里去翻译这个翻译键即可

不过,我们可以变得稍微复杂一点,比如实现很多模组中有的按住Shift获取更多信息

那么问题来了,如何判断玩家是否按下了SHIFT

其实原版的Screen类已经定义好了一个方法hasShiftDown,它就是用来判断SHIFT键是否被按下

1
2
3
4
5
6
7
8
9
@Override
public void appendTooltip(ItemStack stack, @Nullable World world, List<Text> tooltip, TooltipContext context) {
super.appendTooltip(stack, world, tooltip, context);
if (Screen.hasShiftDown()) {
tooltip.add(Text.translatable("tooltip.tutorial.pickaxe_axe.shift"));
} else {
tooltip.add(Text.translatable("tooltip.tutorial.pickaxe_axe"));
}
}

为了与不按下SHIFT的提示信息区分开来,我们在字符串的末尾添加了一个.shift

语言文件

1
2
translationBuilder.add("tooltip.tutorial.pickaxe_axe.shift", "This is a item that can be used as a pickaxe and an axe");
translationBuilder.add("tooltip.tutorial.pickaxe_axe", "Hold SHIFT for more info!");

同样的,简单一点就是像这样直接写翻译键对应的信息就好了

但是,我们也可以利用格式化代码来添加一些特殊的形式,比如我们想让SHIFT突出强调

格式化代码又称为颜色代码,如果写过数据包的同学,或许知道这个东西

这里我们先到Wiki上来看看格式化代码,Wiki

我们要使用分节符§来为某些字符来格式化文本颜色代码格式代码也在Wiki上给出了

不过,分节符如果不通过复制得到的话,是有点难打的,我们可以拿/u00A7代替分节符,a和A都可以

Wiki界面往下翻,我们可以看到一个编辑器,在这个编辑器里我们可以直接输入编辑我们想要编辑的文本

比如我们将SHIFT输入,然后让它变成金色加粗斜体下划线都给它加上

输出栏中,我们就得到了这么一段

1
§6§n§l§oSHIFT§r§r§r§r

然后在语言文件中替换一下就可以了

1
2
translationBuilder.add("tooltip.tutorial.pickaxe_axe.shift", "This is a item that can be used as a pickaxe and an axe");
translationBuilder.add("tooltip.tutorial.pickaxe_axe", "Hold §6§n§l§oSHIFT§r§r§r§r for more info!");

测试

那么跑个数据生成,随后我们进入游戏,当鼠标悬停在这个物品上面的时候,我们看到SHIFT是金色的,同时加粗、带下划线、斜体

接下去按住SHIFT,我们就能看到这个物品的详细信息