diff --git a/data/blocks.go b/data/blocks.go index a139df4..c51776c 100644 --- a/data/blocks.go +++ b/data/blocks.go @@ -53,6 +53,7 @@ type BlockState struct { } var BlocksCache = make(map[string][]*Block) +var BlocksCacheIdMap = make(map[string]map[int32]*Block) func BlocksForVersion(v string) (ret []*Block) { var ok bool @@ -66,13 +67,16 @@ func BlocksForVersion(v string) (ret []*Block) { } func LookupBlockByStateId(version string, stateId int32) (block *Block, ok bool) { - for _, b := range BlocksForVersion(version) { - if b.MinStateId <= stateId && stateId <= b.MaxStateId { - block = b - ok = true - return + idmap, found := BlocksCacheIdMap[version] + if !found { + idmap = make(map[int32]*Block) + for _, b := range BlocksForVersion(version) { + for i := range b.MaxStateId - b.MinStateId + 1 { + idmap[b.MinStateId+i] = b + } } } + block, ok = idmap[stateId] return } diff --git a/event/event_bus.go b/event/event_bus.go index 3f275bb..63c47af 100644 --- a/event/event_bus.go +++ b/event/event_bus.go @@ -11,7 +11,7 @@ import ( ) const ( - LoopsPerSecond = 100 // i dunno seems reasonable + LoopsPerSecond = 10000 // this is just so the cpu doesn't burn itself in an unlimited infinite loop TimePerLoop = time.Second / LoopsPerSecond ) diff --git a/level/litematic/main.go b/level/litematic/main.go index 3862a91..9daae77 100644 --- a/level/litematic/main.go +++ b/level/litematic/main.go @@ -6,6 +6,7 @@ import ( "math" "os" "strings" + "unsafe" "github.com/admin-else/strom/data" "github.com/admin-else/strom/level" @@ -42,10 +43,9 @@ type Region struct { } func (r *Region) GetBlockAt(x, y, z int32) (name string, properties map[string]string, err error) { - uintSlice := make([]uint64, len(r.BlockStates)) - for i, v := range r.BlockStates { - uintSlice[i] = uint64(v) - } + + // this is probably fine + uintSlice := unsafe.Slice((*uint64)(unsafe.Pointer(unsafe.SliceData(r.BlockStates))), len(r.BlockStates)) if r.Size.X < 0 { r.Size.X *= -1 } @@ -56,7 +56,7 @@ func (r *Region) GetBlockAt(x, y, z int32) (name string, properties map[string]s r.Size.Z *= -1 } - if x >= r.Size.X || y >= r.Size.Y || z >= r.Size.Z { + if x >= r.Size.X || y >= r.Size.Y || z >= r.Size.Z || x < 0 || y < 0 || z < 0 { err = OutOfBoundsErr return } diff --git a/proto/connection.go b/proto/connection.go index 1a391f6..ae27272 100644 --- a/proto/connection.go +++ b/proto/connection.go @@ -2,6 +2,7 @@ package proto import ( "bytes" + "context" "errors" "fmt" "io" @@ -221,7 +222,9 @@ func (c *Conn) OnTick(_ event.Tick) (err error) { if c.receiveRoutine { select { case packet = <-c.packetCh: - slog.Debug("receive", "actor", c.Actor, "packet", fmt.Sprintf("%#v", packet)) + if slog.Default().Enabled(context.Background(), slog.LevelDebug) { + slog.Debug("receive", "actor", c.Actor, "packet", fmt.Sprintf("%#v", packet)) + } err = c.Loop.Fire(packet) default: } diff --git a/util/slices.go b/util/slices.go new file mode 100644 index 0000000..ea45328 --- /dev/null +++ b/util/slices.go @@ -0,0 +1,8 @@ +package util + +import "math/rand/v2" + +func ShuffleSlice[T any](s []T) (ret []T) { + rand.Shuffle(len(s), func(i, j int) { s[i], s[j] = s[j], s[i] }) + return s +}