From 5fa5ef5e0145280b77b345183937242f4587246d Mon Sep 17 00:00:00 2001 From: UnKownOwO <80520429@qq.com> Date: Sat, 26 Nov 2022 11:42:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=BD=E4=BB=A4=E7=AE=A1=E7=90=86=E5=99=A8?= =?UTF-8?q?=E7=BB=86=E8=8A=82=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gs/game/command_controller.go | 12 ++++++------ gs/game/command_manager.go | 35 ++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/gs/game/command_controller.go b/gs/game/command_controller.go index 50051856..be56c0fc 100644 --- a/gs/game/command_controller.go +++ b/gs/game/command_controller.go @@ -12,7 +12,7 @@ func (c *CommandManager) HelpCommand(cmd *CommandMessage) { c.SendMessage(executor, "===== 帮助 / Help =====\n"+ - "传送: /tp {-u [UID]} {-s [场景ID]} -x [坐标X] -y [坐标Y] -z [坐标Z]\n", + "传送:/tp {-u [UID]} {-s [场景ID]} -x [坐标X] -y [坐标Y] -z [坐标Z]\n", ) } @@ -25,7 +25,7 @@ func (c *CommandManager) OpCommand(cmd *CommandMessage) { } player.IsGM = 1 - c.SendMessage(player, "权限修改完毕, 现在你是GM啦 %v", cmd.Args) + c.SendMessage(player, "权限修改完毕,现在你是GM啦 %v", cmd.Args) } // TeleportCommand 传送玩家命令 @@ -42,7 +42,7 @@ func (c *CommandManager) TeleportCommand(cmd *CommandMessage) { // 判断是否填写必备参数 if cmd.Args["x"] == "" || cmd.Args["y"] == "" || cmd.Args["z"] == "" { - c.SendMessage(player, "参数不足, 正确用法: /%v {-u [UID]} {-s [场景ID]} -x [坐标X] -y [坐标Y] -z [坐标Z]。", cmd.Name) + c.SendMessage(player, "参数不足,正确用法:/%v {-u [UID]} {-s [场景ID]} -x [坐标X] -y [坐标Y] -z [坐标Z]。", cmd.Name) return } @@ -64,7 +64,7 @@ func (c *CommandManager) TeleportCommand(cmd *CommandMessage) { target = user sceneId = target.SceneId } else { - c.SendMessage(player, "目标玩家不在线, UID: %v。", v) + c.SendMessage(player, "目标玩家不在线,UID: %v。", v) return } } @@ -116,7 +116,7 @@ func (c *CommandManager) TeleportCommand(cmd *CommandMessage) { // 解析错误的话应该是参数类型问题 if err != nil { - c.SendMessage("参数 -%v 有误, 类型错误。", k) + c.SendMessage("参数 -%v 有误,类型错误。", k) return } } @@ -125,5 +125,5 @@ func (c *CommandManager) TeleportCommand(cmd *CommandMessage) { game.TeleportPlayer(target, sceneId, pos) // 发送消息给执行者 - c.SendMessage(player, "已将玩家 UID: %v 传送至 场景: %v X: %v Y: %v Z:%v。", target.PlayerID, sceneId, pos.X, pos.Y, pos.Z) + c.SendMessage(player, "已将玩家 UID:%v 传送至 场景:%v X:%.2f Y:%.2f Z:%.2f。", target.PlayerID, sceneId, pos.X, pos.Y, pos.Z) } diff --git a/gs/game/command_manager.go b/gs/game/command_manager.go index 09f802b6..9f65be11 100644 --- a/gs/game/command_manager.go +++ b/gs/game/command_manager.go @@ -113,6 +113,7 @@ func (c *CommandManager) InputCommand(executor any, text string) { // 确保消息文本为 / 开头 // 如果不为这个开头那接下来就毫无意义 if strings.HasPrefix(text, "/") { + logger.LOG.Debug("command input, uid: %v, text: %v", c.GetExecutorId(executor), text) // 输入的命令将在其他协程中处理 c.commandTextInput <- &CommandMessage{Executor: executor, Text: text} @@ -122,6 +123,9 @@ func (c *CommandManager) InputCommand(executor any, text string) { // HandleCommand 处理命令 // 主协程接收到命令消息后执行 func (c *CommandManager) HandleCommand(cmd *CommandMessage) { + executor := cmd.Executor + logger.LOG.Debug("command handle, uid: %v, text: %v", c.GetExecutorId(executor), cmd.Text) + // 将开头的 / 去掉 并 分割出命令的每个参数 // 不区分命令的大小写 统一转为小写 cmdSplit := strings.Split(strings.ToLower(cmd.Text[1:]), " -") @@ -147,7 +151,9 @@ func (c *CommandManager) HandleCommand(cmd *CommandMessage) { // 分割出来的参数只有一个那肯定不是键值对 if len(cmdArg) < 2 { - logger.LOG.Debug("command arg error, arg: %v", cmdArg) + logger.LOG.Debug("command arg error, uid: %v, name: %v, arg: %v, text: %v", c.GetExecutorId(executor), cmd.Name, cmdSplit, cmd.Text) + c.SendMessage(executor, "格式错误,用法: /[命令名] -[参数名] [参数]。") + return } argKey := cmdArg[0] // 参数的键 @@ -181,12 +187,13 @@ func (c *CommandManager) GetFriendList(friendList map[uint32]bool) map[uint32]bo // ExecCommand 执行命令 func (c *CommandManager) ExecCommand(cmd *CommandMessage) { executor := cmd.Executor + logger.LOG.Debug("command exec, uid: %v, name: %v, args: %v", c.GetExecutorId(executor), cmd.Name, cmd.Args) // 判断命令是否注册 cmdFunc, ok := c.commandFuncRouter[cmd.Name] if !ok { // 玩家可能会执行一些没有的命令仅做调试输出 - logger.LOG.Debug("exec command not exist, name: %v", cmd.Name) + logger.LOG.Debug("exec command not exist, uid: %v, name: %v", c.GetExecutorId(executor), cmd.Name) c.SendMessage(executor, "命令不存在,输入 /help 查看帮助。") return } @@ -194,22 +201,21 @@ func (c *CommandManager) ExecCommand(cmd *CommandMessage) { cmdPerm, ok := c.commandPermMap[cmd.Name] if !ok { // 一般命令权限都会注册 没注册则报error错误 - logger.LOG.Error("exec command permission not exist, name: %v", cmd.Name) + logger.LOG.Error("command exec permission not exist, name: %v", cmd.Name) return } - // 执行者是否为玩家 - player, ok := executor.(*model.Player) // 判断玩家的权限是否符合要求 + player, ok := executor.(*model.Player) if ok && player.IsGM < uint8(cmdPerm) { logger.LOG.Debug("exec command permission denied, uid: %v, isGM: %v", player.PlayerID, player.IsGM) c.SendMessage(player, "权限不足,该命令需要%v级权限。\n你目前的权限等级:%v", cmdPerm, player.IsGM) return } - logger.LOG.Debug("command start, name: %v, args: $v", cmd.Name, cmd.Args) + logger.LOG.Debug("command start, uid: %v, name: %v, args: %v", c.GetExecutorId(executor), cmd.Name, cmd.Args) cmdFunc(cmd) // 执行命令 - logger.LOG.Debug("command done, name: %v, args: $v", cmd.Name, cmd.Args) + logger.LOG.Debug("command done, uid: %v, name: %v, args: %v", c.GetExecutorId(executor), cmd.Name, cmd.Args) } // SendMessage 发送消息 @@ -230,3 +236,18 @@ func (c *CommandManager) SendMessage(executor any, msg string, param ...any) { logger.LOG.Error("command executor type error, type: %T", executor) } } + +// GetExecutorId 获取执行者的Id +// 目前仅用于调试输出 +func (c *CommandManager) GetExecutorId(executor any) (userId any) { + switch executor.(type) { + case *model.Player: + player := executor.(*model.Player) + userId = player.PlayerID + case string: + userId = executor + default: + userId = fmt.Sprintf("%T", executor) + } + return +}