league_war.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package mapLeague
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/constant"
  5. "f1-game/internal/enum"
  6. "f1-game/internal/event"
  7. nameEvent "f1-game/internal/name/event"
  8. nameLocal "f1-game/internal/name/local"
  9. nameRoute "f1-game/internal/name/route"
  10. "f1-game/internal/pb"
  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. ctime "github.com/cherry-game/cherry/extend/time"
  16. cfacade "github.com/cherry-game/cherry/facade"
  17. cproto "github.com/cherry-game/cherry/net/proto"
  18. )
  19. func (p *actorLeague) initWar() {
  20. p.Local().Register(nameLocal.MapLeague_StartWar, p.startWar)
  21. p.Local().Register(nameLocal.MapLeague_StopWar, p.stopWar)
  22. p.Local().Register(nameLocal.MapLeague_WarList, p.warList)
  23. p.EventRegister(nameEvent.Map_WarUpdate, p.warUpdate)
  24. }
  25. // warList 获取联盟战斗列表
  26. func (p *actorLeague) warList(session *cproto.Session, _ *pb.None) {
  27. // 获取联盟战斗列表
  28. proto := pb.WarList{}
  29. for _, war := range p.leagueTable.Wars {
  30. proto.List = append(proto.List, war.ToProto())
  31. }
  32. p.Response(session, &proto)
  33. }
  34. // startWar 宣战
  35. func (p *actorLeague) startWar(session *cproto.Session, req *pb.I64I64) {
  36. p.Debug("[startWar] req = %v", req)
  37. var (
  38. castleObjectID = req.Key
  39. waitTime = req.Value
  40. )
  41. // TODO 权限检查
  42. if war, ok := p.leagueTable.Wars.Get(castleObjectID); ok {
  43. // 是否已经宣战过了
  44. if war.Stage > enum.SiegeStage_None {
  45. p.ResponseCode(session, code.MapStartWar_AlreadyStart)
  46. return
  47. }
  48. // 宣战冷却
  49. if war.Cooldown > ctime.Now().ToMillisecond() {
  50. p.ResponseCode(session, code.MapDeclareWar_Cooldown)
  51. return
  52. }
  53. }
  54. // 最少一个小时
  55. startWarTime := constant.GetStartWarWaitTime(waitTime)
  56. rsp, errCode := mapCall.Logic.StartWar(&mapTypes.StartWar{
  57. LeagueID: p.leagueID,
  58. CastleObjectID: castleObjectID,
  59. Time: startWarTime,
  60. })
  61. if code.IsFail(errCode) {
  62. p.ResponseCode(session, errCode)
  63. return
  64. }
  65. // 保存战争数据
  66. p.leagueTable.Wars.Put(castleObjectID, &dbLeague.War{
  67. CastleObjectID: castleObjectID,
  68. CastleConfigID: rsp.CastleConfigID,
  69. CastlePoint: types.NewPoint(rsp.CastlePoint.X, rsp.CastlePoint.Y),
  70. SiegeBaseObjectID: rsp.SiegeBaseObjectID,
  71. SiegeBaseConfigID: rsp.SiegeBaseConfigID,
  72. SiegeBasePoint: types.NewPoint(rsp.SiegeBasePoint.X, rsp.SiegeBasePoint.Y),
  73. Stage: enum.SiegeStage(rsp.Stage),
  74. StageEndTime: rsp.StageEndTime,
  75. MainForceNum: rsp.MainForceNum,
  76. SiegeSquadNum: rsp.SiegeSquadNum,
  77. })
  78. p.leagueTable.Save2Queue()
  79. p.Debug("declare war sucess: CastleObjectID = %d, Stage = %s, EndTime = %s",
  80. castleObjectID,
  81. enum.GetSiegeStageName(enum.SiegeStage(rsp.Stage)),
  82. ctime.CreateFromTimestamp(rsp.StageEndTime).ToDateTimeFormat())
  83. p.ResponseCode(session, code.OK)
  84. // 通知所有成员
  85. p.pushToMembers(nameRoute.PushMapLeague_WarUpdate, &pb.I32{Value: 1})
  86. }
  87. // stopWar 取消宣战
  88. func (p *actorLeague) stopWar(session *cproto.Session, req *pb.I64) {
  89. p.Debug("[stopWar] req = %v", req)
  90. // TODO 权限检查
  91. castleObjectID := req.Value
  92. // 未宣战
  93. if _, ok := p.leagueTable.Wars.Get(castleObjectID); !ok {
  94. p.ResponseCode(session, code.MapStopWar_NotInWar)
  95. return
  96. }
  97. // 通知地图取消宣战
  98. errCode := mapCall.Logic.StopWar(p.leagueID, castleObjectID)
  99. if code.IsFail(errCode) {
  100. p.ResponseCode(session, errCode)
  101. return
  102. }
  103. // 清除战争数据
  104. p.leagueTable.Wars.Remove(castleObjectID)
  105. p.leagueTable.Save2Queue()
  106. p.Debug("stop war success: CastleObjectID = %d", castleObjectID)
  107. p.ResponseCode(session, code.OK)
  108. // 通知所有成员
  109. p.pushToMembers(nameRoute.PushMapLeague_WarUpdate, &pb.I32{Value: -1})
  110. }
  111. // warUpdate 战争更新事件处理
  112. func (p *actorLeague) warUpdate(eventData cfacade.IEventData) {
  113. warUpdateEvent, ok := eventData.(*event.WarUpdate)
  114. if !ok {
  115. return
  116. }
  117. data := warUpdateEvent.Data()
  118. p.Debug("[warUpdate] eventData = %+v", data)
  119. war, ok := p.leagueTable.Wars.Get(data.CastleObjectID)
  120. if !ok {
  121. return
  122. }
  123. // 更新战争数据
  124. if data.Stage == enum.SiegeStage_End {
  125. p.leagueTable.Wars.Remove(data.CastleObjectID)
  126. p.leagueTable.Save2Queue()
  127. p.Debug("war end: CastleObjectID = %d", data.CastleObjectID)
  128. p.pushToMembers(nameRoute.PushMapLeague_WarUpdate, &pb.I32{Value: -1})
  129. return
  130. }
  131. if data.Stage != enum.SiegeStage_None {
  132. war.Stage = data.Stage
  133. war.StageEndTime = data.StageEndTime
  134. p.leagueTable.Save2Queue()
  135. // 通知所有成员
  136. p.pushToMembers(nameRoute.PushMapLeague_WarUpdate, &pb.I32{})
  137. return
  138. }
  139. if data.MainForceNum >= 0 || data.SiegeSquadNum >= 0 {
  140. war.MainForceNum = data.MainForceNum
  141. war.SiegeSquadNum = data.SiegeSquadNum
  142. p.leagueTable.Save2Queue()
  143. // 通知所有成员
  144. p.pushToMembers(nameRoute.PushMapLeague_WarUpdate, &pb.I32{})
  145. return
  146. }
  147. }