Add support for dimension ranges and network hashes

This commit is contained in:
Javier León
2026-01-03 05:33:35 -03:00
parent 2ad86d772f
commit 7a4d57fa6a
10 changed files with 372 additions and 82 deletions

View File

@@ -0,0 +1,97 @@
package mapping
import (
"encoding/binary"
"hash/fnv"
"sort"
"strings"
)
var bufNetworkhash []byte = make([]byte, 0xff)
func networkBlockHash(name string, properties map[string]any) uint32 {
if name == "minecraft:unknown" {
return 0xfffffffe // -2
}
keys := make([]string, 0, len(properties))
for k := range properties {
keys = append(keys, k)
}
sort.Strings(keys)
bufNetworkhash = bufNetworkhash[:0]
var data = bufNetworkhash
writeString := func(str string) {
data = binary.LittleEndian.AppendUint16(data, uint16(len(str)))
data = append(data, []byte(str)...)
}
data = append(data, 10) // compound
data = append(data, 0)
data = append(data, 0)
data = append(data, 8) // string
writeString("name")
writeString(name)
data = append(data, 10) // compound
writeString("states")
for _, k := range keys {
v := properties[k]
switch v := v.(type) {
case string:
data = append(data, 8) // string
writeString(k)
writeString(v)
case uint8:
data = append(data, 1) // tagByte
writeString(k)
data = append(data, byte(v))
case int8:
data = append(data, 1) // tagByte
writeString(k)
data = append(data, byte(v))
case bool:
b := 0
if v {
b = 1
}
data = append(data, 1) // tagByte
writeString(k)
data = append(data, byte(b))
case uint16:
data = append(data, 2) // tagInt16
writeString(k)
data = binary.LittleEndian.AppendUint16(data, uint16(v))
case int16:
data = append(data, 2) // tagInt16
writeString(k)
data = binary.LittleEndian.AppendUint16(data, uint16(v))
case uint32:
data = append(data, 3) // tagInt32
writeString(k)
data = binary.LittleEndian.AppendUint32(data, uint32(v))
case int32:
data = append(data, 3) // tagInt32
writeString(k)
data = binary.LittleEndian.AppendUint32(data, uint32(v))
default:
panic("unhandled nbt type")
}
}
data = append(data, 0) // end
data = append(data, 0) // end
h := fnv.New32a()
h.Write(data)
return h.Sum32()
}
func splitNamespace(identifier string) (ns, name string) {
ns_name := strings.Split(identifier, ":")
return ns_name[0], ns_name[len(ns_name)-1]
}