Files
mc/server/world/biome_definition.go
T
TarnaWijaya 26ed99fda6
Build and deploy / Build (push) Has been cancelled
Build and deploy / Update Contributors (push) Has been cancelled
Build and deploy / Deploy (push) Has been cancelled
up3
2026-07-09 08:33:57 +08:00

83 lines
2.0 KiB
Go

package world
import (
"encoding/binary"
"github.com/sandertv/gophertunnel/minecraft/protocol"
)
var (
// maxVanillaBiomeID is the highest ID used by vanilla biomes.
maxVanillaBiomeID int
)
// finaliseBiomeRegistry is called after all vanilla biomes have been registered.
// It sets maxVanillaBiomeID to the highest ID found among them.
// noinspection GoUnusedFunction
//
//lint:ignore U1000 Function is used through compiler directives.
func finaliseBiomeRegistry() {
for _, b := range biomes {
id := b.EncodeBiome()
if id > maxVanillaBiomeID {
maxVanillaBiomeID = id
}
}
}
// BiomeDefinitions returns the list of biome definitions along with the associated StringList.
func BiomeDefinitions() ([]protocol.BiomeDefinition, []string) {
var (
internedStrings []string
internedStringIndex = make(map[string]int)
)
intern := func(s string) int {
if index, exists := internedStringIndex[s]; exists {
return index
}
index := len(internedStrings)
internedStrings = append(internedStrings, s)
internedStringIndex[s] = index
return index
}
encodedBiomes := make([]protocol.BiomeDefinition, 0, len(biomes))
for _, b := range biomes {
nameIndex := intern(b.String())
tags := b.Tags()
tagIndices := make([]uint16, len(tags))
for i, tag := range tags {
tagIndices[i] = uint16(intern(tag))
}
var biomeID int16 = -1
id := b.EncodeBiome()
if id > maxVanillaBiomeID {
biomeID = int16(id)
}
def := protocol.BiomeDefinition{
NameIndex: int16(nameIndex),
BiomeID: biomeID,
Temperature: float32(b.Temperature()),
Downfall: float32(b.Rainfall()),
Depth: float32(b.Depth()),
Scale: float32(b.Scale()),
MapWaterColour: int32(binary.BigEndian.Uint32([]byte{
b.WaterColour().A,
b.WaterColour().R,
b.WaterColour().G,
b.WaterColour().B,
})),
Rain: b.Rainfall() > 0,
Tags: protocol.Option[[]uint16](tagIndices),
}
encodedBiomes = append(encodedBiomes, def)
}
return encodedBiomes, internedStrings
}