go_dreamfactory/modules/arena/api_challengereward.go
2024-02-06 16:19:18 +08:00

317 lines
8.6 KiB
Go

package arena
import (
"go_dreamfactory/comm"
"go_dreamfactory/pb"
"go_dreamfactory/sys/configure"
cfg "go_dreamfactory/sys/configure/structs"
"time"
)
// 参数校验
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
conf *cfg.GameArenaActiveWinData
info *pb.DBArenaUser
rival *pb.DBArenaUser
red *pb.ArenaPlayer
redstate pb.BattleRecordState
bule *pb.ArenaPlayer
bulestate pb.BattleRecordState
err error
iswin bool
isopen bool
tasks []*pb.BuriedParam = make([]*pb.BuriedParam, 0)
bReward bool
atno []*pb.UserAtno
)
if errdata = this.ChallengeRewardCheck(session, req); errdata != nil {
return
}
if isopen = this.module.modelArena.isInMaintenance(); isopen {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ArenaInMaintenance,
Message: "InMaintenance!",
}
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, atno = this.module.DispenseAtno(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,
}
if red.Integral < 0 {
red.Integral = 0
}
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 bule.Integral < 0 {
bule.Integral = 0
}
if len(rival.Record) > 10 {
rival.Record = rival.Record[1:]
}
} else {
bule = &pb.ArenaPlayer{
Dan: info.Dan,
Uinfo: req.Aiinfo,
Integral: req.Aiintegral,
}
if bule.Integral < 0 {
bule.Integral = 0
}
}
this.module.modelArena.integralCompute(red, bule, req.Iswin)
if req.Iswin {
if conf, err = this.module.configure.getGameArenaActiveWinData(info.Streak); err == nil {
red.Integral += conf.Txt.N
red.Changeintegral += conf.Txt.N
}
}
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,
Rival: bule.Uinfo,
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,
Rival: red.Uinfo,
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,
Rival: bule.Uinfo,
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[int32]int32),
AddProperty: make(map[int32]int32),
NormalSkill: v.NormalSkill,
}
for k, v := range v.Property {
redrecord.Formt[i].Property[k] = 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, info.Integral))
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype129, info.Dan))
session.SendMsg(string(this.module.GetType()), "challengereward", &pb.ArenaChallengeRewardResp{
Issucc: true,
Integral: info.Integral,
Dan: info.Dan,
Award: []*pb.UserAtno{{A: "attr", T: "pvpintegral", N: red.Changeintegral}},
})
go this.module.AsynHandleSession(session.Clone(), func(session comm.IUserSession) {
this.module.ModuleBuried.TriggerBuried(session, tasks...)
this.module.battlerecord.WrietBattleRecord(session.GetUserId(), req.Report, time.Now().Add(time.Hour*24*8))
if bReward {
this.module.WriteUserLog(session.GetUserId(), req, comm.GMResAddType, "ArenaChallengeRewardReq", atno)
}
})
return
}