mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-03-01 00:35:36 +08:00
命令管理器细节优化
This commit is contained in:
@@ -12,7 +12,7 @@ func (c *CommandManager) HelpCommand(cmd *CommandMessage) {
|
|||||||
|
|
||||||
c.SendMessage(executor,
|
c.SendMessage(executor,
|
||||||
"===== 帮助 / Help =====\n"+
|
"===== 帮助 / 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
|
player.IsGM = 1
|
||||||
c.SendMessage(player, "权限修改完毕, 现在你是GM啦 %v", cmd.Args)
|
c.SendMessage(player, "权限修改完毕,现在你是GM啦 %v", cmd.Args)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TeleportCommand 传送玩家命令
|
// TeleportCommand 传送玩家命令
|
||||||
@@ -42,7 +42,7 @@ func (c *CommandManager) TeleportCommand(cmd *CommandMessage) {
|
|||||||
|
|
||||||
// 判断是否填写必备参数
|
// 判断是否填写必备参数
|
||||||
if cmd.Args["x"] == "" || cmd.Args["y"] == "" || cmd.Args["z"] == "" {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ func (c *CommandManager) TeleportCommand(cmd *CommandMessage) {
|
|||||||
target = user
|
target = user
|
||||||
sceneId = target.SceneId
|
sceneId = target.SceneId
|
||||||
} else {
|
} else {
|
||||||
c.SendMessage(player, "目标玩家不在线, UID: %v。", v)
|
c.SendMessage(player, "目标玩家不在线,UID: %v。", v)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,7 +116,7 @@ func (c *CommandManager) TeleportCommand(cmd *CommandMessage) {
|
|||||||
|
|
||||||
// 解析错误的话应该是参数类型问题
|
// 解析错误的话应该是参数类型问题
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.SendMessage("参数 -%v 有误, 类型错误。", k)
|
c.SendMessage("参数 -%v 有误,类型错误。", k)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -125,5 +125,5 @@ func (c *CommandManager) TeleportCommand(cmd *CommandMessage) {
|
|||||||
game.TeleportPlayer(target, sceneId, pos)
|
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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ func (c *CommandManager) InputCommand(executor any, text string) {
|
|||||||
// 确保消息文本为 / 开头
|
// 确保消息文本为 / 开头
|
||||||
// 如果不为这个开头那接下来就毫无意义
|
// 如果不为这个开头那接下来就毫无意义
|
||||||
if strings.HasPrefix(text, "/") {
|
if strings.HasPrefix(text, "/") {
|
||||||
|
logger.LOG.Debug("command input, uid: %v, text: %v", c.GetExecutorId(executor), text)
|
||||||
|
|
||||||
// 输入的命令将在其他协程中处理
|
// 输入的命令将在其他协程中处理
|
||||||
c.commandTextInput <- &CommandMessage{Executor: executor, Text: text}
|
c.commandTextInput <- &CommandMessage{Executor: executor, Text: text}
|
||||||
@@ -122,6 +123,9 @@ func (c *CommandManager) InputCommand(executor any, text string) {
|
|||||||
// HandleCommand 处理命令
|
// HandleCommand 处理命令
|
||||||
// 主协程接收到命令消息后执行
|
// 主协程接收到命令消息后执行
|
||||||
func (c *CommandManager) HandleCommand(cmd *CommandMessage) {
|
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:]), " -")
|
cmdSplit := strings.Split(strings.ToLower(cmd.Text[1:]), " -")
|
||||||
@@ -147,7 +151,9 @@ func (c *CommandManager) HandleCommand(cmd *CommandMessage) {
|
|||||||
|
|
||||||
// 分割出来的参数只有一个那肯定不是键值对
|
// 分割出来的参数只有一个那肯定不是键值对
|
||||||
if len(cmdArg) < 2 {
|
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] // 参数的键
|
argKey := cmdArg[0] // 参数的键
|
||||||
@@ -181,12 +187,13 @@ func (c *CommandManager) GetFriendList(friendList map[uint32]bool) map[uint32]bo
|
|||||||
// ExecCommand 执行命令
|
// ExecCommand 执行命令
|
||||||
func (c *CommandManager) ExecCommand(cmd *CommandMessage) {
|
func (c *CommandManager) ExecCommand(cmd *CommandMessage) {
|
||||||
executor := cmd.Executor
|
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]
|
cmdFunc, ok := c.commandFuncRouter[cmd.Name]
|
||||||
if !ok {
|
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 查看帮助。")
|
c.SendMessage(executor, "命令不存在,输入 /help 查看帮助。")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -194,22 +201,21 @@ func (c *CommandManager) ExecCommand(cmd *CommandMessage) {
|
|||||||
cmdPerm, ok := c.commandPermMap[cmd.Name]
|
cmdPerm, ok := c.commandPermMap[cmd.Name]
|
||||||
if !ok {
|
if !ok {
|
||||||
// 一般命令权限都会注册 没注册则报error错误
|
// 一般命令权限都会注册 没注册则报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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 执行者是否为玩家
|
|
||||||
player, ok := executor.(*model.Player)
|
|
||||||
// 判断玩家的权限是否符合要求
|
// 判断玩家的权限是否符合要求
|
||||||
|
player, ok := executor.(*model.Player)
|
||||||
if ok && player.IsGM < uint8(cmdPerm) {
|
if ok && player.IsGM < uint8(cmdPerm) {
|
||||||
logger.LOG.Debug("exec command permission denied, uid: %v, isGM: %v", player.PlayerID, player.IsGM)
|
logger.LOG.Debug("exec command permission denied, uid: %v, isGM: %v", player.PlayerID, player.IsGM)
|
||||||
c.SendMessage(player, "权限不足,该命令需要%v级权限。\n你目前的权限等级:%v", cmdPerm, player.IsGM)
|
c.SendMessage(player, "权限不足,该命令需要%v级权限。\n你目前的权限等级:%v", cmdPerm, player.IsGM)
|
||||||
return
|
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) // 执行命令
|
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 发送消息
|
// 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)
|
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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user