pet_home_server/src/server/game/mod/item/Item.go
2026-03-09 21:44:21 +08:00

237 lines
5.0 KiB
Go

package item
import (
"fmt"
"math"
"server/msg"
)
type Item struct {
Id int `json:"Id"`
Num int `json:"Num"`
}
type ItemMod struct {
Data map[int]int
Cache map[int]int
}
const (
ITEM_ENERGY_ID = 100001
ITEM_STAR_ID = 100002
ITEM_DIAMOND_ID = 100003
ITEM_FIVE_STAR_CARD_PACK = 100008
ITEM_RACING_BATTERY_ID = 100027
ITEM_LAUNCHER_ID = 1602
ITEM_LAUNCHER_LOW_ID = 1601
ITEM_ENERGY_GIFT_ID = 562
ITEM_DIAMOND_LV2_ID = 502
ITEM_PLAYROOM_BOX_LOW_ID = 101445
ITEM_PLAYROOM_BOX_MID_ID = 101446
ITEM_PLAYROOM_BOX_HIGH_ID = 101447
)
const (
// 资源类型
ITEM_TYPE_ENERGY = 1
ITEM_TYPE_STAR = 2
ITEM_TYPE_DIAMOND = 3
// 物品类型
ITEM_TYPE_PLAYROOM_PET = 97 // 宠物道具
ITEM_TYPE_CARD = 98 // 卡牌
ITEM_TYPE_BAG = 99 // 背包
ITEM_TYPE_CHESS = 100 // 棋子
ITEM_TYPE_CARD_PACK = 101 // 卡包
ITEM_TYPE_LIMITED_TIME_EVENT = 102 //限时事件
ITEM_TYPE_PIGGY_BANK = 103 // 猪猪银行
ITEM_TYPE_MASTER_CARD = 104 // 万能卡
ITEM_TYPE_AVATAR = 105 // 头像框
ITEM_TYPE_ACTIVITY = 106 // 活动道具
ITEM_TYPE_ACTIVITY_RACE = 107 // 竞赛活动道具
ITEM_TYPE_PLAYROOM_VISIT = 108 // playroom拜访道具
ITEM_TYPE_EMOJI = 109 // 表情
ITEM_TYPE_FACE = 110 // 头像
ITEM_TYPE_PLAYROOM_DECORATION = 111 // playroom装饰
ITEM_TYPE_PLAYROOM_DRESS = 112 // playroom服饰
ITEM_TYPE_PLAYROOM_DECORATION_SET = 113 // playroom装饰套装
ITEM_TYPE_PLAYROOM_DRESS_SET = 114 // playroom服饰套装
ITEM_TYPE_PLAYROOM_BOX = 115 // playroom宝箱
ITEM_TYPE_ACT_PASS = 116 // 通行证活动道具
ITEM_TYPE_PET_FUR = 117 // 宠物毛皮
ITEM_TYPE_AD_CARD = 118 // 免广告卡
)
func (i *Item) String() string {
return fmt.Sprintf("Item{Id:%d, Num:%d}", i.Id, i.Num)
}
func (i *ItemMod) InitData() {
if i.Data == nil {
i.Data = make(map[int]int)
}
if i.Cache == nil {
i.Cache = make(map[int]int)
}
}
func (i *ItemMod) AddItem(id, num int) error {
if i.Data[id]+num < 0 {
return fmt.Errorf("item %d not enough", id)
}
i.Data[id] += num
i.Cache[id] += num
return nil
}
func (i *ItemMod) DelItem(id, num int) error {
if i.Data[id] < num {
return fmt.Errorf("item %d not enough", id)
}
i.Data[id] -= num
i.Cache[id] -= num
return nil
}
func (i *ItemMod) GetItem(id int) int {
return i.Data[id]
}
func (i *ItemMod) GetItemNumByList(IdList []int) int {
var num int
for _, id := range IdList {
num += i.Data[id]
}
return num
}
func (i *ItemMod) CheckItem(id, num int) bool {
return i.Data[id] >= num
}
func (i *ItemMod) BackData() *msg.ResItem {
data := make(map[int32]int32, len(i.Data))
for k, v := range i.Data {
data[int32(k)] = int32(v)
}
return &msg.ResItem{
Item: data,
}
}
func (i *ItemMod) NotifyItem() *msg.ItemNotify {
data := make(map[int32]int32, len(i.Cache))
for k, v := range i.Cache {
data[int32(k)] = int32(v)
}
i.Cache = make(map[int]int)
return &msg.ItemNotify{
Item: data,
}
}
// 新建item
func NewItem(id int, num int) *Item {
return &Item{
Id: id,
Num: num,
}
}
// 解析Item
func ParseItem(item interface{}) []*Item {
if item == nil {
return nil
}
raw := item.([]interface{})
itemList := make([]*Item, 0, len(raw))
for _, v := range raw {
v1 := v.(map[string]interface{})
itemList = append(itemList, NewItem(int(v1["Id"].(float64)), int(v1["Num"].(float64))))
}
return itemList
}
// 构造返回
func ItemToMsg(items []*Item) []*msg.ItemInfo {
if items == nil {
return nil
}
itemList := make([]*msg.ItemInfo, 0, len(items))
for _, v := range items {
itemList = append(itemList, &msg.ItemInfo{
Id: int32(v.Id),
Num: int32(v.Num),
})
}
return itemList
}
func ItemListToMsg(items []*Item) *msg.ItemList {
if items == nil {
return nil
}
itemList := make([]*msg.ItemInfo, 0, len(items))
for _, v := range items {
itemList = append(itemList, &msg.ItemInfo{
Id: int32(v.Id),
Num: int32(v.Num),
})
}
return &msg.ItemList{
List: itemList,
}
}
// 道具叠加
func Merge(Item1, Item2 []*Item) []*Item {
if Item1 == nil {
return Item2
}
if Item2 == nil {
return Item1
}
l := make(map[int]int)
for _, v := range Item1 {
l[v.Id] += v.Num
}
for _, v := range Item2 {
l[v.Id] += v.Num
}
res := make([]*Item, 0, len(l))
for k, v := range l {
res = append(res, &Item{
Id: k,
Num: v,
})
}
return res
}
func MutilItem(i []*Item, num int) []*Item {
if i == nil {
return nil
}
res := make([]*Item, 0, len(i))
for _, v := range i {
res = append(res, &Item{
Id: v.Id,
Num: v.Num * num,
})
}
return res
}
func MutilItemFloat(i []*Item, num float64) []*Item {
if i == nil {
return nil
}
res := make([]*Item, 0, len(i))
for _, v := range i {
res = append(res, &Item{
Id: v.Id,
Num: int(math.Round(float64(v.Num) * num)),
})
}
return res
}