package item import ( "f1-game/internal/code" "f1-game/internal/data" "f1-game/internal/enum" facade "f1-game/internal/facade" nameRoute "f1-game/internal/name/route" "f1-game/internal/pb" sessions "f1-game/internal/sessions" "f1-game/internal/types" "f1-game/nodes/game/internal/db" ao "f1-game/nodes/game/player/asset/origin" ctime "github.com/cherry-game/cherry/extend/time" cproto "github.com/cherry-game/cherry/net/proto" ) var srv = &service{ use: newServiceUse(), } func Service() *service { return srv } type service struct { facade.PlayerServiceBase[*db.PlayerTable] use serviceUse } // func (*service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) { // } // func (p *service) OnLogined(playerTable *db.PlayerTable, session *cproto.Session) { // } // func (p *service) OnLogout(playerTable *db.PlayerTable) { // } func (p *service) OnReset(playerTable *db.PlayerTable, time *ctime.CherryTime, byLogin bool) { // 跨天重置药品使用情况 itemTable := db.GetItemTable(playerTable.PlayerID) if len(itemTable.MedicineMap) > 0 { for k := range itemTable.MedicineMap { delete(itemTable.MedicineMap, k) } itemTable.Save2Queue() session, found := sessions.GetSession(playerTable.PlayerID) if found { // 推送药品使用情况 medicineResp := pb.I32Map{ Value: itemTable.MedicineMap, } sessions.PushWithSession(session, nameRoute.PushGamePlayer_ItemMedicineUse, &medicineResp) } } } // Push 推送道具列表 func (p *service) Push(playerTable *db.PlayerTable, session *cproto.Session) { itemTable := db.GetItemTable(playerTable.PlayerID) rsp := &pb.ItemList{ Currencies: itemTable.CurrencyMap.ToProto(), Items: itemTable.ItemMap.ToProto(), MedicineUses: itemTable.MedicineMap, } sessions.PushWithSession(session, nameRoute.PushGamePlayer_ItemList, rsp) } // ChangePush 道具变更推送 func (p *service) ChangePush(playerID int64, itemIDList ...int32) { if len(itemIDList) < 1 { return } var ( itemTable = db.GetItemTable(playerID) rsp = &pb.ItemList{ Items: map[int32]*pb.Asset{}, } ) for _, id := range itemIDList { // 不推送地图里面的资源 if enum.IsMapCurrency(id) { continue } // 道具数量为 0 的会从 ItemMap 删除 proto := pb.Asset{ Id: id, Num: itemTable.ItemMap.GetNum(id), } rsp.Items[id] = &proto } if len(rsp.Items) < 1 { return } sessions.PushPlayer(playerID, nameRoute.PushGamePlayer_ItemChange, rsp) } func (p *service) Contain(playerID int64, itemID int32) int32 { itemTable := db.GetItemTable(playerID) if _, found := data.Item.GetByID(itemID); !found { return code.ConfigNotFound_Item } itemEntity, found := itemTable.ItemMap.Get(itemID) if !found || itemEntity.Num < 1 { return code.ItemNotEnough } return code.OK } // 检测道具是否足够 func (p *service) Enough(playerID int64, id int32, num int64) int32 { if num < 1 { return code.ItemNumError } itemTable := db.GetItemTable(playerID) itemEntity, found := itemTable.ItemMap.Get(id) if !found || itemEntity.Num < num { return code.ItemNotEnough } return code.OK } func (p *service) Add(playerID int64, itemID int32, num int64, origin ao.Origin, save, push bool) (types.Asset, int32) { // 读取道具配置 itemTable := db.GetItemTable(playerID) data, found := data.Item.GetByID(itemID) if !found { return types.NoneAsset, code.ConfigNotFound_Item } if data.ParseType != enum.AssetType_Item { return types.NoneAsset, code.ItemTypeError } if num < 1 { return types.NoneAsset, code.ItemNumError } entity, ok := itemTable.ItemMap.Increase(itemID, num) if !ok { return types.NoneAsset, code.ItemNotEnough } if save { itemTable.Save2Queue() } if push { p.ChangePush(playerID, entity.ItemID) } returnAsset := types.Asset{ ID: itemID, Num: num, } return returnAsset, code.OK } func (p *service) Sub(playerID int64, itemID int32, num int64, origin ao.Origin, save, push bool) int32 { itemTable := db.GetItemTable(playerID) if num < 1 { return code.ItemNumError } entity, ok := itemTable.ItemMap.Decrease(itemID, num) if !ok { return code.ItemNotEnough } if save { itemTable.Save2Queue() } if push { p.ChangePush(playerID, entity.ItemID) } return code.OK } func (p *service) Get(playerID int64, id int32) int64 { itemTable := db.GetItemTable(playerID) if itemEntity, found := itemTable.ItemMap.Get(id); found { return itemEntity.Num } return 0 } func (p *service) Use(playerID int64, req *pb.ItemUseRequest, poolID, useType int32) (types.Assets, int32) { // 找到使用解析器 parser, found := p.use.get(enum.ItemUseType(useType)) if !found { return nil, code.ItemUseTypeError } // 获取将要添加的资源 return parser.Use(playerID, req, poolID) }