#协议 #规范 #解析器 #Minecraft #枚举 #数据包 #整数

specmc-protocol

Minecraft 协议规范的解析库

10 个版本

0.1.10 2024 年 6 月 14 日
0.1.9 2024 年 6 月 13 日

#1162 in 网络编程

Download history 1012/week @ 2024-06-07 266/week @ 2024-06-14 17/week @ 2024-06-21 96/week @ 2024-07-26 8/week @ 2024-08-02

每月 104 下载

MIT 许可证

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