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