package items import ( "fmt" "go_dreamfactory/comm" "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" ) //参数校验 func (this *apiComp) UseitemCheck(session comm.IUserSession, req *pb.ItemsUseItemReq) (errdata *pb.ErrorData) { if req.GridId == "" || req.Amount <= 0 || req.Select < 0 { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), } } return } //使用道具 func (this *apiComp) Useitem(session comm.IUserSession, req *pb.ItemsUseItemReq) (errdata *pb.ErrorData) { var ( err error item *pb.DB_UserItemData itemcf *cfg.GameItemData prop []*cfg.GameDropData ) if errdata = this.UseitemCheck(session, req); errdata != nil { return } if item, err = this.module.modelItems.QueryUserPackByGridId(session.GetUserId(), req.GridId); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), } return } if itemcf, err = this.module.configure.GetItemConfigure(item.ItemId); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigurationException, Title: pb.ErrorCode_ConfigurationException.ToString(), } return } switch itemcf.Usetype { case itemuse_exchange: //分解(体力,兑换 sale := make([]*cfg.Gameatn, 0, len(prop)) for _, v := range itemcf.DecomposeDeplete { sale = append(sale, &cfg.Gameatn{ A: v.A, T: v.T, N: v.N * int32(req.Amount), }) } if errdata = this.module.AddItemforGrid(session, req.GridId, -1*int32(req.Amount), true); errdata != nil { return } if errdata = this.module.DispenseRes(session, sale, true); errdata != nil { return } break case itemuse_optionalbox: //自选宝箱 if prop = this.module.configure.GetDropData(itemcf.BoxId); prop == nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: fmt.Sprintf("掉落组未找到:%d", itemcf.BoxId), } return } if errdata = this.module.AddItemforGrid(session, req.GridId, -1*int32(req.Amount), true); errdata != nil { return } var sale []*cfg.Gameatn for _, v := range prop { if v.Id == req.Select { for _, v1 := range v.Prize { sale = append(sale, &cfg.Gameatn{ A: v1.A, T: v1.T, N: v1.N * int32(req.Amount), }) } } } if sale == nil { this.module.Errorf("no found target sale:%v", req.Select) errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), } return } if errdata = this.module.DispenseRes(session, sale, true); errdata != nil { return } case itemuse_randombox: //宝箱 if prop = this.module.configure.GetDropData(itemcf.BoxId); prop == nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: fmt.Sprintf("掉落组未找到:%d", itemcf.BoxId), } return } sale := make([]*cfg.Gameatn, 0) for i := uint32(0); i < req.Amount; i++ { sale = append(sale, RandomProps(prop).Prize...) } if errdata = this.module.AddItemforGrid(session, req.GridId, -1*int32(req.Amount), true); errdata != nil { return } if errdata = this.module.DispenseRes(session, sale, true); errdata != nil { return } case itemuse_synthesis: //合成 user := this.module.ModuleUser.GetUser(session.GetUserId()) reward := this.module.ModuleTools.GetGroupDataByLottery(itemcf.BoxId, user.Vip, user.Lv) // 走新的掉落 if reward == nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: fmt.Sprintf("掉落组未找到:%d", itemcf.BoxId), } return } if itemcf.SynthetizeNum*int32(req.Amount) > int32(item.Amount) { //碎片数量不够 errdata = &pb.ErrorData{ Code: pb.ErrorCode_ItemsNoEnough, Title: pb.ErrorCode_ItemsNoEnough.ToString(), Message: fmt.Sprintf("道具Id:%d", itemcf.Id), } return } sale := make([]*cfg.Gameatn, 0, len(itemcf.SynthetizeDeplete)) for _, v := range itemcf.SynthetizeDeplete { sale = append(sale, &cfg.Gameatn{ A: v.A, T: v.T, N: v.N * int32(req.Amount), }) } if errdata = this.module.ConsumeRes(session, sale, true); errdata != nil { return } if errdata = this.module.AddItemforGrid(session, req.GridId, -1*itemcf.SynthetizeNum*int32(req.Amount), true); errdata != nil { return } sale = make([]*cfg.Gameatn, 0, len(prop)) for _, v1 := range reward { sale = append(sale, &cfg.Gameatn{ A: v1.A, T: v1.T, N: v1.N * int32(req.Amount), }) } if errdata = this.module.DispenseRes(session, sale, true); errdata != nil { return } default: errdata = &pb.ErrorData{ Code: pb.ErrorCode_ItemsUseNotSupported, Title: pb.ErrorCode_ItemsUseNotSupported.ToString(), Message: fmt.Sprintf("道具使用类型:%d", itemcf.Usetype), } return } session.SendMsg(string(this.module.GetType()), "useitem", &pb.ItemsUseItemResp{GridId: req.GridId, Amount: req.Amount, Issucc: true}) return }