mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-02-04 16:22:27 +08:00
114 lines
3.1 KiB
Go
114 lines
3.1 KiB
Go
package game
|
|
|
|
import (
|
|
"fmt"
|
|
"hk4e/gs/model"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// HelpCommand 帮助命令
|
|
func (c *CommandManager) HelpCommand(cmd *Command) {
|
|
c.gameManager.SendPrivateChat(c.system, cmd.Executor,
|
|
"===== 帮助 / Help =====\n"+
|
|
"以后再写awa\n",
|
|
)
|
|
}
|
|
|
|
// OpCommand 给予权限命令
|
|
func (c *CommandManager) OpCommand(cmd *Command) {
|
|
cmd.Executor.IsGM = 1
|
|
c.gameManager.SendPrivateChat(c.system, cmd.Executor, fmt.Sprintf("权限修改完毕, 现在你是GM啦 %v", cmd.Args))
|
|
}
|
|
|
|
// TeleportCommand 传送玩家命令
|
|
// tp {-u [userId]} {-s [sceneId]} -x [posX] -y [posY] -z [posZ]
|
|
func (c *CommandManager) TeleportCommand(cmd *Command) {
|
|
game := c.gameManager
|
|
player := cmd.Executor
|
|
|
|
// 初始值
|
|
target := player
|
|
sceneId := target.SceneId
|
|
pos := &model.Vector{}
|
|
|
|
// 判断是否填写必备参数
|
|
if cmd.Args["x"] == "" || cmd.Args["y"] == "" || cmd.Args["z"] == "" {
|
|
game.SendPrivateChat(c.system, player, "参数不足, 正确用法 /tp {-u [userId]} {-s [sceneId]} -x [posX] -y [posY] -z [posZ]。")
|
|
return
|
|
}
|
|
|
|
// 选择每个参数
|
|
for k, v := range cmd.Args {
|
|
var err error
|
|
|
|
switch k {
|
|
case "u":
|
|
var t uint64
|
|
if t, err = strconv.ParseUint(v, 10, 32); err != nil {
|
|
// 判断目标用户是否在线
|
|
if target = game.userManager.GetOnlineUser(uint32(t)); target == nil {
|
|
game.SendPrivateChat(c.system, player, fmt.Sprintf("目标玩家不在线, UID: %v。", v))
|
|
return
|
|
}
|
|
}
|
|
case "s":
|
|
var s uint64
|
|
if s, err = strconv.ParseUint(v, 10, 32); err == nil {
|
|
sceneId = uint32(s)
|
|
}
|
|
case "x":
|
|
// 玩家此时的位置X
|
|
var nowX float64
|
|
// 如果以 ~ 开头则 此时位置加 ~ 后的数
|
|
if strings.HasPrefix(v, "~") {
|
|
v = v[1:] // 去除 ~
|
|
nowX = player.Pos.X // 先记录
|
|
}
|
|
var x float64
|
|
if x, err = strconv.ParseFloat(v, 64); err == nil {
|
|
pos.X = x + nowX // 如果不以 ~ 开头则加 0
|
|
}
|
|
case "y":
|
|
// 玩家此时的位置Z
|
|
var nowY float64
|
|
// 如果以 ~ 开头则 此时位置加 ~ 后的数
|
|
if strings.HasPrefix(v, "~") {
|
|
v = v[1:] // 去除 ~
|
|
nowY = player.Pos.Y // 先记录
|
|
}
|
|
var y float64
|
|
if y, err = strconv.ParseFloat(v, 64); v != "~" && err == nil {
|
|
pos.Y = y + nowY
|
|
}
|
|
case "z":
|
|
// 玩家此时的位置Z
|
|
var nowZ float64
|
|
// 如果以 ~ 开头则 此时位置加 ~ 后的数
|
|
if strings.HasPrefix(v, "~") {
|
|
v = v[1:] // 去除 ~
|
|
nowZ = player.Pos.Z // 先记录
|
|
}
|
|
var z float64
|
|
if z, err = strconv.ParseFloat(v, 64); v != "~" && err == nil {
|
|
pos.Z = z + nowZ
|
|
}
|
|
default:
|
|
game.SendPrivateChat(c.system, player, fmt.Sprintf("参数 -%v 冗余。", k))
|
|
return
|
|
}
|
|
|
|
// 解析错误的话应该是参数类型问题
|
|
if err != nil {
|
|
game.SendPrivateChat(c.system, player, fmt.Sprintf("参数 -%v 有误, 类型错误。", k))
|
|
return
|
|
}
|
|
}
|
|
|
|
// 传送玩家
|
|
game.TeleportPlayer(target, sceneId, pos)
|
|
|
|
// 发送消息给执行者
|
|
game.SendPrivateChat(c.system, player, fmt.Sprintf("已将玩家 UID: %v 传送至 区域: %v X: %v Y: %v Z:%v。", target.PlayerID, sceneId, pos.X, pos.Y, pos.Z))
|
|
}
|