diff --git a/comm/imodule.go b/comm/imodule.go index 53911c930..4bff45e59 100644 --- a/comm/imodule.go +++ b/comm/imodule.go @@ -62,7 +62,9 @@ type ( RecoverTicket(session IUserSession) (errdata *pb.ErrorData) //出售道具 SellItem(session IUserSession, items map[string]int32, bPush bool) (errdata *pb.ErrorData, atno []*pb.UserAtno) - + //使用物品 + UseItem(session IUserSession, gid string, amount int32) (errdata *pb.ErrorData) + //清理物品 CleanItemById(session IUserSession, t string) (errdata *pb.ErrorData) } @@ -514,7 +516,7 @@ type ( CheckCondition(uid string, condiIds ...int32) (condis []*pb.ConIProgress, err error) //激活条件 ActiveCondition(uid string, condiIds ...int32) (err error) - //校验的同时激活条件 废弃 - // CheckAndActiveCondition(uid string, condiIds ...int32) (condIds []int32, err error) + //完成任务并校验接口 + FinishConditionAndCheck(uid string, finishcondiIds []int32, condiIds ...int32) (condis []*pb.ConIProgress, err error) } ) diff --git a/modules/buried/module.go b/modules/buried/module.go index 397742ea8..34413d570 100644 --- a/modules/buried/module.go +++ b/modules/buried/module.go @@ -184,6 +184,133 @@ func (this *Buried) CheckCondition(uid string, condiIds ...int32) (condis []*pb. return } +//设置任务完成状态并校验 +func (this *Buried) FinishConditionAndCheck(uid string, finishcondiIds []int32, condiIds ...int32) (condis []*pb.ConIProgress, err error) { + var ( + bdatas *pb.DBBuried + bitem *pb.DBBuriedConItem + conf *cfg.GameBuriedCondiData + ok bool + chanage bool + bdata *pb.DBBuriedItem + ) + if bdatas, err = this.modelBuried.getUserBurieds(uid); err != nil { + return + } + condis = make([]*pb.ConIProgress, 0) + + for _, v := range finishcondiIds { + if conf, err = this.configure.getburiedcondidata(v); err != nil { + return + } + if bdata, ok = bdatas.Items[conf.Type]; ok { + ok = false + for _, v1 := range bdata.Condi { + if v1.Conid == v { + ok = true + if v1.Finish != pb.BuriedItemFinishState_buried_finish { + if conf.Ctype == ctype_once { //完成后自动锁定 + v1.State = pb.BuriedItemState_Freeze + } else if conf.Ctype == ctype_repeat { + v1.State = pb.BuriedItemState_Sleep + } else if conf.Ctype == ctype_daily { + v1.State = pb.BuriedItemState_Sleep + } else if conf.Ctype == ctype_weekly { + v1.State = pb.BuriedItemState_Sleep + } + v1.Value = conf.Value + v1.Finish = pb.BuriedItemFinishState_buried_finish + chanage = true + } + } + } + } + if !ok { //未找到 初始化一个 + bitem = &pb.DBBuriedConItem{ + Conid: v, + State: pb.BuriedItemState_Activated, + Value: conf.Value, + Statistics: make([]string, 0), + Timestamp: time.Now().Unix(), + Finish: pb.BuriedItemFinishState_buried_finish, + } + if conf.Ctype == ctype_once { //完成后自动锁定 + bitem.State = pb.BuriedItemState_Freeze + } else if conf.Ctype == ctype_repeat { + bitem.State = pb.BuriedItemState_Sleep + } else if conf.Ctype == ctype_daily { + bitem.State = pb.BuriedItemState_Sleep + } else if conf.Ctype == ctype_weekly { + bitem.State = pb.BuriedItemState_Sleep + } + bdata.Condi = append(bdata.Condi, bitem) + } + } + + for _, v := range condiIds { + if conf, err = this.configure.getburiedcondidata(v); err != nil { + return + } + if bdata, ok := bdatas.Items[conf.Type]; ok { + ok = false + for _, v1 := range bdata.Condi { + if v1.Conid == v { + ok = true + //状态等于休眠 + if v1.State == pb.BuriedItemState_Sleep { + if conf.Ctype == ctype_daily { //日常 + if !utils.IsToday(v1.Timestamp) { //不是同一天 可以重置数据 + v1.State = pb.BuriedItemState_Activated + v1.Value = 0 + v1.Finish = pb.BuriedItemFinishState_buried_unfinish + } + } else if conf.Ctype == ctype_weekly { //周常 + if !utils.IsSameWeek(v1.Timestamp) { //不是同一周 + v1.State = pb.BuriedItemState_Activated + v1.Value = 0 + v1.Finish = pb.BuriedItemFinishState_buried_unfinish + } + } + } + condis = append(condis, &pb.ConIProgress{ + Btype: conf.Type, + Conid: v1.Conid, + Value: v1.Value, + Target: conf.Value, + State: v1.Finish, + }) + } + } + if !ok { //未找到 初始化一个 + condis = append(condis, &pb.ConIProgress{ + Btype: conf.Type, + Conid: v, + Value: 0, + Target: conf.Value, + State: pb.BuriedItemFinishState_buried_unfinish, + }) + } + } else { //未找到 初始化一个 + condis = append(condis, &pb.ConIProgress{ + Btype: conf.Type, + Conid: v, + Value: 0, + Target: conf.Value, + State: pb.BuriedItemFinishState_buried_unfinish, + }) + } + } + + if chanage { + if err = this.modelBuried.updateUserBurieds(uid, bdatas); err != nil { + this.Error("更新用户埋点数据错误!", log.Field{Key: "err", Value: err.Error()}) + return + } + } + + return +} + //触发埋点 func (this *Buried) TriggerBuried(uid string, burieds ...*pb.BuriedParam) { diff --git a/modules/items/api_useItem.go b/modules/items/api_useItem.go index 768994718..6073d81ee 100644 --- a/modules/items/api_useItem.go +++ b/modules/items/api_useItem.go @@ -1,10 +1,8 @@ package items import ( - "fmt" "go_dreamfactory/comm" "go_dreamfactory/pb" - cfg "go_dreamfactory/sys/configure/structs" ) //参数校验 @@ -20,197 +18,12 @@ func (this *apiComp) UseitemCheck(session comm.IUserSession, req *pb.ItemsUseIte //使用道具 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.modelItems.useitem(session, req.GridId, int32(req.Amount), req.Select); errdata != nil { - } - 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: //合成/分解 - if req.Select == 0 { // 合成 - if itemcf.SynthetizeGet == nil || len(itemcf.SynthetizeGet) == 0 { - errdata = &pb.ErrorData{ - Code: pb.ErrorCode_ConfigNoFound, - Title: pb.ErrorCode_ConfigNoFound.ToString(), - Message: fmt.Sprintf("道具合成未配置! 道具id:%s ", itemcf.Id), - } - 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:%s", 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 itemcf.SynthetizeGet { - 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 - } - } else { - if itemcf.DecomposeGet == nil || len(itemcf.DecomposeGet) == 0 { - errdata = &pb.ErrorData{ - Code: pb.ErrorCode_ConfigNoFound, - Title: pb.ErrorCode_ConfigNoFound.ToString(), - Message: fmt.Sprintf("道具分解未配置! 道具id:%s ", itemcf.Id), - } - 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:%s", itemcf.Id), - } - return - } - sale := make([]*cfg.Gameatn, 0, len(itemcf.DecomposeDeplete)) - 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.ConsumeRes(session, sale, true); errdata != nil { - return - } - - if errdata = this.module.AddItemforGrid(session, req.GridId, -1*int32(req.Amount), true); errdata != nil { - return - } - - sale = make([]*cfg.Gameatn, len(itemcf.Sale)) - for i, v := range itemcf.DecomposeGet { - temp := *v - sale[i] = &temp - sale[i].N = v.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 diff --git a/modules/items/core.go b/modules/items/core.go index 5ab3bca2d..5ada1bbcb 100644 --- a/modules/items/core.go +++ b/modules/items/core.go @@ -22,10 +22,9 @@ const ( const ( itemuse_nouse int32 = 1 //不可使用 itemuse_jump int32 = 2 //跳转 - itemuse_exchange int32 = 3 //分解(体力,兑换) + itemuse_exchange int32 = 3 //合成/分解(体力,兑换) itemuse_optionalbox int32 = 4 //自选宝箱 itemuse_randombox int32 = 5 //随机宝箱 - itemuse_synthesis int32 = 6 //合成(英雄,觉醒) ) var ( diff --git a/modules/items/modelitems.go b/modules/items/modelitems.go index ce3d8c551..09fe5b084 100644 --- a/modules/items/modelitems.go +++ b/modules/items/modelitems.go @@ -598,3 +598,180 @@ func (this *ModelItemsComp) recoverTicket(session comm.IUserSession) (errdata *p }) return } + +///使用道具 +func (this *ModelItemsComp) useitem(session comm.IUserSession, gid string, amount int32, slt int32) (errdata *pb.ErrorData) { + var ( + item *pb.DB_UserItemData + itemcf *cfg.GameItemData + prop []*cfg.GameDropData + err error + ) + if item, err = this.module.modelItems.QueryUserPackByGridId(session.GetUserId(), gid); 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: //合成/分解 + if slt == 0 { // 合成 + if itemcf.SynthetizeGet == nil || len(itemcf.SynthetizeGet) == 0 { + errdata = &pb.ErrorData{ + Code: pb.ErrorCode_ConfigNoFound, + Title: pb.ErrorCode_ConfigNoFound.ToString(), + Message: fmt.Sprintf("道具合成未配置! 道具id:%s ", itemcf.Id), + } + return + } + if itemcf.SynthetizeNum*int32(amount) > int32(item.Amount) { //碎片数量不够 + errdata = &pb.ErrorData{ + Code: pb.ErrorCode_ItemsNoEnough, + Title: pb.ErrorCode_ItemsNoEnough.ToString(), + Message: fmt.Sprintf("道具Id:%s", 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(amount), + }) + } + if errdata = this.module.ConsumeRes(session, sale, true); errdata != nil { + return + } + + if errdata = this.module.AddItemforGrid(session, gid, -1*itemcf.SynthetizeNum*int32(amount), true); errdata != nil { + return + } + sale = make([]*cfg.Gameatn, 0, len(itemcf.SynthetizeGet)) + for _, v1 := range itemcf.SynthetizeGet { + sale = append(sale, &cfg.Gameatn{ + A: v1.A, + T: v1.T, + N: v1.N * int32(amount), + }) + } + if errdata = this.module.DispenseRes(session, sale, true); errdata != nil { + return + } + } else { + if itemcf.DecomposeGet == nil || len(itemcf.DecomposeGet) == 0 { + errdata = &pb.ErrorData{ + Code: pb.ErrorCode_ConfigNoFound, + Title: pb.ErrorCode_ConfigNoFound.ToString(), + Message: fmt.Sprintf("道具分解未配置! 道具id:%s ", itemcf.Id), + } + return + } + + if itemcf.SynthetizeNum*int32(amount) > int32(item.Amount) { //碎片数量不够 + errdata = &pb.ErrorData{ + Code: pb.ErrorCode_ItemsNoEnough, + Title: pb.ErrorCode_ItemsNoEnough.ToString(), + Message: fmt.Sprintf("道具Id:%s", itemcf.Id), + } + return + } + sale := make([]*cfg.Gameatn, 0, len(itemcf.DecomposeDeplete)) + for _, v := range itemcf.DecomposeDeplete { + sale = append(sale, &cfg.Gameatn{ + A: v.A, + T: v.T, + N: v.N * int32(amount), + }) + } + if errdata = this.module.ConsumeRes(session, sale, true); errdata != nil { + return + } + + if errdata = this.module.AddItemforGrid(session, gid, -1*int32(amount), true); errdata != nil { + return + } + + sale = make([]*cfg.Gameatn, len(itemcf.Sale)) + for i, v := range itemcf.DecomposeGet { + temp := *v + sale[i] = &temp + sale[i].N = v.N * int32(amount) + } + if errdata = this.module.DispenseRes(session, sale, true); errdata != nil { + return + } + } + 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, gid, -1*int32(amount), true); errdata != nil { + return + } + var sale []*cfg.Gameatn + for _, v := range prop { + if v.Id == slt { + for _, v1 := range v.Prize { + sale = append(sale, &cfg.Gameatn{ + A: v1.A, + T: v1.T, + N: v1.N * int32(amount), + }) + } + } + } + if sale == nil { + this.module.Errorf("no found target sale:%v", slt) + 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 := int32(0); i < amount; i++ { + sale = append(sale, RandomProps(prop).Prize...) + } + if errdata = this.module.AddItemforGrid(session, gid, -1*int32(amount), true); errdata != nil { + return + } + 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 + } + return +} diff --git a/modules/items/module.go b/modules/items/module.go index 22f859e1f..f20e5c923 100644 --- a/modules/items/module.go +++ b/modules/items/module.go @@ -213,6 +213,12 @@ func (this *Items) AddItems(session comm.IUserSession, items map[string]int32, b return } +//使用物品 +func (this *Items) UseItem(session comm.IUserSession, gid string, amount int32, slt int32) (errdata *pb.ErrorData) { + + return +} + //清理背包 func (this *Items) CleanItems(session comm.IUserSession) (errdata *pb.ErrorData) { var (