diff --git a/worldsrv/scenemgr.go b/worldsrv/scenemgr.go index 18003f6..7ca93a1 100644 --- a/worldsrv/scenemgr.go +++ b/worldsrv/scenemgr.go @@ -26,6 +26,7 @@ var SceneMgrSingleton = &SceneMgr{ coinSceneAutoId: common.CoinSceneStartId, hundredSceneAutoId: common.HundredSceneStartId, password: make(map[string]struct{}), + pushList: make(map[int]struct{}), } // SceneMgr 房间管理器 @@ -38,6 +39,8 @@ type SceneMgr struct { coinSceneAutoId int // 金币场房间号 hundredSceneAutoId int // 百人场房间号 password map[string]struct{} // 密码 + pushList map[int]struct{} // 已经推荐过的房间列表 + lastPushSceneId int // 最后推荐的房间id } // AllocReplayCode 获取回访码 @@ -422,7 +425,49 @@ func (m *SceneMgr) FindCustomInviteRoom(p *Player) *Scene { return ret[i].createTime.Unix() < ret[j].createTime.Unix() }) + // 删除没有的房间 + var list []*Scene + var pushList = map[int]struct{}{} + for k := range m.pushList { + var has bool + for _, v := range ret { + if v.sceneId == k { + has = true + break + } + } + if has { + pushList[k] = struct{}{} + } + } + m.pushList = pushList + + // 删除推荐过的房间 + for _, v := range ret { + if _, ok := m.pushList[v.sceneId]; !ok { + list = append(list, v) + } + } + + if len(list) > 0 { + m.pushList[list[0].sceneId] = struct{}{} + return list[0] + } + if len(ret) > 0 { + // 全都推荐过了,循环推荐房间 + var b bool + for _, v := range ret { + if b { + m.lastPushSceneId = v.sceneId + return v + } + if v.sceneId == m.lastPushSceneId { + b = true + } + } + // 没找到,从头开始 + m.lastPushSceneId = ret[0].sceneId return ret[0] }