package stonehenge import ( "fmt" "go_dreamfactory/comm" "go_dreamfactory/modules/battle" "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" "math" "strconv" ) //参数校验 func (this *apiComp) EventCheck(session comm.IUserSession, req *pb.StonehengeEventReq) (errdata *pb.ErrorData) { if req.Eventid == 0 { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), } } return } func (this *apiComp) Event(session comm.IUserSession, req *pb.StonehengeEventReq) (errdata *pb.ErrorData) { var ( stone *pb.DBStonehenge update map[string]interface{} roomConf *cfg.GameStoneRoomData err error newEvent int32 // 是否有新的事件 eventConf *cfg.GameStoneEventData newEventConf *cfg.GameStoneEventData //新的事件配置 reward []*pb.UserAtno ) update = make(map[string]interface{}) if errdata = this.EventCheck(session, req); errdata != nil { return } stone = this.module.modelStonehenge.GetStonehengeData(session.GetUserId()) if v, ok := stone.Rooms.Eventid[req.Eventid]; !ok || v == true { // 不存在该事件 errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), Message: fmt.Sprintf("req.Eventid err :%d", req.Eventid), } return } _, bBox := stone.Rooms.Box[req.Eventid] if stone.Rooms.Eventid[req.Eventid] || bBox { // 重复完成 errdata = &pb.ErrorData{ Code: pb.ErrorCode_StonehengeRepeatedReward, Title: pb.ErrorCode_StonehengeRepeatedReward.ToString(), Message: fmt.Sprintf("req.Eventid err :%d", req.Eventid), } return } update["stageID"] = stone.StageID if roomConf, err = this.module.configure.GetStoneRoomDataById(stone.Rooms.Roomid); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } return } if eventConf, err = this.module.configure.GetStoneEventDataById(req.Eventid); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } return } switch eventConf.EventType { case EventType16: // 捡垃圾事件 user := this.module.ModuleUser.GetUser(session.GetUserId()) if lotteryward := this.module.ModuleTools.GetGroupDataByLottery(eventConf.Value1, user.Vip, user.Lv); len(lotteryward) > 0 { if errdata, reward = this.module.DispenseAtno(session, lotteryward, true); errdata != nil { this.module.Debugf("Mline lotteryward DispenseRes err:+%v", lotteryward) } } case EventType25: // buff 三选一 lenSelect := len(stone.Rooms.Selectbuff) if pos, err := strconv.Atoi(req.Param1); err == nil { if lenSelect == 0 || lenSelect <= pos { return } stone.Userbuff[stone.Rooms.Selectbuff[pos]] = 1 stone.Rooms.Selectbuff = []int32{} update["userbuff"] = stone.Userbuff } else { // 参数错误 errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), Message: err.Error(), } } case EventType14: case EventType28: // 战斗事件 if req.Report == nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), Message: fmt.Sprintf("BattleReport is nil"), } return } bWin := false errdata, bWin = this.module.battle.CheckBattleReport(session, req.Report) if errdata != nil { return } if !bWin { // 战斗失败直接返回 return } // 掉落奖励 if conf, err := this.module.configure.GetStoneEventDataById(req.Eventid); err == nil { if battleConf, err := this.module.configure.GetBattleConfById(conf.Value1); err == nil { user := this.module.ModuleUser.GetUser(session.GetUserId()) if lotteryward := this.module.ModuleTools.GetGroupDataByLottery(battleConf.RewardLottery, user.Vip, user.Lv); len(lotteryward) > 0 { if errdata, reward = this.module.DispenseAtno(session, lotteryward, true); errdata != nil { this.module.Debugf("Mline lotteryward DispenseRes err:+%v", lotteryward) } } } } for _, v := range req.Report.Alive { bAlive := false for _, v1 := range stone.Rooms.Hero { // 注意 阵亡英雄不在存货列表内 if v.Oid == v1 { stone.Hero[v.Oid] = v // 找到了说明英雄还在 bAlive = true break } } if !bAlive { // 英雄死亡处理 stone.Hero[v.Oid].Currhp = 0 } } stone.Rooms.Hero = []string{} // 上阵英雄清理 update["hero"] = stone.Hero case EventType10: // 宝箱事件 // 通关了才能领取宝箱 if !stone.Rooms.Complete { errdata = &pb.ErrorData{ Code: pb.ErrorCode_StonehengeNoComplete, Title: pb.ErrorCode_StonehengeNoComplete.ToString(), } return } // 次数校验 if bBox && stone.Rooms.Box[req.Eventid] < eventConf.Value2 { user := this.module.ModuleUser.GetUser(session.GetUserId()) // 校验消耗是否 if len(eventConf.CostItem) > 0 { if errdata = this.module.ConsumeRes(session, eventConf.CostItem, true); errdata != nil { return } } if lotteryward := this.module.ModuleTools.GetGroupDataByLottery(eventConf.Value1, user.Vip, user.Lv); len(lotteryward) > 0 { if errdata, reward = this.module.DispenseAtno(session, lotteryward, true); errdata != nil { this.module.Debugf("Mline lotteryward DispenseRes err:+%v", lotteryward) } } stone.Rooms.Box[req.Eventid] += 1 // 更新宝箱进度 } else { errdata = &pb.ErrorData{ Code: pb.ErrorCode_StonehengeRewardBoxFailed, Title: pb.ErrorCode_StonehengeRewardBoxFailed.ToString(), } return } case EventType17: // 英雄回血 var sz []int32 // 获取 var szHero []string for _, v := range stone.Hero { if v.Currhp > 0 { szHero = append(szHero, v.Oid) sz = append(sz, 100) } } for _, v := range comm.GetRandWs(sz, eventConf.Value2) { objId := szHero[v] maxHp := stone.Hero[objId].Property[battle.AttributesTransBase("hp")] stone.Hero[objId].Currhp += int32(math.Floor(float64(maxHp*eventConf.Value1) / 1000)) // 回血 } } stone.Rooms.Eventid[req.Eventid] = true // // 校验事件有后续事件 if eventConf.Probability >= comm.GetRandNum(0, 1000) { // 命中 newEvent = eventConf.PostEvent stone.Rooms.Eventid[newEvent] = false // if newEventConf, err = this.module.configure.GetStoneEventDataById(newEvent); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } return } switch newEventConf.EventType { case EventType25: // buff是3选1 for _, v := range stone.Addweight { ownerbuff := make(map[int32]struct{}, 0) for k := range stone.Userbuff { ownerbuff[k] = struct{}{} } stone.Rooms.Selectbuff = this.module.configure.GetBuffGroupDataByLottery(newEventConf.Value1, v, ownerbuff) } case EventType10: // 宝箱事件 if _, ok := stone.Rooms.Box[newEventConf.EventId]; !ok { stone.Rooms.Box[newEventConf.EventId] = 0 } } } stone.Rooms.Complete = true for _, v := range roomConf.Condition { for k, ok := range stone.Rooms.Eventid { if !ok { if eventConf, err = this.module.configure.GetStoneEventDataById(k); err == nil { if eventConf.EventType == v { stone.Rooms.Complete = false break } } } } if !stone.Rooms.Complete { break } } // 通过条件判断 update["rooms"] = stone.Rooms this.module.modelStonehenge.ChangeStonehengeData(session.GetUserId(), update) session.SendMsg(string(this.module.GetType()), "event", &pb.StonehengeEventResp{ Eventid: req.Eventid, NewEvent: newEvent, Room: stone.Rooms, Reward: reward, Hero: stone.Hero, Userbuff: stone.Userbuff, }) return }