少女祈祷中...

首先我们需要一个类实现TooltipComponent接口,这个类的初始化接受我们需要渲染传递的参数,简单的,这里放上一个record类就好了

1
2
3
public record RecordDanmakuTooltip(ArrayList<Point> pointArrayList) implements TooltipComponent {

}

然后就是客户端上的渲染类,实现ClientTooltipComponent接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class ClientDanmakuTooltip implements ClientTooltipComponent {

private final ArrayList<Point> danmakuList;

public ClientDanmakuTooltip(RecordDanmakuTooltip recordDanmakuTooltip) {
this.danmakuList = recordDanmakuTooltip.pointArrayList();
}

@Override
public int getHeight() {
return 120;
}

@Override
public int getWidth(@NotNull Font font) {
return 120;
}

@Override
public void renderImage(@NotNull Font font, int pX, int pY, @NotNull GuiGraphics pGuiGraphics) {

}
}

这里前两个方法写明了该Tooltip所占的面积,在renderImage中就可以按自己的要求绘制图案了

这里Forge提供了事件,让我们注册自己的Tooltip

1
2
3
4
5
6
7
8
@Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD)
public class TooltipRegistry {
@SubscribeEvent
public static void onRegisterClientTooltip(RegisterClientTooltipComponentFactoriesEvent event) {
event.register(RecordDanmakuTooltip.class,ClientDanmakuTooltip::new);
}
}

最后,就可以在物品中覆写getTooltipImage方法来放上自己的Tooltip

1
2
3
4
5
6
7
8
@Override
public @NotNull Optional<TooltipComponent> getTooltipImage(@NotNull ItemStack itemstack) {
if (itemstack.getOrCreateTag().get("crystal_point") != null){
return Optional.of(new RecordDanmakuTooltip(pointArrayList));
}
return Optional.empty();
}