Add support for dimension ranges and network hashes
This commit is contained in:
97
mapping/network_block_hash.go
Normal file
97
mapping/network_block_hash.go
Normal 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]
|
||||
}
|
||||
Reference in New Issue
Block a user