diff options
| author | raven <citrons@mondecitronne.com> | 2026-03-21 16:17:22 -0500 |
|---|---|---|
| committer | raven <citrons@mondecitronne.com> | 2026-03-21 16:17:22 -0500 |
| commit | 9e4b5390e83a46a99faf28884c0817738beeb605 (patch) | |
| tree | 0282fd60206384415602cfcaec1ace98fa7fdf95 | |
| parent | f29c5d9c8a25d1271b51203f0a481fc33f08d564 (diff) | |
/createLevel command
| -rw-r--r-- | server/commands.go | 62 | ||||
| -rw-r--r-- | server/level.go | 9 | ||||
| -rw-r--r-- | server/player.go | 2 | ||||
| -rw-r--r-- | server/server.go | 27 |
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 { |
