fix bitset bugs
This commit is contained in:
@ -38,7 +38,7 @@ func (c *ClientInformation) Init(g *server.Game) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}), "ClientInfoSystem", nil)
|
}), "go-mc:ClientInfoSystem", nil)
|
||||||
g.AddHandler(&server.PacketHandler{
|
g.AddHandler(&server.PacketHandler{
|
||||||
ID: packetid.ServerboundClientInformation,
|
ID: packetid.ServerboundClientInformation,
|
||||||
F: func(client *server.Client, player *server.Player, p server.Packet758) error {
|
F: func(client *server.Client, player *server.Player, p server.Packet758) error {
|
||||||
|
@ -59,9 +59,13 @@ func (b *BitSet) And(other *BitSet) *BitSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *BitSet) AndNot(other BitSet) *BitSet {
|
func (b *BitSet) AndNot(other BitSet) *BitSet {
|
||||||
result := BitSet{values: make([]uint, max(len(b.values), len(other.values)))}
|
result := BitSet{values: make([]uint, len(b.values))}
|
||||||
for i := range b.values {
|
for i := range b.values {
|
||||||
result.values[i] = b.values[i] & ^other.values[i]
|
if i < len(other.values) {
|
||||||
|
result.values[i] = b.values[i] & ^other.values[i]
|
||||||
|
} else {
|
||||||
|
result.values[i] = b.values[i]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return &result
|
return &result
|
||||||
}
|
}
|
||||||
|
@ -45,15 +45,12 @@ func (NullStorage[T]) SetValue(eid Index, v T) {}
|
|||||||
func (NullStorage[T]) DelValue(eid Index) {}
|
func (NullStorage[T]) DelValue(eid Index) {}
|
||||||
|
|
||||||
type MaskedStorage[T any] struct {
|
type MaskedStorage[T any] struct {
|
||||||
BitSetLike
|
BitSet
|
||||||
Storage[T]
|
Storage[T]
|
||||||
Len int
|
Len int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MaskedStorage[T]) Init() {
|
func (m *MaskedStorage[T]) Init() {
|
||||||
if m.BitSetLike == nil {
|
|
||||||
m.BitSetLike = BitSet{make(map[Index]struct{})}
|
|
||||||
}
|
|
||||||
m.Storage.Init()
|
m.Storage.Init()
|
||||||
}
|
}
|
||||||
func (m *MaskedStorage[T]) GetValue(eid Index) *T {
|
func (m *MaskedStorage[T]) GetValue(eid Index) *T {
|
||||||
@ -64,14 +61,14 @@ func (m *MaskedStorage[T]) GetValue(eid Index) *T {
|
|||||||
}
|
}
|
||||||
func (m *MaskedStorage[T]) GetValueAny(eid Index) any { return m.GetValue(eid) }
|
func (m *MaskedStorage[T]) GetValueAny(eid Index) any { return m.GetValue(eid) }
|
||||||
func (m *MaskedStorage[T]) SetValue(eid Index, v T) {
|
func (m *MaskedStorage[T]) SetValue(eid Index, v T) {
|
||||||
if !m.BitSetLike.Set(eid) {
|
if !m.BitSet.Set(eid) {
|
||||||
m.Len++
|
m.Len++
|
||||||
}
|
}
|
||||||
m.Storage.SetValue(eid, v)
|
m.Storage.SetValue(eid, v)
|
||||||
}
|
}
|
||||||
func (m *MaskedStorage[T]) SetAny(eid Index, v any) { m.SetValue(eid, v.(T)) }
|
func (m *MaskedStorage[T]) SetAny(eid Index, v any) { m.SetValue(eid, v.(T)) }
|
||||||
func (m *MaskedStorage[T]) DelValue(eid Index) {
|
func (m *MaskedStorage[T]) DelValue(eid Index) {
|
||||||
if m.BitSetLike.Unset(eid) {
|
if m.BitSet.Unset(eid) {
|
||||||
m.Len--
|
m.Len--
|
||||||
}
|
}
|
||||||
m.Storage.DelValue(eid)
|
m.Storage.DelValue(eid)
|
||||||
|
@ -14,8 +14,9 @@ type funcsystem struct {
|
|||||||
|
|
||||||
func FuncSystem(F any) System {
|
func FuncSystem(F any) System {
|
||||||
type Storage interface {
|
type Storage interface {
|
||||||
BitSetLike
|
|
||||||
GetValueAny(eid Index) any
|
GetValueAny(eid Index) any
|
||||||
|
And(*BitSet) *BitSet
|
||||||
|
Range(f func(eid Index))
|
||||||
}
|
}
|
||||||
f := reflect.ValueOf(F)
|
f := reflect.ValueOf(F)
|
||||||
in := f.Type().NumIn()
|
in := f.Type().NumIn()
|
||||||
@ -37,22 +38,25 @@ func FuncSystem(F any) System {
|
|||||||
}
|
}
|
||||||
args := make([]reflect.Value, len(storages))
|
args := make([]reflect.Value, len(storages))
|
||||||
if len(storages) > 0 {
|
if len(storages) > 0 {
|
||||||
set := BitSetLike(storages[0])
|
set := reflect.ValueOf(storages[0]).FieldByName("BitSet").Addr()
|
||||||
for _, v := range storages[1:] {
|
for _, v := range storages[1:] {
|
||||||
set = set.And(v)
|
p := reflect.ValueOf(v).FieldByName("BitSet").Addr()
|
||||||
|
set = set.MethodByName("And").Call([]reflect.Value{p})[0]
|
||||||
}
|
}
|
||||||
set.Range(func(eid Index) {
|
set.MethodByName("Range").Call([]reflect.Value{
|
||||||
for i := range args {
|
reflect.ValueOf(func(eid Index) {
|
||||||
arg := storages[i].GetValueAny(eid)
|
for i := range args {
|
||||||
if arg == nil {
|
arg := storages[i].GetValueAny(eid)
|
||||||
args[i] = reflect.Zero(argTypes[i])
|
if arg == nil {
|
||||||
} else if needCopy[i] {
|
args[i] = reflect.Zero(argTypes[i])
|
||||||
args[i] = reflect.ValueOf(arg).Elem()
|
} else if needCopy[i] {
|
||||||
} else {
|
args[i] = reflect.ValueOf(arg).Elem()
|
||||||
args[i] = reflect.ValueOf(arg)
|
} else {
|
||||||
|
args[i] = reflect.ValueOf(arg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
f.Call(args)
|
||||||
f.Call(args)
|
}),
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
f.Call(args)
|
f.Call(args)
|
||||||
|
@ -23,7 +23,7 @@ func (p playerSpawnSystem) Update(w *ecs.World) {
|
|||||||
pos, rot := ecs.GetComponent[server.Pos](w), ecs.GetComponent[server.Rot](w)
|
pos, rot := ecs.GetComponent[server.Pos](w), ecs.GetComponent[server.Rot](w)
|
||||||
profiles := ecs.GetComponent[PlayerProfile](w)
|
profiles := ecs.GetComponent[PlayerProfile](w)
|
||||||
dimensionRes := ecs.GetResource[world.DimensionList](w)
|
dimensionRes := ecs.GetResource[world.DimensionList](w)
|
||||||
players.AndNot(profiles.BitSetLike).Range(func(eid ecs.Index) {
|
players.AndNot(profiles.BitSet).Range(func(eid ecs.Index) {
|
||||||
player := players.GetValue(eid)
|
player := players.GetValue(eid)
|
||||||
client := clients.GetValue(eid)
|
client := clients.GetValue(eid)
|
||||||
profile, err := p.GetPlayer(player.UUID)
|
profile, err := p.GetPlayer(player.UUID)
|
||||||
|
@ -2,12 +2,12 @@ package world
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
_ "embed"
|
_ "embed"
|
||||||
"github.com/Tnze/go-mc/server"
|
|
||||||
"io"
|
"io"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/Tnze/go-mc/nbt"
|
"github.com/Tnze/go-mc/nbt"
|
||||||
pk "github.com/Tnze/go-mc/net/packet"
|
pk "github.com/Tnze/go-mc/net/packet"
|
||||||
|
"github.com/Tnze/go-mc/server"
|
||||||
"github.com/Tnze/go-mc/server/ecs"
|
"github.com/Tnze/go-mc/server/ecs"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user