Files
go-mc/server/world/world.go
2022-05-27 00:59:18 +08:00

64 lines
1.3 KiB
Go

package world
import (
_ "embed"
"github.com/Tnze/go-mc/server"
"io"
"unsafe"
"github.com/Tnze/go-mc/nbt"
pk "github.com/Tnze/go-mc/net/packet"
"github.com/Tnze/go-mc/server/ecs"
)
//go:embed DimensionCodec.snbt
var dimensionCodecSNBT nbt.StringifiedMessage
//go:embed Dimension.snbt
var dimensionSNBT nbt.StringifiedMessage
type Dimension struct {
storage
Name string
}
func NewDimension(name, path string) Dimension {
return Dimension{
Name: name,
storage: storage{regionDir: path},
}
}
type DimensionList struct {
Dims []ecs.Index
DimNames []string
DimCodecSNBT, DimSNBT nbt.StringifiedMessage
}
func (d *DimensionList) WriteTo(w io.Writer) (n int64, err error) {
return pk.Array(*(*[]pk.Identifier)(unsafe.Pointer(&d.DimNames))).WriteTo(w)
}
func (d *DimensionList) Find(dim string) (ecs.Index, bool) {
for i, v := range d.DimNames {
if v == dim {
return d.Dims[i], true
}
}
return 0, false
}
func (d *DimensionList) Add(id ecs.Index, name string) {
d.Dims = append(d.Dims, id)
d.DimNames = append(d.DimNames, name)
}
func NewDimensionManager(g *server.Game) *DimensionList {
return ecs.SetResource(g.World, DimensionList{
Dims: nil,
DimNames: nil,
DimCodecSNBT: dimensionCodecSNBT,
DimSNBT: dimensionSNBT,
})
}