98 lines
1.7 KiB
Go
98 lines
1.7 KiB
Go
package bedrock
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
"github.com/cubexteam/Frodding/net/info"
|
|
"github.com/cubexteam/Frodding/net/packets"
|
|
)
|
|
|
|
type FullChunkDataPacket struct {
|
|
*packets.Packet
|
|
ChunkX int32
|
|
ChunkZ int32
|
|
Data []byte
|
|
}
|
|
|
|
func NewFullChunkDataPacket(cx, cz int32, data []byte) *FullChunkDataPacket {
|
|
return &FullChunkDataPacket{
|
|
Packet: packets.NewPacket(info.IDFullChunkData),
|
|
ChunkX: cx,
|
|
ChunkZ: cz,
|
|
Data: data,
|
|
}
|
|
}
|
|
|
|
func BuildFlatChunk() []byte {
|
|
buf := &bytes.Buffer{}
|
|
|
|
const numSubChunks = 8
|
|
buf.WriteByte(numSubChunks)
|
|
|
|
for sc := 0; sc < numSubChunks; sc++ {
|
|
buf.WriteByte(0)
|
|
|
|
blocks := make([]byte, 4096)
|
|
baseY := sc * 16
|
|
|
|
for x := 0; x < 16; x++ {
|
|
for z := 0; z < 16; z++ {
|
|
for y := 0; y < 16; y++ {
|
|
absY := baseY + y
|
|
idx := x*256 + z*16 + y
|
|
if absY == 0 {
|
|
blocks[idx] = 7
|
|
} else if absY < 62 {
|
|
blocks[idx] = 1
|
|
} else if absY == 62 {
|
|
blocks[idx] = 3
|
|
} else if absY == 63 {
|
|
blocks[idx] = 2
|
|
}
|
|
}
|
|
}
|
|
}
|
|
buf.Write(blocks)
|
|
|
|
buf.Write(make([]byte, 2048))
|
|
|
|
skylight := make([]byte, 2048)
|
|
for i := range skylight {
|
|
if baseY >= 64 {
|
|
skylight[i] = 0xFF
|
|
} else {
|
|
skylight[i] = 0x00
|
|
}
|
|
}
|
|
buf.Write(skylight)
|
|
|
|
buf.Write(make([]byte, 2048))
|
|
}
|
|
|
|
heightmap := make([]byte, 256)
|
|
for i := range heightmap {
|
|
heightmap[i] = 64
|
|
}
|
|
buf.Write(heightmap)
|
|
|
|
biomes := make([]byte, 256)
|
|
for i := range biomes {
|
|
biomes[i] = 1
|
|
}
|
|
buf.Write(biomes)
|
|
|
|
buf.WriteByte(0)
|
|
buf.WriteByte(0)
|
|
|
|
return buf.Bytes()
|
|
}
|
|
|
|
func (pk *FullChunkDataPacket) Encode() {
|
|
pk.PutVarInt(pk.ChunkX)
|
|
pk.PutVarInt(pk.ChunkZ)
|
|
pk.PutUVarInt(uint32(len(pk.Data)))
|
|
pk.PutBytes(pk.Data)
|
|
}
|
|
|
|
func (pk *FullChunkDataPacket) Decode() {}
|