summaryrefslogtreecommitdiff
path: root/server/commands.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/commands.go')
-rw-r--r--server/commands.go89
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
}