Java Tip API
本篇会带你用 Java API 写一个 小贴士(Tip),并把它“注册、触发、显示”完整走一遍。
如果你是整合包作者,通常更推荐先看 数据包文档 / KJS 文档;但只要你愿意写点 Java,这套 API 会更自由:你可以在任何事件、任何逻辑里决定 什么时候给谁弹什么 Tip。
你需要先理解的 3 个概念
1) TipData:最终的数据
Tip 的“真身”是 cc.sighs.auratip.data.TipData,它包含:
id:全局唯一的 id(ResourceLocation)trigger:触发类型、触发模式(一次/可重复)、冷却visual_settings:尺寸、位置、背景、动画、主题色等behavior:持续时间、关闭方式、是否允许翻页pages:页面列表(每页可以有标题/副标题/正文/图片)
你可以通过两种来源提供 TipData:
- 数据包:
data/auratip/tips/*.json(见 数据包文档) - 运行时(Java/KubeJS):用
TipBuilder组装,再放进TipRegistry
注意:Tip 的
id必须全局唯一。
2) TipRegistry:运行时 Tip 的“仓库”
cc.sighs.auratip.api.tip.TipRegistry 用来管理“运行时注册的 Tip”。
- 一个 owner(填你的
modid)对应一组 tips kubejs这个是用 Kubejs 添加的 tips 自带的 id,非必要不要用,除非你的模组叫 kubejs- 如果是数据包添加的,那 modid 就默认为
auratip
3) TipServer:在服务器端触发 / 直接显示
cc.sighs.auratip.api.tip.TipServer 是 服务器侧入口:
trigger(type, player, vars):按 trigger.type 匹配并触发(会走 ONCE/冷却规则)triggerById(tipId, player, vars):点名触发某个 tip id(也会走 ONCE/冷却规则)show(player, tips, vars):直接推送,不走触发过滤/冷却(“立刻显示”)
快速上手:写一个最小可用 Tip
下面这段是最常见的写法:
- 用
TipBuilder构建 出TipData - 用
TipRegistry.setTips(owner, ...)注册 - 在某个事件里
TipServer.trigger(...)
import cc.sighs.auratip.api.tip.TipBuilder;
import cc.sighs.auratip.api.tip.TipRegistry;
import cc.sighs.auratip.api.tip.TipServer;
import cc.sighs.auratip.data.TipData;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import java.util.List;
import java.util.Map;
public final class MyTips {
public static final String OWNER = "mymod";
public static final ResourceLocation TIP_ID = new ResourceLocation("mymod", "intro");
public static final ResourceLocation TRIGGER_ID = new ResourceLocation("mymod", "player_login");
public static void registerRuntimeTips() {
TipData tip = new TipBuilder(TIP_ID)
.triggerOnce(TRIGGER_ID)
.visual(v -> v
.size(220, 55)
.positionPreset("TOP_LEFT")
.animationStyle(new ResourceLocation("auratip", "fade_and_slide"))
.hoverAnimationStyle(new ResourceLocation("auratip", "none"))
)
.behavior(b -> b
.duration(160)
.pauseOnHover(true)
)
.page(0, p -> p
.title(Component.literal("欢迎!"), 0.8f, 0)
.content(Component.literal("你好,${player}"), 0.65f, 1)
)
.build();
TipRegistry.setTips(OWNER, List.of(tip));
}
public static void triggerLoginTip(ServerPlayer player) {
TipServer.trigger(TRIGGER_ID, player, Map.of(
"player", player.getDisplayName()
));
}
}
你看到的
${player}不是魔法:AuraTip 会在渲染时用 variables map 做字符串占位替换。
TipBuilder:把 TipData “拼出来”
核心类:cc.sighs.auratip.api.tip.TipBuilder
1) 构造器与 id 规则
new TipBuilder(ResourceLocation id)- 这个 id 用来做 “ONCE 是否展示过 / REPEATABLE 冷却” 的记录,所以建议是 不要轻易改变
2) trigger:触发信息
trigger(type, mode, cooldownTicks)triggerOnce(type):等价于mode=ONCEtriggerRepeatable(type, cooldownTicks):等价于mode=REPEATABLE
如果你写了两个 trigger type 相同的 Tip,那么触发这个 type 的效果就是依次展示这两个 Tip。
触发规则在服务端执行,记录存放在玩家 persistentData 下的 auratip_shown_tips 里。
AuraTip 自带两个示例:
auratip:first_join_world:玩家登录时触发(见CommonEventHandler)auratip:showtip_command:/showtip指令触发(见ShowTipCommand)
3) page:页面内容
page(index, builder -> ...) 用于创建/更新某个页面。
要求与注意点:
- 至少要有 1 页
page_index不能重复- 一页必须至少有一个内容(title/subtitle/content/image 任意一个)
PageBuilder 常用方法:
title(Component text, float scale, int lineSpacing)subtitle(Component text, float scale, int lineSpacing)content(Component text, float scale, int lineSpacing)titleDivider(...):在标题下方加一条分割线image(path, preset, w, h)/image(path, x, y, w, h)imageScaled(...):同上,但带scale
图片 path 的常见写法:minecraft:textures/item/apple.png