service.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package scout
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/enum"
  5. "f1-game/internal/facade"
  6. nameRoute "f1-game/internal/name/route"
  7. "f1-game/internal/pb"
  8. "f1-game/internal/sessions"
  9. mapCall "f1-game/nodes/map/internal/call"
  10. "f1-game/nodes/map/internal/db"
  11. dbMapPlayer "f1-game/nodes/map/internal/db/data/player"
  12. "f1-game/nodes/map/player/battle"
  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 (*service) OnLogin(playerTable *db.MapPlayerTable, session *cproto.Session) {
  23. // 初始化侦察队列 // TODO 当前默认1个
  24. if playerTable.Scouts.ActiveQueue(1) {
  25. playerTable.Save2Queue()
  26. }
  27. }
  28. func (*service) Push(mapPlayerTable *db.MapPlayerTable, session *cproto.Session) {
  29. // 推送地图侦察列表
  30. resp := mapPlayerTable.Scouts.ToProto()
  31. sessions.PushWithSession(session, nameRoute.PushMapPlayer_ScoutList, resp)
  32. }
  33. func (*service) ChangePush(mapPlayerTable *db.MapPlayerTable, changeQueueIDs ...int32) {
  34. if len(changeQueueIDs) <= 0 {
  35. return
  36. }
  37. resp := &pb.MapScoutList{}
  38. for _, queueID := range changeQueueIDs {
  39. scout, found := mapPlayerTable.Scouts.GetScout(queueID)
  40. if !found {
  41. clog.Warnf("[ChangePush] scout not found. playerID=%d, queueID=%d", mapPlayerTable.PlayerID, queueID)
  42. continue
  43. }
  44. resp.List = append(resp.List, scout.ToScoutProto(queueID))
  45. }
  46. if len(resp.List) > 0 {
  47. sessions.PushPlayer(mapPlayerTable.PlayerID, nameRoute.PushMapPlayer_ScoutChange, resp)
  48. }
  49. }
  50. func (p *service) CheckScoutSuccess(playerTable *db.MapPlayerTable, queueID int32, scout *dbMapPlayer.Scout) int32 {
  51. // callwait logic 判断玩家现在是否还在原来的位置
  52. resp, errCode := mapCall.Logic.ScoutCheck(playerTable.PlayerID, scout.ObjectID)
  53. if code.IsFail(errCode) {
  54. clog.Warnf("[CheckScoutSuccess] scout check fail. playerID=%d, queueID=%d, errCode=%d", playerTable.PlayerID, queueID, errCode)
  55. return errCode
  56. }
  57. result := enum.ScoutState_Success
  58. // 位置已发生改变
  59. if scout.IsPointChanged(resp.Point) {
  60. result = enum.ScoutState_Lost
  61. }
  62. // 如果当前处于保护中
  63. if resp.TargetState != 0 {
  64. result = enum.ScoutState_Protected
  65. }
  66. if result != enum.ScoutState_Success {
  67. var (
  68. playerID = playerTable.PlayerID
  69. playerName = playerTable.PlayerName
  70. leagueID = playerTable.LeagueID
  71. targetPlayerID = resp.TargetPlayerID
  72. targetPlayerName = resp.TargetPlayerName
  73. )
  74. // 构建战报
  75. reportGroup := battle.Service().BuildScoutReportGroup(playerID, targetPlayerID, leagueID,
  76. playerName, targetPlayerName, scout.Point.ToProto(), nil, result)
  77. // 发送侦察失败战报
  78. battle.Service().AddReport(playerID, reportGroup)
  79. return code.ScoutFail
  80. }
  81. return result
  82. }