Add chunk example with palette and section unpacking, and configure .gitignore
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
.devres/
|
||||||
@@ -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
Reference in New Issue
Block a user