针织薄外套
本帖最后由 针织薄外套 于 2023-9-18 04:52 编辑

本文同时发布在我的个人语雀:如何使用Component组件 (yuque.com)

Paper在2021年2月22日(1.16.5#473)引入了更现代的Adventure库,皆在解决Bukkit和Spigot仍在使用Mojang于2015年前就已弃用的遗留格式的问题。Components组件是其中最主要的部分,使用Components组件,虽然不比遗留写法方便,甚至有时候还相当繁琐,但当你习惯以后就会发现,这玩意是真XX好用。
本文主要不是用来说明Adventure库有哪些方法的,最主要是让小白开发者能更快熟悉如何从使用遗留格式转为使用Components组件。关于Components组件具体都能实现哪些功能,其官方教程中已经说明的比较详细了,要是有人能翻译搬运到MCBBS就更好了XD
遗留格式和组件格式对比比如要实现如下效果,点击文字可以打开Minecraft的官网









Spigot里其实也有组件方法,只不过是由嵌入的Bungee包提供的,功能残缺,很不方便。player.sendMessage("§6你好, §lMinecraft");
TextComponent message = new TextComponent("点我打开官网");
message.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.minecraft.net/"));
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("点击打开").create()));
player.spigot().sendMessage(message);复制代码导入net.md_5.bungee.api.chat.xxxxx下的包
而在paper,则可以直接构造组件,或者反序列化MiniMessage来使用。MiniMessage是Component组件的简单字符串表达形式,比较接近遗留格式的写法,且功能强大。player.sendMessage(Component.text("你好")
                             .append(Component.text("Minecraft").decorate(TextDecoration.BOLD))
                             .color(NamedTextColor.GOLD)
                  );
player.sendMessage(Component.text("点我打开官网")
                             .clickEvent(ClickEvent.openUrl("https://www.minecraft.net/"))
                             .hoverEvent(HoverEvent.showText(Component.text("点击打开")))
                  );复制代码player.sendMessage(MiniMessage.miniMessage().deserialize("你好, Minecraft"));
player.sendMessage(MiniMessage.miniMessage().deserialize("点我打开官网"));复制代码导入net.kyori.adventure.text.xxxxx下的包
不再使用被弃用的文本方法Paper将所有遗留文本的方法都设定为弃用,因此当你发现某个返回String或者参数是String的方法被弃用,那就一定有个用来代替它的Components组件方法。// 被弃用的文本方法复制代码// 组件方法复制代码
如何快速将遗留格式转为组件Adventure提供的序列化与反序列化方法,可以很方便的互换两种格式。// 将遗留格式转换为组件
LegacyComponentSerializer.legacySection().deserialize("§6你好, §lMinecraft");
LegacyComponentSerializer.legacyAmpersand().deserialize("&6你好, &lMinecraft");

// 将组件转换为遗留格式
Component component = Component.text("红色的字", NamedTextColor.RED);
LegacyComponentSerializer.legacySection().serialize(component);
LegacyComponentSerializer.legacyAmpersand().serialize(component);复制代码legacySection 和 legacyAmpersand 的区别就是一个是§一个是&。当然还有其他的序列化方法,比如PlainTextComponentSerializer.plainText()用来将组件和纯文本(剔除颜色格式等)之间互相转换;GsonComponentSerializer.gson()用来将组件和JSON之间互相转换;MiniMessage.miniMessage()用来将组件和MiniMessage之间互相转换。
一些例子
1.怎么使用RGB颜色?Component component = Component.text("红色的字", TextColor.fromHexString("#FF0000"));
Component component2 = Component.text("红色的字", TextColor.color(255, 0, 0));复制代码
2.怎么样发送一个标题Title?









final Advancement advancement = event.getAdvancement();
final AdvancementDisplay advancementDisplay = advancement.getDisplay();
player.showTitle(Title.title(Component.text("取得进度", NamedTextColor.GREEN), advancementDisplay.title()));复制代码也还有个sendActionBar(@NotNull Component message)方法用于发送操作栏消息(位于经验条上方)。
3.怎么样在聊天框悬浮显示一个物品,做到展示物品的效果?









private @NotNull Component parsingItemStack(@NotNull ItemStack itemStack) {
    Component component = itemStack.displayName();

    // 如果数量多于1个,在后面显示x数量
    final int amount = itemStack.getAmount();
    if (amount > 1) {
        component = component.append(Component.text("x" + amount, NamedTextColor.GRAY));
    }

    return component.hoverEvent(itemStack.asHoverEvent());
}复制代码其中较为关键的是PaperAPI提供的itemStack.asHoverEvent()方法,可以方便的把物品转为HoverEvent。实体Entity类也有相同的方法entity.asHoverEvent()用来悬浮显示实体的信息。

第一页 上一页 下一页 最后一页