98 lines
2.1 KiB
Go
98 lines
2.1 KiB
Go
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]
|
|
}
|