role_send.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. package model
  2. import (
  3. "rocommon/rpc"
  4. "rocommon/util"
  5. "roserver/baseserver/model"
  6. "roserver/serverproto"
  7. "time"
  8. )
  9. /////////////////////////////////////////////发送数据
  10. //透传给gate服务器,然后在发送给客户端
  11. //transmit是否透传,gate是否处理该消息,true表示透传,false表示gate需要做处理
  12. //直接回复可以使用ServiceReplay,后续通过其他服务器处理的话需要调用接口ReplayGate
  13. //model.ServiceReplay(ev, ack)
  14. var testNowTime time.Time = util.GetCurrentTimeNow()
  15. var SCSyncPlayersNtfCount int32 = 0
  16. var SCPlayerLeaveNtfCount int32 = 0
  17. var SCPlayerEnterNtfCount int32 = 0
  18. func (this *Role) ReplayGate(msg interface{}, transmit bool) int {
  19. //当前玩家不在线
  20. gateSess := model.GetServiceNode(this.cliID.ServiceID)
  21. if gateSess == nil {
  22. util.ErrorF("ReplayGate gate not not found cliId=%v", this.cliID)
  23. return 0
  24. }
  25. data, info, err := rpc.EncodeMessage(msg)
  26. if err != nil {
  27. util.ErrorF("ReplayGate gate EncodeMessage err=%v,cliId=%v", err, this.cliID)
  28. return 0
  29. }
  30. //未成功发送登录结构信息之前,发送其他结构消息
  31. if this.GetState() != ROLE_STATE_ONLINE && info.ID > 1020 {
  32. if this.tmpState {
  33. util.ErrorF("uid=%v ReplayGate before online cliId=%v msgid=%v\n", this.GetUUid(), this.cliID, info.ID)
  34. return 0
  35. }
  36. }
  37. var ackSeqId uint32 = 0
  38. var confirmId = uint32(info.ConfirmMsgId)
  39. if info.ConfirmMsgId > 0 {
  40. confirmLen := len(this.reqAckConfirmList[confirmId])
  41. if confirmLen > 0 {
  42. ackSeqId = this.reqAckConfirmList[confirmId][confirmLen-1]
  43. this.reqAckConfirmList[confirmId] = this.reqAckConfirmList[confirmId][:confirmLen-1]
  44. }
  45. }
  46. if transmit {
  47. //透传给gate服务器,然后再发送给客户端
  48. gateSess.Send(&serverproto.ServiceTransmitAck{
  49. MsgId: uint32(info.ID),
  50. MsgData: data,
  51. ClientId: this.cliID.SessID,
  52. SeqId: ackSeqId,
  53. //KvTime: util.GetTimeMilliseconds(),
  54. })
  55. } else {
  56. //发给gate服务器做做处理操作
  57. gateSess.Send(msg)
  58. }
  59. //switch msg.(type) {
  60. //case *serverproto.SCSyncPlayersNtf:
  61. // SCSyncPlayersNtfCount++
  62. //case *serverproto.SCPlayerLeaveNtf:
  63. // SCPlayerLeaveNtfCount++
  64. //case *serverproto.SCPlayerEnterNtf:
  65. // SCPlayerEnterNtfCount++
  66. //}
  67. ////log.Println("replay gate...", msg)
  68. //if time.Since(testNowTime) > time.Second {
  69. // testNowTime = util.GetCurrentTimeNow()
  70. // //log.Println("replay gate...[sync,leave,enter]",SCSyncPlayersNtfCount, SCPlayerLeaveNtfCount, SCPlayerEnterNtfCount)
  71. // SCSyncPlayersNtfCount = 0
  72. // SCPlayerLeaveNtfCount = 0
  73. // SCPlayerEnterNtfCount = 0
  74. //}
  75. return len(data)
  76. }
  77. func ReplayGateList(msg interface{}, clientIdList []uint64, serviceID string, transmit bool) int {
  78. //当前玩家不在线
  79. gateSess := model.GetServiceNode(serviceID)
  80. if gateSess == nil {
  81. util.ErrorF("ReplayGate gate not not found serviceID=%v msg=%v", serviceID, msg)
  82. return 0
  83. }
  84. data, info, err := rpc.EncodeMessage(msg)
  85. if err != nil {
  86. util.ErrorF("ReplayGate gate EncodeMessage err=%v", err)
  87. return 0
  88. }
  89. if transmit {
  90. //透传给gate服务器,然后再发送给客户端
  91. sendMsg := &serverproto.ServiceTransmitAck{
  92. MsgId: uint32(info.ID),
  93. MsgData: data,
  94. //KvTime: util.GetTimeMilliseconds(),
  95. }
  96. sendMsg.ClientIdList = append(sendMsg.ClientIdList, clientIdList...)
  97. //sendMsg.ClientIdList = clientIdList
  98. gateSess.Send(sendMsg)
  99. } else {
  100. //发给gate服务器做做处理操作
  101. //gateSess.Send(msg)
  102. }
  103. //switch msg.(type) {
  104. //case *serverproto.SCSyncPlayersNtf:
  105. // SCSyncPlayersNtfCount++
  106. //case *serverproto.SCPlayerLeaveNtf:
  107. // SCPlayerLeaveNtfCount++
  108. //case *serverproto.SCPlayerEnterNtf:
  109. // SCPlayerEnterNtfCount++
  110. //}
  111. ////log.Println("replay gate...", msg)
  112. //if time.Since(testNowTime) > time.Second {
  113. // testNowTime = util.GetCurrentTimeNow()
  114. // //log.Println("replay gate...[sync,leave,enter]",SCSyncPlayersNtfCount, SCPlayerLeaveNtfCount, SCPlayerEnterNtfCount)
  115. // SCSyncPlayersNtfCount = 0
  116. // SCPlayerLeaveNtfCount = 0
  117. // SCPlayerEnterNtfCount = 0
  118. //}
  119. return len(data)
  120. }
  121. // 发送给db服务器
  122. func (this *Role) SendDb(msg interface{}) bool {
  123. data, meta, err := rpc.EncodeMessage(msg)
  124. if err != nil {
  125. util.ErrorF("EncodeMessage err=%v msg=%v", err, msg)
  126. return false
  127. }
  128. tmpServiceNode, tmpDBSess := model.GetServiceNodeAndSession(this.DBNode(), model.SERVICE_NODE_TYPE_DB_STR, 0)
  129. if tmpServiceNode == "" {
  130. util.ErrorF("SendDb session not exist dbNode=%v", this.DBNode())
  131. return false
  132. }
  133. this.dbNode = tmpServiceNode
  134. //如果玩家信息存在,ClientId中存放的是玩家ID,否则存放的是玩家的gate sessionId
  135. if this.uuid != 0 {
  136. tmpDBSess.Send(&serverproto.ServiceTransmitAck{
  137. MsgId: uint32(meta.ID),
  138. MsgData: data,
  139. ClientId: this.uuid, //对应的玩家 gate uuid uuidRoleList[key]
  140. })
  141. } else {
  142. tmpDBSess.Send(&serverproto.ServiceTransmitAck{
  143. MsgId: uint32(meta.ID),
  144. MsgData: data,
  145. ClientId: this.CliID().SessID, //对应的玩家 gate channelId channelRoleList[key]
  146. })
  147. }
  148. return true
  149. }
  150. func (this *Role) SendAllSocial(msg interface{}) {
  151. data, meta, err := rpc.EncodeMessage(msg)
  152. if err != nil {
  153. util.ErrorF("SendSocial EncodeMessage err=%v,msg=%v", err, msg)
  154. return
  155. }
  156. sendMsg := &serverproto.ServiceTransmitAck{
  157. MsgId: uint32(meta.ID),
  158. MsgData: data,
  159. }
  160. //如果玩家信息存在,ClientId中存放的是玩家ID,否则存放的是玩家的gate sessionId
  161. if this.uuid != 0 {
  162. sendMsg.ClientId = this.uuid //对应的玩家 gate uuid uuidRoleList[key]
  163. } else {
  164. sendMsg.ClientId = this.CliID().SessID //对应的玩家 gate channelId channelRoleList[key]
  165. }
  166. serviceList := model.GetAllServiceNodeByName(model.SERVICE_NODE_TYPE_SOCIAL_STR)
  167. for _, node := range serviceList {
  168. socialSess := model.GetServiceNode(node)
  169. if socialSess != nil {
  170. socialSess.Send(sendMsg)
  171. }
  172. }
  173. }
  174. // 发送给social服务器
  175. func (this *Role) SendSocial(msg interface{}) bool {
  176. //todo...
  177. // 暂时做成单点,后续做扩展
  178. // 玩家上线时需要发送给social,标记当前玩家上线并通知好友
  179. tmpServiceNode, tmpSocialSess := model.GetServiceNodeAndSession(this.SocialNode(), model.SERVICE_NODE_TYPE_SOCIAL_STR, 0)
  180. if tmpServiceNode == "" {
  181. util.ErrorF("SendSocial social session not exist socialnode=%v", this.SocialNode())
  182. return false
  183. }
  184. this.socialNode = tmpServiceNode
  185. data, meta, err := rpc.EncodeMessage(msg)
  186. if err != nil {
  187. util.ErrorF("SendSocial EncodeMessage err=%v,msg=%v", err, msg)
  188. return false
  189. }
  190. //AOI地图处理
  191. targetServiceNodeSID := ""
  192. if this.GetRoleCross() != nil {
  193. targetServiceNodeSID = this.GetRoleCross().curMapSID
  194. }
  195. //如果玩家信息存在,ClientId中存放的是玩家ID,否则存放的是玩家的gate sessionId
  196. if this.uuid != 0 {
  197. tmpSocialSess.Send(&serverproto.ServiceTransmitAck{
  198. MsgId: uint32(meta.ID),
  199. MsgData: data,
  200. ClientId: this.uuid, //对应的玩家 gate uuid uuidRoleList[key]
  201. TargetServiceNode: targetServiceNodeSID,
  202. })
  203. } else {
  204. tmpSocialSess.Send(&serverproto.ServiceTransmitAck{
  205. MsgId: uint32(meta.ID),
  206. MsgData: data,
  207. ClientId: this.CliID().SessID, //对应的玩家 gate channelId channelRoleList[key]
  208. TargetServiceNode: targetServiceNodeSID,
  209. })
  210. }
  211. return true
  212. }
  213. // 发送给social服务器
  214. func (this *Role) SendSocialWithSID(msg interface{}, targetNodeSID string) bool {
  215. //todo...
  216. // 暂时做成单点,后续做扩展
  217. // 玩家上线时需要发送给social,标记当前玩家上线并通知好友
  218. tmpServiceNode, tmpSocialSess := model.GetServiceNodeAndSession(this.SocialNode(), model.SERVICE_NODE_TYPE_SOCIAL_STR, 0)
  219. if tmpServiceNode == "" {
  220. util.ErrorF("SendSocial social session not exist socialnode=%v", this.SocialNode())
  221. return false
  222. }
  223. this.socialNode = tmpServiceNode
  224. data, meta, err := rpc.EncodeMessage(msg)
  225. if err != nil {
  226. util.ErrorF("SendSocial EncodeMessage err=%v,msg=%v", err, msg)
  227. return false
  228. }
  229. //如果玩家信息存在,ClientId中存放的是玩家ID,否则存放的是玩家的gate sessionId
  230. if this.uuid != 0 {
  231. tmpSocialSess.Send(&serverproto.ServiceTransmitAck{
  232. MsgId: uint32(meta.ID),
  233. MsgData: data,
  234. ClientId: this.uuid, //对应的玩家 gate uuid uuidRoleList[key]
  235. TargetServiceNode: targetNodeSID,
  236. IsMaster: true,
  237. })
  238. } else {
  239. tmpSocialSess.Send(&serverproto.ServiceTransmitAck{
  240. MsgId: uint32(meta.ID),
  241. MsgData: data,
  242. ClientId: this.CliID().SessID, //对应的玩家 gate channelId channelRoleList[key]
  243. TargetServiceNode: targetNodeSID,
  244. IsMaster: true,
  245. })
  246. }
  247. return true
  248. }
  249. //send master and ghost
  250. //func (this *Role) SendAoi(msg interface{}) bool {
  251. // tmpServiceNode, tmpSocialSess := model.GetServiceNodeAndSession(this.aoiNode, model.SERVICE_NODE_TYPE_AOI_STR, this.cliID.SessID>>32)
  252. // if tmpServiceNode == "" {
  253. // util.ErrorF("SendAoi session not exist servicenode=%v", this.aoiNode)
  254. // return false
  255. // }
  256. // this.aoiNode = tmpServiceNode
  257. //
  258. // //return this.sendService(msg, this.aoiNode)
  259. // data, meta, err := rpcc.EncodeMessage(msg)
  260. // if err != nil {
  261. // util.ErrorF("sendService EncodeMessage err=%v,msg=%v", err, msg)
  262. // return false
  263. // }
  264. //
  265. // sendMasterMsg := &serverproto.ServiceTransmitAck{
  266. // MsgId: uint32(meta.ID),
  267. // MsgData: data,
  268. // ClientId: this.cliID.SessID, //对应的玩家 gate cliId SessionId
  269. // IsMaster: true,
  270. // }
  271. // tmpSocialSess.Send(sendMasterMsg)
  272. //
  273. // serviceList := model.GetAllServiceNodeByName(model.SERVICE_NODE_TYPE_AOI_STR)
  274. // if len(serviceList) > 1 {
  275. // sendGhostMsg := &serverproto.ServiceTransmitAck{
  276. // MsgId: uint32(meta.ID),
  277. // MsgData: data,
  278. // ClientId: this.cliID.SessID, //对应的玩家 gate cliId SessionId
  279. // IsMaster: false,
  280. // }
  281. // for _, node := range serviceList {
  282. // aoiSess := model.GetServiceNode(node)
  283. // if aoiSess != nil && node != this.aoiNode {
  284. // aoiSess.Send(sendGhostMsg)
  285. // }
  286. // }
  287. // }
  288. //
  289. // return true
  290. //}
  291. //发送给其他非master aoi节点
  292. //func (this *Role) SendGhostAoi(msg interface{}) bool {
  293. // data, meta, err := rpcc.EncodeMessage(msg)
  294. // if err != nil {
  295. // util.ErrorF("sendService EncodeMessage err=%v,msg=%v", err, msg)
  296. // return false
  297. // }
  298. //
  299. // sendMsg := &serverproto.ServiceTransmitAck{
  300. // MsgId: uint32(meta.ID),
  301. // MsgData: data,
  302. // ClientId: this.cliID.SessID, //对应的玩家 gate cliId SessionId
  303. // IsMaster: false,
  304. // }
  305. // serviceList := model.GetAllServiceNodeByName(model.SERVICE_NODE_TYPE_AOI_STR)
  306. // if len(serviceList) > 0 {
  307. // for _, node := range serviceList {
  308. // aoiSess := model.GetServiceNode(node)
  309. // if aoiSess != nil && node != this.aoiNode {
  310. // aoiSess.Send(sendMsg)
  311. // }
  312. // }
  313. // }
  314. // return true
  315. //}
  316. // battle boss
  317. func (this *Role) SendBattleBoss(msg interface{}) bool {
  318. if this.bossNode == "" {
  319. this.bossNode = model.SelectServiceNode(model.SERVICE_NODE_TYPE_BOSS_STR, 0)
  320. }
  321. if this.bossNode == "" {
  322. util.ErrorF("SendBoss Boss Server node not exist msg=%v", msg)
  323. return false
  324. }
  325. return this.sendService(msg, this.bossNode)
  326. }
  327. // rank
  328. func (this *Role) SendRank(msg interface{}) bool {
  329. if this.RankNode() == "" {
  330. this.rankNode = model.SelectServiceNode(model.SERVICE_NODE_TYPE_RANK_STR, 0)
  331. }
  332. if this.rankNode == "" {
  333. util.InfoF("SendRank Rank Server node not exist msg=%v", msg)
  334. return false
  335. }
  336. return this.sendService(msg, this.rankNode)
  337. }
  338. // guild
  339. func (this *Role) SendGuild(msg interface{}) bool {
  340. if this.GuildNode() == "" {
  341. this.guildNode = model.SelectServiceNode(model.SERVICE_NODE_TYPE_GUILD_STR, 0)
  342. }
  343. if this.guildNode == "" {
  344. util.ErrorF("SendGuild Guild Server node not exist msg=%v", msg)
  345. return false
  346. }
  347. return this.sendService(msg, this.guildNode)
  348. }
  349. func (this *Role) sendService(msg interface{}, serviceNode string) bool {
  350. data, meta, err := rpc.EncodeMessage(msg)
  351. if err != nil {
  352. util.ErrorF("sendService EncodeMessage err=%v,msg=%v", err, msg)
  353. return false
  354. }
  355. serviceSess := model.GetServiceNode(serviceNode)
  356. if serviceSess == nil {
  357. util.ErrorF("sendService session not exist servicenode=%v", serviceNode)
  358. } else {
  359. //如果玩家信息存在,ClientId中存放的是玩家ID,否则存放的是玩家的gate sessionId
  360. if this.uuid != 0 {
  361. serviceSess.Send(&serverproto.ServiceTransmitAck{
  362. MsgId: uint32(meta.ID),
  363. MsgData: data,
  364. //todo...
  365. // 对应的玩家 gate channelId channelRoleList[key]
  366. // 后续和gate直接通信时使用,如果断线重连需要重新绑定
  367. ClientId: this.uuid, //对应的玩家 gate uuid uuidRoleList[key]
  368. })
  369. }
  370. }
  371. return true
  372. }
  373. func SendDb(msg interface{}) bool {
  374. data, meta, err := rpc.EncodeMessage(msg)
  375. if err != nil {
  376. util.ErrorF("EncodeMessage err=%v,msg=%v", err, msg)
  377. return false
  378. }
  379. dbNode, dbSess := model.GetServiceNodeAndSession("", model.SERVICE_NODE_TYPE_DB_STR, 0)
  380. if dbSess == nil {
  381. util.ErrorF("db session not exist dbNode=%v", dbNode)
  382. return false
  383. } else {
  384. dbSess.Send(&serverproto.ServiceTransmitAck{
  385. MsgId: uint32(meta.ID),
  386. MsgData: data,
  387. })
  388. }
  389. return true
  390. }
  391. func SendSocial(msg interface{}) bool {
  392. data, meta, err := rpc.EncodeMessage(msg)
  393. if err != nil {
  394. util.ErrorF("EncodeMessage err=%v,msg=%v", err, msg)
  395. return false
  396. }
  397. _, socialSess := model.GetServiceNodeAndSession("", model.SERVICE_NODE_TYPE_SOCIAL_STR, 0)
  398. if socialSess == nil {
  399. util.ErrorF("social session not exist msgid=%v", meta.ID)
  400. return false
  401. } else {
  402. socialSess.Send(&serverproto.ServiceTransmitAck{
  403. MsgId: uint32(meta.ID),
  404. MsgData: data,
  405. })
  406. }
  407. return true
  408. }
  409. func SendGuild(msg interface{}) bool {
  410. data, meta, err := rpc.EncodeMessage(msg)
  411. if err != nil {
  412. util.ErrorF("EncodeMessage err=%v,msg=%v", err, msg)
  413. return false
  414. }
  415. guildNode, guildSess := model.GetServiceNodeAndSession("", model.SERVICE_NODE_TYPE_GUILD_STR, 0)
  416. if guildSess == nil {
  417. util.ErrorF("db session not exist dbNode=%v", guildNode)
  418. return false
  419. } else {
  420. guildSess.Send(&serverproto.ServiceTransmitAck{
  421. MsgId: uint32(meta.ID),
  422. MsgData: data,
  423. })
  424. }
  425. return true
  426. }
  427. func SendRankService(msg interface{}) {
  428. data, meta, err := rpc.EncodeMessage(msg)
  429. if err != nil {
  430. util.ErrorF("SendRankService EncodeMessage err=%v,msg=%v", err, msg)
  431. return
  432. }
  433. rankNode, serviceSess := model.GetServiceNodeAndSession("", model.SERVICE_NODE_TYPE_RANK_STR, 0)
  434. if serviceSess == nil {
  435. util.ErrorF("sendService session not exist rankNode=%v", rankNode)
  436. } else {
  437. //如果玩家信息存在,ClientId中存放的是玩家ID,否则存放的是玩家的gate sessionId
  438. serviceSess.Send(&serverproto.ServiceTransmitAck{
  439. MsgId: uint32(meta.ID),
  440. MsgData: data,
  441. //todo...
  442. // 对应的玩家 gate channelId channelRoleList[key]
  443. // 后续和gate直接通信时使用,如果断线重连需要重新绑定
  444. ClientId: 0, //对应的玩家 gate uuid uuidRoleList[key]
  445. })
  446. }
  447. }