10 个版本
0.1.10 | 2024 年 6 月 14 日 |
---|---|
0.1.9 | 2024 年 6 月 13 日 |
#1162 in 网络编程
每月 104 下载
36KB
933 行
SpecMC 协议
Minecraft 协议规范的解析库。
默认类型
基本类型
bool
: 布尔值。u8
,u16
,u32
,u64
: 分别为 8、16、32 和 64 位的无符号整数。i8
,i16
,i32
,i64
: 分别为 8、16、32 和 64 位的有符号整数。VarInt
,VarLong
: 分别为 32 位和 64 位的有符号整数,但以 LEB128 格式编码。f32
,f64
: 分别为 32 位和 64 位的浮点数。
其他类型
String
: 以字节大小为 VarInt 预置的 UTF-8 编码字符串。最大长度为 32767。使用String[n]
明确指定长度。List[type; n]
: 一个列表,其中type
是元素的类型,n
是元素的数量。n
也可以是一个标识符,在这种情况下,元素的数量将在运行时确定。Nbt
: NBT 编码数据。
枚举
枚举定义由枚举名、其表示类型和变体列表组成。变体将隐式分配为上一个变体的值加一。第一个变体将隐式分配值为 0。您可以显式分配枚举变体的值。枚举 State
是必需的,用于数据包定义。
示例
enum ABC(i32) {
A = 1
B // implicitly assigned 2
C // implicitly assigned 3
}
数据包
数据包定义包括数据包名称,其后跟其方向、状态和id,以及一个字段列表。枚举将表示为枚举定义中指定的类型。可以使用 if
语句来定义条件字段。原始类型字段可以设置为等于一个字面量或另一个字段或常量。
示例
packet SomePacket(serverbound, Play, 0x42) {
u32 length
List[u8; length] data
if (length > 0) {
String message
}
}
类型
可以使用 type
关键字来定义自定义类型。字段与数据包中的字段等效。
常量
可以使用 const
关键字来定义常量。自动定义一个常量 PVN
。
示例
use specmc_base::{parse::Parse, tokenize::tokenize};
use specmc_protocol::Protocol;
const INPUT: &str = "
enum TestEnum(i32) {}
type TestType {
String message
}
packet TestPacket(serverbound, Play, 0x42) {
u32 length
List[u8; length] data
if (length > 0) {
TestType message
}
}";
let mut tokens: Vec<String> = tokenize(INPUT);
tokens.reverse();
println!("{:#?}", Protocol::parse(&mut tokens));
依赖关系
~290–750KB
~17K SLoC