diff --git a/bin/json/game_heroexp.json b/bin/json/game_heroexp.json index e39efecf5..97402e739 100644 --- a/bin/json/game_heroexp.json +++ b/bin/json/game_heroexp.json @@ -2,12 +2,6 @@ { "itemid": "625002", "exp": 1000, - "needgold": [ - { - "a": "attr", - "t": "glod", - "n": 10000 - } - ] + "needgold": 10000 } ] \ No newline at end of file diff --git a/modules/hero/api_strengthenUplv.go b/modules/hero/api_strengthenUplv.go index cdeb0aa20..292bc6fae 100644 --- a/modules/hero/api_strengthenUplv.go +++ b/modules/hero/api_strengthenUplv.go @@ -3,22 +3,17 @@ package hero import ( "go_dreamfactory/comm" "go_dreamfactory/pb" + cfg "go_dreamfactory/sys/configure/structs" "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 { + if req.HeroObjID == "" || len(req.Item) == 0 { code = pb.ErrorCode_ReqParameterError return } - for _, v := range req.ExpCards { - if v.Value <= 0 || v.Key == "" { - code = pb.ErrorCode_ReqParameterError - return - } - } return } @@ -27,19 +22,32 @@ 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 ( - addExp int32 // 需要增加的经验 - costGold int64 // 需要消耗的资源 - _hero *pb.DBHero // 目标英雄 - _costExpHero map[string]*pb.DBHero // 消耗英雄 - minAddExp int32 - _changeHero []*pb.DBHero // 变化的英雄 - _mapCost map[string]int32 // + addExp int32 // 需要增加的经验 + costGold int32 // 需要消耗的资源 + _hero *pb.DBHero // 目标英雄 + + cost []*cfg.Gameatn // 消耗的道具 ) - _costExpHero = make(map[string]*pb.DBHero, 0) - _mapCost = make(map[string]int32, 0) - for _, v := range req.ExpCards { // 数组转map - _mapCost[v.Key] += v.Value + for k, v := range req.Item { + if v == 0 { + continue + } + cost = append(cost, &cfg.Gameatn{ + A: "item", + T: k, + N: v, + }) + // 查询 本次消耗会获得多少经验 + if expConf := this.module.configure.GetHeroExp(k); expConf != nil { + addExp += expConf.Exp * v + costGold += expConf.Needgold * v + } } + cost = append(cost, &cfg.Gameatn{ + A: "attr", + T: "gold", + N: costGold, + }) code = this.StrengthenUplvCheck(session, req) // check if code != pb.ErrorCode_Success { return @@ -48,52 +56,12 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren 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 + if code = this.module.CheckRes(session, cost); code != pb.ErrorCode_Success { return } + if addExp == 0 { code = pb.ErrorCode_HeroExpTypeErr return @@ -105,44 +73,27 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren } curLv := _hero.Lv // 执行升级逻辑 - newhero, _, code := this.module.modelHero.AddCardExp(session, _hero, addExp) // 加经验 + _, 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 + if code = this.module.ConsumeRes(session, cost, true); code != pb.ErrorCode_Success { //道具扣除 + code = pb.ErrorCode_ItemsNoEnough 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 } diff --git a/modules/hero/model_hero.go b/modules/hero/model_hero.go index 3038e9822..0cac89ee2 100644 --- a/modules/hero/model_hero.go +++ b/modules/hero/model_hero.go @@ -567,7 +567,7 @@ func (this *ModelHero) cleanData(uid string) { } } -func (this *ModelHero) AddCardExp(session comm.IUserSession, hero *pb.DBHero, exp int32) (newhero *pb.DBHero, curAddExp int32, code pb.ErrorCode) { +func (this *ModelHero) AddCardExp(session comm.IUserSession, hero *pb.DBHero, exp int32) (curAddExp int32, code pb.ErrorCode) { var ( preLv int32 //加经验之前的等级 curExp int32 // 加经验之后的经验 @@ -623,10 +623,7 @@ func (this *ModelHero) AddCardExp(session comm.IUserSession, hero *pb.DBHero, ex if curAddExp != 0 { curAddExp = exp // 真正加的经验 } - if hero.SameCount > 1 { //有堆叠的情况 - hero.SameCount -= 1 - newhero = this.CloneNewHero(session.GetUserId(), hero) // 克隆一个新的 - } + this.moduleHero.Debugf("add hero exp :old lv:%d,old exp:%d,new lv:%d,new exp:%d,addexp:%d", hero.Lv, hero.Exp, curLv, curExp, exp) update["lv"] = curLv update["exp"] = curExp diff --git a/sys/configure/structs/game.heroExpData.go b/sys/configure/structs/game.heroExpData.go index 1c0c6dbc5..a40c763be 100644 --- a/sys/configure/structs/game.heroExpData.go +++ b/sys/configure/structs/game.heroExpData.go @@ -13,7 +13,7 @@ import "errors" type GameHeroExpData struct { Itemid string Exp int32 - Needgold []*Gameatn + Needgold int32 } const TypeId_GameHeroExpData = -1440094703 @@ -25,20 +25,7 @@ func (*GameHeroExpData) GetTypeId() int32 { func (_v *GameHeroExpData)Deserialize(_buf map[string]interface{}) (err error) { { var _ok_ bool; if _v.Itemid, _ok_ = _buf["itemid"].(string); !_ok_ { err = errors.New("itemid error"); return } } { var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["exp"].(float64); !_ok_ { err = errors.New("exp error"); return }; _v.Exp = int32(_tempNum_) } - { - var _arr_ []interface{} - var _ok_ bool - if _arr_, _ok_ = _buf["needgold"].([]interface{}); !_ok_ { err = errors.New("needgold error"); return } - - _v.Needgold = make([]*Gameatn, 0, len(_arr_)) - - for _, _e_ := range _arr_ { - var _list_v_ *Gameatn - { var _ok_ bool; var _x_ map[string]interface{}; if _x_, _ok_ = _e_.(map[string]interface{}); !_ok_ { err = errors.New("_list_v_ error"); return }; if _list_v_, err = DeserializeGameatn(_x_); err != nil { return } } - _v.Needgold = append(_v.Needgold, _list_v_) - } - } - + { var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["needgold"].(float64); !_ok_ { err = errors.New("needgold error"); return }; _v.Needgold = int32(_tempNum_) } return }