Files
legacy-version/legacyver/proto/sub_chunk.go
2025-06-18 23:54:54 +07:00

94 lines
3.2 KiB
Go

package proto
import "github.com/sandertv/gophertunnel/minecraft/protocol"
// SubChunkEntry contains the data of a sub-chunk entry relative to a center sub chunk position, used for the sub-chunk
// requesting system introduced in v1.18.10.
type SubChunkEntry struct {
// Offset contains the offset between the sub-chunk position and the center position.
Offset protocol.SubChunkOffset
// Result is always one of the constants defined in the SubChunkResult constants.
Result byte
// RawPayload contains the serialized sub-chunk data.
RawPayload []byte
// HeightMapType is always one of the constants defined in the HeightMapData constants.
HeightMapType byte
// HeightMapData is the data for the height map.
HeightMapData []int8
// BlobHash is the hash of the blob.
BlobHash uint64
// RenderHeightMapType is always one of the constants defined in the HeightMapData constants.
RenderHeightMapType byte
// RenderHeightMapData is the data for the render height map.
RenderHeightMapData []int8
// RenderBlobHash is the hash of the render blob.
RenderBlobHash uint64
}
// ToLatest ...
func (x *SubChunkEntry) ToLatest() protocol.SubChunkEntry {
return protocol.SubChunkEntry{
Offset: x.Offset,
Result: x.Result,
RawPayload: x.RawPayload,
HeightMapType: x.HeightMapType,
HeightMapData: x.HeightMapData,
BlobHash: x.BlobHash,
RenderHeightMapType: x.RenderHeightMapType,
RenderHeightMapData: x.RenderHeightMapData,
RenderBlobHash: x.RenderBlobHash,
}
}
// FromLatest converts a protocol.SubChunkEntry to a SubChunkEntry. It is used to convert the latest
func (x *SubChunkEntry) FromLatest(y protocol.SubChunkEntry) SubChunkEntry {
x.Offset = y.Offset
x.Result = y.Result
x.RawPayload = y.RawPayload
x.HeightMapType = y.HeightMapType
x.HeightMapData = y.HeightMapData
x.BlobHash = y.BlobHash
x.RenderHeightMapType = y.RenderHeightMapType
x.RenderHeightMapData = y.RenderHeightMapData
x.RenderBlobHash = y.RenderBlobHash
return *x
}
// Marshal encodes/decodes a SubChunkEntry assuming the blob cache is enabled.
func (x *SubChunkEntry) Marshal(r protocol.IO) {
protocol.Single(r, &x.Offset)
r.Uint8(&x.Result)
if x.Result != protocol.SubChunkResultSuccessAllAir {
r.ByteSlice(&x.RawPayload)
}
r.Uint8(&x.HeightMapType)
if x.HeightMapType == protocol.HeightMapDataHasData {
protocol.FuncSliceOfLen(r, 256, &x.HeightMapData, r.Int8)
}
r.Uint64(&x.BlobHash)
if IsProtoGTE(r, ID818) {
r.Uint8(&x.RenderHeightMapType)
if x.RenderHeightMapType == protocol.HeightMapDataHasData {
protocol.FuncSliceOfLen(r, 256, &x.RenderHeightMapData, r.Int8)
}
r.Uint64(&x.RenderBlobHash)
}
}
// SubChunkEntryNoCache encodes/decodes a SubChunkEntry assuming the blob cache is not enabled.
func SubChunkEntryNoCache(r protocol.IO, x *SubChunkEntry) {
protocol.Single(r, &x.Offset)
r.Uint8(&x.Result)
r.ByteSlice(&x.RawPayload)
r.Uint8(&x.HeightMapType)
if IsProtoGTE(r, ID818) {
if x.HeightMapType == protocol.HeightMapDataHasData {
protocol.FuncSliceOfLen(r, 256, &x.HeightMapData, r.Int8)
}
r.Uint8(&x.RenderHeightMapType)
if x.RenderHeightMapType == protocol.HeightMapDataHasData {
protocol.FuncSliceOfLen(r, 256, &x.RenderHeightMapData, r.Int8)
}
}
}