cross_manager.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package model
  2. import (
  3. "rocommon/util"
  4. "roserver/baseserver/model"
  5. "roserver/serverproto"
  6. "sort"
  7. )
  8. const (
  9. Expired_Time = 10 * 60 * 1000
  10. TrialRankExpired_Time = 1 * 60 * 1000
  11. )
  12. ////远航试炼缓存
  13. var NtfViewUidList = map[uint64]uint64{}
  14. func AddNtfUid(uid uint64) {
  15. NtfViewUidList[uid] = util.GetTimeMilliseconds()
  16. }
  17. func DelNtfUid(uid uint64) {
  18. delete(NtfViewUidList, uid)
  19. }
  20. func NtfMsg(msg interface{}) {
  21. nowTime := util.GetTimeMilliseconds()
  22. for uid, oldTime := range NtfViewUidList {
  23. role := RoleMag.GetRoleFromUUid(uid)
  24. if role == nil {
  25. delete(NtfViewUidList, uid)
  26. continue
  27. }
  28. role.ReplayGate(msg, true)
  29. if oldTime+Expired_Time <= nowTime {
  30. DelNtfUid(uid)
  31. }
  32. }
  33. }
  34. var cacheCrossYuanHangTrialViewList []*serverproto.YuanHangTrialData
  35. var refreshCacheTime uint64
  36. func SetYuanHangTrialViewList(viewList []*serverproto.YuanHangTrialData) {
  37. cacheCrossYuanHangTrialViewList = viewList
  38. refreshCacheTime = util.GetTimeMilliseconds()
  39. }
  40. func GetYuanHangTrialViewList() []*serverproto.YuanHangTrialData {
  41. //每30s重新获取一次可见列表
  42. nowTime := util.GetTimeMilliseconds()
  43. if refreshCacheTime+30*1000 < nowTime {
  44. return nil
  45. }
  46. return cacheCrossYuanHangTrialViewList
  47. }
  48. func UpdateTrialViewItem(viewDataList []*serverproto.YuanHangTrialData) {
  49. for idx := 0; idx < len(viewDataList); idx++ {
  50. bFind := false
  51. for k := 0; k < len(cacheCrossYuanHangTrialViewList); k++ {
  52. if cacheCrossYuanHangTrialViewList[k].Uid == viewDataList[idx].Uid {
  53. cacheCrossYuanHangTrialViewList[k] = viewDataList[idx]
  54. bFind = true
  55. break
  56. }
  57. }
  58. if !bFind {
  59. cacheCrossYuanHangTrialViewList = append(cacheCrossYuanHangTrialViewList, viewDataList[idx])
  60. }
  61. ntfRole := RoleMag.GetRoleFromUUid(viewDataList[idx].Uid)
  62. if ntfRole == nil {
  63. ntfRole = RoleMag.GetRoleFromOffline(viewDataList[idx].Uid)
  64. if ntfRole != nil {
  65. ntfRole.(*Role).GetRoleCross().UpdateTrialInfo(viewDataList[idx].BeChallengeNum)
  66. }
  67. }
  68. }
  69. }
  70. var cacheCrossYuanHangTrialRankList []*cacheTrialRank
  71. type cacheTrialRank struct {
  72. StartIdx int32
  73. RefreshTime uint64
  74. rankList []*serverproto.CommonRankInfo
  75. }
  76. func UpdateYuanHangTrialRankList(startIdx int32, rankList []*serverproto.CommonRankInfo) {
  77. bFind := false
  78. for idx := 0; idx < len(cacheCrossYuanHangTrialRankList); idx++ {
  79. if cacheCrossYuanHangTrialRankList[idx].StartIdx == startIdx {
  80. cacheCrossYuanHangTrialRankList[idx].rankList = rankList
  81. cacheCrossYuanHangTrialRankList[idx].RefreshTime = util.GetTimeMilliseconds()
  82. bFind = true
  83. break
  84. }
  85. }
  86. if !bFind {
  87. cacheCrossYuanHangTrialRankList = append(cacheCrossYuanHangTrialRankList,
  88. &cacheTrialRank{
  89. StartIdx: startIdx,
  90. rankList: rankList,
  91. RefreshTime: util.GetTimeMilliseconds(),
  92. })
  93. }
  94. }
  95. func GetYuanHangTrialRankList(startIdx int32) []*serverproto.CommonRankInfo {
  96. for idx := 0; idx < len(cacheCrossYuanHangTrialRankList); idx++ {
  97. if cacheCrossYuanHangTrialRankList[idx].StartIdx == startIdx {
  98. nowTime := util.GetTimeMilliseconds()
  99. if cacheCrossYuanHangTrialRankList[idx].RefreshTime+TrialRankExpired_Time <= nowTime {
  100. return nil
  101. }
  102. return cacheCrossYuanHangTrialRankList[idx].rankList
  103. }
  104. }
  105. return nil
  106. }
  107. //全局跨服使用GCrossRouter
  108. //服务器列表状态缓存
  109. type ServerStateCache struct {
  110. ServerType int32
  111. ServerState *serverproto.SCGCrossGetServerStateAck
  112. RefreshTime uint64
  113. }
  114. var ServerStateCacheList = map[int32]*ServerStateCache{}
  115. //force是否判断过期需要重新获取
  116. func GetServerStateListByType(serverType int32, force bool) *serverproto.SCGCrossGetServerStateAck {
  117. nowTime := util.GetTimeMilliseconds()
  118. if dataList, ok := ServerStateCacheList[serverType]; ok {
  119. if dataList.ServerState == nil || (force && dataList.RefreshTime < nowTime) {
  120. return nil
  121. }
  122. return dataList.ServerState
  123. } else {
  124. return nil
  125. }
  126. }
  127. func GetServerStateByTypeAndLine(serverType, lineNum int32) string {
  128. retSID := ""
  129. listData := GetServerStateListByType(serverType, false)
  130. if listData == nil {
  131. return retSID
  132. }
  133. for idx := 0; idx < len(listData.ServerList); idx++ {
  134. tmpNodeId := listData.ServerList[idx]
  135. beginLineNum := (tmpNodeId.Id-1)*tmpNodeId.MaxLineNum + 1
  136. endLineNum := tmpNodeId.Id * tmpNodeId.MaxLineNum
  137. if beginLineNum <= lineNum && lineNum <= endLineNum {
  138. retSID = tmpNodeId.Sid
  139. break
  140. }
  141. }
  142. return retSID
  143. }
  144. //选择线路未满的房间(线路号从小达到)
  145. func GetServerStateByType(serverType int32) (string, int32) {
  146. retSID := ""
  147. listData := GetServerStateListByType(serverType, false)
  148. if listData == nil {
  149. return retSID, 0
  150. }
  151. var lineNum int32 = 0
  152. for idx := 0; idx < len(listData.ServerList); idx++ {
  153. tmpNodeId := listData.ServerList[idx]
  154. beginLineNum := (tmpNodeId.Id-1)*tmpNodeId.MaxLineNum + 1
  155. endLineNum := tmpNodeId.Id * tmpNodeId.MaxLineNum
  156. for lineIdx := beginLineNum; lineIdx <= endLineNum; lineIdx++ {
  157. bFull := false
  158. for k := 0; k < len(tmpNodeId.StateList); k++ {
  159. if tmpNodeId.StateList[k].Line == lineIdx {
  160. if tmpNodeId.StateList[k].CurNum >= tmpNodeId.MaxSpaceEntityNum {
  161. bFull = true
  162. }
  163. break
  164. }
  165. }
  166. if !bFull {
  167. retSID = tmpNodeId.Sid
  168. lineNum = lineIdx
  169. break
  170. }
  171. }
  172. }
  173. return retSID, lineNum
  174. }
  175. func UpdateServerStateListByType(serverType int32, serverStateData *serverproto.SSGetGServerStateAck) {
  176. if len(serverStateData.ServerList) <= 0 {
  177. return
  178. }
  179. nowTime := util.GetTimeMilliseconds()
  180. if dataList, ok := ServerStateCacheList[serverType]; ok {
  181. dataList.ServerState.ServerList = serverStateData.ServerList
  182. dataList.RefreshTime = nowTime + 5*1000
  183. } else {
  184. ServerStateCacheList[serverType] = &ServerStateCache{
  185. ServerType: serverType,
  186. RefreshTime: nowTime + 5*1000,
  187. ServerState: &serverproto.SCGCrossGetServerStateAck{
  188. ServerType: serverType,
  189. ServerList: serverStateData.ServerList,
  190. },
  191. }
  192. sort.Slice(ServerStateCacheList[serverType].ServerState.ServerList, func(i, j int) bool {
  193. return ServerStateCacheList[serverType].ServerState.ServerList[i].Id <
  194. ServerStateCacheList[serverType].ServerState.ServerList[j].Id
  195. })
  196. }
  197. //人数为0的线路初始化
  198. listData := ServerStateCacheList[serverType].ServerState
  199. for idx := 0; idx < len(listData.ServerList); idx++ {
  200. tmpNodeId := listData.ServerList[idx]
  201. if len(tmpNodeId.StateList) >= int(tmpNodeId.MaxLineNum) {
  202. continue
  203. }
  204. beginLineNum := (tmpNodeId.Id-1)*tmpNodeId.MaxLineNum + 1
  205. endLineNum := tmpNodeId.Id * tmpNodeId.MaxLineNum
  206. for lineIdx := beginLineNum; lineIdx <= endLineNum; lineIdx++ {
  207. bFind := false
  208. for k := 0; k < len(tmpNodeId.StateList); k++ {
  209. if tmpNodeId.StateList[k].Line == lineIdx {
  210. bFind = true
  211. break
  212. }
  213. }
  214. if !bFind {
  215. tmpNodeId.StateList = append(tmpNodeId.StateList, &serverproto.StateDetailDesc{Line: lineIdx})
  216. }
  217. }
  218. }
  219. }
  220. //分发来自跨服的消息
  221. func SendMsgFromCrossRouter(msg interface{}, cliId model.ClientID) {
  222. if cliId.SessID > 0 {
  223. role := RoleMag.GetRole(cliId)
  224. if role == nil {
  225. return
  226. }
  227. util.DebugF("uid=%v receive SSGCrossMapEnterNtf ms=%v", role.GetUUid(), msg)
  228. role.ReplayGate(msg, true)
  229. } else if len(cliId.SessIdList) > 0 {
  230. var clientIdLIstMap = map[string][]uint64{}
  231. //只发送当前game相关的玩家
  232. for idx := 0; idx < len(cliId.SessIdList); idx++ {
  233. role := RoleMag.GetRoleFromUUid(cliId.SessIdList[idx])
  234. if role == nil {
  235. continue
  236. }
  237. serviceId := role.CliID().ServiceID
  238. clientIdLIstMap[serviceId] = append(clientIdLIstMap[serviceId], role.CliID().SessID)
  239. }
  240. for key, dataList := range clientIdLIstMap {
  241. ReplayGateList(msg, dataList, key, true)
  242. }
  243. }
  244. }
  245. type CrossManager struct {
  246. updateTimer util.ServerTimer //更新定时器
  247. initStartUp bool
  248. }
  249. func newCrossMag() *CrossManager {
  250. mag := &CrossManager{}
  251. mag.updateTimer = util.NewDurationTimer(util.GetCurrentTime(), 1000)
  252. return mag
  253. }
  254. func (this *CrossManager) init(ms uint64) {
  255. if this.initStartUp {
  256. return
  257. }
  258. this.initStartUp = true
  259. }
  260. func (this *CrossManager) Update(ms uint64) {
  261. if !this.initStartUp {
  262. this.init(ms)
  263. }
  264. if this.initStartUp && this.updateTimer.IsStart() && this.updateTimer.IsExpired(ms) {
  265. if len(ServerStateCacheList) <= 0 {
  266. ssStateMsg := &serverproto.SSGetGServerStateReq{
  267. ServerType: model.SERVICE_NODE_TYPE_GLOBALCROSSMAP,
  268. }
  269. SendSocial(ssStateMsg)
  270. }
  271. }
  272. }