package equipment import ( "crypto/rand" "fmt" "go_dreamfactory/comm" "go_dreamfactory/lego/sys/log" "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" "math/big" "go.mongodb.org/mongo-driver/bson/primitive" ) // 参数校验 func (this *apiComp) UpgradeCheck(session comm.IUserSession, req *pb.EquipmentUpgradeReq) (errdata *pb.ErrorData) { if req.EquipmentId == "" { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), } return } return } // /英雄挂在装备 func (this *apiComp) Upgrade(session comm.IUserSession, req *pb.EquipmentUpgradeReq) (errdata *pb.ErrorData) { var ( err error conf *cfg.GameEquipData intensify *cfg.GameEquipIntensifyData equipment *pb.DB_Equipment modifyequipments []*pb.DB_Equipment hero *pb.DBHero equipments []*pb.DB_Equipment confs []*cfg.GameEquipData suitconfs []*cfg.GameEquipSuitData suits []*pb.DB_EquipmentSuit suit *pb.DB_EquipmentSuit issucc bool user *pb.DBUser tasks []*pb.BuriedParam = make([]*pb.BuriedParam, 0) ) if errdata = this.UpgradeCheck(session, req); errdata != nil { return } if equipment, err = this.module.modelEquipment.QueryUserEquipmentsById(session.GetUserId(), req.EquipmentId); err != nil { this.module.Errorf("Equip_Check err:%v", err) errdata = &pb.ErrorData{ Code: pb.ErrorCode_EquipmentOnFoundEquipment, Title: pb.ErrorCode_EquipmentOnFoundEquipment.ToString(), Message: err.Error(), } return } if conf, err = this.module.configure.GetEquipmentConfigureById(equipment.CId); err != nil { this.module.Errorf("Equip_Check err:%v", err) errdata = &pb.ErrorData{ Code: pb.ErrorCode_EquipmentOnFoundEquipment, Title: pb.ErrorCode_EquipmentOnFoundEquipment.ToString(), Message: err.Error(), } return } //找到下一个等级的相关配置 if intensify, err = this.module.configure.GetEquipmentIntensifyConfigureById(conf.EquipId, conf.Color, equipment.Lv); err != nil || intensify.Need == nil || len(intensify.Need) == 0 { errdata = &pb.ErrorData{ Code: pb.ErrorCode_EquipmentLvlimitReached, Title: pb.ErrorCode_EquipmentLvlimitReached.ToString(), Message: fmt.Sprintf("Lv:%d", equipment.Lv), } if err != nil { this.module.Errorf("Equip_Check err:%v", err) } return } if errdata = this.module.ConsumeRes(session, intensify.Need, true); errdata != nil { return } if equipment.KeepFailNum >= intensify.Num { //没有达到保底次数 根据概率随机成功失败 issucc = true } else { //随机 千分比 n, _ := rand.Int(rand.Reader, big.NewInt(1000)) if int32(n.Int64()) < intensify.Probability { issucc = true equipment.KeepFailNum = 0 } else { issucc = false equipment.KeepFailNum++ if err = this.module.modelEquipment.ChangeList(session.GetUserId(), equipment.Id, map[string]interface{}{ "keepFailNum": equipment.KeepFailNum, }); err != nil { log.Errorf("Upgrade err:%v", err) errdata = &pb.ErrorData{ Code: pb.ErrorCode_SystemError, Title: pb.ErrorCode_SystemError.ToString(), Message: err.Error(), } return } } } if issucc { modifyequipments = make([]*pb.DB_Equipment, 0) //叠加装备 拆分处理 if equipment.IsInitialState && equipment.OverlayNum > 1 { equipment.OverlayNum-- if err = this.module.modelEquipment.ChangeList(session.GetUserId(), equipment.Id, map[string]interface{}{ "overlayNum": equipment.OverlayNum, "heroId": "", }); err != nil { this.module.Errorf("Upgrade err:%v", err) errdata = &pb.ErrorData{ Code: pb.ErrorCode_SystemError, Title: pb.ErrorCode_SystemError.ToString(), Message: err.Error(), } return } modifyequipments = append(modifyequipments, equipment) equipment = CloneEquipment(equipment) equipment.Id = primitive.NewObjectID().Hex() equipment.IsInitialState = false equipment.OverlayNum = 1 modifyequipments = append(modifyequipments, equipment) if err = this.module.modelEquipment.upgradeEquipment(equipment, conf, intensify); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_SystemError, Title: pb.ErrorCode_SystemError.ToString(), Message: err.Error(), } this.module.Errorf("Upgrade err:%v", err) return } if err = this.module.modelEquipment.AddList(session.GetUserId(), equipment.Id, equipment); err != nil { this.module.Errorf("Upgrade err:%v", err) errdata = &pb.ErrorData{ Code: pb.ErrorCode_SystemError, Title: pb.ErrorCode_SystemError.ToString(), Message: err.Error(), } return } } else { equipment.IsInitialState = false modifyequipments = append(modifyequipments, equipment) if err = this.module.modelEquipment.upgradeEquipment(equipment, conf, intensify); err != nil { this.module.Errorf("Upgrade err:%v", err) errdata = &pb.ErrorData{ Code: pb.ErrorCode_SystemError, Title: pb.ErrorCode_SystemError.ToString(), Message: err.Error(), } return } if err = this.module.modelEquipment.ChangeList(session.GetUserId(), equipment.Id, map[string]interface{}{ "keepFailNum": equipment.KeepFailNum, "lv": equipment.Lv, "mainEntry": equipment.MainEntry, "adverbEntry": equipment.AdverbEntry, "adverbskill": equipment.Adverbskill, "isInitialState": false, }); err != nil { log.Errorf("Upgrade err:%v", err) errdata = &pb.ErrorData{ Code: pb.ErrorCode_SystemError, Title: pb.ErrorCode_SystemError.ToString(), Message: err.Error(), } return } } equipments = make([]*pb.DB_Equipment, 8) confs = make([]*cfg.GameEquipData, 8) suitconfs = make([]*cfg.GameEquipSuitData, 8) //已装备 重新计算属性 if equipment.HeroId != "" { if hero, errdata = this.module.ModuleHero.GetHeroByObjID(session.GetUserId(), equipment.HeroId); errdata != nil { return } if conf.Pos >= 8 { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigurationException, Title: pb.ErrorCode_ConfigurationException.ToString(), Message: fmt.Sprintf("装备配置异常 id:%s pos:%d", conf.Id, conf.Pos), } return } hero.EquipID[conf.Pos] = equipment.Id //拆分后的装备是一个新的 for i, v := range hero.EquipID { if v != "" { if v != equipment.Id { if equipments[i], err = this.module.modelEquipment.QueryUserEquipmentsById(session.GetUserId(), v); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_EquipmentOnFoundEquipment, Title: pb.ErrorCode_EquipmentOnFoundEquipment.ToString(), Message: fmt.Sprintf("未找到装备 uid:%s id:%s", session.GetUserId(), v), } return } if confs[i], err = this.module.configure.GetEquipmentConfigureById(equipments[i].CId); err != nil { this.module.Errorf("Equip_Check err:%v", err) errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } return } if suitconfs[i], err = this.module.configure.getEquipSuit(confs[i].Suittype); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } } } else { equipments[i] = equipment confs[i] = conf if suitconfs[i], err = this.module.configure.getEquipSuit(confs[i].Suittype); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } } } suit = nil for _, _suit := range suits { if _suit.Suitid == confs[i].Suittype && !_suit.Effect { //找到一个未生效的套装 suit = _suit break } } if suit == nil { suit = &pb.DB_EquipmentSuit{ Suitid: confs[i].Suittype, Eids: []string{v}, Str: confs[i].Color, Lv: equipments[i].Lv, Effect: false, } if len(suit.Eids) >= int(suitconfs[i].Suitnum) { suit.Effect = true } suits = append(suits, suit) } else { suit.Eids = append(suit.Eids, v) if suit.Str < confs[i].Color { suit.Str = confs[i].Color } if suit.Lv < equipments[i].Lv { suit.Lv = equipments[i].Lv } if !suit.Effect && len(suit.Eids) >= int(suitconfs[i].Suitnum) { suit.Effect = true tasks = append(tasks, comm.GetBuriedParam(comm.Rtype93, 1, suit.Suitid, suit.Lv)) tasks = append(tasks, comm.GetBuriedParam2(comm.Rtype45, equipment.Id, conf.Color, suit.Suitid, suit.Lv)) } } } } hero.Suits = suits if errdata = this.module.ModuleHero.UpdateEquipment(session, hero, equipments); errdata != nil { return } } //随机任务触发 tasks = append(tasks, comm.GetBuriedParam2(comm.Rtype43, equipment.Id, equipment.Lv)) tasks = append(tasks, comm.GetBuriedParam(comm.Rtype47, 1)) if conf.Pos == 7 { tasks = append(tasks, comm.GetBuriedParam(comm.Rtype102, 1)) } else if conf.Pos == 6 { tasks = append(tasks, comm.GetBuriedParam(comm.Rtype100, 1)) } //聊天系统通知 if user = this.module.ModuleUser.GetUser(session.GetUserId()); user != nil { this.module.chat.SendSysChatToWorld(comm.ChatSystem3, equipment, equipment.Lv, 0, user.Name, conf.Id) } else { this.module.Errorf("no found userdata uid:%s", session.GetUserId()) } } else { tasks = append(tasks, comm.GetBuriedParam(comm.Rtype96, 1)) } tasks = append(tasks, comm.GetBuriedParam(comm.Rtype92, 1)) if len(tasks) > 0 { go this.module.ModuleBuried.TriggerBuried(session.GetUserId(), tasks...) } session.SendMsg(string(this.module.GetType()), "upgrade", &pb.EquipmentUpgradeResp{IsSucc: issucc, Equipment: modifyequipments}) return }