| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- 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)
- }
|