Add item DataComponent implements (part 1)

This commit is contained in:
Tnze
2024-07-28 17:52:41 +08:00
parent 966f50eb53
commit 090493c4ac
26 changed files with 860 additions and 256 deletions

View File

@ -1,93 +1,93 @@
package registry
import (
"errors"
"io"
"strconv"
pk "github.com/Tnze/go-mc/net/packet"
)
func (reg *Registry[E]) ReadFrom(r io.Reader) (int64, error) {
var length pk.VarInt
n, err := length.ReadFrom(r)
if err != nil {
return n, err
}
reg.Clear()
var key pk.Identifier
var hasData pk.Boolean
for i := 0; i < int(length); i++ {
var data E
var n1, n2, n3 int64
n1, err = key.ReadFrom(r)
if err != nil {
return n + n1, err
}
n2, err = hasData.ReadFrom(r)
if err != nil {
return n + n1 + n2, err
}
if hasData {
n3, err = pk.NBTField{V: &data, AllowUnknownFields: true}.ReadFrom(r)
if err != nil {
return n + n1 + n2 + n3, err
}
reg.Put(string(key), data)
}
n += n1 + n2 + n3
}
return n, nil
}
func (reg *Registry[E]) ReadTagsFrom(r io.Reader) (int64, error) {
var count pk.VarInt
n, err := count.ReadFrom(r)
if err != nil {
return n, err
}
var tag pk.Identifier
var length pk.VarInt
for i := 0; i < int(count); i++ {
var n1, n2, n3 int64
n1, err = tag.ReadFrom(r)
if err != nil {
return n + n1, err
}
n2, err = length.ReadFrom(r)
if err != nil {
return n + n1 + n2, err
}
n += n1 + n2
values := make([]*E, length)
var id pk.VarInt
for i := 0; i < int(length); i++ {
n3, err = id.ReadFrom(r)
if err != nil {
return n + n3, err
}
if id < 0 || int(id) >= len(reg.values) {
err = errors.New("invalid id: " + strconv.Itoa(int(id)))
return n + n3, err
}
values[i] = &reg.values[id]
n += n3
}
reg.tags[string(tag)] = values
}
return n, nil
}
package registry
import (
"errors"
"io"
"strconv"
pk "github.com/Tnze/go-mc/net/packet"
)
func (reg *Registry[E]) ReadFrom(r io.Reader) (int64, error) {
var length pk.VarInt
n, err := length.ReadFrom(r)
if err != nil {
return n, err
}
reg.Clear()
var key pk.Identifier
var hasData pk.Boolean
for i := 0; i < int(length); i++ {
var data E
var n1, n2, n3 int64
n1, err = key.ReadFrom(r)
if err != nil {
return n + n1, err
}
n2, err = hasData.ReadFrom(r)
if err != nil {
return n + n1 + n2, err
}
if hasData {
n3, err = pk.NBTField{V: &data, AllowUnknownFields: true}.ReadFrom(r)
if err != nil {
return n + n1 + n2 + n3, err
}
reg.Put(string(key), data)
}
n += n1 + n2 + n3
}
return n, nil
}
func (reg *Registry[E]) ReadTagsFrom(r io.Reader) (int64, error) {
var count pk.VarInt
n, err := count.ReadFrom(r)
if err != nil {
return n, err
}
var tag pk.Identifier
var length pk.VarInt
for i := 0; i < int(count); i++ {
var n1, n2, n3 int64
n1, err = tag.ReadFrom(r)
if err != nil {
return n + n1, err
}
n2, err = length.ReadFrom(r)
if err != nil {
return n + n1 + n2, err
}
n += n1 + n2
values := make([]*E, length)
var id pk.VarInt
for i := 0; i < int(length); i++ {
n3, err = id.ReadFrom(r)
if err != nil {
return n + n3, err
}
if id < 0 || int(id) >= len(reg.values) {
err = errors.New("invalid id: " + strconv.Itoa(int(id)))
return n + n3, err
}
values[i] = &reg.values[id]
n += n3
}
reg.tags[string(tag)] = values
}
return n, nil
}

View File

@ -1,72 +1,72 @@
package registry
import "slices"
type Registry[E any] struct {
keys map[string]int32
values []E
indices map[*E]int32
tags map[string][]*E
}
func NewRegistry[E any]() Registry[E] {
return Registry[E]{
keys: make(map[string]int32),
values: make([]E, 0, 256),
indices: make(map[*E]int32),
tags: make(map[string][]*E),
}
}
func (r *Registry[E]) Clear() {
r.keys = make(map[string]int32)
r.values = r.values[:0]
r.indices = make(map[*E]int32)
r.tags = make(map[string][]*E)
}
func (r *Registry[E]) Get(key string) (int32, *E) {
id, ok := r.keys[key]
if !ok {
return -1, nil
}
return id, &r.values[id]
}
func (r *Registry[E]) GetByID(id int32) *E {
if id >= 0 && id < int32(len(r.values)) {
return &r.values[id]
}
return nil
}
func (r *Registry[E]) Put(key string, data E) (id int32, val *E) {
id = int32(len(r.values))
r.keys[key] = id
r.values = append(r.values, data)
val = &r.values[id]
r.indices[val] = id
return
}
// Tags
func (r *Registry[E]) Tag(tag string) []*E {
return slices.Clone(r.tags[tag])
}
func (r *Registry[E]) ClearTags() {
r.tags = make(map[string][]*E)
}
// func (r *Registry[E]) BindTags(tag string, ids []int32) error {
// values := make([]*E, len(ids))
// for i, id := range ids {
// if id < 0 || id >= int32(len(r.values)) {
// return errors.New("invalid id: " + strconv.Itoa(int(id)))
// }
// values[i] = &r.values[id]
// }
// r.tags[tag] = values
// return nil
// }
package registry
import "slices"
type Registry[E any] struct {
keys map[string]int32
values []E
indices map[*E]int32
tags map[string][]*E
}
func NewRegistry[E any]() Registry[E] {
return Registry[E]{
keys: make(map[string]int32),
values: make([]E, 0, 256),
indices: make(map[*E]int32),
tags: make(map[string][]*E),
}
}
func (r *Registry[E]) Clear() {
r.keys = make(map[string]int32)
r.values = r.values[:0]
r.indices = make(map[*E]int32)
r.tags = make(map[string][]*E)
}
func (r *Registry[E]) Get(key string) (int32, *E) {
id, ok := r.keys[key]
if !ok {
return -1, nil
}
return id, &r.values[id]
}
func (r *Registry[E]) GetByID(id int32) *E {
if id >= 0 && id < int32(len(r.values)) {
return &r.values[id]
}
return nil
}
func (r *Registry[E]) Put(key string, data E) (id int32, val *E) {
id = int32(len(r.values))
r.keys[key] = id
r.values = append(r.values, data)
val = &r.values[id]
r.indices[val] = id
return
}
// Tags
func (r *Registry[E]) Tag(tag string) []*E {
return slices.Clone(r.tags[tag])
}
func (r *Registry[E]) ClearTags() {
r.tags = make(map[string][]*E)
}
// func (r *Registry[E]) BindTags(tag string, ids []int32) error {
// values := make([]*E, len(ids))
// for i, id := range ids {
// if id < 0 || id >= int32(len(r.values)) {
// return errors.New("invalid id: " + strconv.Itoa(int(id)))
// }
// values[i] = &r.values[id]
// }
// r.tags[tag] = values
// return nil
// }