• 欢迎加入MineBBS QQ讨论群:点击查看所有的官方讨论群
  • 我们将于近期对服务器进行迁移,服务可能中断至多2日。请各位安排好自己的访问计划,造成不便敬请谅解!
  • MineBBS入站考试已经上线!想要成为【正式会员】解锁更多功能吗?快来参与吧!【点我去看】
adventure-kt | 以更契合 Kotlin 语法的方式操作文本组件

原创 开源 前置/API adventure-kt | 以更契合 Kotlin 语法的方式操作文本组件 1.0.0-SNAPSHOT

完成注册/登录后下载
版权类型
原创
插件中文名称
Adventure Kotlin 支持库
插件英文名称
adventure-kt
原帖地址
#
支持的核心(服务端)
  1. Spigot
  2. Paper
  3. Folia
  4. Purpur
  5. PufferFish
  6. SpongeVanilla
  7. Leaves
  8. 其他核心
语言支持
其他
前置组件
adventure: https://github.com/KyoriPowered/adventure
适配版本(Java)
  1. 1.21
  2. 1.20
  3. 1.19
  4. 1.18
  5. 1.17
  6. 1.16
adventure-kt

基于 Kotlin DSL 的 Kyori Adventure 辅助库。

adventure-kt 隶属于 星社 Project 社群项目。

介绍

Adventure 是一个适用于 Minecraft Java 版的用户界面库,你可能已经使用过了它提供的 MiniMessage,一套简洁的树状语法来描述 Minecraft 在 1.16.5 新增的 文本组件
Adventure 库本身也用于直接在代码里构造文本组件,并向玩家发送带有文本组件的 Title、Actionbar、书本。
就像这样(示例来自 此处):


Java:
// Creates a line of text saying "You're a Bunny! Press <key> to jump!", with some colouring and styling.
final TextComponent textComponent = Component.text("You're a ")
  .color(TextColor.color(0x443344))
  .append(Component.text("Bunny", NamedTextColor.LIGHT_PURPLE))
  .append(Component.text("! Press "))
  .append(
    Component.keybind("key.jump")
      .color(NamedTextColor.LIGHT_PURPLE)
      .decoration(TextDecoration.BOLD, true)
  )
  .append(Component.text(" to jump!"));
// now you can send `textComponent` to something, such as a client

这提供了一套不依赖 Minecraft 内部代码的、平台无关的 API 以构造文本组件。
Paper、Sponge、Fabric 等平台都提供了对于 Adventure 的原生支持。
例如,在 Paper API 中,我们可以直接调用 Player 对象中提供的方法来将上面的 textComponent 发送给一个玩家:


Java:
// 假设这里有一个名为“Player_A”的玩家
// 通过 UUID 来获取 Player 对象才是建议的做法,因此在用于生产的代码中请不要这么做
Player player = Bukkit.getPlayer("Player_A");

// Paper API 中的 Player 已经继承了 Adventure 的 Audience,因此可以直接使用
player.sendMessage(textComponent);

这样构造、发送文本组件的方式,比直接使用格式符号更加规整且强大。

更“甜”的方式


Adventure 是很好用,但它使用 builder-style 编写的 API 在 Kotlin 的世界中显得有些格格不入了。
如果你是一名 Android 开发者,应该用过 Compose。它描述组件的方式就像是 Kotlin 原本的语法一样。

这是一种 DSL(Domain Specific Language, 领域特定语言)。因为 Kotlin 允许你将参数末尾的 Lambda 参数放到括号的外面。如果只有这么一个参数的话,还可以省略括号。
所以,我们也可以这么干。

发送普通消息:


代码:
component {
    text("这是一段普通的文本。")
    text("这是一段红色的文本。") with red()
    text("这是一段使用自定义颜色的文本。") with color(249, 226, 145) // 支持 RGB 颜色
    newline()
    text("这是一段格式化的文本。") with bold() without italic()
}

// 你也可以直接用这种格式发送消息
player.send {
    text("这是一段普通的文本。")
}

创建 Title:

代码:
title {
    mainTitle {
        text("这是一个主标题。")
    }
    subTitle {
        text("这是一个副标题。")
    }
    // 支持传入 Kotlin Duration 和 Java Duration
    times {
        fadeIn(1.seconds)
        stay(1.seconds)
        fadeOut(1.seconds)
    }
}

(论坛的编辑器似乎不支持 Kotlin 代码,所以没有高亮)

对比上面 Java 风格的代码,显然要更规整易读,写起来也更方便些。
adventure-kt 本身只是 Adventure 的一套简单包装,并且已经在星社的 核心代码库 中使用很久了,目前没有未发现的问题。
不过我们目前只完成了对 Adventure 核心部分的包装,对于更进阶部分(如文本组件中的替换)的辅助还需要在后续的开发中逐步添加。


在你的项目中使用


首先,添加 Maven 仓库。
此处提供 Gradle Kotlin DSL 的示例,似乎没有什么人用 Groovy DSL 或者 Maven 来管理 Kotlin 项目。


代码:
repositories {
    maven(uri("https://maven.nostal.ink/repository/maven-public/"))
}

然后是添加依赖:

代码:
dependencies {
    // 用 shadowJar 将 adventure-kt 打包到你的插件中
    api("ink.pmc.advkt:core:1.0.0-SNAPSHOT")
}

tasks.shadowJar {
    // relocate 一下是推荐的做法,防止冲突
    relocate("ink.pmc.advkt", "com.example.libs.advkt")
}

结语

其实本文大部分内容都是在介绍 Adventure 库本身,因为可能还有很多人并不了解这个库,所以顺带将它介绍给更多人。
如果你觉得 adventure-kt 让你的开发更方便的话,欢迎来我们的 GitHub 仓库 给一个 Star。
我们不开设交流群,
如遇到使用上的问题,或是功能建议,请在 Issues 页面反馈。
也可以看看 PlutoProject 这个组织下的其他仓库,后续我们会开发更多有意思的项目。
作者
Nostal Yuu
下载
294
查看
847
首次发布
最后更新

评分

0.00 星 0 次评分
后退
顶部 底部