player_lineup.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. package player
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/constant"
  5. "f1-game/internal/data"
  6. nameLocal "f1-game/internal/name/local"
  7. "f1-game/internal/pb"
  8. "f1-game/nodes/game/player/lineup"
  9. cproto "github.com/cherry-game/cherry/net/proto"
  10. )
  11. func (p *actorPlayer) initLineup() {
  12. p.Local().Register(nameLocal.Player_LineupUp, p.lineupUp)
  13. p.Local().Register(nameLocal.Player_LineupLeave, p.lineupLeave)
  14. p.Local().Register(nameLocal.Player_LineupChange, p.lineupChange)
  15. p.Local().Register(nameLocal.Player_LineupAdjust, p.lineupAdjust)
  16. }
  17. // lineupUp 阵容英雄上阵
  18. func (p *actorPlayer) lineupUp(session *cproto.Session, req *pb.LineupUpRequest) {
  19. var (
  20. heroTable = p.HeroTable()
  21. teamTable = p.TeamTable()
  22. heroGUID = req.HeroGUID
  23. lineupType = req.LineupType
  24. lineupID = req.LineupID
  25. index = req.Index
  26. )
  27. if !constant.CheckLineupTypeValid(lineupType) {
  28. p.ResponseCode(session, code.TeamLineupTypeError)
  29. return
  30. }
  31. // 检测上阵位置是否正确
  32. if !constant.ValidateLineupMemberIndex(index) {
  33. p.ResponseCode(session, code.TeamIndexError)
  34. return
  35. }
  36. // 判断当前英雄是否已上阵
  37. if exist := teamTable.LineupMap.CheckHeroAlreadyUp(heroGUID); exist {
  38. p.ResponseCode(session, code.TeamHeroAlreadyUp)
  39. return
  40. }
  41. heroEntity, ok := heroTable.Heroes.Get(heroGUID)
  42. if !ok {
  43. p.ResponseCode(session, code.HeroNotExist)
  44. return
  45. }
  46. if _, ok = data.HeroTeam.Get(lineupID); !ok {
  47. p.ResponseCode(session, code.ConfigNotFound_HeroTeam)
  48. return
  49. }
  50. lineups, found := teamTable.LineupMap.GetLineups(lineupType)
  51. if !found {
  52. p.Warn("[lineupUp] lineupType not found %d", lineupType)
  53. p.ResponseCode(session, code.TeamLineupNotUnlock)
  54. return
  55. }
  56. // 检测是否上阵相同英雄
  57. if same := lineup.Service().CheckLineupSameHero(heroTable, lineups, 0, 0, lineupID, index, heroEntity.HeroID); same {
  58. p.ResponseCode(session, code.TeamAlreadySameHero)
  59. return
  60. }
  61. // 获取阵容数据
  62. curLineup, found := lineups.GetLineup(lineupID)
  63. if !found {
  64. p.ResponseCode(session, code.TeamNotUnlock)
  65. return
  66. }
  67. // 获取上阵英雄数据
  68. lineupMember, found := curLineup.GetLineupMember(index)
  69. if !found {
  70. // 上阵人数已达上限
  71. if lineup.Service().CheckLineupMemberLimit(p.playerID, curLineup, index) {
  72. p.ResponseCode(session, code.TeamMemberLimit)
  73. return
  74. }
  75. curLineup.AddLineupMember(index, heroGUID)
  76. } else {
  77. lineupMember.HeroGUID = heroGUID
  78. }
  79. teamTable.Save2Queue()
  80. // 更新阵容羁绊列表
  81. lineup.Service().UpdateLineupFetterList(p.playerID, heroTable, curLineup)
  82. proto := curLineup.ToProto()
  83. resp := &pb.LineupInfo{
  84. LineupType: lineupType,
  85. Lineup: &proto,
  86. }
  87. p.Response(session, resp)
  88. }
  89. // lineupLeave 阵容英雄下阵
  90. func (p *actorPlayer) lineupLeave(session *cproto.Session, req *pb.LineupLeaveRequest) {
  91. var (
  92. teamTable = p.TeamTable()
  93. lineupType = req.LineupType
  94. lineupID = req.LineupID
  95. index = req.Index
  96. )
  97. lineups, found := teamTable.LineupMap.GetLineups(lineupType)
  98. if !found {
  99. p.ResponseCode(session, code.TeamLineupTypeError)
  100. return
  101. }
  102. curLineup, found := lineups.GetLineup(lineupID)
  103. if !found {
  104. p.ResponseCode(session, code.TeamNotUnlock)
  105. return
  106. }
  107. if !curLineup.DelLineupMember(index) {
  108. p.ResponseCode(session, code.HeroNotInTeam)
  109. return
  110. }
  111. teamTable.Save2Queue()
  112. // 更新阵容羁绊列表
  113. lineup.Service().UpdateLineupFetterList(p.playerID, p.HeroTable(), curLineup)
  114. proto := curLineup.ToProto()
  115. resp := &pb.LineupInfo{
  116. LineupType: lineupType,
  117. Lineup: &proto,
  118. }
  119. p.Response(session, resp)
  120. }
  121. // lineupChange 阵容英雄换阵
  122. func (p *actorPlayer) lineupChange(session *cproto.Session, req *pb.LineupChangeRequest) {
  123. var (
  124. heroTable = p.HeroTable()
  125. teamTable = p.TeamTable()
  126. lineupType = req.LineupType
  127. srcLineupID = req.SrcLineupID
  128. dstLineupID = req.DstLineupID
  129. srcIndex = req.SrcIndex
  130. dstIndex = req.DstIndex
  131. )
  132. if srcLineupID == dstLineupID && srcIndex == dstIndex {
  133. p.ResponseCode(session, code.TeamIndexNotChange)
  134. return
  135. }
  136. //判断队伍索引是否合法
  137. if !constant.ValidateLineupMemberIndex(srcIndex, dstIndex) {
  138. p.ResponseCode(session, code.TeamIndexError)
  139. return
  140. }
  141. lineups, found := teamTable.LineupMap.GetLineups(lineupType)
  142. if !found {
  143. p.ResponseCode(session, code.TeamLineupTypeError)
  144. return
  145. }
  146. srcLineup, found := lineups.GetLineup(srcLineupID)
  147. if !found {
  148. p.ResponseCode(session, code.TeamNotUnlock)
  149. return
  150. }
  151. srcLineupMember, ok := srcLineup.GetLineupMember(srcIndex)
  152. if !ok || srcLineupMember.HeroGUID == 0 {
  153. p.ResponseCode(session, code.HeroNotInTeam)
  154. return
  155. }
  156. srcHero, ok := heroTable.Heroes.Get(srcLineupMember.HeroGUID)
  157. if !ok {
  158. p.ResponseCode(session, code.HeroNotExist)
  159. return
  160. }
  161. dstLineup, ok := lineups.GetLineup(dstLineupID)
  162. if !ok {
  163. p.ResponseCode(session, code.TeamNotUnlock)
  164. return
  165. }
  166. //不同队伍 检测是否上阵相同英雄
  167. if srcLineupID != dstLineupID &&
  168. lineup.Service().CheckLineupSameHero(heroTable, lineups, srcLineupID, srcIndex, dstLineupID, dstIndex, srcHero.HeroID) {
  169. p.ResponseCode(session, code.TeamAlreadySameHero)
  170. return
  171. }
  172. // 被替换位置检测英雄下阵
  173. dstLineupMember, found := dstLineup.GetLineupMember(dstIndex)
  174. if found {
  175. dstLineupMember.HeroGUID = srcLineupMember.HeroGUID
  176. } else {
  177. // 上阵人数已达上限
  178. if lineup.Service().CheckLineupMemberLimit(p.playerID, dstLineup, dstIndex) {
  179. p.ResponseCode(session, code.TeamMemberLimit)
  180. return
  181. }
  182. dstLineup.AddLineupMember(dstIndex, srcLineupMember.HeroGUID)
  183. }
  184. // 原阵容英雄下阵
  185. srcLineup.DelLineupMember(srcIndex)
  186. teamTable.Save2Queue()
  187. // 更新阵容羁绊列表
  188. lineup.Service().UpdateLineupFetterList(p.playerID, heroTable, srcLineup, dstLineup)
  189. // 同步给客户端
  190. lineup.Service().LineupChangePush(p.playerID, lineupType, srcLineupID, dstLineupID)
  191. p.ResponseCode(session, code.OK)
  192. }
  193. // lineupTune 阵容英雄阵容设置
  194. func (p *actorPlayer) lineupAdjust(session *cproto.Session, req *pb.LineupAdjustRequest) {
  195. var (
  196. teamTable = p.TeamTable()
  197. lineupType = req.LineupType
  198. lineupID = req.LineupID
  199. index = req.Index
  200. toIndex = req.ToIndex
  201. )
  202. //检测部队位置是否合法
  203. if !constant.ValidateLineupMemberIndex(index, toIndex) {
  204. p.ResponseCode(session, code.TeamIndexError)
  205. return
  206. }
  207. // 获取阵容类型下的阵容列表
  208. lineups, found := teamTable.LineupMap.GetLineups(lineupType)
  209. if !found {
  210. p.ResponseCode(session, code.TeamLineupTypeError)
  211. return
  212. }
  213. // 获取阵容信息
  214. lineup, found := lineups.GetLineup(lineupID)
  215. if !found {
  216. p.ResponseCode(session, code.TeamNotUnlock)
  217. return
  218. }
  219. // 获取阵容成员信息
  220. fromLineupMember, found := lineup.GetLineupMember(index)
  221. if !found || fromLineupMember.HeroGUID == 0 {
  222. p.ResponseCode(session, code.HeroNotInTeam)
  223. return
  224. }
  225. if fromLineupMember.Index != toIndex {
  226. //获取交换对象 如果原来位置存在英雄 则交换阵容位置 否则直接修改位置
  227. toLineupMember, found := lineup.GetLineupMember(toIndex)
  228. if found {
  229. //交换
  230. fromLineupMember.Index, toLineupMember.Index = toLineupMember.Index, fromLineupMember.Index
  231. } else {
  232. fromLineupMember.Index = toIndex
  233. }
  234. teamTable.Save2Queue()
  235. }
  236. proto := lineup.ToProto()
  237. resp := &pb.LineupInfo{
  238. LineupType: lineupType,
  239. Lineup: &proto,
  240. }
  241. p.Response(session, resp)
  242. }