player_team.go 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268
  1. package mapPlayer
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/component/redis"
  5. "f1-game/internal/constant"
  6. "f1-game/internal/data"
  7. "f1-game/internal/enum"
  8. "f1-game/internal/event"
  9. "f1-game/internal/extend/times"
  10. nameEvent "f1-game/internal/name/event"
  11. nameLocal "f1-game/internal/name/local"
  12. nameRemote "f1-game/internal/name/remote"
  13. nameRoute "f1-game/internal/name/route"
  14. "f1-game/internal/pb"
  15. "f1-game/internal/sessions"
  16. "f1-game/internal/types"
  17. ao "f1-game/nodes/game/player/asset/origin"
  18. mapCall "f1-game/nodes/map/internal/call"
  19. "f1-game/nodes/map/internal/db"
  20. dbMapPlayer "f1-game/nodes/map/internal/db/data/player"
  21. mapFacade "f1-game/nodes/map/internal/facade"
  22. "f1-game/nodes/map/player/hero"
  23. "f1-game/nodes/map/player/team"
  24. ctime "github.com/cherry-game/cherry/extend/time"
  25. cfacade "github.com/cherry-game/cherry/facade"
  26. cproto "github.com/cherry-game/cherry/net/proto"
  27. )
  28. func (p *actorPlayer) initPlayerTeam() {
  29. p.Local().Register(nameLocal.MapPlayer_TeamUp, p.teamUp)
  30. p.Local().Register(nameLocal.MapPlayer_TeamLeave, p.teamLeave)
  31. p.Local().Register(nameLocal.MapPlayer_TeamChange, p.teamChange)
  32. p.Local().Register(nameLocal.MapPlayer_TeamInnerChange, p.teamInnerChange)
  33. p.Local().Register(nameLocal.MapPlayer_TeamLineup, p.teamLineup)
  34. p.Local().Register(nameLocal.MapPlayer_TeamTroops, p.teamTroops)
  35. p.Local().Register(nameLocal.MapPlayer_TeamAutoTroops, p.teamAutoTroops)
  36. p.Local().Register(nameLocal.MapPlayer_TeamOutsideTroops, p.teamOutsideTroops)
  37. p.Local().Register(nameLocal.MapPlayer_TeamOutsideTroopsCancel, p.teamOutsideTroopsCancel)
  38. p.Local().Register(nameLocal.MapPlayer_TeamOutsideAutoTroopsSet, p.teamOutsideAutoTroopsSet)
  39. p.Remote().Register(nameRemote.MapPlayer_UseMedicine, p.useMedicine)
  40. p.Remote().Register(nameRemote.MapPlayer_SubTeamTroopsNum, p.subTeamTroopsNum)
  41. p.Remote().Register(nameRemote.MapPlayer_UpdateTeamState, p.updateTeamState)
  42. p.Remote().Register(nameRemote.MapPlayer_SetTeamInjury, p.setTeamInjury)
  43. p.Remote().Register(nameRemote.MapPlayer_MarchArrive, p.marchArrive)
  44. // TODO: 可以把上面的更新都合并到这里
  45. p.Remote().Register(nameRemote.MapPlayer_UpdateTeam, p.updateTeam)
  46. //p.EventRegister(nameEvent.Map_MarchArrive, p.marchArrive)
  47. p.EventRegister(nameEvent.Lord_FacilityUp, p.onFacilityUpRefreshTeam)
  48. }
  49. // teamUp 英雄上阵
  50. func (p *actorPlayer) teamUp(session *cproto.Session, req *pb.TeamUpRequest) {
  51. playerTable := db.GetMapPlayerTable(p.playerID)
  52. var (
  53. heroGUID = req.HeroGUID
  54. teamID = req.TeamID
  55. teamIndex = req.TeamIndex
  56. index = req.Index
  57. )
  58. // 部队位置是否合法
  59. if !constant.ValidateTeamMemberTeamIndex(teamIndex) {
  60. p.ResponseCode(session, code.TeamIndexError)
  61. return
  62. }
  63. // 检测阵容位置是否正确
  64. if !constant.ValidateTeamMemberIndex(index) {
  65. p.ResponseCode(session, code.TeamLineupIndexError)
  66. return
  67. }
  68. // 获取英雄数据
  69. heroEntity, found := playerTable.GetHero(heroGUID)
  70. if !found {
  71. p.ResponseCode(session, code.HeroNotExist)
  72. return
  73. }
  74. if heroEntity.IsAlreadyTeamUp() {
  75. p.ResponseCode(session, code.TeamHeroAlreadyUp)
  76. return
  77. }
  78. if _, ok := data.HeroTeam.Get(teamID); !ok {
  79. p.ResponseCode(session, code.ConfigNotFound_HeroTeam)
  80. return
  81. }
  82. curTeam, ok := playerTable.Teams.GetTeam(teamID)
  83. if !ok {
  84. p.ResponseCode(session, code.TeamNotUnlock)
  85. return
  86. }
  87. if curTeam.IsNotStandby() {
  88. p.ResponseCode(session, code.TeamIsBusy)
  89. return
  90. }
  91. //检测是否存在相同英雄 过滤上阵位置英雄
  92. if team.Service().CheckTeamSameHero(playerTable, heroEntity.HeroID, 0, 0, teamID, teamIndex) {
  93. p.ResponseCode(session, code.TeamAlreadySameHero)
  94. return
  95. }
  96. updateHeros := []*dbMapPlayer.Hero{}
  97. // 先下阵旧的英雄 如果存在
  98. oldHero, errCode := team.Service().DoTeamLeave(playerTable, curTeam, teamIndex)
  99. if code.IsOK(errCode) && oldHero != nil {
  100. updateHeros = append(updateHeros, oldHero)
  101. }
  102. // 当前位置不存在英雄 判断上阵人数上限
  103. if curTeam.IsTeamMemberLimit() {
  104. p.ResponseCode(session, code.TeamMemberLimit)
  105. return
  106. }
  107. // 检测阵容位置是否存在英雄
  108. if curTeam.IsLineupMemberExist(index) {
  109. p.ResponseCode(session, code.TeamIndexHasHero)
  110. return
  111. }
  112. // 英雄上阵
  113. curTeam.NewAndAddTeamMember(heroGUID, teamIndex, index, heroEntity.InjuriesEndTime)
  114. // 重新刷新上阵英雄阵容位置
  115. team.Service().RefreshTeamLineup(playerTable, curTeam)
  116. // 更新队伍羁绊列表
  117. p.updateTeamFetterList(curTeam)
  118. heroEntity.TeamID = teamID
  119. playerTable.Save2Queue()
  120. updateHeros = append(updateHeros, heroEntity)
  121. // 推送英雄变化
  122. hero.Service().ChangePush(p.playerID, updateHeros...)
  123. proto := curTeam.ToProto()
  124. p.Response(session, &proto)
  125. // 同步到 redis 队伍信息
  126. team.Service().UpdatePlayerTeams(p.playerID, curTeam)
  127. p.PostEvent(event.NewTeamUp(p.playerID, teamID))
  128. }
  129. // teamLeave 英雄下阵
  130. func (p *actorPlayer) teamLeave(session *cproto.Session, req *pb.I32I32) {
  131. var (
  132. playerTable = db.GetMapPlayerTable(p.playerID)
  133. teamID, teamIndex = req.Key, req.Value
  134. )
  135. if playerTable == nil {
  136. p.ResponseCode(session, code.PlayerNotFound)
  137. return
  138. }
  139. curTeam, ok := playerTable.Teams.GetTeam(teamID)
  140. if !ok {
  141. p.ResponseCode(session, code.TeamNotUnlock)
  142. return
  143. }
  144. if curTeam.IsNotStandby() {
  145. p.ResponseCode(session, code.TeamIsBusy)
  146. return
  147. }
  148. //执行英雄下阵
  149. heroEntity, errCode := team.Service().DoTeamLeave(playerTable, curTeam, teamIndex)
  150. if code.IsFail(errCode) {
  151. p.ResponseCode(session, errCode)
  152. return
  153. }
  154. if heroEntity != nil {
  155. // 更新队伍羁绊列表
  156. p.updateTeamFetterList(curTeam)
  157. playerTable.Save2Queue()
  158. // 推送英雄变化
  159. hero.Service().ChangePush(p.playerID, heroEntity)
  160. // 同步到 redis 队伍信息
  161. team.Service().UpdatePlayerTeams(p.playerID, curTeam)
  162. }
  163. proto := curTeam.ToProto()
  164. p.Response(session, &proto)
  165. }
  166. // teamChange 英雄换阵
  167. func (p *actorPlayer) teamChange(session *cproto.Session, req *pb.TeamChangeRequest) {
  168. var (
  169. playerTable = db.GetMapPlayerTable(p.playerID)
  170. changeHeroes []*dbMapPlayer.Hero
  171. srcTeamID = req.SrcTeamID
  172. dstTeamID = req.DstTeamID
  173. srcTeamIndex = req.SrcTeamIndex
  174. dstTeamIndex = req.DstTeamIndex
  175. dstIndex = req.DstIndex
  176. )
  177. if srcTeamID == dstTeamID && srcTeamIndex == dstTeamIndex {
  178. p.ResponseCode(session, code.TeamIndexNotChange)
  179. return
  180. }
  181. //判断队伍位置是否合法
  182. if !constant.ValidateTeamMemberTeamIndex(srcTeamIndex, dstTeamIndex) {
  183. p.ResponseCode(session, code.TeamIndexError)
  184. return
  185. }
  186. // 判断队伍阵容位置是否合法
  187. if !constant.ValidateTeamMemberIndex(dstIndex) {
  188. p.ResponseCode(session, code.TeamLineupIndexError)
  189. return
  190. }
  191. srcTeam, ok := playerTable.Teams.GetTeam(srcTeamID)
  192. if !ok {
  193. p.ResponseCode(session, code.TeamNotUnlock)
  194. return
  195. }
  196. if srcTeam.IsNotStandby() {
  197. p.ResponseCode(session, code.TeamIsBusy)
  198. return
  199. }
  200. srcTeamMember, ok := srcTeam.GetTeamMember(srcTeamIndex)
  201. if !ok || srcTeamMember.HeroGUID == 0 {
  202. p.ResponseCode(session, code.HeroNotInTeam)
  203. return
  204. }
  205. srcHero, ok := playerTable.Heroes.Get(srcTeamMember.HeroGUID)
  206. if !ok {
  207. p.ResponseCode(session, code.HeroNotExist)
  208. return
  209. }
  210. dstTeam, ok := playerTable.Teams.GetTeam(dstTeamID)
  211. if !ok {
  212. p.ResponseCode(session, code.TeamNotUnlock)
  213. return
  214. }
  215. if dstTeam.IsNotStandby() {
  216. p.ResponseCode(session, code.TeamIsBusy)
  217. return
  218. }
  219. //不同队伍 检测是否上阵相同英雄
  220. if team.Service().CheckTeamSameHero(playerTable, srcHero.HeroID, srcTeamID, srcTeamIndex, dstTeamID, dstTeamIndex) {
  221. p.ResponseCode(session, code.TeamAlreadySameHero)
  222. return
  223. }
  224. // 被替换位置检测英雄下阵
  225. dstHero, errCode := team.Service().DoTeamLeave(playerTable, dstTeam, dstTeamIndex)
  226. if code.IsFail(errCode) {
  227. p.ResponseCode(session, errCode)
  228. return
  229. }
  230. if dstHero != nil {
  231. changeHeroes = append(changeHeroes, dstHero)
  232. }
  233. // 判断当前目标队伍是否达到队伍成员上限
  234. if srcTeamID != dstTeamID && dstTeam.IsTeamMemberLimit() {
  235. p.ResponseCode(session, code.TeamMemberLimit)
  236. return
  237. }
  238. // 判断目标队伍阵容位置是否存在英雄
  239. if dstTeam.IsLineupMemberExist(dstIndex) {
  240. p.ResponseCode(session, code.TeamIndexHasHero)
  241. return
  242. }
  243. srcTeam.DelTeamMember(srcTeamIndex)
  244. // 更新英雄所属队伍ID 换成目标队伍位置并添加到目标队伍中 删除原来队伍的位置数据
  245. srcHero.TeamID = dstTeamID
  246. srcTeamMember.TeamIndex = dstTeamIndex
  247. srcTeamMember.Index = dstIndex
  248. if dstHero != nil {
  249. srcTeamMember.InjureEndTime = dstHero.InjuriesEndTime
  250. }
  251. dstTeam.AddTeamMember(srcTeamMember)
  252. // 重新刷新上阵英雄阵容位置
  253. team.Service().RefreshTeamLineup(playerTable, dstTeam)
  254. // 更新源队伍&目标队伍羁绊列表
  255. p.updateTeamFetterList(srcTeam, dstTeam)
  256. playerTable.Save2Queue()
  257. changeHeroes = append(changeHeroes, srcHero)
  258. // 推送英雄变化
  259. hero.Service().ChangePush(p.playerID, changeHeroes...)
  260. // 同步队伍变更信息
  261. team.Service().ChangePush(p.playerID, srcTeam, dstTeam)
  262. // 同步到 redis 队伍信息
  263. team.Service().UpdatePlayerTeams(p.playerID, srcTeam, dstTeam)
  264. p.ResponseCode(session, code.OK)
  265. }
  266. // teamInnerChange 同队伍内换队伍位置
  267. func (p *actorPlayer) teamInnerChange(session *cproto.Session, req *pb.TeamInnerChangeRequest) {
  268. var (
  269. playerTable = db.GetMapPlayerTable(p.playerID)
  270. teamID = req.TeamID
  271. srcTeamIndex = req.SrcTeamIndex
  272. dstTeamIndex = req.DstTeamIndex
  273. )
  274. // 位置无变化
  275. if srcTeamIndex == dstTeamIndex {
  276. p.ResponseCode(session, code.TeamIndexNotChange)
  277. return
  278. }
  279. curTeam, found := playerTable.Teams.GetTeam(teamID)
  280. if !found {
  281. p.ResponseCode(session, code.TeamNotUnlock)
  282. return
  283. }
  284. if curTeam.IsNotStandby() {
  285. p.ResponseCode(session, code.TeamIsBusy)
  286. return
  287. }
  288. if !constant.ValidateTeamMemberTeamIndex(srcTeamIndex, dstTeamIndex) {
  289. p.ResponseCode(session, code.TeamIndexError)
  290. return
  291. }
  292. srcTeamMember, found := curTeam.GetTeamMember(srcTeamIndex)
  293. if !found {
  294. p.ResponseCode(session, code.HeroNotInTeam)
  295. return
  296. }
  297. srcHero, found := playerTable.Heroes.Get(srcTeamMember.HeroGUID)
  298. if !found {
  299. p.ResponseCode(session, code.HeroNotExist)
  300. return
  301. }
  302. changeHeroes := []*dbMapPlayer.Hero{srcHero}
  303. // 更换队伍位置
  304. dstTeamMember, found := curTeam.GetTeamMember(dstTeamIndex)
  305. if !found {
  306. srcTeamMember.TeamIndex = dstTeamIndex
  307. } else {
  308. dstHero, found := playerTable.Heroes.Get(dstTeamMember.HeroGUID)
  309. if !found {
  310. p.ResponseCode(session, code.HeroNotExist)
  311. return
  312. }
  313. srcTeamMember.TeamIndex, dstTeamMember.TeamIndex = dstTeamMember.TeamIndex, srcTeamMember.TeamIndex
  314. // 如果被替换的位置原来是主将位置, 则需要检测是否需要返还溢出兵力
  315. p.teamInnerChangeReturTroops(dstTeamMember, dstTeamIndex, srcTeamIndex)
  316. changeHeroes = append(changeHeroes, dstHero)
  317. }
  318. // 如果替换的位置原来是主将位置 则也需要返还溢出的兵力
  319. p.teamInnerChangeReturTroops(srcTeamMember, srcTeamIndex, dstTeamIndex)
  320. // 重新刷新上阵英雄阵容位置
  321. team.Service().RefreshTeamLineup(playerTable, curTeam)
  322. playerTable.Save2Queue()
  323. // 推送英雄变化
  324. hero.Service().ChangePush(p.playerID, changeHeroes...)
  325. // 同步到 redis 队伍信息
  326. team.Service().UpdatePlayerTeams(p.playerID, curTeam)
  327. proto := curTeam.ToProto()
  328. p.Response(session, &proto)
  329. }
  330. // 队伍内位置切换 如果原来位置是主将位置 当前位置不是主将位置 则返还溢出的兵力
  331. func (p *actorPlayer) teamInnerChangeReturTroops(teamMember *dbMapPlayer.TeamMember, srcTeamIndex, dstTeamIndex int32) {
  332. if !constant.IsTeamMainIndex(srcTeamIndex) {
  333. return
  334. }
  335. playerTable := db.GetMapPlayerTable(p.playerID)
  336. heroEntity, found := playerTable.Heroes.Get(teamMember.HeroGUID)
  337. if !found {
  338. p.Warn("teamInnerChangeReturTroops: hero not found, heroGUID: %d", teamMember.HeroGUID)
  339. return
  340. }
  341. curTroopsNumLimit := team.Service().GetHeroTroopsNum(p.playerID, heroEntity.HeroID, dstTeamIndex)
  342. diffTroopsNum := teamMember.TroopsNum - curTroopsNumLimit
  343. if diffTroopsNum <= 0 {
  344. return
  345. }
  346. teamMember.TroopsNum = curTroopsNumLimit
  347. // 返还兵力
  348. mapFacade.Storage.AssetAddOne(p.playerID, teamMember.TroopsID, int64(diffTroopsNum), ao.TeamInnerChangeReturn)
  349. }
  350. // teamLineup 英雄阵容设置
  351. func (p *actorPlayer) teamLineup(session *cproto.Session, req *pb.TeamLineupRequest) {
  352. var (
  353. playerTable = db.GetMapPlayerTable(p.playerID)
  354. teamID = req.TeamID
  355. index = req.Index
  356. toIndex = req.ToIndex
  357. )
  358. curTeam, ok := playerTable.Teams.GetTeam(teamID)
  359. if !ok {
  360. p.ResponseCode(session, code.TeamNotUnlock)
  361. return
  362. }
  363. //检测部队位置是否合法
  364. if !constant.ValidateTeamMemberIndex(index, toIndex) {
  365. p.ResponseCode(session, code.TeamIndexError)
  366. return
  367. }
  368. fromTeamMember, ok := curTeam.GetTeamMemberByIndex(index)
  369. if !ok || fromTeamMember.HeroGUID == 0 {
  370. p.ResponseCode(session, code.HeroNotInTeam)
  371. return
  372. }
  373. if fromTeamMember.Index == toIndex {
  374. p.ResponseCode(session, code.TeamIndexNotChange)
  375. return
  376. }
  377. //获取交换对象 如果原来位置存在英雄 则交换阵容位置 否则直接修改位置
  378. toTeamMember, found := curTeam.GetTeamMemberByIndex(toIndex)
  379. if found {
  380. //交换
  381. fromTeamMember.Index, toTeamMember.Index = toTeamMember.Index, fromTeamMember.Index
  382. } else {
  383. fromTeamMember.Index = toIndex
  384. }
  385. // 检测刷新阵容
  386. team.Service().RefreshTeamLineup(playerTable, curTeam)
  387. playerTable.Save2Queue()
  388. proto := curTeam.ToProto()
  389. p.Response(session, &proto)
  390. // TODO 后面如果阵容有加成也需要同步到 redis
  391. // team.Service().UpdatePlayerTeams(p.playerID, curTeam)
  392. }
  393. // teamTroops 队伍补兵
  394. func (p *actorPlayer) teamTroops(session *cproto.Session, req *pb.TeamTroopsRequest) {
  395. var (
  396. playerTable = db.GetMapPlayerTable(p.playerID)
  397. memberTroops = req.MemberTroops
  398. )
  399. if len(memberTroops) <= 0 {
  400. p.ResponseCode(session, code.IllegalArgument)
  401. return
  402. }
  403. curTeam, ok := playerTable.Teams.GetTeam(req.TeamID)
  404. if !ok {
  405. p.ResponseCode(session, code.TeamNotUnlock)
  406. return
  407. }
  408. if curTeam.IsNotStandby() {
  409. p.ResponseCode(session, code.TeamIsBusy)
  410. return
  411. }
  412. // 分兵等级分组 key : 士兵ID value: 成员队伍位置 value 分兵数量
  413. groupMemberTroopMap, errCode := p.groupTroops(memberTroops)
  414. if code.IsFail(errCode) {
  415. p.ResponseCode(session, errCode)
  416. return
  417. }
  418. var (
  419. // 最终统兵情况 key: 队伍位置 value: key: 士兵ID 士兵等级表ID value: 分兵数量
  420. finalMemberTroops = map[int32]*pb.I32I32{}
  421. costAssets = types.Assets{}
  422. )
  423. for troopsID, troopsMap := range groupMemberTroopMap {
  424. _, found := data.ArmLevel.GetByID(troopsID)
  425. if !found {
  426. p.ResponseCode(session, code.ConfigNotExist_Conscript)
  427. return
  428. }
  429. // 获取最终分兵情况&消耗士兵数量
  430. costTroopsNum := p.GetFinalTeamTroopNum(curTeam, troopsID, troopsMap, finalMemberTroops)
  431. if costTroopsNum <= 0 {
  432. p.ResponseCode(session, code.TeamArmExceed)
  433. return
  434. }
  435. costAssets.Add(troopsID, int64(costTroopsNum))
  436. }
  437. // 消耗士兵
  438. _, errCode = mapFacade.Storage.AssetSubs(p.playerID, costAssets, ao.TeamTroopsCost)
  439. if code.IsFail(errCode) {
  440. p.ResponseCode(session, errCode)
  441. return
  442. }
  443. // 返还&重置英雄原带兵数量&更新英雄带兵ID
  444. p.returnAndResetTeamMemberTroopsNum(curTeam, groupMemberTroopMap)
  445. // 更新队伍上阵英雄带兵数量
  446. curTeam.UpdateTeamMemberTroopsNum(finalMemberTroops)
  447. playerTable.Save2Queue()
  448. // 同步到 redis 队伍信息
  449. team.Service().UpdatePlayerTeams(p.playerID, curTeam)
  450. proto := curTeam.ToProto()
  451. p.Response(session, &proto)
  452. // 发送分兵事件
  453. p.PostEvent(event.NewTeamTroops(p.playerID, curTeam.TeamID))
  454. }
  455. // teamAutoTroops 自动补兵设置
  456. func (p *actorPlayer) teamAutoTroops(session *cproto.Session, req *pb.I32) {
  457. var (
  458. playerTable = db.GetMapPlayerTable(p.playerID)
  459. teamID = req.Value
  460. )
  461. team, ok := playerTable.Teams.GetTeam(teamID)
  462. if !ok {
  463. p.ResponseCode(session, code.TeamNotUnlock)
  464. return
  465. }
  466. team.AutoAddTroops = !team.AutoAddTroops
  467. playerTable.Save2Queue()
  468. p.ResponseCode(session, code.OK)
  469. }
  470. // 分兵分组 key: 士兵ID value: 队伍阵容位置 value 分兵数量
  471. func (p *actorPlayer) groupTroops(memberTroops []*pb.TeamMemberTroops) (map[int32]map[int32]int32, int32) {
  472. memberTroopMap := map[int32]map[int32]int32{}
  473. for _, memberTroop := range memberTroops {
  474. // 检测队伍位置是否正确
  475. if !constant.ValidateTeamMemberTeamIndex(memberTroop.TeamIndex) {
  476. return nil, code.TeamIndexError
  477. }
  478. if memberTroop.TroopsNum <= 0 {
  479. return nil, code.TeamTroopsNumError
  480. }
  481. troopsMap, exist := memberTroopMap[memberTroop.TroopsID]
  482. if !exist {
  483. troopsMap = map[int32]int32{}
  484. memberTroopMap[memberTroop.TroopsID] = troopsMap
  485. }
  486. troopsMap[memberTroop.TeamIndex] = memberTroop.TroopsNum
  487. }
  488. return memberTroopMap, code.OK
  489. }
  490. // 获取队伍最终分兵数
  491. func (p *actorPlayer) GetFinalTeamTroopNum(curTeam *dbMapPlayer.Team, troopsID int32, memberTroops map[int32]int32, finalMemberTroops map[int32]*pb.I32I32) int32 {
  492. var (
  493. playerTable = db.GetMapPlayerTable(p.playerID)
  494. costTroopsNum int32
  495. curTroopNum int32
  496. finalAddTroopsNum int32
  497. )
  498. for teamIndex, addTroopNum := range memberTroops {
  499. if addTroopNum < 1 {
  500. continue
  501. }
  502. member, ok := curTeam.GetTeamMember(teamIndex)
  503. if !ok {
  504. continue
  505. }
  506. // 当前带兵数
  507. curTroopNum = member.TroopsNum
  508. finalAddTroopsNum = addTroopNum
  509. // 切换士兵等级 最终会返还英雄当前带兵数量
  510. if troopsID != member.TroopsID {
  511. curTroopNum = 0
  512. }
  513. heroEntity, found := playerTable.Heroes.Get(member.HeroGUID)
  514. if !found {
  515. p.Warn("GetFinalTeamTroopNum hero not found, heroGUID: %d", member.HeroGUID)
  516. continue
  517. }
  518. // 获取英雄带兵上限
  519. heroArmsLimit := team.Service().GetHeroTroopsNum(p.playerID, heroEntity.HeroID, member.TeamIndex)
  520. if curTroopNum+finalAddTroopsNum > heroArmsLimit {
  521. finalAddTroopsNum = heroArmsLimit - curTroopNum
  522. }
  523. costTroopsNum += finalAddTroopsNum
  524. data := pb.I32I32{
  525. Key: troopsID,
  526. Value: finalAddTroopsNum,
  527. }
  528. finalMemberTroops[teamIndex] = &data
  529. }
  530. return costTroopsNum
  531. }
  532. // 更新队伍士兵ID(士兵-等级表士兵ID)
  533. func (p *actorPlayer) updateTeamMemberTroopsID(teamMember *dbMapPlayer.TeamMember, level int32) {
  534. playerTable := db.GetMapPlayerTable(p.playerID)
  535. hero, found := playerTable.Heroes.Get(teamMember.HeroGUID)
  536. if !found {
  537. p.Warn("updateTeamMemberTroopsID hero not found, heroGUID: %d", teamMember.HeroGUID)
  538. return
  539. }
  540. heroRow, found := data.Hero.GetByID(hero.HeroID)
  541. if !found {
  542. p.Warn("updateTeamMemberTroopsID hero not found, heroID: %d", hero.HeroID)
  543. return
  544. }
  545. armLevelRow, found := data.ArmType.GetByTypeLevel(heroRow.Job, level)
  546. if !found {
  547. p.Warn("updateTeamMemberTroopsID hero not found, heroID: %d, job: %d, level: %d", hero.HeroID, heroRow.Job, level)
  548. return
  549. }
  550. teamMember.TroopTypeID = armLevelRow.ID
  551. }
  552. // 返还队伍兵力&重置英雄带兵数量&更新上阵英雄兵种ID
  553. func (p *actorPlayer) returnAndResetTeamMemberTroopsNum(team *dbMapPlayer.Team, groupMemberTroops map[int32]map[int32]int32) {
  554. if len(groupMemberTroops) <= 0 {
  555. return
  556. }
  557. returnAssets := types.Assets{}
  558. for troopsID, troopsMap := range groupMemberTroops {
  559. armLevelRow, exist := data.ArmLevel.GetByID(troopsID)
  560. for teamIndex := range troopsMap {
  561. teamMember, found := team.GetTeamMember(teamIndex)
  562. // 上阵英雄带兵ID改变 重置当前带兵数量&更新兵种ID
  563. if found && troopsID != teamMember.TroopsID {
  564. // 原来是否带兵 有兵返还 无兵不返还
  565. if teamMember.TroopsID != 0 && teamMember.TroopsNum > 0 {
  566. returnAssets.Add(teamMember.TroopsID, int64(teamMember.TroopsNum))
  567. teamMember.TroopsNum = 0
  568. }
  569. // 更新英雄兵种ID
  570. if exist {
  571. p.updateTeamMemberTroopsID(teamMember, armLevelRow.Level)
  572. }
  573. }
  574. }
  575. }
  576. // 返还下阵士兵
  577. if len(returnAssets) > 0 {
  578. _, errCode := mapFacade.Storage.AssetAdds(p.playerID, returnAssets, ao.TeamUpdateTroopsReturn)
  579. if code.IsFail(errCode) {
  580. p.Warn("returnAndResetTeamMemberTroopsNum error, teamID: %d, returnAssets: %v, errCode: %d", team.TeamID, returnAssets, errCode)
  581. }
  582. push := &pb.AssetList{
  583. List: returnAssets.ToProto(),
  584. }
  585. // 推送返还兵力
  586. sessions.PushPlayer(p.playerID, nameRoute.PushMapPlayer_TeamTroopReturn, push)
  587. }
  588. }
  589. func (p *actorPlayer) updateTeamState(req *pb.I32I32) {
  590. teamID := req.Key
  591. state := enum.TeamState(req.Value)
  592. playerTable := db.GetMapPlayerTable(p.playerID)
  593. if playerTable == nil {
  594. return
  595. }
  596. dbTeam, ok := playerTable.Teams.GetTeam(teamID)
  597. if !ok {
  598. return
  599. }
  600. // 更新队伍状态
  601. team.Service().UpdateTeamState(playerTable, dbTeam, state)
  602. }
  603. // 战败设置部队重伤
  604. func (p *actorPlayer) setTeamInjury(req *pb.I32I64) {
  605. var (
  606. playerID = p.playerID
  607. playerTable = db.GetMapPlayerTable(playerID)
  608. teamID, injuriesEndTime = req.Key, req.Value
  609. )
  610. p.Debug("[setTeamInjury] playerID = %d, teamID = %d, injuriesEndTime = %s", playerID, teamID, times.SecondToDatetimeFormat(injuriesEndTime))
  611. team, ok := playerTable.Teams.GetTeam(teamID)
  612. if !ok {
  613. p.Warn("[setTeamInjury] team not exist: playerID = %d, teamID = %d", playerID, teamID)
  614. return
  615. }
  616. resp := &pb.HeroStateResponse{}
  617. for _, member := range team.Members {
  618. // 恢复受伤的士兵
  619. if member.InjureTroops > 0 {
  620. member.TroopsNum += member.InjureTroops
  621. // 重置伤兵数
  622. member.InjureTroops = 0
  623. }
  624. hero, ok := playerTable.Heroes.Get(member.HeroGUID)
  625. if !ok {
  626. continue
  627. }
  628. hero.InjuriesEndTime = injuriesEndTime
  629. member.InjureEndTime = injuriesEndTime
  630. resp.HeroState = append(resp.HeroState, hero.ToHeroStateProto())
  631. }
  632. playerTable.Save2Queue()
  633. // 同步到march
  634. mapCall.Logic.MarchSyncInjure(team.MarchObjectID, injuriesEndTime)
  635. // 推送给客户端
  636. sessions.PushPlayer(playerID, nameRoute.PushMapPlayer_HeroState, resp)
  637. p.Debug("[setTeamInjury] teamID = %d, endTime = %s", teamID, times.MillisToDatetimeFormat(injuriesEndTime))
  638. }
  639. // 更新队伍羁绊列表
  640. func (p *actorPlayer) updateTeamFetterList(updateTeams ...*dbMapPlayer.Team) {
  641. if len(updateTeams) < 1 {
  642. return
  643. }
  644. playerTable := db.GetMapPlayerTable(p.playerID)
  645. for _, curTeam := range updateTeams {
  646. if len(curTeam.Members) < 1 {
  647. curTeam.FetterIDs.Clear()
  648. continue
  649. }
  650. // 获取英雄列表
  651. heroIDSet := types.Set[int32]{}
  652. for _, member := range curTeam.Members {
  653. curHeroEntity, found := playerTable.Heroes.Get(member.HeroGUID)
  654. if found {
  655. heroIDSet.Add(curHeroEntity.HeroID)
  656. }
  657. }
  658. // 刷新队伍羁绊
  659. fetterIDs := team.Service().GetFetterListByHeroList(p.playerID, heroIDSet)
  660. curTeam.FetterIDs = fetterIDs
  661. // 给部队的成员计算羁绊属性
  662. team.Service().TeamFetterAttrs(curTeam, playerTable.Heroes)
  663. }
  664. }
  665. // 使用药品
  666. func (p *actorPlayer) useMedicine(req *pb.I32I32) int32 {
  667. var (
  668. playerTable = db.GetMapPlayerTable(p.playerID)
  669. teamID = req.Key
  670. medicineID = req.Value
  671. )
  672. medicineRow, found := data.ItemMedicine.GetByMedicineID(medicineID)
  673. if !found {
  674. return code.ConfigNotFound_Medicine
  675. }
  676. curTeam, found := playerTable.Teams.GetTeam(teamID)
  677. if !found {
  678. return code.MapTeamNotFound
  679. }
  680. errCode := code.ItemUseTypeError
  681. switch medicineRow.UseType {
  682. case enum.MedicineType_Energy:
  683. // 使用体力药
  684. errCode = p.useEnergyMedicine(playerTable, curTeam, medicineRow)
  685. case enum.MedicineType_Troops:
  686. // 使用补兵药
  687. errCode = p.useTroopsMedicine(playerTable, curTeam, medicineRow)
  688. case enum.MedicineType_Injured:
  689. // 使用重伤药
  690. errCode = p.useInjuredMedicine(playerTable, curTeam)
  691. }
  692. if code.IsFail(errCode) {
  693. return errCode
  694. }
  695. // 推送队伍数据变更
  696. team.Service().ChangePush(p.playerID, curTeam)
  697. return code.OK
  698. }
  699. // 使用体力药
  700. func (p *actorPlayer) useEnergyMedicine(playerTable *db.MapPlayerTable, team *dbMapPlayer.Team, medicineRow *data.ItemMedicineRow) int32 {
  701. var (
  702. addEnergy = medicineRow.Value
  703. heroEnergyLimit = data.Const.HeroEnergy
  704. updateHeros = []*dbMapPlayer.Hero{}
  705. )
  706. // 检测是否能添加体力
  707. for _, member := range team.Members {
  708. dbHero, found := playerTable.Heroes.Get(member.HeroGUID)
  709. if !found {
  710. return code.HeroNotExist
  711. }
  712. if dbHero.Energy+addEnergy > heroEnergyLimit {
  713. return code.HeroEnergyOverflow
  714. }
  715. updateHeros = append(updateHeros, dbHero)
  716. }
  717. // 如果不存在可以恢复的英雄,则不进行恢复
  718. if len(updateHeros) < 1 {
  719. return code.HeroNotNeedRecovery
  720. }
  721. // 增加体力
  722. for _, dbHero := range updateHeros {
  723. hero.Service().AddEnergy(playerTable, dbHero, addEnergy)
  724. }
  725. // 保存英雄数据
  726. playerTable.Save2Queue()
  727. return code.OK
  728. }
  729. // 使用补兵药
  730. func (p *actorPlayer) useTroopsMedicine(playerTable *db.MapPlayerTable, curTeam *dbMapPlayer.Team, medicineRow *data.ItemMedicineRow) int32 {
  731. var (
  732. addTroops = medicineRow.Value
  733. update = false
  734. marchTroops []*pb.MarchTroops
  735. )
  736. // 城外征兵中 无法使用补兵药
  737. if curTeam.IsOutsideTroops() {
  738. return code.TeamOutsideTroops
  739. }
  740. for _, member := range curTeam.Members {
  741. heroEntity, found := playerTable.Heroes.Get(member.HeroGUID)
  742. if !found {
  743. return code.HeroNotExist
  744. }
  745. // 当前英雄带兵上限
  746. heroTroopsLimit := team.Service().GetHeroTroopsNum(p.playerID, heroEntity.HeroID, member.TeamIndex)
  747. // 超出上限跳过
  748. if member.TroopsNum >= heroTroopsLimit {
  749. continue
  750. }
  751. // 执行补兵 超出上限直接销毁
  752. // 计算实际可以补兵的数量
  753. add := min(addTroops, heroTroopsLimit-member.TroopsNum)
  754. member.TroopsNum += add
  755. marchTroops = append(marchTroops, &pb.MarchTroops{
  756. TeamIndex: member.TeamIndex,
  757. TroopsNum: add,
  758. })
  759. update = true
  760. }
  761. // 不需要补兵
  762. if !update {
  763. return code.TeamNotNeedAddTroops
  764. }
  765. playerTable.Save2Queue()
  766. // 更新地图队伍兵力数据
  767. mapCall.Logic.MarchSyncTroops(curTeam.TeamID, curTeam.MarchObjectID, marchTroops)
  768. // 同步队伍兵力
  769. team.Service().UpdatePlayerTeams(p.playerID, curTeam)
  770. // 推送队伍信息变更
  771. team.Service().ChangePush(p.playerID, curTeam)
  772. return code.OK
  773. }
  774. // 使用重伤药
  775. func (p *actorPlayer) useInjuredMedicine(playerTable *db.MapPlayerTable, curTeam *dbMapPlayer.Team) int32 {
  776. // 判断队伍当前状态
  777. if curTeam.IsNotStandby() {
  778. return code.TeamIsBusy
  779. }
  780. var (
  781. curTime = ctime.Now().ToSecond()
  782. updateHeros = []*dbMapPlayer.Hero{}
  783. )
  784. for _, member := range curTeam.Members {
  785. hero, found := playerTable.Heroes.Get(member.HeroGUID)
  786. if !found {
  787. return code.HeroNotExist
  788. }
  789. if curTime < hero.InjuriesEndTime {
  790. updateHeros = append(updateHeros, hero)
  791. }
  792. }
  793. if len(updateHeros) < 1 {
  794. return code.HeroNotNeedRecovery
  795. }
  796. for _, hero := range updateHeros {
  797. hero.InjuriesEndTime = 0
  798. }
  799. // 保存英雄数据
  800. playerTable.Save2Queue()
  801. if len(playerTable.NodeID) > 0 {
  802. // 同步地图队伍数据
  803. mapCall.Logic.MarchSyncInjure(curTeam.MarchObjectID, 0)
  804. }
  805. // 通知客户端更新
  806. team.Service().HeroStateChangePush(p.playerID, updateHeros...)
  807. return code.OK
  808. }
  809. // 战斗后执行扣除的兵力 增量扣除
  810. func (p *actorPlayer) subTeamTroopsNum(req *pb.TeamBattleDamage) {
  811. playerTable := db.GetMapPlayerTable(p.playerID)
  812. dbTeam, found := playerTable.Teams.GetTeam(req.TeamID)
  813. if !found {
  814. return
  815. }
  816. for _, battleTeamMember := range req.Members {
  817. teamMember, found := dbTeam.GetTeamMember(battleTeamMember.TeamIndex)
  818. if !found {
  819. p.Warn("subTeamTroopsNum teamMember not found. teamIndex: %d, troopsNum: %d, soldierNum: %d, teamID: %d",
  820. battleTeamMember.TeamIndex, battleTeamMember.TroopsNum, battleTeamMember.SoldierNum, req.TeamID)
  821. continue
  822. }
  823. // 战损兵力
  824. troopsDamage := max(0, battleTeamMember.TroopsNum-battleTeamMember.SoldierNum)
  825. teamMember.TroopsNum = max(0, teamMember.TroopsNum-troopsDamage)
  826. // 根据战损计算伤兵,回城\调度点\营帐再恢复伤兵
  827. diedNum := troopsDamage * data.Const.MapBattleLossTroops / constant.RatioBase
  828. injureNum := max(0, troopsDamage-diedNum)
  829. teamMember.InjureTroops += injureNum
  830. }
  831. playerTable.Save2Queue()
  832. // 兵力同步到redis
  833. team.Service().UpdatePlayerTeams(p.playerID, dbTeam)
  834. // 同步兵力给客户端
  835. team.Service().ChangePush(p.playerID, dbTeam)
  836. }
  837. func (p *actorPlayer) GetHero(playerTable *db.MapPlayerTable, heroGUID int64) (*dbMapPlayer.Hero, int32) {
  838. hero, ok := playerTable.Heroes.Get(heroGUID)
  839. if ok {
  840. return hero, code.OK
  841. }
  842. heroMap := redis.Game.GetPlayerHeros(p.playerID, heroGUID)
  843. if len(heroMap) > 0 {
  844. hero, found := heroMap[heroGUID]
  845. if !found {
  846. return nil, code.HeroNotExist
  847. }
  848. newHero := &dbMapPlayer.Hero{
  849. GUID: hero.Id,
  850. HeroID: hero.ConfigID,
  851. }
  852. playerTable.Heroes.Add(newHero)
  853. return newHero, code.OK
  854. }
  855. return nil, code.HeroNotExist
  856. }
  857. // 城外征兵
  858. func (p *actorPlayer) teamOutsideTroops(session *cproto.Session, req *pb.TeamOutsideTroops) {
  859. var (
  860. teamID = req.TeamID
  861. troopNums = req.TroopsNums
  862. playerTable = db.GetMapPlayerTable(p.playerID)
  863. )
  864. curTeam, found := playerTable.Teams.GetTeam(teamID)
  865. if !found {
  866. p.ResponseCode(session, code.TeamNotUnlock)
  867. return
  868. }
  869. // 不可以征兵
  870. if !curTeam.CanOutsideTroops {
  871. p.ResponseCode(session, code.TeamIsBusy)
  872. return
  873. }
  874. // 执行城外征兵
  875. errCode := team.Service().DoTeamOutsideTroops(p.playerID, curTeam, troopNums)
  876. if code.IsFail(errCode) {
  877. p.ResponseCode(session, errCode)
  878. return
  879. }
  880. playerTable.Save2Queue()
  881. resp := curTeam.ToOutsideTroopsProto()
  882. p.Response(session, resp)
  883. }
  884. // 城外取消征兵
  885. func (p *actorPlayer) teamOutsideTroopsCancel(session *cproto.Session, req *pb.TeamOutsideTroopsCancel) {
  886. var (
  887. teamID = req.TeamID
  888. teamIndexs = req.TeamIndexs
  889. playerTable = db.GetMapPlayerTable(p.playerID)
  890. )
  891. if len(teamIndexs) <= 0 {
  892. p.ResponseCode(session, code.IllegalArgument)
  893. return
  894. }
  895. curTeam, found := playerTable.Teams.GetTeam(teamID)
  896. if !found {
  897. p.ResponseCode(session, code.TeamNotUnlock)
  898. return
  899. }
  900. // 取消城外征兵
  901. errCode := team.Service().TeamOutsideTroopsCancel(playerTable, curTeam, teamIndexs)
  902. if code.IsFail(errCode) {
  903. p.ResponseCode(session, errCode)
  904. return
  905. }
  906. playerTable.Save2Queue()
  907. resp := curTeam.ToOutsideTroopsProto()
  908. p.Response(session, resp)
  909. }
  910. // 设置城外自动征兵
  911. func (p *actorPlayer) teamOutsideAutoTroopsSet(session *cproto.Session, req *pb.I32) {
  912. teamID := req.Value
  913. playerTable := db.GetMapPlayerTable(p.playerID)
  914. team, found := playerTable.Teams.GetTeam(teamID)
  915. if !found {
  916. p.ResponseCode(session, code.TeamNotUnlock)
  917. return
  918. }
  919. team.IsAutoTroops = !team.IsAutoTroops
  920. playerTable.Save2Queue()
  921. resp := &pb.I32Bool{Key: teamID, Value: team.IsAutoTroops}
  922. p.Response(session, resp)
  923. }
  924. // 行军取消城外征兵
  925. func (p *actorPlayer) marchOutsideTroopsCancel(playerTable *db.MapPlayerTable, curTeam *dbMapPlayer.Team) {
  926. // 取消城外征兵
  927. errCode := team.Service().TeamOutsideTroopsCancel(playerTable, curTeam, curTeam.GetTeamIndexs())
  928. if code.IsFail(errCode) {
  929. return
  930. }
  931. // 去掉可征兵标识
  932. curTeam.CanOutsideTroops = false
  933. playerTable.Save2Queue()
  934. // 通知客户端取消城外征兵
  935. team.Service().TeamOutsideTroopsChangePush(playerTable.PlayerID, curTeam)
  936. }
  937. func (p *actorPlayer) marchArrive(eventData cfacade.IEventData) {
  938. e, ok := eventData.(*event.MarchArrive)
  939. if !ok {
  940. return
  941. }
  942. d := e.Data()
  943. playerTable := db.GetMapPlayerTable(p.playerID)
  944. if playerTable == nil {
  945. p.Warn("[marchArrive] fail, playerTable not found. playerID:%d, eventData: %v", p.playerID, eventData)
  946. return
  947. }
  948. dbTeam, found := playerTable.Teams.GetTeam(d.TeamID)
  949. if !found {
  950. p.Warn("[marchArrive] fail, team not found. playerID:%d, eventData: %v", p.playerID, eventData)
  951. return
  952. }
  953. // 如果部队是调动|待命,回复伤兵
  954. if d.MarchState == enum.MarchState_Redeploy || d.MarchState == enum.MarchState_Standby {
  955. // 回复伤兵
  956. team.Service().RecoveryInjureTroops(playerTable, dbTeam)
  957. }
  958. // 如果是调动,检查是否可以自动征兵
  959. if d.MarchState == enum.MarchState_Redeploy {
  960. // 检查调动的建筑是否可以自动征兵
  961. canOutsideConscript := team.Service().CheckCanOusideConscript(playerTable.PlayerID, d.TargetConfigID)
  962. if !canOutsideConscript {
  963. return
  964. }
  965. // 设置当前可以自动征兵检测
  966. dbTeam.CanOutsideTroops = true
  967. // 开启自动征兵状态
  968. if dbTeam.IsAutoTroops {
  969. team.Service().OutsideAutoTroops(playerTable, dbTeam)
  970. }
  971. playerTable.Save2Queue()
  972. }
  973. }
  974. // 刷新队伍
  975. func (p *actorPlayer) onFacilityUpRefreshTeam(c cfacade.IEventData) {
  976. var (
  977. playerTable = db.GetMapPlayerTable(p.playerID)
  978. updateTeams = []*dbMapPlayer.Team{}
  979. )
  980. teamCount := playerTable.Facilities.Attrs.GetI32(enum.AttrTeamCount)
  981. for i := int32(1); i <= teamCount; i++ {
  982. team, success := playerTable.Teams.AddTeam(i)
  983. if success {
  984. updateTeams = append(updateTeams, team)
  985. playerTable.SetChangeData()
  986. }
  987. }
  988. if len(updateTeams) > 0 {
  989. team.Service().ChangePush(p.playerID, updateTeams...)
  990. }
  991. }
  992. func (p *actorPlayer) updateTeam(req *pb.UpdateTeam) {
  993. playerTable := db.GetMapPlayerTable(p.playerID)
  994. dbTeam, ok := playerTable.Teams.GetTeam(req.TeamID)
  995. if !ok {
  996. p.Warn("[updateTeam] fail, team not found. playerID:%d, req: %+v", p.playerID, req)
  997. return
  998. }
  999. p.Debug("[updateTeam] req: %+v", req)
  1000. switch enum.TeamUpdateType(req.TeamUpdateType) {
  1001. case enum.TeamUpdate_Redeploy:
  1002. {
  1003. dbTeam.RedeployObject.Set(req.RedeployObjectID, enum.ObjectType(req.RedeployObjectType))
  1004. playerTable.SetChangeData()
  1005. }
  1006. }
  1007. }