league_war.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  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. "f1-game/internal/extend/utils"
  8. nameEvent "f1-game/internal/name/event"
  9. nameLocal "f1-game/internal/name/local"
  10. nameRoute "f1-game/internal/name/route"
  11. "f1-game/internal/pb"
  12. "f1-game/internal/sessions"
  13. "f1-game/internal/types"
  14. mapCall "f1-game/nodes/map/internal/call"
  15. "f1-game/nodes/map/internal/db"
  16. dbLeague "f1-game/nodes/map/internal/db/data/league"
  17. mapTypes "f1-game/nodes/map/internal/types"
  18. leagueBase "f1-game/nodes/map/league/base"
  19. leagueMail "f1-game/nodes/map/league/mail"
  20. ctime "github.com/cherry-game/cherry/extend/time"
  21. cfacade "github.com/cherry-game/cherry/facade"
  22. cproto "github.com/cherry-game/cherry/net/proto"
  23. )
  24. func (p *actorLeague) initWar() {
  25. p.Local().Register(nameLocal.MapLeague_StartWar, p.startWar)
  26. p.Local().Register(nameLocal.MapLeague_StopWar, p.stopWar)
  27. p.Local().Register(nameLocal.MapLeague_WarList, p.warList)
  28. p.EventRegister(nameEvent.Map_WarUpdate, p.warUpdate)
  29. }
  30. // warList 获取联盟战斗列表
  31. func (p *actorLeague) warList(session *cproto.Session, _ *pb.None) {
  32. // 获取联盟战斗列表
  33. proto := pb.WarList{}
  34. for _, war := range p.leagueTable.Wars {
  35. proto.List = append(proto.List, war.ToProto())
  36. }
  37. p.Response(session, &proto)
  38. }
  39. // startWar 宣战
  40. func (p *actorLeague) startWar(session *cproto.Session, req *pb.I64I64) {
  41. p.Debug("[startWar] req = %v", req)
  42. var (
  43. playerID = sessions.GetPlayerID(session)
  44. castleObjectID = req.Key
  45. waitTime = req.Value
  46. )
  47. // 权限检查
  48. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  49. if !found {
  50. p.ResponseCode(session, code.LeagueMembersEmpty)
  51. return
  52. }
  53. if found = leagueMemberTable.CheckMemberExist(playerID); !found {
  54. p.ResponseCode(session, code.LeagueNotJoin)
  55. return
  56. }
  57. if !leagueMemberTable.CheckPermission(playerID, enum.League_Permission_Castle) {
  58. p.ResponseCode(session, code.LeaguePermissionNotExist)
  59. return
  60. }
  61. if war, ok := p.leagueTable.Wars.Get(castleObjectID); ok {
  62. // 是否已经宣战过了
  63. if war.Stage > enum.SiegeStage_None {
  64. p.ResponseCode(session, code.MapStartWar_AlreadyStart)
  65. return
  66. }
  67. // 宣战冷却
  68. if war.Cooldown > ctime.Now().ToMillisecond() {
  69. p.ResponseCode(session, code.MapDeclareWar_Cooldown)
  70. return
  71. }
  72. }
  73. // 最少一个小时
  74. startWarTime := constant.GetStartWarWaitTime(waitTime)
  75. rsp, errCode := mapCall.Logic.StartWar(&mapTypes.StartWar{
  76. LeagueID: p.leagueID,
  77. CastleObjectID: castleObjectID,
  78. Time: startWarTime,
  79. })
  80. if code.IsFail(errCode) {
  81. p.ResponseCode(session, errCode)
  82. return
  83. }
  84. // 保存战争数据
  85. p.leagueTable.Wars.Put(castleObjectID, &dbLeague.War{
  86. CastleObjectID: castleObjectID,
  87. CastleConfigID: rsp.CastleConfigID,
  88. CastlePoint: types.NewPoint(rsp.CastlePoint.X, rsp.CastlePoint.Y),
  89. SiegeBaseObjectID: rsp.SiegeBaseObjectID,
  90. SiegeBaseConfigID: rsp.SiegeBaseConfigID,
  91. SiegeBasePoint: types.NewPoint(rsp.SiegeBasePoint.X, rsp.SiegeBasePoint.Y),
  92. Stage: enum.SiegeStage(rsp.Stage),
  93. StageEndTime: rsp.StageEndTime,
  94. MainForceNum: rsp.MainForceNum,
  95. SiegeSquadNum: rsp.SiegeSquadNum,
  96. })
  97. p.leagueTable.Save2Queue()
  98. p.Debug("declare war sucess: CastleObjectID = %d, Stage = %s, EndTime = %s",
  99. castleObjectID,
  100. enum.GetSiegeStageName(enum.SiegeStage(rsp.Stage)),
  101. ctime.CreateFromTimestamp(rsp.StageEndTime).ToDateTimeFormat())
  102. p.ResponseCode(session, code.OK)
  103. // 通知所有成员
  104. p.pushToMembers(nameRoute.PushMapLeague_WarUpdate, &pb.I32{Value: 1})
  105. opPlayerName := leagueBase.Service().GetPlayerName(playerID)
  106. nowSec := ctime.Now().ToSecond()
  107. // 宣战邮件
  108. leagueMail.Service().SendAllMemberMail(p.leagueID, constant.MailID_LeagueStartWar, nil, opPlayerName, nowSec, rsp.CastleConfigID, rsp.SiegeBaseConfigID)
  109. // 写入日志
  110. leagueLogTable, _ := db.GetMapLeagueLogTable(p.leagueID)
  111. leagueLogTable.AddLeagueLog(enum.Log_LeagueDeclareWar, utils.ToStringSlice(opPlayerName, rsp.CastleConfigID)...)
  112. }
  113. // stopWar 取消宣战
  114. func (p *actorLeague) stopWar(session *cproto.Session, req *pb.I64) {
  115. p.Debug("[stopWar] req = %v", req)
  116. var (
  117. playerID = sessions.GetPlayerID(session)
  118. castleObjectID = req.Value
  119. )
  120. // 权限检查
  121. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  122. if !found {
  123. p.ResponseCode(session, code.LeagueMembersEmpty)
  124. return
  125. }
  126. if found = leagueMemberTable.CheckMemberExist(playerID); !found {
  127. p.ResponseCode(session, code.LeagueNotJoin)
  128. return
  129. }
  130. if !leagueMemberTable.CheckPermission(playerID, enum.League_Permission_Castle) {
  131. p.ResponseCode(session, code.LeaguePermissionNotExist)
  132. return
  133. }
  134. // 未宣战
  135. war, ok := p.leagueTable.Wars.Get(castleObjectID)
  136. if !ok {
  137. p.ResponseCode(session, code.MapStopWar_NotInWar)
  138. return
  139. }
  140. // 通知地图取消宣战
  141. errCode := mapCall.Logic.StopWar(p.leagueID, castleObjectID)
  142. if code.IsFail(errCode) {
  143. p.ResponseCode(session, errCode)
  144. return
  145. }
  146. // 清除战争数据
  147. p.leagueTable.Wars.Remove(castleObjectID)
  148. p.leagueTable.Save2Queue()
  149. p.Debug("stop war success: CastleObjectID = %d", castleObjectID)
  150. p.ResponseCode(session, code.OK)
  151. // 通知所有成员
  152. p.pushToMembers(nameRoute.PushMapLeague_WarUpdate, &pb.I32{Value: -1})
  153. opPlayerName := leagueBase.Service().GetPlayerName(playerID)
  154. // 宣战取消邮件
  155. leagueMail.Service().SendAllMemberMail(p.leagueID, constant.MailID_LeagueStopWar, nil, opPlayerName, war.CastleConfigID)
  156. // 添加日志
  157. leagueLogTable, _ := db.GetMapLeagueLogTable(p.leagueID)
  158. leagueLogTable.AddLeagueLog(enum.Log_LeagueDeclareCancel, utils.ToStringSlice(opPlayerName, war.CastleConfigID)...)
  159. }
  160. // warUpdate 战争更新事件处理
  161. func (p *actorLeague) warUpdate(eventData cfacade.IEventData) {
  162. warUpdateEvent, ok := eventData.(*event.WarUpdate)
  163. if !ok {
  164. return
  165. }
  166. data := warUpdateEvent.Data()
  167. p.Debug("[warUpdate] eventData = %+v", data)
  168. war, ok := p.leagueTable.Wars.Get(data.CastleObjectID)
  169. if !ok {
  170. return
  171. }
  172. // 更新战争数据
  173. if data.Stage == enum.SiegeStage_End {
  174. p.leagueTable.Wars.Remove(data.CastleObjectID)
  175. p.leagueTable.Save2Queue()
  176. p.Debug("war end: CastleObjectID = %d", data.CastleObjectID)
  177. p.pushToMembers(nameRoute.PushMapLeague_WarUpdate, &pb.I32{Value: -1})
  178. return
  179. }
  180. if data.Stage != enum.SiegeStage_None {
  181. war.Stage = data.Stage
  182. war.StageEndTime = data.StageEndTime
  183. p.leagueTable.Save2Queue()
  184. // 通知所有成员
  185. p.pushToMembers(nameRoute.PushMapLeague_WarUpdate, &pb.I32{})
  186. return
  187. }
  188. if data.MainForceNum >= 0 || data.SiegeSquadNum >= 0 {
  189. war.MainForceNum = data.MainForceNum
  190. war.SiegeSquadNum = data.SiegeSquadNum
  191. p.leagueTable.Save2Queue()
  192. // 通知所有成员
  193. p.pushToMembers(nameRoute.PushMapLeague_WarUpdate, &pb.I32{})
  194. return
  195. }
  196. }