player_asset.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package mapPlayer
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/enum"
  5. "f1-game/internal/event"
  6. nameEvent "f1-game/internal/name/event"
  7. nameRemote "f1-game/internal/name/remote"
  8. "f1-game/internal/pb"
  9. "f1-game/internal/types"
  10. assetOrigin "f1-game/nodes/game/player/asset/origin"
  11. mapFacade "f1-game/nodes/map/internal/facade"
  12. "f1-game/nodes/map/player/player"
  13. cfacade "github.com/cherry-game/cherry/facade"
  14. )
  15. // 初始化地图货币路由接口
  16. func (p *actorPlayer) initAsset() {
  17. p.Remote().Register(nameRemote.MapPlayer_AssetAdd, p.assetAdd)
  18. p.Remote().Register(nameRemote.MapPlayer_AssetSub, p.assetSub)
  19. p.Remote().Register(nameRemote.MapPlayer_AssetCheck, p.assetCheck)
  20. p.Event().Register(nameEvent.Item_Add, p.onPlayerGloryUpdate)
  21. }
  22. // assetAdd 添加资产
  23. func (p *actorPlayer) assetAdd(req *pb.PlayerAddAssets) (*pb.AssetList, int32) {
  24. var (
  25. ao = assetOrigin.Get(req.Origin)
  26. mapAddAssets = types.Assets{}
  27. push = p.isOnline
  28. )
  29. for _, asset := range req.AddAssets {
  30. if !enum.IsMapCurrency(asset.Id) && !enum.IsLeagueCurrency(asset.Id) {
  31. continue
  32. }
  33. mapAddAssets.AddAsset(&types.Asset{
  34. ID: asset.Id,
  35. Num: asset.Num,
  36. })
  37. }
  38. // 玩家在线才推送
  39. retAssets, errCode := mapFacade.Storage.AssetAdds(p.playerID, mapAddAssets, ao, push)
  40. rsp := retAssets.ToAssetListProto()
  41. return &rsp, errCode
  42. }
  43. // assetSub 扣除资产
  44. func (p *actorPlayer) assetSub(req *pb.PlayerAddAssets) (*pb.AssetList, int32) {
  45. var (
  46. ao = assetOrigin.Get(req.Origin)
  47. mapAddAssets = types.Assets{}
  48. )
  49. // 过滤game节点的资源,避免循环callWait
  50. for _, asset := range req.AddAssets {
  51. if !enum.IsMapCurrency(asset.Id) {
  52. continue
  53. }
  54. mapAddAssets.AddAsset(&types.Asset{
  55. ID: asset.Id,
  56. Num: asset.Num,
  57. })
  58. }
  59. if len(mapAddAssets) == 0 {
  60. return nil, code.IllegalArgument
  61. }
  62. retAssets, errCode := mapFacade.Storage.AssetSubs(p.playerID, mapAddAssets, ao, true)
  63. rsp := retAssets.ToAssetListProto()
  64. return &rsp, errCode
  65. }
  66. // assetSub 检测地图资产
  67. func (p *actorPlayer) assetCheck(req *pb.AssetList) int32 {
  68. var (
  69. mapAssets = types.Assets{}
  70. )
  71. for _, asset := range req.List {
  72. mapAssets.AddAsset(&types.Asset{
  73. ID: asset.Id,
  74. Num: asset.Num,
  75. })
  76. }
  77. if !mapFacade.Storage.IsAllEnough(p.playerID, mapAssets) {
  78. return code.CurrencyNotEnough
  79. }
  80. return code.OK
  81. }
  82. // 武勋更新
  83. func (p *actorPlayer) onPlayerGloryUpdate(e cfacade.IEventData) {
  84. evt, ok := e.(*event.ItemAdd)
  85. if !ok {
  86. return
  87. }
  88. for _, asset := range evt.Assets() {
  89. if asset.ID == enum.ItemIDFeat {
  90. player.Service().SyncPlayerGloryRank(p.playerID)
  91. return
  92. }
  93. }
  94. }