修复问题、添加give命令

修复使用除主角外角色无法进入的问题
新增give命令 武器数量 精炼 角色等级 命座等后期增加参数
This commit is contained in:
UnKownOwO
2022-11-26 16:30:36 +08:00
parent 5fa5ef5e01
commit 86a65e6f9b
9 changed files with 274 additions and 65 deletions

View File

@@ -11,8 +11,9 @@ func (c *CommandManager) HelpCommand(cmd *CommandMessage) {
executor := cmd.Executor
c.SendMessage(executor,
"===== 帮助 / Help =====\n"+
"传送:/tp {-u [UID]} {-s [场景ID]} -x [坐标X] -y [坐标Y] -z [坐标Z]\n",
"========== 帮助 / Help ==========\n\n"+
"传送:/tp [-u <UID>] [-s <场景ID>] -x <坐标X> -y <坐标Y> -z <坐标Z>\n\n"+
"给予:/give [-u <UID>] [-c <数量>] -i <物品ID|武器ID|角色ID/item/weapon/avatar/all>\n",
)
}
@@ -29,7 +30,7 @@ func (c *CommandManager) OpCommand(cmd *CommandMessage) {
}
// TeleportCommand 传送玩家命令
// tp {-u [userId]} {-s [sceneId]} -x [posX] -y [posY] -z [posZ]
// tp [-u <userId>] [-s <sceneId>] -x <posX> -y <posY> -z <posZ>
func (c *CommandManager) TeleportCommand(cmd *CommandMessage) {
game := c.gameManager
@@ -42,14 +43,14 @@ 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
}
// 初始值
target := player
sceneId := target.SceneId
pos := &model.Vector{}
target := player // 目标
sceneId := target.SceneId // 场景Id
pos := &model.Vector{} // 坐标
// 选择每个参数
for k, v := range cmd.Args {
@@ -57,21 +58,24 @@ func (c *CommandManager) TeleportCommand(cmd *CommandMessage) {
switch k {
case "u":
var t uint64
if t, err = strconv.ParseUint(v, 10, 32); err != nil {
var uid uint64
if uid, err = strconv.ParseUint(v, 10, 32); err != nil {
// 判断目标用户是否在线
if user := game.userManager.GetOnlineUser(uint32(t)); user != nil {
if user := game.userManager.GetOnlineUser(uint32(uid)); user != nil {
target = user
sceneId = target.SceneId
// 防止覆盖用户指定过的sceneId
if target.SceneId != sceneId {
sceneId = target.SceneId
}
} else {
c.SendMessage(player, "目标玩家不在线UID: %v。", v)
return
}
}
case "s":
var s uint64
if s, err = strconv.ParseUint(v, 10, 32); err == nil {
sceneId = uint32(s)
var sid uint64
if sid, err = strconv.ParseUint(v, 10, 32); err == nil {
sceneId = uint32(sid)
}
case "x":
// 玩家此时的位置X
@@ -122,8 +126,133 @@ func (c *CommandManager) TeleportCommand(cmd *CommandMessage) {
}
// 传送玩家
game.TeleportPlayer(target, sceneId, pos)
c.GMTeleportPlayer(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)
c.SendMessage(player, "已将玩家 UID%v 传送至 场景:%v, X%.2f, Y%.2f, Z%.2f。", target.PlayerID, sceneId, pos.X, pos.Y, pos.Z)
}
// GiveCommand 给予物品命令
// give [-u <userId>] [-c <count>] -i <itemId|AvatarId/all>
func (c *CommandManager) GiveCommand(cmd *CommandMessage) {
game := c.gameManager
// 执行者如果不是玩家则必须输入目标UID
player, ok := cmd.Executor.(*model.Player)
if !ok && cmd.Args["u"] == "" {
c.SendMessage(cmd.Executor, "你不是玩家请指定目标UID。")
return
}
// 判断是否填写必备参数
if cmd.Args["i"] == "" {
c.SendMessage(player, "参数不足,正确用法:/%v [-u <UID>] [-c <数量>] -i <物品ID|武器ID|角色ID/item/weapon/avatar/all>。", cmd.Name)
return
}
// 初始值
target := player // 目标
count := uint32(1) // 数量
itemId := uint32(0) // 物品Id
// 给予物品的模式
// once 单个 / all 所有物品
// item 物品 / weapon 武器
mode := "once"
// 选择每个参数
for k, v := range cmd.Args {
var err error
switch k {
case "u":
var uid uint64
if uid, err = strconv.ParseUint(v, 10, 32); err != nil {
// 判断目标用户是否在线
if user := game.userManager.GetOnlineUser(uint32(uid)); user != nil {
target = user
} else {
c.SendMessage(player, "目标玩家不在线UID: %v。", v)
return
}
}
case "c":
var cnt uint64
if cnt, err = strconv.ParseUint(v, 10, 32); err == nil {
count = uint32(cnt)
}
case "i":
switch v {
case "all", "item", "avatar", "weapon":
// 将模式修改为参数的值
mode = v
default:
var id uint64
if id, err = strconv.ParseUint(v, 10, 32); err != nil {
c.SendMessage(player, "参数 -%v 有误,允许内容: <item | weapon | avatar | all>。", k)
return
}
itemId = uint32(id)
}
default:
c.SendMessage(player, "参数 -%v 冗余。", k)
return
}
// 解析错误的话应该是参数类型问题
if err != nil {
c.SendMessage("参数 -%v 有误,类型错误。", k)
return
}
}
switch mode {
case "once":
// 判断是否为物品
_, ok := game.GetAllItemDataConfig()[int32(itemId)]
if ok {
// 给予玩家物品
c.GMAddUserItem(target.PlayerID, itemId, count)
c.SendMessage(player, "已给予玩家 UID%v, 物品ID: %v*数量: %v。", target.PlayerID, itemId, count)
return
}
// 判断是否为武器
_, ok = game.GetAllWeaponDataConfig()[int32(itemId)]
if ok {
// 给予玩家武器
c.GMAddUserWeapon(target.PlayerID, itemId, count)
c.SendMessage(player, "已给予玩家 UID%v, 武器ID%v*数量:%v。", target.PlayerID, itemId, count)
return
}
// 判断是否为角色
_, ok = game.GetAllAvatarDataConfig()[int32(itemId)]
if ok {
// 给予玩家武器
c.GMAddUserAvatar(target.PlayerID, itemId)
c.SendMessage(player, "已给予玩家 UID%v, 角色ID%v*数量:%v。", target.PlayerID, itemId, count)
return
}
// 都执行到这里那肯定是都不匹配
c.SendMessage(player, "物品ID%v 不存在。", itemId)
case "item":
// 给予玩家所有物品
c.GMAddUserAllItem(target.PlayerID, count)
c.SendMessage(player, "已给予玩家 UID%v, 所有物品*%v。", target.PlayerID, count)
case "weapon":
// 给予玩家所有武器
c.GMAddUserAllWeapon(target.PlayerID, count)
c.SendMessage(player, "已给予玩家 UID%v, 所有武器*%v。", target.PlayerID, count)
case "avatar":
// 给予玩家所有角色
c.GMAddUserAllAvatar(target.PlayerID)
c.SendMessage(player, "已给予玩家 UID%v, 所有角色。", target.PlayerID)
case "all":
// 给予玩家所有物品
c.GMAddUserAllItem(target.PlayerID, count)
// 给予玩家所有武器
c.GMAddUserAllWeapon(target.PlayerID, count)
// 给予玩家所有角色
c.GMAddUserAllAvatar(target.PlayerID)
c.SendMessage(player, "已给予玩家 UID%v, 所有内容。", target.PlayerID)
}
}