324 lines
7.6 KiB
Go
324 lines
7.6 KiB
Go
package items
|
|
|
|
import (
|
|
"fmt"
|
|
"go_dreamfactory/lego/core"
|
|
"go_dreamfactory/modules"
|
|
"go_dreamfactory/pb"
|
|
cfg "go_dreamfactory/sys/configure/structs"
|
|
"time"
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/x/bsonx"
|
|
)
|
|
|
|
///背包缓存数据管理组件
|
|
type ModelItemsComp struct {
|
|
modules.MCompModel
|
|
module *Items
|
|
}
|
|
|
|
//组件初始化接口
|
|
func (this *ModelItemsComp) Init(service core.IService, module core.IModule, comp core.IModuleComp, opt core.IModuleOptions) (err error) {
|
|
this.MCompModel.Init(service, module, comp, opt)
|
|
this.module = module.(*Items)
|
|
this.TableName = "items"
|
|
//创建uid索引
|
|
this.DB.CreateIndex(core.SqlTable(this.TableName), mongo.IndexModel{
|
|
Keys: bsonx.Doc{{Key: "uid", Value: bsonx.Int32(1)}},
|
|
})
|
|
return
|
|
}
|
|
|
|
///查询用户背包数据
|
|
func (this *ModelItemsComp) Pack_QueryUserPack(uId string) (itmes []*pb.DB_UserItemData, err error) {
|
|
itmes = make([]*pb.DB_UserItemData, 0)
|
|
err = this.GetList(uId, &itmes)
|
|
return
|
|
}
|
|
|
|
///查询用户指定格子的物品数据
|
|
func (this *ModelItemsComp) Pack_QueryUserPackByGridId(uId string, grid string) (itme *pb.DB_UserItemData, err error) {
|
|
itme = &pb.DB_UserItemData{}
|
|
err = this.GetListObj(uId, grid, itme)
|
|
return
|
|
}
|
|
|
|
//更新用户的背包信息
|
|
func (this *ModelItemsComp) Pack_AddUserPack(uId string, itmes ...*pb.DB_UserItemData) (err error) {
|
|
for _, v := range itmes {
|
|
this.AddList(uId, v.GridId, v)
|
|
}
|
|
return
|
|
}
|
|
|
|
//更新用户的背包信息
|
|
func (this *ModelItemsComp) Pack_DelUserPack(uId string, ids ...string) (err error) {
|
|
err = this.DelListlds(uId, ids...)
|
|
return
|
|
}
|
|
|
|
//更新用户的背包信息
|
|
func (this *ModelItemsComp) Pack_UpdateUserPack(uId string, itmes ...*pb.DB_UserItemData) (err error) {
|
|
for _, v := range itmes {
|
|
this.ChangeList(uId, v.GridId, map[string]interface{}{
|
|
"amount": v.Amount,
|
|
})
|
|
}
|
|
return
|
|
}
|
|
|
|
//更新用户的背包信息
|
|
func (this *ModelItemsComp) Pack_DeleteUserPack(uId string, gridIds ...string) (err error) {
|
|
err = this.DelListlds(uId, gridIds...)
|
|
return
|
|
}
|
|
|
|
//查询用户背包物品数量
|
|
func (this *ModelItemsComp) Pack_QueryUserPackItemsAmount(uId string, itemid ...int32) (result map[int32]uint32) {
|
|
var (
|
|
itmes []*pb.DB_UserItemData
|
|
err error
|
|
)
|
|
if itmes, err = this.Pack_QueryUserPack(uId); err != nil {
|
|
return
|
|
}
|
|
result = map[int32]uint32{}
|
|
for _, v := range itmes {
|
|
for _, v1 := range itemid {
|
|
if v.ItemId == v1 {
|
|
result[v1] += v.Amount
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
///添加或则减少物品到用户背包
|
|
func (this *ModelItemsComp) Pack_AddItemToUserPack(uId string, itemId int32, addnum int32) (err error) {
|
|
var (
|
|
itmes []*pb.DB_UserItemData
|
|
add []*pb.DB_UserItemData
|
|
del []string
|
|
update []*pb.DB_UserItemData
|
|
leftnum int64
|
|
)
|
|
if addnum == 0 {
|
|
return
|
|
}
|
|
if itmes, err = this.Pack_QueryUserPack(uId); err != nil {
|
|
return
|
|
}
|
|
add, update, del, leftnum = this.pack_addItemToUserPack(itmes, itemId, addnum)
|
|
if leftnum < 0 {
|
|
err = ItemNotEnoughError
|
|
return
|
|
} else if leftnum > 0 {
|
|
err = PackGridNumUpper
|
|
return
|
|
}
|
|
if len(add) > 0 {
|
|
if err = this.Pack_AddUserPack(uId, add...); err != nil {
|
|
return
|
|
}
|
|
}
|
|
if len(del) > 0 {
|
|
if err = this.Pack_DeleteUserPack(uId, del...); err != nil {
|
|
return
|
|
}
|
|
}
|
|
if len(update) > 0 {
|
|
if err = this.Pack_UpdateUserPack(uId, update...); err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
///添加或则减少多个物品到用户背包
|
|
func (this *ModelItemsComp) Pack_AddItemsToUserPack(uId string, items map[int32]int32) (err error) {
|
|
var (
|
|
itmes []*pb.DB_UserItemData
|
|
add []*pb.DB_UserItemData
|
|
del []string
|
|
update []*pb.DB_UserItemData
|
|
leftnum int64
|
|
)
|
|
if itmes, err = this.Pack_QueryUserPack(uId); err != nil {
|
|
return
|
|
}
|
|
for k, v := range items {
|
|
add, update, del, leftnum = this.pack_addItemToUserPack(itmes, k, v)
|
|
if leftnum < 0 {
|
|
err = ItemNotEnoughError
|
|
return
|
|
} else if leftnum > 0 {
|
|
err = PackGridNumUpper
|
|
return
|
|
}
|
|
if len(add) > 0 {
|
|
if err = this.Pack_AddUserPack(uId, add...); err != nil {
|
|
return
|
|
}
|
|
}
|
|
if len(del) > 0 {
|
|
if err = this.Pack_DeleteUserPack(uId, del...); err != nil {
|
|
return
|
|
}
|
|
}
|
|
if len(update) > 0 {
|
|
if err = this.Pack_UpdateUserPack(uId, update...); err != nil {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
///修改指定格子的物品数量
|
|
func (this *ModelItemsComp) Pack_AddItemToUserPackByGrid(uId string, gridid string, itemId int32, addnum int32) (err error) {
|
|
var (
|
|
conf *cfg.Game_itemData
|
|
itme *pb.DB_UserItemData
|
|
grid *pb.DB_UserItemData
|
|
num int64
|
|
amount int64
|
|
)
|
|
if addnum == 0 {
|
|
return
|
|
}
|
|
if conf, err = this.module.configure.GetItemConfigure(itemId); err != nil {
|
|
return
|
|
}
|
|
|
|
if itme, err = this.Pack_QueryUserPackByGridId(uId, gridid); err != nil {
|
|
return
|
|
}
|
|
amount = int64(itme.Amount)
|
|
if grid.ItemId != itemId {
|
|
err = fmt.Errorf("target grid itemid:%d no is %d ", grid.ItemId, itemId)
|
|
return
|
|
}
|
|
num = amount + int64(addnum)
|
|
if num < 0 {
|
|
err = ItemNotEnoughError
|
|
} else {
|
|
if num > int64(conf.Maxnum) {
|
|
err = GirdAmountUpper
|
|
return
|
|
} else {
|
|
itme.Amount = uint32(num)
|
|
this.Pack_UpdateUserPack(uId, itme)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
///添加移除物品到用户背包
|
|
func (this *ModelItemsComp) pack_addItemToUserPack(items []*pb.DB_UserItemData, itemId int32, addnum int32) (add, update []*pb.DB_UserItemData, del []string, leftnum int64) {
|
|
var (
|
|
err error
|
|
conf *cfg.Game_itemData
|
|
num int64
|
|
isNew bool
|
|
)
|
|
if addnum == 0 {
|
|
return
|
|
}
|
|
if conf, err = this.module.configure.GetItemConfigure(itemId); err != nil {
|
|
return
|
|
}
|
|
isNew = true
|
|
leftnum = int64(addnum)
|
|
add = make([]*pb.DB_UserItemData, 0)
|
|
del = make([]string, 0)
|
|
update = make([]*pb.DB_UserItemData, 0)
|
|
|
|
for _, v := range items {
|
|
if v.ItemId == itemId {
|
|
isNew = false
|
|
num = int64(v.Amount) + int64(leftnum)
|
|
if num < 0 {
|
|
leftnum += int64(v.Amount)
|
|
v.Amount = 0
|
|
del = append(del, v.GridId)
|
|
} else if num > 0 && num < int64(v.Amount) {
|
|
leftnum = 0
|
|
v.Amount = uint32(num)
|
|
update = append(update, v)
|
|
break
|
|
} else if num > 0 && num > int64(v.Amount) {
|
|
if num <= int64(conf.Maxnum) {
|
|
leftnum = 0
|
|
v.Amount = uint32(num)
|
|
update = append(update, v)
|
|
break
|
|
} else {
|
|
if v.Amount < uint32(conf.Maxnum) {
|
|
leftnum = int64(num - int64(conf.Maxnum))
|
|
v.Amount = uint32(conf.Maxnum)
|
|
update = append(update, v)
|
|
}
|
|
}
|
|
} else if num == 0 {
|
|
leftnum = 0
|
|
v.Amount = 0
|
|
del = append(del, v.GridId)
|
|
}
|
|
}
|
|
}
|
|
if leftnum < 0 { //背包物品不够
|
|
return
|
|
}
|
|
if leftnum > 0 { //还没有放完 寻找空的格子填充
|
|
for _, v := range items {
|
|
if leftnum <= int64(conf.Maxnum) {
|
|
v.ItemId = itemId
|
|
v.Amount = uint32(leftnum)
|
|
leftnum = 0
|
|
update = append(update, v)
|
|
break
|
|
} else {
|
|
leftnum -= int64(conf.Maxnum)
|
|
v.ItemId = itemId
|
|
v.Amount = uint32(conf.Maxnum)
|
|
update = append(update, v)
|
|
}
|
|
}
|
|
index := int32(len(items))
|
|
for leftnum > 0 { //需要补充格子
|
|
if leftnum <= int64(conf.Maxnum) {
|
|
grid := &pb.DB_UserItemData{
|
|
GridId: primitive.NewObjectID().Hex(),
|
|
ItemId: itemId,
|
|
Amount: uint32(leftnum),
|
|
CTime: time.Now().Unix(),
|
|
IsNewItem: isNew,
|
|
}
|
|
items = append(items, grid)
|
|
add = append(add, grid)
|
|
leftnum = 0
|
|
break
|
|
} else {
|
|
leftnum -= int64(conf.Maxnum)
|
|
grid := &pb.DB_UserItemData{
|
|
GridId: primitive.NewObjectID().Hex(),
|
|
ItemId: itemId,
|
|
Amount: uint32(conf.Maxnum),
|
|
CTime: time.Now().Unix(),
|
|
IsNewItem: isNew,
|
|
}
|
|
items = append(items, grid)
|
|
add = append(add, grid)
|
|
index++
|
|
}
|
|
if index > GridMaxNUm { //格子已达上限
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|