diff --git a/go.mod b/go.mod index 9b265ff..0efc336 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ go 1.20 replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.28.2-1 //replace github.com/df-mc/dragonfly => ./dragonfly -replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.4-11 +replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.4-12 //replace gioui.org => ./gio replace gioui.org => github.com/olebeck/gio v0.0.0-20230427194143-c9c9d8bc704d diff --git a/go.sum b/go.sum index f51b80a..72cf04e 100644 --- a/go.sum +++ b/go.sum @@ -87,6 +87,8 @@ github.com/nicksnyder/go-i18n/v2 v2.2.1 h1:aOzRCdwsJuoExfZhoiXHy4bjruwCMdt5otbYo github.com/nicksnyder/go-i18n/v2 v2.2.1/go.mod h1:fF2++lPHlo+/kPaj3nB0uxtPwzlPm+BlgwGX7MkeGj0= github.com/olebeck/dragonfly v0.9.4-11 h1:FkDKWUT1Kz6WRRxCLmCcFsZiocu9/htkyyEfTgKaVio= github.com/olebeck/dragonfly v0.9.4-11/go.mod h1:1XIP+EcgRnxAEkFEbqZE3T4vXyMufzdpnigwczMBbyo= +github.com/olebeck/dragonfly v0.9.4-12 h1:jiD3Nr5SA/Asj6bdePAx25uMBkyUr9jxAwbjODHYgKM= +github.com/olebeck/dragonfly v0.9.4-12/go.mod h1:1XIP+EcgRnxAEkFEbqZE3T4vXyMufzdpnigwczMBbyo= github.com/olebeck/gio v0.0.0-20230427194143-c9c9d8bc704d h1:D+Ryca52xv37/p0FsEWfGwAGUZ1vPWpvimA2eMfBijc= github.com/olebeck/gio v0.0.0-20230427194143-c9c9d8bc704d/go.mod h1:8CFQM/4LurRd9G3NUYdacFb9j2pK0LrAyVO2mAZo4mw= github.com/olebeck/gophertunnel v1.28.2-1 h1:+3LaX37suEjMUnUTUKJMetoBqSg5PUkUBJc5dW02WI4= diff --git a/handlers/second-user/provider.go b/handlers/second-user/provider.go index 91d1be8..ce6e179 100644 --- a/handlers/second-user/provider.go +++ b/handlers/second-user/provider.go @@ -5,7 +5,6 @@ import ( "github.com/df-mc/dragonfly/server/block/cube" "github.com/df-mc/dragonfly/server/world" - "github.com/df-mc/dragonfly/server/world/chunk" "github.com/google/uuid" ) @@ -38,27 +37,12 @@ func (p *provider) SavePlayerSpawnPosition(uuid uuid.UUID, pos cube.Pos) error { return nil } -func (p *provider) LoadChunk(position world.ChunkPos, dim world.Dimension) (c *chunk.Chunk, exists bool, err error) { - c, ok := p.s.chunks[position] - return c, ok, nil +func (p *provider) LoadColumn(pos world.ChunkPos, dim world.Dimension) (*world.Column, error) { + return &world.Column{ + Chunk: p.s.chunks[pos], + }, nil } -func (p *provider) SaveChunk(position world.ChunkPos, c *chunk.Chunk, dim world.Dimension) error { - return nil -} - -func (p *provider) LoadEntities(position world.ChunkPos, dim world.Dimension, reg world.EntityRegistry) ([]world.Entity, error) { - return nil, nil -} - -func (p *provider) SaveEntities(position world.ChunkPos, entities []world.Entity, dim world.Dimension) error { - return nil -} - -func (p *provider) LoadBlockNBT(position world.ChunkPos, dim world.Dimension) ([]map[string]any, error) { - return nil, nil -} - -func (p *provider) SaveBlockNBT(position world.ChunkPos, data []map[string]any, dim world.Dimension) error { +func (p *provider) StoreColumn(pos world.ChunkPos, dim world.Dimension, col *world.Column) error { return nil } diff --git a/handlers/worlds/chunk.go b/handlers/worlds/chunk.go index d1326fb..a93523f 100644 --- a/handlers/worlds/chunk.go +++ b/handlers/worlds/chunk.go @@ -48,7 +48,7 @@ func (w *worldsHandler) processLevelChunk(pk *packet.LevelChunk) { w.worldState.blockNBTs[protocol.BlockPos{x, y, z}] = blockNBT } - w.worldState.chunks[pk.Position] = ch + w.worldState.chunks[(world.ChunkPos)(pk.Position)] = ch max := w.worldState.dimension.Range().Height() / 16 switch pk.SubChunkCount { @@ -76,20 +76,20 @@ func (w *worldsHandler) processLevelChunk(pk *packet.LevelChunk) { return sub.Empty() })(ch.Sub()) if !empty { - w.mapUI.SetChunk(pk.Position, ch, true) + w.mapUI.SetChunk((world.ChunkPos)(pk.Position), ch, true) } } } func (w *worldsHandler) processSubChunk(pk *packet.SubChunk) { - posToRedraw := make(map[protocol.ChunkPos]bool) + posToRedraw := make(map[world.ChunkPos]bool) for _, sub := range pk.SubChunkEntries { var ( absX = pk.Position[0] + int32(sub.Offset[0]) absY = pk.Position[1] + int32(sub.Offset[1]) absZ = pk.Position[2] + int32(sub.Offset[2]) - pos = protocol.ChunkPos{absX, absZ} + pos = world.ChunkPos{absX, absZ} ) ch, ok := w.worldState.chunks[pos] if !ok { @@ -137,7 +137,7 @@ func (w *worldsHandler) ProcessChunkPackets(pk packet.Packet) packet.Packet { w.worldState.blockNBTs[pk.Position] = pk.NBTData case *packet.UpdateBlock: if w.settings.BlockUpdates { - cp := protocol.ChunkPos{pk.Position.X() >> 4, pk.Position.Z() >> 4} + cp := world.ChunkPos{pk.Position.X() >> 4, pk.Position.Z() >> 4} c, ok := w.worldState.chunks[cp] if ok { x, y, z := blockPosInChunk(pk.Position) @@ -147,7 +147,7 @@ func (w *worldsHandler) ProcessChunkPackets(pk packet.Packet) packet.Packet { } case *packet.UpdateSubChunkBlocks: if w.settings.BlockUpdates { - cp := protocol.ChunkPos{pk.Position.X(), pk.Position.Z()} + cp := world.ChunkPos{pk.Position.X(), pk.Position.Z()} c, ok := w.worldState.chunks[cp] if ok { for _, bce := range pk.Blocks { diff --git a/handlers/worlds/map_item.go b/handlers/worlds/map_item.go index 4ae6a56..9d644ea 100644 --- a/handlers/worlds/map_item.go +++ b/handlers/worlds/map_item.go @@ -13,6 +13,7 @@ import ( "github.com/go-gl/mathgl/mgl32" "golang.design/x/lockfree" + "github.com/df-mc/dragonfly/server/world" "github.com/df-mc/dragonfly/server/world/chunk" "github.com/sandertv/gophertunnel/minecraft/protocol" "github.com/sandertv/gophertunnel/minecraft/protocol/packet" @@ -262,8 +263,8 @@ func (m *MapUI) ToImage() *image.RGBA { return img } -func (m *MapUI) SetChunk(pos protocol.ChunkPos, ch *chunk.Chunk, complete bool) { - m.renderQueue.Enqueue(&RenderElem{pos, ch}) +func (m *MapUI) SetChunk(pos world.ChunkPos, ch *chunk.Chunk, complete bool) { + m.renderQueue.Enqueue(&RenderElem{(protocol.ChunkPos)(pos), ch}) m.SchedRedraw() } diff --git a/handlers/worlds/world.go b/handlers/worlds/world.go index 3713fd9..aa97ef5 100644 --- a/handlers/worlds/world.go +++ b/handlers/worlds/world.go @@ -54,7 +54,7 @@ type WorldSettings struct { type worldState struct { dimension world.Dimension - chunks map[protocol.ChunkPos]*chunk.Chunk + chunks map[world.ChunkPos]*chunk.Chunk blockNBTs map[protocol.BlockPos]map[string]any entities map[uint64]*entityState openItemContainers map[byte]*itemContainer @@ -218,7 +218,7 @@ func (w *worldsHandler) currentName() string { func (w *worldsHandler) Reset() { w.worldState = worldState{ dimension: w.worldState.dimension, - chunks: make(map[protocol.ChunkPos]*chunk.Chunk), + chunks: make(map[world.ChunkPos]*chunk.Chunk), blockNBTs: make(map[protocol.BlockPos]map[string]any), entities: make(map[uint64]*entityState), openItemContainers: make(map[byte]*itemContainer), @@ -228,11 +228,11 @@ func (w *worldsHandler) Reset() { } func (w *worldState) cullChunks() { - keys := make([]protocol.ChunkPos, 0, len(w.chunks)) + keys := make([]world.ChunkPos, 0, len(w.chunks)) for cp := range w.chunks { keys = append(keys, cp) } - for _, cp := range fp.Filter(func(cp protocol.ChunkPos) bool { + for _, cp := range fp.Filter(func(cp world.ChunkPos) bool { return !fp.Some(func(sc *chunk.SubChunk) bool { return !sc.Empty() })(w.chunks[cp].Sub()) @@ -250,32 +250,25 @@ func (w *worldState) Save(folder string) (*mcdb.DB, error) { return nil, err } - // save chunk data - for cp, c := range w.chunks { - provider.SaveChunk((world.ChunkPos)(cp), c, w.dimension) - } - - // save block nbt data chunkBlockNBT := make(map[world.ChunkPos][]map[string]any) for bp, blockNBT := range w.blockNBTs { // 3d to 2d cp := world.ChunkPos{bp.X() >> 4, bp.Z() >> 4} chunkBlockNBT[cp] = append(chunkBlockNBT[cp], blockNBT) } - for cp, blockNBT := range chunkBlockNBT { - err = provider.SaveBlockNBT(cp, blockNBT, w.dimension) - if err != nil { - logrus.Error(err) - } - } - // save entities chunkEntities := make(map[world.ChunkPos][]world.Entity) for _, es := range w.entities { cp := world.ChunkPos{int32(es.Position.X()) >> 4, int32(es.Position.Z()) >> 4} chunkEntities[cp] = append(chunkEntities[cp], es.ToServerEntity()) } - for cp, v := range chunkEntities { - err = provider.SaveEntities(cp, v, w.dimension) + + // save chunk data + for cp, c := range w.chunks { + column := &world.Column{ + Chunk: c, + Entities: chunkEntities[cp], + } + err = provider.StoreColumn(cp, w.dimension, column) if err != nil { logrus.Error(err) }