player_assemble.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package mapPlayer
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/enum"
  5. nameLocal "f1-game/internal/name/local"
  6. "f1-game/internal/pb"
  7. "f1-game/internal/types"
  8. mapCall "f1-game/nodes/map/internal/call"
  9. "f1-game/nodes/map/internal/db"
  10. "f1-game/nodes/map/player/team"
  11. ctime "github.com/cherry-game/cherry/extend/time"
  12. cproto "github.com/cherry-game/cherry/net/proto"
  13. )
  14. func (p *actorPlayer) initAssemble() {
  15. p.Local().Register(nameLocal.MapPlayer_Assemble, p.assemble)
  16. p.Local().Register(nameLocal.MapPlayer_AssembleJoin, p.assembleJoin)
  17. }
  18. // 发起集结
  19. func (p *actorPlayer) assemble(session *cproto.Session, req *pb.MapAssembleRequest) {
  20. p.Debug("[assemble] req = %+v", req)
  21. playerTable := db.GetMapPlayerTable(p.playerID)
  22. if playerTable.LeagueID == 0 {
  23. p.ResponseCode(session, code.LeagueNotJoin)
  24. return
  25. }
  26. dbTeam, ok := playerTable.Teams.GetTeam(req.TeamID)
  27. if !ok {
  28. p.ResponseCode(session, code.MapTeamNotFound)
  29. return
  30. }
  31. // 发起集结需要 standby
  32. if !dbTeam.IsStandby() {
  33. p.ResponseCode(session, code.TeamIsBusy)
  34. return
  35. }
  36. // 检查 team 状态
  37. if errCode := dbTeam.IsBusy(); code.IsFail(errCode) {
  38. p.ResponseCode(session, errCode)
  39. return
  40. }
  41. // 寻路检查目标是否可达
  42. path, errCode := mapCall.PathFind.Find(playerTable.Point.X, playerTable.Point.Y, req.Point.X, req.Point.Y, p.playerID, playerTable.LeagueID, enum.MarchType_Assemble)
  43. if code.IsFail(errCode) {
  44. p.ResponseCode(session, errCode)
  45. return
  46. }
  47. // 检查资源是否足够
  48. errCode = team.Service().CheckMarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path))
  49. if code.IsFail(errCode) {
  50. p.ResponseCode(session, errCode)
  51. return
  52. }
  53. arg := pb.AssembleRequest{
  54. PlayerID: p.playerID,
  55. LeagueID: playerTable.LeagueID,
  56. MarchObjectID: dbTeam.MarchObjectID,
  57. TargetObjectID: req.ObjectID,
  58. TargetObjectType: req.ObjectType,
  59. AssembleTime: int64(req.AssembleTime) * ctime.MillisecondsPerMinute,
  60. Path: path,
  61. IsAutoRetreat: req.IsAutoRetreat,
  62. MarchSync: team.Service().GetTeamMarchSyncProto(playerTable, dbTeam),
  63. }
  64. rsp, errCode := mapCall.Logic.Assemble(&arg)
  65. if code.IsFail(errCode) {
  66. p.Debug("assemble fail: LeagueID = %d, errCode = %d", playerTable.LeagueID, errCode)
  67. p.ResponseCode(session, errCode)
  68. return
  69. }
  70. // 扣除资源
  71. team.Service().MarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path))
  72. if dbTeam.MarchObjectID == 0 {
  73. dbTeam.MarchObjectID = rsp.Key
  74. playerTable.Save2Queue()
  75. }
  76. // 更新队伍状态
  77. team.Service().UpdateTeamStateByMarchState(playerTable, dbTeam, enum.MarchState(rsp.Value))
  78. p.ResponseCode(session, code.OK)
  79. }
  80. func (p *actorPlayer) assembleJoin(session *cproto.Session, req *pb.MapAssembleJoinRequest) {
  81. p.Debug("[assembleJoin] req = %+v", req)
  82. playerTable := db.GetMapPlayerTable(p.playerID)
  83. if playerTable.LeagueID == 0 {
  84. p.ResponseCode(session, code.LeagueNotJoin)
  85. return
  86. }
  87. dbTeam, ok := playerTable.Teams.GetTeam(req.TeamID)
  88. if !ok {
  89. p.ResponseCode(session, code.MapTeamNotFound)
  90. return
  91. }
  92. if errCode := dbTeam.IsBusy(); code.IsFail(errCode) {
  93. p.ResponseCode(session, errCode)
  94. return
  95. }
  96. var (
  97. startPoint types.Point
  98. endPoint types.Point
  99. )
  100. // 如果是待命状态,行军点就是玩家当前位置
  101. if dbTeam.IsNeedSync() {
  102. startPoint = playerTable.Point
  103. // 只打目标集结点就够了
  104. errCode := mapCall.Logic.GetObject1Point(req.AssembleID, enum.ObjectType_Legion, &endPoint)
  105. if code.IsFail(errCode) {
  106. p.ResponseCode(session, errCode)
  107. return
  108. }
  109. } else {
  110. // 非待命状态,要找行军对象坐标和集结点坐标
  111. var (
  112. marchObject = enum.NewObject(dbTeam.MarchObjectID, enum.ObjectType_March)
  113. assembleObject = enum.NewObject(req.AssembleID, enum.ObjectType_Legion)
  114. errCode = mapCall.Logic.GetObject2Point(marchObject, assembleObject, &startPoint, &endPoint)
  115. )
  116. if code.IsFail(errCode) {
  117. p.ResponseCode(session, errCode)
  118. return
  119. }
  120. }
  121. path, errCode := mapCall.PathFind.Find(startPoint.X, startPoint.Y, endPoint.X, endPoint.Y, p.playerID, playerTable.LeagueID, enum.MarchType_Assemble)
  122. if code.IsFail(errCode) {
  123. p.ResponseCode(session, errCode)
  124. return
  125. }
  126. // 检查资源是否足够
  127. errCode = team.Service().CheckMarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path))
  128. if code.IsFail(errCode) {
  129. p.ResponseCode(session, errCode)
  130. return
  131. }
  132. // 调用地图行军
  133. arg := &pb.MarchRequest{
  134. TeamID: dbTeam.TeamID,
  135. ObjectID: dbTeam.MarchObjectID,
  136. MarchType: int32(enum.MarchType_Assemble),
  137. Point: endPoint.ToProto(),
  138. Path: path,
  139. TargetObjectID: req.AssembleID,
  140. IsAutoRetreat: req.IsAutoRetreat,
  141. }
  142. if dbTeam.IsNeedSync() {
  143. arg.MarchSync = team.Service().GetTeamMarchSyncProto(playerTable, dbTeam)
  144. }
  145. rsp, errCode := mapCall.Logic.AssembleJoin(arg)
  146. if code.IsFail(errCode) {
  147. p.ResponseCode(session, errCode)
  148. return
  149. }
  150. // 扣除资源
  151. team.Service().MarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path))
  152. if dbTeam.MarchObjectID == 0 {
  153. dbTeam.MarchObjectID = rsp.Key
  154. playerTable.Save2Queue()
  155. }
  156. // 更新队伍状态
  157. team.Service().UpdateTeamStateByMarchState(playerTable, dbTeam, enum.MarchState(rsp.Value))
  158. p.ResponseCode(session, code.OK)
  159. }