package hero import ( "go_dreamfactory/comm" "go_dreamfactory/pb" "google.golang.org/protobuf/proto" ) //参数校验 func (this *apiComp) StrengthenUplvCheck(session comm.IUserSession, req *pb.HeroStrengthenUplvReq) (code pb.ErrorCode) { if req.HeroObjID == "" || len(req.ExpCards) == 0 { code = pb.ErrorCode_ReqParameterError return } for _, v := range req.ExpCards { if v.Value <= 0 || v.Key == "" { code = pb.ErrorCode_ReqParameterError return } } return } /// 英雄升级 func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStrengthenUplvReq) (code pb.ErrorCode, data proto.Message) { var ( addExp int32 // 需要增加的经验 costGold int64 // 需要消耗的资源 _hero *pb.DBHero // 目标英雄 _costExpHero map[string]*pb.DBHero // 消耗英雄 minAddExp int32 _changeHero []*pb.DBHero // 变化的英雄 _mapCost map[string]int32 // ) _costExpHero = make(map[string]*pb.DBHero, 0) _mapCost = make(map[string]int32, 0) for _, v := range req.ExpCards { // 数组转map _mapCost[v.Key] += v.Value } code = this.StrengthenUplvCheck(session, req) // check if code != pb.ErrorCode_Success { return } _hero, code = this.module.GetHeroByObjID(session.GetUserId(), req.HeroObjID) if code != pb.ErrorCode_Success { return } // 只有英雄卡才能升级 if _hero.CardType != comm.CardTypeHero && _hero.CardType != comm.CardTypeStar { code = pb.ErrorCode_HeroTypeErr return } for k, v := range _mapCost { _expHero, c := this.module.GetHeroByObjID(session.GetUserId(), k) // 校验需要消耗经验卡牌的对象是否存在 code = c if code != pb.ErrorCode_Success { return } if _expHero.Block { // 锁定的卡不允许被消耗 code = pb.ErrorCode_HeroIsLock return } if _expHero.CardType != comm.CardTypeLevel { code = pb.ErrorCode_HeroTypeErr return } if v > _expHero.SameCount { // 校验数量 code = pb.ErrorCode_HeroNoEnough return } // 查询 本次消耗会获得多少经验 expConf := this.module.configure.GetHeroExp(_expHero.HeroID) if expConf != nil { addExp += expConf.Heroexp * v } costGold += int64(expConf.Needgold * v) // 需要消耗的金币 if _expHero.SameCount < v { // 消耗经验卡片数量不足 code = pb.ErrorCode_HeroNoEnough return } if minAddExp == 0 { minAddExp = expConf.Heroexp //初始化 } else if minAddExp > expConf.Heroexp { minAddExp = expConf.Heroexp // 取出最小的经验卡 } _costExpHero[k] = _expHero } // 金币消耗判断 curGold := this.module.ModuleUser.QueryAttributeValue(session.GetUserId(), comm.ResGold) if curGold < costGold { // 金币不足 code = pb.ErrorCode_GoldNoEnough return } if addExp == 0 { code = pb.ErrorCode_HeroExpTypeErr return } // 校验当前能不能升级 if _hero.Lv > _hero.Star*comm.HeroStarLvRatio { // 达到最大等级 code = pb.ErrorCode_HeroMaxLv return } curLv := _hero.Lv // 执行升级逻辑 newhero, code := this.module.modelHero.AddCardExp(session, _hero, addExp) // 加经验 if code != pb.ErrorCode_Success { return } iLvUp := _hero.Lv - curLv // 消耗金币 code = this.module.ModuleUser.AddAttributeValue(session, comm.ResGold, -int32(costGold), true) if code != pb.ErrorCode_Success { // 金币不足 code = pb.ErrorCode_GoldNoEnough return } // 删除经验卡 for k, v := range _mapCost { err1 := this.module.modelHero.consumeHeroCard(session.GetUserId(), _costExpHero[k], v) if err1 != nil { code = pb.ErrorCode_HeroNoEnough this.module.Errorf("delete err failed err:%T!", err1) this.module.ModuleUser.AddAttributeValue(session, comm.ResGold, int32(costGold), true) // 回退金币 return } _changeHero = append(_changeHero, _costExpHero[k]) } if iLvUp > 0 { this.module.modelHero.ChangeHeroProperty(session, _hero) // 重新计算属性值 } _changeHero = append(_changeHero, _hero) // 升级后的英雄 hero id 不变 if newhero != nil { _changeHero = append(_changeHero, newhero) // 原来的英雄 只是数量变化了 } //英雄升级 【玩家名称】已将【英雄名称】培养至60级! if user := this.module.ModuleUser.GetUser(session.GetUserId()); user != nil { this.chat.SendSysChatToWorld(comm.ChatSystem7, nil, _hero.Lv, 0, user.Name, _hero.HeroID) } else { this.module.Errorf("no found userdata uid:%s", session.GetUserId()) } session.SendMsg(string(this.module.GetType()), "change", &pb.HeroChangePush{List: _changeHero}) session.SendMsg(string(this.module.GetType()), StrengthenUplv, &pb.HeroStrengthenUplvResp{Hero: _hero}) return }