service.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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.Get(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. entity := itemTable.CurrencyMap.Get(id)
  71. if entity.Num < 1 {
  72. return code.ItemNotEnough
  73. }
  74. return code.OK
  75. }
  76. func (p *service) Enough(playerID int64, id int32, num int64) bool {
  77. itemTable := db.GetItemTable(playerID)
  78. entity := itemTable.CurrencyMap.Get(id)
  79. if entity.Num < 1 || entity.Num < num {
  80. return false
  81. }
  82. return true
  83. }
  84. func (p *service) Add(playerID int64, id int32, num int64, origin ao.Origin, save, push bool) (types.Asset, int32) {
  85. itemTable := db.GetItemTable(playerID)
  86. row, found := data.Item.GetByID(id)
  87. if !found {
  88. return types.NoneAsset, code.ConfigNotFound_Item
  89. }
  90. if row.ParseType != enum.AssetType_Currency {
  91. return types.NoneAsset, code.CurrencyTypeError
  92. }
  93. if num < 1 {
  94. return types.NoneAsset, code.ItemNumError
  95. }
  96. _, ok := itemTable.CurrencyMap.Increase(id, num)
  97. if !ok {
  98. return types.NoneAsset, code.ItemNotEnough
  99. }
  100. if save {
  101. itemTable.Save2Queue()
  102. }
  103. if push {
  104. p.ChangePush(playerID, id)
  105. }
  106. returnAsset := types.Asset{
  107. ID: id,
  108. Num: num,
  109. }
  110. return returnAsset, code.OK
  111. }
  112. func (p *service) Sub(playerID int64, id int32, num int64, origin ao.Origin, save, push bool) int32 {
  113. itemTable := db.GetItemTable(playerID)
  114. if num < 1 {
  115. return code.ItemNumError
  116. }
  117. _, found := data.Item.GetByID(id)
  118. if !found {
  119. return code.ConfigNotFound_Item
  120. }
  121. entity, ok := itemTable.CurrencyMap.Decrease(id, num)
  122. if !ok {
  123. return code.ItemNotEnough
  124. }
  125. if save {
  126. itemTable.Save2Queue()
  127. }
  128. if push {
  129. p.ChangePush(playerID, entity.ID)
  130. }
  131. return code.OK
  132. }