service.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package show
  2. import (
  3. capp "f1-game/internal/cherry_app"
  4. "f1-game/internal/data"
  5. "f1-game/internal/enum"
  6. "f1-game/internal/event"
  7. "f1-game/internal/facade"
  8. nameRoute "f1-game/internal/name/route"
  9. "f1-game/internal/pb"
  10. "f1-game/internal/sessions"
  11. "f1-game/nodes/map/internal/db"
  12. "slices"
  13. clog "github.com/cherry-game/cherry/logger"
  14. cproto "github.com/cherry-game/cherry/net/proto"
  15. )
  16. func Service() *service {
  17. return &service{}
  18. }
  19. type service struct {
  20. facade.PlayerServiceBase[*db.MapPlayerTable]
  21. }
  22. func (p *service) OnLogin(playerTable *db.MapPlayerTable, session *cproto.Session) {
  23. for _, showRow := range data.MapMainCityShow.List() {
  24. // 道具激活跳过
  25. if showRow.ActiveType == enum.ShowActiveType_Item {
  26. continue
  27. }
  28. // 当前激活条件不需要
  29. if showRow.ActiveCondition.Key <= 0 && showRow.ActiveCondition.Value <= 0 {
  30. _, found := playerTable.Shows.GetShow(showRow.MainCityShowID)
  31. if !found {
  32. playerTable.Shows.ActiveShow(showRow.MainCityShowID, showRow.ExpireTime, true)
  33. playerTable.SetChangeData()
  34. }
  35. }
  36. }
  37. }
  38. // Push 推送主城外观数据
  39. func (p *service) Push(mapPlayerTable *db.MapPlayerTable, session *cproto.Session) {
  40. resp := mapPlayerTable.Shows.ToProto()
  41. sessions.PushWithSession(session, nameRoute.PushMapPlayer_MainCityShow, resp)
  42. }
  43. // ChangePush 推送主城外观变更
  44. func (p *service) ChangePush(playerTable *db.MapPlayerTable, delShowIDs []int32, changeShowIDs ...int32) {
  45. if len(delShowIDs) <= 0 && len(changeShowIDs) <= 0 {
  46. return
  47. }
  48. session, found := sessions.GetSession(playerTable.PlayerID)
  49. if !found {
  50. return
  51. }
  52. resp := &pb.MainCityShowChangePush{}
  53. if len(delShowIDs) > 0 {
  54. resp.DelShowIDs = delShowIDs
  55. }
  56. for _, changeShowID := range changeShowIDs {
  57. show, found := playerTable.Shows.GetShow(changeShowID)
  58. if !found {
  59. clog.Errorf("change show not found. playerID:%d, showID:%d", playerTable.PlayerID, changeShowID)
  60. continue
  61. }
  62. resp.List = append(resp.List, show.ToShowProto(changeShowID))
  63. }
  64. sessions.PushWithSession(session, nameRoute.PushMapPlayer_MainCityShowChange, resp)
  65. }
  66. func (p *service) CheckMainCityShowExpire(playerTable *db.MapPlayerTable, nowSecond int64) {
  67. if len(playerTable.Shows.ShowMap) <= 0 {
  68. return
  69. }
  70. // 获取过期的外观
  71. delShowIDs := playerTable.Shows.CheckExpire(nowSecond)
  72. if len(delShowIDs) <= 0 {
  73. return
  74. }
  75. if slices.Contains(delShowIDs, playerTable.Shows.MainCityShowID) {
  76. oldShowID := playerTable.Shows.MainCityShowID
  77. playerTable.Shows.MainCityShowID = 0
  78. // 发送变更事件
  79. capp.PostEvent(event.NewMainCityShowChange(playerTable.PlayerID, oldShowID))
  80. }
  81. playerTable.Save2Queue()
  82. p.ChangePush(playerTable, delShowIDs)
  83. }