package mapPlayer import ( "f1-game/internal/code" "f1-game/internal/enum" "f1-game/internal/event" nameEvent "f1-game/internal/name/event" nameRemote "f1-game/internal/name/remote" "f1-game/internal/pb" "f1-game/internal/types" assetOrigin "f1-game/nodes/game/player/asset/origin" mapFacade "f1-game/nodes/map/internal/facade" "f1-game/nodes/map/player/player" cfacade "github.com/cherry-game/cherry/facade" ) // 初始化地图货币路由接口 func (p *actorPlayer) initAsset() { p.Remote().Register(nameRemote.MapPlayer_AssetAdd, p.assetAdd) p.Remote().Register(nameRemote.MapPlayer_AssetSub, p.assetSub) p.Remote().Register(nameRemote.MapPlayer_AssetCheck, p.assetCheck) p.Event().Register(nameEvent.Item_Add, p.onPlayerGloryUpdate) } // assetAdd 添加资产 func (p *actorPlayer) assetAdd(req *pb.PlayerAddAssets) (*pb.AssetList, int32) { var ( ao = assetOrigin.Get(req.Origin) mapAddAssets = types.Assets{} push = p.isOnline ) for _, asset := range req.AddAssets { if !enum.IsMapCurrency(asset.Id) && !enum.IsLeagueCurrency(asset.Id) { continue } mapAddAssets.AddAsset(&types.Asset{ ID: asset.Id, Num: asset.Num, }) } // 玩家在线才推送 retAssets, errCode := mapFacade.Storage.AssetAdds(p.playerID, mapAddAssets, ao, push) rsp := retAssets.ToAssetListProto() return &rsp, errCode } // assetSub 扣除资产 func (p *actorPlayer) assetSub(req *pb.PlayerAddAssets) (*pb.AssetList, int32) { var ( ao = assetOrigin.Get(req.Origin) mapAddAssets = types.Assets{} ) // 过滤game节点的资源,避免循环callWait for _, asset := range req.AddAssets { if !enum.IsMapCurrency(asset.Id) { continue } mapAddAssets.AddAsset(&types.Asset{ ID: asset.Id, Num: asset.Num, }) } if len(mapAddAssets) == 0 { return nil, code.IllegalArgument } retAssets, errCode := mapFacade.Storage.AssetSubs(p.playerID, mapAddAssets, ao, true) rsp := retAssets.ToAssetListProto() return &rsp, errCode } // assetSub 检测地图资产 func (p *actorPlayer) assetCheck(req *pb.AssetList) int32 { var ( mapAssets = types.Assets{} ) for _, asset := range req.List { mapAssets.AddAsset(&types.Asset{ ID: asset.Id, Num: asset.Num, }) } if !mapFacade.Storage.IsAllEnough(p.playerID, mapAssets) { return code.CurrencyNotEnough } return code.OK } // 武勋更新 func (p *actorPlayer) onPlayerGloryUpdate(e cfacade.IEventData) { evt, ok := e.(*event.ItemAdd) if !ok { return } for _, asset := range evt.Assets() { if asset.ID == enum.ItemIDFeat { player.Service().SyncPlayerGloryRank(p.playerID) return } } }