service.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package item
  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. sessions "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. ctime "github.com/cherry-game/cherry/extend/time"
  14. cproto "github.com/cherry-game/cherry/net/proto"
  15. )
  16. var srv = &service{
  17. use: newServiceUse(),
  18. }
  19. func Service() *service {
  20. return srv
  21. }
  22. type service struct {
  23. facade.PlayerServiceBase[*db.PlayerTable]
  24. use serviceUse
  25. }
  26. // func (*service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) {
  27. // }
  28. // func (p *service) OnLogined(playerTable *db.PlayerTable, session *cproto.Session) {
  29. // }
  30. // func (p *service) OnLogout(playerTable *db.PlayerTable) {
  31. // }
  32. func (p *service) OnReset(playerTable *db.PlayerTable, time *ctime.CherryTime, byLogin bool) {
  33. // 跨天重置药品使用情况
  34. itemTable := db.GetItemTable(playerTable.PlayerID)
  35. if len(itemTable.MedicineMap) > 0 {
  36. for k := range itemTable.MedicineMap {
  37. delete(itemTable.MedicineMap, k)
  38. }
  39. itemTable.Save2Queue()
  40. session, found := sessions.GetSession(playerTable.PlayerID)
  41. if found {
  42. // 推送药品使用情况
  43. medicineResp := pb.I32Map{
  44. Value: itemTable.MedicineMap,
  45. }
  46. sessions.PushWithSession(session, nameRoute.PushGamePlayer_ItemMedicineUse, &medicineResp)
  47. }
  48. }
  49. }
  50. // Push 推送道具列表
  51. func (p *service) Push(playerTable *db.PlayerTable, session *cproto.Session) {
  52. itemTable := db.GetItemTable(playerTable.PlayerID)
  53. rsp := &pb.ItemList{
  54. Currencies: itemTable.CurrencyMap.ToProto(),
  55. Items: itemTable.ItemMap.ToProto(),
  56. MedicineUses: itemTable.MedicineMap,
  57. }
  58. sessions.PushWithSession(session, nameRoute.PushGamePlayer_ItemList, rsp)
  59. }
  60. // ChangePush 道具变更推送
  61. func (p *service) ChangePush(playerID int64, itemIDList ...int32) {
  62. if len(itemIDList) < 1 {
  63. return
  64. }
  65. var (
  66. itemTable = db.GetItemTable(playerID)
  67. rsp = &pb.ItemList{
  68. Items: map[int32]*pb.Asset{},
  69. }
  70. )
  71. for _, id := range itemIDList {
  72. // 不推送地图里面的资源
  73. if enum.IsMapCurrency(id) {
  74. continue
  75. }
  76. // 道具数量为 0 的会从 ItemMap 删除
  77. proto := pb.Asset{
  78. Id: id,
  79. Num: itemTable.ItemMap.GetNum(id),
  80. }
  81. rsp.Items[id] = &proto
  82. }
  83. if len(rsp.Items) < 1 {
  84. return
  85. }
  86. sessions.PushPlayer(playerID, nameRoute.PushGamePlayer_ItemChange, rsp)
  87. }
  88. func (p *service) Contain(playerID int64, itemID int32) int32 {
  89. itemTable := db.GetItemTable(playerID)
  90. if _, found := data.Item.GetByID(itemID); !found {
  91. return code.ConfigNotFound_Item
  92. }
  93. itemEntity, found := itemTable.ItemMap.Get(itemID)
  94. if !found || itemEntity.Num < 1 {
  95. return code.ItemNotEnough
  96. }
  97. return code.OK
  98. }
  99. // 检测道具是否足够
  100. func (p *service) Enough(playerID int64, id int32, num int64) int32 {
  101. if num < 1 {
  102. return code.ItemNumError
  103. }
  104. itemTable := db.GetItemTable(playerID)
  105. itemEntity, found := itemTable.ItemMap.Get(id)
  106. if !found || itemEntity.Num < num {
  107. return code.ItemNotEnough
  108. }
  109. return code.OK
  110. }
  111. func (p *service) Add(playerID int64, itemID int32, num int64, origin ao.Origin, save, push bool) (types.Asset, int32) {
  112. // 读取道具配置
  113. itemTable := db.GetItemTable(playerID)
  114. data, found := data.Item.GetByID(itemID)
  115. if !found {
  116. return types.NoneAsset, code.ConfigNotFound_Item
  117. }
  118. if data.ParseType != enum.AssetType_Item {
  119. return types.NoneAsset, code.ItemTypeError
  120. }
  121. if num < 1 {
  122. return types.NoneAsset, code.ItemNumError
  123. }
  124. entity, ok := itemTable.ItemMap.Increase(itemID, num)
  125. if !ok {
  126. return types.NoneAsset, code.ItemNotEnough
  127. }
  128. if save {
  129. itemTable.Save2Queue()
  130. }
  131. if push {
  132. p.ChangePush(playerID, entity.ItemID)
  133. }
  134. returnAsset := types.Asset{
  135. ID: itemID,
  136. Num: num,
  137. }
  138. return returnAsset, code.OK
  139. }
  140. func (p *service) Sub(playerID int64, itemID int32, num int64, origin ao.Origin, save, push bool) int32 {
  141. itemTable := db.GetItemTable(playerID)
  142. if num < 1 {
  143. return code.ItemNumError
  144. }
  145. entity, ok := itemTable.ItemMap.Decrease(itemID, num)
  146. if !ok {
  147. return code.ItemNotEnough
  148. }
  149. if save {
  150. itemTable.Save2Queue()
  151. }
  152. if push {
  153. p.ChangePush(playerID, entity.ItemID)
  154. }
  155. return code.OK
  156. }
  157. func (p *service) Get(playerID int64, id int32) int64 {
  158. itemTable := db.GetItemTable(playerID)
  159. if itemEntity, found := itemTable.ItemMap.Get(id); found {
  160. return itemEntity.Num
  161. }
  162. return 0
  163. }
  164. func (p *service) Use(playerID int64, req *pb.ItemUseRequest, poolID, useType int32) (types.Assets, int32) {
  165. // 找到使用解析器
  166. parser, found := p.use.get(enum.ItemUseType(useType))
  167. if !found {
  168. return nil, code.ItemUseTypeError
  169. }
  170. // 获取将要添加的资源
  171. return parser.Use(playerID, req, poolID)
  172. }