英雄升级
This commit is contained in:
parent
b79700e960
commit
d01d24912a
@ -2,12 +2,6 @@
|
|||||||
{
|
{
|
||||||
"itemid": "625002",
|
"itemid": "625002",
|
||||||
"exp": 1000,
|
"exp": 1000,
|
||||||
"needgold": [
|
"needgold": 10000
|
||||||
{
|
|
||||||
"a": "attr",
|
|
||||||
"t": "glod",
|
|
||||||
"n": 10000
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
@ -3,22 +3,17 @@ package hero
|
|||||||
import (
|
import (
|
||||||
"go_dreamfactory/comm"
|
"go_dreamfactory/comm"
|
||||||
"go_dreamfactory/pb"
|
"go_dreamfactory/pb"
|
||||||
|
cfg "go_dreamfactory/sys/configure/structs"
|
||||||
|
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
//参数校验
|
//参数校验
|
||||||
func (this *apiComp) StrengthenUplvCheck(session comm.IUserSession, req *pb.HeroStrengthenUplvReq) (code pb.ErrorCode) {
|
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
|
code = pb.ErrorCode_ReqParameterError
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, v := range req.ExpCards {
|
|
||||||
if v.Value <= 0 || v.Key == "" {
|
|
||||||
code = pb.ErrorCode_ReqParameterError
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -28,18 +23,31 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
addExp int32 // 需要增加的经验
|
addExp int32 // 需要增加的经验
|
||||||
costGold int64 // 需要消耗的资源
|
costGold int32 // 需要消耗的资源
|
||||||
_hero *pb.DBHero // 目标英雄
|
_hero *pb.DBHero // 目标英雄
|
||||||
_costExpHero map[string]*pb.DBHero // 消耗英雄
|
|
||||||
minAddExp int32
|
cost []*cfg.Gameatn // 消耗的道具
|
||||||
_changeHero []*pb.DBHero // 变化的英雄
|
|
||||||
_mapCost map[string]int32 //
|
|
||||||
)
|
)
|
||||||
_costExpHero = make(map[string]*pb.DBHero, 0)
|
for k, v := range req.Item {
|
||||||
_mapCost = make(map[string]int32, 0)
|
if v == 0 {
|
||||||
for _, v := range req.ExpCards { // 数组转map
|
continue
|
||||||
_mapCost[v.Key] += v.Value
|
|
||||||
}
|
}
|
||||||
|
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
|
code = this.StrengthenUplvCheck(session, req) // check
|
||||||
if code != pb.ErrorCode_Success {
|
if code != pb.ErrorCode_Success {
|
||||||
return
|
return
|
||||||
@ -48,52 +56,12 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
|
|||||||
if code != pb.ErrorCode_Success {
|
if code != pb.ErrorCode_Success {
|
||||||
return
|
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 code = this.module.CheckRes(session, cost); code != pb.ErrorCode_Success {
|
||||||
if curGold < costGold { // 金币不足
|
|
||||||
code = pb.ErrorCode_GoldNoEnough
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if addExp == 0 {
|
if addExp == 0 {
|
||||||
code = pb.ErrorCode_HeroExpTypeErr
|
code = pb.ErrorCode_HeroExpTypeErr
|
||||||
return
|
return
|
||||||
@ -105,44 +73,27 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
|
|||||||
}
|
}
|
||||||
curLv := _hero.Lv
|
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 {
|
if code != pb.ErrorCode_Success {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
iLvUp := _hero.Lv - curLv
|
iLvUp := _hero.Lv - curLv
|
||||||
// 消耗金币
|
// 消耗金币
|
||||||
code = this.module.ModuleUser.AddAttributeValue(session, comm.ResGold, -int32(costGold), true)
|
if code = this.module.ConsumeRes(session, cost, true); code != pb.ErrorCode_Success { //道具扣除
|
||||||
if code != pb.ErrorCode_Success { // 金币不足
|
code = pb.ErrorCode_ItemsNoEnough
|
||||||
code = pb.ErrorCode_GoldNoEnough
|
|
||||||
return
|
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 {
|
if iLvUp > 0 {
|
||||||
this.module.modelHero.ChangeHeroProperty(session, _hero) // 重新计算属性值
|
this.module.modelHero.ChangeHeroProperty(session, _hero) // 重新计算属性值
|
||||||
}
|
}
|
||||||
|
|
||||||
_changeHero = append(_changeHero, _hero) // 升级后的英雄 hero id 不变
|
|
||||||
if newhero != nil {
|
|
||||||
_changeHero = append(_changeHero, newhero) // 原来的英雄 只是数量变化了
|
|
||||||
}
|
|
||||||
//英雄升级 【玩家名称】已将【英雄名称】培养至60级!
|
//英雄升级 【玩家名称】已将【英雄名称】培养至60级!
|
||||||
if user := this.module.ModuleUser.GetUser(session.GetUserId()); user != nil {
|
if user := this.module.ModuleUser.GetUser(session.GetUserId()); user != nil {
|
||||||
this.chat.SendSysChatToWorld(comm.ChatSystem7, nil, _hero.Lv, 0, user.Name, _hero.HeroID)
|
this.chat.SendSysChatToWorld(comm.ChatSystem7, nil, _hero.Lv, 0, user.Name, _hero.HeroID)
|
||||||
} else {
|
} else {
|
||||||
this.module.Errorf("no found userdata uid:%s", session.GetUserId())
|
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})
|
session.SendMsg(string(this.module.GetType()), StrengthenUplv, &pb.HeroStrengthenUplvResp{Hero: _hero})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -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 (
|
var (
|
||||||
preLv int32 //加经验之前的等级
|
preLv int32 //加经验之前的等级
|
||||||
curExp int32 // 加经验之后的经验
|
curExp int32 // 加经验之后的经验
|
||||||
@ -623,10 +623,7 @@ func (this *ModelHero) AddCardExp(session comm.IUserSession, hero *pb.DBHero, ex
|
|||||||
if curAddExp != 0 {
|
if curAddExp != 0 {
|
||||||
curAddExp = exp // 真正加的经验
|
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)
|
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["lv"] = curLv
|
||||||
update["exp"] = curExp
|
update["exp"] = curExp
|
||||||
|
@ -13,7 +13,7 @@ import "errors"
|
|||||||
type GameHeroExpData struct {
|
type GameHeroExpData struct {
|
||||||
Itemid string
|
Itemid string
|
||||||
Exp int32
|
Exp int32
|
||||||
Needgold []*Gameatn
|
Needgold int32
|
||||||
}
|
}
|
||||||
|
|
||||||
const TypeId_GameHeroExpData = -1440094703
|
const TypeId_GameHeroExpData = -1440094703
|
||||||
@ -25,20 +25,7 @@ func (*GameHeroExpData) GetTypeId() int32 {
|
|||||||
func (_v *GameHeroExpData)Deserialize(_buf map[string]interface{}) (err error) {
|
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; 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 _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["exp"].(float64); !_ok_ { err = errors.New("exp error"); return }; _v.Exp = int32(_tempNum_) }
|
||||||
{
|
{ var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["needgold"].(float64); !_ok_ { err = errors.New("needgold error"); return }; _v.Needgold = 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_)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user