package arena import ( "go_dreamfactory/comm" "go_dreamfactory/modules/battle" "go_dreamfactory/pb" "go_dreamfactory/sys/configure" cfg "go_dreamfactory/sys/configure/structs" ) // 参数校验 func (this *apiComp) ChallengeRewardCheck(session comm.IUserSession, req *pb.ArenaChallengeRewardReq) (errdata *pb.ErrorData) { return } // /挑战奖励领取 func (this *apiComp) ChallengeReward(session comm.IUserSession, req *pb.ArenaChallengeRewardReq) (errdata *pb.ErrorData) { var ( reward *cfg.GameArenaActiveRewardData info *pb.DBArenaUser rival *pb.DBArenaUser red *pb.ArenaPlayer redstate pb.BattleRecordState bule *pb.ArenaPlayer bulestate pb.BattleRecordState err error iswin bool tasks []*pb.BuriedParam = make([]*pb.BuriedParam, 0) bReward bool ) if errdata = this.ChallengeRewardCheck(session, req); errdata != nil { return } if info, err = this.module.modelArena.queryPlayerInfo(session.GetUserId()); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.ToString(), Message: err.Error(), } return } if req.Iswin { if errdata, iswin = this.module.battle.CheckBattleReport(session, req.Report); errdata != nil { return } if !iswin { errdata = &pb.ErrorData{ Code: pb.ErrorCode_BattleValidationFailed, Title: pb.ErrorCode_BattleValidationFailed.ToString(), Message: "battle iswin fail", } return } info.Streak++ if reward, err = this.module.configure.getActiveRewardById(info.Dan); err != nil { this.module.Errorln(err) errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } return } if errdata = this.module.DispenseRes(session, reward.WinReward, true); errdata != nil { return } bReward = true if req.Revengeid != "" { redstate = pb.BattleRecordState_RevengeSucceeded bulestate = pb.BattleRecordState_DefendLost for _, v := range info.Record { if v.Bid == req.Revengeid { v.State = pb.BattleRecordState_RevengeEnd } } } else { redstate = pb.BattleRecordState_AttackWin bulestate = pb.BattleRecordState_DefendLost } tasks = append(tasks, comm.GetBuriedParam(comm.Rtype131, 1)) } else { info.Streak = 0 if req.Revengeid != "" { redstate = pb.BattleRecordState_RevengeFailed bulestate = pb.BattleRecordState_DefendkWin for _, v := range info.Record { if v.Bid == req.Revengeid { v.State = pb.BattleRecordState_RevengeEnd } } } else { redstate = pb.BattleRecordState_AttackLost bulestate = pb.BattleRecordState_DefendkWin } } red = &pb.ArenaPlayer{ Uinfo: info.Uinfo, Dan: info.Dan, Integral: info.Integral + info.Prededuction, Defend: info.Defend, Isai: false, Title: info.Title, } if len(info.Record) > 10 { info.Record = info.Record[1:] } if !req.Isai { if rival, err = this.module.modelArena.queryPlayerInfo(req.Report.Info.BlueCompId); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.ToString(), Message: err.Error(), } return } bule = &pb.ArenaPlayer{ Uinfo: rival.Uinfo, Dan: rival.Dan, Integral: rival.Integral, Defend: rival.Defend, Isai: false, } if len(rival.Record) > 10 { rival.Record = rival.Record[1:] } } else { bule = &pb.ArenaPlayer{ Dan: info.Dan, Uinfo: &pb.BaseUserInfo{ Name: req.Ainame, }, Integral: req.Aiintegral, } } this.module.modelArena.integralCompute(red, bule, req.Iswin) if !req.Isai { this.module.modelRank.updateArenaRank(red, bule) info.Integral = red.Integral info.Rank = red.Rank info.Attacktotaluum++ if req.Iswin { info.Attackwinuum++ } else { rival.Defendwinuum++ } rival.Integral = bule.Integral rival.Rank = bule.Rank rival.Defendtotaluum++ redrecord := &pb.DBArenaBattleRecord{ Bid: req.Report.Info.Id, Time: configure.Now().Unix(), Iswin: req.Iswin, Isdefend: false, Rivalid: bule.Uinfo.Uid, Rivalname: bule.Uinfo.Name, Leadpos: rival.Defend.Leadpos, Formt: make([]*pb.DBHeroBase, len(rival.Defend.Formt)), Addintegral: red.Changeintegral, State: redstate, } for i, v := range rival.Defend.Formt { if v != nil { redrecord.Formt[i] = &pb.DBHeroBase{ Oid: v.Id, Cid: v.HeroID, Star: v.Star, Lv: v.Lv, Property: v.Property, AddProperty: v.AddProperty, JuexProperty: v.JuexProperty, TalentProperty: v.TalentProperty, HoroscopeProperty: v.HoroscopeProperty, Fetters: v.Fetters, NormalSkill: v.NormalSkill, } } else { redrecord.Formt[i] = nil } } info.Record = append(info.Record, redrecord) buleRecord := &pb.DBArenaBattleRecord{ Bid: req.Report.Info.Id, Time: configure.Now().Unix(), Iswin: !req.Iswin, Isdefend: true, Rivalid: red.Uinfo.Uid, Rivalname: red.Uinfo.Name, Leadpos: info.Attack.Leadpos, Addintegral: bule.Changeintegral, Formt: make([]*pb.DBHeroBase, len(info.Attack.Formt)), State: bulestate, } for i, v := range info.Attack.Formt { if v != nil { buleRecord.Formt[i] = &pb.DBHeroBase{ Oid: v.Id, Cid: v.HeroID, Star: v.Star, Lv: v.Lv, Property: v.Property, AddProperty: v.AddProperty, JuexProperty: v.JuexProperty, TalentProperty: v.TalentProperty, HoroscopeProperty: v.HoroscopeProperty, Fetters: v.Fetters, NormalSkill: v.NormalSkill, } } else { buleRecord.Formt[i] = nil } } rival.Record = append(rival.Record, buleRecord) if err = this.module.modelArena.updateArenaUserInfo(info); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.ToString(), Message: err.Error(), } return } } else { this.module.modelRank.updateArenaRank(red) info.Integral = red.Integral info.Rank = red.Rank info.Attacktotaluum++ if req.Iswin { info.Attackwinuum++ } redrecord := &pb.DBArenaBattleRecord{ Bid: req.Report.Info.Id, Time: configure.Now().Unix(), Iswin: req.Iswin, Isdefend: false, Rivalid: bule.Uinfo.Uid, Rivalname: bule.Uinfo.Name, Leadpos: req.Report.Info.Buleflist[0].Leadpos, Formt: make([]*pb.DBHeroBase, len(req.Report.Info.Buleflist[0].Team)), Addintegral: red.Changeintegral, State: redstate, } for i, v := range req.Report.Info.Buleflist[0].Team { if v != nil { redrecord.Formt[i] = &pb.DBHeroBase{ Oid: v.Oid, Cid: v.HeroID, Star: v.Star, Lv: v.Lv, Property: make(map[string]int32), AddProperty: make(map[string]int32), NormalSkill: v.NormalSkill, } for k, v := range v.Property { attr := battle.AttributesFromBase(k) if len(attr) > 0 { redrecord.Formt[i].Property[attr] = v } else { attr = battle.AttributesFromExt(k) if len(attr) > 0 { redrecord.Formt[i].AddProperty[attr] = v } } } } else { redrecord.Formt[i] = nil } } info.Record = append(info.Record, redrecord) if err = this.module.modelArena.updateArenaUserInfo(info); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.ToString(), Message: err.Error(), } return } } tasks = append(tasks, comm.GetBuriedParam(comm.Rtype130, 1)) tasks = append(tasks, comm.GetBuriedParam(comm.Rtype128, red.Integral)) tasks = append(tasks, comm.GetBuriedParam(comm.Rtype129, red.Dan)) session.SendMsg(string(this.module.GetType()), "challengereward", &pb.ArenaChallengeRewardResp{Issucc: true, Integral: info.Integral, Dan: info.Dan}) go this.module.AsynHandleSession(session.Clone(), func(session comm.IUserSession) { this.module.ModuleBuried.TriggerBuried(session, tasks...) if bReward { this.module.WriteUserLog(session.GetUserId(), comm.GMResAddType, "ArenaChallengeRewardReq", reward.WinReward) } }) return }