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
83 lines
2.0 KiB
Go
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
|
|
}
|