player and dimension loader with ecs system
This commit is contained in:
17
server/world/Dimension.snbt
Normal file
17
server/world/Dimension.snbt
Normal 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
|
||||
}
|
1
server/world/DimensionCodec.snbt
Normal file
1
server/world/DimensionCodec.snbt
Normal file
File diff suppressed because one or more lines are too long
74
server/world/pool.go
Normal file
74
server/world/pool.go
Normal 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
51
server/world/world.go
Normal 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,
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user