role_send.go 16 KB

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