Tnze / go-mc

Collection of Go libraries for Minecraft
https://go-mc.github.io/tutorial/
MIT License
858 stars 115 forks source link

packet.Scan 方法需要支持变长的报文解析 #188

Closed flw-cn closed 2 years ago

flw-cn commented 2 years ago

比如实体销毁报文 pkid.EntityDestroy,它的结构是这样的:

        "packet_entity_destroy": [
          "container",
          [
            {
              "name": "entityIds",
              "type": [
                "array",
                {
                  "countType": "varint",
                  "type": "varint"
                }
              ]
            }
          ]
        ],

p.Data 开始是一个 VarInt 类型的数量值,然后是销毁的实体 IDs。 当我用 packet.Scan 来解析它的时候,我需要先 p.Scan 取到数量,然后再循环取每个 ID,就像这样:

    p.Scan(&count)
    for i := pk.VarInt(0); i < count; i++ {
        var id pk.VarInt
        p.Scan(&id)
        log.Printf("ID: %v", id)
    }

但是这样每次取到的 ID 实际上都是 count。为此我看了 Scan 的源代码,发现它并没有修改 p.Data,所以每次 Scan 实际上都是重新开始。这样感觉有些不太合理。

flw-cn commented 2 years ago

哦,我明白了,也许我应该用 pk.Ary