VectorDisplays 简介
Minecraft 世界终端用户界面解决方案
由于文本展示实体 (opens new window)在 1.19.4 加入到游戏中,这个依赖库/插件只支持 1.19.4+ 的服务端与客户端。
# 安装
对于开发人员,详见本文下方的快速开始示例。
对于使用者,你首先需要满足以下条件
- 服务端版本在
1.19.4或以上,可使用 Spigot/Paper/Folia 服务端。 - 至少使用
Java 17运行服务端 - 安装前置插件 packetevents (opens new window)
然后,你可以使用以下任意一种方法获取插件:
- 到爱发电 (opens new window)进行购买
- 通过QQ (opens new window)或者QQ群 (opens new window)联系作者进行购买
- 克隆本仓库,自行构建
警告
任何第三方构建都是不可信的,为了您的安全,即使您不想购买,也请自行构建插件。
人话:提醒到这个份上了,遇到了后门别找我。
# 简介
你可想象过各种科幻电影、游戏中,悬在空中的半透明控制面板?
托文本展示实体 (opens new window)可以自由旋转的福,现在,你可以轻松创建这样的控制面板!且无需对客户端作出任何修改,不需要 Mod,甚至不需要资源包。
你可能会好奇这个依赖库/插件是怎么工作的。我们只是做了一点较为复杂的数学运算,让文本展示实体出现在它应该出现的地方,并应用正确的旋转变换。所有文本展示实体的朝向都是默认的(朝向正南方,即Z轴正方向),我们改变的是文本展示实体的左旋转。
文本展示实体的旋转变换使用四元数,这使得我们可以将其旋转到任意角度。即使四元数表达起来并不直观,但这在 1.19 之前几乎是不敢想的。
你可以自由设定这个控制面板中拥有哪些元素,使用类似于 Swing 或 WinForm 的形式,但 Minecraft 中限制较大,没有办法做到与他们并肩的自由度。
除了修改文本展示实体可以调整的背景颜色、文本组件、亮度、缩放等以外,还可以:
- 监听准心悬停状态更改事件,让元素在被玩家准心悬停时更改背景颜色等等
- 监听玩家点击事件,让元素在被玩家点击时执行自定义操作
# 快速开始 (开发者)
对于需要将 VectorDisplays 作为依赖库嵌入到自己的插件里的开发者,请先阅读 API 文档。
如果只需要将 VectorDisplays 作为依赖插件,按以下步骤操作。首先添加依赖(自行替换 $VERSION 为版本号 (opens new window))
repositories {
mavenCentral()
}
dependencies {
compileOnly("top.mrxiaom.hologram:VectorDisplays-API:$VERSION")
}
2
3
4
5
6
创建你的第一个终端控制面板
void create(Player player) {
Location eyeLocation = player.getEyeLocation().clone(); eyeLocation.setPitch(0);
// 获取玩家面前 2 格远的位置
Location loc = player.getLocation().clone().add(eyeLocation.getDirection().multiply(2));
// 操作面板ID, 位置, 宽度(单位为空格数), 高度(单位为行数)
SimpleTerminal terminal = new SimpleTerminal(
/*显示方式:*/RenderMode.NEARBY,
/*面板ID:*/ "test_" + player.getName(),
/*位置:*/ loc,
/*大小:*/ 9, 3
);
terminal.setRotation(180.0f - eyeLocation.getYaw(), -30.0f); // 设置终端面板旋转
// 添加按钮
terminal.addElement(new Button("btn1")
.setText("<#FF0000>测试")
.setScale(0.25f) // 缩放尺寸
.setAlign(EnumAlign.RIGHT_CENTER) // 位置对齐方式
.setPos(-2, 0) // 相对位置
.setAdditionalRotation(45) // 设置旋转45度
.setFullBrightness() // 设置固定亮度
.setOnHoverStateChange(hoverBg(0x80000000, 0)) // 悬停更改背景颜色
.setOnClick((whoClicked, action, e) -> { // 点击执行操作
whoClicked.sendMessage("你以 " + action + " 方式点击了按钮 " + e.getId());
}));
// 添加线条
terminal.addElement(new Line("line1"), line -> {
// 除了使用前面的链式调用格式以外,还可以使用 Consumer 来修改参数
line.setFullBrightness();
line.setPos1(-5, -5);
line.setPos2(5, 5);
line.setAlign(EnumAlign.CENTER);
});
// 使用 NEARBY 显示方式时,无需手动添加玩家到这个终端面板
//terminal.addViewer(player);
// 注册并生成悬浮字
TerminalManager.inst().spawn(terminal);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
SimpleTerminal (opens new window) 仅仅是默认实现,你还可以继承抽象类 Terminal (opens new window) 以便更好地实现你需要的功能!