player and dimension loader with ecs system

This commit is contained in:
Tnze
2022-05-27 00:38:46 +08:00
parent d2f7db9d0d
commit 474d6a229b
34 changed files with 956 additions and 795 deletions

View File

@ -0,0 +1,17 @@
{
piglin_safe:0B,
natural:1B,
ambient_light:0.0000000000F,
infiniburn:"#minecraft:infiniburn_overworld",
respawn_anchor_works:0B,
has_skylight:1B,
bed_works:1B,
effects:"minecraft:overworld",
has_raids:1B,
logical_height:384,
coordinate_scale:1.0000000000D,
min_y:-64,
has_ceiling:0B,
ultrawarm:0B,
height:384
}

File diff suppressed because one or more lines are too long

74
server/world/pool.go Normal file
View File

@ -0,0 +1,74 @@
package world
import (
"fmt"
"path/filepath"
"github.com/Tnze/go-mc/level"
"github.com/Tnze/go-mc/save"
"github.com/Tnze/go-mc/save/region"
)
// TODO: Cache regions and chunks
type storage struct {
regionDir string
}
func (s *storage) GetChunk(pos level.ChunkPos) (lc *level.Chunk, err error) {
filename := fmt.Sprintf("r.%d.%d.mca", pos.X>>5, pos.Z>>5)
var r *region.Region
r, err = region.Open(filepath.Join(s.regionDir, filename))
if err != nil {
return nil, err
}
defer func() {
err2 := r.Close()
if err == nil && err2 != nil {
err = err2
}
}()
sector, err := r.ReadSector(region.In(pos.X, pos.Z))
if err != nil {
return nil, err
}
var sc save.Chunk
err = sc.Load(sector)
if err != nil {
return nil, err
}
return level.ChunkFromSave(&sc)
}
func (s *storage) PutChunk(pos level.ChunkPos, c *level.Chunk) (err error) {
var sc save.Chunk
err = level.ChunkToSave(c, &sc)
if err != nil {
return
}
var data []byte
data, err = sc.Data(1)
if err != nil {
return
}
filename := fmt.Sprintf("r.%d.%d.mca", pos.X>>5, pos.Z>>5)
var r *region.Region
r, err = region.Open(filepath.Join(s.regionDir, filename))
if err != nil {
return err
}
defer func() {
err2 := r.Close()
if err == nil && err2 != nil {
err = err2
}
}()
x, z := region.In(pos.X, pos.Z)
err = r.WriteSector(x, z, data)
return
}

51
server/world/world.go Normal file
View File

@ -0,0 +1,51 @@
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
}
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 NewDimensionManager(g *server.Game) *DimensionList {
return ecs.SetResource(g.World, DimensionList{
Dims: nil,
DimNames: nil,
DimCodecSNBT: dimensionCodecSNBT,
DimSNBT: dimensionSNBT,
})
}