289 lines
6.8 KiB
Go
289 lines
6.8 KiB
Go
package pack
|
|
|
|
import (
|
|
"fmt"
|
|
"go_dreamfactory/lego/core/cbase"
|
|
"go_dreamfactory/lego/sys/mgo"
|
|
"go_dreamfactory/lego/sys/redis"
|
|
"go_dreamfactory/pb"
|
|
"go_dreamfactory/sys/db"
|
|
)
|
|
|
|
///背包缓存数据管理组件
|
|
type Cache_Comp struct {
|
|
cbase.ModuleCompBase
|
|
redis redis.ISys
|
|
}
|
|
|
|
///查询用户背包数据
|
|
func (this *Cache_Comp) Pack_QueryUserPack(uId string) (pack *pb.DB_UserPackData, err error) {
|
|
pack = &pb.DB_UserPackData{
|
|
UserId: uId,
|
|
}
|
|
if err = this.redis.Get(fmt.Sprintf(Redis_PackCache, uId), pack); err == nil {
|
|
return
|
|
} else if err == redis.RedisNil {
|
|
if pack, err = db.Defsys.Pack_QueryUserPack(uId); err == nil {
|
|
this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
|
} else if err == mgo.MongodbNil {
|
|
err = nil
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
//查询用户背包物品数量
|
|
func (this *Cache_Comp) Pack_QueryUserPackItemAmount(uId string, itemid int32) (amount uint32) {
|
|
var (
|
|
pack *pb.DB_UserPackData
|
|
err error
|
|
)
|
|
if pack, err = this.Pack_QueryUserPack(uId); err != nil {
|
|
return
|
|
}
|
|
for _, v := range pack.Pack {
|
|
if !v.IsEmpty && v.ItemId == itemid {
|
|
amount += v.Amount
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
///添加或则减少物品到用户背包
|
|
func (this *Cache_Comp) Pack_AddItemToUserPack(uId string, itemId int32, addnum int32) (err error) {
|
|
var (
|
|
pack *pb.DB_UserPackData
|
|
modifys []*pb.DB_GridData
|
|
leftnum int64
|
|
)
|
|
if addnum == 0 {
|
|
return
|
|
}
|
|
if pack, err = this.Pack_QueryUserPack(uId); err != nil {
|
|
return
|
|
}
|
|
modifys, leftnum = this.pack_addItemToUserPack(pack, itemId, addnum)
|
|
if leftnum < 0 {
|
|
err = ItemNotEnoughError
|
|
return
|
|
} else if leftnum > 0 {
|
|
err = PackGridNumUpper
|
|
return
|
|
}
|
|
if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, modifys...); err == nil {
|
|
this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
|
}
|
|
return
|
|
}
|
|
|
|
///添加或则减少多个物品到用户背包
|
|
func (this *Cache_Comp) Pack_AddItemsToUserPack(uId string, items map[int32]int32) (err error) {
|
|
var (
|
|
pack *pb.DB_UserPackData
|
|
modifys []*pb.DB_GridData
|
|
tempmodifys []*pb.DB_GridData
|
|
leftnum int64
|
|
iskeep bool
|
|
)
|
|
if pack, err = this.Pack_QueryUserPack(uId); err != nil {
|
|
return
|
|
}
|
|
for k, v := range items {
|
|
tempmodifys, leftnum = this.pack_addItemToUserPack(pack, k, v)
|
|
if leftnum < 0 {
|
|
err = ItemNotEnoughError
|
|
return
|
|
} else if leftnum > 0 {
|
|
err = PackGridNumUpper
|
|
return
|
|
}
|
|
for _, v1 := range tempmodifys {
|
|
iskeep = false
|
|
for _, v2 := range modifys {
|
|
if v1.GridId == v2.GridId {
|
|
iskeep = true
|
|
}
|
|
}
|
|
if !iskeep {
|
|
modifys = append(modifys, v1)
|
|
}
|
|
}
|
|
}
|
|
|
|
if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, modifys...); err == nil {
|
|
this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
|
}
|
|
return
|
|
}
|
|
|
|
///修改指定格子的物品数量
|
|
func (this *Cache_Comp) Pack_AddItemToUserPackByGrid(uId string, gridid int32, itemId int32, addnum int32) (err error) {
|
|
var (
|
|
pack *pb.DB_UserPackData
|
|
grid *pb.DB_GridData
|
|
num int64
|
|
amount int64
|
|
)
|
|
if addnum == 0 {
|
|
return
|
|
}
|
|
if pack, err = this.Pack_QueryUserPack(uId); err != nil {
|
|
return
|
|
}
|
|
if int32(len(pack.Pack)) <= gridid {
|
|
err = NoFoundGirdError
|
|
return
|
|
}
|
|
grid = pack.Pack[gridid]
|
|
if grid == nil {
|
|
err = NoFoundGirdError
|
|
return
|
|
}
|
|
amount = int64(grid.Amount)
|
|
if grid.IsEmpty {
|
|
amount = 0
|
|
} else if grid.ItemId != itemId {
|
|
err = fmt.Errorf("target grid itemid:%d no is %d ", grid.ItemId, itemId)
|
|
}
|
|
num = amount + int64(addnum)
|
|
if num < 0 {
|
|
err = ItemNotEnoughError
|
|
} else {
|
|
if num > GridCapMaxNum {
|
|
err = GirdAmountUpper
|
|
return
|
|
} else {
|
|
if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, grid); err == nil {
|
|
this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
///修改目标格子的新获取标识
|
|
func (this *Cache_Comp) Pack_ModifyPackGridIsNewItem(uId string, grids []int32) (err error) {
|
|
var (
|
|
pack *pb.DB_UserPackData
|
|
)
|
|
if pack, err = db.Defsys.Pack_ModifyPackGridIsNewItem(uId, grids); err == nil {
|
|
err = this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
|
}
|
|
return
|
|
}
|
|
|
|
///修改目标格子的新获取标识
|
|
func (this *Cache_Comp) Pack_UpdateGridToUserPack(uId string, grids ...*pb.DB_GridData) (err error) {
|
|
var (
|
|
pack *pb.DB_UserPackData
|
|
)
|
|
if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, grids...); err == nil {
|
|
err = this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
|
}
|
|
return
|
|
}
|
|
|
|
///添加移除物品到用户背包
|
|
func (this *Cache_Comp) pack_addItemToUserPack(pack *pb.DB_UserPackData, itemId int32, addnum int32) (modifys []*pb.DB_GridData, leftnum int64) {
|
|
var (
|
|
num int64
|
|
isNew bool
|
|
)
|
|
if addnum == 0 {
|
|
return
|
|
}
|
|
isNew = true
|
|
leftnum = int64(addnum)
|
|
modifys = make([]*pb.DB_GridData, 0)
|
|
for _, v := range pack.Pack {
|
|
if !v.IsEmpty && v.ItemId == itemId {
|
|
isNew = false
|
|
num = int64(v.Amount) + int64(leftnum)
|
|
if num < 0 {
|
|
leftnum += int64(v.Amount)
|
|
v.Amount = 0
|
|
v.IsEmpty = true
|
|
modifys = append(modifys, v)
|
|
} else if num > 0 && num < int64(v.Amount) {
|
|
leftnum = 0
|
|
v.Amount = uint32(num)
|
|
modifys = append(modifys, v)
|
|
break
|
|
} else if num > 0 && num > int64(v.Amount) {
|
|
if num <= GridCapMaxNum {
|
|
leftnum = 0
|
|
v.Amount = uint32(num)
|
|
modifys = append(modifys, v)
|
|
break
|
|
} else {
|
|
if v.Amount < GridCapMaxNum {
|
|
leftnum = int64(num - GridCapMaxNum)
|
|
v.Amount = uint32(GridCapMaxNum)
|
|
modifys = append(modifys, v)
|
|
}
|
|
}
|
|
} else if num == 0 {
|
|
leftnum = 0
|
|
v.Amount = 0
|
|
v.IsEmpty = true
|
|
modifys = append(modifys, v)
|
|
}
|
|
}
|
|
}
|
|
if leftnum < 0 { //背包物品不够
|
|
return
|
|
}
|
|
if leftnum > 0 { //还没有放完 寻找空的格子填充
|
|
for _, v := range pack.Pack {
|
|
if v.IsEmpty {
|
|
if leftnum <= GridCapMaxNum {
|
|
v.IsEmpty = false
|
|
v.ItemId = itemId
|
|
v.Amount = uint32(leftnum)
|
|
leftnum = 0
|
|
modifys = append(modifys, v)
|
|
break
|
|
} else {
|
|
leftnum -= GridCapMaxNum
|
|
v.IsEmpty = false
|
|
v.ItemId = itemId
|
|
v.Amount = uint32(GridCapMaxNum)
|
|
modifys = append(modifys, v)
|
|
}
|
|
}
|
|
}
|
|
index := int32(len(pack.Pack))
|
|
for leftnum > 0 { //需要补充格子
|
|
if leftnum <= GridCapMaxNum {
|
|
grid := &pb.DB_GridData{
|
|
GridId: index,
|
|
IsEmpty: false,
|
|
ItemId: itemId,
|
|
Amount: uint32(leftnum),
|
|
IsNewItem: isNew,
|
|
}
|
|
pack.Pack = append(pack.Pack, grid)
|
|
modifys = append(modifys, grid)
|
|
leftnum = 0
|
|
break
|
|
} else {
|
|
leftnum -= GridCapMaxNum
|
|
grid := &pb.DB_GridData{
|
|
GridId: index,
|
|
IsEmpty: false,
|
|
ItemId: itemId,
|
|
Amount: uint32(GridCapMaxNum),
|
|
IsNewItem: isNew,
|
|
}
|
|
pack.Pack = append(pack.Pack, grid)
|
|
modifys = append(modifys, grid)
|
|
index++
|
|
}
|
|
if index > GridMaxNUm { //格子已达上限
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|