league_assemble.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. package mapLeague
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/component/redis"
  5. "f1-game/internal/enum"
  6. nameLocal "f1-game/internal/name/local"
  7. nameRemote "f1-game/internal/name/remote"
  8. nameRoute "f1-game/internal/name/route"
  9. "f1-game/internal/pb"
  10. "f1-game/internal/sessions"
  11. "f1-game/internal/types"
  12. mapCall "f1-game/nodes/map/internal/call"
  13. dbLeague "f1-game/nodes/map/internal/db/data/league"
  14. mapTypes "f1-game/nodes/map/internal/types"
  15. cproto "github.com/cherry-game/cherry/net/proto"
  16. )
  17. func (p *actorLeague) initAssemble() {
  18. p.Local().Register(nameLocal.MapLeague_AssembleList, p.assembleList)
  19. p.Local().Register(nameLocal.MapLeague_AssembleStop, p.assembleStop)
  20. p.Local().Register(nameLocal.MapLeague_AssembleKick, p.assembleKick)
  21. p.Local().Register(nameLocal.MapLeague_AssembleDepart, p.assembleDepart)
  22. p.Local().Register(nameLocal.MapLeague_AssembleQuit, p.assembleQuit)
  23. p.Remote().Register(nameRemote.MapLeague_AssembleAdd, p.assembleAdd)
  24. p.Remote().Register(nameRemote.MapLeague_AssembleUpdate, p.assembleUpdate)
  25. }
  26. // 获取集结列表
  27. func (p *actorLeague) assembleList(session *cproto.Session, _ *pb.None) {
  28. proto := pb.MapAssembleList{}
  29. for _, assemble := range p.leagueTable.Assembles {
  30. proto.List = append(proto.List, assemble.ToProto())
  31. }
  32. p.Response(session, &proto)
  33. }
  34. func (p *actorLeague) assembleStop(session *cproto.Session, req *pb.I64) {
  35. assembleID := req.GetValue()
  36. assemble, ok := p.leagueTable.Assembles.Get(assembleID)
  37. if !ok {
  38. p.ResponseCode(session, code.MapAssemble_NotFound)
  39. return
  40. }
  41. if assemble.LeadPlayerID != sessions.GetPlayerID(session) {
  42. p.ResponseCode(session, code.MapAssemble_NotLeader)
  43. return
  44. }
  45. errCode := mapCall.Logic.AssembleStop(assemble.AssembleID)
  46. if code.IsFail(errCode) {
  47. p.Debug("assemble stop fail: LeagueID = %d, errCode = %d", p.leagueID, errCode)
  48. p.ResponseCode(session, errCode)
  49. return
  50. }
  51. // 删除集结信息
  52. p.leagueTable.Assembles.Remove(assemble.AssembleID)
  53. p.leagueTable.Save2Queue()
  54. p.ResponseCode(session, code.OK)
  55. // 通知联盟成员
  56. p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{Value: -1})
  57. }
  58. func (p *actorLeague) assembleKick(session *cproto.Session, req *pb.I64I64) {
  59. var (
  60. assembleID = req.Key
  61. kickMarchObjectID = req.Value
  62. )
  63. assemble, ok := p.leagueTable.Assembles.Get(assembleID)
  64. if !ok {
  65. p.ResponseCode(session, code.MapAssemble_NotFound)
  66. return
  67. }
  68. // 不是自己的集结队列
  69. if assemble.LeadPlayerID != sessions.GetPlayerID(session) {
  70. p.ResponseCode(session, code.MapAssemble_NotLeader)
  71. return
  72. }
  73. // 不能踢队长
  74. if assembleID == kickMarchObjectID {
  75. p.ResponseCode(session, code.MapAssemble_KickLeader)
  76. return
  77. }
  78. // 成员不在集结队列中
  79. if !assemble.ContainsMarch(kickMarchObjectID) {
  80. p.ResponseCode(session, code.MapAssemble_NotInAssemble)
  81. return
  82. }
  83. errCode := mapCall.Logic.AssembleQuit(assembleID, kickMarchObjectID)
  84. if code.IsFail(errCode) {
  85. p.Debug("assemble kick fail: LeagueID = %d, errCode = %d", p.leagueID, errCode)
  86. p.ResponseCode(session, errCode)
  87. return
  88. }
  89. assemble.RemoveMember(kickMarchObjectID)
  90. p.leagueTable.Save2Queue()
  91. p.ResponseCode(session, code.OK)
  92. p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{})
  93. }
  94. func (p *actorLeague) assembleDepart(session *cproto.Session, req *pb.I64) {
  95. assemble, ok := p.leagueTable.Assembles.Get(req.Value)
  96. if !ok {
  97. p.ResponseCode(session, code.MapAssemble_NotFound)
  98. return
  99. }
  100. // 不是自己的集结队列
  101. if assemble.LeadPlayerID != sessions.GetPlayerID(session) {
  102. p.ResponseCode(session, code.MapAssemble_NotLeader)
  103. return
  104. }
  105. errCode := mapCall.Logic.AssembleDepart(assemble.AssembleID)
  106. if code.IsFail(errCode) {
  107. p.Debug("assemble depart fail: LeagueID = %d, errCode = %d", p.leagueID, errCode)
  108. p.ResponseCode(session, errCode)
  109. return
  110. }
  111. // 设置出发标记
  112. assemble.IsDepart = true
  113. p.leagueTable.Save2Queue()
  114. p.ResponseCode(session, code.OK)
  115. p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{})
  116. }
  117. func (p *actorLeague) assembleQuit(session *cproto.Session, req *pb.I64) {
  118. assemble, ok := p.leagueTable.Assembles.Get(req.Value)
  119. if !ok {
  120. p.ResponseCode(session, code.MapAssemble_NotFound)
  121. return
  122. }
  123. playerID := sessions.GetPlayerID(session)
  124. var foundMember *mapTypes.AssembleMember
  125. for _, member := range assemble.JoinList {
  126. if member.PlayerID == playerID {
  127. foundMember = member
  128. break
  129. }
  130. }
  131. if foundMember == nil {
  132. p.ResponseCode(session, code.MapAssemble_NotInAssemble)
  133. return
  134. }
  135. errCode := mapCall.Logic.AssembleQuit(assemble.AssembleID, foundMember.MarchObjectID)
  136. if code.IsFail(errCode) {
  137. p.Debug("assemble quit fail: LeagueID = %d, errCode = %d", p.leagueID, errCode)
  138. p.ResponseCode(session, errCode)
  139. return
  140. }
  141. assemble.RemoveMember(foundMember.MarchObjectID)
  142. p.leagueTable.Save2Queue()
  143. p.ResponseCode(session, code.OK)
  144. p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{})
  145. }
  146. func (p *actorLeague) assembleAdd(req *pb.NewAssemble) {
  147. p.Debug("[assembleAdd] req = %v", req)
  148. assemble := &dbLeague.Assemble{
  149. AssembleID: req.LegionObjectID,
  150. LeadPlayerID: req.LeadMember.PlayerID,
  151. StartPoint: types.NewPoint(req.Point.X, req.Point.Y),
  152. EndTime: req.EndTime,
  153. TargetObjectID: req.TargetObjectID,
  154. TargetConfigID: req.TargetConfigID,
  155. TargetObjectType: enum.ObjectType(req.TargetObjectType),
  156. TargetPoint: types.NewPoint(req.TargetPoint.X, req.TargetPoint.Y),
  157. }
  158. p.addAssembleMember(assemble, req.LeadMember)
  159. p.leagueTable.Assembles.Put(req.LegionObjectID, assemble)
  160. p.leagueTable.Save2Queue()
  161. // 通知联盟成员
  162. p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{Value: 1})
  163. }
  164. // 集结更新
  165. func (p *actorLeague) assembleUpdate(req *pb.AssembleUpdate) {
  166. p.Debug("[assembleUpdate] req = %+v", req)
  167. assemble, ok := p.leagueTable.Assembles.Get(req.LegionObjectID)
  168. if !ok {
  169. return
  170. }
  171. // 解散
  172. if req.IsDisband {
  173. p.leagueTable.Assembles.Remove(req.LegionObjectID)
  174. p.leagueTable.Save2Queue()
  175. p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{Value: -1})
  176. return
  177. }
  178. var update bool
  179. if req.NewMember != nil {
  180. p.addAssembleMember(assemble, req.NewMember)
  181. update = true
  182. }
  183. if req.QuitMember > 0 {
  184. assemble.RemoveMember(req.QuitMember)
  185. update = true
  186. }
  187. if req.IsDepart {
  188. assemble.IsDepart = true
  189. update = true
  190. }
  191. if update {
  192. p.leagueTable.Save2Queue()
  193. p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{})
  194. }
  195. }
  196. func (p *actorLeague) addAssembleMember(assemble *dbLeague.Assemble, req *pb.AssembleMember) {
  197. playerData, _, heroData := redis.Game.GetPlayerTeamHeroData(req.PlayerID, req.TeamID, req.HeroGUID)
  198. if playerData != nil {
  199. req.PlayerName = playerData.PlayerName
  200. }
  201. member := &mapTypes.AssembleMember{
  202. PlayerID: req.PlayerID,
  203. PlayerName: req.PlayerName,
  204. MarchObjectID: req.MarchObjectID,
  205. TroopsNum: req.TroopsNum,
  206. MarchArriveTime: req.ArriveTime,
  207. }
  208. if heroData != nil {
  209. member.HeroConfigID = heroData.ConfigID
  210. member.HeroLevel = heroData.Level
  211. member.HeroStar = heroData.Star
  212. }
  213. assemble.JoinList = append(assemble.JoinList, member)
  214. }