diff options
Diffstat (limited to 'server/commands.go')
| -rw-r--r-- | server/commands.go | 89 |
1 files changed, 88 insertions, 1 deletions
diff --git a/server/commands.go b/server/commands.go index 8154b7b..1bad5f6 100644 --- a/server/commands.go +++ b/server/commands.go @@ -2,6 +2,7 @@ package server import ( "sort" + "strconv" "strings" ) @@ -59,6 +60,74 @@ func usage(cmd string) string { } var commands = map[string]commandHandler { + "tp": func(ctx commandCtx) string { + var ( + sourcePlayer string + destPlayer string + ) + ctx.arg.flags["-p"] = func(arg *arguments) { + sourcePlayer, _ = arg.nextArg() + } + ctx.arg.flags["-t"] = func(arg *arguments) { + destPlayer, _ = arg.nextArg() + } + for name, pl := range(ctx.server.players) { + if ctx.sender == pl { + sourcePlayer = name + } + } + args := ctx.arg.allArgs() + if sourcePlayer == "" { + return "Teleport who?" + } + if sourcePlayer != "" && ctx.server.players[sourcePlayer] == nil { + return "Unknown player: " + sourcePlayer + } + if destPlayer != "" && ctx.server.players[destPlayer] == nil { + return "Unknown player: " + destPlayer + } + if len(args) == 0 { + if destPlayer == "" { + return usage("tp") + } + var ( + pl1 = ctx.server.players[sourcePlayer] + pl2 = ctx.server.players[destPlayer] + ) + pl2.GetInfo(ctx.server, func(_ string, state playerState) { + pl1.MovePlayer(ctx.server, state.Pos, state.Facing) + }) + } else { + if destPlayer != "" { + return usage("tp") + } + var values []float64 + for _, value := range args { + n, err := strconv.ParseFloat(value, 64) + if err != nil { + return usage("tp") + } + values = append(values, n) + } + if len(values) < 3 { + return usage("tp") + } + pos := entityPos { + fromFloat(values[0]), + fromFloat(values[1]), + fromFloat(values[2]), + } + pl := ctx.server.players[sourcePlayer] + if len(values) == 3 { + pl.MovePlayer(ctx.server, pos, entityFacing {}) + } else if len(values) == 4 { + pl.ChangeLevel(ctx.server, levelId(values[3]), pos) + } else { + return usage("tp") + } + } + return "" + }, "op": func(ctx commandCtx) string { name, ok := ctx.arg.nextArg() if !ok { @@ -130,6 +199,7 @@ var commands = map[string]commandHandler { } var commandAuth = map[string]authLevel { + "tp": cheatAuth, "op": opAuth, "deop": opAuth, "save": opAuth, @@ -137,6 +207,15 @@ var commandAuth = map[string]authLevel { } var help = map[string][]string { + "tp": []string { + "/tp [-p player] <-t player | <x> <y> <z> [level]>", + "* -p: Player to teleport (default: you)", + "* -t: Teleport to player", + "Examples:", + "* /tp 128 128 128 4", + "* /tp -p alice -t eve", + "* /tp -p bob 0 -1000000 0", + }, "op": []string { "/op <player>", "Grant operator status", @@ -160,10 +239,14 @@ var help = map[string][]string { type arguments struct { rd *strings.Reader + flags map[string]func(*arguments) } func parseArgs(command string) arguments { - return arguments {strings.NewReader(command)} + return arguments { + strings.NewReader(command), + make(map[string]func(*arguments)), + } } func (arg *arguments) nextArg() (string, bool) { @@ -207,6 +290,10 @@ func (arg *arguments) nextArg() (string, bool) { } out.WriteByte(b) } + if arg.flags[out.String()] != nil { + arg.flags[out.String()](arg) + return arg.nextArg() + } return out.String(), true } |
