service.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package currency
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/data"
  5. "f1-game/internal/enum"
  6. facade "f1-game/internal/facade"
  7. nameRoute "f1-game/internal/name/route"
  8. "f1-game/internal/pb"
  9. "f1-game/internal/sessions"
  10. "f1-game/internal/types"
  11. "f1-game/nodes/game/internal/db"
  12. ao "f1-game/nodes/game/player/asset/origin"
  13. )
  14. var (
  15. srv = newService()
  16. )
  17. func newService() *service {
  18. instance := &service{}
  19. instance.load()
  20. return instance
  21. }
  22. func Service() *service {
  23. return srv
  24. }
  25. type service struct {
  26. facade.PlayerServiceBase[*db.PlayerTable]
  27. }
  28. func (p *service) load() {
  29. }
  30. // func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) {
  31. // }
  32. // func (p *service) OnLogined(playerTable *db.PlayerTable, session *cproto.Session) {
  33. // }
  34. // func (p *service) OnLogout(playerTable *db.PlayerTable) {
  35. // }
  36. // func (p *service) OnReset(playerTable *db.PlayerTable, time *ctime.CherryTime, byLogin bool) {
  37. // }
  38. // func (p *service) Push(playerTable *db.PlayerTable, session *cproto.Session) {
  39. // }
  40. // ChangePush 道具变更推送
  41. func (p *service) ChangePush(playerID int64, idList ...int32) {
  42. if len(idList) < 1 {
  43. return
  44. }
  45. var (
  46. itemTable = db.GetItemTable(playerID)
  47. rsp = &pb.ItemList{
  48. Currencies: map[int32]*pb.Currency{},
  49. }
  50. )
  51. for _, id := range idList {
  52. // 不推送地图里面的资源
  53. if enum.IsMapCurrency(id) {
  54. continue
  55. }
  56. entity := itemTable.CurrencyMap.GetEntity(id)
  57. proto := entity.ToProto()
  58. rsp.Currencies[entity.ID] = &proto
  59. }
  60. if len(rsp.Currencies) < 1 {
  61. return
  62. }
  63. sessions.PushPlayer(playerID, nameRoute.PushGamePlayer_ItemChange, rsp)
  64. }
  65. func (p *service) Contain(playerID int64, id int32) int32 {
  66. itemTable := db.GetItemTable(playerID)
  67. if _, found := data.Item.GetByID(id); !found {
  68. return code.ConfigNotFound_Item
  69. }
  70. if itemTable.CurrencyMap.Get(id) < 1 {
  71. return code.ItemNotEnough
  72. }
  73. return code.OK
  74. }
  75. func (p *service) Enough(playerID int64, id int32, num int64) bool {
  76. itemTable := db.GetItemTable(playerID)
  77. availableNum := itemTable.CurrencyMap.Get(id)
  78. if availableNum < 1 || availableNum < num {
  79. return false
  80. }
  81. return true
  82. }
  83. func (p *service) Add(playerID int64, id int32, num int64, origin ao.Origin, save, push bool) (types.Asset, int32) {
  84. itemTable := db.GetItemTable(playerID)
  85. row, found := data.Item.GetByID(id)
  86. if !found {
  87. return types.NoneAsset, code.ConfigNotFound_Item
  88. }
  89. if row.ParseType != enum.AssetType_Currency {
  90. return types.NoneAsset, code.CurrencyTypeError
  91. }
  92. if num < 1 {
  93. return types.NoneAsset, code.ItemNumError
  94. }
  95. _, ok := itemTable.CurrencyMap.Increase(id, num)
  96. if !ok {
  97. return types.NoneAsset, code.ItemNotEnough
  98. }
  99. if save {
  100. itemTable.Save2Queue()
  101. }
  102. if push {
  103. p.ChangePush(playerID, id)
  104. }
  105. returnAsset := types.Asset{
  106. ID: id,
  107. Num: num,
  108. }
  109. return returnAsset, code.OK
  110. }
  111. func (p *service) Sub(playerID int64, id int32, num int64, origin ao.Origin, save, push bool) int32 {
  112. itemTable := db.GetItemTable(playerID)
  113. if num < 1 {
  114. return code.ItemNumError
  115. }
  116. _, found := data.Item.GetByID(id)
  117. if !found {
  118. return code.ConfigNotFound_Item
  119. }
  120. // 优先扣除绑定资源,再扣除非绑定资源
  121. changeAssets, ok := itemTable.CurrencyMap.Decrease(id, num)
  122. if !ok {
  123. return code.ItemNotEnough
  124. }
  125. if save {
  126. itemTable.Save2Queue()
  127. }
  128. var changeIDList []int32
  129. for _, asset := range changeAssets {
  130. changeIDList = append(changeIDList, asset.ID)
  131. }
  132. if push {
  133. p.ChangePush(playerID, changeIDList...)
  134. }
  135. return code.OK
  136. }