萌萌萌萌星
本帖最后由 萌萌萌萌星 于 2022-2-13 16:18 编辑

我使用MCProtocolLib库开发机器人时遇到了一个问题
我需要获取附近的方块信息和方块的坐标,我猜测是读取ServerChunkDataPacket包得到区块然后解析
但我并不太理解wiki.vg的描述,所以需要大神提供一些示例代码

Rothes
获取玩家附近的方块信息直接遍历玩家附近的Location, 执行 getBlock() 就能获取方块了, 没必要使用 ProtocolLib, 而且这个只会在玩家加载区块的时候发送, 不能随时随地获取

萌萌萌萌星
本帖最后由 萌萌萌萌星 于 2022-2-12 23:02 编辑
Rothes 发表于 2022-2-12 22:00
获取玩家附近的方块信息直接遍历玩家附近的Location, 执行 getBlock() 就能获取方块了, 没必要使用 Protoco ...

你可能觉得我正在进行服务端插件的开发,实际上我在进行客户端方面开发
确实是我没说清楚
在MCProtocolLib客户端貌似只能通过处理ServerChunkDataPacket获取区块(也许只能获取区块),需要自己处理区块,比较麻烦,其中的算法我不太了解

yhzyhz
没有了解过易语言,但是如果只是处理区块的话,这个packet说明区块数据格式说明也许可以帮到你,区块数据格式说明往下翻有各种语言各种版本的样例

萌萌萌萌星
本帖最后由 萌萌萌萌星 于 2022-2-13 16:15 编辑

问题自己解决了.jpg
我翻阅各维基资料,最后编写出以下代码完成解析
Kotlin:

is ServerChunkDataPacket -> {
                val p = event.getPacket<ServerChunkDataPacket>()
                val column = p.column
                val columnX = column.x
                val columnZ = column.z
                val chunks = column.chunks//16
                var i = 0
                chunks.forEach {
                    it ?: return
                    for (x in 0..1) {//4095
                        for (z in 0..1) {//255
                            for (y in 0..15) {
                                val block = it.blocks[x, y, z] ?: return
                                val positionX = (columnX shl 4) + x
                                val positionZ = (columnZ shl 4) + z
                                val positionY = y + (i shl 4)
                                println("$positionX $positionY $positionZ block:${block.id}")
                            }
                        }
                    }
                    i++
                }
            }

shl 4可以理解成*16
简单测试了下,应该没问题
也非常感谢二位能来帮忙

第一页 上一页 下一页 最后一页