上传接口

This commit is contained in:
liwei1dao 2023-06-08 13:51:41 +08:00
parent 6983411410
commit dee39299e2
6 changed files with 318 additions and 194 deletions

View File

@ -62,7 +62,9 @@ type (
RecoverTicket(session IUserSession) (errdata *pb.ErrorData) RecoverTicket(session IUserSession) (errdata *pb.ErrorData)
//出售道具 //出售道具
SellItem(session IUserSession, items map[string]int32, bPush bool) (errdata *pb.ErrorData, atno []*pb.UserAtno) 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) CleanItemById(session IUserSession, t string) (errdata *pb.ErrorData)
} }
@ -514,7 +516,7 @@ type (
CheckCondition(uid string, condiIds ...int32) (condis []*pb.ConIProgress, err error) CheckCondition(uid string, condiIds ...int32) (condis []*pb.ConIProgress, err error)
//激活条件 //激活条件
ActiveCondition(uid string, condiIds ...int32) (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)
} }
) )

View File

@ -184,6 +184,133 @@ func (this *Buried) CheckCondition(uid string, condiIds ...int32) (condis []*pb.
return 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) { func (this *Buried) TriggerBuried(uid string, burieds ...*pb.BuriedParam) {

View File

@ -1,10 +1,8 @@
package items package items
import ( import (
"fmt"
"go_dreamfactory/comm" "go_dreamfactory/comm"
"go_dreamfactory/pb" "go_dreamfactory/pb"
cfg "go_dreamfactory/sys/configure/structs"
) )
//参数校验 //参数校验
@ -20,198 +18,13 @@ func (this *apiComp) UseitemCheck(session comm.IUserSession, req *pb.ItemsUseIte
//使用道具 //使用道具
func (this *apiComp) Useitem(session comm.IUserSession, req *pb.ItemsUseItemReq) (errdata *pb.ErrorData) { 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 { if errdata = this.UseitemCheck(session, req); errdata != nil {
return return
} }
if item, err = this.module.modelItems.QueryUserPackByGridId(session.GetUserId(), req.GridId); err != nil { if errdata = this.module.modelItems.useitem(session, req.GridId, int32(req.Amount), req.Select); errdata != 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: //合成/分解
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}) session.SendMsg(string(this.module.GetType()), "useitem", &pb.ItemsUseItemResp{GridId: req.GridId, Amount: req.Amount, Issucc: true})
return return
} }

View File

@ -22,10 +22,9 @@ const (
const ( const (
itemuse_nouse int32 = 1 //不可使用 itemuse_nouse int32 = 1 //不可使用
itemuse_jump int32 = 2 //跳转 itemuse_jump int32 = 2 //跳转
itemuse_exchange int32 = 3 //分解(体力,兑换) itemuse_exchange int32 = 3 //合成/分解(体力,兑换)
itemuse_optionalbox int32 = 4 //自选宝箱 itemuse_optionalbox int32 = 4 //自选宝箱
itemuse_randombox int32 = 5 //随机宝箱 itemuse_randombox int32 = 5 //随机宝箱
itemuse_synthesis int32 = 6 //合成(英雄,觉醒)
) )
var ( var (

View File

@ -598,3 +598,180 @@ func (this *ModelItemsComp) recoverTicket(session comm.IUserSession) (errdata *p
}) })
return 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
}

View File

@ -213,6 +213,12 @@ func (this *Items) AddItems(session comm.IUserSession, items map[string]int32, b
return 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) { func (this *Items) CleanItems(session comm.IUserSession) (errdata *pb.ErrorData) {
var ( var (