diff options
Diffstat (limited to 'nbt/create.go')
-rw-r--r-- | nbt/create.go | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/nbt/create.go b/nbt/create.go index d515c1b..b3ff3e8 100644 --- a/nbt/create.go +++ b/nbt/create.go @@ -1,5 +1,9 @@ package nbt +import ( + "reflect" +) + func NewByteTag(v byte) Tag { return Tag{TAG_Byte, v} } func NewShortTag(v int16) Tag { return Tag{TAG_Short, v} } func NewIntTag(v int32) Tag { return Tag{TAG_Int, v} } @@ -10,5 +14,29 @@ func NewByteArrayTag(v []byte) Tag { return Tag{TAG_Byte_Array, v} } func NewStringTag(v string) Tag { return Tag{TAG_String, v} } func NewIntArrayTag(v []int32) Tag { return Tag{TAG_Int_Array, v} } -// func NewCompoundTag() Tag {return Tag{TAG_Compound, make(TagCompound)}} -// func NewListTag +// NewCompoundTag creates a new Tag with type TAG_Compound. Usually it is more convenient to make the TagCompound payload and then manually construct the Tag value, though. +func NewCompoundTag() Tag { return Tag{TAG_Compound, make(TagCompound)} } + +// NewListTag creates a new Tag of type TAG_List with tag elems of type ltt. +// +// l must either be of type []interface{}, where the elements are payloads for ltt tags OR of type []T, where T is the payload type for ltt tags. +// +// YOU are responsible for this, this function will not check the correctness. +// When given wrong data, this function will either panic, or writing the NBT data will later fail. +func NewListTag(ltt TagType, l interface{}) Tag { + var elems []interface{} + if is, ok := l.([]interface{}); ok { + elems = is + } else { + val := reflect.ValueOf(l) + + n := val.Len() + elems = make([]interface{}, n) + + for i := 0; i < n; i++ { + elems[i] = val.Index(i).Interface() + } + } + + return Tag{TAG_List, TagList{ltt, elems}} +} |