Add chunk example with palette and section unpacking, and configure .gitignore

This commit is contained in:
adman
2025-12-11 22:07:13 +01:00
parent 517ae499e2
commit 3bd20a3764
3 changed files with 98 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
package main
import (
"bytes"
"encoding/binary"
"fmt"
"io"
"math"
"github.com/admin-else/queser"
)
func UnpackIndirectPalette(r io.Reader, bitsPerEntry uint8, numberOfEntries int) (err error) {
var palletLen queser.VarInt
palletLen, err = palletLen.Decode(r)
if err != nil {
return
}
var pallet []int32 // remember we can't use make because this is user-controlled data
for range palletLen {
var entry queser.VarInt
entry, err = queser.VarInt(0).Decode(r)
if err != nil {
return
}
pallet = append(pallet, int32(entry))
}
entriesPerLong := int(64 / bitsPerEntry)
numberOfLongs := int(math.Ceil(float64(numberOfEntries) / float64(entriesPerLong)))
var data []uint64
for range numberOfLongs {
var entry uint64
err = binary.Read(r, binary.BigEndian, &entry)
if err != nil {
return
}
data = append(data, entry)
}
fmt.Println(data)
return
}
func GetBit(data []uint64, index, bpe int32) uint64 {
// net.minecraft.util.collection.PackedIntegerArray
return 1
}
func UnpackPalette(r io.Reader, numberOfEntries int) (err error) {
var bitsPerEntry uint8
err = binary.Read(r, binary.BigEndian, &bitsPerEntry)
if err != nil {
return
}
err = UnpackIndirectPalette(r, bitsPerEntry, numberOfEntries)
return
}
func UnpackSection(r io.Reader) (err error) {
var blockCount int16
err = binary.Read(r, binary.BigEndian, &blockCount)
if err != nil {
return
}
err = UnpackPalette(r, 4096) // 4096 is the number of blocks in a chunk
return
}
func mainE() (err error) {
fmt.Println(packet.X*16, packet.Z*16)
b := bytes.NewBuffer(packet.ChunkData.Val)
err = UnpackSection(b)
return
}
func main() {
err := mainE()
if err != nil {
panic(err)
}
}
File diff suppressed because one or more lines are too long