service.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package vip
  2. import (
  3. capp "f1-game/internal/cherry_app"
  4. "f1-game/internal/code"
  5. "f1-game/internal/data"
  6. "f1-game/internal/event"
  7. facade "f1-game/internal/facade"
  8. nameActor "f1-game/internal/name/actor"
  9. nameRemote "f1-game/internal/name/remote"
  10. nameRoute "f1-game/internal/name/route"
  11. "f1-game/internal/pb"
  12. "f1-game/internal/sessions"
  13. "f1-game/nodes/game/internal/db"
  14. ctime "github.com/cherry-game/cherry/extend/time"
  15. cfacade "github.com/cherry-game/cherry/facade"
  16. clog "github.com/cherry-game/cherry/logger"
  17. cproto "github.com/cherry-game/cherry/net/proto"
  18. )
  19. var srv = &service{}
  20. func Service() *service {
  21. return srv
  22. }
  23. type service struct {
  24. facade.PlayerServiceBase[*db.PlayerTable]
  25. }
  26. func (*service) OnReset(playerTable *db.PlayerTable, curTime *ctime.CherryTime, byLogin bool) {
  27. playerTable.Vip.DailyReset()
  28. playerTable.Save2Queue()
  29. }
  30. func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) {
  31. // 新用户初始化vip属性
  32. if session.Contains(sessions.IsNewPlayer) {
  33. row := data.Vip.GetMinLevelRow()
  34. playerTable.Vip.Level = row.Level
  35. playerTable.Vip.Exp = 0
  36. playerTable.Vip.Attrs = row.Attrs
  37. }
  38. }
  39. func (p *service) Push(playerTable *db.PlayerTable, session *cproto.Session) {
  40. proto := playerTable.Vip.ToProto()
  41. proto.ContinuousLoginDays = playerTable.Stats.ContinueLoginDays
  42. sessions.PushWithSession(session, nameRoute.PushGamePlayer_VipInfo, proto)
  43. }
  44. func (p *service) AddExp(playerID int64, exp int64) int32 {
  45. var (
  46. playerTable, _ = db.GetPlayerTable(playerID)
  47. vip = &playerTable.Vip
  48. levelUp bool
  49. maxLevel = data.Vip.GetMaxLevel()
  50. )
  51. vip.Exp += exp
  52. // 是否升级
  53. for vip.Level < maxLevel {
  54. row, ok := data.Vip.GetByLevel(vip.Level)
  55. if !ok {
  56. return code.ConfigNotFound_VipLevel
  57. }
  58. if row.Exp > vip.Exp {
  59. break
  60. }
  61. vip.Exp -= row.Exp
  62. // 升级
  63. vip.Level++
  64. // 更新属性
  65. vip.Attrs = row.Attrs
  66. levelUp = true
  67. }
  68. // 保存
  69. playerTable.Save2Queue()
  70. // 推送
  71. if session, found := sessions.GetSession(playerID); found {
  72. p.Push(playerTable, session)
  73. }
  74. // 抛升级事件
  75. if levelUp {
  76. capp.PostEvent(event.NewVipLevelUp(playerID, vip.Level))
  77. // 升级也需要重新激活新的属性
  78. if !vip.IsExpired {
  79. p.SyncMapActiveVip(playerTable)
  80. }
  81. // 发送系统消息事件
  82. // capp.PostEvent(event.NewChatSystemMsg(playerID, enum.ChatMsgType_VipUp, nil, nil, vip.Level))
  83. }
  84. return code.OK
  85. }
  86. // 增加VIP有效期天数
  87. func (p *service) AddDay(playerID int64, day int32) int32 {
  88. var (
  89. playerTable, _ = db.GetPlayerTable(playerID)
  90. vip = &playerTable.Vip
  91. now = ctime.Now()
  92. isActive = false // 是否是激活
  93. )
  94. // 先判断是否已经过期
  95. if vip.ExpireTime < now.ToMillisecond() {
  96. vip.ExpireTime = now.ToMillisecond()
  97. isActive = true
  98. // 设置不过期
  99. vip.IsExpired = false
  100. }
  101. vip.ExpireTime += int64(day * ctime.MillisecondsPerDay)
  102. playerTable.Save2Queue()
  103. // 推送
  104. if session, found := sessions.GetSession(playerID); found {
  105. p.Push(playerTable, session)
  106. }
  107. if isActive {
  108. p.SyncMapActiveVip(playerTable)
  109. }
  110. return code.OK
  111. }
  112. // 同步到地图玩家激活的vip信息
  113. func (p *service) SyncMapActiveVip(playerTable *db.PlayerTable) {
  114. // 如果地图还没开放就不同步,等地图开启再激活
  115. if playerTable.Map.MapNodeID == "" {
  116. return
  117. }
  118. targetPath := cfacade.NewChildPath(playerTable.Map.MapNodeID, nameActor.Map_Player, playerTable.PlayerID)
  119. vipProto := &pb.SyncMapPlayerVip{
  120. PlayerID: playerTable.PlayerID,
  121. Level: playerTable.Vip.Level,
  122. Attrs: playerTable.Vip.Attrs.ToProto(),
  123. ExpireTime: playerTable.Vip.ExpireTime,
  124. }
  125. capp.Call(targetPath, nameRemote.MapPlayer_SyncVip, vipProto)
  126. }
  127. // 检查VIP是否过期
  128. func (p *service) CheckVipExpired(playerID int64) {
  129. playerTable, _ := db.GetPlayerTable(playerID)
  130. if playerTable.Vip.IsExpired {
  131. return
  132. }
  133. if playerTable.Vip.ExpireTime < ctime.Now().ToMillisecond() {
  134. playerTable.Vip.IsExpired = true
  135. playerTable.Save2Queue()
  136. clog.Debugf("[CheckVipExpired] playerID = %d, vip expired", playerID)
  137. }
  138. }
  139. // 获取VIP加成值
  140. func (p *service) GetVipAttrAdd(playerID int64, attrID int32) int64 {
  141. playerTable, _ := db.GetPlayerTable(playerID)
  142. if playerTable.Vip.IsExpired {
  143. return 0
  144. }
  145. return playerTable.Vip.Attrs.GetI64(attrID)
  146. }