diff --git a/modules/hero/api_awaken.go b/modules/hero/api_awaken.go index 96357ad74..093777539 100644 --- a/modules/hero/api_awaken.go +++ b/modules/hero/api_awaken.go @@ -87,7 +87,7 @@ func (this *apiComp) Awaken(session comm.IUserSession, req *pb.HeroAwakenReq) (c if err == nil { property[awakenData.Phasebonus[0]] += int32(value) } - this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero.Id, property) + this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero, property) _hero.JuexingLv += 1 _heroMap := map[string]interface{}{ "juexingLv": _hero.JuexingLv, diff --git a/modules/hero/api_resonanceReset.go b/modules/hero/api_resonanceReset.go index 007da2c57..b40debd7d 100644 --- a/modules/hero/api_resonanceReset.go +++ b/modules/hero/api_resonanceReset.go @@ -64,7 +64,7 @@ func (this *apiComp) ResonanceReset(session comm.IUserSession, req *pb.HeroReson property[comm.HpPro] -= _hero.AddProperty[comm.HpPro] property[comm.AtkPro] -= _hero.AddProperty[comm.AtkPro] property[comm.DefPro] -= _hero.AddProperty[comm.DefPro] - this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero.Id, property) + this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero, property) for k := range _hero.Energy { // 清除玩家选择的共鸣属性 delete(_hero.Energy, k) } diff --git a/modules/hero/api_resonanceSelect.go b/modules/hero/api_resonanceSelect.go index 1dd14a1e0..5f90c76da 100644 --- a/modules/hero/api_resonanceSelect.go +++ b/modules/hero/api_resonanceSelect.go @@ -65,7 +65,7 @@ func (this *apiComp) ResonanceUseEnergy(session comm.IUserSession, req *pb.HeroR case 3: property[comm.Def] = int32(math.Floor((1.0 + float64(resonConfig.Defpro*req.UseEnergy)/1000) * float64(_hero.Property[comm.Def]))) } - this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero.Id, property) + this.module.modelHero.mergeMainProperty(session.GetUserId(), _hero, property) m, err1 := this.module.modelHero.PushHeroProperty(session, _hero.Id) // 推送属性变化 if err1 != nil { diff --git a/modules/hero/api_strengthenUplv.go b/modules/hero/api_strengthenUplv.go index bb473b423..0611493df 100644 --- a/modules/hero/api_strengthenUplv.go +++ b/modules/hero/api_strengthenUplv.go @@ -20,6 +20,7 @@ func (this *apiComp) StrengthenUplvCheck(session comm.IUserSession, req *pb.Hero return } } + return } @@ -27,17 +28,21 @@ func (this *apiComp) StrengthenUplvCheck(session comm.IUserSession, req *pb.Hero func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStrengthenUplvReq) (code pb.ErrorCode, data proto.Message) { var ( - curLv int32 - curExp int32 // 当前英雄的经验 - addExp int32 // 需要增加的经验 - costGold int32 // 需要消耗的资源 - _hero *pb.DBHero // 目标英雄 - _expHero *pb.DBHero // 消耗英雄 - minAddExp int32 - _costHero []*pb.DBHero // 删除的英雄 - iLvUp int32 // 当前升级次数 + curLv int32 + curExp int32 // 当前英雄的经验 + addExp int32 // 需要增加的经验 + costGold int32 // 需要消耗的资源 + _hero *pb.DBHero // 目标英雄 + _expHero *pb.DBHero // 消耗英雄 + minAddExp int32 + _changeHero []*pb.DBHero // 变化的英雄 + iLvUp int32 // 当前升级次数 + _mapCost map[string]int32 ) - + _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 @@ -51,8 +56,8 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren code = pb.ErrorCode_HeroTypeErr return } - for _, v := range req.ExpCards { - _expHero, code = this.module.GetHero(session.GetUserId(), v.Key) // 校验需要消耗经验卡牌的对象是否存在 + for k, v := range _mapCost { + _expHero, code = this.module.GetHero(session.GetUserId(), k) // 校验需要消耗经验卡牌的对象是否存在 if code != pb.ErrorCode_Success { return } @@ -61,17 +66,17 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren return } - if v.Value > _expHero.SameCount { // 校验数量 + if v > _expHero.SameCount { // 校验数量 code = pb.ErrorCode_HeroNoEnough return } // 查询 本次消耗会获得多少经验 expConf := this.module.configure.GetHeroExp(_expHero.HeroID) if expConf != nil { - addExp += expConf.Heroexp * v.Value + addExp += expConf.Heroexp * v } - costGold = expConf.Needgold * v.Value // 需要消耗的金币 - if _expHero.SameCount < v.Value { // 消耗经验卡片数量不足 + costGold = expConf.Needgold * v // 需要消耗的金币 + if _expHero.SameCount < v { // 消耗经验卡片数量不足 code = pb.ErrorCode_HeroNoEnough return } @@ -140,6 +145,12 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren } this.module.Debugf("升级后当前等级: %d,经验: %d,需要消耗的金币: %d,增加的经验: %d", curLv, curExp, costGold, addExp) + + // 执行升级逻辑 + newhero, code := this.module.AddCardExp(session.GetUserId(), _hero, addExp) // 加经验 + if code != pb.ErrorCode_Success { + return + } // 消耗金币 res := make([]*cfg.Game_atn, 0) _d := &cfg.Game_atn{ @@ -152,36 +163,30 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren if code != pb.ErrorCode_Success { return } - - // 执行升级逻辑 - newhero, oldhero, code := this.module.AddCardExp(session.GetUserId(), req.HeroObjID, addExp) // 加经验 - if code != pb.ErrorCode_Success { - // 升级失败资源回退 - code = this.module.DispenseRes(session, res, true) - return - } - // 删除经验卡 - for _, v := range req.ExpCards { - costHero, err1 := this.module.modelHero.consumeHeroCard(session.GetUserId(), v.Key, v.Value) + for k, v := range _mapCost { + costHero, err1 := this.module.modelHero.consumeHeroCard(session.GetUserId(), k, v) if err1 != nil { code = pb.ErrorCode_HeroNoEnough this.module.Errorf("delete err failed err:%T!", err1) return } - _costHero = append(_costHero, costHero) + _changeHero = append(_changeHero, costHero) } - m, err1 := this.module.modelHero.PushHeroProperty(session, oldhero.Id) // 推送属性变化 + m, err1 := this.module.modelHero.PushHeroProperty(session, _hero.Id) // 推送属性变化 if err1 != nil { this.module.Errorf("PushHeroProperty err!") } - oldhero.Property = m - _costHero = append(_costHero, oldhero) - _costHero = append(_costHero, newhero) - session.SendMsg(string(this.module.GetType()), "change", &pb.HeroChangePush{List: _costHero}) - session.SendMsg(string(this.module.GetType()), StrengthenUplv, &pb.HeroStrengthenUplvResp{Hero: newhero}) + _hero.Property = m + _changeHero = append(_changeHero, _hero) // 升级后的英雄 hero id 不变 + if newhero != nil { + _changeHero = append(_changeHero, newhero) // 原来的英雄 只是数量变化了 + } + + session.SendMsg(string(this.module.GetType()), "change", &pb.HeroChangePush{List: _changeHero}) + session.SendMsg(string(this.module.GetType()), StrengthenUplv, &pb.HeroStrengthenUplvResp{Hero: _hero}) if iLvUp > 0 { // 升级了 统计任务 this.module.ModuleTask.SendToTask(session, comm.TaskTypeUpHeroLevel, &pb.TaskParam{Second: iLvUp}) } diff --git a/modules/hero/model_hero.go b/modules/hero/model_hero.go index d006933c8..7644a0f65 100644 --- a/modules/hero/model_hero.go +++ b/modules/hero/model_hero.go @@ -208,7 +208,7 @@ func (this *ModelHero) getOneHero(uid, heroId string) *pb.DBHero { return hero } -//消耗英雄卡 +//消耗英雄卡 (只需要传heroid即可) func (this *ModelHero) consumeHeroCard(uid, heroId string, count int32) (hero *pb.DBHero, err error) { if count == 0 { return @@ -274,7 +274,7 @@ func (this *ModelHero) setEquipProperty(hero *pb.DBHero, equip []*pb.DB_Equipmen } } - this.mergeMainProperty(hero.Uid, hero.Uid, property) + this.mergeMainProperty(hero.Uid, hero, property) this.mergeAddProperty(hero.Uid, hero.Uid, addProperty) } @@ -329,8 +329,8 @@ func (this *ModelHero) setEquipment(hero *pb.DBHero) (newHero *pb.DBHero, err er } //合并属性即属性值累加 -func (this *ModelHero) mergeMainProperty(uid, heroId string, data map[string]int32) { - hero := this.getOneHero(uid, heroId) +func (this *ModelHero) mergeMainProperty(uid string, hero *pb.DBHero, data map[string]int32) { + if hero == nil { return } @@ -343,7 +343,7 @@ func (this *ModelHero) mergeMainProperty(uid, heroId string, data map[string]int comm.Atk: hero.Property[comm.Atk], comm.Def: hero.Property[comm.Def], } - if err := this.modifyHeroData(uid, heroId, update); err != nil { + if err := this.modifyHeroData(uid, hero.Id, update); err != nil { this.moduleHero.Errorf("mergeMainProperty err %v", err) } } diff --git a/modules/hero/module.go b/modules/hero/module.go index 597d4256a..48f19e5a6 100644 --- a/modules/hero/module.go +++ b/modules/hero/module.go @@ -112,33 +112,33 @@ func (this *Hero) QueryHeroAmount(uId string, heroCfgId int32) (amount uint32) { } // 给指定英雄加经验 -func (this *Hero) AddCardExp(uid string, heroId string, exp int32) (newhero *pb.DBHero, oldhero *pb.DBHero, code pb.ErrorCode) { +func (this *Hero) AddCardExp(uid string, hero *pb.DBHero, exp int32) (newhero *pb.DBHero, code pb.ErrorCode) { var ( curExp int32 curLv int32 err1 error + update map[string]interface{} // 属性变化 ) - _hero, err := this.GetHero(uid, heroId) // 获取英雄信息 - if err != 0 { + if hero == nil { code = pb.ErrorCode_HeroNoExist return } - - curExp = _hero.Exp - curLv = _hero.Lv + update = make(map[string]interface{}, 0) + curExp = hero.Exp + curLv = hero.Lv var maxLv int32 // 校验等级达到上限 - maxLv = _hero.Star * comm.HeroStarLvRatio + maxLv = hero.Star * comm.HeroStarLvRatio _data := this.configure.GetHeroLv(curLv) if _data != nil { - if maxLv <= _hero.Lv && curExp >= _data.Heroexp[0].N { // 加经验之前校验是否达到最大等级 + if maxLv <= hero.Lv && curExp >= _data.Heroexp[0].N { // 加经验之前校验是否达到最大等级 code = pb.ErrorCode_HeroMaxLv return } curExp += exp // 先把经验加上 for { // 死循环判断一键升级 - if maxLv <= _hero.Lv && curExp >= _data.Heroexp[0].N { // 设置最大经验和等级 + if maxLv <= hero.Lv && curExp >= _data.Heroexp[0].N { // 设置最大经验和等级 curLv = maxLv curExp = _data.Heroexp[0].N break @@ -156,22 +156,20 @@ func (this *Hero) AddCardExp(uid string, heroId string, exp int32) (newhero *pb. } } - // 检测等级有变化 推送属性 - if curLv != _hero.Lv { - data := make(map[string]int32, 0) - preConfig := this.configure.GetHeroLv(_hero.Lv) + // 检测等级有变化 + if curLv != hero.Lv { + //data := make(map[string]int32, 0) + preConfig := this.configure.GetHeroLv(hero.Lv) nowConfig := this.configure.GetHeroLv(curLv) - data["hp"] = int32(nowConfig.Hp - preConfig.Hp) - data["atk"] = int32(nowConfig.Atk - preConfig.Atk) - data["def"] = int32(nowConfig.Def - preConfig.Def) - this.modelHero.mergeMainProperty(uid, heroId, data) + update["hp"] = int32(nowConfig.Hp - preConfig.Hp) + update["atk"] = int32(nowConfig.Atk - preConfig.Atk) + update["def"] = int32(nowConfig.Def - preConfig.Def) + //this.modelHero.mergeMainProperty(uid, hero.Id, data) } - curCount := _hero.SameCount - 1 - if curCount == 0 { - this.modelHero.consumeHeroCard(uid, _hero.Id, 1) - } else { - newhero, err1 = this.modelHero.createOneHero(uid, _hero.HeroID) + curCount := hero.SameCount - 1 + if curCount != 0 { // 有叠加的情况 + newhero, err1 = this.modelHero.createOneHero(uid, hero.HeroID) if err1 != nil { code = pb.ErrorCode_DBError } @@ -183,23 +181,20 @@ func (this *Hero) AddCardExp(uid string, heroId string, exp int32) (newhero *pb. code = pb.ErrorCode_DBError } } - update1 := map[string]interface{}{ - "lv": curLv, - "exp": curExp, - "isOverlying": false, - "sameCount": 1, - } - _hero.Lv = curLv - _hero.Exp = curExp - _hero.IsOverlying = false - _hero.SameCount = 1 + update["lv"] = curLv + update["exp"] = curExp + update["isOverlying"] = false + update["sameCount"] = 1 - if err := this.modelHero.modifyHeroData(uid, _hero.Id, update1); err != nil { + hero.Lv = curLv + hero.Exp = curExp + hero.IsOverlying = false + hero.SameCount = 1 + + if err := this.modelHero.modifyHeroData(uid, hero.Id, update); err != nil { code = pb.ErrorCode_DBError } - - oldhero = _hero } else { code = pb.ErrorCode_HeroNoExist return