Experimental fastnbt library

This commit is contained in:
Tnze
2023-04-24 01:40:22 +08:00
parent de254fb1c6
commit ad3f69e40b
7 changed files with 565 additions and 0 deletions

100
nbt/fastnbt/types.go Normal file
View File

@ -0,0 +1,100 @@
package fastnbt
import (
"math"
"github.com/Tnze/go-mc/nbt"
)
type Value struct {
comp Compound
list []*Value
data []byte
tag byte // nbt.Tag*
}
func (v *Value) Bool() bool {
if v.tag != nbt.TagByte {
return false
}
return v.data[0] != 0
}
func (v *Value) Byte() int8 {
if v.tag != nbt.TagByte {
return 0
}
return int8(v.data[0])
}
func (v *Value) Short() int16 {
if v.tag != nbt.TagShort {
return 0
}
return int16(v.data[0])<<8 | int16(v.data[1])
}
func (v *Value) Int() int32 {
if v.tag != nbt.TagInt {
return 0
}
return int32(v.data[0])<<24 | int32(v.data[1])<<16 |
int32(v.data[2])<<8 | int32(v.data[3])
}
func (v *Value) Long() int64 {
if v.tag != nbt.TagLong {
return 0
}
return int64(v.data[0])<<56 | int64(v.data[1])<<48 |
int64(v.data[2])<<40 | int64(v.data[3])<<32 |
int64(v.data[4])<<24 | int64(v.data[5])<<16 |
int64(v.data[6])<<8 | int64(v.data[7])
}
func (v *Value) Float() float32 {
if v.tag != nbt.TagFloat {
return 0
}
return math.Float32frombits(
uint32(v.data[0])<<24 | uint32(v.data[1])<<16 |
uint32(v.data[2])<<8 | uint32(v.data[3]))
}
func (v *Value) Double() float64 {
if v.tag != nbt.TagDouble {
return 0
}
return math.Float64frombits(
uint64(v.data[0])<<56 | uint64(v.data[1])<<48 |
uint64(v.data[2])<<40 | uint64(v.data[3])<<32 |
uint64(v.data[4])<<24 | uint64(v.data[5])<<16 |
uint64(v.data[6])<<8 | uint64(v.data[7]))
}
func (v *Value) List() []*Value {
return v.list
}
func (v *Value) ByteArray() []byte {
if v.tag != nbt.TagByteArray {
return nil
}
return v.data[4:]
}
func (v *Value) String() string {
if v.tag != nbt.TagString {
return ""
}
return string(v.data[2:])
}
type Compound struct {
kvs []kv
}
type kv struct {
tag string
v *Value
}