service.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. cproto "github.com/cherry-game/cherry/net/proto"
  14. )
  15. var (
  16. srv = newService()
  17. )
  18. func newService() *service {
  19. return &service{
  20. typ: newServiceType(),
  21. }
  22. }
  23. func Service() *service {
  24. return srv
  25. }
  26. type service struct {
  27. typ serviceType // 资源上限
  28. facade.PlayerServiceBase[*db.PlayerTable]
  29. }
  30. func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) {
  31. // 登录检测货币上限
  32. p.RefreshCurrencyMax(playerTable.PlayerID, false, p.typ.getAssetIDs()...)
  33. }
  34. // func (p *service) OnLogined(playerTable *db.PlayerTable, session *cproto.Session) {
  35. // }
  36. // func (p *service) OnLogout(playerTable *db.PlayerTable) {
  37. // }
  38. // func (p *service) OnReset(playerTable *db.PlayerTable, time *ctime.CherryTime, byLogin bool) {
  39. // }
  40. // func (p *service) Push(playerTable *db.PlayerTable, session *cproto.Session) {
  41. // }
  42. // ChangePush 道具变更推送
  43. func (p *service) ChangePush(playerID int64, idList ...int32) {
  44. if len(idList) < 1 {
  45. return
  46. }
  47. var (
  48. itemTable = db.GetItemTable(playerID)
  49. rsp = &pb.ItemList{
  50. Currencies: map[int32]*pb.Currency{},
  51. }
  52. )
  53. for _, id := range idList {
  54. // 不推送地图里面的资源
  55. if enum.IsMapCurrency(id) {
  56. continue
  57. }
  58. entity := itemTable.CurrencyMap.GetEntity(id)
  59. proto := entity.ToProto()
  60. rsp.Currencies[entity.ID] = &proto
  61. }
  62. if len(rsp.Currencies) < 1 {
  63. return
  64. }
  65. sessions.PushPlayer(playerID, nameRoute.PushGamePlayer_ItemChange, rsp)
  66. }
  67. func (p *service) Contain(playerID int64, id int32) int32 {
  68. itemTable := db.GetItemTable(playerID)
  69. if _, found := data.Item.GetByID(id); !found {
  70. return code.ConfigNotFound_Item
  71. }
  72. if itemTable.CurrencyMap.Get(id) < 1 {
  73. return code.ItemNotEnough
  74. }
  75. return code.OK
  76. }
  77. func (p *service) Enough(playerID int64, id int32, num int64) bool {
  78. itemTable := db.GetItemTable(playerID)
  79. availableNum := itemTable.CurrencyMap.Get(id)
  80. if availableNum < 1 || availableNum < num {
  81. return false
  82. }
  83. return true
  84. }
  85. func (p *service) Add(playerID int64, id int32, num int64, origin ao.Origin, save, push bool) (types.Asset, int32) {
  86. itemTable := db.GetItemTable(playerID)
  87. row, found := data.Item.GetByID(id)
  88. if !found {
  89. return types.NoneAsset, code.ConfigNotFound_Item
  90. }
  91. if row.ParseType != enum.AssetType_Currency {
  92. return types.NoneAsset, code.CurrencyTypeError
  93. }
  94. if num < 1 {
  95. return types.NoneAsset, code.ItemNumError
  96. }
  97. _, ok := itemTable.CurrencyMap.Increase(id, num)
  98. if !ok {
  99. return types.NoneAsset, code.ItemNotEnough
  100. }
  101. if save {
  102. itemTable.Save2Queue()
  103. }
  104. if push {
  105. p.ChangePush(playerID, id)
  106. }
  107. returnAsset := types.Asset{
  108. ID: id,
  109. Num: num,
  110. }
  111. return returnAsset, code.OK
  112. }
  113. func (p *service) Sub(playerID int64, id int32, num int64, origin ao.Origin, save, push bool) int32 {
  114. itemTable := db.GetItemTable(playerID)
  115. if num < 1 {
  116. return code.ItemNumError
  117. }
  118. _, found := data.Item.GetByID(id)
  119. if !found {
  120. return code.ConfigNotFound_Item
  121. }
  122. // 优先扣除绑定资源,再扣除非绑定资源
  123. changeAssets, ok := itemTable.CurrencyMap.Decrease(id, num)
  124. if !ok {
  125. return code.ItemNotEnough
  126. }
  127. if save {
  128. itemTable.Save2Queue()
  129. }
  130. var changeIDList []int32
  131. for _, asset := range changeAssets {
  132. changeIDList = append(changeIDList, asset.ID)
  133. }
  134. if push {
  135. p.ChangePush(playerID, changeIDList...)
  136. }
  137. return code.OK
  138. }
  139. // 刷新货币上限值
  140. func (p *service) RefreshCurrencyMax(playerID int64, changePush bool, assetIDs ...int32) {
  141. if len(assetIDs) <= 0 {
  142. return
  143. }
  144. var (
  145. itemTable = db.GetItemTable(playerID)
  146. changeIDList = []int32{}
  147. )
  148. for _, assetID := range assetIDs {
  149. parser, errCode := p.typ.get(assetID)
  150. if code.IsFail(errCode) {
  151. continue
  152. }
  153. if parser.CheckAndRefreshCurrencyMax(itemTable) {
  154. changeIDList = append(changeIDList, assetID)
  155. }
  156. }
  157. if len(changeIDList) > 0 {
  158. itemTable.Save2Queue()
  159. if changePush {
  160. // 推送通知客户端
  161. p.ChangePush(playerID, changeIDList...)
  162. }
  163. }
  164. }