map_role.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. package model
  2. import (
  3. "rocommon/util"
  4. "roserver/baseserver/aoi"
  5. "roserver/baseserver/model"
  6. "roserver/serverproto"
  7. )
  8. type MapRole struct {
  9. uid uint64
  10. cliID model.ClientID //gate
  11. selfObj *aoi.AoiObject
  12. pos serverproto.Position
  13. targetPos serverproto.Position
  14. ownerUid uint64
  15. isHide bool
  16. unitType int32
  17. aoiMap *AoiMap
  18. //测试发送全量移动数据
  19. bTestSend bool
  20. showInfo *serverproto.PlayerShowInfo
  21. IsMaster bool
  22. }
  23. func newMapRole(uid uint64, position *serverproto.Position, aoiMap *AoiMap, ownerUid uint64) *MapRole {
  24. mapRole := &MapRole{
  25. uid: uid,
  26. ownerUid: ownerUid,
  27. selfObj: nil,
  28. bTestSend: false,
  29. aoiMap: aoiMap,
  30. showInfo: &serverproto.PlayerShowInfo{},
  31. }
  32. mapRole.pos = *position
  33. return mapRole
  34. }
  35. func (this *MapRole) isSummon() bool {
  36. return this.ownerUid > 0
  37. }
  38. //todo
  39. // gate消息需要合并
  40. func (this *MapRole) syncSurrounding() {
  41. //ghost只更新坐标位置,不发送消息
  42. if !this.IsMaster {
  43. return
  44. }
  45. //通知其他玩家
  46. enterOtherNtfMsg := &serverproto.SCPlayerEnterNtf{}
  47. enterOtherNtfMsg.Players = append(enterOtherNtfMsg.Players,
  48. &serverproto.Player{Uid: this.uid,
  49. Pos: &serverproto.Position{X: this.pos.X, Y: this.pos.Y, Z: this.pos.Z},
  50. UType: this.unitType})
  51. //通知自己
  52. enterSelfNtfMsg := &serverproto.SCPlayerEnterNtf{}
  53. var serverUidList = map[string][]uint64{}
  54. //通知别的玩家显示当前玩家
  55. for _, data := range this.selfObj.AoiInfo.EnterSet.List() {
  56. if data.(uint64) == this.uid {
  57. continue
  58. }
  59. otherRole := this.aoiMap.getPlayer(data.(uint64))
  60. if otherRole == nil {
  61. continue
  62. }
  63. //判断当前别的玩家的移动列表中的人数是否超过上限
  64. if !otherRole.selfObj.AoiInfo.MoveNoNtfSet.Has(this.uid) && !otherRole.isSummon() {
  65. //todo...这边可以对相同的消息做缓存处理
  66. //todo... 如果otherRole在同一个gate可以通过压缩的方式来提升效率
  67. //otherRole.SendGate(enterOtherNtfMsg)
  68. //添加到同服务器列表中
  69. serviceID := otherRole.cliID.ServiceID
  70. serverUidList[serviceID] = append(serverUidList[serviceID], otherRole.cliID.SessID)
  71. if len(serverUidList[serviceID]) >= MAX_SEND_NUM {
  72. this.SendGate(enterOtherNtfMsg, serverUidList[serviceID], true)
  73. serverUidList[serviceID] = []uint64{}
  74. }
  75. }
  76. //判断召唤物对自己是否可见
  77. if otherRole.isHide {
  78. if otherRole.ownerUid == this.uid {
  79. enterSelfNtfMsg.Players = append(enterSelfNtfMsg.Players, &serverproto.Player{
  80. Uid: otherRole.uid,
  81. Pos: &otherRole.pos,
  82. UType: otherRole.unitType,
  83. })
  84. }
  85. } else {
  86. enterSelfNtfMsg.Players = append(enterSelfNtfMsg.Players, &serverproto.Player{
  87. Uid: otherRole.uid,
  88. Pos: &otherRole.pos,
  89. UType: otherRole.unitType,
  90. })
  91. }
  92. //通知自己显示别的玩家
  93. if len(enterSelfNtfMsg.Players) >= MAX_SEND_NUM {
  94. this.SendGate(enterSelfNtfMsg, nil, true)
  95. enterSelfNtfMsg.Players = enterSelfNtfMsg.Players[0:0]
  96. }
  97. }
  98. //剩余未发送部分处理
  99. for key, _ := range serverUidList {
  100. if len(serverUidList[key]) > 0 && key != "" {
  101. SendGate(key, enterOtherNtfMsg, serverUidList[key], true)
  102. }
  103. }
  104. //通知自己显示别的玩家
  105. if len(enterSelfNtfMsg.Players) > 0 {
  106. this.SendGate(enterSelfNtfMsg, nil, true)
  107. }
  108. }
  109. func (this *MapRole) summonSyncSurrounding() {
  110. //通知其他玩家
  111. enterOtherNtfMsg := &serverproto.SCPlayerEnterNtf{}
  112. enterOtherNtfMsg.Players = append(enterOtherNtfMsg.Players,
  113. &serverproto.Player{Uid: this.uid,
  114. Pos: &serverproto.Position{X: this.pos.X, Y: this.pos.Y, Z: this.pos.Z},
  115. UType: this.unitType})
  116. var serverUidList = map[string][]uint64{}
  117. //通知别的玩家显示当前玩家
  118. for _, data := range this.selfObj.AoiInfo.MoveSet.List() {
  119. if data.(uint64) == this.uid {
  120. continue
  121. }
  122. otherRole := this.aoiMap.getPlayer(data.(uint64))
  123. if otherRole == nil {
  124. continue
  125. }
  126. //判断当前别的玩家的移动列表中的人数是否超过上限
  127. if !otherRole.selfObj.AoiInfo.MoveNoNtfSet.Has(this.uid) && !otherRole.isSummon() {
  128. //todo...这边可以对相同的消息做缓存处理
  129. //todo... 如果otherRole在同一个gate可以通过压缩的方式来提升效率
  130. //otherRole.SendGate(enterOtherNtfMsg)
  131. //添加到同服务器列表中
  132. serviceID := otherRole.cliID.ServiceID
  133. serverUidList[serviceID] = append(serverUidList[serviceID], otherRole.cliID.SessID)
  134. if len(serverUidList[serviceID]) >= MAX_SEND_NUM {
  135. this.SendGate(enterOtherNtfMsg, serverUidList[serviceID], true)
  136. serverUidList[serviceID] = []uint64{}
  137. }
  138. }
  139. }
  140. //剩余未发送部分处理
  141. for key, _ := range serverUidList {
  142. if len(serverUidList[key]) > 0 && key != "" {
  143. SendGate(key, enterOtherNtfMsg, serverUidList[key], true)
  144. }
  145. }
  146. }
  147. //可见状态变更处理
  148. func (this *MapRole) summonVisibleSyncSurrounding() {
  149. //通知其他玩家
  150. var ntfMsg interface{} = nil
  151. if this.isHide {
  152. ntfMsg = &serverproto.SCPlayerLeaveNtf{}
  153. ntfMsg.(*serverproto.SCPlayerLeaveNtf).Players = append(ntfMsg.(*serverproto.SCPlayerLeaveNtf).Players,
  154. &serverproto.Player{Uid: this.uid, Pos: &serverproto.Position{X: this.pos.X, Y: this.pos.Y, Z: this.pos.Z}, UType: this.unitType})
  155. } else {
  156. ntfMsg = &serverproto.SCPlayerEnterNtf{}
  157. ntfMsg.(*serverproto.SCPlayerEnterNtf).Players = append(ntfMsg.(*serverproto.SCPlayerEnterNtf).Players,
  158. &serverproto.Player{Uid: this.uid,
  159. Pos: &serverproto.Position{X: this.pos.X, Y: this.pos.Y, Z: this.pos.Z},
  160. UType: this.unitType})
  161. }
  162. var serverUidList = map[string][]uint64{}
  163. //通知别的玩家显示当前玩家
  164. for _, data := range this.selfObj.AoiInfo.MoveSet.List() {
  165. if data.(uint64) == this.uid {
  166. continue
  167. }
  168. otherRole := this.aoiMap.getPlayer(data.(uint64))
  169. if otherRole == nil || otherRole.isSummon() {
  170. continue
  171. }
  172. if this.isHide {
  173. }
  174. //这边可以对相同的消息做缓存处理
  175. //如果otherRole在同一个gate可以通过压缩的方式来提升效率
  176. //otherRole.SendGate(enterOtherNtfMsg)
  177. //添加到同服务器列表中
  178. serviceID := otherRole.cliID.ServiceID
  179. serverUidList[serviceID] = append(serverUidList[serviceID], otherRole.cliID.SessID)
  180. if len(serverUidList[serviceID]) >= MAX_SEND_NUM {
  181. this.SendGate(ntfMsg, serverUidList[serviceID], true)
  182. serverUidList[serviceID] = []uint64{}
  183. }
  184. }
  185. //剩余未发送部分处理
  186. for key, _ := range serverUidList {
  187. if len(serverUidList[key]) > 0 && key != "" {
  188. SendGate(key, ntfMsg, serverUidList[key], true)
  189. }
  190. }
  191. }
  192. func (this *MapRole) playerMove(pos *serverproto.Position) {
  193. updateObj, ret := this.aoiMap.aoi.Update(this.uid, *this.aoiMap.aoi.AoiArea, pos.X, pos.Y, this.IsMaster)
  194. if updateObj == nil {
  195. return
  196. }
  197. this.pos = *pos
  198. //只处理master
  199. if !this.IsMaster {
  200. return
  201. }
  202. //只发送移动信息
  203. if !ret {
  204. //MoveOnlySet处理
  205. this.playerMoveNtf()
  206. } else {
  207. //enter处理
  208. this.syncSurrounding()
  209. //位置同步信息
  210. //MoveOnlySet处理
  211. this.playerMoveNtf()
  212. //LeaveSet处理
  213. //通知离开视野的玩家
  214. this.playerLeaveNtf()
  215. }
  216. }
  217. func (this *MapRole) playerMoveNtf() {
  218. //MoveOnlySet处理
  219. //位置同步信息
  220. syncOtherNtfMsg := &serverproto.SCSyncPlayersNtf{}
  221. syncOtherNtfMsg.Players = append(syncOtherNtfMsg.Players,
  222. &serverproto.Player{Uid: this.uid,
  223. Pos: &serverproto.Position{X: this.pos.X, Y: this.pos.Y, Z: this.pos.Z},
  224. UType: this.unitType})
  225. var serverUidList = map[string][]uint64{}
  226. for _, data := range this.selfObj.AoiInfo.MoveOnlySet.List() {
  227. otherRole := this.aoiMap.getPlayer(data.(uint64))
  228. //移动消息 不发送给召唤物
  229. if otherRole.isSummon() {
  230. continue
  231. }
  232. if otherRole != nil && !otherRole.selfObj.AoiInfo.MoveNoNtfSet.Has(this.uid) {
  233. serviceID := otherRole.cliID.ServiceID
  234. if _, ok := serverUidList[serviceID]; ok {
  235. serverUidList[serviceID] = append(serverUidList[serviceID], otherRole.cliID.SessID)
  236. } else {
  237. serverUidList[serviceID] = []uint64{otherRole.cliID.SessID}
  238. }
  239. if len(serverUidList[serviceID]) >= MAX_SEND_NUM {
  240. SendGate(serviceID, syncOtherNtfMsg, serverUidList[serviceID], true)
  241. serverUidList[serviceID] = []uint64{}
  242. }
  243. }
  244. }
  245. //剩余未发送部分处理
  246. for key, _ := range serverUidList {
  247. if len(serverUidList[key]) > 0 && key != "" {
  248. SendGate(key, syncOtherNtfMsg, serverUidList[key], true)
  249. serverUidList[key] = serverUidList[key][0:0]
  250. }
  251. }
  252. }
  253. func (this *MapRole) playerLeaveNtf() {
  254. //LeaveSet处理
  255. //通知离开视野的玩家
  256. leaveSelfNtfMsg := &serverproto.SCPlayerLeaveNtf{}
  257. leaveOtherNtfMsg := &serverproto.SCPlayerLeaveNtf{}
  258. leaveOtherNtfMsg.Players = append(leaveOtherNtfMsg.Players,
  259. &serverproto.Player{Uid: this.uid,
  260. Pos: &serverproto.Position{X: this.pos.X, Y: this.pos.Y, Z: this.pos.Z},
  261. UType: this.unitType})
  262. var serverLeaveUidList = map[string][]uint64{}
  263. for _, data := range this.selfObj.AoiInfo.LeaveSet.List() {
  264. otherRole := this.aoiMap.getPlayer(data.(uint64))
  265. if otherRole != nil {
  266. //移除别的玩家中移动队列中的自己(否则可能会导致发送多次离开消息)
  267. //1.别人通知自己离开视野 2.自己通知该玩家离开视野
  268. if otherRole.selfObj.AoiInfo.MoveNoNtfSet.Has(this.uid) {
  269. otherRole.selfObj.AoiInfo.MoveNoNtfSet.Remove(this.uid)
  270. } else {
  271. serviceID := otherRole.cliID.ServiceID
  272. if _, ok := serverLeaveUidList[serviceID]; ok {
  273. serverLeaveUidList[serviceID] = append(serverLeaveUidList[serviceID], otherRole.cliID.SessID)
  274. } else {
  275. serverLeaveUidList[serviceID] = []uint64{otherRole.cliID.SessID}
  276. }
  277. if len(serverLeaveUidList[serviceID]) >= MAX_SEND_NUM {
  278. SendGate(serviceID, leaveOtherNtfMsg, serverLeaveUidList[serviceID], false)
  279. serverLeaveUidList[serviceID] = []uint64{}
  280. }
  281. }
  282. otherRole.selfObj.AoiInfo.MoveSet.Remove(this.uid)
  283. if this.selfObj.AoiInfo.MoveNoNtfSet.Has(otherRole.uid) {
  284. this.selfObj.AoiInfo.MoveSet.Remove(otherRole.uid)
  285. this.selfObj.AoiInfo.MoveNoNtfSet.Remove(otherRole.uid)
  286. }
  287. leaveSelfNtfMsg.Players = append(leaveSelfNtfMsg.Players,
  288. &serverproto.Player{Uid: otherRole.uid, UType: otherRole.unitType})
  289. if len(leaveSelfNtfMsg.Players) >= MAX_SEND_NUM {
  290. this.SendGate(leaveSelfNtfMsg, nil, true)
  291. leaveSelfNtfMsg.Players = leaveSelfNtfMsg.Players[0:0]
  292. }
  293. }
  294. }
  295. //剩余未发送部分处理
  296. for key, _ := range serverLeaveUidList {
  297. if len(serverLeaveUidList[key]) > 0 && key != "" {
  298. SendGate(key, leaveOtherNtfMsg, serverLeaveUidList[key], true)
  299. }
  300. }
  301. //发送给自己有别的玩家离开自己的视野
  302. if len(leaveSelfNtfMsg.Players) > 0 {
  303. this.SendGate(leaveSelfNtfMsg, nil, true)
  304. }
  305. }
  306. func (this *MapRole) playerLeave() bool {
  307. this.bTestSend = false
  308. util.DebugF("playerLeave uid=%v", this.uid)
  309. leaveNtfMsg := &serverproto.SCPlayerLeaveNtf{}
  310. leaveNtfMsg.Players = append(leaveNtfMsg.Players, &serverproto.Player{
  311. Uid: this.uid,
  312. Pos: &this.pos,
  313. UType: this.unitType,
  314. })
  315. //通知自己离开地图
  316. this.SendGate(leaveNtfMsg, nil, true)
  317. leaveList := this.aoiMap.aoi.LeaveNode(this.uid)
  318. if leaveList == nil || len(leaveList) <= 0 {
  319. return true
  320. }
  321. util.DebugF("playerLeave uid=%v leaveNotifyList=%v", this.uid, leaveList)
  322. //通知其他玩家
  323. for _, data := range leaveList {
  324. otherRole := this.aoiMap.getPlayer(data.(uint64))
  325. if otherRole != nil && otherRole.unitType != int32(UnityType_Boss) {
  326. otherRole.selfObj.AoiInfo.MoveSet.Remove(this.uid)
  327. otherRole.selfObj.AoiInfo.MoveOnlySet.Remove(this.uid)
  328. this.selfObj.AoiInfo.MoveNoNtfSet.Remove(otherRole.uid)
  329. if this.IsMaster {
  330. otherRole.SendGate(leaveNtfMsg, nil, true)
  331. }
  332. }
  333. }
  334. return true
  335. }
  336. //视野范围内玩家操作通知(avatar,action)
  337. func (this *MapRole) playerViewNtf(ntfMsg interface{}) {
  338. var serverUidList = map[string][]uint64{}
  339. for _, data := range this.selfObj.AoiInfo.MoveSet.List() {
  340. otherRole := this.aoiMap.getPlayer(data.(uint64))
  341. if otherRole != nil && !otherRole.selfObj.AoiInfo.MoveNoNtfSet.Has(this.uid) {
  342. serviceID := otherRole.cliID.ServiceID
  343. if _, ok := serverUidList[serviceID]; ok {
  344. serverUidList[serviceID] = append(serverUidList[serviceID], otherRole.cliID.SessID)
  345. } else {
  346. serverUidList[serviceID] = []uint64{otherRole.cliID.SessID}
  347. }
  348. if len(serverUidList[serviceID]) >= MAX_SEND_NUM {
  349. SendGate(serviceID, ntfMsg, serverUidList[serviceID], true)
  350. serverUidList[serviceID] = []uint64{}
  351. }
  352. }
  353. }
  354. //剩余未发送部分处理
  355. for key, _ := range serverUidList {
  356. if len(serverUidList[key]) > 0 && key != "" {
  357. SendGate(key, ntfMsg, serverUidList[key], true)
  358. serverUidList[key] = serverUidList[key][0:0]
  359. }
  360. }
  361. util.DebugF("showChange MoveSet=%v", this.selfObj.AoiInfo.MoveSet.List())
  362. }
  363. func (this *MapRole) showChange(info *serverproto.PlayerShowInfo) bool {
  364. if info == nil {
  365. return false
  366. }
  367. if info.NickName != "" {
  368. this.showInfo.NickName = info.NickName
  369. }
  370. if info.FashionData != nil {
  371. this.showInfo.FashionData = info.FashionData
  372. }
  373. //MoveSet处理
  374. //地图形象显示变更通知
  375. changeNtfMsg := &serverproto.SCMapOtherPlayersInfoNtf{}
  376. changeNtfMsg.InfoList = append(changeNtfMsg.InfoList, info)
  377. this.playerViewNtf(changeNtfMsg)
  378. return true
  379. }
  380. func (this *MapRole) mapDoDoAction(actionId int32, pos *serverproto.Position) bool {
  381. actionNtfMsg := &serverproto.SCPlayerActionNtf{
  382. ActionId: actionId,
  383. Uid: this.uid,
  384. Pos: pos,
  385. }
  386. this.playerViewNtf(actionNtfMsg)
  387. return true
  388. }
  389. func (this *MapRole) TestUpdate() {
  390. if this.bTestSend {
  391. this.TestSyncAllPlayer()
  392. }
  393. }
  394. func (this *MapRole) TestSyncAllPlayer() {
  395. //todo...
  396. // for test
  397. testNtfMsg := &serverproto.SCGMSyncAllPlayerNtf{}
  398. this.SendGate(testNtfMsg, nil, true)
  399. return
  400. for _, data := range this.aoiMap.aoi.GetAllNode() {
  401. if data == nil || data.Id == this.uid {
  402. continue
  403. }
  404. tempPos := this.aoiMap.getPlayer(data.Id).pos
  405. testNtfMsg.Players = append(testNtfMsg.Players, &serverproto.Player{
  406. Uid: data.Id,
  407. Pos: &tempPos,
  408. })
  409. if len(testNtfMsg.Players) >= MAX_SEND_NUM {
  410. this.SendGate(testNtfMsg, nil, true)
  411. testNtfMsg.Players = testNtfMsg.Players[0:0]
  412. }
  413. }
  414. if len(testNtfMsg.Players) > 0 {
  415. this.SendGate(testNtfMsg, nil, true)
  416. }
  417. }