diff options
| author | raven <citrons@mondecitronne.com> | 2026-03-27 18:31:55 -0500 |
|---|---|---|
| committer | raven <citrons@mondecitronne.com> | 2026-03-27 18:32:26 -0500 |
| commit | 680875b5afece00a5dce5562ffafeea757c9931d (patch) | |
| tree | 6ae560a951ee756854b666749cfda5cf07f650c9 /server | |
| parent | 609cbf280f93aec69744681a03d1d9ffdde55f59 (diff) | |
Diffstat (limited to 'server')
| -rw-r--r-- | server/commands.go | 10 | ||||
| -rw-r--r-- | server/gen.go | 62 | ||||
| -rw-r--r-- | server/level.go | 70 | ||||
| -rw-r--r-- | server/server.go | 2 |
4 files changed, 68 insertions, 76 deletions
diff --git a/server/commands.go b/server/commands.go index 9274a41..548cc11 100644 --- a/server/commands.go +++ b/server/commands.go @@ -192,16 +192,16 @@ var commands = map[string]commandHandler { id, lvl := ctx.server.newLevel(levelInfo {Size: size}) ctx.sender.OnCommandOutput(ctx.server, "Generating level...") go func() { + v := lvl.mapM.Blocks switch genType { case "flat": - lvl.generateFlat() - case "empty": - lvl.generateEmpty() + generateFlat(v) case "sphere": - lvl.generateSphere() + generateSphere(v) case "debug": - lvl.generateDebug() + generateDebug(v) } + lvl.Act(nil, lvl.loadDone) ctx.sender.OnCommandOutput(ctx.server, fmt.Sprintf("Generated level ID %d.", id), ) diff --git a/server/gen.go b/server/gen.go new file mode 100644 index 0000000..68f9e5c --- /dev/null +++ b/server/gen.go @@ -0,0 +1,62 @@ +package server + +import "math" + +func generateFlat(v *blockVolume) { + v.syncSetAll(func(yield func(blockType) bool) { + var p blockPos + for p.Y = 0; p.Y < v.size.Y / 2; p.Y++ { + for p.X = 0; p.X < v.size.X; p.X++ { + for p.Z = 0; p.Z < v.size.Z; p.Z++ { + var block blockType + if p.Y == 0 { + block = 7 + } else if p.Y == v.size.Y/2 - 1 { + block = 2 + } else if p.Y > v.size.Y/2 - 15 { + block = 3 + } else if p.Y < v.size.Y/2 { + block = 1 + } + if !yield(block) { + return + } + } + } + } + }) +} + +func generateSphere(v *blockVolume) { + v.syncSetAll(func(yield func(blockType) bool) { + var (p blockPos; radius = float64(v.size.X) / 2) + for p.Y = 0; p.Y < v.size.Y; p.Y++ { + for p.X = 0; p.X < v.size.X; p.X++ { + for p.Z = 0; p.Z < v.size.Z; p.Z++ { + var block blockType + dist := math.Sqrt( + float64(v.size.X/2 - p.X)*float64(v.size.X/2 - p.X) + + float64(v.size.Y/2 - p.Y)*float64(v.size.Y/2 - p.Y) + + float64(v.size.Z/2 - p.Z)*float64(v.size.Z/2 - p.Z), + ) + if dist > radius - 2 && dist <= radius { + block = 25 + } + if !yield(block) { + return + } + } + } + } + }) +} + +func generateDebug(v *blockVolume) { + v.syncSetAll(func(yield func(blockType) bool) { + for i := 0; i < 256; i++ { + if !yield(blockType(i)) { + return + } + } + }) +}
\ No newline at end of file diff --git a/server/level.go b/server/level.go index 7b03aca..010ef37 100644 --- a/server/level.go +++ b/server/level.go @@ -4,7 +4,6 @@ import ( "io" "os" "fmt" - "math" "bufio" "git.citrons.xyz/metronode/phony" ) @@ -145,75 +144,6 @@ func (l *level) save(done func()) { }() } -func (l *level) generateFlat() { - v := l.mapM.Blocks - v.syncSetAll(func(yield func(blockType) bool) { - var p blockPos - for p.Y = 0; p.Y < v.size.Y / 2; p.Y++ { - for p.X = 0; p.X < v.size.X; p.X++ { - for p.Z = 0; p.Z < v.size.Z; p.Z++ { - var block blockType - if p.Y == 0 { - block = 7 - } else if p.Y == v.size.Y/2 - 1 { - block = 2 - } else if p.Y > v.size.Y/2 - 15 { - block = 3 - } else if p.Y < v.size.Y/2 { - block = 1 - } - if !yield(block) { - return - } - } - } - } - }) - l.Act(nil, l.loadDone) -} - -func (l *level) generateEmpty() { - l.Act(nil, l.loadDone) -} - -func (l *level) generateSphere() { - v := l.mapM.Blocks - v.syncSetAll(func(yield func(blockType) bool) { - var (p blockPos; radius = float64(v.size.X) / 2) - for p.Y = 0; p.Y < v.size.Y; p.Y++ { - for p.X = 0; p.X < v.size.X; p.X++ { - for p.Z = 0; p.Z < v.size.Z; p.Z++ { - var block blockType - dist := math.Sqrt( - float64(v.size.X/2 - p.X)*float64(v.size.X/2 - p.X) + - float64(v.size.Y/2 - p.Y)*float64(v.size.Y/2 - p.Y) + - float64(v.size.Z/2 - p.Z)*float64(v.size.Z/2 - p.Z), - ) - if dist > radius - 2 && dist <= radius { - block = 25 - } - if !yield(block) { - return - } - } - } - } - }) - l.Act(nil, l.loadDone) -} - -func (l *level) generateDebug() { - v := l.mapM.Blocks - v.syncSetAll(func(yield func(blockType) bool) { - for i := 0; i < 256; i++ { - if !yield(blockType(i)) { - return - } - } - }) - l.Act(nil, l.loadDone) -} - func (l *level) Save(from phony.Actor, done func()) { l.Act(from, func() { l.save(func() { diff --git a/server/server.go b/server/server.go index 4923777..feed147 100644 --- a/server/server.go +++ b/server/server.go @@ -93,7 +93,7 @@ func NewServer(info ServerInfo) *Server { Size: blockPos {X: 64, Y: 64, Z: 64}, IsSpawn: true, }) - spawnLevel.generateFlat() + generateFlat(spawnLevel.mapM.Blocks) s.SpawnPos = entityPos { 32*blockSize, 32*blockSize + playerHeight, |
