summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/commands.go10
-rw-r--r--server/gen.go62
-rw-r--r--server/level.go70
-rw-r--r--server/server.go2
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,