player_lineup.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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/internal/types"
  9. "f1-game/nodes/game/internal/db"
  10. dbLineup "f1-game/nodes/game/internal/db/data/lineup"
  11. "f1-game/nodes/game/player/lineup"
  12. cslice "github.com/cherry-game/cherry/extend/slice"
  13. cproto "github.com/cherry-game/cherry/net/proto"
  14. )
  15. func (p *actorPlayer) initLineup() {
  16. p.Local().Register(nameLocal.Player_LineupUp, p.lineupUp)
  17. p.Local().Register(nameLocal.Player_LineupLeave, p.lineupLeave)
  18. p.Local().Register(nameLocal.Player_LineupChange, p.lineupChange)
  19. p.Local().Register(nameLocal.Player_LineupAdjust, p.lineupAdjust)
  20. }
  21. // lineupUp 阵容英雄上阵
  22. func (p *actorPlayer) lineupUp(session *cproto.Session, req *pb.LineupUpRequest) {
  23. var (
  24. heroTable = p.HeroTable()
  25. teamTable = p.TeamTable()
  26. heroGUID = req.HeroGUID
  27. lineupType = req.LineupType
  28. lineupID = req.LineupID
  29. index = req.Index
  30. )
  31. if !constant.CheckLineupTypeValid(lineupType) {
  32. p.ResponseCode(session, code.TeamLineupTypeError)
  33. return
  34. }
  35. // 检测上阵位置是否正确
  36. if !constant.ValidateLineupMemberIndex(index) {
  37. p.ResponseCode(session, code.TeamIndexError)
  38. return
  39. }
  40. // 判断当前英雄是否已上阵
  41. if exist := teamTable.LineupMap.CheckHeroAlreadyUp(heroGUID); exist {
  42. p.ResponseCode(session, code.TeamHeroAlreadyUp)
  43. return
  44. }
  45. heroEntity, ok := heroTable.Heroes.Get(heroGUID)
  46. if !ok {
  47. p.ResponseCode(session, code.HeroNotExist)
  48. return
  49. }
  50. if _, ok = data.HeroTeam.Get(lineupID); !ok {
  51. p.ResponseCode(session, code.ConfigNotFound_HeroTeam)
  52. return
  53. }
  54. lineups, found := teamTable.LineupMap.GetLineups(lineupType)
  55. if !found {
  56. p.Warn("[lineupUp] lineupType not found %d", lineupType)
  57. p.ResponseCode(session, code.TeamLineupNotUnlock)
  58. return
  59. }
  60. // 检测是否上阵相同英雄
  61. if p.checkLineupSameHero(heroTable, lineups, 0, 0, lineupID, index, heroEntity.HeroID) {
  62. p.ResponseCode(session, code.TeamAlreadySameHero)
  63. return
  64. }
  65. // 获取阵容数据
  66. lineup, found := lineups.GetLineup(lineupID)
  67. if !found {
  68. p.ResponseCode(session, code.TeamNotUnlock)
  69. return
  70. }
  71. // 获取上阵英雄数据
  72. lineupMember, found := lineup.GetLineupMember(index)
  73. if !found {
  74. // 上阵人数已达上限
  75. if lineup.IsLineupMemberLimit() {
  76. p.ResponseCode(session, code.TeamMemberLimit)
  77. return
  78. }
  79. lineup.AddLineupMember(index, heroGUID)
  80. } else {
  81. lineupMember.HeroGUID = heroGUID
  82. }
  83. teamTable.Save2Queue()
  84. // 更新阵容羁绊列表
  85. p.updateLineupFetterList(lineup)
  86. proto := lineup.ToProto()
  87. resp := &pb.LineupInfo{
  88. LineupType: lineupType,
  89. Lineup: &proto,
  90. }
  91. p.Response(session, resp)
  92. }
  93. // lineupLeave 阵容英雄下阵
  94. func (p *actorPlayer) lineupLeave(session *cproto.Session, req *pb.LineupLeaveRequest) {
  95. var (
  96. teamTable = p.TeamTable()
  97. lineupType = req.LineupType
  98. lineupID = req.LineupID
  99. index = req.Index
  100. )
  101. lineups, found := teamTable.LineupMap.GetLineups(lineupType)
  102. if !found {
  103. p.ResponseCode(session, code.TeamLineupTypeError)
  104. return
  105. }
  106. lineup, found := lineups.GetLineup(lineupID)
  107. if !found {
  108. p.ResponseCode(session, code.TeamNotUnlock)
  109. return
  110. }
  111. if !lineup.DelLineupMember(index) {
  112. p.ResponseCode(session, code.HeroNotInTeam)
  113. return
  114. }
  115. teamTable.Save2Queue()
  116. // 更新阵容羁绊列表
  117. p.updateLineupFetterList(lineup)
  118. proto := lineup.ToProto()
  119. resp := &pb.LineupInfo{
  120. LineupType: lineupType,
  121. Lineup: &proto,
  122. }
  123. p.Response(session, resp)
  124. }
  125. // lineupChange 阵容英雄换阵
  126. func (p *actorPlayer) lineupChange(session *cproto.Session, req *pb.LineupChangeRequest) {
  127. var (
  128. heroTable = p.HeroTable()
  129. teamTable = p.TeamTable()
  130. lineupType = req.LineupType
  131. srcLineupID = req.SrcLineupID
  132. dstLineupID = req.DstLineupID
  133. srcIndex = req.SrcIndex
  134. dstIndex = req.DstIndex
  135. )
  136. if srcLineupID == dstLineupID && srcIndex == dstIndex {
  137. p.ResponseCode(session, code.TeamIndexNotChange)
  138. return
  139. }
  140. //判断队伍索引是否合法
  141. if !constant.ValidateLineupMemberIndex(srcIndex, dstIndex) {
  142. p.ResponseCode(session, code.TeamIndexError)
  143. return
  144. }
  145. lineups, found := teamTable.LineupMap.GetLineups(lineupType)
  146. if !found {
  147. p.ResponseCode(session, code.TeamLineupTypeError)
  148. return
  149. }
  150. srcLineup, found := lineups.GetLineup(srcLineupID)
  151. if !found {
  152. p.ResponseCode(session, code.TeamNotUnlock)
  153. return
  154. }
  155. srcLineupMember, ok := srcLineup.GetLineupMember(srcIndex)
  156. if !ok || srcLineupMember.HeroGUID == 0 {
  157. p.ResponseCode(session, code.HeroNotInTeam)
  158. return
  159. }
  160. srcHero, ok := heroTable.Heroes.Get(srcLineupMember.HeroGUID)
  161. if !ok {
  162. p.ResponseCode(session, code.HeroNotExist)
  163. return
  164. }
  165. dstLineup, ok := lineups.GetLineup(dstLineupID)
  166. if !ok {
  167. p.ResponseCode(session, code.TeamNotUnlock)
  168. return
  169. }
  170. //不同队伍 检测是否上阵相同英雄
  171. if srcLineupID != dstLineupID && p.checkLineupSameHero(heroTable, lineups, srcLineupID, srcIndex, dstLineupID, dstIndex, srcHero.HeroID) {
  172. p.ResponseCode(session, code.TeamAlreadySameHero)
  173. return
  174. }
  175. // 被替换位置检测英雄下阵
  176. dstLineupMember, found := dstLineup.GetLineupMember(dstIndex)
  177. if found {
  178. dstLineupMember.HeroGUID = srcLineupMember.HeroGUID
  179. } else {
  180. // 判断人数是否上限
  181. if dstLineup.IsLineupMemberLimit() {
  182. p.ResponseCode(session, code.TeamMemberLimit)
  183. return
  184. }
  185. dstLineup.AddLineupMember(dstIndex, srcLineupMember.HeroGUID)
  186. }
  187. // 原阵容英雄下阵
  188. srcLineup.DelLineupMember(srcIndex)
  189. teamTable.Save2Queue()
  190. // 更新阵容羁绊列表
  191. p.updateLineupFetterList(srcLineup, dstLineup)
  192. // 同步给客户端
  193. lineup.Service().LineupChangePush(p.playerID, lineupType, srcLineupID, dstLineupID)
  194. p.ResponseCode(session, code.OK)
  195. }
  196. // lineupTune 阵容英雄阵容设置
  197. func (p *actorPlayer) lineupAdjust(session *cproto.Session, req *pb.LineupAdjustRequest) {
  198. var (
  199. teamTable = p.TeamTable()
  200. lineupType = req.LineupType
  201. lineupID = req.LineupID
  202. index = req.Index
  203. toIndex = req.ToIndex
  204. )
  205. //检测部队位置是否合法
  206. if !constant.ValidateLineupMemberIndex(index, toIndex) {
  207. p.ResponseCode(session, code.TeamIndexError)
  208. return
  209. }
  210. // 获取阵容类型下的阵容列表
  211. lineups, found := teamTable.LineupMap.GetLineups(lineupType)
  212. if !found {
  213. p.ResponseCode(session, code.TeamLineupTypeError)
  214. return
  215. }
  216. // 获取阵容信息
  217. lineup, found := lineups.GetLineup(lineupID)
  218. if !found {
  219. p.ResponseCode(session, code.TeamNotUnlock)
  220. return
  221. }
  222. // 获取阵容成员信息
  223. fromLineupMember, found := lineup.GetLineupMember(index)
  224. if !found || fromLineupMember.HeroGUID == 0 {
  225. p.ResponseCode(session, code.HeroNotInTeam)
  226. return
  227. }
  228. if fromLineupMember.Index != toIndex {
  229. //获取交换对象 如果原来位置存在英雄 则交换阵容位置 否则直接修改位置
  230. toLineupMember, found := lineup.GetLineupMember(toIndex)
  231. if found {
  232. //交换
  233. fromLineupMember.Index, toLineupMember.Index = toLineupMember.Index, fromLineupMember.Index
  234. } else {
  235. fromLineupMember.Index = toIndex
  236. }
  237. teamTable.Save2Queue()
  238. }
  239. proto := lineup.ToProto()
  240. resp := &pb.LineupInfo{
  241. LineupType: lineupType,
  242. Lineup: &proto,
  243. }
  244. p.Response(session, resp)
  245. }
  246. // 检测同队伍是否存在相同英雄
  247. func (p *actorPlayer) checkLineupSameHero(heroTable *db.HeroTable, lineups dbLineup.Lineups, srcLineupID, srcLineupIndex, excludeLineupID, excludeIndex int32, heroIDs ...int32) bool {
  248. if len(lineups) <= 0 {
  249. return false
  250. }
  251. for _, lineup := range lineups {
  252. // 如果排除的位置为0 且 排除的阵容ID相同 则排除整个阵容
  253. if excludeIndex == 0 && lineup.LineupID == excludeLineupID {
  254. continue
  255. }
  256. for _, member := range lineup.Members {
  257. // 如果是不同阵容切换位置 则排除原位置
  258. if lineup.LineupID == srcLineupID && member.Index == srcLineupIndex {
  259. continue
  260. }
  261. // 排除上阵位置
  262. if lineup.LineupID == excludeLineupID && member.Index == excludeIndex {
  263. continue
  264. }
  265. hero, ok := heroTable.Heroes.Get(member.HeroGUID)
  266. if !ok {
  267. // 没找到返回true 防止上阵相同英雄
  268. return true
  269. }
  270. if _, ok := cslice.Int32In(hero.HeroID, heroIDs); ok {
  271. return true
  272. }
  273. }
  274. }
  275. return false
  276. }
  277. // 更新队伍羁绊列表
  278. func (p *actorPlayer) updateLineupFetterList(updateTeams ...*dbLineup.Lineup) {
  279. if len(updateTeams) < 1 {
  280. return
  281. }
  282. heroTable := p.HeroTable()
  283. for _, curTeam := range updateTeams {
  284. if len(curTeam.Members) < 1 {
  285. curTeam.FetterIDs.Clear()
  286. continue
  287. }
  288. // 获取英雄列表
  289. heroIDSet := types.Set[int32]{}
  290. for _, member := range curTeam.Members {
  291. curHeroEntity, found := heroTable.Heroes.Get(member.HeroGUID)
  292. if found {
  293. heroIDSet.Add(curHeroEntity.HeroID)
  294. }
  295. }
  296. // 刷新队伍羁绊
  297. fetterIDs := lineup.Service().GetFetterListByHeroList(p.playerID, heroIDSet)
  298. curTeam.FetterIDs = fetterIDs
  299. }
  300. }