// 游戏服角色相关操作 package action import ( "fmt" "github.com/golang/protobuf/proto" "pro2d/common" "pro2d/common/components" "pro2d/common/db/redisproxy" "pro2d/common/logger" "pro2d/csvdata" "pro2d/models" "pro2d/pb" ) // HeartRpc 心跳请求 func HeartRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { //msg.Conn.SetLastHeartCheckTime() return 0, nil } // getRandomName 随机名字 func getRandomName() string { name := "" for { name = common.RandomName(common.DefaultName) if name == "" { continue } relay, err := redisproxy.SETNX(fmt.Sprintf(common.NickNames, name), "1") if err != nil { continue } if relay.(int64) == 1 { break } } return name } /* CreateRpc 创建角色请求 1: proto解析错误 2: 角色不存在 */ func CreateRpc(role1 *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.CreateReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("CreateRpc err: %v", err) return 1, err } role := models.RoleExistByUid(req.Token) if role != nil { return 2, "role exists" } roleId, err := common.GetNextRoleId() if err != nil { return 3, err } role = models.NewRole(roleId) role.Data.Uid = req.Token role.Data.Level = 1 role.Data.Nick = getRandomName() if err := role.Create(); err != nil { logger.Error("CreateRpc role create err: %v", err) return 4, nil } role.InitRole() return 0, nil } // ChangeTeamRpc 阵容变换 func ChangeTeamRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.ChangeTeamReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("loginRpc err: %v", err) return 1, nil } role.UpdateTeam(req.Team) return 0, nil } /* HeroEquipReferRpc 穿戴/脱 装备 2: 装备不存在 */ func HeroEquipReferRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.HeroEquipReferReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("loginRpc err: %v", err) return 1, nil } for _, equipInfo := range req.EquipIds { ret := role.EquipmentRefer(equipInfo.EquipId, req.HeroId, req.Refer, equipInfo.Pos) if ret != 0 { logger.Error("ret: %d, equipId: %s, heroId: %s, refer: %d, pos:%d", ret, equipInfo.EquipId, req.HeroId, req.Refer, equipInfo.Pos) } } return 0, nil } /* RoleClearItemsRpc 删除物品 2 删除失败 */ func RoleClearItemsRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.RoleClearItemsReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("proto rpc err: %v", err) return 1, nil } bkup := make(common.IMapStringNum) for _, item := range req.Items { for k, v := range common.StringToMapNum(item) { tmp, ok := bkup[k] if !ok { tmp = 0 } bkup[k] = v + tmp } } if !role.CostItems(bkup) { logger.Error("cost err: %s", common.MapNumToString(bkup)) return 2, nil } return 0, nil } /* RoleStartBattleRpc 开始战斗 */ func RoleStartBattleRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.RoleStartBattleReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("loginRpc err: %v", err) return 1, nil } //TODO 消耗体力 return 0, nil } /* RoleEndBattleRpc 结束战斗 2 关卡不存在 RoleEndBattleRsp 返回值 */ func RoleEndBattleRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.RoleEndBattleReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("loginRpc err: %v", err) return 1, nil } chapterInfo := csvdata.Get().TbRogueChapter.Get(req.ChapterId) chapterCount, first := role.Data.Passchapters[req.ChapterId] carbonInfo, ok := chapterInfo.Carbons[req.CarbonId] if !ok { logger.Error("carbonInfo not exists") return 2, nil } //team team, ok := role.Teams[req.TeamId] if !ok { logger.Error("team not exists") return 3, nil } reward := make(common.IMapStringNum) if !first { role.Data.Passchapters[req.ChapterId] = 1 for k, v := range common.StringToMapNum(carbonInfo.FirstAward) { reward[k] = v } } else { role.Data.Passchapters[req.ChapterId] = chapterCount + 1 } role.SetProperty("passchapters", role.Data.Passchapters) for k, v := range common.StringToMapNum(carbonInfo.NormalAward) { rv, ok := reward[k] if !ok { reward[k] = v } else { reward[k] = rv + v } } //award reward = role.Award(reward) //exp var amount int32 if req.Pass { amount = carbonInfo.CarbonExp } else { amount = carbonInfo.CarbonFailExp } level, exp := role.UpLevel(amount) role.UpdateProperties(map[string]interface{}{"level": level, "exp": exp}, true) rsp := &pb.RoleEndBattleRsp{ RoleLevel: level, RoleExp: exp, } //team exp heros := make([]*pb.Hero, 3) t := team.(*models.TeamModel).Data h1, ok := role.Heros[t.HeroId1] if ok { level, exp = h1.(*models.HeroModel).UpLevel(amount) h1.SetProperty("level", level) h1.SetProperty("exp", exp) heros[0] = h1.(*models.HeroModel).Data } h2, ok := role.Heros[t.HeroId2] if ok { level, exp = h2.(*models.HeroModel).UpLevel(amount) h2.SetProperty("level", level) h2.SetProperty("exp", exp) heros[1] = h2.(*models.HeroModel).Data } h3, ok := role.Heros[t.HeroId3] if ok { level, exp = h3.(*models.HeroModel).UpLevel(amount) h3.SetProperty("level", level) h3.SetProperty("exp", exp) heros[2] = h3.(*models.HeroModel).Data } rsp.RoleExpamount = amount rsp.Pass = req.Pass rsp.Reward = common.MapNumToString(reward) rsp.Hero = heros return 0, rsp }