player_team.go 33 KB

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