summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/commands.go62
-rw-r--r--server/level.go9
-rw-r--r--server/player.go2
-rw-r--r--server/server.go27
4 files changed, 90 insertions, 10 deletions
diff --git a/server/commands.go b/server/commands.go
index 1bad5f6..5ec321a 100644
--- a/server/commands.go
+++ b/server/commands.go
@@ -1,6 +1,7 @@
package server
import (
+ "fmt"
"sort"
"strconv"
"strings"
@@ -128,6 +129,66 @@ var commands = map[string]commandHandler {
}
return ""
},
+ "createLevel": func(ctx commandCtx) string {
+ var (
+ ok = true
+ size = blockPos {256, 256, 256}
+ genType = "flat"
+ )
+ ctx.arg.flags["--size"] = func(arg *arguments) {
+ var coords []int
+ for i := 0; i < 3; i++ {
+ coord, k := arg.nextArg()
+ i, err := strconv.Atoi(coord)
+ ok = ok && k && err == nil
+ coords = append(coords, i)
+ }
+ if !ok {
+ return
+ }
+ size = blockPos {
+ X: blockCoord(coords[0]),
+ Y: blockCoord(coords[1]),
+ Z: blockCoord(coords[2]),
+ }
+ }
+ ctx.arg.flags["--gen"] = func(arg *arguments) {
+ var k bool
+ genType, k = arg.nextArg()
+ ok = ok && k
+ }
+ ok = ok && len(ctx.arg.allArgs()) == 0
+ if !ok {
+ return usage("createLevel")
+ }
+ switch genType {
+ case "flat", "empty":
+ default:
+ return "Unknown generation type: " + genType
+ }
+ id, lvl := ctx.server.newLevel(levelInfo {Size: size})
+ lvl.Act(nil, func() {
+ ctx.sender.OnCommandOutput(ctx.server, "Creating level...")
+ switch genType {
+ case "flat":
+ lvl.generateFlat()
+ case "empty":
+ lvl.generateEmpty()
+ }
+ ctx.sender.OnCommandOutput(ctx.server,
+ fmt.Sprintf("Generated level id %d.", id),
+ )
+ })
+ switch pl := ctx.sender.(type) {
+ case *player:
+ pl.ChangeLevel(ctx.server, id, entityPos {
+ X: entityCoord(size.X) * blockSize / 2,
+ Y: entityCoord(size.Y) * blockSize / 2 + blockSize,
+ Z: entityCoord(size.Z) * blockSize / 2,
+ })
+ }
+ return ""
+ },
"op": func(ctx commandCtx) string {
name, ok := ctx.arg.nextArg()
if !ok {
@@ -200,6 +261,7 @@ var commands = map[string]commandHandler {
var commandAuth = map[string]authLevel {
"tp": cheatAuth,
+ "createLevel": opAuth,
"op": opAuth,
"deop": opAuth,
"save": opAuth,
diff --git a/server/level.go b/server/level.go
index f36babe..f34bc89 100644
--- a/server/level.go
+++ b/server/level.go
@@ -40,7 +40,7 @@ func newLevel(s *Server, info levelInfo) *level {
return &level {
levelInfo: info,
server: s,
- loadingState: levelLoaded,
+ loadingState: levelLoading,
blocks: make([]byte, info.Size.X * info.Size.Y * info.Size.Z),
ids: make(map[levelPlayerId]*player),
players: make(map[*player]levelPlayerId),
@@ -190,6 +190,13 @@ func (l *level) generateFlat() {
}
}
}
+ l.save(nil)
+ l.loadingState = levelLoaded
+}
+
+func (l *level) generateEmpty() {
+ l.save(nil)
+ l.loadingState = levelLoaded
}
func (l *level) Save(from phony.Actor, done func()) {
diff --git a/server/player.go b/server/player.go
index 396a152..b63bd94 100644
--- a/server/player.go
+++ b/server/player.go
@@ -28,7 +28,7 @@ type playerState struct {
}
const (
- defaultAuth
+ defaultAuth = 0
cheatAuth = 100
opAuth = 200
ConsoleAuth = 900
diff --git a/server/server.go b/server/server.go
index c3e1c6b..c549122 100644
--- a/server/server.go
+++ b/server/server.go
@@ -31,6 +31,7 @@ type Server struct {
}
type worldState struct {
+ LastId levelId
SpawnLevel levelId
SpawnPos entityPos
}
@@ -46,16 +47,17 @@ func NewServer(info ServerInfo) *Server {
err := os.Mkdir("world", 0777)
dataManager.errHand = s
if err == nil {
- spawnLevel := s.newLevel(levelInfo {
- Id: 0,
- Size: blockPos {X: 256, Y: 256, Z: 256},
+ s.LastId = -1
+ var spawnLevel *level
+ s.SpawnLevel, spawnLevel = s.newLevel(levelInfo {
+ Size: blockPos {X: 64, Y: 64, Z: 64},
IsSpawn: true,
})
spawnLevel.generateFlat()
s.SpawnPos = entityPos {
- 128*blockSize,
- 128*blockSize + playerHeight,
- 128*blockSize,
+ 32*blockSize,
+ 32*blockSize + playerHeight,
+ 32*blockSize,
}
} else {
loaded := make(chan worldState, 1)
@@ -205,10 +207,19 @@ func (s *Server) OnSaveError(from phony.Actor, err error) {
func (s *Server) Tick() {
}
-func (s *Server) newLevel(info levelInfo) *level {
+func (s *Server) newLevel(info levelInfo) (levelId, *level) {
+ s.LastId++
+ for {
+ _, err := os.Stat(fmt.Sprintf("world/levels/%d.bin", s.LastId))
+ if err != nil {
+ break
+ }
+ s.LastId++
+ }
+ info.Id = s.LastId
l := newLevel(s, info)
s.levels[info.Id] = l
- return l
+ return s.LastId, l
}
func (s *Server) newPlayer(cl *client, name string) *player {